skanman.plugin.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. //Déclaration d'un item de menu dans le menu principal
  3. function skanman_menu(&$menuItems){
  4. global $myUser;
  5. if(!$myUser->can('skanman','read')) return;
  6. $menuItems[] = array(
  7. 'sort'=>3,
  8. 'url'=>'index.php?module=skanman',
  9. 'label'=>'Scanner',
  10. 'icon'=> 'fas fa-file-medical-alt',
  11. 'color'=> '#1abc9c'
  12. );
  13. }
  14. //Cette fonction va generer une page quand on clique sur Scanner dans menu
  15. function skanman_page(){
  16. global $_;
  17. if(!isset($_['module']) || $_['module'] !='skanman') return;
  18. $page = !isset($_['page']) ? 'list.scanfile' : $_['page'];
  19. $page = str_replace('..','',$page);
  20. $file = __DIR__.SLASH.'page.'.$page.'.php';
  21. if(!file_exists($file)) throw new Exception("Page ".$page." inexistante");
  22. require_once($file);
  23. }
  24. //Fonction executée lors de l'activation du plugin
  25. function skanman_install($id){
  26. if($id != 'fr.core.skanman') return;
  27. if(!preg_match('/ImageMagick [0-9\.]*/i',shell_exec('convert -version'))) throw new Exception("Imagemagick est manquant sur le système, merci de l'installer avec la commande <code>apt-get install imagemagick</code>");
  28. Entity::install(__DIR__);
  29. global $conf;
  30. $conf->put('skanman_api_token',base64_encode('m1y3'.time().'h4$h'.mt_rand(0,1000).'43v3r'));
  31. $conf->put('skanman_api_user','admin');
  32. $conf->put('skanman_scan_light','50');
  33. $conf->put('skanman_scan_contrast','10');
  34. $conf->put('skanman_scan_resolution','240');
  35. $conf->put('skanman_scan_page_height','297');
  36. $conf->put('skanman_synchronization_version',time());
  37. $conf->put('skanman_sort_category','sort');
  38. foreach(
  39. array(
  40. array('label'=>'Factures','icon'=>'fas fa-file-invoice-dollar','slug'=>'invoice','sort'=>0),
  41. array('label'=>'Devis','icon'=>'far fa-file-alt','slug'=>'offer','sort'=>1),
  42. array('label'=>'Frais','icon'=>'fas fa-ticket-alt','slug'=>'charge','sort'=>2),
  43. array('label'=>'Mon dossier','icon'=>'far fa-eye','slug'=>'mine','sort'=>3,'scope'=>'user','editable'=>false),
  44. array('label'=>'E-Mail','icon'=>'far fa-envelope-open','slug'=>'mail','sort'=>4,'scope'=>'user','editable'=>false),
  45. array('label'=>'À trier','icon'=>'fas fa-random','slug'=>'sort','sort'=>5,'selected'=>true)
  46. ) as $value) {
  47. $item = ScanCategory::provide();
  48. $item->slug = $value['slug'];
  49. $item->label = $value['label'];
  50. $item->icon = $value['icon'];
  51. $item->sort = $value['sort'];
  52. if(!empty($value['selected'])) $item->selected = $value['selected'];
  53. $item->editable = !empty($value['editable']) ? $value['editable'] : true;
  54. $item->path = '/'.$value['label'];
  55. $item->scope = !empty($value['scope']) ? $value['scope'] :'';
  56. $item->save();
  57. }
  58. }
  59. //Fonction executée lors de la désactivation du plugin
  60. function skanman_uninstall($id){
  61. if($id != 'fr.core.skanman') return;
  62. Entity::uninstall(__DIR__);
  63. }
  64. //Déclaration des sections de droits du plugin
  65. function skanman_section(&$sections){
  66. $sections['skanman'] = "Gestion des droits sur le plugin Scanner";
  67. }
  68. //Déclaration du menu de réglages
  69. function skanman_menu_setting(&$settingMenu){
  70. global $myUser;
  71. if(!$myUser->can('skanman','configure')) return;
  72. $settingMenu[]= array(
  73. 'sort' =>1,
  74. 'url' => 'setting.php?section=global.skanman',
  75. 'icon' => 'fas fa-angle-right',
  76. 'label' => 'Scanner'
  77. );
  78. }
  79. //Déclaration des pages de réglages
  80. function skanman_content_setting(){
  81. global $_;
  82. if(file_exists(__DIR__.SLASH.'setting.'.$_['section'].'.php'))
  83. require_once(__DIR__.SLASH.'setting.'.$_['section'].'.php');
  84. }
  85. //Affichage du/des widget(s)
  86. function skanman_widget(&$widgets){
  87. require_once(PLUGIN_PATH.'dashboard'.SLASH.'DashboardWidget.class.php');
  88. $modelWidget = new DashboardWidget();
  89. $modelWidget->model = 'skanman';
  90. $modelWidget->title = 'Scanner';
  91. $modelWidget->icon = 'fas fa-file-medical-alt';
  92. $modelWidget->background = '#1abc9c';
  93. $modelWidget->load = 'action.php?action=skanman_widget_load';
  94. $modelWidget->js = [Plugin::url().'/js/widget.js'];
  95. $modelWidget->css = [Plugin::url().'/css/widget.css'];
  96. $modelWidget->description = "";
  97. $widgets[] = $modelWidget;
  98. }
  99. //Déclaration des settings de base
  100. //Types possibles : voir FieldType.class.php. Un simple string définit une catégorie.
  101. Configuration::setting('skanman',array(
  102. "Général",
  103. 'skanman_api_token' => array("label"=>"Token API","type"=>"password"),
  104. 'skanman_api_user' => array("label"=>"Utilisateur de l'api","type"=>"user"),
  105. 'skanman_mail_body' => array("label"=>"Message d'envois de scan par mail","type"=>"wysiwyg"),
  106. 'skanman_scan_light' => array("label"=>"Brillance du scan (0-100)","legend"=>"Conseillé : 0","type"=>"number"),
  107. 'skanman_scan_contrast' => array("label"=>"Contraste du scan (0-100)","legend"=>"Conseillé : 0","type"=>"number"),
  108. "Scan par défaut",
  109. 'skanman_scan_format' => array("label"=>"Format","type"=>"list",
  110. 'values' => array('a4' => 'Feuille A4','ticket' => 'Ticket de caisse'),
  111. 'default' => 'a4'
  112. ),
  113. 'skanman_scan_face' => array("label"=>"Face scannée","type"=>"list",
  114. 'values' => array('recto' => 'Recto','recto-verso' => 'Recto/verso'),
  115. 'default' => 'recto'
  116. ),
  117. 'skanman_scan_color' => array("label"=>"Couleur","type"=>"list",
  118. 'values' => array('color' => 'Couleur','black' => 'Noir & blanc'),
  119. 'default' => 'color'
  120. ),
  121. 'skanman_scan_stack' => array("label"=>"Numeriser en","type"=>"list",
  122. 'values' => array('one-file' => 'Un document pour toutes les numérisations','multiple-files' => 'Un document par numérisation'),
  123. 'default' => 'one-file'
  124. ),
  125. 'skanman_scan_resolution' => array("label"=>"Résolution du scan (100|150|200|300|400|600 dpi)","legend"=>"Conseillé : 300","type"=>"number"),
  126. 'skanman_ocr_enable' => array("label"=>"Activer le tag automatique par OCR (experimental)","placeholder"=>"necessite l'installation du paquet ocrmypdf","type"=>"boolean"),
  127. 'skanman_scan_page_height' => array("label"=>"Hauteur de page du scan (mm)","legend"=>"Conseillé : 297","type"=>"number"),
  128. 'skanman_image_rotate' => array("label"=>"Faire pivoter les images scannées de x degrés","legend"=>"Conseillé : 180","type"=>"number"),
  129. 'skanman_image_to_pdf' => array("label"=>"Convertir les images en PDF","type"=>"boolean"),
  130. 'skanman_users_rank'=> array("label"=>"Rang des utilisateurs","legend"=>"Rang des utilisateurs disponibles sur l'interface du scanner (mon dossier)","type"=>"rank"),
  131. 'skanman_sort_category' => array("label"=>"Catégorie de tri","type"=>"text"),
  132. 'skanman_scan_logo' => array("label"=>"Logo du scanner","type"=>"image", "attributes"=>array(
  133. "data-action"=>"skanman_scan_logo",
  134. "data-id"=>"logo",
  135. "data-data"=>"{\"variant\":\"light\"}",
  136. )),
  137. 'skanman_scan_css' => array("label"=>"Style personnalisé (css)","type"=>"textarea"),
  138. ));
  139. require_once(__DIR__.SLASH.'action.php');
  140. require_once(__DIR__.SLASH.'api.php');
  141. //Declaration des évenements et entités workflow
  142. Plugin::addHook("workflow_event", function(&$events){
  143. Plugin::need('workflow/WorkflowEvent');
  144. //Evenement entité
  145. $event = WorkflowEvent::registerEntity(__DIR__.SLASH.'Scanfile.class.php');
  146. $event['events']['skanman-file-send'] = 'Lors d\'un scan';
  147. $events[] = $event;
  148. });
  149. function skanman_cron($time){
  150. global $_;
  151. //Nettoyage a minuit des fichiers meta n'ayant plus de fichier ged liés (fichier supprimés depuis la ged)
  152. if(date('H:i', $time)!='00:00' && !isset($_['force-skanman'])) return;
  153. //Vidage des dossiers temporaires
  154. $constructionDirectory = File::dir().'skanman'.SLASH.'tmp';
  155. if(file_exists($constructionDirectory))
  156. delete_folder_tree($constructionDirectory, true);
  157. require_once(__DIR__.SLASH.'Scanfile.class.php');
  158. Plugin::need('document/Element');
  159. $query = Scanfile::staticQuery('SELECT t1.id FROM {{table}} t1 LEFT JOIN '.Element::tableName().' t2 ON t1.element = t2.id WHERE t2.id IS NULL');
  160. if(!$query) return;
  161. $ids = array();
  162. foreach($query->fetchAll() as $line){
  163. $ids[] = $line['id'];
  164. }
  165. if(count($ids)==0) return;
  166. Scanfile::delete(array('id:IN'=>$ids));
  167. }
  168. //Déclation des assets
  169. Plugin::addCss("/css/main.css");
  170. Plugin::addJs("/js/pdf.min.js");
  171. Plugin::addJs("/js/component.js");
  172. Plugin::addJs("/js/main.js");
  173. //Mapping hook / fonctions
  174. Plugin::addHook("install", "skanman_install");
  175. Plugin::addHook("uninstall", "skanman_uninstall");
  176. Plugin::addHook("section", "skanman_section");
  177. Plugin::addHook("menu_main", "skanman_menu");
  178. Plugin::addHook("cron", "skanman_cron");
  179. Plugin::addHook("page", "skanman_page");
  180. Plugin::addHook("menu_setting", "skanman_menu_setting");
  181. Plugin::addHook("content_setting", "skanman_content_setting");
  182. Plugin::addHook("widget", "skanman_widget");