| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700 | 
							- <?php
 
- //Déclaration d'un item de menu dans le menu principal
 
- function client_menu(&$menuItems){
 
- 	global $myUser;
 
- 	if(!$myUser->can('client','read')) return;
 
- 	$menuItems[] = array(
 
- 		'sort'=>3,
 
- 		'url'=>'index.php?module=client',
 
- 		'label'=>'Clients',
 
- 		'icon'=> 'fas fa-user-tie',
 
- 		'color'=> '#3498db'
 
- 	);
 
- }
 
- //Cette fonction va generer une page quand on clique sur client dans menu
 
- function client_page(){
 
- 	global $_;
 
- 	if(!isset($_['module']) || $_['module'] !='client') return;
 
- 	$page = !isset($_['page']) ? 'list.client' : $_['page'];
 
- 	$page = str_replace('..','',$page);
 
- 	$file = __DIR__.SLASH.'page.'.$page.'.php';
 
- 	if(!file_exists($file)) throw new Exception("Page ".$page." inexistante");
 
- 	require_once($file);
 
- }
 
- //Fonction executée lors de l'activation du plugin
 
- function client_install($id){
 
- 	if($id != 'fr.core.client') return;
 
- 	global $conf;
 
- 	Entity::install(__DIR__);
 
- 	$conf->put('client_code_mask','{{label[2]}}-{{Y}}{{M}}-{{id}}');
 
-     $conf->put('client_enable_map', 1);
 
-     $conf->put('client_sheet_max_field', 8);
 
-     $conf->put('client_type', "both");
 
-     //Doc sur : https://entreprise.data.gouv.fr/api_doc/sirene
 
-     $conf->put('client_api_url','https://entreprise.data.gouv.fr/api/sirene/v1/full_text/{{label}}');
 
-     $conf->put('client_api_sheet_url','https://entreprise.data.gouv.fr/api/sirene/v3/etablissements/?siren={{siret}}');
 
-     $conf->put('client_label_plural','clients');
 
-     $conf->put('client_label_singular','client');
 
-     $conf->put('client_holding_singular','holding');
 
-     $dictionary = new Dictionary();
 
-     $dictionary->slug = 'client_category';
 
-     $dictionary->label = 'Categorie de client';
 
-     $dictionary->parent = 0;
 
-     $dictionary->state = Dictionary::ACTIVE;
 
-     $dictionary->save();
 
-     $item = new Dictionary();
 
-     $item->slug = 'client_category_none';
 
-     $item->label = 'Aucune';
 
-     $item->parent = $dictionary->id;
 
-     $item->state = Dictionary::ACTIVE;
 
-     $item->save();
 
-     global $myFirm;
 
- 	if($myFirm->has_plugin('fr.core.export')){
 
- 		Plugin::need('export/ExportModel');
 
- 		$model = new ExportModel();
 
- 		$model->label =  'Export fiche client';
 
- 		$model->privacy = 'public';
 
- 		$model->dataset = 'client-sheet';
 
- 		$model->slug = 'client-sheet';
 
- 		$model->description= "Modèle d'export PDF utilisé depuis la fiche d'un client";
 
- 		$model->document_temporary = '';
 
- 		$model->export_format =  'pdf';
 
- 		$model->plugin = 'client';
 
- 		$model->filename = 'Fiche clients.html';
 
- 		$model->save();
 
- 		copy(__DIR__.SLASH.'export.html',File::dir().$model->filename);
 
- 		File::move(File::dir().$model->filename, 'export'.SLASH.'documents'.SLASH.'client'.SLASH.$model->id.SLASH.$model->filename);
 
- 	}
 
- }
 
- //Fonction executée lors de la désactivation du plugin
 
- function client_uninstall($id){
 
- 	if($id != 'fr.core.client') return;
 
- 	Entity::uninstall(__DIR__);
 
- }
 
- //Déclaration des sections de droits du plugin
 
- Right::register("client",array('label'=>"Gestion des droits sur le plugin client"));
 
- Right::register("client_history",array('label'=>"Gestion des droits sur historique du plugin client"));
 
- //Droits ciblés sur les fiches client
 
