metallkart-erp/project_session36.md

4.6 KiB
Raw Blame History

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: 3fa2b4e5400b93

git push origin master OK (14 commits session 36)

TODO restant

  • [P1] Cashflow previsionnel
  • [P1] Refonte Gantt
  • [P2] Erreurs TS .test.ts