1
1
# Copyright (C) 2025-Today - Engenere (<https://engenere.one>).
2
2
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3
- from odoo import api , fields , models
3
+ import base64
4
+ from io import BytesIO
5
+
6
+ from brazilfiscalreport .danfe import Danfe
7
+
8
+ from odoo import _ , api , fields , models
9
+ from odoo .exceptions import UserError
4
10
5
11
6
12
class AccessKey (models .Model ):
@@ -19,10 +25,14 @@ class AccessKey(models.Model):
19
25
20
26
cnpj_cpf = fields .Char (related = "dfe_ids.cnpj_cpf" )
21
27
22
- document_value = fields .Float (
23
- string = "Document Total Value" , digits = (18 , 2 ), related = "dfe_ids.document_value "
28
+ document_amount = fields .Float (
29
+ string = "Document Total Value" , digits = (18 , 2 ), related = "dfe_ids.document_amount "
24
30
)
25
31
32
+ document_state = fields .Selection (related = "dfe_ids.document_state" )
33
+
34
+ document_number = fields .Float (related = "dfe_ids.document_number" )
35
+
26
36
dfe_monitor_id = fields .Many2one (
27
37
comodel_name = "l10n_br_fiscal.dfe_monitor" ,
28
38
string = "Monitor de DFe" ,
@@ -55,3 +65,71 @@ def _compute_color_status(self):
55
65
record .color_status = "blue"
56
66
else :
57
67
record .color_status = "normal"
68
+
69
+ def name_get (self ):
70
+ return [(record .id , record .key ) for record in self ]
71
+
72
+ def action_download_xml (self ):
73
+ complete_dfe_ids = self .dfe_ids .filtered (
74
+ lambda dfe : dfe .dfe_nfe_document_type == "dfe_nfe_complete"
75
+ )
76
+ if complete_dfe_ids :
77
+ return complete_dfe_ids .action_download_xml ()
78
+ raise UserError (
79
+ _ ("It is only possible to download XML when DF-e is completed." )
80
+ )
81
+
82
+ def make_pdf (self ):
83
+ complete_dfe_ids = self .dfe_ids .filtered (
84
+ lambda dfe : dfe .dfe_nfe_document_type == "dfe_nfe_complete"
85
+ )
86
+
87
+ if not complete_dfe_ids :
88
+ raise UserError (_ ("No DF-e with 'DF-e complete' type found." ))
89
+
90
+ complete_dfe = complete_dfe_ids [0 ]
91
+ attachment = complete_dfe .attachment_id
92
+ nfe_xml = base64 .b64decode (attachment .datas )
93
+ danfe = Danfe (xml = nfe_xml )
94
+
95
+ tmpDanfe = BytesIO ()
96
+ danfe .output (tmpDanfe )
97
+ danfe_file = tmpDanfe .getvalue ()
98
+ tmpDanfe .close ()
99
+
100
+ pdf_attachment = self .env ["ir.attachment" ].create (
101
+ {
102
+ "name" : f"DANFE{ complete_dfe .key } .pdf" ,
103
+ "type" : "binary" ,
104
+ "datas" : base64 .b64encode (danfe_file ),
105
+ "res_model" : self ._name ,
106
+ "res_id" : complete_dfe .id ,
107
+ "mimetype" : "application/pdf" ,
108
+ }
109
+ )
110
+
111
+ return {
112
+ "type" : "ir.actions.act_url" ,
113
+ "url" : f"/web/content/{ pdf_attachment .id } ?download=true" ,
114
+ "target" : "self" ,
115
+ }
116
+
117
+ def create_mde_action (self ):
118
+ return {
119
+ "name" : _ ("Manifestação do Destinatário" ),
120
+ "type" : "ir.actions.act_window" ,
121
+ "res_model" : "nfe_recipient_manifestation_event.wizard" ,
122
+ "view_mode" : "form" ,
123
+ "target" : "new" ,
124
+ "context" : {
125
+ "default_dfe_access_key_id" : self .id ,
126
+ },
127
+ }
128
+
129
+ def import_document (self ):
130
+ complete_dfe_ids = self .dfe_ids .filtered (
131
+ lambda dfe : dfe .dfe_nfe_document_type == "dfe_nfe_complete"
132
+ )
133
+ if complete_dfe_ids :
134
+ return complete_dfe_ids .import_document ()
135
+ raise UserError (_ ("You can only import the NF-e when the DF-e is completed." ))
0 commit comments