<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 api, fields, models
from odoo.exceptions import UserError, ValidationError
from odoo.addons.l10n_br_base.constante_tributaria import *

_logger = logging.getLogger(__name__)

try:
    from pysped.nfe.leiaute import (
        ProcNFe_310,
        EventoCCe_100,
    )
    from pybrasil.data import (
        parse_datetime,
        UTC,
        data_hora_horario_brasilia,
        agora
    )
    from pybrasil.valor import formata_valor

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


class SpedCartaCorrecao(models.Model):
    _name = b'sped.documento.carta.correcao'
    _description = 'Carta de Correção'
    _order = 'documento_id, sequencia desc'
    _rec_name = 'descricao'

    descricao = fields.Char(
        string='Carta de Correção',
        compute='_compute_descricao',
    )
    documento_id = fields.Many2one(
        comodel_name='sped.documento',
        string='Documento',
        ondelete='cascade',
    )
    sequencia = fields.Integer(
        string='Sequência',
    )
    correcao = fields.Text(
        string='Correção',
    )

    #
    # Os campos de anexos abaixo servem para que os anexos não possam
    # ser excluídos pelo usuário, somente através do sistema ou pelo
    # suporte
    #
    arquivo_xml_id = fields.Many2one(
        comodel_name='ir.attachment',
        string='XML',
        ondelete='restrict',
        copy=False,
    )
    arquivo_xml_autorizacao_id = fields.Many2one(
        comodel_name='ir.attachment',
        string='XML de autorização',
        ondelete='restrict',
        copy=False,
    )
    arquivo_pdf_id = fields.Many2one(
        comodel_name='ir.attachment',
        string='PDF DAEDE',
        ondelete='restrict',
        copy=False,
    )
    data_hora_autorizacao = fields.Datetime(
        string='Data de autorização',
        index=True,
    )
    data_autorizacao = fields.Date(
        string='Data de autorização',
        compute='_compute_data_hora_separadas',
        store=True,
        index=True,
    )
    protocolo_autorizacao = fields.Char(
        string='Protocolo de autorização',
        size=60,
    )
    permite_alteracao = fields.Boolean(
        string='Permite alteração?',
        compute='_compute_permite_alteracao',
    )

    @api.depends('documento_id', 'sequencia')
    def _compute_descricao(self):
        for carta_correcao in self:
            txt = 'CC-e nº '
            txt += \
                formata_valor(carta_correcao.sequencia or 1, casas_decimais=0)
            txt += ' - '
            txt += carta_correcao.documento_id.descricao

            carta_correcao.descricao = txt

    @api.depends('data_hora_autorizacao')
    def _compute_permite_alteracao(self):
        for carta_correcao in self:
            if carta_correcao.data_hora_autorizacao:
                carta_correcao.permite_alteracao = False
            else:
                carta_correcao.permite_alteracao = True

    def _check_permite_alteracao(self, operacao='create', dados={}):
        for carta_correcao in self:
            if not carta_correcao.permite_alteracao:
                if operacao == 'unlink':
                    mensagem = \
                        'Não é permitido excluir esta carta de correção!'
                elif operacao == 'write':
                    mensagem = \
                        'Não é permitido alterar esta carta de correção!'
                elif operacao == 'create':
                    mensagem = \
                        'Não é permitido criar esta carta de correção!'

                raise ValidationError(mensagem)

    @api.depends('data_hora_autorizacao')
    def _compute_data_hora_separadas(self):
        for carta_correcao in self:
            if carta_correcao.data_hora_autorizacao:
                data_hora_autorizacao = data_hora_horario_brasilia(
                    parse_datetime(carta_correcao.data_hora_autorizacao))
                carta_correcao.data_autorizacao = \
                    str(data_hora_autorizacao)[:10]

    def _grava_anexo(self, nome_arquivo='', conteudo='',
                     tipo='application/xml'):
        self.ensure_one()

        attachment = self.env['ir.attachment']

        busca = [
            ('res_model', '=', 'sped.documento.carta.correcao'),
            ('res_id', '=', self.id),
            ('name', '=', nome_arquivo),
        ]
        attachment_ids = attachment.search(busca)
        attachment_ids.unlink()

        dados = {
            'name': nome_arquivo,
            'datas_fname': nome_arquivo,
            'res_model': 'sped.documento.carta.correcao',
            'res_id': self.id,
            'datas': conteudo.encode('base64'),
            'mimetype': tipo,
        }

        anexo_id = self.env['ir.attachment'].create(dados)
<commit_msg>[FIX] Carta de correção nf-e 4.0<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
import base64
from odoo import api, fields, models
from odoo.exceptions import UserError, ValidationError
from odoo.addons.l10n_br_base.constante_tributaria import *

