import os
from types import SimpleNamespace
import zipfile
import pandas as pd
from bs4 import BeautifulSoup
import time
from pynfe.processamento.comunicacao import ComunicacaoSefaz
import pyautogui as pt
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from time import sleep, perf_counter
import json
import threading
import re
import unicodedata
import datetime
from datetime import date, datetime
import shutil
import requests
from pynfe.entidades.cliente import Cliente
from pynfe.entidades.emitente import Emitente
from pynfe.entidades.notafiscal import NotaFiscal, NotaFiscalProduto
from pynfe.entidades.fonte_dados import _fonte_dados
from pynfe.processamento.serializacao import SerializacaoXML
from pynfe.processamento.assinatura import AssinaturaA1
from pynfe.utils.flags import CODIGO_BRASIL,NAMESPACE_NFE
from pynfe.excecoes import NenhumObjetoEncontrado
from decimal import Decimal
from lxml import etree
import urllib3

import io
import xml.etree.ElementTree as ET 

try:
    import models_ as db
except:
    try:
        import models as db
    except:
        pass

pasta_bots=os.path.join(os.path.expanduser("~"), "api/estrutura_api/api/utils/bots")
df=pd.read_excel(f"{pasta_bots}/planilhas/Tabela_de_Paises_Ref_NT_2018_003_v1-01.xlsx")
paises={}
for i in range(1,len(df.iloc[:, 0])):
    paises[f"{df.iloc[:,0][i]}"]=df.iloc[:,1][i]

os.makedirs('XMLs_cache', exist_ok=True)
BASE_DESTINO_XML='XMLs_cache'
BASE_BUSCA_ARQUIVOS=os.path.join(os.path.expanduser('~'),'.arquivos_api')
chave_nfe=0

class ConnServer:
    def __init__():
        print('Inicializando conexão ao fileserver...')

        pass
    def enviar_to_fileserver(self, origem, nova_pasta):
        pasta_fileserver=r'\\fileserver\users\usuario_teste_case'
        shutil.copytree(origem, os.path.join(pasta_fileserver, nova_pasta), dirs_exist_ok=True)
        print(f'Copiando arquivos da pasta {nova_pasta}')

def retornar_bytes(dados):
    dados=ET.fromstring(dados)
    print(type(dados))
    bytes_=io.BytesIO(dados)
    return bytes_.getvalue()

def formatar_string(texto:str, ad_simbol:str=None,):
    #ad_simbol remove simbolos adicionais
    texto=re.sub(r'[\n\r\t]+','', texto)
    texto=re.sub(r'\s+',' ', texto)
    if ad_simbol!=None:
        texto=texto.replace(f'{ad_simbol}','')
    texto=texto.strip()
    return texto

def formatar_valor(valor:str, mode):
    #efetua a formatação de um conjunto de numeros para um modo de contagem
    match mode:
        case 'real':
                try:
                    valor=str(valor).replace('.','')
                except:
                    pass
                try:
                    valor=str(valor).replace(',','.')
                except:
                    pass
        case 'unidade':
            valor=valor[:valor.find(',')]
            valor=valor.replace(',','')
        case 'endereco_logradouro':
            try:
                valor=formatar_string(valor[:int(valor.find(','))], ',')
            except:
                pass
        case 'endereco_numero':
            try:
                valor=valor.replace(' ','').replace(',',' ').split()
                valor=valor[1]
            except:
                pass
        case 'endereco_complemento':
            try:
                if len(valor.replace(' ','').replace(',',' ').split())>2:
                    valor=valor.replace(' ','').replace(',',' ').split() 
                    valor=valor[2]
                else:
                    valor='NÃO INFORMADO'
            except:
                pass
        case 'porcentagem':
            valor=valor.replace(',','.')
        case 'remove_all':
            valor=valor.replace('\n','').replace(' ','').lower()
            valor=unicodedata.normalize("NFD",valor)#efetua a remoção de acentos sem quebrar o valor
            valor=re.sub(r'[^A-Za-z0-9\s]','',valor)
            valor=str(valor).replace('\xa0','')
            valor=str(valor).replace(' ','')
        case 'switch_space':
            valor=valor.replace('\n','').replace('\xa0','').lower()
            valor=valor.strip()
            valor=unicodedata.normalize("NFD",valor)#efetua a remoção de acentos sem quebrar o valor
            valor=re.sub(r'[^A-Za-z0-9\s]','',valor)
            valor=str(valor).replace(' ','_')
    return valor

def retornar_path(data, mode=None):
    """
        mode=file > retornara um booleano se o arquivo existe na data(caminho) especificicado
        mode=path > retornara se a pasta existe em booleano
        mode=lista > retorna a lista de arquivos da pasta especificada 
        mode=user_join > retorna a concatenação da pasta usuario local com a pasta especificada em 'data'
    """
    try:
        match mode:
            case 'file':
                return os.path.isfile(data)
            case 'path':
                return os.path.isdir(data)
            case 'lista':
                return os.listdir(data)
            case 'user_join':
                return os.path.join(os.path.expanduser('~'), data)
            case 'criar_pasta':
                return os.makedirs(data, exist_ok=True)
    except:
        return None
           
#RETORNA O MES ATUAL XX
data_vigente=int(datetime.now().month)
match data_vigente:
    case 1:
        data_vigente=f'0{data_vigente}'
    case 2:
        data_vigente=f'0{data_vigente}'
    case 3:
        data_vigente=f'0{data_vigente}'
    case 4:
        data_vigente=f'0{data_vigente}'
    case 5:
        data_vigente=f'0{data_vigente}'
    case 6:
        data_vigente=f'0{data_vigente}'
    case 7:
        data_vigente=f'0{data_vigente}'
    case 8:
        data_vigente=f'0{data_vigente}'
    case 9:
        data_vigente=f'0{data_vigente}'
    case 10:
        data_vigente=f'{data_vigente}'
    case 11:
        data_vigente=f'{data_vigente}'
    case 12:
        data_vigente=f'{data_vigente}'

#RETORNA O MES ATUAL FORMATADO XX-mes
mes=int(datetime.now().month)
match int(mes):
    case 1:
        mes=f'0{mes}-jan'
    case 2:
        mes=f'0{mes}-fev'
    case 3:
        mes=f'0{mes}-mar'
    case 4:
        mes=f'0{mes}-abr'
    case 5:
        mes=f'0{mes}-mai'
    case 6:
        mes=f'0{mes}-jun'
    case 7:
        mes=f'0{mes}-jul'
    case 8:
        mes=f'0{mes}-ago'
    case 9:
        mes=f'0{mes}-set'
    case 10:
        mes=f'{mes}-out'
    case 11:
        mes=f'{mes}-nov'
    case 12:
        mes=f'{mes}-dez'

class Emissor:
    chave=str() #obrigatorio

class Destinatario:
    chave=str() #obrigatorio
    
class NotaInfo():
    chave=str()

class ProdutosNt():
    pass

