{"text_format":"2","workbook":"xlsx","n_sheets":8,"sheets":["Overview","Diagrams","Dependencies","Fee Structure","Daily Limits","API Endpoints","Error Codes","Data Model"],"not_rendered":{"charts":0,"images":4,"macros":0,"external_links":0,"defined_names":0,"comments":0,"pivot_tables":0},"unopened":[],"bounds":{"document_bytes":16777216,"sheet_cells":100000,"run_cost":"one","rows_first":2000,"rows_last":500,"rows_between":2000,"halvings":0,"cell_chars":16384,"cell_head_chars":4096},"cells_cut":0,"cells_raw":0,"read":"whole","date_system":"1900"}

{"sheet":"Overview","index":0,"n_rows":22,"n_cols":5,"rows_kept":22,"cut":false,"hidden":false,"merged":[[2,0,2,5],[0,0,1,5],[4,0,4,1]]}
["Banking Transfer System — Design Specification v3.2"]
[]
["Last Updated: 2023-11-15 | Owner: Architecture Team | Status: Approved"]
[]
["System Information"]
["System Name","Banking Transfer System"]
["System Code","BTS"]
["Primary Language","Java 11"]
["Framework","Spring Boot 2.7"]
["Database","PostgreSQL 14"]
[]
[]
["#","Module Name","Description","Owner","Last Updated"]
[1,"TransferModule","Core fund transfer processing","Core Banking Team","2023-09-10"]
[2,"AccountModule","Account lifecycle management","Account Services Team","2023-08-22"]
[3,"FeeCalculationModule","Fee computation by type and tier","Pricing Team","2023-07-05"]
[4,"ValidationModule","Input validation and limits","Core Banking Team","2023-09-10"]
[5,"NotificationModule","Post-transfer notifications","Notification Team","2023-06-18"]
[6,"AuditModule","Audit event logging","Compliance Team","2023-08-01"]
[7,"ReportingModule","Daily/monthly reports (PLANNED)","BI Team","2023-04-30"]
[8,"RiskAssessmentModule","Fraud/risk scoring","Risk Team","2023-10-02"]
[9,"SchedulerModule","Batch retry and jobs","Infra Team","2023-09-28"]

{"sheet":"Diagrams","index":1,"n_rows":108,"n_cols":1,"rows_kept":108,"cut":false,"hidden":false,"merged":[[0,0,0,7]]}
["System Diagrams"]
[]
["Figure 1: System Architecture"]
{"$rows_empty":34}
["Figure 2: Transfer Execution Sequence"]
{"$rows_empty":34}
["Figure 3: Module Dependency Graph"]
{"$rows_empty":34}
["Figure 4: Fee Calculation Flowchart"]

{"sheet":"Dependencies","index":2,"n_rows":12,"n_cols":10,"rows_kept":12,"cut":false,"hidden":false,"merged":[[0,0,0,9],[1,0,1,9]]}
["Module Dependency Matrix"]
["Rows = Caller Module | Columns = Called Module | X = Dependency Exists | — = Self"]
["Caller \\ Called","Transfer","Account","FeeCalc","Validation","Notification","Audit","Reporting","Risk","Scheduler"]
["TransferModule","—","X","X","X","X","X",null,"X"]
["AccountModule",null,"—",null,null,null,"X"]
["FeeCalculationModule",null,null,"—"]
["ValidationModule",null,"X",null,"—"]
["NotificationModule",{"$nulls":4},"—","X"]
["AuditModule",{"$nulls":5},"—"]
["ReportingModule",null,"X",null,null,null,"X","—",null,"X"]
["RiskAssessmentModule",null,"X",null,null,null,"X",null,"—"]
["SchedulerModule","X",{"$nulls":4},"X",null,null,"—"]

