diff --git a/functional_tests/README.md b/functional_tests/README.md new file mode 100644 index 00000000..68551177 --- /dev/null +++ b/functional_tests/README.md @@ -0,0 +1,21 @@ +# Roost Generated Functional Test + +**Execution Date:** 1/11/2026, 4:26:11 AM + +**Test Unique Identifier:** "TCSBaNCS_functional-after-fix_clone" + +**Input(s):** + 1. tcsdoc1.docx + Path: /var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix_clone/9753cf0f-24a8-4218-b25f-c12bddc2fe52/tcsdoc1.docx + 2. tcsdoc2.docx + Path: /var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix_clone/9753cf0f-24a8-4218-b25f-c12bddc2fe52/tcsdoc2.docx + +**Test Output Folder:** + 1. [TCSBaNCS_functional-after-fix_clone.json](TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.json) + 2. [TCSBaNCS_functional-after-fix_clone.feature](TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.feature) + 3. [TCSBaNCS_functional-after-fix_clone.csv](TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.csv) + 4. [TCSBaNCS_functional-after-fix_clone.xlsx](TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.xlsx) + 5. [TCSBaNCS_functional-after-fix_clone.docx](TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.docx) + +--- + diff --git a/functional_tests/TCSBaNCS_functional-after-fix_clone/.roost/roost_metadata.json b/functional_tests/TCSBaNCS_functional-after-fix_clone/.roost/roost_metadata.json new file mode 100644 index 00000000..50c624c1 --- /dev/null +++ b/functional_tests/TCSBaNCS_functional-after-fix_clone/.roost/roost_metadata.json @@ -0,0 +1,29 @@ +{ + "project": { + "name": "TCSBaNCS_functional-after-fix_clone", + "created_at": "2026-01-11T04:26:11.504Z", + "updated_at": "2026-01-11T04:26:11.504Z" + }, + "files": { + "input_files": [ + { + "fileName": "TCSBaNCS_functional-after-fix_clone.txt", + "fileURI": "/var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix_clone/9753cf0f-24a8-4218-b25f-c12bddc2fe52/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.txt", + "fileSha": "cf83e1357e" + }, + { + "fileName": "tcsdoc1.docx", + "fileURI": "/var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix_clone/9753cf0f-24a8-4218-b25f-c12bddc2fe52/functional_tests/TCSBaNCS_functional-after-fix_clone/tcsdoc1.docx", + "fileSha": "2cd5271236" + }, + { + "fileName": "tcsdoc2.docx", + "fileURI": "/var/tmp/Roost/RoostGPT/TCSBaNCS_functional-after-fix_clone/9753cf0f-24a8-4218-b25f-c12bddc2fe52/functional_tests/TCSBaNCS_functional-after-fix_clone/tcsdoc2.docx", + "fileSha": "55a242034e" + } + ] + }, + "api_files": { + "input_files": [] + } +} \ No newline at end of file diff --git a/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.csv b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.csv new file mode 100644 index 00000000..1d42d1f8 --- /dev/null +++ b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.csv @@ -0,0 +1,14 @@ +"Local equity buy - order capture validations (self-transaction prevention and price threshold correction)" +"Local equity buy - partial fills, 1051 recon, manual match within tolerance, 1052 idempotency, fees and tax" +"Foreign equity buy - broker EOD average-price recapture, fees mapping, settlement and idempotent re-upload" +"Mutual fund purchase - 1051 allocation then reversal/reallocation at corrected NAV, customer and street settlement, tax and accrual triggers" +"Outside-bank transfer outbound (15) and inbound (132) with repair, recon, manual match tolerance and idempotent 1052" +"Security product setup validations and MI rate ingestion idempotency" +"Custody fee daily accrual, back-dated recompute, quarterly posting and messaging/reporting" +"TASE 1054 failed/pending trades - enforce manual blocks, cancel with reversals, idempotent 1054 reprocessing" +"Fractional order processing - transit deal to bank fraction portfolio, average price, 1052 settlement and idempotency" +"ADR/GDR conversion - linked Delivery Out/In via External Reference 2 and settlement" +"Positions and cash reconciliation vs 1053, 871/872, Tax Engine, and File 32 with scope removal and idempotency" +"Within-bank securities transfer with CA ex-date block, 60/40 split and maker-checker approval" +"Entitlement-controlled display and Level 2 blocking with ETF dual-path prompt" +"POA restrictions, MU/home-branch validation, maker-checker pool assignment, and nostro timeout auto-cancel" \ No newline at end of file diff --git a/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.docx b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.docx new file mode 100644 index 00000000..5b90607c Binary files /dev/null and b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.docx differ diff --git a/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.feature b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.feature new file mode 100644 index 00000000..282cc70a --- /dev/null +++ b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.feature @@ -0,0 +1,773 @@ +gherkin +Feature: Capital Markets E2E - Trading, Settlements, Transfers, Fees, Recon and Entitlements + + # API Tests + + @api @orders @validations @CMBO-TC-001 + Scenario Outline: Local equity buy - order capture validations (self-transaction prevention and price threshold correction) + Given the API base URL is '' + And the authorization token is set to '' + And the content type is 'application/json' + When I send a POST request to '/api/orders' with payload + """ + { + "portfolioId": "PF-XXXXXX01456", + "bpId": "BP-XXXX024202", + "accountId": "0413XXXXXXXILS", + "exchange": "TASE", + "instrumentType": "EquityInstrmnts", + "symbol": "TASE:AAA", + "side": "BUY", + "orderType": "LIMIT", + "validityType": "GFD", + "price": , + "quantity": , + "channel": "", + "counterpartyAccountId": "", + "entitlements": { "liveLevel1": true, "level2": true } + } + """ + Then the response status should be + And the response body should contain "errorCode" = "" + And the response body should contain "message" = "" + + Examples: + | base_url | token | price | qty | channel | counterpartyAccountId | status | errorCode | message | + | https://api.bank/v1 | bearer123 | 10.00 | 10 | Internet | 0413XXXXXXXILS | 400 | SELF-TRANSACTION-BLOCKED | Self-Transactions are not allowed in TASE | + | https://api.bank/v1 | bearer123 | 1.00 | 10 | FO | | 422 | 31042 | price threshold error | + + @api @orders @recon @settlement @fees @tax @idempotency @CMBO-TC-001 + Scenario: Local equity buy - partial fills, 1051 recon, manual match within tolerance, 1052 idempotency, fees and tax + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'bearer123' + And the content type is 'application/json' + When I send a POST request to '/api/orders' with payload + """ + { + "portfolioId": "PF-XXXXXX01456", + "bpId": "BP-XXXX024202", + "accountId": "0413XXXXXXXILS", + "exchange": "TASE", + "instrumentType": "EquityInstrmnts", + "symbol": "TASE:AAA", + "side": "BUY", + "orderType": "LIMIT", + "validityType": "GFD", + "price": 10.15, + "quantity": 10, + "channel": "FO" + } + """ + Then the response status should be 201 + And the response should contain 'orderId' + When I send a POST request to '/api/orders/{orderId}/authorize' with payload + """ + { "role": "Checker", "approvalLevel": 2 } + """ + Then the response status should be 200 + And the response body should contain "status" = "PLACED_WITH_MARKET" + When I send a POST request to '/api/executions' with payload + """ + { + "source": "ST-SP", + "exchange": "TASE", + "executions": [ + { "orderId": "{orderId}", "executionId": "E1", "quantity": 4, "price": 10.15, "tradeDate": "T" }, + { "orderId": "{orderId}", "executionId": "E2", "quantity": 6, "price": 10.20, "tradeDate": "T" } + ] + } + """ + Then the response status should be 202 + And the response body should contain "partiallyExecuted" = true + When I send a POST request to '/api/recon/1051/import' with payload + """ + { + "fileName": "1051", + "exchange": "TASE", + "records": [ + { "symbol": "TASE:AAA", "executionId": "E1", "quantity": 4, "price": 10.15, "tradeDate": "T" }, + { "symbol": "TASE:AAA", "executionId": "E2", "quantity": 6, "price": 10.20, "tradeDate": "T" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "reconciledCount" = 2 + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { + "fileName": "1052", + "exchange": "TASE", + "advices": [ + { "adviceId": "S1", "orderId": "{orderId}", "executionId": "E1", "netAmount": 40.58, "currency": "ILS" }, + { "adviceId": "S2", "orderId": "{orderId}", "executionId": "E2", "netAmount": 61.22, "currency": "ILS" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "importedCount" = 2 + When I send a POST request to '/api/manual-matching/link' with payload + """ + { + "openDeliveryId": "OD-{orderId}", + "adviceId": "S2", + "tolerance": { "currency": "ILS", "amount": 2.00 } + } + """ + Then the response status should be 200 + And the response body should contain "matched" = true + And the response body should contain "excludedFromAutoRecon" = true + When I send a POST request to '/api/batches/StreetSideSettlementTASE/run' with payload + """ + { "asOfDate": "T+1", "batchName": "StreetSideSettlementTASE" } + """ + Then the response status should be 202 + When I send a GET request to '/api/orders/{orderId}/status' + Then the response status should be 200 + And the response body should contain "status" = "SETTLED" + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { + "fileName": "1052", + "exchange": "TASE", + "advices": [ + { "adviceId": "S2", "orderId": "{orderId}", "executionId": "E2", "netAmount": 61.22, "currency": "ILS" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "duplicatesIgnored" = 1 + When I send a POST request to '/api/fees/commissions/calculate' with payload + """ + { + "orderId": "{orderId}", + "rules": { + "tiers": [ + { "min": 0, "max": 100000, "ratePct": 0.12 }, + { "min": 100000, "max": 500000, "ratePct": 0.10 }, + { "min": 500000, "max": 999999999, "ratePct": 0.08 } + ], + "minFee": 5.00, + "maxFee": 1500.00, + "rounding": { "mode": "HALF_UP", "scale": 2 }, + "currency": "ILS" + } + } + """ + Then the response status should be 200 + And the response body should contain "feeItems[0].name" = "ST Commission" + And the response body should contain "feeItems[0].amount" rounded to 0.01 + When I send a POST request to '/api/integrations/tax/eod' with payload + """ + { "tradeDate": "T+1", "portfolios": ["PF-XXXXXX01456"] } + """ + Then the response status should be 202 + And the response body should contain "lotsUpdated" = true + When I send a GET request to '/api/reports/file32?orderId={orderId}' + Then the response status should be 200 + And the response body should contain "accountId" masked as "0413****" + And the response body should contain "nationalId" masked + + @api @foreign @broker @avgprice @fees @settlement @idempotency @CMBO-TC-002 + Scenario: Foreign equity buy - broker EOD average-price recapture, fees mapping, settlement and idempotent re-upload + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'bearer123' + And the content type is 'application/json' + When I send a POST request to '/api/orders' with payload + """ + { + "portfolioId": "PF-XXXXXX01931", + "bpId": "BP-XXXX773001", + "accountId": "0413XXXXUSD", + "exchange": "NYSE", + "instrumentType": "EquityInstrmnts", + "symbol": "NYSE:XYZ", + "side": "BUY", + "orderType": "MARKET", + "validityType": "GFD", + "quantity": 100, + "channel": "FO" + } + """ + Then the response status should be 201 + And the response should contain 'orderId' + When I send a POST request to '/api/executions' with payload + """ + { + "source": "MARKET", + "exchange": "NYSE", + "executions": [ + { "orderId": "{orderId}", "executionId": "E1", "quantity": 40, "price": 50.10, "tradeDate": "T" }, + { "orderId": "{orderId}", "executionId": "E2", "quantity": 60, "price": 49.90, "tradeDate": "T" } + ] + } + """ + Then the response status should be 202 + When I send a POST request to '/api/broker/ordersummary/import' with payload + """ + { + "fileName": "Broker OrderSummary CSV", + "records": [ + { + "brokerOrderRef": "BREF-123", + "symbol": "NYSE:XYZ", + "side": "BUY", + "tradeDate": "T", + "avgPrice": 50.00, + "quantity": 100, + "fees": { "STCommission": 8.50, "SEC": 0.57, "TAF": 0.03, "BrokerCommission": 12.00 } + } + ] + } + """ + Then the response status should be 200 + And the response body should contain "recaptured" = 1 + And the response body should contain "originalTradesCancelled" = 2 + When I send a POST request to '/api/settlement/client/run' with payload + """ + { "asOfDate": "T+1", "market": "FOREIGN" } + """ + Then the response status should be 202 + When I send a POST request to '/api/batches/StreetSideSettlementForeign/run' with payload + """ + { "asOfDate": "T+2" } + """ + Then the response status should be 202 + When I send a GET request to '/api/orders/{orderId}/fees' + Then the response status should be 200 + And the response body should contain "SEC" = 0.57 + And the response body should contain "TAF" = 0.03 + And the response body should contain "BrokerCommission" = 12.00 + And the response body should contain "STCommission" >= 5.00 + When I send a POST request to '/api/broker/ordersummary/import' with payload + """ + { + "fileName": "Broker OrderSummary CSV", + "records": [ + { + "brokerOrderRef": "BREF-123", + "symbol": "NYSE:XYZ", + "side": "BUY", + "tradeDate": "T", + "avgPrice": 50.00, + "quantity": 100, + "fees": { "STCommission": 8.50, "SEC": 0.57, "TAF": 0.03, "BrokerCommission": 12.00 } + } + ] + } + """ + Then the response status should be 200 + And the response body should contain "duplicatesIgnored" = 1 + + @api @mutualfunds @allocation @reversal @settlement @tax @CMBO-TC-003 + Scenario: Mutual fund purchase - 1051 allocation then reversal/reallocation at corrected NAV, customer and street settlement, tax and accrual triggers + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'bearer123' + And the content type is 'application/json' + When I send a POST request to '/api/mf/orders' with payload + """ + { + "portfolioId": "PF-XXXXXX27087", + "bpId": "BP-XXXX190031", + "accountId": "04XXXXXXILS", + "fundId": "TASE:MF001", + "orderType": "PURCHASE", + "units": 100.0000 + } + """ + Then the response status should be 201 + And the response should contain 'mfOrderId' + When I send a POST request to '/api/recon/1051/import' with payload + """ + { + "fileName": "1051", + "records": [ + { "fundId": "TASE:MF001", "nav": 10.0000, "units": 100.0000, "tradeDate": "T", "action": "ALLOCATE" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "allocated" = 1 + When I send a POST request to '/api/recon/1051/import' with payload + """ + { + "fileName": "1051", + "records": [ + { "fundId": "TASE:MF001", "nav": 10.0500, "units": 99.5025, "tradeDate": "T+1", "action": "REVERSE_AND_REALLOCATE", "reversesTradeDate": "T" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "reallocated" = 1 + When I send a POST request to '/api/settlement/client/run' with payload + """ + { "asOfDate": "T+1", "market": "MF" } + """ + Then the response status should be 202 + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { "fileName": "1052", "exchange": "TASE", "advices": [ { "fundId": "TASE:MF001", "tradeDate": "T+1", "units": 99.5025 } ] } + """ + Then the response status should be 200 + And the response body should contain "importedCount" = 1 + When I send a POST request to '/api/integrations/tax/eod' with payload + """ + { "tradeDate": "T+1", "portfolios": ["PF-XXXXXX27087"] } + """ + Then the response status should be 202 + And the response body should contain "lotsUpdated" = true + When I send a GET request to '/api/fees/distribution/accruals?portfolioId=PF-XXXXXX27087&fromDate=T&toDate=T+30' + Then the response status should be 200 + And the response body should contain "accruals" array + + @api @externalTransfer @file15 @file132 @repair @recon @settlement @idempotency @CMBO-TC-005 + Scenario: Outside-bank transfer outbound (15) and inbound (132) with repair, recon, manual match tolerance and idempotent 1052 + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'bearerBO' + And the content type is 'application/json' + When I send a POST request to '/api/transfers/outbound' with payload + """ + { + "sourcePortfolioId": "PF-XXXXXX19031", + "securityId": "TASE:EQ123", + "quantity": 100.0000, + "market": "TASE", + "transferType": "DELIVERY_OUT", + "outsideBank": { "bankCode": "1245", "branchCode": "5124", "beneficiaryAccount": "*******" }, + "sameEntity": false, + "transferCase": "Transfer to spouse" + } + """ + Then the response status should be 201 + And the response should contain 'transferOrderId' + When I send a POST request to '/api/batches/File15OutboundBOD/run' with payload + """ + { "asOfDate": "T+1" } + """ + Then the response status should be 202 + When I send a POST request to '/api/transfers/inbound/132/import' with payload + """ + { + "fileName": "132", + "records": [ + { "transferRef": "IN-001", "securityId": "TASE:EQ456", "quantity": 200.0000, "beneficiaryId": "", "lots": [ { "qty": 100.0000 }, { "qty": 90.0000 } ], "status": "TO_BE_REPAIRED" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "toBeRepaired" = 1 + When I send a PUT request to '/api/transfers/inbound/IN-001/repair' with payload + """ + { + "beneficiaryId": "BP-XXXX990011", + "lots": [ { "qty": 100.0000 }, { "qty": 100.0000 } ] + } + """ + Then the response status should be 200 + And the response body should contain "status" = "READY_FOR_AUTH" + When I send a POST request to '/api/recon/1051/import' with payload + """ + { "fileName": "1051", "records": [ { "transferRef": "IN-001", "securityId": "TASE:EQ456", "quantity": 200.0000 } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { + "fileName": "1052", + "exchange": "TASE", + "advices": [ { "adviceId": "T-ADV-1", "transferRef": "IN-001", "securityId": "TASE:EQ456", "netAmount": 1998.50, "currency": "ILS" } ] + } + """ + Then the response status should be 200 + When I send a POST request to '/api/manual-matching/link' with payload + """ + { "openDeliveryId": "OD-IN-001", "adviceId": "T-ADV-1", "tolerance": { "currency": "ILS", "amount": 2.00 } } + """ + Then the response status should be 200 + And the response body should contain "excludedFromAutoRecon" = true + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { + "fileName": "1052", + "exchange": "TASE", + "advices": [ { "adviceId": "T-ADV-1", "transferRef": "IN-001", "securityId": "TASE:EQ456", "netAmount": 1998.50, "currency": "ILS" } ] + } + """ + Then the response status should be 200 + And the response body should contain "duplicatesIgnored" = 1 + + @api @masterdata @validation @rates @idempotency @makerChecker @CMBO-TC-006 + Scenario Outline: Security product setup validations and MI rate ingestion idempotency + Given the API base URL is '' + And the authorization token is set to '' + And the content type is 'application/json' + When I send a POST request to '/api/products/securities' with payload + """ + { + "source": "", + "isin": "", + "exchangeCode": "", + "symbol": "", + "securityType": "", + "priceScale": + } + """ + Then the response status should be + And the response body should contain "errorCode" = "" + When I send a POST request to '/api/mi/rates/import' with payload + """ + { + "fileName": "MI-Rates CSV", + "records": [ + { "securityKey": { "isin": "", "exchange": "" }, "rateType": "CLOSE", "rateDate": "T", "price": } + ] + } + """ + Then the response status should be + And the response body should contain "importedCount" = + When I send a POST request to '/api/mi/rates/import' with payload + """ + { + "fileName": "MI-Rates CSV", + "records": [ + { "securityKey": { "isin": "", "exchange": "" }, "rateType": "CLOSE", "rateDate": "T", "price": } + ] + } + """ + Then the response status should be 200 + And the response body should contain "duplicatesIgnored" = + + Examples: + | base_url | token | source | isin | exchange | symbol | secType | priceScale | createStatus | createErrorCode | ratePrice | rateStatus | importedCount | duplicates | + | https://api.bank/v1 | masterBearer | TASE | IL0000000229 | TASE | ETF229 | ETF | 4 | 201 | | 1234.1234 | 200 | 1 | 1 | + | https://api.bank/v1 | masterBearer | MANUAL | IL0000000229 | TASE | DUP-SEC | EquityInstrmnts | 2 | 409 | VAL-DUP-ISIN | 50.12 | 200 | 0 | 0 | + | https://api.bank/v1 | masterBearer | MANUAL | US0000000001 | NYSE | TOO-LONG-13 | EquityInstrmnts | 2 | 422 | VAL-SYMBOL-LEN | 10.00 | 200 | 0 | 0 | + | https://api.bank/v1 | masterBearer | MANUAL | US0000000002 | NYSE | OK12SYMBOL | EquityInstrmnts | 2 | 422 | VAL-PRICE-SCALE | 10.001 | 200 | 0 | 0 | + + @api @fees @custody @recompute @quarterly @messages @reports @CMBO-TC-010 + Scenario: Custody fee daily accrual, back-dated recompute, quarterly posting and messaging/reporting + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'feeBearer' + And the content type is 'application/json' + When I send a POST request to '/api/fees/custody/daily-run' with payload + """ + { "asOfDate": "T" } + """ + Then the response status should be 202 + And the response body should contain "accrualsCreated" >= 1 + When I send a POST request to '/api/corrections/backdated' with payload + """ + { "portfolioId": "PF-XXXXXX88220", "tradeDate": "T-10", "effect": "HOLDING_ADJUSTMENT" } + """ + Then the response status should be 200 + When I send a POST request to '/api/fees/custody/recompute' with payload + """ + { "fromDate": "T-10", "toDate": "T" } + """ + Then the response status should be 202 + And the response body should contain "flags" contains "FEE-RECOMPUTE-BACKDATE" + When I send a POST request to '/api/fees/custody/quarterly-post' with payload + """ + { "quarterEnd": "Q-END", "submitter": "Maker" } + """ + Then the response status should be 202 + When I send a POST request to '/api/fees/custody/quarterly-approve' with payload + """ + { "quarterEnd": "Q-END", "approver": "Checker" } + """ + Then the response status should be 200 + And the response body should contain "postings" array + When I send a GET request to '/api/messages/outbox?types=77,425' + Then the response status should be 200 + And the response body should contain "masked" = true + When I send a GET request to '/api/reports/RSP34390?quarter=Q-END' + Then the response status should be 200 + And the response body should contain "totalsByPortfolio" array + + @api @tase1054 @failureHandling @blocks @reversals @idempotency @CMBO-TC-011 + Scenario: TASE 1054 failed/pending trades - enforce manual blocks, cancel with reversals, idempotent 1054 reprocessing + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'boBearer' + And the content type is 'application/json' + When I send a POST request to '/api/recon/1051/import' with payload + """ + { + "fileName": "1051", + "records": [ + { "executionId": "S-EXEC-1", "symbol": "TASE:SELL", "side": "SELL", "quantity": 50, "price": 20.00, "tradeDate": "T" }, + { "executionId": "B-EXEC-1", "symbol": "TASE:BUY", "side": "BUY", "quantity": 50, "price": 10.00, "tradeDate": "T" } + ] + } + """ + Then the response status should be 200 + When I send a POST request to '/api/tase/1054/import' with payload + """ + { + "fileName": "1054", + "records": [ + { "executionId": "S-EXEC-1", "status": "FAILED", "reason": "CUSTODIAN_REJECT" }, + { "executionId": "B-EXEC-1", "status": "PENDING", "reason": "CASH_SHORT" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "failed" = 1 + And the response body should contain "pending" = 1 + When I send a POST request to '/api/blocks' with payload + """ + { "type": "CASH", "portfolioId": "PF-XXXXXX44221", "amount": 1000.00, "currency": "ILS", "reason": "Failed Sell proceeds" } + """ + Then the response status should be 201 + When I send a POST request to '/api/blocks' with payload + """ + { "type": "CUSTODY", "portfolioId": "PF-XXXXXX44221", "securityId": "TASE:BUY", "quantity": 50, "reason": "Pending Buy coverage" } + """ + Then the response status should be 201 + When I send a POST request to '/api/orders/S-EXEC-1/cancel' with payload + """ + { "reason": "1054 FAILED", "routeForApproval": true } + """ + Then the response status should be 202 + When I send a POST request to '/api/orders/S-EXEC-1/approve-cancel' with payload + """ + { "approver": "Checker" } + """ + Then the response status should be 200 + And the response body should contain "reversalsPosted" = true + When I send a POST request to '/api/tase/1054/import' with payload + """ + { + "fileName": "1054", + "records": [ + { "executionId": "S-EXEC-1", "status": "FAILED", "reason": "CUSTODIAN_REJECT" }, + { "executionId": "B-EXEC-1", "status": "PENDING", "reason": "CASH_SHORT" } + ] + } + """ + Then the response status should be 200 + And the response body should contain "duplicatesIgnored" = 2 + + @api @fractional @transitDeal @avgPrice @settlement @idempotency @CMBO-TC-012 + Scenario: Fractional order processing - transit deal to bank fraction portfolio, average price, 1052 settlement and idempotency + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'boBearer' + And the content type is 'application/json' + When I send a POST request to '/api/orders' with payload + """ + { + "portfolioId": "PF-XXXXXX77551", + "symbol": "TASE:FRAC", + "side": "SELL", + "orderType": "FULL_SELL", + "quantity": 100, + "executions": [ + { "quantity": 60.0000, "price": 10.00 }, + { "quantity": 39.9999, "price": 10.10 } + ] + } + """ + Then the response status should be 201 + And the response should contain 'orderId' + When I send a POST request to '/api/batches/FractionalSettlementTransit/run' with payload + """ + { "asOfDate": "T" } + """ + Then the response status should be 202 + When I send a GET request to '/api/fractional/transit?orderId={orderId}' + Then the response status should be 200 + And the response body should contain "fractionQuantity" rounded to 0.0001 + And the response body should contain "averagePrice" rounded to 0.01 + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { "fileName": "1052", "exchange": "TASE", "advices": [ { "adviceId": "FR-1", "orderId": "{orderId}", "netAmount": 1000.00 } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/batches/FractionalSettlementTransit/run' with payload + """ + { "asOfDate": "T" } + """ + Then the response status should be 202 + And the response body should contain "duplicatesIgnored" >= 1 + + @api @conversion @ADR @GDR @linkedLegs @settlement @idempotency @CMBO-TC-013 + Scenario: ADR/GDR conversion - linked Delivery Out/In via External Reference 2 and settlement + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'boBearer' + And the content type is 'application/json' + When I send a POST request to '/api/transfers' with payload + """ + { + "portfolioId": "PF-XXXXXX88002", + "deliveryType": "LOCAL_TO_ADR", + "securityId": "TASE:LOC123", + "quantityLocal": 100, + "externalRef2": "CONV-REF-001" + } + """ + Then the response status should be 201 + And the response should contain 'doId' + When I send a POST request to '/api/transfers' with payload + """ + { + "portfolioId": "PF-XXXXXX88002", + "deliveryType": "ADR_TO_LOCAL", + "securityId": "ADR:LOC123", + "quantityAdr": 200, + "conversionRatio": "2:1", + "externalRef2": "CONV-REF-001" + } + """ + Then the response status should be 201 + And the response should contain 'diId' + When I send a POST request to '/api/custodian/foreign/advice/import' with payload + """ + { "records": [ { "externalRef2": "CONV-REF-001", "securityId": "ADR:LOC123", "quantity": 200 } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { "fileName": "1052", "exchange": "TASE", "advices": [ { "externalRef2": "CONV-REF-001", "securityId": "TASE:LOC123", "quantity": 100, "netAmount": 0.00 } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/batches/StreetSideSettlementForeign/run' with payload + """ + { "asOfDate": "T+1" } + """ + Then the response status should be 202 + When I send a POST request to '/api/batches/StreetSideSettlementTASE/run' with payload + """ + { "asOfDate": "T+1" } + """ + Then the response status should be 202 + When I send a GET request to '/api/transfers/history?externalRef2=CONV-REF-001' + Then the response status should be 200 + And the response body should contain "bothLegsSettled" = true + When I send a POST request to '/api/settlement/advice/import' with payload + """ + { "fileName": "1052", "exchange": "TASE", "advices": [ { "externalRef2": "CONV-REF-001", "securityId": "TASE:LOC123", "quantity": 100, "netAmount": 0.00 } ] } + """ + Then the response status should be 200 + And the response body should contain "duplicatesIgnored" = 1 + + @api @reconciliation @positions @cash @idempotency @manualResolve @reports @CMBO-TC-015 + Scenario: Positions and cash reconciliation vs 1053, 871/872, Tax Engine, and File 32 with scope removal and idempotency + Given the API base URL is 'https://api.bank/v1' + And the authorization token is set to 'reconBearer' + And the content type is 'application/json' + When I send a POST request to '/api/recon/1053/import' with payload + """ + { "fileName": "1053", "records": [ { "portfolio": "PF-XXXXXX99210", "securityId": "TASE:EQ100", "quantity": 100 } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/recon/1053/run' with payload + """ + { "asOfDate": "T" } + """ + Then the response status should be 200 + And the response body should contain "posMismatches" >= 1 + When I send a POST request to '/api/recon/871/import' with payload + """ + { "fileName": "871", "records": [ { "portfolio": "PF-XXXXXX99210", "securityId": "NYSE:ABC", "quantity": 50, "currency": "USD" } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/recon/taxpositions/import' with payload + """ + { "fileName": "TaxPositions", "records": [ { "portfolio": "PF-XXXXXX99210", "securityId": "TASE:EQ100", "quantity": 100 } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/recon/cash32/import' with payload + """ + { "fileName": "32", "records": [ { "nostro": "NOSTRO-ILS", "netAmount": 100000.00, "currency": "ILS" } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/recon/cash872/import' with payload + """ + { "fileName": "872", "records": [ { "nostro": "NOSTRO-USD", "instrument": "NYSE:ABC", "side": "BUY", "netAmount": 5000.00, "currency": "USD" } ] } + """ + Then the response status should be 200 + When I send a POST request to '/api/recon/cash32/run' with payload + """ + { "asOfDate": "T" } + """ + Then the response status should be 200 + And the response body should contain "cashDiffs" >= 1 + When I send a POST request to '/api/recon/manual-resolve' with payload + """ + { "module": "positions", "key": { "portfolio": "PF-XXXXXX99210", "securityId": "TASE:EQ100" }, "action": "REMOVE_FROM_SCOPE", "reason": "Manual movement linked" } + """ + Then the response status should be 200 + And the response body should contain "removedFromAutoRecon" = true + When I send a POST request to '/api/recon/1053/run' with payload + """ + { "asOfDate": "T" } + """ + Then the response status should be 200 + And the response body should contain "idempotent" = true + When I send a GET request to '/api/reports/recon/exceptions?modules=positions,cash' + Then the response status should be 200 + And the response body should contain "masked" = true + + # UI Tests + + @ui @transfer @makerChecker @multiBeneficiary @CAblock @CMBO-TC-004 + Scenario Outline: Within-bank securities transfer with CA ex-date block, 60/40 split and maker-checker approval + Given I am logged in to the web application as 'Maker' + And I navigate to 'Security Transfer' + And I select security '' from 'Select Security' + When I proceed to add beneficiaries + And I choose transfer type 'Within Bank' and case 'Transfer between relatives' with sub-case 'Spouse of a sister/brother' + And I enter fractional quantity '100.1234' + And I add two beneficiaries with percentages '60' and '40' + And I click 'Preview' + Then I should see '' + When I click 'Release' + And I assign to 'Checker1' + And as 'Checker1' I approve the transfer in 'My Queue' + Then the transfer status should be 'Authorized' + When the 'WithinBankTransferSettlementEOD' batch completes + Then the Security Transfer History should show 'Settled' with two split lines + + Examples: + | securityId | expectedMessage | + | TASE:CA-ON | A corporate action is pending with ExDate today; Security Transfer is not allowed for this security | + | TASE:EQ-999 | Commission preview displayed; percentages total 100% | + + @ui @entitlements @marketData @level2Block @ETFPath @CMBO-TC-007 + Scenario Outline: Entitlement-controlled display and Level 2 blocking with ETF dual-path prompt + Given I am logged in to the web application as 'Branch Dealer' without live foreign entitlements + And I open 'Market Watch' + When I observe the row for '' + Then I should see '' + When I open 'Get Quote' for '' + And I attempt to view 'Level 2' + Then I should see '' + When I place an order from 'ETF List' for 'TASE:ETF229' + And I choose 'Mutual Fund Order Path' on the alert prompt + Then I should see 'Additional commission indicator' on Preview + + Examples: + | symbol | banner | l2Message | + | TASE:AAA | Live | Level 2 is available | + | NYSE:XYZ | Delayed 15m | Level 2 is not available for your subscription | + + @ui @authorization @POA @MUHomeBranch @nostroTimeout @CMBO-TC-014 + Scenario: POA restrictions, MU/home-branch validation, maker-checker pool assignment, and nostro timeout auto-cancel + Given I am logged in to the web application as 'POA-User' + And I am on the 'Order Entry' page + When I attempt to place a 'Limit Buy' via channel 'Internet' + Then I should see 'POA orders are not permitted via this channel; approval required from another party' + When I switch to 'FO' channel as 'Maker' and create the same order + Then I should see an approval popup requiring assignment to a checker + When I assign to 'Checker1' + And I login as a user from a different MU and attempt the same order + Then I should see 'Kindly visit your home branch to trade' + When I login as 'Checker1' and open 'My Queue' + And I attempt to approve an order initiated by myself + Then I should see 'Segregation of duties prevents self-approval' + When I increase order amount to exceed maker limit and submit to 'Pool' + Then it should appear in 'Pool Queue' with alert '610070 Maker Limit Exceeded' + When I approve from 'Pool Queue' as 'Checker2' + Then the order status should progress to 'Authorized' and 'Placed with Market' + When I place a second order on a nostro-managed account and it remains open past timeout + And I run 'NostroOpenOrderTimeoutJob' + Then the order should be 'Cancelled by timeout' with alert 'NOSTRO-TIMEOUT-CANCEL' +``` \ No newline at end of file diff --git a/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.json b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.json new file mode 100644 index 00000000..1078a64a --- /dev/null +++ b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.json @@ -0,0 +1 @@ +[{"type":"functional","title":"Local equity buy end-to-end with partial fills, manual matching, and idempotent settlement","description":"Covers order capture to settlement for a TASE equity buy including validations, partial execution, 1051 recon, manual matching with tolerance, 1052 settlement, double-entry accounting, fees, tax engine exchange, and BOI/TASE reporting with idempotency and self-transaction prevention.","testId":"CMBO-TC-001","testDescription":"End-to-end local market lifecycle: Authorized → Placed with Market → Partially Executed → Executed → Reconciled (1051) → Open Delivery → Manual Match (tolerance) → Settled (1052) with duplicate 1052 reprocessing prevented, including ST commission, file 32/1091 extracts, and PII masking in outputs.","module":"Orders, Trades, Settlements, Reconciliation, Fees, Tax, Reporting","workflow":"Local Equity Buy to Settlement","uiScreen":"Order Entry, Preview, Confirm, Order Book, Trade Book, Manual Matching, Settlement Advice List, Authorization Queue, Portfolio Valuation","exchange":"TASE","instrumentType":"EquityInstrmnts","orderType":"Limit","validityType":"Good For Day","quantityType":"Regular","marketType":"On-Market","currency":"ILS","portfolioId":"PF-XXXXXX01456","accountIdMasked":"0413XXXXXXXILS","bpIdMasked":"BP-XXXX024202","role":"Maker,Checker","userType":"Branch-Dealer","authorizationLevel":"Maker-Checker (two levels)","statusBefore":"Draft","statusAfter":"Settled","batchName":"ClientSettlementContractual,StreetSideSettlementTASE","scheduleTime":"T 17:30,T+1 20:30","externalFileName":"1051,1052,1054,32,1091","externalInterface":"TASE via ST-SP, GoAnywhere routes","reconciliationKeys":"Instrument,Quantity,ExecutionId,Price,TradeDate","matchingTolerance":"Amount tolerance 2.00 ILS at custodian role","calculationRule":"ST Commission on trade value; fee rounding to 2 decimals; currency ILS major units","feeItems":"ST Commission,Exchange Fee (if setup),Custody accrual","chargeType":"Flat percentage","tierDetails":"0-100,000 ILS:0.12%,100,000-500,000 ILS:0.10%,>500,000 ILS:0.08%","minMaxRule":"Min fee 5.00 ILS, Max fee 1,500.00 ILS","roundingRule":"Round half up to 0.01 ILS","taxRule":"Settlement-date tax posting from Tax Engine; capital gains lots per FIFO","lotSelection":"FIFO from Tax Engine","caIndicator":"No CA on trade day","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"No","entitlementLevel":"Live local Level1/2, charts delayed","delayMinutes":"0 for TASE quotes, 15 for charts","alertCategory":"Error,Warning,Information","alertCode":"31042 price threshold error,601004 min qty warning,601032 info settlement cycle","errorMessage":"Self-Transactions are not allowed in TASE","auditTrailCheck":"Order Trail shows create/modify/cancel with user ids and timestamps; e-journal for approvals","accountingEntries":"On execution: DR Customer Cash Block → CR Customer Cash Available; On settlement: DR Customer Cash → CR Nostro Cash (street), DR Client Securities → CR Broker/Custodian Securities; Fee: DR Customer Cash → CR Fee Income","movementsPosted":"Cash and Securities movements with Trade/Tran/Value dates; suspense fallback if account missing","doubleEntryCheck":"All movements balanced per BSPL codes; no orphan postings","dataMasking":"National IDs and accounts masked in UI and CSV extracts","assumptions":"ASSUMPTION Customer subscribed to equity trading, fee schedule linked, TASE fee setup not enforced for transfers, contractual customer-side settlement selected","notes":"Covers idempotency for 1052 and removal of manually matched items from recon scope","riskPriority":"High","severity":"Critical","regressionTag":"E2E_Local_Equity","stepsToPerform":"1. Login via SSO as Branch Maker and authenticate customer; verify entitlement shows live TASE quotes and 15-min delayed charts.\n2. Attempt to place an opposite-side order that would create a self-transaction against an existing open sell (Market or limit >= open sell price) and verify error 'Self-Transactions are not allowed in TASE'; cancel attempt.\n3. From Order Entry, enter symbol, set Limit price at lower boundary 1.00 ILS to trigger threshold error 31042; correct to a valid boundary price just within allowed range; select Quantity 10.\n4. Verify pre-trade validations: buying power sufficient, product subscription, market parameters, trading calendar; acknowledge information/warnings; submit for authorization.\n5. As Checker, approve in Authorization Queue; confirm order status changes to Authorized then Placed with Market; capture Order Trail snapshot.\n6. Simulate partial executions via ST-SP; verify cash/custody blocks update and order moves to Partially Executed; buying power refresh recalculates available funds.\n7. Receive TASE 1051; upload and reconcile by keys Instrument,Quantity,ExecutionId,Price,TradeDate; verify status 'Reconciled' for matched deals; export exception report empty.\n8. Verify Open Delivery creation; purposely ingest 1052 settlement advice with slight amount difference within 2.00 ILS tolerance and a second time duplicate 1052 with same keys.\n9. Use Manual Matching UI to select the OD and settlement advice; ensure matching validations for Quantity, Instrument, Custodian, Amount(with tolerance), Settlement Type pass; confirm that after manual link the OD/advice are excluded from future auto-recon.\n10. Run StreetSideSettlementTASE batch; verify nostro cash and securities postings generated; confirm OD moves to Settled; reprocess duplicate 1052 and verify idempotency prevents duplicate advice/settlement.\n11. Run ClientSettlementContractual to settle customer-side cash on T+1; verify double-entry accounting postings with correct Trade/Tran/Value dates and BSPL mapping; verify suspense not used.\n12. Compute and post ST commission per tiers with min/max and rounding rules; verify fee shown in Confirm and Order Summary; generate 32 and 1091 extracts and confirm PII masking.\n13. Trigger Tax Engine EOD exchange; receive tax/refund details and updated lots; verify postings to customer cash and valuation screens updated; verify counters file presence.\n14. Validate UI histories: Order Book, Trade Book, Order Trail, Portfolio Valuation and Fund Balance reflect settled positions and released blocks; charts/news/widgets update; ensure Level2 quotes restricted per entitlement.\n15. Verify BOI/TASE reporting jobs completed: 814/815 availability as per setup, RSP34260 and recon reports; confirm CTRLM alerts absent for skips.","expectedResult":"Order completes full lifecycle to Settled with accurate blocks, reconciliations, idempotent settlement handling, correct fees and taxes, balanced double-entry movements, proper masking, and reports/extracts produced; self-transaction attempt blocked; manual match respected and excluded from future recon."},{"type":"functional","title":"Foreign equity buy with broker EOD average-price recapture, fees mapping, and street-side settlement","description":"Validates foreign market flow where intraday trades are canceled and re-captured at average price from broker OrderSummary with SEC and TAF fees, followed by customer settlement and street-side settlement batch, with recon vs APEX files and accounting rules.","testId":"CMBO-TC-002","testDescription":"Covers FO EOD processing of broker OrderSummary, BO mismatch reporting, fee categorization (ST commission vs 3rd party SEC vs broker commission/TAF), settlement batches, OD status updates, and recon data extracts vs APEX 871/872.","module":"Orders, FO Broker Integration, Fees, Settlements, Reconciliation","workflow":"Foreign Equity Buy with Broker File","uiScreen":"Order Entry, Order Book, Trade Book, Reports, Authorization Queue","exchange":"NYSE","instrumentType":"EquityInstrmnts","orderType":"Market","validityType":"Good For Day","quantityType":"Regular","marketType":"On-Market via Foreign Broker","currency":"USD","portfolioId":"PF-XXXXXX01931","accountIdMasked":"0413XXXXUSD","bpIdMasked":"BP-XXXX773001","role":"Maker,Checker,FO-EOD-Operator","userType":"Branch-Dealer","authorizationLevel":"Single level","statusBefore":"Authorized","statusAfter":"Settled","batchName":"ClientSettlementT+1Foreign,StreetSideSettlementForeign","scheduleTime":"T 23:55,T+1 17:30,T+1 20:30","externalFileName":"Broker OrderSummary CSV,871,872","externalInterface":"Broker SFTP via FO, APEX files direct to bank","reconciliationKeys":"BrokerOrderRef,Symbol,Side,TradeDate","matchingTolerance":"NA for broker-driven recapture (exact overwrite)","calculationRule":"Average price from broker replaces intraday executions; fees from file applied as-is","feeItems":"ST Commission,SEC Fee,TAF Fee,Broker Commission","chargeType":"As per file (flat amounts), ST commission per package","tierDetails":"ST commission per customer package; SEC/TAF per broker file with no internal cap","minMaxRule":"ST commission min 5.00 USD","roundingRule":"Round to 0.01 USD","taxRule":"Tax Engine on settlement date; SEC/TAF marked 3rd-party on customer account; broker comm as expense","lotSelection":"FIFO maintained; average price adjusts cost basis","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"No","entitlementLevel":"Delayed foreign market data if not entitled; enforce 15-min delay","delayMinutes":"15","alertCategory":"Information,Warning","alertCode":"601032 info settlement cycle T+2 foreign","errorMessage":"NA","auditTrailCheck":"Order Trail shows original trades cancelled and one avg-price deal inserted with broker refs","accountingEntries":"Principal: DR Customer Cash → CR Broker Settlement; ST Commission: DR Customer Cash → CR Fee Income; SEC: DR Customer Cash → CR 3rd Party Payable; TAF: DR Customer Cash → CR 3rd Party Payable; Broker Commission: DR Fee Expense → CR Broker Settlement","movementsPosted":"Customer-side cash on T+1 per model, street-side cash via new batch toggling OD to Settled","doubleEntryCheck":"All DR/CR balance in each event; FX rates applied if required","dataMasking":"Mask portfolio/account and IDs in mismatch and broker commission reports","assumptions":"ASSUMPTION FO has privileges to upload broker file; OrderSummary includes Comm, SEC, TAF in numeric fields; no TAF capping in system; settlement cycle T+2 market, T+1 customer per config","notes":"Cover daily commission CSV aggregation for broker and BO mismatch report for missing orders.","riskPriority":"High","severity":"Critical","regressionTag":"E2E_Foreign_Equity","stepsToPerform":"1. Place a foreign equity Market Buy order and authorize; verify delayed data enforcement if customer not entitled to live foreign quotes.\n2. Receive intraday executions; verify Order Book and Trade Book reflect multiple fills.\n3. At EOD, upload Broker OrderSummary; confirm FO cancels BaNCS intraday trades and inserts one average price trade with broker reference and per-trade fees SEC/TAF/Commission.\n4. Verify BO broker mismatch report lists any orders not present either in BaNCS or broker file and that current order is matched by BrokerOrderRef.\n5. Confirm fee tagging: ST Commission posted as income, SEC and TAF marked 3rd party on customer account, Broker Commission posted as expense to broker settlement account; check rounding rules and min fee.\n6. Ensure customer-side cash settlement batch runs at T+1; verify cash posting on customer accounts and lots updated in valuation.\n7. Prior to street settlement, mark deals and ODs as Matched; run StreetSideSettlementForeign batch; ensure OD status changes to Settled and nostro/broker postings are created.\n8. Generate daily broker commissions CSV and confirm inclusion of fields Order Ref, Client Ref, Side, Qty, Symbol, Prices, Net Amount, Commission, SEC, TAF; verify PII masking.\n9. Produce recon extracts for positions vs APEX 871 and cash vs APEX 872 and compare totals; document known differences due to TAF cap at custodian.\n10. Validate E2E histories and audit: Order Trail shows cancel/recapture, Authorization queue entries resolved, Portfolio Valuation updated with average cost.\n11. Confirm CTRLM shows no skipped interfaces; verify idempotency by re-uploading same OrderSummary and ensuring no duplicate average-price trade is created.","expectedResult":"Average-price replacement trade and fees from broker are applied exactly once; customer and street-side settlements complete; reconciliations vs APEX are produced; accounting entries and fee categorizations are correct with balanced postings and masked outputs."},{"type":"functional","title":"Mutual fund purchase with auto price correction via 1051 reversals/reallocation and 1052 settlement","description":"Validates MF online purchase, contractual customer-side settlement, automatic price correction through 1051 reversal and reallocation at new NAV, followed by street-side 1052 settlement and recalculation triggers including distribution fee accrual and Kafka events.","testId":"CMBO-TC-003","testDescription":"Covers file 126 parameter validation, file 544 cut-off, 1051 allocation, auto reversal/reallocate at corrected NAV, client contractual settlement timing, street-side 1052, accounting and tax updates, and distribution fee logic and events.","module":"Mutual Funds Trading, Allocations, Settlement, Fees, Tax","workflow":"MF Purchase with Auto Price Correction","uiScreen":"NAV List, MF Purchase Create, Preview, Confirm, MF Order Book, MF Order Trail","exchange":"TASE","instrumentType":"Fund","orderType":"Purchase","validityType":"NA","quantityType":"Units or Amount","marketType":"MF Path","currency":"ILS","portfolioId":"PF-XXXXXX27087","accountIdMasked":"04XXXXXXILS","bpIdMasked":"BP-XXXX190031","role":"CallCentre-Maker,Checker","userType":"Call Centre","authorizationLevel":"Single level","statusBefore":"Order Placed","statusAfter":"Settled with corrected NAV","batchName":"MFClientSettlement,MFStreetSettlement","scheduleTime":"T 17:30,T+1 20:30","externalFileName":"126,544,1051,1052","externalInterface":"TASE MI/SI","reconciliationKeys":"FundId,TradeDate,NAV,Units","matchingTolerance":"NA (allocations exact per 1051)","calculationRule":"NAV-based amount = Units * NAV; contractual settlement at customer side per config","feeItems":"Distribution Fee accrual,ST Commission (if configured)","chargeType":"Daily accrual for distribution, transactional for ST commission","tierDetails":"Distribution fee percent per fund category as per manager agreement; Money-Market funds exempt for customer charging","minMaxRule":"Min commission per MF transaction if applicable","roundingRule":"Round unit to 0.0001, amount to 0.01","taxRule":"Tax engine updates lots; MF gains taxed per settlement date","lotSelection":"Per MF lot policy","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"No","entitlementLevel":"Delayed NAV display; live not applicable","delayMinutes":"NA","alertCategory":"Validation","alertCode":"Cut-off validation from 544, parameter validation from 126","errorMessage":"NA","auditTrailCheck":"MF Order Trail shows allocation, reversal, reallocation and final settlement entries","accountingEntries":"On allocation reversal: reverse previous movements; on new allocation: DR Customer Cash Block → CR Pending; On contractual settlement: DR Customer Cash → CR Bank Internal; Street-side: DR Nostro/Custodian → CR Bank Internal","movementsPosted":"Allocation day securities movements; cash movements on customer settlement batch; street movements per 1052","doubleEntryCheck":"Reversal and reallocation yield net correct balances; no residuals","dataMasking":"Fund reports mask portfolio/account; manager docs sent externally without PII","assumptions":"ASSUMPTION Fund configured for auto price correction; distribution fee agreement exists and Kafka events enabled","notes":"Also validates that MM funds are not charged to customer for distribution fee.","riskPriority":"Medium-High","severity":"Major","regressionTag":"E2E_MF_AutoPriceCorrection","stepsToPerform":"1. From NAV List, select a local fund and click Purchase; verify file 126 parameters and cut-off from 544 allow order; enter Units and submit.\n2. Pass validations, preview commission if any, confirm, and record Order Number; ensure order appears in MF Order Book.\n3. Receive 1051 allocation at end of T; verify allocation captured with NAV_A and units; customer-side cash contractual settlement scheduled per config.\n4. On T+1 evening, ingest 1051 with reversal and reallocation at corrected NAV_B; verify system auto-reverses old allocation and books new allocation at NAV_B with correct units/amount and audit entries.\n5. Verify recalculation triggers: buying power and portfolio valuation updated; any fee components recomputed accordingly.\n6. Run MFClientSettlement batch at T+1 or T+2 per table; verify customer cash postings on settlement date with correct value dates.\n7. Receive 1052 for street-side settlement; verify matched and settled movements generated and OD statuses updated.\n8. Validate Tax Engine EOD: lots uploaded, tax/refund (if any) posted to customer, positions file reconciled with BaNCS.\n9. Confirm distribution fee daily accrual ran for the holding days, monthly report stubs produced; ensure MM funds would be exempt from customer-charging if selected.\n10. Verify Kafka events generated for MF manager documents; check CTRLM for any skipped items.\n11. Review MF Order Trail and reports to ensure allocation → reversal → reallocation → settlement sequence is complete and balanced.","expectedResult":"MF purchase is corrected automatically to the new NAV with proper reversals and reallocations, then settled customer-side and street-side; fees and tax recalculations occur; distribution fee accrues and events/reports are emitted; postings are balanced and PII is masked."},{"type":"functional","title":"Within-bank securities transfer with multi-beneficiary split and maker-checker authorization","description":"Validates within-bank portfolio transfer with multiple beneficiaries under 'Transfer between relatives' including CA ex-date block validation, percentage split, maker-checker workflow, EOD settlement, and tax engine updates with same-entity determination.","testId":"CMBO-TC-004","testDescription":"Covers Add Security, Add Beneficiary with transfer sub-cases, validations matrix, authorization assignment (specific vs pool), settlement postings, and updates to tax lots and Security Transfer History.","module":"Securities Transfer","workflow":"Within Bank Transfer - Multi Beneficiary","uiScreen":"Security Transfer Select Security, Add Beneficiary, Preview, Confirm, Authorization Queue, Security Transfer History","exchange":"TASE","instrumentType":"Equity,Fund mix","orderType":"Transfer","validityType":"NA","quantityType":"Units (fractional allowed)","marketType":"Internal","currency":"ILS","portfolioId":"PF-XXXXXX27087","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX24202","role":"Maker,Checker1,Checker2","userType":"Branch","authorizationLevel":"Multi-level (two)","statusBefore":"Released","statusAfter":"Settled","batchName":"WithinBankTransferSettlementEOD","scheduleTime":"EOD T","externalFileName":"NA","externalInterface":"NA","reconciliationKeys":"TransferOrderId,SecurityId,Quantity,Portfolio","matchingTolerance":"NA","calculationRule":"Transfer value computed at previous close per security; order-level value in ILS","feeItems":"Transfer commission per package if configured","chargeType":"Flat or percentage","tierDetails":"As per BOI price list section #4","minMaxRule":"As configured","roundingRule":"Units allow fractions up to 0.0001","taxRule":"Same-entity tax identifier computed; relatives transfers exempt; lots transferred","lotSelection":"Transfer underlying lot layers","caIndicator":"Block on Ex-Date","sameEntityFlag":"Computed","transferCase":"Transfer between relatives","transferSubCase":"Spouse of a sister/brother","beneficiaryBankBranchMasked":"Bank 999, Branch 602 (masked when displayed)","virtualSellFlag":"No","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Error,Warning,Information","alertCode":"CA ex-date block error, multi-beneficiary percentage sum validation","errorMessage":"A corporate action is pending with ExDate today; Security Transfer is not allowed for this security","auditTrailCheck":"Authorization e-journal shows initiated/authorized by named users; order trail records validations and approvals","accountingEntries":"DR Source Portfolio Securities → CR Beneficiary1/2 Portfolio Securities; no cash movement","movementsPosted":"Securities-only internal movements per business event","doubleEntryCheck":"Sum of credits equals debits per security quantity; balances update instantly post EOD","dataMasking":"Customer and beneficiary IDs masked in UI grids and exports","assumptions":"ASSUMPTION Beneficiaries exist within bank; AML manual checks passed off-system; fees enabled per package","notes":"Validates 60/40 split across two beneficiaries and automatic same-entity computation","riskPriority":"High","severity":"Major","regressionTag":"Transfer_WithinBank_MultiBeneficiary","stepsToPerform":"1. Open Security Transfer and ensure MU/home-branch check passes for the source account; otherwise expect error to visit home branch.\n2. In Select Security, tick two positions; set one security that has CA Ex-Date equal to business date to trigger the CA block; attempt to proceed and verify error; deselect blocked security and proceed with the other.\n3. Confirm fractional quantity entry allowed by entering a fractional transfer quantity (e.g., 100.1234) and verify value computed using previous close.\n4. Choose 'Within Bank' and 'Transfer between relatives' then select sub-case 'Spouse of a sister/brother'; add two beneficiaries and assign percentage 60 and 40; verify total must equal 100%.\n5. Verify Same-Entity checkbox behavior: system computes based on BP IDs; since beneficiaries are relatives and different entities, ensure Same Entity unchecked and tax identifier set to 1 (exempt) per matrix.\n6. Preview commissions; print commission details; acknowledge 'I Agree' and Release; capture Internal Order Number.\n7. Assign to Checker1 specifically; as Checker1, open Authorization Queue → My Queue, approve; if customer exception prompts, assign to pool and have Checker2 approve from Pool Queue.\n8. At EOD, run WithinBankTransferSettlementEOD batch; verify order status becomes Settled; Security Transfer History reflects Settled with split lines per beneficiary.\n9. Validate movements: DR source, CR beneficiary portfolios for exact units (including fractions); verify no cash postings; BSPL mapping correct.\n10. Verify Tax Engine exchange updated lots/positions for all three portfolios; confirm same-entity identifier 1 and exemption; check valuation screens reflect transferred cost basis.\n11. Export reports RSP34100/RSP34210 with masked PII and confirm accurate split and sub-case details.","expectedResult":"Within-bank transfer settles same day with correct 60/40 split, CA ex-date block enforced, maker-checker approvals recorded, tax lots moved and exemptions applied, postings balanced, and reports generated with masked PII."},{"type":"functional","title":"Outside-bank transfer outbound (File 15) and inbound (File 132) with repair, recon, and 1052 settlement","description":"Validates outbound Delivery Out via File 15 and inbound Delivery In via File 132 including To Be Repaired handling, manual repair of lots/beneficiary mismatches, 1051 recon, 1052 settlement, idempotency, and restriction rules.","testId":"CMBO-TC-005","testDescription":"Covers BO creation of Delivery Out to another Israeli bank, BOD file 15 generation, later inbound 132 processing with 'To Be Repaired' status, manual repair and authorization, recon via 1051, settlement via 1052, exclusion from recon after manual match, and PII masking.","module":"Securities Transfer, Interfaces, Reconciliation","workflow":"External Transfer Out and In with Repair","uiScreen":"Security Transfer, Add Beneficiary (Outside Bank), Security Transfer History, Incoming Transfer Repair, Manual Matching","exchange":"TASE","instrumentType":"Equity,Fund","orderType":"Delivery Out and Delivery In","validityType":"NA","quantityType":"Units (fractional allowed)","marketType":"External via TASE","currency":"ILS","portfolioId":"PF-XXXXXX19031","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX334455","role":"BO Operator,Maker,Checker","userType":"Back Office","authorizationLevel":"Maker-Checker","statusBefore":"Released/Authorized","statusAfter":"Settled","batchName":"File15OutboundBOD,Process132Inbound,StreetSideSettlementTASE","scheduleTime":"BOD T+1 for 15,EOD T for 132 ingestion,T+1 20:30 for 1052","externalFileName":"15,132,1051,1052","externalInterface":"TASE Clearing House","reconciliationKeys":"TransferRef,SecurityId,Quantity,Price,MovementId","matchingTolerance":"Manual matching amount tolerance 2.00 ILS","calculationRule":"Order-level value always in ILS; lots must sum to order quantity","feeItems":"Transfer commission if configured","chargeType":"Flat","tierDetails":"Per BOI list","minMaxRule":"As configured","roundingRule":"Units to 0.0001","taxRule":"Same-entity and transfer case drive tax identifier; lots transferred on settlement","lotSelection":"Incoming delivery creates lots as provided; repair to match totals","caIndicator":"Block on Ex-Date","sameEntityFlag":"Varies per case","transferCase":"Transfer to spouse (example),Transfer without Identification (Head Office only) negative check","transferSubCase":"NA","beneficiaryBankBranchMasked":"Bank 1245, Branch 5124","virtualSellFlag":"No","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Error,Warning,Information","alertCode":"Outside-bank only for TASE, MF other-entity restriction, CA ex-date block","errorMessage":"Only TASE securities can be transferred Outside Bank; Mutual funds cannot be transferred to other entities","auditTrailCheck":"Outbound/inbound orders and repairs logged with user/time; e-journal approvals stored","accountingEntries":"On settlement (outbound): CR Source Portfolio Securities → DR Street/Custodian; On settlement (inbound): DR Recipient Portfolio Securities → CR Street/Custodian","movementsPosted":"Street-side and client-side postings aligned to 1052 advice","doubleEntryCheck":"Balanced entries for both legs; no duplicate advices on re-ingestion","dataMasking":"132 ingest screens and repair lists mask National IDs and account numbers","assumptions":"ASSUMPTION GoAnywhere routes files; manual matching screen available; custodian role tolerances configured","notes":"Validates that after manual matching, items are excluded from future auto-recon and that duplicate 1052 is ignored.","riskPriority":"High","severity":"Critical","regressionTag":"Transfer_External_Repair","stepsToPerform":"1. Create Delivery Out from BO for a TASE equity to an external bank; select Outside Bank, enter Bank/Branch codes via lookup, beneficiary account, leave Same Entity unchecked and choose transfer case 'Transfer to spouse'; attempt adding a Mutual Fund and verify error that MFs cannot be transferred to other entities; remove MF.\n2. Ensure CA ex-date is not current day; otherwise verify block message and adjust date/security.\n3. Authorize via maker-checker; verify order status Authorized; at next BOD, run File15OutboundBOD and confirm file 15 generated and routed with masked output; Security Transfer History shows Released/Pend Settle.\n4. Later, ingest 132 for a Delivery In to a different customer with intentional business exceptions (mismatched lots sum vs order quantity and missing beneficiary identification); verify order created in 'To Be Repaired' status.\n5. Use Incoming Transfer Repair screen to correct lot layer quantities to equal order quantity and enter beneficiary identification; save and submit; send for authorization and approve.\n6. Receive 1051 and verify reconciliation status updated at order level; open deliveries created for both outbound and inbound as applicable.\n7. Receive 1052 and confirm settlement advices created; manually match one OD to an advice using the manual matching UI with 2.00 ILS amount tolerance; confirm once manually matched, the pair is excluded from further recon.\n8. Re-ingest the same 1052 record (duplicate) and verify idempotency prevents duplicate settlement advice creation and no double settlement occurs.\n9. Run settlement batch; verify statuses move to Settled; check postings for client and street sides with correct dates and BSPL mapping.\n10. Validate tax engine updates: lots transferred to recipient, same-entity/tax identifier computed per transfer case; verify customer valuations reflect cost basis transfer.\n11. Review reports RSP34101 Incoming Security Transfers and RSP34100 Security Transfer Details with masked PII; confirm CTRLM alerts absent and exception reports clear.","expectedResult":"Outbound file 15 generated and inbound 132 processed with repair and approvals; recon and settlement complete via 1051/1052; manual matching respected; duplicates ignored; postings balanced; tax and reports correct with masked data."},{"type":"functional","title":"Security product setup and reference data mapping with validations and idempotent ingestion","description":"Validate creation and mapping of local (TASE) and foreign (Orbis/Bloomberg) securities, manual and mass entry, CPI/rate parameters, duplicate/isomorphic keys handling, and audit trails.","testId":"CMBO-TC-006","testDescription":"Covers TASE to BaNCS type mapping, Orbis/Bloomberg ingestion via Service Integrator, manual single and mass creation, boundary validations on identifiers/length/price decimals, CPI and rate-type parameter setup, and idempotent reprocessing.","module":"Security Product Setup, Market Information","workflow":"Security product master creation and mapping","uiScreen":"Financial Instrument Maintenance, Mass Security Create, Rate Type Parameters","exchange":"TASE,NYSE","instrumentType":"ETF,EquityInstrmnts,Fund,DebtInstruments","orderType":"NA","validityType":"NA","quantityType":"NA","marketType":"NA","currency":"ILS,USD","portfolioId":"PF-XXXXXX99001","accountIdMasked":"04XXXXXXILS","bpIdMasked":"BP-XXXX778899","role":"BO-MasterData-Maker,BO-MasterData-Checker","userType":"HeadOffice-BackOffice","authorizationLevel":"Maker-Checker","statusBefore":"Not Present","statusAfter":"Active","batchName":"ServiceIntegrator-RateFeedIngest","scheduleTime":"BOD 07:30,EOD 19:30","externalFileName":"Orbis/Bloomberg Security Master,MI-Rates CSV","externalInterface":"Service Integrator (MI),GoAnywhere routes","reconciliationKeys":"ISIN,ExchangeCode,Symbol,SecurityType,SourceSystem","matchingTolerance":"NA","calculationRule":"Map TASE type codes to BaNCS types; enforce decimals per instrument; CPI and Rate Type parameters persisted per product","feeItems":"NA","chargeType":"NA","tierDetails":"NA","minMaxRule":"Symbol length 1-12, ISIN length exactly 12, Price scale per instrument (Equity 2 decimals,Bond 3 decimals,Fund 4 decimals)","roundingRule":"Round half up to instrument scale","taxRule":"NA","lotSelection":"NA","caIndicator":"Not applicable at setup","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Error,Warning,Information","alertCode":"VAL-ISIN-LEN,VAL-SYMBOL-LEN,VAL-PRICE-SCALE,VAL-DUP-ISIN,VAL-MISSING-MANDATORY","errorMessage":"Duplicate ISIN detected for source,Invalid price scale,Symbol exceeds allowed length","auditTrailCheck":"Audit shows Create/Edit with maker id,time,source,pre/post values; Checker approval logged","accountingEntries":"NA","movementsPosted":"NA","doubleEntryCheck":"NA","dataMasking":"All review/export grids mask any customer references; only product fields visible","assumptions":"ASSUMPTION TASE type mapping table pre-configured,ASSUMPTION MI feed connectivity available,ASSUMPTION Maker-checker enforced for master changes","notes":"Validates idempotency: re-import of same record (same ISIN+Exchange+Source) must not create duplicates.","riskPriority":"High","severity":"Major","regressionTag":"MasterData_Mapping_Core","stepsToPerform":"1. Login as BO Master Data Maker and navigate to Financial Instrument Maintenance.\n2. Create a local security using TASE code 229 and verify auto-mapping to Exchange Traded Fund with correct instrument class and exchange attributes.\n3. Create a foreign equity from Orbis feed by ingesting one record via Service Integrator; verify fields populated (ISIN, Ticker, Currency, Lot size) and source = Orbis.\n4. Attempt manual create with boundary values: ISIN 12 chars (valid), Symbol 12 chars (upper boundary), Price scale exceeding instrument scale; expect VAL-PRICE-SCALE error and correction required.\n5. Mass create three securities via Mass Security Create CSV (one valid, one with duplicate ISIN of step 2, one with short symbol <1 char); verify duplicate rejected with VAL-DUP-ISIN and short symbol rejected with VAL-SYMBOL-LEN.\n6. Open Rate Type Parameters and attach CPI and Yield parameters to a TASE bond (DebtInstruments); save and send for approval.\n7. As Checker, review pending changes, approve; verify status becomes Active and audit/e-journal entries recorded with before/after values.\n8. Ingest a MI-Rates CSV for the created securities; confirm rates stored with correct decimals and rounding per instrument.\n9. Re-ingest the same MI-Rates CSV; verify idempotency (no duplicate rate rows for same SecurityId,RateType,RateDate; system logs informational message only).\n10. Edit one security to change tick size and corporate sector; submit and get checker approval; verify data provenance shows last editor and timestamp.\n11. Export product lists to CSV and validate masking rules ensure no PII; only product identifiers appear.","expectedResult":"Local and foreign securities are created/mapped correctly with CPI/rate parameters; boundary validations enforce identifier lengths and price scales; duplicate keys are blocked; rate ingestion is idempotent; all changes require and record maker-checker approvals with full audit."},{"type":"functional","title":"Market data feed handling, manual overrides, and delayed vs live entitlement enforcement","description":"Verify Service Integrator rate ingestion with duplicate/idempotency handling, manual rate override with authorization, and UI enforcement of live vs delayed market data across widgets, quotes, Level 2, charts, and ETF path selection.","testId":"CMBO-TC-007","testDescription":"Covers end-user entitlements for local/foreign data, UI labels and blocking for delayed feeds, idempotent rate updates, and maker-checker controlled manual overrides; includes ETF equity-path vs MF-path prompt and timing windows.","module":"Market Information, Entitlements, UI/Widgets","workflow":"Market data acquisition and entitlement-controlled display","uiScreen":"Market Watch, Get Quote, Charts, Order Entry, ETF List","exchange":"TASE,NYSE","instrumentType":"EquityInstrmnts,Exchange Traded Fund","orderType":"Market,At The Open","validityType":"Good For Day,At The Open","quantityType":"Regular","marketType":"On-Market","currency":"ILS,USD","portfolioId":"PF-XXXXXX77110","accountIdMasked":"0413XXXXXXILS","bpIdMasked":"BP-XXXX550022","role":"Branch-Dealer,MktData-Admin-Checker","userType":"Branch","authorizationLevel":"Maker-Checker for overrides","statusBefore":"Rates exist for T-1","statusAfter":"Rates updated T","batchName":"MI_Rates_Intraday","scheduleTime":"Every 5 min 09:30-17:30","externalFileName":"SecurityRates_Intraday.csv","externalInterface":"Service Integrator (MI)","reconciliationKeys":"SecurityId,RateType,RateDateTime","matchingTolerance":"NA","calculationRule":"Idempotency: ignore second update if key tuple identical; manual override supersedes feed until next close; display flag Delayed for non-entitled data","feeItems":"ETF MF-path additional commission indicator only","chargeType":"Flag only","tierDetails":"NA","minMaxRule":"Price scale per instrument enforced on entry; max deviation threshold banner if >15% from previous close triggers info","roundingRule":"Round to instrument scale (Equity 2, ETF 4)","taxRule":"NA","lotSelection":"NA","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"Live local Level1/2, Delayed foreign Level1, Level2 blocked","delayMinutes":"15","alertCategory":"Information,Warning,Error","alertCode":"ENT-FOREIGN-DELAY,L2-NO-ENTITLEMENT,31042 price threshold info","errorMessage":"Level 2 is not available for your subscription","auditTrailCheck":"Manual override recorded with maker/checker, old/new rate, timestamp, reason","accountingEntries":"NA","movementsPosted":"NA","doubleEntryCheck":"NA","dataMasking":"Customer references masked on UI where applicable; charts/quotes show no PII","assumptions":"ASSUMPTION User lacks live foreign entitlement but has live local,ASSUMPTION ETF configured for dual path alert text,ASSUMPTION Feed contains a duplicate record during the window","notes":"Validates time-window behavior for At The Open orders while observing entitlement displays.","riskPriority":"Medium-High","severity":"Major","regressionTag":"MI_Entitlements_Idempotency","stepsToPerform":"1. Login as Branch Dealer without foreign live entitlements; open Market Watch containing a TASE equity and a NYSE equity.\n2. Verify TASE row refreshes live ticks and shows no delay banner; verify NYSE row shows Delayed 15m banner and no real-time L2 icon.\n3. Open Get Quote for the NYSE equity and attempt to view Level 2; confirm error L2-NO-ENTITLEMENT and Level 1 shows Delayed label.\n4. Open Charts widget for both securities; confirm TASE intraday chart available while foreign chart labeled as delayed with historical only.\n5. Ingest MI_Rates_Intraday with two updates for the TASE equity where the second record is identical key-wise; ensure only one rate stored (check last update time and count in MI audit).\n6. As Maker, manually override the NYSE equity price (boundary: 4 decimals) and submit; as Checker, approve override; verify UI marks source=Manual and audit captures change.\n7. Place an ETF order from ETF List; on alert prompt, choose Mutual Fund Order Path; verify additional commission indicator flag appears in Preview (no fee computation needed in this test).\n8. Attempt to place an At The Open order for TASE equity during pre-open; validate accepted with correct validity and that quotes in preview are live.\n9. Re-run MI_Rates_Intraday for the same duplicate record; verify idempotency again and CTRLM shows no failed/duplicate processing alerts.\n10. Refresh all widgets and verify displays remain consistent with entitlement rules and the manual override reflected until next feed with higher precedence rules.","expectedResult":"Service Integrator ingests rates once per unique key; manual overrides apply with maker-checker control; UI consistently enforces live vs delayed data and blocks Level 2 for non-entitled users; ETF dual-path prompt appears with correct selection; At The Open orders respect trading phase."},{"type":"functional","title":"Extranet trade lifecycle with manual blocks, BO capture on T+1, and 1052 settlement","description":"End-to-end validation of off-floor Extranet trade: pre-trade blocks, 1051 mismatch on T, back-office capture next day with special category, block expiry, 1052 settlement, postings, tax updates, and masked reporting.","testId":"CMBO-TC-008","testDescription":"Covers call centre block placement, extranet order submission, exception reporting, BO capture with category flag, expiration of blocks, settlement via 1052, accounting, tax lots, and audit.","module":"Extranet, Orders, Settlements, Reconciliation, Tax","workflow":"Off-exchange Extranet trade processing","uiScreen":"Fund Balance (Block Drill-down), Extranet Order Entry, BO Trade Capture, Settlement Advice List, Order/Trade Books","exchange":"TASE","instrumentType":"EquityInstrmnts","orderType":"Buy or Sell (off-floor)","validityType":"Good For Day","quantityType":"Regular","marketType":"Off-Market Extranet","currency":"ILS","portfolioId":"PF-XXXXXX56012","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX441122","role":"CallCentre-Maker,CallCentre-Checker,BO-Operator","userType":"Call Centre,Back Office","authorizationLevel":"Two-level for blocks if threshold exceeded","statusBefore":"No trade captured in BaNCS on T","statusAfter":"Settled","batchName":"Process1051,Process1052,ClientSettlementContractual","scheduleTime":"T EOD 18:30 for 1051,T+1 20:30 for 1052,T+1 17:30 client cash","externalFileName":"1051,1052","externalInterface":"TASE via ST-SP","reconciliationKeys":"Instrument,Side,TradeDate,Quantity,Price","matchingTolerance":"Amount tolerance 2.00 ILS on manual match if used","calculationRule":"Blocks: cash for buys,custody for sells; settlement per 1052 creates street-side postings; contractual client-side cash on T+1","feeItems":"ST Commission if configured","chargeType":"Transactional","tierDetails":"Bank fee schedule per package","minMaxRule":"Min commission 5.00 ILS","roundingRule":"Round to 0.01 ILS","taxRule":"Settlement-date tax computation; lots updated by Tax Engine","lotSelection":"FIFO","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"No","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Information,Warning,Error","alertCode":"EXTR-1051-MISMATCH,BLK-APPROVAL-REQUIRED","errorMessage":"NA","auditTrailCheck":"Order/Trade Trails show Extranet category capture with user/time; e-journal for block approvals and BO capture","accountingEntries":"On block: DR Customer Cash Block → CR Customer Cash Available (buy), DR Custody Block (sell); On settlement: DR/CR Customer Cash vs Bank Internal, DR/CR Nostro vs Custodian for street-side","movementsPosted":"Cash and securities movements with trade/value dates; block release on capture expiry","doubleEntryCheck":"All postings balanced with BSPL mapping; suspense not used","dataMasking":"PII masked on exception and reconciliation reports","assumptions":"ASSUMPTION Extranet connectivity is external; only BO capture in BaNCS on T+1,ASSUMPTION Contractual model enabled for client-side cash","notes":"Validates that 1051 mismatch is expected on T and resolved post BO capture.","riskPriority":"High","severity":"Critical","regressionTag":"E2E_Extranet","stepsToPerform":"1. As Call Centre Maker, authenticate customer and create a cash block (buy) or custody block (sell) via Fund Balance → Blocked Cash Details; if block exceeds threshold, route to Checker for approval.\n2. Submit off-floor Extranet order through the Extranet entry flow; capture internal reference and ensure category tagged as Extranet.\n3. At T EOD, ingest 1051; verify exception report flags EXTR-1051-MISMATCH for this order since no BO trade exists.\n4. On T+1 morning, as BO Operator, capture the trade in Back Office with category 'Extranet transaction out of exchange' and exact quantity/price; save and authorize as required.\n5. Expire and release the previously placed blocks; confirm Fund Balance reflects block removal and Order/Trade Books now show the captured deal.\n6. Ingest 1052; verify settlement advice created and auto-matched to the open delivery for the captured trade.\n7. Run settlement batch (street-side) followed by client cash settlement (contractual); confirm postings generated for customer and nostro with correct value dates.\n8. Compute and post any ST commission per package rules with min/max and rounding; verify displayed on Order Summary.\n9. Trigger Tax Engine EOD; verify lots updated and tax/refund posted where applicable; check counters file presence.\n10. Review audit: block approvals, BO capture, settlement postings, and that exception report for 1051 mismatch is cleared post-capture; ensure all report exports mask PII.","expectedResult":"Extranet trade is blocked, captured on T+1 with the special category, blocks expire correctly, 1052 settlement completes with balanced postings, taxes and any fees applied, and all exceptions and histories reflect the off-floor lifecycle with masked reporting."},{"type":"functional","title":"Order amendments post-execution: cancel, correct existing, and capture missing order with audit and reversals","description":"Validate post-execution amendment flows: Cancel Existing Order, Existing Order change/correction with allowed fields, and Missing Order capture, including accounting reversals, fee re-calculation, tax and histories.","testId":"CMBO-TC-009","testDescription":"Covers three amendment types via Order Amendment UI with maker-checker, ensures movement reversals for cancellations, selective field correction rules, capture of a missing executed order, and end-to-end audit/report updates.","module":"Order Amendments, Accounting, Tax, Reporting","workflow":"Post-execution amendment processing","uiScreen":"Order Amendment (Cancel Existing, Existing Order, Missing Order), Order Trail, E-Journal","exchange":"TASE","instrumentType":"EquityInstrmnts,Bond","orderType":"Executed Orders","validityType":"NA","quantityType":"Regular","marketType":"On-Market","currency":"ILS","portfolioId":"PF-XXXXXX33321","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX667700","role":"BO-Operator,Checker","userType":"Back Office","authorizationLevel":"Maker-Checker","statusBefore":"Executed","statusAfter":"Cancelled or Corrected","batchName":"AmendmentPostingRecalc,TaxEOD","scheduleTime":"On-demand,EOD","externalFileName":"1051 (for reference only),Reports","externalInterface":"Internal only","reconciliationKeys":"OrderId,ExecutionId,TradeDate","matchingTolerance":"NA","calculationRule":"On cancel: reverse all customer and street-side movements and fees; On correction: adjust selectable fields and recompute fees; Missing order: create back-dated order/trade with Off Exchange Indicator as needed","feeItems":"ST Commission,Exchange Fee if setup","chargeType":"Transactional","tierDetails":"Per BOI price list section #4","minMaxRule":"Re-applied on recalculation with rounding to 0.01 ILS","roundingRule":"Round half up to 0.01 ILS","taxRule":"Settlement-date tax postings reversed/adjusted accordingly; lots reopened/updated","lotSelection":"FIFO","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Error,Information","alertCode":"AMND-FIELD-NOTALLOWED,AMND-APPROVAL-PENDING","errorMessage":"Selected field cannot be amended for this order type/status","auditTrailCheck":"Order Amendment trail shows type, fields changed, pre/post values, approvers; Order Trail reflects reversal/adjust entries","accountingEntries":"On cancel: reverse original DR/CR for principal and fees; On correction: post delta adjustments; On missing order: post full set of movements","movementsPosted":"Reversal and delta movements with appropriate trade/value dates; suspense not used","doubleEntryCheck":"All amendment events balanced per BSPL mapping","dataMasking":"Exports and reports mask account and national IDs","assumptions":"ASSUMPTION Target orders are fully executed and eligible for amendment,ASSUMPTION Field-level amendment matrix configured","notes":"Ensures reports and histories re-state correctly after amendments.","riskPriority":"High","severity":"Critical","regressionTag":"Amendments_PostExec","stepsToPerform":"1. Identify a fully executed local equity order and open Order Amendment screen; select 'Cancel Existing Order'.\n2. Submit cancellation; system computes reversals of customer-side and street-side movements and previously charged fees; route to Checker and approve.\n3. Verify order status becomes Cancelled; confirm accounting reversals posted with correct dates and that open deliveries/deals are closed out; check Order Trail and E-Journal entries.\n4. Select another executed order and choose 'Existing Order (Change/Correction)'; tick allowable fields (e.g., Charge, Remarks) and attempt to tick a disallowed field (e.g., Quantity) to trigger AMND-FIELD-NOTALLOWED error; proceed with allowed fields only.\n5. Submit correction and approve; verify delta fee recalculation applies min/max and rounding; principal postings unaffected unless field impacts value rules.\n6. Confirm updated fee lines appear in Order Summary and commission reports for the affected period; verify audit captures pre/post values for corrected fields.\n7. Use 'Missing Order (New order capture)' to insert an executed trade absent from system; populate Correction Portfolio, set Off Exchange Indicator=Yes if applicable, and back-date trade/value dates per execution; submit and approve.\n8. Verify creation of order, deal, and open delivery as needed and immediate reconciliation readiness; ensure accounting movements posted as if originally captured; verify no duplicate once captured.\n9. Run TaxEOD; verify cancellations reverse tax/refund where applicable, corrections adjust amounts, and missing order creates correct lots; check Tax Control Report reflects changes.\n10. Re-run impacted BO reports (Order/Trade History, commission extracts) and confirm PII masking persists and totals restate accurately.","expectedResult":"All three amendment paths function per rules: cancellations fully reverse and close positions, corrections adjust only allowed fields with fee recompute, and missing executed orders are captured properly; postings are balanced, tax and reports restated, and full audit/maker-checker is preserved."},{"type":"functional","title":"Custody fee daily accrual, back-dated recomputation, quarterly posting with Message 77/425 and reporting","description":"Validate custody fee engine end-to-end: daily accrual on holdings, recompute on back-dated corrections, quarterly aggregation and posting to customers, messaging and reporting with PII masking.","testId":"CMBO-TC-010","testDescription":"Covers daily compute and recompute triggers, quarterly aggregation, postings to fee income and customer, generation of Message 77/425 and RSP34390, rounding/tier rules and BSPL mapping.","module":"Fees and Commissions","workflow":"Custody fee accrual and periodic posting","uiScreen":"Fee Engine Console, Custody Fee Reports, Messages Outbox","exchange":"TASE,NYSE","instrumentType":"Equity,Debt,Fund","orderType":"NA","validityType":"NA","quantityType":"NA","marketType":"NA","currency":"ILS,USD","portfolioId":"PF-XXXXXX88220","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX220033","role":"Fees-Operator,Checker","userType":"Back Office","authorizationLevel":"Maker-Checker for quarterly postings","statusBefore":"Holdings present, no quarter posting","statusAfter":"Quarter posted","batchName":"CustodyFeeDailyCompute,CustodyFeeQuarterlyPost","scheduleTime":"Daily 21:00,Quarter-end 10:00 next business day","externalFileName":"Messages 77,425,Report RSP34390","externalInterface":"Messaging Gateway,Reports","reconciliationKeys":"PortfolioId,SecurityId,Date","matchingTolerance":"NA","calculationRule":"Daily accrual = Holding Value * rate%/day adjusted for leap year; quarterly posting = sum of daily accruals per account; back-dated trades trigger recompute of impacted days","feeItems":"Custody Fee","chargeType":"Periodic (daily accrual, quarterly application)","tierDetails":"Tiered by portfolio AUM bands per BOI price list section #4","minMaxRule":"Minimum quarterly fee 10.00 ILS per account if accrued >0; maximum cap per tier as configured","roundingRule":"Daily accrual rounded to 0.01 ILS; quarterly aggregate rounded half up to 0.01 ILS","taxRule":"NA for custody fee itself (income to bank), VAT if configured","lotSelection":"NA","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Information,Warning,Error","alertCode":"FEE-RECOMPUTE-BACKDATE,FEE-MIN-APPLIED","errorMessage":"NA","auditTrailCheck":"Fee run logs include batch instance id, parameters, recompute windows, and approvals for quarterly postings","accountingEntries":"Quarterly: DR Customer Cash → CR Fee Income (and CR VAT Payable if applicable)","movementsPosted":"Quarterly postings dated per bank policy; daily accrual stored off-ledger","doubleEntryCheck":"Quarterly postings balanced to Fee Income and VAT where applicable","dataMasking":"Messages and reports mask account numbers and national IDs","assumptions":"ASSUMPTION Custody fee schedule assigned to portfolios,ASSUMPTION VAT parameterization if required,ASSUMPTION Back-dated trade will change holding on a prior date","notes":"Also validates leap-year daily rate divisor and tier boundary behavior.","riskPriority":"High","severity":"Major","regressionTag":"Fees_Custody_Quarterly","stepsToPerform":"1. Ensure a customer portfolio holds local and foreign securities; note current market values and assigned custody fee schedule with tiers and min/max.\n2. Run CustodyFeeDailyCompute for T; verify accruals created per security and summed at account level with daily rounding to 0.01 ILS.\n3. Inject a back-dated corrective trade (T-10) that changes holding value; trigger recompute; confirm batch flags FEE-RECOMPUTE-BACKDATE and recalculates daily accruals from T-10 to T.\n4. Validate leap-year day divisor if period spans Feb 29 and that accrual amounts reflect correct per-day fraction.\n5. At quarter end, run CustodyFeeQuarterlyPost (maker); review computed aggregates, verify tier application at boundary values and any caps; submit for checker approval.\n6. As Checker, approve quarterly posting; verify postings: DR Customer Cash → CR Fee Income (and CR VAT Payable if configured) with correct value date.\n7. Confirm minimum fee logic: if aggregate < configured min but >0, FEE-MIN-APPLIED noted and min posted; verify rounding rules on final amount.\n8. Generate Message 77/425 for applied custody fee; verify content fields populated, timing correct, and masked PII on previews/exports.\n9. Produce RSP34390 Custody Fee Report; validate totals by portfolio, currency, fee rate, and that back-dated recompute reflected; ensure CSV formatting correct.\n10. Verify BSPL mapping on postings, double-entry balance, and no suspense used; review fee engine audit logs for run parameters and approvals.","expectedResult":"Daily custody fee accrues correctly with rounding, back-dated changes trigger accurate recomputation, quarterly postings debit customers and credit fee income (and VAT) with balanced entries, messages 77/425 and report RSP34390 are generated with masked PII and correct totals."},{"type":"functional","title":"TASE 1054 failed/pending trades handling with manual blocks and cancellation reversals","description":"Validate ingestion of 1054 for failed/pending trades, required manual cash/custody blocks, state transitions, cancellation from ST Order list, reversals and idempotent 1054 reprocessing.","testId":"CMBO-TC-011","testDescription":"Covers buy and sell trades that subsequently appear in 1054 as Pending/Failed, enforces manual blocks (custody for buy, cash for sell), supports Cancel from ST Order list to reverse deals/OD/movements, and prevents duplicate state changes on reprocessing the same 1054.","module":"Trades, Settlements, Reconciliation","workflow":"Local Trade Settlement Lifecycle - 1054 failure handling","uiScreen":"ST Order List, Manual Blocks, Order/Trade Books, Settlement Advice List, Reports","exchange":"TASE","instrumentType":"EquityInstrmnts","orderType":"Limit,Market","validityType":"Good For Day","quantityType":"Regular","marketType":"On-Market","currency":"ILS","portfolioId":"PF-XXXXXX44221","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX992233","role":"Branch-Dealer,BO-Operator,Checker","userType":"Branch,Back Office","authorizationLevel":"Maker-Checker for cancellations","statusBefore":"Executed","statusAfter":"Cancelled with reversals","batchName":"Process1051,Process1054","scheduleTime":"T EOD 18:00 for 1051,T EOD 19:00 for 1054","externalFileName":"1051,1054","externalInterface":"TASE via ST-SP, GoAnywhere routes","reconciliationKeys":"Instrument,Quantity,ExecutionId,Price,TradeDate,1054Reason","matchingTolerance":"NA","calculationRule":"On cancel, reverse principal and fee postings with original trade/value dates","feeItems":"ST Commission (if charged earlier)","chargeType":"Transactional","tierDetails":"Per customer package","minMaxRule":"Applied on original charge only","roundingRule":"Round fee to 0.01 ILS","taxRule":"Reverse settlement-date tax on cancellation; reopen/adjust lots","lotSelection":"FIFO","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Warning,Error,Information","alertCode":"1054-PENDING,1054-FAILED,AMND-APPROVAL-PENDING","errorMessage":"Order marked Failed by Exchange; cancellation required","auditTrailCheck":"ST Order Trail shows 1054 status update, manual block adds, and Cancel with approver and timestamps","accountingEntries":"On cancel: reverse DR/CR for principal and any charged commission; release cash/custody blocks","movementsPosted":"Reversal movements posted with original trade/value dates; blocks released","doubleEntryCheck":"Reversal entries exactly offset original postings; no suspense","dataMasking":"All reports and lists mask account and national IDs","assumptions":"ASSUMPTION Trades were executed earlier and appear in 1051 as matched,ASSUMPTION No 1052 settlement will arrive for the failed trade","notes":"Validates idempotency of 1054 re-ingestion and exception reporting content.","riskPriority":"High","severity":"Critical","regressionTag":"TASE_1054_Failure","prerequisites":"Customer portfolio funded and entitled; fee package linked; trade-able instrument available; maker and checker users active; ST Order list access granted.","stepsToPerform":"1. Place two local equity orders: a Market Sell and a Limit Buy; authorize and ensure executions are received intraday.\n2. Ingest 1051 for T; confirm both deals reconcile to Reconciled in Trade Recon and appear in Order/Trade Books as Executed.\n3. Ingest 1054 with one record marking the Sell trade as FAILED and the Buy as PENDING; verify deal and OD statuses reflect Failed/Pending and exception report lists both with reasons.\n4. Apply manual blocks as per rule: create Cash Block for the Failed Sell equal to gross proceeds, and Custody Block for the Pending Buy equal to executed quantity; capture audit entries.\n5. Attempt to settle via street-side batch (skip running); verify system prevents settlement since 1052 is absent and 1054 indicates non-settleable state.\n6. From ST Order list, initiate Cancel Existing for the Failed Sell; route to checker and approve; verify reversal postings created for principal and any ST commission with correct dates, and OD/deal/order are closed.\n7. For the Pending Buy, remove the custody block and re-apply to a boundary amount slightly higher than executed quantity to validate block value boundary handling; save and confirm warning logged.\n8. Re-ingest the exact same 1054 file; confirm idempotency: no duplicate failure records, statuses unchanged, and a log records duplicate detection.\n9. Generate Failed and Cancelled Trades report (RSP34280) and TASE Event Reconciliation Exception report (RSP34290); verify masked PII and accurate counts for Failed/Pending.\n10. Run Tax Engine EOD; verify reversals for the cancelled Sell tax and no tax applied to the Pending Buy; lots re-opened or unchanged appropriately.\n11. Verify all trails: Order Trail, ST Order Trail, E-Journal show failure, blocks, cancellation and approvals; confirm double-entry balance in GL extract.","expectedResult":"1054 ingestion correctly flags trades as Failed/Pending; required manual blocks are enforced; cancellation from ST Order list posts exact reversals with audit and checker approval; duplicate 1054 is ignored; reports show accurate failed/pending items with masked PII; GL balanced and tax reversed where applicable."},{"type":"functional","title":"Fractional order processing and transit deal to bank fraction portfolio with average price logic","description":"Validate batch handling of fractional remainders from full-sell orders, creation of transit deal to the bank's fraction portfolio, average price computation, and settlement/accounting.","testId":"CMBO-TC-012","testDescription":"Covers a full-sell leaving fractional residuals, nightly batch that moves fractions to fraction portfolio with transit deal at average price, 1052-driven settlement, precision/rounding, reports and postings.","module":"Orders, Settlements, Accounting, Reporting","workflow":"Fractional Order Processing","uiScreen":"Order Entry, Order/Trade Books, Portfolio Valuation, Reports","exchange":"TASE","instrumentType":"EquityInstrmnts","orderType":"Full Sell","validityType":"Good For Day","quantityType":"Regular with fractional remainder","marketType":"On-Market","currency":"ILS","portfolioId":"PF-XXXXXX77551","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX114455","role":"Branch-Dealer,BO-Operator","userType":"Branch,Back Office","authorizationLevel":"Single level","statusBefore":"Executed with fractional leftover","statusAfter":"Settled, fractional cleared","batchName":"FractionalSettlementTransit,Process1052","scheduleTime":"T EOD 20:00 for FractionalSettlementTransit,T+1 20:30 for 1052","externalFileName":"1052","externalInterface":"TASE via ST-SP","reconciliationKeys":"Instrument,TradeDate,AvgPrice,TransitDealRef","matchingTolerance":"Amount rounding to 0.01 ILS; quantity precision 0.0001","calculationRule":"Average price for transit deal = weighted average execution price of the day's sells for the order date; fractional quantity rounded to 0.0001","feeItems":"NA for transit deal","chargeType":"NA","tierDetails":"NA","minMaxRule":"NA","roundingRule":"Qty to 0.0001, amount to 0.01 ILS","taxRule":"Tax Engine to update lots on settlement date; transit deal does not create customer fee","lotSelection":"FIFO","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"No","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Information,Warning","alertCode":"FRAC-AVG-APPLIED,FRAC-QTY-ROUND","errorMessage":"NA","auditTrailCheck":"Batch audit captures transit deal creation with computed average price and quantities; user/time stamps on all steps","accountingEntries":"Transit: DR Bank Fraction Portfolio Securities → CR Client Securities; Street cash: DR Nostro Cash → CR Internal or as configured","movementsPosted":"Securities-only movement on transit, street-side cash per 1052","doubleEntryCheck":"Debit equals credit across client and bank fraction portfolio; cash postings balanced","dataMasking":"RSP34400 report masks account identifiers","assumptions":"ASSUMPTION Fraction portfolio configured and mapped to business event,ASSUMPTION Average price logic enabled per trading day scope","notes":"Validates RSP34400 Fractional Trading Report totals and keys.","riskPriority":"Medium-High","severity":"Major","regressionTag":"Fractional_Transit_Deal","prerequisites":"Customer holds a position eligible for full sell; fraction portfolio configured; business events and GL accounts mapped.","stepsToPerform":"1. Place a Full Sell order for a TASE equity in a quantity designed to leave a fractional residual (e.g., holding includes sub-lot fractions); authorize and capture executions at multiple prices on T.\n2. Verify in Order/Trade Books that the order executed and Portfolio Valuation shows a fractional leftover quantity with precision to 0.0001.\n3. Run FractionalSettlementTransit batch at T EOD; verify creation of a transit deal between client and fraction portfolio for the exact fractional quantity rounded to 0.0001.\n4. Validate average price calculation equals weighted average of the day's sells; confirm any rounding at 0.01 ILS on amount with FRAC-AVG-APPLIED info in logs.\n5. Check movements: DR Bank Fraction Portfolio Securities and CR Client Securities for fractional units; ensure no customer commission is charged for transit.\n6. Ingest 1052 on T+1; confirm street-side cash movement for the transit deal posted and OD (if any) closed; ensure no duplicate advice created on re-run.\n7. Validate double-entry: securities and cash postings balanced with correct Trade/Tran/Value dates and BSPL codes; suspense not used.\n8. Open RSP34400 Fractional Trading Report and verify instrument, fractional quantity, average price, client and fraction portfolio references are present with masked PII.\n9. Run Tax Engine EOD for T+1; confirm lots updated to reflect fractional clearance and no residual open fractional positions remain in valuation screens.\n10. Re-run FractionalSettlementTransit batch; assert idempotency: no new transit deal for already processed fraction and an informational log recorded.","expectedResult":"Fractional leftovers are cleared by a single transit deal to the bank fraction portfolio at the correct weighted average price; postings are balanced; 1052 settles cash; report shows correct, masked details; reruns are idempotent."},{"type":"functional","title":"ADR/GDR conversion with linked Delivery In/Out via External Reference 2 and settlement","description":"Validate capturing both legs of an ADR↔Local conversion, linking through External Reference 2, settlement advice handling, accounting movements, and history/reporting.","testId":"CMBO-TC-013","testDescription":"Covers BO capture of Delivery Out (Local to ADR) and Delivery In (ADR to Local) using delivery types, linking both legs via External Reference 2, authorization, 1052-based settlement, manual matching validation, and movement integrity.","module":"Securities Transfer","workflow":"Delivery In/Out - ADR/GDR Conversion","uiScreen":"Create Securities Transfer Order, Security Transfer History, Manual Matching","exchange":"TASE,Foreign Custodian","instrumentType":"EquityInstrmnts (Local),ADR","orderType":"Delivery In,Delivery Out","validityType":"NA","quantityType":"Units with conversion ratio","marketType":"Off-Market Conversion","currency":"ILS,USD","portfolioId":"PF-XXXXXX88002","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX556677","role":"BO-Operator,Checker","userType":"Back Office","authorizationLevel":"Maker-Checker","statusBefore":"Released","statusAfter":"Settled (both legs)","batchName":"StreetSideSettlementTASE,StreetSideSettlementForeign","scheduleTime":"T+1 20:30,T+2 20:30","externalFileName":"1052 (local),Custodian settlement advice (foreign)","externalInterface":"TASE Clearing House,Custodian feed","reconciliationKeys":"ExternalRef2,SecurityId,Quantity,SettlementType,Custodian","matchingTolerance":"Amount tolerance 2.00 ILS (local leg), exact on foreign leg","calculationRule":"Apply conversion ratio (e.g., 2 ADR = 1 Local); post movements at previous close for valuation if required","feeItems":"Transfer commission if configured","chargeType":"Flat or percentage","tierDetails":"Per BOI price list section #4","minMaxRule":"As configured","roundingRule":"Resulting quantity rounded per instrument scale (ADR integral, Local may allow 0.0001)","taxRule":"No tax event for conversion; lots moved maintaining cost basis","lotSelection":"Transfer underlying lot layers per leg","caIndicator":"NA","sameEntityFlag":"Yes (Self conversion)","transferCase":"Custodian, No financial consideration","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"No","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Validation,Information,Error","alertCode":"MM-INST-MISMATCH-BLOCK,MM-TOL-APPLIED","errorMessage":"Instrument mismatch between Open Delivery and Settlement Advice","auditTrailCheck":"Both orders show External Reference 2 linking key, maker/checker approvals, and settlement timestamps","accountingEntries":"Local DO: CR Client Local Sec → DR Street/Custodian Local; ADR DI: DR Client ADR Sec → CR Street/Custodian ADR","movementsPosted":"Securities movements only; no cash consideration","doubleEntryCheck":"Per leg DR=CR by quantity adjusted for conversion ratio; no suspense postings","dataMasking":"History and extracts mask customer/account identifiers","assumptions":"ASSUMPTION Valid ADR/local instruments exist with configured conversion ratio,ASSUMPTION ExternalRef2 used consistently on both legs","notes":"Also validates manual matching rejects mismatched instrument and enforces tolerance rules on local leg if amounts present.","riskPriority":"High","severity":"Major","regressionTag":"ADR_GDR_Conversion_Linked","prerequisites":"Both ADR and corresponding local security set up; customer holds local shares; BO roles available; tolerance at custodian role configured.","stepsToPerform":"1. In BO, create a Delivery Out for the local security selecting Delivery Type 'Local to ADR Conversion'; enter quantity QL and set External Reference 2 to a unique key; save and release.\n2. Create a matching Delivery In for the ADR selecting Delivery Type 'ADR to Local Sec Conversion'; apply conversion ratio so ADR quantity QADR equals ratio*QL; use the same External Reference 2; release.\n3. Send both for maker-checker approval; as Checker approve and verify orders move to Authorized with custody blocks applied as required.\n4. Ingest custodian settlement advice for ADR leg; verify an Open Delivery for ADR DI is matched automatically by reference; ensure any instrument mismatch would raise MM-INST-MISMATCH-BLOCK if simulated.\n5. Ingest TASE 1052 for the local DO; confirm creation of settlement advice; if amount present, simulate an amount within 2.00 ILS tolerance and verify MM-TOL-APPLIED info logged on match.\n6. Run StreetSideSettlementForeign then StreetSideSettlementTASE batches; confirm both ODs move to Settled and Security Transfer History shows both legs with the same External Reference 2.\n7. Verify postings: ADR leg DR Client ADR Sec → CR Street/Custodian ADR; Local leg CR Client Local Sec → DR Street/Custodian Local; quantities reflect the conversion ratio and rounding rules.\n8. Confirm lots moved preserving cost basis; no tax postings created; valuation reflects new instrument holding and removal of old instrument.\n9. Export Security Transfer Details report (RSP34210/RSP34100) and verify both legs appear, linked by External Reference 2, and PII is masked.\n10. Re-ingest the same advices; confirm idempotency: no duplicate settlement advices or duplicate settlements occur for either leg.","expectedResult":"Both conversion legs are captured, linked, authorized, and settled exactly once; manual matching enforces instrument checks; movements are balanced with correct ratios; history and reports display linked references with masked data; lots and valuation reflect the conversion without tax impact."},{"type":"functional","title":"Authorization, POA restrictions, MU/home-branch checks, and nostro open order timeout","description":"Validate POA trading restrictions and approvals, MU/home-branch validation, maker-checker pool vs specific assignment, user limits, and automatic timeout of open nostro orders.","testId":"CMBO-TC-014","testDescription":"Covers a POA attempting to trade via an unauthorized channel, then placing via FO with mandatory approval; enforces MU/home-branch rule; triggers maker limit exceed, routes to pool, records e-journal, and auto-cancels an open order on nostro timeout.","module":"Authorization and Controls","workflow":"Maker-Checker, POA and MU controls","uiScreen":"Order Entry, Authorization Queue, E-Journal, Order Book","exchange":"TASE","instrumentType":"EquityInstrmnts","orderType":"Limit","validityType":"Good For Day,At The Open","quantityType":"Regular","marketType":"On-Market","currency":"ILS","portfolioId":"PF-XXXXXX66220","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX440077","role":"POA-User,Maker,Checker1,Checker2","userType":"FO,Call Centre,Head Office","authorizationLevel":"Multi-level with pool","statusBefore":"Draft/Pending","statusAfter":"Cancelled by timeout or Executed post-approval","batchName":"NostroOpenOrderTimeoutJob","scheduleTime":"Market continuous phase, timeout at configured HH:MM","externalFileName":"NA","externalInterface":"NA","reconciliationKeys":"OrderId,Channel,ApprovalTrail","matchingTolerance":"NA","calculationRule":"NA","feeItems":"ST Commission preview only","chargeType":"Transactional","tierDetails":"NA","minMaxRule":"NA","roundingRule":"NA","taxRule":"NA","lotSelection":"NA","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Error,Warning,Information","alertCode":"POA-CHANNEL-BLOCK,610070 Maker Limit Exceeded,AUTH-POOL-ASSIGNED,NOSTRO-TIMEOUT-CANCEL","errorMessage":"POA orders are not permitted via this channel; approval required from another party","auditTrailCheck":"Authorization Queue and E-Journal show assignments, approvals/rejections, and timeout cancellation","accountingEntries":"NA until execution; on timeout cancel no postings","movementsPosted":"None for non-executed, cancelled by timeout","doubleEntryCheck":"NA","dataMasking":"Order and approval exports mask customer/account IDs","assumptions":"ASSUMPTION Channel source is captured on order,ASSUMPTION Nostro timeout job is enabled with a short interval for test","notes":"Validates segregation of duties: initiator cannot self-approve.","riskPriority":"High","severity":"Critical","regressionTag":"Auth_POA_MU_Timeout","prerequisites":"POA relationship exists on target account; MU/home-branch attributes configured; user limits set to trigger maker limit exceed.","stepsToPerform":"1. Login as a POA user and attempt to place a Limit Buy via an online/mobile channel (simulate by setting order source to Internet); verify block POA-CHANNEL-BLOCK and message requiring another party's approval or FO channel; cancel attempt.\n2. Login via FO/Call Centre and as Maker create the same Limit Buy; system flags mandatory approval due to POA and raises an approval popup; assign to Checker1 specifically.\n3. Ensure MU/home-branch validation: switch to a user from a different MU and attempt the same order; verify error 'Kindly visit your home branch to trade' and abort.\n4. As Checker1, open My Queue; attempt to approve an order initiated by self (if any) and verify the system prevents self-approval per segregation rules; proceed to approve the POA order initiated by Maker.\n5. Increase order amount to breach Maker limit threshold; on submit receive 610070 Maker Limit Exceeded and route to Pool; add remarks; ensure it appears in Pool Queue.\n6. As Checker2, pick the item from Pool Queue and approve; confirm Order status progresses Authorized → Placed with Market; E-Journal displays Initiated By/Authorized By entries.\n7. Place a second order on a nostro-managed account and deliberately leave it open (no execution) past the configured timeout; run NostroOpenOrderTimeoutJob.\n8. Verify the order is auto-cancelled with status Cancelled by timeout, alert NOSTRO-TIMEOUT-CANCEL recorded, and no accounting movements exist.\n9. For the approved POA order, if executed, validate commissions shown in Confirm and that Order Trail reflects channel=FO and all approval steps with timestamps.\n10. Export Authorization Queue history and ensure all IDs are masked and actions are correctly sequenced.","expectedResult":"POA is blocked on unauthorized channels and requires approval on FO; MU/home-branch enforcement works; maker limit exceed routes to pool and cannot be self-approved; nostro open orders are cancelled automatically on timeout; all approvals and cancellations are fully audited with masked outputs."},{"type":"functional","title":"Comprehensive positions and cash reconciliation vs TASE 1053, APEX 871/872, Tax Engine, and File 32","description":"Validate EOD recon for local and foreign positions and cash, ageing, exception handling, manual resolution removal from scope, idempotent file reprocessing, and exports.","testId":"CMBO-TC-015","testDescription":"Covers uploading 1053 (local positions), 871 (foreign positions), tax engine positions file, and cash extracts against 32 (local) and 872 (foreign), producing exception reports with ageing, manual reconcile actions, removal from auto-recon scope, and reprocessing behavior.","module":"Reconciliation, Interfaces, Reporting","workflow":"Positions and Cash Reconciliation","uiScreen":"Reconciliation Console, Exception Lists, Manual Resolve, Reports","exchange":"TASE,APEX","instrumentType":"Equity,Debt,Fund","orderType":"NA","validityType":"NA","quantityType":"NA","marketType":"NA","currency":"ILS,USD","portfolioId":"PF-XXXXXX99210","accountIdMasked":"0413XXXXILS","bpIdMasked":"BP-XXXX771188","role":"BO-Recon-Operator,Checker","userType":"Back Office","authorizationLevel":"Single level for manual resolves","statusBefore":"Not Matched","statusAfter":"Matched or Removed from scope","batchName":"Recon1053,Recon871,ReconTaxPositions,ReconCash32,ReconCash872","scheduleTime":"EOD T+1 for foreign,T for local","externalFileName":"1053,871,TaxPositions,32,872","externalInterface":"TASE Clearing House,APEX,Custodian,Tax Engine","reconciliationKeys":"Portfolio,SecurityId,Quantity,TradeDate,Currency,Nostro,NetAmount","matchingTolerance":"Cash amount tolerance configurable per account; position quantity exact","calculationRule":"Augment cash recon from File 32 with portfolio/security type/order/allocation and computed commission; foreign cash vs 872 aggregated at instrument and side","feeItems":"Computed commission for augmentation in reports","chargeType":"NA","tierDetails":"NA","minMaxRule":"NA","roundingRule":"Amounts to 0.01, FX as per MI rates","taxRule":"Tax Engine positions compared on security+customer; no postings","lotSelection":"NA","caIndicator":"NA","sameEntityFlag":"NA","transferCase":"NA","transferSubCase":"NA","beneficiaryBankBranchMasked":"NA","virtualSellFlag":"NA","entitlementLevel":"NA","delayMinutes":"NA","alertCategory":"Information,Warning,Error","alertCode":"RECON-POS-MISMATCH,RECON-CASH-DIFF,RECON-IDEMPOTENT,RECON-AGE","errorMessage":"Mismatch detected between external and system positions/cash","auditTrailCheck":"Recon actions logged with user/time, including manual resolve and scope-removal flags","accountingEntries":"NA","movementsPosted":"NA","doubleEntryCheck":"NA","dataMasking":"All recon grids and exports mask PII","assumptions":"ASSUMPTION External files contain at least one intentional mismatch for test,ASSUMPTION TAF capping differences may cause known variances in foreign cash","notes":"Validates ageing buckets and CSV export content and formatting.","riskPriority":"High","severity":"Major","regressionTag":"Recon_Pos_Cash_All","prerequisites":"Prior trading/settlement to create live positions and cash movements; MI FX rates available; tolerance rules configured.","stepsToPerform":"1. Ingest TASE 1053 and run Recon1053; verify matched items set to Matched and at least one local position shows RECON-POS-MISMATCH due to quantity difference.\n2. Ingest APEX 871 and run Recon871; verify foreign position mismatches appear with correct keys (Portfolio,SecurityId,Quantity,Currency) and RECON-AGE bucket starts at 0-1 days.\n3. Import Tax Engine positions file; run ReconTaxPositions; ensure any mismatches between BaNCS and Tax positions are listed with customer+security and ageing.\n4. Load TASE File 32 data and run ReconCash32; generate augmented cash recon with portfolio id, security type, order id, allocation id, and computed commission; confirm RECON-CASH-DIFF flags where totals differ.\n5. Load APEX 872 and run ReconCash872; aggregate system data at instrument and side; accept that TAF capping differences exist and verify they are documented in notes and visible in exception reasons.\n6. From Reconciliation Console, manually resolve one local position mismatch by adjusting scope (link to a known manual movement) and mark as 'Removed from auto-recon'; save and confirm its exclusion from subsequent runs.\n7. Re-run the same 1053/871/32/872 files; verify RECON-IDEMPOTENT behavior: no duplicate records and previous matches remain matched; removed items stay out of scope.\n8. Approve recon runs and generate exception reports: RSP34360 TASE Securities position Recon exceptions, Recon cash extract vs 32, and foreign cash vs 872 CSV; verify formats, totals, ageing buckets and PII masking.\n9. Export user-action audit from recon module and confirm manual resolves include user id, timestamp, reason, and action type.\n10. Fix one mismatch in source system (e.g., post back-dated correction) and rerun relevant recon; ensure status transitions Not Matched → Matched and ageing resets.","expectedResult":"Local and foreign positions and cash are reconciled; mismatches are identified with ageing; manual resolutions remove items from auto-recon; file reprocessing is idempotent; exports include augmented data and masked PII; final statuses reflect corrections and matches."}] \ No newline at end of file diff --git a/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.xlsx b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.xlsx new file mode 100644 index 00000000..6eefd76f Binary files /dev/null and b/functional_tests/TCSBaNCS_functional-after-fix_clone/TCSBaNCS_functional-after-fix_clone.xlsx differ