- Right::register('client_sheet',array(
 
- 	'label'=>'Gestion des droits sur une fiche client particuliere',
 
- 	'global'=> false,
 
- 	'check' => function($action,$right){
 
- 		global $myUser;
 
- 		if($right->uid <= 0) throw new Exception('Id non spécifié');
 
- 		if(!$myUser->can('client','edit')) throw new Exception('Seul le un edtieur de  client peut définir des droits pour cette fiche');
 
- 	}
 
- ));
 
- require_once(__DIR__.SLASH.'action.php');
 
- //Déclaration du menu de réglages
 
- function client_menu_setting(&$settingMenu){
 
- 	global  $myUser;
 
- 	if(!$myUser->can('client','configure')) return;
 
- 	$settingMenu[]= array(
 
- 		'sort' =>1,
 
- 		'url' => 'setting.php?section=global.client',
 
- 		'icon' => 'fas fa-angle-right',
 
- 		'label' => 'Client'
 
- 	);
 
- }
 
- //Déclaration des pages de réglages
 
- function client_content_setting(){
 
- 	global $_;
 
- 	if(file_exists(__DIR__.SLASH.'setting.'.$_['section'].'.php'))
 
- 		require_once(__DIR__.SLASH.'setting.'.$_['section'].'.php');
 
- }
 
- //Déclaration des settings de base
 
- //Types possibles : text,select ( + "values"=> array('1'=>'Val 1'),password,checkbox. Un simple string définit une catégorie.
 
- Configuration::setting('client',array(
 
-     "Général",
 
-     'client_code_mask' => array("label"=>"Masque de generation de code",
 
-     	"legend"=>"Macro possibles : <br>
 
-     	{{id}} : Identifiant unique client<br>
 
-     	{{label}} : libellé client, possible {{label[x]}} ou x est le nombre de lettres a conserver<br>
 
-     	{{M}} : Mois sur 2 digits<br>
 
-     	{{Y}} : Années sur 4 digits<br>
 
-     	{{y}} : Années sur 2 digits<br>
 
-     	{{rand(x,y)}} : Chiffre aléatoire entre x et y<br>
 
-     	",
 
-     	"placeholder"=>"ex: {{label[2]}}-{{Y}}{{M}}-{{id}}","type"=>"text"),
 
-     'client_enable_map' => array("label"=>"Afficher la mini-map","type"=>"boolean"),
 
-     'client_sheet_max_field' => array("label"=>"Nombre de champs avant résumé","type"=>"number"),
 
-     'client_type' => array("label"=>"Type de client","type"=>"list",'values' => array('individual'=>'Particulier','firm'=>'Entreprise','both'=>'Les deux'), 'default'=>'both'),
 
-     'client_condition' => array("label"=>"Statut de client","type"=>"list",'values' => array('prospect'=>'Prospect','client'=>'Client','both'=>'Les deux'), 'default'=>'both'),
 
-     'client_hide_fields' => array("label"=>"Masquer les uid champs suivants","legend"=>"Uid des champs séparés par saut de ligne (ex: condition <saut de ligne> siret","type"=>"textarea"),
 
-     'Api',
 
-      'client_api_search_url' => array("label"=>"Api de recherche client","placeholder"=>"ex: https://entreprise.data.gouv.fr/api/sirene/v1/full_text/{{label}}","type"=>"text"),
 
-      'client_api_sheet_url' => array("label"=>"Api de fiche client","placeholder"=>"ex: https://entreprise.data.gouv.fr/api/sirene/v3/etablissements/?siren={{siret}}","type"=>"text"),
 
-       "Terminologie",
 
-     'client_holding_singular' => array("label"=>"Libellé des holdings (singulier)",'placeholder'=>'holding',"type"=>"text"),
 
-     'client_label_plural' => array("label"=>"Libellé des clients (pluriel)",'placeholder'=>'clients',"type"=>"text"),
 
-     'client_label_singular' => array("label"=>"Libellé des clients (singulier)",'placeholder'=>'client',"type"=>"text"),
 
- ));
 
- //Affichage du/des widget(s)
 
