CRMconnect Azuvio · Docs

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_damages etc.). 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 onlyis_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 client
  • belongs_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
Tip

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.

Note

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.