_logger = logging.getLogger(__name__)

try:
    from pysped.nfe.leiaute import (
        ProcNFe_310,
        EventoCCe_100,
    )
    from pybrasil.data import (
        parse_datetime,
        UTC,
        data_hora_horario_brasilia,
        agora
    )
    from pybrasil.valor import formata_valor

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


class SpedCartaCorrecao(models.Model):
    _name = b'sped.documento.carta.correcao'
    _description = 'Carta de Correção'
    _order = 'documento_id, sequencia desc'
    _rec_name = 'descricao'

    descricao = fields.Char(
        string='Carta de Correção',
        compute='_compute_descricao',
    )
    documento_id = fields.Many2one(
        comodel_name='sped.documento',
        string='Documento',
        ondelete='cascade',
    )
    sequencia = fields.Integer(
        string='Sequência',
    )
    correcao = fields.Text(
        string='Correção',
    )

    #
    # Os campos de anexos abaixo servem para que os anexos não possam
    # ser excluídos pelo usuário, somente através do sistema ou pelo
    # suporte
    #
    arquivo_xml_id = fields.Many2one(
        comodel_name='ir.attachment',
        string='XML',
        ondelete='restrict',
        copy=False,
    )
    arquivo_xml_autorizacao_id = fields.Many2one(
        comodel_name='ir.attachment',
        string='XML de autorização',
        ondelete='restrict',
        copy=False,
    )
    arquivo_pdf_id = fields.Many2one(
        comodel_name='ir.attachment',
        string='PDF DAEDE',
        ondelete='restrict',
        copy=False,
    )
    data_hora_autorizacao = fields.Datetime(
        string='Data de autorização',
        index=True,
    )
    data_autorizacao = fields.Date(
        string='Data de autorização',
        compute='_compute_data_hora_separadas',
        store=True,
        index=True,
    )
    protocolo_autorizacao = fields.Char(
        string='Protocolo de autorização',
        size=60,
    )
    permite_alteracao = fields.Boolean(
        string='Permite alteração?',
        compute='_compute_permite_alteracao',
    )

    @api.depends('documento_id', 'sequencia')
    def _compute_descricao(self):
        for carta_correcao in self:
            txt = 'CC-e nº '
            txt += \
                formata_valor(carta_correcao.sequencia or 1, casas_decimais=0)
            txt += ' - '
            txt += carta_correcao.documento_id.descricao

            carta_correcao.descricao = txt

    @api.depends('data_hora_autorizacao')
    def _compute_permite_alteracao(self):
        for carta_correcao in self:
            if carta_correcao.data_hora_autorizacao:
                carta_correcao.permite_alteracao = False
            else:
                carta_correcao.permite_alteracao = True

    def _check_permite_alteracao(self, operacao='create', dados={}):
        for carta_correcao in self:
            if not carta_correcao.permite_alteracao:
                if operacao == 'unlink':
                    mensagem = \
                        'Não é permitido excluir esta carta de correção!'
                elif operacao == 'write':
                    mensagem = \
                        'Não é permitido alterar esta carta de correção!'
                elif operacao == 'create':
                    mensagem = \
                        'Não é permitido criar esta carta de correção!'

                raise ValidationError(mensagem)

    @api.depends('data_hora_autorizacao')
    def _compute_data_hora_separadas(self):
        for carta_correcao in self:
            if carta_correcao.data_hora_autorizacao:
                data_hora_autorizacao = data_hora_horario_brasilia(
                    parse_datetime(carta_correcao.data_hora_autorizacao))
                carta_correcao.data_autorizacao = \
                    str(data_hora_autorizacao)[:10]

    def _grava_anexo(self, nome_arquivo='', conteudo='',
                     tipo='application/xml'):
        self.ensure_one()

        attachment = self.env['ir.attachment']

        busca = [
            ('res_model', '=', 'sped.documento.carta.correcao'),
            ('res_id', '=', self.id),
            ('name', '=', nome_arquivo),
        ]
        attachment_ids = attachment.search(busca)
        attachment_ids.unlink()

        dados = {
            'name': nome_arquivo,
            'datas_fname': nome_arquivo,
            'res_model': 'sped.documento.carta.correcao',
            'res_id': self.id,
            'datas': base64.b64encode(conteudo),
            'mimetype': tipo,
        }

        anexo_id = self.env['ir.attachment'].create(dados)

{'fraction_non_alphanumeric': 0.09731443860866118, 'fraction_numerical': 0.005747695966703003, 'mean_word_length': 2.160663952395866, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 6}, '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': '7652643', 'n_tokens_mistral': 3411, 'n_tokens_neox': 3282, 'n_words': 591}