- function client_widget(&$widgets){
 
- 	global $myUser;
 
- 	require_once(PLUGIN_PATH.'dashboard'.SLASH.'DashboardWidget.class.php');
 
- 	$modelWidget = new DashboardWidget();
 
- 	$modelWidget->model = 'client';
 
- 	$modelWidget->title = 'Client';
 
- 	$modelWidget->icon = 'fas fa-user-tie';
 
- 	$modelWidget->background = '#6B5B95';
 
- 	$modelWidget->load = 'action.php?action=client_widget_load';
 
- 	$modelWidget->js = [Plugin::url().'/js/widget.js?v=2'];
 
- 	$modelWidget->css = [Plugin::url().'/css/widget.css?v=2'];
 
- 	$modelWidget->description = "Module de gestion des clients et prospects";
 
- 	$widgets[] = $modelWidget;
 
- }
 
- function client_tab_menu(&$clientMenu,$client){
 
- 	$menu = new MenuItem();
 
- 	$menu->label = 'Accueil';
 
- 	$menu->url = '#tab=home';
 
- 	$menu->slug = 'home';
 
- 	$menu->sort = -1;
 
- 	$clientMenu[] = $menu;
 
- }
 
- function client_tab_page($slug){
 
- 	if($slug != 'home') return;
 
- 	require_once(__DIR__.SLASH.'tab.home.php');
 
- }
 
- function client_merge($clientBase,$clientToMerge,&$logs){
 
- 	require_once(__DIR__.SLASH.'Client.class.php');
 
- 	$logs[] = ' Migration des sous clients attachés ';
 
- 	Client::change(array('parent'=>$clientBase->id),array('parent'=>$clientToMerge->id));
 
- 	$logs[] = ' Migration des contacts attachés ';
 
- 	ContactPerson::change(array('uid'=>$clientBase->id),array('scope'=>'client','uid'=>$clientToMerge->id));
 
- 	$logs[] = ' Migration des adresses attachées ';
 
- 	Address::change(array('uid'=>$clientBase->id),array('scope'=>'client','uid'=>$clientToMerge->id));
 
- }
 
- //Declaration des évenements et entités workflow
 
- Plugin::addHook("workflow_event", function(&$events){
 
- 	//Evenement entité
 
- 	$events[] = WorkflowEvent::registerEntity(__DIR__.SLASH.'Client.class.php');
 
- 	//Evenement liste d'entité
 
- 	$events[] = WorkflowEvent::registerList(__DIR__.SLASH.'Client.class.php');
 
- });
 
- global $myFirm;
 
