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