Livrarea condiționată de plată¶
Pentru fluxurile de vânzări cu plată în avans — o factură proformă, o plată în avans sau orice alt aranjament „plătește întâi, expediem apoi” — mărfurile nu trebuie să părăsească fizic depozitul înainte ca banii să fi ajuns efectiv. Livrarea condiționată de plată reține livrarea de ieșire a unei comenzi de vânzare cât timp comanda este neplătită: blochează atât rezervarea stocului, cât și butonul Validează, apoi o eliberează automat în momentul în care toate facturile sunt achitate. Un utilizator privilegiat poate totuși să suprascrie reținerea și să expedieze mai devreme, iar suprascrierea este urmărită integral în chatter.
Vezi și
Metode de plată în funcție de livrare — restricționarea metodelor de plată pe metodă de livrare
Plata ramburs (COD) — încasarea plății la predare, în loc de înainte de expediere
- menu
- Sales ‣ Orders ‣ Orders
- shows
- A confirmed sales order with the banner warning that the delivery is held until the order is paid.
- highlight
- The banner (red frame).
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Primitiva reutilizabilă „On Hold”¶
Livrarea condiționată de plată este construită peste un mecanism generic de reținere, aflat în modulul de bază eyssen_stock și disponibil pe orice transfer, independent de vânzări sau plăți:
un comutator Suspendă și un câmp doar pentru citire Motiv suspendare pe stock.picking;
o panglică roșie În așteptare pe formularul transferului ori de câte ori Suspendă este bifat, plus filtrele În așteptare / Reia în panoul de căutare al listei de transferuri; și
metodele
action_set_hold(reason)șiaction_release_hold(), care setează sau șterg împreună Suspendă și Motiv suspendare.
Setarea Suspendă anulează imediat rezervarea mișcărilor de stoc ale transferului; eliberarea declanșează din nou rezervarea (_action_assign), astfel încât transferul să preia automat stocul disponibil. Orice modul — nu doar sale_stock_payment_gate — poate pune un transfer în așteptare în acest mod și se poate baza pe faptul că rezervarea rămâne oprită până la eliberare.
Notă
Prin el însuși, Suspendă generic oprește doar rezervarea. Nu blochează Validează — acea protecție suplimentară, mai strictă, este specifică porții de plată descrise mai jos.
Indicatorul termenului de plată¶
- shows
- Payment term form with the Require payment before delivery checkbox.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Dacă o comandă este sau nu condiționată se stabilește prin termenul de plată al acesteia. Caseta Necesită plată înainte de livrare, adăugată pe formularul termenului de plată, marchează un termen ca „plătește înainte să expediem”. Comenzile care folosesc un termen de plată cu caseta debifată — de exemplu un termen de plată ramburs — nu sunt niciodată reținute. Nici comenzile fără niciun termen de plată nu sunt reținute.
Reținerea livrării la confirmarea comenzii¶
Când o comandă de vânzare este confirmată, iar termenul ei de plată cere plata înainte de livrare, fiecare ridicare de ieșire a comenzii, încă neefectuată și neanulată, este pusă în așteptare dintr-un singur pas: Suspendă este bifat, Motiv suspendare este setat la „Awaiting payment for delivery,” iar câmpul propriu al porții, Reținută pentru plată, este setat și el. Dacă la momentul confirmării comanda este deja plătită integral (de exemplu, o proformă sau o plată în avans a fost achitată înainte de confirmare), nu se aplică nicio reținere, iar livrarea decurge normal.
- shows
- Delivery transfer showing the On Hold ribbon and the payment hold reason.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Poarta strictă: fără rezervare, fără validare¶
O livrare reținută pentru plată este blocată în două moduri, astfel încât să nu poată trece nici pe calea automată, nici pe cea manuală:
Fără rezervare. Poarta suprascrie rezervarea mișcărilor de stoc, astfel încât orice mișcare aparținând unei ridicări reținute pentru plată este omisă, atât când Odoo atribuie automat stocul la confirmare, cât și când un utilizator face clic pe Verifică disponibilitatea. Această verificare se bazează pe indicatorul propriu al porții, Reținută pentru plată, deci rămâne valabilă chiar dacă comutatorul generic Suspendă este șters separat.
Fără validare. Un clic pe Validează pe o livrare reținută pentru plată generează o eroare în loc să expedieze mărfurile, trimițând utilizatorul la butonul Eliberează pentru livrare descris mai jos.
- shows
- Error dialog blocking validation of a payment-held delivery.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Important
Scrierea directă a valorii Reținută pentru plată = debifat pe o ridicare este blocată pentru orice utilizator care nu face parte din grupul Livrare fără plată. Doar butonul Eliberează pentru livrare al acelui grup (sau o scriere privilegiată/de sistem) poate ridica poarta — un simplu write() dintr-un alt flux nu o poate ocoli în tăcere.
Eliberare automată când comanda este plătită¶
- shows
- Fully paid customer invoice next to its now-released delivery.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
O comandă este considerată plătită pentru livrare odată ce fiecare factură de client postată, legată de ea, atinge starea de plată Plătit sau În plată. O regulă base.automation urmărește câmpul Stare plată de pe facturile de client (account.move, out_invoice) și, la fiecare creare sau scriere care îl atinge, reevaluează toate ridicările de ieșire, neefectuate, ale comenzilor aferente:
dacă comanda este acum plătită integral, orice ridicare încă reținută pentru plată este eliberată — Reținută pentru plată, Suspendă și Motiv suspendare sunt toate șterse, iar rezervarea rulează din nou automat; și
dacă comanda nu este plătită integral, iar o ridicare nu este reținută în prezent (și nu a fost eliberată manual — vezi mai jos), aceasta este reținută din nou cu motivul „Payment reversed - delivery re-blocked.”
Notă
În plată este considerat plătit deoarece reprezintă o încasare integrală pentru care reconcilierea cu extrasul bancar este încă în curs. O plată parțială nu eliberează niciodată reținerea. Poarta presupune că factura (facturile) asociată(e) acoperă întreaga sumă a comenzii — cu o plată în avans parțială nativă, o factură parțială plătită integral ar elibera întreaga livrare prea devreme; acest scenariu este explicit în afara domeniului de aplicare.
Reblocarea la stornarea plății¶
Deoarece aceeași automatizare reevaluează comanda la fiecare modificare a Stare plată, stornarea unei plăți (de exemplu, anularea reconcilierii sau anularea unei plăți astfel încât factura să revină la Neplătită) reaplică automat reținerea oricărei livrări neefectuate a acelei comenzi — atât timp cât livrarea nu a fost eliberată manual de un utilizator privilegiat.
Sfat
Poarta citește doar câmpurile standard account.move / payment_state de pe facturile de client postate. Nu depinde de nicio localizare: aceeași logică eliberează livrarea indiferent dacă comanda a fost achitată printr-o factură proformă / díjbekérő maghiară NAV, o factură obișnuită de plată în avans sau orice alt modul care postează și achită în cele din urmă o factură de client pentru comandă.
Suprascriere manuală: eliberarea unei livrări înainte de plată¶
- shows
- Release for delivery button on a held transfer, with its confirmation prompt.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Uneori o livrare trebuie cu adevărat să plece înainte ca comanda să fie plătită integral (expediere de bunăvoință, client de încredere, aranjament manual). Butonul Eliberează pentru livrare din antetul transferului face acest lucru:
este vizibil numai când ridicarea este reținută pentru plată și numai utilizatorilor din grupul de securitate Livrare fără plată;
un clic pe el cere confirmare, apoi șterge Reținută pentru plată, Suspendă și Motiv suspendare și setează Eliberată manual pentru livrare pentru a ține evidența suprascrierii; și
un mesaj din chatter înregistrează cine a eliberat livrarea și când.
- shows
- Chatter entry logging the manual release of a delivery.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
O livrare marcată Eliberată manual pentru livrare nu este reținută din nou de sincronizarea automată descrisă mai sus, chiar dacă ulterior comanda se dovedește a fi din nou neplătită — decizia manuală este respectată până când cineva reaplică manual o reținere.
Comenzile restante moștenesc reținerea¶
Dacă o livrare reținută pentru plată (sau eliberată anterior) este expediată doar parțial, iar Odoo creează o comandă restantă pentru restul, comanda restantă este reevaluată după aceeași regulă ca livrarea originală: când comanda cere încă plata înainte de livrare și nu este încă plătită integral, noul transfer restant este pus din nou în așteptare, cu același motiv „Awaiting payment for delivery” — chiar dacă transferul original fusese eliberat manual.
- shows
- Backorder transfer automatically re-held for payment.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Vizibilitate la nivel de comandă¶
Formularul comenzii de vânzare afișează un banner de avertizare — „Delivery is held until this order is paid.” — deasupra foii comenzii ori de câte ori oricare dintre livrările comenzii este în prezent reținută pentru plată. Acesta este controlat de câmpul calculat Livrare reținută pentru plată, astfel încât personalul de vânzări să vadă starea de condiționare dintr-o privire, fără a deschide transferul.
Configurare¶
Asigurați-vă că
sale_stock_payment_gateeste instalat. Acesta aduce automateyssen_stock,sale_stock,accountșibase_automation.Accesați , deschideți (sau creați) termenul de plată folosit pentru vânzările cu plată în avans/proformă și bifați Necesită plată înainte de livrare. Lăsați caseta nebifată pe termene precum plata ramburs.
Acordați grupul Livrare fără plată (categoria Stoc) utilizatorilor care au voie să suprascrie poarta — de exemplu supervizorilor de depozit — prin . Acest grup necesită și acces obișnuit de citire/scriere la stoc pentru a vedea și a elibera efectiv transferul.
- shows
- Assigning the Deliver without payment group to a user.
- module
- sale_stock_payment_gate
- notes
- English UI, light theme, 1440px width.
Nu este necesară nicio altă configurare: regula base.automation și logica de reținere/eliberare sunt active imediat ce modulul este instalat și cel puțin un termen de plată are indicatorul activat.
Utilizare¶
Confirmați o comandă de vânzare care folosește un termen de plată condiționat. Livrarea sa de ieșire este creată și pusă imediat în așteptare, cu excepția cazului în care comanda este deja plătită integral.
Formularul comenzii afișează bannerul Livrarea este reținută până când această comandă este plătită., iar transferul de livrare afișează panglica În așteptare, cu Motiv suspendare = „Awaiting payment for delivery.” Verifică disponibilitatea nu rezervă stoc, iar Validează refuză să ruleze.
Creați și postați factura de client (proformă, plată în avans sau factură obișnuită) pentru comandă, apoi înregistrați plata integrală. De îndată ce Stare plată a facturii ajunge la Plătit sau În plată, automatizarea eliberează livrarea: reținerea este ștearsă, iar stocul este rezervat din nou.
Validați normal livrarea acum eliberată.
Dacă o expediere timpurie este inevitabilă, un utilizator din grupul Livrare fără plată poate deschide transferul reținut și poate face clic pe Eliberează pentru livrare, în loc să aștepte plata. Suprascrierea este înregistrată în chatter și supraviețuiește modificărilor ulterioare ale stării plății; dacă ulterior este creată o comandă restantă pentru cantitatea rămasă pe aceeași comandă, aceasta este reținută automat din nou, cu excepția cazului în care între timp comanda a fost plătită integral.
Domeniu de aplicare și module¶
Funcția este livrată de două module:
eyssen_stock— primitiva generică, reutilizabilă Suspendă / Motiv suspendare pe transferuri (panglică, comutator, filtre de căutare și logica de blocare a rezervării/de re-rezervare), folosită aici ca element de construcție de bază.sale_stock_payment_gate— poarta de plată propriu-zisă: indicatorul termenului de plată Necesită plată înainte de livrare, logica de reținere la confirmare, blocarea strictă a rezervării/validării, eliberarea automată și reblocarea la modificările de plată conduse debase.automation, grupul Livrare fără plată cu butonul său Eliberează pentru livrare și urma din chatter, reținerea din nou a comenzilor restante și bannerul de avertizare la nivel de comandă.