diff --git a/l10n_br_cte/models/__init__.py b/l10n_br_cte/models/__init__.py index 10114c0129e2..df5d3abbb98e 100644 --- a/l10n_br_cte/models/__init__.py +++ b/l10n_br_cte/models/__init__.py @@ -9,4 +9,3 @@ from . import aereo from . import dutoviario from . import aquaviario -from . import rodo_occ diff --git a/l10n_br_cte/models/aereo.py b/l10n_br_cte/models/aereo.py index 8a73a84887ef..628a2c353068 100644 --- a/l10n_br_cte/models/aereo.py +++ b/l10n_br_cte/models/aereo.py @@ -1,19 +1,17 @@ # Copyright 2023 KMEE INFORMATICA LTDA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields +from nfelib.cte.bindings.v4_0.cte_modal_aquaviario_v4_00 import Aquav + +from odoo import api, fields from odoo.addons.spec_driven_model.models import spec_models class Aereo(spec_models.SpecModel): - _name = "l10n_br_cte.aereo" + _name = "l10n_br_cte.modal.aereo" _inherit = "cte.40.aereo" - document_id = fields.One2many( - comodel_name="l10n_br_fiscal.document", inverse_name="cte40_aereo" - ) - cte40_dPrevAereo = fields.Date( string="Data prevista da entrega", help="Data prevista da entrega\nFormato AAAA-MM-DD", @@ -24,23 +22,15 @@ class Aereo(spec_models.SpecModel): related="document_id.fiscal_line_ids", ) - cte40_tarifa = fields.Many2one(comodel_name="l10n_br_cte.tarifa") - - def export_data(self): - return { - "cte40_dPrevAereo": self.cte40_dPrevAereo, - "cte40_natCarga": {"cte40_xDime": self.cte40_natCarga.xDime}, - "cte40_tarifa": { - "cte40_CL": self.cte40_tarifa.cte40_CL, - "cte40_vTar": self.cte40_tarifa.cte40_vTar, - }, - } + cte40_tarifa = fields.Many2one(comodel_name="l10n_br_cte.modal.aereo.tarifa") class Tarifa(spec_models.SpecModel): - _name = "l10n_br_cte.tarifa" + _name = "l10n_br_cte.modal.aereo.tarifa" _inherit = "cte.40.tarifa" + document_id = fields.Many2one(comodel_name="l10n_br_fiscal.document") + cte40_CL = fields.Selection( string="Classe", selection=[ @@ -53,3 +43,14 @@ class Tarifa(spec_models.SpecModel): ) cte40_vTar = fields.Monetary(currency_field="brl_currency_id") + + @api.model + def export_fields(self): + if len(self) > 1: + return self.export_fields_multi() + + return Aquav.Tarifa(CL=self.cte40_CL, vTar=self.cte40_vTar) + + @api.model + def export_fields_multi(self): + return [record.export_fields() for record in self] diff --git a/l10n_br_cte/models/aquaviario.py b/l10n_br_cte/models/aquaviario.py index e3e654ab7ba2..f6d29620c19b 100644 --- a/l10n_br_cte/models/aquaviario.py +++ b/l10n_br_cte/models/aquaviario.py @@ -7,7 +7,7 @@ class Aquaviario(spec_models.SpecModel): - _name = "l10n_br_cte.aquaviario" + _name = "l10n_br_cte.modal.aquaviario" _inherit = "cte.40.aquav" document_id = fields.One2many( @@ -61,14 +61,3 @@ class Aquaviario(spec_models.SpecModel): def _compute_vPrest(self): for record in self.document_id.fiscal_line_ids: record.cte40_vPrest += record.cte40_vTPrest - - def export_data(self): - return { - "cte40_vPrest": self.cte40_vPrest, - "cte40_vAFRMM": self.cte40_vAFRMM, - "cte40_xNavio": self.cte40_xNavio, - "cte40_nViag": self.cte40_nViag, - "cte40_direc": self.cte40_direc, - "cte40_irin": self.cte40_irin, - "cte40_tpNav": self.cte40_tpNav, - } diff --git a/l10n_br_cte/models/document.py b/l10n_br_cte/models/document.py index 94cf2a089d65..e135dd360736 100644 --- a/l10n_br_cte/models/document.py +++ b/l10n_br_cte/models/document.py @@ -468,13 +468,153 @@ def _default_cte40_autxml(self): cte40_autXML = fields.One2many(default=_default_cte40_autxml) ########################## - # CT-e tag: modal + # CT-e tag: infmodal ########################## cte40_modal = fields.Selection(related="transport_modal") cte40_infModal = fields.Many2one(compute="_compute_modal") + # Campos do Modal Aereo + cte40_dPrevAereo = fields.Date( + string="Data prevista da entrega", + help="Data prevista da entrega\nFormato AAAA-MM-DD", + store="True", + ) + + cte40_natCarga = fields.One2many( + related="document_id.fiscal_line_ids", + ) + + cte40_tarifa = fields.Many2one(comodel_name="l10n_br_cte.tarifa") + + # Campos do Modal Aquaviario + cte40_vPrest = fields.Monetary(compute="_compute_vPrest", store=True) + + cte40_vAFRMM = fields.Monetary( + string="AFRMM", + currency_field="brl_currency_id", + help=("AFRMM (Adicional de Frete para Renovação da Marinha Mercante)"), + store=True, + ) + + cte40_xNavio = fields.Char(string="Identificação do Navio", store=True) + + cte40_nViag = fields.Char(string="Número da Viagem", store=True) + + cte40_direc = fields.Selection( + selection=[ + ("N", "Norte, L-Leste, S-Sul, O-Oeste"), + ("S", "Sul, O-Oeste"), + ("L", "Leste, S-Sul, O-Oeste"), + ("O", "Oeste"), + ], + string="Direção", + store=True, + help="Direção\nPreencher com: N-Norte, L-Leste, S-Sul, O-Oeste", + ) + + cte40_irin = fields.Char( + string="Irin do navio sempre deverá", + help="Irin do navio sempre deverá ser informado", + store=True, + ) + + cte40_tpNav = fields.Selection( + selection=[ + ("0", "Interior"), + ("1", "Cabotagem"), + ], + string="Tipo de Navegação", + help=( + "Tipo de Navegação\nPreencher com: \n\t\t\t\t\t\t0 - " + "Interior;\n\t\t\t\t\t\t1 - Cabotagem" + ), + store=True, + ) + + def _compute_vPrest(self): + for record in self.document_id.fiscal_line_ids: + record.cte40_vPrest += record.cte40_vTPrest + + # Campos do Modal Dutoviario + cte40_dIni = fields.Date(string="Data de Início da prestação do serviço") + + cte40_dFim = fields.Date(string="Data de Fim da prestação do serviço") + + cte40_vTar = fields.Float(string="Valor da tarifa") + + # Campos do Modal Ferroviario + cte40_tpTraf = fields.Selection( + selection=[ + ("0", "Próprio"), + ("1", "Mútuo"), + ("2", "Rodoferroviário"), + ("3", "Rodoviário."), + ], + default="0", + ) + + cte40_fluxo = fields.Char( + string="Fluxo Ferroviário", + help=( + "Fluxo Ferroviário\nTrata-se de um número identificador do " + "contrato firmado com o cliente" + ), + ) + + # TRAFMUT + cte40_trafMut = fields.Many2one( + comodel_name="l10n_br_fiscal.document", + string="Detalhamento de informações", + help="Detalhamento de informações para o tráfego mútuo", + ) + + cte40_vFrete = fields.Monetary( + related="cte40_trafMut.amount_freight_value", + currency_field="brl_currency_id", + ) + + cte40_respFat = fields.Selection( + selection=[ + ("1", "Ferrovia de origem"), + ("2", "Ferrovia de destino"), + ] + ) + + cte40_ferrEmi = fields.Selection( + selection=[ + ("1", "Ferrovia de origem"), + ("2", "Ferrovia de destino"), + ], + string="Ferrovia Emitente do CTe", + help=( + "Ferrovia Emitente do CTe\nPreencher com: " + "\n\t\t\t\t\t\t\t\t\t1-Ferrovia de origem; " + "\n\t\t\t\t\t\t\t\t\t2-Ferrovia de destino" + ), + ) + + cte40_ferroEnv = fields.One2many( + comodel_name="l10n_br_cte.ferroenv", + inverse_name="cte40_cInt", + string="Informações das Ferrovias Envolvidas", + ) + + # Campos do Modal rodoviario + cte40_RNTRC = fields.Char( + string="RNTRC", + store=True, + related="document_id.cte40_emit.partner_id.rntrc_code", + help="Registro Nacional de Transportadores Rodoviários de Carga", + ) + + cte40_occ = fields.One2many( + comodel_name="l10n_br_cte.occ", + inverse_name="cte40_occ_rodo_id", + string="Ordens de Coleta associados", + ) + ########################## # CT-e tag: modal # Compute Methods diff --git a/l10n_br_cte/models/dutoviario.py b/l10n_br_cte/models/dutoviario.py index af93cd801ed8..91d458fb4d4e 100644 --- a/l10n_br_cte/models/dutoviario.py +++ b/l10n_br_cte/models/dutoviario.py @@ -7,22 +7,11 @@ class Dutoviario(spec_models.SpecModel): - _name = "l10n_br_cte.dutoviario" - _inherit = ["cte.40.duto"] - - document_id = fields.One2many( - comodel_name="l10n_br_fiscal.document", inverse_name="cte40_dutoviario" - ) + _name = "l10n_br_cte.modal.dutoviario" + _inherit = "cte.40.duto" cte40_dIni = fields.Date(string="Data de Início da prestação do serviço") cte40_dFim = fields.Date(string="Data de Fim da prestação do serviço") cte40_vTar = fields.Float(string="Valor da tarifa") - - def export_data(self): - return { - "cte40_dIni": self.cte40_dIni, - "cte40_dFim": self.cte40_dFim, - "cte40_vTar": self.cte40_vTar, - } diff --git a/l10n_br_cte/models/ferroviario.py b/l10n_br_cte/models/ferroviario.py index 40415d94127d..117fc61c01a1 100644 --- a/l10n_br_cte/models/ferroviario.py +++ b/l10n_br_cte/models/ferroviario.py @@ -1,19 +1,17 @@ # Copyright 2023 KMEE INFORMATICA LTDA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields +from nfelib.cte.bindings.v4_0.cte_modal_ferroviario_v4_00 import Ferrov, TenderFer + +from odoo import api, fields from odoo.addons.spec_driven_model.models import spec_models class Ferroviario(spec_models.SpecModel): - _name = "l10n_br_cte.ferroviario" + _name = "l10n_br_cte.modal.ferroviario" _inherit = "cte.40.ferrov" - document_id = fields.One2many( - comodel_name="l10n_br_fiscal.document", inverse_name="cte40_ferroviario" - ) - cte40_tpTraf = fields.Selection( selection=[ ("0", "Próprio"), @@ -32,13 +30,16 @@ class Ferroviario(spec_models.SpecModel): ), ) - # TRAFMUT cte40_trafMut = fields.Many2one( - comodel_name="l10n_br_fiscal.document", + comodel_name="cte.40.modal.trafmut", string="Detalhamento de informações", help="Detalhamento de informações para o tráfego mútuo", ) + +class TrafMut(spec_models.SpecModel): + _name = "l10n_br_cte.modal.ferroviario.trafmut" + cte40_vFrete = fields.Monetary( related="cte40_trafMut.amount_freight_value", currency_field="brl_currency_id", @@ -65,51 +66,99 @@ class Ferroviario(spec_models.SpecModel): ) cte40_ferroEnv = fields.One2many( - comodel_name="l10n_br_cte.ferroenv", - inverse_name="cte40_cInt", + comodel_name="l10n_br_cte.modal.ferroviario.trafmut.ferroenv", + inverse_name="document_id", string="Informações das Ferrovias Envolvidas", ) - def export_data(self): - return { - "cte40_tpTraf": self.cte40_tpTraf, - "cte40_fluxo": self.cte40_fluxo, - "cte40_vFrete": self.cte40_vFrete, - "cte40_respFat": self.cte40_respFat, - "cte40_ferrEmi": self.cte40_ferrEmi, - "cte40_ferroEnv": self.cte40_ferroEnv, - } - class FerroEnv(spec_models.SpecModel): - _name = "l10n_br_cte.ferroenv" + _name = "l10n_br_cte.modal.ferroviario.trafmut.ferroenv" _inherit = "cte.40.ferroenv" + document_id = fields.Many2one(comodel_name="l10n_br_fiscal.document") + partner_id = fields.Many2one( comodel_name="res.partner", string="Ferrovias Envolvidas", ) cte40_cInt = fields.Char( - related="cInt", string="Código interno da Ferrovia envolvida", help="Código interno da Ferrovia envolvida\nUso da transportadora", ) - cInt = fields.Char() - - def export_data(self): - return { - "cte40_cInt": self.cte40_cInt, - "cte40_CNPJ": self.partner_id.cte40_CNPJ, - "cte40_IE": self.partner_id.cte40_IE, - "cte40_xNome": self.partner_id.cte40_xNome, - "cte40_nro": self.partner_id.cte40_nro, - "cte40_xLgr": self.partner_id.cte40_xLgr, - "cte40_xCPL": self.partner_id.cte40_xCPL, - "cte40_xBairro": self.partner_id.cte40_xBairro, - "cte40_cMun": self.partner_id.cte40_cMun, - "cte40_xMun": self.partner_id.cte40_xMun, - "cte40_CEP": self.partner_id.cte40_CEP, - "cte40_UF": self.partner_id.cte40_UF, - } + cte40_enderFerro = fields.Many2one( + comodel_name="cte.40.modal.tenderfer", + string="Detalhamento de informações", + help="Detalhamento de informações para o tráfego mútuo", + ) + + @api.model + def export_fields(self): + if len(self) > 1: + return self.export_fields_multi() + + return Ferrov.TrafMut.FerroEnv( + CNPJ=self.partner_id.cte40_CNPJ, + IE=self.partner_id.cte40_IE, + xNome=self.partner_id.cte40_xNome, + cInt=self.cte40_cInt, + ) + + @api.model + def export_fields_multi(self): + return [record.export_fields() for record in self] + + +class TenderFerrov(spec_models.SpecModel): + _name = "l10n_br_cte.modal.tenderfer" + _inherit = "spec.mixin.cte" + + cte40_xLgr = fields.Char(string="Logradouro") + + cte40_nro = fields.Char(string="Número") + + cte40_xCpl = fields.Char(string="Complemento") + + cte40_xBairro = fields.Char(string="Bairro") + + cte40_cMun = fields.Char( + string="Código do município", + help=( + "Código do município\nUtilizar a tabela do " + "IBGE\n\t\t\t\t\tInformar 9999999 para operações com o exterior." + ), + ) + + cte40_xMun = fields.Char( + string="Nome do município", + help=("Nome do município\nInformar EXTERIOR para operações com o " "exterior."), + ) + + cte40_CEP = fields.Char(string="CEP") + + cte40_UF = fields.Char( + string="Sigla da UF", + help="Sigla da UF\nInformar EX para operações com o exterior.", + ) + + @api.model + def export_fields(self): + if len(self) > 1: + return self.export_fields_multi() + + return TenderFer( + xLgr=self.cte40_xLgr, + xBairro=self.cte40_xBairro, + xMun=self.cte40_xMun, + cMun=self.cte40_cMun, + CEP=self.cte40_CEP, + UF=self.cte40_UF, + nro=self.cte40_nro, + xCpl=self.cte40_xCpl, + ) + + @api.model + def export_fields_multi(self): + return [record.export_fields() for record in self] diff --git a/l10n_br_cte/models/rodo_occ.py b/l10n_br_cte/models/rodo_occ.py deleted file mode 100644 index b08ddda8ac60..000000000000 --- a/l10n_br_cte/models/rodo_occ.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2023 KMEE INFORMATICA LTDA -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -from odoo import fields - -from odoo.addons.spec_driven_model.models import spec_models - - -class Occ(spec_models.SpecModel): - _name = "l10n_br_cte.occ" - _inherit = ["cte.40.occ"] - - cte40_occ_rodo_id = fields.Many2one( - comodel_name="l10n_br_fiscal.rodo", ondelete="cascade" - ) - - cte40_serie = fields.Char(string="Série da OCC") - - cte40_nOcc = fields.Char(string="Número da Ordem de coleta") - - cte40_dEmi = fields.Date( - string="Data de emissão da ordem de coleta", - help="Data de emissão da ordem de coleta\nFormato AAAA-MM-DD", - ) - - cte40_emiOcc = fields.Many2one(comodel_name="res.partner", string="emiOcc") - - def export_data(self): - return { - "cte40_serie": self.cte40_serie, - "cte40_nOcc": self.cte40_nOcc, - "cte40_dEmi": self.cte40_dEmi, - "cte40_emiOcc": { - "cte40_CNPJ": self.cte40_emiOcc.cte40_serie, - "cte40_IE": self.cte40_emiOcc.cte40_IE, - "cte40_UF": self.cte40_emiOcc.cte40_UF, - }, - } diff --git a/l10n_br_cte/models/rodoviario.py b/l10n_br_cte/models/rodoviario.py index 5819dc460ba0..5a6f4b742863 100644 --- a/l10n_br_cte/models/rodoviario.py +++ b/l10n_br_cte/models/rodoviario.py @@ -1,14 +1,16 @@ # Copyright 2023 KMEE INFORMATICA LTDA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields +from nfelib.cte.bindings.v4_0.cte_modal_rodoviario_v4_00 import Rodo + +from odoo import api, fields from odoo.addons.spec_driven_model.models import spec_models class Rodoviario(spec_models.SpecModel): - _name = "l10n_br_cte.rodoviario" - _inherit = ["cte.40.rodo"] + _name = "l10n_br_cte.modal.rodoviario" + _inherit = "cte.40.rodo" document_id = fields.One2many( comodel_name="l10n_br_fiscal.document", inverse_name="cte40_rodoviario" @@ -22,13 +24,73 @@ class Rodoviario(spec_models.SpecModel): ) cte40_occ = fields.One2many( - comodel_name="l10n_br_cte.occ", - inverse_name="cte40_occ_rodo_id", + comodel_name="l10n_br_cte.modal.rodoviario.occ", + inverse_name="document_id", string="Ordens de Coleta associados", ) - def export_data(self): - return { - "cte40_RNTRC": self.cte40_RNTRC, - "cte40_occ": self.cte40_occ, - } + +class Occ(spec_models.SpecModel): + _name = "l10n_br_cte.modal.rodoviario.occ" + _inherit = "cte.40.occ" + + document_id = fields.Many2one(comodel_name="l10n_br_fiscal.document") + + cte40_serie = fields.Char(string="Série da OCC") + + cte40_nOcc = fields.Char(string="Número da Ordem de coleta") + + cte40_dEmi = fields.Date( + string="Data de emissão da ordem de coleta", + help="Data de emissão da ordem de coleta\nFormato AAAA-MM-DD", + ) + + cte40_emiOcc = fields.Many2one(comodel_name="res.partner", string="emiOcc") + + @api.model + def export_fields(self): + if len(self) > 1: + return self.export_fields_multi() + + return Rodo.Occ( + serie=self.cte40_serie, + nOcc=self.cte40_nOcc, + dEmi=self.cte40_dEmi, + emiOcc=self.cte40_emiOcc, + ) + + @api.model + def export_fields_multi(self): + return [record.export_fields() for record in self] + + +class EmiOcc(spec_models.SpecModel): + _name = "l10n_br_cte.modal.rodoviario.occ.emiocc" + _inherit = "cte.40.emiocc" + + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Ferrovias Envolvidas", + ) + + cte40_cInt = fields.Char( + string="Código interno da Ferrovia envolvida", + help="Código interno da Ferrovia envolvida\nUso da transportadora", + ) + + @api.model + def export_fields(self): + if len(self) > 1: + return self.export_fields_multi() + + return Rodo.Occ.EmiOcc( + CNPJ=self.partner_id.cte40_CNPJ, + IE=self.partner_id.cte40_IE, + xNome=self.partner_id.cte40_xNome, + cInt=self.cte40_cInt, + UF=self.partner_id.cte40_UF, + ) + + @api.model + def export_fields_multi(self): + return [record.export_fields() for record in self]