Skip to content

banking

valhuber edited this page Sep 28, 2020 · 2 revisions

Banking

This illustrates complex logic, including multiple sums, integrated with Python event.

Logic

def activate_basic_rules():
    def transferFunds(row: TRANSFERFUND, old_row: TRANSFERFUND, logic_row: LogicRow):
        if logic_row.ins_upd_dlt == "ins" or True:  # logic engine fills parents for insert
            print("Transfer from source to target")

    Rule.sum(derive=CHECKING.Deposits, as_sum_of=CHECKINGTRANS.DepositAmt)
    Rule.sum(derive=CHECKING.Withdrawls, as_sum_of=CHECKINGTRANS.WithdrawlAmt)
    Rule.formula(derive=CHECKING.AvailableBalance, as_expression=lambda  row: row.Deposits - row.Withdrawls)
    Rule.count(derive=CHECKING.ItemCount, as_count_of=CHECKINGTRANS)

    Rule.sum(derive=CUSTOMER.CheckingAcctBal, as_sum_of=CHECKING.AvailableBalance)
    Rule.sum(derive=CUSTOMER.SavingsAcctBal, as_sum_of=SAVING.AvailableBalance)
    Rule.formula(derive=CUSTOMER.TotalBalance, as_expression=lambda row: row.CheckingAcctBal + row.SavingsAcctBal)
    Rule.constraint(validate=CUSTOMER,
                    as_condition=lambda row: row.TotalBalance >= 0,
                    error_msg="You balance ({row.TotalBalance}) is less than 0)")

    Rule.sum(derive=SAVING.Withdrawls, as_sum_of=SAVINGSTRANS.WithdrawlAmt)
    Rule.sum(derive=SAVING.Deposits, as_sum_of=SAVINGSTRANS.DepositAmt)
    Rule.formula(derive=SAVING.AvailableBalance, as_expression=lambda row: row.Deposits - row.Withdrawls)
    Rule.count(derive=SAVING.ItemCount, as_count_of=SAVINGSTRANS)

    Rule.formula(derive=CHECKINGTRANS.Total, as_expression=lambda row: row.DepositAmt - row.WithdrawlAmt)
    Rule.formula(derive=SAVINGSTRANS.Total, as_expression=lambda row: row.DepositAmt - row.WithdrawlAmt)

    Rule.commit_row_event(on_class=TRANSFERFUND, calling=transferFunds)

Data Model

Sample Transactions

Deposit To Checking - inserts a CHECKINGTRANS

deposit = models.CHECKINGTRANS(TransId=100, CustNum=2, AcctNum=2, DepositAmt=1000, WithdrawlAmt=0, TransDate=trans_date)

Which:

  1. Adjusts derive=CHECKING.Deposits, as_sum_of=CHECKINGTRANS.DepositAmt
  2. Adjusts derive=CHECKING.ItemCount, as_count_of=CHECKINGTRANS
  3. Which recomputes derive=CHECKING.AvailableBalance, as_expression=lambda row: row.Deposits - row.Withdrawls
  4. Which adjusts derive=CUSTOMER.CheckingAcctBal, as_sum_of=CHECKING.AvailableBalance

Visible in the log:

Logic Phase:		ROW LOGIC (sqlalchemy before_flush)			 - 2020-09-28 14:00:45,612 - logic_logger - DEBUG
..CHECKINGTRANS[100] {Insert - client} AcctNum: 2, ChkNo: None, CustNum: 2, DepositAmt: 1000, ImageURL: None, Total: None, TransDate: 2020-10-01 00:00:00, TransId: 100, WithdrawlAmt: 0  row@: 0x103bdf2e0 - 2020-09-28 14:00:45,613 - logic_logger - DEBUG
..CHECKINGTRANS[100] {Formula Total} AcctNum: 2, ChkNo: None, CustNum: 2, DepositAmt: 1000, ImageURL: None, Total: 1000, TransDate: 2020-10-01 00:00:00, TransId: 100, WithdrawlAmt: 0  row@: 0x103bdf2e0 - 2020-09-28 14:00:45,616 - logic_logger - DEBUG
....CHECKING[2 | 2] {Update - Adjusting CHECKING} AcctNum: 2, AcctType: C, AvailableBalance: 0.00, CreditCode: 1, CreditLimit: 0.00, CurrentBalance: 0.00, CustNum: 2, Deposits:  [0.00-->] 1000.00, ItemCount:  [0-->] 1, Withdrawls: 0.00  row@: 0x103dee790 - 2020-09-28 14:00:45,617 - logic_logger - DEBUG
....CHECKING[2 | 2] {Formula AvailableBalance} AcctNum: 2, AcctType: C, AvailableBalance:  [0.00-->] 1000.00, CreditCode: 1, CreditLimit: 0.00, CurrentBalance: 0.00, CustNum: 2, Deposits:  [0.00-->] 1000.00, ItemCount:  [0-->] 1, Withdrawls: 0.00  row@: 0x103dee790 - 2020-09-28 14:00:45,617 - logic_logger - DEBUG
......CUSTOMER[2] {Update - Adjusting CUSTOMER} CheckingAcctBal:  [0.00-->] 1000.00, City: Ormond, CustNum: 2, Name: Tyler, Phone: None, SavingsAcctBal: 0.00, State: FL, Street: 123 main, TotalBalance: 0.00, ZIP: 32751, emailAddress: None  row@: 0x103e02820 - 2020-09-28 14:00:45,620 - logic_logger - DEBUG
......CUSTOMER[2] {Formula TotalBalance} CheckingAcctBal:  [0.00-->] 1000.00, City: Ormond, CustNum: 2, Name: Tyler, Phone: None, SavingsAcctBal: 0.00, State: FL, Street: 123 main, TotalBalance:  [0.00-->] 1000.00, ZIP: 32751, emailAddress: None  row@: 0x103e02820 - 2020-09-28 14:00:45,620 - logic_logger - DEBUG
Logic Phase:		COMMIT   									 - 2020-09-28 14:00:45,621 - logic_logger - DEBUG
Logic Phase:		FLUSH   (sqlalchemy flush processing       	 - 2020-09-28 14:00:45,622 - logic_logger - DEBUG