<commit_before># -*- coding: utf-8 -*-
#
# Copyright 2016 Taŭga Tecnologia
#   <NAME> <<EMAIL>>
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl)
#

from __future__ import division, print_function, unicode_literals

import logging

from odoo import models, _
from odoo.exceptions import UserError
from odoo.addons.l10n_br_base.constante_tributaria import *


_logger = logging.getLogger(__name__)

try:
    from pybrasil.valor.decimal import Decimal as D

except (ImportError, IOError) as err:
    _logger.debug(err)

from ..versao_nfe_padrao import ClasseDet


class SpedDocumentoItem(models.Model):
    _inherit = 'sped.documento.item'

    def _monta_informacoes_adicionais(self):
        self.ensure_one()
        #
        # Prepara a observação do item
        #
        infcomplementar = self.infcomplementar or ''

        dados_infcomplementar = {
            'nf': self.documento_id,
            'item': self,
        }

        #
        # Crédito de ICMS do SIMPLES
        #
        if self.documento_id.regime_tributario == REGIME_TRIBUTARIO_SIMPLES \
            and self.cst_icms_sn in ST_ICMS_SN_CALCULA_CREDITO:
            if len(infcomplementar) > 0:
                infcomplementar += '\n'

            infcomplementar += 'Permite o aproveitamento de crédito de ' + \
                'ICMS no valor de R$ ${formata_valor(item.vr_icms_sn)},' + \
                ' correspondente à alíquota de ' + \
                '${formata_valor(item.al_icms_sn)}%, nos termos do art. 23'+ \
                ' da LC 123/2006;'

        #
        # Valor do IBPT
        #
        if self.vr_ibpt:
            if len(infcomplementar) > 0:
                infcomplementar += '\n'

            infcomplementar += 'Valor aproximado dos tributos: ' + \
                'R$ ${formata_valor(item.vr_ibpt)} (' + \
                '${formata_valor(item.al_ibpt)}%) - fonte: IBPT;'

        #
        # ICMS para UF de destino
        #

        if (self.cfop_posicao ==
                IDENTIFICACAO_DESTINO_INTERESTADUAL and
                self.consumidor_final ==
                    TIPO_CONSUMIDOR_FINAL_CONSUMIDOR_FINAL and
                self.documento_id.participante_contribuinte ==
                    INDICADOR_IE_DESTINATARIO_NAO_CONTRIBUINTE):

            if len(infcomplementar) > 0:
                infcomplementar += '\n'

            infcomplementar += \
                'Partilha do ICMS de ' + \
                '${formata_valor(item.al_interna_destino)}% recolhida ' + \
                'conf. EC 87/2015: ' + \
                'R$ ${formata_valor(item.vr_icms_estado_destino)} para o ' + \
                'estado de ${nf.participante_id.estado} e ' + \
                'R$ ${formata_valor(item.vr_icms_estado_origem)} para o ' + \
                'estado de ${nf.empresa_id.estado}; Valor do diferencial ' + \
                'de alíquota (${formata_valor(item.al_difal)}%): ' + \
                'R$ ${formata_valor(item.vr_difal)};'

            if self.vr_fcp:
                infcomplementar += ' Fundo de combate à pobreza: R$ ' + \
                    '${formata_valor(item.vr_fcp)}'

        #
        # Aplica um template na observação do item
        #

        return self._renderizar_informacoes_template(
            dados_infcomplementar, infcomplementar)

    def monta_nfe(self, numero_item, nfe):
        self.ensure_one()

        if self.documento_id.modelo != MODELO_FISCAL_NFE and \
                self.documento_id.modelo != MODELO_FISCAL_NFCE:
            return

        det = ClasseDet()

        det.nItem.valor = numero_item
        det.prod.cProd.valor = \
            self.produto_id.codigo_cliente or \
            self.produto_id.codigo or str(self.produto_id.id)
        det.prod.cEAN.valor = self.produto_id.codigo_barras or ''

        #
        # O 1º item da NFC-e tem que ter uma descrição específica em
        # homologação
        #
        if self.documento_id.modelo == MODELO_FISCAL_NFCE and \
                self.documento_id.ambiente_nfe == AMBIENTE_NFE_HOMOLOGACAO:
            descricao = 'NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - ' \
                        'SEM VALOR FISCAL'

        else:
            if self.produto_nome:
                descricao = self.produto_nome
            else:
                descricao = self.produto_id.nome

        descricao = descricao.replace('—', '-').replace('–', '-')
        descricao = descricao.replace('”', '"').replace('“', '"')
        descricao = descricao.replace('’', u"'").replace('‘', u"'")
        descricao = descricao.replace('—', '-').replace('–', '-')
        det.prod.xProd.valor = descricao.strip()

        if self.produto_id.ncm_id:
            det.prod.NCM.valor = self.produto_id.ncm_id.codigo
            det.prod.EXTIPI.valor = self.produto_id.ncm_id.ex
        else:
            det.prod.NCM.valor = ''

        det.prod.nFCI.valor = self.numero_fci or ''
        det.prod.CFOP.valor = self.cfop_id.codigo
        det.prod.uCom.valor = self.unidade_id.codigo
        det.prod.qCom.valor = str(D(self.quantidade).quantize(D('0.0001')))
        det.prod.vUnCom.valor = \
            str(D(self.vr_unitario).quantize(D(10 * 10 ** -10)))
        det.prod.vProd.valor = str(D(self.vr_produtos))
        det.prod.cEANTrib.valor = ''

        #
        # Trata corretamente a unidade e valor unitário da tributação
        # de acordo com o NCM
        #
        if self.unidade_tributacao_id:
            det.prod.uTrib.valor = self.unidade_tributacao_id.codigo
            det.prod.qTrib.valor = str(D(self.quantidade_tributacao).quantize(D('0.0001')))
            det.prod.vUnTrib.valor = str(D(self.vr_unitario_tributacao))

        else:
            det.prod.uTrib.valor = det.prod.uCom.valor
            det.prod.qTrib.valor = det.prod.qCom.valor
            det.prod.vUnTrib.valor = det.prod.vUnCom.valor

        det.prod.vFrete.valor = str(D(self.vr_frete))
        det.prod.vSeg.valor = str(D(self.vr_seguro))
        det.prod.vOutro.valor = str(D(self.vr_outras))
        det.prod.vDesc.valor = str(D(self.vr_desconto))
        det.prod.xPed.valor = self.numero_pedido or ''
        det.prod.nItemPed.valor = self.numero_item_pedido or ''

        if self.compoe_total:
            det.prod.indTot.valor = '1'
        else:
            det.prod.indTot.valor = '0'