{"sheet":"Fee Structure","index":3,"n_rows":22,"n_cols":6,"rows_kept":22,"cut":false,"hidden":false,"merged":[[8,0,8,3],[0,0,0,5],[2,0,2,3],[14,0,14,5]]}
["Fee Structure — Banking Transfer System"]
[]
["1. Base Fee Rates"]
["Transfer Type","Fee Rate","Minimum Fee","Notes"]
["Domestic Transfer","0.1%","100 JPY","Same-currency domestic"]
["International Transfer","0.5%","100 JPY","Cross-border"]
[]
[]
["2. Account Tier Discounts"]
["Tier","Discount","Domestic Result","International Result"]
["NORMAL","0%","0.1%","0.5%"]
["VIP","50%","0.05%","0.25%"]
[]
[]
["3. Fee Calculation Examples"]
["Amount (JPY)","Type","Tier","Base Fee","After Discount","Final Fee"]
["100,000","Domestic","NORMAL","100","100","100"]
["100,000","Domestic","VIP","100","50","100 (min)"]
["500,000","Domestic","NORMAL","500","500","500"]
["500,000","Domestic","VIP","500","250","250"]
["200,000","International","NORMAL","1,000","1,000","1,000"]
["200,000","International","VIP","1,000","500","500"]

{"sheet":"Daily Limits","index":4,"n_rows":15,"n_cols":4,"rows_kept":15,"cut":false,"hidden":false,"merged":[[8,0,8,1],[0,0,0,4],[2,0,2,4]]}
["Daily Transfer Limits — Banking Transfer System"]
[]
["1. Per-Tier Daily Limits"]
["Tier","Daily Limit (JPY)","Reset Time","Enforcement"]
["NORMAL","1,000,000","00:00 JST","ValidationModule"]
["VIP","1,000,000","00:00 JST","ValidationModule"]
[]
[]
["2. Limit Enforcement Rules"]
["Rule #","Description"]
["DL-01","Daily cumulative = sum of COMPLETED transfers within current day"]
["DL-02","PENDING and FAILED transfers are not counted toward daily limit"]
["DL-03","Exceeding daily limit results in rejection with error code E003"]
["DL-04","Limit check is performed before fee calculation"]
["DL-05","Limit stored per account; overridable by authorized staff"]

{"sheet":"API Endpoints","index":5,"n_rows":18,"n_cols":6,"rows_kept":18,"cut":false,"hidden":false,"merged":[[2,0,2,5],[0,0,0,5],[11,0,11,5]]}
["API Endpoints — Banking Transfer System"]
[]
["1. Transfer Endpoints"]
["Method","Path","Description","Auth","Request Body","Response"]
["POST","/api/v1/transfers","Initiate a new fund transfer","Bearer Token","TransferRequest JSON","TransferResponse JSON"]
["GET","/api/v1/transfers/{id}","Retrieve transfer by ID","Bearer Token","—","TransferResponse JSON"]
["GET","/api/v1/transfers/account/{accountId}","List transfers for an account","Bearer Token","—","List<TransferResponse>"]
["GET","/api/v1/transfers/status/{status}","List transfers by status","Bearer Token","—","List<TransferResponse>"]
["PUT","/api/v1/transfers/{id}/cancel","Cancel a pending transfer","Bearer Token","—","TransferResponse JSON"]
[]
[]
["2. Account Endpoints"]
["Method","Path","Description","Auth","Request Body","Response"]
["GET","/api/v1/accounts/{accountNumber}","Retrieve account by account number","Bearer Token","—","AccountResponse JSON"]
["GET","/api/v1/accounts/{accountNumber}/balance","Get current account balance","Bearer Token","—","Balance JSON"]
["GET","/api/v1/accounts/{accountNumber}/daily-limit","Get remaining daily transfer limit","Bearer Token","—","DailyLimit JSON"]
["POST","/api/v1/accounts","Create a new account","Admin Token","AccountRequest JSON","AccountResponse JSON"]
["PUT","/api/v1/accounts/{accountNumber}/status","Update account status (freeze/activate)","Admin Token","StatusRequest JSON","AccountResponse JSON"]

