-
Notifications
You must be signed in to change notification settings - Fork 0
/
request_sefaz.py
121 lines (102 loc) · 5.07 KB
/
request_sefaz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from bs4 import BeautifulSoup as bs # type: ignore
from xml_file import NFe
from csv import writer
cnpjs = [35795771000105]
class Api:
def __init__(self, html_content, file_xml) -> None:
self.html = bs(html_content.text, 'html.parser')
self.file_xml = file_xml
self.loc_class()
self.xml_search(self.file_xml)
def find_all_tag_html(self, html_parser, tag):
return [valor for valor in html_parser.find_all(tag)]
def style_check(self, item):
style = ('font-size:8.0pt;font-family:"Verdana","sans-serif";\r\n' +
' color:black')
style_no_black = ('font-size:8.0pt;font-family:"Verdana","sans-serif"')
if item.find('span') is not None and style == item.find(
'span')['style'] and item['width'] == '74' and item.find(
'span').text != '\xa0':
return True
elif item.find('span') is not None and style_no_black == item.find(
'span')['style'] and item['width'] == '74' and item.find(
'span').text != '\xa0':
return True
else:
return False
def loc_class(self):
dados = []
for index, tag_tr in enumerate(self.find_all_tag_html(self.html, 'tr')):
linha = {'CEST': [], 'NCM': []}
for item in self.find_all_tag_html(tag_tr, 'td'):
if self.style_check(item):
for valor in str(item.text).replace(
'.', '').strip().split():
if valor.isdigit():
if len(valor) == 7:
linha['CEST'].append(valor)
elif len(valor) >= 4:
linha['NCM'].append(valor)
else:
continue
if not linha == {'CEST': [], 'NCM': []}:
dados.append(linha)
self.ncm_l = set({item for sub in dados for item in sub['NCM']})
self.cest_l = set({item for sub in dados for item in sub['CEST']})
return dados
def comparation_ncm_cst(
self, chave, n_nf, name_for, cnpj_dest, ncms, cests, cfops, name_prods,
v_prods, v_ipis, v_outros, v_fretes, v_descs, v_icms, ali_icms):
with open(f'{cnpj_dest}.csv', 'a', newline="") as csv_file:
self.csv_withe = writer(csv_file, delimiter=";")
self.csv_withe.writerow([chave, n_nf, name_for])
for (ncm, cest, cfop, name_prod, v_prod, v_ipi,
v_outro, v_frete, v_desc, v_icm, ali_icm) in zip(
ncms, cests, cfops, name_prods, v_prods, v_ipis,
v_outros, v_fretes, v_descs, v_icms, ali_icms
):
if any(ncm.startswith(item) for item in self.ncm_l):
bc_icms_st = (float(v_prod) + float(v_ipi) + float(v_outro)+
float(v_frete) - float(v_desc))
icms_dest = float(v_icm)
f_ncm = f'{ncm[0:4]}.{ncm[4:6]}.{ncm[6:]}'
f_cest = '0'
if cest != 0:
f_cest = f'{cest[0:2]}.{cest[2:5]}.{cest[5:]}'
if cest in self.cest_l:
self.csv_withe.writerow(
[f_ncm, f_cest, cfop, bc_icms_st, icms_dest, ali_icm, name_prod])
else:
self.csv_withe.writerow(
[f_ncm, f_cest, cfop, bc_icms_st, icms_dest, ali_icm, name_prod])
def xml_search(self, file_xml):
for root_file in file_xml:
try:
xml = NFe(root_file)
estado_cli = xml.estado_cli()
estado_for = xml.estado_for()
cnpj_dest = xml.cnpj_dest()
if estado_cli == estado_for and not cnpj_dest in cnpjs:
pass
else:
cests = xml.cest()
ncms = xml.ncm()
cfops = xml.cfop()
chave = xml.acess_key()
n_nf = xml.number_nf()
name_prods = xml.name_prod()
v_prods = xml.v_prod()
v_ipis = xml.v_ipi()
v_outros = xml.v_outros()
v_fretes = xml.v_frete()
v_descs = xml.v_desc()
v_icms = xml.v_icms()
ali_icms = xml.ali_icms()
name_for = xml.name_for()
print(f'A nota fical {chave} esta sendo processada.')
self.comparation_ncm_cst(
chave, n_nf, name_for, cnpj_dest, ncms, cests, cfops, name_prods,
v_prods, v_ipis, v_outros, v_fretes, v_descs, v_icms, ali_icms
)
except Exception as e:
print(f"Ocorreu um erro durante a execução o erro é: {e}")