| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Inventory (stock) • Manufacturing (mrp) • Purchase (purchase) • Sales (sale_management) • Invoicing (account) |
| Lines of code | 8564 |
| Technical Name |
deltatech_advanced_planner |
| License | OPL-1 |
| Website | https://www.terrabit.ro |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Inventory (stock) • Manufacturing (mrp) • Purchase (purchase) • Sales (sale_management) • Invoicing (account) |
| Lines of code | 8564 |
| Technical Name |
deltatech_advanced_planner |
| License | OPL-1 |
| Website | https://www.terrabit.ro |
Deltatech Advanced Planner
Planificator avansat de stoc cu backward scheduling și validare dată livrare
Planificator avansat de stoc cu backward scheduling și validare automată a datei de livrare, integrat cu modulele native de vânzări, producție și achiziții din Odoo 19.
Problema rezolvată
Planificarea nativă Odoo răspunde reactiv (reorder rules, MTO/MTS) și nu răspunde la întrebările esențiale ale vânzătorului sau operatorului logistic:
“Data de livrare promisă clientului este realizabilă, ținând cont de stocul disponibil, lead time-urile furnizorilor și durata producției?”
“La ce dată va intra stocul în roșu și din ce cauză — inclusiv pentru mișcările de ieșire independente de comenzile de vânzare?”
Poziționare față de APS standard
Odoo nativ acoperă MRP de bază (explozie BOM, netting brut, reorder rules) dar nu are APS cu capacitate finită — planificarea Odoo standard nu știe cât durează o comandă, dacă un workcenter este supraîncărcat sau dacă data de livrare promisă este fizic realizabilă.
Modulul Deltatech Advanced Planner adaugă capabilități APS selectate, direct în Odoo, fără integrări externe:
| Capabilitate APS | Odoo standard | Deltatech Advanced Planner |
|---|---|---|
| Planificare backward de la data livrării | ❌ | ✅ Backward scheduling cu
commitment_date |
| Verificare capacitate reală workcenter (RCCP) | ❌ | ✅ RCCP cu formula bottleneck + qty_factor |
| Planificare cu capacitate finită (CRP leveling) | ❌ | ✅ Greedy leveling cu cascadă BOM recursivă |
| Filtrare PO incoming pe dată livrare | ❌ | ✅ Netting cu
date_cutoff = commitment_date |
| Alocare stoc fără supraplanificare în batch | ❌ | ✅ Dict alocare globală per rulare |
| Vizibilitate stoc proiectat cronologic (MRP board) | ❌ | ✅ Situație Material + Stoc Proiectat Agregat |
| Detecție dată livrare imposibilă + dată alternativă | ❌ | ✅ Verdict OK / Warning / Blocked
+ ap_effective_date |
| Forward scheduling când data lipsește | ❌ | ✅ Propune automat cea mai devreme dată realizabilă |
| Protecție rulare concurentă planificare globală | ❌ | ✅ PostgreSQL advisory lock per tranzacție |
| Sincronizare dată livrare picking ↔ plan | ❌ | ✅ scheduled_date picking =
ap_effective_date |
| Planificare în ofertă (pre-confirmare) | ❌ | ✅ Simulare în stare draft cu
AP-uri nedifuzate |
Ce NU acoperă modulul (necesită APS4MFG / frePPLe pentru cerințe avansate):
- ✓Optimizare secvență producție (setup-uri dependente de secvență, campanii)
- ✓Scenarii what-if cu comparare KPI
- ✓Reprogramare complet automată la avarii, absențe, urgențe
- ✓Constrângeri complexe simultane (competențe operator, unelte, jig-uri)
Ciclu de viață — SO și comenzi planificate
| Stare SO | Stare AP | Efect planificare |
|---|---|---|
draft (ofertă) |
draft |
Simulare — calculează
ap_planning_expected_date
pe liniile SO. Nu rezervă
stoc, nu generează PO/MO. |
sent (ofertă
trimisă) |
planned ←
automat |
Planificarea devine activă — AP contribuie la netting (Situație Material). |
draft (ofertă
retrasă) |
draft ←
automat |
AP nefixate revin în simulare. |
sale (confirmat) |
planned |
Odoo generează livrările; PO/MO se lansează manual din AP. |
| PO/MO generat din AP | done |
AP realizat — exclus din recalculări. |
| Anulat manual | cancelled |
Exclus din recalculări. |
Tranzițiile draft ↔ planned se fac automat când SO-ul este
trimis sau retras. Comenzile fixate (is_fixed=True) sunt excluse din
tranzițiile automate.
Ce face modulul
Planificare bazată pe comenzi de vânzare
La confirmarea unei comenzi de vânzare, modulul execută automat:
Netting produs finit (proiecție cronologică) — înainte de orice calcul, verifică dacă stocul proiectat la
commitment_dateacoperă cantitatea din SO:projected_qty = qty_on_hand + intrări confirmate cu dată ≤ commitment_date (PO receipts, MO) − ieșiri confirmate cu dată ≤ commitment_date (alte SO-uri, mișcări independente) − cerere AP planned ale altor SO-uri `sent` (fără stock.moves încă)- SO
draft/sale/done: dacăprojected_qty ≥ qty_needed→ marcatok, AP sărit.draft: simulare — AP-urile draft nu afectează netting-ul.sale/done: stock.moves deja create de Odoo → cererea vizibilă în Situație Material fără AP suplimentar.
- SO
sent: AP se generează întotdeauna (planned), indiferent de stoc, pentru că Odoo nu creează stock.moves la trimitere (ci doar la confirmare). AP-ulplannedface cererea vizibilă în Situație Material și este scăzut dinprojected_qtyal SO-urilor ulterioare via_compute_sent_ap_demand(). Ieșirile dupăcommitment_datenu reduc disponibilul calculat — corect cronologic.
- SO
Explozie BOM recursivă — descompune produsul finit pe toate nivelurile (subansamblu → componentă → materie primă), colectând necesarul brut per componentă.
Netting componente — scade din necesarul brut stocul disponibil și cantitățile așteptate din comenzi de achiziție cu dată recepție ≤
commitment_date(intrările după termenul dorit nu reduc necesarul calculat — corect cronologic), obținând necesarul net de aprovizionat per componentă. La planificarea globală (batch), netting-ul componentelor folosește un dict de alocare globală partajat între toate SO-urile din rulare: SO/002 vede stocul redus cu cantitățile deja consumate de SO/001, prevenind supraplanificarea aceluiași stoc pentru cereri multiple.Backward scheduling cu RCCP — pornind de la
commitment_date, calculează înapoi pe calendar de lucru:- ✓data finalizare producție (
date_planned_production_end) - ✓data start producție / disponibilitate materiale
(
date_planned_production_start) - ✓data lansare comenzi de achiziție (
date_planned_launch) - ✓data recepție componentă (
date_po_reception) — garantată ≤ start producție
``production_lead_time`` este calculat prin RCCP (Rough-Cut Capacity Planning): operațiile BOM sunt grupate pe workcenter, iar lead time-ul este determinat de workcenter-ul critic (bottleneck):
qty_factor = ceil(qty_comandata / bom.product_qty) ore_necesare_WC = (setup + Σ time_cycle_manual × qty_factor + cleanup) / 60 ore_efective_zi = ore_calendar_WC × (time_efficiency / 100) zile_WC = ceil(ore_necesare_WC / ore_efective_zi) production_lead_time = max(zile_WC) ← workcenter-ul bottleneck
setup/cleanup(time_start,time_stop) sunt overhead fix per WC și nu se scalează cu cantitatea.time_cycle_manual(min/unitate) se înmulțește cuqty_factor— o comandă de 100 buc durează proporțional mai mult decât una de 1 buc. Dacă produsul areap_production_lead_timesetat manual, RCCP este ignorat.Dacă datele ar fi în trecut, planificatorul comută automat pe forward scheduling de la data curentă, marcând comanda ca
blockedși propunând cea mai devreme dată realizabilă.- ✓data finalizare producție (
SO fără commitment_date — planificatorul calculează forward și propune automat cea mai devreme dată de livrare posibilă (forward + safety buffer), fără să marcheze ca blocat.
Validare plauzibilitate — verdict automat în trei stări:
- OK— marjă suficientă față de safety buffer configurat
- Avertisment— marjă sub safety buffer, dar realizabil
- Blocat— data de livrare este imposibilă; se propune cea mai devreme dată realizabilă
- OK
Comenzi planificate — creează înregistrări
advanced.planned.orderde tip producție (cu ierarhie BOM) și de tip achiziție (per componentă cu shortage), cu toate datele calculate. Comenzile de achiziție (RFQ) și de producție (MO) nu sunt generate automat — se lansează manual din formularul comenzii planificate, după revizuire.Replanificare automată la modificarea SO — când
commitment_datese schimbă pe un SO confirmat (state == 'sale') și opțiuneaap_auto_replan_on_so_changeeste activată, planificatorul re-rulează automat, fără intervenție manuală. Un guard de context (ap_skip_replan) previne recursivitatea cu scrierile interne ale motorului.Detecție abateri zilnică (Cron) — un job programat zilnic detectează automat abaterile față de planul inițial:
- PO nelansat
date_planned_launcha trecut și AP-ul nu are PO asociat (→warning/blockeddupă 2 zile) - PO întârziatun PO confirmat asociat unui AP copil are
date_planned>date_po_reception(→warning/blockeddupă 5 zile) - MO blocatMO confirmat cu
date_startîn trecut și producție neîncepută (→blocked) - Avertizare preventivălansare PO iminentă (< 2 zile) fără RFQ generat (→
warning)
La detectare: actualizează
planning_status, seteazăap_deviation_reason, postează notă în chatter SO, creează activitate Odoo atribuită responsabilului SO. Câmpulap_blocked_sinceînregistrează prima dată a tranziției înblocked.- PO nelansat
Escaladare automată a activităților — dacă un AP rămâne în starea
blockedmai mult de N zile (configurabil din Setări —Escalation threshold), planificatorul actualizează scadența activităților expirate la azi și postează o notă de escaladare în chatter-ul SO. Dezactivat când pragul = 0.Consolidare automată RFQ-uri — la generarea unui RFQ dintr-un AP de tip achiziție, dacă există deja un draft PO pentru același furnizor cu
date_orderîn fereastra±ap_rfq_consolidation_window_daysfață dedate_planned_launch, se adaugă o linie nouă la PO existent în loc să se creeze un PO separat. Relația AP ↔ PO este Many2many (ap_purchase_order_rel), permițând unui PO consolidat să fie legat de multiple AP-uri. Fereastra se configurează din Setări; valoarea0dezactivează consolidarea.Sincronizare mișcări de livrare — pentru comenzile de vânzare confirmate, planificatorul actualizează automat mișcările de stoc de tip livrare (outgoing):
- ✓
stock.move.advanced_planned_order_id← legătura directă la comanda planificată AP - ✓
stock.move.date← data efectivă de livrare calculată (ap_effective_date) - ✓
stock.picking.scheduled_date← sincronizată cu data efectivă de livrare Astfel, data promisă clientului reflectă imediat rezultatul planificatorului în documentele operaționale de stoc, iar traseul SO → AP → livrare este complet vizibil în Situație Material.
- ✓
Log execuție — fiecare rulare generează înregistrări detaliate în
advanced.planner.log, cu pas, severitate și detalii tehnice, accesibile din formularul comenzii planificate.
Reaprovizionare independentă (mișcări fără SO)
Planificatorul global analizează și mișcările de stoc de ieșire care nu sunt legate de o comandă de vânzare (ex: transferuri, consum intern, ajustări planificate). Dacă stocul proiectat devine negativ, se generează automat AP-uri de reaprovizionare.
Algoritmul:
pentru fiecare produs cu mișcări outgoing confirmate fără SO:
running_stock = qty_on_hand + intrări_confirmate_PO_MO
pentru fiecare mișcare în ordine cronologică:
running_stock -= move.product_uom_qty
dacă running_stock < 0:
generează AP pentru shortage_qty = -running_stock
running_stock = 0 (AP-ul acoperă deficitul)
AP-urile de reaprovizionare:
- ✓
is_replenishment = True— distinse de AP-urile SO-based - ✓
sale_order_id = False— nu sunt legate de nicio comandă de vânzare - ✓
replenishment_picking_id— picking-ul care cauzează primul deficit - ✓Tip
manufacturedacă produsul are BOM,purchasedacă nu - ✓Backward scheduling de la data mișcării deficitare; forward fallback dacă data e în trecut
- ✓
state = draft— necesită revizie manuală înainte de conversie în PO/MO - ✓Regenerate complet la fiecare rulare (cele nefixate sunt șterse și recreate)
Planificare înainte de confirmarea comenzii (simulare)
Planificatorul poate fi rulat din faza de ofertare (SO în stare
draft), prin wizardul de recalculare manuală disponibil direct pe
formularul comenzii de vânzare.
În modul simulare, planificatorul:
- ✓calculează backward/forward și scrie rezultatul în
ap_planning_expected_datepe liniile SO (câmpulforecast_expected_dateal liniei este actualizat cu data calculată) - ✓creează comenzile planificate AP în starea ``draft`` — nu rezervă stoc, nu generează PO/MO, nu afectează netting-ul celorlalte comenzi
- ✓afișează statusul (
ok/warning/blocked) și data efectivă direct pe SO
Fluxul tipic în ofertare:
- Se creează SO în stare
draftcu produsul și cantitatea cerută - Se rulează planificatorul manual (buton „Recalculează planificarea” sau wizard)
- Sistemul calculează și afișează statusul + data efectivă; AP-urile
sunt create în
draft - SO este trimis clientului (
sent) → AP-urile trec automat înplanned(planificare activă) - Vânzătorul confirmă SO → planificatorul rulează din nou automat pe SO confirmat
Funcționalități principale
- Netting cronologic— stocul proiectat la data livrării, nu stocul brut curent: ieșirile după
commitment_datenu reduc disponibilul calculat - Reaprovizionare independentă— AP-uri generate pentru mișcări de stoc fără SO, prevenind stocul negativ din mișcări independente de comenzile de vânzare
- Generare manuală RFQ / MO— butoane dedicate pe formularul comenzii planificate, cu verificare duplicat înainte de creare
- Consolidare automată RFQ-uri— la generarea unui RFQ, dacă există un draft PO pentru același furnizor cu dată în fereastra ±N zile, se adaugă o linie la PO existent; relație Many2many AP ↔ PO; fereastră configurabilă,
0= dezactivat - Replanificare automată la schimbare dată SO— retrigerează planificatorul când
commitment_datese modifică pe un SO confirmat; activabil din Setări - Ciclu de viață SAP-style— comenzile planificate trec prin stările
draft → planned → done, cu tranziții automate la trimiterea/retragerea ofertei și excludere după conversie în PO/MO - Fixare comenzi planificate(SAP-style firming) — o comandă fixată este exclusă din recalculările automate și contribuie la netting ca stoc virtual
- Sincronizare livrări— la planificarea unui SO confirmat, mișcările de livrare primesc automat legătura AP și data efectivă de livrare calculată (
scheduled_datepe picking) - Situație Material— echivalentul SAP Situație Material: stoc proiectat cronologic per produs, cu trasabilitate completă SO → AP → PO/MO → mișcare de stoc (coloana Origine / pegging)
- Stoc Proiectat Agregat (tip SAP MRP)— ecran agregat cross-SO per produs cu pegging FIFO complet: toate elementele MRP (CustOrd, PurchOrd, PlOrd/P, PlOrd/M, ProdOrd, StIn) sortate cronologic, stoc proiectat cumulativ, ATP (Available to Promise) și detecție shortage cu banner roșu; export Excel cu 11 coloane inclusiv pegging
- Sincronizare bidirecțională PO/MO ↔ AP— modificarea datei pe o linie PO (
date_planned) propagă automat noua dată de recepție în AP-urile asociate și cascadează upstream prin ierarhia BOM (componentă → AP parent → AP bunic) actualizândplanning_statuslawarning/blockeddacă componenta ajunge după startul producției; similar, modificareadate_start/date_finishedpe un MO actualizează AP-ul asociat și alertează SO-ul dacă finalizarea depășeșteap_effective_date - Export rapoarte PDF / Excel— wizard cu filtre per perioadă, companie și status: PDF „Plan Livrări” (AP-uri root colorate per status, deviere inline, sumar contori), Excel AP-uri (20 coloane, toate nivelele BOM, celule colorate per status, AutoFilter), Excel Workcenter Load (10 coloane, colorate per load%)
- Planificare globală— wizard pentru rularea planificatorului pe toate SO-urile active, sortate după
commitment_dateASC (comenzile urgente au prioritate la stoc); netting-ul componentelor folosește un dict de alocare globală partajat — SO/002 vede stocul redus cu ce a consumat deja SO/001, eliminând supraplanificarea în batch-uri mari; protecție la rulări concurente prin lock tranzacțional PostgreSQL (pg_advisory_xact_lock) — o a doua rulare simultană primește UserError prietenos (wizard) sau este sărită silențios (cron nocturn); urmat de analiza mișcărilor independente - Capacitate producție — RCCP— lead time-ul de producție se calculează din operațiile BOM grupate per workcenter: workcenter-ul cel mai lent (bottleneck) determină durata totală; eficiența (
time_efficiency) și orele din calendarul WC sunt luate în calcul automat - Încărcare posturi de lucru— raport
Workcenter Loadcu vizualizare pivot (WC × săptămână), grafic bar și liste colorate (roșu >100%, galben 80–100%, verde ≤80%); generat automat la fiecare planificare, cu filtre rapide pentru supraîncărcat / critic / blocat - CRP complet (Capacity Requirements Planning)— agregare a încărcării reale a tuturor workcenter-elor din AP-urile de producție planificate; sloturi per (workcenter × săptămână × companie) cu
hours_demanded(suma orelor din toate AP-urile),hours_capacity(capacitate nominală),load_percentșicrp_status(ok ≤80% / warning 80–100% / overloaded >100%); vizualizare graph (ore cerute vs. capacitate pe săptămâni) și pivot (workcenter × săptămână); algoritm de nivelare greedy (load leveling): mută automat AP-urile cu cel mai mult slack (margin_daysdesc) din sloturile supraîncărcate cu +7 zile, cascadează automat +7 zile recursiv pe toate AP-urile copil neFixate (toate nivelele ierarhiei BOM rămân sincronizate după nivelare), protejând AP-urile fixate (is_fixed=True); wizard cu opțiunedry_runpentru previzualizare supraîncărcări fără modificarea AP-urilor; log de nivelare stocat per slot în câmpulleveling_note - Gantt cu dependențe— vizualizare ierarhică producție → achiziții componente
- Low Level Code (LLC)— calculul adâncimii fiecărui produs în BOM
- Banner status pe SO— verde / galben / roșu direct pe formularul comenzii de vânzare
- Detecție abateri zilnică— cron detectează PO nelansat, PO întârziat, MO blocat; actualizează statusul AP și creează activități Odoo
- Escaladare automată— dacă un AP rămâne
blocked> N zile, activitățile expirate sunt escalate automat (configurabil) - Notificare email— alertă automată către managerul de logistică la starea
blocked - Wizard recalculare manuală— recalculare la cerere, fără reconfirmarea SO
- MOQ automat— cantitatea de comandat este ajustată la cantitatea minimă a furnizorului
- Planificare bulk din lista SO— acțiune de server pe selecție multiplă de comenzi de vânzare; procesează doar SO-urile cu BOM, sortate după
commitment_dateASC; SO-urile fără BOM sunt marcate automatnot_applicable - Acces rapid la comenzi blocate— buton „Vezi blocate” în wizardul de planificare globală, filtrând direct AP-urile în stare
blockeddupă rularea globală
Parametri configurabili (Setări → Inventar)
| Parametru | Descriere | Default |
|---|---|---|
| Safety buffer (zile) | Marjă minimă acceptabilă între data calculată și cea dorită | 3 |
| Lead time achiziție implicit | Folosit când furnizorul
nu are delay
configurat |
30 zile |
| Lead time producție implicit | Folosit când BOM nu are timp de producție definit | 5 zile |
| Zile expediere operator → client | Timp rezervat pentru pregătirea și expedierea comenzii | 1 zi |
| Adâncime maximă BOM | Protecție la cicluri în BOM recursiv | 10 niveluri |
| Comportament la dată imposibilă | Doar avertizare sau blocare confirmare SO | Avertizare |
| Retenție log-uri | Câte zile se păstrează log-urile de execuție | 90 zile |
| Replanificare automată la schimbare dată | Retrigerează
planificatorul când
commitment_date se
modifică pe SO confirmat |
Dezactivat |
| Fereastră consolidare RFQ (zile) | RFQ-uri pentru același
furnizor cu dată în ±N
zile sunt consolidate;
0 = dezactivat |
3 zile |
| Detecție abateri zilnică (cron) | Activează cronul care detectează PO nelansat, PO întârziat, MO blocat | Dezactivat |
| Prag escaladare (zile blocked) | Dacă AP rămâne
blocked mai mult de N
zile → activitățile
expirate sunt escalate;
0 = dezactivat |
3 zile |
Usage
Ghid de utilizare — Deltatech Advanced Planner
Acest ghid descrie fluxurile practice de lucru cu modulul, pas cu pas.
Pentru descrierea tehnică a algoritmilor și modelelor, consultați
DESCRIPTION.md și spec_tehnica_advanced_planner.md.
Ce rezolvă față de Odoo standard
Odoo standard face MRP reactiv: generează propuneri de aprovizionare și producție pornind de la stocul curent, dar nu știe dacă data de livrare promisă clientului este fizic realizabilă.
Modulul adaugă planificare APS selectivă nativ în Odoo:
Probleme rezolvate față de planificarea Odoo nativă
| Problemă cu Odoo standard | Soluție în modul |
|---|---|
| „Nu știu dacă pot livra la data promisă” | Backward scheduling: calculează dacă data e posibilă și ce alternativă există |
| „Lead time de producție e fix, nu ține cont de cantitate” | RCCP cu qty_factor: 100 buc durează mai mult decât 1 buc, calculat per workcenter |
| „Nu știu care workcenter este supraîncărcat” | Workcenter Load + CRP: ore cerute vs. capacitate, cu nivelare automată |
| „Am planificat stoc pentru două SO-uri dar acoperă doar unul” | Alocare globală în batch: SO/002 vede stocul redus de SO/001 |
| „PO-ul sosește după data de livrare dar netting-ul îl contorizează oricum” | Filtrare PO incoming pe
commitment_date: recepțiile
viitoare nu reduc necesarul
curent |
| „Nu văd ce se întâmplă cu stocul proiectat al unui produs” | Situație Material + Stoc Proiectat Agregat: vizualizare cronologică cross-SO |
| „Doi utilizatori rulează planificarea în același timp” | Lock PostgreSQL: a doua rulare primește eroare clară |
| „Data din picking nu reflectă planificarea reală” | Sincronizare automată
scheduled_date picking =
ap_effective_date calculat |
Fluxul de bază în 4 pași
SO confirmat
↓
Backward scheduling (commitment_date → date_start, date_launch)
↓
Netting componente (cu filtrare pe dată și alocare globală)
↓
Verdict: OK / Warning / BLOCKED + data alternativă dacă e blocată
Ce rămâne în afara modulului
Modulul nu face optimizare de secvență (setup-uri, campanii, penalizări, JIT) și nu are motor de simulare what-if. Pentru aceste cerințe sunt necesare soluții dedicate APS (APS4MFG, frePPLe). Modulul este complementar acestora, nu concurent.
Cuprins
- Configurare inițială
- Pregătirea produselor
- Simulare înainte de confirmare (ofertă draft)
- Planificare la confirmarea comenzii
- Planificare globală (toate SO-urile active)
- Interpretarea statusului și a datei calculate
- Comenzile planificate — ciclu de viață
- Conversie în PO / MO
- Situație Material
- Stoc Proiectat Agregat
- Rapoarte & Export (PDF / Excel)
- Sincronizare bidirecțională PO/MO ↔ AP
- Workcenter Load vs. CRP — Ghid de orientare rapidă
- CRP — Capacity Requirements Planning
- Reaprovizionare independentă
- Detecție abateri zilnică și escaladare automată
- Acces și permisiuni
1. Configurare inițială
Înainte de prima utilizare, setați parametrii globali:
Inventar → Configurare → Setări → secțiunea Advanced Planner
| Parametru | Valoare recomandată | Efect |
|---|---|---|
| Safety buffer (zile) | 3 | Marjă minimă acceptabilă; sub această valoare → WARNING |
| Lead time achiziție implicit | 30 | Folosit când furnizorul
nu are
Delivery Lead Time
configurat |
| Lead time producție implicit | 5 | Folosit când BOM nu are operații și produsul nu are lead time manual |
| Zile expediere | 1 | Timp rezervat pentru picking/packing/expediere după finalizarea producției |
| Adâncime maximă BOM | 10 | Protecție la cicluri în BOM recursiv; rar necesar mai mult de 5 |
| Comportament dată imposibilă | Avertizare | Blocare previne
confirmarea SO când
statusul e BLOCKED |
| Retenție log-uri | 90 | Câte zile se păstrează jurnalul de execuție al planificatorului |
| Replanificare la schimbare dată SO | Dezactivat | Dacă activat, modificarea
commitment_date pe SO
confirmat retrigerează
automat planificatorul |
| Fereastră consolidare RFQ (zile) | 3 | RFQ-uri pentru același
furnizor cu dată în ±N
zile sunt consolidate
într-un singur PO; 0
= dezactivat |
2. Pregătirea produselor
2.1 Activarea planificării per produs
Pe fiecare produs care trebuie inclus în analiză:
Produs → tab Planificare Advanced Planner
- Inclus în planificare(
ap_include_in_planning): bifat → produsul apare în Situația Material și este luat în calcul la netting - Lead time producție manual(
ap_production_lead_time): completați doar dacă doriți să suprascrieți RCCP calculat din operațiile BOM; lăsați 0 pentru calcul automat - Note planificaretext liber vizibil în comenzile planificate generate
2.2 Lead time furnizori (MOQ și delay)
Pe fiecare materie primă/componentă cumpărată:
Produs → tab Achiziție → Prețuri furnizori
| Câmp | Importanță |
|---|---|
| Vendor Lead Time (zile) | Folosit direct în backward scheduling
pentru calculul date_planned_launch |
| Min. Qty (MOQ) | Cantitatea de comandat este rotunjită la MOQ la generarea AP de achiziție |
Dacă un produs cumpărat nu are furnizor configurat cu
Vendor Lead Time, planificatorul folosește parametrul global
„Lead time achiziție implicit”.
2.3 Structuri de produs (BOM) cu operații RCCP
Pentru calculul automat al lead time-ului de producție prin RCCP:
Producție → Produse → Structuri de produs → tab Operații
Adăugați câte o operație per post de lucru (workcenter) implicat:
| Câmp | Valoare |
|---|---|
| Workcenter | Postul de lucru (cu eficiență și ore calendar configurate) |
| Mod calcul timp | Manual |
| Timp ciclu manual | Durata operației în minute per unitate de produs |
RCCP determină production_lead_time = cel mai lent workcenter
(bottleneck):
qty_factor = ceil(qty_comandata / bom.product_qty) ore_WC = (wc.time_start + op.time_cycle_manual × qty_factor + wc.time_stop) / 60 zile_WC = ceil(ore_WC / (ore_calendar_zi × eficienta%)) production_lead_time = max(zile_WC pentru toate WC-urile)
time_start/time_stop(setup/cleanup) sunt overhead fix per WC — nu se scalează cu cantitatea.time_cycle_manual(min/unitate) se înmulțește cuqty_factor— o comandă de 100 buc durează mult mai mult decât una de 1 buc; ignorarea acestui factor ducea la subestimarea lead time-ului.
3. Simulare înainte de confirmare (ofertă draft)
Modulul permite testarea planificării înainte de a confirma comanda, direct din faza de ofertare.
Flux
- Creați o comandă de vânzare (
draft) cu produsul și cantitatea dorită - Setați Data livrare dorită (
commitment_date) — dacă este lăsată goală, planificatorul calculează cea mai devreme dată posibilă (forward scheduling) - Pe formularul SO, apăsați butonul „Recalculează planificarea” (sau deschideți wizardul din acțiunile SO)
- Planificatorul calculează și afișează:
- Statusul (OK / WARNING / BLOCKED) pe bannerul colorat din header-ul SO
- Data efectivă calculată (
ap_effective_date) — data la care produsul poate fi livrat - Comenzile planificate generate în starea
draft(nu afectează netting-ul celorlalte comenzi)
Ce se întâmplă la trimiterea ofertei (SO → sent)
Când trimiteți oferta clientului, planificatorul comută automat AP-urile
din draft → planned. Din acel moment, cererea acestui SO intră
în netting și este vizibilă în Situație Material pentru celelalte
comenzi.
Dacă retrageți oferta (SO → înapoi în draft), AP-urile nefixate
revin automat în draft.
AP-urile fixate (is_fixed = True) sunt excluse din
tranzițiile automate — rămân în starea curentă indiferent de starea
SO.
4. Planificare la confirmarea comenzii
La confirmarea unui SO (Confirmați comanda), planificatorul rulează
automat și execută:
Netting produs finit — verifică dacă stocul proiectat la
commitment_dateacoperă cererea (ținând cont de intrările și ieșirile confirmate cu dată ≤ commitment_date)Explozie BOM recursivă — descompune produsul pe toate nivelurile până la materiile prime
Netting componente — calculează necesarul net per componentă:
net = max(0, necesar_brut − stoc_disponibil − PO_incoming cu data_receptie ≤ commitment_date − cantitati_fixate_in_AP_planned + rezervari_SO_anterioare)PO-urile cu data recepție după
commitment_datenu reduc necesarul — o recepție planificată în 6 luni nu ajută la o livrare promisă săptămâna viitoare.Backward scheduling — calculează înapoi de la
commitment_date:commitment_date − zile_expediere → data_finalizare_productie − production_lead_time → data_start_productie − 1 zi → data_receptie_componente − purchase_lead_time → data_lansare_comanda_achizitie ← dacă < azi → BLOCKED
Creare comenzi planificate — AP manufacture (produs finit) + AP purchase (componente cu deficit)
Sincronizare livrări — mișcările de picking ale SO primesc automat
scheduled_date = ap_effective_date
Recalculare manuală după confirmare
Dacă s-au schimbat stocurile sau termenul clientului, recalculați fără a reconfirma comanda:
SO → buton „Recalculează planificarea” (sau din lista SO: Acțiune → Recalculează planificarea)
Replanificare automată la modificarea datei
Dacă opțiunea „Replanificare la schimbare dată SO” este activată în
Setări, modificarea câmpului Data livrare dorită pe un SO confirmat
declanșează automat recalcularea planificatorului — fără a apăsa niciun
buton. Statusul și comenzile planificate se actualizează imediat.
5. Planificare globală (toate SO-urile active)
Pentru a planifica toate comenzile active dintr-o singură rulare:
Advanced Planning → Global Planning → buton „Rulează planificarea globală”
Wizardul procesează:
- Toate SO-urile în stare
salesausent, sortate dupăcommitment_dateASC (comenzile cu termen mai apropiat au prioritate la stoc). Netting-ul componentelor folosește un dict de alocare globală partajat între toate SO-urile din aceeași rulare: SO/002 vede stocul redus cu cantitățile deja alocate de SO/001, prevenind situația în care două SO-uri sunt marcate OK deși stocul total nu acoperă cererea combinată. - SO-urile fără BOM sunt marcate automat
not_applicableși sărite - După SO-uri, rulează analiza mișcărilor independente (fără SO) — generează AP-uri de reaprovizionare
Opțiuni wizard:
- Forțează recalculare AP fixate — include în recalculare și
AP-urile cu
is_fixed = True(implicit excluse) - Șterge AP-urile nefixate existente — curăță comenzile planificate vechi înainte de recalculare
După rulare, butonul „Vezi comenzile blocate” filtrează direct
AP-urile în stare blocked pentru acțiune imediată.
Protecție la rulări concurente: Dacă un alt utilizator sau cronul
nocturn rulează deja planificarea globală, wizardul afișează un mesaj
de eroare și oprește pornirea unei a doua rulări. Lock-ul
tranzacțional PostgreSQL (pg_advisory_xact_lock) este eliberat
automat la finalizarea planificării — nu necesită nicio acțiune
manuală.
6. Interpretarea statusului și a datei calculate
Bannerul de status pe SO
| Culoare | Status | Semnificație |
|---|---|---|
| Verde | OK | Data de livrare este realizabilă; marjă ≥ safety buffer (implicit 3 zile) |
| Galben | WARNING | Livrarea este posibilă, dar PO-ul trebuie lansat urgent (marjă < 3 zile) |
| Roșu | BLOCKED | Data de livrare este imposibilă; planificatorul propune cea mai devreme dată realizabilă |
| Gri | Not applicable | Produsul nu are BOM; nu necesită planificare de producție |
Câmpuri cheie pe SO (header)
| Câmp | Descriere |
|---|---|
ap_effective_date |
Data la care produsul poate fi livrat conform planificatorului |
ap_planning_status |
Statusul planificării (ok / warning / blocked / not_applicable) |
ap_earliest_date |
Cea mai devreme dată realizabilă (completat doar la BLOCKED) |
Câmpuri cheie pe liniile SO
| Câmp | Descriere |
|---|---|
ap_planning_expected_date |
Data calculată per linie produs (util când SO are mai multe produse) |
Logica marjei
margine = (data_lansare_comanda_achizitie - azi).zile margine ≥ safety_buffer → OK 0 ≤ margine < safety_buffer → WARNING margine < 0 → BLOCKED (data_lansare_comanda deja în trecut)
7. Comenzile planificate — ciclu de viață
Comenzile planificate (Advanced Planning → Planned Orders) sunt
înregistrările centrale ale modulului.
Stări posibile
| Stare | Semnificație |
|---|---|
draft |
Simulare — nu intră în netting; generate din SO draft sau din recalculare manuală |
planned |
Activ — contribuie la netting; generate din SO sent/sale |
done |
Realizat — AP convertit în PO sau MO; exclus din recalculări |
cancelled |
Anulat manual; exclus din recalculări |
Tipuri de comenzi planificate
| Tip | Cod | Descriere |
|---|---|---|
| Manufacture | manufacture |
Produs fabricat intern; se convertește în Manufacturing Order |
| Purchase | purchase |
Componentă cu deficit; se convertește în Request for Quotation |
Ierarhia AP
Un AP de producție (produs finit) are copii (sub-AP) pentru fiecare componentă în deficit:
AP/00007 — Manufacture PF-001 × 5 (produs finit) ├── AP/00008 — Purchase MP-02 × 10 (sticlă, 28 zile lead time — critică) ├── AP/00009 — Purchase MP-01 × 108 (celule, 10 zile lead time) └── AP/00010 — Purchase MP-03 × 12 (profil aluminiu, 10 zile lead time)
Ierarhia este vizibilă în vizualizarea Gantt (Advanced Planning → Production Plan — Gantt).
Fixarea comenzilor planificate
Bifați „Fixat” (is_fixed) pe un AP pentru a-l proteja de
recalculări automate ulterioare. AP-urile fixate:
- ✓Nu sunt șterse la recalculare globală
- ✓Nu schimbă starea la modificarea SO-ului (nu urmăresc
draft ↔ planned) - ✓Contribuie la netting ca stoc virtual (cantitatea lor este scăzută din necesarul net)
8. Conversie în PO / MO
Din formularul unui AP, după revizuire:
AP Purchase → Request for Quotation
Buton „Creează RFQ”
- Consolidare automată— înainte de a crea un PO nou, planificatorul caută un draft PO existent pentru același furnizor cu
date_orderîn fereastra ±N zile (configurabil în Setări, implicit 3).- Dacă găsit: adaugă o linie nouă la PO existent; AP-ul e legat la acel PO prin relația Many2many
- Dacă nu găsit: creează PO nou ca de obicei
- ✓AP trece în starea
doneîn ambele cazuri - ✓Mesajul din chatter AP indică dacă s-a creat un PO nou sau s-a consolidat într-unul existent
- ✓Setați fereastra la
0în Setări pentru a dezactiva consolidarea și a crea mereu PO-uri separate
AP Manufacture → Manufacturing Order
Buton „Creează MO”
- ✓Creează un
mrp.productioncu produsul, cantitatea și data start din AP - ✓Verifică duplicatele similare
- ✓AP trece în starea
donedupă confirmare MO
Atenție: Generarea PO/MO este intenționat manuală — planificatorul nu lansează automat comenzi. Revizuiți AP-urile înainte de conversie, mai ales cele în stare WARNING sau BLOCKED.
9. Situație Material
Echivalentul SAP MD04 simplificat — afișează cronologic toate intrările și ieșirile planificate pentru un produs, cu stocul proiectat la fiecare pas.
Deschidere
Opțiunea 1 — Din meniu: Advanced Planning → Material Situation → selectați produsul → „Reîmprospătează”
Opțiunea 2 — Din comanda planificată: Pe formularul AP → buton „Situație Material (Situație Material)” → se deschide direct filtrat pe produsul AP
Cum se citește Situație Material
Liniile sunt sortate cronologic. Fiecare linie arată:
| Coloană | Descriere |
|---|---|
| Data | Data mișcării (mișcările din trecut → aduse la azi) |
| Tip MRP | Tipul documentului (SO, AP, PO, MO, mișcare stoc) |
| Document | Numărul documentului sursă |
| Origine | Documentul care a generat această mișcare (trasabilitate SO → AP → PO/MO) |
| Intrare / Ieșire | Cantitatea care crește / scade stocul |
| Stoc proiectat | Stocul cumulativ după această mișcare; roșu = deficit |
Cod culoare rânduri
- Verde— intrare în stoc (PO, MO, AP, recepție)
- Roșu— ieșire din stoc (SO, livrare)
- Rând roșu— stocul proiectat a intrat în negativ (deficit)
- Rând portocaliu— stocul proiectat este exact zero
10. Stoc Proiectat Agregat
Echivalentul SAP MRP — vizualizare agregată cross-SO a tuturor elementelor MRP pentru un produs, cu pegging FIFO complet și detecție shortage.
Deschidere
Opțiunea 1 — Din meniu: Advanced Planning → Stoc Proiectat → selectați produsul → „Reîmprospătează”
Opțiunea 2 — Din comanda planificată: Pe formularul AP → buton „Stoc Proiectat” → se deschide direct pentru produsul AP
Coduri Element MRP
| Cod | Semnificație |
|---|---|
| Stock | Stoc disponibil curent |
| CustOrd | Comandă client (SO confirmat) |
| IndReq | Cerere independentă (mișcare fără SO) |
| PurRqs | Cerere de aprovizionare (draft/sent PO) |
| PurchOrd | Comandă achiziție confirmată |
| PlOrd/P | AP Achiziție (planned order purchase) |
| PlOrd/M | AP Producție (planned order manufacture) |
| ProdOrd | Ordin de producție (MO) |
| StIn | Intrare stoc (mișcare de recepție) |
Coloane principale
| Coloană | Descriere |
|---|---|
| Dată | Data evenimentului MRP |
| Element MRP | Codul tipului de document |
| Document | Referința documentului sursă |
| Intrare (+) | Cantitatea care crește stocul |
| Ieșire (−) | Cantitatea care scade stocul |
| Stoc proiectat | Running total cumulativ; roșu = sub zero |
| ATP | Available to Promise = max(0, stoc proiectat) |
| Shortage | Cerere neacoperită de nicio ofertă; banner roșu dacă > 0 |
| Pegging | Documentul care acoperă / este acoperit de această linie |
Algoritm Pegging FIFO
Fiecare cerere (sortată cronologic) este acoperită mai întâi din stocul disponibil, apoi din prima ofertă disponibilă cronologic. Rezultatul apare în coloana Pegging:
- pe cerere: „acoperit de PO/00003, Stoc”
- pe ofertă: „pentru SO/00012, SO/00015”
Export Excel
Butonul „Export Excel” (vizibil când există linii) descarcă un
fișier .xlsx cu 11 coloane inclusiv pegging, ATP, shortage, coduri
element MRP — gata de analiză.
11. Rapoarte & Export (PDF / Excel)
Wizard centralizat pentru exportul rapoartelor planificatorului.
Advanced Planning → Rapoarte & Export
Filtre disponibile
| Filtru | Efect |
|---|---|
| De la / Până la | Filtrează AP-urile după
ap_effective_date în intervalul ales |
| Companie | Limitează la o singură companie (implicit: compania curentă) |
| Filtrare status | Toate / OK / Avertisment /
Blocat |
| Include done/cancelled | Dacă bifat, include și AP-urile finalizate sau anulate |
Rapoarte disponibile
PDF — Plan Livrări
Buton „PDF Plan Livrări”
Generează un PDF cu AP-urile root (nivel BOM = 0) sortate pe data efectivă:
- ✓Tabel colorat per status (verde / portocaliu / roșu)
- ✓Rând inline de deviere pentru AP-urile cu motiv de blocare
- ✓Sumar contori în header (total, OK, warning, blocked)
- ✓Legendă coduri culori la final
Excel — Planned Orders (toate nivelele)
Buton „Excel — AP-uri”
Export cu toate nivelele BOM, 20 coloane: referință, SO, client, produs, cantitate, UoM, tip, status, stare, nivel BOM, start, end, livrare efectivă, dată așteptată, marjă, # RFQ, # MO, fix, blocat din, motiv deviere. Celule colorate per status. AutoFilter activat.
Excel — Workcenter Load
Buton „Excel — Workcenter Load”
Export RCCP cu 10 coloane per înregistrare: workcenter, săptămână, date, produs, SO, ore planificate, capacitate, load%. Celule colorate: verde ≤ 80%, portocaliu 80–100%, roșu > 100%. AutoFilter activat.
12. Sincronizare bidirecțională PO/MO ↔ AP
Modificările de dată pe documentele operaționale (PO, MO) se propagă automat înapoi în comenzile planificate asociate, fără intervenție manuală.
PO → AP (linie comandă achiziție)
Când data de recepție planificată (date_planned) se modifică pe
o linie de PO:
- Planificatorul actualizează
date_po_receptionpe AP-urile asociate aceluiași produs - Postează o notă automată în chatter-ul AP cu vechea și noua dată
- Dacă noua dată de recepție depășește
date_planned_production_startal AP-ului parent:- AP parent →
planning_status = warning(întârziere ≤ 2 zile) saublocked(> 2 zile) - Se salvează motivul în
ap_deviation_reason - Se postează notă în chatter AP și în chatter SO (dacă AP e root)
- AP parent →
- Cascada continuă recursiv upstream: componentă → parent → bunic → rădăcină BOM
MO → AP (ordin de producție)
Când data de start sau finalizare (date_start /
date_finished) se modifică pe un MO:
- Planificatorul actualizează
date_planned_production_start/date_planned_production_endpe AP-ul asociat - Postează notă în chatter AP cu detaliile modificării
- Dacă
date_finisheddepășeșteap_effective_date(data livrare planificată):- AP →
warning(întârziere ≤ 2 zile) saublocked(> 2 zile) - Se postează notă și în chatter-ul SO
- AP →
Protecții
- AP fixat (
is_fixed = True): exclus din sincronizare — nu este modificat automat - Guard anti-recursie: cheia de context
ap_skip_syncprevine bucle infinite între hook-uri
13. Workcenter Load vs. CRP — Ghid de orientare rapidă
Modulul expune două rapoarte de capacitate distincte, cu scopuri complementare. Înțelegerea diferenței dintre ele este esențială pentru utilizarea corectă.
Comparație directă
| Criteriu | Workcenter Load | CRP — Capacitate Workcenter |
|---|---|---|
| Model | advanced.workcenter.load |
advanced.crp.slot |
| Granularitate | O înregistrare per AP × workcenter | Un slot per workcenter × săptămână |
| Generat de | Engine de planificare — automat la fiecare rulare | _run_crp() —
manual, prin
wizard „Nivelare CRP” |
| Conținut | Detaliu brut: AP, produs, SO, ore planificate, interval date | Agregat: suma ore cerute, capacitate nominală, load%, status, log nivelare |
| Capacitate calculată | Da, per înregistrare (referință pentru load%) | Da, per slot (calendar de lucru × eficiență%) |
| Nivelare supraîncărcări | Nu | Da — algoritmul greedy mută AP-uri cu +7 zile |
| Drilldown AP-uri | Înregistrările sunt AP-urile | Din formularul unui slot CRP → tab „AP-uri în slot” |
| Când să-l deschizi | „Care AP-uri consumă capacitate pe WC-ul X?” | „Ce săptămâni au supraîncărcare și cu câte ore?” |
Fluxul de date
Planificare globală (Global Planning)
│
│ generează automat
▼
advanced.workcenter.load ← date brute, una per AP per WC
│
│ Wizard „Nivelare CRP" → Actualizează CRP → _run_crp()
│ agregă per (workcenter × săptămână × companie)
▼
advanced.crp.slot ← agregat, cu capacitate și status
│
│ Wizard „Nivelare CRP" → Actualizează + Nivelează
▼
AP-uri mutate cu +7 zile (doar cele neFixate)
Când să folosești fiecare raport
Workcenter Load — răspunde la întrebări de tip drilldown:
- ✓„Ce AP-uri exacte generează supraîncărcarea pe WC-ul X în săptămâna 20?”
- ✓„Câte ore planifică SO/00042 pe WC-ul de sudură?”
- ✓„Care sunt AP-urile blocate asociate cu WC-ul de asamblare?”
CRP — Capacitate — răspunde la întrebări de tip management:
- ✓„Avem supraîncărcare undeva în orizont de 8 săptămâni?”
- ✓„Pe WC-ul de vopsire, care săptămâni depășesc 100% din capacitate?”
- ✓„Dacă nivelăm supraîncărcările, câte AP-uri trebuie reprogramate?”
Ordinea corectă de utilizare:
- Rulați Global Planning (generează / actualizează Workcenter Load)
- Deschideți Nivelare CRP → apăsați „Actualizează CRP” (creează/actualizează sloturile CRP)
- Vizualizați CRP — Capacitate pentru overview și nivelați dacă e necesar
- Reveniți la Workcenter Load pentru drilldown pe AP-urile specifice
13. Încărcare posturi de lucru (RCCP) — Workcenter Load
Raportul Workcenter Load conține datele brute de capacitate: câte ore planifică fiecare AP pe fiecare post de lucru. Este sursa primară de date, generată automat la fiecare rulare a planificatorului.
Advanced Planning → Workcenter Load
Ce reprezintă o înregistrare
Fiecare rând din Workcenter Load este o pereche (AP × workcenter):
- AP/00007 — producție produs X — utilizează WC Sudură → 12h planificate săptămâna 20
- AP/00007 — producție produs X — utilizează WC Vopsire → 8h planificate săptămâna 21
Același AP generează atâtea înregistrări câte workcenter-e folosesc operațiile din BOM-ul său.
Vizualizări disponibile
| Vizualizare | Utilizare |
|---|---|
| Pivot (implicit) | Matrice WC × Săptămână, cu ore planificate / disponibile / load% |
| Graph (Bar) | Grafic vizual al încărcării pe săptămâni |
| List | Detaliu per AP, cu filtrare și colorare automată |
Cod culoare load%
| Culoare | Prag | Semnificație |
|---|---|---|
| Roșu | > 100% | Supraîncărcare — capacitate depășită; planificarea nu este realizabilă fără redistribuire |
| Galben | 80–100% | Critic — capacitate aproape epuizată; risc la orice întârziere |
| Verde | ≤ 80% | Normal |
Filtre rapide
- „Supraîncărcat”— afișează doar înregistrările cu load% > 100%
- „Critic”— afișează load% > 80%
- „Blocat”— afișează doar AP-urile cu status
blocked
Datele de Workcenter Load sunt regenerate automat la fiecare rulare a planificatorului. Nu editați manual înregistrările — ele vor fi suprascrise la următoarea planificare.
14. CRP — Capacity Requirements Planning
CRP este vizualizarea managerială agregată a acelorași date din Workcenter Load. În loc de câte o linie per AP, CRP afișează câte un slot per (workcenter × săptămână), cu suma tuturor orelor cerute, capacitatea nominală calculată pe calendarul de lucru și statusul de supraîncărcare — plus instrumentul de nivelare automată (load leveling).
Deschidere
Advanced Planning → CRP — Capacitate
Lista afișează câte un rând per (workcenter × săptămână), cu colorare automată:
- Roșu— load > 100% (supraîncărcat)
- Galben— load 80–100% (critic)
- Verde— load ≤ 80% (normal)
Ce arată un slot CRP
| Câmp | Descriere |
|---|---|
| Workcenter | Postul de lucru analizat |
| Săptămână | Format ISO: YYYY-Wnn (ex: 2026-W20) |
| Ore Cerute | Suma orelor planificate din toate AP-urile care utilizează WC-ul în săptămâna respectivă |
| Capacitate (h) | Capacitate nominală a WC-ului (zile_lucru_săptămână × ore_efective/zi × eficiență%) |
| Ore Disponibile | Capacitate − Cerute (negativ = supraîncărcare) |
| Supraîncărcare (h) | max(0, Cerute − Capacitate) |
| Load % | Cerute / Capacitate × 100 |
| Status CRP | OK / Avertisment / Supraîncărcat |
| AP-uri | Numărul de AP-uri care contribuie la slot |
Formularul fiecărui slot afișează lista AP-urilor individuale cu orele respective.
Vizualizări disponibile
| Vizualizare | Utilizare |
|---|---|
| List (implicit) | Groupby workcenter; filtrare rapidă per status; colorare per load% |
| Graph (Bar) | Grafic ore cerute vs. capacitate per săptămână — evidențiază vizual supraîncărcările |
| Pivot | Matrice workcenter × săptămână; măsuri: ore cerute / capacitate / supraîncărcare (h) / load% |
Acțiunile disponibile din CRP și impactul lor
Există trei acțiuni distincte, cu efecte și consecințe diferite asupra replanificării.
Acțiunea 1 — „Actualizează CRP”
De unde: Wizard „Nivelare CRP” → buton „Actualizează CRP” sau din formularul unui slot CRP → buton „Actualizează CRP” din header.
Ce face:
Agregă toate înregistrările advanced.workcenter.load existente în
sloturi CRP per (workcenter × săptămână × companie). Creează sloturi
noi, actualizează sloturile existente și șterge sloturile orfane (cele
care nu mai au AP-uri asociate).
Ce modifică în baza de date:
| Model | Câmpuri scrise |
|---|---|
advanced.crp.slot |
hours_demanded,
hours_capacity, date_start,
date_end, refreshed_at |
advanced.workcenter.load |
crp_slot_id (legătura la slotul
său) |
Ce NU face:
- ✓Nu modifică niciun AP (
advanced.planned.order) — datele, statusul, cantitățile rămân neschimbate - ✓Nu modifică statusul SO-urilor
- ✓Nu recalculează netting-ul sau backward scheduling-ul
- ✓Nu creează/modifică PO-uri sau MO-uri
Când să o rulezi: Oricând vrei să actualizezi vizualizarea CRP după o nouă planificare globală sau după ce ai adăugat/modificat SO-uri. Aceasta este întotdeauna primul pas înainte de orice analiză de capacitate.
Acțiunea 2 — „Actualizează + Nivelează” cu „Doar vizualizare” bifat (Dry Run)
De unde: Wizard „Nivelare CRP” → debifați „Doar vizualizare” = fals → buton „Actualizează + Nivelează”.
Ce face:
- Rulează mai întâi agregarea CRP (identic cu Acțiunea 1)
- Identifică sloturile cu
load% > 100%și simulează mutarea AP-urilor - Afișează statisticile (sloturi supraîncărcate, câte ar putea fi rezolvate, câte AP-uri ar fi mutate)
Ce modifică în baza de date: Doar ce face Acțiunea 1 (sloturile CRP). Niciun AP nu este modificat.
Când să o rulezi: Înainte de orice nivelare efectivă — pentru a evalua impactul fără a comite nicio modificare. Răspunde la întrebarea: „Dacă nivelăm, ce se întâmplă?”
Acțiunea 3 — „Actualizează + Nivelează” cu „Doar vizualizare” debifat (Nivelare efectivă)
De unde: Wizard „Nivelare CRP” → debifați „Doar vizualizare” → buton „Actualizează + Nivelează”.
Ce face (algoritmul greedy):
- Rulează agregarea CRP (Acțiunea 1)
- Procesează sloturile cu
load% > 100%în ordine cronologică (urgențele primele) - Per slot supraîncărcat:
- Exclude AP-urile cu
is_fixed = Truesau staredone/cancelled - Sortează AP-urile eligibile descrescător după
margin_days(cele cu cel mai mult slack primele) - Mută AP-urile unul câte unul cu +7 zile până când
load% ≤ 100%sau se epuizează AP-urile eligibile
- Exclude AP-urile cu
- Cascadează automat +7 zile recursiv pe toate AP-urile copil
(
child_planned_order_ids) ale fiecărui AP mutat, filtrate dupăis_fixed=Falseșistate not in ('done', 'cancelled'). Actualizează și înregistrărileadvanced.workcenter.loadale fiecărui copil. - Dacă slotul rămâne supraîncărcat după epuizarea AP-urilor →
înregistrat ca „irezolvabil” în
leveling_note
Ce modifică exact în baza de date:
| Model | Câmpuri scrise | Valoare nouă |
|---|---|---|
advanced.planned.order
(AP mutat) |
date_start |
date_start + 7 zile |
advanced.planned.order
(AP mutat) |
date_end |
date_end + 7 zile |
advanced.planned.order
(AP mutat) |
ap_effective_date |
ap_effective_date + 7 zile |
advanced.planned.order
(AP-uri copil neFixate) |
date_start,
date_end,
ap_effective_date |
+ 7 zile (recursiv, toate
nivelele BOM) |
advanced.workcenter.load
(AP mutat + copii) |
date_start,
date_end |
+ 7 zile |
advanced.crp.slot |
hours_demanded |
Scăzut local (orele AP-ului mutat) |
advanced.crp.slot |
leveling_note |
Log cu AP-urile mutate, copiii cascadați și datele vechi/noi |
Ce NU face nivelarea — limitări rămase:
| Ce nu se întâmplă | Consecință practică |
|---|---|
| Netting-ul nu se recalculează | Stocul proiectat și eventualele deficit/surplus nu se actualizează automat |
| Statusul SO nu se recalculează | Dacă AP mutat depășește
commitment_date → SO rămâne
„OK” în interfață, deși livrarea
nu mai este realizabilă la
termen |
| Datele de picking (livrare) nu se actualizează | scheduled_date pe mișcările
de stoc rămâne nemodificat |
| Sloturile CRP nu se re-agregă după mutare | Slotul afișează
hours_demanded estimat local
(scăzut manual); pentru valori
exacte trebuie rulată Acțiunea 1
din nou |
| PO-urile și MO-urile deja create nu sunt modificate | Sincronizarea inversă (PO/MO → AP) nu se declanșează din nivelare |
Fluxul complet recomandat după nivelarea efectivă
1. [Dry Run] Actualizează + Nivelează (Doar vizualizare bifat)
→ verificați statisticile: câte AP-uri vor fi mutate, câte sloturi irezolvabile
2. [Revizuire] Deschideți Workcenter Load sau Planned Orders
→ identificați AP-urile cu margin_days redus care ar urma să fie mutate
→ fixați (is_fixed = True) cele pe care NU vreți să le mutați automat
3. [Nivelare] Actualizează + Nivelează (Doar vizualizare debifat)
→ AP-urile eligibile primesc date_start/date_end/ap_effective_date + 7 zile
→ AP-urile copil neFixate primesc automat același +7 zile (cascadă recursivă)
4. [Verificare] Planned Orders → filtrați după SO-urile afectate
→ verificați că noile date_end nu depășesc commitment_date al SO
→ AP-urile al căror ap_effective_date a depășit commitment_date trebuie
analizate manual (comunicare cu clientul sau redistribuire manuală)
5. [Replanificare completă] Global Planning (rulare completă) — recomandat după nivelare
→ reface backward scheduling pentru toate SO-urile
→ recalculează netting-ul cu noile date (stoc proiectat, deficit/surplus)
→ actualizează statusul SO-urilor (OK / WARNING / BLOCKED)
→ actualizează scheduled_date pe mișcările de picking
6. [Re-actualizare CRP] Actualizează CRP (Acțiunea 1)
→ sloturile CRP reflectă starea exactă după replanificare
→ verificați că supraîncărcările au dispărut sau s-au redus
Regula de aur: Nivelarea CRP deplasează AP-urile (inclusiv copiii BOM) dar nu recalculează netting-ul și nu actualizează statusul SO. Urmați întotdeauna nivelarea cu o rulare de Global Planning pentru a reface coerența completă a planului (netting, status SO, date livrare).
Raport statistici post-nivelare (wizard)
| Câmp | Descriere |
|---|---|
| Sloturi analizate | Total sloturi CRP în intervalul selectat |
| Sloturi supraîncărcate | Numărul inițial de sloturi cu load% > 100% |
| Sloturi rezolvate | Sloturi aduse la load% ≤ 100% prin nivelare |
| AP-uri mutate | Numărul total de AP-uri deplasate cu +7 zile |
| Sloturi irezolvabile | Sloturi rămase supraîncărcate (toate AP-urile fixed sau done) |
Protecții nivelare
- AP fixat(
is_fixed = True): niciodată mutat — marcat explicit de utilizator ca imuabil - AP done / cancelledexclus din nivelare indiferent de load%
- Dry runniciun AP nu este modificat; statisticile sunt pur informative
15. Reaprovizionare independentă
Planificatorul global detectează automat produsele cu mișcări de stoc de ieșire care nu sunt legate de nicio comandă de vânzare (transferuri interne, consum, ajustări planificate) și generează AP-uri de reaprovizionare.
Când se activează
Rulați Global Planning → planificatorul analizează, după procesarea SO-urilor, toate mișcările outgoing confirmate fără SO sursă.
Cum să identificați AP-urile de reaprovizionare
Advanced Planning → Planned Orders → filtru „Reaprovizionare”
Caracteristici:
- ✓Câmpul „Reaprovizionare” (
is_replenishment) = bifat - Comandă de vânzare= gol (nu sunt legate de niciun SO)
- Picking sursă(
replenishment_picking_id) = transferul care a generat primul deficit - ✓Stare:
draft— necesită revizie înainte de conversie în PO/MO
16. Detecție abateri zilnică și escaladare automată
Activare
Inventar → Configurare → Setări → Advanced Planner → „Detecție abateri zilnică” → bifați
La activare, cronul Planificator avansat — detecție abateri zilnică
devine activ și rulează zilnic.
Ce verifică cronul
| Abatere | Trigger | Status AP |
|---|---|---|
| PO nelansat | date_planned_launch
trecut, fără PO asociat |
warning (< 2
zile) / blocked
(≥ 2 zile) |
| PO întârziat | PO confirmat cu
date_planned >
date_po_reception |
warning (< 5
zile) / blocked
(≥ 5 zile) |
| MO blocat | MO confirmat,
date_start în
trecut, producție
neîncepută |
blocked |
| Lansare PO iminentă | Lansare PO în < 2 zile, fără RFQ generat | warning
(preventiv) |
Ce face la detectare
- Actualizează
planning_status→warningsaublockedpe AP și pe SO - Salvează motivul abaterii în câmpul
Deviation Reason(vizibil pe formularul AP, banner portocaliu) - Înregistrează data primei tranziții
blockedîn câmpulBlocked Since - Postează o notă automată în chatter-ul SO: ⚠️ sau 🔴 + detalii abatere
- Creează o activitate Odoo pe SO, atribuită responsabilului SO
(
user_id):- Scadență 1 zi dacă status =
blocked - Scadență 3 zile dacă status =
warning - Nu creează duplicate dacă există deja o activitate cu același AP
- Scadență 1 zi dacă status =
Escaladare automată
Dacă un AP rămâne în starea blocked mai mult de N zile (configurabil
în Setări — „Prag escaladare”, implicit 3 zile):
- Scadența activităților expirate (nerezolvate) pe SO este actualizată la data de azi
- Se postează o notă 🚨 de escaladare în chatter-ul SO cu numărul de zile blocate
Pentru a dezactiva escaladarea, setați pragul la 0.
Câmpuri noi pe AP
| Câmp | Descriere |
|---|---|
Blocked Since |
Data primei treceri în blocked (calculat
automat) |
Deviation Reason |
Motivul ultimei abateri detectate de cron |
17. Acces și permisiuni
Grupuri disponibile
| Grup | Acces |
|---|---|
| Advanced Planner / User | Vizualizare comenzi planificate, Situație Material, Workcenter Load; rulare wizard de recalculare manuală per SO |
| Advanced Planner / Manager | Acces complet: planificare globală, creare PO/MO din AP, configurare setări, ștergere AP |
Configurare utilizatori
Setări → Utilizatori → utilizatorul dorit → secțiunea Advanced Planner
Selectați User sau Manager din dropdown.
Acțiuni disponibile per rol
| Acțiune | User | Manager |
|---|---|---|
| Vizualizare comenzi planificate | ✓ | ✓ |
| Rulare planificare manuală per SO | ✓ | ✓ |
| Vizualizare Situație Material | ✓ | ✓ |
| Vizualizare Stoc Proiectat Agregat | ✓ | ✓ |
| Export rapoarte PDF / Excel | ✓ | ✓ |
| Vizualizare Workcenter Load | ✓ | ✓ |
| Vizualizare CRP — Capacitate (sloturi) | ✓ | ✓ |
| Rulare planificare globală | — | ✓ |
| Creare RFQ din AP | — | ✓ |
| Creare MO din AP | — | ✓ |
| Fixare / ștergere AP | — | ✓ |
| Ștergere Stoc Proiectat / Snapshot | — | ✓ |
| Actualizare CRP + Nivelare supraîncărcări | — | ✓ |
| Configurare parametri (Setări) | — | ✓ |
Bug Tracker
Bugs are tracked on Terrabit Issues. In case of trouble, please check there if your issue has already been reported.
Do not contact contributors directly about support or help with technical issues.
Credits
Authors
- Deltatech
Maintainers
This module is part of the terrabit-ro/bitshop_ent project on GitHub.
You are welcome to contribute.
Need help getting started?
We are an Odoo partner building apps for the Romanian market (SAGA & WinMentor export; Romanian accounting localization in progress). Direct support from the team that built the module.
Contact Terrabit →Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module