Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Fix/generated key oca #1255

Merged
merged 3 commits into from
Apr 8, 2021
Merged

Fix/generated key oca #1255

merged 3 commits into from
Apr 8, 2021

Conversation

mileo
Copy link
Member

@mileo mileo commented Mar 26, 2021

@marcelsavegnago corrige o erro reportado da falha na geração de nf-e e nfse quando ambos os módulos estão instalados.

Vou fazer um PR no l10n_br_nfe e já colo o link aqui.

rvalyi
rvalyi previously requested changes Mar 26, 2021
Copy link
Member

@rvalyi rvalyi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pessoal concordo com o @renatonlima. Pensei a mesma coisa qdo vi o PR ontem.
@mileo ate a gente acertar o PR da NFe da tempo de vc arrumar as libs erpbrasil.edoc e erpbrasil.assinatura...

@mileo
Copy link
Member Author

mileo commented Mar 26, 2021

Pessoal prefiro deixar isso para um segundo momento pois as libs do erpbrasil já estão operacionais e o merge da erpbrasil/erpbrasil.edoc#30 e outros PRs pendentes relacionados a integração da nota paulista serão super complicados.

Esse método deverá existir no fiscal, obvio que de forma mais simples, pois estará chamando um método do erpbrasil onde ficará a lógica.

Entretanto esse PR corrige um bug onde os módulos l10n_br_nfe e l10n_br_nfse_ginfes/issnet não podem ser instalados ao mesmo tempo e inviabiliza a continuidade dos trabalhos atuais.

@rvalyi
Copy link
Member

rvalyi commented Mar 26, 2021

Pessoal prefiro deixar isso para um segundo momento pois as libs do erpbrasil já estão operacionais e o merge da erpbrasil/erpbrasil.edoc#30 e outros PRs pendentes relacionados a integração da nota paulista serão super complicados.

Esse método deverá existir no fiscal, obvio que de forma mais simples, pois estará chamando um método do erpbrasil onde ficará a lógica.

Entretanto esse PR corrige um bug onde os módulos l10n_br_nfe e l10n_br_nfse_ginfes/issnet não podem ser instalados ao mesmo tempo e inviabiliza a continuidade dos trabalhos atuais.

vamos ser serio por um minuto @mileo?
A gente pode falar o mesmo daquilo que vc faz aqui #768 (comment)
Com MUITO MAIS trabalho travado (tipo 6 meses homen de PR travado) por conta de coisas que normalmente vc tenta se vitimizar para deixar os leigos pensar que somos nos que somos duros demais com suas propostas quando sao zoadas, mas que acabou sendo rejeitado do mesmo jeito pelo pessoal importante na OCA exatamente como eu avisei que seria mas que vc foi la pagar para ver como vc é cabeça dura:
OCA/bank-payment#781
ou te deixa no limbo do mesmo jeito quando vc começa a viajar na maionese: OCA/account-financial-tools#805

Entao sei que no dos outros é refresco, mas vamos ser um pouco serio por favor porque aqui nao é grupinho de fake news de telegram nao ta, aqui nao tem conversinha nao.

@marcelsavegnago
Copy link
Member

Pessoal.. respirem :). Foi identificado um problema e agora precisamos definir qual o melhor caminho.

@mileo como não houve nenhuma mudança de código eu não sei se é indicado remover o bloqueio solicitando uma nova revisão. Porém, pode ser falha no meu entendimento sobre quando solicitar uma nova revisão e neste caso não me parece indicado.

@marcelsavegnago
Copy link
Member

@mileo pode fazer o rebase por favor ?

@rvalyi
Copy link
Member

rvalyi commented Apr 5, 2021

10 dias galera, @mileo nao deu para fazer a alteraçao no erpbrasil ainda?

@mileo
Copy link
Member Author

mileo commented Apr 5, 2021

para fazer a alteraçao no erpbrasil aind

Pessoal eu já comecei na semana passada mas não tive tempo de acabar. Vou correr para fechar essa alteração ainda hoje.

# Copyright (C) 2020  Luis Felipe Mileo - KMEE
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html

import re
from ..misc import modulo11
from . import cnpj_cpf


