Trebuie să generez un numar de Invoice (string) unic crescator dupa data ultimului numar adaugat. Numărul facturii nu are un format implicit, utilizatorul este liber să înregistreze orice string dorit. Exemple: 00001, abc, EP-2018 / 00005…etc.
Ok, cum trebuie să funcționeze?
Dacă utilizatorul înregistrează un string 0001 ca număr de factură, atunci pe pagina „Adăugați o nouă factură”, trebuie să fie afișat următorul număr crescător, în acest caz va fi 0002. Dacă utilizatorul înregistrează o factură cu șir abc ca număr de factură, atunci pe pagina " Adăugați factură nouă ", trebuie să afișați abd.
Deci, după cum vedeți, depinde de ultima dată a numărului adăugat, deoarece al doilea numar de invoice a fost abc, acum vedem pe pagina „Adăugare factură nouă” abd este următorul număr unic.
Un alt exemplu, și aici treaba devine foarte complicată:
Dacă în db avem deja factură cu numărul “abd” și aceasta este foarte veche, atunci trebuie să obținem numărul următor de invoice, iar acesta este “abe”.
Database table “invoices”:
- id (auto increment)
- number (string)
- updated_at (timestamp)
Exemplu 1:
id | number | updated_at
id | number | updated_at
1 abc 2020-03-14 11:50:09
2 abd 2020-03-14 11:39:03
Deci, ultimul număr actualizat / adăugat este „abc”, următorul număr crescator trebuie să fie „abe”
Exemplu 2:
id | number | updated_at
1 abe 2020-03-14 11:49:09
2 abc 2020-03-14 11:50:09
3 abd 2020-03-14 11:49:09
4 00001 2020-03-15 10:45:52
5 abf 2020-03-15 10:42:50
Deci, ultimul număr actualizat / adăugat este „00001”, următorul număr trebuie să fie „00002”
Am incercat asta:
$latestByUpdatedDate = Invoice::latest('updated_at')->first();
$latestByNumber = Invoice::latest('number')->first();
if($latestByUpdatedDate > $latestByNumber){
return ++$latestByUpdatedDate->number;
}
return ++$latestByNumber->number;
Funcționează bine dacă *latestByUpdatedDate și *latestByNumber sunt numai caractere sau numai cifre.Insă dacă încercați să comparați 00001 cu abc, rezultatul va fi greșit.
Ce idei mai pot fi pentru a primi ceea ce am nevoie?