cboddeposit-10-cash-admission.spp
cboddeposit/admission/cboddeposit-10-cash-admission.spp
Download original file · Bank deposit source contents
1domain cboddeposit;23// GSA01102 normal cash entry, distinct from the zero-amount kernel.45Role BusinessDay {6int date;7}89Role AccountEligibility {10String accountNumber;11AccountStatus status;12boolean temporary;13int expiresOn;14boolean temporaryOpen;15int detailCount;16int lastTransactionDate;17int openedOn;18BigDecimal(19, 2) cashDepositedToday;19BigDecimal(19, 2) transferredToday;20BigDecimal(19, 2) accountBalance;21}2223Role DepositProduct {24BigDecimal(19, 2) minimumOpeningAmount;25BigDecimal(19, 2) maximumOpeningAmount;26BigDecimal(19, 2) maximumBalance;27}2829atomic check checkCashInput(DepositRequest, BusinessDay) {30require(DepositRequest.amount > 0, "E1155");31require(DepositRequest.valueDate <= BusinessDay.date, "E1044");32require(DepositRequest.valueDate >= BusinessDay.date, "E1043");33}3435atomic check checkDepositEligibility(DepositRequest, AccountEligibility, DepositProduct, BusinessDay) {36require(37!AccountEligibility.temporary38|| AccountEligibility.expiresOn >= BusinessDay.date39|| AccountEligibility.temporaryOpen,40"EDF19"41);42require(AccountEligibility.status != AccountStatus.CLOSED, "EO082");43boolean opening = AccountEligibility.detailCount == 044|| (AccountEligibility.detailCount > 045&& AccountEligibility.detailCount < 1046&& AccountEligibility.accountBalance == 047&& AccountEligibility.lastTransactionDate == AccountEligibility.openedOn48&& AccountEligibility.cashDepositedToday == 049&& AccountEligibility.transferredToday == 0);50if (opening) {51require(52DepositProduct.minimumOpeningAmount <= 053|| DepositRequest.amount >= DepositProduct.minimumOpeningAmount,54"EN173"55);56require(57DepositProduct.maximumOpeningAmount <= 058|| DepositRequest.amount <= DepositProduct.maximumOpeningAmount,59"EN174"60);61}62require(63DepositProduct.maximumBalance <= 064|| DepositRequest.amount65+ AccountEligibility.accountBalance <= DepositProduct.maximumBalance,66"EN175"67);68}6970// Cash-only subset of KSADEP0 warning/authorization. Parameter values are queried facts.7172Role CashAuthorizationPolicy {73BigDecimal(19, 2) warningThreshold;74BigDecimal(19, 2) tellerLimit;75BigDecimal(19, 2) levelAMultiplier;76BigDecimal(19, 2) specialUsdLevelB;77BigDecimal(19, 2) specialUsdLevelA;78}7980Role CashChannel {81boolean teller;82String channel;83business("Legacy bank transaction business code") String transactionId;84String transactionFamily;85String businessCode;86}8788Role AuthorizationEvidence {89AuthorizationLevel grantedLevel;90}9192Role AdmissionDecision {93String warningCode;94String authorizationCode;95AuthorizationLevel requiredLevel;96AdmissionStatus status;97boolean executable;98BigDecimal(19, 2) dayCashTotal;99}100101atomic calculate assessCashAdmission(102DepositRequest,103AccountEligibility,104BusinessDay,105CashChannel,106CashAuthorizationPolicy,107AuthorizationEvidence,108AdmissionDecision109) {110AdmissionDecision.warningCode = "";111AdmissionDecision.authorizationCode = "";112AdmissionDecision.requiredLevel = AuthorizationLevel.NONE;113AdmissionDecision.dayCashTotal = DepositRequest.amount;114if (AccountEligibility.lastTransactionDate == BusinessDay.date) {115AdmissionDecision.dayCashTotal += AccountEligibility.cashDepositedToday;116}117boolean applies = CashChannel.teller118&& CashChannel.channel != "AGS"119&& CashChannel.transactionId != "FL0658000"120&& CashChannel.transactionId != "FL0655400"121&& CashChannel.transactionId != "FL0659302"122&& CashChannel.transactionId != "FL0659304"123&& CashChannel.transactionId != "FL0659306"124&& CashChannel.transactionId != "FL0659308";125if (applies) {126boolean warningBusiness = CashChannel.businessCode == "SA0"127|| CashChannel.businessCode == "TD0"128|| CashChannel.businessCode == "CR0"129|| CashChannel.businessCode == "FS0";130if (warningBusiness131&& CashAuthorizationPolicy.warningThreshold > 0132&& AdmissionDecision.dayCashTotal > CashAuthorizationPolicy.warningThreshold) {133AdmissionDecision.warningCode = "F0554";134}135if (DepositRequest.amount > CashAuthorizationPolicy.tellerLimit) {136if (CashChannel.transactionFamily == "XT01821" && DepositRequest.currency == "USD") {137if (DepositRequest.amount > CashAuthorizationPolicy.specialUsdLevelB) {138if (DepositRequest.amount > CashAuthorizationPolicy.specialUsdLevelA) {139AdmissionDecision.requiredLevel = AuthorizationLevel.A;140AdmissionDecision.authorizationCode = "A8147";141} else {142AdmissionDecision.requiredLevel = AuthorizationLevel.B;143AdmissionDecision.authorizationCode = "B7006";144}145}146} else {147if (DepositRequest.amount > CashAuthorizationPolicy.levelAMultiplier148* CashAuthorizationPolicy.tellerLimit) {149AdmissionDecision.requiredLevel = AuthorizationLevel.A;150AdmissionDecision.authorizationCode = "A8147";151} else {152AdmissionDecision.requiredLevel = AuthorizationLevel.B;153AdmissionDecision.authorizationCode = "B7000";154}155}156}157}158AdmissionDecision.executable = AdmissionDecision.requiredLevel == AuthorizationLevel.NONE159|| AuthorizationEvidence.grantedLevel == AuthorizationLevel.A160|| (AdmissionDecision.requiredLevel == AuthorizationLevel.B161&& AuthorizationEvidence.grantedLevel == AuthorizationLevel.B);162if (!AdmissionDecision.executable) {163AdmissionDecision.status = AdmissionStatus.PENDING_AUTHORIZATION;164} else {165if (AdmissionDecision.warningCode != "") {166AdmissionDecision.status = AdmissionStatus.WARNING;167} else {168AdmissionDecision.status = AdmissionStatus.READY;169}170}171}172173atomic check checkCashAuthorization(AdmissionDecision) {174require(AdmissionDecision.executable, "PENDING_AUTHORIZATION");175}