- if( $myFirm->has_plugin('fr.core.export')){
 
- 	require_once(__ROOT__.PLUGIN_PATH.'export'.SLASH.'ExportModel.class.php');
 
- 	ExportModel::add('client','client-sheet', 'Fiche client', function($parameters){
 
- 		global $myUser,$myFirm;
 
- 		require_once(__DIR__.SLASH.'Client.class.php');
 
- 		$client = new Client();
 
- 		if(isset($parameters['description']) && $parameters['description']!=true && !empty($parameters['id']))
 
- 			$client =  Client::getById($parameters['id']);
 
- 		$data['client'] = ExportModel::fromEntity($client);
 
- 		unset($data['client']['value']['parent']);
 
- 		if(empty($client->comment)) unset($data['client']['value']['comment']['value']);
 
- 		$data['client']['value']['category']['value'] =
 
- 		isset($data['client']['value']['category']) && $data['client']['value']['category']['value']!=0 ? Dictionary::getById($data['client']['value']['category']['value'])->label: 'Aucune';
 
- 		if(!empty($data['client']['value']['type']['value']))
 
- 			$data['client']['value']['type']['value'] = Client::types($data['client']['value']['type']['value'])['label'];
 
- 		if(!empty($data['client']['value']['condition']['value']))
 
- 			$data['client']['value']['condition']['value'] = Client::conditions($data['client']['value']['condition']['value'])['label'];
 
- 		$data['client']['value']['created']['value'] = $data['client']['value']['created']['value'];
 
- 		$data['client']['value']['updated']['value'] = $data['client']['value']['updated']['value'];
 
- 		$data['client']['value']['updater']['value'] = User::byLogin($data['client']['value']['updater']['value'])->fullName();
 
- 		$data['client']['value']['creator']['value'] = User::byLogin($data['client']['value']['creator']['value'])->fullName();
 
- 		//export des contacts liés
 
- 		$data['client']['value']['contacts'] = array('label'=>'Liste des contacts', 'type'=>'list','value' => array());
 
- 		$contacts = $client->id == 0 ? array(new ContactPerson()) :ContactPerson::loadAll(array('scope'=>'client','uid'=>$client->id));
 
- 		foreach($contacts as $contact){
 
- 			$contact->meta();
 
- 			$contactRow = ExportModel::fromEntity($contact)['value'];
 
- 			$contactRow['phone']['value'] = $contact->phone;
 
- 			$contactRow['mobile']['value'] = $contact->mobile;
 
- 			$contactRow['mail']['value'] = $contact->mail;
 
- 			$data['client']['value']['contacts']['value'][] = $contactRow;
 
- 		}
 
- 		//export des adresses liées
 
- 		$data['client']['value']['addresses'] = array('label'=>'Liste des adresses liées', 'type'=>'list','value' => array());
 
- 		$addresses = $client->id == 0 ? array(new Address()) :$client->addresses();
 
- 		foreach($addresses as $address){
 
- 			$data['client']['value']['addresses']['value'][] = ExportModel::fromEntity($address)['value'];
 
- 		}
 
- 		//export des champs custom
 
- 		if($myFirm->has_plugin('fr.core.dynamicform')){
 
- 			Plugin::need('dynamicform/DynamicForm');
 
- 			$data['client']['value']['dynamicFields'] = array('label'=>'Champs personnalisés liés', 'type'=>'list','value' => array());
 
- 			$dynamicFields = DynamicForm::show('client-sheet-custom',array(
 
- 				'arrayOutput' => true,
 
- 				'firm' => $myFirm->id,
 
- 				'uid' => $client->id,
 
- 				'scope' => 'client'
 
- 			));
 
- 			$fieldTypes = FieldType::available();
 
- 			if(is_array($dynamicFields)){
 
- 				foreach($dynamicFields as $dynamicField){
 
- 						$value = $dynamicField['value'];
 
- 						if(!isset(  $fieldTypes[$dynamicField['type']->slug])   ) continue;
 
- 						$type = $fieldTypes[$dynamicField['type']->slug];
 
- 						if(!empty($value) && property_exists($type,"onRawDisplay")){
 
- 							$method = $type->onRawDisplay;
 
- 							$value = $method($value,array('type'=>$type));
 
- 						}
 
- 					$data['client']['value']['dynamicFields']['value'][] = array(
 
- 						'value' => array('label' => $dynamicField['label']  , 'value' => $value )
 
- 					);
 
- 				}
 
- 			}
 
- 		}
 
- 		$data['client']['value']['logo'] = array(
 
- 			'label'=>'Logo du client',
 
- 			'type'=>'image',
 
- 			'value' => file_get_contents($client->logo(true))
 
- 		);
 
- 		if(empty($client->comment)) $data['client']['value']['comment']['value'] = false;
 
- 		$parent = new Client();
 
- 		$parent->label = 'Aucun';
 
- 		if(!empty($client->parent)) $parent = Client::getById($client->parent);
 
- 		$data['client']['value']['parent'] = ExportModel::fromEntity($parent);
 
- 		// print_r($data['client']['value']['parent']);
 
- 		// print_r($client->parent);
 
- 		// exit();
 
- 		return $data;
 
- 	});
 
- }
 
- function client_list_action(){
 
- ?>
 
-  <a class="dropdown-item" onclick="client_client_search({exportMode:true,keepChecked:true});" href="#"><i class="fa fa-file-export"></i> Exporter en excel</a>
 
-  <a class="dropdown-item" onclick="client_client_mail_copy();" href="#"><i class="far fa-envelope-open"></i> Copier les e-mails</a>
 
-  <?php
 
- }
 
