Customizzazione calendario CRM VTIGER 5.0.4

CUSTOMIZZAZIONE CALENDARIO CRM VTIGER 5.0.4
Contesto
La gestione del calendario del di default è privata, questo significa che ogni utente può avere accesso alle
informazioni del proprio calendario.
Esiste una condivisione dei dati predefinita ma questa comporta che ogni utente decide a chi dare visibilità e
questa è concessa esclusivamente se marca un evento come pubblico.
Una ulteriore limitazione di questa gestione è l’impossibilità di definire dei compiti pubblici, proprietà
consentita solamente per gli eventi chiamata e riunione.
A causa della scarsa granularità di gestione del calendario, si è deciso di apportare delle modifiche alla
struttura del CRM così da avere la possibilità di definire delle politiche di permessi più specifiche.
Modifiche all’interfaccia “Impostazioni>Accesso Condiviso”
La prima modifica apportata riguarda l’interfaccia del pannello Accesso Condiviso posto nel menu delle
Impostazioni.
Il pannello Accesso condiviso è diviso in due parti:
Regole di condivisione a livello di organizzazione
Regole di condivisione personalizzate
Regole di condivisione a livello di organizzazione
La politica predefinita per i privilegi sul calendario è impostata a Privato e lo stato non è modificabile.
Analizzando la tabella vtiger_tab si può trovare qual è il valore tabid che identifica il calendario. Di default
questo è posto a 9. Le politiche di condivisione a livello di organizzazione sono definite nella tabella
vtiger_def_org_share.
ruleid
1
2
3
4
5
6
7
8
9
10
11
12
tabid
2
4
6
7
9
13
16
20
21
22
23
26
permission
3
0
0
3
3
3
3
3
3
3
3
3
editstatus
0
2
0
0
1
0
2
0
0
0
0
0
Per abilitare la modifica dei permessi del calendario sogna portare a 0 il valore di editstatus:
update vtiger_def_org_share
set editstatus=0
where tabid=(select tabid from vtiger_tab where name='Calendar')
Verica dell’esito della modifica:
select editstatus
from vtiger_def_org_share
where tabid=(select tabid from vtiger_tab where name='Calendar')
Il valore del campo permission è impostato a 3, cioè privato, ma può essere modificato con uno dei valori
della tabella vtiger_org_share_action_mapping.
share_action_id
0
1
2
3
4
5
6
7
share_action_name
Public: Read Only
Public: Read, Create/Edit
Public: Read, Create/Edit, Delete
Private
Hide Details
Hide Details and Add Events
Show Details
Show Details and Add Events
Se si vuole impostare un valore superiore a 3 bisogna aggiungere la entry nella tabella
vtiger_org_share_action2tab perché di default sono impostati solamente i livelli da 0 a 3.
Regole di condivisione personalizzate
Le regole di gestione personalizzate sono fortemente legate alle query SQL e questo comporta una modifica
alle pagine php dei moduli.
Come prima cosa occorre avere un menù per la definizione delle politiche di accesso al calendario, serve
quindi editare il file OrgSharingDetailView.php nella directory ${vtiger_base}/modules/Settings.
Nelle righe 49-78 ci sono definite tutte le voci del menù modificabili di default:
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
$custom_access = array();
//Lead Sharing
$custom_access['Leads'] = getSharingRuleList('Leads');
//Account Sharing
$custom_access['Accounts'] = getSharingRuleList('Accounts');
//Potential Sharing
$custom_access['Potentials'] = getSharingRuleList('Potentials');
//HelpDesk Sharing
$custom_access['HelpDesk'] = getSharingRuleList('HelpDesk');
//Email Sharing
//$custom_access['Emails'] = getSharingRuleList('Emails');
//Campaign Sharing
$custom_access['Campaigns'] = getSharingRuleList('Campaigns');
//Quotes Sharing
$custom_access['Quotes'] = getSharingRuleList('Quotes');
//Purchase Order Sharing
$custom_access['PurchaseOrder'] = getSharingRuleList('PurchaseOrder');
//Sales Order Sharing
$custom_access['SalesOrder'] = getSharingRuleList('SalesOrder');
//Invoice Sharing
$custom_access['Invoice'] = getSharingRuleList('Invoice');
Per abilitare la voce di gestione del calendario è sufficiente aggiungere un’entry a questo elenco:
//Calendar
$custom_access['Calendar'] = getSharingRuleList('Calendar');
La posizione dove si inserisce il codice in elenco si rispecchia nella posizione di comparsa della voce nel
menù.
Il CRM mantiene le regole di condivisione associate ad ogni utente non sia sul DB ma che su dei file, uno
per ogni utente, posizionati nella directory ${vtiger_base}/user_privileges. I file in questione sono i vari
sharing_privileges_${user_id}.php. Queste informazioni sono poi riportate nelle tabelle
vtiger_tmp_read_group_sharing_per, vtiger_tmp_read_user_sharing_per,
vtiger_tmp_write_group_sharing_per e vtiger_tmp_write_user_sharing_per. Al fine di impostare tali privilegi
nei profili utente è necessario editare la funzione createUserSharingPrivilegesfile del file
CreateUserPrivilegeFile.php nella directory ${vtiger_base}/modules/Users aggiungendo il seguente codice a
partire dalla riga 367:
//Constructing Calendar Sharing Rules
$cal_share_per_array=getUserModuleSharingObjects("Calendar",$userid,$def_org_sha
re,$current_user_roles,$parent_roles,$current_user_groups);
$cal_share_read_per=$cal_share_per_array['read'];
$cal_share_write_per=$cal_share_per_array['write'];
$newbuf .=
"\$Calendar_share_read_permission=array('ROLE'=>".constructTwoDimensionalCharInt
SingleValueArray($cal_share_read_per['ROLE']).",'GROUP'=>".constructTwoDimension
alArray($cal_share_read_per['GROUP']).");\n\n";
$newbuf .=
"\$Calendar_share_write_permission=array('ROLE'=>".constructTwoDimensionalCharIn
tSingleValueArray($cal_share_write_per['ROLE']).",'GROUP'=>".constructTwoDimensi
onalArray($cal_share_write_per['GROUP']).");\n\n";
Ora si deve fare in modo che le tabelle temporanee contenenti le regole di condivisione vengano popolate,
quindi si deve aggiungere la voce ‘Calendar’ all’array della riga 1536 nella funzione
populateSharingtmptables:
$sharingArray=Array('Leads','Accounts','Contacts','Potentials','HelpDesk','Email
s','Campaigns','Quotes','PurchaseOrder','SalesOrder','Invoice','Calendar');
Modifiche per l’utilizzo dei permessi
Le modifiche apportate finora servono per definire la creazione di permessi di accesso/modica alle
schedulazioni del calendario ma non sono sufficienti per l’effettiva gestione del modulo in quanto le funzioni
del CRM non supportano la nuova gestione dei privilegi.
La definizione di queste funzioni si trova nella directory ${vtiger_base}/include/utils all’interno del file
UserInfoUtil.php che contiene tutte le funzioni di supporto alla gestione degli utenti tra cui il calcolo dei
permessi di accesso/modifica a tabelle e moduli del CRM.
Ogni volta che si accede al modulo del calendario, viene generata la lista di eventi visibili dall’utente che
accede al modulo. Per far si che vengano visualizzati solamente gli eventi che un utente è abilitato a vedere
rispettando i permessi definiti per il proprio ruolo e per il proprio gruppo di appartenenza, qualora esista, si
devono sovrascrivere le righe 4181-4193 della funzione getListViewSecurityParamameter con le seguenti:
$sec_query .= " and (vtiger_crmentity.smownerid in($current_user->id) or
vtiger_crmentity.smownerid in(select vtiger_user2role.userid from
vtiger_user2role inner join vtiger_users on
vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on
vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like
'".$current_user_parent_role_seq."::%') or vtiger_crmentity.smownerid in(select
shareduserid from vtiger_tmp_read_user_sharing_per where userid=".$current_user>id." and tabid=".$tabid.")";
//Adding criteria for group sharing
$sec_query .= " or (vtiger_crmentity.smownerid in (0) and (";
if(sizeof($current_user_groups) > 0)
{
$sec_query .= " vtiger_groups.groupid in (". implode(",",
$current_user_groups) .") or ";
}
$sec_query .= " vtiger_groups.groupid in(select
vtiger_tmp_read_group_sharing_per.sharedgroupid from
vtiger_tmp_read_group_sharing_per where userid=".$current_user->id." and
tabid=".$tabid.")))) ";
Ora si devono cancellare gli entry point della funzione isCalendarPermittedBySharing la quale, situata alle
righe 4542-4554, legge i permessi definiti nella tabella vtiger_sharedcalendar dove sono definite le
condivisioni del calendario della gestione di default.
Per fare questo basta sovrascrivere alcune righe della funzione isPermitted.
In particolare le righe 1345-1360 e 1424-1431 con
$permission =
isReadWritePermittedBySharing($module,$tabid,$actionid,$record_id);
e le righe 1404-1418 con
$permission = isReadPermittedBySharing($module,$tabid,$actionid,$record_id);
L’ultima modifica da apportare riguarda la funzione getSharingModuleList a quale, situata alle righe 45224539, definisce quali sono i moduli condivisi.
Mancando il modulo del calendario all’elenco, il CRM nega gli accessi/modifiche ai dettagli degli eventi.
Serve quindi aggiungere la voce ‘Calendar’ all’array definito nella funzione
$sharingModuleArray=Array('Accounts',
'Leads',
'Contacts',
'Potentials',
'HelpDesk',
'Emails',
'Campaigns',
'Quotes',
'PurchaseOrder',
'SalesOrder',
'Invoice',
'Calendar');
RAFFINAMENTI
Quando si accede al modulo del calendario, di default, si accede alla visualizzazione degli eventi.
Dato che maggiormente vengono definiti i compiti, si sovrascrive la riga 26 del file new_calendar.php
presente nella directory ${vtiger_base}/modules/Calendar con la seguente
$subtab = 'todo';
Dato che la condivisione del calendario è stata modificata è inoltre inutile mantenere il pulsante per la
gestione delle impostazioni del calendario. Per togliere il bottone dalla visualizzazione si deve editare il file
calendarLayout.php nella directory ${vtiger_base}/modules/Calendar alle righe 209 e 247 eliminandole o
commentandole.
SOTTIGLIEZZE
Si può segnalare al CRM che la versione in uso è stata customizzata editando il file index.php nella directory
${vtiger_base} alla riga 686 aggiungendo ‘Custom’ alla stringa visualizzata
vtiger CRM 5.0.4 Custom
e modificando i campi della tabella vtiger_version con la seguente update
update vtiger_version
set old_version='5.0.4',
current_version='5.0.4 Custom'