<commit_before>#    @author <NAME> <<EMAIL>>
# © 2012 KMEE INFORMATICA LTDA
#   @author <NAME> <<EMAIL>>
# Copyright (C) 2021-Today - Akretion (<http://www.akretion.com>).
# @author <NAME> <<EMAIL>>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import api, fields, models

from ..constants import BR_CODES_PAYMENT_ORDER


class AccountInvoice(models.Model):
    _inherit = "account.invoice"

    eval_payment_mode_instructions = fields.Text(
        string="Instruções de Cobrança do Modo de Pagamento",
        related="payment_mode_id.instructions",
        readonly=True,
        help="Instruções Ordem de Pagamento configuradas" " no Modo de pagamento",
    )

    instructions = fields.Text(
        string="Instruções de cobrança", help="Instruções Extras da Ordem de Pagamento"
    )

    # eval_situacao_pagamento = fields.Selection(
    #     string=u'Situação do Pagamento',
    #     related='move_line_receivable_id.situacao_pagamento',
    #     readonly=True,
    #     store=True,
    #     index=True,
    # )

    @api.onchange("payment_mode_id")
    def _onchange_payment_mode_id(self):
        tax_analytic_tag_id = self.env.ref(
            "l10n_br_account_payment_order.account_analytic_tag_tax"
        )

        to_remove_invoice_line_ids = self.invoice_line_ids.filtered(
            lambda i: tax_analytic_tag_id in i.analytic_tag_ids
        )

        self.invoice_line_ids -= to_remove_invoice_line_ids

        payment_mode_id = self.payment_mode_id
        if payment_mode_id.product_tax_id:
            invoice_line_data = {
                "name": "Taxa adicional do modo de pagamento escolhido",
                "partner_id": self.partner_id.id,
                "account_id": payment_mode_id.product_tax_account_id.id,
                "product_id": payment_mode_id.product_tax_id.id,
                "price_unit": payment_mode_id.product_tax_id.lst_price,
                "quantity": 1,
                "analytic_tag_ids": [(6, 0, [tax_analytic_tag_id.id])],
            }

            self.update(
                {
                    "invoice_line_ids": [
                        (6, 0, self.invoice_line_ids.ids),
                        (0, 0, invoice_line_data),
                    ]
                }
            )

    def action_invoice_cancel(self):
        for record in self:
            if record.payment_mode_id.payment_method_code in BR_CODES_PAYMENT_ORDER:
                for line in record.move_id.line_ids:
                    # Verificar a situação do CNAB para apenas apagar
                    # a linha ou mandar uma solicitação de Baixa
                    line.update_cnab_for_cancel_invoice()

        return super().action_invoice_cancel()

    def get_invoice_fiscal_number(self):
        """
        Como neste modulo nao temos o numero do documento fiscal,
        testamos a presencia desse campo e se o módulo fiscal não tiver instalado,
        retornamos o numero do invoice do core.
        """
        self.ensure_one()
        if hasattr(self, "document_number"):
            return self.document_number
        return self.number

    def _pos_action_move_create(self):
        for inv in self:
            # Se não possui Modo de Pagto não há nada a ser feito
            if not inv.payment_mode_id:
                continue
            # Se não gera Ordem de Pagto não há nada a ser feito
            if not inv.payment_mode_id.payment_order_ok:
                continue
            # Podem existir Modo de Pagto q geram Ordens mas não são CNAB
            # por isso nesse caso tbm nada a ser feito
            if inv.payment_mode_id.payment_method_code not in BR_CODES_PAYMENT_ORDER:
                continue

            # TODO - apesar do campo financial_move_line_ids ser do tipo
            #  compute esta sendo preciso chamar o metodo porque as vezes
            #  ocorre da linha vir vazia o que impede de entrar no FOR
            #  abaixo causando o não preenchimento de dados usados no Boleto,
            #  isso deve ser melhor investigado
            inv._compute_financial()

            for index, interval in enumerate(inv.financial_move_line_ids):
                inv_number = inv.get_invoice_fiscal_number().split("/")[-1]
                numero_documento = inv_number + "/" + str(index + 1).zfill(2)
<commit_msg>fix document_number in cnab<commit_after>#    @author <NAME> <<EMAIL>>
# © 2012 KMEE INFORMATICA LTDA
#   @author <NAME> <<EMAIL>>
# Copyright (C) 2021-Today - Akretion (<http://www.akretion.com>).
# @author <NAME> <<EMAIL>>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import api, fields, models

