commit 12c4722fe95e94751a4e092b547ab0aae6a685bd Author: Dan Dembinski Date: Fri Mar 19 02:22:53 2021 -0400 Initial commit. Loads XLSX file from accounting into sqlite database. Sends HTML email. Started adding variable parts to body pulled from database. diff --git a/InvoiceDatabase.py b/InvoiceDatabase.py new file mode 100644 index 0000000..770f43d --- /dev/null +++ b/InvoiceDatabase.py @@ -0,0 +1,97 @@ +from openpyxl import load_workbook +from sqlalchemy import create_engine, Column, Integer, String, REAL +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +engine = create_engine('sqlite:///cffInvoice.db') +engine.connect() +Base = declarative_base() + + +class Invoice(Base): + __tablename__ = 'Invoice' + rowid = Column(Integer, primary_key=True, autoincrement=True) + OrderID = Column(String) + InvoiceNumber = Column(String) + DateCreated = Column(String) + ProductionCharges = Column(REAL) + ShippingCharges = Column(REAL) + AdjustmentsBalance = Column(REAL) + DuePayment = Column(REAL) + ChargeCode = Column(String) + UserLogon = Column(String) + UserProfileFirstName = Column(String) + UserProfileLastName = Column(String) + InvoiceEmailAddress = Column(String) + ShippingCompany = Column(String) + ShippingFirstName = Column(String) + ShippingLastName = Column(String) + ShippingAddress1 = Column(String) + ShippingAddress2 = Column(String) + ShippingCity = Column(String) + ShippingState = Column(String) + ShippingPostalCode = Column(String) + + +class ItemDetail(Base): + __tablename__ = 'ItemDetail' + rowid = Column(Integer, primary_key=True, autoincrement=True) + OrderID = Column(String) + DocumentID = Column(String) + GLIJobNumber = Column(String) + ProductName = Column(String) + Quantity = Column(String) + ItemPrice = Column(REAL) + + +Session = sessionmaker(bind=engine) +session = Session() + + +def load_sheet(invoiceNumber): + + # starting invoice sub-number + count = 2 + + #open the xlsx file from accounting and name the two sheets required + wb = load_workbook('1.xlsx', data_only=True) + shtInvoice = wb.get_sheet_by_name('Invoice') + shtItemDetail = wb.get_sheet_by_name('Item Detail') + + #loop through each row in the Invoice sheet except for the first and last + #write each row to the database + for row in shtInvoice.iter_rows(min_row=2, max_row=shtInvoice.max_row-1): + session.add(Invoice(OrderID=row[0].value, InvoiceNumber=invoiceNumber + '-' + str(count), DateCreated=row[2].value, + ProductionCharges=row[4].value, ShippingCharges=row[5].value, AdjustmentsBalance=row[6].value, + DuePayment=row[7].value, ChargeCode=row[8].value, UserLogon=row[9].value, UserProfileFirstName=row[10].value, + UserProfileLastName=row[11].value, InvoiceEmailAddress=row[12].value, ShippingCompany=row[13].value, + ShippingFirstName=row[14].value, ShippingLastName=row[15].value, ShippingAddress1=row[16].value, + ShippingAddress2=row[17].value, ShippingCity=row[18].value, ShippingState=row[19].value, + ShippingPostalCode=row[20].value)) + count = count + 1 + session.commit() + + for row in shtItemDetail.iter_rows(min_row=2, max_row=shtItemDetail.max_row-1): + session.add(ItemDetail(OrderID=row[0].value, DocumentID=row[1].value, GLIJobNumber=row[4].value, ProductName=row[5].value, Quantity=row[6].value, ItemPrice=row[7].value)) + session.commit() + + +def just_work(): + orders = [] + for order in session.query(Invoice).all(): + orders.append(order.OrderID) + return orders + + +def record_lookup(record): + result = [] + for lookup in session.query(Invoice).filter(Invoice.OrderID == record): + result.append(lookup.OrderID) + result.append(lookup.DateCreated) + result.append(lookup.UserLogon) + result.append(lookup.UserProfileFirstName) + result.append(lookup.UserProfileLastName) + result.append(lookup.ChargeCode) + result.append(lookup.InvoiceNumber) + result.append(lookup.InvoiceEmailAddress) + return result diff --git a/TableSetup b/TableSetup new file mode 100644 index 0000000..dd82e55 --- /dev/null +++ b/TableSetup @@ -0,0 +1,32 @@ +create table Invoice( +OrderID TEXT NOT NULL, +InvoiceNumber TEXT NOT NULL, +DateCreated TEXT NOT NULL, +ProductionCharges REAL NOT NULL, +ShippingCharges REAL NOT NULL, +AdjustmentsBalance REAL NOT NULL, +DuePayment REAL NOT NULL, +ChargeCode TEXT, +UserLogon TEXT NOT NULL, +UserProfileFirstName TEXT NOT NULL, +UserProfileLastName TEXT NOT NULL, +InvoiceEmailAddress TEXT NOT NULL, +ShippingCompany TEXT, +ShippingFirstName TEXT NOT NULL, +ShippingLastName TEXT NOT NULL, +ShippingAddress1 TEXT NOT NULL, +ShippingAddress2 TEXT, +ShippingCity TEXT NOT NULL, +ShippingState TEXT NOT NULL, +ShippingPostalCode TEXT NOT NULL +); + + +create table ItemDetail( +OrderID TEXT NOT NULL, +DocumentID TEXT NOT NULL, +GLIJobNumber TEXT NOT NULL, +ProductName TEXT NOT NULL, +Quantity INT NOT NULL, +ItemPrice REAL NOT NULL +); diff --git a/main.py b/main.py new file mode 100644 index 0000000..7a5d018 --- /dev/null +++ b/main.py @@ -0,0 +1,20 @@ +import sendEmail +import InvoiceDatabase + +running = True + +while running is True: + print('1. load new excel file\n2. Send Test emails\n3. Send Invoices\n4. Quit') + option = int(input()) + if option == 1: + print('Enter invoice number') + invoiceNumber = str(input()) + InvoiceDatabase.load_sheet(invoiceNumber) + elif option == 2: + sendEmail.send_email(True,'ALL') + elif option == 3: + sendEmail.send_email() + elif option == 4: + running = False + else: + print('not an option') diff --git a/requirements b/requirements new file mode 100644 index 0000000..218cd25 --- /dev/null +++ b/requirements @@ -0,0 +1,7 @@ +et-xmlfile==1.0.1 +greenlet==1.0.0 +importlib-metadata==3.7.3 +openpyxl==3.0.7 +SQLAlchemy==1.4.1 +typing-extensions==3.7.4.3 +zipp==3.4.1 diff --git a/sendEmail.py b/sendEmail.py new file mode 100644 index 0000000..2501d6d --- /dev/null +++ b/sendEmail.py @@ -0,0 +1,125 @@ +import smtplib +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.mime.base import MIMEBase +from datetime import datetime +import InvoiceDatabase + + +def send_email(test, record): + + port = 25 + smtp_server = "gll-com.mail.protection.outlook.com" + + orders = InvoiceDatabase.just_work() + for each in orders: + info = InvoiceDatabase.record_lookup(each) + print(info) + OrderNumber = info[0] + OrderDate = info[1] + UserLogon = info[2] + Name = info[3] + ' ' + info[4] + ChargeCode = info[5] + InvoiceNumber = info[6] + InvoiceEmailAddress = info[7] + InvoiceDate = datetime.today().strftime('%m/%d/%Y') + + + body = ''' + + CFF Order Invoice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

