73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
|
|
from threading import Timer
|
||
|
|
import json
|
||
|
|
import datetime
|
||
|
|
|
||
|
|
|
||
|
|
def json_time(x): return datetime.datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||
|
|
|
||
|
|
|
||
|
|
def seconds_remaining(r_d): return (
|
||
|
|
r_d - datetime.datetime.now()).total_seconds()
|
||
|
|
|
||
|
|
|
||
|
|
class InvoiceData(object):
|
||
|
|
"""docstring for InvoiceData."""
|
||
|
|
|
||
|
|
def __init__(self, invoice_data):
|
||
|
|
super(InvoiceData, self).__init__()
|
||
|
|
self.customer_id = invoice_data["customer_id"]
|
||
|
|
self.due_date = json_time(invoice_data["invoice_due_date"])
|
||
|
|
self.amount = invoice_data["invoice_amount"]
|
||
|
|
rem_start = invoice_data["reminder_start"]
|
||
|
|
rem_every = invoice_data["reminder_every"]
|
||
|
|
self.remind_before = datetime.timedelta(0, int(rem_start))
|
||
|
|
self.reminder_interval = datetime.timedelta(0, int(rem_every))
|
||
|
|
|
||
|
|
def __repr__(self):
|
||
|
|
return self.customer_id + "#" + self.due_date
|
||
|
|
|
||
|
|
def print_invoice(self):
|
||
|
|
invoice_str = "INVOICE FOR CUSTOMER ID : {}\nDATE:{}\nAMOUNT:{}\n"
|
||
|
|
print invoice_str.format(self.customer_id, self.due_date, self.amount)
|
||
|
|
|
||
|
|
def print_reminder(self):
|
||
|
|
inv_str = "REMINDER FOR CUSTOMER ID : {}\nINVOICE DUE ON :{}\nAMOUNT:{}\n"
|
||
|
|
print inv_str.format(self.customer_id, self.due_date, self.amount)
|
||
|
|
|
||
|
|
def schedule_reminders(self):
|
||
|
|
current_time = datetime.datetime.now()
|
||
|
|
reminder_start = (self.due_date - self.remind_before)
|
||
|
|
reminder_time = self.due_date - self.reminder_interval
|
||
|
|
|
||
|
|
def closed_reminder():
|
||
|
|
self.print_reminder()
|
||
|
|
while (reminder_time >= reminder_start
|
||
|
|
and reminder_time < self.due_date
|
||
|
|
and seconds_remaining(reminder_time) > 0):
|
||
|
|
inv_timer = Timer(seconds_remaining(
|
||
|
|
reminder_time), closed_reminder)
|
||
|
|
inv_timer.start()
|
||
|
|
reminder_time = reminder_time - self.reminder_interval
|
||
|
|
|
||
|
|
def schedule_invoice(self):
|
||
|
|
self.schedule_reminders()
|
||
|
|
|
||
|
|
def closed_invoice():
|
||
|
|
self.print_invoice()
|
||
|
|
if seconds_remaining(self.due_date) > 0:
|
||
|
|
inv_timer = Timer(seconds_remaining(self.due_date), closed_invoice)
|
||
|
|
inv_timer.start()
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_json(cls, file_name):
|
||
|
|
invoice_data = json.load(open(file_name, 'rb'))
|
||
|
|
invoice_list = []
|
||
|
|
for inv_d in invoice_data:
|
||
|
|
invoice_list.append(cls(inv_d))
|
||
|
|
return invoice_list
|
||
|
|
|
||
|
|
invoices = InvoiceData.from_json("./invoice_data.json")
|
||
|
|
for inv in invoices:
|
||
|
|
inv.print_invoice()
|
||
|
|
inv.schedule_invoice()
|