Fix TypeScript build errors

- Remove duplicate EscalationLevel export from regulatory.ts
- Add missing logger.ts and reports.ts files to audit package
- Fix treasury package type issues
- Clean dist folders and rebuild
This commit is contained in:
defiQUG
2026-01-23 14:53:05 -08:00
parent 8c771da399
commit aedf572b99
185 changed files with 2925 additions and 4 deletions

5
packages/audit/src/index.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
export * from './logger';
export * from './reports';
export * from './retention';
export * from './versions';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}

View File

@@ -0,0 +1,5 @@
export * from './logger';
export * from './reports';
export * from './retention';
export * from './versions';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}

13
packages/audit/src/logger.d.ts vendored Normal file
View File

@@ -0,0 +1,13 @@
import type { AuditLog, BrazilRegulatoryResult } from '@brazil-swift-ops/types';
declare class AuditLogStore {
private logs;
add(log: AuditLog): void;
get(id: string): AuditLog | undefined;
getByTransaction(transactionId: string): AuditLog[];
getByDateRange(startDate: Date, endDate: Date): AuditLog[];
getAll(): AuditLog[];
}
export declare function getAuditLogStore(): AuditLogStore;
export declare function createAuditLog(result: BrazilRegulatoryResult, action?: string, userId?: string, ipAddress?: string): AuditLog;
export {};
//# sourceMappingURL=logger.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEhF,cAAM,aAAa;IACjB,OAAO,CAAC,IAAI,CAAkB;IAE9B,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAIxB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIrC,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,QAAQ,EAAE;IAInD,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,QAAQ,EAAE;IAM1D,MAAM,IAAI,QAAQ,EAAE;CAGrB;AAID,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,sBAAsB,EAC9B,MAAM,GAAE,MAAgC,EACxC,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,QAAQ,CAwBV"}

View File

@@ -0,0 +1,47 @@
class AuditLogStore {
logs = [];
add(log) {
this.logs.push(log);
}
get(id) {
return this.logs.find((log) => log.id === id);
}
getByTransaction(transactionId) {
return this.logs.filter((log) => log.transactionId === transactionId);
}
getByDateRange(startDate, endDate) {
return this.logs.filter((log) => log.timestamp >= startDate && log.timestamp <= endDate);
}
getAll() {
return [...this.logs];
}
}
const auditLogStore = new AuditLogStore();
export function getAuditLogStore() {
return auditLogStore;
}
export function createAuditLog(result, action = 'transaction_processed', userId, ipAddress) {
const log = {
id: `AUDIT-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
timestamp: result.timestamp,
transactionId: result.transactionId,
ruleSetVersion: result.ruleSetVersion,
inputs: {
transactionId: result.transactionId,
},
outputs: {
overallDecision: result.overallDecision,
overallSeverity: result.overallSeverity,
rules: result.rules,
},
decision: result.overallDecision,
severity: result.overallSeverity,
rationale: result.rules.map((r) => r.rationale).join('; '),
userId,
ipAddress,
action,
};
auditLogStore.add(log);
return log;
}
//# sourceMappingURL=logger.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"logger.js","sourceRoot":"","sources":["logger.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa;IACT,IAAI,GAAe,EAAE,CAAC;IAE9B,GAAG,CAAC,GAAa;QACf,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,gBAAgB,CAAC,aAAqB;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC;IACxE,CAAC;IAED,cAAc,CAAC,SAAe,EAAE,OAAa;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,OAAO,CAChE,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;CACF;AAED,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAE1C,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAA8B,EAC9B,SAAiB,uBAAuB,EACxC,MAAe,EACf,SAAkB;IAElB,MAAM,GAAG,GAAa;QACpB,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACpE,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE;YACN,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC;QACD,OAAO,EAAE;YACP,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB;QACD,QAAQ,EAAE,MAAM,CAAC,eAAe;QAChC,QAAQ,EAAE,MAAM,CAAC,eAAe;QAChC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1D,MAAM;QACN,SAAS;QACT,MAAM;KACP,CAAC;IAEF,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,GAAG,CAAC;AACb,CAAC"}

View File

@@ -0,0 +1,64 @@
import type { AuditLog, BrazilRegulatoryResult } from '@brazil-swift-ops/types';
class AuditLogStore {
private logs: AuditLog[] = [];
add(log: AuditLog): void {
this.logs.push(log);
}
get(id: string): AuditLog | undefined {
return this.logs.find((log) => log.id === id);
}
getByTransaction(transactionId: string): AuditLog[] {
return this.logs.filter((log) => log.transactionId === transactionId);
}
getByDateRange(startDate: Date, endDate: Date): AuditLog[] {
return this.logs.filter(
(log) => log.timestamp >= startDate && log.timestamp <= endDate
);
}
getAll(): AuditLog[] {
return [...this.logs];
}
}
const auditLogStore = new AuditLogStore();
export function getAuditLogStore(): AuditLogStore {
return auditLogStore;
}
export function createAuditLog(
result: BrazilRegulatoryResult,
action: string = 'transaction_processed',
userId?: string,
ipAddress?: string
): AuditLog {
const log: AuditLog = {
id: `AUDIT-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
timestamp: result.timestamp,
transactionId: result.transactionId,
ruleSetVersion: result.ruleSetVersion,
inputs: {
transactionId: result.transactionId,
},
outputs: {
overallDecision: result.overallDecision,
overallSeverity: result.overallSeverity,
rules: result.rules,
},
decision: result.overallDecision,
severity: result.overallSeverity,
rationale: result.rules.map((r) => r.rationale).join('; '),
userId,
ipAddress,
action,
};
auditLogStore.add(log);
return log;
}

4
packages/audit/src/reports.d.ts vendored Normal file
View File

@@ -0,0 +1,4 @@
import type { BCBReport, Transaction, BrazilRegulatoryResult } from '@brazil-swift-ops/types';
export declare function generateBCBReport(transactions: Transaction[], results: BrazilRegulatoryResult[], reportType?: 'transaction' | 'batch' | 'periodic', periodStart?: Date, periodEnd?: Date): BCBReport;
export declare function exportBCBReportToCSV(report: BCBReport): string;
//# sourceMappingURL=reports.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["reports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,WAAW,EACX,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAGjC,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,EAAE,sBAAsB,EAAE,EACjC,UAAU,GAAE,aAAa,GAAG,OAAO,GAAG,UAA0B,EAChE,WAAW,CAAC,EAAE,IAAI,EAClB,SAAS,CAAC,EAAE,IAAI,GACf,SAAS,CA6DX;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAqC9D"}

View File

