4.6 KiB
4.6 KiB
| name | description | type |
|---|---|---|
| Session 36 complete | Session 36 (09-10/04/2026) — 36A-36H, reminders, revision fix, navigation fix, lot split deliveryDate | project |
Session 36 (09-10/04/2026) — complete
SPEC-36A: Comparaison revision smeta — detail lots services
- compareSpecItems() compare pieces individuelles dans specData par categorie
- Detecte QTY_CHANGED, PRICE_CHANGED, UNIT_CHANGED, ADDED, REMOVED
- SPEC_DETAIL_CATEGORIES etendu : +LASER_TUBE, +TUBE_BENDING
- Endpoint PATCH /revision/:revId/recalculate
Lot fixes (TLT/laser)
- PurchaseLot.requirementId rendu nullable
- splitLots() ne skip plus items sans requirementId
- createTlt() enrichit items JSON avec requirementIds
SPEC-36B: Blizhaishie platezhi — vraies donnees
- Remplace CashflowEntry par POInstallment + PaymentRequest
- 7 colonnes, lignes cliquables, tags statut colores
Bug fournisseur — Decimal serialise en string
- discountPercent Decimal(5,2) → string "3" → Zod rejetait
- Fix: Number(s.discountPercent) dans initEditValues()
- Piege: 2 modules fournisseur, frontend utilise /supplier-database
SPEC-36C: Revert PO CONFIRMED → DRAFT
- Methode unconfirm() : verifie CONFIRMED, bloque si paidAt, rejette PR PENDING/APPROVED
- Route PATCH /:id/unconfirm restreinte DIRECTION_FIN/ADMIN
- Frontend: bouton UndoOutlined avec Popconfirm dans drawer PO
- paymentStatus remis a null (type String?)
Fix lot split — quantite vs montant
- openSplitModal() utilisait totalAmount (argent) comme fallback au lieu de la quantite d'articles
- Fix: getTotalItemQty() somme items[].quantity depuis le PO
SPEC-36E: Refonte backend lotissement — detail par ligne
- PurchaseLotLine model : join N-N entre PurchaseLot et PurchaseOrderLine
- splitLots() reecrit : accept {orderDate, items:[{poLineId,quantity}]}
- Validation 100% : chaque PO line integralement repartie (tolerance 0.01)
- deliveryDays auto depuis TenderOffer du fournisseur
- listLots() inclut lotLines avec poLine detail
SPEC-36E-FIX: Backfill items JSON → PurchaseOrderLine
- Endpoint POST /backfill-lines (idempotent) — 12 POs migrés
- createFromTender() cree PurchaseOrderLine (single + multi-batch)
- createTlt() cree PurchaseOrderLine
SPEC-36F: Modal lotissement PO plein ecran
- LotSplitModal.tsx (~190L) extrait de PurchaseOrdersTab
- Table matricielle : lignes PO (rows) × lots (colonnes dynamiques)
- InputNumber par cellule, DatePicker orderDate/deliveryDate
- Auto-calcul deliveryDate depuis orderDate + deliveryDays
- Colonne Controle : Tag vert 100% / Tag rouge allocated/total
- Ancien modal inline supprime de PurchaseOrdersTab
SPEC-36D: Reminders paiements (notifications echeances)
- PaymentRemindersService : scan POInstallment non payes
- Notifications J-3 (NORMAL), J-1 (HIGH), J-0 (URGENT), overdue (URGENT)
- notifyRole ACHETEUR (tous) + DIRECTION_FIN (overdue)
- Idempotence : pas de doublon par jour+installment+type
- Cron setInterval 1h + run initial 30s apres boot
- Route POST /check-reminders (ADMIN only)
SPEC-36G: Fix revision smeta — comparer avec derniere version
- Bug : v3 comparee avec v1 au lieu de v2
- Cause : filtre status IN (APPROVED, LOCKED) sautait v2 DRAFT
- Fix : aucun filtre statut, prend highest version
- applyDecisions() gere deja SUPERSEDED (existait)
- Donnees corrigees : revision v1→v3 et smeta v3 orpheline supprimees
SPEC-36H: Fix navigation "Blizhaishie platezhi" + filtres/tri/просрочка
- Lien Заказ : /orders/${orderId} au lieu de /orders?id=
- Description PAYMENT_REQUEST cliquable → /documents?tab=payments&highlight=
- PaymentsTab : highlight blink-red CSS 10s + auto-scroll
- Filtre statut Radio.Group : Все/Ожидает/Одобрен/Планируется
- Tri : По дате / Просроченные ↑ (overdue first)
- Colonne "Просрочка" : N дн. en rouge si date passee
Fix lot split deliveryDate
- Bug : deliveryDate non sauvegardee (TLT sans tender → null)
- Backend : accept deliveryDate optionnel dans splitLots payload
- Frontend : LotSplitModal envoie deliveryDate
- Auto-remplissage depuis supplier.deliveryDelayDays
- PO_INCLUDE etendu : supplier.deliveryDelayDays
Backfill PurchaseOrderLine.material
- 48 lignes avec material=null
- Fix 1 : 28 lignes via requirementId → purchase_requirements.material_category
- Fix 2 : 20 lignes TLT (fournisseur interne) → LASER_FLAT
- Resultat : 0 lignes restantes null, distribution FASTENERS(24)/LASER_FLAT(20)/COMPONENTS(2)/PAINT(1)/METAL(1)
Commits: 3fa2b4e → 5400b93
git push origin master OK (14 commits session 36)
TODO restant
- [P1] Cashflow previsionnel
- [P1] Refonte Gantt
- [P2] Erreurs TS .test.ts