- function client_filter(&$filters){
 
- 	global $conf;
 
- 	require_once(__DIR__.SLASH.'Client.class.php');
 
- 	$types = array();
 
- 	foreach (Client::types() as $key => $value)
 
- 	   $types[$key] = $value['label'];
 
- 	$conditions = array();
 
- 	foreach (Client::conditions() as $key => $value)
 
-    		$conditions[$key] = $value['label'];
 
-    	$hideFields = explode("\n",$conf->get('client_hide_fields'));
 
-    	$currentFilters = array(
 
-     'id' => '<option value="main.id" data-filter-type="number">Identifiant unique</option>',
 
-     'type' => '<option value="main.type" data-filter-type="list" data-values=\''.json_encode($types).'\'>Type</option>',
 
-     'condition' => '<option value="main.condition" data-filter-type="list" data-values=\''.json_encode($conditions).'\'>Statut</option>',
 
-     'creator' => '<option value="main.creator" data-filter-type="user">Auteur</option>',
 
-     'label' => '<option value="main.label" data-filter-type="text">Libellé</option>',
 
-     'firm' => '<option value="fi.id" data-filter-type="firm">Etablissement</option>',
 
-     'created' => '<option value="main.created" data-filter-type="date">Création</option>',
 
-     'job' => '<option value="main.job" data-filter-type="text">Métier</option>',
 
-     'code' => '<option value="main.code" data-filter-type="text">Code '.$conf->get('client_label_singular').'</option>',
 
-     'siret' => '<option value="main.siret" data-filter-type="text">N° SIRET</option>',
 
-     'address.city' => '<option value="address.city" data-filter-type="text">Ville</option>',
 
-     'address.zip' => '<option value="address.zip" data-filter-type="text">Code postal</option>',
 
-     'mail.value' => '<option value="mail.value" data-filter-type="text">Adresse E-mail</option>',
 
-     'phone.value' => '<option value="phone.value" data-filter-type="text">N° Téléphone</option>',
 
-     'comment' => '<option value="main.comment" data-filter-type="text">Commentaire</option>',
 
-     'internal_contact' => '<option value="internal_contact" data-filter-type="user">Client contact</option>'
 
- 	);
 
- 	foreach($currentFilters as $key=>$filter){
 
- 		if(in_array($key,$hideFields)) unset($currentFilters[$key]);
 
- 	}
 
- 	$filters = array_merge($filters, $currentFilters);
 
- }
 
- function client_search_view(&$columns){
 
- 	global $conf;
 
- 	$hideFields = explode("\n",$conf->get('client_hide_fields'));
 
- 	$mycolumns = array(
 
-             'logo' =>
 
-                 array(
 
-                     'head' => '<th></th>',
 
-                     'body' => '<td class="align-middle text-center"><img class="client-logo-mini avatar-rounded" data-src="{{logo}}"></td>',
 
-                 ),
 
-              'label' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="main.label">Libellé</th>',
 
-                     'body' => '<td class="align-middle">
 
-                         <a href="index.php?module=client&page=sheet.client&id={{id}}" data-type="card" data-show-delay="800" data-action="client_card" data-parameters=\'{"id":"{{id}}"}\'>{{{label}}}</a> {{#pseudonym}}<small class="text-muted">({{{pseudonym}}})</small>{{/pseudonym}}
 
-                         {{#holding}}<br><small class="text-muted">Sous etablissement de <a href="index.php?module=client&page=sheet.client&id={{holding.id}}">{{{holding.label}}}</a></small>{{/holding}}
 
-                         {{#affiliate}}<br><small class="text-muted">'.$conf->get('client_holding_singular').' de <span class="text-info" title="{{#affiliate.rows}}{{label}}{{/affiliate.rows}}">{{affiliate.count}} Etablissement(s)</span></small>{{/affiliate}}
 
-                         {{#job}}<br/><small class="text-muted">{{{job}}}</small>{{/job}}
 
-                     </td>',
 
-                 ),
 
-             'code' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="code" data-available="created">Code '.($conf->get('client_label_singular')).'</th>',
 
-                     'body' => '<td class="align-middle">{{code}}</td>',
 
-                 ),
 
-             'city' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="address.city">Ville</th>',
 
-                     'body' => '<td class="align-middle text-warning" title="{{address.street}} {{address.complement}} {{address.zip}} {{address.city}}">
 
-                         {{address.city}} {{#address.zip}}
 
-                         <small class="text-muted">
 
-                             ({{address.zip}})
 
-                             <a title="Afficher sur Google Map" target="_blank" href="{{address.mapurl}}"><i class="fas fa-map-marked-alt text-muted ml-2 pointer"></i></a>
 
-                         </small>
 
-                         {{/address.zip}}
 
-                     </td>',
 
-                 ),
 
-             'type' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="main.type" data-available="main.type">Type</th>',
 
-                     'body' => '<td class="align-middle">{{type.label}}</td>',
 
-                 ),
 
-             'category' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="category.label" data-available="main.category">Categorie</th>',
 
-                     'body' => '<td class="align-middle">{{category.label}}</td>',
 
-                 ),
 
-             'mail' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="mail.value" data-available="mail">E-mail</th>',
 
-                     'body' => '<td class="align-middle"><a href="mailto:{{mail}}">{{mail}}</a></td>',
 
-                 ),
 
-             'phone' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="phone.value" data-available="main.phone">Téléphone</th>',
 
-                     'body' => '<td class="align-middle">{{phone}}</td>',
 
-                 ),
 
-             'comment' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="main.comment" data-available="main.comment">Commentaire</th>',
 
-                     'body' => '<td class="align-middle" ><small style="display:block;max-width:300px;max-height:40px;overflow:auto;">{{comment}}</small></td>',
 
-                 ),
 
-             'condition' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="main.condition" data-available="main.created">Statut</th>',
 
-                     'body' => '<td class="align-middle">{{condition.label}}</td>',
 
-                 ),
 
-             'firm' =>
 
-                 array(
 
-                     'head' => '<th data-sortable="fi.label" data-available="fi.label">Etablissement</th>',
 
-                     'body' => '<td class="align-middle">{{firm.label}}</td>',
 
-                 )
 
-         );
 