@@ -0,0 +1,95 @@
import { getDefaultConverter } from '@brazil-swift-ops/utils';
export function generateBCBReport(transactions, results, reportType = 'transaction', periodStart, periodEnd) {
const converter = getDefaultConverter();
const reportTransactions = transactions.map((txn, index) => {
const result = results[index];
const usdEquivalent = converter.getUSDEquivalent(txn.amount, txn.currency);
return {
transactionId: txn.id,
executionDate: txn.createdAt,
direction: txn.direction,
amount: txn.amount,
currency: txn.currency,
usdEquivalent,
orderingCustomer: {
name: txn.orderingCustomer.name,
taxId: txn.orderingCustomer.taxId,
country: txn.orderingCustomer.country,
},
beneficiary: {
name: txn.beneficiary.name,
taxId: txn.beneficiary.taxId,
country: txn.beneficiary.country,
accountNumber: txn.beneficiary.accountNumber,
},
purposeOfPayment: txn.purposeOfPayment,
fxContractId: txn.fxContractId,
iofAmount: result.iofCalculation?.iofAmount,
reportingRequired: result.thresholdCheck?.requiresReporting ?? false,
};
});
const summary = {
totalTransactions: reportTransactions.length,
totalAmount: reportTransactions.reduce((sum, t) => sum + t.amount, 0),
totalUsdEquivalent: reportTransactions.reduce((sum, t) => sum + t.usdEquivalent, 0),
inboundCount: reportTransactions.filter((t) => t.direction === 'inbound').length,
inboundAmount: reportTransactions
.filter((t) => t.direction === 'inbound')
.reduce((sum, t) => sum + t.amount, 0),
outboundCount: reportTransactions.filter((t) => t.direction === 'outbound').length,
outboundAmount: reportTransactions
.filter((t) => t.direction === 'outbound')
.reduce((sum, t) => sum + t.amount, 0),
reportingRequiredCount: reportTransactions.filter((t) => t.reportingRequired).length,
totalIOF: reportTransactions.reduce((sum, t) => sum + (t.iofAmount || 0), 0),
};
const report = {
reportId: `BCB-${Date.now()}`,
reportType,
generatedAt: new Date(),
periodStart,
periodEnd,
transactions: reportTransactions,
summary,
format: 'json',
data: JSON.stringify({ transactions: reportTransactions, summary }, null, 2),
};
return report;
}
export function exportBCBReportToCSV(report) {
const headers = [
'Transaction ID',
'Execution Date',
'Direction',
'Amount',
'Currency',
'USD Equivalent',
'Ordering Customer',
'Ordering Tax ID',
'Beneficiary',
'Beneficiary Tax ID',
'Purpose',
'FX Contract ID',
'IOF Amount',
'Reporting Required',
];
const rows = report.transactions.map((t) => [
t.transactionId,
t.executionDate.toISOString(),
t.direction,
t.amount.toString(),
t.currency,
t.usdEquivalent.toString(),
t.orderingCustomer.name,
t.orderingCustomer.taxId || '',
t.beneficiary.name,
t.beneficiary.taxId || '',
t.purposeOfPayment || '',
t.fxContractId || '',
(t.iofAmount || 0).toString(),
t.reportingRequired ? 'Yes' : 'No',
]);
const csv = [headers.join(','), ...rows.map((row) => row.join(','))].join('\n');
return csv;
}
//# sourceMappingURL=reports.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reports.js","sourceRoot":"","sources":["reports.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,116 @@
import type {
BCBReport,
BCBReportTransaction,
BCBReportSummary,
Transaction,
BrazilRegulatoryResult,
} from '@brazil-swift-ops/types';
import { getDefaultConverter } from '@brazil-swift-ops/utils';
export function generateBCBReport(
transactions: Transaction[],
results: BrazilRegulatoryResult[],
reportType: 'transaction' | 'batch' | 'periodic' = 'transaction',
periodStart?: Date,
periodEnd?: Date
): BCBReport {
const converter = getDefaultConverter();
const reportTransactions: BCBReportTransaction[] = transactions.map((txn, index) => {
const result = results[index];
const usdEquivalent = converter.getUSDEquivalent(txn.amount, txn.currency);
return {
transactionId: txn.id,
executionDate: txn.createdAt,
direction: txn.direction,
amount: txn.amount,
currency: txn.currency,
usdEquivalent,
orderingCustomer: {
name: txn.orderingCustomer.name,
taxId: txn.orderingCustomer.taxId,
country: txn.orderingCustomer.country,
},
beneficiary: {
name: txn.beneficiary.name,
taxId: txn.beneficiary.taxId,
country: txn.beneficiary.country,
accountNumber: txn.beneficiary.accountNumber,
},
purposeOfPayment: txn.purposeOfPayment,
fxContractId: txn.fxContractId,
iofAmount: result.iofCalculation?.iofAmount,
reportingRequired: result.thresholdCheck?.requiresReporting ?? false,
};
});
const summary: BCBReportSummary = {
totalTransactions: reportTransactions.length,
totalAmount: reportTransactions.reduce((sum, t) => sum + t.amount, 0),
totalUsdEquivalent: reportTransactions.reduce((sum, t) => sum + t.usdEquivalent, 0),
inboundCount: reportTransactions.filter((t) => t.direction === 'inbound').length,
inboundAmount: reportTransactions
.filter((t) => t.direction === 'inbound')
.reduce((sum, t) => sum + t.amount, 0),
outboundCount: reportTransactions.filter((t) => t.direction === 'outbound').length,
outboundAmount: reportTransactions
.filter((t) => t.direction === 'outbound')
.reduce((sum, t) => sum + t.amount, 0),
reportingRequiredCount: reportTransactions.filter((t) => t.reportingRequired).length,
totalIOF: reportTransactions.reduce((sum, t) => sum + (t.iofAmount || 0), 0),
};
const report: BCBReport = {
reportId: `BCB-${Date.now()}`,
reportType,
generatedAt: new Date(),
periodStart,
periodEnd,
transactions: reportTransactions,
summary,
format: 'json',
data: JSON.stringify({ transactions: reportTransactions, summary }, null, 2),
};
return report;
}
export function exportBCBReportToCSV(report: BCBReport): string {
const headers = [
'Transaction ID',
'Execution Date',
'Direction',
'Amount',
'Currency',
'USD Equivalent',
'Ordering Customer',
'Ordering Tax ID',
'Beneficiary',
'Beneficiary Tax ID',
'Purpose',
'FX Contract ID',
'IOF Amount',
'Reporting Required',
];
const rows = report.transactions.map((t) => [
t.transactionId,
t.executionDate.toISOString(),
t.direction,
t.amount.toString(),
t.currency,
t.usdEquivalent.toString(),
t.orderingCustomer.name,
t.orderingCustomer.taxId || '',
t.beneficiary.name,
t.beneficiary.taxId || '',
t.purposeOfPayment || '',
t.fxContractId || '',
(t.iofAmount || 0).toString(),
t.reportingRequired ? 'Yes' : 'No',
]);
const csv = [headers.join(','), ...rows.map((row) => row.join(','))].join('\n');
return csv;
}

15
packages/audit/src/retention.d.ts vendored Normal file
View File

@@ -0,0 +1,15 @@
import type { RetentionPolicy, AuditLog } from '@brazil-swift-ops/types';
declare class RetentionPolicyStore {
private policies;
add(policy: RetentionPolicy): void;
get(dataType: RetentionPolicy['dataType']): RetentionPolicy | undefined;
getAll(): RetentionPolicy[];
}
export declare function getRetentionPolicyStore(): RetentionPolicyStore;
export declare function applyRetentionPolicy(log: AuditLog, policy: RetentionPolicy): {
shouldArchive: boolean;
shouldDelete: boolean;
};
export declare function enforceRetentionPolicies(): void;
export {};
//# sourceMappingURL=retention.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAIzE,cAAM,oBAAoB;IACxB,OAAO,CAAC,QAAQ,CAAyB;IAEzC,GAAG,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAIlC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,SAAS;IAIvE,MAAM,IAAI,eAAe,EAAE;CAG5B;AAID,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,eAAe,GACtB;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAcnD;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAqB/C"}

View File

@@ -0,0 +1,49 @@
import { shouldArchive, shouldDelete } from '@brazil-swift-ops/utils';
import { getAuditLogStore } from './logger';
class RetentionPolicyStore {
policies = [];
add(policy) {
this.policies.push(policy);
}
get(dataType) {
return this.policies.find((p) => p.dataType === dataType);
}
getAll() {
return [...this.policies];
}
}
const retentionPolicyStore = new RetentionPolicyStore();
export function getRetentionPolicyStore() {
return retentionPolicyStore;
}
export function applyRetentionPolicy(log, policy) {
if (policy.archivalAfterDays) {
const archive = shouldArchive(log.timestamp, policy.archivalAfterDays);
if (archive) {
return { shouldArchive: true, shouldDelete: false };
}
}
if (policy.autoDelete) {
const deleteLog = shouldDelete(log.timestamp, policy.retentionPeriodDays);
return { shouldArchive: false, shouldDelete: deleteLog };
}
return { shouldArchive: false, shouldDelete: false };
}
export function enforceRetentionPolicies() {
const auditLogStore = getAuditLogStore();
const policyStore = getRetentionPolicyStore();
const allPolicies = policyStore.getAll();
const allLogs = auditLogStore.getAll();
allLogs.forEach((log) => {
const policy = allPolicies.find((p) => p.dataType === 'audit_log' || p.dataType === 'all');
if (policy) {
const { shouldDelete: shouldDeleteLog } = applyRetentionPolicy(log, policy);
if (shouldDeleteLog && policy.autoDelete) {
// In production, would actually delete from persistent storage
// For now, just mark for deletion
console.log(`Log ${log.id} should be deleted per retention policy`);
}
}
});
}
//# sourceMappingURL=retention.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"retention.js","sourceRoot":"","sources":["retention.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,oBAAoB;IAChB,QAAQ,GAAsB,EAAE,CAAC;IAEzC,GAAG,CAAC,MAAuB;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,QAAqC;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAExD,MAAM,UAAU,uBAAuB;IACrC,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,GAAa,EACb,MAAuB;IAEvB,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACvE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC1E,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,uBAAuB,EAAE,CAAC;IAE9C,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;IAEvC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAC1D,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5E,IAAI,eAAe,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACzC,+DAA+D;gBAC/D,kCAAkC;gBAClC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,yCAAyC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}

13
packages/audit/src/versions.d.ts vendored Normal file
View File

@@ -0,0 +1,13 @@
import type { RuleVersion } from '@brazil-swift-ops/types';
declare class RuleVersionStore {
private versions;
add(version: RuleVersion): void;
get(version: string): RuleVersion | undefined;
getCurrent(): RuleVersion | undefined;
getAll(): RuleVersion[];
deprecate(version: string, deprecatedDate: Date): void;
}
export declare function getRuleVersionStore(): RuleVersionStore;
export declare function createRuleVersion(version: string, effectiveDate: Date, approvalAuthority: string, description?: string): RuleVersion;
export {};
//# sourceMappingURL=versions.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,cAAM,gBAAgB;IACpB,OAAO,CAAC,QAAQ,CAAqB;IAErC,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAI/B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI7C,UAAU,IAAI,WAAW,GAAG,SAAS;IAMrC,MAAM,IAAI,WAAW,EAAE;IAIvB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAG,IAAI;CAOvD;AAID,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,IAAI,EACnB,iBAAiB,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,MAAM,GACnB,WAAW,CAWb"}

View File

@@ -0,0 +1,40 @@
class RuleVersionStore {
versions = [];
add(version) {
this.versions.push(version);
}
get(version) {
return this.versions.find((v) => v.version === version);
}
getCurrent() {
return this.versions
.filter((v) => !v.deprecated)
.sort((a, b) => b.effectiveDate.getTime() - a.effectiveDate.getTime())[0];
}
getAll() {
return [...this.versions];
}
deprecate(version, deprecatedDate) {
const versionObj = this.versions.find((v) => v.version === version);
if (versionObj) {
versionObj.deprecated = true;
versionObj.deprecatedDate = deprecatedDate;
}
}
}
const ruleVersionStore = new RuleVersionStore();
export function getRuleVersionStore() {
return ruleVersionStore;
}
export function createRuleVersion(version, effectiveDate, approvalAuthority, description) {
const ruleVersion = {
version,
effectiveDate,
approvalAuthority,
deprecated: false,
description,
};
ruleVersionStore.add(ruleVersion);
return ruleVersion;
}
//# sourceMappingURL=versions.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"versions.js","sourceRoot":"","sources":["versions.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB;IACZ,QAAQ,GAAkB,EAAE,CAAC;IAErC,GAAG,CAAC,OAAoB;QACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;aAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,cAAoB;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACpE,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;YAC7B,UAAU,CAAC,cAAc,GAAG,cAAc,CAAC;QAC7C,CAAC;IACH,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,aAAmB,EACnB,iBAAyB,EACzB,WAAoB;IAEpB,MAAM,WAAW,GAAgB;QAC/B,OAAO;QACP,aAAa;QACb,iBAAiB;QACjB,UAAU,EAAE,KAAK;QACjB,WAAW;KACZ,CAAC;IAEF,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,OAAO,WAAW,CAAC;AACrB,CAAC"}