<commit_msg>[FIX] É necessário preencher o EAN e o EANTrib<commit_after># -*- coding: utf-8 -*-
#
# Copyright 2016 Taŭga Tecnologia
#   <NAME> <<EMAIL>>
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl)
#

from __future__ import division, print_function, unicode_literals

import logging

from odoo import models, _
from odoo.exceptions import UserError
from odoo.addons.l10n_br_base.constante_tributaria import *


_logger = logging.getLogger(__name__)

try:
    from pybrasil.valor.decimal import Decimal as D

except (ImportError, IOError) as err:
    _logger.debug(err)

from ..versao_nfe_padrao import ClasseDet


class SpedDocumentoItem(models.Model):
    _inherit = 'sped.documento.item'

    def _monta_informacoes_adicionais(self):
        self.ensure_one()
        #
        # Prepara a observação do item
        #
        infcomplementar = self.infcomplementar or ''

        dados_infcomplementar = {
            'nf': self.documento_id,
            'item': self,
        }

        #
        # Crédito de ICMS do SIMPLES
        #
        if self.documento_id.regime_tributario == REGIME_TRIBUTARIO_SIMPLES \
            and self.cst_icms_sn in ST_ICMS_SN_CALCULA_CREDITO:
            if len(infcomplementar) > 0:
                infcomplementar += '\n'

            infcomplementar += 'Permite o aproveitamento de crédito de ' + \
                'ICMS no valor de R$ ${formata_valor(item.vr_icms_sn)},' + \
                ' correspondente à alíquota de ' + \
                '${formata_valor(item.al_icms_sn)}%, nos termos do art. 23'+ \
                ' da LC 123/2006;'

        #
        # Valor do IBPT
        #
        if self.vr_ibpt:
            if len(infcomplementar) > 0:
                infcomplementar += '\n'

            infcomplementar += 'Valor aproximado dos tributos: ' + \
                'R$ ${formata_valor(item.vr_ibpt)} (' + \
                '${formata_valor(item.al_ibpt)}%) - fonte: IBPT;'

        #
        # ICMS para UF de destino
        #

        if (self.cfop_posicao ==
                IDENTIFICACAO_DESTINO_INTERESTADUAL and
                self.consumidor_final ==
                    TIPO_CONSUMIDOR_FINAL_CONSUMIDOR_FINAL and
                self.documento_id.participante_contribuinte ==
                    INDICADOR_IE_DESTINATARIO_NAO_CONTRIBUINTE):

            if len(infcomplementar) > 0:
                infcomplementar += '\n'

            infcomplementar += \
                'Partilha do ICMS de ' + \
                '${formata_valor(item.al_interna_destino)}% recolhida ' + \
                'conf. EC 87/2015: ' + \
                'R$ ${formata_valor(item.vr_icms_estado_destino)} para o ' + \
                'estado de ${nf.participante_id.estado} e ' + \
                'R$ ${formata_valor(item.vr_icms_estado_origem)} para o ' + \
                'estado de ${nf.empresa_id.estado}; Valor do diferencial ' + \
                'de alíquota (${formata_valor(item.al_difal)}%): ' + \
                'R$ ${formata_valor(item.vr_difal)};'

            if self.vr_fcp:
                infcomplementar += ' Fundo de combate à pobreza: R$ ' + \
                    '${formata_valor(item.vr_fcp)}'

        #
        # Aplica um template na observação do item
        #

        return self._renderizar_informacoes_template(
            dados_infcomplementar, infcomplementar)

    def monta_nfe(self, numero_item, nfe):
        self.ensure_one()

        if self.documento_id.modelo != MODELO_FISCAL_NFE and \
                self.documento_id.modelo != MODELO_FISCAL_NFCE:
            return

        det = ClasseDet()

        det.nItem.valor = numero_item
        det.prod.cProd.valor = \
            self.produto_id.codigo_cliente or \
            self.produto_id.codigo or str(self.produto_id.id)
        det.prod.cEAN.valor = self.produto_id.codigo_barras or ''

        #
        # O 1º item da NFC-e tem que ter uma descrição específica em
        # homologação
        #
        if self.documento_id.modelo == MODELO_FISCAL_NFCE and \
                self.documento_id.ambiente_nfe == AMBIENTE_NFE_HOMOLOGACAO:
            descricao = 'NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - ' \
                        'SEM VALOR FISCAL'

        else:
            if self.produto_nome:
                descricao = self.produto_nome
            else:
                descricao = self.produto_id.nome

        descricao = descricao.replace('—', '-').replace('–', '-')
        descricao = descricao.replace('”', '"').replace('“', '"')
        descricao = descricao.replace('’', u"'").replace('‘', u"'")
        descricao = descricao.replace('—', '-').replace('–', '-')
        det.prod.xProd.valor = descricao.strip()

        if self.produto_id.ncm_id:
            det.prod.NCM.valor = self.produto_id.ncm_id.codigo
            det.prod.EXTIPI.valor = self.produto_id.ncm_id.ex
        else:
            det.prod.NCM.valor = ''

        det.prod.nFCI.valor = self.numero_fci or ''
        det.prod.CFOP.valor = self.cfop_id.codigo
        det.prod.uCom.valor = self.unidade_id.codigo
        det.prod.qCom.valor = str(D(self.quantidade).quantize(D('0.0001')))
        det.prod.vUnCom.valor = \
            str(D(self.vr_unitario).quantize(D(10 * 10 ** -10)))
        det.prod.vProd.valor = str(D(self.vr_produtos))
        det.prod.cEANTrib.valor = self.produto_id.codigo_barras or ''

        #
        # Trata corretamente a unidade e valor unitário da tributação
        # de acordo com o NCM
        #
        if self.unidade_tributacao_id:
            det.prod.uTrib.valor = self.unidade_tributacao_id.codigo
            det.prod.qTrib.valor = str(D(self.quantidade_tributacao).quantize(D('0.0001')))
            det.prod.vUnTrib.valor = str(D(self.vr_unitario_tributacao))

        else:
            det.prod.uTrib.valor = det.prod.uCom.valor
            det.prod.qTrib.valor = det.prod.qCom.valor
            det.prod.vUnTrib.valor = det.prod.vUnCom.valor

        det.prod.vFrete.valor = str(D(self.vr_frete))
        det.prod.vSeg.valor = str(D(self.vr_seguro))
        det.prod.vOutro.valor = str(D(self.vr_outras))
        det.prod.vDesc.valor = str(D(self.vr_desconto))
        det.prod.xPed.valor = self.numero_pedido or ''
        det.prod.nItemPed.valor = self.numero_item_pedido or ''

        if self.compoe_total:
            det.prod.indTot.valor = '1'
        else:
            det.prod.indTot.valor = '0'

{'fraction_non_alphanumeric': 0.11374705420267085, 'fraction_numerical': 0.007069913589945012, 'mean_word_length': 1.9179463671785468, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, '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': '1085044', 'n_tokens_mistral': 4744, 'n_tokens_neox': 4480, 'n_words': 730}