from pydantic import BaseModel from typing import List, Optional, Literal EstadoEnum = Literal[ "AC", "AL", "AM", "AP", "BA", "CE", "DF", "ES", "GO", "MA", "MG", "MS", "MT", "PA", "PB", "PE", "PI", "PR", "RJ", "RN", "RO", "RR", "RS", "SC", "SE", "SP", "TO" ] TipoLogradouroEnum = Literal[ "Alameda", "Avenida", "Chácara", "Colônia", "Condomínio", "Estância", "Estrada", "Fazenda", "Praça", "Prolongamento", "Rodovia", "Rua", "Sítio", "Travessa", "Vicinal", "Eqnp" ] class Emitente(BaseModel): cpfCnpj: str inscricaoEstadual: Optional[str] = None class Endereco(BaseModel): logradouro: str numero: str bairro: str codigoCidade: str estado: EstadoEnum cep: str tipoLogradouro: TipoLogradouroEnum codigoPais: Optional[str] = "1058" complemento: Optional[str] = None descricaoCidade: Optional[str] = None descricaoPais: Optional[str] = "Brasil" class Destinatario(BaseModel): cpfCnpj: str razaoSocial: str nomeFantasia: Optional[str] = None email: Optional[str] = None inscricaoEstadual: Optional[str] = None inscricaoMunicipal: Optional[str] = None inscricaoSuframa: Optional[str] = None orgaoPublico: Optional[bool] = False endereco: Endereco class ValorTributavel(BaseModel): comercial: float tributavel: float class BaseCalculoIcms(BaseModel): modalidadeDeterminacao: int valor: float class Icms(BaseModel): origem: str cst: str baseCalculo: BaseCalculoIcms aliquota: float valor: float class BaseCalculoPis(BaseModel): valor: float quantidade: int class Pis(BaseModel): cst: str baseCalculo: BaseCalculoPis aliquota: float valor: float class BaseCalculoCofins(BaseModel): valor: float class Cofins(BaseModel): cst: str baseCalculo: BaseCalculoCofins aliquota: float valor: float class Tributos(BaseModel): icms: Optional[Icms] = None pis: Optional[Pis] = None cofins: Optional[Cofins] = None class ItemNFe(BaseModel): codigo: str descricao: str ncm: str cest: Optional[str] = None cfop: str valorUnitario: ValorTributavel valor: float tributos: Tributos class Pagamento(BaseModel): aVista: Optional[bool] = True meio: Optional[str] = "01" valor: float class Telefone(BaseModel): ddd: str numero: str class ResponsavelTecnico(BaseModel): cpfCnpj: str nome: str email: str telefone: Telefone class NFe(BaseModel): idIntegracao: str presencial: bool consumidorFinal: bool natureza: str emitente: Emitente destinatario: Destinatario itens: List[ItemNFe] pagamentos: List[Pagamento] responsavelTecnico: Optional[ResponsavelTecnico] = None