Workflow: Contract Approval + Digital Signature
Modules involved: Contracts · Document Management · Workflow Automation · Proposals
Who uses it: Legal, Account manager, Manager vânzări, Clienți
Durata tipică: 1 zi – 2 săptămâni (depinde de numărul de aprobatori)
Overview
Fluxul complet de semnare a unui document contractual: de la redactarea din șablon, prin aprobarea internă multi-nivel, la trimiterea spre semnătură digitală a clientului și arhivarea contractului semnat. Contractele nesemnate sau expirate generează remindere automate.
Diagrama fluxului
[ȘABLON CONTRACT]
│ bibliotecă de template-uri cu merge fields
│ ↓ Creare contract (manual / din propunere / din oportunitate)
│
[CONTRACT — Draft]
│ câmpuri: subiect, client, tip, valoare, dată start/end
│ content: HTML cu merge fields populate automat
│
├── [APROBARE INTERNĂ — opțional]
│ │ flux multi-nivel configurat în Document Management
│ │ wh_approval_setting → aprobatori notificați
│ │ status aprobare: pending → approved / rejected
│ │ ↓ Aprobat intern → se trimite clientului
│
├── [TRIMIS LA CLIENT]
│ │ email cu link unic (hash URL) + PDF atașat
│ │ clientul accesează portalul cu linkul primit
│
└── [SEMNĂTURĂ CLIENT]
│ Method A: Semnătură digitală în portal
│ → signed = 1, signature = fișier PNG
│ → dmg_approval_detail_eids: IP, timestamp, nume
│ Method B: Marcare manuală de agent
│ → marked_as_signed = 1
│
↓
[CONTRACT SEMNAT ✓]
│ blocat la editare
│ alarme expirare: isexpirynotified → email reminder
│
[EXPIRARE / REÎNNOIRE]
│ renew() → contract nou cu aceleași clauze
│ semnătura: păstrată (renew_keep_signature) sau resetată
Pas cu pas
1. Șabloane și tipuri de contract
Unde: /admin/contracts/templates și /admin/contracts/types
Tipuri de contract (/admin/contracts/types)
Clasifică contractele organizațional: NDA, Contract Cadru, Contract Prestări Servicii, Anexă, etc.
Fiecare tip poate avea un șablon implicit de conținut.
Șabloane (/admin/contracts/templates)
Documente HTML pre-redactate cu merge fields care se populează automat la crearea contractului:
| Merge field | Valoare |
|---|---|
{client_name} |
Numele clientului |
{client_email} |
Email client |
{client_phone} |
Telefon client |
{contract_subject} |
Subiectul contractului |
{contract_value} |
Valoarea contractului |
{contract_nr} |
Numărul contractului |
{datestart} |
Data de start |
{dateend} |
Data de expirare |
{staff_name} |
Agentul responsabil |
{current_date} |
Data curentă |
2. Crearea contractului
Unde: /admin/contracts
Surse de creare:
- Din propunere acceptată → buton Crează Contract preia clientul și valoarea
- Din oportunitate → via
Contracts_opportunity_model - Direct →
/admin/contracts→ Adaugă Contract - Documente Furnizori →
/admin/contracts_vendor(flux separat pentru furnizori)
Câmpuri cheie (tblcontracts):
| Câmp | Note |
|---|---|
subject |
Titlul contractului |
client |
Clientul asociat (obligatoriu) |
contract_type |
Tipul (NDA, prestări, etc.) |
datestart / dateend |
Perioada de valabilitate |
contract_value |
Valoarea monetară |
nr |
Numărul contractului (manual sau auto) |
content |
Conținutul HTML al contractului |
project_id |
Proiectul asociat (opțional) |
not_visible_to_client |
Dacă e ascuns în portalul clientului |
hash |
Token unic de 32 caractere pentru URL-ul de semnare |
La creare: signed = 0, marked_as_signed = 0, isexpirynotified = 0
3. Aprobare internă (opțional, prin Document Management)
Unde: /admin/document_management
Dacă organizația impune verificare internă înainte de trimiterea la client, contractul poate fi supus unui flux de aprobare configurat în Document Management.
Configurare flux (dmg_approval_setting):
| Câmp | Note |
|---|---|
notification_recipient |
JSON cu aprobatorii (staff IDs, departamente) |
number_day_approval |
Deadline aprobare în zile |
choose_when_approving |
Dacă aprobatorul poate alege acțiunea |
departments / job_positions |
Restricții cine poate aproba |
Procesul de aprobare (dmg_approval_details):
| Câmp | Valori |
|---|---|
approve |
pending → approved / rejected |
staff_approve |
ID-ul aprobatorului |
date |
Timestamp aprobare |
note |
Comentariul aprobatorului |
Efecte:
- Aprobat → contractul e gata de trimis clientului
- Respins → se întoarce la redactor cu notă; editare + retrimitere
4. Trimiterea la client
Unde: Din contractul deschis → buton Trimite
Ce se întâmplă:
- Email generat din template
contract_send_to_customercu merge fields populate - Dacă
document_attachment_on_email = 1→ PDF-ul contractului atașat la email - Email conține link unic:
https://firma.ro/contract/{hash}— fiecare contract are hash distinct - Clientul accesează linkul fără autentificare (hash = autentificare implicită)
5. Semnătura digitală a clientului
Unde: Portalul client (URL cu hash unic)
Method A — Semnătură digitală:
- Clientul citește contractul în browser (HTML sau PDF)
- Desenează semnătura în câmpul dedicat (canvas touchscreen/mouse)
- Apasă Accept & Semnează
- Sistemul înregistrează în
dmg_approval_detail_eids:
| Câmp | Valoare |
|---|---|
firstname / lastname |
Numele semnatarului |
email |
Emailul semnatarului |
ip_address |
IP-ul de la care s-a semnat |
date_of_signing |
Timestamp exact al semnării |
approve |
signed |
- Pe contractul din CRM:
signed = 1,signature = {filename.png}(imaginea semnăturii) - Notificare automată trimisă agentului responsabil: "Contractul X a fost semnat de client"
Method B — Marcare manuală:
Agentul marchează contractul ca semnat manual (ex: a primit contractul fizic semnat):
- Buton Marchează ca Semnat →
marked_as_signed = 1 - Nu generează fișier de semnătură digitală
Blocare editare post-semnare:
Dacă signed = 1 SAU marked_as_signed = 1 → câmpurile contractului sunt locked și nu mai pot fi modificate. Orice modificare necesită un act adițional (contract nou sau amendament).
6. Monitorizarea și expirarea contractului
Remindere de expirare:
Sistemul verifică zilnic dateend pe contractele active:
- Dacă termenul se apropie → email
contract_expiration_reminder_to_customertrimis clientului isexpirynotified = 1setat după trimitere (pentru a nu retrimite)
Reînnoire (renew()):
- Se creează un contract nou cu aceleași clauze, dată start = ziua curentă
- Opțiunea
renew_keep_signature:1→ semnătura e păstrată pe noul contract0→ semnătura e resetată:signed = 0,marked_as_signed = 0,signature = null
Vizibilitate portalul client:
- Dacă
not_visible_to_client = 0→ clientul vede contractul în portal - Clientul poate descărca PDF-ul și vedea statusul de semnare
Tipuri de contracte în CRMConnect
| Tip | URL | Descriere |
|---|---|---|
| Documente Clienți | /admin/contracts |
Contracte cu clienți |
| Documente Furnizori | /admin/contracts_vendor |
Contracte cu furnizori |
| Documente Oportunități | /admin/contracts_opportunity |
Atașate la oportunități |
Fiecare tip are modelul său propriu dar structura de semnare este identică.
Workflow Automation — automatizări utile
Combinat cu modulul Workflow Automation, poți automatiza:
Trigger: Contract semnat (signed = 1)
→ Acțiune: Creează Proiect de implementare
→ Acțiune: Trimite email de bun venit clientului
→ Acțiune: Notifică echipa de delivery
Trigger: dateend − 30 zile
→ Acțiune: Task "Contactează clientul pentru reînnoire" → agent responsabil
→ Acțiune: Email reminder către client
Trigger: Contract respins la aprobare internă
→ Acțiune: Notificare redactor + notă cu motivul respingerii
Ce se creează automat
| Eveniment | Se creează automat |
|---|---|
| Contract creat din propunere | Client și valoare preluate; hash generat |
| Aprobare internă inițiată | Notificări trimise aprobatorilor din configurație |
| Contract trimis la client | Email cu link hash + PDF (dacă activat) |
| Client semnează digital | signed=1; fișier PNG semnătură; log dmg_approval_detail_eids |
| Contract semnat | Notificare agent; activitate log pe fișa clientului |
| Data expirare apropiată | Email reminder client; isexpirynotified=1 |
Puncte unde fluxul poate bloca
| Problemă | Cauză probabilă | Soluție |
|---|---|---|
| Clientul nu poate deschide linkul | Hash incorect sau sesiune expirată | Retrimite contractul — se generează un email nou cu același hash |
| Nu se poate edita contractul semnat | signed=1 sau marked_as_signed=1 blochează editarea |
Creează act adițional (contract nou) sau resetează manual din BD |
| Merge fields neînlocuite | Câmpuri lipsă pe fișa clientului (ex: email gol) | Completează fișa clientului înainte de creare contract |
| Clientul nu primește emailul | SMTP nesetat sau email client invalid | Verifică SMTP și adresa email din fișa clientului |
| Remindere de expirare retrimise zilnic | isexpirynotified nu e setat |
Verifică funcția de verificare expirare (CRON activ?) |
| Aprobare internă blocată | Aprobatorul nu a primit notificarea | Verifică wh_approval_setting și emailul aprobatorului |
Rapoarte și vizibilitate
- Lista contracte —
/admin/contracts— filtrare pe tip, client, status semnat, perioadă - Contracte expirate — filtrare pe
dateend< azi - Activitate client — fișa clientului → tab Contracte — istoricul complet