class ChaveEdoc(object):
    """
             0  2    6             20  22  25        34 35      43  --> índice
             |  |    |              |  |   |         | |        |
        MDFe 50 1312 48740351011795 58 000 149000153 1 16261964 8
             |  |    |              |  |   |         | |        |
        CTe  32 1712 32438772000104 57 001 000199075 1 39868226 3
             |  |    |              |  |   |         | |        |
        NFe  43 1402 01098983010680 65 796 000000599 1 31447746 1 #NFC-e
             |  |    |              |  |   |         | |        |
        CFe  35 1508 08723218000186 59 900 004019000 0 24111425 7
    """
    CHAVE_REGEX = re.compile(r'^CFe|NFe|MDFe(?P<campos>\d{44})$')

    _cuf = None
    _aamm = None
    _cnpj = None
    _modelo = None
    _serie = None
    _numero = None
    _forma = None
    _codigo = None
    _dv = None
    _chave = None
    _campos = ' ' * 44

    CUF = slice(0, 2)
    AAMM = slice(2, 6)
    CNPJ = slice(6, 20)
    MODELO = slice(20, 22)
    SERIE = slice(22, 24)
    NUMERO = slice(24, 33)
    FORMA = slice(33, 34)
    CODIGO = slice(34, 43)
    DV = slice(43, None)

    def __init__(self, chave=False):

        if not chave:
            return

        matcher = ChaveEdoc.CHAVE_REGEX.match(chave)
        if matcher:
            campos = matcher.group('campos')
        else:
            raise ValueError('Chave de acesso invalida: {!r}'.format(chave))

        digito = modulo11(campos[:43])
        if not (digito == int(campos[-1])):
            raise ValueError((
                    'Digito verificador invalido: '
                    'chave={!r}, digito calculado={!r}'
                ).format(chave, digito))

        # if not br.is_codigo_uf(int(campos[ChaveEdoc.CUF])):
        #     raise ValueError((
        #             'Chave de acesso invalida (codigo UF: {!r}): {!r}'
        #         ).format(campos[ChaveEdoc.CUF], chave))

        if campos[ChaveEdoc.MODELO] not in ('55', '57', '58', '65'):
            raise ValueError((
                'Chave de acesso invalida '
                '(Modelos não permitidos: {!r}): {!r}'
                ).format(campos[ChaveEdoc.MODELO], chave))

        if not cnpj_cpf.validar(campos[ChaveEdoc.CNPJ]):
            raise ValueError((
                    'Chave de acesso invalida '
                    '(CNPJ emitente: {!r}): {!r}'
                ).format(campos[ChaveEdoc.CNPJ], chave))

        self._chave = chave
        self._campos = campos

    def __str__(self):
        return self.chaveMOD

    def __repr__(self):
        return '{:s}({!r})'.format(self.__class__.__name__, self._chave)

    @property
    def codigo_uf(self):
        return int(self._campos[ChaveEdoc.CUF])

    @codigo_uf.setter
    def codigo_uf(self, value):
        self._campos[ChaveEdoc.CUF] = value

    # @property
    # def uf(self):
    #     return br.uf_pelo_codigo(self.codigo_uf)

    @property
    def ano_mes(self):
        return self._campos[ChaveEdoc.AAMM]

    @ano_mes.setter
    def ano_mes(self, value):
        self._campos[ChaveEdoc.AAMM] = value

    @property
    def ano_emissao(self):
        return int(self._campos[ChaveEdoc.AAMM][:2]) + 2000

    @property
    def mes_emissao(self):
        return int(self._campos[ChaveEdoc.AAMM][2:])

    @property
    def cnpj_emitente(self):
        return cnpj_cpf.formata(self._campos[ChaveEdoc.CNPJ])

    @cnpj_emitente.setter
    def cnpj_emitente(self, value):
        self._campos[ChaveEdoc.CNPJ] = value

    @property
    def modelo_documento(self):
        return self._campos[ChaveEdoc.MODELO]

    @modelo_documento.setter
    def modelo_documento(self, value):
        self._campos[ChaveEdoc.MODELO] = value

    @property
    def numero_serie(self):
        return self._campos[ChaveEdoc.SERIE]

    @numero_serie.setter
    def numero_serie(self, value):
        self._campos[ChaveEdoc.SERIE] = value

    @property
    def numero_documento(self):
        return self._campos[ChaveEdoc.NUMERO]

    @numero_documento.setter
    def numero_documento(self, value):
        self._campos[ChaveEdoc.NUMERO] = value

    @property
    def forma_emissao(self):
        return self._campos[ChaveEdoc.FORMA]

    @forma_emissao.setter
    def forma_emissao(self, value):
        self._campos[ChaveEdoc.FORMA] = value

    @property
    def codigo_aleatorio(self):
        return self._campos[ChaveEdoc.CODIGO]

    @property
    def digito_verificador(self):
        return self._campos[ChaveEdoc.DV]

    def partes(self, num_partes=11):
        assert 44 % num_partes == 0, (
            'O numero de partes nao produz um resultado inteiro (partes '
            'por 44 digitos): num_partes={!r}'
        ).format(num_partes)

        salto = 44 // num_partes
        return [self._campos[n:(n + salto)] for n in range(0, 44, salto)]