5
packages/iso20022/src/exporter.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
import type { ISO20022Message } from '@brazil-swift-ops/types';
export declare function exportToJSON(message: ISO20022Message): string;
export declare function exportToXML(message: ISO20022Message): string;
export declare function exportMessage(message: ISO20022Message, format?: 'json' | 'xml'): string;
//# sourceMappingURL=exporter.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["exporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAE7D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAa5D;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EACxB,MAAM,GAAE,MAAM,GAAG,KAAc,GAC9B,MAAM,CASR"}

View File

@@ -0,0 +1,28 @@
export function exportToJSON(message) {
return JSON.stringify(message, null, 2);
}
export function exportToXML(message) {
// Simplified XML export - in production would use proper XML serialization
const xml = `<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:${message.messageType}">
<${message.messageType}>
<GrpHdr>
<MsgId>${message.groupHeader.messageIdentification}</MsgId>
<CreDtTm>${message.groupHeader.creationDateTime.toISOString()}</CreDtTm>
<NbOfTxs>${message.groupHeader.numberOfTransactions}</NbOfTxs>
</GrpHdr>
</${message.messageType}>
</Document>`;
return xml;
}
export function exportMessage(message, format = 'json') {
switch (format) {
case 'json':
return exportToJSON(message);
case 'xml':
return exportToXML(message);
default:
throw new Error(`Unsupported export format: ${format}`);
}
}
//# sourceMappingURL=exporter.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["exporter.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAwB;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAwB;IAClD,2EAA2E;IAC3E,MAAM,GAAG,GAAG;kDACoC,OAAO,CAAC,WAAW;KAChE,OAAO,CAAC,WAAW;;eAET,OAAO,CAAC,WAAW,CAAC,qBAAqB;iBACvC,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,WAAW,EAAE;iBAClD,OAAO,CAAC,WAAW,CAAC,oBAAoB;;MAEnD,OAAO,CAAC,WAAW;YACb,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAAwB,EACxB,SAAyB,MAAM;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/B,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}

6
packages/iso20022/src/index.d.ts vendored Normal file
View File

@@ -0,0 +1,6 @@
export * from './pacs008';
export * from './pacs009';
export * from './pain001';
export * from './mt-mapper';
export * from './exporter';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}

View File

@@ -0,0 +1,6 @@
export * from './pacs008';
export * from './pacs009';
export * from './pain001';
export * from './mt-mapper';
export * from './exporter';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}

21
packages/iso20022/src/mt-mapper.d.ts vendored Normal file
View File

@@ -0,0 +1,21 @@
import type { Transaction, ISO20022Message } from '@brazil-swift-ops/types';
export interface MT103Message {
field20: string;
field23B: string;
field32A: string;
field50A?: string;
field52A?: string;
field53A?: string;
field54A?: string;
field56A?: string;
field57A?: string;
field59: string;
field70: string;
field71A: string;
field72: string;
}
export declare function mapMT103ToTransaction(mt103: MT103Message): Transaction;
export declare function mapTransactionToMT103(transaction: Transaction): MT103Message;
export declare function convertMT103ToISO20022(mt103: MT103Message, targetType?: 'pacs.008' | 'pacs.009' | 'pain.001', version?: string): ISO20022Message;
export declare function convertISO20022ToMT103(message: ISO20022Message): MT103Message;
//# sourceMappingURL=mt-mapper.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"mt-mapper.d.ts","sourceRoot":"","sources":["mt-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAK5E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAuBtE;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CAc5E;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,UAAU,GAAE,UAAU,GAAG,UAAU,GAAG,UAAuB,EAC7D,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,CAWjB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,YAAY,CAqB7E"}

View File

@@ -0,0 +1,73 @@
import { createPacs008Message } from './pacs008';
import { createPacs009Message } from './pacs009';
import { createPain001Message } from './pain001';
export function mapMT103ToTransaction(mt103) {
const [valueDate, currency, amountStr] = mt103.field32A.split(/(\d{6})([A-Z]{3})([\d,]+)/).filter(Boolean);
const amount = parseFloat(amountStr.replace(',', '.'));
return {
id: mt103.field20,
direction: 'outbound',
amount,
currency: currency || 'USD',
orderingCustomer: {
name: mt103.field50A || '',
country: 'BR',
},
beneficiary: {
name: mt103.field59,
country: 'BR',
},
purposeOfPayment: mt103.field70,
swiftReference: mt103.field20,
status: 'pending',
createdAt: new Date(),
updatedAt: new Date(),
};
}
export function mapTransactionToMT103(transaction) {
const valueDate = new Date().toISOString().slice(0, 10).replace(/-/g, '');
const amountStr = transaction.amount.toFixed(2).replace('.', ',');
return {
field20: transaction.swiftReference || transaction.id,
field23B: 'CRED',
field32A: `${valueDate}${transaction.currency}${amountStr}`,
field50A: transaction.orderingCustomer.name,
field59: transaction.beneficiary.name,
field70: transaction.purposeOfPayment || '',
field71A: 'OUR',
field72: `//${transaction.fxContractId || ''}`,
};
}
export function convertMT103ToISO20022(mt103, targetType = 'pacs.008', version) {
const transaction = mapMT103ToTransaction(mt103);
switch (targetType) {
case 'pacs.008':
return createPacs008Message(transaction, version);
case 'pacs.009':
return createPacs009Message(transaction, version);
case 'pain.001':
return createPain001Message(transaction, version);
}
}
export function convertISO20022ToMT103(message) {
// This is a simplified conversion - in production would need full mapping
const transaction = {
id: message.groupHeader.messageIdentification,
direction: 'outbound',
amount: message.groupHeader.controlSum || 0,
currency: 'USD',
orderingCustomer: {
name: message.groupHeader.initiatingParty.name || '',
country: 'BR',
},
beneficiary: {
name: '',
country: 'BR',
},
status: 'pending',
createdAt: message.creationDateTime,
updatedAt: new Date(),
};
return mapTransactionToMT103(transaction);
}
//# sourceMappingURL=mt-mapper.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"mt-mapper.js","sourceRoot":"","sources":["mt-mapper.ts"],"names":[],"mappings":"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"}

9
packages/risk-models/src/capital.d.ts vendored Normal file
View File

@@ -0,0 +1,9 @@
import type { Transaction, CapitalImpact, RiskWeight } from '@brazil-swift-ops/types';
export interface CapitalConfig {
capitalRatio: number;
capitalBuffer: number;
riskWeights: RiskWeight[];
}
export declare function getRiskWeight(transaction: Transaction, riskWeights: RiskWeight[]): number;
export declare function calculateCapitalImpact(transaction: Transaction, config: CapitalConfig): CapitalImpact;
//# sourceMappingURL=capital.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"capital.d.ts","sourceRoot":"","sources":["capital.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtF,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAGzF;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CA2BrG"}

View File

@@ -0,0 +1,33 @@
import Decimal from 'decimal.js';
export function getRiskWeight(transaction, riskWeights) {
const paymentWeight = riskWeights.find((w) => w.category === 'payment');
return paymentWeight?.weight ?? 0.1;
}
export function calculateCapitalImpact(transaction, config) {
const riskWeight = getRiskWeight(transaction, config.riskWeights);
const transactionDecimal = new Decimal(transaction.amount);
const weightDecimal = new Decimal(riskWeight);
const rwaDecimal = transactionDecimal.mul(weightDecimal);
const riskWeightedAssets = rwaDecimal.toNumber();
const ratioDecimal = new Decimal(config.capitalRatio);
const capitalConsumedDecimal = rwaDecimal.mul(ratioDecimal);
const capitalConsumed = capitalConsumedDecimal.toNumber();
const capitalBufferAfter = config.capitalBuffer - capitalConsumed;
const complianceCheck = capitalBufferAfter >= 0;
return {
transactionId: transaction.id,
transactionAmount: transaction.amount,
currency: transaction.currency,
riskWeight,
riskWeightedAssets,
capitalRatio: config.capitalRatio,
capitalConsumed,
capitalBufferBefore: config.capitalBuffer,
capitalBufferAfter,
complianceCheck,
rationale: complianceCheck
? `Capital consumed: ${capitalConsumed.toFixed(2)}. Capital buffer after transaction: ${capitalBufferAfter.toFixed(2)} (above minimum).`
: `Capital consumed: ${capitalConsumed.toFixed(2)}. Capital buffer after transaction: ${capitalBufferAfter.toFixed(2)} (below minimum). Transaction may be blocked.`,
};
}
//# sourceMappingURL=capital.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"capital.js","sourceRoot":"","sources":["capital.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AASjC,MAAM,UAAU,aAAa,CAAC,WAAwB,EAAE,WAAyB;IAC/E,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IACxE,OAAO,aAAa,EAAE,MAAM,IAAI,GAAG,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAwB,EAAE,MAAqB;IACpF,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,kBAAkB,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,sBAAsB,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,sBAAsB,CAAC,QAAQ,EAAE,CAAC;IAC1D,MAAM,kBAAkB,GAAG,MAAM,CAAC,aAAa,GAAG,eAAe,CAAC;IAClE,MAAM,eAAe,GAAG,kBAAkB,IAAI,CAAC,CAAC;IAEhD,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,iBAAiB,EAAE,WAAW,CAAC,MAAM;QACrC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,UAAU;QACV,kBAAkB;QAClB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,eAAe;QACf,mBAAmB,EAAE,MAAM,CAAC,aAAa;QACzC,kBAAkB;QAClB,eAAe;QACf,SAAS,EAAE,eAAe;YACxB,CAAC,CAAC,qBAAqB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;YACxI,CAAC,CAAC,qBAAqB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,+CAA+C;KACvK,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,6 @@
import type { EscalationState, EscalationLevel, RuleDecision } from '@brazil-swift-ops/types';
export declare function determineEscalationLevel(decision: RuleDecision, hasLiquidityIssue: boolean, hasCapitalIssue: boolean, hasLCRIssue: boolean): EscalationLevel;
export declare function createEscalationState(transactionId: string, level: EscalationLevel, reason: string): EscalationState;
export declare function escalate(currentState: EscalationState, newLevel: EscalationLevel, reason: string): EscalationState;
export declare function approveEscalation(state: EscalationState, approvedBy: string): EscalationState;
//# sourceMappingURL=escalation.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["escalation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,yBAAyB,CAAC;AAEjC,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,YAAY,EACtB,iBAAiB,EAAE,OAAO,EAC1B,eAAe,EAAE,OAAO,EACxB,WAAW,EAAE,OAAO,GACnB,eAAe,CAcjB;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,MAAM,GACb,eAAe,CAQjB;AAED,wBAAgB,QAAQ,CACtB,YAAY,EAAE,eAAe,EAC7B,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,MAAM,GACb,eAAe,CAQjB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,GACjB,eAAe,CAOjB"}

