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