Skip to content
New issue

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

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

Already on GitHub? # 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.

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

No branches or pull requests

3 participants