Workflow: Asset Lifecycle — Viața unui Activ
Module implicate: Assets (Groups · Locations · Allocation · Actions · Depreciation) · Staff · Clients (portal)
Cine îl folosește: IT/Admin · HR · Financiar · Management
Durata tipică: Continuu — de la achiziție la casare
Overview
Modulul Assets gestionează inventarul de active fizice al companiei (laptopuri, telefoane, echipamente, mobilier etc.) pe tot parcursul ciclului de viață: achiziție, alocare la angajați, raportare stricăciuni, reparații în garanție, pierderi și casare. Deprecierea este calculată în timp real la vizualizare — nu există job programat.
Nu există flux de aprobare. Toate acțiunile (alocare, revocare, pierdere, casare) se execută imediat la POST — fără stări pending sau aprobare de manager.
Nu există legătură cu modulul Fleet și nici cu modulul Expenses/Purchase Orders. Costul de achiziție este stocat direct pe fișa activului (
unit_price), nu genereaza automat o cheltuială sau o factură de achiziție.
Statusul activului nu este un câmp explicit — este derivat din contoare (
total_allocation,total_lost,total_damagesetc.). Tab-urile din interfață filtrează pe baza acestor contoare.
Diagrama fluxului
[SETUP — admin, o singură dată]
│
├── Asset Groups (categorii: IT, Mobilier, Vehicule etc.)
├── Unit Types (unități de măsură: bucată, set, kg)
└── Asset Locations (locații fizice — admin only)
│
↓
[1. ACHIZIȚIE / CREARE ACTIV]
│
├── Assets → New Asset
├── Câmpuri: assets_code, assets_name, amount (cantitate), unit_price, date_buy
│ warranty_period (luni), depreciation (luni), asset_group, asset_location
├── Furnizor: supplier_name, supplier_address, supplier_phone
├── Atașamente (facturi, certificate, poze)
└── inventory_history: acction='add_new', begin=0, end=amount
│
↓
[2. STOC SUPLIMENTAR (opțional, dacă se achiziționează unități adiționale)]
│
├── acction_2: type='additional'
├── amount += unități adăugate
└── inventory_history: acction='additional'
│
↓
[3. ALOCARE LA ANGAJAT]
│
├── acction_1: type='allocation', acction_to=staffid
├── Câmpuri: amount (cantitate), acction_location (locul predării), acction_reason
├── total_allocation += amount
├── Stoc disponibil = amount - total_allocation
└── inventory_history: acction='allocation'
│
↓
[4. ÎN FOLOSINȚĂ — activ alocat]
│
├── Tab "In Use": total_allocation > 0
├── Staff vede activele proprii (dacă permisiunile permit)
└── Client poate vedea activele proprii în portal (dacă visible_to_client=1 + belongs_to)
│
↓
[5. EVENTS ÎN TIMP (oricare, în orice ordine)]
│
├── [A] STRICAT: type='broken' → total_damages += amount (cantitatea NU scade)
│
├── [B] GARANȚIE/REPARAȚIE (din stricăciuni):
│ type='warranty' → total_warranty += amount, total_damages -= amount
│ cost = costul reparației
│ Max = total_damages - total_warranty (piese nerepamate net)
│
├── [C] PIERDUT: type='lost' → amount -= amount, total_lost += amount
│ (eliminare permanentă din inventar)
│
└── [D] REVOCARE (returnare de la angajat):
type='revoke', acction_to=staffid
total_allocation -= amount
Sistem verifică net allocation per staff înainte de revocare
│
↓
[6. CASARE (end-of-life)]
│
├── type='liquidation'
├── amount -= cantitate casată, total_liquidation += cantitate
├── cost = valoarea de recuperare/vânzare la casare
└── inventory_history: acction='liquidation'
│
↓
[RAPORT DEPRECIERE]
│
├── Assets → Reports → Depreciation
├── Calcul PHP în timp real (nu există tabel de depreciere):
│ luni_scurse = (azi - date_buy) / 31 zile
│ depreciere_lunară = (unit_price × amount) / depreciation_luni
│ depreciere_cumulată = luni_scurse × depreciere_lunară
│ valoare_reziduală = (unit_price × amount) - depreciere_cumulată
└── Filtrabil per grup de active sau activ individual
[ACTIV CASAT ✓ · INVENTAR ACTUALIZAT ✓]
Pas cu pas
1. Configurare inițială
1a. Asset Groups
Unde: /admin/assets → Settings → Asset Group → Add Group
Categorii de active (ex: „Echipamente IT", „Mobilier", „Vehicule"). Obligatoriu cel puțin un grup.
1b. Unit Types
Unde: /admin/assets → Settings → Unit Types
Unitățile de măsură pentru cantitate (ex: „Bucată", „Set", „Kg"). Se pot adăuga unități personalizate cu unit_code, unit_name, unit_symbol.
1c. Asset Locations
Unde: /admin/assets → Settings → Asset Locations (admin only — is_admin())
Locații fizice ale activelor (ex: „Birou București", „Depozit", „Sediu Cluj"). Accesibil exclusiv adminilor.
2. Creare activ
Unde: /admin/assets → New Asset
Câmpuri obligatorii:
| Câmp | Descriere |
|---|---|
assets_code |
Cod unic (verificat AJAX în timp real) |
assets_name |
Denumire activ |
amount |
Cantitate totală |
unit |
FK → tblware_unit_type |
asset_group |
FK → tblassets_group |
asset_location |
FK → tblasset_location |
Câmpuri financiare:
| Câmp | Descriere |
|---|---|
unit_price |
Preț per unitate (DECIMAL 15,2) |
date_buy |
Data achiziției |
warranty_period |
Perioada de garanție în luni |
depreciation |
Durata de viață utilă în luni (pentru calcul depreciere) |
Câmpuri furnizor: supplier_name, supplier_address, supplier_phone — stocate inline, fără legătură cu modulul Purchase/Vendors.
Portal client:
visible_to_client = 1— activul apare în portalul clientbelongs_to— IDs clienți care văd activul (CSV)- Contact trebuie să aibă permisiunea
asset(permission_id = 7)
3. Acțiuni pe activ (tab-uri în interfață)
3a. Alocare (Allocation)
Unde: fișa activului → butonul Allocation
| Câmp | Descriere |
|---|---|
acction_to |
Angajatul care primește |
amount |
Cantitate alocată (max = stoc disponibil) |
acction_location |
Locul predării |
acction_reason |
Motivul alocării |
Stoc disponibil după alocare = amount - total_allocation.
3b. Revocare (Revoke)
Unde: fișa activului → butonul Revoke
Sistem verifică AJAX cantitatea net alocată pentru staffid-ul selectat. Nu poți revoca mai mult decât are angajatul alocat.
3c. Stricat (Broken)
Unde: fișa activului → butonul Broken
Marchează unități ca deteriorate. Cantitatea totală NU scade — unitățile stricate rămân în inventar până la reparare sau casare.
total_damages += amount → activul apare în tab-ul „Broken".
3d. Garanție/Reparație (Warranty)
Unde: fișa activului → butonul Warranty
Conversie unități stricate → reparate.
| Câmp | Descriere |
|---|---|
amount |
Unități reparate (max = total_damages - total_warranty) |
cost |
Costul reparației (stocat în acction_2, nu în Expenses) |
total_warranty += amount, total_damages -= amount.
3e. Pierdut (Lost)
Unde: fișa activului → butonul Lost
Eliminare permanentă din inventar. amount -= amount, total_lost += amount.
3f. Casare (Liquidation)
Unde: fișa activului → butonul Liquidation
| Câmp | Descriere |
|---|---|
amount |
Unități casate |
cost |
Valoarea de recuperare/vânzare la casare |
amount -= amount, total_liquidation += amount.
3g. Adăugare stoc (Additional)
Unde: fișa activului → butonul Additional
Crește inventarul cu unități noi (ex: achiziție suplimentară din același tip). amount += amount, cost = unit_price × added_amount.
4. Tab-uri de filtrare (derivate din contoare)
| Tab | Condiție |
|---|---|
| All Assets | fără filtru |
| Not Pending | total_allocation = 0 |
| In Use | total_allocation > 0 |
| Liquidation | total_liquidation > 0 |
| Warranty | total_warranty > 0 |
| Lost | total_lost > 0 |
| Broken | total_damages > 0 |
5. Raport depreciere
Unde: /admin/assets/depreciation
Filtrabil per grup și per activ individual. Calcul în timp real:
luni_scurse = (azi - date_buy) / (60×60×24×31)
depreciere_lunară = (unit_price × amount) / depreciation
depreciere_totală = luni_scurse × depreciere_lunară
valoare_reziduală = (unit_price × amount) - depreciere_totală
Nu se generează înregistrări contabile automate — raportul este informativ.
Permisiuni necesare
| Permisiune | Acces |
|---|---|
assets → view |
Vizualizare liste, detalii, rapoarte |
assets → create |
Creare activ nou |
assets → edit |
Toate acțiunile de ciclu de viață (allocation, revoke, broken, warranty, lost, liquidation, additional) |
assets → delete |
Ștergere activ + ștergere fișier atașat |
| Asset Locations settings | is_admin() exclusiv |
Gotchas
| Problemă | Cauză | Soluție |
|---|---|---|
| Nu pot aloca — câmpul amount e 0 | Stocul disponibil = amount - total_allocation = 0 |
Adăugați stoc nou (Additional) sau revocați de la alt angajat |
| Reparația „Warranty" nu apare | total_damages = 0 sau total_damages <= total_warranty |
Raportați mai întâi unitățile ca Broken |
| Casarea (Liquidation) reduce cantitatea | Comportament corect — Liquidation scade amount permanent |
Folosiți Broken (nu Liquidation) dacă intenționați să reparați |
| Deprecierea arată negativ | depreciation = 0 sau amount = 0 pe fișă |
Setați depreciation (luni) la creare |
| Activul nu apare în portalul clientului | visible_to_client = 0 sau clientul nu e în belongs_to |
Setați ambele câmpuri pe fișa activului |
| Nu pot șterge locația | Locație utilizată pe active existente | Reasignați activele la altă locație mai întâi |
Referințe module
- Fleet Management — vehicule (modul separat, fără legătură cu Assets)
- Expenses — cheltuieli (nu se generează automat din Assets)
- HR — Staff — angajații cărora li se alocă active
Programați întreținerea preventivă din înregistrarea activului înainte ca echipamentele să se defecteze — întreținerea proactivă costă mai puțin decât reparațiile de urgență și previne perioadele de nefuncționare operațională care afectează echipele care depind de activ.
Marcați activele retrase ca Inactive în loc să le ștergeți. Ștergerea le elimină din istoricul de amortizare, pistele de audit și înregistrările de întreținere. Dezactivarea păstrează toate datele istorice eliminând activul din listele active.