View File

@@ -0,0 +1,39 @@
export function determineEscalationLevel(decision, hasLiquidityIssue, hasCapitalIssue, hasLCRIssue) {
if (decision === 'Allow') {
return 'Allow';
}
if (hasLiquidityIssue || hasCapitalIssue || hasLCRIssue) {
return 'TreasuryApproval';
}
if (decision === 'Escalate') {
return 'ComplianceReview';
}
return 'Hold';
}
export function createEscalationState(transactionId, level, reason) {
return {
transactionId,
currentLevel: level,
reason,
escalatedAt: new Date(),
approvalRequired: level !== 'Allow',
};
}
export function escalate(currentState, newLevel, reason) {
return {
...currentState,
previousLevel: currentState.currentLevel,
currentLevel: newLevel,
reason,
escalatedAt: new Date(),
};
}
export function approveEscalation(state, approvedBy) {
return {
...state,
approvalRequired: false,
approvedBy,
approvedAt: new Date(),
};
}
//# sourceMappingURL=escalation.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["escalation.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,wBAAwB,CACtC,QAAsB,EACtB,iBAA0B,EAC1B,eAAwB,EACxB,WAAoB;IAEpB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,iBAAiB,IAAI,eAAe,IAAI,WAAW,EAAE,CAAC;QACxD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,aAAqB,EACrB,KAAsB,EACtB,MAAc;IAEd,OAAO;QACL,aAAa;QACb,YAAY,EAAE,KAAK;QACnB,MAAM;QACN,WAAW,EAAE,IAAI,IAAI,EAAE;QACvB,gBAAgB,EAAE,KAAK,KAAK,OAAO;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,YAA6B,EAC7B,QAAyB,EACzB,MAAc;IAEd,OAAO;QACL,GAAG,YAAY;QACf,aAAa,EAAE,YAAY,CAAC,YAAY;QACxC,YAAY,EAAE,QAAQ;QACtB,MAAM;QACN,WAAW,EAAE,IAAI,IAAI,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,UAAkB;IAElB,OAAO;QACL,GAAG,KAAK;QACR,gBAAgB,EAAE,KAAK;QACvB,UAAU;QACV,UAAU,EAAE,IAAI,IAAI,EAAE;KACvB,CAAC;AACJ,CAAC"}

6
packages/risk-models/src/index.d.ts vendored Normal file
View File

@@ -0,0 +1,6 @@
export * from './reserves';
export * from './capital';
export * from './lcr';
export * from './escalation';
export * from './risk-weights';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}

View File

@@ -0,0 +1,6 @@
export * from './reserves';
export * from './capital';
export * from './lcr';
export * from './escalation';
export * from './risk-weights';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}

9
packages/risk-models/src/lcr.d.ts vendored Normal file
View File

@@ -0,0 +1,9 @@
import type { Transaction, LCRImpact } from '@brazil-swift-ops/types';
export interface LCRConfig {
hqla: number;
netOutflows: number;
minimumLCR: number;
runoffFactor: number;
}
export declare function calculateLCRImpact(transaction: Transaction, config: LCRConfig): LCRImpact;
//# sourceMappingURL=lcr.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"lcr.d.ts","sourceRoot":"","sources":["lcr.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGtE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAgCzF"}

View File

@@ -0,0 +1,35 @@
import Decimal from 'decimal.js';
import { getDefaultConverter } from '@brazil-swift-ops/utils';
export function calculateLCRImpact(transaction, config) {
const converter = getDefaultConverter();
const brlAmount = converter.convert(transaction.amount, transaction.currency, 'BRL');
const transactionDecimal = new Decimal(brlAmount);
const runoffDecimal = new Decimal(config.runoffFactor);
const outflowStressDecimal = transactionDecimal.mul(runoffDecimal);
const outflowStress = outflowStressDecimal.toNumber();
const netOutflowsAfter = config.netOutflows + outflowStress;
const hqlaDecimal = new Decimal(config.hqla);
const outflowsBeforeDecimal = new Decimal(config.netOutflows);
const outflowsAfterDecimal = new Decimal(netOutflowsAfter);
const lcrBefore = outflowsBeforeDecimal.gt(0) ? hqlaDecimal.div(outflowsBeforeDecimal).toNumber() : Infinity;
const lcrAfter = outflowsAfterDecimal.gt(0) ? hqlaDecimal.div(outflowsAfterDecimal).toNumber() : Infinity;
const complianceCheck = lcrAfter >= config.minimumLCR;
return {
transactionId: transaction.id,
transactionAmount: transaction.amount,
currency: transaction.currency,
runoffFactor: config.runoffFactor,
outflowStress,
hqlaBefore: config.hqla,
netOutflowsBefore: config.netOutflows,
netOutflowsAfter,
lcrBefore,
lcrAfter,
minimumLCR: config.minimumLCR,
complianceCheck,
rationale: complianceCheck
? `LCR after transaction: ${(lcrAfter * 100).toFixed(2)}% (above minimum ${(config.minimumLCR * 100).toFixed(2)}%).`
: `LCR after transaction: ${(lcrAfter * 100).toFixed(2)}% (below minimum ${(config.minimumLCR * 100).toFixed(2)}%). Transaction may be blocked.`,
};
}
//# sourceMappingURL=lcr.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"lcr.js","sourceRoot":"","sources":["lcr.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAS9D,MAAM,UAAU,kBAAkB,CAAC,WAAwB,EAAE,MAAiB;IAC5E,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrF,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC;IACtD,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,qBAAqB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7G,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1G,MAAM,eAAe,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC;IAEtD,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,iBAAiB,EAAE,WAAW,CAAC,MAAM;QACrC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,aAAa;QACb,UAAU,EAAE,MAAM,CAAC,IAAI;QACvB,iBAAiB,EAAE,MAAM,CAAC,WAAW;QACrC,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,eAAe;QACf,SAAS,EAAE,eAAe;YACxB,CAAC,CAAC,0BAA0B,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YACpH,CAAC,CAAC,0BAA0B,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;KACnJ,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,8 @@
import type { Transaction, ReserveImpact } from '@brazil-swift-ops/types';
export interface ReserveConfig {
reserveRatio: number;
availableLiquidity: number;
requiredReserves: number;
}
export declare function calculateReserveImpact(transaction: Transaction, config: ReserveConfig): ReserveImpact;
//# sourceMappingURL=reserves.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reserves.d.ts","sourceRoot":"","sources":["reserves.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG1E,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAwBrG"}

View File

@@ -0,0 +1,27 @@
import Decimal from 'decimal.js';
import { getDefaultConverter } from '@brazil-swift-ops/utils';
export function calculateReserveImpact(transaction, config) {
const converter = getDefaultConverter();
const brlAmount = converter.convert(transaction.amount, transaction.currency, 'BRL');
const transactionDecimal = new Decimal(brlAmount);
const ratioDecimal = new Decimal(config.reserveRatio);
const reserveImpactDecimal = transactionDecimal.mul(ratioDecimal);
const reserveImpact = reserveImpactDecimal.toNumber();
const availableLiquidityAfter = config.availableLiquidity - brlAmount;
const complianceCheck = availableLiquidityAfter >= config.requiredReserves;
return {
transactionId: transaction.id,
transactionAmount: transaction.amount,
currency: transaction.currency,
reserveRatio: config.reserveRatio,
reserveImpact,
availableLiquidityBefore: config.availableLiquidity,
availableLiquidityAfter,
requiredReserves: config.requiredReserves,
complianceCheck,
rationale: complianceCheck
? `Reserve impact: ${reserveImpact.toFixed(2)} BRL. Available liquidity after transaction: ${availableLiquidityAfter.toFixed(2)} BRL (above required ${config.requiredReserves.toFixed(2)} BRL).`
: `Reserve impact: ${reserveImpact.toFixed(2)} BRL. Available liquidity after transaction: ${availableLiquidityAfter.toFixed(2)} BRL (below required ${config.requiredReserves.toFixed(2)} BRL). Transaction may be blocked.`,
};
}
//# sourceMappingURL=reserves.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reserves.js","sourceRoot":"","sources":["reserves.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAQ9D,MAAM,UAAU,sBAAsB,CAAC,WAAwB,EAAE,MAAqB;IACpF,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrF,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC;IACtD,MAAM,uBAAuB,GAAG,MAAM,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACtE,MAAM,eAAe,GAAG,uBAAuB,IAAI,MAAM,CAAC,gBAAgB,CAAC;IAE3E,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,iBAAiB,EAAE,WAAW,CAAC,MAAM;QACrC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,aAAa;QACb,wBAAwB,EAAE,MAAM,CAAC,kBAAkB;QACnD,uBAAuB;QACvB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,eAAe;QACf,SAAS,EAAE,eAAe;YACxB,CAAC,CAAC,mBAAmB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gDAAgD,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;YACjM,CAAC,CAAC,mBAAmB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gDAAgD,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC;KAChO,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,4 @@
import type { RiskWeight, RiskWeightTable } from '@brazil-swift-ops/types';
export declare const DEFAULT_RISK_WEIGHTS: RiskWeight[];
export declare function createRiskWeightTable(version?: string, effectiveDate?: Date): RiskWeightTable;
//# sourceMappingURL=risk-weights.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"risk-weights.d.ts","sourceRoot":"","sources":["risk-weights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE3E,eAAO,MAAM,oBAAoB,EAAE,UAAU,EAsB5C,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,MAAgB,EACzB,aAAa,GAAE,IAAiB,GAC/B,eAAe,CAOjB"}