- 	foreach($mycolumns as $key=>$column){
 
- 		if(in_array($key,$hideFields)) continue;
 
- 		$columns[$key]= $column;
 
- 	}
 
- }
 
- function client_sheet(&$sheet,$client){
 
- global $conf;
 
- $contacts = $client->contacts();
 
- $phone = isset($contacts[Contact::MOBILE]) ? $contacts[Contact::MOBILE] : new Contact();
 
- $mail = isset($contacts[Contact::PROFESSIONAL_MAIL]) ? $contacts[Contact::PROFESSIONAL_MAIL] : new Contact();
 
- $sheet = array();
 
- 	$hideFields = explode("\n",$conf->get('client_hide_fields'));
 
- 	$sheet['label'] = array(
 
- 		'client-type' => 'firm',
 
- 		'label' => 'Libellé <small>'.( !empty($client->code) ? '(N°'.$client->code.')':'').'</small>',
 
- 		'before' => '<div class="input-group">',
 
- 		'after' => '
 
- 		<div class="input-group-append editable-only"> '.(!empty($conf->get('client_api_search_url')) ? '<span class="btn text-muted"  onclick="client_internet_modal()"><i class="fas fa-globe pointer" data-tooltip title="Récuperer les informations sur internet"></i></span>':'').'
 
- 		</div>
 
- 		<div class="input-group-append"> <span class="btn text-muted"  onclick="client_switch_pseudonym(true)"><i class="fas fa-sort" data-tooltip title="Renseigner un pseudonyme"></i></span>
 
- 		</div>
 
- 		</div>',
 
- 		'sort' => 10,
 
- 		'block-class' => 'type-both block-label',
 
- 		'attributes' => array(
 
- 			'onchange' => '"client_client_check_duplicate(this)"'
 
- 		),
 
- 		'class' => 'text-uppercase',
 
- 		'value' => html_entity_decode($client->label)
 
- 	);
 
- 	$sheet['pseudonym'] = array(
 
- 		'client-type' => 'firm',
 
- 		'label' => 'Pseudonyme',
 
- 		'before' => '<div class="input-group">',
 
- 		'after' => '
 
- 		<div class="input-group-append"> <span class="btn text-muted"  onclick="client_switch_pseudonym(false)"><i class="fas fa-sort" data-tooltip title="Renseigner le libellé"></i></span>
 
- 		</div>
 
- 		</div>',
 
- 		'sort' => 11,
 
- 		'block-class' => 'type-both block-pseudonym hidden',
 
- 		'class' => 'text-uppercase',
 
- 		'value' => html_entity_decode($client->pseudonym)
 
- 	);
 
- 	if(!in_array('job',$hideFields))
 
- 	$sheet['job'] = array(
 
- 		'client-type' => 'firm',
 
- 		'label' => 'Métier',
 
- 		'sort' => 20,
 
- 		'block-class' => 'type-both',
 
- 		'value' => html_entity_decode($client->job)
 
- 	);
 
- 	$sheet['firstname'] = array(
 
- 		'client-type' => 'individual',
 
- 		'label' => 'Prénom',
 
- 		'sort' => 8,
 
- 		'block-class' => 'type-individual',
 
- 		'attributes' => array(
 
- 			'onkeyup' => '"client_name_change()"'
 
- 		),
 
- 		'value' => html_entity_decode($client->firstname)
 
- 	);
 
- 	$sheet['name'] = array(
 
- 		'client-type' => 'individual',
 
- 		'label' => 'Nom',
 
- 		'sort' => 9,
 
- 		'block-class' => 'type-individual',
 
- 		'class' => 'text-uppercase',
 
- 		'attributes' => array(
 
- 			'onkeyup' => '"client_name_change()"'
 
- 		),
 
- 		'value' => html_entity_decode($client->name)
 
- 	);
 
- 	if($conf->get('client_condition') == 'both' || empty($conf->get('client_condition')) ){
 
- 		$sheet['condition'] = array(
 
- 			'sort' => 30,
 
- 			'label' => 'Statut',
 
- 			'type' => 'choice',
 
- 			'block-class' => 'condition-block',
 
- 			'values' => array(
 
- 				'prospect' => 'Prospect',
 
- 				'client' => 'Client',
 
- 			),
 
- 			'value' => $client->condition == '' ? 'prospect' : $client->condition,
 
- 		);
 
- 	}
 
- 	if(!in_array('category',$hideFields))
 
- 	$sheet['category'] = array(
 
- 		'sort' => 40,
 
- 		'label' => 'Catégorie',
 
- 		'block-class' => 'field-block',
 
- 		'type' => 'dictionary',
 
- 		'attributes' => array(
 
- 			'data-slug' => '"client_category"',
 
- 			'data-value' => '"'.$client->category.'"'
 
- 		)
 
- 	);
 
- 	if(!in_array('mail',$hideFields))
 
- 	$sheet['mail'] = array(
 
- 		'sort' => 60,
 
- 		'label' => 'E-Mail',
 
- 		'before' => '<div class="input-group">',
 
- 		'after' => '</div>',
 
- 		'attributes' => array(
 
- 			'onchange' => '"client_client_check_duplicate(this)"'
 
- 		),
 
- 		'value' => html_entity_decode($mail->value)
 
- 	);
 
- 	if(!in_array('phone',$hideFields))
 
- 	$sheet['phone'] = array(
 
- 		'sort' => 70,
 
- 		'label' => 'Téléphone',
 
- 		'before' => '<div class="input-group">',
 
- 		'after' => '</div>',
 
- 		'attributes' => array(
 
- 			'onchange' => '"client_client_check_duplicate(this)"'
 
- 		),
 
- 		'value' => normalize_phone_number($phone->value)
 
- 	);
 
- 	if(!in_array('siret',$hideFields))
 
- 	$sheet['siret'] = array(
 
- 		'sort' => 80,
 
- 		'client-type' => 'firm',
 
- 		'label' => 'N° SIRET',
 
- 		'block-class' => 'type-firm',
 
- 		'before' => '<div class="input-group">',
 
- 		'after' => '</div>',
 
- 		'attributes' => array(
 
- 			'onchange' => '"client_client_check_duplicate(this)"'
 
- 		),
 
- 		'value' => $client->siret
 
- 	);
 
- 	if(!in_array('comment',$hideFields))
 
- 	$sheet['comment'] = array(
 
- 		'type' => 'textarea',
 
- 		'label' => 'Commentaire',
 
- 		'value' => html_entity_decode($client->comment)
 
- 	);
 
- }
 
