''' Created on May 25th, 2016 @author: Wes ''' import schedule, time, threading, functools, glob, ctypes, sys sys.dont_write_bytecode = True from download_transmissions import maharamOrderDownload, maharamInvoiceUpload, maharamASNUpload from download_transmissions import momentumOrderDownload, momentumInvoiceUpload, momentumASNUpload from download_transmissions import kravetOrderDownload from download_transmissions import glenravenASNDownload from download_transmissions import UNIFI_846_Download from kf_850 import processKravetPo from mg_850 import processMomentumPo from mg_810 import createMomentumInvoiceDocument from mg_856 import createMomentumASN from mf_850 import processMaharamPo from mf_810 import createMaharamInvoiceDocuments from mf_856 import createMaharamShipNotices from gr_856_in import processInboundGRASN from dt_cut import dtxInvoiceAlert from FGI_report import run_FGI_report #Function decorator to catch exceptions instead of halting scheduler job. def catch_exceptions(job_func): @functools.wraps(job_func) def wrapper(*args, **kwargs): try: job_func(*args, **kwargs) except: import traceback print(traceback.format_exc()) update_title() return wrapper @catch_exceptions def mf_850(): print ('Submitting job: maharamOrderDownload()') maharamOrderDownload() print '' if len(glob.glob('D:\\FTP\\MAH_850_*.txt')) > 0: print 'Processing Maharam POs...' for name in reversed(glob.glob('D:\\FTP\\MAH_850_*.txt')): processMaharamPo(name) print '' update_title() @catch_exceptions def mf_810(): print 'Submitting job: createMaharamInvoiceDocuments()' createMaharamInvoiceDocuments() print '' if len(glob.glob('D:\\FTP\\SEND_MF\\STM_INVOICE_*.xml')) > 0: print 'Uploading invoice documents to Maharam FTP server...' maharamInvoiceUpload() print '' update_title() @catch_exceptions def mf_856(): print 'Submitting job: createMaharamShipNotices()' createMaharamShipNotices() print '' if len(glob.glob('D:\\FTP\\SEND_MF\\STM_856_*.txt')) > 0: print 'Uploading shipment notices to Maharam FTP server...' maharamASNUpload() print '' update_title() @catch_exceptions def mg_850(): print ('Submitting job: momentumOrderDownload()') momentumOrderDownload() print '' if len(glob.glob('D:\\FTP\\SBR_850_*.txt')) > 0: print 'Processing Momentum POs...' for name in reversed(glob.glob('D:\\FTP\\SBR_850_*.txt')): processMomentumPo(name) print '' update_title() @catch_exceptions def mg_810(): print 'Submitting job: createMomentumInvoiceDocument()' createMomentumInvoiceDocument() print '' if len(glob.glob('D:\\FTP\\SEND_MG\\SBR_810_*.txt')) > 0: print 'Uploading invoice documents to Momentum FTP server...' momentumInvoiceUpload() print '' update_title() @catch_exceptions def mg_856(): print 'Submitting job: createMomentumASN()' createMomentumASN() print '' if len(glob.glob('D:\\FTP\\SEND_MG\\SBR_856_*.txt')) > 0: print 'Uploading shipment notices to Momentum FTP server...' momentumASNUpload() print '' update_title() @catch_exceptions def kf_850(): print ('Submitting job: karvetOrderDownload()') kravetOrderDownload() print '' if len(glob.glob('D:\\FTP\\Kravet_to_vendor*.csv')) > 0: print 'Processing Kravet POs...' for name in reversed(glob.glob('D:\\FTP\\Kravet_to_vendor*.csv')): processKravetPo(name) print '' update_title() @catch_exceptions def gr_856_in(): print ('Submitting job: glenravenASNDownload()') glenravenASNDownload() print '' #Add processing bit here later if len(glob.glob('D:\\FTP\\INCOMING\\GR_ASN_*.csv')) > 0: print 'Processing Glen Raven Ship Notices...' for name in reversed(glob.glob('D:\\FTP\\INCOMING\\GR_ASN_*.csv')): print name #processInboundGRASN(name) update_title() @catch_exceptions def un_846_in(): print ('Submitting job: UNIFI_846_Download()') UNIFI_846_Download() print '' #Add processing bit here later update_title() @catch_exceptions def dtx_cut_alert(): print ('Submitting job: dtxInvoiceAlert()') dtxInvoiceAlert() print '' update_title() @catch_exceptions def FGI_report(): print ('Submitting job: run_FGI_report()') run_FGI_report() print '' update_title() ''' Hacked this together to so I can add the name of the next job and when it will run to the console title. ''' def update_title(): message = 'Scheduler.py - Next Job: ' + min(schedule.jobs).job_func.args.__repr__().split(' ')[1] + ' @ ' + str(schedule.next_run()) ctypes.windll.kernel32.SetConsoleTitleA(message) #Use to run a job in it's own thread def run_threaded(job_func): job_thread = threading.Thread(target=job_func) job_thread.start() ''' An attempt to clean up the schedule code below. Schedules 'func' to run at 'time' Monday-Friday ''' def weekdays(time, func): schedule.every().monday.at(time).do(run_threaded, func) schedule.every().tuesday.at(time).do(run_threaded, func) schedule.every().wednesday.at(time).do(run_threaded, func) schedule.every().thursday.at(time).do(run_threaded, func) schedule.every().friday.at(time).do(run_threaded, func) if __name__ == '__main__': #Maharam PO Download mf_850_runs = ['08:25','09:55','11:25','12:55','14:25','15:55','17:25'] for t in mf_850_runs: weekdays(t, mf_850) #Maharam Invoice Upload. This transmission was sent at 16:40 on the AS400 mf_810_runs = ['16:40'] for t in mf_810_runs: weekdays(t, mf_810) #Maharam ASN Upload mf_856_runs = ['08:45','12:45','13:45','14:45','15:45','16:44','17:45'] for t in mf_856_runs: weekdays(t, mf_856) #Momentum PO Download mg_850_runs = ['12:25','19:25'] for t in mg_850_runs: weekdays(t, mg_850) #Momentum Invoice Upload Begin. This transmission was sent at 16:45 on the AS400 mg_810_runs = ['16:45'] for t in mg_810_runs: weekdays(t, mg_810) #Momentum ASN Upload. This transmission was sent at 12:15 on the AS400 mg_856_runs = ['12:15','17:30'] for t in mg_856_runs: weekdays(t, mg_856) #Kravet PO Download kf_850_runs = ['07:25'] for t in kf_850_runs: weekdays(t, kf_850) #Glen Raven 856 Download gr_856_in_runs = ['08:00', '13:00'] for t in gr_856_in_runs: weekdays(t, gr_856_in) #UNIFI 846 Download un_846_in_runs = ['08:01', '13:01'] for t in un_846_in_runs: weekdays(t, un_846_in) ''' ** DISABLED 2017-10-02 ** We have ended the consignment program #Designtex Cut into alert dt_cut_runs = ['08:02', '10:00'] for t in dt_cut_runs: weekdays(t, dtx_cut_alert) ''' #FGI Report schedule.every().saturday.at('23:59').do(run_threaded, FGI_report) #schedule.every(10).seconds.do(run_threaded, derp) #threaded example #Non-threaded examples #schedule.every(10).minutes.do(job) #schedule.every().hour.do(job) #schedule.every().day.at("10:30").do(job) #schedule.every().monday.do(job) #schedule.every().wednesday.at("13:15").do(job) print 'Job started. Do not close this window!' print 'Ctrl-C to exit.' update_title() while True: schedule.run_pending() time.sleep(1)