from ..constants import BR_CODES_PAYMENT_ORDER


class AccountInvoice(models.Model):
    _inherit = "account.invoice"

    eval_payment_mode_instructions = fields.Text(
        string="Instruções de Cobrança do Modo de Pagamento",
        related="payment_mode_id.instructions",
        readonly=True,
        help="Instruções Ordem de Pagamento configuradas" " no Modo de pagamento",
    )

    instructions = fields.Text(
        string="Instruções de cobrança", help="Instruções Extras da Ordem de Pagamento"
    )

    # eval_situacao_pagamento = fields.Selection(
    #     string=u'Situação do Pagamento',
    #     related='move_line_receivable_id.situacao_pagamento',
    #     readonly=True,
    #     store=True,
    #     index=True,
    # )

    @api.onchange("payment_mode_id")
    def _onchange_payment_mode_id(self):
        tax_analytic_tag_id = self.env.ref(
            "l10n_br_account_payment_order.account_analytic_tag_tax"
        )

        to_remove_invoice_line_ids = self.invoice_line_ids.filtered(
            lambda i: tax_analytic_tag_id in i.analytic_tag_ids
        )

        self.invoice_line_ids -= to_remove_invoice_line_ids

        payment_mode_id = self.payment_mode_id
        if payment_mode_id.product_tax_id:
            invoice_line_data = {
                "name": "Taxa adicional do modo de pagamento escolhido",
                "partner_id": self.partner_id.id,
                "account_id": payment_mode_id.product_tax_account_id.id,
                "product_id": payment_mode_id.product_tax_id.id,
                "price_unit": payment_mode_id.product_tax_id.lst_price,
                "quantity": 1,
                "analytic_tag_ids": [(6, 0, [tax_analytic_tag_id.id])],
            }

            self.update(
                {
                    "invoice_line_ids": [
                        (6, 0, self.invoice_line_ids.ids),
                        (0, 0, invoice_line_data),
                    ]
                }
            )

    def action_invoice_cancel(self):
        for record in self:
            if record.payment_mode_id.payment_method_code in BR_CODES_PAYMENT_ORDER:
                for line in record.move_id.line_ids:
                    # Verificar a situação do CNAB para apenas apagar
                    # a linha ou mandar uma solicitação de Baixa
                    line.update_cnab_for_cancel_invoice()

        return super().action_invoice_cancel()

    def get_invoice_fiscal_number(self):
        """
        Como neste modulo nao temos o numero do documento fiscal,
        testamos a presencia desse campo e se o módulo fiscal não tiver instalado,
        retornamos o numero do invoice do core.
        """
        self.ensure_one()
        if hasattr(self, "document_number") and self.document_number:
            return self.document_number
        return self.number

    def _pos_action_move_create(self):
        for inv in self:
            # Se não possui Modo de Pagto não há nada a ser feito
            if not inv.payment_mode_id:
                continue
            # Se não gera Ordem de Pagto não há nada a ser feito
            if not inv.payment_mode_id.payment_order_ok:
                continue
            # Podem existir Modo de Pagto q geram Ordens mas não são CNAB
            # por isso nesse caso tbm nada a ser feito
            if inv.payment_mode_id.payment_method_code not in BR_CODES_PAYMENT_ORDER:
                continue

            # TODO - apesar do campo financial_move_line_ids ser do tipo
            #  compute esta sendo preciso chamar o metodo porque as vezes
            #  ocorre da linha vir vazia o que impede de entrar no FOR
            #  abaixo causando o não preenchimento de dados usados no Boleto,
            #  isso deve ser melhor investigado
            inv._compute_financial()

            for index, interval in enumerate(inv.financial_move_line_ids):
                inv_number = inv.get_invoice_fiscal_number().split("/")[-1]
                numero_documento = inv_number + "/" + str(index + 1).zfill(2)

{'fraction_non_alphanumeric': 0.0755820621630921, 'fraction_numerical': 0.005046450280995527, 'mean_word_length': 2.102098897189612, 'pattern_counts': {'":': 16, '<': 23, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3746154', 'n_tokens_mistral': 2820, 'n_tokens_neox': 2657, 'n_words': 653}