import xml.etree.ElementTree as ET import json import smtplib import email.utils from email.mime.text import MIMEText import os import pyodbc as po file_path = os.path.realpath(__file__) with open(file_path.replace('AmazonReadFiles.py', '')+"/config/config.json") as json_data_file: config = json.load(json_data_file) server = config['Server'] database = config['Database'] username = config['DBUser'] password = config['DBPassword'] downloadedPath = config['downloadFolder'] files = [] def SendEmail(): msg = MIMEText( 'Mediante este correo se le notifica que ha llego una nueva factura de Amazon') msg['To'] = email.utils.formataddr(('Recipient', 'agarcia@gemcousa.com')) msg['From'] = email.utils.formataddr( ('GEMCO informa', 'noreply@gemcousa.mx')) msg['Subject'] = 'Llego una nueva factura de AMAZON' sender = "noreply@gemcousa.mx" receivers = "agarcia@gemcousa.com" smtpObj = smtplib.SMTP('smtp.ionos.com', 587) smtpObj.ehlo() smtpObj.starttls() smtpObj.login('noreply@gemcousa.mx', 'Mx77lf%02') try: smtpObj.sendmail(sender, [receivers], msg.as_string()) print("Successfully sent email") except: print("Error: unable to send email") def isFloat(num): try: float(num) return float(num) except ValueError: return 0 def ProcessHeader( CommercialInvoiceDate, InvoiceNumber, TrailerNumber, TrailerId, PortofLoading, PortofEntry, PaymentTerms, Incoterms, HAWB, TotalInvoiceQuantityUnitOfMesuare, Quantity, TotalInvoiceWeightUnitOfMesuare, WeightValue, TotalInvoiceValueChargeOrAllowance, TotalInvoiceValueCurrencyISOCode, TotalInvoiceValueMonetaryAmount, FooterNote, Archivo, ): try: # Connection string cnxn = po.connect( "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PWD=" + password ) cursor = cnxn.cursor() storedProc = """\ SET NOCOUNT ON; DECLARE @RC int; EXEC @RC = [GEMCO].dbo.[Clientes.Amazon.Invoice.Header.Append] @CommercialInvoiceDate = ?, @InvoiceNumber = ?, @TrailerNumber = ?, @TrailerId = ?, @PorOfLoading = ?, @PortOfEntry = ?, @PaymentsTerms = ?, @Incoterms = ?, @HAWB = ?, @TotalInvoiceQuantityUnitOfMeasure = ?, @TotalInvoiceQuantity = ?, @TotalInvoiceWeightUnitOfMeasure = ?, @TotalInvoiceWeight = ?, @TotalInvoiceValueChargeOrAllowance = ?, @TotalInvoiceValueCurrencyISOCode = ?, @TotalInvoiceValueMonetaryAmount = ?, @FootNote = ?, @Archivo =?; SELECT @RC AS rc;""" params = ( CommercialInvoiceDate, InvoiceNumber, TrailerNumber, TrailerId, PortofLoading, PortofEntry, PaymentTerms, Incoterms, HAWB, TotalInvoiceQuantityUnitOfMesuare, Quantity, TotalInvoiceWeightUnitOfMesuare, WeightValue, TotalInvoiceValueChargeOrAllowance, TotalInvoiceValueCurrencyISOCode, TotalInvoiceValueMonetaryAmount, FooterNote, Archivo, ) cursor.execute(storedProc, params) rc = cursor.fetchval() print(rc) cnxn.commit() except Exception as e: print("Error: %s" % e) finally: cnxn.close() return rc def ProcessShipFromAddress( IDHeader, InvoiceNumber, AddressType, Name, AddressLine1, City, StateProvince, Zip, CountryCode, CountryName, Archivo, ): try: cnxn = po.connect( "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PWD=" + password ) cursor = cnxn.cursor() storedProc = """\ SET NOCOUNT ON; DECLARE @RC int; EXEC @RC = [GEMCO].dbo.[Clientes.Amazon.Invoice.ShipFromAddress.Append] @IDHeader=?, @InvoiceNumber=?, @AddressType=?, @Name=?, @AddressLine1=?, @City=?, @StateProvince=?, @Zip=?, @CountryCode=?, @CountryName=?, @Archivo=?; SELECT @RC AS rc;""" params = ( IDHeader, InvoiceNumber, AddressType, Name, AddressLine1, City, StateProvince, Zip, CountryCode, CountryName, Archivo, ) cursor.execute(storedProc, params) rc = cursor.fetchval() print(rc) cnxn.commit() except Exception as e: print("Error: %s" % e) finally: cnxn.close() return rc def ProcessDetail( IDHeader, InvoiceNumber, AmazonShipmentReferenceId, TrailerId, ItemId, ItemIdType, ItemDescription, PedimentoDescription, DestinationHTSCode, SourceHTSCode, ECCN, LicEx, CountryOfOrigin, ProductGroup, UPC, Brand, Model, ItemQuantityUnitOfMeasure, Quantity, NetWeightUnitOfMeasure, WeightValue, ActualUnitCostChargeOrAllowance, ActualUnitCostCurrencyISOCode, ActualUnitCostMonetaryAmount, TotalUnitValueChargeOrAllowance, TotalUnitValueCurrencyISOCode, TotalUnitValueMonetaryAmount, Archivo, ): try: cnxn = po.connect( "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PWD=" + password ) cursor = cnxn.cursor() storedProc = """\ SET NOCOUNT ON; DECLARE @RC int; EXEC @RC = [GEMCO].dbo.[Clientes.Amazon.Invoice.Detail.Append] @IDHeader=?, @InvoiceNumber=?, @AmazonShipmentReferenceId=?, @TrailerId=?, @ItemId=?, @ItemIdType=?, @ItemDescription=?, @PedimentoDescription=?, @DestinationHTSCode=?, @SourceHTSCode=?, @ECCN=?, @LicEx=?, @CountryOfOrigin=?, @ProductGroup=?, @UPC=?, @Brand=?, @Model=?, @ItemQuantityUnitOfMeasure=?, @Quantity=?, @NetWeightUnitOfMeasure=?, @WeightValue=?, @ActualUnitCostChargeOrAllowance=?, @ActualUnitCostCurrencyISOCode=?, @ActualUnitCostMonetaryAmount=?, @TotalUnitValueChargeOrAllowance=?, @TotalUnitValueCurrencyISOCode=?, @TotalUnitValueMonetaryAmount=?, @Archivo=?; SELECT @RC AS rc;""" params = ( IDHeader, InvoiceNumber, AmazonShipmentReferenceId, TrailerId, ItemId, ItemIdType, ItemDescription, PedimentoDescription, DestinationHTSCode, SourceHTSCode, ECCN, LicEx, CountryOfOrigin, ProductGroup, UPC, Brand, Model, ItemQuantityUnitOfMeasure, Quantity, NetWeightUnitOfMeasure, WeightValue, ActualUnitCostChargeOrAllowance, ActualUnitCostCurrencyISOCode, ActualUnitCostMonetaryAmount, TotalUnitValueChargeOrAllowance, TotalUnitValueCurrencyISOCode, TotalUnitValueMonetaryAmount, Archivo, ) cursor.execute(storedProc, params) rc = cursor.fetchval() print(rc) cnxn.commit() except Exception as e: print("Error: %s" % e) finally: cnxn.close() return rc def ProcessCorrelacion(): try: cnxn = po.connect( "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PWD=" + password ) cursor = cnxn.cursor() storedProc = """\ SET NOCOUNT ON; DECLARE @RC int; EXEC @RC = [GEMCO].dbo.[Clientes.Amazon.Invoice.Detail.Correlacion.Validate];""" cursor.execute(storedProc) print('Correlacion executed') cnxn.commit() except Exception as e: print("Error: %s" % e) finally: cnxn.close() def ProcessCorrelacionPartesGEMCO(): try: cnxn = po.connect( "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + server + ";DATABASE=" + database + ";UID=" + username + ";PWD=" + password ) cursor = cnxn.cursor() storedProc = """\ SET NOCOUNT ON; DECLARE @RC int; EXEC @RC = [GEMCO].dbo.[Clientes.Amazon.Invoice.Detail.Correlacion.PartesGEMCO];""" cursor.execute(storedProc) print('Correlacion executed') cnxn.commit() except Exception as e: print("Error: %s" % e) finally: cnxn.close() def GetFileList(): for file in os.listdir(downloadedPath): if os.path.isfile(os.path.join(downloadedPath, file)) and file.endswith('.xml'): files.append(downloadedPath + "/" + file) GetFileList() for file in files: Archivo = file print("archivo=" + Archivo) tree = ET.parse(Archivo) root = tree.getroot() HeaderData = [] for child in root.iter("manifestHeader"): for child2 in child: if "commercialInvoiceDate" in child2.tag: CommercialInvoiceDate = child2.text if "invoiceNumber" in child2.tag: InvoiceNumber = child2.text if "TrailerNumber" in child2.tag: TrailerNumber = child2.text if "TrailerId" in child2.tag: TrailerId = child2.text if "portofLoading" in child2.tag: PortofLoading = child2.text if "portofEntry" in child2.tag: PortofEntry = child2.text if "paymentTerms" in child2.tag: PaymentTerms = child2.text if "incoterms" in child2.tag: Incoterms = child2.text if "HAWB" in child2.tag: HAWB = child2.text HeaderData.append( ( CommercialInvoiceDate, InvoiceNumber, TrailerNumber, TrailerId, PortofLoading, PortofEntry, PaymentTerms, Incoterms, HAWB, ) ) ManifestSummaryData = [] ShipFromAddress = [] DetailData = [] IDHeader = 0 for child in root.iter("manifestSummary"): for child2 in child: if "footNote" in child2.tag: FooterNote = child2.text for child3 in child2: if "quantity" in child3.tag: Quantity = child3.text TotalInvoiceQuantityUnitOfMesuare = child3.attrib[ "unitOfMeasure" ] if "weightValue" in child3.tag: WeightValue = child3.text TotalInvoiceWeightUnitOfMesuare = child3.attrib[ "unitOfMeasure" ] if "chargeOrAllowance" in child3.tag: ChargeOrAllowance = child3.text if "monetaryAmount" in child3.tag: MonetaryAmmount = child3.text CurrencyISOCode = child3.attrib["currencyISOCode"] ManifestSummaryData.append( ( Quantity, TotalInvoiceQuantityUnitOfMesuare, WeightValue, TotalInvoiceWeightUnitOfMesuare, ChargeOrAllowance, MonetaryAmmount, CurrencyISOCode, FooterNote, ) ) IDHeader = ProcessHeader( CommercialInvoiceDate, InvoiceNumber, TrailerNumber, TrailerId, PortofLoading, PortofEntry, PaymentTerms, Incoterms, HAWB, TotalInvoiceQuantityUnitOfMesuare, isFloat(Quantity), TotalInvoiceWeightUnitOfMesuare, isFloat(WeightValue), ChargeOrAllowance, CurrencyISOCode, isFloat(MonetaryAmmount), FooterNote, Archivo, ) print("Id del nuevo header=", IDHeader) if IDHeader > 0: SendEmail() for child in root.iter("manifestHeader"): for child2 in child: AddressType = child2.attrib for child3 in child2: if "name" in child3.tag: Name = child3.text if "addressLine1" in child3.tag: AddressLine1 = child3.text if "city" in child3.tag: City = child3.text if "zip" in child3.tag: Zip = child3.text if "countryCode" in child3.tag: CountryCode = child3.text if "countryName" in child3.tag: CountryName = child3.text for child4 in child3: if "stateProvince" in child4.tag: StateProvince = child4.text if "AddressType" in AddressType: ShipFromAddress.append( ( AddressType["AddressType"], Name, AddressLine1, City, StateProvince, Zip, CountryCode, CountryName, ) ) for row in ShipFromAddress: print(row) ProcessShipFromAddress( IDHeader, InvoiceNumber, row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], Archivo, ) for child in root.iter("shipmentDetail"): for child2 in child: if "AmazonShipmentReferenceId" in child2.tag: AmazonShipmentId = child2.text if "trailerId" in child2.tag: TrailerId = child2.text if "itemID" in child2.tag: ItemID = child2.text ItemIDType = child2.attrib["type"] if "itemDescription" in child2.tag: ItemDescription = child2.text if "pedimentoDescription" in child2.tag: PedimentoDescription = child2.text if "destinationHTSCode" in child2.tag: DestinationHTSCode = child2.text if "sourceHTSCode" in child2.tag: SouceHTSCode = child2.text if "ECCN" in child2.tag: Eccn = child2.text if "LicEx" in child2.tag: LicEx = child2.text if "countryOfOrigin" in child2.tag: CountryOfOrigin = child2.text if "productGroup" in child2.tag: ProductGroup = child2.text if "upc" in child2.tag: Upc = child2.text if "brand" in child2.tag: Brand = child2.text if "model" in child2.tag: Model = child2.text for child3 in child2: if "quantity" in child3.tag: Quantity = child3.text ItemQuantityUnitOfMeasure = child3.attrib["unitOfMeasure"] if "weightValue" in child3.tag: WeightValue = child3.text NetWeightUnitOfMeasure = child3.attrib["unitOfMeasure"] if "actualUnitCost" in child2.tag: #print(child3.attrib, ' ',child3.tag, ' ',child3.text ) if "chargeOrAllowance" in child3.tag: ActualUnitCostChargeOrAllowance = child3.text if "currencyISOCode" in child3.attrib: ActualUnitCostCurrencyISOCode = child3.attrib[ "currencyISOCode" ] ActualUnitCostMonetaryAmount = child3.text if "totalUnitValue" in child2.tag: if "chargeOrAllowance" in child3.tag: TotalUnitValueChargeOrAllowance = child3.text if "currencyISOCode" in child3.attrib: TotalUnitValueCurrencyISOCode = child3.attrib[ "currencyISOCode" ] TotalUnitValueMonetaryAmount = child3.text DetailData.append( ( AmazonShipmentId, TrailerId, ItemID, ItemIDType, ItemDescription, PedimentoDescription, DestinationHTSCode, SouceHTSCode, Eccn, LicEx, CountryOfOrigin, ProductGroup, Upc, Brand, Model, ItemQuantityUnitOfMeasure, int(Quantity), NetWeightUnitOfMeasure, isFloat(WeightValue), ActualUnitCostChargeOrAllowance, ActualUnitCostCurrencyISOCode, isFloat(ActualUnitCostMonetaryAmount), TotalUnitValueChargeOrAllowance, TotalUnitValueCurrencyISOCode, isFloat(TotalUnitValueMonetaryAmount), ) ) for row in DetailData: print(row, "\n") ProcessDetail( IDHeader, InvoiceNumber, row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19], row[20], row[21], row[22], row[23], row[24], Archivo ) ProcessCorrelacionPartesGEMCO() ProcessCorrelacion()