feat(balance): service securities + save snapshot detaille (holdings) #212

Closed
opened 2026-06-04 01:36:42 +00:00 by maximus · 0 comments
Owner

Couche service du detail par titre : CRUD securities, ecriture transactionnelle ligne agregee + holdings, validation kind-aware, gain latent.

Fichiers concernes

  • src/services/balance.service.ts
  • src/shared/types/index.ts

Depends on

Criteres d acceptation

  • findOrCreateSecurity (UPSERT sur symbol normalise), listSecurities, getSecurity, updateSecurity
  • saveSnapshotAtomic/upsertSnapshotLines : compte detailed -> ligne agregee (value=somme) + holdings dans le meme BEGIN/COMMIT (lastInsertId, recompute value)
  • value agregee = somme des holdings ARRONDIS AU CENT, comparaison exacte (pas de tolerance flottante) [decision ce soir]
  • validateDetailedSnapshot (detailed+holdings => qty/price NULL + value=somme ; detailed sans holdings = pre-pivot tolere) ; validateLineKindInvariants inchange pour simple
  • Garde service : kind detailed->simple rejete (erreur typee) si des holdings existent
  • getHoldingsForLatestSnapshot (titres+qty+book_cost reportes, qty 0 exclus) ; listHoldingsBySnapshotLine
  • computeUnrealizedGain (value-book_cost, % sur book_cost, garde-fou book_cost=0 -> N/A)
  • Tests unitaires de chaque fonction ; npm test vert

Review caveats

  • TECH (rouge, RESOLU): saveSnapshotAtomic n a aujourd hui aucune conscience des holdings — DELETE+INSERT holdings dans la txn, recompute value, test de rollback.
  • SEC (jaune, RESOLU): arrondi au cent (decision ce soir) au lieu d une tolerance 0.01 scalee.
  • ARCH (jaune): agregateurs existants getSnapshotTotalsBy* inchanges — ne pas les modifier.

Decisions prises ce soir

  • (ce soir) Invariant : arrondir chaque holding au cent avant de sommer, comparaison exacte.
  • (spec) book_cost saisi direct par position ; gain latent = value - book_cost.

Spec source

spec-plan-bilan-detail-titres.md (+ spec-decisions-bilan-detail-titres.md)

Couche service du detail par titre : CRUD securities, ecriture transactionnelle ligne agregee + holdings, validation kind-aware, gain latent. ## Fichiers concernes - src/services/balance.service.ts - src/shared/types/index.ts ## Depends on - #210 ## Criteres d acceptation - [ ] findOrCreateSecurity (UPSERT sur symbol normalise), listSecurities, getSecurity, updateSecurity - [ ] saveSnapshotAtomic/upsertSnapshotLines : compte detailed -> ligne agregee (value=somme) + holdings dans le meme BEGIN/COMMIT (lastInsertId, recompute value) - [ ] value agregee = somme des holdings ARRONDIS AU CENT, comparaison exacte (pas de tolerance flottante) [decision ce soir] - [ ] validateDetailedSnapshot (detailed+holdings => qty/price NULL + value=somme ; detailed sans holdings = pre-pivot tolere) ; validateLineKindInvariants inchange pour simple - [ ] Garde service : kind detailed->simple rejete (erreur typee) si des holdings existent - [ ] getHoldingsForLatestSnapshot (titres+qty+book_cost reportes, qty 0 exclus) ; listHoldingsBySnapshotLine - [ ] computeUnrealizedGain (value-book_cost, % sur book_cost, garde-fou book_cost=0 -> N/A) - [ ] Tests unitaires de chaque fonction ; npm test vert ## Review caveats - TECH (rouge, RESOLU): saveSnapshotAtomic n a aujourd hui aucune conscience des holdings — DELETE+INSERT holdings dans la txn, recompute value, test de rollback. - SEC (jaune, RESOLU): arrondi au cent (decision ce soir) au lieu d une tolerance 0.01 scalee. - ARCH (jaune): agregateurs existants getSnapshotTotalsBy* inchanges — ne pas les modifier. ## Decisions prises ce soir - (ce soir) Invariant : arrondir chaque holding au cent avant de sommer, comparaison exacte. - (spec) book_cost saisi direct par position ; gain latent = value - book_cost. ## Spec source spec-plan-bilan-detail-titres.md (+ spec-decisions-bilan-detail-titres.md)
maximus added this to the overnight-2026-06-05-bilan-detail-titres milestone 2026-06-04 01:36:42 +00:00
maximus added the
status:ready
type:feature
source:human
labels 2026-06-04 01:36:42 +00:00
maximus added
status:review
and removed
status:ready
labels 2026-06-06 17:17:16 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-06-06 19:38:46 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#212
No description provided.