- function client_field_type(&$types){
 
- 	//User
 
- 	$type = new FieldType();
 
- 	$type->slug = 'client';
 
- 	$type->label = 'Client';
 
- 	$type->sqlType = 'integer';
 
- 	$type->default_attributes =
 
- 	array(
 
- 		'class'=>'"form-control"',
 
- 		'data-type'=>'"client"',
 
- 		'type'=>'"text"'
 
- 	);
 
- 	$type->filter = array(
 
- 			'operators' => array (
 
- 				'=' =>array('view'=>'client'),
 
- 				'!='  =>array('view'=>'client'),
 
- 				'null' =>array(),
 
- 				'not null' =>array()
 
- 			)
 
- 	);
 
- 	$type->onInput  = $types['text']->onInput;
 
- 	$type->onRawDisplay = function($value,$options = array()){
 
- 		if(is_null($value) || empty($value)) return;
 
- 		require_once(__DIR__.SLASH.'Client.class.php');
 
- 		if(empty($value)) return '';
 
- 		$client = Client::getById($value);
 
- 		return !$client ? '' : $client->label;
 
- 	};
 
- 	$type->onHtmlDisplay = function($value,$options){
 
- 		if(is_null($value) || empty($value)) return;
 
- 		require_once(__DIR__.SLASH.'Client.class.php');
 
- 		$client = Client::getById($value);
 
- 		return '<a href="index.php?module=client&page=sheet.client&id='.$value.'">'.$client->label.'</a>';
 
- 	};
 
- 	$type->icon = 'fab fa-black-tie';
 
- 	$type->description = 'Autocompletion sur les clients';
 
- 	$type->default = '';
 
- 	$types[$type->slug] = $type;
 
- }
 