{"sheet":"Error Codes","index":6,"n_rows":12,"n_cols":5,"rows_kept":12,"cut":false,"hidden":false,"merged":[[0,0,0,4]]}
["Error Code Reference — Banking Transfer System"]
[]
["Code","HTTP Status","Exception Class","Message","Trigger Condition"]
["E001","404 Not Found","AccountNotFoundException","Account not found: {accountNumber}","Source or destination account does not exist in DB"]
["E002","422 Unprocessable","InsufficientBalanceException","Insufficient balance. Available: {balance}","Account balance is less than transfer amount + fee"]
["E003","422 Unprocessable","DailyLimitExceededException","Daily limit exceeded. Remaining: {remaining}","Cumulative daily transfers exceed account tier limit"]
["E004","400 Bad Request","InvalidTransferAmountException","Transfer amount must be greater than 0","Amount field is zero or negative"]
["E005","400 Bad Request","SameAccountTransferException","Source and destination accounts must differ","fromAccount == toAccount in request"]
["E006","422 Unprocessable","AccountFrozenException","Account {accountNumber} is frozen","Source or destination account has FROZEN status"]
["E007","422 Unprocessable","CurrencyMismatchException","Currency mismatch between accounts","Domestic transfer attempted with different currencies"]
["E008","500 Internal Error","TransferProcessingException","Internal error during transfer processing","Unexpected exception during DB commit or rollback"]
["E009","429 Too Many Requests","RateLimitExceededException","Too many requests. Retry after {seconds}s","API rate limit exceeded for the client IP"]

{"sheet":"Data Model","index":7,"n_rows":31,"n_cols":6,"rows_kept":31,"cut":false,"hidden":false,"merged":[[2,0,2,5],[0,0,0,5],[17,0,17,5]]}
["Data Model — Banking Transfer System"]
[]
["Table: accounts"]
["Column Name","Data Type","Nullable","Constraints","Default","Description"]
["id","BIGINT","No","PRIMARY KEY, AUTO_INCREMENT","—","Internal unique account identifier"]
["account_number","VARCHAR(20)","No","UNIQUE, NOT NULL","—","Customer-facing account number"]
["account_holder_name","VARCHAR(100)","No","NOT NULL","—","Full name of account holder"]
["balance","DECIMAL(15,2)","No","NOT NULL, CHECK >= 0","0.00","Current available balance"]
["currency","VARCHAR(3)","No","NOT NULL","'JPY'","ISO 4217 currency code"]
["tier","VARCHAR(10)","No","NOT NULL, CHECK IN ('NORMAL','VIP')","'NORMAL'","Account tier affecting fee and limits"]
["status","VARCHAR(10)","No","NOT NULL","'ACTIVE'","Account status: ACTIVE, FROZEN, CLOSED"]
["daily_transferred","DECIMAL(15,2)","No","NOT NULL","0.00","Running total of transfers today"]
["created_at","TIMESTAMP","No","NOT NULL","CURRENT_TIMESTAMP","Account creation timestamp"]
["updated_at","TIMESTAMP","No","NOT NULL","CURRENT_TIMESTAMP","Last modification timestamp"]
[]
[]
[]
["Table: transactions"]
["Column Name","Data Type","Nullable","Constraints","Default","Description"]
["id","BIGINT","No","PRIMARY KEY, AUTO_INCREMENT","—","Internal unique transaction identifier"]
["transaction_id","VARCHAR(36)","No","UNIQUE, NOT NULL","UUID","Public transaction reference (UUID)"]
["from_account_id","BIGINT","No","FK → accounts.id, NOT NULL","—","Source account foreign key"]
["to_account_id","BIGINT","No","FK → accounts.id, NOT NULL","—","Destination account foreign key"]
["amount","DECIMAL(15,2)","No","NOT NULL, CHECK > 0","—","Transfer amount (before fees)"]
["fee","DECIMAL(10,2)","No","NOT NULL","0.00","Calculated fee applied to transaction"]
["currency","VARCHAR(3)","No","NOT NULL","—","ISO 4217 currency code of transfer"]
["type","VARCHAR(20)","No","NOT NULL","—","DOMESTIC_TRANSFER or INTERNATIONAL_TRANSFER"]
["status","VARCHAR(10)","No","NOT NULL","'PENDING'","PENDING, COMPLETED, FAILED, CANCELLED"]
["description","VARCHAR(500)","Yes","—","NULL","Optional memo / transfer description"]
["created_at","TIMESTAMP","No","NOT NULL","CURRENT_TIMESTAMP","Transaction creation timestamp"]
["completed_at","TIMESTAMP","Yes","—","NULL","Timestamp when transfer completed or failed"]