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()