コード例 #1
0
ファイル: incomeByUsers.py プロジェクト: yehiaa/clinic
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