def extrai_info(file_nfe_html, codigo_dominio=None, razao=None, regime=None, cnpj=None, path=None, data_:dict=None):
    global BASE_DESTINO_XML
    

    try:
        path=str(path).replace("\\", '/').replace(a,"/").replace(b, "/")
    except:
        pass
    print(f"PASTA DE DESTIONO -> {path}")

    if str(file_nfe_html)[-5:]!='.html':
        return 'arquivo invalido'
    #ZERAR VARIAVEIS
    print("REQUESTE EXTRAÇÃO")
    if data_==None:
        pasta_arquivo_=retornar_path(f".arquivos_api/{cnpj}/{mes}/{str(datetime.now().year)}/nfe/html/{file_nfe_html}", 'user_join')
        pasta_empresa=retornar_path(data=f'.arquivos_api/{cnpj}/{mes}/{str(datetime.now().year)}/nfe/xml', mode='user_join')
    else:
        pasta_empresa=retornar_path(data=f'.arquivos_api/{cnpj}/{data_['mes']}/{data_['ano']}/nfe/xml', mode='user_join')
        pasta_arquivo_=retornar_path(f".arquivos_api/{cnpj}/{data_['mes']}/{data_['ano']}/nfe/html/{file_nfe_html}", 'user_join')
    retornar_path(pasta_empresa, 'criar_pasta')
  
    emissor_class=Emissor()
    destinatario_class=Destinatario()
    nota_info=NotaInfo()
    produtos_class=ProdutosNt()
    nr_nota=0
    valida_nt=0
    sleep(1.5)
    counter=0
    DADOS_PARA_XML={'chave':'','digest':'','produtos_v1':[]#{'chave':''} to include
                    }
    inicio_timer=perf_counter()
    def api_requeste_info():

        #retorna info emitente e destinatario via api
        try:
            requisicao=requests.get(f'https://brasilapi.com.br/api/cnpj/v1/{DADOS_PARA_XML['emitente']['cnpj']}')
            if requisicao.status_code==200:
                refinar_json=requisicao.json()
                if DADOS_PARA_XML['emitente']['endereco_uf']=='' and refinar_json['uf']!=None:
                    DADOS_PARA_XML['emitente']['endereco_uf']=refinar_json['uf']
                if DADOS_PARA_XML['emitente']['endereco_cep']=='' and refinar_json['cep']!=None:
                    DADOS_PARA_XML['emitente']['endereco_cep']=refinar_json['cep']
                if DADOS_PARA_XML['emitente']['endereco_bairro']=='' and refinar_json['bairro']!=None:
                    DADOS_PARA_XML['emitente']['endereco_bairro']=refinar_json['bairro']
                if DADOS_PARA_XML['emitente']['endereco_numero']=='' and refinar_json['numero']!=None:
                    DADOS_PARA_XML['emitente']['endereco_numero']=refinar_json['numero']
                if DADOS_PARA_XML['emitente']['endereco_municipio']=='' and refinar_json['municipio']!=None:
                    DADOS_PARA_XML['emitente']['endereco_municipio']=refinar_json['municipio']
                if DADOS_PARA_XML['emitente']['endereco_logradouro']=='' and refinar_json['logradouro']!=None: 
                    DADOS_PARA_XML['emitente']['endereco_logradouro']=str(refinar_json['logradouro']).strip()
                if DADOS_PARA_XML['emitente']['cnae_fiscal']=='' and refinar_json['cnae_fiscal']!=None:
                    DADOS_PARA_XML['emitente']['cnae_fiscal']=str(refinar_json['cnae_fiscal'])
                if DADOS_PARA_XML['emitente']['razao']=='' and refinar_json['razao_social']!=None:
                    DADOS_PARA_XML['emitente']['razao']=refinar_json['razao_social']
                if DADOS_PARA_XML['emitente']['nome_fantasia']=='' and refinar_json['nome_fantasia']!=None:
                    DADOS_PARA_XML['emitente']['nome_fantasia']=refinar_json['nome_fantasia']
                if DADOS_PARA_XML['nota_fiscal']['municipio']=='' and refinar_json['codigo_municipio_ibge']!=None:
                    DADOS_PARA_XML['nota_fiscal']['municipio']=str(refinar_json['codigo_municipio_ibge'])
        except:
            pass         
        try:
            requisicao=requests.get(f'https://brasilapi.com.br/api/cnpj/v1/{DADOS_PARA_XML['cliente']['numero_documento']}')
            if requisicao.status_code==200:
                refinar_json=requisicao.json()
                if DADOS_PARA_XML['cliente']['endereco_uf']=='' and refinar_json['uf']!=None:
                    DADOS_PARA_XML['cliente']['endereco_uf']=refinar_json['uf']
                if DADOS_PARA_XML['cliente']['endereco_cep']=='' and refinar_json['cep']!=None:
                    DADOS_PARA_XML['cliente']['endereco_cep']=refinar_json['cep']
                if DADOS_PARA_XML['cliente']['endereco_bairro']=='' and refinar_json['bairro']!=None:
                    DADOS_PARA_XML['cliente']['endereco_bairro']=refinar_json['bairro']
                if DADOS_PARA_XML['cliente']['endereco_numero']=='' and refinar_json['numero']!=None:
                    DADOS_PARA_XML['cliente']['endereco_numero']=refinar_json['numero']
                if DADOS_PARA_XML['cliente']['endereco_municipio']=='' and refinar_json['municipio']!=None:
                    DADOS_PARA_XML['cliente']['endereco_municipio']=refinar_json['municipio']
                if DADOS_PARA_XML['cliente']['endereco_logradouro']=='' and refinar_json['logradouro']!=None:
                    DADOS_PARA_XML['cliente']['endereco_logradouro']=str(refinar_json['logradouro']).strip()
                if DADOS_PARA_XML['cliente']['endereco_complemento']=='' and refinar_json['complemento']!=None:
                    DADOS_PARA_XML['cliente']['endereco_complemento']=str(refinar_json['complemento']).strip()
                if DADOS_PARA_XML['cliente']['razao']=='' and refinar_json['razao_social']!=None:
                    DADOS_PARA_XML['cliente']['razao']=refinar_json['razao_social']
                if DADOS_PARA_XML['cliente']['endereco_telefone']=='' and refinar_json['ddd_telefone_1']!=None:
                    DADOS_PARA_XML['cliente']['endereco_telefone']=refinar_json['ddd_telefone_1']
                if DADOS_PARA_XML['cliente']['email']=='' and refinar_json['email']!=None:
                    DADOS_PARA_XML['cliente']['email']=refinar_json['email']
        except:
            pass

    while counter<1:
        arquivo_lido=False
        #executa a leitura do arquivo danfe
        try:
            counter=counter+1 #Contagem das execuções
            #Efetua a leitura e validação do conteudo
            try:
               #modulo de leitura do arquivo
                with open(pasta_arquivo_,'r',encoding='utf-8') as file:soup=BeautifulSoup(file,'html.parser')
                print('REQUESTE OPEN')
                #print(f'Bytes do arquivo: {retornar_bytes(soup)}')
                arquivo_lido= False if len(soup)==0 else True
            except:
                try:
                    #instancia o arquivo no diretorio atual
                    with open(pasta_arquivo_, 'r', encoding='utf-8') as file:soup=BeautifulSoup(file,'html.parser')
                    print('REQUESTE OPEN Second try')
                    
                    #print(f'Bytes do arquivo: {retornar_bytes(soup)}')
                    arquivo_lido= False if len(soup)==0 else True
                except Exception as e:
                    #ERRO 0.0
                    print(f'Erro -> {e}')
                    print(f'Bytes do arquivo err_: {len(soup)}')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.0,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'ERRO cod:0, {e}\n')
                finally:
                    if arquivo_lido==False:
                        return f'ERRO 0.0 ARQUIVO NÃO CONTEM CONTEUDO!'
                    else:
                        pass
            
            # Aloca a chave nas classes
            try:
                chave_tag=soup.find_all('td')
                for iv,i in enumerate(chave_tag):
                    if iv==1:
                        DADOS_PARA_XML['chave']=re.sub(r'\D','',str(i.text)).replace(' ','')
                        emissor_class.chave=re.sub(r'\D','',str(i.text)).replace(' ','')
                        destinatario_class.chave=re.sub(r'\D','',str(i.text)).replace(' ','')
                        nota_info.chave=re.sub(r'\D','',str(i.text)).replace(' ','')
                        break
            except Exception as e:
                #ERRO 0.1
                print(f'Erro 0.1 -> {e}')
                with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:0.1 -> arquivo vazio, ERRO AO RETORNA A CHAVE {e}')
                with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                if isinstance(dados_err, list):
                    err_={"cod":0.1,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                    dados_err.append(err_)
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                return f'❌ cod:0.1 Erro Nota não contem conteudo para extração!'
            if retornar_path(f"{pasta_empresa}/xml_{nota_info.chave}.xml", mode='file'):
                return f"💾 NOTA -> {nota_info.chave} JÁ CONSTA!"
            
            produtos_=[]
            numero_produto=0
            efemera_v={}
            codigo_v=0
            arquivo_consta=1 if retornar_path(f'{path}/xml_{nota_info.chave}.xml', 'file' ) else 0 
            if arquivo_consta==0 and arquivo_lido==True:
                print(f'Efetuado a {counter}ª leitura da nota -> {nota_info.chave}')
                
                fieldsets=soup.find_all('fieldset')
                modalidade_frete=soup.find(id='Transporte').find_all('td')
                ind_pagamento=soup.find(id='Cobranca').find_all('td')
                dados_danfe=soup.find(id='NFe').find_all('fieldset')[0].find_all('td')
                dados_danfe_0=soup.find(id='NFe').find_all('fieldset')[2].find_all('td')
                dados_danfe_1=soup.find(id='NFe').find_all('fieldset')[3].find_all('td')
                dados_danfe_2=soup.find(id='Inf').find_all('tbody')[0]
                dados_danfe_3=soup.find(id='Inf').find_all('td')
                dados_danfe_4=soup.find(id='Totais').find_all('tbody')[0].find_all('td')
                emissor_info=soup.find(id='Emitente').find_all('td')
                destinatario_info=soup.find(id='DestRem').find_all('td')
                produtos_nt=soup.find(id='Prod').find_all('td')    
                
                try:
                    for ind,v in enumerate(modalidade_frete):
                        try:
                            if v.find('label') and v.find('span'):
                                if v.find('label').text=='Modalidade do Frete':
                                    nota_info.transporte_modalidade_frete=re.sub(r'\D','',str(v.find('span').text)[:str(v.find('span').text).find('-')])
                                    break
                        except Exception as e:
                            print(f'Erro ao retornar modalidade do frete -> {e}')
                            continue
                except Exception as e:
                    #ERRO 0.2
                    print(f'Erro 0.2 -> {e}')
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.2,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.2 soup modalidade_frete -> {e}'
                
                try:
                    indice_count=0 
                    for ind,v in enumerate(ind_pagamento):
                        if formatar_valor(valor=v.find_previous('label').text, mode='switch_space')=='descricao_do_meio_de_pagamento':
                            if 'forma_pagamento' not in nota_info.__dict__.keys():
                                nota_info.forma_pagamento=re.sub(r'\D','',str(str(v.find('span').text)[:str(v.find('span').text).find('-')])) if v.find('span').text!='' else 2
                                indice_count=ind
                            elif 'tipo_pagamento' in nota_info.__dict__.keys() and int(indice_count+1)==ind:
                                nota_info.tipo_pagamento=re.sub(r'\D','',str(str(v.find('span').text)[:str(v.find('span').text).find('-')])) if v.find('span').text!='' else 99
                except Exception as e:
                    #ERRO 0.3
                    print(f'Erro 0.3 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.3,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.3 soup ind_pagamento -> {e}'
                
                try:    
                    for iv, i in enumerate(produtos_nt):
                        if i.get('class')==['fixo-prod-serv-descricao']:
                            if not i.find('label'):
                                efemera_v['descricao']=str(i.find('span').text).strip()
                                codigo_v=1    
                        if i.get('class')==['fixo-prod-serv-qtd']:
                            if not i.find('label') and codigo_v==1:
                                efemera_v['quantidade_comercial']=formatar_valor(valor=i.find('span').text,mode='unidade')
                        if i.get('class')==['fixo-prod-serv-uc']:
                            if not i.find('label') and codigo_v==1:
                                efemera_v['unidade_comercial']=formatar_valor(valor=i.find('span').text,mode='unidade')
                        if i.get('class')==['fixo-prod-serv-vb']:
                            if not i.find('label') and codigo_v==1:
                                efemera_v['total_bruto']=formatar_valor(valor=str(i.find('span').text),mode='real')
                                pass
                        if i.get('class')==['fixo-prod-serv-numero']:
                            if not i.find('label'):
                                pass
                                #print(i.find('span').text)
                        if len(efemera_v.keys())==4:
                            DADOS_PARA_XML['produtos_v1'].append(efemera_v)
                            codigo_v=0
                            efemera_v={}
                except Exception as e:
                    #ERRO 0.4
                    print(f'Erro 0.4 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.4,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.4 soup produtos_nt -> {e}'
                    #RETORNA TODAS AS INFO DOS PRODUTOS DA NOTA
                
                try:
                    for iv, i in enumerate(produtos_nt):
                        try:
                            #print(f'LABEL ATIVO: {str(i.find('label').text).replace('\n', '').replace(' ','')}')
                            if formatar_valor(i.find('label').text,'switch_space')=='codigo_do_produto':
                                if codigo_v!=i.find('span').text :
                                    DADOS_PARA_XML['produtos_v1'][numero_produto][f'{formatar_valor(str(i.find('label').text),'switch_space')}']=i.find('span').text
                                    numero_produto+=1
                                    codigo_v=i.find('span').text
                            if formatar_valor(i.find('label').text,'switch_space')=='codigo_ncm':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text, 'switch_space')}']=i.find('span').text
                            if formatar_valor(i.find('label').text,'switch_space')=='codigo_cest':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text, 'switch_space')}']=i.find('span').text
                            if i.find('label').text=='CFOP':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=i.find('span').text
                            
                            if formatar_valor(i.find('label').text, 'switch_space')=="valor_do_desconto":
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=formatar_valor(i.find('span').text, 'real')

                            if formatar_valor(i.find('label').text,'switch_space')=='indicador_de_composicao_do_valor_total_dan_fe':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=re.sub(r'\D','',str(i.find('span').text)[:int(str(i.find('span').text).find('-'))])
                            if formatar_valor(i.find('label').text,'switch_space')=='codigo_ean_comercial':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=i.find('span').text
                            if formatar_valor(i.find('label').text,'switch_space')=='unidade_comercial':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=i.find('span').text
                            if formatar_valor(i.find('label').text,'switch_space')=='quantidade_comercial':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=formatar_valor(i.find('span').text,'unidade')
                            if formatar_valor(str(i.find('label').text),'switch_space')=='codigo_ean_tributavel':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=i.find('span').text
                            if formatar_valor(i.find('label').text,'switch_space')=='unidade_tributavel':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=i.find('span').text
                            if formatar_valor(i.find('label').text,'switch_space')=='quantidade_tributavel':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=formatar_valor(i.find('span').text,'unidade')
                            if formatar_valor(str(i.find('label').text),'switch_space')=='valor_unitario_de_comercializacao':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text, 'switch_space')}']=formatar_valor(i.find('span').text,'real')
                            if formatar_valor(str(i.find('label').text),'switch_space')=='valor_unitario_de_tributacao':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=formatar_valor(i.find('span').text,'real')
                            if formatar_valor(str(i.find('label').text),'switch_space')=='numero_do_pedido_de_compra':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text, 'switch_space')}']=i.find('span').text
                            if formatar_valor(str(i.find('label').text),'switch_space')=='item_do_pedido_de_compra':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=i.find('span').text
                            if formatar_valor(str(i.find('label').text),'switch_space')=='valor_aproximado_dos_tributos':
                                DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text, 'switch_space')}']=i.find('span').text
                            #tributação icms
                            if formatar_valor(str(i.find('label').text),'switch_space')=='origem_da_mercadoria':
                                if formatar_valor(i.find('label').text,'switch_space') not in DADOS_PARA_XML['produtos_v1'][numero_produto-1].keys():
                                    DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'{formatar_valor(i.find('label').text,'switch_space')}']=str(i.find('span').text).replace('\n','').replace(' ','')[:str(i.find('span').text).replace('\n','').replace(' ','').find('-')]
                            if str(i.find_previous('legend').text)=='ICMS Normal e ST':
                                if formatar_valor(i.find('label').text,'switch_space')!='origem_da_mercadoria' and formatar_valor(i.find('label').text,'switch_space') not in DADOS_PARA_XML['produtos_v1'][numero_produto-1].keys():
                                    label_ind=formatar_valor(i.find('label').text,'switch_space')
                                    if label_ind=='tributacao_do_icms' or label_ind=='codigo_de_situacao_da_operacao_simples_nacional' or label_ind=='codigo_de_situacao_da_operacao':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-MODALIDADE-{label_ind}']=i.find('span').text
                                    if 'base' in str(label_ind).replace('_',' ').split():
                                        if i.find('span').text=='':
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-BC-{label_ind}']='0.00'
                                        else:
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-BC-{label_ind}']=i.find('span').text
                                    elif 'aliquota' in str(label_ind).replace('_',' ').split():
                                        if i.find('span').text=='':
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-AL-{label_ind}']='0.00'
                                        else:
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-AL-{label_ind}']=i.find('span').text
                                    elif 'valor' in str(label_ind).replace('_',' ').split():
                                        if i.find('span').text=='':
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-V-{label_ind}']='0.00'
                                        else:
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-V-{label_ind}']=i.find('span').text
                                    elif 'percentual' in str(label_ind).replace('_',' ').split():
                                        if i.find('span').text=='':
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-P-{label_ind}']='0.00'
                                        else:
                                            DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-P-{label_ind}']=i.find('span').text
                                    elif label_ind!='tributacao_do_icms' or label_ind!='codigo_de_situacao_da_operacao_simples_nacional' or label_ind!='codigo_de_situacao_da_operacao':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'ICMS-MODALIDADE-{formatar_valor(str(i.find('label').text),'switch_space')}']=i.find('span').text
                            if str(i.find_previous('legend').text)=='PIS':
                                    if formatar_valor(i.find('label').text,'switch_space')=='base_de_calculo':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['PIS-BC']=formatar_valor(str(i.find('span').text),'real')
                                    elif formatar_valor(i.find('label').text,'switch_space')=='aliquota' or formatar_valor(i.find('label').text,'switch_space')=='aliquota_':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['PIS-AL']=formatar_valor(str(i.find('span').text),'porcentagem')
                                    elif formatar_valor(i.find('label').text,'switch_space')=='valor' or formatar_valor(i.find('label').text,'switch_space')=='valor_do_pis':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['PIS-V']=formatar_valor(str(i.find('span').text),'real')
                                    elif formatar_valor(str(i.find('label').text),'switch_space')=='cst':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['PIS-MODALIDADE']=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                            if str(i.find_previous('legend').text)=='COFINS':
                                    if formatar_valor(i.find('label').text,'switch_space')=='base_de_calculo':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['COFINS-BC']=formatar_valor(str(i.find('span').text),'real')
                                    elif formatar_valor(i.find('label').text,'switch_space')=='aliquota' or formatar_valor(i.find('label').text,'switch_space')=='aliquota_':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['COFINS-AL']=formatar_valor(str(i.find('span').text),'porcentagem')
                                    elif formatar_valor(i.find('label').text,'switch_space')=='valor' or formatar_valor(i.find('label').text,'switch_space')=='valor':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['COFINS-V']=formatar_valor(str(i.find('span').text),'real')
                                    elif formatar_valor(str(i.find('label').text),'switch_space')=='cst':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['COFINS-MODALIDADE']=re.sub(r'\D','',str(i.find('span').text)[:int(str(i.find('span').text).find('-'))])
                            try:
                                #RETORNA O IPI
                                if formatar_valor(str(i.find_previous('legend').text),'switch_space')=='imposto_sobre_produtos_industrializados':
                                    if formatar_valor(i.find('label').text,'switch_space')=='valor_ipi' and formatar_valor(i.find_previous('label').text,'switch_space')=='valor_por_unidade':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['VALOR-IPI']=i.find('span').text
                                    if formatar_valor(i.find('label').text,'switch_space')=='base_de_calculo' and formatar_valor(i.find_previous('label').text,'switch_space')=='valor_ipi':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['IPI-BC']=i.find('span').text
                                    if formatar_valor(i.find('label').text,'switch_space')=='aliquota' and formatar_valor(i.find_previous('label').text,'switch_space')=='base_de_calculo':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1]['IPI-AL']=i.find('span').text
                                    if formatar_valor(i.find_previous('label').text,'switch_space')=='qtd_selo' and i.find('label').text=='CST':
                                        DADOS_PARA_XML['produtos_v1'][numero_produto-1][f'IPI-MODALIDADE']=re.sub(r'\D','',str(formatar_valor(str(i.find('span').text),'switch_space'))[:int(str(formatar_valor(str(i.find('span').text),'switch_space')).find('-'))])
                            except:
                                pass
                        except:
                            pass
                    #efetua a identação de valores
                    contabilizando_icms_nota=0
                    pr=None
                    for i in range(len(DADOS_PARA_XML['produtos_v1'])):
                        try:
                            for val in DADOS_PARA_XML['produtos_v1'][i].keys():
                                if '-' in DADOS_PARA_XML['produtos_v1'][i][val] and val!='descricao' and val!='codigo_do_produto':
                                    DADOS_PARA_XML['produtos_v1'][i][val]=str(DADOS_PARA_XML['produtos_v1'][i][val])[:str(DADOS_PARA_XML['produtos_v1'][i][val]).find('-')]
                                    if ' ' in DADOS_PARA_XML['produtos_v1'][i][val]:
                                        DADOS_PARA_XML['produtos_v1'][i][val]=str(DADOS_PARA_XML['produtos_v1'][i][val]).replace('\n','').replace(' ','')

                                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_VALIDACAO.txt','a',encoding='utf-8') as f:f.write(f'VARIAVEL DE ACESSO NO DICIONARIO: {val} CODIGO DO PRODUTO: {DADOS_PARA_XML['produtos_v1'][i]['codigo_do_produto']} VALOR A SER REVISADO: {str(DADOS_PARA_XML['produtos_v1'][i][val])} CHAVE: {DADOS_PARA_XML['chave']}\n')
                                
                                    
                                    #with open(f'temp/notas_json_log/PRODUTO_NOTA-{DADOS_PARA_XML['chave']}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'],f,indent=4,ensure_ascii=False)
                        except:
                            pass
                except Exception as e:
                    #ERRO 0.5
                    print(f'Erro 0.5 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.5,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.5 soup produtos_nt-0 -> {e}'
                
                try:                    
                    #retorna info do emissor
                    for iv,i in enumerate(emissor_info):
                        if i.find('label').text=='Nome / Razão Social' and i.find('span').text!='':
                            emissor_class.razao=i.find('span').text

                        if i.find('label').text=='Nome Fantasia' and i.find('span').text!='':
                            emissor_class.nome_fantasia=i.find('span').text

                        if i.find('label').text=='CNPJ' and i.find('span').text!='':
                            emissor_class.cnpj=re.sub(r'\D','',str(i.find('span').text))

                        if i.find('label').text=='Endereço' and i.find('span').text!='':
                            emissor_class.endereco_logradouro=formatar_valor(str(i.find('span').text),'endereco_logradouro')
                            emissor_class.endereco_numero=formatar_valor(str(i.find('span').text), 'endereco_numero')

                        if i.find('label').text=='Bairro / Distrito' and i.find('span').text!='':
                            emissor_class.endereco_bairro=i.find('span').text

                        if i.find('label').text=='CEP' and i.find('span').text!='':
                            emissor_class.endereco_cep=re.sub(r'\D','',str(i.find('span').text))

                        if i.find('label').text=='Município' and i.find('span').text!='':
                            emissor_class.endereco_municipio=formatar_string(str(i.find('span').text)[str(i.find('span').text).find('-'):],'-')
                        
                        if i.find('label').text=='Telefone' and i.find('span').text!='':
                            emissor_class.endereco_telefone=re.sub(r'\D','',str(i.find('span').text))

                        if i.find('label').text=='UF' and i.find('span').text!='':
                            emissor_class.endereco_uf=i.find('span').text

                        if i.find('label').text=='País' and i.find('span').text!='':
                            emissor_class.endereco_pais=re.sub(r'\D','',str(i.find('span').text)[:int(str(i.find('span').text).find('-'))])
                        
                        if i.find('label').text=='Inscrição Estadual' and i.find('span').text!='':
                            emissor_class.inscricao_estadual=i.find('span').text

                        if i.find('label').text=='Inscrição Estadual do Substituto Tributário' and i.find('span').text!='':
                            emissor_class.inscricao_estadual_st=i.find('span').text
                            
                        if i.find('label').text=='Inscrição Municipal' and i.find('span').text!='':
                            emissor_class.inscricao_municipal=i.find('span').text
                    
                        if i.find('label').text=='Município da Ocorrência do Fato Gerador do ICMS' and i.find('span').text!='':
                            emissor_class.municipio_ocorrencia=i.find('span').text

                        if i.find('label').text=='CNAE Fiscal' and i.find('span').text!='':
                            emissor_class.cnae=i.find('span').text

                        if i.find('label').text=='Código de Regime Tributário' and i.find('span').text!='':
                            emissor_class.regime_tributario=re.sub(r'\D','',str(i.find('span').text))
                except Exception as e:
                    #ERRO 0.6
                    print(f'Erro 0.6 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.6,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.6 soup emissor_info -> {e}'
                    #retorna info do destinatario
                
                try:
                    for iv, i in enumerate(destinatario_info):
                        if i.find('label').text=='Nome / Razão Social' and i.find('span').text!='':
                            destinatario_class.razao=i.find('span').text

                        if i.find('label').text=='CNPJ' and i.find('span').text!='' or i.find('label').text=='CPF' and i.find('span').text!='' or i.find('label').text=='Id. Estrangeiro' and i.find('span').text!='' or i.find('label').text=='CNPJ/CPF/Id. Estrangeiro':
                            destinatario_class.tipo_documento=str(i.find('label').text).upper()
                            destinatario_class.numero_documento=re.sub(r'\D','',i.find('span').text)

                        if i.find('label').text=='Endereço' and i.find('span').text!='':
                            destinatario_class.endereco_logradouro=formatar_valor(str(i.find('span').text), 'endereco_logradouro')
                            destinatario_class.endereco_numero=formatar_valor(str(i.find('span').text), 'endereco_numero')
                            destinatario_class.endereco_complemento=formatar_valor(str(i.find('span').text), 'endereco_complemento')

                        if i.find('label').text=='Bairro / Distrito' and i.find('span').text!='':
                            destinatario_class.bairro=i.find('span').text

                        if i.find('label').text=='CEP' and i.find('span').text!='':
                            destinatario_class.cep=re.sub(r'\D','',i.find('span').text)

                        if i.find('label').text=='Município' and i.find('span').text!='':
                            destinatario_class.municipio=formatar_string(str(i.find('span').text)[str(i.find('span').text).find('-'):],'-')
                        
                        if i.find('label').text=='Telefone' and i.find('span').text!='':
                            destinatario_class.telefone=re.sub(r'\D','',i.find('span').text)

                        if i.find('label').text=='UF' and i.find('span').text!='':
                            destinatario_class.uf=i.find('span').text

                        if i.find('label').text=='País' and i.find('span').text!='':
                            destinatario_class.pais=re.sub(r'\D','',str(i.find('span').text)[:int(str(i.find('span').text).find('-'))])

                        if i.find('label').text=='Indicador IE' and i.find('span').text!='':
                            destinatario_class.indicador_ie=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        
                        if i.find('label').text=='Inscrição Estadual' and i.find('span').text!='':
                            destinatario_class.inscricao_estadual=i.find('span').text

                        if i.find('label').text=='Inscrição SUFRAMA' and i.find('span').text!='':
                            destinatario_class.inscricao_suframa=i.find('span').text

                        if i.find('label').text=='IM' and i.find('span').text!='':
                            destinatario_class.im=i.find('span').text
        
                        if i.find('label').text=='E-mail' and i.find('span').text!='':
                            destinatario_class.email=i.find('span').text
                except Exception as e:
                    #ERRO 0.7
                    print(f'Erro 0.7 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.7,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.7 soup destinatario_info -> {e}'
                
                try:
                    #retorna dados essenciais da danfe
                    for iv, i in enumerate(dados_danfe):
                        if i.find('label').text=='Modelo' and i.find('span').text!='':
                            nota_info.modelo=i.find('span').text
                        if i.find('label').text=='Série' and i.find('span').text!='':
                            nota_info.serie=i.find('span').text
                        if i.find('label').text=='Número' and i.find('span').text!='':
                            nota_info.numero_nf=i.find('span').text
                        if i.find('label').text=='Data de Emissão' and i.find('span').text!='':
                            nota_info.data_emissao=i.find('span').text
                        if str(i.find('label').text).strip()=='Data/Hora de Saída ou da Entrada' and i.find('span').text!='':
                            nota_info.data_saida=i.find('span').text
                        if i.find('label').text=='Valor Total da Nota Fiscal' and i.find('span').text!='':
                            nota_info.total_nota=i.find('span').text
                except Exception as e:
                    #ERRO 0.8
                    print(f'Erro 0.8 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.8,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.8 soup dados_danfe -> {e}'
                
                try:
                    #retorna dados essenciais da danfe
                    for iv, i in enumerate(dados_danfe_0):
                        if i.find('label').text=='Destino da operação' and i.find('span').text!='':
                            nota_info.destino_operacao=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        if i.find('label').text=='Consumidor final' and i.find('span').text!='':
                            nota_info.cliente_final=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        if i.find('label').text=='Presença do Comprador' and i.find('span').text!='':
                            nota_info.indicador_presencial=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                except Exception as e:
                    #ERRO 0.9
                    print(f'Erro 0.9 -> {e}')

                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":0.9,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 0.9 soup dados_danfe_0 -> {e}'
                
                try:
                    #retorna dados essenciais da danfe
                    for iv, i in enumerate(dados_danfe_1):
                        if i.find('label').text=='Processo' and i.find('span').text!='':
                            nota_info.processo_emissao=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        if formatar_valor(i.find('label').text,'switch_space')=='tipo_de_emissao' and i.find('span').text!='':
                            nota_info.forma_emissao=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        if i.find('label').text=='Finalidade' and i.find('span').text!='':
                            nota_info.finalidade_emissao=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        if formatar_valor(i.find('label').text,'switch_space')=='natureza_da_operacao' and i.find('span').text!='':
                            nota_info.natureza_operacao=i.find('span').text
                        if formatar_valor(i.find('label').text,'switch_space')=='tipo_da_operacao' and i.find('span').text!='':
                            nota_info.tipo_documento=re.sub(r'\D','',str(i.find('span').text)[:str(i.find('span').text).find('-')])
                        if str(i.find('label').text).strip()=='Digest Value da NF-e' and i.find('span').text!='':
                            nota_info.digest=i.find('span').text
                except Exception as e:
                    #ERRO 1.0
                    print(f"Erro 1.0 -> {e}")
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.0,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 1.0 soup dados_danfe_1 -> {e}'
                
                try:
                    for ind,v in enumerate(dados_danfe_2):


                        if formatar_valor(str(v.find('label').text),'switch_space')=='formato_de_impressao_danfe':
                            nota_info.danfe_impressao=str(v.find('span').text)[:str(v.find('span').text).find('-')]
                            break
                except Exception as e:
                    #ERRO 1.1
                    print(f"Erro 1.1 -> {e}")
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.1,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 1.1 soup dados_danfe_2 -> {e}'
                
                try:
                    for ind,v in enumerate(dados_danfe_3):
                        # if v.find('label').text=='Descrição':
                        try:
                            print(v.find("td",class_='fixo-info-adic-proc-ref'))
                            nota_info.informacoes_adicionais_interesse_fisco=v.find(class_='fixo-info-adic-proc-ref').find('span').text
                        except:
                            try:
                                nota_info.informacoes_adicionais_interesse_fisco=v.find(class_='fixo-info-adic-proc-ref').text
                            except:
                                continue
                        finally:
                            break
                except Exception as e:
                    #ERRO 1.2
                    print(f"Erro 1.2 -> {e}")
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.2,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 1.2 soup dados_danfe_3 -> {e}'
                
                try:
                    for ind,v in enumerate(dados_danfe_4):
                        if formatar_valor(v.find('label').text,'switch_space')=='valor_total_da_nfe':
                            print(f"VALOR TOTAL DA NOTA -> {v.find('span').text}")
                            nota_info.total_nota=formatar_valor(v.find('span').text,'real') if v.find('span').text!='' else '0.00'
                            
                        if formatar_valor(v.find('label').text,'switch_space')=='valor_aproximado_dos_tributos':
                            nota_info.totais_tributos_aproximado=formatar_valor(v.find('span').text,'real') if v.find('span').text!='' else '0.00'
                            break
                except Exception as e:
                    #ERRO 1.3
                    print(f"Erro 1.3 -> {e}")
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.3,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'ERRO 1.3, soup dados_danfe_4 -> {e}'
                    
            else:
                return f'💾 NOTA: {nr_nota} CONSTA NA PASTA CHAVE DE ACESSO DA NFe: {nota_info.chave}'
            sleep(5)
        #retorna as info via api
        except Exception as e:
            #ERRO 1.4
            print(f'Error 1.4 -> {e}')
            with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:1, ERRO AO LER ARQUIVO CHAVE: {DADOS_PARA_XML['chave']} {e}\n')
            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
            if isinstance(dados_err, list):
                err_={"cod":1.4,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                
                dados_err.append(err_)
                with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
            return f'❌ cod:1.4 ERRO AO LER ARQUIVO: nota:{nr_nota}' 
    
    ##ADICIONAR ARQUIVO DE LOG NOTA
    with open(f'{pasta_bots}/nfe_extrator_erros/DADOS_XML_LOG.json', 'w', encoding='utf-8') as f:json.dump([emissor_class.__dict__,destinatario_class.__dict__,nota_info.__dict__,DADOS_PARA_XML['produtos_v1']], f, indent=4, ensure_ascii=False)
    with open(f'{pasta_bots}/nfe_extrator_erros/TEMPO_EXECUCAO_LOG.txt','a',encoding='utf-8') as f:f.write(f'EXECUÇÃO NOTA: {nr_nota} CHAVE: {nota_info.chave}, TEMPO INICIAL:{inicio_timer} TEMPO FINAL: {perf_counter()} DATA: {datetime.now()}\n')
    
    if len(emissor_class.chave)==44 and len(destinatario_class.chave)==44 and len(nota_info.chave)==44:
        print(f'INICIANDO VALIDAÇÃO DA NOTA PASTA DE ALOCAÇÃO: {path}')
        
        #verificação dos valores de municipios 
        try:
            match str(emissor_class.endereco_municipio).upper():
                case 'CUIAB':
                    emissor_class.endereco_municipio='CUIABA'
                case 'JIPARANA':
                    emissor_class.endereco_municipio='JI-PARANA'
                case 'S O PAULO':
                    emissor_class.endereco_municipio='SÃO PAULO'
                case 'VILA BELA DA SANTISSIMA TRIND':
                    emissor_class.endereco_municipio='VILA BELA DA SANTÍSSIMA TRINDADE'
                case "SAO PAULO (SP)":
                    emissor_class.endereco_municipio="SÃO PAULO"
                case "CUIABA (MT)":
                    emissor_class.endereco_municipio="CUIABA"
                case "XIQUEXIQUE":
                    emissor_class.endereco_municipio="XIQUE-XIQUE"
                case "00":
                    emissor_class.endereco_municipio="EXTERIOR"
                    
            match str(destinatario_class.municipio).upper():
                case 'CUIAB':
                    destinatario_class.municipio='CUIABA'
                case 'JIPARANA':
                    destinatario_class.municipio='JI-PARANA'
                case 'S O PAULO':
                    destinatario_class.municipio='SÃO PAULO'
                case 'VILA BELA DA SANTISSIMA TRIND':
                    destinatario_class.municipio='VILA BELA DA SANTÍSSIMA TRINDADE'
                case "SAO PAULO (SP)":
                    destinatario_class.municipio="SÃO PAULO"
                case "CUIABA (MT)":
                    destinatario_class.municipio="CUIABA"
                case "XIQUEXIQUE":
                    destinatario_class.municipio="XIQUE-XIQUE"
                case "00":
                    destinatario_class.municipio="EXTERIOR"

        except:
            pass
        print(f"EMISSOR Municipio -> {emissor_class.endereco_municipio} DESTINATARIO municipio -> {destinatario_class.municipio}")
        
        sleep(0.5)
        certificado=f'{pasta_bots}/cert/S3D_2_250714105253.pfx'
        #certificado0='metalD.pfx'
        certificado_='BARBEARIA_LEONIDAS.pfx'
        senha='12345678'
        uf=str(emissor_class.endereco_uf).upper()
        homologacao=False
        ambiente=1 # 0 -> HOMOLOGAÇÃP 1 -> PRODUÇÃO 
        chave_nfe=nota_info.chave
       
        def retornar_prot():
            #retorna o prot nfe
            status=prot_nfe=None
            con=ComunicacaoSefaz(uf, certificado,senha,homologacao)
            ns={'ns':NAMESPACE_NFE}
            envio=con.consulta_nota('nfe', nota_info.chave)
            prot=etree.fromstring(envio.text.encode('utf-8'))
            prot_0=str(etree.tostring(prot,encoding='unicode',pretty_print=True))
            protocolo_estruturado=prot_0[int(prot_0.find('<protNFe')):int(prot_0.find('</protNFe>'))+10]
            # print(f'PROTOCOLO ESTRUTURADO: {protocolo_estruturado}')
            try:
                status=prot[0][0].xpath('ns:retConsSitNFe/ns:cStat', namespaces=ns)[0].text
                prot_nfe=prot[0][0].xpath('ns:retConsSitNFe/ns:protNFe', namespaces=ns)[0]
            except:
                try:
                    prot=etree.tostring(prot, encoding='unicode', pretty_print=False)
                    status=str(prot)[str(prot).find('cStat')+6:str(prot).find('cStat')+9]
                    prot_nfe=prot[1][0].xpath('ns:retConsSitNFe/ns:protNFe', namespaces=ns)[0]
                except Exception as e:
                    #ERRO 1.5
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.5,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    print(f'ERRO AO RETORNAR AUTORIZAÇÂO DA CHAVE {e}')
            print(f'REQUESTE XML: {status}')
            match status:
                case '100':
                    xml=etree.tostring(prot_nfe,encoding='unicode')
                    return xml
                case '101' | '150':
                    return etree.tostring(etree.fromstring(protocolo_estruturado.encode('utf-8')),encoding='unicode')
                case '656':
                    return None

        sleep(0.5)
        try:
            arquivo_existente=1 if retornar_path(f'{BASE_DESTINO_XML}/{regime}/{str(codigo_dominio)}-{str(razao)}/{data_vigente}{str(datetime.now().year)}/xml_{str(nota_info.chave)}.xml', 'file')==True else 0
            
            if arquivo_existente==0:
                try:
                    print(f'INICIANDO ALIMENTAÇÃO DE XML')
                    #emitente com todas as info
                    emitente=Emitente()
                    emitente.razao_social=emissor_class.razao
                    emitente.cnpj=emissor_class.cnpj
                    emitente.inscricao_estadual=emissor_class.inscricao_estadual
                    emitente.codigo_de_regime_tributario=emissor_class.regime_tributario
                    emitente.endereco_logradouro=emissor_class.endereco_logradouro
                    emitente.endereco_numero=emissor_class.endereco_numero
                    emitente.endereco_bairro=emissor_class.endereco_bairro
                    emitente.endereco_uf=emissor_class.endereco_uf
                    emitente.endereco_municipio=emissor_class.endereco_municipio
                    emitente.endereco_pais=emissor_class.endereco_pais
                    if 'nome_fantasia' in emissor_class.__dict__.keys():
                        emitente.nome_fantasia=emissor_class.nome_fantasia
                    if 'endereco_cep' in emissor_class.__dict__.keys():
                        emitente.endereco_cep=emissor_class.endereco_cep
                    if 'cnae' in emissor_class.__dict__.keys():
                        emitente.cnae_fiscal=emissor_class.cnae
                    print('DADOS EMITENTE VALIDADO!')
                except Exception as e:
                    #ERRO 1.6
                    print(f'RETORNANDO ERRO EMITENTE: {e}')
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt', 'a', encoding='utf-8') as erro:erro.write(f'Erro cod:2, Erro ao validar emitente: {e}, CHAVE: {nota_info.chave}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.6,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'❌ cod:1.6 ERRO NA ESTRUTURAÇÃO: Emitente {e}'

                try:
                    print('REQUESTE ETAPA CLIENTE')
                    #bloco responsavel pela validação do tipo de doc do cliente
                    if str(destinatario_class.tipo_documento)=='ID. ESTRANGEIRO':
                        #cliente com todas as info
                        cliente=Cliente()
                        cliente.razao_social=destinatario_class.razao
                        cliente.tipo_documento='idEstrangeiro' #VALOR OBRIGATORIO
                        cliente.numero_documento=destinatario_class.numero_documento
                        cliente.endereco_numero=destinatario_class.endereco_numero
                        cliente.endereco_bairro=destinatario_class.bairro
                        cliente.endereco_uf=destinatario_class.uf
                        cliente.endereco_municipio=destinatario_class.municipio
                        cliente.endereco_pais=destinatario_class.pais if 'pais' in destinatario_class.__dict__.keys() else CODIGO_BRASIL
                        if 'email' in destinatario_class.__dict__.keys():
                            cliente.email=destinatario_class.email
                        if 'indicador_ie' in destinatario_class.__dict__.keys():
                            cliente.indicador_ie=destinatario_class.indicador_ie
                        if 'endereco_complemento' in destinatario_class.__dict__.keys():
                            cliente.endereco_complemento=destinatario_class.endereco_complemento
                        if 'endereco_cep' in destinatario_class.__dict__.keys():
                            cliente.endereco_cep=destinatario_class.endereco_cep
                        if 'telefone' in destinatario_class.__dict__.keys():
                            cliente.endereco_telefone=destinatario_class.telefone
                    elif str(destinatario_class.tipo_documento)=='CNPJ':
                        cliente=Cliente()
                        cliente.razao_social=destinatario_class.razao
                        cliente.tipo_documento=destinatario_class.tipo_documento #VALOR OBRIGATORIO
                        cliente.numero_documento=destinatario_class.numero_documento
                        cliente.endereco_numero=destinatario_class.endereco_numero
                        cliente.endereco_bairro=destinatario_class.bairro
                        cliente.endereco_uf=destinatario_class.uf
                        cliente.endereco_municipio=destinatario_class.municipio
                        cliente.endereco_pais=destinatario_class.pais if 'pais' in destinatario_class.__dict__.keys() else CODIGO_BRASIL

                        if 'email' in destinatario_class.__dict__.keys():
                            cliente.email=destinatario_class.email
                        if 'indicador_ie' in destinatario_class.__dict__.keys():
                            cliente.indicador_ie=destinatario_class.indicador_ie
                        if 'endereco_complemento' in destinatario_class.__dict__.keys():
                            cliente.endereco_complemento=destinatario_class.endereco_complemento
                        if 'endereco_cep' in destinatario_class.__dict__.keys():
                            cliente.endereco_cep=destinatario_class.endereco_cep
                        if 'telefone' in destinatario_class.__dict__.keys():
                            cliente.endereco_telefone=destinatario_class.telefone 
                    elif str(destinatario_class.tipo_documento)=='CPF':
                        cliente=Cliente()
                        cliente.razao_social=destinatario_class.razao
                        cliente.tipo_documento=destinatario_class.tipo_documento #VALOR OBRIGATORIO
                        cliente.numero_documento=destinatario_class.numero_documento
                        cliente.endereco_numero=destinatario_class.endereco_numero
                        cliente.endereco_bairro=destinatario_class.bairro
                        cliente.endereco_uf=destinatario_class.uf
                        cliente.endereco_municipio=destinatario_class.municipio
                        cliente.endereco_pais=destinatario_class.pais if 'pais' in destinatario_class.__dict__.keys() else CODIGO_BRASIL

                        if 'email' in destinatario_class.__dict__.keys():
                            cliente.email=destinatario_class.email
                        if 'indicador_ie' in destinatario_class.__dict__.keys():
                            cliente.indicador_ie=destinatario_class.indicador_ie
                        if 'endereco_complemento' in destinatario_class.__dict__.keys():
                            cliente.endereco_complemento=destinatario_class.endereco_complemento
                        if 'endereco_cep' in destinatario_class.__dict__.keys():
                            cliente.endereco_cep=destinatario_class.endereco_cep
                        if 'telefone' in destinatario_class.__dict__.keys():
                            cliente.endereco_telefone=destinatario_class.telefone
                    else:
                        cliente=Cliente()
                        cliente.razao_social=destinatario_class.razao
                        cliente.tipo_documento='idEstrangeiro' #VALOR OBRIGATORIO
                        cliente.endereco_numero=destinatario_class.endereco_numero
                        cliente.endereco_bairro=destinatario_class.bairro
                        cliente.endereco_uf=destinatario_class.uf
                        cliente.endereco_municipio=destinatario_class.municipio
                        cliente.endereco_pais=destinatario_class.pais if 'pais' in destinatario_class.__dict__.keys() else 'EX'
                        cliente.numero_documento=destinatario_class.numero_documento if 'numero_documento' in destinatario_class.__dict__.keys() else '12345'
                        
                        if 'email' in destinatario_class.__dict__.keys():
                            cliente.email=destinatario_class.email
                        if 'indicador_ie' in destinatario_class.__dict__.keys():
                            cliente.indicador_ie=destinatario_class.indicador_ie
                        if 'endereco_complemento' in destinatario_class.__dict__.keys():
                            cliente.endereco_complemento=destinatario_class.endereco_complemento
                        if 'endereco_cep' in destinatario_class.__dict__.keys():
                            cliente.endereco_cep=destinatario_class.endereco_cep
                        if 'telefone' in destinatario_class.__dict__.keys():
                            cliente.endereco_telefone=destinatario_class.telefone 
                    print('DADOS CLIENTE VALIDADO!')
                except Exception as e:
                    #ERRO 1.7
                    print(f'RETORNANDO ERRO CLIENTE: {e}')
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a', encoding='utf-8') as erro:erro.write(f'Erro cod:3, ERRO AO RETORNAR CLIENTE: {nota_info.chave} {e}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.7,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'❌ cod:1.7 ERRO NA ESTRTUTURAÇÃO: Cliente {e}'

                try:
                    print(f'REQUESTE ETAPA NOTA FISCAL')
                    nota_fiscal=NotaFiscal(
                        emitente=emitente,
                        cliente=cliente,
                        uf=uf,
                        modelo=55,
                        natureza_operacao=nota_info.natureza_operacao,
                        serie=nota_info.serie,
                        numero_nf=nota_info.numero_nf,
                        data_emissao=datetime.strptime(nota_info.data_emissao, "%d/%m/%Y %H:%M:%S%z"),
                        tipo_documento=int(nota_info.tipo_documento),
                        municipio=emissor_class.municipio_ocorrencia,
                        forma_emissao=nota_info.forma_emissao,
                        cliente_final=int(nota_info.cliente_final),
                        indicador_destino=int(nota_info.destino_operacao),
                        indicador_presencial=int(nota_info.indicador_presencial),
                        finalidade_emissao=nota_info.finalidade_emissao,
                        processo_emissao=nota_info.processo_emissao,
                        forma_pagamento=int(nota_info.forma_pagamento) if 'forma_pagamento' in nota_info.__dict__.keys() else 2,
                        tipo_pagamento=int(nota_info.tipo_pagamento) if 'tipo_pagamento' in nota_info.__dict__.keys() else 99,
                        tipo_impressao_danfe=int(nota_info.danfe_impressao),
                        transporte_modalidade_frete=int(nota_info.transporte_modalidade_frete),
                        informacoes_adicionais_interesse_fisco=nota_info.informacoes_adicionais_interesse_fisco if 'informacoes_adicionais_interesse_fisco' in nota_info.__dict__.keys() else 'Sem Informações',
                        totais_tributos_aproximado=Decimal(nota_info.totais_tributos_aproximado) if 'totais_tributos_aproximado' in nota_info.__dict__.keys() else 0,
                        totais_icms_total_nota=Decimal(nota_info.total_nota) if "total_nota" in nota_info.__dict__.keys() else 0
                        ),
                    print('DADOS DA NOTA VALIDADO!')
                except Exception as e:
                    #ERRO 1.8
                    print(f'RETORNANDO ERRO DA NOTA: {e}')
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a', encoding='utf-8') as erro:erro.write(f'Erro cod:5, ERRO AO RETORNAR INFO NOTA FISCAL: {e}, CHAVE:{nota_info.chave}\n')
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":1.8,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    return f'❌ cod:1.8 ERRO NA ESTRUTURAÇÂO: Nota Fiscal {e}'
                
                try:
                    print('REQUESTE ETAPA PRODUTOS')
                    NOTA_FOUND_ERROR=None
                    MODALIDADE_ICMS=['00','02','10','15','20','30','40','41','50','51','53','60','61','70','90','101','102','103','300','400','201','202','203','500','900']
                    print(f'NOTA EM PROCESSO: {DADOS_PARA_XML['chave']}')
                    
                    for ind, v in enumerate(DADOS_PARA_XML['produtos_v1']):
                        for k in DADOS_PARA_XML['produtos_v1'][ind].keys():
                            if str(k)[:15]=='ICMS-MODALIDADE' and str(DADOS_PARA_XML['produtos_v1'][ind][k]) in MODALIDADE_ICMS:
                                print(f'MODALIDADE EM CATCH {k}:{DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                try:
                                    NOTA_FOUND_ERROR=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto']
                                    print(f"{DADOS_PARA_XML['produtos_v1'][ind]["valor_do_desconto"]}")
                                    match str(DADOS_PARA_XML['produtos_v1'][ind][k]):
                                        # 00 - Tributado integralmente
                                        case '00':
                                            print( 'SUCCESS COD_ICMS: 00')
                                            #LOG DO PRIMEIRO PRODUTO
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            
                                            #OK
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    NotaFiscal().adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_icms_normal'],
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal']!='' else 0,
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                        #FCP
                                                        fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')),
                                                        fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')),

                                                    )
                                                else:
                                                    NotaFiscal().adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total

                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_icms_normal'],
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal']!='' else 0,
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        #FCP
                                                        fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')),
                                                        fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')),

                                                    )
                                            except Exception as e:
                                                print(f"Error icms-00 -> {e}")
                                                continue
                                        # 02 - Tributação monofásica própria sobre combustiveis
                                        case '02':
                                            #OK
                                            if retornar_path(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                                print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                with open(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            
                                            return 'Error COD_ICMS:0.0,  02'
                                            
                                            # nota_fiscal.adicionar_produto_servico(
                                            #     codigo=DADOS_PARA_XML['produtos'][f'{v}']['codigo'], #VALOR OBRIGATORIO
                                            #     descricao=DADOS_PARA_XML['produtos'][f'{v}']['descricao'], #VALOR OBRIGATORIO
                                            #     cfop=DADOS_PARA_XML['produtos'][f'{v}']['cfop'], #VALOR OBRIGATORIO
                                            #     unidade_comercial=DADOS_PARA_XML['produtos'][f'{v}']['unidade_comercial'], #VALOR OBRIGATORIO
                                            #     quantidade_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_comercial']), #VALOR OBRIGATORIO
                                            #     valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_comercial']), #VALOR OBRIGATORIO
                                            #     unidade_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['unidade_tributavel'], #VALOR OBRIGATORIO
                                            #     quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_total_bruto=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']!='' else 0, #VALOR OBRIGATORIO
                                            #     numero_pedido=DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido'] if DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido']!='' else False,  
                                            #     numero_item=DADOS_PARA_XML['produtos'][f'{v}']['numero_item']if DADOS_PARA_XML['produtos'][f'{v}']['numero_item']!='' else False,  
                                            #     ean=DADOS_PARA_XML['produtos'][f'{v}']['ean'] if DADOS_PARA_XML['produtos'][f'{v}']['ean']!='' else False, 
                                            #     ean_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel'] if DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel']!='' else False, 
                                            #     ind_total=int(DADOS_PARA_XML['produtos'][f'{v}']['ind_total']), #VALOR OBRIGATORIO
                                            #     ncm=DADOS_PARA_XML['produtos'][f'{v}']['ncm'], #VALOR OBRIGATORIO
                                            #     valor_tributos_aprox=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']!='' else 0, #VALOR OBRIGATORIO 
                                                
                                            #     #PIS
                                            #     pis_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['pis_modalidade'], #VALOR OBRIGATORIO
                                            #     pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']!='' else False, 
                                            #     pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']!='' else False, 
                                            #     pis_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']!='' else False,
                                                
                                            #     #COFINS
                                            #     cofins_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['cofins_modalidade'], #VALOR OBRIGATORIO
                                            #     cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']!='' else False, 
                                            #     cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']!='' else False, 
                                            #     cofins_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']!='' else False, 
                                                
                                            #     #ICMS MODALIDADE
                                            #     icms_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade'], #VALOR OBRIGATORIO
                                            #     icms_origem=DADOS_PARA_XML['produtos'][f'{v}']['icms_origem'], #VALOR OBRIGATORIO
                                            #     icms_q_bc_mono=Decimal(),
                                            #     icms_ad_rem_icms=Decimal(),
                                            #     icms_v_icms_mono=Decimal(),

                                            #     #IPI
                                            #     ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']!='' else False,
                                            #     ipi_classe_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']!='' else False,
                                            #     ipi_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']!='' else False,
                                            #     ipi_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']!='' else False, 
                                            #     ipi_valor_ipi=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']!='' else False,
                                                
                                            #     )
                                            # print('')
                                        # 10 - Tributado e com cobrança do ICMS via ST
                                        case '10':
                                            #OK
                                            print( 'SUCCESS COD_ICMS: 10')
                                            try:
                                                # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                                #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                #with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal']!='' else 0,
                                                        icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_icms_normal'],
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # ICMS ST
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_st']!='' else 0, 
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_st']!='' else 0, 
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else 0, 
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st']!='' else 0,
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_mva_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_mva_do_icms_st']!='' else 0, 
                                                        icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_icms_st']),
                                                        
                                                        #FCP
                                                        fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp']!='' else 0,
                                                        fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp']!='' else 0,
                                                        fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp']!='' else 0,
                                                        
                                                        #FCP ST
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        
                                                        #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']),
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        

                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                    codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                    descricao=DADOS_PARA_XML['produtos_v1'][ind]['descricao'],
                                                    ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                    #cest='0100100',                            # NT2015/003
                                                    cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                    unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                    ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                    ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                    quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                    valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                    valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                    unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                    quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                    valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                    ind_total=1,

                                                    # numero_pedido='12345',                   # xPed
                                                    # numero_item='123456',                    # nItemPed
                                                    
                                                    #ICMS
                                                    icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                    icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                    icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_normal']!='' else 0,
                                                    icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_normal']!='' else 0, 
                                                    icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_normal']!='' else 0,
                                                    #icms_csosn='400',
                                                    
                                                    pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                    pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                    
                                                    cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                    cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                    valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                    
                                                    # ICMS ST
                                                    icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo_do_icms_st']!='' else 0, 
                                                    icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_st']!='' else 0, 
                                                    icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else 0, 
                                                    icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st']!='' else 0,
                                                    icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_mva_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_mva_do_icms_st']!='' else 0, 
                                                    icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_icms_st']),
                                                    
                                                    #FCP
                                                    fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp']!='' else 0,
                                                    fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp']!='' else 0,
                                                    fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp']!='' else 0,
                                                    
                                                    #FCP ST
                                                    fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                    fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                    fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                    
                                                )
                                            except Exception as e:
                                                print(f"Error icms-10 -> {e}")
                                                continue
                                        # 15 - Tributação monofásica própria e com responsabildade pela retenção de combustiveis 
                                        case '15':
                                            #OK
                                            if retornar_path(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                                print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                with open(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            
                                            
                                            return 'Error COD_ICMS:0.0,  15'
                                            # nota_fiscal.adicionar_produto_servico(
                                            #     codigo=DADOS_PARA_XML['produtos'][f'{v}']['codigo'], #VALOR OBRIGATORIO
                                            #     descricao=DADOS_PARA_XML['produtos'][f'{v}']['descricao'], #VALOR OBRIGATORIO
                                            #     cfop=DADOS_PARA_XML['produtos'][f'{v}']['cfop'], #VALOR OBRIGATORIO
                                            #     unidade_comercial=DADOS_PARA_XML['produtos'][f'{v}']['unidade_comercial'], #VALOR OBRIGATORIO
                                            #     quantidade_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_comercial']), #VALOR OBRIGATORIO
                                            #     valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_comercial']), #VALOR OBRIGATORIO
                                            #     unidade_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['unidade_tributavel'], #VALOR OBRIGATORIO
                                            #     quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_total_bruto=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']!='' else 0, #VALOR OBRIGATORIO
                                            #     numero_pedido=DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido'] if DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido']!='' else False,  
                                            #     numero_item=DADOS_PARA_XML['produtos'][f'{v}']['numero_item']if DADOS_PARA_XML['produtos'][f'{v}']['numero_item']!='' else False,  
                                            #     ean=DADOS_PARA_XML['produtos'][f'{v}']['ean'] if DADOS_PARA_XML['produtos'][f'{v}']['ean']!='' else False, 
                                            #     ean_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel'] if DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel']!='' else False, 
                                            #     ind_total=int(DADOS_PARA_XML['produtos'][f'{v}']['ind_total']), #VALOR OBRIGATORIO
                                            #     ncm=DADOS_PARA_XML['produtos'][f'{v}']['ncm'], #VALOR OBRIGATORIO
                                            #     valor_tributos_aprox=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']!='' else 0, #VALOR OBRIGATORIO 
                                                
                                            #     #PIS
                                            #     pis_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['pis_modalidade'], #VALOR OBRIGATORIO
                                            #     pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']!='' else False, 
                                            #     pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']!='' else False, 
                                            #     pis_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']!='' else False,
                                                
                                            #     #COFINS
                                            #     cofins_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['cofins_modalidade'], #VALOR OBRIGATORIO
                                            #     cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']!='' else False, 
                                            #     cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']!='' else False, 
                                            #     cofins_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']!='' else False, 
                                                
                                            #     #ICMS MODALIDADE
                                            #     icms_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade'], #VALOR OBRIGATORIO
                                            #     icms_origem=DADOS_PARA_XML['produtos'][f'{v}']['icms_origem'], #VALOR OBRIGATORIO
                                            #     #ICMS MONOFASICO
                                            #     icms_q_bc_mono=Decimal(),
                                            #     icms_ad_rem_icms=Decimal(),
                                            #     icms_v_icms_mono=Decimal(),
                                            #     icms_q_bc_mono_reten=Decimal(),
                                            #     icms_ad_rem_icms_reten=Decimal(),
                                            #     icms_v_icms_mono_reten=Decimal(),
                                            #     icms_p_red_ad_rem=Decimal(),
                                            #     icms_mot_red_ad_rem=Decimal(),
                                                
                                            #     #IPI
                                            #     ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']!='' else False,
                                            #     ipi_classe_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']!='' else False,
                                            #     ipi_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']!='' else False,
                                            #     ipi_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']!='' else False, 
                                            #     ipi_valor_ipi=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']!='' else False,
                                                
                                            # )
                                            # print('')
                                        # 20 - Com redução de base de calculo
                                        case '20':
                                            #OK
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                            codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                            descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                            ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                            #cest='0100100',                            # NT2015/003
                                                            cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                            unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                            ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                            ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                            quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                            valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                            valor_total_bruto=DADOS_PARA_XML['produtos_v1'][ind]['total_bruto'],       # preço total
                                                            unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                            quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                            valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                            ind_total=1,

                                                            # numero_pedido='12345',                   # xPed
                                                            # numero_item='123456',                    # nItemPed
                                                            
                                                            #ICMS
                                                            icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                            icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                            icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_do_icms'],
                                                            icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo']!='' else 0,
                                                            icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota']!='' else 0, 
                                                            icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor']!='' else 0,
                                                            icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal'],'real')),
                                                            #icms_csosn='400',
                                                            icms_desonerado=int(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'], 'real')),
                                                            icms_motivo_desoneracao=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-motivo_desoneracao_icms'],

                                                            pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                            pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                            cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                            
                                                            # IPI
                                                            ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                            ipi_classe_enquadramento='999',
                                                            ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                            ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                            ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                            
                                                            #FCP
                                                            fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')),
                                                            fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')),
                                                            fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem'))

                                                        )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                            codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                            descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                            ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                            #cest='0100100',                            # NT2015/003
                                                            cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                            unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                            ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                            ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                            quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                            valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                            valor_total_bruto=DADOS_PARA_XML['produtos_v1'][ind]['total_bruto'],       # preço total
                                                            unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                            quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                            valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                            ind_total=1,

                                                            # numero_pedido='12345',                   # xPed
                                                            # numero_item='123456',                    # nItemPed
                                                            
                                                            #ICMS
                                                            icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                            icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                            icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_definicao_da_bc_do_icms'],
                                                            icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo']!='' else 0,
                                                            icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota']!='' else 0, 
                                                            icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor']!='' else 0,
                                                            icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal'],'real')),
                                                            #icms_csosn='400',
                                                            icms_desonerado=int(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'],'real')),
                                                            icms_motivo_desoneracao=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-motivo_desoneracao_icms'],

                                                            pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                            pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                            cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                            
                                                            #FCP
                                                            fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')),
                                                            fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')),
                                                            fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem'))

                                                        )
                                            except Exception as e:
                                                print(f'Error ICMS20 -> {e}')
                                                continue

                                            # print('')
                                        # 30 - Isenta não cobrado e com icms por substituição tributada
                                        case '30':
                                            #OK
                                            if retornar_path(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                                print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                with open(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            
                                            return 'Error COD_ICMS:0.0,  30'
                                            # nota_fiscal.adicionar_produto_servico(
                                            #     codigo=DADOS_PARA_XML['produtos'][f'{v}']['codigo'], #VALOR OBRIGATORIO
                                            #     descricao=DADOS_PARA_XML['produtos'][f'{v}']['descricao'], #VALOR OBRIGATORIO
                                            #     cfop=DADOS_PARA_XML['produtos'][f'{v}']['cfop'], #VALOR OBRIGATORIO
                                            #     unidade_comercial=DADOS_PARA_XML['produtos'][f'{v}']['unidade_comercial'], #VALOR OBRIGATORIO
                                            #     quantidade_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_comercial']), #VALOR OBRIGATORIO
                                            #     valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_comercial']), #VALOR OBRIGATORIO
                                            #     unidade_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['unidade_tributavel'], #VALOR OBRIGATORIO
                                            #     quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_total_bruto=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']!='' else 0, #VALOR OBRIGATORIO
                                            #     numero_pedido=DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido'] if DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido']!='' else False,  
                                            #     numero_item=DADOS_PARA_XML['produtos'][f'{v}']['numero_item']if DADOS_PARA_XML['produtos'][f'{v}']['numero_item']!='' else False,  
                                            #     ean=DADOS_PARA_XML['produtos'][f'{v}']['ean'] if DADOS_PARA_XML['produtos'][f'{v}']['ean']!='' else False, 
                                            #     ean_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel'] if DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel']!='' else False, 
                                            #     ind_total=int(DADOS_PARA_XML['produtos'][f'{v}']['ind_total']), #VALOR OBRIGATORIO
                                            #     ncm=DADOS_PARA_XML['produtos'][f'{v}']['ncm'], #VALOR OBRIGATORIO
                                            #     valor_tributos_aprox=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']!='' else 0, #VALOR OBRIGATORIO 
                                                
                                            #     #PIS
                                            #     pis_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['pis_modalidade'], #VALOR OBRIGATORIO
                                            #     pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']!='' else False, 
                                            #     pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']!='' else False, 
                                            #     pis_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']!='' else False,
                                                
                                            #     #COFINS
                                            #     cofins_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['cofins_modalidade'], #VALOR OBRIGATORIO
                                            #     cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']!='' else False, 
                                            #     cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']!='' else False, 
                                            #     cofins_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']!='' else False, 
                                                
                                            #     #ICMS MODALIDADE
                                            #     icms_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade'], #VALOR OBRIGATORIO
                                            #     icms_origem=DADOS_PARA_XML['produtos'][f'{v}']['icms_origem'], #VALOR OBRIGATORIO
                                            #     icms_desonerado=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_desonerado']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_desonerado']!='' else False, 
                                            #     icms_motivo_desoneracao=int(),
                                                
                                            #     # ICMS ST
                                            #     icms_st_modalidade_determinacao_bc=int(),
                                            #     icms_st_percentual_adicional=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_st_percentual_adicional']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_st_percentual_adicional']!='' else False, 
                                            #     icms_st_percentual_reducao_bc=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_st_percentual_reducao_bc']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_st_percentual_reducao_bc']!='' else False,
                                            #     icms_st_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_st_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_st_valor_base_calculo']!='' else False, 
                                            #     icms_st_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_st_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_st_aliquota']!='' else False, 
                                            #     icms_st_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_st_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_st_valor']!='' else False, 

                                            #     #FCP ST
                                            #     fcp_st_valor=Decimal(),
                                            #     fcp_st_base_calclo=Decimal(),
                                            #     fcp_aliquota=Decimal(),
                                                
                                            #     #IPI
                                            #     ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']!='' else False,
                                            #     ipi_classe_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']!='' else False,
                                            #     ipi_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']!='' else False,
                                            #     ipi_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']!='' else False, 
                                            #     ipi_valor_ipi=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']!='' else False,
                                            # )
                                            # print('')
                                        # 40 - Isenta / 41 - Não tributado / 50 - Com suspensão  
                                        case '40'|'41'|'50':
                                            #OK
                                            print('MODALIDADE COD_ICMS: 40,41,50!')

                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        
                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                    )
                                            except Exception as e:
                                                print(f"ERROR icms-40-41-50 -> {e}")
                                                continue
                                        # 51 - Com diferimento
                                        case '51':
                                            #OK
                                            if retornar_path(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                                print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                with open(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            
                                            
                                            return 'Error COD_ICMS:0.0,  51'
                                            # nota_fiscal.adicionar_produto_servico(
                                            #     codigo=DADOS_PARA_XML['produtos'][f'{v}']['codigo'], #VALOR OBRIGATORIO
                                            #     descricao=DADOS_PARA_XML['produtos'][f'{v}']['descricao'], #VALOR OBRIGATORIO
                                            #     cfop=DADOS_PARA_XML['produtos'][f'{v}']['cfop'], #VALOR OBRIGATORIO
                                            #     unidade_comercial=DADOS_PARA_XML['produtos'][f'{v}']['unidade_comercial'], #VALOR OBRIGATORIO
                                            #     quantidade_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_comercial']), #VALOR OBRIGATORIO
                                            #     valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_comercial']), #VALOR OBRIGATORIO
                                            #     unidade_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['unidade_tributavel'], #VALOR OBRIGATORIO
                                            #     quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_total_bruto=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']!='' else 0, #VALOR OBRIGATORIO
                                            #     numero_pedido=DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido'] if DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido']!='' else False,  
                                            #     numero_item=DADOS_PARA_XML['produtos'][f'{v}']['numero_item']if DADOS_PARA_XML['produtos'][f'{v}']['numero_item']!='' else False,  
                                            #     ean=DADOS_PARA_XML['produtos'][f'{v}']['ean'] if DADOS_PARA_XML['produtos'][f'{v}']['ean']!='' else False, 
                                            #     ean_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel'] if DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel']!='' else False, 
                                            #     ind_total=int(DADOS_PARA_XML['produtos'][f'{v}']['ind_total']), #VALOR OBRIGATORIO
                                            #     ncm=DADOS_PARA_XML['produtos'][f'{v}']['ncm'], #VALOR OBRIGATORIO
                                            #     valor_tributos_aprox=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']!='' else 0, #VALOR OBRIGATORIO 
                                                
                                            #     #PIS
                                            #     pis_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['pis_modalidade'], #VALOR OBRIGATORIO
                                            #     pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']!='' else False, 
                                            #     pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']!='' else False, 
                                            #     pis_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']!='' else False,
                                                
                                            #     #COFINS
                                            #     cofins_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['cofins_modalidade'], #VALOR OBRIGATORIO
                                            #     cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']!='' else False, 
                                            #     cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']!='' else False, 
                                            #     cofins_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']!='' else False, 
                                                
                                            #     #ICMS MODALIDADE
                                            #     icms_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade'], #VALOR OBRIGATORIO
                                            #     icms_origem=DADOS_PARA_XML['produtos'][f'{v}']['icms_origem'], #VALOR OBRIGATORIO
                                            #     icms_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade_determinacao_bc']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade_determinacao_bc']!='' else False,  
                                                
                                            #     #FCP
                                            #     fcp_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['fcp_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['fcp_valor']!='' else False,
                                            #     fcp_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['fcp_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['fcp_base_calculo']!='' else False,
                                            #     fcp_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['fcp_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['fcp_aliquota']!='' else False,
                                                
                                            #     #IPI
                                            #     ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']!='' else False,
                                            #     ipi_classe_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']!='' else False,
                                            #     ipi_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']!='' else False,
                                            #     ipi_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']!='' else False, 
                                            #     ipi_valor_ipi=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']!='' else False,
                                            # )
                                            # print('')
                                        # 53 - Tributação monofásica sobre combustiveis com recolhimento diferido
                                        case '53':
                                            #OK
                                            if retornar_path(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                                print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                with open(f'{pasta_bots}/nfe_extrator_erros/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            
                                            
                                            return 'Error COD_ICMS:0.0,  53'
                                            # nota_fiscal.adicionar_produto_servico(
                                            #     codigo=DADOS_PARA_XML['produtos'][f'{v}']['codigo'], #VALOR OBRIGATORIO
                                            #     descricao=DADOS_PARA_XML['produtos'][f'{v}']['descricao'], #VALOR OBRIGATORIO
                                            #     cfop=DADOS_PARA_XML['produtos'][f'{v}']['cfop'], #VALOR OBRIGATORIO
                                            #     unidade_comercial=DADOS_PARA_XML['produtos'][f'{v}']['unidade_comercial'], #VALOR OBRIGATORIO
                                            #     quantidade_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_comercial']), #VALOR OBRIGATORIO
                                            #     valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_comercial']), #VALOR OBRIGATORIO
                                            #     unidade_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['unidade_tributavel'], #VALOR OBRIGATORIO
                                            #     quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['quantidade_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_unitario_tributavel']), #VALOR OBRIGATORIO
                                            #     valor_total_bruto=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_total_bruto']!='' else 0, #VALOR OBRIGATORIO
                                            #     numero_pedido=DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido'] if DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido']!='' else False,  
                                            #     numero_item=DADOS_PARA_XML['produtos'][f'{v}']['numero_item']if DADOS_PARA_XML['produtos'][f'{v}']['numero_item']!='' else False,  
                                            #     ean=DADOS_PARA_XML['produtos'][f'{v}']['ean'] if DADOS_PARA_XML['produtos'][f'{v}']['ean']!='' else False, 
                                            #     ean_tributavel=DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel'] if DADOS_PARA_XML['produtos'][f'{v}']['ean_tributavel']!='' else False, 
                                            #     ind_total=int(DADOS_PARA_XML['produtos'][f'{v}']['ind_total']), #VALOR OBRIGATORIO
                                            #     ncm=DADOS_PARA_XML['produtos'][f'{v}']['ncm'], #VALOR OBRIGATORIO
                                            #     valor_tributos_aprox=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']) if DADOS_PARA_XML['produtos'][f'{v}']['valor_tributos_aprox']!='' else 0, #VALOR OBRIGATORIO 
                                                
                                            #     #PIS
                                            #     pis_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['pis_modalidade'], #VALOR OBRIGATORIO
                                            #     pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor_base_calculo']!='' else False, 
                                            #     pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_aliquota_percentual']!='' else False, 
                                            #     pis_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['pis_valor']!='' else False,
                                                
                                            #     #COFINS
                                            #     cofins_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['cofins_modalidade'], #VALOR OBRIGATORIO
                                            #     cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor_base_calculo']!='' else False, 
                                            #     cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_aliquota_percentual']!='' else False, 
                                            #     cofins_valor=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']) if DADOS_PARA_XML['produtos'][f'{v}']['cofins_valor']!='' else False, 
                                                
                                            #     #ICMS MODALIDADE
                                            #     icms_modalidade=DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade'], #VALOR OBRIGATORIO
                                            #     icms_origem=DADOS_PARA_XML['produtos'][f'{v}']['icms_origem'], #VALOR OBRIGATORIO
                                                
                                            #     #ICMS MONOFASICO
                                            #     icms_q_bc_mono=Decimal(),
                                            #     icms_ad_rem_icms=Decimal(),
                                            #     icms_v_icms_mono_op=Decimal(),
                                            #     icms_p_dif=Decimal(),
                                            #     icms_v_icms_mono_dif=Decimal(),
                                            #     icms_v_icms_mono=Decimal(),

                                            #     #IPI
                                            #     ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_situacao_tributaria']!='' else False,
                                            #     ipi_classe_enquadramento=str(DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_codigo_enquadramento']!='' else False,
                                            #     ipi_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_base_calculo']!='' else False,
                                            #     ipi_aliquota=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_aliquota']!='' else False, 
                                            #     ipi_valor_ipi=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']) if DADOS_PARA_XML['produtos'][f'{v}']['ipi_valor_ipi']!='' else False,
                                                
                                            # )
                                            # print('')
                                        # 60 ICMS cobrado anteriormente por ST
                                        case '60':
                                            #OK
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                                #with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            print('MODALIDADE COD_ICMS: 60,ST')
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys(): 
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_efetiva'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_efetiva']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_efetiva'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_efetiva']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_efetivo'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_efetivo']!='' else 0,
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                        #ICMS ST RET
                                                        icms_st_ret_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st_retido'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st_retido']!='' else 0,
                                                        icms_st_ret_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st_retido'],'real')),
                                                        icms_st_ret_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_suportada_pelo_consumidor_final'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_anteriormente_por_substituicao_tributaria']!='' else 0,
                                                        icms_st_proprio=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_proprio_do_substituto'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_proprio_do_substituto']!='' else 0,

                                                        # #FCP ST RET
                                                        fcp_st_ret_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        fcp_st_ret_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_anteriormente_por_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_anteriormente_por_st']!='' else 0, 
                                                        fcp_st_ret_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_anteriormente_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_anteriormente_por_substituicao_tributaria']!='' else 0, 
                                                        
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                    codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                    descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                    ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                    #cest='0100100',                            # NT2015/003
                                                    cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                    unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                    ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                    ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                    quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                    valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                    valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                    unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                    quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                    valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                    ind_total=1,

                                                    # numero_pedido='12345',                   # xPed
                                                    # numero_item='123456',                    # nItemPed
                                                    
                                                    #ICMS
                                                    icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                    icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                    icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_efetiva'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_efetiva']!='' else 0,
                                                    icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_efetiva'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_icms_efetiva']!='' else 0, 
                                                    icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_efetivo'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_efetivo']!='' else 0,
                                                    #icms_csosn='400',
                                                    
                                                    pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                    pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                    
                                                    cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                    cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                    
                                                    valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                    
                                                    #ICMS ST RET
                                                    icms_st_ret_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st_retido'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st_retido']!='' else 0,
                                                    icms_st_ret_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st_retido'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st_retido']!='' else 0,
                                                    icms_st_ret_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_suportada_pelo_consumidor_final'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_anteriormente_por_substituicao_tributaria']!='' else 0,
                                                    icms_st_proprio=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_proprio_do_substituto'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_proprio_do_substituto']!='' else 0,

                                                    # #FCP ST RET
                                                    fcp_st_ret_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                    fcp_st_ret_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_anteriormente_por_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_anteriormente_por_st']!='' else 0, 
                                                    fcp_st_ret_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_anteriormente_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_anteriormente_por_substituicao_tributaria']!='' else 0, 
                                                    
                                                    
                                                    # numero_pedido=DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido'] if DADOS_PARA_XML['produtos'][f'{v}']['numero_pedido']!='' else False,  
                                                    # numero_item=DADOS_PARA_XML['produtos'][f'{v}']['numero_item']if DADOS_PARA_XML['produtos'][f'{v}']['numero_item']!='' else False,  
                                                        
                                                    # icms_csosn=DADOS_PARA_XML['produtos'][f'{v}']['icms_csosn'] if  DADOS_PARA_XML['produtos'][f'{v}']['icms_csosn']!='' else '', 
                                                    # icms_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade_determinacao_bc']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_modalidade_determinacao_bc']!='' else False,  
                                                    # icms_credito=Decimal(DADOS_PARA_XML['produtos'][f'{v}']['icms_credito']) if DADOS_PARA_XML['produtos'][f'{v}']['icms_valor']=='' and DADOS_PARA_XML['produtos'][f'{v}']['icms_credito']!='' else False,

                                                )
                                            except Exception as e:
                                                print(f"Error icms-60-ST -> {e}")
                                                continue
                                        # 61 - Tributação monofásica sobre combustiveis cobrada anteriormente
                                        case '61':
                                            #OK
                                            print('ICMS MODALIDADE COD_ICMS: 61')
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys(): 
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        #icms_csosn='400',
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                        #ICMS RET
                                                        icms_q_bc_mono_ret=formatar_valor(DADOS_PARA_XML['ICMS-MODALIDADE-quantidade_tributada_retida_anteriormente'], 'real') if DADOS_PARA_XML['ICMS-MODALIDADE-quantidade_tributada_retida_anteriormente']!='' else 0,
                                                        icms_ad_rem_icms_ret=Decimal(formatar_valor(DADOS_PARA_XML['ICMS-AL-aliquota_ad_rem_do_imposto_retido_anteriormente'], 'porcentagem')) if DADOS_PARA_XML['ICMS-AL-aliquota_ad_rem_do_imposto_retido_anteriormente']!='' else 0,
                                                        icms_v_icms_mono_ret=Decimal(formatar_valor(DADOS_PARA_XML['ICMS-V-valor_do_icms_retido_anteriormente'],'real')) if DADOS_PARA_XML['ICMS-V-valor_do_icms_retido_anteriormente']!=''else 0
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                    codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                    descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                    ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                    #cest='0100100',                            # NT2015/003
                                                    cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                    unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                    ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                    ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                    quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                    valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                    valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                    unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                    quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                    valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                    ind_total=1,

                                                    # numero_pedido='12345',                   # xPed
                                                    # numero_item='123456',                    # nItemPed
                                                    
                                                    #ICMS
                                                    icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                    icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                    
                                                    pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                    pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                    
                                                    cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                    cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                    cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                    valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                    
                                                    #ICMS RET
                                                    icms_q_bc_mono_ret=formatar_valor(DADOS_PARA_XML['ICMS-MODALIDADE-quantidade_tributada_retida_anteriormente'], 'real') if DADOS_PARA_XML['ICMS-MODALIDADE-quantidade_tributada_retida_anteriormente']!='' else 0,
                                                    icms_ad_rem_icms_ret=Decimal(formatar_valor(DADOS_PARA_XML['ICMS-AL-aliquota_ad_rem_do_imposto_retido_anteriormente'], 'porcentagem')) if DADOS_PARA_XML['ICMS-AL-aliquota_ad_rem_do_imposto_retido_anteriormente']!='' else 0,
                                                    icms_v_icms_mono_ret=Decimal(formatar_valor(DADOS_PARA_XML['ICMS-V-valor_do_icms_retido_anteriormente'],'real')) if Decimal(DADOS_PARA_XML['ICMS-V-valor_do_icms_retido_anteriormente'])!=''else 0

                                                )
                                            except Exception as e:
                                                print(f"Error icms-61 -> {e}")
                                                continue
                                            # print('')
                                        # 70 - Com redução da BC e cobrança do ICMS por ST
                                        case '70':
                                            #OK
                                            print('ICMS MODALIDADE COD_ICMS: 70')

                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms']!='' else 0,
                                                        icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal']!='' else 0,

                                                        #icms_csosn='400',
                                                        
                                                        # ICMS ST
                                                        icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidadededeterminacaodabcdoicmsst']),
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st']!='' else False,
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st']!='' else False, 
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st']!='' else False, 
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st']!='' else False, 
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else False, 
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC'], 'real')) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL'], 'porcentagem')) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V'], 'real')) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,

                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC'],'real')) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL'],'porcentagem')) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V'],'real')) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],'real')),
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,

                                                        #FCP
                                                        fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                        fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp']!='' else False,
                                                        fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                        #FCP ST
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        #ICMS DESONERADO
                                                        icms_desonerado=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'], 'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'] else 0,
                                                        icms_motivo_desoneracao=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-motivo_desoneracao_icms'])
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                            codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                            descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                            ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                            #cest='0100100',                            # NT2015/003
                                                            cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                            unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                            ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                            ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                            quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                            valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                            valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                            unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                            quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                            valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                            ind_total=1,

                                                            # numero_pedido='12345',                   # xPed
                                                            # numero_item='123456',                    # nItemPed
                                                            
                                                            #ICMS
                                                            icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                            icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                            icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo']!='' else 0,
                                                            icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota']!='' else 0, 
                                                            icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms']!='' else 0,
                                                            icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal']!='' else 0,

                                                            #icms_csosn='400',
                                                            
                                                            # ICMS ST
                                                            icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidadededeterminacaodabcdoicmsst']),
                                                            icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st']!='' else False,
                                                            icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st']!='' else False, 
                                                            icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st']!='' else False, 
                                                            icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st']!='' else False, 
                                                            icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else False, 
                                                        
                                                            pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                            pis_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC'],'real')) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_aliquota_percentual=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL'],'porcentagem')) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V'],'real')) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                            cofins_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC'],'real')) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_aliquota_percentual=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL'],'porcentagem')) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V'],'real')) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                            
                                                            #FCP
                                                            fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                            fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp']!='' else False,
                                                            fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                            #FCP ST
                                                            fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                            fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                            fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                            #ICMS DESONERADO
                                                            icms_desonerado=int(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'] else 0,
                                                            icms_motivo_desoneracao=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-motivo_desoneracao_icms'])

                                                        )
                                            except Exception as e:
                                                print(f'Error ICMS70->{e}')
                                                continue
                                        # 90 - Outras
                                        case '90':
                                            #OK
                                            print('RETORNANDO')
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms']!='' else 0,
                                                        icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal']!='' else 0,

                                                        #icms_csosn='400',
                                                        
                                                        # ICMS ST
                                                        icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidadededeterminacaodabcdoicmsst']),
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st']!='' else False,
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st']!='' else False, 
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st']!='' else False, 
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st']!='' else False, 
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else False, 
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,

                                                        #FCP
                                                        fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                        fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp']!='' else False,
                                                        fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                        
                                                        #FCP ST
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        #ICMS DESONERADO
                                                        icms_desonerado=int(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado']), 'real') if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'] else 0,
                                                        icms_motivo_desoneracao=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-motivo_desoneracao_icms'])

                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-tributacao_do_icms'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-base_de_calculo']!='' else 0,
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota']!='' else 0, 
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms']!='' else 0,
                                                        icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_normal']!='' else 0,

                                                        #icms_csosn='400',
                                                        
                                                        # ICMS ST
                                                        icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidadededeterminacaodabcdoicmsst']),
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc_do_icms_st']!='' else False,
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_mva_do_icms_st']!='' else False, 
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st']!='' else False, 
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_do_icms_st']!='' else False, 
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else False, 
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        #FCP
                                                        fcp_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                        fcp_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp']!='' else False,
                                                        fcp_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fundo_de_combate_a_pobreza_fcp']!='' else False,
                                                        
                                                        #FCP ST
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0,
                                                        #ICMS DESONERADO
                                                        icms_desonerado=int(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado']), 'real') if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_icms_desonerado'] else 0,
                                                        icms_motivo_desoneracao=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-motivo_desoneracao_icms'])

                                                    )
                                            except Exception as e:
                                                print(f"Error icms-90 -> {e}")
                                                continue
                                            # print('')
                                        # 101 - Tributado pelo SN com permissão de crédito
                                        case '101':
                                            #OK
                                            print('MODALIDADE ICMS COD_ICMS: 101')

                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_aplicavel_de_calculo_do_credito'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_aplicavel_de_calculo_do_credito']!='' else 0, 
                                                        icms_credito=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_de_credito_do_icms'],'real')),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_aplicavel_de_calculo_do_credito'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_aplicavel_de_calculo_do_credito']!='' else 0, 
                                                        icms_credito=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_de_credito_do_icms'],'real')),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                    )
                                            except Exception as e:
                                                print(f"Error icms-101 -> {e}")
                                                continue
                                        # 102 - Tributado pelo SN sem permissão de credito
                                        # 103 - Isenção do ICMS SN para faixa de receita bruta
                                        # 300 - Imune
                                        # 400 - Não tributado pelo SN
                                        case '102'|'103'|'300'|'400':
                                            #OK
                                            print('MODALIDADE ICMS COD_ICMS: 102, 103, 300, 400')
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                            descricao=DADOS_PARA_XML['produtos_v1'][ind]['descricao'],
                                                            quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                            unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                            valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                            codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                            ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                            #cest='0100100',                            # NT2015/003
                                                            cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                            ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                            ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                            unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                            quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                            valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                            valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                            ind_total=1,

                                                            # numero_pedido='12345',                   # xPed
                                                            # numero_item='123456',                    # nItemPed
                                                            
                                                            #ICMS
                                                            icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                            icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                            icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                            pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                            pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else 0,
                                                            
                                                            cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                            cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                            cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                            
                                                            valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                            # IPI
                                                            ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']),
                                                            ipi_classe_enquadramento= '999',
                                                            ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                            ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                            ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        descricao=DADOS_PARA_XML['produtos_v1'][ind]['descricao'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao__simples_nacional'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else 0,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,

                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                    
                                                )
                                            except Exception as e:
                                                print(f"Error icms-102-103-300-400 -> {e}")
                                                continue
                                        #201 - com permissão de credito e tributada no icms
                                        #202 - sem permissão de credito e tributada no icms
                                        #203 - isenção do ICMS SN para faixa de receita bruta e com cobrança do ICMS
                                        case '201'|'202'|'203':
                                            #OK
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                        #ICMS ST
                                                        icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_determinacao_bc_do_icms_st']),
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-percentual_margem_valor_adicionado_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-percentual_margem_valor_adicionado_icms_st']!='' else 0,
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st']!='' else 0,
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_bc_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_bc_do_icms_st']!='' else 0,
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_imposto_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_imposto_icms_st']!='' else 0,
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else 0,

                                                        # #FCP ST
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        fcp_st_ret_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        fcp_st_ret_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        #ICMS ST
                                                        icms_st_modalidade_determinacao_bc=int(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_determinacao_bc_do_icms_st']),
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-percentual_margem_valor_adicionado_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-percentual_margem_valor_adicionado_icms_st']!='' else 0,
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_de_bc_do_icms_st']!='' else 0,
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_bc_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_bc_do_icms_st']!='' else 0,
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_imposto_icms_st'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_imposto_icms_st']!='' else 0,
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st']!='' else 0,

                                                        # #FCP ST
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        fcp_st_ret_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        fcp_st_ret_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria']!='' else 0, 
                                                        
                                                    )
                                            except Exception as e:
                                                print(f"Error icms-201-202-203 -> {e}")
                                                continue
                                        #500 - ICMS ST cobrado anteriormente por substituição ou antecipação
                                        case '500':
                                            #OK
                                            print('ICMS MODALIDADE COD_ICMS: 500')

                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                    )
                                            except Exception as e:
                                                print(f"Error icms-500 -> {e}")
                                                continue
                                        # 900 - Outros
                                        case '900':
                                            #OK
                                            # if retornar_path(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','file')!=True :
                                            #     print(f'RETURN LOG MODALIDADE: {DADOS_PARA_XML['produtos_v1'][ind][k]}')
                                            #     with open(f'temp/notas_json_log/log-modalidade-icms-{DADOS_PARA_XML['produtos_v1'][ind][k]}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'][ind],f,indent=4,ensure_ascii=False)
                                            try:
                                                if 'IPI-MODALIDADE' in DADOS_PARA_XML['produtos_v1'][ind].keys():
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_de_determinacao_da_bc_do_icms'],
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms'],'real')),
                                                        icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc'],'porcentagem')),
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto'],'porcentagem')),
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms'],'real')),
                                                        icms_credito=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_de_credito_do_icms'],'real')),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        # #IPI
                                                        ipi_codigo_enquadramento=str(DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-MODALIDADE']!='' else '99',
                                                        ipi_classe_enquadramento='999',
                                                        ipi_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-BC']!='' else 0,
                                                        ipi_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL'],'porcentagem')) if DADOS_PARA_XML['produtos_v1'][ind]['IPI-AL']!='' else 0, 
                                                        ipi_valor_ipi=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI'],'real')) if DADOS_PARA_XML['produtos_v1'][ind]['VALOR-IPI']!='' else 0,
                                                        
                                                        #ICMS ST
                                                        icms_st_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_de_determinacao_da_bc_do_icms_st'],
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-percentual_margem_valor_adicionado_do_icms_st'],'porcentagem')),
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_bc_do_icms_st'],'porcentagem')),
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st'],'real')),
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_st'],'porcentagem')),
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')),
                                                        #FCP
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')),
                                                        fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')),
                                                        fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')),
                                                    )
                                                else:
                                                    nota_fiscal.adicionar_produto_servico(
                                                        codigo=DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto'],                           # id do produto
                                                        descricao=str(DADOS_PARA_XML['produtos_v1'][ind]['descricao']).strip(),
                                                        ncm=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ncm'],
                                                        #cest='0100100',                            # NT2015/003
                                                        cfop=DADOS_PARA_XML['produtos_v1'][ind]['cfop'],
                                                        unidade_comercial=DADOS_PARA_XML['produtos_v1'][ind]['unidade_comercial'],
                                                        ean=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_comercial'],
                                                        ean_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['codigo_ean_tributavel'],
                                                        quantidade_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_comercial']),        # 12 unidades
                                                        valor_unitario_comercial=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_comercializacao']),  # preço unitário
                                                        valor_total_bruto=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['total_bruto']),       # preço total
                                                        unidade_tributavel=DADOS_PARA_XML['produtos_v1'][ind]['unidade_tributavel'],
                                                        quantidade_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['quantidade_tributavel']),
                                                        valor_unitario_tributavel=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['valor_unitario_de_tributacao']),
                                                        ind_total=1,

                                                        # numero_pedido='12345',                   # xPed
                                                        # numero_item='123456',                    # nItemPed
                                                        
                                                        #ICMS
                                                        icms_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        icms_origem=int(DADOS_PARA_XML['produtos_v1'][ind]['origem_da_mercadoria']),
                                                        icms_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_de_determinacao_da_bc_do_icms'],
                                                        icms_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms'],'real')),
                                                        icms_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_da_reducao_de_bc'],'porcentagem')),
                                                        icms_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto'],'porcentagem')),
                                                        icms_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms'],'real')),
                                                        icms_csosn=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-codigo_de_situacao_da_operacao'],
                                                        
                                                        pis_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['PIS-MODALIDADE'],
                                                        pis_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-BC']) if 'PIS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-AL']) if 'PIS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        pis_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['PIS-V']) if 'PIS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        cofins_modalidade=DADOS_PARA_XML['produtos_v1'][ind]['COFINS-MODALIDADE'],
                                                        cofins_valor_base_calculo=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-BC']) if 'COFINS-BC' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_aliquota_percentual=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-AL']) if 'COFINS-AL' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False, 
                                                        cofins_valor=Decimal(DADOS_PARA_XML['produtos_v1'][ind]['COFINS-V']) if 'COFINS-V' in DADOS_PARA_XML['produtos_v1'][ind].keys() else False,
                                                        
                                                        valor_tributos_aprox=DADOS_PARA_XML['produtos_v1'][ind]['valor_aproximado_dos_tributos'],
                                                        
                                                        #ICMS ST
                                                        icms_st_modalidade_determinacao_bc=DADOS_PARA_XML['produtos_v1'][ind]['ICMS-MODALIDADE-modalidade_de_determinacao_da_bc_do_icms_st'],
                                                        icms_st_percentual_adicional=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-percentual_margem_valor_adicionado_do_icms_st'],'porcentagem')),
                                                        icms_st_percentual_reducao_bc=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_reducao_bc_do_icms_st'],'porcentagem')),
                                                        icms_st_valor_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_da_bc_do_icms_st'],'real')),
                                                        icms_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-AL-aliquota_do_imposto_st'],'porcentagem')),
                                                        icms_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_icms_st'],'real')),
                                                        #FCP
                                                        fcp_st_valor=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-V-valor_do_fcp_retido_por_substituicao_tributaria'],'real')),
                                                        fcp_st_base_calculo=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-BC-valor_da_base_de_calculo_do_fcp_retido_por_substituicao_tributaria'],'real')),
                                                        fcp_st_aliquota=Decimal(formatar_valor(DADOS_PARA_XML['produtos_v1'][ind]['ICMS-P-percentual_do_fcp_retido_por_substituicao_tributaria'],'porcentagem')),
                                                    )
                                            except Exception as e:
                                                print(f"Error icms-900 -> {e}")
                                                continue
                                except Exception as e:
                                    #ERRO 1.9
                                    print(f'Erro ao serializar produto:{DADOS_PARA_XML['produtos_v1'][ind]} erro -> {e}')
                                    with open(f'{pasta_bots}/nfe_extrator_erros/XMLs_cache/nota_Error_{DADOS_PARA_XML["produtos_v1"][ind]['codigo_do_produto']}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'],f,indent=4,ensure_ascii=False)
                                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:6.0, ERRO AO VALIDAR ICMS-MODALIDADE:{DADOS_PARA_XML['produtos_v1'][ind][k]} CHAVE:{DADOS_PARA_XML['chave'] } PRODUTO:{DADOS_PARA_XML['produtos_v1'][ind]['codigo_do_produto']}, erro -> {e}\n')
                                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                                    if isinstance(dados_err, list):
                                        err_={"cod":1.9,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                                        dados_err.append(err_)
                                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                                    return f'❌ cod:1.9 ERRO NA ESTRUTURAÇÃO PRODUTO: Chave:{DADOS_PARA_XML['chave']} {e} '
                        print('SUCESSO')
                except Exception as e:
                    #ERRO 2.0
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":2.0,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:6.2, ERRO AO VALIDAR PRODUTO -> {NOTA_FOUND_ERROR} CHAVE:{nota_info.chave}, erro -> {e}\n')
                    return f'❌ cod:2.0 ERRO NA ESTRUTURAÇÃO: Chave:{nota_info.chave} Produto->{NOTA_FOUND_ERROR} {e} '
                
                #RETORNA A ULTIMA NOTA A SER SERIALIZADA
                try:
                    # serialização para estruturação correta do xml
                    serializador = SerializacaoXML(fonte_dados=_fonte_dados, homologacao=homologacao)
                    print(serializador)
                    sleep(0.55)
                    nfe = serializador.exportar()
                    #with open(f'xml_serializado_{DADOS_PARA_XML['chave']}.xml','w',encoding='utf-8') as f:f.write(nfe)
                    #adição do certificado de reestruturação do xml para importações
                    urllib3.disable_warnings()
                    a1=AssinaturaA1(certificado, senha)
                    xml=a1.assinar(nfe)
                    print(f'REQUESTE XML SERIALIZADO: {xml}')
                except Exception as e:
                    #ERROR 2.01
                    with open(f"{pasta_bots}/nfe_extrator_erros/controle_err.json", 'r', encoding='utf-8') as f:dados_err=json.load(f)
                    if isinstance(dados_err, list):
                        err_={"cod":2.01,"Erro ao serializar":f"{e}", "data/hora":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f"{pasta_bots}/nfe_extrator_erros/controle_err.json", 'w', encoding='utf-8') as f:json.dump(dados_err, f, indent=4, ensure_ascii=False)
                        print(f"DADOS ACOPLADOS -> {dados_err}")

                    print(f"Erro serialização -> {e}")
                    return "ERROR 2.01"
                try:
                    validar=True
                    #validação obrigatoria para reestruturação
                    #não obrigatoria em encaminhamento para a sefaz apenas para fins de debug
                    # from pynfe.processamento.validacao import Validacao
                    # from pynfe.utils.flags import XSD_FOLDER_NFE, XSD_NFE
                    # validacao=Validacao()
                    # xsd_nfe=validacao.get_xsd(xsd_file=XSD_NFE, xsd_folder=f'evenv/lib/site-packages/{XSD_FOLDER_NFE}')
                    # validacao.validar_etree(xml_doc=xml, xsd_file=xsd_nfe, use_assert=True)
                    print('Pós validação')
                except Exception as e:                
                    #ERRO 2.1
                    try:
                        with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:7, ERRO NA VALIDAÇÂO COM XML ATIVO: {e} XML: {xml[0][1][4].text} CHAVE DA NOTA:{chave_nfe}\n')
                        with open(f'{pasta_bots}/nfe_extrator_erros/XMLs_cache/Nota_error-{nota_info.chave}.json','w',encoding='utf-8') as f:json.dump([emissor_class.__dict__,destinatario_class.__dict__,nota_info.__dict__,DADOS_PARA_XML['produtos_v1']], f, indent=4, ensure_ascii=False)
                        with open(f'{pasta_bots}/nfe_extrator_erros/XMLs_cache/Nota_pr-{nota_info.chave}.json','w',encoding='utf-8') as f:json.dump([emissor_class.__dict__,destinatario_class.__dict__,nota_info.__dict__,DADOS_PARA_XML['produtos_v1']], f, indent=4, ensure_ascii=False)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                        if isinstance(dados_err, list):
                            err_={"cod":2.1,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                            dados_err.append(err_)
                            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                        return f'❌ cod:2.1 ERRO DE VALIDAÇÃO DA NOTA: {nota_info.chave}'
                    except Exception as e:
                        #ERRO 2.2
                        with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:8, ERRO NA VALIDAÇÃO DIRETA: {e} CHAVE DA NOTA: {chave_nfe}\n')
                        with open(f'{pasta_bots}/nfe_extrator_erros/XMLs_cache/Nota_error-{nota_info.chave}.json','w',encoding='utf-8') as f:json.dump([emissor_class.__dict__,destinatario_class.__dict__,nota_info.__dict__,DADOS_PARA_XML['produtos_v1']], f, indent=4, ensure_ascii=False)
                        with open(f'{pasta_bots}/nfe_extrator_erros/XMLs_cache/Nota_pr-{nota_info.chave}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'], f, indent=4, ensure_ascii=False)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                        if isinstance(dados_err, list):
                            err_={"cod":2.2,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                            dados_err.append(err_)
                            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                        return f'❌ cod:2.2 ERRO DE VALIDAÇÃO DA NOTA: {nota_info.chave}'
                    validar=False
                finally:
                    if validar==True: 
                        # with open(f'{pasta_bots}/nfe_extrator_erros/XMLs_cache/Nota_pr_validada-{nota_info.chave}.json','w',encoding='utf-8') as f:json.dump(DADOS_PARA_XML['produtos_v1'], f, indent=4, ensure_ascii=False)
                        pass
                    elif e:
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                        if isinstance(dados_err, list):
                            err_={"cod":9,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                            dados_err.append(err_)
                            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                        with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:9, {e}')
                        return 'ERROR cod:9'
                #estabelece comunicação com a api da sefaz webservice
                #con=ComunicacaoSefaz(uf, os.path.abspath(certificado),senha,homologacao)
                try:
                    xml_open=etree.tostring(xml, encoding='utf-8', xml_declaration=True, pretty_print=True)
                    xml_open=xml_open.decode('utf-8')
                    xml_open=xml_open[38:]
                    a='''<protNFe xmlns="http://www.portalfiscal.inf.br/nfe" xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" versao="4.00"><infProt Id="ID151250062254007"><tpAmb>1</tpAmb><verAplic>MT_A2_SRV240225-4.00</verAplic><chNFe>51250704164120000185550010000060841383455879</chNFe><dhRecbto>2025-07-21T15:43:13-04:00</dhRecbto><nProt>151250062254007</nProt><digVal>0KYVoVYf/AOk0PZ5k8sm8aPuvfM=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe></nfeProc>'''
                    prot_nfe=str(retornar_prot()).strip().encode('utf-8')
                    print('RETORNANDO ESTRUTURAÇÃO DA NOTA')
                    if str(prot_nfe).replace(' ','')!='None' and prot_nfe!=None and prot_nfe!=b'None':
                        nfe_proc=f"""<?xml version="1.0" encoding="utf-8"?><nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="4.00">{xml_open}{prot_nfe.decode('utf-8')}</nfeProc>""".strip().encode('utf-8')
                    else:
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                        if isinstance(dados_err, list):
                            err_={"cod":"9.1","erro":f"Erro ao criar protocolo da nota","data/hota":datetime.now().isoformat()}
                            dados_err.append(err_)
                            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                        return f'❌ ERRO AO CRIAR PROTOCOLO DA NOTA: {nota_info.chave}'
                    print(prot_nfe)
                    #time.sleep(100)
                    if arquivo_existente==0:
                        print('RETORNANDO O SAVE DO XML')
                        #pasta_empresa=retornar_path(data=f'.arquivos_api/{cnpj}/{mes}/{str(datetime.now().year)}/nfe', mode='user_join')
                        with open(f'{path}/xml_{str(nota_info.chave)}.xml','wb') as f: f.write(nfe_proc)
                        sleep(1)
                        with open(f'{pasta_empresa}/xml_{str(nota_info.chave)}.xml','wb') as data:data.write(nfe_proc)
                        sleep(0.55)
                        with open(f'{pasta_bots}/nfe_extrator_erros/DADOS_XML_POS-VERIFICACAO.json', 'w', encoding='utf-8') as f:json.dump({'emissor':emissor_class.__dict__,'destinatario':destinatario_class.__dict__,'nota_fiscal':nota_info.__dict__,'produtos':DADOS_PARA_XML['produtos_v1']}, f, indent=4, ensure_ascii=False)
                        inicio_timer=f'{perf_counter()-inicio_timer:.6f}'
                        #Encaminhamento do arquivo para fileserver
                        ConnServer.enviar_to_fileserver('', pasta_empresa, f'{cnpj}/{mes}/{str(datetime.now().year)}/nfe')
                        return f'✅ NOTA VALIDADA! IMPORTANDO NOTA: {chave_nfe} TEMPO DE EXECUÇÃO: ⏱{inicio_timer}s'
                    else:
                        return f'Erro nota: {nota_info.chave} já consta ou cancelada'
                    print('Execução finalizada')
                except Exception as e:
                    #ERRO 2.3
                    with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
                    if isinstance(dados_err, list):
                        err_={"cod":2.3,"erro":f"{e}","data/hota":datetime.now().isoformat()}
                        dados_err.append(err_)
                        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
                    with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:10, ERRO AO CRIAR XML {e}\n')
                    return f'❌ cod:2.3 ERRO AO CRIAR XML: {e}'
            else:
                return f'💾 A NOTA: {nota_info.chave} JÁ CONSTA!'
        except Exception as e:
            #ERRO 2.4
            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
            if isinstance(dados_err, list):
                err_={"cod":2.4,"erro":f"{e}","data/hota":datetime.now().isoformat(),"nota":nota_info.chave}
                dados_err.append(err_)
                with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
            with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt', 'a', encoding='utf-8') as f: f.write(f'Erro cod:11, ERRO DE VALIDAÇÃO: {e} CHAVE DA NOTA COM ERRO: {nota_info.chave} DATA: {datetime.now()}\n')
            return f'❌ cod:2.4 ERRO AO LER NOTA: {nota_info.chave} '
    else:
        #ERRO 2.5
        with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','r', encoding='utf-8') as f_:dados_err=json.load(f_)
        if isinstance(dados_err, list):
            err_={"cod":2.5,"erro":f"{e}","data/hota":datetime.now().isoformat()}
            dados_err.append(err_)
            with open(f'{pasta_bots}/nfe_extrator_erros/controle_err.json','w', encoding='utf-8') as f:json.dump(dados_err,f,indent=4,ensure_ascii=False)
        with open(f'{pasta_bots}/nfe_extrator_erros/LOG_ERROR_REQUISICAO.txt','a',encoding='utf-8') as f:f.write(f'Erro cod:12, ERRO NA CHAVE DA NOTA {e}')
        return f'❌ cod:2.5 ERRO AO LER NOTA: {nota_info.chave}'

class Requisitar_emp_only():
    def iniciar_extracao(cnpj):
        try:
            with open(f"{pasta_bots}/nfe_extrator_erros/controle_err.json", 'r', encoding='utf-8') as f:dados_err=json.load(f)
            if isinstance(dados_err, list):
                dados_err=[]
            with open(f"{pasta_bots}/nfe_extrator_erros/controle_err.json", 'w', encoding='utf-8') as f:json.dump(dados_err, f, indent=4, ensure_ascii=False)
        except:
            pass
        pasta=os.path.join(os.path.expanduser('~'), f'.arquivos_api/{cnpj}/10-out/2025/nfe/html')
        pasta_xml=os.path.join(os.path.expanduser('~'), f'.arquivos_api/{cnpj}/10-out/2025/nfe/xml')

        dados=db.SQLConn().parametro_readline(param=['cnpj', f'{cnpj}'])
        data={"mes":"10-out","ano":'2025'}
        for arquivo in os.listdir(pasta):
            if arquivo.endswith('.html'):
                extrai_info(file_nfe_html=arquivo,codigo_dominio=dados['codigo'],razao=dados['razao'],regime=dados['modalidade'],cnpj=f'{cnpj}',path=pasta_xml, data_=data)

# Requisitar_emp_only.iniciar_extracao("14831589000184")

def verificar_retorno_true(cnpj):
    certificado='S3D_2_250714105253.pfx'
    senha='12345678'
    uf='MT'

    con=ComunicacaoSefaz(uf, certificado, senha)
    
    #xml=con.status_servico('nfe')
    #xml=con.AutorizadosBaixarXML()

    # consulta nota emitida atraves da key da nota
    #retorno=con.consulta_cadastro(documento=f"{cnpj}", modelo='nfe')
    #xml=con.consulta_distribuicao(chave='51250615375991000679550010009892651656522590')
    retorno=con.status_servico(modelo='nfe')
    print(retorno.text)
    
    # with open('xml_sefaz_test.xml', 'w') as f:
    #     f.write(xml.text)

def requisitar_xml_nfe():
    import wincertstore
    print('Requisitando os certificados')
    # with open('cert_count.json', 'r' ) as f:
    #     dados=json.load(f)

    for i in range(1,len(dados['certificados'])):
        print(i)

    with wincertstore.CertSystemStore('MY') as store:
        #extrai os certificados instalados na maquina
        for cert in store.itercerts(usage=None):
            if str(cert.get_name()) not in dados['certificados']:
                dados['certificados'].append(str(cert.get_name()))
                dados['contagem']=int(dados['contagem'])+1
            print('Assunto:', cert.get_name())
            print('-'*40)
    # with open('cert_count.json', 'w', encoding='utf-8') as f:
    #     json.dump(dados, f, indent=4, ensure_ascii=False)

    options=Options()
    driver=webdriver.Chrome(options=options)
    driver.get("https://www.nfe.fazenda.gov.br/portal/consultaRecaptcha.aspx?tipoConsulta=resumo&tipoConteudo=7PhJ+gAVw2g=")
    input_key=driver.find_element(By.CLASS_NAME, 'txtChaveAcesso')
    input_key.send_keys('51250614831589000184550030000006891878419980')
    sleep(5)
    iframe=driver.find_elements(By.TAG_NAME,'iframe')
    
    driver.switch_to.frame(iframe[0])
    driver.find_element(By.ID, 'checkbox').click()
    sleep(5)
    driver.quit()

def evento_cancel_nota(cnpj,chave,protocolo):
    from pynfe.processamento.comunicacao import ComunicacaoSefaz
    from pynfe.processamento.serializacao import SerializacaoXML
    from pynfe.processamento.assinatura import AssinaturaA1
    from pynfe.entidades.evento import EventoCancelarNota
    from pynfe.entidades.fonte_dados import _fonte_dados
    import datetime

    timer=datetime.now()
    certificado='metalD.pfx'
    senha='12345678'
    uf='mt'
    homologacao=False
    timer=timer.strftime("%Y/%m/%dT%H:%M:%S")
    tz=datetime.now().astimezone().strftime("%z") #retorna o timezone
    cancelar=EventoCancelarNota(
        cnpj=str(cnpj),
        chave=str(chave),
        uf=uf,
        data_emissao=datetime.now(),
        protocolo=str(protocolo),
        justificativa='Duplicidade de NF-e para mesma operação ocasionada por falha de comunicação'
    )


    serializar=SerializacaoXML(_fonte_dados, homologacao=homologacao)
    nfe_cancel=serializar.serializar_evento(cancelar)
    a1=AssinaturaA1(certificado, senha)
    xml=a1.assinar(nfe_cancel)
    
    con=ComunicacaoSefaz(uf,certificado,senha,homologacao)
    envio=con.evento(modelo='nfe',evento=xml)
    
    print(envio.text)
    return

def danfe_creator():
    import os
    import requests
    from pynfe.processamento.comunicacao import ComunicacaoSefaz
    from lxml import etree

    #criação de uma Danfe
    from brazilfiscalreport.danfe import Danfe
    # with open('test_.xml', 'r', encoding='utf-8') as f:
    #     file=f.read()
    danfe=Danfe(xml=file)
    danfe.output('output_danfe.pdf')
    #----#

    certificado='S3D_2_250714105253.pfx'
    senha='12345678'
    uf='mt'
    ambiente=1 #1 = produção 2 = homologação
    chave_nfe='51250626563825000108550020000001021619002973'

    sefaz=ComunicacaoSefaz(uf, os.path.abspath(certificado), senha, homologacao=False)
    
    response=sefaz._post_header()
    print(response)
    #consulta o envelope
    resposta=sefaz.consulta_cadastro(modelo='nfe', documento='26563825000108')
    #print(f'STATUS: {resposta.text}')
    lxml_conv=etree.fromstring(resposta.text.encode('utf-8'))

def homologacao_area(key, cnpj, cod_mun):
    #efetua a requisição de exclusão da nota fiscal

    from pynfe.processamento import ComunicacaoSefaz
    from pynfe.entidades.evento import EventoCancelarNota
    from lxml import etree
    import datetime
    import os

    certificado='metalD.pfx'
    senha='12345678'
    uf='mt'
    homologacao=False

    chave_nfe=str(key).strip()
    protocolo_auth='151250063002488'
    justificativa='Cancelamento por erro de duplicidade de emissão'
    cnpj_emitente=cnpj
    codigo_mun=cod_mun
    data_evento=datetime.utcnow().isoformat()

    evento_cancelamento=EventoCancelarNota(
        cnpj=cnpj_emitente,
        chave_nfe=chave_nfe,
        protocolo=protocolo_auth,
        justificativa=justificativa,
        data_evento=data_evento
    )

    print(etree.tostring(evento_cancelamento, encoding='utf-8'), xml_declaration=True, pretty_print=True)
    print('LAST REQUEST')
    con=ComunicacaoSefaz(uf, os.path.abspath(certificado), senha, homologacao)
    resposta=con.evento(evento=evento_cancelamento,modelo='nfe')
    print(resposta)


