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,16 @@ 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
+
36
+ serie = fields .Char (related = "dfe_ids.serie" )
37
+
26
38
dfe_monitor_id = fields .Many2one (
27
39
comodel_name = "l10n_br_fiscal.dfe_monitor" ,
28
40
string = "Monitor de DFe" ,
@@ -55,3 +67,71 @@ def _compute_color_status(self):
55
67
record .color_status = "blue"
56
68
else :
57
69
record .color_status = "normal"
70
+
71
+ def name_get (self ):
72
+ return [(record .id , record .key ) for record in self ]
73
+
74
+ def action_download_xml (self ):
75
+ complete_dfe_ids = self .dfe_ids .filtered (
76
+ lambda dfe : dfe .dfe_nfe_document_type == "dfe_nfe_complete"
77
+ )
78
+ if complete_dfe_ids :
79
+ return complete_dfe_ids .action_download_xml ()
80
+ raise UserError (
81
+ _ ("It is only possible to download XML when DF-e is completed." )
82
+ )
83
+
84
+ def make_pdf (self ):
85
+ complete_dfe_ids = self .dfe_ids .filtered (
86
+ lambda dfe : dfe .dfe_nfe_document_type == "dfe_nfe_complete"
87
+ )
88
+
89
+ if not complete_dfe_ids :
90
+ raise UserError (_ ("No DF-e with 'DF-e complete' type found." ))
91
+
92
+ complete_dfe = complete_dfe_ids [0 ]
93
+ attachment = complete_dfe .attachment_id
94
+ nfe_xml = base64 .b64decode (attachment .datas )
95
+ danfe = Danfe (xml = nfe_xml )
96
+
97
+ tmpDanfe = BytesIO ()
98
+ danfe .output (tmpDanfe )
99
+ danfe_file = tmpDanfe .getvalue ()
100
+ tmpDanfe .close ()
101
+
102
+ pdf_attachment = self .env ["ir.attachment" ].create (
103
+ {
104
+ "name" : f"DANFE{ complete_dfe .key } .pdf" ,
105
+ "type" : "binary" ,
106
+ "datas" : base64 .b64encode (danfe_file ),
107
+ "res_model" : self ._name ,
108
+ "res_id" : complete_dfe .id ,
109
+ "mimetype" : "application/pdf" ,
110
+ }
111
+ )
112
+
113
+ return {
114
+ "type" : "ir.actions.act_url" ,
115
+ "url" : f"/web/content/{ pdf_attachment .id } ?download=true" ,
116
+ "target" : "self" ,
117
+ }
118
+
119
+ def create_mde_action (self ):
120
+ return {
121
+ "name" : _ ("Manifestação do Destinatário" ),
122
+ "type" : "ir.actions.act_window" ,
123
+ "res_model" : "nfe_recipient_manifestation_event.wizard" ,
124
+ "view_mode" : "form" ,
125
+ "target" : "new" ,
126
+ "context" : {
127
+ "default_dfe_access_key_id" : self .id ,
128
+ },
129
+ }
130
+
131
+ def import_document (self ):
132
+ complete_dfe_ids = self .dfe_ids .filtered (
133
+ lambda dfe : dfe .dfe_nfe_document_type == "dfe_nfe_complete"
134
+ )
135
+ if complete_dfe_ids :
136
+ return complete_dfe_ids .import_document ()
137
+ raise UserError (_ ("You can only import the NF-e when the DF-e is completed." ))
0 commit comments