View File

@@ -0,0 +1,32 @@
export const DEFAULT_RISK_WEIGHTS = [
{
category: 'payment',
description: 'Payment transactions',
weight: 0.1, // 10%
minWeight: 0.0,
maxWeight: 0.2,
},
{
category: 'fx_settlement',
description: 'FX settlement transactions',
weight: 0.35, // 35%
minWeight: 0.2,
maxWeight: 0.5,
},
{
category: 'nostro_exposure',
description: 'Nostro account exposure',
weight: 1.0, // 100%
minWeight: 0.5,
maxWeight: 1.0,
},
];
export function createRiskWeightTable(version = '1.0.0', effectiveDate = new Date()) {
return {
id: `RWT-${version}`,
version,
effectiveDate,
weights: DEFAULT_RISK_WEIGHTS,
};
}
//# sourceMappingURL=risk-weights.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"risk-weights.js","sourceRoot":"","sources":["risk-weights.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD;QACE,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,sBAAsB;QACnC,MAAM,EAAE,GAAG,EAAE,MAAM;QACnB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;IACD;QACE,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE,IAAI,EAAE,MAAM;QACpB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;IACD;QACE,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE,GAAG,EAAE,OAAO;QACpB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;CACF,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,UAAkB,OAAO,EACzB,gBAAsB,IAAI,IAAI,EAAE;IAEhC,OAAO;QACL,EAAE,EAAE,OAAO,OAAO,EAAE;QACpB,OAAO;QACP,aAAa;QACb,OAAO,EAAE,oBAAoB;KAC9B,CAAC;AACJ,CAAC"}

42
packages/rules-engine/src/aml.d.ts vendored Normal file
View File

@@ -0,0 +1,42 @@
/**
* AML (Anti-Money Laundering) and anti-structuring detection
*/
import type { Transaction, AMLCheckResult, SingleTransactionAMLResult, StructuringCheckResult, RuleResult } from '@brazil-swift-ops/types';
/**
* Transaction history for structuring detection (in production, this would be a database)
*/
interface TransactionHistory {
transactionId: string;
amount: number;
currency: string;
usdEquivalent: number;
date: Date;
orderingCustomerTaxId?: string;
beneficiaryTaxId?: string;
}
declare class TransactionHistoryStore {
private history;
add(entry: TransactionHistory): void;
getByDateRange(startDate: Date, endDate: Date): TransactionHistory[];
getByCustomer(taxId: string, startDate: Date, endDate: Date): TransactionHistory[];
getAll(): TransactionHistory[];
}
export declare function getHistoryStore(): TransactionHistoryStore;
/**
* Check single transaction AML threshold
*/
export declare function checkSingleTransactionAML(transaction: Transaction): SingleTransactionAMLResult;
/**
* Check for structuring patterns (multiple small transactions that sum above threshold)
*/
export declare function checkStructuring(transaction: Transaction, historicalTransactions?: TransactionHistory[]): StructuringCheckResult | undefined;
/**
* Perform complete AML check
*/
export declare function performAMLCheck(transaction: Transaction, historicalTransactions?: TransactionHistory[]): AMLCheckResult;
/**
* Create rule result for AML check
*/
export declare function createAMLRuleResult(check: AMLCheckResult): RuleResult;
export {};
//# sourceMappingURL=aml.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"aml.d.ts","sourceRoot":"","sources":["aml.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,UAAU,EAGX,MAAM,yBAAyB,CAAC;AAKjC;;GAEG;AACH,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,cAAM,uBAAuB;IAC3B,OAAO,CAAC,OAAO,CAA4B;IAE3C,GAAG,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAIpC,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB,EAAE;IAMpE,aAAa,CACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,kBAAkB,EAAE;IAUvB,MAAM,IAAI,kBAAkB,EAAE;CAG/B;AAID,wBAAgB,eAAe,IAAI,uBAAuB,CAEzD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,GACvB,0BAA0B,CA6B5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,GAC5C,sBAAsB,GAAG,SAAS,CAiEpC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,WAAW,EACxB,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,GAC5C,cAAc,CAyBhB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAsBrE"}

View File

@@ -0,0 +1,152 @@
/**
* AML (Anti-Money Laundering) and anti-structuring detection
*/
import { getDefaultConverter } from '@brazil-swift-ops/utils';
import { calculateRollingWindow, filterDatesInWindow } from '@brazil-swift-ops/utils';
import { getConfig } from './config';
class TransactionHistoryStore {
history = [];
add(entry) {
this.history.push(entry);
}
getByDateRange(startDate, endDate) {
return this.history.filter((entry) => entry.date >= startDate && entry.date <= endDate);
}
getByCustomer(taxId, startDate, endDate) {
return this.history.filter((entry) => (entry.orderingCustomerTaxId === taxId ||
entry.beneficiaryTaxId === taxId) &&
entry.date >= startDate &&
entry.date <= endDate);
}
getAll() {
return [...this.history];
}
}
const historyStore = new TransactionHistoryStore();
export function getHistoryStore() {
return historyStore;
}
/**
* Check single transaction AML threshold
*/
export function checkSingleTransactionAML(transaction) {
const config = getConfig();
const converter = getDefaultConverter();
const usdEquivalent = converter.getUSDEquivalent(transaction.amount, transaction.currency);
const threshold = config.aml.singleTransactionThreshold;
const requiresEnhancedReview = usdEquivalent >= threshold;
let riskLevel;
if (usdEquivalent >= threshold) {
riskLevel = 'High';
}
else if (usdEquivalent >= threshold * 0.5) {
riskLevel = 'Medium';
}
else {
riskLevel = 'Low';
}
return {
passed: true, // AML check doesn't fail, it flags for review
transactionAmount: transaction.amount,
usdEquivalent,
threshold,
requiresEnhancedReview,
riskLevel,
};
}
/**
* Check for structuring patterns (multiple small transactions that sum above threshold)
*/
export function checkStructuring(transaction, historicalTransactions) {
const config = getConfig();
const converter = getDefaultConverter();
// Calculate rolling window
const window = calculateRollingWindow(transaction.createdAt || new Date(), config.aml.structuringWindowDays);
// Get historical transactions if not provided
if (!historicalTransactions) {
const customerTaxId = transaction.orderingCustomerTaxId || transaction.beneficiary?.taxId;
if (customerTaxId) {
historicalTransactions = historyStore.getByCustomer(customerTaxId, window.startDate, window.endDate);
}
else {
historicalTransactions = historyStore.getByDateRange(window.startDate, window.endDate);
}
}
// Filter to transactions in window
const windowTransactions = historicalTransactions.filter((t) => filterDatesInWindow([t.date], window).length > 0);
// Calculate totals
const totalAmount = windowTransactions.reduce((sum, t) => sum + t.amount, transaction.amount);
const totalUsdEquivalent = windowTransactions.reduce((sum, t) => sum + t.usdEquivalent, converter.getUSDEquivalent(transaction.amount, transaction.currency));
const individualAmounts = [
...windowTransactions.map((t) => t.usdEquivalent),
converter.getUSDEquivalent(transaction.amount, transaction.currency),
];
// Check if structuring detected
const threshold = config.aml.structuringThreshold;
const detected = totalUsdEquivalent >= threshold &&
individualAmounts.every((amt) => amt < threshold);
return {
detected,
windowDays: window.days,
transactionCount: windowTransactions.length + 1,
totalAmount,
totalUsdEquivalent,
individualAmounts,
rationale: detected
? `Structuring detected: ${windowTransactions.length + 1} transactions totaling ${totalUsdEquivalent.toFixed(2)} USD over ${window.days} days, each below ${threshold} USD threshold.`
: `No structuring pattern detected. Total: ${totalUsdEquivalent.toFixed(2)} USD over ${window.days} days.`,
};
}
/**
* Perform complete AML check
*/
export function performAMLCheck(transaction, historicalTransactions) {
const singleCheck = checkSingleTransactionAML(transaction);
const structuringCheck = checkStructuring(transaction, historicalTransactions);
// Determine overall risk level
let overallRiskLevel;
if (singleCheck.riskLevel === 'High' || structuringCheck?.detected) {
overallRiskLevel = 'High';
}
else if (singleCheck.riskLevel === 'Medium') {
overallRiskLevel = 'Medium';
}
else {
overallRiskLevel = 'Low';
}
const passed = overallRiskLevel !== 'High';
return {
passed,
singleTransactionCheck: singleCheck,
structuringCheck,
overallRiskLevel,
rationale: passed
? `AML check passed. Risk level: ${overallRiskLevel}.`
: `AML check flagged for review. Risk level: ${overallRiskLevel}. ${structuringCheck?.detected ? 'Structuring pattern detected.' : ''}`,
};
}
/**
* Create rule result for AML check
*/
export function createAMLRuleResult(check) {
const severity = check.overallRiskLevel === 'High'
? 'Critical'
: check.overallRiskLevel === 'Medium'
? 'Warning'
: 'Info';
const decision = check.passed ? 'Allow' : 'Escalate';
return {
ruleId: 'aml-check',
ruleName: 'AML & Anti-Structuring Check',
passed: check.passed,
severity,
decision,
rationale: check.rationale,
details: {
overallRiskLevel: check.overallRiskLevel,
singleTransactionCheck: check.singleTransactionCheck,
structuringCheck: check.structuringCheck,
},
};
}
//# sourceMappingURL=aml.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"aml.js","sourceRoot":"","sources":["aml.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,13 @@
import type { Transaction, FXContract, FXContractCheckResult, RuleResult } from '@brazil-swift-ops/types';
declare class FXContractStore {
private contracts;
add(contract: FXContract): void;
get(contractId: string): FXContract | undefined;
getAll(): FXContract[];
updateRemainingAmount(contractId: string, usedAmount: number): void;
}
export declare function getContractStore(): FXContractStore;
export declare function validateFXContract(transaction: Transaction, contract?: FXContract): FXContractCheckResult;
export declare function createFXContractRuleResult(check: FXContractCheckResult): RuleResult;
export {};
//# sourceMappingURL=fx-contract.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"fx-contract.d.ts","sourceRoot":"","sources":["fx-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,UAAU,EAGX,MAAM,yBAAyB,CAAC;AAGjC,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAsC;IAEvD,GAAG,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI;IAI/B,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI/C,MAAM,IAAI,UAAU,EAAE;IAItB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;CAWpE;AAID,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,UAAU,GACpB,qBAAqB,CAmFvB;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,qBAAqB,GAC3B,UAAU,CAsBZ"}

