commit fda87aae24c0a6adf343c5eaefa379480fd624a0 Author: Malar Kannan Date: Mon Jul 17 12:30:45 2017 +0530 initial version diff --git a/invoice.py b/invoice.py new file mode 100644 index 0000000..c9b925e --- /dev/null +++ b/invoice.py @@ -0,0 +1,72 @@ +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() diff --git a/invoice_data.json b/invoice_data.json new file mode 100644 index 0000000..39eb254 --- /dev/null +++ b/invoice_data.json @@ -0,0 +1,19 @@ +[{ + "customer_id": "123", + "invoice_due_date": "2017-07-17T12:12:00.511Z", + "reminder_start": "10", + "reminder_every": "5", + "invoice_amount": "1000" +},{ + "customer_id": "124", + "invoice_due_date": "2017-07-17T12:21:00.511Z", + "reminder_start": "10", + "reminder_every": "5", + "invoice_amount": "1000" +},{ + "customer_id": "125", + "invoice_due_date": "2017-07-17T12:22:00.511Z", + "reminder_start": "60", + "reminder_every": "20", + "invoice_amount": "1000" +}]