numberz-sched/invoice.py

73 lines
2.5 KiB
Python
Raw Permalink Normal View History

2017-07-17 07:00:45 +00:00
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()