View File

@@ -0,0 +1,127 @@
import { isEffectiveDate } from '@brazil-swift-ops/utils';
class FXContractStore {
contracts = new Map();
add(contract) {
this.contracts.set(contract.contractId, contract);
}
get(contractId) {
return this.contracts.get(contractId);
}
getAll() {
return Array.from(this.contracts.values());
}
updateRemainingAmount(contractId, usedAmount) {
const contract = this.contracts.get(contractId);
if (contract) {
contract.usedAmount += usedAmount;
contract.remainingAmount = contract.amount - contract.usedAmount;
contract.updatedAt = new Date();
if (contract.remainingAmount <= 0) {
contract.status = 'exhausted';
}
}
}
}
const contractStore = new FXContractStore();
export function getContractStore() {
return contractStore;
}
export function validateFXContract(transaction, contract) {
if (!transaction.fxContractId) {
return {
passed: false,
contractExists: false,
contractType: undefined,
contractAmount: 0,
contractRemainingAmount: 0,
transactionAmount: transaction.amount,
amountWithinLimit: false,
rationale: 'FX contract ID is required for cross-border transactions.',
};
}
if (!contract) {
contract = contractStore.get(transaction.fxContractId);
}
if (!contract) {
return {
passed: false,
fxContractId: transaction.fxContractId,
contractExists: false,
contractType: undefined,
contractAmount: 0,
contractRemainingAmount: 0,
transactionAmount: transaction.amount,
amountWithinLimit: false,
rationale: `FX contract ${transaction.fxContractId} not found.`,
};
}
const now = new Date();
const contractActive = contract.status === 'active' &&
isEffectiveDate(now, contract.effectiveDate, contract.expiryDate);
if (!contractActive) {
return {
passed: false,
fxContractId: contract.contractId,
contractExists: true,
contractActive: false,
contractType: contract.type,
contractAmount: contract.amount,
contractRemainingAmount: contract.remainingAmount,
transactionAmount: transaction.amount,
amountWithinLimit: false,
rationale: `FX contract ${contract.contractId} is not active (status: ${contract.status}).`,
};
}
if (contract.type !== transaction.direction) {
return {
passed: false,
fxContractId: contract.contractId,
contractExists: true,
contractActive: false,
contractType: contract.type,
contractAmount: contract.amount,
contractRemainingAmount: contract.remainingAmount,
transactionAmount: transaction.amount,
amountWithinLimit: false,
rationale: `FX contract type (${contract.type}) does not match transaction direction (${transaction.direction}).`,
};
}
const amountWithinLimit = transaction.amount <= contract.remainingAmount;
return {
passed: amountWithinLimit && contractActive,
fxContractId: contract.contractId,
contractExists: true,
contractActive,
contractType: contract.type,
contractAmount: contract.amount,
contractRemainingAmount: contract.remainingAmount,
transactionAmount: transaction.amount,
amountWithinLimit,
rationale: amountWithinLimit
? `Transaction amount (${transaction.amount} ${transaction.currency}) is within FX contract limit (${contract.remainingAmount} ${contract.currency} remaining).`
: `Transaction amount (${transaction.amount} ${transaction.currency}) exceeds FX contract remaining amount (${contract.remainingAmount} ${contract.currency}).`,
};
}
export function createFXContractRuleResult(check) {
const severity = check.passed ? 'Info' : 'Critical';
const decision = check.passed ? 'Allow' : 'Hold';
return {
ruleId: 'fx-contract-check',
ruleName: 'FX Contract Validation',
passed: check.passed,
severity,
decision,
rationale: check.rationale,
details: {
fxContractId: check.fxContractId,
contractExists: check.contractExists,
contractActive: check.contractActive,
contractType: check.contractType,
contractAmount: check.contractAmount,
contractRemainingAmount: check.contractRemainingAmount,
transactionAmount: check.transactionAmount,
amountWithinLimit: check.amountWithinLimit,
},
};
}
//# sourceMappingURL=fx-contract.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"fx-contract.js","sourceRoot":"","sources":["fx-contract.ts"],"names":[],"mappings":"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"}

13
packages/rules-engine/src/index.d.ts vendored Normal file
View File

@@ -0,0 +1,13 @@
/**
* @brazil-swift-ops/rules-engine
*
* Brazil regulatory rules engine for cross-border payments
*/
export * from './config';
export * from './threshold';
export * from './documentation';
export * from './fx-contract';
export * from './iof';
export * from './aml';
export * from './orchestrator';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,gBAAgB,CAAC"}

View File

@@ -0,0 +1,13 @@
/**
* @brazil-swift-ops/rules-engine
*
* Brazil regulatory rules engine for cross-border payments
*/
export * from './config';
export * from './threshold';
export * from './documentation';
export * from './fx-contract';
export * from './iof';
export * from './aml';
export * from './orchestrator';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,gBAAgB,CAAC"}

4
packages/rules-engine/src/iof.d.ts vendored Normal file
View File

@@ -0,0 +1,4 @@
import type { Transaction, IOFCalculationResult, RuleResult } from '@brazil-swift-ops/types';
export declare function calculateIOF(transaction: Transaction): IOFCalculationResult;
export declare function createIOFRuleResult(calculation: IOFCalculationResult): RuleResult;
//# sourceMappingURL=iof.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"iof.d.ts","sourceRoot":"","sources":["iof.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,UAAU,EACX,MAAM,yBAAyB,CAAC;AAIjC,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,oBAAoB,CAuC3E;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,oBAAoB,GAChC,UAAU,CAoBZ"}

View File

@@ -0,0 +1,55 @@
import Decimal from 'decimal.js';
import { getDefaultConverter } from '@brazil-swift-ops/utils';
import { getConfig } from './config';
export function calculateIOF(transaction) {
const config = getConfig();
const converter = getDefaultConverter();
const brlAmount = converter.convert(transaction.amount, transaction.currency, 'BRL');
const iofRate = transaction.direction === 'inbound'
? config.iof.inboundRate
: config.iof.outboundRate;
const brlDecimal = new Decimal(brlAmount);
const rateDecimal = new Decimal(iofRate);
const iofDecimal = brlDecimal.mul(rateDecimal);
const iofAmount = iofDecimal.toNumber();
let netAmount;
if (transaction.direction === 'inbound') {
netAmount = brlAmount - iofAmount;
}
else {
netAmount = brlAmount + iofAmount;
}
return {
direction: transaction.direction,
transactionAmount: transaction.amount,
currency: transaction.currency,
brlAmount,
iofRate,
iofAmount,
netAmount,
effectiveDate: config.iof.effectiveDate,
rateVersion: config.iof.rateVersion,
};
}
export function createIOFRuleResult(calculation) {
return {
ruleId: 'iof-calculation',
ruleName: 'IOF Tax Calculation',
passed: true,
severity: 'Info',
decision: 'Allow',
rationale: `IOF calculated: ${calculation.iofAmount.toFixed(2)} BRL (${(calculation.iofRate * 100).toFixed(2)}% rate) for ${calculation.direction} transaction. Net amount: ${calculation.netAmount.toFixed(2)} BRL.`,
details: {
direction: calculation.direction,
transactionAmount: calculation.transactionAmount,
currency: calculation.currency,
brlAmount: calculation.brlAmount,
iofRate: calculation.iofRate,
iofAmount: calculation.iofAmount,
netAmount: calculation.netAmount,
effectiveDate: calculation.effectiveDate,
rateVersion: calculation.rateVersion,
},
};
}
//# sourceMappingURL=iof.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"iof.js","sourceRoot":"","sources":["iof.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAMjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,UAAU,YAAY,CAAC,WAAwB;IACnD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IAExC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CACjC,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,QAAQ,EACpB,KAAK,CACN,CAAC;IAEF,MAAM,OAAO,GACX,WAAW,CAAC,SAAS,KAAK,SAAS;QACjC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW;QACxB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;IAE9B,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IAExC,IAAI,SAAiB,CAAC;IACtB,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACxC,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,OAAO;QACL,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,iBAAiB,EAAE,WAAW,CAAC,MAAM;QACrC,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,SAAS;QACT,OAAO;QACP,SAAS;QACT,SAAS;QACT,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa;QACvC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAiC;IAEjC,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,QAAQ,EAAE,qBAAqB;QAC/B,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,mBAAmB,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,WAAW,CAAC,SAAS,6BAA6B,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;QACrN,OAAO,EAAE;YACP,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;YAChD,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,aAAa,EAAE,WAAW,CAAC,aAAa;YACxC,WAAW,EAAE,WAAW,CAAC,WAAW;SACrC;KACF,CAAC;AACJ,CAAC"}

View File

@@ -0,0 +1,13 @@
/**
* Rules engine orchestrator - coordinates all regulatory rule evaluations
*/
import type { Transaction, BrazilRegulatoryResult } from '@brazil-swift-ops/types';
/**
* Evaluate all Brazil regulatory rules for a transaction
*/
export declare function evaluateTransaction(transaction: Transaction): BrazilRegulatoryResult;
/**
* Evaluate a batch of transactions
*/
export declare function evaluateBatch(transactions: Transaction[]): BrazilRegulatoryResult[];
//# sourceMappingURL=orchestrator.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,sBAAsB,EAGvB,MAAM,yBAAyB,CAAC;AAmBjC;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,GACvB,sBAAsB,CAoDxB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,WAAW,EAAE,GAC1B,sBAAsB,EAAE,CAE1B"}

View File

@@ -0,0 +1,68 @@
/**
* Rules engine orchestrator - coordinates all regulatory rule evaluations
*/
import { getConfig } from './config';
import { evaluateThreshold, createThresholdRuleResult } from './threshold';
import { validateDocumentation, createDocumentationRuleResult, } from './documentation';
import { validateFXContract, createFXContractRuleResult, getContractStore, } from './fx-contract';
import { calculateIOF, createIOFRuleResult } from './iof';
import { performAMLCheck, createAMLRuleResult, } from './aml';
/**
* Evaluate all Brazil regulatory rules for a transaction
*/
export function evaluateTransaction(transaction) {
const config = getConfig();
const timestamp = new Date();
// Run all rule checks
const thresholdCheck = evaluateThreshold(transaction);
const documentationCheck = validateDocumentation(transaction);
const fxContract = getContractStore().get(transaction.fxContractId || '');
const fxContractCheck = validateFXContract(transaction, fxContract);
const iofCalculation = calculateIOF(transaction);
const amlCheck = performAMLCheck(transaction);
// Create rule results
const rules = [
createThresholdRuleResult(thresholdCheck),
createDocumentationRuleResult(documentationCheck),
createFXContractRuleResult(fxContractCheck),
createIOFRuleResult(iofCalculation),
createAMLRuleResult(amlCheck),
];
// Determine overall decision and severity
const criticalRules = rules.filter((r) => r.severity === 'Critical' && !r.passed);
const warningRules = rules.filter((r) => r.severity === 'Warning' && !r.passed);
let overallDecision;
let overallSeverity;
if (criticalRules.length > 0) {
overallDecision = 'Hold';
overallSeverity = 'Critical';
}
else if (warningRules.length > 0) {
overallDecision = 'Escalate';
overallSeverity = 'Warning';
}
else {
overallDecision = 'Allow';
overallSeverity = 'Info';
}
return {
transactionId: transaction.id,
timestamp,
ruleSetVersion: config.ruleSetVersion,
overallDecision,
overallSeverity,
rules,
thresholdCheck,
documentationCheck,
fxContractCheck,
iofCalculation,
amlCheck,
};
}
/**
* Evaluate a batch of transactions
*/
export function evaluateBatch(transactions) {
return transactions.map((txn) => evaluateTransaction(txn));
}
//# sourceMappingURL=orchestrator.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["orchestrator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACL,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,EACL,eAAe,EACf,mBAAmB,GAEpB,MAAM,OAAO,CAAC;AAEf;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAwB;IAExB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAE7B,sBAAsB;IACtB,MAAM,cAAc,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAE9C,sBAAsB;IACtB,MAAM,KAAK,GAAG;QACZ,yBAAyB,CAAC,cAAc,CAAC;QACzC,6BAA6B,CAAC,kBAAkB,CAAC;QACjD,0BAA0B,CAAC,eAAe,CAAC;QAC3C,mBAAmB,CAAC,cAAc,CAAC;QACnC,mBAAmB,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEF,0CAA0C;IAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEhF,IAAI,eAA6B,CAAC;IAClC,IAAI,eAA6B,CAAC;IAElC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,eAAe,GAAG,MAAM,CAAC;QACzB,eAAe,GAAG,UAAU,CAAC;IAC/B,CAAC;SAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,eAAe,GAAG,UAAU,CAAC;QAC7B,eAAe,GAAG,SAAS,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,OAAO,CAAC;QAC1B,eAAe,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,SAAS;QACT,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,eAAe;QACf,eAAe;QACf,KAAK;QACL,cAAc;QACd,kBAAkB;QAClB,eAAe;QACf,cAAc;QACd,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,YAA2B;IAE3B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC"}

15
packages/treasury/src/accounts.d.ts vendored Normal file
View File

@@ -0,0 +1,15 @@
import type { TreasuryAccount, SubledgerAccount, Account } from '@brazil-swift-ops/types';
declare class AccountStore {
private accounts;
add(account: Account): void;
get(id: string): Account | undefined;
getByParent(parentId: string): SubledgerAccount[];
getAll(): Account[];
update(id: string, updates: Partial<Account>): void;
delete(id: string): void;
}
export declare function getAccountStore(): AccountStore;
export declare function createTreasuryAccount(accountNumber: string, name: string, currency: string): TreasuryAccount;
export declare function createSubledgerAccount(accountNumber: string, name: string, currency: string, parentAccountId: string): SubledgerAccount;
export {};
//# sourceMappingURL=accounts.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE1F,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAmC;IAEnD,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAOjD,MAAM,IAAI,OAAO,EAAE;IAInB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAQnD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGzB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAa5G;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,gBAAgB,CAcvI"}

View File

@@ -0,0 +1,59 @@
class AccountStore {
accounts = new Map();
add(account) {
this.accounts.set(account.id, account);
}
get(id) {
return this.accounts.get(id);
}
getByParent(parentId) {
return Array.from(this.accounts.values()).filter((acc) => acc.type === 'subledger' && acc.parentAccountId === parentId);
}
getAll() {
return Array.from(this.accounts.values());
}
update(id, updates) {
const account = this.accounts.get(id);
if (account) {
const updated = { ...account, ...updates, updatedAt: new Date() };
this.accounts.set(id, updated);
}
}
delete(id) {
this.accounts.delete(id);
}
}
const accountStore = new AccountStore();
export function getAccountStore() {
return accountStore;
}
export function createTreasuryAccount(accountNumber, name, currency) {
return {
id: `TREASURY-${Date.now()}`,
accountNumber,
name,
type: 'treasury',
currency,
status: 'active',
balance: 0,
availableBalance: 0,
createdAt: new Date(),
updatedAt: new Date(),
};
}
export function createSubledgerAccount(accountNumber, name, currency, parentAccountId) {
return {
id: `SUB-${Date.now()}`,
accountNumber,
name,
type: 'subledger',
currency,
status: 'active',
parentAccountId,
balance: 0,
availableBalance: 0,
createdAt: new Date(),
updatedAt: new Date(),
};
}
//# sourceMappingURL=accounts.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["accounts.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY;IACR,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEnD,GAAG,CAAC,OAAgB;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,GAAG,EAA2B,EAAE,CAC/B,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,eAAe,KAAK,QAAQ,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,OAAyB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAa,CAAC;YAC7E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAExC,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAqB,EAAE,IAAY,EAAE,QAAgB;IACzF,OAAO;QACL,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE;QAC5B,aAAa;QACb,IAAI;QACJ,IAAI,EAAE,UAAU;QAChB,QAAQ;QACR,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,CAAC;QACV,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,aAAqB,EAAE,IAAY,EAAE,QAAgB,EAAE,eAAuB;IACnH,OAAO;QACL,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;QACvB,aAAa;QACb,IAAI;QACJ,IAAI,EAAE,WAAW;QACjB,QAAQ;QACR,MAAM,EAAE,QAAQ;QAChB,eAAe;QACf,OAAO,EAAE,CAAC;QACV,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC"}

View File

@@ -25,7 +25,8 @@ class AccountStore {
update(id: string, updates: Partial<Account>): void {
const account = this.accounts.get(id);
if (account) {
this.accounts.set(id, { ...account, ...updates, updatedAt: new Date() });
const updated = { ...account, ...updates, updatedAt: new Date() } as Account;
this.accounts.set(id, updated);
}
}

5
packages/treasury/src/index.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
export * from './accounts';
export * from './posting';
export * from './transfers';
export * from './reporting';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}

View File

@@ -0,0 +1,5 @@
export * from './accounts';
export * from './posting';
export * from './transfers';
export * from './reporting';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}

13
packages/treasury/src/posting.d.ts vendored Normal file
View File

