S++Business systems language
DEMO SOURCE · SPP / APP / PHYRead the book

cboddeposit-10-postings.spp

cboddeposit/reversal/cboddeposit-10-postings.spp

Download original file · Bank deposit source contents

1domain cboddeposit;23Role CashReversalPostingLine {4    CashReversalAgreement reversal;5    int slot;6    String subject;7    String side;8    BigDecimal(19, 2) amount;9}1011atomic query listDepositPostings(key CashDepositAgreement, DepositPostingLine[]);1213atomic check checkOriginalDepositPostings(CashDepositAgreement, DepositPostingLine[]) {14    int count = 0;15    for (DepositPostingLine line : DepositPostingLine[]) {16        count++;17        require(18            line.deposit.depositNumber == CashDepositAgreement.depositNumber,19            "ORIGINAL_DEPOSIT_POSTING_OWNER_MISMATCH"20        );21        require(22            line.slot >= 123                && line.slot <= 824                && line.subject != null25                && line.subject != ""26                && line.amount >= 0,27            "INVALID_ORIGINAL_DEPOSIT_POSTINGS"28        );29        int matching = 0;30        for (DepositPostingLine other : DepositPostingLine[]) {31            if (other.slot == line.slot) {32                matching++;33            }34        }35        require(matching == 1, "INVALID_ORIGINAL_DEPOSIT_POSTINGS");36        if (line.slot == 1 || line.slot == 2 || line.slot == 7) {37            require(line.side == "Debit", "INVALID_ORIGINAL_DEPOSIT_POSTINGS");38        } else {39            require(line.side == "Credit", "INVALID_ORIGINAL_DEPOSIT_POSTINGS");40        }41        int evidenceMatches = 0;42        for (DepositPostingLine evidence : CashDepositAgreement.postingEvidence) {43            if (evidence.slot == line.slot) {44                require(45                    evidence.subject == line.subject46                        && evidence.side == line.side47                        && evidence.amount == line.amount,48                    "ORIGINAL_DEPOSIT_LEDGER_EVIDENCE_MISMATCH"49                );50                evidenceMatches++;51            }52        }53        require(evidenceMatches == 1, "ORIGINAL_DEPOSIT_LEDGER_EVIDENCE_MISMATCH");54        switch (line.slot) {55            case 1:56                require(57                    line.amount == CashDepositAgreement.amount,58                    "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH"59                );60                break;61            case 2:62                require(63                    line.amount == max(0, -CashDepositAgreement.interestBaseDelta),64                    "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH"65                );66                break;67            case 3:68                require(69                    line.amount == max(0, CashDepositAgreement.interestBaseDelta),70                    "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH"71                );72                break;73            case 4:74                require(75                    line.amount == CashDepositAgreement.principalPaid,76                    "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH"77                );78                break;79            case 5:80                require(81                    line.amount == CashDepositAgreement.interestPaid,82                    "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH"83                );84                break;85            case 6:86                require(87                    line.amount == CashDepositAgreement.collectionPaid,88                    "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH"89                );90                break;91            case 7:92                require(line.amount == CashDepositAgreement.fee, "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH");93                break;94            case 8:95                require(line.amount == CashDepositAgreement.fee, "ORIGINAL_DEPOSIT_POSTING_AMOUNT_MISMATCH");96                break;97        }98    }99    require(count == 8, "INVALID_ORIGINAL_DEPOSIT_POSTINGS");100}101102atomic calculate prepareCashReversalPostings(103    DepositPostingLine[],104    CashReversalAgreement,105    CashReversalPostingLine[],106    DepositPostingTotals107) {108    CashReversalPostingLine[] = new CashReversalPostingLine[] {109    };110    DepositPostingTotals.debit = 0;111    DepositPostingTotals.credit = 0;112    DepositPostingTotals.fee = CashReversalAgreement.refundAmount;113    for (DepositPostingLine original : DepositPostingLine[]) {114        CashReversalPostingLine line = new CashReversalPostingLine();115        line.slot = original.slot;116        line.subject = original.subject;117        if (original.side == "Debit") {118            line.side = "Credit";119        } else {120            line.side = "Debit";121        }122        line.amount = original.amount;123        if (original.slot == 7 || original.slot == 8) {124            line.amount = CashReversalAgreement.refundAmount;125        }126        if (line.side == "Debit") {127            DepositPostingTotals.debit += line.amount;128        } else {129            DepositPostingTotals.credit += line.amount;130        }131        CashReversalPostingLine[] = append(CashReversalPostingLine[], line);132    }133}134135atomic calculate attachCashReversalPostings(CashReversalAgreement, CashReversalPostingLine[]) {136    for (CashReversalPostingLine line : CashReversalPostingLine[]) {137        line.reversal = CashReversalAgreement;138    }139}140141atomic query listCashReversalPostings(key CashReversalAgreement, CashReversalPostingLine[]);