From 6b11ef79ea719122eaf6787b6e48985635978508 Mon Sep 17 00:00:00 2001 From: Eric Phillips Date: Wed, 20 Oct 2021 20:13:40 -0600 Subject: [PATCH] tools for processing fdx reports --- flaskfdx/tools/fdxsql.py | 132 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 flaskfdx/tools/fdxsql.py diff --git a/flaskfdx/tools/fdxsql.py b/flaskfdx/tools/fdxsql.py new file mode 100644 index 0000000..22068cb --- /dev/null +++ b/flaskfdx/tools/fdxsql.py @@ -0,0 +1,132 @@ +#!/bin/python +""" +batch process dsw xls files into existing sqlite3 database +usage sql-dsw INFILE DATABASE +""" + +import sys +import xlrd +import argparse +import sqlite3 +from sqlite3 import Error + +def openDatabase(database): + conn = None + try: + conn = sqlite3.connect(database) + except Error as e: + print(e) + + return conn + +def appendLedger(conn, table, values): + """ + add values to sqlite3 database + """ + holders = ','.join('?' * len(values)) + c = conn.cursor() + c.execute('INSERT INTO {} VALUES ({})'.format(table, holders), values) + conn.commit() + +def extractValues(srcSheet, conn, reportDate): + """ + get dsw data from srcSheet and call appendLedger with values + """ + # we dont extract data until we find a particular spot in the worksheet + # there may be a search or other better way to do this + extract = False + # loop through the data + for i in range(srcSheet.nrows): + #exit test comes first + if 'Total' in srcSheet.cell(i,0).value: + # We need to get the contract totals so we'll do that here + values = ('contract', reportDate, srcSheet.cell(i,6).value, + srcSheet.cell(i,7).value, srcSheet.cell(i,8).value, + srcSheet.cell(i,10).value, srcSheet.cell(i,11).value, + srcSheet.cell(i,12).value, srcSheet.cell(i,13).value, + srcSheet.cell(i,14).value, srcSheet.cell(i,20).value, + srcSheet.cell(i,18).value, srcSheet.cell(i,32).value, + srcSheet.cell(i,33).value, srcSheet.cell(i,34).value) + appendLedger(conn, 'totals', values) + i += 1 + values = ('terminal', reportDate, srcSheet.cell(i,6).value, + srcSheet.cell(i,7).value, srcSheet.cell(i,8).value, + srcSheet.cell(i,10).value, srcSheet.cell(i,11).value, + srcSheet.cell(i,12).value, srcSheet.cell(i,13).value, + srcSheet.cell(i,14).value, srcSheet.cell(i,20).value, + srcSheet.cell(i,18).value, srcSheet.cell(i,32).value, + srcSheet.cell(i,33).value, srcSheet.cell(i,34).value) + appendLedger(conn, 'totals', values) + #we're done so exit + break + # get the individual route totals, need to figure a way to get skip double trip lines and get times for drivers on same + if extract and srcSheet.cell(i,3).value and srcSheet.cell(i,1).value: + #times for multi recorded driver are in cell i+1,32 and i+1,34 + if not srcSheet.cell(i,26).value: + tod = srcSheet.cell(i+1,31).value + nod = srcSheet.cell(i+1,33).value + else: + tod = srcSheet.cell(i,26).value + nod = srcSheet.cell(i,28).value + values = (srcSheet.cell(i,0).value, reportDate, srcSheet.cell(i,1).value, + srcSheet.cell(i,3).value, tod, nod, + srcSheet.cell(i,9).value, + srcSheet.cell(i,10).value, srcSheet.cell(i,11).value, + srcSheet.cell(i,12).value, srcSheet.cell(i,2).value, + srcSheet.cell(i,24).value, srcSheet.cell(i,13).value, + srcSheet.cell(i,19).value, srcSheet.cell(i,17).value) + appendLedger(conn, 'dsw', values) + if 'Svc' in srcSheet.cell(i,0).value: + extract = True + +def checkDate(conn, thisDate): + """ + check the date for this report against processed reports + return true if we have or false if we have not. + need to do this against sql database + """ + # todo add a cli flag to disable date check for when they break to report format + query = '''SELECT EXISTS(SELECT 1 FROM totals WHERE date="{}");'''.format(thisDate) + c = conn.cursor() + c.execute(query) + if c.fetchone()[0]: + return True + #return False + else: + return False + +def getDate(srcSheet): + #set the date for the report and check + #if we have already processed this date + datestring = srcSheet.cell(0,0).value + tempDate = str.split(datestring)[7] + #convert the yyyymmdd to yyyy-mm-dd + reportDate = tempDate[6:10]+'-'+tempDate[0:2]+'-'+tempDate[3:5] + return reportDate + +def main(): + # get filename and database rom cmdline + parser = argparse.ArgumentParser() + parser.add_argument("inFile") + parser.add_argument("database") + args = parser.parse_args() + + # open the excel sheet for reading + srcBook = xlrd.open_workbook(args.inFile) + srcSheet = srcBook.sheet_by_index(0) + + reportDate = getDate(srcSheet) + + #open the database + conn = openDatabase(args.database) + if conn == None: + sys.exit('database could not be opened, does it exist') + + # check if records already exist and then add records if not + if checkDate(conn, reportDate): + print("we have already processed " + reportDate) + else: + extractValues(srcSheet, conn, reportDate) + +if __name__ == '__main__': + main()