[RESOLVIDO] Condições de Pagamento no Frente de Caixa


#1

Bom dia novamente.
Nós estamos com um probleminha, que está saindo cupons para o cliente CONSUMIDOR (não sei se ele existe pra todos, mas pra nossa empresa ele é usado para pessoa física, quando ela não precisa de nota em seu nome) no CREDIÁRIO, o que não pode; cliente CONSUMIDOR só pode comprar à vista (dinheiro, cheque) ou à prazo (cartão e cheque).
Quando o vendedor efetua a venda, ele não pode escolher a opção CREDIÁRIO para o CONSUMIDOR; ele não deixa salvar, até porque o limite de crédito é 0.
Provavelmente estão mudando sem querer no caixa, ou por descuido, e colocam crediário.

Queria saber se tem um jeito de que quando for CONSUMIDOR no frente de caixa, que não possa ser escolhido CREDIÁRIO.
Pensei em talvez fazer um CallOut, que se for cliente CONSUMIDOR e for escolhido CREDIÁRIO, exibe uma mensagem de que não pode e não permite salvar, fazendo com que ‘o caixa’ escolha outra opção; ou, que essa opção não apareça quando for cliente CONSUMIDOR.

Alguma sugestão?

Obrigada :smiley:


#2

Ja elaborei uma parte.
Tem o processo que verifica o modo de pagamento escolhido no caixa:

[code]public String definePaymentRule(){

// Carrega Regra de Pagamento Atual
String PaymentRule = m_OperCaixa.getPaymentRule();
    // Se Forma de Pgto for Cheque, seta Em Crédito
    if(PaymentRule.equals(MOrder.PAYMENTRULE_Check)) {
        m_order.setPaymentRule(MOrder.PAYMENTRULE_OnCredit);
    } else {
        m_order.setPaymentRule(PaymentRule);
    }
    
    /*  LBRPaymentRule - 
     *  - Se Regra de Pagamento for Cheque, então PaymentRule EM CRÉDITO e LBR PaymentRule EM CHEQUE.
     *  - Se Regra de Pagamento for Em Crédito, então PaymentRule EM CRÉDITO e LBR PaymentRule Boleto.
     *  - Se for qualquer outra Forma de Pagamento, então LBR PaymentRule DINHEIRO.
     * 
     * */
    if(PaymentRule.equals(MOrder.PAYMENTRULE_Check)) 
        m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Check);     // Cheque
    else if(PaymentRule.equals(MOrder.PAYMENTRULE_OnCredit))
        m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Bill);     // Boleto

->> else if ((m_order.getC_BPartner_ID(2009020)) if (PaymentRule.equals(MOrder.PAYMENTRULE_OnCredit)))
return “Cliente CONSUMIDOR não pode pagar com Crediário”;<–
else
m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Cash); // DINHEIRO

    if(!m_order.save())
        return "Falha ao salvar nova Forma de Pagamento.";
    
    return "";
}[/code]

Adicionei a parte com as setinhas.
Ele ta dando um erro no getC_BPartner_ID, pedindo pra usar o set e mais algumas coisas.
Está meio certo?
O que eu poderia colocar após a mensagem para não deixar salvar/continuar a operação, tendo que escolher outra forma de pagamento?

Obrigada :slight_smile:


#3

Cátia, o correto é assim

else if (m_order.getC_BPartner_ID() == 2009020 && PaymentRule.equals(MOrder.PAYMENTRULE_OnCredit)) return "Cliente CONSUMIDOR não pode pagar com Crediário";

Agora só queria saber aonde vc está usando este método… no beforeSave() da MOrder ?

Para casos assim, a melhor coisa é criar um ModelValidator, fica mais simples de controlar as validações da sua empresa… pois fica bem separado do código original do adempiere…


#4

Obrigada pelo código!
Eu tentei usar o And, mas não lembrava como colocar no java…
Mas com essa operação,ele não vai parar o processo, correto?