- function client_sheet_option(&$options){
 
- 		global $myUser,$_,$myFirm;
 
- 		if($myUser->can('client','configure')):
 
- 			$options[] = '<div class="dropdown-item pointer user-select-none px-3" title="Fusionner ce client" onclick="client_client_merge_edit()"><i class="fas fa-object-group text-warning"></i> Fusionner</div>';
 
- 		endif;
 
- 		if($myUser->can('export', 'read') && $myFirm->has_plugin('fr.core.export')) :
 
- 			$options[] = '<div class="d-inline-block" data-type="export-model" data-parameters=\''.stripslashes(json_encode(array("plugin"=>"client","dataset"=>"client-sheet","id"=>$_['id']))).'\'>
 
- 					<div class="dropdown-item pointer user-select-none px-3" title="Exporter ce client"><i class="fas fa-download"></i> Exporter</div>
 
- 				</div>';
 
- 	    endif;
 
- 	    if($myUser->can('client','edit') || ($_['id']!=0 && $myUser->can('client_sheet','edit',$_['id']))):
 
- 	       	$options[] = '<div class="dropdown-item pointer user-select-none px-3" data-type="right"
 
-        				data-scope = "client_sheet" data-uid = "'.$_['id'].'"><i class="fas fa-user-lock"></i>  Permissions sur la fiche</div>';
 
-        	endif;
 
-        	if($myUser->can('client','delete') || ($_['id']!=0 && $myUser->can('client_sheet','delete',$_['id']))):
 
- 				$options[] = '<div class="dropdown-item text-danger pointer user-select-none px-3" title="Supprimer ce client" onclick="client_client_delete()"><i class="fa fa-trash-alt"></i> Supprimer</div>';
 
- 		endif;
 
- }
 
- //Déclation des assets
 
- Plugin::addCss("/css/main.css");
 
- Plugin::addJs("/js/main.js");
 
- Plugin::addCss('/css/component.css');
 
- Plugin::addJs('/js/component.js');
 
- //Mapping hook / fonctions
 
- Plugin::addHook("install", "client_install");
 
- Plugin::addHook("uninstall", "client_uninstall");
 
- Plugin::addHook("menu_main", "client_menu");
 
- Plugin::addHook("page", "client_page");
 
- Plugin::addHook("menu_setting", "client_menu_setting");
 
- Plugin::addHook("content_setting", "client_content_setting");
 
- Plugin::addHook("widget", "client_widget");
 
- Plugin::addHook("client_merge", "client_merge");
 
- Plugin::addHook("field_types", "client_field_type");
 
- Plugin::addHook("client_sheet_option", "client_sheet_option");
 
- Plugin::addHook("client_list_action","client_list_action");
 
- Plugin::addHook("client_menu", "client_tab_menu");
 
- Plugin::addHook("client_page", "client_tab_page");
 
- Plugin::addHook("client_filter", "client_filter");
 
- Plugin::addHook("client_sheet", "client_sheet");
 
- Plugin::addHook("client_search_view","client_search_view");
 
- ?>
 
 
  |