-
Notifications
You must be signed in to change notification settings - Fork 3
banking
valhuber edited this page Sep 28, 2020
·
2 revisions
This illustrates complex logic, including multiple sums, integrated with Python event.
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)
deposit = models.CHECKINGTRANS(TransId=100, CustNum=2, AcctNum=2, DepositAmt=1000, WithdrawlAmt=0, TransDate=trans_date)
Which:
- Adjusts
derive=CHECKING.Deposits, as_sum_of=CHECKINGTRANS.DepositAmt
- Adjusts
derive=CHECKING.ItemCount, as_count_of=CHECKINGTRANS
- Which recomputes
derive=CHECKING.AvailableBalance, as_expression=lambda row: row.Deposits - row.Withdrawls
- 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
![](../raw/master/images/jetbrains-variant-4.png)
Technology
Explore Implementation