From be60c13de6392290a480ef48509934cebfdc9fd3 Mon Sep 17 00:00:00 2001 From: frederic34 <frederic.france@free.fr> Date: Mon, 8 Dec 2014 20:33:26 +0100 Subject: [PATCH] WIP Printing System --- .tx/config | 12 + htdocs/core/actions_printing.inc.php | 48 +-- htdocs/core/class/html.formfile.class.php | 10 +- htdocs/core/modules/modPrintIPP.class.php | 156 --------- htdocs/core/modules/modPrinting.class.php | 5 +- .../modules/printing}/index.html | 0 .../modules/printing/modules_printing.php | 86 +++++ .../modules/printing/printgcp.modules.php | 331 ++++++++++++++++++ .../modules/printing/printipp.modules.php | 282 +++++++++++++++ ...nterface_60_modPrinting_Printing.class.php | 71 ---- htdocs/expedition/card.php | 2 + .../install/mysql/migration/3.7.0-3.8.0.sql | 15 + .../{llx_printer_ipp.sql => llx_printing.sql} | 13 +- htdocs/langs/en_US/printgcp.lang | 18 + htdocs/langs/en_US/printing.lang | 10 + htdocs/langs/en_US/printipp.lang | 5 +- htdocs/printing/admin/printing.php | 192 +++++++--- htdocs/{printipp => printing}/lib/index.html | 0 .../lib/printing.lib.php} | 29 +- htdocs/printipp/admin/printipp.php | 246 ------------- htdocs/printipp/index.php | 36 -- 21 files changed, 966 insertions(+), 601 deletions(-) delete mode 100644 htdocs/core/modules/modPrintIPP.class.php rename htdocs/{printipp/admin => core/modules/printing}/index.html (100%) create mode 100644 htdocs/core/modules/printing/modules_printing.php create mode 100644 htdocs/core/modules/printing/printgcp.modules.php create mode 100644 htdocs/core/modules/printing/printipp.modules.php delete mode 100644 htdocs/core/triggers/interface_60_modPrinting_Printing.class.php rename htdocs/install/mysql/tables/{llx_printer_ipp.sql => llx_printing.sql} (83%) create mode 100644 htdocs/langs/en_US/printgcp.lang create mode 100644 htdocs/langs/en_US/printing.lang rename htdocs/{printipp => printing}/lib/index.html (100%) rename htdocs/{printipp/lib/printipp.lib.php => printing/lib/printing.lib.php} (59%) delete mode 100644 htdocs/printipp/admin/printipp.php delete mode 100644 htdocs/printipp/index.php diff --git a/.tx/config b/.tx/config index e4d1fc65732..74875508f29 100644 --- a/.tx/config +++ b/.tx/config @@ -236,6 +236,18 @@ source_file = htdocs/langs/en_US/paypal.lang source_lang = en_US type = MOZILLAPROPERTIES +[dolibarr.printgcp] +file_filter = htdocs/langs/<lang>/printgcp.lang +source_file = htdocs/langs/en_US/printgcp.lang +source_lang = en_US +type = MOZILLAPROPERTIES + +[dolibarr.printing] +file_filter = htdocs/langs/<lang>/printing.lang +source_file = htdocs/langs/en_US/printing.lang +source_lang = en_US +type = MOZILLAPROPERTIES + [dolibarr.printipp] file_filter = htdocs/langs/<lang>/printipp.lang source_file = htdocs/langs/en_US/printipp.lang diff --git a/htdocs/core/actions_printing.inc.php b/htdocs/core/actions_printing.inc.php index f864524fce1..431ac89a94e 100644 --- a/htdocs/core/actions_printing.inc.php +++ b/htdocs/core/actions_printing.inc.php @@ -31,28 +31,34 @@ if ($action == 'print_file' and $user->rights->printing->read) { $langs->load("printing"); - //require_once DOL_DOCUMENT_ROOT . '/core/class/dolprintipp.class.php'; - //$printer = new dolPrintIPP($db, $conf->global->PRINTIPP_HOST, $conf->global->PRINTIPP_PORT, $user->login, $conf->global->PRINTIPP_USER, $conf->global->PRINTIPP_PASSWORD); - //$result = $printer->print_file(GETPOST('file', 'alpha'), GETPOST('printer', 'alpha')); - // Call trigger to Print Doc - //$actiontypecode='AC_PRINT'; - include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; - $interface=new Interfaces($db); - $trigger_name='PRINT_DOCPDF'; - $printing->file = GETPOST('file', 'alpha'); - $printing->printer = GETPOST('printer', 'alpha'); - //print print_r($printing, true); + require_once DOL_DOCUMENT_ROOT . '/core/modules/printing/modules_printing.php'; + $objectprint = new PrintingDriver($db); + $list = $objectprint->listDrivers($db, 10); + if (! empty($list)) { + $errorprint=0; + $printed=0; + foreach ($list as $driver) { + require_once DOL_DOCUMENT_ROOT.'/core/modules/printing/'.$driver.'.modules.php'; + $langs->load($driver); + $classname = 'printing_'.$driver; + $printer = new $classname($db); + //print '<pre>'.print_r($printer, true).'</pre>'; - $result=$interface->run_triggers($trigger_name,$printing,$user,$langs,$conf); - if ($result < 0) { - setEventMessage($interface->errors, 'errors'); - } - if ($result == 0) { - setEventMessage($langs->trans("NoModuleFound")); - } - - if ($result>0) { - setEventMessage($langs->trans("FileWasSentToPrinter", basename(GETPOST('file')))); + if (! empty($conf->global->{$printer->active})) { + $subdir=(GETPOST('printer', 'alpha')=='expedition'?'sending':''); + $errorprint = $printer->print_file(GETPOST('file', 'alpha'), GETPOST('printer', 'alpha'), $subdir); + //if ($errorprint < 0) { + // setEventMessage($interface->errors, 'errors'); + //} + if ($errorprint=='') { + setEventMessage($langs->trans("FileWasSentToPrinter", basename(GETPOST('file'))).' '.$langs->trans("ViaModule").' '.$printer->name); + $printed++; + } + } + } + if ($printed==0) setEventMessage($langs->trans("NoActivePrintingModuleFound")); + } else { + setEventMessage($langs->trans("NoModuleFound"), 'warning'); } $action = ''; } diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index d2183c582cd..9160213667b 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -272,7 +272,7 @@ class FormFile } $printer=0; - if (in_array($modulepart,array('facture','propal','proposal','order','commande'))) // This feature is implemented only for such elements + if (in_array($modulepart,array('facture','propal','proposal','order','commande','expedition'))) // This feature is implemented only for such elements { $printer = (!empty($user->rights->printing->read) && !empty($conf->printing->enabled))?true:false; } @@ -603,8 +603,8 @@ class FormFile $out.= '<td align="right">'; if ($delallowed) { - $out.= '<a href="'.$urlsource.(strpos($urlsource,'?')?'&':'?').'action=remove_file&file='.urlencode($relativepath); - $out.= ($param?'&'.$param:''); + $out.= '<a href="'.$urlsource.(strpos($urlsource,'?')?'&':'?').'action=remove_file&file='.urlencode($relativepath); + $out.= ($param?'&'.$param:''); //$out.= '&modulepart='.$modulepart; // TODO obsolete ? //$out.= '&urlsource='.urlencode($urlsource); // TODO obsolete ? $out.= '">'.img_picto($langs->trans("Delete"), 'delete.png').'</a>'; @@ -613,8 +613,8 @@ class FormFile if ($printer) { //$out.= '<td align="right">'; - $out.= ' <a href="'.$urlsource.(strpos($urlsource,'?')?'&':'?').'action=print_file&printer='.$modulepart.'&file='.urlencode($relativepath); - $out.= ($param?'&'.$param:''); + $out.= ' <a href="'.$urlsource.(strpos($urlsource,'?')?'&':'?').'action=print_file&printer='.$modulepart.'&file='.urlencode($relativepath); + $out.= ($param?'&'.$param:''); $out.= '">'.img_picto($langs->trans("Print"),'printer.png').'</a>'; } if ($morepicto) diff --git a/htdocs/core/modules/modPrintIPP.class.php b/htdocs/core/modules/modPrintIPP.class.php deleted file mode 100644 index 1f3d0a71a7a..00000000000 --- a/htdocs/core/modules/modPrintIPP.class.php +++ /dev/null @@ -1,156 +0,0 @@ -<?php -/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net> - * Copyright (C) 2014 Frederic France <frederic.france@free.fr> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/** \defgroup printipp Module printipp - * \brief Module pour imprimer via CUPS - */ - -/** - * \file htdocs/core/modules/modPrintIPP.class.php - * \ingroup printipp - * \brief Fichier de description et activation du module PrintIPP - */ -include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; - - - -/** - * \class modPrintIPP - * \brief Classe de description et activation du module PrintIPP - */ -class modPrintIPP extends DolibarrModules -{ - - - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - function __construct($db) - { - $this->db = $db ; - $this->numero = 54000; - // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' - // It is used to group modules in module setup page - $this->family = "other"; - // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) - $this->name = preg_replace('/^mod/i','',get_class($this)); - $this->description = "Print via Cups IPP Printer."; - $this->version = 'dolibarr'; // 'development' or 'experimental' or 'dolibarr' or version - $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); - // Where to store the module in setup page (0=common,1=interface,2=others,3=very specific) - $this->special = 1; - // Name of image file used for this module. - // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' - // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' - $this->picto = 'technic'; - - // Data directories to create when module is enabled. - $this->dirs = array(); - - // Config pages - $this->config_page_url = array("printipp.php@printipp"); - - // Dependances - $this->hidden = (! empty($_SERVER["WINDIR"])); - $this->depends = array('printing'); - $this->requiredby = array(); - $this->phpmin = array(5,1); // Minimum version of PHP required by module - $this->need_dolibarr_version = array(3,7,-2); // Minimum version of Dolibarr required by module - $this->conflictwith = array(); - $this->langfiles = array("printipp"); - - // Constantes - $this->const = array(); - - // Boxes - $this->boxes = array(); - - // Permissions - $this->rights = array(); - $this->rights_class = 'printipp'; - - $r=0; - // $this->rights[$r][0] Id permission (unique tous modules confondus) - // $this->rights[$r][1] Libelle par defaut si traduction de cle "PermissionXXX" non trouvee (XXX = Id permission) - // $this->rights[$r][2] Non utilise - // $this->rights[$r][3] 1=Permis par defaut, 0=Non permis par defaut - // $this->rights[$r][4] Niveau 1 pour nommer permission dans code - // $this->rights[$r][5] Niveau 2 pour nommer permission dans code - - $r++; - $this->rights[$r][0] = 54001; - $this->rights[$r][1] = 'Printer'; - $this->rights[$r][2] = 'r'; - $this->rights[$r][3] = 1; - $this->rights[$r][4] = 'read'; - - // Main menu entries - $this->menus = array(); // List of menus to add - $r=0; - - // This is to declare the Top Menu entry: - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=home,fk_leftmenu=modulesadmintools', // Put 0 if this is a top menu - 'type'=>'left', // This is a Top menu entry - 'titre'=>'Printer', - 'mainmenu'=>'printer', - 'url'=>'/printipp/index.php', - 'langs'=>'printipp', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>300, - 'enabled'=>'$conf->printipp->enabled && $leftmenu==\'modulesadmintools\'', - 'perms'=>'$user->rights->printipp->read', // Use 'perms'=>'1' if you want your menu with no permission rules - 'target'=>'', - 'user'=>0); // 0=Menu for internal users, 1=external users, 2=both - - $r++; - - - } - - /** - * Function called when module is enabled. - * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. - * It also creates data directories - * - * @param string $options Options when enabling module ('', 'noboxes') - * @return int 1 if OK, 0 if KO - */ - function init($options='') - { - $sql = array(); - - return $this->_init($sql, $options); - } - - /** - * Function called when module is disabled. - * Remove from database constants, boxes and permissions from Dolibarr database. - * Data directories are not deleted - * - * @param string $options Options when enabling module ('', 'noboxes') - * @return int 1 if OK, 0 if KO - */ - function remove($options='') - { - $sql = array(); - - return $this->_remove($sql, $options); - } - -} diff --git a/htdocs/core/modules/modPrinting.class.php b/htdocs/core/modules/modPrinting.class.php index 144b023bdc8..00c59eaf285 100644 --- a/htdocs/core/modules/modPrinting.class.php +++ b/htdocs/core/modules/modPrinting.class.php @@ -67,7 +67,6 @@ class modPrinting extends DolibarrModules $this->config_page_url = array("printing.php@printing"); // Dependances - $this->hidden = (! empty($_SERVER["WINDIR"])); $this->depends = array(); $this->requiredby = array(); $this->phpmin = array(5,1); // Minimum version of PHP required by module @@ -132,6 +131,7 @@ class modPrinting extends DolibarrModules */ function init($options='') { + // insertion modele dans llx_document_model $sql = array(); return $this->_init($sql, $options); @@ -142,11 +142,12 @@ class modPrinting extends DolibarrModules * Remove from database constants, boxes and permissions from Dolibarr database. * Data directories are not deleted * - * @param string $options Options when enabling module ('', 'noboxes') + * @param string $options Options when enabling module ('', 'noboxes') * @return int 1 if OK, 0 if KO */ function remove($options='') { + // suppression des modeles "printing" $sql = array(); return $this->_remove($sql, $options); diff --git a/htdocs/printipp/admin/index.html b/htdocs/core/modules/printing/index.html similarity index 100% rename from htdocs/printipp/admin/index.html rename to htdocs/core/modules/printing/index.html diff --git a/htdocs/core/modules/printing/modules_printing.php b/htdocs/core/modules/printing/modules_printing.php new file mode 100644 index 00000000000..3b53711f58c --- /dev/null +++ b/htdocs/core/modules/printing/modules_printing.php @@ -0,0 +1,86 @@ +<?php +/* + * Copyright (C) 2014 Frederic France <frederic.france@free.fr> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/mailings/modules_printing.php + * \ingroup printing + * \brief File with parent class of printing modules + */ +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + +/** + * Parent class of emailing target selectors modules + */ +class PrintingDriver +{ + var $db; + var $error; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + $this->db = $db; + } + + /** + * Return list of printing driver + * + * @param DoliDB $db Database handler + * @param string $maxfilenamelength Max length of value to show + * @return array List of drivers + */ + static function listDrivers($db,$maxfilenamelength=0) + { + global $conf; + + $type='printing'; + $liste=array(); + + $moduledir=DOL_DOCUMENT_ROOT."/core/modules/printing/"; + $tmpfiles=dol_dir_list($moduledir,'all',0,'\modules.php','','name',SORT_ASC,0); + foreach($tmpfiles as $record) { + $list[$record['fullname']]=str_replace('.modules.php', '',$record['name']); + } + + return $list; + } + + /** + * Return description of Printing Module + * + * @return string Return translation of key PrintingModuleDescXXX where XXX is module name, or $this->desc if not exists + */ + function getDesc() + { + global $langs; + $langs->load("printing"); + $transstring="PrintingModuleDesc".$this->name; + if ($langs->trans($transstring) != $transstring) return $langs->trans($transstring); + else return $this->desc; + } + +} + diff --git a/htdocs/core/modules/printing/printgcp.modules.php b/htdocs/core/modules/printing/printgcp.modules.php new file mode 100644 index 00000000000..7041e112811 --- /dev/null +++ b/htdocs/core/modules/printing/printgcp.modules.php @@ -0,0 +1,331 @@ +<?php +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/printing/printgcp.modules.php + * \ingroup printing + * \brief File to provide printing with Google Cloud Print + */ + +include_once DOL_DOCUMENT_ROOT.'/core/modules/printing/modules_printing.php'; + +/** + * \class mailing_example + * \brief Class to provide printing with Google Cloud Print + */ +class printing_printgcp extends PrintingDriver +{ + var $name = 'printgcp'; + var $desc = 'PrintGCPDesc'; + var $picto = 'printer'; + var $active = 'PRINTING_PRINTGCP'; + var $conf = array(); + var $login = ''; + var $password = ''; + var $authtoken = ''; + var $db; + + const LOGIN_URL = 'https://www.google.com/accounts/ClientLogin'; + const PRINTERS_SEARCH_URL = 'https://www.google.com/cloudprint/interface/search'; + const PRINT_URL = 'https://www.google.com/cloudprint/interface/submit'; + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $conf; + + $this->db = $db; + $this->login = $conf->global->PRINTGCP_LOGIN; + $this->password = $conf->global->PRINTGCP_PASSWORD; + $this->authtoken = $conf->global->PRINTGCP_AUTHTOKEN; + $this->conf[] = array('varname'=>'PRINTGCP_LOGIN', 'required'=>1, 'example'=>'user@gmail.com', 'type'=>'text'); + $this->conf[] = array('varname'=>'PRINTGCP_PASSWORD', 'required'=>1, 'example'=>'', 'type'=>'password'); + } + + /** + * Return list of available printers + * + * @return string html list of printers + */ + function listAvailablePrinters() + { + global $bc, $conf, $langs; + $langs->load('printgcp'); + $var=true; + $html = '<table width="100%" class="noborder">'; + $html.= '<tr class="liste_titre">'; + $html.= '<td>Name</td>'; + $html.= '<td>displayName</td>'; + $html.= '<td>Id</td>'; + $html.= '<td>OwnerName</td>'; + $html.= '<td>State</td>'; + $html.= '<td>connectionStatus</td>'; + $html.= '<td>Type</td>'; + $html.= '<td align="center">'.$langs->trans("Select").'</td>'; + $html.= '</tr>'."\n"; + $list = $this->getlist_available_printers(); + //$html.= '<td><pre>'.print_r($list,true).'</pre></td>'; + $var = true; + foreach ($list['available'] as $printer_det) + { + $var=!$var; + $html.= "<tr ".$bc[$var].">"; + $html.= '<td>'.$printer_det['name'].'</td>'; + $html.= '<td>'.$printer_det['displayName'].'</td>'; + $html.= '<td>'.$printer_det['id'].'</td>'; // id to identify printer to use + $html.= '<td>'.$printer_det['ownerName'].'</td>'; + $html.= '<td>'.$printer_det['status'].'</td>'; + $html.= '<td>'.$langs->trans('STATE_'.$printer_det['connectionStatus']).'</td>'; + $html.= '<td>'.$langs->trans('TYPE_'.$printer_det['type']).'</td>'; + // Defaut + $html.= '<td align="center">'; + if ($conf->global->PRINTING_GCP_DEFAULT == $printer_det['id']) + { + $html.= img_picto($langs->trans("Default"),'on'); + } + else + $html.= '<a href="'.$_SERVER["PHP_SELF"].'?action=setvalue&mode=test&varname=PRINTING_GCP_DEFAULT&driver=printgcp&value='.urlencode($printer_det['id']).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"),'off').'</a>'; + $html.= '</td>'; + $html.= '</tr>'."\n"; + } + + return $html; + } + + /** + * Return list of available printers + * + * @return array list of printers + */ + function getlist_available_printers() + { + global $conf,$db; + if ($this->authtoken=='') { + $this->GoogleLogin(); + } + $ret['available'] = $this->get_printer_detail(); + return $ret; + } + + /** + * List of printers + * + * @return array list of printers + */ + public function get_printer_detail() + { + // Check if we have auth token + if(empty($this->authtoken)) { + // We don't have auth token so throw exception + throw new Exception("Please first login to Google by calling loginToGoogle function"); + } + // Prepare auth headers with auth token + $authheaders = array("Authorization: GoogleLogin auth=".$this->authtoken, + "GData-Version: 3.0", + ); + // Make Http call to get printers added by user to Google Cloud Print + $responsedata = $this->makeCurl(self::PRINTERS_SEARCH_URL,array(),$authheaders); + $printers = json_decode($responsedata); + // Check if we have printers? + if(is_null($printers)) { + // We dont have printers so return blank array + return array(); + } else { + // We have printers so returns printers as array + return $this->parsePrinters($printers); + } + } + + /** + * Print selected file + * + * @param string $file file + * @param string $module module + * + * @return string '' if OK, Error message if KO + */ + public function print_file($file, $module, $subdir='') + { + global $conf; + if ($this->authtoken=='') { + $this->GoogleLogin(); + } + // si $module=commande_fournisseur alors $conf->fournisseur->commande->dir_output + $fileprint=$conf->{$module}->dir_output; + if ($subdir!='') $fileprint.='/'.$subdir; + $fileprint.='/'.$file; + + $this->sendPrintToPrinter($conf->global->PRINTING_GCP_DEFAULT, $file, $fileprint, 'application/pdf'); + } + + /** + * Sends document to the printer + * + * @param string $printerid Printer id returned by Google Cloud Print + * @param string $printjobtitle Job Title + * @param string $filepath File Path to be send to Google Cloud Print + * @param string $contenttype File content type by example application/pdf, image/png + * @return array status array + */ + public function sendPrintToPrinter($printerid,$printjobtitle,$filepath,$contenttype) + { + $errors=0; + // Check auth token + if(empty($this->authtoken)) { + $errors++; + setEventMessage('Please first login to Google', 'warning'); + } + // Check if printer id + if(empty($printerid)) { + $errors++; + setEventMessage('No provided printer ID', 'warning'); + } + // Open the file which needs to be print + $handle = fopen($filepath, "rb"); + if(!$handle) { + $errors++; + setEventMessage('Could not read the file.'); + } + // Read file content + $contents = fread($handle, filesize($filepath)); + fclose($handle); + // Prepare post fields for sending print + $post_fields = array('printerid' => $printerid, + 'title' => $printjobtitle, + 'contentTransferEncoding' => 'base64', + 'content' => base64_encode($contents), // encode file content as base64 + 'contentType' => $contenttype + ); + // Prepare authorization headers + $authheaders = array("Authorization: GoogleLogin auth=" . $this->authtoken); + // Make http call for sending print Job + $response = json_decode($this->makeCurl(self::PRINT_URL,$post_fields,$authheaders)); + // Has document been successfully sent? + if($response->success=="1") { + return array('status' =>true,'errorcode' =>'','errormessage'=>""); + } else { + return array('status' =>false,'errorcode' =>$response->errorCode,'errormessage'=>$response->message); + } + } + + + /** + * Login into Google Account + * + * @return string true or false + */ + function GoogleLogin() + { + global $db, $conf; + // Prepare post fields required for the login + $loginpostfields = array("accountType" => "HOSTED_OR_GOOGLE", + "Email" => $this->login, + "Passwd" => $this->password, + "service" => "cloudprint", + "source" => "GCP" + ); + // Get the Auth token + $loginresponse = $this->makeCurl(self::LOGIN_URL,$loginpostfields); + $token = $this->getAuthToken($loginresponse); + if(! empty($token)&&!is_null($token)) { + $this->authtoken = $token; + $result=dolibarr_set_const($db, 'PRINTGCP_AUTHTOKEN', $token, 'chaine', 0, '', $conf->entity); + return true; + } else { + return false; + } + + } + + /** + * + * Parse json response and return printers array + * @param string $jsonobj Json response object + * @return array return array of printers + */ + private function parsePrinters($jsonobj) + { + $printers = array(); + if (isset($jsonobj->printers)) { + foreach ($jsonobj->printers as $gcpprinter) { + $printers[] = array('id' =>$gcpprinter->id, + 'name' =>$gcpprinter->name, + 'defaultDisplayName' =>$gcpprinter->defaultDisplayName, + 'displayName' =>$gcpprinter->displayName, + 'ownerId' =>$gcpprinter->ownerId, + 'ownerName' =>$gcpprinter->ownerName, + 'connectionStatus' =>$gcpprinter->connectionStatus, + 'status' =>$gcpprinter->status, + 'type' =>$gcpprinter->type + ); + } + } + return $printers; + } + + /** + * Parse data to get auth token + * + * @param string $response response from curl + * @return string token + */ + private function getAuthToken($response) + { + // Search Auth tag + preg_match("/Auth=([a-z0-9_-]+)/i", $response, $matches); + $authtoken = @$matches[1]; + return $authtoken; + } + + /** + * Curl request + * + * @param string $url url to hit + * @param array $postfields array of post fields + * @param array $headers array of http headers + * @return + */ + private function makeCurl($url,$postfields=array(),$headers=array()) + { + // Curl Init + $curl = curl_init($url); + // Curl post request + if(! empty($postfields)) { + // As is HTTP post curl request so set post fields + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postfields); + } + // Curl request headers + if(! empty($headers)) { + // As curl requires header so set headers here + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + } + curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + // Execute the curl and return response + $response = curl_exec($curl); + curl_close($curl); + return $response; + } + + +} diff --git a/htdocs/core/modules/printing/printipp.modules.php b/htdocs/core/modules/printing/printipp.modules.php new file mode 100644 index 00000000000..5252341c2d3 --- /dev/null +++ b/htdocs/core/modules/printing/printipp.modules.php @@ -0,0 +1,282 @@ +<?php +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/modules/printing/printipp.modules.php + * \ingroup mailing + * \brief File to provide printing with PrintIPP + */ + +include_once DOL_DOCUMENT_ROOT.'/core/modules/printing/modules_printing.php'; + +/** + * \class mailing_example + * \brief Class to provide printing with PrintIPP + */ +class printing_printipp extends PrintingDriver +{ + var $name='printipp'; + var $desc='PrintIPPDesc'; + var $picto='printer'; + var $active='PRINTING_PRINTIPP'; + var $conf=array(); + var $host; + var $port; + var $userid; /* user login */ + var $user; + var $password; + var $error; + var $db; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $conf; + + $this->db=$db; + $this->host=$conf->global->PRINTIPP_HOST; + $this->port=$conf->global->PRINTIPP_PORT; + $this->user=$conf->global->PRINTIPP_USER; + $this->password=$conf->global->PRINTIPP_PASSWORD; + $this->conf[] = array('varname'=>'PRINTIPP_HOST', 'required'=>1, 'example'=>'localhost', 'type'=>'text'); + $this->conf[] = array('varname'=>'PRINTIPP_PORT', 'required'=>1, 'example'=>'631', 'type'=>'text'); + $this->conf[] = array('varname'=>'PRINTIPP_USER', 'required'=>0, 'example'=>'', 'type'=>'text'); + $this->conf[] = array('varname'=>'PRINTIPP_PASSWORD', 'required'=>0, 'example'=>'', 'type'=>'password'); + } + + /** + * Print selected file + * + * @param string $file file + * @param string $module module + * @param string $subdir subdirectory of document like for expedition subdir is sendings + * + * @return string '' if OK, Error message if KO + */ + function print_file($file, $module, $subdir='') + { + global $conf,$db; + + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/dolibarr_printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setJobName($file,true); + $ipp->setUserName($this->userid); + if (! empty($this->user)) $ipp->setAuthentication($this->user,$this->password); + + // select printer uri for module order, propal,... + $sql = 'SELECT rowid,printer_id,copy FROM '.MAIN_DB_PREFIX.'printing WHERE module="'.$module.'" AND driver="printipp"'; + $result = $db->query($sql); + if ($result) + { + $obj = $this->db->fetch_object($result); + if ($obj) + { + $ipp->setPrinterURI($obj->printer_id); + } + else + { + if (! empty($conf->global->PRINTIPP_URI_DEFAULT)) + { + $ipp->setPrinterURI($conf->global->PRINTIPP_URI_DEFAULT); + } + else + { + return 'NoDefaultPrinterDefined'; + } + } + } + + // Set number of copy + $ipp->setCopies($obj->copy); + $fileprint=$conf->{$module}->dir_output; + if ($subdir!='') $fileprint.='/'.$subdir; + $fileprint.='/'.$file; + $ipp->setData($fileprint); + $ipp->printJob(); + + return ''; + } + + /** + * Return list of available printers + * + * @return string html list of printers + */ + function listAvailablePrinters() + { + global $bc, $conf, $langs; + $var=true; + $html = '<table width="100%" class="noborder">'; + $html.= '<tr class="liste_titre">'; + $html.= '<td>Uri</td>'; + $html.= '<td>Name</td>'; + $html.= '<td>State</td>'; + $html.= '<td>State_reason</td>'; + $html.= '<td>State_reason1</td>'; + $html.= '<td>BW</td>'; + $html.= '<td>Color</td>'; + //$html.= '<td>Device</td>'; + $html.= '<td>Media</td>'; + $html.= '<td>Supported</td>'; + $html.= '<td align="center">'.$langs->trans("Select").'</td>'; + $html.= "</tr>\n"; + $list = $this->getlist_available_printers(); + $var = true; + foreach ($list as $value) + { + $var=!$var; + $printer_det = $this->get_printer_detail($value); + $html.= "<tr ".$bc[$var].">"; + $html.= '<td>'.$value.'</td>'; + //$html.= '<td><pre>'.print_r($printer_det,true).'</pre></td>'; + $html.= '<td>'.$printer_det->printer_name->_value0.'</td>'; + $html.= '<td>'.$printer_det->printer_state->_value0.'</td>'; + $html.= '<td>'.$printer_det->printer_state_reasons->_value0.'</td>'; + $html.= '<td>'.$printer_det->printer_state_reasons->_value1.'</td>'; + $html.= '<td>'.$printer_det->printer_type->_value2.'</td>'; + $html.= '<td>'.$printer_det->printer_type->_value3.'</td>'; + //$html.= '<td>'.$printer_det->device_uri->_value0.'</td>'; + $html.= '<td>'.$printer_det->media_default->_value0.'</td>'; + $html.= '<td>'.$printer_det->media_type_supported->_value1.'</td>'; + // Defaut + $html.= '<td align="center">'; + if ($conf->global->PRINTIPP_URI_DEFAULT == $value) + { + $html.= img_picto($langs->trans("Default"),'on'); + } + else + $html.= '<a href="'.$_SERVER["PHP_SELF"].'?action=setvalue&mode=test&varname=PRINTIPP_URI_DEFAULT&driver=printipp&value='.urlencode($value).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"),'off').'</a>'; + $html.= '</td>'; + $html.= '</tr>'."\n"; + } + + return $html; + } + + /** + * Return list of available printers + * + * @return array list of printers + */ + function getlist_available_printers() + { + global $conf,$db; + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/dolibarr_printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setUserName($this->userid); + if (! empty($this->user)) $ipp->setAuthentication($this->user,$this->password); + $ipp->getPrinters(); + return $ipp->available_printers; + } + + /** + * Get printer detail + * + * @param string $uri URI + * @return array List of attributes + */ + function get_printer_detail($uri) + { + global $conf,$db; + + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/dolibarr_printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setUserName($this->userid); + if (! empty($this->user)) $ipp->setAuthentication($this->user,$this->password); + $ipp->setPrinterURI($uri); + $ipp->getPrinterAttributes(); + return $ipp->printer_attributes; + } + + /** + * List jobs print + * + * @param string $module module + * + * @return void + */ + function list_jobs($module) + { + global $conf, $db, $bc; + include_once DOL_DOCUMENT_ROOT.'/includes/printipp/CupsPrintIPP.php'; + $ipp = new CupsPrintIPP(); + $ipp->setLog(DOL_DATA_ROOT.'/dolibarr_printipp.log','file',3); // logging very verbose + $ipp->setHost($this->host); + $ipp->setPort($this->port); + $ipp->setUserName($this->userid); + if (! empty($this->user)) $ipp->setAuthentication($this->user,$this->password); + // select printer uri for module order, propal,... + $sql = 'SELECT rowid,printer_uri,printer_name FROM '.MAIN_DB_PREFIX.'printer_ipp WHERE module="'.$module.'"'; + $result = $this->db->query($sql); + if ($result) + { + $obj = $this->db->fetch_object($result); + if ($obj) + { + $ipp->setPrinterURI($obj->printer_uri); + } + else + { + // All printers + $ipp->setPrinterURI("ipp://localhost:631/printers/"); + } + } + // Getting Jobs + $ipp->getJobs(false,0,'completed',false); + print '<table width="100%" class="noborder">'; + print '<tr class="liste_titre">'; + print "<td>Id</td>"; + print "<td>Owner</td>"; + print "<td>Printer</td>"; + print "<td>File</td>"; + print "<td>Status</td>"; + print "<td>Cancel</td>"; + print "</tr>\n"; + $jobs = $ipp->jobs_attributes; + $var = True; + //print '<pre>'.print_r($jobs,true).'</pre>'; + foreach ($jobs as $value ) + { + $var=!$var; + print "<tr ".$bc[$var].">"; + print '<td>'.$value->job_id->_value0.'</td>'; + print '<td>'.$value->job_originating_user_name->_value0.'</td>'; + print '<td>'.$value->printer_uri->_value0.'</td>'; + print '<td>'.$value->job_name->_value0.'</td>'; + print '<td>'.$value->job_state->_value0.'</td>'; + print '<td>'.$value->job_uri->_value0.'</td>'; + print '</tr>'; + } + print "</table>"; + } + +} diff --git a/htdocs/core/triggers/interface_60_modPrinting_Printing.class.php b/htdocs/core/triggers/interface_60_modPrinting_Printing.class.php deleted file mode 100644 index b02b16f4796..00000000000 --- a/htdocs/core/triggers/interface_60_modPrinting_Printing.class.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -/* Copyright (C) 2005-2014 Laurent Destailleur <eldy@users.sourceforge.net> - * Copyright (C) 2005-2014 Regis Houssin <regis.houssin@capnetworks.com> - * Copyright (C) 2014 Marcos Garc�a <marcosgdf@gmail.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * \file htdocs/core/triggers/interface_60_modPrinting_Printing.class.php - * \ingroup printing - * \brief Trigger call by printing to print with PrintIPP - * \remarks - */ -require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php'; - - -/** - * Class of triggers for printing - */ -class InterfacePrinting extends DolibarrTriggers -{ - - public $family = 'printing'; - public $picto = 'technic'; - public $description = "Triggers of this module is used for printing via PrintIPP."; - public $version = self::VERSION_DOLIBARR; - - /** - * Function called when a Dolibarrr business event is done. - * All functions "runTrigger" are triggered if file is inside directory htdocs/core/triggers or htdocs/module/code/triggers (and declared) - * - * @param string $action Event action code - * @param Object $object Object - * @param User $user Object user - * @param Translate $langs Object langs - * @param conf $conf Object conf - * @return int <0 if KO, 0 if no triggered ran, >0 if OK - */ - public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf) - { - global $db; - // Put here code you want to execute when a Dolibarr business events occurs. - // Data and type of action are stored into $object and $action - - // Actions - - if ($action=='PRINT_DOCPDF') { - require_once DOL_DOCUMENT_ROOT . '/core/class/dolprintipp.class.php'; - $printer = new dolPrintIPP($db, $conf->global->PRINTIPP_HOST, $conf->global->PRINTIPP_PORT, $user->login, $conf->global->PRINTIPP_USER, $conf->global->PRINTIPP_PASSWORD); - $result = $printer->print_file($object->file, $object->printer); - dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); - //$this->errors[]='test'; - //return -1; - return 1; - } - return 0; - } - -} diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index b4ca3504347..1f01d4ad981 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -414,6 +414,8 @@ if (GETPOST('removedfile','alpha')) $action ='presend'; } +include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php'; + /* * Send mail */ diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index a190f102023..ee73492d9f0 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -26,4 +26,19 @@ create table llx_c_price_expression expression varchar(80) NOT NULL )ENGINE=innodb; +--create table for user conf of printing driver +CREATE TABLE llx_printing +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + datec datetime, + printer_name text NOT NULL, + printer_location text NOT NULL, + printer_id varchar(255) NOT NULL, + copy integer NOT NULL DEFAULT '1', + module varchar(16) NOT NULL, + driver varchar(16) NOT NULL, + userid integer +)ENGINE=innodb; + ALTER TABLE llx_product_fournisseur_price ADD fk_price_expression integer DEFAULT NULL; diff --git a/htdocs/install/mysql/tables/llx_printer_ipp.sql b/htdocs/install/mysql/tables/llx_printing.sql similarity index 83% rename from htdocs/install/mysql/tables/llx_printer_ipp.sql rename to htdocs/install/mysql/tables/llx_printing.sql index a19e05587d6..3da96b1e6b8 100644 --- a/htdocs/install/mysql/tables/llx_printer_ipp.sql +++ b/htdocs/install/mysql/tables/llx_printing.sql @@ -1,5 +1,5 @@ -- ============================================================================ --- Copyright (C) 2013 Florian HENRY <florian.henry@open-concept.pro> +-- Copyright (C) 2014 Frederic France <frederic.france@free.fr> -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -16,15 +16,16 @@ -- -- ============================================================================ -CREATE TABLE llx_printer_ipp +CREATE TABLE llx_printing ( rowid integer AUTO_INCREMENT PRIMARY KEY, - tms timestamp, - datec datetime, + tms timestamp, + datec datetime, printer_name text NOT NULL, printer_location text NOT NULL, - printer_uri varchar(255) NOT NULL, + printer_id varchar(255) NOT NULL, copy integer NOT NULL DEFAULT '1', module varchar(16) NOT NULL, - login varchar(32) NOT NULL + driver varchar(16) NOT NULL, + userid integer )ENGINE=innodb; diff --git a/htdocs/langs/en_US/printgcp.lang b/htdocs/langs/en_US/printgcp.lang new file mode 100644 index 00000000000..9751649a738 --- /dev/null +++ b/htdocs/langs/en_US/printgcp.lang @@ -0,0 +1,18 @@ +# Dolibarr language file - Source file is en_US - printgccp +PRINTGCP=Google Cloud Print +PrintGCPDesc=This driver allow to send documents directly to a printer with Google Cloud Print. +PrintingDriverDescprintgcp=Configuration variables for printing driver Google Cloud Print. +PrintTestDescprintgcp=List of Printers for Google Cloud Print. +PRINTGCP_LOGIN=Google Account Login +PRINTGCP_PASSWORD=Google Account Password +STATE_ONLINE=Online +STATE_UNKNOWN=Unknown +STATE_OFFLINE=Offline +STATE_DORMANT=Offline for quite a while +TYPE_GOOGLE=Google +TYPE_HP=HP Printer +TYPE_DOCS=DOCS +TYPE_DRIVE=Google Drive +TYPE_FEDEX=Fedex +TYPE_ANDROID_CHROME_SNAPSHOT=Android +TYPE_IOS_CHROME_SNAPSHOT=IOS diff --git a/htdocs/langs/en_US/printing.lang b/htdocs/langs/en_US/printing.lang new file mode 100644 index 00000000000..77c63884636 --- /dev/null +++ b/htdocs/langs/en_US/printing.lang @@ -0,0 +1,10 @@ +# Dolibarr language file - Source file is en_US - printing +PrintingSetup=Setup of Printing System +PrintingDesc=This module adds a Print button to send documents directly to a printer with various module. +ModuleDriverSetup=Setup Module Driver +PrintingDriverDesc=Configuration variables for printing driver. +ListDrivers=List of drivers +PrintTestDesc=List of Printers. +FileWasSentToPrinter=File %s was sent to printer +NoActivePrintingModuleFound=No active module to print document +PleaseSelectaDriverfromList=Please select a driver from list. diff --git a/htdocs/langs/en_US/printipp.lang b/htdocs/langs/en_US/printipp.lang index 835e6827f12..2a10ddfe710 100644 --- a/htdocs/langs/en_US/printipp.lang +++ b/htdocs/langs/en_US/printipp.lang @@ -1,6 +1,9 @@ # Dolibarr language file - Source file is en_US - printipp +PRINTIPP=PrintIPP Driver PrintIPPSetup=Setup of Direct Print module -PrintIPPDesc=This module adds a Print button to send documents directly to a printer. It requires a Linux system with CUPS installed. +PrintIPPDesc=This driver allow to send documents directly to a printer. It requires a Linux system with CUPS installed. +PrintingDriverDescprintipp=Configuration variables for printing driver PrintIPP. +PrintTestDescprintipp=List of Printers for driver PrintIPP. PRINTIPP_ENABLED=Show "Direct print" icon in document lists PRINTIPP_HOST=Print server PRINTIPP_PORT=Port diff --git a/htdocs/printing/admin/printing.php b/htdocs/printing/admin/printing.php index 29bd8787fa0..f12c235dc2c 100644 --- a/htdocs/printing/admin/printing.php +++ b/htdocs/printing/admin/printing.php @@ -26,8 +26,8 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; -//require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; -//require_once DOL_DOCUMENT_ROOT.'/printing/lib/printing.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/modules/printing/modules_printing.php'; +require_once DOL_DOCUMENT_ROOT.'/printing/lib/printing.lib.php'; $langs->load("admin"); $langs->load("printing"); @@ -37,14 +37,58 @@ if (! $user->admin) accessforbidden(); $action = GETPOST('action','alpha'); $mode = GETPOST('mode','alpha'); $value = GETPOST('value','alpha'); +$varname = GETPOST('varname', 'alpha'); +$driver = GETPOST('driver', 'alpha'); + +if (! empty($driver)) $langs->load($driver); if (!$mode) $mode='config'; /* * Action */ +if ($action == 'setconst' && $user->admin) +{ + $error=0; + $db->begin(); + foreach ($_POST['setupdriver'] as $setupconst) { + //print '<pre>'.print_r($setupconst, true).'</pre>'; + $result=dolibarr_set_const($db, $setupconst['varname'],$setupconst['value'],'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + } + + if (! $error) + { + $db->commit(); + setEventMessage($langs->trans("SetupSaved")); + } + else + { + $db->rollback(); + dol_print_error($db); + } + $action=''; +} - +if ($action == 'setvalue' && $user->admin) +{ + $db->begin(); + + $result=dolibarr_set_const($db, $varname, $value,'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + + if (! $error) + { + $db->commit(); + setEventMessage($langs->trans("SetupSaved")); + } + else + { + $db->rollback(); + dol_print_error($db); + } + $action = ''; +} /* * View @@ -55,73 +99,131 @@ $form = new Form($db); llxHeader('',$langs->trans("PrintingSetup")); $linkback='<a href="'.DOL_URL_ROOT.'/admin/modules.php">'.$langs->trans("BackToModuleList").'</a>'; -print_fiche_titre($langs->trans("PrintIPPSetup"),$linkback,'setup'); +print_fiche_titre($langs->trans("PrintingSetup"),$linkback,'setup'); -//$head=printippadmin_prepare_head(); +$head=printingadmin_prepare_head(); - -if ($mode == 'config' && $user->admin) +if ($mode == 'setup' && $user->admin) { - print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=config">'; + print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=setup&driver='.$driver.'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; - print '<input type="hidden" name="action" value="setvalue">'; + print '<input type="hidden" name="action" value="setconst">'; + + dol_fiche_head($head, $mode, $langs->trans("ModuleDriverSetup"), 0, 'technic'); + + print $langs->trans("PrintingDriverDesc".$driver)."<br><br>\n"; + + print '<table class="noborder" width="100%">'."\n"; + $var=true; + print '<tr class="liste_titre">'; + print '<th>'.$langs->trans("Parameters").'</th>'; + print '<th>'.$langs->trans("Value").'</th>'; + print "</tr>\n"; + + if (! empty($driver)) { + require_once DOL_DOCUMENT_ROOT.'/core/modules/printing/'.$driver.'.modules.php'; + $classname = 'printing_'.$driver; + $printer = new $classname($db); + //print '<pre>'.print_r($printer, true).'</pre>'; + $i=0; + foreach ($printer->conf as $key) { + $var=!$var; + print '<tr '.$bc[$var].'>'; + print '<td'.($key['required']?' class=required':'').'>'.$langs->trans($key['varname']).'</td><td>'; + print '<input size="32" type="'.(empty($key['type'])?'text':$key['type']).'" name="setupdriver['.$i.'][value]" value="'.$conf->global->{$key['varname']}.'">'; + print '<input type="hidden" name="setupdriver['.$i.'][varname]" value="'.$key['varname'].'">'; + print ' '.($key['example']!=''?$langs->trans("Example").' : '.$key['example']:''); + print '</tr>'; + $i++; + } + } else { + print $langs->trans('PleaseSelectaDriverfromList'); + } + + print '</table>'; + if (! empty($driver)) { + print '<div class="center"><input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Modify")).'"></center>'; + } + print '</form>'; + dol_fiche_end(); +} +if ($mode == 'config' && $user->admin) +{ dol_fiche_head($head, $mode, $langs->trans("ModuleSetup"), 0, 'technic'); print $langs->trans("PrintingDesc")."<br><br>\n"; - print '<table class="noborder" width="100%">'; + print '<table class="noborder" width="100%">'."\n"; $var=true; print '<tr class="liste_titre">'; - print '<td>'.$langs->trans("Parameters").'</td>'; - print '<td>'.$langs->trans("Value").'</td>'; + print '<th>'.$langs->trans("Description").'</th>'; + print '<th class="center">'.$langs->trans("Active").'</th>'; + print '<th class="center">'.$langs->trans("Setup").'</th>'; + print '<th class="center">'.$langs->trans("Test").'</th>'; print "</tr>\n"; - - $var=!$var; - print '<tr '.$bc[$var].'><td class="fieldrequired">'; - print $langs->trans("PRINTIPP_HOST").'</td><td>'; - print '<input size="64" type="text" name="PRINTIPP_HOST" value="'.$conf->global->PRINTIPP_HOST.'">'; - print ' '.$langs->trans("Example").': localhost'; - print '</td></tr>'; - - $var=!$var; - print '<tr '.$bc[$var].'><td class="fieldrequired">'; - print $langs->trans("PRINTIPP_PORT").'</td><td>'; - print '<input size="32" type="text" name="PRINTIPP_PORT" value="'.$conf->global->PRINTIPP_PORT.'">'; - print ' '.$langs->trans("Example").': 631'; - print '</td></tr>'; - - $var=!$var; - print '<tr '.$bc[$var].'><td>'; - print $langs->trans("PRINTIPP_USER").'</td><td>'; - print '<input size="32" type="text" name="PRINTIPP_USER" value="'.$conf->global->PRINTIPP_USER.'">'; - print '</td></tr>'; - - $var=!$var; - print '<tr '.$bc[$var].'><td>'; - print $langs->trans("PRINTIPP_PASSWORD").'</td><td>'; - print '<input size="32" type="text" name="PRINTIPP_PASSWORD" value="'.$conf->global->PRINTIPP_PASSWORD.'">'; - print '</td></tr>'; + $object = new PrintingDriver($db); + $result = $object->listDrivers($db, 10); + foreach ($result as $driver) { + require_once DOL_DOCUMENT_ROOT.'/core/modules/printing/'.$driver.'.modules.php'; + $classname = 'printing_'.$driver; + $langs->load($driver); + $printer = new $classname($db); + //print '<pre>'.print_r($printer, true).'</pre>'; + $var=!$var; + print '<tr '.$bc[$var].'>'; + print '<td>'.img_picto('', $printer->picto).$langs->trans($printer->desc).'</td>'; + print '<td class="center">'; + if (! empty($conf->use_javascript_ajax)) + { + print ajax_constantonoff($printer->active); + } + else + { + if (empty($conf->global->{$printer->conf})) + { + print '<a href="'.$_SERVER['PHP_SELF'].'?action=setvalue&varname='.$printer->active.'&value=1">'.img_picto($langs->trans("Disabled"),'off').'</a>'; + } + else + { + print '<a href="'.$_SERVER['PHP_SELF'].'?action=setvalue&varname='.$printer->active.'&value=0">'.img_picto($langs->trans("Enabled"),'on').'</a>'; + } + } + print '<td class="center"><a href="'.$_SERVER['PHP_SELF'].'?mode=setup&driver='.$printer->name.'">'.img_picto('', 'setup').'</a></td>'; + print '<td class="center"><a href="'.$_SERVER['PHP_SELF'].'?mode=test&driver='.$printer->name.'">'.img_picto('', 'setup').'</a></td>'; + print '</tr>'."\n"; + } print '</table>'; dol_fiche_end(); - - //print '<div class="center"><input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Modify")).'"></center>'; - - - print '</form>'; +} +if ($mode == 'test' && $user->admin) +{ + dol_fiche_head($head, $mode, $langs->trans("PrintingTest"), 0, 'technic'); - //if (count($list) == 0) print $langs->trans("NoPrinterFound"); + print $langs->trans('PrintTestDesc'.$driver)."<br><br>\n"; + + print '<table class="nobordernopadding" width="100%">'; + if (! empty($driver)) { + require_once DOL_DOCUMENT_ROOT.'/core/modules/printing/'.$driver.'.modules.php'; + $classname = 'printing_'.$driver; + $printer = new $classname($db); + //print '<pre>'.print_r($printer, true).'</pre>'; + print $printer->listAvailablePrinters(); + + } else { + print $langs->trans('PleaseSelectaDriverfromList'); + } + print '</table>'; dol_fiche_end(); } - llxFooter(); $db->close(); diff --git a/htdocs/printipp/lib/index.html b/htdocs/printing/lib/index.html similarity index 100% rename from htdocs/printipp/lib/index.html rename to htdocs/printing/lib/index.html diff --git a/htdocs/printipp/lib/printipp.lib.php b/htdocs/printing/lib/printing.lib.php similarity index 59% rename from htdocs/printipp/lib/printipp.lib.php rename to htdocs/printing/lib/printing.lib.php index 64c14609df5..fd02c240b15 100644 --- a/htdocs/printipp/lib/printipp.lib.php +++ b/htdocs/printing/lib/printing.lib.php @@ -16,44 +16,49 @@ */ /** - * \file htdocs/printipp/lib/printipp.lib.php - * \ingroup printipp - * \brief Library for printipp functions + * \file htdocs/printing/lib/printing.lib.php + * \ingroup printing + * \brief Library for printing functions */ /** - * Define head array for tabs of printipp tools setup pages + * Define head array for tabs of printing tools setup pages * * @return Array of head */ -function printippadmin_prepare_head() +function printingadmin_prepare_head() { global $langs, $conf; $h = 0; $head = array(); - $head[$h][0] = DOL_URL_ROOT."/printipp/admin/printipp.php?mode=config"; - $head[$h][1] = $langs->trans("CupsServer"); + $head[$h][0] = DOL_URL_ROOT."/printing/admin/printing.php?mode=config"; + $head[$h][1] = $langs->trans("ListDrivers"); $head[$h][2] = 'config'; $h++; - $head[$h][0] = DOL_URL_ROOT."/printipp/admin/printipp.php?mode=test"; - $head[$h][1] = $langs->trans("Printer"); + $head[$h][0] = DOL_URL_ROOT."/printing/admin/printing.php?mode=setup"; + $head[$h][1] = $langs->trans("SetupDriver"); + $head[$h][2] = 'setup'; + $h++; + + $head[$h][0] = DOL_URL_ROOT."/printing/admin/printing.php?mode=test"; + $head[$h][1] = $langs->trans("TestDriver"); $head[$h][2] = 'test'; $h++; - $object=new stdClass(); + //$object=new stdClass(); // Show more tabs from modules // Entries must be declared in modules descriptor with line // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab // $this->tabs = array('entity:-tabname); to remove a tab - complete_head_from_modules($conf,$langs,$object,$head,$h,'printippadmin'); + //complete_head_from_modules($conf,$langs,$object,$head,$h,'printingadmin'); - complete_head_from_modules($conf,$langs,$object,$head,$h,'printipp','remove'); + //complete_head_from_modules($conf,$langs,$object,$head,$h,'printing','remove'); return $head; } diff --git a/htdocs/printipp/admin/printipp.php b/htdocs/printipp/admin/printipp.php deleted file mode 100644 index 28ad55453eb..00000000000 --- a/htdocs/printipp/admin/printipp.php +++ /dev/null @@ -1,246 +0,0 @@ -<?php -/* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * \file htdocs/printipp/admin/printipp.php - * \ingroup printipp - * \brief Page to setup printipp module - */ - -require '../../main.inc.php'; - -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; -require_once DOL_DOCUMENT_ROOT.'/printipp/lib/printipp.lib.php'; - -$langs->load("admin"); -$langs->load("printipp"); - -if (! $user->admin) accessforbidden(); - -$action = GETPOST('action','alpha'); -$mode = GETPOST('mode','alpha'); -$value = GETPOST('value','alpha'); - -if (!$mode) $mode='config'; - -/* - * Action - */ - -if ($action == 'setvalue' && $user->admin) -{ - $db->begin(); - - if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "PRINTIPP_HOST",GETPOST('PRINTIPP_HOST','alpha'),'chaine',0,'',$conf->entity); - if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "PRINTIPP_PORT",GETPOST('PRINTIPP_PORT','alpha'),'chaine',0,'',$conf->entity); - if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "PRINTIPP_USER",GETPOST('PRINTIPP_USER','alpha'),'chaine',0,'',$conf->entity); - if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "PRINTIPP_PASSWORD",GETPOST('PRINTIPP_PASSWORD','alpha'),'chaine',0,'',$conf->entity); - if (! $result > 0) $error++; - - if (! $error) - { - $db->commit(); - setEventMessage($langs->trans("SetupSaved")); - } - else - { - $db->rollback(); - dol_print_error($db); - } -} - -// Set default model -else if ($action == 'setprinteruri') -{ - if (dolibarr_set_const($db, "PRINTIPP_URI_DEFAULT",$value,'chaine',0,'',$conf->entity)) - { - // La constante qui a ete lue en avant du nouveau set - // on passe donc par une variable pour avoir un affichage coherent - $conf->global->PRINTIPP_URI_DEFAULT = $value; - } -} - - -/* - * View - */ - -$form = new Form($db); - -llxHeader('',$langs->trans("PrintIPPSetup")); - -$linkback='<a href="'.DOL_URL_ROOT.'/admin/modules.php">'.$langs->trans("BackToModuleList").'</a>'; -print_fiche_titre($langs->trans("PrintIPPSetup"),$linkback,'setup'); - -$head=printippadmin_prepare_head(); - - -if ($mode == 'config' && $user->admin) -{ - print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?mode=config">'; - print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; - print '<input type="hidden" name="action" value="setvalue">'; - - dol_fiche_head($head, $mode, $langs->trans("ModuleSetup"), 0, 'technic'); - - print $langs->trans("PrintIPPDesc")."<br><br>\n"; - - print '<table class="noborder" width="100%">'; - - $var=true; - print '<tr class="liste_titre">'; - print '<td>'.$langs->trans("Parameters").'</td>'; - print '<td>'.$langs->trans("Value").'</td>'; - print "</tr>\n"; - - /* - $var=!$var; - print '<tr '.$bc[$var].'><td>'; - print $langs->trans("PRINTIPP_ENABLED").'</td><td colspan="2" align="left">'; - - if (! empty($conf->use_javascript_ajax)) - { - print ajax_constantonoff('PRINTIPP_ENABLED'); - } - else - { - if (empty($conf->global->PRINTIPP_ENABLED)) - { - print '<a href="'.$_SERVER['PHP_SELF'].'?action=set_PRINTIPP_ENABLED">'.img_picto($langs->trans("Disabled"),'off').'</a>'; - } - else - { - print '<a href="'.$_SERVER['PHP_SELF'].'?action=del_PRINTIPP_ENABLED">'.img_picto($langs->trans("Enabled"),'on').'</a>'; - } - } - print '</td></tr>'; - */ - - $var=!$var; - print '<tr '.$bc[$var].'><td class="fieldrequired">'; - print $langs->trans("PRINTIPP_HOST").'</td><td>'; - print '<input size="64" type="text" name="PRINTIPP_HOST" value="'.$conf->global->PRINTIPP_HOST.'">'; - print ' '.$langs->trans("Example").': localhost'; - print '</td></tr>'; - - $var=!$var; - print '<tr '.$bc[$var].'><td class="fieldrequired">'; - print $langs->trans("PRINTIPP_PORT").'</td><td>'; - print '<input size="32" type="text" name="PRINTIPP_PORT" value="'.$conf->global->PRINTIPP_PORT.'">'; - print ' '.$langs->trans("Example").': 631'; - print '</td></tr>'; - - $var=!$var; - print '<tr '.$bc[$var].'><td>'; - print $langs->trans("PRINTIPP_USER").'</td><td>'; - print '<input size="32" type="text" name="PRINTIPP_USER" value="'.$conf->global->PRINTIPP_USER.'">'; - print '</td></tr>'; - - $var=!$var; - print '<tr '.$bc[$var].'><td>'; - print $langs->trans("PRINTIPP_PASSWORD").'</td><td>'; - print '<input size="32" type="text" name="PRINTIPP_PASSWORD" value="'.$conf->global->PRINTIPP_PASSWORD.'">'; - print '</td></tr>'; - - //$var=true; - //print '<tr class="liste_titre">'; - //print '<td>'.$langs->trans("OtherParameter").'</td>'; - //print '<td>'.$langs->trans("Value").'</td>'; - //print "</tr>\n"; - - print '</table>'; - - dol_fiche_end(); - - print '<div class="center"><input type="submit" class="button" value="'.dol_escape_htmltag($langs->trans("Modify")).'"></center>'; - - print '</form>'; -} - -if ($mode == 'test' && $user->admin) -{ - dol_fiche_head($head, $mode, $langs->trans("ModuleSetup"), 0, 'technic'); - - print $langs->trans("PrintIPPDesc")."<br><br>\n"; - - print '<table class="nobordernopadding" width="100%">'; - $printer = new dolPrintIPP($db,$conf->global->PRINTIPP_HOST,$conf->global->PRINTIPP_PORT,$user->login,$conf->global->PRINTIPP_USER,$conf->global->PRINTIPP_PASSWORD); - $var=true; - print '<table width="100%" class="noborder">'; - print '<tr class="liste_titre">'; - print '<td>Uri</td>'; - print '<td>Name</td>'; - print '<td>State</td>'; - print '<td>State_reason</td>'; - print '<td>State_reason1</td>'; - print '<td>BW</td>'; - print '<td>Color</td>'; - //print '<td>Device</td>'; - print '<td>Media</td>'; - print '<td>Supported</td>'; - print '<td>'.$langs->trans("Select").'</td>'; - print "</tr>\n"; - - $list = $printer->getlist_available_printers(); - $var = true; - foreach ($list as $value) - { - $var=!$var; - $printer_det = $printer->get_printer_detail($value); - print "<tr ".$bc[$var].">"; - print '<td>'.$value.'</td>'; - //print '<td><pre>'.print_r($printer_det,true).'</pre></td>'; - print '<td>'.$printer_det->printer_name->_value0.'</td>'; - print '<td>'.$printer_det->printer_state->_value0.'</td>'; - print '<td>'.$printer_det->printer_state_reasons->_value0.'</td>'; - print '<td>'.$printer_det->printer_state_reasons->_value1.'</td>'; - print '<td>'.$printer_det->printer_type->_value2.'</td>'; - print '<td>'.$printer_det->printer_type->_value3.'</td>'; - //print '<td>'.$printer_det->device_uri->_value0.'</td>'; - print '<td>'.$printer_det->media_default->_value0.'</td>'; - print '<td>'.$printer_det->media_type_supported->_value1.'</td>'; - // Defaut - print "<td align=\"center\">"; - if ($conf->global->PRINTIPP_URI_DEFAULT == "$value") - { - print img_picto($langs->trans("Default"),'on'); - } - else - { - print '<a href="'.$_SERVER["PHP_SELF"].'?action=setprinteruri&mode=test&value='.urlencode($value).'" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"),'off').'</a>'; - } - print '</td>'; - print "</tr>\n"; - } - print '</table>'; - - if (count($list) == 0) print $langs->trans("NoPrinterFound"); - - dol_fiche_end(); -} - - - -llxFooter(); - -$db->close(); diff --git a/htdocs/printipp/index.php b/htdocs/printipp/index.php deleted file mode 100644 index a130805f16e..00000000000 --- a/htdocs/printipp/index.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * \file htdocs/printipp/index.php - * \ingroup printipp - * \brief Printipp - */ - -require '../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/dolprintipp.class.php'; - -llxHeader("",$langs->trans("Printer")); - -print_fiche_titre($langs->trans("Printer")); - -$printer = new dolPrintIPP($db,$conf->global->PRINTIPP_HOST,$conf->global->PRINTIPP_PORT,$user->login,$conf->global->PRINTIPP_USER,$conf->global->PRINTIPP_PASSWORD); -$printer->list_jobs('commande'); - -llxFooter(); - -$db->close(); -- GitLab