From aedf572b99e390f82463e5f0a302afa8680cbdf6 Mon Sep 17 00:00:00 2001 From: defiQUG Date: Fri, 23 Jan 2026 14:53:05 -0800 Subject: [PATCH] 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 --- apps/web/src/App.d.ts | 3 + apps/web/src/App.d.ts.map | 1 + apps/web/src/App.js | 11 ++ apps/web/src/App.js.map | 1 + apps/web/src/main.d.ts | 2 + apps/web/src/main.d.ts.map | 1 + apps/web/src/main.js | 7 + apps/web/src/main.js.map | 1 + apps/web/src/pages/DashboardPage.d.ts | 2 + apps/web/src/pages/DashboardPage.d.ts.map | 1 + apps/web/src/pages/DashboardPage.js | 5 + apps/web/src/pages/DashboardPage.js.map | 1 + apps/web/src/pages/ReportsPage.d.ts | 2 + apps/web/src/pages/ReportsPage.d.ts.map | 1 + apps/web/src/pages/ReportsPage.js | 5 + apps/web/src/pages/ReportsPage.js.map | 1 + apps/web/src/pages/TransactionsPage.d.ts | 2 + apps/web/src/pages/TransactionsPage.d.ts.map | 1 + apps/web/src/pages/TransactionsPage.js | 5 + apps/web/src/pages/TransactionsPage.js.map | 1 + apps/web/src/pages/TreasuryPage.d.ts | 2 + apps/web/src/pages/TreasuryPage.d.ts.map | 1 + apps/web/src/pages/TreasuryPage.js | 5 + apps/web/src/pages/TreasuryPage.js.map | 1 + apps/web/src/stores/transactionStore.d.ts | 10 ++ apps/web/src/stores/transactionStore.d.ts.map | 1 + apps/web/src/stores/transactionStore.js | 21 +++ apps/web/src/stores/transactionStore.js.map | 1 + packages/audit/src/index.d.ts | 5 + packages/audit/src/index.d.ts.map | 1 + packages/audit/src/index.js | 5 + packages/audit/src/index.js.map | 1 + packages/audit/src/logger.d.ts | 13 ++ packages/audit/src/logger.d.ts.map | 1 + packages/audit/src/logger.js | 47 ++++++ packages/audit/src/logger.js.map | 1 + packages/audit/src/logger.ts | 64 ++++++++ packages/audit/src/reports.d.ts | 4 + packages/audit/src/reports.d.ts.map | 1 + packages/audit/src/reports.js | 95 +++++++++++ packages/audit/src/reports.js.map | 1 + packages/audit/src/reports.ts | 116 +++++++++++++ packages/audit/src/retention.d.ts | 15 ++ packages/audit/src/retention.d.ts.map | 1 + packages/audit/src/retention.js | 49 ++++++ packages/audit/src/retention.js.map | 1 + packages/audit/src/versions.d.ts | 13 ++ packages/audit/src/versions.d.ts.map | 1 + packages/audit/src/versions.js | 40 +++++ packages/audit/src/versions.js.map | 1 + packages/iso20022/src/exporter.d.ts | 5 + packages/iso20022/src/exporter.d.ts.map | 1 + packages/iso20022/src/exporter.js | 28 ++++ packages/iso20022/src/exporter.js.map | 1 + packages/iso20022/src/index.d.ts | 6 + packages/iso20022/src/index.d.ts.map | 1 + packages/iso20022/src/index.js | 6 + packages/iso20022/src/index.js.map | 1 + packages/iso20022/src/mt-mapper.d.ts | 21 +++ packages/iso20022/src/mt-mapper.d.ts.map | 1 + packages/iso20022/src/mt-mapper.js | 73 +++++++++ packages/iso20022/src/mt-mapper.js.map | 1 + packages/risk-models/src/capital.d.ts | 9 ++ packages/risk-models/src/capital.d.ts.map | 1 + packages/risk-models/src/capital.js | 33 ++++ packages/risk-models/src/capital.js.map | 1 + packages/risk-models/src/escalation.d.ts | 6 + packages/risk-models/src/escalation.d.ts.map | 1 + packages/risk-models/src/escalation.js | 39 +++++ packages/risk-models/src/escalation.js.map | 1 + packages/risk-models/src/index.d.ts | 6 + packages/risk-models/src/index.d.ts.map | 1 + packages/risk-models/src/index.js | 6 + packages/risk-models/src/index.js.map | 1 + packages/risk-models/src/lcr.d.ts | 9 ++ packages/risk-models/src/lcr.d.ts.map | 1 + packages/risk-models/src/lcr.js | 35 ++++ packages/risk-models/src/lcr.js.map | 1 + packages/risk-models/src/reserves.d.ts | 8 + packages/risk-models/src/reserves.d.ts.map | 1 + packages/risk-models/src/reserves.js | 27 ++++ packages/risk-models/src/reserves.js.map | 1 + packages/risk-models/src/risk-weights.d.ts | 4 + .../risk-models/src/risk-weights.d.ts.map | 1 + packages/risk-models/src/risk-weights.js | 32 ++++ packages/risk-models/src/risk-weights.js.map | 1 + packages/rules-engine/src/aml.d.ts | 42 +++++ packages/rules-engine/src/aml.d.ts.map | 1 + packages/rules-engine/src/aml.js | 152 ++++++++++++++++++ packages/rules-engine/src/aml.js.map | 1 + packages/rules-engine/src/fx-contract.d.ts | 13 ++ .../rules-engine/src/fx-contract.d.ts.map | 1 + packages/rules-engine/src/fx-contract.js | 127 +++++++++++++++ packages/rules-engine/src/fx-contract.js.map | 1 + packages/rules-engine/src/index.d.ts | 13 ++ packages/rules-engine/src/index.d.ts.map | 1 + packages/rules-engine/src/index.js | 13 ++ packages/rules-engine/src/index.js.map | 1 + packages/rules-engine/src/iof.d.ts | 4 + packages/rules-engine/src/iof.d.ts.map | 1 + packages/rules-engine/src/iof.js | 55 +++++++ packages/rules-engine/src/iof.js.map | 1 + packages/rules-engine/src/orchestrator.d.ts | 13 ++ .../rules-engine/src/orchestrator.d.ts.map | 1 + packages/rules-engine/src/orchestrator.js | 68 ++++++++ packages/rules-engine/src/orchestrator.js.map | 1 + packages/treasury/src/accounts.d.ts | 15 ++ packages/treasury/src/accounts.d.ts.map | 1 + packages/treasury/src/accounts.js | 59 +++++++ packages/treasury/src/accounts.js.map | 1 + packages/treasury/src/accounts.ts | 3 +- packages/treasury/src/index.d.ts | 5 + packages/treasury/src/index.d.ts.map | 1 + packages/treasury/src/index.js | 5 + packages/treasury/src/index.js.map | 1 + packages/treasury/src/posting.d.ts | 13 ++ packages/treasury/src/posting.d.ts.map | 1 + packages/treasury/src/posting.js | 75 +++++++++ packages/treasury/src/posting.js.map | 1 + packages/treasury/src/posting.ts | 5 +- packages/treasury/src/reporting.d.ts | 3 + packages/treasury/src/reporting.d.ts.map | 1 + packages/treasury/src/reporting.js | 38 +++++ packages/treasury/src/reporting.js.map | 1 + packages/treasury/src/transfers.d.ts | 12 ++ packages/treasury/src/transfers.d.ts.map | 1 + packages/treasury/src/transfers.js | 70 ++++++++ packages/treasury/src/transfers.js.map | 1 + packages/types/src/audit.d.ts | 83 ++++++++++ packages/types/src/audit.d.ts.map | 1 + packages/types/src/audit.js | 5 + packages/types/src/audit.js.map | 1 + packages/types/src/eo-uplift.d.ts | 22 +++ packages/types/src/eo-uplift.d.ts.map | 1 + packages/types/src/eo-uplift.js | 5 + packages/types/src/eo-uplift.js.map | 1 + packages/types/src/fx-contract.d.ts | 31 ++++ packages/types/src/fx-contract.d.ts.map | 1 + packages/types/src/fx-contract.js | 5 + packages/types/src/fx-contract.js.map | 1 + packages/types/src/index.d.ts | 14 ++ packages/types/src/index.d.ts.map | 1 + packages/types/src/index.js | 14 ++ packages/types/src/index.js.map | 1 + packages/types/src/iso20022.d.ts | 111 +++++++++++++ packages/types/src/iso20022.d.ts.map | 1 + packages/types/src/iso20022.js | 5 + packages/types/src/iso20022.js.map | 1 + packages/types/src/regulatory.d.ts | 95 +++++++++++ packages/types/src/regulatory.d.ts.map | 1 + packages/types/src/regulatory.js | 5 + packages/types/src/regulatory.js.map | 1 + packages/types/src/regulatory.ts | 1 - packages/types/src/risk.d.ts | 79 +++++++++ packages/types/src/risk.d.ts.map | 1 + packages/types/src/risk.js | 5 + packages/types/src/risk.js.map | 1 + packages/types/src/transaction.d.ts | 45 ++++++ packages/types/src/transaction.d.ts.map | 1 + packages/types/src/transaction.js | 5 + packages/types/src/transaction.js.map | 1 + packages/types/src/treasury.d.ts | 86 ++++++++++ packages/types/src/treasury.d.ts.map | 1 + packages/types/src/treasury.js | 5 + packages/types/src/treasury.js.map | 1 + packages/utils/src/currency.d.ts | 33 ++++ packages/utils/src/currency.d.ts.map | 1 + packages/utils/src/currency.js | 98 +++++++++++ packages/utils/src/currency.js.map | 1 + packages/utils/src/dates.d.ts | 18 +++ packages/utils/src/dates.d.ts.map | 1 + packages/utils/src/dates.js | 48 ++++++ packages/utils/src/dates.js.map | 1 + packages/utils/src/eo-uplift.d.ts | 31 ++++ packages/utils/src/eo-uplift.d.ts.map | 1 + packages/utils/src/eo-uplift.js | 98 +++++++++++ packages/utils/src/eo-uplift.js.map | 1 + packages/utils/src/index.d.ts | 10 ++ packages/utils/src/index.d.ts.map | 1 + packages/utils/src/index.js | 10 ++ packages/utils/src/index.js.map | 1 + packages/utils/src/validation.d.ts | 35 ++++ packages/utils/src/validation.d.ts.map | 1 + packages/utils/src/validation.js | 133 +++++++++++++++ packages/utils/src/validation.js.map | 1 + 185 files changed, 2925 insertions(+), 4 deletions(-) create mode 100644 apps/web/src/App.d.ts create mode 100644 apps/web/src/App.d.ts.map create mode 100644 apps/web/src/App.js create mode 100644 apps/web/src/App.js.map create mode 100644 apps/web/src/main.d.ts create mode 100644 apps/web/src/main.d.ts.map create mode 100644 apps/web/src/main.js create mode 100644 apps/web/src/main.js.map create mode 100644 apps/web/src/pages/DashboardPage.d.ts create mode 100644 apps/web/src/pages/DashboardPage.d.ts.map create mode 100644 apps/web/src/pages/DashboardPage.js create mode 100644 apps/web/src/pages/DashboardPage.js.map create mode 100644 apps/web/src/pages/ReportsPage.d.ts create mode 100644 apps/web/src/pages/ReportsPage.d.ts.map create mode 100644 apps/web/src/pages/ReportsPage.js create mode 100644 apps/web/src/pages/ReportsPage.js.map create mode 100644 apps/web/src/pages/TransactionsPage.d.ts create mode 100644 apps/web/src/pages/TransactionsPage.d.ts.map create mode 100644 apps/web/src/pages/TransactionsPage.js create mode 100644 apps/web/src/pages/TransactionsPage.js.map create mode 100644 apps/web/src/pages/TreasuryPage.d.ts create mode 100644 apps/web/src/pages/TreasuryPage.d.ts.map create mode 100644 apps/web/src/pages/TreasuryPage.js create mode 100644 apps/web/src/pages/TreasuryPage.js.map create mode 100644 apps/web/src/stores/transactionStore.d.ts create mode 100644 apps/web/src/stores/transactionStore.d.ts.map create mode 100644 apps/web/src/stores/transactionStore.js create mode 100644 apps/web/src/stores/transactionStore.js.map create mode 100644 packages/audit/src/index.d.ts create mode 100644 packages/audit/src/index.d.ts.map create mode 100644 packages/audit/src/index.js create mode 100644 packages/audit/src/index.js.map create mode 100644 packages/audit/src/logger.d.ts create mode 100644 packages/audit/src/logger.d.ts.map create mode 100644 packages/audit/src/logger.js create mode 100644 packages/audit/src/logger.js.map create mode 100644 packages/audit/src/logger.ts create mode 100644 packages/audit/src/reports.d.ts create mode 100644 packages/audit/src/reports.d.ts.map create mode 100644 packages/audit/src/reports.js create mode 100644 packages/audit/src/reports.js.map create mode 100644 packages/audit/src/reports.ts create mode 100644 packages/audit/src/retention.d.ts create mode 100644 packages/audit/src/retention.d.ts.map create mode 100644 packages/audit/src/retention.js create mode 100644 packages/audit/src/retention.js.map create mode 100644 packages/audit/src/versions.d.ts create mode 100644 packages/audit/src/versions.d.ts.map create mode 100644 packages/audit/src/versions.js create mode 100644 packages/audit/src/versions.js.map create mode 100644 packages/iso20022/src/exporter.d.ts create mode 100644 packages/iso20022/src/exporter.d.ts.map create mode 100644 packages/iso20022/src/exporter.js create mode 100644 packages/iso20022/src/exporter.js.map create mode 100644 packages/iso20022/src/index.d.ts create mode 100644 packages/iso20022/src/index.d.ts.map create mode 100644 packages/iso20022/src/index.js create mode 100644 packages/iso20022/src/index.js.map create mode 100644 packages/iso20022/src/mt-mapper.d.ts create mode 100644 packages/iso20022/src/mt-mapper.d.ts.map create mode 100644 packages/iso20022/src/mt-mapper.js create mode 100644 packages/iso20022/src/mt-mapper.js.map create mode 100644 packages/risk-models/src/capital.d.ts create mode 100644 packages/risk-models/src/capital.d.ts.map create mode 100644 packages/risk-models/src/capital.js create mode 100644 packages/risk-models/src/capital.js.map create mode 100644 packages/risk-models/src/escalation.d.ts create mode 100644 packages/risk-models/src/escalation.d.ts.map create mode 100644 packages/risk-models/src/escalation.js create mode 100644 packages/risk-models/src/escalation.js.map create mode 100644 packages/risk-models/src/index.d.ts create mode 100644 packages/risk-models/src/index.d.ts.map create mode 100644 packages/risk-models/src/index.js create mode 100644 packages/risk-models/src/index.js.map create mode 100644 packages/risk-models/src/lcr.d.ts create mode 100644 packages/risk-models/src/lcr.d.ts.map create mode 100644 packages/risk-models/src/lcr.js create mode 100644 packages/risk-models/src/lcr.js.map create mode 100644 packages/risk-models/src/reserves.d.ts create mode 100644 packages/risk-models/src/reserves.d.ts.map create mode 100644 packages/risk-models/src/reserves.js create mode 100644 packages/risk-models/src/reserves.js.map create mode 100644 packages/risk-models/src/risk-weights.d.ts create mode 100644 packages/risk-models/src/risk-weights.d.ts.map create mode 100644 packages/risk-models/src/risk-weights.js create mode 100644 packages/risk-models/src/risk-weights.js.map create mode 100644 packages/rules-engine/src/aml.d.ts create mode 100644 packages/rules-engine/src/aml.d.ts.map create mode 100644 packages/rules-engine/src/aml.js create mode 100644 packages/rules-engine/src/aml.js.map create mode 100644 packages/rules-engine/src/fx-contract.d.ts create mode 100644 packages/rules-engine/src/fx-contract.d.ts.map create mode 100644 packages/rules-engine/src/fx-contract.js create mode 100644 packages/rules-engine/src/fx-contract.js.map create mode 100644 packages/rules-engine/src/index.d.ts create mode 100644 packages/rules-engine/src/index.d.ts.map create mode 100644 packages/rules-engine/src/index.js create mode 100644 packages/rules-engine/src/index.js.map create mode 100644 packages/rules-engine/src/iof.d.ts create mode 100644 packages/rules-engine/src/iof.d.ts.map create mode 100644 packages/rules-engine/src/iof.js create mode 100644 packages/rules-engine/src/iof.js.map create mode 100644 packages/rules-engine/src/orchestrator.d.ts create mode 100644 packages/rules-engine/src/orchestrator.d.ts.map create mode 100644 packages/rules-engine/src/orchestrator.js create mode 100644 packages/rules-engine/src/orchestrator.js.map create mode 100644 packages/treasury/src/accounts.d.ts create mode 100644 packages/treasury/src/accounts.d.ts.map create mode 100644 packages/treasury/src/accounts.js create mode 100644 packages/treasury/src/accounts.js.map create mode 100644 packages/treasury/src/index.d.ts create mode 100644 packages/treasury/src/index.d.ts.map create mode 100644 packages/treasury/src/index.js create mode 100644 packages/treasury/src/index.js.map create mode 100644 packages/treasury/src/posting.d.ts create mode 100644 packages/treasury/src/posting.d.ts.map create mode 100644 packages/treasury/src/posting.js create mode 100644 packages/treasury/src/posting.js.map create mode 100644 packages/treasury/src/reporting.d.ts create mode 100644 packages/treasury/src/reporting.d.ts.map create mode 100644 packages/treasury/src/reporting.js create mode 100644 packages/treasury/src/reporting.js.map create mode 100644 packages/treasury/src/transfers.d.ts create mode 100644 packages/treasury/src/transfers.d.ts.map create mode 100644 packages/treasury/src/transfers.js create mode 100644 packages/treasury/src/transfers.js.map create mode 100644 packages/types/src/audit.d.ts create mode 100644 packages/types/src/audit.d.ts.map create mode 100644 packages/types/src/audit.js create mode 100644 packages/types/src/audit.js.map create mode 100644 packages/types/src/eo-uplift.d.ts create mode 100644 packages/types/src/eo-uplift.d.ts.map create mode 100644 packages/types/src/eo-uplift.js create mode 100644 packages/types/src/eo-uplift.js.map create mode 100644 packages/types/src/fx-contract.d.ts create mode 100644 packages/types/src/fx-contract.d.ts.map create mode 100644 packages/types/src/fx-contract.js create mode 100644 packages/types/src/fx-contract.js.map create mode 100644 packages/types/src/index.d.ts create mode 100644 packages/types/src/index.d.ts.map create mode 100644 packages/types/src/index.js create mode 100644 packages/types/src/index.js.map create mode 100644 packages/types/src/iso20022.d.ts create mode 100644 packages/types/src/iso20022.d.ts.map create mode 100644 packages/types/src/iso20022.js create mode 100644 packages/types/src/iso20022.js.map create mode 100644 packages/types/src/regulatory.d.ts create mode 100644 packages/types/src/regulatory.d.ts.map create mode 100644 packages/types/src/regulatory.js create mode 100644 packages/types/src/regulatory.js.map create mode 100644 packages/types/src/risk.d.ts create mode 100644 packages/types/src/risk.d.ts.map create mode 100644 packages/types/src/risk.js create mode 100644 packages/types/src/risk.js.map create mode 100644 packages/types/src/transaction.d.ts create mode 100644 packages/types/src/transaction.d.ts.map create mode 100644 packages/types/src/transaction.js create mode 100644 packages/types/src/transaction.js.map create mode 100644 packages/types/src/treasury.d.ts create mode 100644 packages/types/src/treasury.d.ts.map create mode 100644 packages/types/src/treasury.js create mode 100644 packages/types/src/treasury.js.map create mode 100644 packages/utils/src/currency.d.ts create mode 100644 packages/utils/src/currency.d.ts.map create mode 100644 packages/utils/src/currency.js create mode 100644 packages/utils/src/currency.js.map create mode 100644 packages/utils/src/dates.d.ts create mode 100644 packages/utils/src/dates.d.ts.map create mode 100644 packages/utils/src/dates.js create mode 100644 packages/utils/src/dates.js.map create mode 100644 packages/utils/src/eo-uplift.d.ts create mode 100644 packages/utils/src/eo-uplift.d.ts.map create mode 100644 packages/utils/src/eo-uplift.js create mode 100644 packages/utils/src/eo-uplift.js.map create mode 100644 packages/utils/src/index.d.ts create mode 100644 packages/utils/src/index.d.ts.map create mode 100644 packages/utils/src/index.js create mode 100644 packages/utils/src/index.js.map create mode 100644 packages/utils/src/validation.d.ts create mode 100644 packages/utils/src/validation.d.ts.map create mode 100644 packages/utils/src/validation.js create mode 100644 packages/utils/src/validation.js.map diff --git a/apps/web/src/App.d.ts b/apps/web/src/App.d.ts new file mode 100644 index 0000000..848bdd0 --- /dev/null +++ b/apps/web/src/App.d.ts @@ -0,0 +1,3 @@ +declare function App(): import("react/jsx-runtime").JSX.Element; +export default App; +//# sourceMappingURL=App.d.ts.map \ No newline at end of file diff --git a/apps/web/src/App.d.ts.map b/apps/web/src/App.d.ts.map new file mode 100644 index 0000000..3d0f649 --- /dev/null +++ b/apps/web/src/App.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["App.tsx"],"names":[],"mappings":"AAMA,iBAAS,GAAG,4CAuDX;AAED,eAAe,GAAG,CAAC"} \ No newline at end of file diff --git a/apps/web/src/App.js b/apps/web/src/App.js new file mode 100644 index 0000000..9026f13 --- /dev/null +++ b/apps/web/src/App.js @@ -0,0 +1,11 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import { BrowserRouter, Routes, Route, Link } from 'react-router-dom'; +import DashboardPage from './pages/DashboardPage'; +import TransactionsPage from './pages/TransactionsPage'; +import TreasuryPage from './pages/TreasuryPage'; +import ReportsPage from './pages/ReportsPage'; +function App() { + return (_jsx(BrowserRouter, { children: _jsxs("div", { className: "min-h-screen bg-gray-50", children: [_jsx("nav", { className: "bg-white shadow-sm border-b", children: _jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: _jsx("div", { className: "flex justify-between h-16", children: _jsxs("div", { className: "flex", children: [_jsx("div", { className: "flex-shrink-0 flex items-center", children: _jsx("h1", { className: "text-xl font-bold text-gray-900", children: "Brazil SWIFT Operations" }) }), _jsxs("div", { className: "hidden sm:ml-6 sm:flex sm:space-x-8", children: [_jsx(Link, { to: "/", className: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium", children: "Dashboard" }), _jsx(Link, { to: "/transactions", className: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium", children: "Transactions" }), _jsx(Link, { to: "/treasury", className: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium", children: "Treasury" }), _jsx(Link, { to: "/reports", className: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium", children: "Reports" })] })] }) }) }) }), _jsx("main", { className: "max-w-7xl mx-auto py-6 sm:px-6 lg:px-8", children: _jsxs(Routes, { children: [_jsx(Route, { path: "/", element: _jsx(DashboardPage, {}) }), _jsx(Route, { path: "/transactions", element: _jsx(TransactionsPage, {}) }), _jsx(Route, { path: "/treasury", element: _jsx(TreasuryPage, {}) }), _jsx(Route, { path: "/reports", element: _jsx(ReportsPage, {}) })] }) })] }) })); +} +export default App; +//# sourceMappingURL=App.js.map \ No newline at end of file diff --git a/apps/web/src/App.js.map b/apps/web/src/App.js.map new file mode 100644 index 0000000..2beca59 --- /dev/null +++ b/apps/web/src/App.js.map @@ -0,0 +1 @@ +{"version":3,"file":"App.js","sourceRoot":"","sources":["App.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,gBAAgB,MAAM,0BAA0B,CAAC;AACxD,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAChD,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAE9C,SAAS,GAAG;IACV,OAAO,CACL,KAAC,aAAa,cACZ,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,6BAA6B,YAC1C,cAAK,SAAS,EAAC,wCAAwC,YACrD,cAAK,SAAS,EAAC,2BAA2B,YACxC,eAAK,SAAS,EAAC,MAAM,aACnB,cAAK,SAAS,EAAC,iCAAiC,YAC9C,aAAI,SAAS,EAAC,iCAAiC,wCAE1C,GACD,EACN,eAAK,SAAS,EAAC,qCAAqC,aAClD,KAAC,IAAI,IACH,EAAE,EAAC,GAAG,EACN,SAAS,EAAC,8IAA8I,0BAGnJ,EACP,KAAC,IAAI,IACH,EAAE,EAAC,eAAe,EAClB,SAAS,EAAC,8IAA8I,6BAGnJ,EACP,KAAC,IAAI,IACH,EAAE,EAAC,WAAW,EACd,SAAS,EAAC,8IAA8I,yBAGnJ,EACP,KAAC,IAAI,IACH,EAAE,EAAC,UAAU,EACb,SAAS,EAAC,8IAA8I,wBAGnJ,IACH,IACF,GACF,GACF,GACF,EAEN,eAAM,SAAS,EAAC,wCAAwC,YACtD,MAAC,MAAM,eACL,KAAC,KAAK,IAAC,IAAI,EAAC,GAAG,EAAC,OAAO,EAAE,KAAC,aAAa,KAAG,GAAI,EAC9C,KAAC,KAAK,IAAC,IAAI,EAAC,eAAe,EAAC,OAAO,EAAE,KAAC,gBAAgB,KAAG,GAAI,EAC7D,KAAC,KAAK,IAAC,IAAI,EAAC,WAAW,EAAC,OAAO,EAAE,KAAC,YAAY,KAAG,GAAI,EACrD,KAAC,KAAK,IAAC,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,KAAC,WAAW,KAAG,GAAI,IAC5C,GACJ,IACH,GACQ,CACjB,CAAC;AACJ,CAAC;AAED,eAAe,GAAG,CAAC"} \ No newline at end of file diff --git a/apps/web/src/main.d.ts b/apps/web/src/main.d.ts new file mode 100644 index 0000000..c5184af --- /dev/null +++ b/apps/web/src/main.d.ts @@ -0,0 +1,2 @@ +import './index.css'; +//# sourceMappingURL=main.d.ts.map \ No newline at end of file diff --git a/apps/web/src/main.d.ts.map b/apps/web/src/main.d.ts.map new file mode 100644 index 0000000..15c19ee --- /dev/null +++ b/apps/web/src/main.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["main.tsx"],"names":[],"mappings":"AAGA,OAAO,aAAa,CAAC"} \ No newline at end of file diff --git a/apps/web/src/main.js b/apps/web/src/main.js new file mode 100644 index 0000000..fd257c5 --- /dev/null +++ b/apps/web/src/main.js @@ -0,0 +1,7 @@ +import { jsx as _jsx } from "react/jsx-runtime"; +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './index.css'; +ReactDOM.createRoot(document.getElementById('root')).render(_jsx(React.StrictMode, { children: _jsx(App, {}) })); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/apps/web/src/main.js.map b/apps/web/src/main.js.map new file mode 100644 index 0000000..0356b3b --- /dev/null +++ b/apps/web/src/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["main.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AACxC,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,aAAa,CAAC;AAErB,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAE,CAAC,CAAC,MAAM,CAC1D,KAAC,KAAK,CAAC,UAAU,cACf,KAAC,GAAG,KAAG,GACU,CACpB,CAAC"} \ No newline at end of file diff --git a/apps/web/src/pages/DashboardPage.d.ts b/apps/web/src/pages/DashboardPage.d.ts new file mode 100644 index 0000000..070ef0b --- /dev/null +++ b/apps/web/src/pages/DashboardPage.d.ts @@ -0,0 +1,2 @@ +export default function DashboardPage(): import("react/jsx-runtime").JSX.Element; +//# sourceMappingURL=DashboardPage.d.ts.map \ No newline at end of file diff --git a/apps/web/src/pages/DashboardPage.d.ts.map b/apps/web/src/pages/DashboardPage.d.ts.map new file mode 100644 index 0000000..b63bc2d --- /dev/null +++ b/apps/web/src/pages/DashboardPage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["DashboardPage.tsx"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,aAAa,4CASpC"} \ No newline at end of file diff --git a/apps/web/src/pages/DashboardPage.js b/apps/web/src/pages/DashboardPage.js new file mode 100644 index 0000000..6039757 --- /dev/null +++ b/apps/web/src/pages/DashboardPage.js @@ -0,0 +1,5 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +export default function DashboardPage() { + return (_jsx("div", { className: "px-4 py-6 sm:px-0", children: _jsxs("div", { className: "border-4 border-dashed border-gray-200 rounded-lg h-96 p-8", children: [_jsx("h1", { className: "text-2xl font-bold mb-4", children: "Dashboard" }), _jsx("p", { className: "text-gray-600", children: "Brazil SWIFT Operations Platform" })] }) })); +} +//# sourceMappingURL=DashboardPage.js.map \ No newline at end of file diff --git a/apps/web/src/pages/DashboardPage.js.map b/apps/web/src/pages/DashboardPage.js.map new file mode 100644 index 0000000..b1bccf6 --- /dev/null +++ b/apps/web/src/pages/DashboardPage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DashboardPage.js","sourceRoot":"","sources":["DashboardPage.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,aAAa;IACnC,OAAO,CACL,cAAK,SAAS,EAAC,mBAAmB,YAChC,eAAK,SAAS,EAAC,4DAA4D,aACzE,aAAI,SAAS,EAAC,yBAAyB,0BAAe,EACtD,YAAG,SAAS,EAAC,eAAe,iDAAqC,IAC7D,GACF,CACP,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/apps/web/src/pages/ReportsPage.d.ts b/apps/web/src/pages/ReportsPage.d.ts new file mode 100644 index 0000000..7168761 --- /dev/null +++ b/apps/web/src/pages/ReportsPage.d.ts @@ -0,0 +1,2 @@ +export default function ReportsPage(): import("react/jsx-runtime").JSX.Element; +//# sourceMappingURL=ReportsPage.d.ts.map \ No newline at end of file diff --git a/apps/web/src/pages/ReportsPage.d.ts.map b/apps/web/src/pages/ReportsPage.d.ts.map new file mode 100644 index 0000000..4e2dc97 --- /dev/null +++ b/apps/web/src/pages/ReportsPage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportsPage.d.ts","sourceRoot":"","sources":["ReportsPage.tsx"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,WAAW,4CAOlC"} \ No newline at end of file diff --git a/apps/web/src/pages/ReportsPage.js b/apps/web/src/pages/ReportsPage.js new file mode 100644 index 0000000..30837d6 --- /dev/null +++ b/apps/web/src/pages/ReportsPage.js @@ -0,0 +1,5 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +export default function ReportsPage() { + return (_jsxs("div", { className: "px-4 py-6 sm:px-0", children: [_jsx("h1", { className: "text-2xl font-bold mb-4", children: "ReportsPage" }), _jsx("p", { className: "text-gray-600", children: "ReportsPage interface" })] })); +} +//# sourceMappingURL=ReportsPage.js.map \ No newline at end of file diff --git a/apps/web/src/pages/ReportsPage.js.map b/apps/web/src/pages/ReportsPage.js.map new file mode 100644 index 0000000..cb2eabf --- /dev/null +++ b/apps/web/src/pages/ReportsPage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ReportsPage.js","sourceRoot":"","sources":["ReportsPage.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,aAChC,aAAI,SAAS,EAAC,yBAAyB,4BAAiB,EACxD,YAAG,SAAS,EAAC,eAAe,sCAA0B,IAClD,CACP,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/apps/web/src/pages/TransactionsPage.d.ts b/apps/web/src/pages/TransactionsPage.d.ts new file mode 100644 index 0000000..1010aff --- /dev/null +++ b/apps/web/src/pages/TransactionsPage.d.ts @@ -0,0 +1,2 @@ +export default function TransactionsPage(): import("react/jsx-runtime").JSX.Element; +//# sourceMappingURL=TransactionsPage.d.ts.map \ No newline at end of file diff --git a/apps/web/src/pages/TransactionsPage.d.ts.map b/apps/web/src/pages/TransactionsPage.d.ts.map new file mode 100644 index 0000000..055d9fb --- /dev/null +++ b/apps/web/src/pages/TransactionsPage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TransactionsPage.d.ts","sourceRoot":"","sources":["TransactionsPage.tsx"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,gBAAgB,4CAOvC"} \ No newline at end of file diff --git a/apps/web/src/pages/TransactionsPage.js b/apps/web/src/pages/TransactionsPage.js new file mode 100644 index 0000000..29356f6 --- /dev/null +++ b/apps/web/src/pages/TransactionsPage.js @@ -0,0 +1,5 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +export default function TransactionsPage() { + return (_jsxs("div", { className: "px-4 py-6 sm:px-0", children: [_jsx("h1", { className: "text-2xl font-bold mb-4", children: "TransactionsPage" }), _jsx("p", { className: "text-gray-600", children: "TransactionsPage interface" })] })); +} +//# sourceMappingURL=TransactionsPage.js.map \ No newline at end of file diff --git a/apps/web/src/pages/TransactionsPage.js.map b/apps/web/src/pages/TransactionsPage.js.map new file mode 100644 index 0000000..b734e7c --- /dev/null +++ b/apps/web/src/pages/TransactionsPage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TransactionsPage.js","sourceRoot":"","sources":["TransactionsPage.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,aAChC,aAAI,SAAS,EAAC,yBAAyB,iCAAsB,EAC7D,YAAG,SAAS,EAAC,eAAe,2CAA+B,IACvD,CACP,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/apps/web/src/pages/TreasuryPage.d.ts b/apps/web/src/pages/TreasuryPage.d.ts new file mode 100644 index 0000000..2436df7 --- /dev/null +++ b/apps/web/src/pages/TreasuryPage.d.ts @@ -0,0 +1,2 @@ +export default function TreasuryPage(): import("react/jsx-runtime").JSX.Element; +//# sourceMappingURL=TreasuryPage.d.ts.map \ No newline at end of file diff --git a/apps/web/src/pages/TreasuryPage.d.ts.map b/apps/web/src/pages/TreasuryPage.d.ts.map new file mode 100644 index 0000000..b835325 --- /dev/null +++ b/apps/web/src/pages/TreasuryPage.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TreasuryPage.d.ts","sourceRoot":"","sources":["TreasuryPage.tsx"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,YAAY,4CAOnC"} \ No newline at end of file diff --git a/apps/web/src/pages/TreasuryPage.js b/apps/web/src/pages/TreasuryPage.js new file mode 100644 index 0000000..68b5478 --- /dev/null +++ b/apps/web/src/pages/TreasuryPage.js @@ -0,0 +1,5 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +export default function TreasuryPage() { + return (_jsxs("div", { className: "px-4 py-6 sm:px-0", children: [_jsx("h1", { className: "text-2xl font-bold mb-4", children: "TreasuryPage" }), _jsx("p", { className: "text-gray-600", children: "TreasuryPage interface" })] })); +} +//# sourceMappingURL=TreasuryPage.js.map \ No newline at end of file diff --git a/apps/web/src/pages/TreasuryPage.js.map b/apps/web/src/pages/TreasuryPage.js.map new file mode 100644 index 0000000..0f37e45 --- /dev/null +++ b/apps/web/src/pages/TreasuryPage.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TreasuryPage.js","sourceRoot":"","sources":["TreasuryPage.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,YAAY;IAClC,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,aAChC,aAAI,SAAS,EAAC,yBAAyB,6BAAkB,EACzD,YAAG,SAAS,EAAC,eAAe,uCAA2B,IACnD,CACP,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/apps/web/src/stores/transactionStore.d.ts b/apps/web/src/stores/transactionStore.d.ts new file mode 100644 index 0000000..2f9d1ea --- /dev/null +++ b/apps/web/src/stores/transactionStore.d.ts @@ -0,0 +1,10 @@ +import type { Transaction, BrazilRegulatoryResult } from '@brazil-swift-ops/types'; +interface TransactionStore { + transactions: Transaction[]; + results: Map; + addTransaction: (txn: Transaction) => void; + evaluateTransaction: (txn: Transaction) => BrazilRegulatoryResult; +} +export declare const useTransactionStore: import("zustand").UseBoundStore>; +export {}; +//# sourceMappingURL=transactionStore.d.ts.map \ No newline at end of file diff --git a/apps/web/src/stores/transactionStore.d.ts.map b/apps/web/src/stores/transactionStore.d.ts.map new file mode 100644 index 0000000..e8ccb4c --- /dev/null +++ b/apps/web/src/stores/transactionStore.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"transactionStore.d.ts","sourceRoot":"","sources":["transactionStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGnF,UAAU,gBAAgB;IACxB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC7C,cAAc,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,mBAAmB,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,sBAAsB,CAAC;CACnE;AAED,eAAO,MAAM,mBAAmB,+EAiB7B,CAAC"} \ No newline at end of file diff --git a/apps/web/src/stores/transactionStore.js b/apps/web/src/stores/transactionStore.js new file mode 100644 index 0000000..045d75c --- /dev/null +++ b/apps/web/src/stores/transactionStore.js @@ -0,0 +1,21 @@ +import { create } from 'zustand'; +import { evaluateTransaction } from '@brazil-swift-ops/rules-engine'; +export const useTransactionStore = create((set) => ({ + transactions: [], + results: new Map(), + addTransaction: (txn) => { + const result = evaluateTransaction(txn); + set((state) => ({ + transactions: [...state.transactions, txn], + results: new Map(state.results).set(txn.id, result), + })); + }, + evaluateTransaction: (txn) => { + const result = evaluateTransaction(txn); + set((state) => ({ + results: new Map(state.results).set(txn.id, result), + })); + return result; + }, +})); +//# sourceMappingURL=transactionStore.js.map \ No newline at end of file diff --git a/apps/web/src/stores/transactionStore.js.map b/apps/web/src/stores/transactionStore.js.map new file mode 100644 index 0000000..a5aa9d8 --- /dev/null +++ b/apps/web/src/stores/transactionStore.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transactionStore.js","sourceRoot":"","sources":["transactionStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAiB,MAAM,gCAAgC,CAAC;AASpF,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACpE,YAAY,EAAE,EAAE;IAChB,OAAO,EAAE,IAAI,GAAG,EAAE;IAClB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC;YAC1C,OAAO,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;SACpD,CAAC,CAAC,CAAC;IACN,CAAC;IACD,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,OAAO,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;SACpD,CAAC,CAAC,CAAC;QACJ,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/audit/src/index.d.ts b/packages/audit/src/index.d.ts new file mode 100644 index 0000000..41c21d5 --- /dev/null +++ b/packages/audit/src/index.d.ts @@ -0,0 +1,5 @@ +export * from './logger'; +export * from './reports'; +export * from './retention'; +export * from './versions'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/audit/src/index.d.ts.map b/packages/audit/src/index.d.ts.map new file mode 100644 index 0000000..1f8f082 --- /dev/null +++ b/packages/audit/src/index.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/index.js b/packages/audit/src/index.js new file mode 100644 index 0000000..e8e89c3 --- /dev/null +++ b/packages/audit/src/index.js @@ -0,0 +1,5 @@ +export * from './logger'; +export * from './reports'; +export * from './retention'; +export * from './versions'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/audit/src/index.js.map b/packages/audit/src/index.js.map new file mode 100644 index 0000000..ba118cf --- /dev/null +++ b/packages/audit/src/index.js.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/logger.d.ts b/packages/audit/src/logger.d.ts new file mode 100644 index 0000000..b1cd4ad --- /dev/null +++ b/packages/audit/src/logger.d.ts @@ -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 \ No newline at end of file diff --git a/packages/audit/src/logger.d.ts.map b/packages/audit/src/logger.d.ts.map new file mode 100644 index 0000000..d37559d --- /dev/null +++ b/packages/audit/src/logger.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/logger.js b/packages/audit/src/logger.js new file mode 100644 index 0000000..41c0bb3 --- /dev/null +++ b/packages/audit/src/logger.js @@ -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 \ No newline at end of file diff --git a/packages/audit/src/logger.js.map b/packages/audit/src/logger.js.map new file mode 100644 index 0000000..28fde45 --- /dev/null +++ b/packages/audit/src/logger.js.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/logger.ts b/packages/audit/src/logger.ts new file mode 100644 index 0000000..f80a1de --- /dev/null +++ b/packages/audit/src/logger.ts @@ -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; +} diff --git a/packages/audit/src/reports.d.ts b/packages/audit/src/reports.d.ts new file mode 100644 index 0000000..2fa0938 --- /dev/null +++ b/packages/audit/src/reports.d.ts @@ -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 \ No newline at end of file diff --git a/packages/audit/src/reports.d.ts.map b/packages/audit/src/reports.d.ts.map new file mode 100644 index 0000000..257eaa0 --- /dev/null +++ b/packages/audit/src/reports.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/reports.js b/packages/audit/src/reports.js new file mode 100644 index 0000000..891480f --- /dev/null +++ b/packages/audit/src/reports.js @@ -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 \ No newline at end of file diff --git a/packages/audit/src/reports.js.map b/packages/audit/src/reports.js.map new file mode 100644 index 0000000..a3a33f3 --- /dev/null +++ b/packages/audit/src/reports.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reports.js","sourceRoot":"","sources":["reports.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/audit/src/reports.ts b/packages/audit/src/reports.ts new file mode 100644 index 0000000..94939af --- /dev/null +++ b/packages/audit/src/reports.ts @@ -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; +} diff --git a/packages/audit/src/retention.d.ts b/packages/audit/src/retention.d.ts new file mode 100644 index 0000000..7a802c8 --- /dev/null +++ b/packages/audit/src/retention.d.ts @@ -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 \ No newline at end of file diff --git a/packages/audit/src/retention.d.ts.map b/packages/audit/src/retention.d.ts.map new file mode 100644 index 0000000..7efbebe --- /dev/null +++ b/packages/audit/src/retention.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/retention.js b/packages/audit/src/retention.js new file mode 100644 index 0000000..4e76e64 --- /dev/null +++ b/packages/audit/src/retention.js @@ -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 \ No newline at end of file diff --git a/packages/audit/src/retention.js.map b/packages/audit/src/retention.js.map new file mode 100644 index 0000000..2796a57 --- /dev/null +++ b/packages/audit/src/retention.js.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/versions.d.ts b/packages/audit/src/versions.d.ts new file mode 100644 index 0000000..128698a --- /dev/null +++ b/packages/audit/src/versions.d.ts @@ -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 \ No newline at end of file diff --git a/packages/audit/src/versions.d.ts.map b/packages/audit/src/versions.d.ts.map new file mode 100644 index 0000000..367aa64 --- /dev/null +++ b/packages/audit/src/versions.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/audit/src/versions.js b/packages/audit/src/versions.js new file mode 100644 index 0000000..02e32f8 --- /dev/null +++ b/packages/audit/src/versions.js @@ -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 \ No newline at end of file diff --git a/packages/audit/src/versions.js.map b/packages/audit/src/versions.js.map new file mode 100644 index 0000000..8480b41 --- /dev/null +++ b/packages/audit/src/versions.js.map @@ -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"} \ No newline at end of file diff --git a/packages/iso20022/src/exporter.d.ts b/packages/iso20022/src/exporter.d.ts new file mode 100644 index 0000000..559ad7c --- /dev/null +++ b/packages/iso20022/src/exporter.d.ts @@ -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 \ No newline at end of file diff --git a/packages/iso20022/src/exporter.d.ts.map b/packages/iso20022/src/exporter.d.ts.map new file mode 100644 index 0000000..7488e9a --- /dev/null +++ b/packages/iso20022/src/exporter.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/iso20022/src/exporter.js b/packages/iso20022/src/exporter.js new file mode 100644 index 0000000..2c58867 --- /dev/null +++ b/packages/iso20022/src/exporter.js @@ -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 = ` + + <${message.messageType}> + + ${message.groupHeader.messageIdentification} + ${message.groupHeader.creationDateTime.toISOString()} + ${message.groupHeader.numberOfTransactions} + + +`; + 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 \ No newline at end of file diff --git a/packages/iso20022/src/exporter.js.map b/packages/iso20022/src/exporter.js.map new file mode 100644 index 0000000..3a9fed2 --- /dev/null +++ b/packages/iso20022/src/exporter.js.map @@ -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"} \ No newline at end of file diff --git a/packages/iso20022/src/index.d.ts b/packages/iso20022/src/index.d.ts new file mode 100644 index 0000000..9b0fdda --- /dev/null +++ b/packages/iso20022/src/index.d.ts @@ -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 \ No newline at end of file diff --git a/packages/iso20022/src/index.d.ts.map b/packages/iso20022/src/index.d.ts.map new file mode 100644 index 0000000..5653a82 --- /dev/null +++ b/packages/iso20022/src/index.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/iso20022/src/index.js b/packages/iso20022/src/index.js new file mode 100644 index 0000000..96f2b68 --- /dev/null +++ b/packages/iso20022/src/index.js @@ -0,0 +1,6 @@ +export * from './pacs008'; +export * from './pacs009'; +export * from './pain001'; +export * from './mt-mapper'; +export * from './exporter'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/iso20022/src/index.js.map b/packages/iso20022/src/index.js.map new file mode 100644 index 0000000..323f439 --- /dev/null +++ b/packages/iso20022/src/index.js.map @@ -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"} \ No newline at end of file diff --git a/packages/iso20022/src/mt-mapper.d.ts b/packages/iso20022/src/mt-mapper.d.ts new file mode 100644 index 0000000..f56740b --- /dev/null +++ b/packages/iso20022/src/mt-mapper.d.ts @@ -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 \ No newline at end of file diff --git a/packages/iso20022/src/mt-mapper.d.ts.map b/packages/iso20022/src/mt-mapper.d.ts.map new file mode 100644 index 0000000..7ad1b49 --- /dev/null +++ b/packages/iso20022/src/mt-mapper.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/iso20022/src/mt-mapper.js b/packages/iso20022/src/mt-mapper.js new file mode 100644 index 0000000..e6b311d --- /dev/null +++ b/packages/iso20022/src/mt-mapper.js @@ -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 \ No newline at end of file diff --git a/packages/iso20022/src/mt-mapper.js.map b/packages/iso20022/src/mt-mapper.js.map new file mode 100644 index 0000000..21690d0 --- /dev/null +++ b/packages/iso20022/src/mt-mapper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mt-mapper.js","sourceRoot":"","sources":["mt-mapper.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/risk-models/src/capital.d.ts b/packages/risk-models/src/capital.d.ts new file mode 100644 index 0000000..78b95e0 --- /dev/null +++ b/packages/risk-models/src/capital.d.ts @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/capital.d.ts.map b/packages/risk-models/src/capital.d.ts.map new file mode 100644 index 0000000..dc3cf2e --- /dev/null +++ b/packages/risk-models/src/capital.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/capital.js b/packages/risk-models/src/capital.js new file mode 100644 index 0000000..4685f06 --- /dev/null +++ b/packages/risk-models/src/capital.js @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/capital.js.map b/packages/risk-models/src/capital.js.map new file mode 100644 index 0000000..a92caf5 --- /dev/null +++ b/packages/risk-models/src/capital.js.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/escalation.d.ts b/packages/risk-models/src/escalation.d.ts new file mode 100644 index 0000000..4dc409e --- /dev/null +++ b/packages/risk-models/src/escalation.d.ts @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/escalation.d.ts.map b/packages/risk-models/src/escalation.d.ts.map new file mode 100644 index 0000000..41efa9f --- /dev/null +++ b/packages/risk-models/src/escalation.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/escalation.js b/packages/risk-models/src/escalation.js new file mode 100644 index 0000000..9291c76 --- /dev/null +++ b/packages/risk-models/src/escalation.js @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/escalation.js.map b/packages/risk-models/src/escalation.js.map new file mode 100644 index 0000000..7502e4f --- /dev/null +++ b/packages/risk-models/src/escalation.js.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/index.d.ts b/packages/risk-models/src/index.d.ts new file mode 100644 index 0000000..d2aaf27 --- /dev/null +++ b/packages/risk-models/src/index.d.ts @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/index.d.ts.map b/packages/risk-models/src/index.d.ts.map new file mode 100644 index 0000000..661c22d --- /dev/null +++ b/packages/risk-models/src/index.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/index.js b/packages/risk-models/src/index.js new file mode 100644 index 0000000..4aa53e6 --- /dev/null +++ b/packages/risk-models/src/index.js @@ -0,0 +1,6 @@ +export * from './reserves'; +export * from './capital'; +export * from './lcr'; +export * from './escalation'; +export * from './risk-weights'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/risk-models/src/index.js.map b/packages/risk-models/src/index.js.map new file mode 100644 index 0000000..91c0a40 --- /dev/null +++ b/packages/risk-models/src/index.js.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/lcr.d.ts b/packages/risk-models/src/lcr.d.ts new file mode 100644 index 0000000..c733d67 --- /dev/null +++ b/packages/risk-models/src/lcr.d.ts @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/lcr.d.ts.map b/packages/risk-models/src/lcr.d.ts.map new file mode 100644 index 0000000..683387c --- /dev/null +++ b/packages/risk-models/src/lcr.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/lcr.js b/packages/risk-models/src/lcr.js new file mode 100644 index 0000000..e816be9 --- /dev/null +++ b/packages/risk-models/src/lcr.js @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/lcr.js.map b/packages/risk-models/src/lcr.js.map new file mode 100644 index 0000000..643aa16 --- /dev/null +++ b/packages/risk-models/src/lcr.js.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/reserves.d.ts b/packages/risk-models/src/reserves.d.ts new file mode 100644 index 0000000..32a5abb --- /dev/null +++ b/packages/risk-models/src/reserves.d.ts @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/reserves.d.ts.map b/packages/risk-models/src/reserves.d.ts.map new file mode 100644 index 0000000..3491ed7 --- /dev/null +++ b/packages/risk-models/src/reserves.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/reserves.js b/packages/risk-models/src/reserves.js new file mode 100644 index 0000000..c449cb2 --- /dev/null +++ b/packages/risk-models/src/reserves.js @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/reserves.js.map b/packages/risk-models/src/reserves.js.map new file mode 100644 index 0000000..f413ec1 --- /dev/null +++ b/packages/risk-models/src/reserves.js.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/risk-weights.d.ts b/packages/risk-models/src/risk-weights.d.ts new file mode 100644 index 0000000..e30c1fa --- /dev/null +++ b/packages/risk-models/src/risk-weights.d.ts @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/risk-weights.d.ts.map b/packages/risk-models/src/risk-weights.d.ts.map new file mode 100644 index 0000000..1286a8e --- /dev/null +++ b/packages/risk-models/src/risk-weights.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/risk-models/src/risk-weights.js b/packages/risk-models/src/risk-weights.js new file mode 100644 index 0000000..28e3e21 --- /dev/null +++ b/packages/risk-models/src/risk-weights.js @@ -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 \ No newline at end of file diff --git a/packages/risk-models/src/risk-weights.js.map b/packages/risk-models/src/risk-weights.js.map new file mode 100644 index 0000000..5d6575d --- /dev/null +++ b/packages/risk-models/src/risk-weights.js.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/aml.d.ts b/packages/rules-engine/src/aml.d.ts new file mode 100644 index 0000000..833d869 --- /dev/null +++ b/packages/rules-engine/src/aml.d.ts @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/aml.d.ts.map b/packages/rules-engine/src/aml.d.ts.map new file mode 100644 index 0000000..a990341 --- /dev/null +++ b/packages/rules-engine/src/aml.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/aml.js b/packages/rules-engine/src/aml.js new file mode 100644 index 0000000..a5928f0 --- /dev/null +++ b/packages/rules-engine/src/aml.js @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/aml.js.map b/packages/rules-engine/src/aml.js.map new file mode 100644 index 0000000..f6da2c3 --- /dev/null +++ b/packages/rules-engine/src/aml.js.map @@ -0,0 +1 @@ +{"version":3,"file":"aml.js","sourceRoot":"","sources":["aml.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/rules-engine/src/fx-contract.d.ts b/packages/rules-engine/src/fx-contract.d.ts new file mode 100644 index 0000000..7a66fa4 --- /dev/null +++ b/packages/rules-engine/src/fx-contract.d.ts @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/fx-contract.d.ts.map b/packages/rules-engine/src/fx-contract.d.ts.map new file mode 100644 index 0000000..ec35ef0 --- /dev/null +++ b/packages/rules-engine/src/fx-contract.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/fx-contract.js b/packages/rules-engine/src/fx-contract.js new file mode 100644 index 0000000..9fa1d95 --- /dev/null +++ b/packages/rules-engine/src/fx-contract.js @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/fx-contract.js.map b/packages/rules-engine/src/fx-contract.js.map new file mode 100644 index 0000000..b431378 --- /dev/null +++ b/packages/rules-engine/src/fx-contract.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fx-contract.js","sourceRoot":"","sources":["fx-contract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/rules-engine/src/index.d.ts b/packages/rules-engine/src/index.d.ts new file mode 100644 index 0000000..7d3e745 --- /dev/null +++ b/packages/rules-engine/src/index.d.ts @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/index.d.ts.map b/packages/rules-engine/src/index.d.ts.map new file mode 100644 index 0000000..61c459a --- /dev/null +++ b/packages/rules-engine/src/index.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/index.js b/packages/rules-engine/src/index.js new file mode 100644 index 0000000..177c812 --- /dev/null +++ b/packages/rules-engine/src/index.js @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/index.js.map b/packages/rules-engine/src/index.js.map new file mode 100644 index 0000000..bf7bdc5 --- /dev/null +++ b/packages/rules-engine/src/index.js.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/iof.d.ts b/packages/rules-engine/src/iof.d.ts new file mode 100644 index 0000000..8ebcf47 --- /dev/null +++ b/packages/rules-engine/src/iof.d.ts @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/iof.d.ts.map b/packages/rules-engine/src/iof.d.ts.map new file mode 100644 index 0000000..285f1dc --- /dev/null +++ b/packages/rules-engine/src/iof.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/iof.js b/packages/rules-engine/src/iof.js new file mode 100644 index 0000000..086ed4e --- /dev/null +++ b/packages/rules-engine/src/iof.js @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/iof.js.map b/packages/rules-engine/src/iof.js.map new file mode 100644 index 0000000..61f6ab4 --- /dev/null +++ b/packages/rules-engine/src/iof.js.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/orchestrator.d.ts b/packages/rules-engine/src/orchestrator.d.ts new file mode 100644 index 0000000..7b54bab --- /dev/null +++ b/packages/rules-engine/src/orchestrator.d.ts @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/orchestrator.d.ts.map b/packages/rules-engine/src/orchestrator.d.ts.map new file mode 100644 index 0000000..c39783e --- /dev/null +++ b/packages/rules-engine/src/orchestrator.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/rules-engine/src/orchestrator.js b/packages/rules-engine/src/orchestrator.js new file mode 100644 index 0000000..943a7fa --- /dev/null +++ b/packages/rules-engine/src/orchestrator.js @@ -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 \ No newline at end of file diff --git a/packages/rules-engine/src/orchestrator.js.map b/packages/rules-engine/src/orchestrator.js.map new file mode 100644 index 0000000..42e8a0e --- /dev/null +++ b/packages/rules-engine/src/orchestrator.js.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/accounts.d.ts b/packages/treasury/src/accounts.d.ts new file mode 100644 index 0000000..33c4e3e --- /dev/null +++ b/packages/treasury/src/accounts.d.ts @@ -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): 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 \ No newline at end of file diff --git a/packages/treasury/src/accounts.d.ts.map b/packages/treasury/src/accounts.d.ts.map new file mode 100644 index 0000000..f6e6398 --- /dev/null +++ b/packages/treasury/src/accounts.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/accounts.js b/packages/treasury/src/accounts.js new file mode 100644 index 0000000..b5f17d3 --- /dev/null +++ b/packages/treasury/src/accounts.js @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/accounts.js.map b/packages/treasury/src/accounts.js.map new file mode 100644 index 0000000..dd5b1cb --- /dev/null +++ b/packages/treasury/src/accounts.js.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/accounts.ts b/packages/treasury/src/accounts.ts index 8db780c..35bb4b5 100644 --- a/packages/treasury/src/accounts.ts +++ b/packages/treasury/src/accounts.ts @@ -25,7 +25,8 @@ class AccountStore { update(id: string, updates: Partial): 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); } } diff --git a/packages/treasury/src/index.d.ts b/packages/treasury/src/index.d.ts new file mode 100644 index 0000000..1a3a5c0 --- /dev/null +++ b/packages/treasury/src/index.d.ts @@ -0,0 +1,5 @@ +export * from './accounts'; +export * from './posting'; +export * from './transfers'; +export * from './reporting'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/treasury/src/index.d.ts.map b/packages/treasury/src/index.d.ts.map new file mode 100644 index 0000000..87c0039 --- /dev/null +++ b/packages/treasury/src/index.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/index.js b/packages/treasury/src/index.js new file mode 100644 index 0000000..61690ef --- /dev/null +++ b/packages/treasury/src/index.js @@ -0,0 +1,5 @@ +export * from './accounts'; +export * from './posting'; +export * from './transfers'; +export * from './reporting'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/treasury/src/index.js.map b/packages/treasury/src/index.js.map new file mode 100644 index 0000000..1ad4609 --- /dev/null +++ b/packages/treasury/src/index.js.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/posting.d.ts b/packages/treasury/src/posting.d.ts new file mode 100644 index 0000000..2cc579d --- /dev/null +++ b/packages/treasury/src/posting.d.ts @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/posting.d.ts.map b/packages/treasury/src/posting.d.ts.map new file mode 100644 index 0000000..3f704f0 --- /dev/null +++ b/packages/treasury/src/posting.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/posting.js b/packages/treasury/src/posting.js new file mode 100644 index 0000000..a2d0945 --- /dev/null +++ b/packages/treasury/src/posting.js @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/posting.js.map b/packages/treasury/src/posting.js.map new file mode 100644 index 0000000..8df2a4e --- /dev/null +++ b/packages/treasury/src/posting.js.map @@ -0,0 +1 @@ +{"version":3,"file":"posting.js","sourceRoot":"","sources":["posting.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/treasury/src/posting.ts b/packages/treasury/src/posting.ts index aed9aa0..60592b6 100644 --- a/packages/treasury/src/posting.ts +++ b/packages/treasury/src/posting.ts @@ -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); } } diff --git a/packages/treasury/src/reporting.d.ts b/packages/treasury/src/reporting.d.ts new file mode 100644 index 0000000..0c4d272 --- /dev/null +++ b/packages/treasury/src/reporting.d.ts @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/reporting.d.ts.map b/packages/treasury/src/reporting.d.ts.map new file mode 100644 index 0000000..ca9b340 --- /dev/null +++ b/packages/treasury/src/reporting.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/reporting.js b/packages/treasury/src/reporting.js new file mode 100644 index 0000000..7fcdae1 --- /dev/null +++ b/packages/treasury/src/reporting.js @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/reporting.js.map b/packages/treasury/src/reporting.js.map new file mode 100644 index 0000000..0b292c1 --- /dev/null +++ b/packages/treasury/src/reporting.js.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/transfers.d.ts b/packages/treasury/src/transfers.d.ts new file mode 100644 index 0000000..d7a1e1c --- /dev/null +++ b/packages/treasury/src/transfers.d.ts @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/transfers.d.ts.map b/packages/treasury/src/transfers.d.ts.map new file mode 100644 index 0000000..01d7211 --- /dev/null +++ b/packages/treasury/src/transfers.d.ts.map @@ -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"} \ No newline at end of file diff --git a/packages/treasury/src/transfers.js b/packages/treasury/src/transfers.js new file mode 100644 index 0000000..719b21d --- /dev/null +++ b/packages/treasury/src/transfers.js @@ -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 \ No newline at end of file diff --git a/packages/treasury/src/transfers.js.map b/packages/treasury/src/transfers.js.map new file mode 100644 index 0000000..ba205e4 --- /dev/null +++ b/packages/treasury/src/transfers.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transfers.js","sourceRoot":"","sources":["transfers.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/types/src/audit.d.ts b/packages/types/src/audit.d.ts new file mode 100644 index 0000000..b297bc8 --- /dev/null +++ b/packages/types/src/audit.d.ts @@ -0,0 +1,83 @@ +/** + * Audit logging and compliance reporting types + */ +export interface AuditLog { + id: string; + timestamp: Date; + transactionId?: string; + batchId?: string; + ruleSetVersion: string; + inputs: Record; + outputs: Record; + decision: 'Allow' | 'Hold' | 'Escalate'; + severity: 'Info' | 'Warning' | 'Critical'; + rationale: string; + userId?: string; + ipAddress?: string; + userAgent?: string; + action: string; + metadata?: Record; +} +export interface RuleVersion { + version: string; + effectiveDate: Date; + approvalAuthority: string; + deprecated: boolean; + deprecatedDate?: Date; + description?: string; + changes?: string[]; +} +export interface BCBReport { + reportId: string; + reportType: 'transaction' | 'batch' | 'periodic'; + generatedAt: Date; + periodStart?: Date; + periodEnd?: Date; + transactions: BCBReportTransaction[]; + summary: BCBReportSummary; + format: 'json' | 'csv'; + data: string; +} +export interface BCBReportTransaction { + transactionId: string; + executionDate: Date; + direction: 'inbound' | 'outbound'; + amount: number; + currency: string; + usdEquivalent: number; + orderingCustomer: { + name: string; + taxId?: string; + country: string; + }; + beneficiary: { + name: string; + taxId?: string; + country: string; + accountNumber?: string; + }; + purposeOfPayment?: string; + fxContractId?: string; + iofAmount?: number; + reportingRequired: boolean; +} +export interface BCBReportSummary { + totalTransactions: number; + totalAmount: number; + totalUsdEquivalent: number; + inboundCount: number; + inboundAmount: number; + outboundCount: number; + outboundAmount: number; + reportingRequiredCount: number; + totalIOF: number; +} +export interface RetentionPolicy { + policyId: string; + dataType: 'audit_log' | 'transaction' | 'report' | 'all'; + retentionPeriodDays: number; + archivalAfterDays?: number; + autoDelete: boolean; + effectiveDate: Date; +} +//# sourceMappingURL=audit.d.ts.map \ No newline at end of file diff --git a/packages/types/src/audit.d.ts.map b/packages/types/src/audit.d.ts.map new file mode 100644 index 0000000..dbae35c --- /dev/null +++ b/packages/types/src/audit.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["audit.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/types/src/audit.js b/packages/types/src/audit.js new file mode 100644 index 0000000..9db16b4 --- /dev/null +++ b/packages/types/src/audit.js @@ -0,0 +1,5 @@ +/** + * Audit logging and compliance reporting types + */ +export {}; +//# sourceMappingURL=audit.js.map \ No newline at end of file diff --git a/packages/types/src/audit.js.map b/packages/types/src/audit.js.map new file mode 100644 index 0000000..872a237 --- /dev/null +++ b/packages/types/src/audit.js.map @@ -0,0 +1 @@ +{"version":3,"file":"audit.js","sourceRoot":"","sources":["audit.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/eo-uplift.d.ts b/packages/types/src/eo-uplift.d.ts new file mode 100644 index 0000000..4251345 --- /dev/null +++ b/packages/types/src/eo-uplift.d.ts @@ -0,0 +1,22 @@ +/** + * Errors & Omissions (E&O) Uplift types + */ +export interface EOUplift { + baseAmount: number; + upliftRate: number; + upliftAmount: number; + adjustedExposure: number; + treatment: 'off_balance_sheet'; +} +export interface TransactionEOUplift extends EOUplift { + transactionId: string; + currency: string; + usdEquivalent?: number; +} +export interface BatchEOUplift extends EOUplift { + batchId: string; + transactionCount: number; + currency: string; + usdEquivalent?: number; +} +//# sourceMappingURL=eo-uplift.d.ts.map \ No newline at end of file diff --git a/packages/types/src/eo-uplift.d.ts.map b/packages/types/src/eo-uplift.d.ts.map new file mode 100644 index 0000000..7c99261 --- /dev/null +++ b/packages/types/src/eo-uplift.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"eo-uplift.d.ts","sourceRoot":"","sources":["eo-uplift.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAoB,SAAQ,QAAQ;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"} \ No newline at end of file diff --git a/packages/types/src/eo-uplift.js b/packages/types/src/eo-uplift.js new file mode 100644 index 0000000..afe0369 --- /dev/null +++ b/packages/types/src/eo-uplift.js @@ -0,0 +1,5 @@ +/** + * Errors & Omissions (E&O) Uplift types + */ +export {}; +//# sourceMappingURL=eo-uplift.js.map \ No newline at end of file diff --git a/packages/types/src/eo-uplift.js.map b/packages/types/src/eo-uplift.js.map new file mode 100644 index 0000000..25d00ad --- /dev/null +++ b/packages/types/src/eo-uplift.js.map @@ -0,0 +1 @@ +{"version":3,"file":"eo-uplift.js","sourceRoot":"","sources":["eo-uplift.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/fx-contract.d.ts b/packages/types/src/fx-contract.d.ts new file mode 100644 index 0000000..7dc1177 --- /dev/null +++ b/packages/types/src/fx-contract.d.ts @@ -0,0 +1,31 @@ +/** + * FX Contract (Contrato de Câmbio) types + */ +export interface FXContract { + contractId: string; + type: 'inbound' | 'outbound'; + counterparty: string; + counterpartyTaxId?: string; + amount: number; + currency: string; + effectiveDate: Date; + expiryDate: Date; + remainingAmount: number; + usedAmount: number; + status: 'active' | 'expired' | 'exhausted' | 'cancelled'; + createdAt: Date; + updatedAt: Date; + metadata?: Record; +} +export interface FXContractValidation { + contractId: string; + contractExists: boolean; + contractValid: boolean; + contractActive: boolean; + amountWithinLimit: boolean; + transactionAmount: number; + contractRemainingAmount: number; + errors: string[]; + warnings: string[]; +} +//# sourceMappingURL=fx-contract.d.ts.map \ No newline at end of file diff --git a/packages/types/src/fx-contract.d.ts.map b/packages/types/src/fx-contract.d.ts.map new file mode 100644 index 0000000..628b419 --- /dev/null +++ b/packages/types/src/fx-contract.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fx-contract.d.ts","sourceRoot":"","sources":["fx-contract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,IAAI,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IACzD,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"} \ No newline at end of file diff --git a/packages/types/src/fx-contract.js b/packages/types/src/fx-contract.js new file mode 100644 index 0000000..94b88ef --- /dev/null +++ b/packages/types/src/fx-contract.js @@ -0,0 +1,5 @@ +/** + * FX Contract (Contrato de Câmbio) types + */ +export {}; +//# sourceMappingURL=fx-contract.js.map \ No newline at end of file diff --git a/packages/types/src/fx-contract.js.map b/packages/types/src/fx-contract.js.map new file mode 100644 index 0000000..ef6a136 --- /dev/null +++ b/packages/types/src/fx-contract.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fx-contract.js","sourceRoot":"","sources":["fx-contract.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/index.d.ts b/packages/types/src/index.d.ts new file mode 100644 index 0000000..1f72b01 --- /dev/null +++ b/packages/types/src/index.d.ts @@ -0,0 +1,14 @@ +/** + * @brazil-swift-ops/types + * + * Shared TypeScript types and interfaces for the Brazil SWIFT Operations Platform + */ +export * from './transaction'; +export * from './iso20022'; +export * from './regulatory'; +export * from './treasury'; +export * from './audit'; +export * from './risk'; +export * from './fx-contract'; +export * from './eo-uplift'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/types/src/index.d.ts.map b/packages/types/src/index.d.ts.map new file mode 100644 index 0000000..0f578f1 --- /dev/null +++ b/packages/types/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/types/src/index.js b/packages/types/src/index.js new file mode 100644 index 0000000..952e399 --- /dev/null +++ b/packages/types/src/index.js @@ -0,0 +1,14 @@ +/** + * @brazil-swift-ops/types + * + * Shared TypeScript types and interfaces for the Brazil SWIFT Operations Platform + */ +export * from './transaction'; +export * from './iso20022'; +export * from './regulatory'; +export * from './treasury'; +export * from './audit'; +export * from './risk'; +export * from './fx-contract'; +export * from './eo-uplift'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/types/src/index.js.map b/packages/types/src/index.js.map new file mode 100644 index 0000000..e21306c --- /dev/null +++ b/packages/types/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/types/src/iso20022.d.ts b/packages/types/src/iso20022.d.ts new file mode 100644 index 0000000..3553283 --- /dev/null +++ b/packages/types/src/iso20022.d.ts @@ -0,0 +1,111 @@ +/** + * ISO 20022 message types and structures + */ +export type ISO20022MessageType = 'pacs.008' | 'pacs.009' | 'pain.001'; +export type ISO20022Version = string; +export interface ISO20022Message { + messageId: string; + messageType: ISO20022MessageType; + version: ISO20022Version; + creationDateTime: Date; + groupHeader: GroupHeader; + paymentInformation: PaymentInformation[]; + rawMessage?: Record; +} +export interface GroupHeader { + messageIdentification: string; + creationDateTime: Date; + numberOfTransactions: number; + controlSum?: number; + initiatingParty: PartyIdentification; +} +export interface PartyIdentification { + name?: string; + postalAddress?: PostalAddress; + identification?: PartyIdentificationDetails; +} +export interface PostalAddress { + streetName?: string; + buildingNumber?: string; + postCode?: string; + townName?: string; + country: string; +} +export interface PartyIdentificationDetails { + organisationIdentification?: string; + privateIdentification?: string; +} +export interface PaymentInformation { + paymentInformationIdentification: string; + paymentMethod: string; + requestedExecutionDate: Date; + debtor: PartyIdentification; + debtorAccount: CashAccount; + debtorAgent?: FinancialInstitutionIdentification; + creditTransferTransactionInformation: CreditTransferTransactionInformation[]; +} +export interface CashAccount { + identification: string; + name?: string; + currency?: string; + type?: string; + iban?: string; +} +export interface FinancialInstitutionIdentification { + bic?: string; + name?: string; + postalAddress?: PostalAddress; +} +export interface CreditTransferTransactionInformation { + paymentIdentification: PaymentIdentification; + amount: Amount; + chargeBearer?: string; + creditor: PartyIdentification; + creditorAccount: CashAccount; + creditorAgent?: FinancialInstitutionIdentification; + remittanceInformation?: RemittanceInformation; + purpose?: string; +} +export interface PaymentIdentification { + instructionId?: string; + endToEndId: string; + transactionId?: string; +} +export interface Amount { + currency: string; + value: number; +} +export interface RemittanceInformation { + unstructured?: string; + structured?: Record; +} +export interface Pacs008Message extends ISO20022Message { + messageType: 'pacs.008'; + creditTransferTransaction: CreditTransferTransaction[]; +} +export interface CreditTransferTransaction { + paymentIdentification: PaymentIdentification; + amount: Amount; + chargeBearer?: string; + debtor: PartyIdentification; + debtorAccount: CashAccount; + debtorAgent?: FinancialInstitutionIdentification; + creditor: PartyIdentification; + creditorAccount: CashAccount; + creditorAgent?: FinancialInstitutionIdentification; + remittanceInformation?: RemittanceInformation; + purpose?: string; +} +export interface Pacs009Message extends ISO20022Message { + messageType: 'pacs.009'; + creditTransferTransaction: CreditTransferTransaction[]; +} +export interface Pain001Message extends ISO20022Message { + messageType: 'pain.001'; + customerCreditTransferInitiation: CustomerCreditTransferInitiation; +} +export interface CustomerCreditTransferInitiation { + groupHeader: GroupHeader; + paymentInformation: PaymentInformation[]; +} +//# sourceMappingURL=iso20022.d.ts.map \ No newline at end of file diff --git a/packages/types/src/iso20022.d.ts.map b/packages/types/src/iso20022.d.ts.map new file mode 100644 index 0000000..039b108 --- /dev/null +++ b/packages/types/src/iso20022.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"iso20022.d.ts","sourceRoot":"","sources":["iso20022.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/types/src/iso20022.js b/packages/types/src/iso20022.js new file mode 100644 index 0000000..764c667 --- /dev/null +++ b/packages/types/src/iso20022.js @@ -0,0 +1,5 @@ +/** + * ISO 20022 message types and structures + */ +export {}; +//# sourceMappingURL=iso20022.js.map \ No newline at end of file diff --git a/packages/types/src/iso20022.js.map b/packages/types/src/iso20022.js.map new file mode 100644 index 0000000..d076831 --- /dev/null +++ b/packages/types/src/iso20022.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iso20022.js","sourceRoot":"","sources":["iso20022.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/regulatory.d.ts b/packages/types/src/regulatory.d.ts new file mode 100644 index 0000000..f20eae4 --- /dev/null +++ b/packages/types/src/regulatory.d.ts @@ -0,0 +1,95 @@ +/** + * Brazil regulatory rule evaluation types + */ +export type RuleSeverity = 'Info' | 'Warning' | 'Critical'; +export type RuleDecision = 'Allow' | 'Hold' | 'Escalate'; +export interface RuleResult { + ruleId: string; + ruleName: string; + passed: boolean; + severity: RuleSeverity; + decision: RuleDecision; + rationale: string; + details?: Record; +} +export interface BrazilRegulatoryResult { + transactionId: string; + timestamp: Date; + ruleSetVersion: string; + overallDecision: RuleDecision; + overallSeverity: RuleSeverity; + rules: RuleResult[]; + thresholdCheck?: ThresholdCheckResult; + documentationCheck?: DocumentationCheckResult; + fxContractCheck?: FXContractCheckResult; + iofCalculation?: IOFCalculationResult; + amlCheck?: AMLCheckResult; +} +export interface ThresholdCheckResult { + passed: boolean; + transactionAmount: number; + currency: string; + usdEquivalent: number; + threshold: number; + requiresReporting: boolean; + rationale: string; +} +export interface DocumentationCheckResult { + passed: boolean; + hasOrderingCustomerName: boolean; + hasOrderingCustomerAddress: boolean; + hasOrderingCustomerTaxId: boolean; + hasBeneficiaryName: boolean; + hasBeneficiaryAccount: boolean; + hasBeneficiaryTaxId: boolean; + hasPurposeOfPayment: boolean; + missingFields: string[]; + rationale: string; +} +export interface FXContractCheckResult { + passed: boolean; + fxContractId?: string; + contractExists: boolean; + contractType?: 'inbound' | 'outbound'; + contractAmount: number; + contractRemainingAmount: number; + transactionAmount: number; + amountWithinLimit: boolean; + rationale: string; +} +export interface IOFCalculationResult { + direction: 'inbound' | 'outbound'; + transactionAmount: number; + currency: string; + brlAmount: number; + iofRate: number; + iofAmount: number; + netAmount: number; + effectiveDate: Date; + rateVersion: string; +} +export interface AMLCheckResult { + passed: boolean; + singleTransactionCheck: SingleTransactionAMLResult; + structuringCheck?: StructuringCheckResult; + overallRiskLevel: 'Low' | 'Medium' | 'High'; + rationale: string; +} +export interface SingleTransactionAMLResult { + passed: boolean; + transactionAmount: number; + usdEquivalent: number; + threshold: number; + requiresEnhancedReview: boolean; + riskLevel: 'Low' | 'Medium' | 'High'; +} +export interface StructuringCheckResult { + detected: boolean; + windowDays: number; + transactionCount: number; + totalAmount: number; + totalUsdEquivalent: number; + individualAmounts: number[]; + rationale: string; +} +//# sourceMappingURL=regulatory.d.ts.map \ No newline at end of file diff --git a/packages/types/src/regulatory.d.ts.map b/packages/types/src/regulatory.d.ts.map new file mode 100644 index 0000000..3756341 --- /dev/null +++ b/packages/types/src/regulatory.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"regulatory.d.ts","sourceRoot":"","sources":["regulatory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,YAAY,CAAC;IAC9B,eAAe,EAAE,YAAY,CAAC;IAC9B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,uBAAuB,EAAE,OAAO,CAAC;IACjC,0BAA0B,EAAE,OAAO,CAAC;IACpC,wBAAwB,EAAE,OAAO,CAAC;IAClC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,sBAAsB,EAAE,0BAA0B,CAAC;IACnD,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,gBAAgB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB"} \ No newline at end of file diff --git a/packages/types/src/regulatory.js b/packages/types/src/regulatory.js new file mode 100644 index 0000000..9ea7c7e --- /dev/null +++ b/packages/types/src/regulatory.js @@ -0,0 +1,5 @@ +/** + * Brazil regulatory rule evaluation types + */ +export {}; +//# sourceMappingURL=regulatory.js.map \ No newline at end of file diff --git a/packages/types/src/regulatory.js.map b/packages/types/src/regulatory.js.map new file mode 100644 index 0000000..12117b7 --- /dev/null +++ b/packages/types/src/regulatory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"regulatory.js","sourceRoot":"","sources":["regulatory.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/regulatory.ts b/packages/types/src/regulatory.ts index bf85735..dfc9b8c 100644 --- a/packages/types/src/regulatory.ts +++ b/packages/types/src/regulatory.ts @@ -4,7 +4,6 @@ export type RuleSeverity = 'Info' | 'Warning' | 'Critical'; export type RuleDecision = 'Allow' | 'Hold' | 'Escalate'; -export type EscalationLevel = 'Allow' | 'Hold' | 'ComplianceReview' | 'TreasuryApproval' | 'ExceptionApproval'; export interface RuleResult { ruleId: string; diff --git a/packages/types/src/risk.d.ts b/packages/types/src/risk.d.ts new file mode 100644 index 0000000..ed49be7 --- /dev/null +++ b/packages/types/src/risk.d.ts @@ -0,0 +1,79 @@ +/** + * Risk, capital, and liquidity modeling types + */ +export interface ReserveImpact { + transactionId: string; + transactionAmount: number; + currency: string; + reserveRatio: number; + reserveImpact: number; + availableLiquidityBefore: number; + availableLiquidityAfter: number; + requiredReserves: number; + complianceCheck: boolean; + rationale: string; +} +export interface CapitalImpact { + transactionId: string; + transactionAmount: number; + currency: string; + riskWeight: number; + riskWeightedAssets: number; + capitalRatio: number; + capitalConsumed: number; + capitalBufferBefore: number; + capitalBufferAfter: number; + complianceCheck: boolean; + rationale: string; +} +export interface LCRImpact { + transactionId: string; + transactionAmount: number; + currency: string; + runoffFactor: number; + outflowStress: number; + hqlaBefore: number; + netOutflowsBefore: number; + netOutflowsAfter: number; + lcrBefore: number; + lcrAfter: number; + minimumLCR: number; + complianceCheck: boolean; + rationale: string; +} +export interface RiskWeightTable { + id: string; + version: string; + effectiveDate: Date; + weights: RiskWeight[]; +} +export interface RiskWeight { + category: string; + description: string; + weight: number; + minWeight?: number; + maxWeight?: number; +} +export interface EscalationState { + transactionId: string; + currentLevel: EscalationLevel; + previousLevel?: EscalationLevel; + reason: string; + escalatedAt: Date; + escalatedBy?: string; + approvalRequired?: boolean; + approvedBy?: string; + approvedAt?: Date; +} +export type EscalationLevel = 'Allow' | 'Hold' | 'ComplianceReview' | 'TreasuryApproval' | 'ExceptionApproval'; +export interface StressTestResult { + transactionId: string; + reserveImpact: ReserveImpact; + capitalImpact: CapitalImpact; + lcrImpact: LCRImpact; + overallCompliance: boolean; + blockingIssues: string[]; + warnings: string[]; + recommendedAction: 'Allow' | 'Hold' | 'Escalate'; +} +//# sourceMappingURL=risk.d.ts.map \ No newline at end of file diff --git a/packages/types/src/risk.d.ts.map b/packages/types/src/risk.d.ts.map new file mode 100644 index 0000000..a02b72f --- /dev/null +++ b/packages/types/src/risk.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["risk.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB,EAAE,MAAM,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,IAAI,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,IAAI,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;AAE/G,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;CAClD"} \ No newline at end of file diff --git a/packages/types/src/risk.js b/packages/types/src/risk.js new file mode 100644 index 0000000..d3bd6fc --- /dev/null +++ b/packages/types/src/risk.js @@ -0,0 +1,5 @@ +/** + * Risk, capital, and liquidity modeling types + */ +export {}; +//# sourceMappingURL=risk.js.map \ No newline at end of file diff --git a/packages/types/src/risk.js.map b/packages/types/src/risk.js.map new file mode 100644 index 0000000..40473c2 --- /dev/null +++ b/packages/types/src/risk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"risk.js","sourceRoot":"","sources":["risk.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/transaction.d.ts b/packages/types/src/transaction.d.ts new file mode 100644 index 0000000..1f28a51 --- /dev/null +++ b/packages/types/src/transaction.d.ts @@ -0,0 +1,45 @@ +/** + * Canonical transaction model for cross-border payments + */ +export type TransactionDirection = 'inbound' | 'outbound'; +export type TransactionStatus = 'pending' | 'approved' | 'held' | 'rejected' | 'escalated'; +export type Currency = string; +export interface Party { + name: string; + address?: string; + city?: string; + country: string; + taxId?: string; + email?: string; + phone?: string; + accountNumber?: string; + iban?: string; + bic?: string; +} +export interface Transaction { + id: string; + direction: TransactionDirection; + amount: number; + currency: Currency; + usdEquivalent?: number; + orderingCustomer: Party; + beneficiary: Party; + purposeOfPayment?: string; + fxContractId?: string; + swiftReference?: string; + iso20022MessageId?: string; + status: TransactionStatus; + createdAt: Date; + updatedAt: Date; + metadata?: Record; +} +export interface BatchTransaction { + batchId: string; + transactions: Transaction[]; + totalAmount: number; + totalUsdEquivalent: number; + currency: Currency; + createdAt: Date; + status: 'pending' | 'processing' | 'completed' | 'failed'; +} +//# sourceMappingURL=transaction.d.ts.map \ No newline at end of file diff --git a/packages/types/src/transaction.d.ts.map b/packages/types/src/transaction.d.ts.map new file mode 100644 index 0000000..02b243b --- /dev/null +++ b/packages/types/src/transaction.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["transaction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,UAAU,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;AAC3F,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,oBAAoB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,KAAK,CAAC;IACxB,WAAW,EAAE,KAAK,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC3D"} \ No newline at end of file diff --git a/packages/types/src/transaction.js b/packages/types/src/transaction.js new file mode 100644 index 0000000..65c7023 --- /dev/null +++ b/packages/types/src/transaction.js @@ -0,0 +1,5 @@ +/** + * Canonical transaction model for cross-border payments + */ +export {}; +//# sourceMappingURL=transaction.js.map \ No newline at end of file diff --git a/packages/types/src/transaction.js.map b/packages/types/src/transaction.js.map new file mode 100644 index 0000000..db0125f --- /dev/null +++ b/packages/types/src/transaction.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transaction.js","sourceRoot":"","sources":["transaction.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/types/src/treasury.d.ts b/packages/types/src/treasury.d.ts new file mode 100644 index 0000000..c61ebad --- /dev/null +++ b/packages/types/src/treasury.d.ts @@ -0,0 +1,86 @@ +/** + * Treasury and subledger account types + */ +export type AccountStatus = 'active' | 'inactive' | 'closed' | 'suspended'; +export type AccountType = 'treasury' | 'subledger'; +export type PostingType = 'debit' | 'credit'; +export interface TreasuryAccount { + id: string; + accountNumber: string; + name: string; + type: 'treasury'; + currency: string; + status: AccountStatus; + parentAccountId?: string; + balance: number; + availableBalance: number; + createdAt: Date; + updatedAt: Date; + metadata?: Record; +} +export interface SubledgerAccount { + id: string; + accountNumber: string; + name: string; + type: 'subledger'; + currency: string; + status: AccountStatus; + parentAccountId: string; + balance: number; + availableBalance: number; + routingRules?: RoutingRule[]; + createdAt: Date; + updatedAt: Date; + metadata?: Record; +} +export type Account = TreasuryAccount | SubledgerAccount; +export interface RoutingRule { + id: string; + subledgerAccountId: string; + conditions: RoutingCondition[]; + priority: number; + active: boolean; +} +export interface RoutingCondition { + field: string; + operator: 'equals' | 'greaterThan' | 'lessThan' | 'contains'; + value: string | number; +} +export interface AccountPosting { + id: string; + accountId: string; + transactionId: string; + postingType: PostingType; + amount: number; + currency: string; + fxRate?: number; + balanceBefore: number; + balanceAfter: number; + postedAt: Date; + description?: string; +} +export interface SubledgerTransfer { + id: string; + fromAccountId: string; + toAccountId: string; + amount: number; + currency: string; + transactionId?: string; + description?: string; + executedAt: Date; + status: 'pending' | 'completed' | 'failed'; +} +export interface SubledgerReport { + subledgerId: string; + periodStart: Date; + periodEnd: Date; + openingBalance: number; + closingBalance: number; + totalDebits: number; + totalCredits: number; + netPosition: number; + currency: string; + transactionCount: number; + postings: AccountPosting[]; +} +//# sourceMappingURL=treasury.d.ts.map \ No newline at end of file diff --git a/packages/types/src/treasury.d.ts.map b/packages/types/src/treasury.d.ts.map new file mode 100644 index 0000000..cc8f16c --- /dev/null +++ b/packages/types/src/treasury.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"treasury.d.ts","sourceRoot":"","sources":["treasury.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/types/src/treasury.js b/packages/types/src/treasury.js new file mode 100644 index 0000000..97f9794 --- /dev/null +++ b/packages/types/src/treasury.js @@ -0,0 +1,5 @@ +/** + * Treasury and subledger account types + */ +export {}; +//# sourceMappingURL=treasury.js.map \ No newline at end of file diff --git a/packages/types/src/treasury.js.map b/packages/types/src/treasury.js.map new file mode 100644 index 0000000..cf17b9d --- /dev/null +++ b/packages/types/src/treasury.js.map @@ -0,0 +1 @@ +{"version":3,"file":"treasury.js","sourceRoot":"","sources":["treasury.ts"],"names":[],"mappings":"AAAA;;GAEG"} \ No newline at end of file diff --git a/packages/utils/src/currency.d.ts b/packages/utils/src/currency.d.ts new file mode 100644 index 0000000..b4c0ef1 --- /dev/null +++ b/packages/utils/src/currency.d.ts @@ -0,0 +1,33 @@ +/** + * Currency conversion and USD equivalent calculation utilities + */ +export interface ExchangeRate { + fromCurrency: string; + toCurrency: string; + rate: number; + effectiveDate: Date; + source?: string; +} +export interface CurrencyConverter { + convert(amount: number, fromCurrency: string, toCurrency: string, date?: Date): number; + getUSDEquivalent(amount: number, currency: string, date?: Date): number; + getRate(fromCurrency: string, toCurrency: string, date?: Date): number | null; +} +/** + * Simple in-memory currency converter with configurable rates + * In production, this would integrate with a real-time FX rate service + */ +export declare class SimpleCurrencyConverter implements CurrencyConverter { + private rates; + private defaultUSDRates; + constructor(initialRates?: ExchangeRate[]); + private initializeDefaultRates; + addRate(rate: ExchangeRate): void; + private getRateKey; + getRate(fromCurrency: string, toCurrency: string, date?: Date): number | null; + convert(amount: number, fromCurrency: string, toCurrency: string, date?: Date): number; + getUSDEquivalent(amount: number, currency: string, date?: Date): number; +} +export declare function getDefaultConverter(): CurrencyConverter; +export declare function setDefaultConverter(converter: CurrencyConverter): void; +//# sourceMappingURL=currency.d.ts.map \ No newline at end of file diff --git a/packages/utils/src/currency.d.ts.map b/packages/utils/src/currency.d.ts.map new file mode 100644 index 0000000..29d94e9 --- /dev/null +++ b/packages/utils/src/currency.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["currency.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACvF,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACxE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;CAC/E;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,eAAe,CAKrB;gBAEU,YAAY,CAAC,EAAE,YAAY,EAAE;IAOzC,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAYjC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAsB7E,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM;IAiBtF,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM;CAMxE;AAID,wBAAgB,mBAAmB,IAAI,iBAAiB,CAKvD;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAEtE"} \ No newline at end of file diff --git a/packages/utils/src/currency.js b/packages/utils/src/currency.js new file mode 100644 index 0000000..03cc80e --- /dev/null +++ b/packages/utils/src/currency.js @@ -0,0 +1,98 @@ +/** + * Currency conversion and USD equivalent calculation utilities + */ +import Decimal from 'decimal.js'; +/** + * Simple in-memory currency converter with configurable rates + * In production, this would integrate with a real-time FX rate service + */ +export class SimpleCurrencyConverter { + rates = new Map(); + defaultUSDRates = { + USD: 1.0, + BRL: 0.2, + EUR: 1.1, + GBP: 1.27, + }; + constructor(initialRates) { + if (initialRates) { + initialRates.forEach((rate) => this.addRate(rate)); + } + this.initializeDefaultRates(); + } + initializeDefaultRates() { + const now = new Date(); + Object.entries(this.defaultUSDRates).forEach(([currency, rate]) => { + if (currency !== 'USD') { + this.addRate({ + fromCurrency: currency, + toCurrency: 'USD', + rate, + effectiveDate: now, + source: 'default', + }); + } + }); + } + addRate(rate) { + const key = this.getRateKey(rate.fromCurrency, rate.toCurrency); + this.rates.set(key, rate); + const inverseKey = this.getRateKey(rate.toCurrency, rate.fromCurrency); + this.rates.set(inverseKey, { + ...rate, + fromCurrency: rate.toCurrency, + toCurrency: rate.fromCurrency, + rate: 1 / rate.rate, + }); + } + getRateKey(fromCurrency, toCurrency) { + return `${fromCurrency}:${toCurrency}`; + } + getRate(fromCurrency, toCurrency, date) { + if (fromCurrency === toCurrency) { + return 1.0; + } + const key = this.getRateKey(fromCurrency, toCurrency); + const rate = this.rates.get(key); + if (!rate) { + if (fromCurrency !== 'USD' && toCurrency !== 'USD') { + const fromToUSD = this.getRate(fromCurrency, 'USD', date); + const usdToTo = this.getRate('USD', toCurrency, date); + if (fromToUSD && usdToTo) { + return fromToUSD * usdToTo; + } + } + return null; + } + return rate.rate; + } + convert(amount, fromCurrency, toCurrency, date) { + if (fromCurrency === toCurrency) { + return amount; + } + const rate = this.getRate(fromCurrency, toCurrency, date); + if (rate === null) { + throw new Error(`No exchange rate available for ${fromCurrency} to ${toCurrency}`); + } + const amountDecimal = new Decimal(amount); + const rateDecimal = new Decimal(rate); + return amountDecimal.mul(rateDecimal).toNumber(); + } + getUSDEquivalent(amount, currency, date) { + if (currency === 'USD') { + return amount; + } + return this.convert(amount, currency, 'USD', date); + } +} +let defaultConverter = null; +export function getDefaultConverter() { + if (!defaultConverter) { + defaultConverter = new SimpleCurrencyConverter(); + } + return defaultConverter; +} +export function setDefaultConverter(converter) { + defaultConverter = converter; +} +//# sourceMappingURL=currency.js.map \ No newline at end of file diff --git a/packages/utils/src/currency.js.map b/packages/utils/src/currency.js.map new file mode 100644 index 0000000..935b27f --- /dev/null +++ b/packages/utils/src/currency.js.map @@ -0,0 +1 @@ +{"version":3,"file":"currency.js","sourceRoot":"","sources":["currency.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/utils/src/dates.d.ts b/packages/utils/src/dates.d.ts new file mode 100644 index 0000000..f52fa64 --- /dev/null +++ b/packages/utils/src/dates.d.ts @@ -0,0 +1,18 @@ +/** + * Date utilities for effective date logic and rolling windows + */ +export declare function isEffectiveDate(date: Date, effectiveDate: Date, expiryDate?: Date): boolean; +export interface RollingWindow { + startDate: Date; + endDate: Date; + days: number; +} +export declare function calculateRollingWindow(referenceDate: Date, windowDays: number): RollingWindow; +export declare function isWithinRollingWindow(date: Date, window: RollingWindow): boolean; +export declare function filterDatesInWindow(dates: Date[], window: RollingWindow): Date[]; +export declare function calculateRetentionExpiry(creationDate: Date, retentionDays: number): Date; +export declare function shouldArchive(creationDate: Date, archivalAfterDays: number, currentDate?: Date): boolean; +export declare function shouldDelete(creationDate: Date, retentionDays: number, currentDate?: Date): boolean; +export declare function formatISO20022Date(date: Date): string; +export declare function formatISO20022DateTime(date: Date): string; +//# sourceMappingURL=dates.d.ts.map \ No newline at end of file diff --git a/packages/utils/src/dates.d.ts.map b/packages/utils/src/dates.d.ts.map new file mode 100644 index 0000000..335d2a0 --- /dev/null +++ b/packages/utils/src/dates.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["dates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,CAQ3F;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,IAAI,EACnB,UAAU,EAAE,MAAM,GACjB,aAAa,CAOf;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,aAAa,GACpB,OAAO,CAKT;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,aAAa,GACpB,IAAI,EAAE,CAER;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,IAAI,EAClB,aAAa,EAAE,MAAM,GACpB,IAAI,CAEN;AAED,wBAAgB,aAAa,CAC3B,YAAY,EAAE,IAAI,EAClB,iBAAiB,EAAE,MAAM,EACzB,WAAW,GAAE,IAAiB,GAC7B,OAAO,CAGT;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,IAAI,EAClB,aAAa,EAAE,MAAM,EACrB,WAAW,GAAE,IAAiB,GAC7B,OAAO,CAGT;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAErD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEzD"} \ No newline at end of file diff --git a/packages/utils/src/dates.js b/packages/utils/src/dates.js new file mode 100644 index 0000000..01b0a4b --- /dev/null +++ b/packages/utils/src/dates.js @@ -0,0 +1,48 @@ +/** + * Date utilities for effective date logic and rolling windows + */ +import { addDays, isAfter, isBefore, isWithinInterval, subDays } from 'date-fns'; +export function isEffectiveDate(date, effectiveDate, expiryDate) { + if (isBefore(date, effectiveDate)) { + return false; + } + if (expiryDate && isAfter(date, expiryDate)) { + return false; + } + return true; +} +export function calculateRollingWindow(referenceDate, windowDays) { + const startDate = subDays(referenceDate, windowDays); + return { + startDate, + endDate: referenceDate, + days: windowDays, + }; +} +export function isWithinRollingWindow(date, window) { + return isWithinInterval(date, { + start: window.startDate, + end: window.endDate, + }); +} +export function filterDatesInWindow(dates, window) { + return dates.filter((date) => isWithinRollingWindow(date, window)); +} +export function calculateRetentionExpiry(creationDate, retentionDays) { + return addDays(creationDate, retentionDays); +} +export function shouldArchive(creationDate, archivalAfterDays, currentDate = new Date()) { + const archivalDate = addDays(creationDate, archivalAfterDays); + return isAfter(currentDate, archivalDate); +} +export function shouldDelete(creationDate, retentionDays, currentDate = new Date()) { + const expiryDate = calculateRetentionExpiry(creationDate, retentionDays); + return isAfter(currentDate, expiryDate); +} +export function formatISO20022Date(date) { + return date.toISOString().split('T')[0]; +} +export function formatISO20022DateTime(date) { + return date.toISOString().split('.')[0]; +} +//# sourceMappingURL=dates.js.map \ No newline at end of file diff --git a/packages/utils/src/dates.js.map b/packages/utils/src/dates.js.map new file mode 100644 index 0000000..30166f5 --- /dev/null +++ b/packages/utils/src/dates.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dates.js","sourceRoot":"","sources":["dates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEjF,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,aAAmB,EAAE,UAAiB;IAChF,IAAI,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,MAAM,UAAU,sBAAsB,CACpC,aAAmB,EACnB,UAAkB;IAElB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACrD,OAAO;QACL,SAAS;QACT,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,UAAU;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAAU,EACV,MAAqB;IAErB,OAAO,gBAAgB,CAAC,IAAI,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,GAAG,EAAE,MAAM,CAAC,OAAO;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,MAAqB;IAErB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,YAAkB,EAClB,aAAqB;IAErB,OAAO,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,YAAkB,EAClB,iBAAyB,EACzB,cAAoB,IAAI,IAAI,EAAE;IAE9B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC9D,OAAO,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,YAAkB,EAClB,aAAqB,EACrB,cAAoB,IAAI,IAAI,EAAE;IAE9B,MAAM,UAAU,GAAG,wBAAwB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAU;IAC3C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAU;IAC/C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"} \ No newline at end of file diff --git a/packages/utils/src/eo-uplift.d.ts b/packages/utils/src/eo-uplift.d.ts new file mode 100644 index 0000000..d66745f --- /dev/null +++ b/packages/utils/src/eo-uplift.d.ts @@ -0,0 +1,31 @@ +/** + * Errors & Omissions (E&O) Uplift calculator + * + * E&O uplift is a +10% exposure buffer applied to transaction amounts + * to account for errors and omissions outside of direct operations. + * + * Treatment: Off-balance-sheet, non-booked risk buffer + */ +import type { EOUplift, TransactionEOUplift, BatchEOUplift } from '@brazil-swift-ops/types'; +export declare const DEFAULT_EO_UPLIFT_RATE = 0.1; +/** + * Calculate E&O uplift for a single transaction + */ +export declare function calculateTransactionEOUplift(baseAmount: number, currency: string, upliftRate?: number, usdEquivalent?: number): TransactionEOUplift; +/** + * Calculate E&O uplift for a batch of transactions + */ +export declare function calculateBatchEOUplift(baseAmount: number, currency: string, transactionCount: number, upliftRate?: number, usdEquivalent?: number): BatchEOUplift; +/** + * Calculate E&O uplift for a simple amount (no transaction context) + */ +export declare function calculateEOUplift(baseAmount: number, upliftRate?: number): EOUplift; +/** + * Apply E&O uplift to an array of transaction amounts + */ +export declare function applyEOUpliftToAmounts(amounts: number[], upliftRate?: number): { + baseAmount: number; + upliftAmount: number; + adjustedExposure: number; +}[]; +//# sourceMappingURL=eo-uplift.d.ts.map \ No newline at end of file diff --git a/packages/utils/src/eo-uplift.d.ts.map b/packages/utils/src/eo-uplift.d.ts.map new file mode 100644 index 0000000..d8416d9 --- /dev/null +++ b/packages/utils/src/eo-uplift.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"eo-uplift.d.ts","sourceRoot":"","sources":["eo-uplift.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE5F,eAAO,MAAM,sBAAsB,MAAO,CAAC;AAE3C;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAA+B,EAC3C,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,CA4BrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,UAAU,GAAE,MAA+B,EAC3C,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,CA4Bf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAA+B,GAC1C,QAAQ,CAaV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,GAAE,MAA+B,GAC1C;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,EAAE,CAS1E"} \ No newline at end of file diff --git a/packages/utils/src/eo-uplift.js b/packages/utils/src/eo-uplift.js new file mode 100644 index 0000000..cab1c7a --- /dev/null +++ b/packages/utils/src/eo-uplift.js @@ -0,0 +1,98 @@ +/** + * Errors & Omissions (E&O) Uplift calculator + * + * E&O uplift is a +10% exposure buffer applied to transaction amounts + * to account for errors and omissions outside of direct operations. + * + * Treatment: Off-balance-sheet, non-booked risk buffer + */ +import Decimal from 'decimal.js'; +export const DEFAULT_EO_UPLIFT_RATE = 0.10; // 10% +/** + * Calculate E&O uplift for a single transaction + */ +export function calculateTransactionEOUplift(baseAmount, currency, upliftRate = DEFAULT_EO_UPLIFT_RATE, usdEquivalent) { + // Use Decimal.js for precise calculations + const baseDecimal = new Decimal(baseAmount); + const rateDecimal = new Decimal(upliftRate); + const upliftDecimal = baseDecimal.mul(rateDecimal); + const adjustedDecimal = baseDecimal.add(upliftDecimal); + const upliftAmount = upliftDecimal.toNumber(); + const adjustedExposure = adjustedDecimal.toNumber(); + // Calculate USD equivalent for uplift if provided + let upliftUsdEquivalent; + if (usdEquivalent !== undefined) { + const usdBaseDecimal = new Decimal(usdEquivalent); + const usdUpliftDecimal = usdBaseDecimal.mul(rateDecimal); + upliftUsdEquivalent = usdBaseDecimal.add(usdUpliftDecimal).toNumber(); + } + return { + transactionId: '', // Will be set by caller + baseAmount, + currency, + upliftRate, + upliftAmount, + adjustedExposure, + usdEquivalent: upliftUsdEquivalent, + treatment: 'off_balance_sheet', + }; +} +/** + * Calculate E&O uplift for a batch of transactions + */ +export function calculateBatchEOUplift(baseAmount, currency, transactionCount, upliftRate = DEFAULT_EO_UPLIFT_RATE, usdEquivalent) { + const baseDecimal = new Decimal(baseAmount); + const rateDecimal = new Decimal(upliftRate); + const upliftDecimal = baseDecimal.mul(rateDecimal); + const adjustedDecimal = baseDecimal.add(upliftDecimal); + const upliftAmount = upliftDecimal.toNumber(); + const adjustedExposure = adjustedDecimal.toNumber(); + // Calculate USD equivalent for uplift if provided + let upliftUsdEquivalent; + if (usdEquivalent !== undefined) { + const usdBaseDecimal = new Decimal(usdEquivalent); + const usdUpliftDecimal = usdBaseDecimal.mul(rateDecimal); + upliftUsdEquivalent = usdBaseDecimal.add(usdUpliftDecimal).toNumber(); + } + return { + batchId: '', // Will be set by caller + baseAmount, + currency, + transactionCount, + upliftRate, + upliftAmount, + adjustedExposure, + usdEquivalent: upliftUsdEquivalent, + treatment: 'off_balance_sheet', + }; +} +/** + * Calculate E&O uplift for a simple amount (no transaction context) + */ +export function calculateEOUplift(baseAmount, upliftRate = DEFAULT_EO_UPLIFT_RATE) { + const baseDecimal = new Decimal(baseAmount); + const rateDecimal = new Decimal(upliftRate); + const upliftDecimal = baseDecimal.mul(rateDecimal); + const adjustedDecimal = baseDecimal.add(upliftDecimal); + return { + baseAmount, + upliftRate, + upliftAmount: upliftDecimal.toNumber(), + adjustedExposure: adjustedDecimal.toNumber(), + treatment: 'off_balance_sheet', + }; +} +/** + * Apply E&O uplift to an array of transaction amounts + */ +export function applyEOUpliftToAmounts(amounts, upliftRate = DEFAULT_EO_UPLIFT_RATE) { + return amounts.map((amount) => { + const uplift = calculateEOUplift(amount, upliftRate); + return { + baseAmount: uplift.baseAmount, + upliftAmount: uplift.upliftAmount, + adjustedExposure: uplift.adjustedExposure, + }; + }); +} +//# sourceMappingURL=eo-uplift.js.map \ No newline at end of file diff --git a/packages/utils/src/eo-uplift.js.map b/packages/utils/src/eo-uplift.js.map new file mode 100644 index 0000000..1961476 --- /dev/null +++ b/packages/utils/src/eo-uplift.js.map @@ -0,0 +1 @@ +{"version":3,"file":"eo-uplift.js","sourceRoot":"","sources":["eo-uplift.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/utils/src/index.d.ts b/packages/utils/src/index.d.ts new file mode 100644 index 0000000..62eb1ad --- /dev/null +++ b/packages/utils/src/index.d.ts @@ -0,0 +1,10 @@ +/** + * @brazil-swift-ops/utils + * + * Shared utilities for the Brazil SWIFT Operations Platform + */ +export * from './currency'; +export * from './dates'; +export * from './validation'; +export * from './eo-uplift'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/utils/src/index.d.ts.map b/packages/utils/src/index.d.ts.map new file mode 100644 index 0000000..6e0f480 --- /dev/null +++ b/packages/utils/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/utils/src/index.js b/packages/utils/src/index.js new file mode 100644 index 0000000..d4b83d0 --- /dev/null +++ b/packages/utils/src/index.js @@ -0,0 +1,10 @@ +/** + * @brazil-swift-ops/utils + * + * Shared utilities for the Brazil SWIFT Operations Platform + */ +export * from './currency'; +export * from './dates'; +export * from './validation'; +export * from './eo-uplift'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/utils/src/index.js.map b/packages/utils/src/index.js.map new file mode 100644 index 0000000..3c3b17f --- /dev/null +++ b/packages/utils/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"} \ No newline at end of file diff --git a/packages/utils/src/validation.d.ts b/packages/utils/src/validation.d.ts new file mode 100644 index 0000000..1f50800 --- /dev/null +++ b/packages/utils/src/validation.d.ts @@ -0,0 +1,35 @@ +/** + * Brazilian ID validation utilities (CPF/CNPJ) + */ +/** + * Validate CPF (Cadastro de Pessoa Física) format and checksum + * CPF format: XXX.XXX.XXX-XX (11 digits) + */ +export declare function validateCPF(cpf: string): { + valid: boolean; + formatted?: string; + error?: string; +}; +/** + * Validate CNPJ (Cadastro Nacional da Pessoa Jurídica) format and checksum + * CNPJ format: XX.XXX.XXX/XXXX-XX (14 digits) + */ +export declare function validateCNPJ(cnpj: string): { + valid: boolean; + formatted?: string; + error?: string; +}; +/** + * Validate Brazilian tax ID (CPF or CNPJ) + */ +export declare function validateBrazilianTaxId(taxId: string): { + valid: boolean; + type?: 'CPF' | 'CNPJ'; + formatted?: string; + error?: string; +}; +/** + * Format tax ID for display (CPF or CNPJ) + */ +export declare function formatTaxId(taxId: string): string; +//# sourceMappingURL=validation.d.ts.map \ No newline at end of file diff --git a/packages/utils/src/validation.d.ts.map b/packages/utils/src/validation.d.ts.map new file mode 100644 index 0000000..dc4246f --- /dev/null +++ b/packages/utils/src/validation.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2C/F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiDjG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAqBA;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD"} \ No newline at end of file diff --git a/packages/utils/src/validation.js b/packages/utils/src/validation.js new file mode 100644 index 0000000..be4fcf7 --- /dev/null +++ b/packages/utils/src/validation.js @@ -0,0 +1,133 @@ +/** + * Brazilian ID validation utilities (CPF/CNPJ) + */ +/** + * Validate CPF (Cadastro de Pessoa Física) format and checksum + * CPF format: XXX.XXX.XXX-XX (11 digits) + */ +export function validateCPF(cpf) { + // Remove non-numeric characters + const cleaned = cpf.replace(/\D/g, ''); + // Check length + if (cleaned.length !== 11) { + return { valid: false, error: 'CPF must have 11 digits' }; + } + // Check for invalid patterns (all same digits) + if (/^(\d)\1{10}$/.test(cleaned)) { + return { valid: false, error: 'CPF cannot have all same digits' }; + } + // Validate checksum digits + let sum = 0; + let remainder; + // Validate first check digit + for (let i = 1; i <= 9; i++) { + sum += parseInt(cleaned.substring(i - 1, i)) * (11 - i); + } + remainder = (sum * 10) % 11; + if (remainder === 10 || remainder === 11) + remainder = 0; + if (remainder !== parseInt(cleaned.substring(9, 10))) { + return { valid: false, error: 'Invalid CPF checksum (first digit)' }; + } + // Validate second check digit + sum = 0; + for (let i = 1; i <= 10; i++) { + sum += parseInt(cleaned.substring(i - 1, i)) * (12 - i); + } + remainder = (sum * 10) % 11; + if (remainder === 10 || remainder === 11) + remainder = 0; + if (remainder !== parseInt(cleaned.substring(10, 11))) { + return { valid: false, error: 'Invalid CPF checksum (second digit)' }; + } + // Format CPF + const formatted = `${cleaned.substring(0, 3)}.${cleaned.substring(3, 6)}.${cleaned.substring(6, 9)}-${cleaned.substring(9, 11)}`; + return { valid: true, formatted }; +} +/** + * Validate CNPJ (Cadastro Nacional da Pessoa Jurídica) format and checksum + * CNPJ format: XX.XXX.XXX/XXXX-XX (14 digits) + */ +export function validateCNPJ(cnpj) { + // Remove non-numeric characters + const cleaned = cnpj.replace(/\D/g, ''); + // Check length + if (cleaned.length !== 14) { + return { valid: false, error: 'CNPJ must have 14 digits' }; + } + // Check for invalid patterns (all same digits) + if (/^(\d)\1{13}$/.test(cleaned)) { + return { valid: false, error: 'CNPJ cannot have all same digits' }; + } + // Validate checksum digits + let length = cleaned.length - 2; + let numbers = cleaned.substring(0, length); + const digits = cleaned.substring(length); + let sum = 0; + let pos = length - 7; + // Validate first check digit + for (let i = length; i >= 1; i--) { + sum += parseInt(numbers.charAt(length - i)) * pos--; + if (pos < 2) + pos = 9; + } + let result = sum % 11 < 2 ? 0 : 11 - (sum % 11); + if (result !== parseInt(digits.charAt(0))) { + return { valid: false, error: 'Invalid CNPJ checksum (first digit)' }; + } + // Validate second check digit + length = length + 1; + numbers = cleaned.substring(0, length); + sum = 0; + pos = length - 7; + for (let i = length; i >= 1; i--) { + sum += parseInt(numbers.charAt(length - i)) * pos--; + if (pos < 2) + pos = 9; + } + result = sum % 11 < 2 ? 0 : 11 - (sum % 11); + if (result !== parseInt(digits.charAt(1))) { + return { valid: false, error: 'Invalid CNPJ checksum (second digit)' }; + } + // Format CNPJ + const formatted = `${cleaned.substring(0, 2)}.${cleaned.substring(2, 5)}.${cleaned.substring(5, 8)}/${cleaned.substring(8, 12)}-${cleaned.substring(12, 14)}`; + return { valid: true, formatted }; +} +/** + * Validate Brazilian tax ID (CPF or CNPJ) + */ +export function validateBrazilianTaxId(taxId) { + const cleaned = taxId.replace(/\D/g, ''); + if (cleaned.length === 11) { + const cpfResult = validateCPF(taxId); + return { + ...cpfResult, + type: cpfResult.valid ? 'CPF' : undefined, + }; + } + else if (cleaned.length === 14) { + const cnpjResult = validateCNPJ(taxId); + return { + ...cnpjResult, + type: cnpjResult.valid ? 'CNPJ' : undefined, + }; + } + return { + valid: false, + error: 'Tax ID must be 11 digits (CPF) or 14 digits (CNPJ)', + }; +} +/** + * Format tax ID for display (CPF or CNPJ) + */ +export function formatTaxId(taxId) { + const cleaned = taxId.replace(/\D/g, ''); + if (cleaned.length === 11) { + return `${cleaned.substring(0, 3)}.${cleaned.substring(3, 6)}.${cleaned.substring(6, 9)}-${cleaned.substring(9, 11)}`; + } + else if (cleaned.length === 14) { + return `${cleaned.substring(0, 2)}.${cleaned.substring(2, 5)}.${cleaned.substring(5, 8)}/${cleaned.substring(8, 12)}-${cleaned.substring(12, 14)}`; + } + return taxId; +} +//# sourceMappingURL=validation.js.map \ No newline at end of file diff --git a/packages/utils/src/validation.js.map b/packages/utils/src/validation.js.map new file mode 100644 index 0000000..8912584 --- /dev/null +++ b/packages/utils/src/validation.js.map @@ -0,0 +1 @@ +{"version":3,"file":"validation.js","sourceRoot":"","sources":["validation.ts"],"names":[],"mappings":"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"} \ No newline at end of file