Ainda tem uns detalhes para implementar:

  • Testes;
  • Criar chave a partir de dados e devolver dados a partir da chave.
  • onchange da chave no Odoo
  • formatação da chave com 4 caracteres + espaço;

@mileo mileo force-pushed the fix/generated-key-oca branch 2 times, most recently from f5d5d63 to b880efa Compare April 6, 2021 18:22
@mileo
Copy link
Member Author

mileo commented Apr 6, 2021

Pessoal este PR esta pronto para revisão, teste no runbot.

image

As outras funcionalidades:

  • Onchange chave nf-e para notas de entrada;
  • Formatação da chave com espaços por exemplo: 3515 0808 7232 1800 0186 5990 0004 0190 0005 5725 5950

Vou deixar para um outro PR.

@marcelsavegnago
Copy link
Member

@mileo removendo a geração da chave da NFSe como fica ?

@mileo
Copy link
Member Author

mileo commented Apr 6, 2021

NFSe

NFS-e não tem chave consequentemente não precisa desse método.

Mas se algum provedor precisar pode chamar ele, entretanto pode ser que tenha que sobrescrever ele, pois o método só é capaz de gerar:

NFC-e / NF-E / CT-e / MDF-e e a chave do CT-e é gerada pelo hardware do equipamento.

OBS: Pode ser que outros documentos eletrônicos tenham chave e precisemos refatorar algumas coisas, mas isso é futuro.

@marcelsavegnago
Copy link
Member

marcelsavegnago commented Apr 6, 2021

@mileo testei localmente e a chave da NFe foi gerada corretamente.

Sobre a NFSe, como comentado ela não gera uma chave e isso está impactando na geração do PDF.

data = "20" + chave[2:4] + "-" + chave[4:6]

@mileo mileo dismissed stale reviews from rvalyi and renatonlima April 6, 2021 23:21

Corrigido pode revisar novamente?

@mileo
Copy link
Member Author

mileo commented Apr 6, 2021

Sobre a NFSe, como comentado ela não gera uma chave e isso está impactando na geração do PDF.

Sim, já dou uma olhada nisso, mas não tem relação com este PR.

@OCA-git-bot
Copy link
Contributor

This PR has the approved label and has been created more than 5 days ago. It should therefore be ready to merge by a maintainer (or a PSC member if the concerned addon has no declared maintainer). 🤖

@mileo
Copy link
Member Author

mileo commented Apr 8, 2021

/ocabot merge minor

@OCA-git-bot
Copy link
Contributor

On my way to merge this fine PR!
Prepared branch 12.0-ocabot-merge-pr-1255-by-mileo-bump-minor, awaiting test results.

@OCA-git-bot OCA-git-bot merged commit 2d380a2 into OCA:12.0 Apr 8, 2021
@OCA-git-bot
Copy link
Contributor

Congratulations, your PR was merged at 128bbda. Thanks a lot for contributing to OCA. ❤️

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

Successfully merging this pull request may close these issues.

7 participants