INVOICE

+ Address Block 

Make Checks Payable To:
Great Lakes Integrated
4246 Hudson Dr.
Stow, Ohio 44224
 

+

+ Order Number: {OrderNumber}  +
Order Date: {OrderDate}  +
User Logon: {UserLogon}  +
Name: {Name}  +
Charge Code: {ChargeCode}  +

+
+

+ Invoice Number: {InvoiceNumber}  +
Invoice Date: {InvoiceDate}  +
Customer Number: 1925  +
Terms:Due in 30 days  +

+

The order consists of the following items:

+ +
+ + + ''' + HTMLpart = body.format(OrderNumber=OrderNumber, OrderDate=OrderDate, UserLogon=UserLogon, Name=Name, + ChargeCode=ChargeCode, InvoiceDate=InvoiceDate, InvoiceNumber=InvoiceNumber) + + bodyHTML = MIMEText(HTMLpart, "html") + + f = open("sample.html", 'w') + f.write(HTMLpart) + f.close() + + msg = MIMEMultipart() + msg['Subject'] = 'INVOICE ' + InvoiceNumber + if test is True: + msg['To'] = 'ddembinski@gll.com' + else: + # msg['To'] = InvoiceEmailAddress + msg['To'] = 'ddembinski@gll.com' + msg['From'] = 'ddembinski@gll.com' + msg.add_header('Content-Type', 'text/html') + msg.attach(bodyHTML) + + try: + with smtplib.SMTP(smtp_server, port, timeout=120) as server: + server.sendmail(msg['From'], msg['To'], msg.as_string()) + except Exception as e: + print(e) +