feat(balance): priced-kind support (#140) #149
4 changed files with 56 additions and 4 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
## [Non publié]
|
## [Non publié]
|
||||||
|
|
||||||
### Ajouté
|
### Ajouté
|
||||||
|
- **Bilan — type coté (quantité × prix unitaire)** (routes `/balance/accounts` et `/balance/snapshot`) : troisième tranche de la feature *Bilan*. Les catégories exposent désormais un sélecteur de *type* à la création : `simple` (saisie d'un montant direct) ou `coté` (`quantité × prix_unitaire`). Les comptes liés à une catégorie cotée exigent un symbole. L'éditeur de snapshot bascule selon le type de la catégorie du compte : les comptes simples conservent leur unique champ de valeur ; les comptes cotés affichent trois champs — `quantité`, `prix unitaire` (les deux obligatoires) et un champ `valeur` en lecture seule calculé en temps réel à partir de `quantité × prix unitaire` (arrondi à 2 décimales). Une étiquette d'attribution `[Manuel]` apparaît sur chaque ligne cotée ; la future étiquette `[via Maximus le AAAA-MM-JJ]` arrivera avec la récupération automatique des prix. Le bouton *Pré-remplir depuis le précédent* copie maintenant les quantités pour les comptes cotés mais laisse les prix unitaires vides (un prix frais doit être saisi à chaque fois). Le service valide les lignes cotées avant la CHECK SQL : invariants de type (les lignes cotées doivent porter à la fois quantité et prix unitaire ; les lignes simples ne doivent porter ni l'un ni l'autre) et invariant de valeur `|valeur − quantité × prix unitaire| ≤ 0,01` (un centime de tolérance pour absorber les arrondis flottants). La suppression d'une catégorie est désormais mieux guardée : une catégorie liée à un ou plusieurs comptes affiche un bandeau d'erreur listant le nombre et jusqu'à trois noms de comptes pour que l'utilisateur sache exactement lesquels archiver d'abord ; les catégories standard restent protégées côté service avec leur bouton désactivé dans l'interface. Nouvelles clés i18n `balance.category.kind.*`, `balance.category.form.kindLabel/kindHint*`, `balance.category.error.has_accounts`, `balance.snapshot.priced.*` (FR + EN) (#140)
|
||||||
- **Bilan — éditeur de snapshot (type simple)** (route `/balance/snapshot`) : deuxième tranche de la feature *Bilan*. La nouvelle page permet de créer ou modifier un snapshot daté de votre patrimoine : choisissez une date (par défaut aujourd'hui), saisissez la valeur de chaque compte actif groupé par catégorie, puis enregistrez. Le mode est piloté par le paramètre `?date=` de l'URL — si un snapshot existe déjà à cette date, la page bascule automatiquement en mode édition (la contrainte UNIQUE sur `balance_snapshots.snapshot_date` garantit un snapshot par jour). La date d'un snapshot existant est immuable : pour la changer, supprimez puis recréez. Un bouton *Pré-remplir depuis le précédent* copie les valeurs du snapshot antérieur le plus récent (comptes simples uniquement — les comptes cotés seront pris en charge quand l'éditeur coté arrivera). Un bouton *Supprimer* affiche une modal de double confirmation qui exige de retaper la date du snapshot avant d'activer l'action destructive. Seules les valeurs de type simple sont acceptées à ce stade (`quantity` et `unit_price` sont laissés `NULL`) ; l'éditeur coté (quantité × prix unitaire + récupération de prix) arrivera dans une prochaine version. Nouveau hook `useSnapshotEditor` (`useReducer` couvrant tout le cycle de vie) et deux nouveaux composants `SnapshotEditor` + `SnapshotLineRow`. i18n FR/EN sous `balance.snapshot.*` (#146)
|
- **Bilan — éditeur de snapshot (type simple)** (route `/balance/snapshot`) : deuxième tranche de la feature *Bilan*. La nouvelle page permet de créer ou modifier un snapshot daté de votre patrimoine : choisissez une date (par défaut aujourd'hui), saisissez la valeur de chaque compte actif groupé par catégorie, puis enregistrez. Le mode est piloté par le paramètre `?date=` de l'URL — si un snapshot existe déjà à cette date, la page bascule automatiquement en mode édition (la contrainte UNIQUE sur `balance_snapshots.snapshot_date` garantit un snapshot par jour). La date d'un snapshot existant est immuable : pour la changer, supprimez puis recréez. Un bouton *Pré-remplir depuis le précédent* copie les valeurs du snapshot antérieur le plus récent (comptes simples uniquement — les comptes cotés seront pris en charge quand l'éditeur coté arrivera). Un bouton *Supprimer* affiche une modal de double confirmation qui exige de retaper la date du snapshot avant d'activer l'action destructive. Seules les valeurs de type simple sont acceptées à ce stade (`quantity` et `unit_price` sont laissés `NULL`) ; l'éditeur coté (quantité × prix unitaire + récupération de prix) arrivera dans une prochaine version. Nouveau hook `useSnapshotEditor` (`useReducer` couvrant tout le cycle de vie) et deux nouveaux composants `SnapshotEditor` + `SnapshotLineRow`. i18n FR/EN sous `balance.snapshot.*` (#146)
|
||||||
- **Bilan — fondations du schéma et page Comptes** (route `/balance/accounts`) : première tranche de la nouvelle feature *Bilan*. La migration SQL v9 introduit 5 tables (`balance_categories`, `balance_accounts`, `balance_snapshots`, `balance_snapshot_lines`, `balance_account_transfers`) avec 7 index et seede 7 catégories standard — Encaisse, CELI, REER, Fonds commun, Autre (type simple) + Action et Cryptomonnaie (type coté). La colonne `currency` est verrouillée à `CAD` via une contrainte CHECK au MVP — le support multi-devises arrivera plus tard. La nouvelle page expose deux onglets : *Comptes* (CRUD complet sur les comptes de l'utilisateur, archivage soft plutôt que suppression dure pour préserver les snapshots historiques) et *Catégories* (renommer une catégorie, créer des catégories de type simple, supprimer celles créées par l'utilisateur — les catégories standard sont protégées). Couverture i18n FR/EN complète sous `balance.*`. Snapshots, transferts, rendements et price-fetching premium arriveront dans les prochaines issues ; pour l'instant la route est accessible directement par URL (pas encore d'entrée sidebar) (#138)
|
- **Bilan — fondations du schéma et page Comptes** (route `/balance/accounts`) : première tranche de la nouvelle feature *Bilan*. La migration SQL v9 introduit 5 tables (`balance_categories`, `balance_accounts`, `balance_snapshots`, `balance_snapshot_lines`, `balance_account_transfers`) avec 7 index et seede 7 catégories standard — Encaisse, CELI, REER, Fonds commun, Autre (type simple) + Action et Cryptomonnaie (type coté). La colonne `currency` est verrouillée à `CAD` via une contrainte CHECK au MVP — le support multi-devises arrivera plus tard. La nouvelle page expose deux onglets : *Comptes* (CRUD complet sur les comptes de l'utilisateur, archivage soft plutôt que suppression dure pour préserver les snapshots historiques) et *Catégories* (renommer une catégorie, créer des catégories de type simple, supprimer celles créées par l'utilisateur — les catégories standard sont protégées). Couverture i18n FR/EN complète sous `balance.*`. Snapshots, transferts, rendements et price-fetching premium arriveront dans les prochaines issues ; pour l'instant la route est accessible directement par URL (pas encore d'entrée sidebar) (#138)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- **Balance sheet — priced kind (quantity × unit price)** (routes `/balance/accounts` and `/balance/snapshot`): third slice of the *Bilan* feature. Categories now expose a *kind* selector at creation: `simple` (direct value entry) or `priced` (`quantity × unit_price`). Accounts linked to a priced category require a symbol. The snapshot editor dispatches on the account's category kind: simple accounts keep their single value field, priced accounts get three inputs — `quantity`, `unit_price` (both required) and a read-only `value` field computed live from `quantity × unit_price` (rounded to 2 decimals). A `[Manual]` / `[Manuel]` attribution tag is shown on each priced row; the future `[via Maximus on YYYY-MM-DD]` tag will land with automatic price-fetching. The *Prefill from previous* button now copies quantities for priced accounts but leaves unit prices blank (a fresh price must be entered each time). The service validates priced lines ahead of the SQL CHECK: kind invariants (priced lines must carry both quantity and unit_price; simple lines must carry neither) and a value-match invariant `|value − quantity × unit_price| ≤ 0.01` (one cent tolerance to absorb floating-point drift). Category deletion now blocks earlier and surfaces a richer error: a category linked to one or more accounts shows a dismissable banner listing the count and up to three account names so the user knows exactly which accounts to archive first; seeded categories remain protected at the service layer with their button disabled in the UI. New i18n keys `balance.category.kind.*`, `balance.category.form.kindLabel/kindHint*`, `balance.category.error.has_accounts`, `balance.snapshot.priced.*` (FR + EN) (#140)
|
||||||
- **Balance sheet — snapshot editor (simple kind)** (route `/balance/snapshot`): second slice of the *Bilan* feature. The new page lets you create or edit a dated snapshot of your balance: pick a date (defaulting to today), enter the value of each active account grouped by category, and save. The mode is driven by the `?date=` query parameter — when a snapshot already exists at that date the page automatically flips into edit mode (the underlying `balance_snapshots.snapshot_date` UNIQUE constraint guarantees one snapshot per day). The date of an existing snapshot is immutable: to change it, delete the snapshot and create a new one. A *Prefill from previous snapshot* button copies values from the most recent earlier snapshot (simple-kind accounts only — priced accounts will be handled when the priced editor lands in a later release). A *Delete* button surfaces a double-confirmation modal that requires retyping the snapshot date before the destructive action is enabled. Only simple-kind values are accepted at this stage (`quantity` and `unit_price` are kept `NULL`); the priced editor (quantity × unit price + price fetch) ships in a later release. New `useSnapshotEditor` hook (scoped `useReducer` covering the full lifecycle) and two new components `SnapshotEditor` + `SnapshotLineRow`. FR/EN i18n under `balance.snapshot.*` (#146)
|
- **Balance sheet — snapshot editor (simple kind)** (route `/balance/snapshot`): second slice of the *Bilan* feature. The new page lets you create or edit a dated snapshot of your balance: pick a date (defaulting to today), enter the value of each active account grouped by category, and save. The mode is driven by the `?date=` query parameter — when a snapshot already exists at that date the page automatically flips into edit mode (the underlying `balance_snapshots.snapshot_date` UNIQUE constraint guarantees one snapshot per day). The date of an existing snapshot is immutable: to change it, delete the snapshot and create a new one. A *Prefill from previous snapshot* button copies values from the most recent earlier snapshot (simple-kind accounts only — priced accounts will be handled when the priced editor lands in a later release). A *Delete* button surfaces a double-confirmation modal that requires retyping the snapshot date before the destructive action is enabled. Only simple-kind values are accepted at this stage (`quantity` and `unit_price` are kept `NULL`); the priced editor (quantity × unit price + price fetch) ships in a later release. New `useSnapshotEditor` hook (scoped `useReducer` covering the full lifecycle) and two new components `SnapshotEditor` + `SnapshotLineRow`. FR/EN i18n under `balance.snapshot.*` (#146)
|
||||||
- **Balance sheet — schema foundation and accounts page** (route `/balance/accounts`): first slice of the upcoming *Bilan* feature. New SQL migration v9 introduces 5 tables (`balance_categories`, `balance_accounts`, `balance_snapshots`, `balance_snapshot_lines`, `balance_account_transfers`) with 7 indexes and seeds 7 standard categories — Cash, TFSA, RRSP, Mutual Fund, Other (simple kind) plus Stock and Crypto (priced kind). The `currency` column is hardcoded to `CAD` via a CHECK constraint at the MVP — multi-currency support will come in a later release. The new accounts page exposes two tabs: *Accounts* (full CRUD over the user's holdings, soft-archive instead of hard delete to preserve historic snapshots) and *Categories* (rename any category, create simple-kind ones, delete user-created ones — seeded categories are protected). The full FR/EN i18n coverage uses keys under `balance.*`. Snapshots, transfers, returns and the price-fetching premium remain to ship in upcoming issues; for now the route is reachable directly via URL (no sidebar entry yet) (#138)
|
- **Balance sheet — schema foundation and accounts page** (route `/balance/accounts`): first slice of the upcoming *Bilan* feature. New SQL migration v9 introduces 5 tables (`balance_categories`, `balance_accounts`, `balance_snapshots`, `balance_snapshot_lines`, `balance_account_transfers`) with 7 indexes and seeds 7 standard categories — Cash, TFSA, RRSP, Mutual Fund, Other (simple kind) plus Stock and Crypto (priced kind). The `currency` column is hardcoded to `CAD` via a CHECK constraint at the MVP — multi-currency support will come in a later release. The new accounts page exposes two tabs: *Accounts* (full CRUD over the user's holdings, soft-archive instead of hard delete to preserve historic snapshots) and *Categories* (rename any category, create simple-kind ones, delete user-created ones — seeded categories are protected). The full FR/EN i18n coverage uses keys under `balance.*`. Snapshots, transfers, returns and the price-fetching premium remain to ship in upcoming issues; for now the route is reachable directly via URL (no sidebar entry yet) (#138)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1488,6 +1488,7 @@
|
||||||
"nameRequired": "Name is required.",
|
"nameRequired": "Name is required.",
|
||||||
"symbol": "Symbol",
|
"symbol": "Symbol",
|
||||||
"symbolPricedHint": "required for priced categories",
|
"symbolPricedHint": "required for priced categories",
|
||||||
|
"symbolRequiredForPriced": "A symbol is required for priced categories.",
|
||||||
"symbolPlaceholderSimple": "Optional",
|
"symbolPlaceholderSimple": "Optional",
|
||||||
"symbolPlaceholderPriced": "e.g. AAPL, BTC-USD",
|
"symbolPlaceholderPriced": "e.g. AAPL, BTC-USD",
|
||||||
"notes": "Notes",
|
"notes": "Notes",
|
||||||
|
|
@ -1517,7 +1518,8 @@
|
||||||
"create": "New category",
|
"create": "New category",
|
||||||
"renamePrompt": "New label for this category",
|
"renamePrompt": "New label for this category",
|
||||||
"deleteConfirm": "Delete this category? This cannot be undone.",
|
"deleteConfirm": "Delete this category? This cannot be undone.",
|
||||||
"deleteSeedHint": "Standard categories cannot be deleted."
|
"deleteSeedHint": "Standard categories cannot be deleted.",
|
||||||
|
"deleteHasAccountsHint": "This category has {{count}} linked account(s) — archive or move them first."
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"createTitle": "New category",
|
"createTitle": "New category",
|
||||||
|
|
@ -1525,9 +1527,15 @@
|
||||||
"keyPlaceholder": "e.g. lira, prpp",
|
"keyPlaceholder": "e.g. lira, prpp",
|
||||||
"label": "Label",
|
"label": "Label",
|
||||||
"labelPlaceholder": "e.g. LIRA, PRPP",
|
"labelPlaceholder": "e.g. LIRA, PRPP",
|
||||||
|
"kindLabel": "Category kind",
|
||||||
|
"kindHintSimple": "Direct value entry (e.g. checking-account balance).",
|
||||||
|
"kindHintPriced": "Quantity × unit price entry (e.g. stocks, crypto). Linked accounts will require a symbol.",
|
||||||
"simpleOnlyNotice": "Priced categories (stocks, crypto) will be available in a future release.",
|
"simpleOnlyNotice": "Priced categories (stocks, crypto) will be available in a future release.",
|
||||||
"create": "Create category"
|
"create": "Create category"
|
||||||
},
|
},
|
||||||
|
"error": {
|
||||||
|
"has_accounts": "Cannot delete this category: {{count}} linked account(s) ({{names}}). Archive or move them first."
|
||||||
|
},
|
||||||
"cash": "Cash",
|
"cash": "Cash",
|
||||||
"tfsa": "TFSA",
|
"tfsa": "TFSA",
|
||||||
"rrsp": "RRSP",
|
"rrsp": "RRSP",
|
||||||
|
|
@ -1559,6 +1567,19 @@
|
||||||
"valuePlaceholder": "0.00",
|
"valuePlaceholder": "0.00",
|
||||||
"valueLabel": "Value for {{account}}"
|
"valueLabel": "Value for {{account}}"
|
||||||
},
|
},
|
||||||
|
"priced": {
|
||||||
|
"quantity": "Quantity",
|
||||||
|
"quantityLabel": "Quantity for {{account}}",
|
||||||
|
"quantityPlaceholder": "0",
|
||||||
|
"unitPrice": "Unit price",
|
||||||
|
"unitPriceLabel": "Unit price for {{account}}",
|
||||||
|
"unitPricePlaceholder": "0.00",
|
||||||
|
"computedValue": "Value (computed)",
|
||||||
|
"computedValueLabel": "Computed value for {{account}}",
|
||||||
|
"computedValuePlaceholder": "—",
|
||||||
|
"attributionManual": "Manual",
|
||||||
|
"attributionManualHint": "Value entered manually. Automatic price fetching will land in a later release."
|
||||||
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Delete this snapshot?",
|
"title": "Delete this snapshot?",
|
||||||
"body": "This permanently deletes the snapshot dated {{date}} and all its lines. To confirm, retype the date below.",
|
"body": "This permanently deletes the snapshot dated {{date}} and all its lines. To confirm, retype the date below.",
|
||||||
|
|
@ -1578,7 +1599,11 @@
|
||||||
"snapshot_date_taken": "A snapshot already exists at that date — edit it instead of creating a new one.",
|
"snapshot_date_taken": "A snapshot already exists at that date — edit it instead of creating a new one.",
|
||||||
"snapshot_not_found": "Snapshot not found.",
|
"snapshot_not_found": "Snapshot not found.",
|
||||||
"snapshot_value_invalid": "An entered value is not a valid number.",
|
"snapshot_value_invalid": "An entered value is not a valid number.",
|
||||||
"snapshot_priced_unsupported": "Priced accounts (stocks/crypto) will be supported in a future release."
|
"snapshot_priced_unsupported": "Priced accounts (stocks/crypto) will be supported in a future release.",
|
||||||
|
"snapshot_priced_quantity_required": "Quantity is required for priced accounts.",
|
||||||
|
"snapshot_priced_unit_price_required": "Unit price is required for priced accounts.",
|
||||||
|
"snapshot_priced_value_mismatch": "The entered value does not match quantity × unit price.",
|
||||||
|
"snapshot_simple_must_be_scalar": "A simple value must not carry quantity or price."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1488,6 +1488,7 @@
|
||||||
"nameRequired": "Le nom est obligatoire.",
|
"nameRequired": "Le nom est obligatoire.",
|
||||||
"symbol": "Symbole",
|
"symbol": "Symbole",
|
||||||
"symbolPricedHint": "obligatoire pour cette catégorie cotée",
|
"symbolPricedHint": "obligatoire pour cette catégorie cotée",
|
||||||
|
"symbolRequiredForPriced": "Un symbole est obligatoire pour les catégories cotées.",
|
||||||
"symbolPlaceholderSimple": "Optionnel",
|
"symbolPlaceholderSimple": "Optionnel",
|
||||||
"symbolPlaceholderPriced": "ex. AAPL, BTC-USD",
|
"symbolPlaceholderPriced": "ex. AAPL, BTC-USD",
|
||||||
"notes": "Notes",
|
"notes": "Notes",
|
||||||
|
|
@ -1517,7 +1518,8 @@
|
||||||
"create": "Nouvelle catégorie",
|
"create": "Nouvelle catégorie",
|
||||||
"renamePrompt": "Nouveau libellé pour cette catégorie",
|
"renamePrompt": "Nouveau libellé pour cette catégorie",
|
||||||
"deleteConfirm": "Supprimer cette catégorie ? Cette action est irréversible.",
|
"deleteConfirm": "Supprimer cette catégorie ? Cette action est irréversible.",
|
||||||
"deleteSeedHint": "Les catégories standard ne peuvent pas être supprimées."
|
"deleteSeedHint": "Les catégories standard ne peuvent pas être supprimées.",
|
||||||
|
"deleteHasAccountsHint": "Cette catégorie a {{count}} compte(s) lié(s) — archivez ou déplacez-les d'abord."
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"createTitle": "Nouvelle catégorie",
|
"createTitle": "Nouvelle catégorie",
|
||||||
|
|
@ -1525,9 +1527,15 @@
|
||||||
"keyPlaceholder": "ex. ferr, rpdb",
|
"keyPlaceholder": "ex. ferr, rpdb",
|
||||||
"label": "Libellé",
|
"label": "Libellé",
|
||||||
"labelPlaceholder": "ex. FERR, RPDB",
|
"labelPlaceholder": "ex. FERR, RPDB",
|
||||||
|
"kindLabel": "Type de catégorie",
|
||||||
|
"kindHintSimple": "Saisie d'un montant direct (ex: solde de compte courant).",
|
||||||
|
"kindHintPriced": "Saisie d'une quantité × prix unitaire (ex: actions, cryptomonnaies). Un symbole sera obligatoire pour les comptes liés.",
|
||||||
"simpleOnlyNotice": "Les catégories cotées (actions, crypto) seront disponibles dans une prochaine version.",
|
"simpleOnlyNotice": "Les catégories cotées (actions, crypto) seront disponibles dans une prochaine version.",
|
||||||
"create": "Créer la catégorie"
|
"create": "Créer la catégorie"
|
||||||
},
|
},
|
||||||
|
"error": {
|
||||||
|
"has_accounts": "Impossible de supprimer cette catégorie : {{count}} compte(s) lié(s) ({{names}}). Archivez ou déplacez-les d'abord."
|
||||||
|
},
|
||||||
"cash": "Encaisse",
|
"cash": "Encaisse",
|
||||||
"tfsa": "CELI",
|
"tfsa": "CELI",
|
||||||
"rrsp": "REER",
|
"rrsp": "REER",
|
||||||
|
|
@ -1559,6 +1567,19 @@
|
||||||
"valuePlaceholder": "0,00",
|
"valuePlaceholder": "0,00",
|
||||||
"valueLabel": "Valeur pour {{account}}"
|
"valueLabel": "Valeur pour {{account}}"
|
||||||
},
|
},
|
||||||
|
"priced": {
|
||||||
|
"quantity": "Quantité",
|
||||||
|
"quantityLabel": "Quantité pour {{account}}",
|
||||||
|
"quantityPlaceholder": "0",
|
||||||
|
"unitPrice": "Prix unitaire",
|
||||||
|
"unitPriceLabel": "Prix unitaire pour {{account}}",
|
||||||
|
"unitPricePlaceholder": "0,00",
|
||||||
|
"computedValue": "Valeur (calculée)",
|
||||||
|
"computedValueLabel": "Valeur calculée pour {{account}}",
|
||||||
|
"computedValuePlaceholder": "—",
|
||||||
|
"attributionManual": "Manuel",
|
||||||
|
"attributionManualHint": "Valeur saisie manuellement. La récupération automatique des prix arrivera dans une prochaine version."
|
||||||
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"title": "Supprimer ce snapshot ?",
|
"title": "Supprimer ce snapshot ?",
|
||||||
"body": "Cette action supprime définitivement le snapshot du {{date}} et toutes ses lignes. Pour confirmer, retapez la date ci-dessous.",
|
"body": "Cette action supprime définitivement le snapshot du {{date}} et toutes ses lignes. Pour confirmer, retapez la date ci-dessous.",
|
||||||
|
|
@ -1578,7 +1599,11 @@
|
||||||
"snapshot_date_taken": "Un snapshot existe déjà à cette date — modifiez-le au lieu d'en créer un nouveau.",
|
"snapshot_date_taken": "Un snapshot existe déjà à cette date — modifiez-le au lieu d'en créer un nouveau.",
|
||||||
"snapshot_not_found": "Snapshot introuvable.",
|
"snapshot_not_found": "Snapshot introuvable.",
|
||||||
"snapshot_value_invalid": "Une valeur saisie n'est pas un nombre valide.",
|
"snapshot_value_invalid": "Une valeur saisie n'est pas un nombre valide.",
|
||||||
"snapshot_priced_unsupported": "Les comptes cotés (actions/crypto) seront supportés dans une prochaine version."
|
"snapshot_priced_unsupported": "Les comptes cotés (actions/crypto) seront supportés dans une prochaine version.",
|
||||||
|
"snapshot_priced_quantity_required": "La quantité est obligatoire pour les comptes cotés.",
|
||||||
|
"snapshot_priced_unit_price_required": "Le prix unitaire est obligatoire pour les comptes cotés.",
|
||||||
|
"snapshot_priced_value_mismatch": "La valeur saisie ne correspond pas à quantité × prix unitaire.",
|
||||||
|
"snapshot_simple_must_be_scalar": "Une valeur simple ne doit pas comporter de quantité ou de prix."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue