Default rules
When a value is missing, blank, unreadable or unknown, the solution does not always stop: it uses a value or a fallback behaviour instead (a currency, a frequency, a calculation convention, another curve). This page lists every such rule in the import, the curves, the cash flow calculation, the balance-sheet projection, the reporting and the application.
The principle is that no default is silent: every rule is applied, documented here, and reported by a coded warning (WARNING, effect FLAG, see the Anomaly reference), grouped per file or per run with the number of deals concerned. Every rule has its code and its entry; only the calculation conventions, applied to every deal, have no warning.
How to read the tables. Data names the field or value concerned, Condition the case where the rule applies, Value used what the solution does instead. Reported by gives:
- the code of the warning that reports the rule, linked to its entry in the Anomaly reference: message, cause, consequence for the figures and what to do (the level is given when it is not
WARNING). Several related rules may share one code; - convention for a calculation assumption applied to every deal, documented without a warning.
Where the warnings are shown
A warning is shown in one of three places, depending on what it depends on:
- the anomaly log of the import, the run or the reporting (
Import AnomaliesandCalculation Logstabs, and their Excel export), for a rule that depends on the stored data alone. It is evaluated once, when the solution stores the engine’s result, and listed once per code and reference: metrics without a row for the reference scenario (RUN-018) or deals sharing a reference (RUN-021) in the run’s log; ALCO pack without a ledger reconciliation (RPT-061) or without a behavioural view (RPT-062) in the reporting’s; ledger lines left out (RPT-063) and postes with several classification lines (RPT-064) in the import’s. Imports, runs and reportings stored before this version are not recomputed: their log does not carry these codes; - a warnings banner above the result, for a rule that also depends on what you ask for (projection, reference scenario, comparison generation): on the metrics, the
Gapstab and its report, theReconciliationsub-tab and theInformations de la situationslot of the guided import. It gives one line per code with the number of occurrences, the message and the link to the code’s entry. One click folds it, and it does not appear when there is nothing to report; - a notification before the download, which stays until closed, with the same lines and links: the solution checks, with the parameters chosen, what the file will meet (ALCO pack and its preview, gap as Excel, CSV or parquet, metrics export), shows it, then the download follows. The same notification follows a save that closes the screen (a curve of the curve editor, a classification referential created).
1. Import: files and parsers
Reading the archive, the deal files, the classification and the balance (Import: processing and conversions, Crédit Logement import).
1.1 Archive, format and cells
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Portfolio reference | missing from the situation information | ‘default_reference’ | IMP-029 |
| Portfolio name | missing from the situation information | ‘default_name’ | IMP-030 |
| Amount / number (any numeric text cell) | text with a single separator followed by three digits, ambiguous (‘1.234’ or ‘1,234’) | read as a decimal (1,234) rather than thousands (1234): decimal forms are tried before grouped forms | IMP-031 |
| Integer (classification: Sign column) | missing or empty cell | 0 | IMP-032 |
| Classification booleans (financial transaction, modelled asset, gross value, notional, EVE, NIM, rate-sensitive, MV) | missing or empty cell | false | IMP-033 |
| Accounting balance date | Excel date cell earlier than 31/12/1910 | null (date missing) | IMP-034 |
| Accounting balance date | cell neither Date nor text (number: Excel serial of a formula, boolean…) or null cell | null (date missing), line kept | IMP-035 |
| Rate type (TR/TF) | value neither ‘tr’/‘taux revisable’ nor ‘tf’/‘taux fixe’, or not text | not applied: no importer reads this column | none (IMP-036 retired) |
| Line of a delimited text file (balance .txt/.csv) | line shorter than the first line (trailing columns missing) | missing columns filled with an empty string | IMP-037 |
| Line of a delimited text file | line longer than the first line | extra columns ignored | IMP-038 |
| Text file separator | none of ; tab , | on the first line, or a tie in frequency | ‘;’ (or the first in the list ; tab , | in case of a tie) | IMP-039 |
| Header of a delimited text file | two columns have the same name (after lower-casing/NFD) | the last column overwrites the previous one | IMP-040 |
| Archive files | name containing ‘~’, ‘.ds_store’ or ‘_macos’ (anywhere in the name) | file removed from the import | IMP-041 |
| File role given by the import request (guided import) | the name given for a role does not exist in the archive | the role falls back to detection by file name | IMP-044 |
| File role given by the import request | several files listed for a single-file role | the first listed wins (putIfAbsent); the following ones are not deals either | IMP-045 |
| Archive file without a role in the request | the request gives roles but not to this file | role inferred from the name; failing that, read as a deal file | IMP-046 |
| Summary of a guided-import file | exception while building the summary | file validated without a summary | IMP-047 |
| Data format of the client configuration | configuration without dataFormat | format inferred from the client label (‘credit logement’ -> CREDIT_LOGEMENT) | IMP-049 |
| info_*.json file of the archive | present in the archive, while the arrêté comes from the import screen or the request | file ignored: neither read nor taken for a deal file | IMP-060 |
1.2 Deals
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| CSV deal file | read error part-way through the file | the rows read so far are kept, the rest is lost | TRX-003 (ERROR) |
| Excel deal file | read error part-way through the workbook | the deals read so far are kept | TRX-004 (ERROR) |
| Deal: currency | empty cell or no ‘Currency’ column (swap and security extracts) | EUR | TRX-046 |
| Deal: product | file name containing ‘securities’ | product SECURITY whatever the products mapping of the Instrument Type | TRX-047 |
| Deal: required tags (dataMapping.tags) | tag column missing from the extract | deal imported without that tag | TRX-048 |
| Security: margin of a fixed / coupon of a floating | empty or non-numeric cell | 0 %, without a warning | TRX-049 |
| Security: Instrument Type (for the direction) | instrumentType key not mapped | read under the isin key | TRX-050 |
| Deal reference | empty reference cell | reference ‘<prefix>_null’ (e.g. ‘LO_null’), deal kept | TRX-051 |
| Any cell read as text (reference, counterparty, currency, rate label, frequency…) | numeric cell (Double) | integer part (intValue); above 2 147 483 647 capped at that value | TRX-052 |
| Interest mode (loan, term deposit) read from the instrument type | non-empty instrument type that does not contain ‘capitalise’ | simple interest (SIMPLE) | TRX-053 |
| Reference rate label (index) | empty cell | no index; a floating deal is valued at its current rate | TRX-054 |
| Rate base tenor (*Tenor column) | *Tenor key not mapped, column missing, empty cell or unreadable tenor (‘ACTUAL’, free text) | lookup on the label alone (curve of the bare label) | TRX-055 |
| Rate label (fixed-rate deal) | label missing from dataMapping.indexes | no index, label kept | TRX-020 |
| Rate label (floating deal, deal file validated on its own) | label missing from dataMapping.indexes and curves unknown | no index | TRX-021 |
| Rate label (floating deal) | label missing from dataMapping.indexes but equal (case-insensitive) to a curve name | the label is used as the index | TRX-022 |
| Rate label (floating deal) | label missing from dataMapping.indexes and from every curve | no index: valued at the current rate, insensitive to shocks | TRX-023 |
| Deal direction (Borrow or Invest) | cell neither BORROWING nor INVESTMENT | BUY | TRX-024 |
| Deal direction (Borrow or Invest) | ‘nature’ key not mapped, or empty cell / missing column | direction inferred from the instrument type (CAT * = investment, Emprunt * = borrowing; specific rules for securities and repos) | TRX-027 |
| Deal direction | direction missing and instrument type not recognised | BUY | TRX-025 |
| Interest rate (floating loan, term deposit) | rate of 0 on a FLOATING deal | fixing unknown (null): the current coupon is read from the curve | CFW-072 |
| Remaining notional (Remaining Face Value) | remainingNominal key not mapped or empty cell | original notional | TRX-056 |
| Remaining notional | remaining notional different from the original notional (or original empty) | deal booked on the remaining notional (0 included) | TRX-029 |
| Rate repricing frequency (repricingPeriod) | unrecognised value (e.g. daily) | repricing period not set | TRX-057 |
| Numeric cell of a deal (amount, rate, margin) | missing or empty cell | null | TRX-058 |
| Deal dates (trade, settlement, maturity, call…) | text date or Excel serial earlier than 01/01/1950 | null (date missing) | TRX-059 |
| Deal dates | empty cell (key mapped, column present) | null | TRX-060 |
| Deal text dates | ambiguous dd/mm or mm/dd date (e.g. ‘01/02/2025’) | read day first (1 February); mm/dd format only if dd/mm fails | TRX-061 |
| Deal dates as an Excel serial (numeric formula cell) | numeric cell | read as an Excel 1900-system serial, time ignored; the workbook’s 1904 flag is ignored | TRX-062 |
| Payment frequency | empty or non-text cell | null (then yearly for loans and deposits) | TRX-063 |
| Interest calculation basis (day count convention) | empty cell | ‘default’ entry of dataMapping.rateBase | TRX-064 |
| Counterparty (name) | empty cell | counterparty ‘DEFAULT_NAME’ | TRX-065 |
| Counterparty type and rating | always (no column read) | type RETAIL, rating ‘A’ on the ‘A’ scale | TRX-066 |
| Rate type of a swap leg (Pay/Rec Fixed/Floating) | key not mapped, empty cell or value neither FIXED nor FLOATING | FLOATING if the leg names a rate label, FIXED otherwise | TRX-067 |
| Swap leg | leg declared FLOATING without a rate label | valued at its current rate | TRX-030 |
| Swap leg | leg declared FIXED that names a rate label | booked fixed, index removed, label kept | TRX-031 |
| Day count convention of a swap leg | empty column, business day rule (FOLLOWING, ACTUAL DATE…) or unrecognised value | market convention: EUR fixed 30/360, EUR floating EURIBOR/€STR/EONIA ACT/360, otherwise rateBase.default | TRX-028 |
| Margin of a swap leg | empty cell | null spread | TRX-068 |
| Schedule of a swap leg | always; first payment date more than 4 days off the schedule | schedule rolled backward from maturity (stub at the start), first payment date ignored | TRX-032 |
| Swap trade date | dealDate key not mapped or empty cell | settlement date | TRX-069 |
| Coupon rate of a security (couponRate) | empty or non-numeric cell | 0 % | TRX-034 |
| Coupon margin of a security (couponMarginRate) | empty or non-numeric cell | 0 % | TRX-035 |
| Call date of a security | callDate empty | issuer call date (issuerCallDate), exercised with certainty | TRX-070 |
| Call date of a security | callDate and issuerCallDate both set and different | the earlier one | TRX-033 |
| Currency of a repo | always (no column read) | EUR | TRX-071 |
| Rate of a repo (two legs) | always | FIXED rate, spread 0 | TRX-072 |
| Rate of a repo (interestRate, rateLeg1) | empty cell | null rate | TRX-058 |
| Interest payment frequency of a loan | empty or non-text cell | yearly (YEAR) | TRX-073 |
| Margin of a loan / term deposit (interestMargin) | empty cell | null spread | TRX-068 |
| Liquidity and commercial margins of a loan | key not mapped, missing column or empty cell | null: the context liquidity spread applies | TRX-074 |
| Liquidity curve of a loan | key not mapped or empty cell; label not mapped | no curve of its own (null) | TRX-075 |
| Payment frequency of a term deposit | instrument type containing ‘capitalise’ | payment at maturity (AT_MATURITY), whatever the frequency in the file | TRX-076 |
| Payment frequency of a term deposit | empty or non-text cell | yearly (YEAR) | TRX-073 |
1.3 Classification
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Classification: FINREP code (mapping_compta_irrbb) | name not recognised by FinrepEnum | the category has no FINREP code; its deals drop out of the reporting | CLS-005 |
| Classification: FINREP code (side / Row Code) | balance sheet side or Row Code inconsistent with the FINREP code | the FINREP row is discarded: category without a FINREP code, deals excluded from the reporting | CLS-006 (ERROR) |
| Classification: accounting category | category ‘<Bilan> <Contrepartie>’ missing from mapping_compta_irrbb | lines built with a null FINREP code; deals excluded from the reporting | CLS-010 |
| Classification: hedge role (column 3 of mapping_compta_irrbb) | empty cell, missing column or short row | UNSPECIFIED on a derivative row | CLS-020 |
| Classification: hedge role | value that is not a HedgeRole | UNSPECIFIED | CLS-007 |
| Hedge role of a deal | no classification / no FINREP code, or a non-derivative FINREP code | NONE, even if the category declares a role | CLS-021 |
| Classification: account number (mapping_compta, histo) | numeric cell with a decimal part | truncated to an integer (intValue) | CLS-022 |
| Classification: ‘histo’ sheet (deal -> account) | sheet missing | no explicit mapping; all deals go through the instrument mapping | CLS-023 |
| histo sheet: deal account | account not declared in mapping_compta | row ignored; the deal falls back to the instrument mapping | CLS-012 |
| histo sheet: duplicate deal | deal listed several times on the same account | first occurrence kept | CLS-013 |
| histo sheet: deal on two accounts | deal listed on two different accounts | mapping removed; the deal falls back to the instrument mapping | CLS-014 (ERROR) |
| Balance sheet side of a ‘<Bilan> <Contrepartie>’ category | category starting with no known balance sheet word | null (side unknown) | CLS-024 |
1.4 Balance, run-off and prefixed cash flows
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Prefixed cash flow file (sheet) | several sheets carry a cash flow header | only the first sheet in alphabetical order is read | BAL-003 |
| Prefixed cash flow file (sheet) | no sheet carries a header (‘Deal No’ / ‘action_dt’) | the first sheet in alphabetical order is read | BAL-004 |
| Prefixed cash flow file (header row) | no header row recognised | data read from row 3 onwards (historical position) | BAL-004 |
| Prefixed cash flows: deal number | numeric cell with a decimal part | truncated to an integer (intValue) | BAL-014 |
| Prefixed cash flows: base rate frequency | empty cell | no repricing frequency (null) | BAL-015 |
| Modelled balance line: account | always (line attached to a run-off strategy) | classified on the strategy prefix (reference without ‘*’), not on its own account | convention |
| Modelled balance line: currency | always (the balance has no currency column) | EUR | BAL-016 |
| Modelled balance line: counterparty | always | counterparty ‘DEFAULT’, type CORPORATE | BAL-017 |
| Modelled balance line: direction and dates | always | BUY; trade and settlement dates = reference date | convention |
| Modelled balance line: classification | classification file unusable | modelled line without a FINREP code | CLS-018 |
| Run-off strategy: account prefix | same prefix listed several times | the first strategy is applied, the others ignored | BAL-012 |
| Run-off strategy: overlapping prefixes | an account matches several prefixes | the longest prefix wins | BAL-013 |
| Accounting balance line | account not covered by any run-off strategy | line ignored (no modelled transaction) | BAL-018 |
| Ledger account: type | neither the classification nor accountingMapping gives it a type | counted as a balance sheet account (to be covered by deals or a strategy) | BAL-011 |
2. Curves
Building the curves at import and reading rates during the calculation (Rate curves).
2.1 At import
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Discount index | neither a dataMapping.indexes key nor a curve name | the raw label is kept as the index | CRV-003 (ERROR) |
| Curve file (sheet) | several sheets with a curve header | only the first sheet in alphabetical order is read | CRV-005 |
| Curve file (xlsx): row | fewer than 8 filled cells | row ignored (neither header nor point) | CRV-019 |
| Curve point (xlsx): ratedate | empty cell or not date-typed (text, number) | date missing (null); the curve is keyed ‘<name>_null’ | CRV-020 |
| Curve point | same index, same date, same maturity duplicated | the last value read overwrites the previous ones | CRV-021 |
| Curve: currency | points of the same index/date with different currencies | currency of the first point read | CRV-022 |
| Curve: refixing period | the index name carries no maturity (EURIBOR, TEC2…) | null; downstream 3 months (RateCurveHelper DEFAULT_FIXING_PERIOD) | CRV-023 |
| Curve: quoted instrument | index name without ‘SWAP’ | MONEY_MARKET | convention |
| Curve: quotation (dataMapping.curveQuotations) | curve not listed | null, read as a zero-coupon rate | CRV-024 |
| Curve: date | more than 50 days from the reference date | curve used anyway | CRV-011 |
| Liquidity spread curve | always (the file does not provide one) | flat EUR LIQUIDITY_SPREAD curve at 0 (1d, 1m, 10y) | CRV-025 |
| Compound curve | one of the leaf curves missing from the file | compound curve not built | CRV-012 (ERROR) |
| Compound curve: leaf date | several dates for a leaf index | date closest to the reference date; the most recent if the reference date is unknown | CRV-026 |
| Compound curve: points shared by two leaves | a maturity present in two leaves below their thresholds | the leaf with the longest threshold overwrites the value of the shorter one | CRV-027 |
| Compound curve: currency | always | EUR, whatever the currencies of the leaves | CRV-028 |
2.2 During the calculation
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Rate read from a curve | maturity before the first point or beyond the last point of the curve | flat extrapolation: rate of the first (resp. last) point | CFW-059 |
| Single-point rate curve | the curve carries only one pillar | constant rate across all maturities | CFW-060 |
| Maturity read from the curve | negative number of days (target date before the curve date) | rate 0 | convention |
| Curve of an index (reference date) | several curves for the same index, or none at the evaluation date | curve whose date is closest to the evaluation date (before or after), the first in the list in case of a tie; flagged only beyond 10 days | CFW-057 |
| FX curve (pair) | no pivot/currency curve | inverse currency/pivot curve used as is; first FX curve of the pair if several | convention |
| FX curve / liquidity spread curve | several FX curves for the same pair, or several LIQUIDITY_SPREAD curves for the same currency | the first in the list is taken | CFW-061 |
| Curve quotation (PAR/ZERO) | quotation missing | curve read as zero-coupon (no bootstrap) | CRV-024 |
| Instrument of a PAR curve pillar | instrument not set for the tenor (or instrument map missing) | money market up to 365 days, swap beyond | CFW-062 |
| Missing yearly discount factor (PAR bootstrap) | year before the first swap pillar with no money market point at that number of days | money market rate linearly interpolated in days, flat beyond the money market points (e.g. 1y = 12m rate extended from 360 to 365 d) | convention |
| Missing yearly swap pillar (PAR bootstrap) | year between two swap pillars, or before the first swap pillar beyond the money market points | par rate linearly interpolated in years between pillars; before the first pillar, the first pillar’s par rate extended flat | CFW-063 |
| Curve currency (IRRBB shock calibration) | currency missing or outside the 11 calibrated currencies (EUR, USD, GBP, JPY, CHF, CAD, AUD, SEK, SGD, HKD, CNY) | EUR shock sizes (parallel 200 bp, short 250 bp, long 100 bp) | CFW-064 |
| Curve type (RATE/FX/LIQUIDITY_SPREAD) | type missing | curve carried over unshocked in all scenarios | CFW-065 |
| Shocked PAR curve | the base curve cannot be bootstrapped | no shocked zero curve stored; the read then fails (CFW-048) | CFW-066 |
| Liquidity spread read from the LIQUIDITY_SPREAD curve | the curve read fails (empty curve, date before its reference date, null date) | liquidity spread 0 | CFW-067 |
| Date of the discounted cash flow | cash flow on or before the evaluation date | discount factor 1 | convention |
| Refixing period of a floating index (cash flows without a schedule: run-off tranches) | index name without a recognised tenor and curve without refixingPeriod | quarterly refixing assumed: next fixing at the next calendar quarter end | CFW-041 |
| Tenor of a floating index (LAST_FIXING mode) | index name without a recognised tenor and curve without refixingPeriod | 3-month tenor to read the index’s “current rate” | CFW-068 |
| Tenor of a floating index | always (before the curve’s refixingPeriod) | tenor inferred by substring of the name: estr/eonia/o/n -> 1d, ‘12m’ or ‘1y’ -> 12m, ‘6m’, ‘3m’, ‘1m’ | CFW-069 |
| Next fixing date (cash flows without a schedule) | tenor 1d/1m/3m/6m/12m | end of the next calendar month / quarter / half-year / year, next day for overnight; other tenor: evaluation date + tenor | convention |
3. Cash flows and projection
Cash flow generation per deal, balance-sheet projection and solvency calculations.
3.1 Cash flows per deal
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Any BigDecimal of a cloned deal (rate, spread, amounts) | null value at cloning (new production, balance sheet repricing) | 0 | CFW-070 |
| Product of a cash flow | null product | ‘ALL’ | convention |
| Total interest amount (GLOBAL component) | globalAmount null | 0 | CFW-071 |
| Discount factor of a cash flow | discount curve cannot be read (index missing, rate <= -100 %, empty curve…) | cash flow kept without a discount factor (null) | CFW-024 (ERROR) |
| Floating rate (index) | index empty / not mapped (no curve to read) | coupon valued at the deal’s current rate (rate.value, 0 if missing), insensitive to shocks, CERTAIN coupon | CFW-031 |
| Current fixing of a floating rate (rate.value) | value null or equal to 0 | fixing treated as unknown: the current coupon is read from the curve (forward from the evaluation date) | CFW-072 |
| Start of a floating coupon period | start missing, earlier than the evaluation date or not earlier than the end | forward read from the evaluation date to the end of the period (no historical fixing) | convention |
| Rate projection mode (EngineParameterModel.rateProjectionMode) | parameters or mode missing from the request | FORWARD | convention |
| Last known rate (LAST_FIXING mode) | UNCERTAIN floating coupon | prefixing line covering the evaluation date, otherwise the deal’s fixing, otherwise the index’s current rate on the scenario curve (+ scenario shock on the first two) | convention |
| Rate spread / margin | spread missing | 0 | CFW-073 |
| Rate calculation basis (day count) | basis missing | EXACT_365 for reading the forward; elsewhere an NPE (deal rejected CFW-004) | CFW-074 |
| Rate of a deposit (no schedule) | rate missing | FIXED rate 0 %, EXACT_365, simple interest | CFW-014 |
| Rate of a term product (bullet loan, term deposit) | rate missing | principal cash flows issued, interest omitted | CFW-015 |
| Rate of a repo / reverse repo | rate missing, without a type, or FIXED without a value (empty ‘Interest Rate’ cell) | principal cash flows issued, interest omitted | CFW-016 |
| Coupon of a term product or a repo | the coupon rate cannot be evaluated (no curve, empty curve, invalid date…) | coupon omitted, deal kept; one WARNING per skipped coupon naming the deal and the period | CFW-090 (no curve for the index), CFW-091 (other causes) |
| Floating coupon of a swap leg | forward cannot be evaluated | coupon omitted, the leg and the deal are kept | CFW-017 (ERROR) |
| Rate of a fixed swap leg (rate.value) | value missing | no rate assumed: the swap is left out of the calculation | CFW-089 (ERROR) |
| Current fixing of a floating swap leg | rate.value set | ignored: the current coupon is read from the curve | CFW-076 |
| Call date of a swap | call date before maturity | coupons after the call removed and final notional at the call, including in the CONTRACTUAL view; no broken coupon at the call | convention |
| Repricing date of the floating notional | no CERTAIN coupon (forward start, new production) | end of the first upcoming coupon; no coupon: contractual maturity date | CFW-022 |
| Cash flow rate (type) | rate missing or without a type | CERTAIN interest cash flow (not shocked) | CFW-077 |
| Certainty of a floating-rate run-off tranche | next fixing date cannot be determined (curve not found…) | UNCERTAIN cash flow | CFW-028 (ERROR) |
| Rate of a cash flow returned by the behavioural script | the script sets no rate | deposit rate | convention |
| NMD behavioural script parameters | always | outflow_period_in_days = 100, frequency_in_days = 5 (constants) | convention |
| Behavioural script result | the script does not return a ScriptCashflowResult | no behavioural cash flow, no message | CFW-078 |
| Behavioural script function | function name missing | ‘main’ | convention |
| Run-off strategy of a deposit | several strategies for the same product and the same origin | the first in the list | CFW-079 |
| Tranche of a bucket-based run-off law | bucket falling on or before the evaluation date (e.g. ‘0d’) | deposit: tranche ignored (neither principal nor interest); accounting balance: principal ignored but a zero interest cash flow issued | CFW-080 |
| Last tranche of a linear run-off | horizon not a multiple of the frequency | tranche cut at the horizon; shares rounded to 4 decimals, the last absorbs the remainder | convention |
| Schedule of an amortising loan | always | schedule built from the start date + number of instalments × periodicity; the loan’s maturity date is ignored | convention |
| Behavioural view of an amortising loan | always (no prepayment parameter read) | BEHAVIOURAL cash flows identical to the contractual cash flows (no prepayment) | convention |
| Call date (term product, repo, security) | call date on or after maturity | call ignored, contractual maturity used | CFW-081 |
| Coupon schedule (term product, backward swap) | rolling the periodicity does not move forward | loop stopped, remaining coupons omitted | CFW-082 |
| Interest periodicity of a repo | always | single interest paid at maturity; security leg ignored | convention |
| Premium / discount of a security | premium missing | initial cash flow at notional | convention |
| Interest amount / reference principal of a coupon | amount not computed (null) | 0 | CFW-083 |
| IRRBB bucket of a date | date earlier than the evaluation date | first bucket (overnight) | convention |
| Prefixing line of a CERTAIN cash flow | no line for the deal | curve rate | CFW-039 |
| Prefixing lines of a deal | several lines for the deal | prefixing ignored, curve rate | CFW-040 (ERROR) |
| Base rate frequency of a prefixing line | frequency missing | line ignored, curve rate | CFW-084 |
| Prefixing line | target date beyond action date + frequency | line not used, curve rate | convention |
| Transaction reference (prefixing matching key) | null reference or without a ‘_<deal>’ segment | no prefixing | CFW-085 |
3.2 Balance-sheet projection
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Maturity of a deal (constant / growing balance sheet) | maturity missing | deal not rolled over | CFW-086 |
| Repricing curve of a fixed-rate roll | rate without an index, or index without a curve in the context | discount curve of the context | CFW-087 |
| Rate of a fixed-rate roll | roll market rate unreadable | original rate kept | CFW-050 |
| Commercial margin of a fixed-rate roll | always (origination curve unavailable) | margin = client rate - BASELINE curve rate at the evaluation date for the same term | convention |
| Rate of the replacement of a fixed-rate amortising loan | term cannot be computed (start date, number of instalments or periodicity missing, AT_MATURITY) | original rate kept (no repricing) | convention |
| Principal cash flow to replace (constant balance sheet) | cash flow without a rate | not replaced | CFW-088 |
3.3 Solvency and pricing
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Counterparty turnover (solvency) | missing | 10 000 for the exposure class (hence SME if CORPORATE); 5 M for the correlation (neutral size adjustment) | RUN-010 |
| Loan type (solvency, RETAIL counterparty) | missing | RETAIL_OTHER | convention |
| LGD (solvency) | always (no data read) | 10 % for every loan | convention |
| Number of instalments of an amortising loan (Basel maturity) | missing | 0 instalments -> maturity 0 years | RUN-011 |
| Conversion of EAD / RWA into the pivot currency | always | fixing 1: pivot amount = amount in the original currency | convention |
| Product other than loans (solvency) | no risk parameter generator | no risk profile, no message | RUN-012 |
| Preferred pricing model (pricer API) | missing from the preferences | first registered pricer (Black-Scholes) | convention |
| Basel risk profile of a transaction | the Basel engine cannot compute it (SolvencyException or unsupported product) | transaction missing from the result, status PROCESSED | RUN-012 |
4. Reporting
Run settings, IRRBB reporting, carrying amount and EBA templates (Generate IRRBB reports).
4.1 Run settings
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Requested scenarios (runSettings.scenarios) | list missing (or runSettings missing) | base + all regulatory shocks + UP_1_BP | convention |
| Post-shock floor (runSettings.postShockFloor) | value missing | floor enabled | convention |
4.2 IRRBB reporting and templates
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| List of requested templates (reportingTemplates) | list missing or empty in the request | all 13 templates J 01.00 to J 11.02 are produced | RPT-029 |
| Cash flow generation status | generation ended in ERRORS but with a list of cash flows | the reporting is produced anyway on the available (possibly incomplete) cash flows | RPT-002 (ERROR) |
| FINREP classification of the deal | deal without a classification or category without a FINREP code; or cash flow of a deal missing from the portfolio | the deal and all its cash flows are excluded from the whole report (J 01.00 - J 07.00, per-transaction metrics, carrying amount) | RPT-004 |
| Transaction reference | two transactions of the portfolio share the same reference | the first is used to classify the cash flows (FINREP, NMD overnight, derivative, maturity); the second is ignored for these lookups | RPT-030 |
| Own funds (capitalAmount, additional data of the situation) | key missing, null or equal to 0 (a non-numeric value is refused on input) | capital = null; J 01.00 ratios on rows 0020 and 0110 are left empty | RPT-005 |
| Non-maturity deposit (NMD) in the contractual view J 05.00 - J 07.00 (.a) | DepositModel product that is not a TermDepositModel, CONTRACTUAL origin | the principal is placed in the overnight bucket (1 day) whatever the configured run-off law; its interest is not broken down | RPT-031 |
| Floating rate repricing period (repricingPeriod) | floating leg without a repricing period (or AT_MATURITY) and without an interest cash flow with a period > 366 days (or without period dates) | the leg is classified ‘floating’ (repricing ≤ 1 year) in the ITS sense, hence in the floating block of J 05.00 - J 07.00 and outside the ‘of which fixed rate’ rows of J 02.00 | RPT-032 |
| Cash flow rate (rate / rate type) | cash flow without a rate model, or rate type neither FIXED nor FLOATING | the cash flow is neither fixed nor floating: it is missing from both J 05.00 - J 07.00 blocks (notional, yield, maturity, schedule) and from the ‘of which fixed rate’ rows of J 02.00; it stays in EVE, NII and market value, and is not reclassified (no figure changes): one aggregated WARNING per currency with the number of deals and their principal, the deals in its details | RPT-033 |
| EVE / NII / MV per FINREP row and scenario | no cash flow on a FINREP row (or no cash flow for a scenario of the context) in a computed currency | 0 for every FINREP row and every scenario (all FinrepEnum rows are filled) | convention |
| Accrual period of an interest cash flow (periodStartDate) | start date missing, or start not earlier than the end | payment date rule: the coupon counts in full in the NII if it falls within the horizon, otherwise not at all (no pro rata) | RPT-034 |
| Evaluation date of the per-transaction metrics | always (multiple contexts) | the evaluation date of the first context is used for all scenarios | convention |
| Cash flow scenario | cash flow without a scenario | the cash flow is ignored in aggregated EVE / NII / MV (matches no context) | RPT-035 |
| Carrying amount of the deal (carryingAmount) | carrying amount missing (DEAL source) | the deal contributes 0 to column 0010 of its row | RPT-007 |
| Modified duration (J 02.00 - J 04.00 col. 0020) | UP_1_BP scenario not computed, base EVE missing or zero | cell left empty | RPT-036 |
| Contractual maturity (J 05.00 col. 0060 / 0310) | maturity unknown (balance run off by law, transaction missing, amortising loan without a start date / number of instalments / period) | the cash flow is excluded from the numerator and denominator of the weighted average maturity | RPT-008 |
| Contractual maturity of a non-maturity deposit | DepositModel product that is not a TermDepositModel | maturity = 1/365 year (overnight) in the weighted average maturity J 05.00 col. 0060 / 0310 | convention |
| Cash flow amount | amount or value missing | 0 in the notional and the schedule of J 05.00 - J 07.00 | RPT-037 |
| Swap cash flow detail (cashFlowDetail, leg type) | detail empty or missing | leg = ““: all legs of the swap are merged into one; only the last principal exchange counts, if positive | RPT-038 |
| Weighted average yield (J 05.00 col. 0050 / 0300) | position without an interest cash flow in the block; or no rate at all | falls back on the rate carried by its principal cash flows; without a rate, the position is excluded (weight included); cell empty if no position is left | RPT-039 |
| Effective rate of the cash flow (effectiveRate) | effective rate missing | the nominal rate of the rate model (rate.value) is used | RPT-040 |
| Repricing bucket of the cash flow (adjustedTimeBucket) | adjusted bucket missing | the payment date bucket (timeBucket) is used | RPT-041 |
| Carrying amount source (carryingAmountSource) | key missing or empty | BALANCE if the situation has an accounting balance and a classification, otherwise DEAL (deal notional) | RPT-012 |
| Carrying amount source (carryingAmountSource) | BALANCE requested but no balance or no classification | falls back on DEAL: column 0010 = deal notional | RPT-010 |
| Carrying amount source (carryingAmountSource) | DEAL explicitly requested | column 0010 = deal notional (without accrued interest, premiums, discounts; off-balance-sheet swap counted at notional) | RPT-011 |
| Carrying amount source (carryingAmountSource) | value neither BALANCE nor DEAL | value ignored, default applied (BALANCE if available, otherwise DEAL) | RPT-009 |
| Accounting balance line (account, balance) | account or balance missing | line ignored for the carrying amount | RPT-042 |
| Accounting balance currency | always (the CL balance has no currency column) | the whole balance is counted in EUR; deals in other currencies have no carrying amount (column 0010 empty on their sheet) | RPT-014 |
| Balance account typed PNL / OBS / DERIVATIVE | account not covered by the classification and typed off-balance-sheet by the accountingMapping; or covered, typed PNL, without a FINREP row | account excluded from the carrying amount | RPT-043 |
| Balance account | no classification line covers it and the accountingMapping does not type it off-balance-sheet | account excluded from the carrying amount | RPT-015 |
| Accounting category of the account (classification) | the classification line has no FINREP row | account excluded from the carrying amount | RPT-016 |
| Account classified on a FINREP row but typed PNL | Bilan of the classification line = PNL, FINREP row set, category not off-balance-sheet | account excluded from the carrying amount of its row | RPT-017 |
| Carrying amount of an off-balance-sheet row (OBS / DERIVATIVE) | FINREP row fed only by off-balance-sheet accounts | 0 in column 0010 (off-balance-sheet is used only for the reconciliation) | convention |
| Classification line of an account (longest prefix) | several lines have the same accounting category (same prefix length) | the first line encountered wins | RPT-044 |
| Sign of an account according to the FINREP row | row that is neither L_ nor MEMORANDUM_L_ (assets, off-balance-sheet, other derivatives) | the balance is taken with its sign (debit positive); reversed only on liability rows | convention |
| Account type (Bilan of the classification line) | Bilan value missing or not recognised as an AccountType | no type: the account is treated as a balance sheet account | RPT-045 |
| Ledger account of a CL contract (instrument mapping) | no histo account, nor one for the exact instrument type | falls back on the account of the sub-family listing the instrument, then on that of the product family | RPT-046 |
| Instrument / family mapping key | two keys identical up to case and spaces | the first one encountered in the (non-deterministic) order of the map wins | RPT-047 |
| Starred account (9431**): asset type, counterparty | the starred account covers several classification lines (same FINREP row) | asset type and counterparty of the first line (sorted by category); hedge role null if the lines differ | RPT-048 |
| Template datapoint | the computation throws a NullPointerException (view map not populated, currency missing) | null value: empty cell, counted as unmapped | RPT-025 |
| Template datapoint | no value computed or declared | cell left empty (not 0) | RPT-025 |
| Sheet currency | no currency in any view (report without figures) | a single sheet, in EUR | convention |
| Sheet name per currency | multi-currency report | the first currency in alphabetical order takes the original unsuffixed sheet; the others go into ‘<feuille>_<DEV>’ copies | convention |
| Declared answer (EBA code) J 10 / J 11 | EBA code missing from the template’s ‘ei…’ lists | answer ignored, falls back on the computed value (empty for J 10 / J 11) | RPT-026 |
| Position of a DPM datapoint on the sheet | DPM row or column code not found in the sheet headers | the value is not written, and not counted as unmapped | RPT-049 |
| IRRBB declarations / NMD parameters (additional data) | additional data missing, or irrbbDeclarations / nmdParameters keys missing | no declaration: J 08 / J 09 (shares, PTR) and J 10 / J 11 stay empty | RPT-050 |
| Declaration key (irrbbDeclarations, nmdParameters, sub-keys) | value that is not a JSON object | key ignored (empty map) | RPT-019 |
| Qualitative answer J 10 / J 11 | non-text value, or empty/blank text | answer ignored, empty cell | RPT-020 |
| NMD category (nmdParameters key) | key that is not RETAIL_TRANSACTIONAL, RETAIL_NON_TRANSACTIONAL, WHOLESALE_NON_FINANCIAL or WHOLESALE_FINANCIAL (case-sensitive) | category ignored | RPT-018 |
| NMD parameter (behaviouralShare, coreShare, exemptedShare, operationalShare, PTR) | non-numeric value (e.g. text “0.6”) | null: the matching J 08 / J 09 cell stays empty; a non-numeric PTR is removed | RPT-051 |
| Per-currency answers J 10.02 / J 11.02 | no answer for the sheet’s currency | sheet left empty | RPT-052 |
| Sign of liability rows J 02.00 - J 07.00 | rows 0200-0520 and 0610-0640, EVE/NII/MV columns (levels and Δ) and repricing schedules | engine value negated (liabilities shown positive); J 01.00, column 0010, column 0020, row 0530 and rows 0540-0560 untouched | convention |
| DPM row J 02.00 - J 07.00 | row code without a matching FinrepEnum | empty cell | RPT-025 |
| Δ EVE / NII / MV (J 01.00, J 02.00 - J 04.00) | base value or shocked value missing | empty cell (not the shocked level) | RPT-025 |
| Memo rows 0540-0560 (net positions) | no included FINREP row has a value for the currency | 0 | convention |
| Carrying amount of a J 02.00 - J 04.00 row (col. 0010) | the currency has carrying amounts but none on the row | 0 | convention |
| % bought / sold optionality / behavioural modelling (J 05.00 col. 0020-0040, 0270-0290) | always (not modelled) | empty cells | RPT-025 |
| Notional J 05.00 - J 07.00 (col. 0010 / 0260) | no position on the row, including when the currency has no notional detail (.a sheet, or currency present only in the carrying amount) | 0 | RPT-053 |
| Repricing schedule J 05.00 - J 07.00 (col. 0070-0250, 0320-0390) | no cash flow in the bucket, or no data for the currency | 0 | convention |
| Average yield of a J 05.00 parent row (col. 0050 / 0300) | a child classification has a notional but no yield | it is left out, notional included: the row’s yield is that of the classifications that have one | RPT-065 |
| Average maturity of a J 05.00 parent row (col. 0060 / 0310) | a classification has a maturity for only part of its cash flows | it weighs with its whole notional: the part without a maturity gets the average of the covered part | RPT-008 |
| Notional of an NMD category (J 08 / J 09 col. 0010) | the currency has carrying amounts but none on the category’s FINREP row | 0 (and hence 0 for the ‘of which’ rows if a share is declared) | convention |
| Declared shares and NMD PTR (J 08 / J 09) | category not declared, share or PTR of a scenario missing | empty cell | RPT-025 |
| Worst Δ EVE / NII (J 01.00 rows 0010, 0100) and ratios 0020, 0110 | no base value, or no SOT scenario computed for the currency | empty cells | RPT-066 |
| Shock sizes per currency (J 01.00 rows 0180-0200) | currency without regulatory calibration in IrrbbScenario | EUR shock sizes (200 / 250 / 100 bp) | RPT-056 |
5. Application (risk-app)
Values the application uses when a request, a situation or a screen states nothing: run launch, gap, ALCO pack, ledger reconciliation, guided import, curves and classification.
| Data | Condition | Value used | Reported by |
|---|---|---|---|
| Simulation assumptions (runSettings) | runSettings missing from the generation request (or official IRRBB run) | Balance sheet evolution of the import, all regulatory scenarios, no custom shock, post-shock floor active (defaults applied by risk-engine according to the risk-model contract) | RUN-013 |
| Scenario list (runSettings.scenarios) | runSettings present but scenarios null (not sent) | All regulatory scenarios are computed (an empty list is rejected, null is not) | RUN-014 |
| Post-shock floor (runSettings.postShockFloor) | Field missing / null | true: shocked rates are floored at the regulatory floor | RUN-015 |
| Floating rate projection mode (rateProjectionMode) | Field missing from the generation request | FORWARD (projection on the forward curve), stored on the generation and sent to the engine | RUN-016 |
| Generation type / scenario (GenerationRequestDto.type) | Field missing or blank | No default: the launch (simulation or official run) is refused with a 400 error (error.validation on type), nothing is stored |
none (request refused) |
| Own funds (additional data capitalAmount) | Empty value; a non-numeric value (e.g. 250k, 1.000.000) is refused when saved (a 400 error quoting it), only a value entered before this check can still be one |
Key removed from the data sent to the engine (J 01.00 ratios on rows 0020/0110 left empty); text normalised: spaces and non-breaking spaces removed, decimal comma converted to a point | RPT-005 |
| Additional data of a new situation (specificData) | Creation of a situation (zip upload or guided draft) | Map initialised with capitalAmount = null (no own funds value) | RPT-005 |
| Update of a situation (specificData and flags) | Null field in the PUT /tasks/{id} request | The stored value is kept (MapStruct IGNORE strategy) | convention |
| Ledger account typing (dataMapping.accountingMapping) | Situation without a client configuration, or configuration without dataMapping / accountingMapping | null accountingMapping sent to the engine: the balance accounts are typed only by the classification | BAL-011 |
| Type of a balance account (balance sheet screen) | No accountingMapping key covers the account (or mapping missing) | Type shown as ‘NO_MAPPING’ | BAL-011 |
| Currency of the gap figures (pivot currency) | The generation / context gives no pivot currency (gap_pivot_currency null) | EUR | RPT-057 |
| Projection used by the gap (origin) | origin missing or null in the gap request | CONTRACTUAL | RPT-058 |
| Gap type (gapType) | Field missing | RATE (refixing dates) rather than LIQUIDITY (contractual dates) | convention |
| Gap cumulation direction (cumulativeDirection) | Field missing | BACKWARD (remaining outstanding), not the FORWARD cumulation of a liquidity gap | convention |
| Gap ‘rate-sensitive only’ filter | filter.rateSensitiveOnly missing | false: all positions, rate-sensitive or not | convention |
| Gap date window (startDate / endDate) | One or both bounds missing | No bound: the whole projection is taken | convention |
| Comparison generation of the gap report (compareTo) | compareTo missing | Latest generation of the same client configuration, same scenario/type, whose situation date is earlier | RPT-059 |
| Gap variation after hedging per band | The previous generation has no amount for the band | Previous amount taken as 0: the variation equals the current gap | convention |
| Amount of a row of the Excel gap report per band | Row without an amount for the band (or null amounts) | 0 written in the cell | convention |
| Reference scenario of the EVE/NII deltas (reference) | Parameter missing from /metrics | BASELINE | convention |
| Metrics projection (origin) | Parameter missing from /metrics, /metrics/export or the per-transaction metrics | BEHAVIOURAL | convention |
| EVE / NII / market value deltas of a transaction | The transaction has no row for the reference scenario | Deltas left null (no error) | RUN-018 |
| A deal’s NII (12 months), on screen and in exports (earnedNii, deltaEarnedNii) | The calculation recorded no NII decision for the deal | “—” on screen with a message asking to run the calculation again; empty value in exports | convention |
| Metrics exported to parquet (eve, deltaEve, earnedNii, deltaEarnedNii, wholeLifeInterest, oneYearCashInterest, deltaWholeLifeInterest, marketValue, marketValueOneYear, deltaMarketValue) | Null value (not computed, no reference row) | empty value (null), no longer 0; only the deltas of the reference row are 0, their true value |
none (no default: the value stays empty; RUN-019 retired) |
| Maturity date shown with the metrics | Several transactions share the same reference in the generation | The maturity of the first transaction read is used | RUN-021 |
| Cash flows returned by the engine | The transaction reference of a group of cash flows matches no transaction of the portfolio/generation | The cash flows are ignored (not stored); one warning per run gives their number and a sample of the references | RUN-020 |
| Linking cash flows to their transaction | Two transactions of the generation have the same reference | All cash flows of that reference are linked to the first transaction | RUN-021 |
| Evaluation date of the returned contexts | No date, or several distinct dates in the contexts of the response | The generation is stored as is (PROCESSED); only a log.error is written | RUN-022 |
| Cash flow export (CSV/Excel/parquet) | No origin filter (nor certainty, nature, scenario, rate type, bucket) | All cash flows, CONTRACTUAL and BEHAVIOURAL projections mixed | convention |
| Reporting evaluation date | Creation of a reporting | Reference date of the situation at launch time | convention |
| Result of a reporting older than risk-model 0.242.0 | reporting_result without per-origin views (views null) | Result hidden (null): the reporting appears ‘not computed’ | RPT-060 |
| Accounting reconciliation tolerance (ALCO pack and screen) | tolerance parameter missing (screen); always for the ALCO pack | 1 unit of the ledger currency | convention |
| Accounting reconciliation section of the ALCO pack | No linked import, or reconciliation failed (situation not processed, etc.) | Pack generated without the reconciliation section | RPT-061 |
| EVE / NII / carrying amount figures of the ALCO pack | Always | Only the BEHAVIOURAL view is read; a null value is omitted (not 0) | RPT-062 |
| ALCO pack parameters (format, language, template, comparison) | Parameters missing | PDF, French, report-renderer default template, no ‘previous date’ columns (no automatic comparison) | convention |
| Balance line (reconciliation) | Account or amount missing | Line ignored in the reconciliation | RPT-063 |
| Accounting item of a balance line | No item (classification or accountCode of a position) covers the account | The account becomes its own item (status NOT_MODELLED or LEDGER_ONLY depending on the scope) | convention |
| Item of a position (accountCode) | Position without a classification or without an accountCode | Position grouped under an empty item, shown last | convention |
| ALM amount of a position (principal) | Product without a readable principal (unsupported type, swap without leg 1, null value) | Position excluded from the ALM sum, counted in withoutAmountCount | convention |
| Classification line of an item | Several classification lines for the same item | The first one is used | RPT-064 |
| Limits of the situation information: portfolioName, portfolioReference (100), context reference composed with the configuration’s client (100), pivotCurrency (3) | Value longer than its column | Form or request refused (400 error) before the engine; an API archive whose context reference is too long becomes a FAIL task; a missing portfolioReference counts as the text ‘null’ (4 characters) that risk-engine will write into the context reference | IMP-005, IMP-007 (ERROR) |
| Imported portfolio | No transaction returned by the engine | Import DONE with an empty portfolio | IMP-028 |
| Level of an anomaly returned by the import | Anomaly without a level | Counted as ERROR in the task count | IMP-050 |
| Discount index (discountFactorIndex) | The value entered is a client label (dataMapping.indexes key) and not a curve index | Replaced by the curve index the label is mapped to; leading/trailing spaces removed | IMP-054 |
| Discount index of an imported archive | no index chosen, neither on the screen nor in situation.json | the configuration’s default index for the pivot currency (discountFactorIndexes) | convention |
| Configuration of a complete archive (configuration.json) | no configuration chosen on import | same id, version and content; else same mapping, at its latest version; else a new “<name> (importée le …)” | convention |
| Abandoned guided-import drafts | No activity for application.import.draft-purge.retention-days | 30 days; draft and files deleted every night at 03:00 | convention |
| Maximum duration of a generation or reporting in PROCESSING | No response from the engine within application.generation.stuck-timeout | 2 hours; the generation is set to ERRORS | RUN-009 (ERROR) |
| Counterparty type | Counterparty unknown to the tenant when saving imported or generated transactions | Counterparty created with type CORPORATE | TRX-077 |
| Hedge role of a deal (hedgeRole) | Deal created by hand (DealRequestDto carries no hedgeRole); update of a deal | NONE at creation; unchanged on update | convention |
| Residual maturity of a deal (years) | No maturity, or unreadable linear strategy horizon | null (sorted last); otherwise days / 365 from the portfolio reference date | convention |
| Curve quotation (quotation) | Missing at creation; missing on update | Creation: read as ZERO (zero-coupon rate); update: the existing quotation is kept | CRV-024 |
| Curve refixing period (refixingPeriod) | Update of a curve | The existing value is carried over; a curve created in the editor never has one | CRV-029 |
| Instruments quoted by a curve | Update without instruments | Existing instruments kept for the maturities still present, the others removed | convention |
| Columns 4 to 12 of mapping_compta (Opération financière, Actif modélisé, Gross Carrying Amount, Nominal, EVE, MNI, Sensible taux, Signe, MV) | Classification generated from a referential (zip import with classificationId or linked draft) | Empty cells, read by the engine as false / 0 for every account | CLS-025 |
| Hedge role of a classification category | Referential category without a hedgeRole | Empty cell in the generated workbook; the engine keeps UNSPECIFIED on hedging derivatives, NONE elsewhere | CLS-020 |
| histo lines of a referential | histoAccounts missing (null) from a referential update | The existing lines are kept (and re-checked) | convention |
| Anomalies of a solvency computation | Engine response with errors | Errors not stored; only the status is kept | RUN-023 |
Summary
| Domain | Rules | Reported | Conventions |
|---|---|---|---|
| Import: files and parsers | 100 | 98 | 2 |
| Curves | 34 | 28 | 6 |
| Cash flows and projection | 56 | 35 | 21 |
| Reporting | 66 | 52 | 14 |
| Application (risk-app) | 63 | 39 | 24 |
| Total | 319 | 252 | 67 |