Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0] vPag sempre com valor do total da compra no POS #3466

Open
kcarriello opened this issue Oct 27, 2024 · 5 comments
Open

[14.0] vPag sempre com valor do total da compra no POS #3466

kcarriello opened this issue Oct 27, 2024 · 5 comments

Comments

@kcarriello
Copy link

Module

l10n_br_pos_nfce

Describe the bug

Quando faço uma venda no POS e o cliente paga com dinheiro e precisa de troco a nota é emitida em contingencia, a tag vPag mostra o valor da compra e não o valor pago, a tag vTroco é populada corretamente no xml

To Reproduce

Odoo 14
Fazer uma venda no POS e emitir uma NFCe, pagar em dinheiro acima do valor da compra, o frontend exibe tudo corretamente, valor do troco, etc, inclusive o recibo exibe o valor pago e o troco, mas o XML de envio da nota poem vPag nao como valor entregue em dinheiro e sim como o valor total de compra

Expected behavior
vPag deveria ser o valor em dinheiro pago pelo cliente, exemplo: se a compra é de R$1,00 e o cliente paga com R$5,00 vPag deveria ser R$5,00 e vTroco R$4,00. No meu entendimento isso deveria ser assim e de fato a receita rejeita a nota por este motivo.

@kcarriello kcarriello added the bug label Oct 27, 2024
@kcarriello
Copy link
Author

eu acho que o probleme esta aqui, nfe40_vPag deveria receber o valor pago pelo cliente e nao o valor da compra quando existe a tag vTroco, porém não sei como corrigir.

def _compute_nfe40_detpag(self):
    for rec in self.filtered(lambda x: x._need_compute_nfe_tags()):
        if rec._is_without_payment():
            det_pag_vals = {
                "nfe40_indPag": A_VISTA,
                "nfe40_tPag": SEM_PAGAMENTO,
                "nfe40_vPag": 0.00,
            }
        else:
            # TODO pode haver pagamento que uma parte é a vista
            # e outra a prazo, dividir em dois detPag nestes casos.
            det_pag_vals = {
                "nfe40_indPag": A_PRAZO if rec._is_installment() > 0 else A_VISTA,
                "nfe40_tPag": rec.move_ids.payment_mode_id.fiscal_payment_mode
                or "",
                "nfe40_vPag": rec.amount_financial_total,

@kcarriello
Copy link
Author

kcarriello commented Oct 28, 2024

resolvi assim alterando o modulo l10n_br_account_nfe:


   def _compute_nfe40_detpag(self):
        for rec in self.filtered(lambda x: x._need_compute_nfe_tags()):
            if rec._is_without_payment():
                det_pag_vals = {
                    "nfe40_indPag": A_VISTA,
                    "nfe40_tPag": SEM_PAGAMENTO,
                    "nfe40_vPag": 0.00,
                }
            else:
                # TODO pode haver pagamento que uma parte é a vista
                # e outra a prazo, dividir em dois detPag nestes casos.


            # Iterar sobre os movimentos (deve ser pos.order)

                total_payment_amount = 0.0

                # Itera sobre os movimentos (deve ser account.move)
                for move in rec.move_ids:
                    if move._name == 'account.move':  # Certifique-se de que estamos lidando com account.move
                        print(f"Processing account move: {move.name}")

                        # Verifique se há um campo para vincular a ordem do POS, como 'invoice_origin' ou 'pos_order_id'
                        pos_order = self.env['pos.order'].search([('name', '=', move.invoice_origin)], limit=1)
                        if pos_order:
                            print(f"Found POS order: {pos_order.name}")

                            # Calcula o valor total pago somando amount_total e amount_return
                            total_payment_amount = pos_order.amount_total + pos_order.amount_return
                            print(f"Total payment amount (vPag): {total_payment_amount}")



                det_pag_vals = {
                    "nfe40_indPag": A_PRAZO if rec._is_installment() > 0 else A_VISTA,
                    "nfe40_tPag": rec.move_ids.payment_mode_id.fiscal_payment_mode
                    or "",
                    "nfe40_vPag": total_payment_amount,
                }
            detpag_current = {
                field: getattr(detpag, field, None)
                for detpag in rec.nfe40_detPag
                for field in det_pag_vals
            }
            if det_pag_vals != detpag_current:
                rec.nfe40_detPag = [(2, detpag, 0) for detpag in rec.nfe40_detPag.ids]
                rec.nfe40_detPag = [(0, 0, det_pag_vals)]

@mileo
Copy link
Member

mileo commented Oct 28, 2024

Quando não tem troco é emitido normalmente é isso?

@antoniospneto antoniospneto changed the title vPag sempre com valor do total da compra no POS [14.0] vPag sempre com valor do total da compra no POS Oct 28, 2024
@kcarriello
Copy link
Author

Correto

@mileo
Copy link
Member

mileo commented Oct 28, 2024

Correto

Vamos analisar seu código e providenciar a correção definitiva.

Obrigado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants