Trust-Code/odoo-brasil

View on GitHub
br_base/models/res_company.py

Summary

Maintainability
C
1 day
Test Coverage
# -*- coding: utf-8 -*-
# © 2004-2010 Tiny SPRL (<http://tiny.be>)
# © Thinkopen Solutions (<http://www.thinkopensolutions.com.br>)
# © Akretion (<http://www.akretion.com>)
# © KMEE (<http://www.kmee.com.br>)
# © 2016 Danimar Ribeiro <danimaribeiro@gmail.com>, Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).


import re
import logging
import base64
from datetime import datetime
from odoo import models, fields, api

_logger = logging.getLogger(__name__)

try:
    from OpenSSL import crypto
except ImportError:
    _logger.debug('Cannot import OpenSSL.crypto', exc_info=True)


class ResCompany(models.Model):

    _inherit = 'res.company'

    @api.one
    def _get_address_data(self):
        self.city_id = self.partner_id.city_id
        self.district = self.partner_id.district
        self.number = self.partner_id.number

    @api.one
    def _get_br_data(self):
        """ Read the l10n_br specific functional fields. """
        self.legal_name = self.partner_id.legal_name
        self.cnpj_cpf = self.partner_id.cnpj_cpf
        self.inscr_est = self.partner_id.inscr_est
        self.inscr_mun = self.partner_id.inscr_mun
        self.suframa = self.partner_id.suframa

    @api.one
    def _set_br_suframa(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.suframa = self.suframa

    @api.one
    def _set_br_legal_name(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.legal_name = self.legal_name

    @api.one
    def _set_br_cnpj_cpf(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.cnpj_cpf = self.cnpj_cpf

    @api.one
    def _set_br_inscr_est(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.inscr_est = self.inscr_est

    @api.one
    def _set_br_inscr_mun(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.inscr_mun = self.inscr_mun

    @api.one
    def _set_br_number(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.number = self.number

    @api.one
    def _set_br_district(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.district = self.district

    @api.one
    def _set_city_id(self):
        """ Write the l10n_br specific functional fields. """
        self.partner_id.city_id = self.city_id

    @api.one
    def _compute_expiry_date(self):
        try:
            pfx = base64.decodestring(
                self.with_context(bin_size=False).nfe_a1_file)
            pfx = crypto.load_pkcs12(pfx, self.nfe_a1_password)
            cert = pfx.get_certificate()
            end = datetime.strptime(cert.get_notAfter(), '%Y%m%d%H%M%SZ')
            subj = cert.get_subject()
            self.cert_expire_date = end
            if datetime.now() < end:
                self.cert_state = 'valid'
            else:
                self.cert_state = 'expired'
            self.cert_information = "%s\n%s\n%s\n%s" % (
                subj.CN, subj.L, subj.O, subj.OU)
        except crypto.Error:
            self.cert_state = 'invalid_password'
        except:
            self.cert_state = 'unknown'
            _logger.error(
                u'Erro desconhecido ao consultar certificado', exc_info=True)

    cnpj_cpf = fields.Char(
        compute=_get_br_data, inverse=_set_br_cnpj_cpf, size=18,
        string=u'CNPJ')

    inscr_est = fields.Char(
        compute=_get_br_data, inverse=_set_br_inscr_est, size=16,
        string=u'Inscr. Estadual')

    inscr_mun = fields.Char(
        compute=_get_br_data, inverse=_set_br_inscr_mun, size=18,
        string=u'Inscr. Municipal')

    suframa = fields.Char(
        compute=_get_br_data, inverse=_set_br_suframa, size=18,
        string=u'Suframa')

    legal_name = fields.Char(
        compute=_get_br_data, inverse=_set_br_legal_name, size=128,
        string=u'Razão Social')

    city_id = fields.Many2one(
        compute=_get_address_data, inverse='_set_city_id',
        comodel_name='res.state.city', string="City", multi='address')

    district = fields.Char(
        compute=_get_address_data, inverse='_set_br_district', size=32,
        string=u"Bairro", multi='address')

    number = fields.Char(
        compute=_get_address_data, inverse='_set_br_number', size=10,
        string=u"Número", multi='address')

    nfe_a1_file = fields.Binary(u'Arquivo NFe A1')
    nfe_a1_password = fields.Char(u'Senha NFe A1', size=64)

    cert_state = fields.Selection(
        [('not_loaded', u'Não carregado'),
         ('expired', u'Expirado'),
         ('invalid_password', u'Senha Inválida'),
         ('unknown', u'Desconhecido'),
         ('valid', u'Válido')],
        string=u"Situação Cert.", compute=_compute_expiry_date,
        default='not_loaded')
    cert_information = fields.Text(
        string=u"Informações Cert.", compute=_compute_expiry_date)
    cert_expire_date = fields.Date(
        string=u"Validade Cert.", compute=_compute_expiry_date)

    @api.onchange('cnpj_cpf')
    def onchange_mask_cnpj_cpf(self):
        if self.cnpj_cpf:
            val = re.sub('[^0-9]', '', self.cnpj_cpf)
            if len(val) == 14:
                cnpj_cpf = "%s.%s.%s/%s-%s"\
                    % (val[0:2], val[2:5], val[5:8], val[8:12], val[12:14])
                self.cnpj_cpf = cnpj_cpf

    @api.onchange('city_id')
    def onchange_city_id(self):
        """ Ao alterar o campo city_id copia o nome
        do município para o campo city que é o campo nativo do módulo base
        para manter a compatibilidade entre os demais módulos que usam o
        campo city.
        """
        if self.city_id:
            self.city = self.city_id.name

    @api.onchange('zip')
    def onchange_mask_zip(self):
        if self.zip:
            val = re.sub('[^0-9]', '', self.zip)
            if len(val) == 8:
                zip = "%s-%s" % (val[0:5], val[5:8])
                self.zip = zip