@@ -0,0 +1,13 @@
import type { Account, AccountPosting, PostingType, Transaction } from '@brazil-swift-ops/types';
declare class PostingStore {
private postings;
add(posting: AccountPosting): void;
getByAccount(accountId: string): AccountPosting[];
getByTransaction(transactionId: string): AccountPosting[];
getAll(): AccountPosting[];
}
export declare function getPostingStore(): PostingStore;
export declare function postToAccount(account: Account, transaction: Transaction, postingType: PostingType, amount?: number): AccountPosting;
export declare function allocateTransactionToSubledger(transaction: Transaction, subledgerId: string): AccountPosting[];
export {};
//# sourceMappingURL=posting.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"posting.d.ts","sourceRoot":"","sources":["posting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAIjG,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAwB;IAExC,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIlC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAIjD,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,EAAE;IAIzD,MAAM,IAAI,cAAc,EAAE;CAG3B;AAID,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CAmCnI;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAoB9G"}

View File

@@ -0,0 +1,75 @@
import { getDefaultConverter } from '@brazil-swift-ops/utils';
import { getAccountStore } from './accounts';
class PostingStore {
postings = [];
add(posting) {
this.postings.push(posting);
}
getByAccount(accountId) {
return this.postings.filter((p) => p.accountId === accountId);
}
getByTransaction(transactionId) {
return this.postings.filter((p) => p.transactionId === transactionId);
}
getAll() {
return [...this.postings];
}
}
const postingStore = new PostingStore();
export function getPostingStore() {
return postingStore;
}
export function postToAccount(account, transaction, postingType, amount) {
const accountStore = getAccountStore();
const converter = getDefaultConverter();
const transactionAmount = amount ?? transaction.amount;
let postingAmount = transactionAmount;
let fxRate;
if (transaction.currency !== account.currency) {
const rate = converter.getRate(transaction.currency, account.currency);
if (rate !== null) {
fxRate = rate;
postingAmount = converter.convert(transactionAmount, transaction.currency, account.currency);
}
}
const balanceBefore = account.balance;
const balanceAfter = postingType === 'debit' ? balanceBefore - postingAmount : balanceBefore + postingAmount;
const posting = {
id: `POST-${Date.now()}`,
accountId: account.id,
transactionId: transaction.id,
postingType,
amount: postingAmount,
currency: account.currency,
fxRate,
balanceBefore,
balanceAfter,
postedAt: new Date(),
description: `Transaction ${transaction.id} - ${postingType}`,
};
accountStore.update(account.id, { balance: balanceAfter, availableBalance: balanceAfter });
postingStore.add(posting);
return posting;
}
export function allocateTransactionToSubledger(transaction, subledgerId) {
const accountStore = getAccountStore();
const subledger = accountStore.get(subledgerId);
if (!subledger || subledger.type !== 'subledger') {
throw new Error(`Subledger account ${subledgerId} not found`);
}
const parent = accountStore.get(subledger.parentAccountId);
if (!parent) {
throw new Error(`Parent account ${subledger.parentAccountId} not found`);
}
const postings = [];
if (transaction.direction === 'inbound') {
postings.push(postToAccount(subledger, transaction, 'credit'));
postings.push(postToAccount(parent, transaction, 'credit'));
}
else {
postings.push(postToAccount(subledger, transaction, 'debit'));
postings.push(postToAccount(parent, transaction, 'debit'));
}
return postings;
}
//# sourceMappingURL=posting.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"posting.js","sourceRoot":"","sources":["posting.ts"],"names":[],"mappings":"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"}

View File

@@ -36,8 +36,9 @@ export function postToAccount(account: Account, transaction: Transaction, postin
let fxRate: number | undefined;
if (transaction.currency !== account.currency) {
fxRate = converter.getRate(transaction.currency, account.currency);
if (fxRate) {
const rate = converter.getRate(transaction.currency, account.currency);
if (rate !== null) {
fxRate = rate;
postingAmount = converter.convert(transactionAmount, transaction.currency, account.currency);
}
}

3
packages/treasury/src/reporting.d.ts vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { SubledgerReport } from '@brazil-swift-ops/types';
export declare function generateSubledgerReport(subledgerId: string, periodStart: Date, periodEnd: Date): SubledgerReport;
//# sourceMappingURL=reporting.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reporting.d.ts","sourceRoot":"","sources":["reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AAIjC,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,IAAI,EACjB,SAAS,EAAE,IAAI,GACd,eAAe,CA2CjB"}

View File

@@ -0,0 +1,38 @@
import { getPostingStore } from './posting';
import { getAccountStore } from './accounts';
export function generateSubledgerReport(subledgerId, periodStart, periodEnd) {
const accountStore = getAccountStore();
const postingStore = getPostingStore();
const subledger = accountStore.get(subledgerId);
if (!subledger || subledger.type !== 'subledger') {
throw new Error(`Subledger account ${subledgerId} not found`);
}
const postings = postingStore
.getByAccount(subledgerId)
.filter((p) => p.postedAt >= periodStart && p.postedAt <= periodEnd);
const openingBalance = subledger.balance - postings.reduce((sum, p) => {
return p.postingType === 'debit' ? sum - p.amount : sum + p.amount;
}, 0);
const totalDebits = postings
.filter((p) => p.postingType === 'debit')
.reduce((sum, p) => sum + p.amount, 0);
const totalCredits = postings
.filter((p) => p.postingType === 'credit')
.reduce((sum, p) => sum + p.amount, 0);
const closingBalance = openingBalance + totalCredits - totalDebits;
const netPosition = totalCredits - totalDebits;
return {
subledgerId,
periodStart,
periodEnd,
openingBalance,
closingBalance,
totalDebits,
totalCredits,
netPosition,
currency: subledger.currency,
transactionCount: new Set(postings.map((p) => p.transactionId)).size,
postings,
};
}
//# sourceMappingURL=reporting.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"reporting.js","sourceRoot":"","sources":["reporting.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,WAAiB,EACjB,SAAe;IAEf,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,qBAAqB,WAAW,YAAY,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY;SAC1B,YAAY,CAAC,WAAW,CAAC;SACzB,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,IAAI,CAAC,CAAC,QAAQ,IAAI,SAAS,CAC5D,CAAC;IAEJ,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACpE,OAAO,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,MAAM,WAAW,GAAG,QAAQ;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC;SACxC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,MAAM,YAAY,GAAG,QAAQ;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC;SACzC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC;IACnE,MAAM,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAE/C,OAAO;QACL,WAAW;QACX,WAAW;QACX,SAAS;QACT,cAAc;QACd,cAAc;QACd,WAAW;QACX,YAAY;QACZ,WAAW;QACX,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,gBAAgB,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;QACpE,QAAQ;KACT,CAAC;AACJ,CAAC"}

12
packages/treasury/src/transfers.d.ts vendored Normal file
View File

@@ -0,0 +1,12 @@
import type { SubledgerTransfer } from '@brazil-swift-ops/types';
declare class TransferStore {
private transfers;
add(transfer: SubledgerTransfer): void;
get(id: string): SubledgerTransfer | undefined;
getByAccount(accountId: string): SubledgerTransfer[];
getAll(): SubledgerTransfer[];
}
export declare function getTransferStore(): TransferStore;
export declare function executeSubledgerTransfer(fromAccountId: string, toAccountId: string, amount: number, currency: string, description?: string): SubledgerTransfer;
export {};
//# sourceMappingURL=transfers.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"transfers.d.ts","sourceRoot":"","sources":["transfers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,yBAAyB,CAAC;AAIjC,cAAM,aAAa;IACjB,OAAO,CAAC,SAAS,CAA2B;IAE5C,GAAG,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAItC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI9C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAMpD,MAAM,IAAI,iBAAiB,EAAE;CAG9B;AAID,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,iBAAiB,CAyDnB"}

View File

@@ -0,0 +1,70 @@
import { getAccountStore } from './accounts';
class TransferStore {
transfers = [];
add(transfer) {
this.transfers.push(transfer);
}
get(id) {
return this.transfers.find((t) => t.id === id);
}
getByAccount(accountId) {
return this.transfers.filter((t) => t.fromAccountId === accountId || t.toAccountId === accountId);
}
getAll() {
return [...this.transfers];
}
}
const transferStore = new TransferStore();
export function getTransferStore() {
return transferStore;
}
export function executeSubledgerTransfer(fromAccountId, toAccountId, amount, currency, description) {
const accountStore = getAccountStore();
const fromAccount = accountStore.get(fromAccountId);
const toAccount = accountStore.get(toAccountId);
if (!fromAccount) {
throw new Error(`Source account ${fromAccountId} not found`);
}
if (!toAccount) {
throw new Error(`Destination account ${toAccountId} not found`);
}
if (fromAccount.currency !== currency || toAccount.currency !== currency) {
throw new Error('Currency mismatch in transfer');
}
if (fromAccount.balance < amount) {
throw new Error('Insufficient balance in source account');
}
const transfer = {
id: `TRF-${Date.now()}`,
fromAccountId,
toAccountId,
amount,
currency,
description,
executedAt: new Date(),
status: 'pending',
};
// Execute transfer
try {
// Debit from source
const fromBalanceBefore = fromAccount.balance;
accountStore.update(fromAccountId, {
balance: fromBalanceBefore - amount,
availableBalance: fromBalanceBefore - amount,
});
// Credit to destination
const toBalanceBefore = toAccount.balance;
accountStore.update(toAccountId, {
balance: toBalanceBefore + amount,
availableBalance: toBalanceBefore + amount,
});
transfer.status = 'completed';
}
catch (error) {
transfer.status = 'failed';
throw error;
}
transferStore.add(transfer);
return transfer;
}
//# sourceMappingURL=transfers.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"transfers.js","sourceRoot":"","sources":["transfers.ts"],"names":[],"mappings":"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"}

Some files were not shown because too many files have changed in this diff Show More