============================== Detaliu DL: scanare si aprobare ============================== .. contents:: :depth: 2 :local: Scop **** Inregistrarea cantitatilor efectiv livrate prin scanarea codurilor de bare ale articolelor de pe DL, urmata de trimiterea cantitatilor la ERP si aprobarea documentului. Ecranul este sursa de adevar pana la aprobare — toate scanarile sunt persistate in SQLite local si supravietuiesc la kill app / reboot. Prerechizite ************* - DL preluat de utilizatorul curent (vezi :doc:`Lista DL `). - Articolele de pe DL au coduri de bare configurate in ERP. Daca un articol nu are coduri bare, este afisat un avertisment galben pe rand si nu poate fi scanat (doar reset manual). A. Structura ecran detaliu *************************** |image_detaliu| Ecranul **Detaliu DL** contine, de sus in jos: - **Bara de titlu** — "DL " sau "DL · APROBAT" daca DL e finalizat. Buton Back la stanga. - **Antet DL** (card sus) — numar DL, data, numele clientului, cmd, tranz, contor pozitii. - **Header tabel pozitii** — coloanele: Cod / Denumire · UM · DL / Scan. - **Lista pozitii** — rand colorat in functie de starea cantitatii scanate. - **Bara de butoane** (jos) — Aproba DL / Scan / Trimite Q (vezi sectiunea D). |image_pozitii_lista| B. Coloana DL / Scan si culorile randurilor ********************************************* Fiecare rand reprezinta o pozitie din DL. Coloana din dreapta arata doua valori una sub alta: - *Sus* — q DL (cantitatea ordonata in document) - *Jos* — q scan (cantitatea efectiv scanata local, font mai mare si bold) Culoarea de fundal a randului se schimba in functie de raportul q_scan vs q_doc: - *Alb* — nicio scanare facuta inca (q_scan = 0) - *Galben deschis* — scanat partial (q_scan < q_doc) - *Verde deschis* — scanat exact cat trebuie (q_scan = q_doc) — **acesta este target-ul** - *Rosu deschis* — scanat in exces (q_scan > q_doc) — situatie invalida, blocheaza aprobarea Cand q_scan = q_doc pentru **toate** pozitiile, butonul **APROBA DL** devine activ (portocaliu plin). In orice alta situatie, butonul ramane gri (disabled). C. Scanare cod bare ******************** Pentru a inregistra scanari: 1. Apasati butonul **Scan** (iconita QR, central in bara de jos) sau apasati declansatorul fizic al scanner-ului hardware (Unitech EA660 — functioneaza si fara a apasa butonul UI, listener-ul este persistent). 2. Citeste un cod de bare. Daca apartine unei pozitii din DL: - q_scan al pozitiei creste cu factor-ul codului (de obicei 1, sau valoarea ``cantitate`` din configurarea codului bare in ERP — ex: cutie de 12 buc adauga 12); - vibratie scurta (light) ca feedback tactil; - snackbar verde scurt: *"+ "*; - randul pozitiei se evidentiaza temporar. 3. Daca codul **nu** apartine niciunei pozitii din DL: - vibratie puternica (heavy); - beep audio distinct (ton dublu descrescator); - snackbar rosu: *"Cod necunoscut pe acest DL: "*. .. note:: Scanari rapide consecutive sunt suportate — fiecare scanare adauga la q_scan al pozitiei. Pentru articole vandute in unitati multiple (cutie, palet), fiecare cod de bare poate avea un factor diferit configurat in ERP. |image_scan_ok| |image_scan_err| D. Bara de butoane (3 actiuni) ******************************* |image_butoane| In partea de jos a ecranului sunt trei butoane de aceeasi marime, asezate uniform: |btn_aproba| **APROBA DL** (stanga, portocaliu) Activ doar cand q_scan = q_doc pentru **toate** pozitiile. Apasare: - daca toate pozitiile sunt scanate complet, deschide direct fluxul de aprobare; - daca exista pozitii nescanate sau partial scanate, ar fi deschis un dialog de confirmare cu numarul exact de pozitii in fiecare categorie (vezi sectiunea F); - In practica, butonul ramane disabled pana cand toate pozitiile sunt match-uite, eliminand cazul de aprobare partiala "din greseala". |btn_scan| **Scan** (centru, cyan) Porneste scanarea. Pe Unitech EA660 cu *Tip scanner = Scanner* in setari, listener-ul hardware functioneaza si fara a apasa acest buton — declansatorul fizic e suficient. Apasarea butonului forteaza un scan punctual (util cand vrem confirmare ca scannerul e activ). |btn_trimite| **TRIMITE Q** (dreapta, albastru) Trimite la ERP cantitatile efectiv scanate, **fara a aproba**. DL ramane in starea *preluat de mine*. Util cand DL-ul nu poate fi aprobat inca: - *Cantitate scriptica gresita* — DL ordoneaza 100 buc dar in realitate exista 80 in stoc. Operatorul scaneaza 80, apasa TRIMITE Q. ERP-ul (alt utilizator, de ex. seful de tura) corecteaza DL-ul la 80 buc. Operatorul face pull-to-refresh pe detaliu — q DL se actualizeaza la 80. Acum q_scan = q_doc → APROBA DL devine activ. - *Lipsesc pozitii la ridicare* — operatorul trimite cantitatile partiale, ERP-ul anuleaza pozitiile nedisponibile sau corecteaza, apoi se aproba. La trimitere reusita: snackbar albastru *"Cantitati trimise la ERP — DL editabil"*. Aplicatia porneste un timer de polling automat (la fiecare 10 minute) care verifica daca DL a fost aprobat pe ERP de alt utilizator. E. Reset / Undo cantitate scanata ********************************** Pentru a anula scanari pe o pozitie, **apasati lung** (long press) pe randul pozitiei. Se deschide popup-ul de modificare. |image_dialog_reset| Popup-ul contine: - *Cod si denumire articol* (sus) - *Scanat: X UM / DL: Y UM* — cantitatile curente - *Coduri de bare disponibile* — lista cu toate codurile bare configurate in ERP pentru acest articol, format `` [(×)]``. Codurile cu factor 1 nu afiseaza factorul. - *Scanari individuale* — istoricul scanarilor: ``10 + 10 + 50 + 1 + 9 + 20`` (suma = q_scan). Permite operatorului sa vada exact ce a scanat si in ce ordine. - *Linie orizontala de separare* - *Text confirmare reset* - *Trei butoane*: - **Renunta** — inchide dialogul, nimic schimbat - **Undo ultima (−N)** (portocaliu) — scoate doar **ultima** scanare. Valoarea N este factor-ul scanarii care va fi scoasa. Util pentru a corecta o scanare gresita facuta din neatentie, fara a pierde scanarile anterioare. - **Reseteaza tot** (rosu) — aduce q_scan la 0 si sterge tot istoricul scanarilor. Folosit cand operatorul vrea sa o ia de la zero. .. note:: Long press accidental nu modifica nimic — dialogul este intotdeauna afisat pentru confirmare. Vibratie scurta de tip "medium impact" la apasare lunga confirma ca gestul a fost detectat. Resetul / undo este disponibil doar pentru pozitii cu q_scan > 0. Pentru pozitii nescanate (q_scan = 0), long press deschide popup-ul dar cu istoric gol — singura optiune ramane Renunta. F. Pull-to-refresh (verificare manuala status) ************************************************ In ecranul de detaliu DL, **trageti lista de pozitii in jos** pentru a forta o verificare a status-ului pe server. Operatia: 1. Re-incarca lista de DL-uri din ERP — daca DL-ul curent a fost aprobat de alt utilizator (de ex. seful de tura din interfata ERP web), aplicatia detecteaza automat: - snackbar albastru *"DL aprobat in ERP de alt utilizator"* - dupa 1.5 secunde, navigare automata inapoi la lista DL 2. Daca DL nu este aprobat, re-fetch pozitiile cu cantitatile actualizate din ERP. Q scanata locala este pastrata (nu se pierde munca utilizatorului). Q DL si alte campuri (denumire, UM, coduri bare) se actualizeaza din server: - daca q_doc s-a schimbat: snackbar verde *"DL actualizat din ERP — cantitatile au fost re-incarcate"* - daca nimic nu s-a schimbat: snackbar gri *"Niciun update — DL neschimbat in ERP"* .. note:: Polling-ul automat dupa TRIMITE Q ruleaza la fiecare 10 minute si verifica doar daca DL a fost aprobat (nu re-fetch pozitiile). Pull-to-refresh este versiunea manuala completa (re-fetch + verificare aprobat). G. Aprobare DL *************** Cand butonul **APROBA DL** este activ (toate pozitiile scanate complet), apasati pentru a finaliza DL-ul. Aplicatia: 1. *Pas 1* — POST la ``restLivrariScan`` cu toate cantitatile scanate (re-trimitere, idempotent server-side); 2. *Pas 2* — POST la ``restLivrariAprobare?aprobare=1``; 3. La succes pe ambele: - snackbar verde *"DL aprobat cu succes"* - dupa 500ms, navigare automata inapoi la lista DL - DL apare acum in filtrul **Aprobate** (alb). In caz de eroare la oricare din pasi, DL ramane in starea curenta (preluat de mine) si operatorul poate retry. .. warning:: Daca pasul 1 reuseste dar pasul 2 esueaza (timeout intre cele doua POST-uri), cantitatile sunt deja salvate pe server, dar DL nu e marcat ca aprobat. Operatorul poate apasa APROBA din nou — pasul 1 e idempotent (suprascrie aceleasi cantitati), pasul 2 reuseste. |image_aprobat| H. Vizualizare DL aprobat ************************** Dupa aprobare, DL apare in filtrul *Aprobate*. Apasarea pe card deschide detaliu in mod **read-only**: - bara de butoane este ascunsa; - in locul ei apare un banner portocaliu: *"DL APROBAT — read-only"*; - pozitiile si cantitatile scanate sunt vizibile, dar nu mai pot fi modificate; - long press pe rand nu mai deschide popup-ul de reset. Pentru a re-edita un DL aprobat din greseala, mergi in lista DL filtru *Aprobate*, apasa butonul portocaliu de Play → Anulare aprobare (vezi :doc:`Lista DL ` sectiunea D). .. |image_detaliu| image:: ../Logistics/Logisticsmedia/detaliu_dl.png :alt: Ecran detaliu DL cu antet, header tabel si pozitii .. |image_pozitii_lista| image:: ../Logistics/Logisticsmedia/pozitii_culoare.png :alt: Lista pozitii cu randuri colorate (alb / galben / verde / rosu) .. |image_scan_ok| image:: ../Logistics/Logisticsmedia/snack_scan_ok.png :alt: Snackbar verde scurt dupa scanare reusita .. |image_scan_err| image:: ../Logistics/Logisticsmedia/snack_scan_err.png :alt: Snackbar rosu pentru cod necunoscut .. |image_butoane| image:: ../Logistics/Logisticsmedia/bara_butoane.png :alt: Bara de butoane jos: APROBA DL / Scan / TRIMITE Q .. |btn_aproba| image:: ../Logistics/Logisticsmedia/btn_aproba.png :alt: Buton APROBA DL portocaliu .. |btn_scan| image:: ../Logistics/Logisticsmedia/btn_scan.png :alt: Buton Scan cyan .. |btn_trimite| image:: ../Logistics/Logisticsmedia/btn_trimite.png :alt: Buton TRIMITE Q albastru .. |image_dialog_reset| image:: ../Logistics/Logisticsmedia/dialog_reset.png :alt: Dialog reset cu coduri bare, scanari individuale, butoane Undo si Reset .. |image_aprobat| image:: ../Logistics/Logisticsmedia/dl_aprobat.png :alt: Ecran detaliu DL aprobat cu banner read-only