class PatientSummariesReport(object): """total income, total refunds, discounts, ordered price, amount due by certain patient """ def __init__(self): self.patient_id = None self.ordersDetailsReport = OrdersDetailsReport() self.incomeReport = IncomeReport() self.refundsReport = RefundsReport() def filterDateRange(self, startDate=None, endDate=None): startTime = datetime.time(00, 00) endTime = datetime.time(23, 59) self.startDate = startDate if startDate else datetime.date.today() self.endDate = endDate if endDate else datetime.date.today() self.startDate = datetime.datetime.combine(self.startDate, startTime) self.endDate = datetime.datetime.combine(self.endDate, endTime) def filterByPatient(self, patient_id=None): self.patient_id = patient_id def result(self): self.ordersDetailsReport.filterDateRange(self.startDate, self.endDate) self.incomeReport.filterDateRange(self.startDate, self.endDate) self.refundsReport.filterDateRange(self.startDate, self.endDate) self.ordersDetailsReport.filterByPatient(self.patient_id) self.incomeReport.filterByPatient(self.patient_id) self.refundsReport.filterByPatient(self.patient_id) return {"totalPayments": self.incomeReport.result(), "totalRefunds": self.refundsReport.result(), "ordersSummary": self.ordersDetailsReport.result()}
class NetIncomeReport(object): def __init__(self): self.incomReport = IncomeReport() self.refundsReport = RefundsReport() self.category_id = None def filterDateRange(self, startDate=None, endDate=None): startTime = datetime.time(00, 00) endTime = datetime.time(23, 59) self.startDate = startDate if startDate else datetime.date.today() self.endDate = endDate if endDate else datetime.date.today() self.startDate = datetime.datetime.combine(self.startDate, startTime) self.endDate = datetime.datetime.combine(self.endDate, endTime) self.incomReport.filterDateRange(self.startDate, self.endDate) self.refundsReport.filterDateRange(self.startDate, self.endDate) def filterByCategory(self, category_id=None): self.category_id = category_id self.incomReport.filterByCategory(category_id) self.refundsReport.filterByCategory(category_id) def result(self): incomeResult = self.incomReport.result() refundsResult = self.refundsReport.result() netIncome = incomeResult["total"] - refundsResult["refundamount"] result = {'refunds': refundsResult, 'income': incomeResult, 'netIncome': netIncome} return result
class IncomeByUsersReport(object): """income by users report using payment dateTime""" def __init__(self): self.user_id = None self.accountTransactions = AccountTransactionsReport() self.refunds = RefundsReport() def filterDateRange(self, startDate=None, endDate=None): startTime = datetime.time(00, 00) endTime = datetime.time(23, 59) self.startDate = startDate if startDate else datetime.date.today() self.endDate = endDate if endDate else datetime.date.today() self.startDate = datetime.datetime.combine(self.startDate, startTime) self.endDate = datetime.datetime.combine(self.endDate, endTime) def filterByUser(self, user_id=None): self.user_id = user_id def result(self): self.accountTransactions.filterDateRange(self.startDate, self.endDate) self.refunds.filterDateRange(self.startDate , self.endDate) subQueryUser = select([User.name], ServicePayment.createdBy_id == User.id).label('receivedBy') paymentTypeNameCol = case([ (ServicePayment.paymentType == PaymentTypes.CASH, PaymentTypes.name(PaymentTypes.CASH)), (ServicePayment.paymentType == PaymentTypes.VISA, PaymentTypes.name(PaymentTypes.VISA)), (ServicePayment.paymentType == PaymentTypes.ACCOUNT, PaymentTypes.name(PaymentTypes.ACCOUNT))], else_="unknown") q = db.session.query( ServicePayment.paymentType.label("paymentType"), paymentTypeNameCol.label("paymentTypeName"), subQueryUser, func.sum(ServicePayment.amount).label("amount") ).filter(ServicePayment.paymentDateTime.between(self.startDate, self.endDate)).group_by( ServicePayment.paymentType, ServicePayment.createdBy_id).order_by(ServicePayment.createdBy_id) # return(str(q)) if self.user_id is not None: q = q.filter(ServicePayment.createdBy_id == self.user_id) self.accountTransactions.filterByUser(self.user_id) self.refunds.filterByUser(self.user_id) accountTransactionsResult = self.accountTransactions.result() refundsResult = self.refunds.result() dbResult = q.all() paymentsListByUser = [dict(zip(row.keys(), row)) for row in dbResult] totalCash = sum([row["amount"] for row in paymentsListByUser if row['paymentType'] == PaymentTypes.CASH]) totalVisa = sum([row["amount"] for row in paymentsListByUser if row['paymentType'] == PaymentTypes.VISA]) totalAccount = sum([row["amount"] for row in paymentsListByUser if row['paymentType'] == PaymentTypes.ACCOUNT]) totalPayments = totalCash + totalVisa + totalAccount result = {'details': paymentsListByUser, 'totals': {'CASH': totalCash, 'VISA': totalVisa, 'ACCOUNT':totalAccount, 'grandTotal': totalPayments}, "accountTransactions": accountTransactionsResult, 'refunds': refundsResult} return result
def test_withDefaultDate_report(self): refundsReport = RefundsReport() # datetime.date(2016, 3, 12) refundsReport.filterDateRange() result = refundsReport.result() # print(result) expected = {"refundamount": 1300, "refundfee": 600} self.assertEquals(expected, result)
def test_income_report(self): refundsReport = RefundsReport() # datetime.date(2016, 3, 12) refundsReport.filterDateRange(datetime.date.today(), datetime.datetime.now()) result = refundsReport.result() # print(result) expected = {"refundamount": 1300, "refundfee": 600} self.assertEquals(expected, result)
def get(self): qParser = reqparse.RequestParser() qParser.add_argument("fromDate", type=dateInput, default=None) qParser.add_argument("toDate", type=dateInput, default=None) args = qParser.parse_args() fromDate = args.get("fromDate") toDate = args.get("toDate") refundsReport = RefundsReport() refundsReport.filterDateRange(fromDate, toDate) return refundsReport.result()
def get(self): qParser = reqparse.RequestParser() qParser.add_argument('fromDate', type=dateInput, default=None) qParser.add_argument('toDate', type=dateInput, default=None) qParser.add_argument('category_id', type=int, default=None) args = qParser.parse_args() fromDate = args.get('fromDate') toDate = args.get('toDate') category_id = args.get('category_id') refundsReport = RefundsReport() refundsReport.filterDateRange(fromDate, toDate) return refundsReport.result()