Ele é ativado na finalização da transação de venda, no frente de caixa. A empresa desenvolveu um novo frente de caixa, baseado no original.
É um processo, chamado no botão finalizar.


#5

Se é um processo novo… não tem problema… dai tá certinho, não vai travar nada…

Acho que isso resolve o seu problema de usuários digitarem informações erradas…


#6

Mas ele continuou o processo, e não deveria!
Deveria exibir a mensagem na tela para o usuário pro usuário escolher outra opção. E parar o sistema, não finalizar a transação.
Porque daí fica errado igual.
Acho que eu vou ter que tipo, pausar o sistema, até que o usuário escolha outra opção :question:


#7

Acho que talvez seja porque a comparação anterior muda de crediário para boleto:

else if(PaymentRule.equals(MOrder.PAYMENTRULE_OnCredit)) m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Bill); // Boleto

por isso ele nem passa pelo meu código, eu debuguei pra ver :slight_smile:
e daí ele trava e não completa.
Mudei de volta para dinheiro e finalizei, imprimiu normal.


#8

[code]public String definePaymentRule(){

// Carrega Regra de Pagamento Atual
String PaymentRule = m_OperCaixa.getPaymentRule();
// Se Forma de Pgto for Cheque, seta Em Crédito
if(PaymentRule.equals(MOrder.PAYMENTRULE_Check)) {
m_order.setPaymentRule(MOrder.PAYMENTRULE_OnCredit);
} else {
m_order.setPaymentRule(PaymentRule);
}

    /*  LBRPaymentRule - 
     *  - Se Regra de Pagamento for Cheque, então PaymentRule EM CRÉDITO e LBR PaymentRule EM CHEQUE.
     *  - Se Regra de Pagamento for Em Crédito, então PaymentRule EM CRÉDITO e LBR PaymentRule Boleto.
     *  - Se for qualquer outra Forma de Pagamento, então LBR PaymentRule DINHEIRO.
     * 
     * */
    if(PaymentRule.equals(MOrder.PAYMENTRULE_Check)) 
        m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Check);     // Cheque
    else if(PaymentRule.equals(MOrder.PAYMENTRULE_OnCredit)){
        if (m_order.getC_BPartner_ID() == 2009020)
           return "Cliente CONSUMIDOR não pode pagar com Crediário";

       m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Bill);     // Boleto
  }  
  else 
        m_order.setlbr_PaymentRule(MOrder.LBR_PAYMENTRULE_Cash);     // DINHEIRO         

    if(!m_order.save())
        return "Falha ao salvar nova Forma de Pagamento.";
    
    return "";
}[/code]

tenta assim


#9

Foi assim que eu fiz, apenas não me expressei bem na mensagem anterior.
Ta funcionando certinho agora, bem o que eu precisava.

Obrigada pela ajuda. :smiley:


#10

Revivendo o tópico:
A comparação que eu uso, é a ID, uma ID fixa; mas não é seguro, pois a empresa tem filiais e pode ser diferente a ID nas filiais.
Tentei comparar pelo nome, assim:

m_BPartner.getName().equals("CONSUMIDOR")

mas da o erro java null point exception :question:


#11

antes de tentar pegar o nome primeiro verifique se o objeto m_bpartner não está null

if (m_BPartner != null && m_BPartner.getName().equals("CONSUMIDOR"))

outra verificação importante é verificar o pq o m_BPartner está null, provavelmente vc instancia ele em outro momento do seu código e dai a sua verificação não vai funcionar


#12

Hum…
Já tinha conseguido:

MBPartner ParceiroN = new MBPartner(ctx,m_order.getC_BPartner_ID(), get_TrxName()); if (ParceiroN.get_Value("Name").equals("CONSUMIDOR") && PaymentRule.equals(MOrder.PAYMENTRULE_OnCredit)) return "Cliente CONSUMIDOR não pode pagar no Crediário";

Mas obrigada igual. :slight_smile: