Skip to content

Commit 1a15083

Browse files
trabalho em desenvolvimento
1 parent 2b1f153 commit 1a15083

File tree

8 files changed

+263
-48
lines changed

8 files changed

+263
-48
lines changed

atm_averba_cte/models/atm_averba_event.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ class AtmAverbaEvent(models.Model):
3838
def create_event(self, document, response, cancel=False):
3939
dados_seguro = response.get("Averbado", {}).get("DadosSeguro", [{}])[0]
4040
TpMov = dados_seguro.get("TpMov")
41+
declarado = response.get("Declarado", {})
42+
protocolo = declarado.get("Protocolo")
43+
infos = response.get("Infos", {}).get("Info", [])
44+
if infos:
45+
primeira_info = infos[0]
46+
primeira_info.get("Codigo")
47+
descricao = primeira_info.get("Descricao")
4148
infos = response.get("Infos", {}).get("Info", [])
4249

4350
vals = {
@@ -46,12 +53,26 @@ def create_event(self, document, response, cancel=False):
4653
"date": datetime.now(),
4754
}
4855

49-
if TpMov == "2" and cancel:
56+
if cancel or TpMov == "2":
5057
vals.update(
5158
{
5259
"endorsement_state": "cancel",
53-
"amount": float(dados_seguro.get("ValorAverbado", 0)),
54-
"total_insured": float(dados_seguro.get("ValorAverbado", 0)),
60+
"cte_id": document.authorization_event_id.id,
61+
"document_number": response.get("Numero"),
62+
"protocol_number": response.get("Averbado", {}).get("Protocolo"),
63+
"amount": float(dados_seguro.get("ValorAverbado", 0) or 0),
64+
"total_insured": float(dados_seguro.get("ValorAverbado", 0) or 0),
65+
}
66+
)
67+
elif protocolo == "TESTE" or descricao == "Documento ja cadastrado":
68+
vals.update(
69+
{
70+
"endorsement_state": "endorsed",
71+
"cte_id": document.authorization_event_id.id,
72+
"document_number": response.get("Numero"),
73+
"protocol_number": response.get("Averbado", {}).get("Protocolo"),
74+
"amount": float(dados_seguro.get("ValorAverbado", 0) or 0),
75+
"total_insured": float(dados_seguro.get("ValorAverbado", 0) or 0),
5576
}
5677
)
5778
elif TpMov == "1":

atm_averba_cte/models/document.py

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import base64
55

66
import requests
7+
from lxml import etree
78

89
from odoo import _, api, fields, models
910
from odoo.exceptions import UserError
1011

12+
CTE_NS = "http://www.portalfiscal.inf.br/cte"
13+
NS = {"cte": CTE_NS}
14+
1115

1216
class Document(models.Model):
1317
_inherit = "l10n_br_fiscal.document"
@@ -117,6 +121,45 @@ def cte_endorsement(self):
117121
except requests.RequestException as e:
118122
raise UserError(_("Falha ao enviar XML para AT&M: %s") % str(e))
119123

124+
def build_ret_canc_cte(self, xml_str: str) -> str:
125+
root = etree.fromstring(xml_str.encode("utf-8"))
126+
ret = root.find(".//cte:retEventoCTe", namespaces=NS)
127+
if ret is None:
128+
raise ValueError("retEventoCTe não encontrado no XML.")
129+
130+
inf = ret.find("./cte:infEvento", namespaces=NS)
131+
if inf is None:
132+
inf = ret.find("./cte:retInfEvento", namespaces=NS)
133+
134+
def _txt(tag):
135+
el = inf.find(f"./cte:{tag}", namespaces=NS)
136+
return (el.text or "").strip() if el is not None else ""
137+
138+
tpAmb = _txt("tpAmb") or "2"
139+
cUF = _txt("cOrgao") or "35"
140+
chCTe = _txt("chCTe")
141+
dhRegEvento = _txt("dhRegEvento")
142+
nProt = _txt("nProt")
143+
xMotivo = _txt("xMotivo")
144+
145+
retCanc = etree.Element(f"{{{CTE_NS}}}retCancCTe", nsmap={None: CTE_NS})
146+
retCanc.set("versao", "1.04")
147+
infCanc = etree.SubElement(retCanc, f"{{{CTE_NS}}}infCanc")
148+
etree.SubElement(infCanc, f"{{{CTE_NS}}}tpAmb").text = tpAmb
149+
etree.SubElement(infCanc, f"{{{CTE_NS}}}cUF").text = cUF
150+
etree.SubElement(infCanc, f"{{{CTE_NS}}}verAplic").text = "99"
151+
etree.SubElement(infCanc, f"{{{CTE_NS}}}cStat").text = "101"
152+
etree.SubElement(infCanc, f"{{{CTE_NS}}}xMotivo").text = xMotivo
153+
etree.SubElement(infCanc, f"{{{CTE_NS}}}chCTe").text = chCTe
154+
if dhRegEvento:
155+
etree.SubElement(infCanc, f"{{{CTE_NS}}}dhRecbto").text = dhRegEvento
156+
if nProt:
157+
etree.SubElement(infCanc, f"{{{CTE_NS}}}nProt").text = nProt
158+
159+
return etree.tostring(retCanc, encoding="utf-8", xml_declaration=True).decode(
160+
"utf-8"
161+
)
162+
120163
def cancel_cte_endorsement(self):
121164
for document in self:
122165
if (
@@ -132,16 +175,23 @@ def cancel_cte_endorsement(self):
132175

133176
headers = {
134177
"Authorization": f"Bearer {token}",
178+
"Accept": "application/json",
179+
"Content-Type": "application/xml",
135180
}
136181

137-
cancel_url = env_data["url"] + "/cancelamento"
182+
xml_content = base64.b64decode(cancel_file.datas).decode(
183+
"utf-8"
184+
)
185+
xml_content = self.build_ret_canc_cte(xml_content)
186+
cancel_url = env_data["url"].rstrip("/")
138187

139188
response = requests.post(
140189
url=cancel_url,
141190
headers=headers,
142-
data={"xml": cancel_file.datas},
191+
data=xml_content,
192+
timeout=20,
143193
)
144-
194+
response.raise_for_status()
145195
content = response.json()
146196
self.env["atm.averba.event"].create_event(
147197
document, content, cancel=True

atm_averba_mdfe/i18n/atm_averba_mdfe.pot

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ msgstr ""
1818
#. module: atm_averba_mdfe
1919
#: model:ir.model,name:atm_averba_mdfe.model_atm_averba_event
2020
msgid "AT&M Averba Event"
21-
msgstr ""
21+
msgstr "Evento de Averbação AT&M"
2222

2323
#. module: atm_averba_mdfe
2424
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
2525
msgid "ATM Averba MDF-e"
26-
msgstr ""
26+
msgstr "Averbação MDF-e AT&M"
2727

2828
#. module: atm_averba_mdfe
2929
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
@@ -33,28 +33,28 @@ msgstr ""
3333
#. module: atm_averba_mdfe
3434
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_cancel_action
3535
msgid "Cancel MDF-e (ATM)"
36-
msgstr ""
36+
msgstr "Cancelar MDF-e (AT&M)"
3737

3838
#. module: atm_averba_mdfe
3939
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_close_action
4040
msgid "Close MDF-e (ATM)"
41-
msgstr ""
41+
msgstr "Encerrar MDF-e (AT&M)"
4242

4343
#. module: atm_averba_mdfe
4444
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
4545
msgid "Date Send"
46-
msgstr ""
46+
msgstr "Data de Envio"
4747

4848
#. module: atm_averba_mdfe
4949
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_declare_action
5050
msgid "Declare MDF-e (ATM)"
51-
msgstr ""
51+
msgstr "Declarar MDF-e (AT&M)"
5252

5353
#. module: atm_averba_mdfe
5454
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_atm_averba_event__display_name
5555
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_l10n_br_fiscal_document__display_name
5656
msgid "Display Name"
57-
msgstr ""
57+
msgstr "Nome de Exibição"
5858

5959
#. module: atm_averba_mdfe
6060
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
@@ -89,7 +89,7 @@ msgstr ""
8989
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_atm_averba_event____last_update
9090
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_l10n_br_fiscal_document____last_update
9191
msgid "Last Modified on"
92-
msgstr ""
92+
msgstr "Última Modificação em"
9393

9494
#. module: atm_averba_mdfe
9595
#: code:addons/atm_averba_mdfe/models/document.py:0

atm_averba_mdfe/i18n/pt_BR.po

Lines changed: 87 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,72 +6,106 @@ msgid ""
66
msgstr ""
77
"Project-Id-Version: Odoo Server 14.0\n"
88
"Report-Msgid-Bugs-To: \n"
9-
"POT-Creation-Date: 2025-08-27 14:24+0000\n"
10-
"PO-Revision-Date: 2025-08-27 14:24+0000\n"
9+
"POT-Creation-Date: 2025-10-13 12:44+0000\n"
10+
"PO-Revision-Date: 2025-10-13 12:44+0000\n"
1111
"Last-Translator: \n"
1212
"Language-Team: \n"
1313
"MIME-Version: 1.0\n"
1414
"Content-Type: text/plain; charset=UTF-8\n"
1515
"Content-Transfer-Encoding: \n"
1616
"Plural-Forms: \n"
1717

18+
#. module: atm_averba_mdfe
19+
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_l10n_br_fiscal_document__atm_averba_endorsement_state
20+
msgid "AT&M Averba Endorsement State"
21+
msgstr "Status de Averbação AT&M"
22+
1823
#. module: atm_averba_mdfe
1924
#: model:ir.model,name:atm_averba_mdfe.model_atm_averba_event
2025
msgid "AT&M Averba Event"
21-
msgstr ""
26+
msgstr "Evento de Averbação AT&M"
2227

2328
#. module: atm_averba_mdfe
2429
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
2530
msgid "ATM Averba MDF-e"
26-
msgstr ""
31+
msgstr "Averbação MDF-e (AT&M)"
2732

2833
#. module: atm_averba_mdfe
2934
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
30-
msgid "ATM Endorsement"
35+
msgid "ATM MDF-e"
3136
msgstr ""
3237

3338
#. module: atm_averba_mdfe
3439
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_cancel_action
3540
msgid "Cancel MDF-e (ATM)"
36-
msgstr ""
41+
msgstr "Cancelar MDF-e (AT&M)"
3742

3843
#. module: atm_averba_mdfe
3944
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_close_action
4045
msgid "Close MDF-e (ATM)"
41-
msgstr ""
46+
msgstr "Encerrar MDF-e (AT&M)"
4247

4348
#. module: atm_averba_mdfe
4449
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
4550
msgid "Date Send"
46-
msgstr ""
47-
48-
#. module: atm_averba_mdfe
49-
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_declare_action
50-
msgid "Declare MDF-e (ATM)"
51-
msgstr ""
51+
msgstr "Data de Envio"
5252

5353
#. module: atm_averba_mdfe
5454
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_atm_averba_event__display_name
5555
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_l10n_br_fiscal_document__display_name
5656
msgid "Display Name"
5757
msgstr "Nome Exibido"
5858

59+
#. module: atm_averba_mdfe
60+
#: model:ir.model.fields.selection,name:atm_averba_mdfe.selection__atm_averba_event__endorsement_state__encerrado
61+
#: model:ir.model.fields.selection,name:atm_averba_mdfe.selection__l10n_br_fiscal_document__atm_averba_endorsement_state__encerrado
62+
msgid "Encerrado"
63+
msgstr ""
64+
5965
#. module: atm_averba_mdfe
6066
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
6167
msgid "Endorsed"
68+
msgstr "Averbado"
69+
70+
#. module: atm_averba_mdfe
71+
#: model:ir.actions.server,name:atm_averba_mdfe.atm_mdfe_endorsement_action
72+
msgid "Endorsement MDF-e (ATM)"
6273
msgstr ""
6374

6475
#. module: atm_averba_mdfe
76+
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_atm_averba_event__endorsement_message
77+
msgid "Endorsement Message"
78+
msgstr "Averbar MDF-e (AT&M)"
79+
80+
#. module: atm_averba_mdfe
81+
#: model:ir.model.fields,field_description:atm_averba_mdfe.field_atm_averba_event__endorsement_state
6582
#: model_terms:ir.ui.view,arch_db:atm_averba_mdfe.document_form_atm_averba
6683
msgid "Endorsement State"
84+
msgstr "Status de Averbação"
85+
86+
#. module: atm_averba_mdfe
87+
#: code:addons/atm_averba_mdfe/models/document.py:0
88+
#, python-format
89+
msgid "Erro AT&M (%s)."
6790
msgstr ""
6891

6992
#. module: atm_averba_mdfe
7093
#: code:addons/atm_averba_mdfe/models/document.py:0
7194
#, python-format
72-
msgid ""
73-
"Falha ao enviar XML para AT&M: %s\n"
74-
"%s"
95+
msgid "Erro AT&M (%s): %s"
96+
msgstr ""
97+
98+
#. module: atm_averba_mdfe
99+
#: code:addons/atm_averba_mdfe/models/document.py:0
100+
#, python-format
101+
msgid "Falha HTTP ao enviar XML para AT&M: %s"
102+
msgstr ""
103+
104+
#. module: atm_averba_mdfe
105+
#: code:addons/atm_averba_mdfe/models/document.py:0
106+
#: code:addons/atm_averba_mdfe/models/document.py:0
107+
#, python-format
108+
msgid "Falha ao enviar XML para AT&M: %s"
75109
msgstr ""
76110

77111
#. module: atm_averba_mdfe
@@ -91,20 +125,54 @@ msgstr ""
91125
msgid "Last Modified on"
92126
msgstr "Última Modificação em"
93127

128+
#. module: atm_averba_mdfe
129+
#: code:addons/atm_averba_mdfe/models/document.py:0
130+
#: code:addons/atm_averba_mdfe/models/document.py:0
131+
#: code:addons/atm_averba_mdfe/models/document.py:0
132+
#, python-format
133+
msgid "Não encontrei evento para este documento."
134+
msgstr ""
135+
136+
#. module: atm_averba_mdfe
137+
#: code:addons/atm_averba_mdfe/models/document.py:0
138+
#, python-format
139+
msgid "Não encontrei o XML assinado do evento (file_request_id)."
140+
msgstr ""
141+
142+
#. module: atm_averba_mdfe
143+
#: code:addons/atm_averba_mdfe/models/document.py:0
144+
#, python-format
145+
msgid "Não encontrei o evento de cancelamento."
146+
msgstr ""
147+
148+
#. module: atm_averba_mdfe
149+
#: code:addons/atm_averba_mdfe/models/document.py:0
150+
#, python-format
151+
msgid "Não encontrei o retorno do evento (file_response_id)."
152+
msgstr ""
153+
154+
#. module: atm_averba_mdfe
155+
#: code:addons/atm_averba_mdfe/models/document.py:0
156+
#: code:addons/atm_averba_mdfe/models/document.py:0
157+
#, python-format
158+
msgid ""
159+
"O MDF-e %s já foi averbado (estado: %s). Não é possível enviar novamente."
160+
msgstr ""
161+
94162
#. module: atm_averba_mdfe
95163
#: code:addons/atm_averba_mdfe/models/document.py:0
96164
#, python-format
97-
msgid "MDF-e sem XML protocolado para enviar à AT&M."
165+
msgid "Resposta inesperada da AT&M (sem JSON)."
98166
msgstr ""
99167

100168
#. module: atm_averba_mdfe
101169
#: code:addons/atm_averba_mdfe/models/document.py:0
102170
#, python-format
103-
msgid "XML de cancelamento do MDF-e não encontrado."
171+
msgid "Retorno (SOAP) do evento está vazio."
104172
msgstr ""
105173

106174
#. module: atm_averba_mdfe
107175
#: code:addons/atm_averba_mdfe/models/document.py:0
108176
#, python-format
109-
msgid "XML de encerramento do MDF-e não encontrado."
177+
msgid "XML assinado do evento está vazio."
110178
msgstr ""

atm_averba_mdfe/models/atm_averba_event.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ class AtmAverbaEvent(models.Model):
1010

1111
endorsement_message = fields.Text()
1212

13+
endorsement_state = fields.Selection(
14+
selection_add=[
15+
("encerrado", "Encerrado"),
16+
],
17+
)
18+
1319
def create_event_mdfe( # noqa: C901
1420
self, document, response, *, cancel=False, close=False
1521
):
@@ -66,7 +72,7 @@ def create_event_mdfe( # noqa: C901
6672
if declarado_list:
6773
vals.update(
6874
{
69-
"endorsement_state": "cancel" if cancel else "endorsed",
75+
"endorsement_state": "cancel" if cancel else "encerrado",
7076
"endorsement_message": infos_list[0].get("Descricao", "")
7177
if infos_list
7278
else "",

0 commit comments

Comments
 (0)