From f990719daa0c76101570e2cdcec8f8f6f9ab0b02 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 28 Sep 2018 13:31:41 +0200 Subject: [PATCH] Add experimental module TakePOS --- ChangeLog | 3 +- htdocs/core/modules/modCashDesk.class.php | 1 - htdocs/core/modules/modTakePos.class.php | 337 +++++ htdocs/langs/en_US/admin.lang | 2 + htdocs/takepos/ChangeLog.md | 5 + htdocs/takepos/README.md | 100 ++ htdocs/takepos/admin/about.php | 77 + htdocs/takepos/admin/orderprinters.php | 202 +++ htdocs/takepos/admin/setup.php | 259 ++++ htdocs/takepos/ajax.php | 62 + .../takepos/class/actions_takepos.class.php | 223 +++ htdocs/takepos/css/colorbox.css | 58 + htdocs/takepos/css/images/border.png | Bin 0 -> 139 bytes htdocs/takepos/css/images/controls.png | Bin 0 -> 2027 bytes htdocs/takepos/css/images/loading.gif | Bin 0 -> 8685 bytes .../takepos/css/images/loading_background.png | Bin 0 -> 131 bytes htdocs/takepos/css/pos.css | 114 ++ htdocs/takepos/customers.php | 1265 +++++++++++++++++ htdocs/takepos/dev/img/README.md | 53 + htdocs/takepos/dev/img/gfdl-129x44.png | Bin 0 -> 4709 bytes htdocs/takepos/dev/img/gfdl-66x23.png | Bin 0 -> 2453 bytes htdocs/takepos/dev/img/gfdl-logo.svg | 110 ++ htdocs/takepos/dev/img/gpl-v3-logo.svg | 389 +++++ htdocs/takepos/dev/img/gplv3-127x51.png | Bin 0 -> 3471 bytes htdocs/takepos/dev/img/gplv3-88x31.png | Bin 0 -> 2666 bytes htdocs/takepos/dev/img/takepos.svg | 70 + htdocs/takepos/floors.php | 176 +++ htdocs/takepos/freezone.php | 59 + htdocs/takepos/genimg/add.jpg | Bin 0 -> 5419 bytes htdocs/takepos/genimg/empty.jpg | Bin 0 -> 2239 bytes htdocs/takepos/genimg/index.php | 142 ++ htdocs/takepos/img/arrow-next-top.png | Bin 0 -> 47808 bytes htdocs/takepos/img/arrow-next.png | Bin 0 -> 5125 bytes htdocs/takepos/img/arrow-prev-top.png | Bin 0 -> 47668 bytes htdocs/takepos/img/arrow-prev.png | Bin 0 -> 5112 bytes htdocs/takepos/img/gfdl.png | Bin 0 -> 4709 bytes htdocs/takepos/img/gplv3.png | Bin 0 -> 2666 bytes .../takepos/img/marketplace/cashcontrol.jpg | Bin 0 -> 80604 bytes .../takepos/img/marketplace/takeposmobile.jpg | Bin 0 -> 57525 bytes htdocs/takepos/img/object_takepos.png | Bin 0 -> 360 bytes htdocs/takepos/img/table.gif | Bin 0 -> 7294 bytes htdocs/takepos/img/takepos.png | Bin 0 -> 3445 bytes htdocs/takepos/invoice.php | 287 ++++ htdocs/takepos/js/jquery.colorbox-min.js | 6 + htdocs/takepos/js/takepos.js | 15 + htdocs/takepos/langs/en_US/takepos.lang | 24 + htdocs/takepos/langs/es_ES/takepos.lang | 22 + htdocs/takepos/langs/fr_FR/takepos.lang | 24 + htdocs/takepos/lib/takepos.lib.php | 58 + htdocs/takepos/modulebuilder.txt | 3 + htdocs/takepos/pay.php | 122 ++ htdocs/takepos/receipt.php | 108 ++ .../takepos/sql/llx_takepos_floor_tables.sql | 26 + htdocs/takepos/takepos.php | 406 ++++++ .../test/phpunit/TakePosFunctionalTest.php | 289 ++++ htdocs/theme/eldy/style.css.php | 6 +- htdocs/theme/md/style.css.php | 6 +- 57 files changed, 5105 insertions(+), 4 deletions(-) create mode 100644 htdocs/core/modules/modTakePos.class.php create mode 100644 htdocs/takepos/ChangeLog.md create mode 100644 htdocs/takepos/README.md create mode 100644 htdocs/takepos/admin/about.php create mode 100644 htdocs/takepos/admin/orderprinters.php create mode 100644 htdocs/takepos/admin/setup.php create mode 100644 htdocs/takepos/ajax.php create mode 100644 htdocs/takepos/class/actions_takepos.class.php create mode 100644 htdocs/takepos/css/colorbox.css create mode 100644 htdocs/takepos/css/images/border.png create mode 100644 htdocs/takepos/css/images/controls.png create mode 100644 htdocs/takepos/css/images/loading.gif create mode 100644 htdocs/takepos/css/images/loading_background.png create mode 100644 htdocs/takepos/css/pos.css create mode 100644 htdocs/takepos/customers.php create mode 100644 htdocs/takepos/dev/img/README.md create mode 100644 htdocs/takepos/dev/img/gfdl-129x44.png create mode 100644 htdocs/takepos/dev/img/gfdl-66x23.png create mode 100644 htdocs/takepos/dev/img/gfdl-logo.svg create mode 100644 htdocs/takepos/dev/img/gpl-v3-logo.svg create mode 100644 htdocs/takepos/dev/img/gplv3-127x51.png create mode 100644 htdocs/takepos/dev/img/gplv3-88x31.png create mode 100644 htdocs/takepos/dev/img/takepos.svg create mode 100644 htdocs/takepos/floors.php create mode 100644 htdocs/takepos/freezone.php create mode 100644 htdocs/takepos/genimg/add.jpg create mode 100644 htdocs/takepos/genimg/empty.jpg create mode 100644 htdocs/takepos/genimg/index.php create mode 100644 htdocs/takepos/img/arrow-next-top.png create mode 100644 htdocs/takepos/img/arrow-next.png create mode 100644 htdocs/takepos/img/arrow-prev-top.png create mode 100644 htdocs/takepos/img/arrow-prev.png create mode 100644 htdocs/takepos/img/gfdl.png create mode 100644 htdocs/takepos/img/gplv3.png create mode 100644 htdocs/takepos/img/marketplace/cashcontrol.jpg create mode 100644 htdocs/takepos/img/marketplace/takeposmobile.jpg create mode 100644 htdocs/takepos/img/object_takepos.png create mode 100644 htdocs/takepos/img/table.gif create mode 100644 htdocs/takepos/img/takepos.png create mode 100644 htdocs/takepos/invoice.php create mode 100644 htdocs/takepos/js/jquery.colorbox-min.js create mode 100644 htdocs/takepos/js/takepos.js create mode 100644 htdocs/takepos/langs/en_US/takepos.lang create mode 100644 htdocs/takepos/langs/es_ES/takepos.lang create mode 100644 htdocs/takepos/langs/fr_FR/takepos.lang create mode 100644 htdocs/takepos/lib/takepos.lib.php create mode 100644 htdocs/takepos/modulebuilder.txt create mode 100644 htdocs/takepos/pay.php create mode 100644 htdocs/takepos/receipt.php create mode 100644 htdocs/takepos/sql/llx_takepos_floor_tables.sql create mode 100644 htdocs/takepos/takepos.php create mode 100644 htdocs/takepos/test/phpunit/TakePosFunctionalTest.php diff --git a/ChangeLog b/ChangeLog index a713dc635c1..e516382f62f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,7 +8,8 @@ For Users: NEW: Stable module: Website NEW: Stable module: WebDAV NEW: Stable module: Module Builder -NEW: Stable module "Skype" has been replaced with module "Social Networks" to support more tools. +NEW: Stable module "Skype" has been replaced with module "Social Networks" to support more tools. +NEW: Experimental module "TakePos" NEW: Dolibarr can provide information in page title when multicompany is enabled of not, making Android application like DoliDroid able to provide native features for multicompany module. NEW: Compatibility with PHP 7.3 diff --git a/htdocs/core/modules/modCashDesk.class.php b/htdocs/core/modules/modCashDesk.class.php index 2b33e09c1ac..79495595774 100644 --- a/htdocs/core/modules/modCashDesk.class.php +++ b/htdocs/core/modules/modCashDesk.class.php @@ -81,7 +81,6 @@ class modCashDesk extends DolibarrModules // Permissions $this->rights = array(); - $this->rights_class = 'cashdesk'; $r=0; $r++; diff --git a/htdocs/core/modules/modTakePos.class.php b/htdocs/core/modules/modTakePos.class.php new file mode 100644 index 00000000000..c69586e7454 --- /dev/null +++ b/htdocs/core/modules/modTakePos.class.php @@ -0,0 +1,337 @@ + + * Copyright (C) 2018 SuperAdmin + * + * 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 . + */ + +/** + * \defgroup takepos Module TakePos + * \brief TakePos module descriptor. + * + * \file htdocs/takepos/core/modules/modTakePos.class.php + * \ingroup takepos + * \brief Description and activation file for module TakePos + */ +include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; + + +/** + * Class to describe and enable module TakePos + */ +class modTakePos extends DolibarrModules +{ + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + global $langs,$conf; + + $this->db = $db; + + // Id for module (must be unique). + // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). + $this->numero = 50150; + // Key text used to identify module (for permissions, menus, etc...) + $this->rights_class = 'takepos'; + + // Family can be 'crm','financial','hr','projects','products','ecm','technic','interface','other' + // It is used to group modules by family in module setup page + $this->family = "portal"; + // Module position in the family on 2 digits ('01', '10', '20', ...) + $this->module_position = '90'; + // Gives the possibility to the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this) + //$this->familyinfo = array('myownfamily' => array('position' => '01', 'label' => $langs->trans("MyOwnFamily"))); + + // Module label (no space allowed), used if translation string 'ModuleTakePosName' not found (MyModue is name of module). + $this->name = preg_replace('/^mod/i','',get_class($this)); + // Module description, used if translation string 'ModuleTakePosDesc' not found (MyModue is name of module). + $this->description = "Point of sales module (Touch Screen POS)"; + // Used only if file README.md and README-LL.md not found. + $this->descriptionlong = "Point Of Sales (compliant with touch screen)"; + + // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' + $this->version = 'experimental'; + // Key used in llx_const table to save module status enabled/disabled (where TAKEPOS is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // 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='list'; + + // Defined all module parts (triggers, login, substitutions, menus, css, etc...) + // for default path (eg: /takepos/core/xxxxx) (0=disable, 1=enable) + // for specific path of parts (eg: /takepos/core/modules/barcode) + // for specific css file (eg: /takepos/css/takepos.css.php) + $this->module_parts = array( + 'triggers' => 0, // Set this to 1 if module has its own trigger directory (core/triggers) + 'login' => 0, // Set this to 1 if module has its own login method file (core/login) + 'substitutions' => 1, // Set this to 1 if module has its own substitution function file (core/substitutions) + 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus) + 'theme' => 0, // Set this to 1 if module has its own theme directory (theme) + 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl) + 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode) + 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx) + 'hooks' => array('data'=>array('invoicecard'), 'entity'=>'0') // Set here all hooks context managed by module. To find available hook context, make a "grep -r '>initHooks(' *" on source code. You can also set hook context 'all' + ); + + // Data directories to create when module is enabled. + // Example: this->dirs = array("/takepos/temp","/takepos/subdir"); + $this->dirs = array(); + + // Config pages. Put here list of php page, stored into takepos/admin directory, to use to setup module. + $this->config_page_url = array("setup.php@takepos"); + + // Dependencies + $this->hidden = false; // A condition to hide module + $this->depends = array('modFacture','modProduct','modCategorie'); // List of module class names as string that must be enabled if this module is enabled + $this->requiredby = array(); // List of module ids to disable if this one is disabled + $this->conflictwith = array(); // List of module class names as string this module is in conflict with + $this->langfiles = array("takepos@takepos"); + $this->phpmin = array(5,43); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(4,0); // Minimum version of Dolibarr required by module + $this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','ES'='textes'...) + $this->warnings_activation_ext = array(); // Warning to show when we activate an external module. array('always'='text') or array('FR'='textfr','ES'='textes'...) + //$this->automatic_activation = array('FR'=>'TakePosWasAutomaticallyActivatedBecauseOfYourCountryChoice'); + //$this->always_enabled = true; // If true, can't be disabled + + // Constants + // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) + // Example: $this->const=array(0=>array('TAKEPOS_MYNEWCONST1','chaine','myvalue','This is a constant to add',1), + // 1=>array('TAKEPOS_MYNEWCONST2','chaine','myvalue','This is another constant to add',0, 'current', 1) + // ); + $this->const = array( + //1=>array('TAKEPOS_MYCONSTANT', 'chaine', 'avalue', 'This is a constant to add', 1, 'allentities', 1) + ); + + + if (! isset($conf->takepos) || ! isset($conf->takepos->enabled)) + { + $conf->takepos=new stdClass(); + $conf->takepos->enabled=0; + } + + + // Array to add new pages in new tabs + $this->tabs = array(); + // Example: + // $this->tabs[] = array('data'=>'objecttype:+tabname1:Title1:mylangfile@takepos:$user->rights->takepos->read:/takepos/mynewtab1.php?id=__ID__'); // To add a new tab identified by code tabname1 + // $this->tabs[] = array('data'=>'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@takepos:$user->rights->othermodule->read:/takepos/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key. + // $this->tabs[] = array('data'=>'objecttype:-tabname:NU:conditiontoremove'); // To remove an existing tab identified by code tabname + // + // Where objecttype can be + // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member) + // 'contact' to add a tab in contact view + // 'contract' to add a tab in contract view + // 'group' to add a tab in group view + // 'intervention' to add a tab in intervention view + // 'invoice' to add a tab in customer invoice view + // 'invoice_supplier' to add a tab in supplier invoice view + // 'member' to add a tab in fundation member view + // 'opensurveypoll' to add a tab in opensurvey poll view + // 'order' to add a tab in customer order view + // 'order_supplier' to add a tab in supplier order view + // 'payment' to add a tab in payment view + // 'payment_supplier' to add a tab in supplier payment view + // 'product' to add a tab in product view + // 'propal' to add a tab in propal view + // 'project' to add a tab in project view + // 'stock' to add a tab in stock view + // 'thirdparty' to add a tab in third party view + // 'user' to add a tab in user view + + + // Dictionaries + $this->dictionaries=array(); + /* Example: + $this->dictionaries=array( + 'langs'=>'mylangfile@takepos', + 'tabname'=>array(MAIN_DB_PREFIX."table1",MAIN_DB_PREFIX."table2",MAIN_DB_PREFIX."table3"), // List of tables we want to see into dictonnary editor + 'tablib'=>array("Table1","Table2","Table3"), // Label of tables + 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'), // Request to select fields + 'tabsqlsort'=>array("label ASC","label ASC","label ASC"), // Sort order + 'tabfield'=>array("code,label","code,label","code,label"), // List of fields (result of select to show dictionary) + 'tabfieldvalue'=>array("code,label","code,label","code,label"), // List of fields (list of fields to edit a record) + 'tabfieldinsert'=>array("code,label","code,label","code,label"), // List of fields (list of fields for insert) + 'tabrowid'=>array("rowid","rowid","rowid"), // Name of columns with primary key (try to always name it 'rowid') + 'tabcond'=>array($conf->takepos->enabled,$conf->takepos->enabled,$conf->takepos->enabled) // Condition to show each dictionary + ); + */ + + + // Boxes/Widgets + // Add here list of php file(s) stored in takepos/core/boxes that contains class to show a widget. + $this->boxes = array( + //0=>array('file'=>'takeposwidget1.php@takepos','note'=>'Widget provided by TakePos','enabledbydefaulton'=>'Home'), + //1=>array('file'=>'takeposwidget2.php@takepos','note'=>'Widget provided by TakePos'), + //2=>array('file'=>'takeposwidget3.php@takepos','note'=>'Widget provided by TakePos') + ); + + + // Cronjobs (List of cron jobs entries to add when module is enabled) + // unit_frequency must be 60 for minute, 3600 for hour, 86400 for day, 604800 for week + $this->cronjobs = array( + //0=>array('label'=>'MyJob label', 'jobtype'=>'method', 'class'=>'/takepos/class/myobject.class.php', 'objectname'=>'MyObject', 'method'=>'doScheduledJob', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>true) + ); + // Example: $this->cronjobs=array(0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>true), + // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'status'=>0, 'test'=>true) + // ); + + + // Permissions + $this->rights = array(); // Permission array used by this module + + /*$r=0; + $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + $this->rights[$r][1] = 'Read myobject of TakePos'; // Permission label + $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'read'; // In php code, permission will be checked by test if ($user->rights->takepos->level1->level2) + $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->takepos->level1->level2) + + $r++; + $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + $this->rights[$r][1] = 'Create/Update myobject of TakePos'; // Permission label + $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'write'; // In php code, permission will be checked by test if ($user->rights->takepos->level1->level2) + $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->takepos->level1->level2) + + $r++; + $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + $this->rights[$r][1] = 'Delete myobject of TakePos'; // Permission label + $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][4] = 'delete'; // In php code, permission will be checked by test if ($user->rights->takepos->level1->level2) + $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->takepos->level1->level2) + */ + + // Main menu entries + $this->menu = array(); // List of menus to add + $r=0; + + // Add here entries to declare new menus + + /* BEGIN MODULEBUILDER TOPMENU */ + $this->menu[$r++]=array('fk_menu'=>'', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'top', // This is a Top menu entry + 'titre'=>'PointOfSale', + 'mainmenu'=>'takepos', + 'leftmenu'=>'', + 'url'=>'/takepos/takepos.php', + 'langs'=>'takepos@takepos', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>1000+$r, + 'enabled'=>'$conf->takepos->enabled', // Define condition to show or hide menu entry. Use '$conf->takepos->enabled' if entry must be visible if module is enabled. + 'perms'=>'1', // Use 'perms'=>'$user->rights->takepos->level1->level2' if you want your menu with a permission rules + 'target'=>'takepos', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + + /* END MODULEBUILDER TOPMENU */ + + /* BEGIN MODULEBUILDER LEFTMENU MYOBJECT + $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=takepos', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'left', // This is a Left menu entry + 'titre'=>'List MyObject', + 'mainmenu'=>'takepos', + 'leftmenu'=>'takepos_myobject_list', + 'url'=>'/takepos/myobject_list.php', + 'langs'=>'takepos@takepos', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>1000+$r, + 'enabled'=>'$conf->takepos->enabled', // Define condition to show or hide menu entry. Use '$conf->takepos->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'1', // Use 'perms'=>'$user->rights->takepos->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=takepos,fk_leftmenu=takepos', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'left', // This is a Left menu entry + 'titre'=>'New MyObject', + 'mainmenu'=>'takepos', + 'leftmenu'=>'takepos_myobject_new', + 'url'=>'/takepos/myobject_page.php?action=create', + 'langs'=>'takepos@takepos', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>1000+$r, + 'enabled'=>'$conf->takepos->enabled', // Define condition to show or hide menu entry. Use '$conf->takepos->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'1', // Use 'perms'=>'$user->rights->takepos->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + END MODULEBUILDER LEFTMENU MYOBJECT */ + + + // Exports + $r=1; + + /* BEGIN MODULEBUILDER EXPORT MYOBJECT */ + /* + $langs->load("takepos@takepos"); + $this->export_code[$r]=$this->rights_class.'_'.$r; + $this->export_label[$r]='MyObjectLines'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->export_icon[$r]='myobject@takepos'; + $keyforclass = 'MyObject'; $keyforclassfile='/mymobule/class/myobject.class.php'; $keyforelement='myobject'; + include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; + $keyforselect='myobject'; $keyforaliasextra='extra'; $keyforelement='myobject'; + include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; + //$this->export_dependencies_array[$r]=array('mysubobject'=>'ts.rowid', 't.myfield'=>array('t.myfield2','t.myfield3')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields) + $this->export_sql_start[$r]='SELECT DISTINCT '; + $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'myobject as t'; + $this->export_sql_end[$r] .=' WHERE 1 = 1'; + $this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('myobject').')'; + $r++; */ + /* END MODULEBUILDER EXPORT MYOBJECT */ + } + + /** + * 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 + */ + public function init($options='') + { + $this->_load_tables('/takepos/sql/'); + + // Create extrafields + include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields = new ExtraFields($this->db); + + //$result1=$extrafields->addExtraField('myattr1', "New Attr 1 label", 'boolean', 1, 3, 'thirdparty', 0, 0, '', '', 1, '', 0, 0, '', '', 'takepos@takepos', '$conf->takepos->enabled'); + //$result2=$extrafields->addExtraField('myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 0, 0, '', '', 1, '', 0, 0, '', '', 'takepos@takepos', '$conf->takepos->enabled'); + //$result3=$extrafields->addExtraField('myattr3', "New Attr 3 label", 'varchar', 1, 10, 'bank_account', 0, 0, '', '', 1, '', 0, 0, '', '', 'takepos@takepos', '$conf->takepos->enabled'); + //$result4=$extrafields->addExtraField('myattr4', "New Attr 4 label", 'select', 1, 3, 'thirdparty', 0, 1, '', array('options'=>array('code1'=>'Val1','code2'=>'Val2','code3'=>'Val3')), 1 '', 0, 0, '', '', 'takepos@takepos', '$conf->takepos->enabled'); + //$result5=$extrafields->addExtraField('myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 0, 0, '', '', 1, '', 0, 0, '', '', 'takepos@takepos', '$conf->takepos->enabled'); + + $sql = array(); + + // Remove permissions and default values + $this->remove($options); + + 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 + */ + public function remove($options = '') + { + $sql = array(); + + return $this->_remove($sql, $options); + } + +} diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index c46fbc309a8..dad02966507 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -620,6 +620,8 @@ Module50000Name=PayBox Module50000Desc=Offer customers a PayBox online payment page (credit/debit cards). This can be used to allow your customers to make free payments or for a payment on a particular Dolibarr object (invoice, order, ...) Module50100Name=Point of sales Module50100Desc=Point of sales module (POS). +Module50150Name=Point of sales +Module50150Desc=Point of sales module (Touch screen POS). Module50200Name=Paypal Module50200Desc=Offer customers a PayPal online payment page (PayPal account or credit/debit cards). This can be used to allow your customers to make free payments or for a payment on a particular Dolibarr object (invoice, order, ...) Module50400Name=Accounting (advanced) diff --git a/htdocs/takepos/ChangeLog.md b/htdocs/takepos/ChangeLog.md new file mode 100644 index 00000000000..7b623eaa252 --- /dev/null +++ b/htdocs/takepos/ChangeLog.md @@ -0,0 +1,5 @@ +# CHANGELOG TAKEPOS FOR DOLIBARR ERP CRM + +## 1.0 +Initial version + diff --git a/htdocs/takepos/README.md b/htdocs/takepos/README.md new file mode 100644 index 00000000000..40d4742af27 --- /dev/null +++ b/htdocs/takepos/README.md @@ -0,0 +1,100 @@ +# TAKEPOS FOR DOLIBARR ERP CRM + +## Features +Touch Screen POS + + + +Other modules are available on Dolistore.com. + + + +### Translations + +Translations can be define manually by editing files into directories [langs](langs). + + + + + + + +Licenses +-------- + +### Main code + +![GPLv3 logo](img/gplv3.png) + +GPLv3 or (at your option) any later version. + +See [COPYING](COPYING) for more information. + +#### Documentation + +All texts and readmes. + +![GFDL logo](img/gfdl.png) diff --git a/htdocs/takepos/admin/about.php b/htdocs/takepos/admin/about.php new file mode 100644 index 00000000000..d83599e24ed --- /dev/null +++ b/htdocs/takepos/admin/about.php @@ -0,0 +1,77 @@ + + * Copyright (C) 2018 SuperAdmin + * + * 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 . + */ + +/** + * \file takepos/admin/about.php + * \ingroup takepos + * \brief About page of module TakePos. + */ + +require '../../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once '../lib/takepos.lib.php'; + +// Translations +$langs->load("errors"); +$langs->load("admin"); +$langs->load("takepos@takepos"); + +// Access control +if (! $user->admin) { + accessforbidden(); +} + +// Parameters +$action = GETPOST('action', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); + + +/* + * Actions + */ + +// None + + +/* + * View + */ + +$form = new Form($db); + +$page_name = "TakePosAbout"; +llxHeader('', $langs->trans($page_name)); + +// Subheader +$linkback = ''.$langs->trans("BackToModuleList").''; + +print load_fiche_titre($langs->trans($page_name), $linkback, 'object_takepos@takepos'); + +// Configuration header +$head = takeposAdminPrepareHead(); +dol_fiche_head($head, 'about', '', 0, 'takepos@takepos'); + +dol_include_once('/takepos/core/modules/modTakePos.class.php'); +$tmpmodule = new modTakePos($db); +print $tmpmodule->getDescLong(); + +// Page end +dol_fiche_end(); +llxFooter(); +$db->close(); diff --git a/htdocs/takepos/admin/orderprinters.php b/htdocs/takepos/admin/orderprinters.php new file mode 100644 index 00000000000..73081e6103d --- /dev/null +++ b/htdocs/takepos/admin/orderprinters.php @@ -0,0 +1,202 @@ + + * Copyright (C) 2005 Eric Seigne + * Copyright (C) 2006-2016 Laurent Destailleur + * Copyright (C) 2007 Patrick Raguin + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2015 Raphaël Doursenaud + * + * 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 . + */ + +/** + * \file htdocs/takepos/admin/orderprinters.php + * \ingroup takepos + * \brief Home page of category area + */ + +require '../../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/treeview.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; + +$langs->load("main"); +$langs->load("categories"); +$langs->load("takepos"); +$langs->load("printing"); + +if (! $user->rights->categorie->lire) accessforbidden(); + +$id=GETPOST('id','int'); +$type=(GETPOST('type','aZ09') ? GETPOST('type','aZ09') : Categorie::TYPE_PRODUCT); +$catname=GETPOST('catname','alpha'); +$action=GETPOST('action'); +$printer1=GETPOST('printer1'); +$printer2=GETPOST('printer2'); + +if (is_numeric($type)) $type=Categorie::$MAP_ID_TO_CODE[$type]; // For backward compatibility + +/* + * Actions + */ +print $action; +if ($action=="SavePrinter1"){ + $printedcategories=";"; + if (is_array($printer1)) foreach ($printer1 as $cat){ + $printedcategories=$printedcategories.$cat.";"; + } + dolibarr_set_const($db,"TAKEPOS_PRINTED_CATEGORIES_1", $printedcategories,'chaine',0,'',$conf->entity); +} + +if ($action=="SavePrinter2"){ + $printedcategories=";"; + if (is_array($printer2)) foreach ($printer2 as $cat){ + $printedcategories=$printedcategories.$cat.";"; + } + dolibarr_set_const($db,"TAKEPOS_PRINTED_CATEGORIES_2", $printedcategories,'chaine',0,'',$conf->entity); +} + + +/* + * View + */ + +$categstatic = new Categorie($db); +$form = new Form($db); + +if ($type == Categorie::TYPE_PRODUCT) { $title=$langs->trans("ProductsCategoriesArea"); $typetext='product'; } +elseif ($type == Categorie::TYPE_SUPPLIER) { $title=$langs->trans("SuppliersCategoriesArea"); $typetext='supplier'; } +elseif ($type == Categorie::TYPE_CUSTOMER) { $title=$langs->trans("CustomersCategoriesArea"); $typetext='customer'; } +elseif ($type == Categorie::TYPE_MEMBER) { $title=$langs->trans("MembersCategoriesArea"); $typetext='member'; } +elseif ($type == Categorie::TYPE_CONTACT) { $title=$langs->trans("ContactsCategoriesArea"); $typetext='contact'; } +elseif ($type == Categorie::TYPE_ACCOUNT) { $title=$langs->trans("AccountsCategoriesArea"); $typetext='bank_account'; } +elseif ($type == Categorie::TYPE_PROJECT) { $title=$langs->trans("ProjectsCategoriesArea"); $typetext='project'; } +elseif ($type == Categorie::TYPE_USER) { $title=$langs->trans("UsersCategoriesArea"); $typetext='user'; } +else { $title=$langs->trans("CategoriesArea"); $typetext='unknown'; } + +$arrayofjs=array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.js', '/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js'); +$arrayofcss=array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.css'); + +llxHeader('',$title,'','',0,0,$arrayofjs,$arrayofcss); + + +print load_fiche_titre($langs->trans("OrderPrinters")); + +//print ''; +//print '
'; +print '
'; + + +//print '
'; +print '
'; + + +//print '
'; +print ''; + +print '

'; + + +// Charge tableau des categories +$cate_arbo = $categstatic->get_full_arbo($typetext); + +// Define fulltree array +$fulltree=$cate_arbo; + +// Define data (format for treeview) +$data=array(); +$data[] = array('rowid'=>0,'fk_menu'=>-1,'title'=>"racine",'mainmenu'=>'','leftmenu'=>'','fk_mainmenu'=>'','fk_leftmenu'=>''); +foreach($fulltree as $key => $val) +{ + $categstatic->id=$val['id']; + $categstatic->ref=$val['label']; + $categstatic->color=$val['color']; + $categstatic->type=$type; + $li=$categstatic->getNomUrl(1,'',60); + $desc=dol_htmlcleanlastbr($val['description']); + + $data[] = array( + 'rowid'=>$val['rowid'], + 'fk_menu'=>$val['fk_menu'], + 'fk_menu'=>$val['fk_parent'], + 'label'=>$val['label'] + ); +} + +//Printer1 +print ''; +print ''; +$nbofentries=(count($data) - 1); +print ''; +if ($nbofentries > 0) +{ + print ''; +} +else +{ + print ''; + print ''; + print ''; +} +print "
'.$langs->trans("Printer").' 1'; +print '
'; + print ''; + foreach ($data as $row) { + if (strpos($conf->global->TAKEPOS_PRINTED_CATEGORIES_1, ';'.$row["rowid"].';') !== false) $checked='checked'; else $checked=''; + if ($row["fk_menu"]==0) print ''.$row["label"].'
'; + } + print '
'; + print ''; + print ''; + print '
'.img_picto_common('','treemenu/branchbottom.gif').''; + print $langs->trans("NoCategoryYet"); + print ' 
"; +print '

'; + +//Printer2 +print ''; +print ''; +$nbofentries=(count($data) - 1); +print ''; +if ($nbofentries > 0) +{ + print ''; +} +else +{ + print ''; + print ''; + print ''; +} +print "
'.$langs->trans("Printer").' 2'; +print '
'; + print ''; + foreach ($data as $row) { + if (strpos($conf->global->TAKEPOS_PRINTED_CATEGORIES_2, ';'.$row["rowid"].';') !== false) $checked='checked'; else $checked=''; + if ($row["fk_menu"]==0) print ''.$row["label"].'
'; + } + print '
'; + print ''; + print ''; + print '
'.img_picto_common('','treemenu/branchbottom.gif').''; + print $langs->trans("NoCategoryYet"); + print ' 
"; +print ''; + +print '
'; + +llxFooter(); + +$db->close(); diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php new file mode 100644 index 00000000000..b271fc34e46 --- /dev/null +++ b/htdocs/takepos/admin/setup.php @@ -0,0 +1,259 @@ + + * Copyright (C) 2011-2017 Juanjo Menent + * + * 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 . + */ + +/** + * \file htdocs/takepos/admin/setup.php + * \ingroup takepos + * \brief Setup page for TakePos module + */ + +require '../../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; + +// If socid provided by ajax company selector +if (! empty($_REQUEST['CASHDESK_ID_THIRDPARTY_id'])) +{ + $_GET['CASHDESK_ID_THIRDPARTY'] = GETPOST('CASHDESK_ID_THIRDPARTY_id','alpha'); + $_POST['CASHDESK_ID_THIRDPARTY'] = GETPOST('CASHDESK_ID_THIRDPARTY_id','alpha'); + $_REQUEST['CASHDESK_ID_THIRDPARTY'] = GETPOST('CASHDESK_ID_THIRDPARTY_id','alpha'); +} + +// Security check +if (!$user->admin) +accessforbidden(); + +$langs->load("admin"); +$langs->load("cashdesk"); + + +/* + * Actions + */ +if (GETPOST('action','alpha') == 'set') +{ + $db->begin(); + + if (GETPOST('socid','int') < 0) $_POST["socid"]=''; + + $res = dolibarr_set_const($db,"CASHDESK_ID_THIRDPARTY",(GETPOST('socid','int') > 0 ? GETPOST('socid','int') : ''),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"CASHDESK_ID_BANKACCOUNT_CASH",(GETPOST('CASHDESK_ID_BANKACCOUNT_CASH','alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CASH','alpha') : ''),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"CASHDESK_ID_BANKACCOUNT_CHEQUE",(GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE','alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE','alpha') : ''),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"CASHDESK_ID_BANKACCOUNT_CB",(GETPOST('CASHDESK_ID_BANKACCOUNT_CB','alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CB','alpha') : ''),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"CASHDESK_ID_WAREHOUSE",(GETPOST('CASHDESK_ID_WAREHOUSE','alpha') > 0 ? GETPOST('CASHDESK_ID_WAREHOUSE','alpha') : ''),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"CASHDESK_NO_DECREASE_STOCK",GETPOST('CASHDESK_NO_DECREASE_STOCK','alpha'),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"CASHDESK_SERVICES", GETPOST('CASHDESK_SERVICES','alpha'),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"TAKEBOX", GETPOST('TAKEBOX','alpha'),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"TAKEPOS_BAR_RESTAURANT", GETPOST('TAKEPOS_BAR_RESTAURANT','alpha'),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"TAKEPOS_PRINT_SERVER", GETPOST('TAKEPOS_PRINT_SERVER','alpha'),'chaine',0,'',$conf->entity); + $res = dolibarr_set_const($db,"TAKEPOS_ORDER_PRINTERS", GETPOST('TAKEPOS_ORDER_PRINTERS','alpha'),'chaine',0,'',$conf->entity); + + dol_syslog("admin/cashdesk: level ".GETPOST('level','alpha')); + + if (! $res > 0) $error++; + + if (! $error) + { + $db->commit(); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } + else + { + $db->rollback(); + setEventMessages($langs->trans("Error"), null, 'errors'); + } +} + +/* + * View + */ + +$form=new Form($db); +$formproduct=new FormProduct($db); + +llxHeader('',$langs->trans("CashDeskSetup")); + +$linkback=''.$langs->trans("BackToModuleList").''; +print load_fiche_titre($langs->trans("CashDeskSetup"),$linkback,'title_setup'); +print '
'; + + +// Mode +$var=true; +print '
'; +print ''; +print ''; + +print ''; +print ''; +print ''; +print "\n"; + +print ''; +print ''; +if (! empty($conf->banque->enabled)) +{ + + print ''; + print ''; + + + print ''; + print ''; + + + print ''; + print ''; +} + +if (! empty($conf->stock->enabled)) +{ + + print ''; // Force warehouse (this is not a default value) + print ''; + + $disabled=$conf->global->CASHDESK_NO_DECREASE_STOCK; + + + print ''; // Force warehouse (this is not a default value) + print ''; +} + +if (! empty($conf->service->enabled)) +{ + $var=! $var; + print '\n"; +} + +// Use Takepos printing +$var=! $var; +print '\n"; + +if ($conf->global->TAKEBOX){ + print ''; +} + +// Bar Restaurant mode +$var=! $var; +print '\n"; + +if ($conf->global->TAKEPOS_BAR_RESTAURANT and $conf->global->TAKEBOX){ + print ''; +} + +print '
'.$langs->trans("Parameters").''.$langs->trans("Value").'
'.$langs->trans("CashDeskThirdPartyForSell").''; +print $form->select_company($conf->global->CASHDESK_ID_THIRDPARTY,'socid','s.client in (1,3) AND s.status = 1',1,0,1,array(),0); +print '
'.$langs->trans("CashDeskBankAccountForSell").''; + $form->select_comptes($conf->global->CASHDESK_ID_BANKACCOUNT_CASH,'CASHDESK_ID_BANKACCOUNT_CASH',0,"courant=2",1); + print '
'.$langs->trans("CashDeskBankAccountForCheque").''; + $form->select_comptes($conf->global->CASHDESK_ID_BANKACCOUNT_CHEQUE,'CASHDESK_ID_BANKACCOUNT_CHEQUE',0,"courant=1",1); + print '
'.$langs->trans("CashDeskBankAccountForCB").''; + $form->select_comptes($conf->global->CASHDESK_ID_BANKACCOUNT_CB,'CASHDESK_ID_BANKACCOUNT_CB',0,"courant=1",1); + print '
'.$langs->trans("CashDeskDoNotDecreaseStock").''; + if (empty($conf->productbatch->enabled)) { + print $form->selectyesno('CASHDESK_NO_DECREASE_STOCK',$conf->global->CASHDESK_NO_DECREASE_STOCK,1); + } + else + { + if (!$conf->global->CASHDESK_NO_DECREASE_STOCK) { + $res = dolibarr_set_const($db,"CASHDESK_NO_DECREASE_STOCK",1,'chaine',0,'',$conf->entity); + } + print $langs->trans('StockDecreaseForPointOfSaleDisabledbyBatch'); + } + print '
'.$langs->trans("CashDeskIdWareHouse").''; + if (! $disabled) + { + print $formproduct->selectWarehouses($conf->global->CASHDESK_ID_WAREHOUSE,'CASHDESK_ID_WAREHOUSE','',1,$disabled); + print ' ('.$langs->trans("Create").')'; + } + else + { + print $langs->trans("StockDecreaseForPointOfSaleDisabled"); + } + print '
'; + print $langs->trans("CashdeskShowServices"); + print ''; + print $form->selectyesno("CASHDESK_SERVICES",$conf->global->CASHDESK_SERVICES,1); + print "
'; +print $langs->trans("DolibarrReceiptPrinter").' TakeBOX ('.$langs->trans("TakeboxNecesary").')'; +print ''; +print $form->selectyesno("TAKEBOX",$conf->global->TAKEBOX,1); +print "
'; + print $langs->trans("IPAddress").' ('.$langs->trans("TakeboxNecesary").')'; + print ''; + print ''; + print '
'; +print 'Bar Restaurant'; +print ''; +print $form->selectyesno("TAKEPOS_BAR_RESTAURANT",$conf->global->TAKEPOS_BAR_RESTAURANT,1); +print "
'; + print $langs->trans("OrderPrinters").' ('.$langs->trans("Setup").')'; + print ''; + print $form->selectyesno("TAKEPOS_ORDER_PRINTERS",$conf->global->TAKEPOS_ORDER_PRINTERS,1); + print '
'; +print '
'; + +print '
'; + +print "
\n"; + + + +// Marketplace +print "
\n"; +print "\n"; +print ''; +print ''; +print ''; + +print "\n"; +$url='https://www.dolistore.com/en/modules/980-TakePOS-7-mobile.html'; +print ''; +print ''; +print ''; +print ''; + +print "\n"; +$url='https://www.dolistore.com/en/modules/949-Cash-Control-7.html'; +print ''; +print ''; +print ''; +print ''; + +print "
TakePOS Marketplace'.$langs->trans("URL").'
TakePOS for mobile devices'.$url.'
TakePOS CashControl'.$url.'
\n"; +print '
'; + +// Support +print "
\n"; +print "\n"; +print ''; +print ''; +print ''; + +print "\n"; +$url='http://www.takepos.com'; +print ''; +print ''; +print ''; +print ''; + +print "
TakePOS Support'.$langs->trans("URL").'
TakePOS official developers'.$url.'
\n"; +print '
'; + +llxFooter(); +$db->close(); diff --git a/htdocs/takepos/ajax.php b/htdocs/takepos/ajax.php new file mode 100644 index 00000000000..5b199ec11a9 --- /dev/null +++ b/htdocs/takepos/ajax.php @@ -0,0 +1,62 @@ + + * + * 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 . + */ + +/** + * \file htdocs/takepos/ajax.php + * \brief Ajax search component for TakePos. It search products of a category. + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +require '../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + +$category = GETPOST('category'); +$action = GETPOST('action'); +$term = GETPOST('term'); + + +/* + * View + */ + +if ($action=="getProducts"){ + $object = new Categorie($db); + $result=$object->fetch($category); + $prods = $object->getObjectsInCateg("product"); + echo json_encode($prods); +} + +if ($action=="search"){ + $sql = 'SELECT * FROM '.MAIN_DB_PREFIX.'product'; + $sql.= ' WHERE entity IN ('.getEntity('product').')'; + $sql .= natural_search(array('label','barcode'), $term); + $resql = $db->query($sql); + $rows = array(); + while($row = $db->fetch_array ($resql)){ + $rows[] = $row; + } + echo json_encode($rows); +} \ No newline at end of file diff --git a/htdocs/takepos/class/actions_takepos.class.php b/htdocs/takepos/class/actions_takepos.class.php new file mode 100644 index 00000000000..a3ac2e78646 --- /dev/null +++ b/htdocs/takepos/class/actions_takepos.class.php @@ -0,0 +1,223 @@ +. + */ + +/** + * \file takepos/class/actions_takepos.class.php + * \ingroup takepos + * \brief Hooks of takepos module + */ + +/** + * Class ActionsTakePos + */ +class ActionsTakePos +{ + /** + * @var DoliDB Database handler. + */ + public $db; + /** + * @var string Error + */ + public $error = ''; + /** + * @var array Errors + */ + public $errors = array(); + + + /** + * @var array Hook results. Propagated to $hookmanager->resArray for later reuse + */ + public $results = array(); + + /** + * @var string String displayed by executeHook() immediately after return + */ + public $resprints; + + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + $this->db = $db; + } + + /** + * Overloading the doActions function : replacing the parent's function with the one below + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string $action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + public function doActions($parameters, &$object, &$action, $hookmanager) + { + global $conf, $user, $langs; + + $error = 0; // Error counter + + /* print_r($parameters); print_r($object); echo "action: " . $action; */ + if (in_array($parameters['currentcontext'], array('somecontext1','somecontext2'))) // do something only for the context 'somecontext1' or 'somecontext2' + { + // Do what you want here... + // You can for example call global vars like $fieldstosearchall to overwrite them, or update database depending on $action and $_POST values. + } + + if (! $error) { + $this->results = array('myreturn' => 999); + $this->resprints = 'A text to show'; + return 0; // or return 1 to replace standard code + } else { + $this->errors[] = 'Error message'; + return -1; + } + } + + + /** + * Overloading the doActions function : replacing the parent's function with the one below + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string $action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + public function addMoreActionsButtons($parameters, &$object, &$action, $hookmanager) + { + global $conf, $user, $langs; + + $error = 0; // Error counter + + /* print_r($parameters); print_r($object); echo "action: " . $action; */ + if (in_array($parameters['currentcontext'], array('invoicecard'))) // do something only for the context 'somecontext1' or 'somecontext2' + { + + if (file_exists("../../takepos/receipt.php")) $receipt_url=DOL_URL_ROOT."/takepos/receipt.php"; + if (file_exists("../../custom/takepos/receipt.php")) $receipt_url=DOL_URL_ROOT."/custom/takepos/receipt.php"; + print ''; + } + + if (! $error) { + $this->results = array('myreturn' => 999); + $this->resprints = 'A text to show'; + return 0; // or return 1 to replace standard code + } else { + $this->errors[] = 'Error message'; + return -1; + } + } + + + /** + * Overloading the addMoreMassActions function : replacing the parent's function with the one below + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string $action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + public function addMoreMassActions($parameters, &$object, &$action, $hookmanager) + { + global $conf, $user, $langs; + + $error = 0; // Error counter + + /* print_r($parameters); print_r($object); echo "action: " . $action; */ + if (in_array($parameters['currentcontext'], array('somecontext1','somecontext2'))) // do something only for the context 'somecontext1' or 'somecontext2' + { + $this->resprints = ''; + } + + if (! $error) { + return 0; // or return 1 to replace standard code + } else { + $this->errors[] = 'Error message'; + return -1; + } + } + + + + /** + * Execute action + * + * @param array $parameters Array of parameters + * @param Object $object Object output on PDF + * @param string $action 'add', 'update', 'view' + * @return int <0 if KO, + * =0 if OK but we want to process standard actions too, + * >0 if OK and we want to replace standard actions. + */ + function beforePDFCreation($parameters, &$object, &$action) + { + global $langs,$conf; + global $hookmanager; + + $outputlangs=$langs; + + $ret=0; $deltemp=array(); + dol_syslog(get_class($this).'::executeHooks action='.$action); + + /* print_r($parameters); print_r($object); echo "action: " . $action; */ + if (in_array($parameters['currentcontext'], array('somecontext1','somecontext2'))) // do something only for the context 'somecontext1' or 'somecontext2' + { + + } + + return $ret; + } + + /** + * Execute action + * + * @param array $parameters Array of parameters + * @param Object $pdfhandler PDF builder handler + * @param string $action 'add', 'update', 'view' + * @return int <0 if KO, + * =0 if OK but we want to process standard actions too, + * >0 if OK and we want to replace standard actions. + */ + function afterPDFCreation($parameters, &$pdfhandler, &$action) + { + global $langs,$conf; + global $hookmanager; + + $outputlangs=$langs; + + $ret=0; $deltemp=array(); + dol_syslog(get_class($this).'::executeHooks action='.$action); + + /* print_r($parameters); print_r($object); echo "action: " . $action; */ + if (in_array($parameters['currentcontext'], array('somecontext1','somecontext2'))) // do something only for the context 'somecontext1' or 'somecontext2' + { + + } + + return $ret; + } + + /* Add here any other hooked methods... */ + +} diff --git a/htdocs/takepos/css/colorbox.css b/htdocs/takepos/css/colorbox.css new file mode 100644 index 00000000000..5e9d4b7a79e --- /dev/null +++ b/htdocs/takepos/css/colorbox.css @@ -0,0 +1,58 @@ +/* + Colorbox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden; -webkit-transform: translate3d(0,0,0);} +#cboxWrapper {max-width:none;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;} +.cboxIframe{width:100%; height:100%; display:block; border:0; padding:0; margin:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of Colorbox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#000; opacity: 0.9; filter: alpha(opacity = 90);} +#colorbox{outline:0;} + #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;} + #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;} + #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;} + #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;} + #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;} + #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;} + #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;} + #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;} + #cboxContent{background:#fff; overflow:visible;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{margin-bottom:5px;} + #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;} + #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;} + #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;} + #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;} + + /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */ + #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;} + + /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */ + #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;} + + #cboxPrevious{left:0px; background-position: -51px -25px;} + #cboxPrevious:hover{background-position:-51px 0px;} + #cboxNext{left:27px; background-position:-75px -25px;} + #cboxNext:hover{background-position:-75px 0px;} + #cboxClose{right:0; background-position:-100px -25px;} + #cboxClose:hover{background-position:-100px 0px;} + + .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;} + .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;} + .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;} + .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file diff --git a/htdocs/takepos/css/images/border.png b/htdocs/takepos/css/images/border.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cd1a2a45151cea73c0c40177201da68d844636 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^j6m$o!2~4jwp3jKQbC?Bjv*C{M~`phJ)pqD8u+_8 zf#H%Nr?!!5?23h(bu16Lnso%(yzHxfzwlbuRY16Dl9G~IT3Xc9)Z^ph#l^+1udkq>pj%s8x3{-FJw3a- zyTZc4tgNhJVPUGOs=2wjTUuIPU0s)#m&C-xo0^)sxw(yvjeLB3^78U4D=RH6Ei5c7 zO-)TME-o-IFwM=)IXOA(>+9v^gnk!Dk@A&OhZFMI5;>mGBP$cHrd(PIyySo z*x1a>%u7p4z`(#lLPF^0=SN3JF)=YpN=iXNLGSMFH#av(NJvFRMNv^v@$vCHJ3Bl) zJTo&hNl8iR>FGvBMo>^t>+0%WUS93(?OFDTAPEK`obwEHsK0ZFDr>E}i?Y_RgTwGjIQc{VDiO$Z>?Ck7QQ&aZ#_VDoVc6N4O zUti|s<#>2_pP!#Tzq!=)s&!wEQp@vyFIk z{PDjEVaj?D5iW-YT3uNKm4}U(^%`EbF)X6((0>FEmT~{c?^irN{KFeN?;{+<$4f#T zeZG%Ym$yXwHI!Ke8d9MGL=LPJPD4Z}{~FDn3-#|Yr4(O%L_( z-8BOsr9@MQnW3r?nDqg^vq(z>QPy}US#hdxo=XywP_alW;o0x&G} z%WLo;5He55-a{xm(=U>z+@5Efj_eBcqJ;?qAgnhZ6%rTj<_WffUd*6JPxuMkqhVpF zysW1rge}beoIFJ>o%J1A^7jxZAc^0@Jdcibq__>-@|lH=}EO&zkNlRJ3pG( zAiR0%L%-j6AJ(FMDB#gPR7?I%qp8t8^vVat)cR05sZQIk2rGqAmN%jhin|nup}TYz zxl3E{fP5RdOEsXoVKOaxmx}Tf?^1rzIQ_HNg!`j<&*oDS-iI9|LgcmG$onuy7^F8I z;RiN77k(d#as6REi8fae%{m0Fd-ncm9GbgTOGkzuR zBT+IO)0_Zi`FD2Iv}#)c5C{QoAb|n_keC7ikeD03;(uL4VSArd0mMRBWn|@zz?2xI zKqLnF;Z?TZUN|BDU&TUjD*5Wk!=Xs@E7?!p9vS`-hnFmTy`-(Josj$QPa2}_cq|bu%W?aQz9KevLtIdg1V7n-UzTYWV zc=eYw*K$I9;X6R$reC65Ai<}L5-E@h!SQ~y7eqMl-53-?PC2AR3Zz1aUH%8%!lnnH z5c1@|2;(zI-=jo`@tT+Z8XjKm=aA`r4i)dxJ@enC|7bpp>FrDBL%qV;*EECK*ECv% z=C4cDLVdM`2BD%pbp1eoeK@;Ne~qt0sOvjT`9cjbLTH6nXoXg2g;r>VR%nG*XoW+S z@E|f&$oH43g!eY177D)^DeU16+MDuIKM8SH}54j=iwzZ zQb<}XF@pZeW8PqCrjQ$Z@*Y_Pnkz&jM%CwRqLAmiDtw?}!oSkOxx(7xrsDtr002ov JPDHLkV1i>c`Cb43 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/css/images/loading.gif b/htdocs/takepos/css/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..dba33c8167bfd0bfd0abd5ad0733c901e5cd227e GIT binary patch literal 8685 zcmb8!c|a5A-Y@XUWU`UT3Rxx~gb*NLz_1v>1rw663qb`DQ3E2PQbkG7U7Oaf$~ zm;_YBrGRMBE=F96w#Tw*ky-_{R$F@x;!@h$zEo{%mot4QL9L$q-uK?i-~97@@_l~G zGpXq*35msGKn(n(2C!QfvHPE6zdpgn|AD=hfPFrQeKU$Z`X0O1gT1*8`|C{X;R9^+ z3ikbd?C}Kl(?jg;4Q%Wh_MhX}SGTbKL)g!cu_r%a-;QCw{fhnmJNDo%wn>29o!Egb*!4c_<1XxNGiJ%gOexrVO<0v2Ypue%>al-Z z!Wx%hwHcT(8QWEg{c{*=$j44Nu=Y(@a~alBj-6@7c9vk3k=VL0tS$>%FT?seu+Ijt z%iWl(2s?iSTPwlVh_U*GSg8HBil|T2qPank|8+H?^Tr{VbzGA+MXGO>|!gqW5eDJfq zghQOO=Vd%~#%{?LhKcO|gd15j=ysTyQ@6z&AHGvl?}r8swswSEp9V)I$$%gFv<}{k ztqN*FgW(-oWYS~a%+h^esDm7QEgt`bsf=P0|MGXa2c-~hz@O|jYzH?=MZ#R zufvtx5>an$D=@NU4XQAdO17EAT7UP^gRSdfesffl8oj2i#)C7N8wik-aTT6dVM3&iRN26w}4yboQys8;%O29^X7;IwZ&DgSz?*eCSUX_gU=C!YHX|hpr7cSl` zhrq?{YJ?vZPDV_KX3?s(YvZ8A*#LLK9n3VyG)JZvzkVHb4Wx%l2ESfbKZ71V2 z^_2LG0XvUr2ah$LLzP($aa%{w0hp|ZwkkAKIyXG*$?@WbUUNiz>=nm*hsVqmnNTad zKdrw8AP#@|XwgFzDV;SOF{Du4ovu@kA_da6cCz|+XlbWxfqtIz*Q)ldr(4H9QB(9< zcd*QOdLJZJ35~_e=TaB_aZK9UdkZ}l7dm^XAN9ZU_+`>#S%}wTR_bgm?!jM`s$UB> zB5b0GwK&yK!f%x3&M8BA>h`1-h`}=>Q*-Ce)j{C$_T>maMxP`w%R_UQ76DL*&$MzV z=heW93^OG$bk3p>2mv;rMS-ieOdD78MZ8^`sySz8kv1T9A$i<}2pfM#A#HP;x%$I- z9*@f4qUu;KcGIBRfRb%~tlyUyH-NQtwz&Ms&)?xGv7U8Gci--jr?BQf^zRX)DLSP@ zp>UT=&N<&_F6)sk7(UlBUX|Q@F6KZxMW(;O_A^RyK<>;bQgiWC=q=Ot@60}92%Srt zfsnwb8o-O`cxVLhbkHM`d7gCSa7w5YKnfP1kyj;h z8|B87IQ!HJ#X^>y2XpE{RXKgnuLz2W*zD*BaYjjxi3oFJE8Q1r`)E{N?A{Zj#kF)` z`h)k`2H=Brzy35OZD71NRfmu-?m0M^0+Gr5#H>!IFIg?{+wa#ATnyDl2TPAMJMM|; z1P_9^_+kMYzNNj8!-n289r@w>i8apgrs@lcqqW>NqLdN zMmulGu0gUiy`{47lr$o(kN{ zVgy7$8D8;KH56Fl^%$VBL+9fjl4>$rEWL%74uHsmI8fR{)zJU?mcLTiBkrr#DbFK4 z5gR&yc~Ep(ePXA2faa zLsPE!t`fyiWLtIe#7EDEzbQ81urRWRbR^Rss5f{kIxEUOY`H11HR3jt-Q zSg$qnS4PV%LT!;c3gFZH4aKY8L3yP1Z~+h&x!e&V?w^rp^^H?WNdUsOAd&jw)pI+{ zAR(^I*Os*4EL7&YnP8&#gF&+@!YXx|(edLV?e*?*LVN4l00b%tn6iMEmh@ir_ zFrJ-f1%&dPDN}_2MVpkDU=wjpH+z)pc~{GIUr0}u3j6{ zVfOVJkTWBE0afSPsuLE$hd2RKi59L}J8#M!3wV~pw8|HMe%ppn`mFr;vir`7lMEvL z1CPNE z=FQ(fTTi$G2S;6I09y<^R93X+UG#dcDjm4&t~a!H_D-t=3e@GNfzRL4g35d%dvq5; z%@r4oZeGX6yGeJ;wTW*Jr)!al@%op$D}>J)o?Lhf>EtD`(ig-jZ4L`zLs*;%@g+M! z#Khj93PXA2q0<2yox`T1jb#}SBAq^GX^72h0nq`K2wF)ywW!P{cptamGtrRTrOR`0 z%rl%3OWE9wQ@_M9&RW5^_^+Jbp+YX1`~cVJ|IT;GyzF(0U`WwwP-f>+*y0A+gOLcJ zcS}}lTGI{9a5cc5(4869)HjDM0lPyMwUvfz??smSO0=OJFmdaYwD_@0`{LqwHx0Fy z9jyuLCoGkO!@be#po+KWp9UW>UpSJf%HD+w-r?GnzmDPtGjIgfMM_?HnF1AY%bUX-L{KicPc~7Z8GITtu2S z(+=Y6%zL(iW%K3ydW3StCS=QQxW-Hfox$j0;RtsC(fpZ3i({)xO-W)`Ay3b3a`V8mmQ|gJWzs#53JKr2cq}-&Q*Q+GJ z^6?uqVree1;GGJsQB0>z*i*`9&`U z;o14Ur2;>{zI+40G7Dw19F^z{3bq_9k#)y#N$c;D{uw`@ZE?E7qj zOh0OWBju7^K)mLd7tScXUuA}->|1Mb1Cx8sZKc3%^VQqLpcVc3a>LF8GrJQ^fV z7LINQICk!KM-6xo23C?AafstKI*ufG0Np8L~J(O#@ z|EFIT9}NgLNFlA7QE)I$1=Q~bmu(IBOR>3LouhR)w>wRQ24548XXpD8=xCGo z_#BIs(ZJd5IX#Kq&}QQvcaVhOf#dtF2!49EwF?$F5z2s##dHmu`KO-|nsXj2N}NyW1hH?zwUZl_y9Kk5@M<^v%C#4)mop zCalQ4>EOSxp-+aw^N#b-vy9;$l&2m_eD&~zLg@9F426sUdN_E{(@=2nP@I68QBjvC z6NjH`^m{ahO}kO=tw6}{4mLGhcAe__v}@Ek*1*CUZVV$tj%;w`M`(yBw1F`DS8I5Pq+YSIWKbUvd zsOXalc1ML4`lXj1s22OLQw>^Nhm&ohEO#0hx$vWSn4O$HQ%^FZqMxWc*tW25#k7QB z*-N9;pA3&C8R-AcfOxBe_iD&|g?}o%)d24^bC2OYvKbN`JBl-Oo;7=4st`)Q)x)sM z^i<)U_dE(G8xDU7|I)Y#0#`e2h9h&dT$)fG8+do}M_M zYA3yyf8p2_DHKL1s{%OU)xG){8g>}HFSheyvc3r|soHGKPgct0#iEE8M(jTw{&TWM z{0|OXHgVFyTOwX?0RC?dj!6fZa1!FqbBM1-Mg$@82W?7=O;qyvt+X~OYDI{f7?M76 zb_)c=Y5|gwOpD8qF(V1748LGt5E_Xg0XzMqwkD3Me8@i}O;Ir3b)Vi~$ryCB_PTCF z0hG?ScWWTuS}N6%K2x!Z!He+uF0p%TQ_bJC+P&cEjCzt|zy0~T^-_s=X!Mqd|IvWl zZ1&s;n&(E~21h5ea8PvY_%7ehznh*Wp%;I$bX}TE!exZ~&c3FGPh84lY(%z_8trh= zM-gCQ-t;3bJPpJzdGv#q?E+0QXs56vMD7$u6UUbAl$4q>T4H7wN(b3J1t6K^R+OvC z2Q)G$O=@U6K(ax^@={pUsT0b?9R|1lKqkW}$SV|?&(-myM*_yjUC?bUkt~--r%CTL(6`tkT;XjBeRIjoDE1|#o1hd21}gk6(Z>M!I`PaQ zs|TWsM>&1jE{cc-`BPLKgFQ$fbS2d1BZFTXsc5Uw5lk{pUjo3_BpoaJ2WDgf&8u(U z^VN`dLNqFvT)l&XK$VuZnp!bqK*Szv9X0JVvI++r-1);q)D+maCU*ywwA)tIEy{FgdhxCE0v zO)*-&%LC!_$}1J&yXfwn$$7C$oX- z(^}aCh2HMiWh+4ef^-ym!7|7&Fb=9^sk`kwb`N1D43^5`00jf zpue5+^QKogz8w~c{{SqV>1a*gnOF)Xy2XQlyc|s#ypXKZAz(q#zy{J~XRR7M<#;eA zA(DfWhlC-+V$f#LbXKZYxcg|q8S-MTqcfQRoQB+NRJFQC9cLbPZ{F-6QKyAGpB``o zl6S50ApGb-Fi#?w@#z8YmYylnW%8uKJ41TnU<(6Y=$3BllsTRFwKxcgx=xtM>vI?M zccQmiKGGoU5OXr8YtF>`SV9P8D$@g|_d>V#vQXwp0G~m~IfkEq*kM}|C{|65 z4oA1c$8AxHz~u~7*eN>sUX37Iv3ddiH~|Y>f<#?s4UcI1y2Eymi^R&Pfb# zdFuE6{y8nmlSFW?&o94(w9rqIA>j8x*FCtdsy?)$wezcrM{twI6#k@v;Pq?%AzeW*|?T z=3TQrv9O1}BH5(!-VU!sK*g(yC|m;aQp~H^BA=uXC6x6{QqY;#TCQzavbZWKbjMSQ znfduaK`9!Kg)lwux8K5X3z*$A-$WPire2I0s_bn7)F3lJd?>xql)yg2cujR|xY}=i zl}cZFV7E#K4zqtqt|koBLDARF0=j4^3iY4&d^gD9VC%1 zMTB}KM6_aY{B5V%Rv(zvJbXg`LWP)&#N?ZU=W@IZ!F&d>-e=jL5W#CUtq%JWLOWy2 zrYX-LM2lw>XFi1}4V#2uQ9KX@!HX7dobs6$f-j`u&kR*navXvz%v$x^Z^Sx`xVZMZ8U@X`@@jwdDNo!JsKjVp5ez}l4WJJ~GbO4n5NeO*5 z8_n`Gy$?b7)+R9p0m6dcmcXK&xs#ofM8ZFxKdqIXI6U%laMQx^S8J3mCz;a~60O}V z44xJnfwEE*fzx-Gm}(y}6auh<-q1{f1O)k{P74F3&PauEkUo~p`@uX4B`{D?A3R|5 zjSPwnw|go^JN~U*xC8(0$!GD7x0}DEM@+%LrC)9Lk|f8_LPMvs-9$r33qcUT4ci-| zXjTv@wtAtuI;Ex>i5}pJ2T@W3QB#sodF+bmHCt?!fqlD2;(rTXh=ygE#02p)t>!{j z0klz(TeL~`ij%NY`C6=lrUIe$_Sk?lDHU}SOxJ6m)<*S}cWjFICx!S(J?p;!sZ>^A literal 0 HcmV?d00001 diff --git a/htdocs/takepos/css/images/loading_background.png b/htdocs/takepos/css/images/loading_background.png new file mode 100644 index 0000000000000000000000000000000000000000..23a336b39893649bdab307a9d73c20ff5a2fcf41 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU0wmSG7d!(}UY;(FAr*{ouRHP{VBm2IR0%1P z4dW8}Hz`tLx@ryMd!9)WVxLVn^XQi^v2xQn88#zD>>-z!PQ-?UgH5d5|71)~&Y6GY e=S8`FqWtAKNnJbk-dqbbmBG{1&t;ucLK6T494Z3< literal 0 HcmV?d00001 diff --git a/htdocs/takepos/css/pos.css b/htdocs/takepos/css/pos.css new file mode 100644 index 00000000000..8a2122de9f3 --- /dev/null +++ b/htdocs/takepos/css/pos.css @@ -0,0 +1,114 @@ +html,body { + padding:0; + margin:0; + height:100%; +} + +body { + width:100%; +} + +.row { + width:100%; + height:50%; +} + +.row div { + width:33%; + height:100%; + float:left; +} + +button.calcbutton { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + cursor: pointer; + vertical-align: middle; + text-align: center; + font-size:180%; + overflow: visible; /* removes extra width in IE */ + width:24%; + height:24%; +} + +button.calcbutton2 { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + cursor: pointer; + vertical-align: middle; + text-align: center; + font-size:120%; + overflow: visible; /* removes extra width in IE */ + width:24%; + height:24%; +} + +button.actionbutton { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + cursor: pointer; + vertical-align: middle; + text-align: center; + font-size:100%; + overflow: visible; /* removes extra width in IE */ + width:32%; + height:32%; +} + +div.wrapper{ + float:left; /* important */ + position:relative; /* important(so we can absolutely position the description div */ + width:21.5%; + height:23%; + margin:1%; + border: 0.1em solid; + box-shadow: 3px 3px 2px #888; + text-align: center; +} + +div.wrapper2{ + float:left; /* important */ + position:relative; /* important(so we can absolutely position the description div */ + width:10.2%; + height:23%; + margin-top:0.5%; + margin-bottom:0.5%; + margin-left:0.5%; + margin-right:0.5%; + border: 0.1em solid; + box-shadow: 3px 3px 2px #888; + text-align: center; +} + +div.description{ + position:absolute; /* absolute position (so we can position it where we want)*/ + bottom:0px; /* position will be on bottom */ + left:0px; + width:100%; + /* styling bellow */ + background-color:black; + font-family: 'tahoma'; + font-size:100%; + color:white; + opacity:0.8; /* transparency */ + filter:alpha(opacity=80); /* IE transparency */ + text-align:center; +} + +@media only screen and (max-aspect-ratio: 6/4) { + div.description{ + min-height:20%; + } +} + +p.description_content{ + padding:10px; + margin:0px; + +} diff --git a/htdocs/takepos/customers.php b/htdocs/takepos/customers.php new file mode 100644 index 00000000000..f62931569ef --- /dev/null +++ b/htdocs/takepos/customers.php @@ -0,0 +1,1265 @@ + + * Copyright (C) 2004-2016 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012 Marcos García + * Copyright (C) 2013-2015 Raphaël Doursenaud + * Copyright (C) 2015 Florian Henry + * Copyright (C) 2016 Josep Lluis Amador + * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2017 Rui Strecht + * Copyright (C) 2017 Juanjo Menent + * + * 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 . + */ + +/** + * \file htdocs/takepos/customers.php + * \ingroup societe + * \brief Page to show list of third parties. TODO Merge with societe/list.php + */ + +require '../main.inc.php'; // Load $user and permissions +include_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; + +$langs->loadLangs(array("companies", "commercial", "customers", "suppliers", "bills", "compta", "categories")); + +$action=GETPOST('action','alpha'); +$massaction=GETPOST('massaction','alpha'); +$show_files=GETPOST('show_files','int'); +$confirm=GETPOST('confirm','alpha'); +$toselect = GETPOST('toselect', 'array'); +$idcustomer = GETPOST('idcustomer'); +$place = GETPOST('place'); +$_GET['optioncss'] = 'print'; + +if ($action=="change") { + $sql="UPDATE ".MAIN_DB_PREFIX."facture set fk_soc=".$idcustomer." where facnumber='(PROV-POS-".$place.")'"; + $resql = $db->query($sql); + ?> + + societe_id) $socid=$user->societe_id; +$result = restrictedArea($user,'societe',$socid,''); + +$search_all=trim(GETPOST('search_all', 'alphanohtml')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); +$search_cti=preg_replace('/^0+/', '', preg_replace('/[^0-9]/', '', GETPOST('search_cti', 'alphanohtml'))); // Phone number without any special chars + +$search_id=trim(GETPOST("search_id","int")); +$search_nom=trim(GETPOST("search_nom")); +$search_alias=trim(GETPOST("search_alias")); +$search_nom_only=trim(GETPOST("search_nom_only")); +$search_barcode=trim(GETPOST("search_barcode")); +$search_customer_code=trim(GETPOST('search_customer_code')); +$search_supplier_code=trim(GETPOST('search_supplier_code')); +$search_account_customer_code=trim(GETPOST('search_account_customer_code')); +$search_account_supplier_code=trim(GETPOST('search_account_supplier_code')); +$search_town=trim(GETPOST("search_town")); +$search_zip=trim(GETPOST("search_zip")); +$search_state=trim(GETPOST("search_state")); +$search_region=trim(GETPOST("search_region")); +$search_email=trim(GETPOST('search_email')); +$search_phone=trim(GETPOST('search_phone')); +$search_url=trim(GETPOST('search_url')); +$search_idprof1=trim(GETPOST('search_idprof1')); +$search_idprof2=trim(GETPOST('search_idprof2')); +$search_idprof3=trim(GETPOST('search_idprof3')); +$search_idprof4=trim(GETPOST('search_idprof4')); +$search_idprof5=trim(GETPOST('search_idprof5')); +$search_idprof6=trim(GETPOST('search_idprof6')); +$search_vat=trim(GETPOST('search_vat')); +$search_sale=trim(GETPOST("search_sale",'int')); +$search_categ_cus=trim(GETPOST("search_categ_cus",'int')); +$search_categ_sup=trim(GETPOST("search_categ_sup",'int')); +$search_country=GETPOST("search_country",'intcomma'); +$search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); +$search_status=GETPOST("search_status",'int'); +$search_type=GETPOST('search_type','alpha'); +$search_level_from = GETPOST("search_level_from","alpha"); +$search_level_to = GETPOST("search_level_to","alpha"); +$search_stcomm=GETPOST('search_stcomm','int'); +$search_import_key = GETPOST("search_import_key","alpha"); + +$type=GETPOST('type'); +$optioncss=GETPOST('optioncss','alpha'); +$mode=GETPOST("mode"); + +$diroutputmassaction=$conf->societe->dir_output . '/temp/massgeneration/'.$user->id; + +$limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; +$sortfield=GETPOST("sortfield",'alpha'); +$sortorder=GETPOST("sortorder",'alpha'); +$page=GETPOST("page",'int'); +if (! $sortorder) $sortorder="ASC"; +if (! $sortfield) $sortfield="s.nom"; +if (empty($page) || $page == -1) { $page = 0; } +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; + +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$contextpage='thirdpartylist'; +/*if ($search_type == '1,3') { $contextpage='customerlist'; $type='c'; } +if ($search_type == '2,3') { $contextpage='prospectlist'; $type='p'; } +if ($search_type == '4') { $contextpage='supplierlist'; $type='f'; } +*/ +if ($type == 'c') { $contextpage='customerlist'; if ($search_type=='') $search_type='1,3'; } +if ($type == 'p') { $contextpage='prospectlist'; if ($search_type=='') $search_type='2,3'; } +if ($type == 'f') { $contextpage='supplierlist'; if ($search_type=='') $search_type='4'; } + +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$hookmanager->initHooks(array($contextpage)); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('societe'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 's.nom'=>"ThirdPartyName", + 's.name_alias'=>"AliasNameShort", + 's.code_client'=>"CustomerCode", + 's.code_fournisseur'=>"SupplierCode", + 's.code_compta'=>"CustomerAccountancyCodeShort", + 's.code_compta_fournisseur'=>"SupplierAccountancyCodeShort", + 's.email'=>"EMail", + 's.url'=>"URL", + 's.tva_intra'=>"VATIntra", + 's.siren'=>"ProfId1", + 's.siret'=>"ProfId2", + 's.ape'=>"ProfId3", +); +if (($tmp = $langs->transnoentities("ProfId4".$mysoc->country_code)) && $tmp != "ProfId4".$mysoc->country_code && $tmp != '-') $fieldstosearchall['s.idprof4']='ProfId4'; +if (($tmp = $langs->transnoentities("ProfId5".$mysoc->country_code)) && $tmp != "ProfId5".$mysoc->country_code && $tmp != '-') $fieldstosearchall['s.idprof5']='ProfId5'; +if (($tmp = $langs->transnoentities("ProfId6".$mysoc->country_code)) && $tmp != "ProfId6".$mysoc->country_code && $tmp != '-') $fieldstosearchall['s.idprof6']='ProfId6'; +if (!empty($conf->barcode->enabled)) $fieldstosearchall['s.barcode']='Gencod'; + +// Define list of fields to show into list +$checkedcustomercode=(in_array($contextpage, array('thirdpartylist', 'customerlist', 'prospectlist')) ? 1 : 0); +$checkedsuppliercode=(in_array($contextpage, array('supplierlist')) ? 1 : 0); +$checkedcustomeraccountcode=(in_array($contextpage, array('customerlist')) ? 1 : 0); +$checkedsupplieraccountcode=(in_array($contextpage, array('supplierlist')) ? 1 : 0); +$checkedtypetiers=1; +$checkedprofid1=0; +$checkedprofid2=0; +$checkedprofid3=0; +$checkedprofid4=0; +$checkedprofid5=0; +$checkedprofid6=0; +//$checkedprofid4=((($tmp = $langs->transnoentities("ProfId4".$mysoc->country_code)) && $tmp != "ProfId4".$mysoc->country_code && $tmp != '-') ? 1 : 0); +//$checkedprofid5=((($tmp = $langs->transnoentities("ProfId5".$mysoc->country_code)) && $tmp != "ProfId5".$mysoc->country_code && $tmp != '-') ? 1 : 0); +//$checkedprofid6=((($tmp = $langs->transnoentities("ProfId6".$mysoc->country_code)) && $tmp != "ProfId6".$mysoc->country_code && $tmp != '-') ? 1 : 0); +$checkprospectlevel=(in_array($contextpage, array('prospectlist')) ? 1 : 0); +$checkstcomm=(in_array($contextpage, array('prospectlist')) ? 1 : 0); +$arrayfields=array( + 's.rowid'=>array('label'=>"TechnicalID", 'checked'=>($conf->global->MAIN_SHOW_TECHNICAL_ID?1:0), 'enabled'=>($conf->global->MAIN_SHOW_TECHNICAL_ID?1:0)), + 's.nom'=>array('label'=>"ThirdPartyName", 'checked'=>1), + 's.name_alias'=>array('label'=>"AliasNameShort", 'checked'=>1), + 's.barcode'=>array('label'=>"Gencod", 'checked'=>1, 'enabled'=>(! empty($conf->barcode->enabled))), + 's.code_client'=>array('label'=>"CustomerCodeShort", 'checked'=>$checkedcustomercode), + 's.code_fournisseur'=>array('label'=>"SupplierCodeShort", 'checked'=>$checkedsuppliercode, 'enabled'=>(! empty($conf->fournisseur->enabled))), + 's.code_compta'=>array('label'=>"CustomerAccountancyCodeShort", 'checked'=>$checkedcustomeraccountcode), + 's.code_compta_fournisseur'=>array('label'=>"SupplierAccountancyCodeShort", 'checked'=>$checkedsupplieraccountcode, 'enabled'=>(! empty($conf->fournisseur->enabled))), + 's.town'=>array('label'=>"Town", 'checked'=>1), + 's.zip'=>array('label'=>"Zip", 'checked'=>1), + 'state.nom'=>array('label'=>"State", 'checked'=>0), + 'region.nom'=>array('label'=>"Region", 'checked'=>0), + 'country.code_iso'=>array('label'=>"Country", 'checked'=>0), + 's.email'=>array('label'=>"Email", 'checked'=>0), + 's.url'=>array('label'=>"Url", 'checked'=>0), + 's.phone'=>array('label'=>"Phone", 'checked'=>1), + 'typent.code'=>array('label'=>"ThirdPartyType", 'checked'=>$checkedtypetiers), + 's.siren'=>array('label'=>"ProfId1Short", 'checked'=>$checkedprofid1), + 's.siret'=>array('label'=>"ProfId2Short", 'checked'=>$checkedprofid2), + 's.ape'=>array('label'=>"ProfId3Short", 'checked'=>$checkedprofid3), + 's.idprof4'=>array('label'=>"ProfId4Short", 'checked'=>$checkedprofid4), + 's.idprof5'=>array('label'=>"ProfId5Short", 'checked'=>$checkedprofid5), + 's.idprof6'=>array('label'=>"ProfId6Short", 'checked'=>$checkedprofid6), + 's.tva_intra'=>array('label'=>"VATIntra", 'checked'=>0), + 'customerorsupplier'=>array('label'=>'Nature', 'checked'=>1), + 's.fk_prospectlevel'=>array('label'=>"ProspectLevelShort", 'checked'=>$checkprospectlevel), + 's.fk_stcomm'=>array('label'=>"StatusProsp", 'checked'=>$checkstcomm), + 's.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), + 's.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500), + 's.status'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000), + 's.import_key'=>array('label'=>"ImportId", 'checked'=>0, 'position'=>1100), +); +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($extrafields->attribute_list[$key])) $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>(($extrafields->attribute_list[$key]<0)?0:1), 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>(abs($extrafields->attribute_list[$key])!=3 && $extrafields->attribute_perms[$key])); + } +} + +$object = new Societe($db); + + +/* + * Actions + */ + +if (GETPOST('cancel','alpha')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction','alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; } + +$parameters=array(); +$reshook=$hookmanager->executeHooks('doActions',$parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) +{ + // Selection of new fields + include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; + + // Did we click on purge search criteria ? + if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers + { + $search_id=''; + $search_nom=''; + $search_alias=''; + $search_categ_cus=0; + $search_categ_sup=0; + $search_sale=''; + $search_barcode=""; + $search_customer_code=''; + $search_supplier_code=''; + $search_account_customer_code=''; + $search_account_supplier_code=''; + $search_town=""; + $search_zip=""; + $search_state=""; + $search_country=''; + $search_email=''; + $search_phone=''; + $search_url=''; + $search_idprof1=''; + $search_idprof2=''; + $search_idprof3=''; + $search_idprof4=''; + $search_idprof5=''; + $search_idprof6=''; + $search_vat=''; + $search_type=''; + $search_type_thirdparty=''; + $search_status=-1; + $search_stcomm=''; + $search_level_from=''; + $search_level_to=''; + $search_import_key=''; + $toselect=''; + $search_array_options=array(); + } + + // Mass actions + $objectclass='Societe'; + $objectlabel='ThirdParty'; + $permtoread = $user->rights->societe->lire; + $permtodelete = $user->rights->societe->supprimer; + $uploaddir = $conf->societe->dir_output; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; + + if ($action == 'setstcomm') + { + $object = new Client($db); + $result=$object->fetch(GETPOST('stcommsocid')); + $object->stcomm_id=dol_getIdFromCode($db, GETPOST('stcomm','alpha'), 'c_stcomm'); + $result=$object->update($object->id, $user); + if ($result < 0) setEventMessages($object->error,$object->errors,'errors'); + + $action=''; + } +} + +if ($search_status=='') $search_status=1; // always display active thirdparty first + + + +/* + * View + */ + +/* + REM: Rules on permissions to see thirdparties + Internal or External user + No permission to see customers => See nothing + Internal user socid=0 + Permission to see ALL customers => See all thirdparties + Internal user socid=0 + No permission to see ALL customers => See only thirdparties linked to user that are sale representative + External user socid=x + Permission to see ALL customers => Can see only himself + External user socid=x + No permission to see ALL customers => Can see only himself + */ + +$form=new Form($db); +$formother=new FormOther($db); +$companystatic=new Societe($db); +$formcompany=new FormCompany($db); +$prospectstatic=new Client($db); +$prospectstatic->client=2; +$prospectstatic->loadCacheOfProspStatus(); + + +$title=$langs->trans("ListOfThirdParties"); +if ($type == 'c' && (empty($search_type) || ($search_type == '1,3'))) $title=$langs->trans("ListOfCustomers"); +if ($type == 'p' && (empty($search_type) || ($search_type == '2,3'))) $title=$langs->trans("ListOfProspects"); +if ($type == 'f' && (empty($search_type) || ($search_type == '4'))) $title=$langs->trans("ListOfSuppliers"); + +// If both parameters are set, search for everything BETWEEN them +if ($search_level_from != '' && $search_level_to != '') +{ + // Ensure that these parameters are numbers + $search_level_from = (int) $search_level_from; + $search_level_to = (int) $search_level_to; + + // If from is greater than to, reverse orders + if ($search_level_from > $search_level_to) + { + $tmp = $search_level_to; + $search_level_to = $search_level_from; + $search_level_from = $tmp; + } + + // Generate the SQL request + $sortwhere = '(sortorder BETWEEN '.$search_level_from.' AND '.$search_level_to.') AS is_in_range'; +} +// If only "from" parameter is set, search for everything GREATER THAN it +else if ($search_level_from != '') +{ + // Ensure that this parameter is a number + $search_level_from = (int) $search_level_from; + + // Generate the SQL request + $sortwhere = '(sortorder >= '.$search_level_from.') AS is_in_range'; +} +// If only "to" parameter is set, search for everything LOWER THAN it +else if ($search_level_to != '') +{ + // Ensure that this parameter is a number + $search_level_to = (int) $search_level_to; + + // Generate the SQL request + $sortwhere = '(sortorder <= '.$search_level_to.') AS is_in_range'; +} +// If no parameters are set, dont search for anything +else +{ + $sortwhere = '0 as is_in_range'; +} + +// Select every potentiels, and note each potentiels which fit in search parameters +dol_syslog('societe/list.php',LOG_DEBUG); +$sql = "SELECT code, label, sortorder, ".$sortwhere; +$sql.= " FROM ".MAIN_DB_PREFIX."c_prospectlevel"; +$sql.= " WHERE active > 0"; +$sql.= " ORDER BY sortorder"; + +$resql = $db->query($sql); +if ($resql) +{ + $tab_level = array(); + $search_levels = array(); + + while ($obj = $db->fetch_object($resql)) + { + // Compute level text + $level=$langs->trans($obj->code); + if ($level == $obj->code) $level=$langs->trans($obj->label); + + // Put it in the array sorted by sortorder + $tab_level[$obj->sortorder] = $level; + + // If this potentiel fit in parameters, add its code to the $search_levels array + if ($obj->is_in_range == 1) + { + $search_levels[] = '"'.preg_replace('[^A-Za-z0-9_-]', '', $obj->code).'"'; + } + } + + // Implode the $search_levels array so that it can be use in a "IN (...)" where clause. + // If no paramters was set, $search_levels will be empty + $search_levels = implode(',', $search_levels); +} +else dol_print_error($db); + +$sql = "SELECT s.rowid, s.nom as name, s.name_alias, s.barcode, s.town, s.zip, s.datec, s.code_client, s.code_fournisseur, s.logo,"; +$sql.= " st.libelle as stcomm, s.fk_stcomm as stcomm_id, s.fk_prospectlevel, s.prefix_comm, s.client, s.fournisseur, s.canvas, s.status as status,"; +$sql.= " s.email, s.phone, s.url, s.siren as idprof1, s.siret as idprof2, s.ape as idprof3, s.idprof4 as idprof4, s.idprof5 as idprof5, s.idprof6 as idprof6, s.tva_intra, s.fk_pays,"; +$sql.= " s.tms as date_update, s.datec as date_creation,"; +$sql.= " s.code_compta,s.code_compta_fournisseur,"; +$sql.= " typent.code as typent_code,"; +$sql.= " state.code_departement as state_code, state.nom as state_name,"; +$sql.= " region.code_region as region_code, region.nom as region_name"; +// We'll need these fields in order to filter by sale (including the case where the user can only see his prospects) +if ($search_sale) $sql .= ", sc.fk_soc, sc.fk_user"; +// We'll need these fields in order to filter by categ +if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; +if ($search_categ_sup) $sql .= ", cs.fk_categorie, cs.fk_soc"; +// Add fields from extrafields +foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +// Add fields from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; +$sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_extrafields as ef on (s.rowid = ef.fk_object)"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_regions as region on (region. code_region = state.fk_region)"; +// We'll need this table joined to the select in order to filter by categ +if (! empty($search_categ_cus)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cc ON s.rowid = cc.fk_soc"; // We'll need this table joined to the select in order to filter by categ +if (! empty($search_categ_sup)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_fournisseur as cs ON s.rowid = cs.fk_soc"; // We'll need this table joined to the select in order to filter by categ +$sql.= " ,".MAIN_DB_PREFIX."c_stcomm as st"; +// We'll need this table joined to the select in order to filter by sale +if ($search_sale || (!$user->rights->societe->client->voir && !$socid)) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +$sql.= " WHERE s.fk_stcomm = st.id"; +$sql.= " AND s.entity IN (".getEntity('societe').")"; +if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; +if ($socid) $sql.= " AND s.rowid = ".$socid; +if ($search_sale) $sql.= " AND s.rowid = sc.fk_soc"; // Join for the needed table to filter by sale +if (! $user->rights->fournisseur->lire) $sql.=" AND (s.fournisseur <> 1 OR s.client <> 0)"; // client=0, fournisseur=0 must be visible +if ($search_sale) $sql.= " AND sc.fk_user = ".$db->escape($search_sale); +if ($search_categ_cus > 0) $sql.= " AND cc.fk_categorie = ".$db->escape($search_categ_cus); +if ($search_categ_sup > 0) $sql.= " AND cs.fk_categorie = ".$db->escape($search_categ_sup); +if ($search_categ_cus == -2) $sql.= " AND cc.fk_categorie IS NULL"; +if ($search_categ_sup == -2) $sql.= " AND cs.fk_categorie IS NULL"; + +if ($search_all) $sql.= natural_search(array_keys($fieldstosearchall), $search_all); +if (strlen($search_cti)) $sql.= natural_search('s.phone', $search_cti); + +if ($search_id > 0) $sql.= natural_search("s.rowid",$search_id,1); +if ($search_nom) $sql.= natural_search("s.nom",$search_nom); +if ($search_alias) $sql.= natural_search("s.name_alias",$search_alias); +if ($search_nom_only) $sql.= natural_search("s.nom",$search_nom_only); +if ($search_customer_code) $sql.= natural_search("s.code_client",$search_customer_code); +if ($search_supplier_code) $sql.= natural_search("s.code_fournisseur",$search_supplier_code); +if ($search_account_customer_code) $sql.= natural_search("s.code_compta",$search_account_customer_code); +if ($search_account_supplier_code) $sql.= natural_search("s.code_compta_fournisseur",$search_account_supplier_code); +if ($search_town) $sql.= natural_search("s.town",$search_town); +if (strlen($search_zip)) $sql.= natural_search("s.zip",$search_zip); +if ($search_state) $sql.= natural_search("state.nom",$search_state); +if ($search_region) $sql.= natural_search("region.nom",$search_region); +if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')'; +if ($search_email) $sql.= natural_search("s.email",$search_email); +if (strlen($search_phone)) $sql.= natural_search("s.phone", $search_phone); +if ($search_url) $sql.= natural_search("s.url",$search_url); +if (strlen($search_idprof1)) $sql.= natural_search("s.siren",$search_idprof1); +if (strlen($search_idprof2)) $sql.= natural_search("s.siret",$search_idprof2); +if (strlen($search_idprof3)) $sql.= natural_search("s.ape",$search_idprof3); +if (strlen($search_idprof4)) $sql.= natural_search("s.idprof4",$search_idprof4); +if (strlen($search_idprof5)) $sql.= natural_search("s.idprof5",$search_idprof5); +if (strlen($search_idprof6)) $sql.= natural_search("s.idprof6",$search_idprof6); +if (strlen($search_vat)) $sql.= natural_search("s.tva_intra",$search_vat); +// Filter on type of thirdparty +if ($search_type > 0 && in_array($search_type,array('1,3','2,3'))) $sql .= " AND s.client IN (".$db->escape($search_type).")"; +if ($search_type > 0 && in_array($search_type,array('4'))) $sql .= " AND s.fournisseur = 1"; +if ($search_type == '0') $sql .= " AND s.client = 0 AND s.fournisseur = 0"; +if ($search_status!='' && $search_status >= 0) $sql .= " AND s.status = ".$db->escape($search_status); +if (!empty($conf->barcode->enabled) && $search_barcode) $sql.= natural_search("s.barcode", $search_barcode); +if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; +if ($search_levels) $sql .= " AND s.fk_prospectlevel IN (".$search_levels.')'; +if ($search_stcomm != '' && $search_stcomm != -2) $sql.= natural_search("s.fk_stcomm",$search_stcomm,2); +if ($search_import_key) $sql.= natural_search("s.import_key",$search_import_key); +// Add where from extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; + +// Add where from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; + +$sql.= $db->order($sortfield,$sortorder); + +// Count total nb of records +$nbtotalofrecords = ''; +if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) +{ + $result = $db->query($sql); + $nbtotalofrecords = $db->num_rows($result); +} + +$sql.= $db->plimit($limit+1, $offset); + +$resql = $db->query($sql); +if (! $resql) +{ + dol_print_error($db); + exit; +} + +$num = $db->num_rows($resql); + +$arrayofselected=is_array($toselect)?$toselect:array(); + +if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && ($search_all != '' || $search_cti != '') && $action != 'list') +{ + $obj = $db->fetch_object($resql); + $id = $obj->rowid; + header("Location: ".DOL_URL_ROOT.'/societe/card.php?socid='.$id); + exit; +} + +$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; +llxHeader('',$langs->trans("ThirdParty"),$help_url); + +$param=''; +if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; +if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; +if ($search_all != '') $param = "&sall=".urlencode($search_all); +if ($sall != '') $param .= "&sall=".urlencode($sall); +if ($search_categ_cus > 0) $param.='&search_categ_cus='.urlencode($search_categ_cus); +if ($search_categ_sup > 0) $param.='&search_categ_sup='.urlencode($search_categ_sup); +if ($search_sale > 0) $param.='&search_sale='.urlencode($search_sale); +if ($search_id > 0) $param.= "&search_id=".urlencode($search_id); +if ($search_nom != '') $param.= "&search_nom=".urlencode($search_nom); +if ($search_alias != '') $param.= "&search_alias=".urlencode($search_alias); +if ($search_town != '') $param.= "&search_town=".urlencode($search_town); +if ($search_zip != '') $param.= "&search_zip=".urlencode($search_zip); +if ($search_phone != '') $param.= "&search_phone=".urlencode($search_phone); +if ($search_email != '') $param.= "&search_email=".urlencode($search_email); +if ($search_url != '') $param.= "&search_url=".urlencode($search_url); +if ($search_state != '') $param.= "&search_state=".urlencode($search_state); +if ($search_country != '') $param.= "&search_country=".urlencode($search_country); +if ($search_customer_code != '') $param.= "&search_customer_code=".urlencode($search_customer_code); +if ($search_supplier_code != '') $param.= "&search_supplier_code=".urlencode($search_supplier_code); +if ($search_account_customer_code != '') $param.= "&search_account_customer_code=".urlencode($search_account_customer_code); +if ($search_account_supplier_code != '') $param.= "&search_account_supplier_code=".urlencode($search_account_supplier_code); +if ($search_barcode != '') $param.= "&search_barcode=".urlencode($search_barcode); +if ($search_idprof1 != '') $param.= '&search_idprof1='.urlencode($search_idprof1); +if ($search_idprof2 != '') $param.= '&search_idprof2='.urlencode($search_idprof2); +if ($search_idprof3 != '') $param.= '&search_idprof3='.urlencode($search_idprof3); +if ($search_idprof4 != '') $param.= '&search_idprof4='.urlencode($search_idprof4); +if ($search_idprof5 != '') $param.= '&search_idprof5='.urlencode($search_idprof5); +if ($search_idprof6 != '') $param.= '&search_idprof6='.urlencode($search_idprof6); +if ($search_vat != '') $param.= '&search_vat='.urlencode($search_vat); +if ($search_type_thirdparty != '') $param.='&search_type_thirdparty='.urlencode($search_type_thirdparty); +if ($search_type != '') $param.='&search_type='.urlencode($search_type); +if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); +if ($search_status != '') $param.='&search_status='.urlencode($search_status); +if ($search_stcomm != '') $param.='&search_stcomm='.urlencode($search_stcomm); +if ($search_level_from != '') $param.='&search_level_from='.urlencode($search_level_from); +if ($search_level_to != '') $param.='&search_level_to='.urlencode($search_level_to); +if ($search_import_key != '') $param.='&search_import_key='.urlencode($search_import_key); +if ($type != '') $param.='&type='.urlencode($type); +// Add $param from extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; + +// Show delete result message +if (GETPOST('delsoc')) +{ + setEventMessages($langs->trans("CompanyDeleted",GETPOST('delsoc')), null, 'mesgs'); +} + +// List of mass actions available +$arrayofmassactions = array( + 'presend'=>$langs->trans("SendByMail"), +// 'builddoc'=>$langs->trans("PDFMerge"), +); +//if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); +if ($user->rights->societe->supprimer) $arrayofmassactions['predelete']=$langs->trans("Delete"); +if (GETPOST('nomassaction','int') || in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); +$massactionbutton=$form->selectMassAction('', $arrayofmassactions); + +print '
'; +if ($optioncss != '') print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_companies', 0, '', '', $limit); + +$langs->load("other"); +$textprofid=array(); +foreach(array(1,2,3,4,5,6) as $key) +{ + $label=$langs->transnoentities("ProfId".$key.$mysoc->country_code); + $textprofid[$key]=''; + if ($label != "ProfId".$key.$mysoc->country_code) + { // Get only text between () + if (preg_match('/\((.*)\)/i',$label,$reg)) $label=$reg[1]; + $textprofid[$key]=$langs->trans("ProfIdShortDesc",$key,$mysoc->country_code,$label); + } +} + +$topicmail="Information"; +$modelmail="thirdparty"; +$objecttmp=new Societe($db); +$trackid='thi'.$object->id; +include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; + +if ($search_all) +{ + foreach($fieldstosearchall as $key => $val) $fieldstosearchall[$key]=$langs->trans($val); + print $langs->trans("FilterOnInto", $search_all) . join(', ',$fieldstosearchall); +} + +// Filter on categories +$moreforfilter=''; +if (empty($type) || $type == 'c' || $type == 'p') +{ + if (! empty($conf->categorie->enabled)) + { + require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('CustomersProspectsCategoriesShort').': '; + $moreforfilter.=$formother->select_categories('customer', $search_categ_cus, 'search_categ_cus', 1, $langs->trans('CustomersProspectsCategoriesShort')); + $moreforfilter.='
'; + } +} +if (empty($type) || $type == 'f') +{ + if (! empty($conf->categorie->enabled)) + { + require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('SuppliersCategoriesShort').': '; + $moreforfilter.=$formother->select_categories('supplier',$search_categ_sup,'search_categ_sup',1); + $moreforfilter.='
'; + } +} + +// If the user can view prospects other than his' +if ($user->rights->societe->client->voir || $socid) +{ + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; + $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user, 0, 1, 'maxwidth300'); + $moreforfilter.='
'; +} +if ($moreforfilter) +{ + print '
'; + print $moreforfilter; + $parameters=array('type'=>$type); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '
'; +} + +$varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; +$selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1); + +if (empty($arrayfields['customerorsupplier']['checked'])) print ''; + +print '
'; +print ''."\n"; + +// Fields title search +print ''; +if (! empty($arrayfields['s.rowid']['checked'])) +{ + print ''; +} +if (! empty($arrayfields['s.nom']['checked'])) +{ + print ''; +} +if (! empty($arrayfields['s.name_alias']['checked'])) +{ + print ''; +} +// Barcode +if (! empty($arrayfields['s.barcode']['checked'])) +{ + print ''; +} +// Customer code +if (! empty($arrayfields['s.code_client']['checked'])) +{ + print ''; +} +// Supplier code +if (! empty($arrayfields['s.code_fournisseur']['checked'])) +{ + print ''; +} +// Account Customer code +if (! empty($arrayfields['s.code_compta']['checked'])) +{ + print ''; +} +// Account Supplier code +if (! empty($arrayfields['s.code_compta_fournisseur']['checked'])) +{ + print ''; +} +// Town +if (! empty($arrayfields['s.town']['checked'])) +{ + print ''; +} +// Zip +if (! empty($arrayfields['s.zip']['checked'])) +{ + print ''; +} +// State +if (! empty($arrayfields['state.nom']['checked'])) +{ + print ''; +} +// Region +if (! empty($arrayfields['region.nom']['checked'])) +{ + print ''; +} +// Country +if (! empty($arrayfields['country.code_iso']['checked'])) +{ + print ''; +} +// Company type +if (! empty($arrayfields['typent.code']['checked'])) +{ + print ''; +} +if (! empty($arrayfields['s.email']['checked'])) +{ + // Email + print ''; +} +if (! empty($arrayfields['s.phone']['checked'])) +{ + // Phone + print ''; +} +if (! empty($arrayfields['s.url']['checked'])) +{ + // Url + print ''; +} +if (! empty($arrayfields['s.siren']['checked'])) +{ + // IdProf1 + print ''; +} +if (! empty($arrayfields['s.siret']['checked'])) +{ + // IdProf2 + print ''; +} +if (! empty($arrayfields['s.ape']['checked'])) +{ + // IdProf3 + print ''; +} +if (! empty($arrayfields['s.idprof4']['checked'])) +{ + // IdProf4 + print ''; +} +if (! empty($arrayfields['s.idprof5']['checked'])) +{ + // IdProf5 + print ''; +} +if (! empty($arrayfields['s.idprof6']['checked'])) +{ + // IdProf6 + print ''; +} +if (! empty($arrayfields['s.tva_intra']['checked'])) +{ + // Vat number + print ''; +} + +// Type (customer/prospect/supplier) +if (! empty($arrayfields['customerorsupplier']['checked'])) +{ + print ''; +} +if (! empty($arrayfields['s.fk_prospectlevel']['checked'])) +{ + // Prospect level + print ''; +} + +if (! empty($arrayfields['s.fk_stcomm']['checked'])) +{ + // Prospect status + print ''; +} +// Extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; + +// Fields from hook +$parameters=array('arrayfields'=>$arrayfields); +$reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +// Date creation +if (! empty($arrayfields['s.datec']['checked'])) +{ + print ''; +} +// Date modification +if (! empty($arrayfields['s.tms']['checked'])) +{ + print ''; +} +// Status +if (! empty($arrayfields['s.status']['checked'])) +{ + print ''; +} +if (! empty($arrayfields['s.import_key']['checked'])) +{ + print ''; +} +// Action column +print ''; + +print "\n"; + +print ''; +if (! empty($arrayfields['s.rowid']['checked'])) print_liste_field_titre($arrayfields['s.rowid']['label'], $_SERVER["PHP_SELF"],"s.rowid","",$param,"",$sortfield,$sortorder); +if (! empty($arrayfields['s.nom']['checked'])) print_liste_field_titre($arrayfields['s.nom']['label'], $_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); +if (! empty($arrayfields['s.name_alias']['checked'])) print_liste_field_titre($arrayfields['s.name_alias']['label'], $_SERVER["PHP_SELF"],"s.name_alias","",$param,"",$sortfield,$sortorder); +if (! empty($arrayfields['s.barcode']['checked'])) print_liste_field_titre($arrayfields['s.barcode']['label'], $_SERVER["PHP_SELF"], "s.barcode",$param,'','',$sortfield,$sortorder); +if (! empty($arrayfields['s.code_client']['checked'])) print_liste_field_titre($arrayfields['s.code_client']['label'],$_SERVER["PHP_SELF"],"s.code_client","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.code_fournisseur']['checked'])) print_liste_field_titre($arrayfields['s.code_fournisseur']['label'],$_SERVER["PHP_SELF"],"s.code_fournisseur","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.code_compta']['checked'])) print_liste_field_titre($arrayfields['s.code_compta']['label'],$_SERVER["PHP_SELF"],"s.code_compta","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.code_compta_fournisseur']['checked'])) print_liste_field_titre($arrayfields['s.code_compta_fournisseur']['label'],$_SERVER["PHP_SELF"],"s.code_compta_fournisseur","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.town']['checked'])) print_liste_field_titre($arrayfields['s.town']['label'],$_SERVER["PHP_SELF"],"s.town","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.zip']['checked'])) print_liste_field_titre($arrayfields['s.zip']['label'],$_SERVER["PHP_SELF"],"s.zip","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['state.nom']['checked'])) print_liste_field_titre($arrayfields['state.nom']['label'],$_SERVER["PHP_SELF"],"state.nom","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['region.nom']['checked'])) print_liste_field_titre($arrayfields['region.nom']['label'],$_SERVER["PHP_SELF"],"region.nom","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['country.code_iso']['checked'])) print_liste_field_titre($arrayfields['country.code_iso']['label'],$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); +if (! empty($arrayfields['typent.code']['checked'])) print_liste_field_titre($arrayfields['typent.code']['label'],$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); +if (! empty($arrayfields['s.email']['checked'])) print_liste_field_titre($arrayfields['s.email']['label'],$_SERVER["PHP_SELF"],"s.email","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.phone']['checked'])) print_liste_field_titre($arrayfields['s.phone']['label'],$_SERVER["PHP_SELF"],"s.phone","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.url']['checked'])) print_liste_field_titre($arrayfields['s.url']['label'],$_SERVER["PHP_SELF"],"s.url","",$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['s.siren']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId1Short"),$textprofid[1],1,0),$_SERVER["PHP_SELF"],"s.siren","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.siret']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId2Short"),$textprofid[2],1,0),$_SERVER["PHP_SELF"],"s.siret","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.ape']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId3Short"),$textprofid[3],1,0),$_SERVER["PHP_SELF"],"s.ape","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.idprof4']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId4Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof4","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.idprof5']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId5Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof5","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.idprof6']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId6Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof6","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.tva_intra']['checked'])) print_liste_field_titre($arrayfields['s.tva_intra']['label'],$_SERVER["PHP_SELF"],"s.tva_intra","",$param,'class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['customerorsupplier']['checked'])) print_liste_field_titre(''); // type of customer +if (! empty($arrayfields['s.fk_prospectlevel']['checked'])) print_liste_field_titre($arrayfields['s.fk_prospectlevel']['label'],$_SERVER["PHP_SELF"],"s.fk_prospectlevel","",$param,'align="center"',$sortfield,$sortorder); +if (! empty($arrayfields['s.fk_stcomm']['checked'])) print_liste_field_titre($arrayfields['s.fk_stcomm']['label'],$_SERVER["PHP_SELF"],"s.fk_stcomm","",$param,'align="center"',$sortfield,$sortorder); +// Extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; +// Hook fields +$parameters=array('arrayfields'=>$arrayfields,'param'=>$param,'sortfield'=>$sortfield,'sortorder'=>$sortorder); +$reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +if (! empty($arrayfields['s.datec']['checked'])) print_liste_field_titre($arrayfields['s.datec']['label'],$_SERVER["PHP_SELF"],"s.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.tms']['checked'])) print_liste_field_titre($arrayfields['s.tms']['label'],$_SERVER["PHP_SELF"],"s.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['s.status']['checked'])) print_liste_field_titre($arrayfields['s.status']['label'],$_SERVER["PHP_SELF"],"s.status","",$param,'align="center"',$sortfield,$sortorder); +if (! empty($arrayfields['s.import_key']['checked'])) print_liste_field_titre($arrayfields['s.import_key']['label'],$_SERVER["PHP_SELF"],"s.import_key","",$param,'align="center"',$sortfield,$sortorder); +print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); +print "\n"; + + +$i = 0; +$totalarray=array(); +while ($i < min($num, $limit)) +{ + $obj = $db->fetch_object($resql); + + $companystatic->id=$obj->rowid; + $companystatic->name=$obj->name; + $companystatic->name_alias=$obj->name_alias; + $companystatic->logo=$obj->logo; + $companystatic->canvas=$obj->canvas; + $companystatic->client=$obj->client; + $companystatic->status=$obj->status; + $companystatic->email=$obj->email; + $companystatic->fournisseur=$obj->fournisseur; + $companystatic->code_client=$obj->code_client; + $companystatic->code_fournisseur=$obj->code_fournisseur; + + $companystatic->code_compta_client=$obj->code_compta; + $companystatic->code_compta_fournisseur=$obj->code_compta_fournisseur; + + $companystatic->fk_prospectlevel=$obj->fk_prospectlevel; + + print ''; + if (! empty($arrayfields['s.rowid']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.nom']['checked'])) + { + $savalias = $obj->name_alias; + if (! empty($arrayfields['s.name_alias']['checked'])) $companystatic->name_alias=''; + print '\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.name_alias']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } + // Barcode + if (! empty($arrayfields['s.barcode']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Customer code + if (! empty($arrayfields['s.code_client']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Supplier code + if (! empty($arrayfields['s.code_fournisseur']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Account customer code + if (! empty($arrayfields['s.code_compta']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Account supplier code + if (! empty($arrayfields['s.code_compta_fournisseur']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Town + if (! empty($arrayfields['s.town']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + // Zip + if (! empty($arrayfields['s.zip']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + // State + if (! empty($arrayfields['state.nom']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + // Region + if (! empty($arrayfields['region.nom']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + // Country + if (! empty($arrayfields['country.code_iso']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Type ent + if (! empty($arrayfields['typent.code']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.email']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.phone']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.url']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.siren']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.siret']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.ape']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.idprof4']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.idprof5']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.idprof6']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.tva_intra']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + // Type + if (! empty($arrayfields['customerorsupplier']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + + if (! empty($arrayfields['s.fk_prospectlevel']['checked'])) + { + // Prospect level + print '"; + if (! $i) $totalarray['nbfield']++; + } + + if (! empty($arrayfields['s.fk_stcomm']['checked'])) + { + // Prospect status + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (! empty($arrayfields['s.datec']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Date modification + if (! empty($arrayfields['s.tms']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Status + if (! empty($arrayfields['s.status']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['s.import_key']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } + + // Action column + print ''; + if (! $i) $totalarray['nbfield']++; + + print ''."\n"; + $i++; +} + +$db->free($resql); + +$parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql); +$reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + +print "
'; + print ''; + print ''; + if (! empty($search_nom_only) && empty($search_nom)) $search_nom=$search_nom_only; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print $form->select_country($search_country,'search_country','',0,'maxwidth100'); + print ''; + print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 0, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT)?'ASC':$conf->global->SOCIETE_SORT_ON_TYPEENT)); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if ($type != '') print ''; + print ''; + $options_from = ''; // Generate in $options_from the list of each option sorted + foreach ($tab_level as $tab_level_sortorder => $tab_level_label) + { + $options_from .= ''; + } + array_reverse($tab_level, true); // Reverse the list + $options_to = ''; // Generate in $options_to the list of each option sorted in the reversed order + foreach ($tab_level as $tab_level_sortorder => $tab_level_label) + { + $options_to .= ''; + } + + // Print these two select + print $langs->trans("From").' '; + print ' '; + print $langs->trans("to").' '; + + print ''; + $arraystcomm=array(); + foreach($prospectstatic->cacheprospectstatus as $key => $val) + { + $arraystcomm[$val['id']]=($langs->trans("StatusProspect".$val['id']) != "StatusProspect".$val['id'] ? $langs->trans("StatusProspect".$val['id']) : $val['label']); + } + print $form->selectarray('search_stcomm', $arraystcomm, $search_stcomm, -2); + print ''; + print ''; + print ''; + print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')), $search_status, 1); + print ''; + print ''; + print ''; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; +print '
'; + print $obj->rowid; + print "'; + print $obj->name; + print "'; + print $companystatic->name_alias; + print "'.$obj->barcode.''.$obj->code_client.''.$obj->code_fournisseur.''.$obj->code_compta.''.$obj->code_compta_fournisseur.'".$obj->town."".$obj->zip."".$obj->state_name."".$obj->region_name."'; + $tmparray=getCountry($obj->fk_pays,'all'); + print $tmparray['label']; + print ''; + if (! is_array($typenArray) || count($typenArray)==0) $typenArray = $formcompany->typent_array(1); + print $typenArray[$obj->typent_code]; + print '".$obj->email."".$obj->phone."".$obj->url."".$obj->idprof1."".$obj->idprof2."".$obj->idprof3."".$obj->idprof4."".$obj->idprof5."".$obj->idprof6."".$obj->tva_intra."'; + $s=''; + if (($obj->client==1 || $obj->client==3) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) + { + $companystatic->name=$langs->trans("Customer"); + $companystatic->name_alias=''; + $s.=$companystatic->getNomUrl(0,'customer',0,1); + } + if (($obj->client==2 || $obj->client==3) && empty($conf->global->SOCIETE_DISABLE_PROSPECTS)) + { + if ($s) $s.=" / "; + $companystatic->name=$langs->trans("Prospect"); + $companystatic->name_alias=''; + $s.=$companystatic->getNomUrl(0,'prospect',0,1); + } + if (! empty($conf->fournisseur->enabled) && $obj->fournisseur) + { + if ($s) $s.=" / "; + $companystatic->name=$langs->trans("Supplier"); + $companystatic->name_alias=''; + $s.=$companystatic->getNomUrl(0,'supplier',0,1); + } + print $s; + print ''; + print $companystatic->getLibProspLevel(); + print "
'; + print '
'.$companystatic->LibProspCommStatut($obj->stcomm_id,2,$prospectstatic->cacheprospectstatus[$obj->stcomm_id]['label']); + print '
-
'; + foreach($prospectstatic->cacheprospectstatus as $key => $val) + { + $titlealt='default'; + if (! empty($val['code']) && ! in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) $titlealt=$val['label']; + if ($obj->stcomm_id != $val['id']) print ''.img_action($titlealt,$val['code']).''; + } + print '
'; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''.$companystatic->getLibStatut(3).''; + print $obj->import_key; + print "'; + if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + { + $selected=0; + if (in_array($obj->rowid, $arrayofselected)) $selected=1; + print ''; + } + print '
"; +print "
"; + +print '
'; + +llxFooter(); +$db->close(); diff --git a/htdocs/takepos/dev/img/README.md b/htdocs/takepos/dev/img/README.md new file mode 100644 index 00000000000..5cd4c76d010 --- /dev/null +++ b/htdocs/takepos/dev/img/README.md @@ -0,0 +1,53 @@ +Source images +============= + +Used to generate icons and publication assets. + +Icons +----- + +### Dolibarr + +These resides in the [/img](../../img) directory. + +#### Small + +Required. +Name must begin by ```object_```. + +- Sample: ![object_takepos.png](../../img/object_takepos.png) [object_takepos.png](../../img/object_takepos.png) +- Size: 14×14 pixels +- Type: PNG + +#### Large + +Optional. + +- Sample: ![takepos.png](../../img/takepos.png) [takepos.png](../../img/takepos.png) +- Size: 32×32 pixels +- Type: PNG + +### Dolistore + +Designed to fit a 512×512 icon + publisher branding. + +- Size: 704×704 +- Type: PNG + +Export to 512×512 + +### Transifex + +- Size: 96×96 +- Type: PNG + +### Others + +To be on the safe side, you may also want to generate all popular sizes: +- 16×16 +- 32×32 +- 48×48 +- 64×64 +- 128×128 +- 256×256 +- 512×512 diff --git a/htdocs/takepos/dev/img/gfdl-129x44.png b/htdocs/takepos/dev/img/gfdl-129x44.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bacfd179a99f051654eaa6ba30089dd8691d7a GIT binary patch literal 4709 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 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/dev/img/gfdl-66x23.png b/htdocs/takepos/dev/img/gfdl-66x23.png new file mode 100644 index 0000000000000000000000000000000000000000..b43479bf3c817b3f780eb453ef3c4e770e1ddc35 GIT binary patch literal 2453 zcmV;G32OFElDZw|yVYEgfW}Cy|k! zgx#J@dYX;&G#ew5FXBW=C5OK*=2TfN#mCEavsn&k0X^XE@ra^mcvn%BC6d8lC^yN* zgv%!6U+9|78#_Pv8yh$6;F+iA^Rt^S=eg(K;ne9GKHv8bT3R{~4F)91KtjBg?~c9+ zKp>zA^B;UpI`(a;w0h+{e!c3A*(XaX3nahaf8umSeE}d`*s{(aZ~lHS27`z_BN>w{ z)8p|{e7u6l2osYhk4831$g&YhGH}an%V}%tqN%AJS(dos@=M5aq|oK^N}8tUONtUG zDJ`w`0p`JiH8*$g$)CTX_;@+BbuEm(IE%|BY65MYMQ97X`-&a1yv0I5Fc+1&5g9wL>%^HzWsL<5pfe~ zt=*3Vlr=Q8nlw#E6wj`X-5(#~-uu^b)spr6vwa1c22VMN#3je)$7vnod)5J63BHW|K@^ zeG8v`euTB_-$N4<7?J-V-tJmJ2oj+N0%C1lGwEqI06bnF%O2Ydz`Cawgh=Rx$z){A z=xkE^BxjB=4VvWAC4~S)3?a|UP3NTz4{`0(MSQsX3r?0)F)}YBXk(V?7{<02KEJ|* z$@8dhXd}uJMRasDu`w26V=cJdUTSI@=;-Jo(h`fwl8GgC9%f5w(AHg#07$y7Hye$T zx1yrn+)KoPgU6_L6VRZl|O&rC@ybMm3RPoi} z??Xg{3$saP{kos?z@pbkaxNyIdT=Xly1IH04JP7p5=fM-gBuG12m&I2*(_I=SJa1O zC8ae06If01i z3@mX@BCVN7Ly-UkDL6xfrs?I?HBBL5d3hZGHe1|zC-lLt131SN;>f!_L})m;C?N&_ zzoMLX%wD|w!a_Q0KSB%m!Z#8`fFKc~ASA}cMTcaGiLn4QHn#V(2?R8HJU%o{M^yv3 zd%Wm+{|)D+8z*!0@ar5q@}DsG$gI0++eBqnhhIr+2jc>Vo!OeUGANHa;ccxK;ueb@=r z)wclPblStV84N2|%)!(4HGWTXcm};h2!asl_4?zoGE+jb3FDm@3?knbms3(&9r{1t z>EM%()-&_w;GVu{;q62YGtuW1O%E%V`i53coUCNb=xioU9QA|xHMK(*X|+bN>WMjY zRPP8YwjhWILU3th3If>e$su7@W(q}x)6jLD^)J3Nz}RG#0Wcb+(0`hyo%tQ~Y&I;` zJ@+<#zsgf9<_s0QT;9;oLqwOL?Amp*6K5xHhRw~=x z`IIMD{uV`10Z`QdE|+_NJC~~mfUd5AGJv+Wu23NW?jA2k|9O(4dsgw*w!LiLxP%+0 zO%Ca+Y9Qpx?e?Oo0ovPL?E2^+lEE-!SqBatW6iVgW6PUQIM=7%86g4Lj?853T!rMM zc)r}fg~dxY^759QY<+bXqef+N{6rk*vS0i+-r9q^#|yxe>lXHt&Aa#J zL5nJ{sORo`o*^-J!LVEAKq5d8MP9z^jvMCxX6vIv(yS;d#m6gXZ+DTFX2W4mMv~5| zd%QkGK}41%R5gIluV9Ia=;y=T<3%<~NRk0X37`f7!_F74&yPVAF&cwD{bw#}vTO`p z-WEN)0k7B3tDBe6?e;Kv$}iBPred{C42uMS?zZDp{%b2zgvmTAD=TH_UL!aQhB{#a zM3_zeboylzUaGDCCSi__;aD_I)!uA;PTl>aZDK2Z(k_hHoDtS z1Y_s|IeoXz9}~ + + + + + + + + + image/svg+xml + + + + + + + + + GFDL + + + + + + + diff --git a/htdocs/takepos/dev/img/gpl-v3-logo.svg b/htdocs/takepos/dev/img/gpl-v3-logo.svg new file mode 100644 index 00000000000..6754c994bda --- /dev/null +++ b/htdocs/takepos/dev/img/gpl-v3-logo.svg @@ -0,0 +1,389 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/htdocs/takepos/dev/img/gplv3-127x51.png b/htdocs/takepos/dev/img/gplv3-127x51.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9136e626683ac152b73bc8fffcb15d1806091a GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/dev/img/gplv3-88x31.png b/htdocs/takepos/dev/img/gplv3-88x31.png new file mode 100644 index 0000000000000000000000000000000000000000..ba78d4c4941dabf2fcac5409a92ac4c57920c69f GIT binary patch literal 2666 zcmV-w3YGPVP)Px#32;bRa{vGVivR!tivi)#(!2lw00(qQO+^RT0uvMpF24YJ`L;(K) z{{a7>y{D4^014_zL_t(&-tC%skW|$b#(x5`77PlZ01Xf|tXfvU1+9P)Nl;9MMIeIW zf~A;|yxWx-F&@d<9Z!mSGK`{-NXD*+V< z1U?qnFHjo71r>243NtglEQV7Q5|M$wwPW#3mU1Xa75(4)}+D^1dj!r-wg;N!7wPTlz6cv~* zaG8PJ%ocdxi%_r(8VF2J2gJd((|x~-stE3f0*?zktgtfz_z{7D0<}|XS^^CmbayaJ zV6ea`S+E+%|4L05^x|!{8+(dT?jEM~Js`$27+y6h2%>GgYF0wJYE0l-O z)7o925Tv&W;2eAZgu;B5;j^dJ8-bz3oKpjkZt1g)zX^66mI| z)j_Xp5wNzxdh2k6HU6=}>lr5fjzC|47oe%aZiQ_MKeNs1Wz;5au`^ddqYxT8_`O0| z2+eKGVG3K)+k_Uu1%|7S@cDv!RA5U0Jp{%pe3tfppM%?rytQ5}8P;njwoMwi^#raG z_|!q~0P19O58V`YC~Ow^rGefh%fweYXuAOFEA&%1pirdH-T=NSi#0u9by^9`QxJv5 zHjl?NEpVEPINjb~s%aLOrIZQ$Er2cpYhwES(!o;>ZWd4fj>h!yt-vP^&Rzf~rSJ-% zg@aKFTLZW-2{m&$=#dIvD=Zf1XvcR*1&`sq0ThV$zmI09^NGMv1M6&ojS7EJsBiOF z8n;M=9{?nvrNFcK_*#Yg1^TDhK}Ke?#C57YX(PO#~hmZ&YIfXpm0?Of77b zcz4lUy){(?;9j;d=Zg=NarIQ8n^{2*frBCRE`gImI7i`?I3Q90+X5fTF_*Oh*9+WO z1x|lZpeTTXIJ}Zj$9dYg#Asf_jNm>ECo6nxzAm326$kDY0%zN14N};eq2A;GS}N34 z_?^POB%Ep+b3>f}wIrZv1mNKjYL#A=I=IZiomF5OUkN;%%t28n`n7hnwKmOUxi!^C z?!7sJ)RYjqCgH3A+6T}!^hf+gd!G=mbKa5;2^2Z#5Q*l| zfdhdl0@EDyF+dtC++#s#w6j4H&?112wh__NE(zy`FhF3r<@t|C0A7{B|L)KTzz$ld zr)$xAGn~&v$ExqQqQD+9qd48hXc$805H1yOr8Q%W^E8V!qcoEr7HA|sO)M9(j7va) zLPO)u<>K8*eH(mXo|E4b6{n4!WlMoas%ZhvALqY1(?UYejX$qum2H*6CFz(2o?R^x zDEv(hmVvj&jg=p^uDHvkZKlwQXnG#Q_KXL#Ubbsr9Nn7x7-IFOx}g0W@Fj z20>x8!ootY1Jtn~{dF~g`?~m)`Q!|iyHa6%kmfQnQM3*U9~p3ePDSc@Q2%*2Wf?S% zmJ%okp_W5IHRG)GOwilcdW(Gu*4g{T~>dyLTd*<7nqH5>P4bO#m15lF^bQk0@fXG4I;>Zi8G4~)h=aS0UnUjaR`^J~?z=+$ zHTWKdViR&!n`TiY-;I@$Nas4sHq*3$R%RqSBP!U};>Y>BK#9N@@vNzKHf)UY&9JQQ zCMxp?bTg|ev(NnmCWO%6!B~MAp&w|lz>EMc4xx`RjCHn%FPzVQekwkb8YeK{!Gi*~ zsNb|P0)6c!`IJklP`iK9vb6vc-7RoHJ0Nq5dRwk5m+UDA)gAo?O?LN0*eFN#QW*D#LIwjzkygL(4{)S zRcNGevoWb@0%ujrt~sxh79Qi@G*o92@TaP*zZ6=F7pc}Mlq8{3Nv<1-3c80vD-#)#iR!fAg3`3i=|n0Ep+VCB*yVN$x?2_YiZ5k$@3&Tcz#W!=Gm9%=?NxpL Y19h*OP%`Tk_W%F@07*qoM6N<$g8#_jNdN!< literal 0 HcmV?d00001 diff --git a/htdocs/takepos/dev/img/takepos.svg b/htdocs/takepos/dev/img/takepos.svg new file mode 100644 index 00000000000..f51ead1a94e --- /dev/null +++ b/htdocs/takepos/dev/img/takepos.svg @@ -0,0 +1,70 @@ + + + + + + + + + + image/svg+xml + + + + + + + M + + diff --git a/htdocs/takepos/floors.php b/htdocs/takepos/floors.php new file mode 100644 index 00000000000..a108c54bf7c --- /dev/null +++ b/htdocs/takepos/floors.php @@ -0,0 +1,176 @@ + + * + * 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 . + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +$_GET['theme']="md"; // Force theme. MD theme provides better look and feel to TakePOS + +require '../main.inc.php'; // Load $user and permissions + +$floor=GETPOST('floor'); +if ($floor=="") $floor=1; +$id = GETPOST('id'); +$action = GETPOST('action'); +$left = GETPOST('left'); +$top = GETPOST('top'); +$place = GETPOST('place'); +$newname = GETPOST('newname'); +$mode = GETPOST('mode'); + +if ($action=="getTables"){ + $sql="SELECT * from ".MAIN_DB_PREFIX."takepos_floor_tables where floor=".$floor; + $resql = $db->query($sql); + $rows = array(); + while($row = $db->fetch_array ($resql)){ + $rows[] = $row; + } + echo json_encode($rows); + exit; +} + +if ($action=="update") +{ + if ($left>95) $left=95; + if ($top>95) $top=95; + if ($left>3 or $top>4) $db->query("update ".MAIN_DB_PREFIX."takepos_floor_tables set leftpos=$left, toppos=$top where label='$place'"); + else $db->query("delete from ".MAIN_DB_PREFIX."takepos_floor_tables where label='$place'"); +} + +if ($action=="updatename") +{ + $newname = preg_replace("/[^a-zA-Z0-9\s]/", "", $newname); // Only English chars + if (strlen($newname) > 3) $newname = substr($newname, 0, 3); // Only 3 chars + $db->query("update ".MAIN_DB_PREFIX."takepos_floor_tables set label='$newname' where label='$place'"); +} + +if ($action=="add") +{ + $asdf=$db->query("insert into ".MAIN_DB_PREFIX."takepos_floor_tables values ('', '', '', '45', '45', $floor)"); + $db->query("update ".MAIN_DB_PREFIX."takepos_floor_tables set label=rowid where label=''"); // No empty table names +} + +// Title +$title='TakePOS - Dolibarr '.DOL_VERSION; +if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $title='TakePOS - '.$conf->global->MAIN_APPLICATION_TITLE; +top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); +?> + + + + + + +admin){?> + + + +
+
+

';">trans("Floor")." ".$floor; ?>

+
+
+ + \ No newline at end of file diff --git a/htdocs/takepos/freezone.php b/htdocs/takepos/freezone.php new file mode 100644 index 00000000000..36b1913466e --- /dev/null +++ b/htdocs/takepos/freezone.php @@ -0,0 +1,59 @@ + + * + * 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 . + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +require '../main.inc.php'; // Load $user and permissions + +$langs->load("bills"); +$langs->load("cashdesk"); +$place = GETPOST('place'); + + +/* + * View + */ + +top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); + +?> + + + +
+
+ + + + +
+ + + \ No newline at end of file diff --git a/htdocs/takepos/genimg/add.jpg b/htdocs/takepos/genimg/add.jpg new file mode 100644 index 0000000000000000000000000000000000000000..976fd10697d47e06cc9d74f7efed36ab17d95ed7 GIT binary patch literal 5419 zcmeHL4OA0X7QRCW2>}g3z`xd@Kt-T>s!)GR01XNrgn$bE)KnDtJ1(^qLB$N>A7U*< zMYri9KPrf#DL*bA*117Cuv;;C3&)y~- zL^jWL(}#!$=JbnJ2Udw}f7VU?0Na`eP@0MEz;rOfFw^~GV=x(}W?^p5V6rS&ER(P; ztt{DW4x7c|4B&9Atm($G9LODDJ_g=$=LwOYrCD+u1`ioJ%;mk&u4CLhy*`{cY4VimGlc## zX9Wa?&7C(tJYvDZWy_;hM90L&eZD$zO;YmOb(=PC*}5%#d&aKad$RZL`|H=zf&&K+ z6&4*XK2la*apLcl-~Hp{`Ksy*7cYH(x#q^ry82rUw;P*U+wR?O|KUN$!%lV26U|d? zuTI}*!i53jIjk4Reuaxi<1(Yyz?@~mg_$MM!r+-RM}A;o>nma{T{URb_>F8kzpVVy zbCymMLRI#WpUF86&YrCl%>|>|Rss`|}-< zK7~>UT6PmXJH|B@QJ2HFAkfI;efT~ip&k4r;c6BFW+Z|=h13m&c3z4ILDBjnl)_!N ziC(x;ye15fO)$8faYb> zsR&%lNGYz&P8K5wa;U&GOgoX!3&Cx0)%%5k!Sw;P)k+ly&vI_2*lE{_gk` z%afEs1Qr>Rt3*YSQmoq6_TfM8C4A{1Rb(3N4%C3`KMForEdS+7d>FsATm%1X*2qd+9-LxA5{Q|M9E`)Xe4YnNKnWTKG z3Y$$zDJ+@adTq<9!yk9-2Nk((t47~_*ZHKh`C8M|+Zd@Aij88ke}6nWwXD$HGIdFugAK~%GNwc{9@V{b`wg$ zx^!A@U8gIfhxH0CWcJ4hq@*BK;E2D<3v`D2HPy%(-e|+_dO2As;l$$Q;;wx4`WK#8 zA1`k`?Y+J?U~FM!`59^R=d?HBhWe3 zBhW{Szxp3A-k|x|z)Oj*$76$U6Rq6pm1`8i6}OBVT8<5`mTq?7oqACMAHVi!$l4*U z(UCATa;@Ne4&GlF=W+91F5#c;c)aB?(KK5dPgZ!3OPO4IYLLpidxna;Gck9-!zYT4 zzJvS17Bwn@5(d>=K3w3r#VPcH$k(~mrv(?*_ZPmY-V~kr>WR37J{vq5fsxlqKgthK zPV>oPqQjTWMWC8_6hY55!Z9X~+t97sxky_`7uqZ>PVa^hG6Ywq2->_7n!cen^BYae zYrc*^;PI%(A_GXt8*klMO6E(vI_XN_lH#2d|Av(sLr}t{W=BH(UOsbk!n-9C2k#rd zI55k-{N%+E{+yw=Q!OI)2lIbh!Tz>5e|y+@d)WCy4v)o(@&@C(4Tb>8RUA%nRS*1B z!DkJp2c7lif2(TF{fNpu5|HS1I;UcddRmDz!)aEim&ZIi+c|avS?xRRus*UsR+-rk zSxJ24K75&?KgwGDDp@t$AMghmPt-3n_!*y(N9LJHx}C@GJk-)Bl2gwMV0QD=h`)>* ZyZpQCQQ^@qmB0JF|GfWsej+2(_-~uMLm2=7 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/genimg/empty.jpg b/htdocs/takepos/genimg/empty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8883f7c9957bf151875278b6ded394d9594c8b25 GIT binary patch literal 2239 zcmex=}T+5Ri6|E+FFJVCMj-APxLK zz#z!MsL5!;%&5e`B*@4t$oT&VgFMistiX@}1qKu_GBLBTvH_jM#SK)jRRHLGW@aX! zV_8{%-es%>$}_MCvI;30I#U-U>$dGXcJ4ZK_{h;?$4{I*b?NeztJkjIxOwa0 zqsLF4K70P+<*SdMK7aZ8?fZ|Pzd-(CWMGDP3+^*Ce+dHp#RQB47Iu)o7@5j}m|2j8 zRnd@5$T5&Tu~1masF6d&Y2w0-2RW6EgFc8R6KQ!#m{`Vr(cu+NC|SQA-3gL@3& ruUiZ}z=X*p$SlZU&+zxpqAm@FQ9K$3qiJ9?4UDFNVV?$=|K9`vEy2T8 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/genimg/index.php b/htdocs/takepos/genimg/index.php new file mode 100644 index 00000000000..5670e0791dd --- /dev/null +++ b/htdocs/takepos/genimg/index.php @@ -0,0 +1,142 @@ + + * + * 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 . + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +require '../../main.inc.php'; // Load $user and permissions + +$id= GETPOST('id'); +$w= GETPOST('w'); +$h= GETPOST('h'); +$query= GETPOST('query'); + + + +/* + * View + */ + +header('Content-Type: image/jpeg'); +header('Cache-Control: max-age=604800, public, must-revalidate'); +header('Pragma: cache'); + +if ($query=="cat") +{ + require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/lib/categories.lib.php'; + + $object = new Categorie($db); + $result = $object->fetch($id); + $upload_dir = $conf->categorie->multidir_output[$object->entity]; + $pdir = get_exdir($object->id,2,0,0,$object,'category') . $object->id ."/photos/"; + $dir = $upload_dir.'/'.$pdir; + foreach ($object->liste_photos($dir) as $key => $obj) + { + $filename=$obj['photo']; + } + + // The file + $filename = $dir.$filename; + if (!file_exists($filename)) $filename="empty.jpg"; + + // Dimensions + list($width, $height) = getimagesize($filename); + $new_width = $w; + $new_height = $h; + + // Resample + $image_p = imagecreatetruecolor($new_width, $new_height); + $image = imagecreatefromjpeg($filename); + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + + // Add icon + $icon = imagecreatefromjpeg('add.jpg'); + list($width, $height) = getimagesize('add.jpg'); + $new_width = $w*0.3; + $new_height = $h*0.3; + $icon_p = imagecreatetruecolor($new_width, $new_height); + imagecopyresampled($icon_p, $icon, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + imagecopymerge($image_p, $icon_p, 0, 0, 0, 0, $new_width, $new_height, 100); + + // Output + imagejpeg($image_p, null, 100); +} +else if ($query=="pro") +{ + require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php"); + $objProd = new Product($db); + $objProd->fetch($id); + + $dir .= get_exdir(0,0,0,0,$objProd,'product').$objProd->ref.'/'; + $pdir .= get_exdir(0,0,0,0,$objProd,'product').$objProd->ref.'/'; + + foreach ($objProd->liste_photos($dir) as $key => $obj) + { + $filename=$obj['photo']; + } + $filename = $dir.$filename; + + if (!file_exists($filename)){ + $dir = $conf->product->multidir_output[$objProd->entity].'/'.$pdir; + foreach ($objProd->liste_photos($dir) as $key => $obj) + { + $filename=$obj['photo']; + } + $filename = $dir.$filename; + } + + if (!file_exists($filename)) $filename="empty.jpg"; + + // Dimensions + list($width, $height) = getimagesize($filename); + $new_width = $w; + $new_height = $h; + + // Resample + $image_p = imagecreatetruecolor($new_width, $new_height); + $image = imagecreatefromjpeg($filename); + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + + // Output + imagejpeg($image_p, null, 100); +} +else +{ + // The file + $filename = $query.".jpg"; + + // Dimensions + list($width, $height) = getimagesize($filename); + $new_width = $w; + $new_height = $h; + + // Resample + $image_p = imagecreatetruecolor($new_width, $new_height); + $image = imagecreatefromjpeg($filename); + imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); + + // Output + imagejpeg($image_p, null, 100); +} diff --git a/htdocs/takepos/img/arrow-next-top.png b/htdocs/takepos/img/arrow-next-top.png new file mode 100644 index 0000000000000000000000000000000000000000..70f720cab10ca4fe54fa4681805275ce49885ea1 GIT binary patch literal 47808 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 Q_q_gfT_c_1%Xc3AKg*O6b^rhX literal 0 HcmV?d00001 diff --git a/htdocs/takepos/img/arrow-next.png b/htdocs/takepos/img/arrow-next.png new file mode 100644 index 0000000000000000000000000000000000000000..1056f024390c8e3e183a9b929b82a8851158db69 GIT binary patch literal 5125 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 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/img/arrow-prev-top.png b/htdocs/takepos/img/arrow-prev-top.png new file mode 100644 index 0000000000000000000000000000000000000000..23567d35890d19d066aad433e6999503aabccaaa GIT binary patch literal 47668 zcmeFYWl&u~w5UlS!QCB#ySqzphv4o9cefzH;o$C0aCdiicXx+_!zB0KH&buw%~ZX* zRr70hb@$r4S9hROKLiSfuYL%t6%Pt`-}f};ya6JIIGy1IlCD;nt}QaZMpN65Y7O_@b&BcKY1q8qz zgF)-Vd|$h3BaFG!tgdyQyZL4n8JOLkcv z;EY%4K+pQwe!P9}d0Oy{{FLdMc<)3i(wy_+B)0Ml(tlVVdP|#nmiBph6Zg4&E7Irh ze%rf)^!2?1eU2^Z-zDiCazgIEa;gY*Zq-9Dbbx+-xjXvy>+KXQK_BNAuiq(n#!Ed| zf&PtKcLgW^y6J}n*s9=PZ{@x~ckH}ZxaovFFMJ8C#rW{muo2SG|9E$Le!TMkh2OzT zETix9`P1)H&F2%qIJ}s=C78U`RfcBZstPtMpzv!=;+xEVN6_zEyVH-)aAXnae^LC; zM#+I1=t$4$NUQG1fVIGF!dwNwQk8n*9gY9HvywJeBH}NbqaXi{!r%JedZ-InbHTuP zIc%(cs{B0#KH6?;;&Fl;IQnE`wFFaUgok2B=O2%s=t#C-dn97f$>p4PkQ3;S2B5x% zY2azzO4p)FKoPkL^kzMSYpZU6`I|v}?T$FcHp`=!X@02sj%q%H>!Vft#We*5~R1;Gh}~!+XxI?Ycs?8sBe5-avM!!QRF+woK+Pc{pQW9G8y=u zFIw^pH?JcURrChdU_NSBJ=9WLXx+Dn_w)|o%^NbSTA6ExeZM*c(Y_2q(RISZHH|#a zS=k&4W<$z#5kQ|`EUFXbmPut!0BJs37oE!=sMKtCd*m2kUS+g7q}) z*y4NkSlo3WffL&`IDD?#&VB)9@Zdu`rjOW)Wi8eIej`xZaEJynEkU+!FiaxFftT1@ ztcVmDDbw>-nt)dBX>>MvI62|D^=C_5VSpwobf#_m0#|vY=u3*|Dp?Va3LoMzD`E+R z!Ankrwlq?wPk>EdsW-)d^4-KUOWIDN30o7OORf(PXj~7qRwcQCm;*9WdT#_P#^@H; zh3A-}s7_V#I~;#`1WphBK%%YSH`=1f6MS565|Oq;&XmZLZxGw_Xi0*DZNGA61FTmWc-+cBaWXJvcZ8lp|7=Xf)yD;t>%aoQMBQ2z(Z7|V)Z`=;$K13lj%r9olbzAKW_VKjJ> z6+OB0P@0o<(5BxXTi8-ONr_U@@y9W#*15kG`$qR7WPdAsgA(!x_9D+=vx1kgK^`<8 zH~A%QYT&7<@nV~0E5m~qIJ^6f31nDwaN*@l2%gvgh~h=p(1jZgd-InNbRQ|VNakn| zv7p-k1D8|ghEv773+Z3HuM-ELN3I|Yol^;*_rr^DS~5lC*dzLWs^G}7T@x$%swJ2S zgsU|IN1+gv+Qjcv8Co=psuCRe_rW^+YqrH<<#iQldrpUMi*BaB3cPf<34~uMAvbUf zzbKHjZ^k2B39CEhS6eJ2v=vBm&h6buwWoM+R1m!w3ic~8nF~f9XNiiFT6D(NNpk*3 zbL(YBf6hWE+QI5ij4IkmCOit>MQ$2q6K))HMfnlxqVOjHe9)zeYbliv|H3gcDz^nW zCO*)T6=!RE+P;o)ssClS1MpEtcYWDV}jIW{vCXpUwRNXLP)%E z{ik}QmUeSI@X0_%@!}dLu7$<`>0X{FN@EBks-*#%6<=5&K38p!Q>N8ypClnt<0$vX z#vuh0H#zqXi!+W6X5g5Sy=Hk=?Pi!hWT#L#*Wf*f!r6`|+9z%1K0!YmpvORb=Yi%( zRysv;gK${s_QQK#Rg~E4#xNLx&lK4Qog1t2b}V7Ja$?(>iEAW3yr*>XPcnsQ{DWSp z(Jmb=_#bmHtv!E?>i`Yw${v?^V@n4`dR969{FX^%*{wun;}B&w`@BM6u7gzf9W3#N zGU9VntYae7Cdulb1#u4%mRko;`Ne#8=5Jf@q%0?g#vHC*Cc#}thfiKCWK{)s7i^8n z`s!$-BjWoo2ML}OY^VnhN9(_hl8OE>S$ZQ2CsYFRl6R#b)I5XZSqP(LmILAD>fH4S z@B){kMzHH8zFm7KU~4iQ@@8kSt`|>I_Wcp!jOs>ZH70bdjwa`3#%2>UMyA{$NJDk@ z_#u$KrBh0f()UL=ke0Oes0E%g6G)WBkm4_D%gq|^H2Mp^n)TiqF?-_r&izm95X!x^ z!&^6F$Mu-WtSsXTYTCvIAyKba$25U6MTK-K)uM487pa2RYJ0i%PxHQ5JeyPtTq|f& zHvsf+Jr0Ml{^p82^6$R^g}>Nv@yim=H>L#YRucmmfEp{@x{v zGI?ncP|f`NZ6eUItp41Rzbr?E8f05omY#m7L`|^?r$)ZBj@3#87wp}0ZNG7XS3I}) z`=WA3$ZW$Jr$o?xW#r8ZAHTK^&$VzAoika+CG1O*4wP2bTs$bO7g|Kkle1hmw$x34 z!~ca*;WZxGI%y0DuDPeTE)xNZk zy^b(kwK>&-nYjS>Y5t5Mn{ZgIPlo3a?VhV+gN_}v+J6c_8>1e&=~D^FpKr6k;RI_< zm|$y3!Eb;gYbo>pG)1m8kVy3oQ-q7hx#dw8r9q(4ylQZNoIqN2FL)-ZPSUAOu9ZmB zS{dmDCrDlqV=k)`n#Z!HvZ#h`a(eG!tk^u-RTQ-%%448B+Sn zxSP4{lA#=?(ZSt}*NF$Nr9)VV#~av4^E#~NWMX>COzsog2IaG&u%{ssjlqtoiHjCR zidcr};4Qoz$HFkdY;|W4wnT2DC7=v>7e(64n^h_a z$o8FFBDVfu`2l6tD~SYC6PlP+3Jl7nBcW>|AJRm?IzmA}q>^!s<}C*T^wy zR}uks*0}CKDRv>|50vW2fINA`pIzF|^GfLSlY=8?)`~2vYovMyOBOIukd^K+z1#EX zVK0IbYbPU$@!-ZmWrp)eS!ZBzXW&TahxGQOigr#ubL{<9tVDOXwkEaInG)@Zbw*k|QXM{JAB=fY{}Akzi_pbs(Wel2X<^c%Kl}7RSmIAP zX`)~~Y4ox{halx?BdzD#S1;lnr{K zqQn*!7A=rv9>O34c+D{Q3Qv>_N5y<{m$+^MI{uO=xZ>&kNb8(|^b9m^R^_^3!19O( zkA8TrcctX8!0kTvXu0Q&KiD1)kL}`+IcJIsEJFDbHky$&>oI=4-4)LbMzcUzckZus zP3y2Yg=wN02nc}~MR{ebW@H}t07R8`L@Q785OJVW;5fEZ7Ac@ zfMS5X%uQPSe41lZL7jGh5oc>Ymc5|fJy`hnrg1x?DV64EYhs{+XveW3P$a_PgWh;eM1wC=JJb8k}Kt&B|j7|k0bCN2JfVf9$6u5g@ zWvgw;mr(!Kk3RmL zI3=4fL@2w>EYXD2ANq9+d^rKndTugCFzxa8_5;Qn?NOMp|w zJ5oYRDU=N}t+2iMz_$3z<<+2z$@n$H7&>HaHpZ8|Gui)7n=LN9DAAwzM1-4R+4>{zTrY9H`Evs4z+6pk z>F3qLpPF1W!A<0CV!G_@`}BXRoO#O^AfsA2Bp1_A#8-#!chvJ1VQJ~z_Di*DYxQIV zYbZ8jsRkIYKv$Zai_NwM2)ORUyT&$5rko2U=}8pMFr=rbfw>nj?kh?a2PdQxagFBt zNKl*h%6X4YaF29}E)0pw5D_`H(u}_wHIovH4jV1Y0GGoH>$NG&WU5Yl)tAMk+->%w zIVvHaj-c7Z&UcI%D6@Fk=(yRn(P~H$S`qYd_#;geLZ@So=q7NW6h@^X+xEvC`sDmg ze35#^=nI=F5)5uEhoMpkOJ7*H>}E7o7#KE_2-{*nH$d`_)Lz0Ek-@+v8k_T@BI& z0abQurI10Buegi$XBH-3MMD#F{o+FwSrHfdc}EvK)L#BZhcS!X8aQm8aad-4qYVG+ zCwNc3$*uOhnA%rU9YJR)8CBZ^|)l$O~nl@(uwfI)=}0Bb1`iG-5cg6g+A(n zwe$2bW3(ggDg3=r-b~QNhCC%lCJ#wHh~miAG6h<6dZnbm7i#R}nibG&qbU zcHZL93-}KBsm%9hoz?JfP1j0v2VK1)Y$_RD71wn1(Us920wsp#6VvR+5i>AeX!+lN zVdjZSX+lvy-Y4i4KCwPLU1LaLIj_4o2gPz31rnCHBDl(~e(YilA{krVK|!}9w4?6c z(@Tl=TYCR=4yk!Z$UU&K=R86e#g&s3RycpAYdrdX5Vv`){*)2Bgh^NkBT=Ku2O~%1 z1R;1DdrS1IYl@w6B~MN(>YbLTrP>ajGFm@yZ((^z(fi97zfs0H>r)NTJ($ut*lAL` z_7zA#kAE_)Jovpq#MR_{^4q!V)7+7;OadbF!G6O)qk?6SXzLrTq*2Zr=h?yAGL(H2 zfLTw0NhH3&RrG!6`$U`6MK)tExrFyr+0Q5ppiV?I`fEe;(I*s{um9^+47xa5xQ>Gb zejod!u-i&slfW-|J!N25fQ^G0um3x6IZxR)Q4Vl~(*cg5A3eI*6nWep$~fcpL zd;{YA`p@zmO;)A5=M0~XDxdC+^T6D14<0i^^}p};y&hU7>*2+;fAu_>#Y@}@pFjAo zDVt}fw&T@gb(tUXQdi4UT8&P_OX0NVnTsmjTX#=>-_UUk8i{|_f^g2wU-|P(auuq}43l=HlCN1L%edoQn!AYSX11HNA zOEpiDq^nuLmL$VQX2$~}eh~v`&p2D3@Re%)$_whoy-u4c8i8x_)vUDXCfYUD%*5;& zr`c4Jl&OO@16Q;r*O3S#odTzo+DILqQ8UUAvwltM$l7Wx%RrrU}2GD_&ID$&n@Y`x-BTIaKBdX_?`r}&K3*Bwf|mE>NDu&ehf{rJ)z z|CPUW62kHs^FuDs5_b6#%ywxc-^v{6EUGWO!L@(!uG`%mX!9A)BpDrZ z1yjf8=<}snVK?n)_{d}rW2p;)Yc~TFbxtR&zP~x*W3k=$#L6vwyo!8Z1o=|r@c!&y zUim#z!U%pKx}0>Ly?!Y8x=T8(6<*gX!~JC#hvfx!yQ>KQNB)J&2_aA|5avPP`-HU~ z0&=-jLC#hg`r^(bj@=cNrNiu>jv@h9u~>h%bryH1E?_XWJ&kY$BM1_MFwOWD#G=67uRSAnP=VhT4z-)aq4fV~J zY>W@vN%*W}Qer~twk|ms*tyCl+3+7(W&Bb(%pL^Hi&PROIn{0nMNxVd?qtCDjV%=z z+!gh;1S95m=`$Fzek%ZN&y+&W2igF9)2=K(tArJbL^|!z4CA+GaldrKYvE@~!^p-7 zmw{CbEA?{S8W3zP$n$(-R6B!UDj6RJKaSEynQtWjDO-kh2;nJ5xr_F?OgQxeSxxJ1zF145QE<^cN%thAw!L>zeyI?fw) z8XAJvAcF_xk~3tobHEjIF(3`s!*X!c!_rS_m95uM|9Yq7^Lz9f2^@X&NTG@B(_Oz_ zF1wo;s8fdfTXr5!-&KxJm88U+;9|#d_mf*{Rq&*A zjK`;Y9#hTHq1>hj!lEA;p4Og~D{KTSioVJW)X`jRzHCoC4D-;mxBbpWwmN(4#P31~ zwZm{kF}6?p$!Gg*x#Vr|?@y1i?@yVewRD;8gt|3U=It?rnn{d{BnZnS&w5g~pApep zFR;L^^xB*Br=4t>+DxJwx>njzx317d6N)CxWPgd_ysm&1yKyf=D+-E^M}BUH8}q^&ic`}ifBW2ZKX?- zl^W_1=|kAM*~g4TfziTV%~9Re2KYt`7>U z%tT} zhz{slvp^z<{B*hYs4A(0hb8rd|I?f*4CmHkQNpqpWo}U-Z$q07$CP#&H39Dx#tGV}DQ%5;3kE%@7OS;C(LT!9uFf2n-5A9cj5!{zw6`hG z$JJctSgPCb+{b{|xmAB*HhC60s1))!E@fgGnQblNlI49Ea^en$+j(avQh7)#y{b!9 z>Xc$+T~?AHpY6fRm$0W#u-&^W-#TqdCwWEdYU+ApzuB1LLms_NW|9X4BW7**yaGrc zyhD*n605UG3yhSgqaTf60c4?k)^2IkmQNl0P^ew&j64=Y(HyW5$@nzhJMkGQtzpZW zw0!(C0*ET#qdlxzHzw+}85_ySw7z07xs7w=)D#C3pg+K>^}b${2=Cq^E4X#f&}}wI zofk%R8SN`o5kUNC7{>fF6WW}i$y3uX7Bh_2>-%Hn77!6q2AT4;@i=RRK)y zXrU(hMAf>@H~~Do_3?AuZF4!x`FS2fcq z8p3s31rTVU z6f?oCsBApUD8`Te_CYC2grTy&%a%T^m7es49ju13IjcE_4#KiE;{j?+;m>*xuOWsv z`jX4oS_J9qy^D=>hIwtv>Y=gDJG2Zq=bSDi`s1snsms$&UTjo}dj;OQY_etUi_J|J z#8>yTiaN*`EU9n$~Ve8aoEYO->A&PN&vTXPa zuoV74`dxkOomU1I_W2UlqTF)2xs3P zy_|WtP$T9zN_XXt(B*T!N`xF<5WIb9hoJFR1C%TN1|LPdM6y(YD*@BQ=ceIJ&c9JU zDil7LRDydvvr|zxbK5d-2uGL+P`e8PS+Gm3X-(Lyu5K3TU-YfD1=xFJa#iKokgIn1$HQ_h8OUV8Y7wOFbW7(5|&(Ks_Ms zoIxTthdwFb{pGK!-{NOCq#KxfE1cJE$oTlkKSK~Nyq5D+8Xl!kw4fwmc->bQfz3Wg zU{zROs~&SNs#fHMnH=O2_3yq!k|mqe=uuSWAGS_@?AX@t+&7ETdTR(t;Tf@~$M}{W*esYujL&zkbarLh8MGh>gCf{orU|cB3U4j9DZ1js%y=Z)lfmp4&5g9^sxTz84 zA#z@$Z?*=CmoIgQ4h~mn%)CNfr)*-su+Pl}?6Z_{zS7-PQF=hu2$ZsoRp_n9 z>~WTo5+7s5WtFp^qT{YD{SVH{0{96THJYP@Hf?PWXncMNq&P4Imz-(GgPyM0Fly#FJY~z0t}Bi_cD+= ztM1X9-fCkLP*pi%v;sv-k!mx{QAR~Boh+Ch#08i*xl`!V?u~&th<*QwTIrLxvD(e* z2CL^G4ZR0tA^-YRl>EE!>hPqoppKb}e$(#e*oZ*A$w|~=c|D4weg}Ij4?B2#DgQ)G z_M-j&fwY!Lv2ujYn7R_j(59K~yTY^bGnKI3E2MRrFDy2PBX{`v*5OMvuz@1QU z**8n=R33eZfe2!i3Zb~3x$3x6@&*Q!Ou)?gq3#T*C3+@II50T( zRibt>8cXvDgkiBx6+MUwo`-P39-fDwY&Z=A$R;=)F;9Xe@8r3HNw(^G*xmw~YiHQr zX7|<=@pskO1T!y4LXpq1eo}vnJkxWiWcA=$J;25jb^1JA#2 zlWI5Nai#!nO*Ad8lNE{?SAaK#Xho!5lJmr{7!^*{gq(q+v}3R7F-tQYWb(jv zt%jdz2U-`rw?Dc=__)zjT|mW2d*q%+#HnbEop@<|Nei6tbBSc>HlrW+EHNg{)8GcB0$r7D1Fh5 zuZDoDgA>a?W!ik={dVo#1CQ@GmYSNO0%`IqGuPbd$vQZDNF|CdI>$U>56buCw?0L@ zndeOM^!X*|2|4$#VlEu`Ei*}}MK!@pjv>K{$EIjavXN_Ah}qwo zT$|Z=WO0L-5hm8y*wE%vqJl&lESQnm{b+(24=#zaF@{4dJIMaDxc^!c?W7Gt=0-~i z{8~~3|8p#X)+tJXZQ)54En#F?u#V2lM3P4y2r=nLI-Qn{cT5>u*Zj4TDY&IsBCJ@2o zyTv77u|=@5h20-1P81u_8qrk0I1rDf-ukh^r3RM8N>*7cpQrCU7u|^rZ)prOs!NKQt z_l>0B^)=;&nIOj!eFcpAwF! z{!IQpY`xf=i6JJ~zf#3?KC@TvUh0iJNCs-A)Ts>1pG}1qtuSMOuOJJy{Q^y2O8AEb zTC+M|w)02H?-6*9%(Cx^kcs7wTJ5igP&RzC)klCil`58nN;TKoYM~)hSEcb&I^>6M zc+$9Zy%z+X9es`QEjUF#04|eZE*!QYizrcRUgO@QAr{MFTc}wpnOssqEfixSe0SwD z+n__Cv>7su^jY}~4nXnm%{W%>P`sUE*&k6weM7aqwTUw^)cG-5BunD#f}SSevb~&4 z#S#ppPhU;@nX@hOCo2fwde2?F`Y&AGW)a#N(Eb=P;y0#RB_Pe&x3-BQbte<^FrkTi zN`{J+-^==t!JDEOwh)Xkvzw%NHm-lMytbDNoKj^gcYwP3ox63|Y#frio#4&lP4V~* zVLp2p5=)eVz|&}1b0;Q@PdS-Zf)Re+LRk<1pfIASbY5Q+e@1XYG1y4ry(}o{pt@!* zO`aou&k`La6xvaG`C#|!(0K}tW8l|1HX7|OK-b|A%)-(!_EhYbx&4xw9RD4qE+%B; zf+X z6UWS=U4ZBl`T4P~t&Jg?<}tUKZ`7`_@PeBWk2?Bnp;<#lZ0#eozmh8)2!J-uanv9;Fe#wBHahNdjJ8f*PDr0~O zqGf%7JZf`bA=HD%4tiQfEJD3|yc3DJxFseI0x!41kqmRf6b8(SL>9hisw$%ZvH_py z(8SBrIb@xDuKxqBu}Gv1WM<%BP%_HT_y_IrU>V`&TNk!8vMsfqQ=FE{Ws2oDMR25*Q&>N6`o2;FZ`*A{l1-T8fEgldep}iLziuH3S*J|cnpfD6r+vf^Avw6crvH99=q| zY^z+{>qm1cJD~W4i-Q6+W92eck#u2zE(>SJ@*kJ%HroHx1gV*el&SyI5P+M#fk!BE z?fnN=g_$rDsiVzJL|#>4s3+*mdLZ>XbmluB? zYIF2q=Q}`YMRgu(pyHtafZ4$#u~|CQirx{n=BV1-EbQa0S^WNJi2dLPr%4{3T3)(g zzgK=WrEdi3=6`WnJm%aen%s%)GPj}cm&4Q=!1H1E4JmP5?k_L0zkGKGIY?}9sUbWG z1`zn?Xd>Zle*E7s>26g#;4DmEd^b7uX~7(PxiH5a$Hs?nZc(9H9hjusUfBPI1BGKz zQ}hoNf-1qWgIEvcg2ZZ4VJP8JUXTdmDaqX&NSUh(**^L^zO9Vt%fgc${hyJ0;kgN#~d@3)gW?C7rVu)oOTbr>n%8 zR^r$eq;nzqVOq51_3N?4mLsE{^zZ#??h<+EUF~aK<{KJ&t^VvpCkJxs%>O?p{r`fK z>Yl5PDU4Kl6rZbfvWvUqVHG$fbdtVJL%twa>>0ksyNqwCDqbdz`t4$>&S23jl`iHb zQKm^`9d#iMn>XU>Mc( zfEUlfN&MgxrB#N}U5*0dwXH@U?#{Bhr7%N5RU3oFMAIV9o*uW{#PnUo#rHG=*`-4v zRg$eadzJa5k^Lxm_d*R;)yA_RtSTm7Z0&SGq2a>)MC4*SDO?h@z5G1h$O}7Ydi}sQ z?qcj&fC#Lo(Uf@&KN5BFeQ;OrQDl4LHI*D!c*U+1;3Wm`NeP(nnUn0oIw92vh*vZI z9F<@=$LkB*TiSMK2Qj1TcRK>HDPQ4z&q=d(U@~_y?vl&Tz zV(A|>Y~2O;=aawa92^(ke}uP`;dg|$&>rfsIn^awC7EAVF-lbJo~Ul0(EO9(#SwS+ zOY#3R)qM7Nu^OK#OYy`=`A0SX`L~Pt@V^*!_E*d0iNW=6)L*;DyZG-e`~MTwtRJ4S zDH+m3j<>uw5g(k{I~wYgId9OJboD>L4Ts78o-vgLXKsF0TM||oL))0e<*B9T>a7p@ zI>S7a0xsJBC^y&cDK0~iIt%vIQf9h4gbmk#G2|W2N(X>(jdD;n$0RfCn3^5D@|zu= z9_2k^u12oX_$F4oo}b8xzR%ite^k&js2lm7Y~uyJ&ag{oO~rc1XDv(Bdt0WSpFP)3 zz0sV9RxtmlfE7V}Vja9dAl7$#Luaykj=vdEv%$|k3$tSEKf!ZrI0{`_v4k^7n}X55 zIGdcTMa;(7PLWUH2P}TvG|s{R(EWEd%x2bP2gG&%&k`Htkmyh^xl_jPk9mHFy+cr) z2=7koYr$Ir)f>nlq@-U*X6tzVi~6*myOPb?pNY*M`niR2%>fEa=5N=CmCjW1ucDO)Z&Y4j2xAbr6TxSpi7+hC)0FSsE!a1spp&>7@h7~$tpNgPp>wdL!N@tUi ze9tK0fU}l z9CIy^scK(nb0v#NF%Ih(AN~S|pZB_$ftNDTU%k*kWZ-WEDY(EuUcL`?;Tiv5=JRn%C4`etSW1j?f2DCa1uf4YY@`qac zz%Y!#|GtH0=CS_*ZlB%HJ{3DPGDutLhiBi48BjUg5&t^d9dcvtm@wV&{a6m+ zUT*K@4nk8`6dTx&9ZsMrQDOxEBJB7jvbo^2g1Bz(V_8k^F}nTaxI@L)&Sv=uD5;Z19w*3+Je$iYo-mp-akJUi}k519#+&*w21_} zD5@*l9|URNHZpMd7$t=GlwJMOQPGQZZ&K02_|(1Pgp6-_jLMawhlLEUsO0cEX0Ig) zDcib=QQ2y%8mR}2UJ@74Btw^`)dI4!h2AN{acl=tJ*t40R(WNb*8>Wf#&0BDtoXGcekq@U4_M zn~a<=#5(?9KIE^Z0GX}uP0I>BiGKPeg3#`cq(nR?Z-}>88pHDx^#VQaw~?S z_x5|#R{OeV<5@A-xSMRSo54ge{*ZxZY?gWEksZXxzEsB$zCrklV*5^6B33}~NNJAA zvu1#P)`sg&A_IpyccY{j@=c82h1zUe*kZQbYMroRX8lL!dGY|@5ia+^y#KU>R2yC9 zj#=hjZ@*Ta-qcCSuu%?YtGgJVG?8oY8E4*_g6HT zj1e`R=)BCp5f%{ma+T{8~g2iWa8cYM_#=}P+#YEpVFr&ev=rc7Jj_U zNXqq5Sciz!W%#*IvLmd37;EsB@T*>Ibdg`V*Np$o6$`&YAWt@(E$i)Q-;8gfNe9Dl zn&)=Mc83&By69}$UCTXZg1>MJ6h+hzo=hSMlK4Y5D-(XwS*lXpdG=u*(b6ZfZ+3tE za+3CI3*TX0nZu07y4T(PbJNMoE%SholUTo}Uql#XRJ#{KoyTe6Ley!Bd<2R-mJd@8J3lxOUMgK~dWeJLz9< z9<&mA@y9iZ#S$RixE^6#8gUbqam9JLxk`Px;gvAa%|IS}ar(Z6HTP=3m z5x4(|MbPztLD7&Q%k#dJl%ah)?x+x+xf3UA5WCwtcK8DiUVh5G=ev+GW>>hID9-#oino2THk z2>L7=^VUadjaA|j$1%(buefP_5@deYCA8JgoRCKe8*8@bdjwl~a`fC=0;n6S)weM~8$vhLrN1LuQCizVbY|5mLiAEB)Ltr zNe;Gzr%~s(tzw^K)~lG}_lU>krBE3`89wTB6@*)I=Jed}fJUqh)0bF;v?Er>)@fb^?~^G#}}QX;+PjX7*TEmPwNj&P)VJZTMOc*XPjS z+-sbQu?1h|!li2b46f#o`nZ0}kU-E{Qam^B%BJb?KKX%dZ6uht)+nRN^L7&u-M>pp z^5BN6&Ax}FG?45xAw;Fv8~@EJmi}ixiUW6@vyoNu_gKoH_t4sd8B8Q~1SS~k8U8xn zPFa04jEPgXkwx>@-6kNp@wbz#9yX6X>$y;Ci|jYw3^e>1l-zdRTEOZ2-p@_}?IVx^ zge6lI3H6m=?7+!@xBJYMex&$#w7|!i?W5gQT18+T@0R+B{j*!=3N626cFBnFOmNCm9 z4fgV!6}#C*0bZ{yLo9BSBjbS&5Lh% z*-Mr+>uPWcHewLn&xm1XDJB3Tc(a8a|19+Bg>+TLM| z^?^D6Ai08wm`P-JwdtI@sT|0!2g=Oe*2#f*_W=m|b@{leKW_BIxaazxwCxD)tB(m4;aba4)CiHz9uT*dH(HWuseGO-VM$^+#qttJ6@2336RbcNT{@ zf4&oDB1ZS`*312Ap5y+FM%6Qu>){3E2X^%fHX8$%_Gj*|+Q8Sq)p>9lAxw$r(a8fq z`@DyRVvEy!@B7Qz{M^e1r$&a6XnoECU#^dq+-#$oQ+i`#(~0`)HRv*D?(ypH9qAmu zbyI!MS8tiS6h9cP;;#<&?q8eS+~0u8rY>i{3?1wcI{`VKl$` z#fgSn05QouHPFx5L(Bb$QLE5e+W4Mtpgf-<6wDYFTiFh*Xapo-FL}7!;fw^9ec>{m z_89aI3x>$#EkD7i-r{5j#juVIxOeqbtov?5g2@K^{6!X_FwQq+26kRZ20N#aiq&bKOmgS-?JZFlowSw$Frx2dp+6+r}9);zIg0{{`2_RJ8Z2;IG zUL8nGU1m+#UrQ^zB_VGlqFW0xwOo0N^`-XIJyF|G@d`G(w}f}ov>2=@D{;;nd+L{M zt_-Vex(4~935=$UL+aU{1PPtle9IBp2LGnuw*Sq_{hL9nD?bJs$b>vzx;3K^ib=$8 z>HRIf5g^^bN&nT67Tr-3w3S}+F#X#!I5pGMBwf3N$BejJmPzW(7HmrSvQ0iB$J{^TlP@=$) z7Gr{l)^_dY?;S1rD7B|EH#{8+>6#l8&)m~&NagVGHefgwB&rYM92h4d`Q81VihH;l zVIhi9E(=`q1QrC6-n7&87bP$-*oMFV@$+T!Z+5Ytdh35HwfMg#|II4SjEY_3f)`hj z#FhF^O%_!UgB~ZYENL5)?sj(xCpn^7MX=`1nze8mQUHyb2Nv`4?1UX`_WOqGG%{?6iuKK3sWmk>sgYi64t1A2=#p#8ZB~gr zgPBK8)BY=#?qb+OTk#UrOU0jec8ph=w;L~nI;U2x91oT5L1V`kmQYiN=8~D$NubWQ zq{q9=x2feDpm(rG)}u>jKSM|2+h_2{9j4C5eVyS{Us1Fi#kmxIVjklH6~lCFgq&${#cDB~V( z*<6E|^xXB^k9%jLdg&%g2$!UfQ=-Dx8j?c=2z zInCfZ>@)4E|M)4*d**&*H*PKsI=k1@joYj{^Al=3fnYchpY76@m3evy3fi4aj=51ycV&8rEB!-O-WP%dAn0-Rq zi(L+G+z(|vH;V`fRX_Te;QtjxW9{?wH$H(ba~*!rFC618qDG&aI=RjWxDE`zzPCPe zbMv{=x9vrkW5l7LqxJ54dJ(;|J1c#2!SUOiDsjP#{JJvY&%})-S0-=o<>+a=Wk3F* zV#zMW!OJ!CBd7DGJ;osb(Q@pK6vB}6`?@dIl2`2Q(TlBKv5$Y_mDb@CQme<0th401 zsq>~g_T$i#&m)Zyzrs&-*X#SjVg&*`>I;(B8e^tO{4rO}?fB&ZIQY*at=lVa-|ZHC za>l7|bd&df_By}DMp`^3tN&^kr$&uk5z98Y7MWkrPu1Z+{F6X z*sq78$x?$U6kHqx$g^yuxG|M2p=Twi1)pPuI3UurOo841ny++H?_Oj(#f0@pg z8oY$uR~3TLX~n7g$!I-ijHhkzuCNMvp0@SrSUS2*3o5&UiOk3*rbdEu3 z)^pw3XQB2JiHwF>aWq(L{o(sNorU3ts_TB@ksikf72SLF?QA9+l zqN374dI^ev3W7*gnn)9o-b)e{6&oN*ks1^!(tC%93ZaJ{dZ-2nB$R|e+P>ku?>Xmv zzx%)U|M}f}*IjolH>}w^JI}P=JoC)#$)1^5V;m_onDi#B_Us7aB;}cNZKyQ;3$>n> zMjhZAY&q3e+_(A}O5muSl%pOU-kfh<*LOt$t6>uTF)Y>ZpeW&olpqaenkHC(vT3W&mDL(e#(cw9a_TdTL?E< z^xCi5`olL{a{C3YFvqj|wzaz8YL3@WHRkhBZLS)ryQmzg5#`s^b74IKrRd@m)Be?* zNpih*@wdtaG!bSnk5?60#8HPc;O#ZD zd7saKDZL`f@clM7f?cBwggK(&`6;Ha*z+XtO-qx6nbg>5P(nb}cjgfJ1V1Wikv{QP za}_on-1#QSrUg3nYLc?-EfkEY0?DFYH}Huuo&?d;+o3-ZeKAQ9j&R%T^0JS?oOa~p zhmji%8Sz}bh;uwBmz`2T4I%=|?i?7+v}1ml;l|bCiBUYET3r5xFWnM>gjCz89~}n; z(mkUSSL?Sh@06Uoe6!GfH29|ZJyS^FP7XcOu9jqe$XMC<+)}u@#EvO)NuNNy7!De7 zSrw@OdP!9mKnUOHM3N;0DUbAOF`_4o!a5k%z?7~Epde1s4*8f5m<`-;~?^vP|!`CnE3pEmIymQl7r`p3;HK>*7FT26VGtf46C2pWCptADhlw7#(V)cb&h89zmXb%L;K_wdfoF}gG*fLL;^r|Zz8_uI@+jA*k~9R|yZe&@xP>M7)32&hE&o20c=W6C9H1l@^4BN(HW}Q6y*x zAak?qM%a{PqA)Fna{YE~@f}iO$8zPTyJxE3aIE%!eyAGrtlXIDH$RhxIS%Eof3H^4WoQP`ZgwCKq63WAjDanu&vSw&W0=j zli|;*%Ot+XPCYZCt3orUC%=N@!!Ea`i}~*>UiyFv#=V^zD)fu7YKOZQzcDQku~$rMYB zG+Kv6C!vMveAgy*2sesuqkOUA*cU0 zbznzJ4?MYh{CVG^*4S9GK*X||saUm*U&r}kF|UP~=T*~(&Avze%x zP7bvEqG8fWg)65&<$ikcCQ1r=W`U*;hHPY)uD!Up4ega1HB!}{jVTpPqDSi2S8CQj&6Nu@JFADMUe@<6FT|yp1p|PGB`eJ0aXTFQ}yvI zq|^&{6$U_ynQMuQ_&cJ-!n6qY$El%25`{&TxQtJ~Yt%?)gB_e7D2KZ@hlg%)<SKaiB2 znT<&D#&RFGD`iBM_YKtrG^wpB%Mpq6pme{)Wcini~@$XvxU;DKC zL=5s8xGAVBVPP@s`B2jK`0=;e;Ww^dxL|TU(ka8V{_UIF3c8;<*fLDB4fT}YnXq5W z6&i<=!i_(dSH7h65H~3p%==I0j56eruH~ajeF)a>U~oVf#kQfbfhsx0wGXD13WH93 z9%IVYS?9~Dpe_CU$BjkGan>nKzeho6!Ca7_ZGvj%#_K>U zwy5~JDr~aeLhihKBthH-uIsj-3V zBFav)6ZD1t%I>ncu{h2BwzR{tPb5t%Z8@U5d7dvFgXzrDTSVd-Q4{U28U7l zK_rMVDGR!_K=ijK=b-URO#~#_bNAL5BptWc17uHn5|G}6+dBto!mZ<1?W|%b$@SG+ zF%-oFFmwWFF2cuz*#k8s;=i5{ARL(H?wQ{szMZ5&Rld@Sbe@GBn*QUz;^h#Pi+`J~ ze#c&ZdKGqv`fQaf^T$;|sXgG4&YTXc^)Ml!A+C=wphktSo9HS2y8s*hPzmrlXx|9X zuFkRo{7hrsf)aX|DDY6%M>H5ijE%{Cj#k&r2*THl6foTD& zWuE&8!2a!Od%n;^b|LO1f2h;+TVSBwNzg7@_5G!NoI5!($5S6K`0}s9 z)I`s*ytDxdxVYN1Pm!SHJ#FO=t+F{&$C>@<&$$j zBbWCbd#xKsQKP#Z+s4H6ly2z4Lp39)IS(Hj>gCQj7f*5%#f z|C&AdcVGV)ZxcL!=$X(99v@N8A1_t7*=DZ@w%IK$YoY30uW2KZbgSYA4_xcrxR0>+ zMx-YuHs6&!erR9BpQmXMl}yAgV306q_^cW!4>RkRRlwxDO=<>AmUdpz6~X~JZDAnC z_>ZsU!*@0o&`9YfFl9>}U!v^HN}%ZL4N@x7^r9_$q6s-LKKngt6}^*Y zYqn7^&uV+3(JrgA$aS?LOw0QLCO;IrBC_C)4ydj03KLG|3fY@SFAi}gMpIxQD4i6x zDAiBfUY{d120yRMl{t7ttxT1)ZBwNJ ztgH1|pReu9k{ND0e^lIfo9&1?m2G(h7b({o|c+JyjJ8zMlXnp`M$5+!rU(_Ir5pnZb^mrOr zX!dK>h$danT9lDR$nye%$=K`5n;(smq}QsYC01i=?VO=bgP2CDp_hcUO^ei4j*xpj zexAc=%Mu!i?dCz&W@Lo*t+h^gaEVq{m`X9IQ*1HP3K?!rI zHZ37;6LyY2&B+5BUNZw1G!JJU{968P^Wg|=$R7#rG47Add~=_RpqM^c36JJa-!fy%*@E*fdrhB+3n~sbb>Sf;lMIk#+=W_PopsW7D34A!S%|^84M?%TM(s+$LXG`-kKeG(w*{=r-_&w$5oT!@Yl9*I?aUg!7+?kHy$GJ78kzR%25(!T*R76A#MnTxt6KLmL|cN6Q{kf636A8L=ZG-fz52T={wTzB<4}mHf&n+x|Ye& z4L=0TTX_mr&}r4Iwq5-@GTUmaz+wkd!3m?@p0DP5S+(s}T2vbWAFgi+iBH6#g81|0 z^Ren1E}Mr8TdS zj07~JdSbywun31!4Zr4+UyN1-B(E5>AcwO_i9GhGZFIixbn=P6u_%(HM4t+Z|*=>Vh%w(&&=I7 zXPeT$$eDxLK4(vP=I0r12{v;*8*Jx@CA^o^Tctg#LhSICeD5o);oQh4R7%XfI;hdy z0fXtXVWE(N)&6D2X8=>A5QF|Qz%I@_Z1epEcY7>T|IB>`=? zIS?6PY_Zg!xl?mz)PA$46%e9iiopY&si2v~z}g-od&^cJtvs4Hj|lgjx^4IfJLaVx z&An3s>yayWEmQTju#4BPglHvM+cV^AjEt*INkaTEUWGr~!UpJ9%;Ff{q~=|9ll7c1 zz6mw*b$_5U)Y#^zyPXQta9m6-OP~fb_RhV~y5h2NHXG*XnWHC+SG=>Li}&6;*5r8_ za%>G;(8P)GS`3X>IKJNZfy2XK?%-nnT%dVt58c+T-mSu@j%#Y6#!~3gR=rpSDL5J% zm%p?p_U8k1hyM@air_(?gHh#bY?*MRu4XSs=$YYXXrG<)I*#i@x0x$-TNvZQK1mft z9U-^$X;L300uG(yGO*#IFy^cd92U=-xL`N(u?%ikyi&aGGp6ZrL^Fi(6Yj=#U`xI; z_2sw??SpUItF(*El`w>eW^~GWnB{T}c~Y*QLSao)*PN_g*a#LJ!}54j)V;K|$SHAc zAC~r+*$hV0B!qQJ-|y4BfKO`A5B~tyU%M`3T%*&mz+!2;lfWAsEhk-`gs;rtQnlBG z^_G5_?tEbXIZWDeYoMZFrTA6wfGr3%cKXWI_8e-pB?6fpoRQ-9qOd>6Hc%4w&6=XXKDF3sNx9c;o z$8C`l?!u$1*WLuYZIW=#F|^G;g6|oAf@k)+WEX=e!KrKN-}+b%N@ZFKTq!O+Hmt5e zIz|Y2QZ4FrEatQkPEG(*@j_D#oplpuF~`fC9stYKs6dEnoXw}gmlX{1LwIz))Et-L z+qsyKDd>wh@1|KvzaSId6K(g_w$r56s5ec{CtAOjJt`|m>w9h3Lj24@4ZS?#=4Mn+ zvjrXITPEM=IXd;w3mAzS$w7pddQ^F(RP7O;^|`lFxcX_}btld@?XEL)W!c%K6yS|n zR5~EbmisXD9nA02lzmx4{_zqVSAVc_>F`Q*<^`NNI0{#ItLV%ozeHmVT&IYqfC?YC z$Ly~jgF&v@&`h>akWzOjbzjIAq?mm*@W6`=awWukf$M9LT^>38t|E|`?)|2YZQ&Tj zy%rbgRS8o2EI8CzL~GYUa8}mhf=1ifphZ+zCsqqIU=WC0P`gw`-vsNbRk!un=X(lD zg!Rz_fbW_s#hdWu3EzzJ6p~N(`=+jPTP-c1)2R=9T%vKCid;AmZrJdQI6F<0-2&?6 zsPx?~D(=}sTJ31zrBuRx%<2g`%V=S|6V$)t5Rm#oB z+bA5Q+qxvv-56k}Snjy3=sWU4TF=k13;mGNNaqa7Zjh$MDEM@N!Zk5Yyg7F(ZMc;9NEhUprGiFJijqot$@_@6F1=x9uRQn>mFn{9~ z?OgT9()Z4psr?pov~$PS9W%j?*ryjKDI$0WsMDuHXL+`%cQgsl_1jy>pU~~g#KgLo zJuow$r$wezC<L z=AVt+?(@VNY36WP-zbF;+YI3W3bq={5&dYl!*{(5w?dw31$ce=j&`&0dAVY+84d>6 z@l5?(6y@}G)4%}LZhg|~`j?erxZ}4bv8~Z1t!hc+1FyBhji4~%&~vgdcjU0ZWLcyk zg>^?W-@|fod817}!2a`AQ~{teQk<}`1bg6>4yqp$D07ESbzUKFqtT@wx1b&k&uO$E zwm~hzcg_{Dq73kt@y=r?VzsVX!HV(tM`LvjpaAeoqlP4=;64t5Q<%q6n%rN4A>=o> z(xLFm8}FXu#Z~xq%=qX<9}B!Ba;+`X$xphr-ZXAMH&2@Xg2$UA5ox~STck#u4F*~$ zj(O*wYIeH@8AN#16)JsYGfOjf!ZLiI9pa;D|FMZFB(Ld4{lq$Ebd=Qb5{pg?Rp^S zLaR_n5bIo;C}BJV49Oh?mR7H>7SnA>$?q{QX+)b-tCpQzQ??761s!y%v3irdxOUUZ zoHoQ?U!aGoR+mrB!-OqN20ZSdFDo;9$i3!WOfs=W-?U5s&8RKlp?VYCOgmKnwZ% z5%&{g%Ypy(gYk%){L%v}%e~k3-(D$s0aDs_)OdJxwA5)kneCAO+u71iol}))iLAI= z*U#@dG!%(MqGPe{*Po#y%7haQDMyy}n8i zX^SdNPwLjaExh6QuwzrwIvZw|dRyRXy;&0@I?k$;9bk2JbuIb@I5?YxFcbq{N)c`7 zXDpYcPffQF>Qrt>jI|?ywcfk+r`MH9VFb4q=`gpSz=}FJ-SGN$$%@tLS%g`~O_Bo5 zY)Y({fX)?i1&Y?Li--*GJmeG=cAlq+<27FmZ-bt7fACtu?07y}Ep^z!uA~qe!xogptqa>G2li>(zXjt32#(-1T zlG2h>lIM>4V)0l9kX2^V#FF4a2@4}BuAZiSrLem7We5K}3b<;tp58dsZP#>0bD3KF zM@gldCXQjc{qfE+JHv5U(Zmu5ut0Z{JDD_SU%3@h2`W$>Om2VJ9U9dSfIY!682?44AEscnOt}48A)xp(NMy}5<%d9YiXA$obw~} z4Cz{8BQ8rGmWfMz=#@!F-VvyB0X4Z_+_G$#Ku9f$6>Jvn2U*ChBs$sw)h9_Oxx@Ga zx+*&=%(F)~PmERrJeN}YXt994vz9)X4r&4Tp3yJ9nFREIDqV>g2Y(Ct4KHR$(r45e{R%f3CUhT&`)=4p@U~fF^G5zbOtiLWq`g{a2 zO?YFBYG-8-30`MR^0Gzw2_pQGvk}OZ<1|UqU}M0s&N2-%rPEZ?hshm zP0_4`4k^RwQ8@c5Y?y^A7Pb(Y2Bx%*!t3k?Xq|pdczXba34x4(P%8k~c{~({!jD(c z$Xz51oCYr@3!_N+B<-T1AWEw45KIW={#T;Nq}^?1{&UB+Ht4`kLCvkP3yfjR!@hsx z&F^Cb!2F*JugM zHuMcN4!mAc2|e=lsbTBJNxxXZgh#$NOX%gb ztOEh`nmG@M@uMIc*U6~0$O0KnyJ(xeOafvNOw#lRS9M*@K$11|HL2{F6DB3%Ffh5H z8^51_YDkHrVD9imW~(0ErI%3k?SOH=65`TMI9P16ZUOe5Ry&FSe`o*F$ z;H#d}a}MzBHm#l#^0PQiqnX@$#FTxkcjuzTBZ!_&2Q!f6XH56Qz$s`RHD|V4n{q0Q zohz8Os+Ju*#xEaKzV?W%CR=yU!WVm!zH;>jj+~jrdS55QJaOh+93#&+Y1EUBzx(7!px-@r6P~|Cepe1@5VjH_>&)~)wSaChYFaNcQLixh&r$-z7#IW zb1kDmt)a>NCX>Pu4gwP?*!qXU^P@Zh*ZlSuDa=dvDJ`RalAg}?^YXapaLVy@Hmc1Q zuhaC$_+9ko+Ju=7WUQfDvG=gY_NK71KC(9prav2ayPNU4g3yOIJ}Q373@UIlSX|{r zj9fevT#+u!B=``FR%$)gZFP40(TS@}b=6Mv+d@q+I4%5CEqG>QZ1_t9a94tMR%poB z$+(z`En|yn&r4-%5fV0GN_e{MQ^56;k%8k0NQ)|o++|-s>&%pa^b52=-@a$_d2A!F z{*I}oV^2PFC)8wDLPR*)*I1~D5_PqEr4cR`z8-IzzTHGx89YB6clYXD;QjfSueyOj zGcz)4pSip?!}jbf3)>O>!f0TL9*!DNRKST*J~@9e$%a-xZm~&~xXlb*o)B=z{?}}% z`vwMWlyPdh_w;M%#xje{%$9fjkl$B50x9;+#_8uVjwE8~n;$O<37)r%=%&*jd< zd==iF)3@C6@Q;DOECOgC9-39N=h8s0zdat9yk*hOmy)j1?abl|(m+t=w`3}G^MYKL zKDbv}C)`tVF?x6YBA@0D&Rrf4CA~M z2rJa|VaFe*m^X=3AO7Y>zpirM#i5&m4Yw)uj#d9x4?io;ubAFF+CJNy^I)wlr3DNJ zOeZFo2vWM?-u}FvET=C@o}(aAQkb?s7#~ZkPcn|)Ft-Yy#C|LSv1{|Ck;&8`&fsCn zGK%-TR&D!5NByOF?3Od z@AhU=b~59s&+6pi4BIY5-a*rZufkyezPuBs69!79V#{>*8(Q(*>O@iC;@8k~-_}c^ z_CVv$OJ9Xr?;?3;>4u!NOCz`1POgsD^DpmXfd8iJw@5Y$Fq~_m$L;$X9%BkzBR`L2 znRyv8TfL(>^GOx$w%FO_WhEl#KUN4dE=NiAD4dT3QsIX#f87B&l*2PmQASf6xh@8}_lJs3b2S&(v-i(@YIA84??f!wUg1u9Zpo6^D zd<2_X>t_VhrWn3F_}YNLu*;&*tnAg?AmEWY$+{W%}xyE~#yU`%EPS zba||``{4%cP4>I%&*N0_K3Vz~tq`zjbY_47b7(sE<^r-e`l?u*s-%cdozk~vOQ9e2 z?sA6Obz-%!e&`{BO=(@}Cd+gdcQ4x&gF-bhiA`I#%lkl&U&|t+DoiirthgF$ zhV6ZC?qK~*yZKR_C3_I=?X5wD@OvpbZRbmwOD4{3F-q**Y!UGazl~j0!YedWiLcJ1 zILk?%iKW41Q0m!4vf7&FJ_ zh~%!y+(l2Rc-cK6wMWwbK zOCnpzV~>o#mh+AYyLY_(cDKII>_ubfenykZdU2Rvj1n9bw8q39=L0&*F;NR@=whWR`es=T5-HhlDe)6B(o5iQfEJjYb)7mQi2w6ru zR92wumMrmU&ae$p6Hgv^HL;h-pqo1-MytyF0iQ8B_Vz#w)Q0y_ zb1K47E=FW~k2unb=|E^p<##mu&R6>vP(dZRw@9=$WzRX;3oTSGsO7}vD(<_&CzWuc zXEJsY9SpTNa!po@pfq~*oQMcW#NcVP@pYmplXokD!{~b{(^)}IY`(G6+!2;74ZeEV zy*r|g1eQ(X%9Xx8Q5GvdZ$cY1lX*nW<-Vt_iO_>rFHW2pD|hF7l96{#HExr2^CTKd zAHs2t6iO|Hj{ZCg?g)jrM6aDqjr{QmVz6g%?1Ez1zK*9~l5~Dtx%R~5@&^bzmI1JW zE)*8%!4iGbZo@^frhy}&Mic4#N%mc}|26H`O(t>zvWH$m1p;D{P91gI<^Z?^0+N?j z#($PRV~?wk4!qJU?r@iP1r_Og0FL3{4p+1i-l2rqRon^Z zt|}-$JsxtHm0KJtnvug!H@V}dMf)Z)&DEi{;-f+t{<1F4FNs&O0;1{yS?&sSsg95J zt>?TtxPRbO)JyEGALWAO1FOd`2jZ|4k+f%0_3QT~?rWUZy8A9-U&_~0xNIes3Vs~> zm!2lveZyle%&!$b%Py6Ao%tkhb9D*c1k``b)biarsFJy`Arud+dqvEa+X_OYaJudDi|xkZmb%_L898&YojOx+8|aqcBio3`Ag=19Wtr zgD9NhETnRJ->q}SQc_ct0s&!a>Zr!Fu$<4#$wwhmG=>qHmPdJU)=_6W9uI#)=c)N| zhWl_0x+<+O4-B0P(1`vaJ1fY|zQ*VSIjV`Pl@w%o?YYb0J@5m?e_YeyUQo*YAEiui zA!Hpt&8)aZa@uW?QB7FqRx9`RyCB;wazi(q_aPo&X~H}eL3mTNc^=2bXDcj;H@0(@ zCExTgjP>Q5!C-;#ps|V5-q%{W0xI0^#MHubl{lt?{#ea1dZRGj7 z-H&}Z)0?@ykMm^j>PM4})BzLCqBd?n?d8P*P5vob%f)m*JP(i3P50eL?7}0*MoWud?}XBAm8bTR zFNaM{>~-_J%Aqa^!MR4H;BuO&yiAiHgYwfkiKH70&G1DioV*eIUZgtcU8KT28x2P; z$!lL>X-7^!_RO~RCB~#h&CX!4psCT4C;L7hcQMycHrEkKXZ^9_qF$GDP%P9gXJ+`k z$@Y5|#WZY8CyZ~Ak4&d{HK=PGx_D?NA_5TH+M_Odaj1;DOys;ob(5M z!>g`zO3f!w1Fk6|6?s6jSmlUccH}iClq_M5g@iuHy63UBC^!56{nHx!5x{m4%6{?5 zV3`yX)1I?`kG@n&{Ex>}{`223MqkD>4ID2W-FLTia(KAMGsUB-ggcJf9ku_!fjjp< z4&8A}Qd%WjmNncJWqJgWpu`d-b5QYAeYtCBo+Vx`UiB@DZ-m4OyDs z*!WbpZ+Ro8ynVi*j&pef4F%IIZP@~L5Hp>fegRU03wTHgtVsdb28V^2+VTYKq_EKX zb?HB~q5kpERHK~t%jDcnv|4Xd(WWxnSXC6Y`*EO$1fUWcO18F@3D}9mJoOk2q{nXV zanQFeFVn3eHs75h|c%H*;TT)xmxQp4YFn0jHPq;2564>*&ciw+s#s&!scslxmB!c zDYy*2w`@c!T%D7cf9P|L(mI$Fnjbdx$<~&~28&hy(Crd3JcJ53IoGposvjUjkw)DZ z?pleowiS>sdLuLEpB4lX*|3i*_);4r+(?94tLir?qhUU6^&F!*3%A`)!`jp|?zFFF zhHTIkL(m%v2{6?P&9S2E(RlNi{r~ym+?6EbK;%8TzB!eWCz+V!Pr8{|`CHvERCDz5 zkapPJ9a=ir!~2gAH9*1M4vy~5{-XDsUEMr2PvPs~r$pVHG*4M7-jKcFt>b*(?P{p6 zvuUW2nPaHCqpH&>kk$c>U^PYn9?t#_qQM>yJ^j>zHBbE!t{UTd_qNO_(LY4|-8D~L z`eQq4s~a~(b-a9?MHQuGr5t6IWJQ(aq~#PYDl02XiptB%$;!ye%gD(~$tkNT$g9c9 zivIIBrFDRDrQz%3qIT`>%*R z{r<_0K~W~y!COX7T2|(-kQp8|7);c3e4QQqy?o8QydG-(Bj^9N5x1xu!x!W4qRK^4 zOE*s^uOL4Sng8hT?}Ypvr1KRAe`hTQCub_-na&IJi2?cze2P$ozftf1193q?(~A3?-HMOH2Pu z`d_8{f8^qC?*B)E|3{#|Bl#t`zj6J>^-BbPN%*&R{l@i61b#{Qw|4!;^-BbPN%*&R z{l@i61b#{Qw|4!;^-BbPN%*&R{l@i61b#{Qw|4!;^-BbPN%*&R{l@i61b#{Qw|4!; z^-BbPN%*&R{l@i61b#{Qw|4!;^-BbPN%*&R{l@i61b#{Qw|4!;^-BbPN%*&R{l@i6 z1b#{Qw|4!;^-BbPN%*&R{l@i61b#{Qw|4!;^-BbPN%*&R{l@i61b#{Qw|4!;^-BbP zN%()NT?hW2_u=fxnCub6nAPEx`z)A=iR0C^E0@d|Q-UV(27)MI#JZP@bBVi^xAJpl zM+-jQZ`o&BMH;2(SG%<2x!xT-|M~8HynUeciTk48qPWUpE`Bi?vxffYA3u5bThTDP z!5axlABhN0T*S&PcUr0I&s0?fOt>BLh=KxJxPs~?rHews@7F%_e1(~5?RoAc)fXq? zBL2G*M;Tj&+IUq8Ct$0VHWe#(%r>=|S2yV4xaS>fYY*{L7mmI5IrXWrvGMu!EZ=P? z{EOHzq#!lI;duP>=g&1yeG1mFJALZ<*>TIvz8L!A;#Kn+E<2wW= z7{=i|Gv`!Xi2C|17cRG6ypdB{>VqmPxa{tZ-FF$p|4HjK49Q<>BVAcrJ9~I& zK~lc&e#Jz8e_0YE))&-bZpFh=($eYUBf(&Yu(0~tTVFI{HH9snJG@a+R`#l{vJ0L> zp-2{6!A=88%i&tCl2TH{gzH(y_xgFQSe!lfIzBWkEYW{5!kv#uAedpuyuvBirE|Mq+Ah=ZF;$HEj4q+=c)O{6ErGrQU>}?lT-MzNPrSW#rE7$ z$^K2Ix7BZ)Z$B$7O{rRW9DI1}j~J{zi1f}3rlJ`sS;dQd;KIh8jx#Yf(yA+~tgMs_ z6U;L>eMGa`bCRyRrDFB$!fxKWy1L%n#jl8bm(|nP({uUe4^h8pVu|U2w+lxWNp{u= zCe#L=`^4Dkul{6e_Iu>T?wR%Vu<|m5PqMat)RNxXQwOypBe|HLF5?y!7LY_uPL(@B zL8O-E=8plRb1K(GGt<-4mu;-A!_J2ZdY3uLkMjOdXJX+a{`m2oe(TFcnJ~edFe^zV zZ%hy0K}M)IGwfm?Wqi*uyU=ZHsIii$86B~QNAU?~aRy`A^d&?!8sg^xg#uqzd>$#s zUY#df+Jk8kD?V4zrn}<$y$?pvXefEQnFM2`e=t{W;ihq|4c%nR?8==%_B*y^n2}qb zdR#jPOa{379^o z@qkemyzjDK5#bb!A(!p(`j%(Cz&FhYHcm4VjJqQv$CI+J>F9jVdnPsi=@4pHNxtbGgK+M%&Ac-b zJ*P1T?rl?CZfSY;RU_wEp#I+7+YR+I$A}XX4+VrfXXid=xSJgaV-P=&v^J~Nr7aKT z8`)v|Z);vcfETi+$+907LU#4((;5gv(}B&mz8v+dFNl8Eewu@Wqy7MS zp)>KKdOqs5sSLPw%+wNa|H^zXt*)+au{G+@6BmVrzyq@v9vEsaqlSib87PYqhE(pK z@9Bzq}*Pt~S9V!iwVyY z3yx1)OqbYrK4o*^Yy8AwU(|@JC)t95A&7QrGFVg$W{#5El_L#lx zho6ILX~XKA-?l{DgA7fS6%|(*q;9Z}+ZRmA=}t~eG;}Ko2Aq5dlrS&{T!`-|<Mo5C z6?U%%BiiQXY<9PSm~#%96kQ<)uXdOYIyx$Qd}9{lc?!-mtdu}8x(xzRdYyKtk16+j zUJGlIxp-e&cXbYb(+b-vcof@?$P`DKK&k8E@KD>x=&8mq{n3ZR0VCC3zyML=MZ}xk zDrl55pq}kk7sdhqDTwe9s&Y%dsHBu_Ho|DWat7Rx#+E)IczuScEH++aEYrij+`UI&+DfW>|N%;>L@IF+od2B2i||1{S@{VIH6Hay#g|;)B%v zGjkPp%?~7__+uh!;6(p$>XhWng-ln(v;14VSK_{GeT#oa3o7Qy5tP|rrX0g9dSPMguQxyEQmKMixu#9uufdS&m8)7zWJcbnC{mM3OJ87-;T zWF75wug41;)x#!G;A_L8hj#FGU&LDOz!D+a`F5hN7uyqLSwZKi93jP~@HF>_E7?)6 zEwBq=*}<@BQZHNG@{l;ejLtSI-wUZN7r`@JtnXdHFfamgw;!+xo2t*!ZU6 zuHI+W*Hb>h##w9Y>g#3dLfSL=nxN}}44^`6(V-=hSb3!Nb?li1g&u~2tTLKfQOEJ= z7{+-T^?1gCVGAI;O)tCkjZ&+J(>-Z2pC_$lq#m4lT6k*o63?~h2>=|W7iHaxHG>>W_O4*>3wqcKrdk~V`=G2 z52NRiScYI0H#qy=R@u{O52-0pTkpmd#%$v8s^Of;U91`;; zDJki&2KKlhqe~Y3=1tc&cqv6UBeN)EZJL7YSlEauLwr;pxEM)m81E^(d4=JpTg!;= zz%#T{jE-f3vu#4aXo~s$PiMdRUwJNTsLXlLd{FWI`U6_rl{ZwQUj4vFr+c`I;2kxDnovn?ELh)5qSEqchVN*WjSW#OWQeR2@ zhHYwUsxCu_3H)~*;-g)S!Hf(fSl_v$WctO-2&K8v6rTj~^XkUYuhX^OrB)wQrfn8`r;ln!C5$qkd@(ebS}CMVIeB`EOIsnk)bS literal 0 HcmV?d00001 diff --git a/htdocs/takepos/img/arrow-prev.png b/htdocs/takepos/img/arrow-prev.png new file mode 100644 index 0000000000000000000000000000000000000000..b7311f26f54a21d1b846310103687d9d653d5806 GIT binary patch literal 5112 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 literal 0 HcmV?d00001 diff --git a/htdocs/takepos/img/gplv3.png b/htdocs/takepos/img/gplv3.png new file mode 100644 index 0000000000000000000000000000000000000000..ba78d4c4941dabf2fcac5409a92ac4c57920c69f GIT binary patch literal 2666 zcmV-w3YGPVP)Px#32;bRa{vGVivR!tivi)#(!2lw00(qQO+^RT0uvMpF24YJ`L;(K) z{{a7>y{D4^014_zL_t(&-tC%skW|$b#(x5`77PlZ01Xf|tXfvU1+9P)Nl;9MMIeIW zf~A;|yxWx-F&@d<9Z!mSGK`{-NXD*+V< z1U?qnFHjo71r>243NtglEQV7Q5|M$wwPW#3mU1Xa75(4)}+D^1dj!r-wg;N!7wPTlz6cv~* zaG8PJ%ocdxi%_r(8VF2J2gJd((|x~-stE3f0*?zktgtfz_z{7D0<}|XS^^CmbayaJ zV6ea`S+E+%|4L05^x|!{8+(dT?jEM~Js`$27+y6h2%>GgYF0wJYE0l-O z)7o925Tv&W;2eAZgu;B5;j^dJ8-bz3oKpjkZt1g)zX^66mI| z)j_Xp5wNzxdh2k6HU6=}>lr5fjzC|47oe%aZiQ_MKeNs1Wz;5au`^ddqYxT8_`O0| z2+eKGVG3K)+k_Uu1%|7S@cDv!RA5U0Jp{%pe3tfppM%?rytQ5}8P;njwoMwi^#raG z_|!q~0P19O58V`YC~Ow^rGefh%fweYXuAOFEA&%1pirdH-T=NSi#0u9by^9`QxJv5 zHjl?NEpVEPINjb~s%aLOrIZQ$Er2cpYhwES(!o;>ZWd4fj>h!yt-vP^&Rzf~rSJ-% zg@aKFTLZW-2{m&$=#dIvD=Zf1XvcR*1&`sq0ThV$zmI09^NGMv1M6&ojS7EJsBiOF z8n;M=9{?nvrNFcK_*#Yg1^TDhK}Ke?#C57YX(PO#~hmZ&YIfXpm0?Of77b zcz4lUy){(?;9j;d=Zg=NarIQ8n^{2*frBCRE`gImI7i`?I3Q90+X5fTF_*Oh*9+WO z1x|lZpeTTXIJ}Zj$9dYg#Asf_jNm>ECo6nxzAm326$kDY0%zN14N};eq2A;GS}N34 z_?^POB%Ep+b3>f}wIrZv1mNKjYL#A=I=IZiomF5OUkN;%%t28n`n7hnwKmOUxi!^C z?!7sJ)RYjqCgH3A+6T}!^hf+gd!G=mbKa5;2^2Z#5Q*l| zfdhdl0@EDyF+dtC++#s#w6j4H&?112wh__NE(zy`FhF3r<@t|C0A7{B|L)KTzz$ld zr)$xAGn~&v$ExqQqQD+9qd48hXc$805H1yOr8Q%W^E8V!qcoEr7HA|sO)M9(j7va) zLPO)u<>K8*eH(mXo|E4b6{n4!WlMoas%ZhvALqY1(?UYejX$qum2H*6CFz(2o?R^x zDEv(hmVvj&jg=p^uDHvkZKlwQXnG#Q_KXL#Ubbsr9Nn7x7-IFOx}g0W@Fj z20>x8!ootY1Jtn~{dF~g`?~m)`Q!|iyHa6%kmfQnQM3*U9~p3ePDSc@Q2%*2Wf?S% zmJ%okp_W5IHRG)GOwilcdW(Gu*4g{T~>dyLTd*<7nqH5>P4bO#m15lF^bQk0@fXG4I;>Zi8G4~)h=aS0UnUjaR`^J~?z=+$ zHTWKdViR&!n`TiY-;I@$Nas4sHq*3$R%RqSBP!U};>Y>BK#9N@@vNzKHf)UY&9JQQ zCMxp?bTg|ev(NnmCWO%6!B~MAp&w|lz>EMc4xx`RjCHn%FPzVQekwkb8YeK{!Gi*~ zsNb|P0)6c!`IJklP`iK9vb6vc-7RoHJ0Nq5dRwk5m+UDA)gAo?O?LN0*eFN#QW*D#LIwjzkygL(4{)S zRcNGevoWb@0%ujrt~sxh79Qi@G*o92@TaP*zZ6=F7pc}Mlq8{3Nv<1-3c80vD-#)#iR!fAg3`3i=|n0Ep+VCB*yVN$x?2_YiZ5k$@3&Tcz#W!=Gm9%=?NxpL Y19h*OP%`Tk_W%F@07*qoM6N<$g8#_jNdN!< literal 0 HcmV?d00001 diff --git a/htdocs/takepos/img/marketplace/cashcontrol.jpg b/htdocs/takepos/img/marketplace/cashcontrol.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66240218dff5cd3557993179a6185ab3bada8d1c GIT binary patch literal 80604 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 A$N&HU literal 0 HcmV?d00001 diff --git a/htdocs/takepos/img/marketplace/takeposmobile.jpg b/htdocs/takepos/img/marketplace/takeposmobile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..918f7c49d5e265b53ae235be41d784b35a889d82 GIT binary patch literal 57525 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�Uq6)r@jYGrOE?a9E0E)r< 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 CVQ~}U&Kt)eIT^vI+ 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 X26lSic}{%m00000NkvXXu0mjfTCsQt literal 0 HcmV?d00001 diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php new file mode 100644 index 00000000000..2df1cc965f0 --- /dev/null +++ b/htdocs/takepos/invoice.php @@ -0,0 +1,287 @@ + + * + * 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 . + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +require '../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; + +$langs->load("bills"); +$langs->load("cashdesk"); + +$id = GETPOST('id'); +$action = GETPOST('action'); +$idproduct = GETPOST('idproduct'); +$place = GETPOST('place'); +$number = GETPOST('number'); +$idline = GETPOST('idline'); +$desc = GETPOST('desc'); +$pay = GETPOST('pay'); + +$sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where facnumber='(PROV-POS-".$place.")'"; +$resql = $db->query($sql); +$row = $db->fetch_array ($resql); +$placeid=$row[0]; +if (! $placeid) $placeid=0; // not necesary +else{ + $invoice = new Facture($db); + $invoice->fetch($placeid); +} + +/* + * Actions + */ + +if ($action == 'valid' && $user->rights->facture->creer){ + if ($pay=="cash") $bankaccount=$conf->global->CASHDESK_ID_BANKACCOUNT_CASH; + else if ($pay=="card") $bankaccount=$conf->global->CASHDESK_ID_BANKACCOUNT_CB; + $now=dol_now(); + $invoice = new Facture($db); + $invoice->fetch($placeid); + if (! empty($conf->stock->enabled) and $conf->global->CASHDESK_NO_DECREASE_STOCK!="1") $invoice->validate($user, '', $conf->global->CASHDESK_ID_WAREHOUSE); + else $invoice->validate($user); + // Add the payment + $payment=new Paiement($db); + $payment->datepaye=$now; + $payment->bank_account=$bankaccount; + $payment->amounts[$invoice->id]=$invoice->total_ttc; + if ($pay=="cash") $payment->paiementid=4; + else if ($pay=="card") $payment->paiementid=6; + $payment->num_paiement=$invoice->facnumber; + $payment->create($user); + $payment->addPaymentToBank($user, 'payment', '(CustomerInvoicePayment)', $bankaccount, '', ''); + $invoice->set_paid($user); +} + +if (($action=="addline" or $action=="freezone") and $placeid==0) +{ + if ($placeid==0) { + $invoice = new Facture($db); + $invoice->socid=$conf->global->CASHDESK_ID_THIRDPARTY; + $invoice->date=mktime(); + $invoice->ref="asdf"; + $placeid=$invoice->create($user); + $sql="UPDATE ".MAIN_DB_PREFIX."facture set facnumber='(PROV-POS-".$place.")' where rowid=".$placeid; + $db->query($sql); + } +} + +if ($action=="addline"){ + $prod = new Product($db); + $prod->fetch($idproduct); + $invoice->addline($prod->description, $prod->price, 1, $prod->tva_tx, $prod->localtax1_tx, $prod->localtax2_tx, $idproduct, $prod->remise_percent, '', 0, 0, 0, '', $prod->price_base_type, $prod->price_ttc, $prod->type, - 1, 0, '', 0, 0, null, 0, '', 0, 100, '', null, 0); + $invoice->fetch($placeid); +} + +if ($action=="freezone"){ + $invoice->addline($desc, $number, 1, $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS, 0, 0, 0, 0, '', 0, 0, 0, '', 'TTC', $number, 0, - 1, 0, '', 0, 0, null, 0, '', 0, 100, '', null, 0); + $invoice->fetch($placeid); +} + +if ($action=="deleteline"){ + if ($idline>0 and $placeid>0){ //If exist invoice and line, to avoid errors if deleted from other device or no line selected + $invoice->deleteline($idline); + $invoice->fetch($placeid); + } + else if ($placeid>0){ //If exist invoice, but no line selected, proced to delete last line + $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facturedet where fk_facture='$placeid' order by rowid DESC"; + $resql = $db->query($sql); + $row = $db->fetch_array ($resql); + $deletelineid=$row[0]; + $invoice->deleteline($deletelineid); + $invoice->fetch($deletelineid); + } +} + +if ($action=="updateqty"){ + foreach ($invoice->lines as $line){ + if ($line->id==$idline) $result = $invoice->updateline($line->id, $line->desc, $line->subprice, $number, $line->remise_percent, + $line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, + $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, + $line->fk_unit); + } + $invoice->fetch($placeid); +} + +if ($action=="updateprice"){ + foreach ($invoice->lines as $line){ + if ($line->id==$idline) $result = $invoice->updateline($line->id, $line->desc, $number, $line->qty, $line->remise_percent, + $line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, + $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, + $line->fk_unit); + } + $invoice->fetch($placeid); +} + +if ($action=="updatereduction"){ + foreach ($invoice->lines as $line){ + if ($line->id==$idline) $result = $invoice->updateline($line->id, $line->desc, $line->subprice, $line->qty, $number, + $line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, + $line->fk_parent_line, 0, $line->fk_fournprice, $line->pa_ht, $line->label, $line->special_code, $line->array_options, $line->situation_percent, + $line->fk_unit); + } + $invoice->fetch($placeid); +} + +if ($action=="order"){ + require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $headerorder='
'.$langs->trans('Place').' '.$place.'
'; + $footerorder='
'.$langs->trans("Label").''.$langs->trans("Qty").'
'.dol_print_date(dol_now(), 'dayhour').'
'; + $order_receipt_printer1=""; + $order_receipt_printer2=""; + $catsprinter1 = explode(';',$conf->global->TAKEPOS_PRINTED_CATEGORIES_1); + $catsprinter2 = explode(';',$conf->global->TAKEPOS_PRINTED_CATEGORIES_2); + foreach ($invoice->lines as $line){ + if ($line->special_code=="3") continue; + $c = new Categorie($db); + $existing = $c->containing($line->fk_product, Categorie::TYPE_PRODUCT, 'id'); + $result = array_intersect($catsprinter1, $existing); + $count=count($result); + if ($count>0){ + $sql="UPDATE ".MAIN_DB_PREFIX."facturedet set special_code='3' where rowid=$line->rowid"; + $db->query($sql); + $order_receipt_printer1.=''.$line->product_label.''.$line->qty.''; + } + } + foreach ($invoice->lines as $line){ + if ($line->special_code=="3") continue; + $c = new Categorie($db); + $existing = $c->containing($line->fk_product, Categorie::TYPE_PRODUCT, 'id'); + $result = array_intersect($catsprinter2, $existing); + $count=count($result); + if ($count>0){ + $sql="UPDATE ".MAIN_DB_PREFIX."facturedet set special_code='3' where rowid=$line->rowid"; + $db->query($sql); + $order_receipt_printer2.=''.$line->product_label.''.$line->qty.''; + } + } + $invoice->fetch($placeid); +} + +?> + + +'; +print ''; +print ''; +print ''; +print ''; +print ''; +print "\n"; +if ($placeid>0) foreach ($invoice->lines as $line) +{ + print ''; + print ''; + print ''; + print ''; + print ''; +} +print '
'.$langs->trans('Description').''.$langs->trans('Qty').''.$langs->trans('TotalHTShort').'
'.$line->product_label.$line->desc.''.$line->qty.''.price($line->total_ttc).'
'; +print '

'.$langs->trans('TotalTTC'); +if($conf->global->TAKEPOS_BAR_RESTAURANT) print " ".$langs->trans('Place')." ".$place; +print ': '.price($invoice->total_ttc, 1, '', 1, - 1, - 1, $conf->currency).' 

'; + +//if ($invoice->socid != $conf->global->CASHDESK_ID_THIRDPARTY){ + $soc = new Societe($db); + if ($invoice->socid > 0) $soc->fetch($invoice->socid); + else $soc->fetch($conf->global->CASHDESK_ID_THIRDPARTY); + print '

'; + print $langs->trans("Customer").': '.$soc->name; + print '

'; +//} +if ($action=="valid"){ + print '

'.$invoice->facnumber." ".$langs->trans('BillShortStatusValidated').'

'; + if ($conf->global->TAKEBOX) print '
'; + else print '
'; +} +if ($action=="search"){ + print '
+ '; +} +print ''; diff --git a/htdocs/takepos/js/jquery.colorbox-min.js b/htdocs/takepos/js/jquery.colorbox-min.js new file mode 100644 index 00000000000..b5109a262ef --- /dev/null +++ b/htdocs/takepos/js/jquery.colorbox-min.js @@ -0,0 +1,6 @@ +/*! + Colorbox 1.6.4 + license: MIT + http://www.jacklmoore.com/colorbox +*/ +(function(t,e,i){function n(i,n,o){var r=e.createElement(i);return n&&(r.id=Z+n),o&&(r.style.cssText=o),t(r)}function o(){return i.innerHeight?i.innerHeight:t(i).height()}function r(e,i){i!==Object(i)&&(i={}),this.cache={},this.el=e,this.value=function(e){var n;return void 0===this.cache[e]&&(n=t(this.el).attr("data-cbox-"+e),void 0!==n?this.cache[e]=n:void 0!==i[e]?this.cache[e]=i[e]:void 0!==X[e]&&(this.cache[e]=X[e])),this.cache[e]},this.get=function(e){var i=this.value(e);return t.isFunction(i)?i.call(this.el,this):i}}function h(t){var e=W.length,i=(A+t)%e;return 0>i?e+i:i}function a(t,e){return Math.round((/%/.test(t)?("x"===e?E.width():o())/100:1)*parseInt(t,10))}function s(t,e){return t.get("photo")||t.get("photoRegex").test(e)}function l(t,e){return t.get("retinaUrl")&&i.devicePixelRatio>1?e.replace(t.get("photoRegex"),t.get("retinaSuffix")):e}function d(t){"contains"in x[0]&&!x[0].contains(t.target)&&t.target!==v[0]&&(t.stopPropagation(),x.focus())}function c(t){c.str!==t&&(x.add(v).removeClass(c.str).addClass(t),c.str=t)}function g(e){A=0,e&&e!==!1&&"nofollow"!==e?(W=t("."+te).filter(function(){var i=t.data(this,Y),n=new r(this,i);return n.get("rel")===e}),A=W.index(_.el),-1===A&&(W=W.add(_.el),A=W.length-1)):W=t(_.el)}function u(i){t(e).trigger(i),ae.triggerHandler(i)}function f(i){var o;if(!G){if(o=t(i).data(Y),_=new r(i,o),g(_.get("rel")),!U){U=$=!0,c(_.get("className")),x.css({visibility:"hidden",display:"block",opacity:""}),I=n(se,"LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden"),b.css({width:"",height:""}).append(I),j=T.height()+k.height()+b.outerHeight(!0)-b.height(),D=C.width()+H.width()+b.outerWidth(!0)-b.width(),N=I.outerHeight(!0),z=I.outerWidth(!0);var h=a(_.get("initialWidth"),"x"),s=a(_.get("initialHeight"),"y"),l=_.get("maxWidth"),f=_.get("maxHeight");_.w=Math.max((l!==!1?Math.min(h,a(l,"x")):h)-z-D,0),_.h=Math.max((f!==!1?Math.min(s,a(f,"y")):s)-N-j,0),I.css({width:"",height:_.h}),J.position(),u(ee),_.get("onOpen"),O.add(F).hide(),x.focus(),_.get("trapFocus")&&e.addEventListener&&(e.addEventListener("focus",d,!0),ae.one(re,function(){e.removeEventListener("focus",d,!0)})),_.get("returnFocus")&&ae.one(re,function(){t(_.el).focus()})}var p=parseFloat(_.get("opacity"));v.css({opacity:p===p?p:"",cursor:_.get("overlayClose")?"pointer":"",visibility:"visible"}).show(),_.get("closeButton")?B.html(_.get("close")).appendTo(b):B.appendTo("
"),w()}}function p(){x||(V=!1,E=t(i),x=n(se).attr({id:Y,"class":t.support.opacity===!1?Z+"IE":"",role:"dialog",tabindex:"-1"}).hide(),v=n(se,"Overlay").hide(),L=t([n(se,"LoadingOverlay")[0],n(se,"LoadingGraphic")[0]]),y=n(se,"Wrapper"),b=n(se,"Content").append(F=n(se,"Title"),R=n(se,"Current"),P=t(' + + + + + + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php new file mode 100644 index 00000000000..6b2cb1a5505 --- /dev/null +++ b/htdocs/takepos/receipt.php @@ -0,0 +1,108 @@ + + * Copyright (C) 2011 Laurent Destailleur + * Copyright (C) 2012 Marcos García + * Copyright (C) 2018 Andreu Bisquerra + * + * 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 . + */ + +require '../main.inc.php'; // Load $user and permissions +include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + +$langs->load("main"); +$langs->load('cashdesk'); + + +/* + * View + */ + +top_httphead('text/html'); + +$facid=GETPOST('facid','int'); +$place=GETPOST('place','int'); +if ($place>0){ + $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where facnumber='(PROV-POS-".$place.")'"; + $resql = $db->query($sql); + $row = $db->fetch_array ($resql); + $facid=$row[0]; +} +$object=new Facture($db); +$object->fetch($facid); + +// IMPORTANT: This file is sended to 'Takepos Printing' application. Keep basic file. No external files as css, js... If you need images use absolut path. +?> + + +
+ +name; ?> + +
+
+

+ +

+

+trans('Date')." ".dol_print_date($object->date, 'day').'
'; +if ($mysoc->country_code == 'ES') print "Factura simplificada "; +print $object->ref; +?> +

+
+ + + + + + + + + + + lines as $line) + { + ?> + + + + + + + +
trans("Label"); ?>trans("Qty"); ?>trans("TotalTTC"); ?>
product_label;?>qty;?>total_ttc);?>
+
+ + + + + + + + + + + +
trans("TotalHT");?>total_ht, 1, '', 1, - 1, - 1, $conf->currency)."\n";?>
trans("TotalVAT").''.price($object->total_tva, 1, '', 1, - 1, - 1, $conf->currency)."\n";?>
trans("TotalTTC").''.price($object->total_ttc, 1, '', 1, - 1, - 1, $conf->currency)."\n";?>
+ + + + diff --git a/htdocs/takepos/sql/llx_takepos_floor_tables.sql b/htdocs/takepos/sql/llx_takepos_floor_tables.sql new file mode 100644 index 00000000000..943f8e60b63 --- /dev/null +++ b/htdocs/takepos/sql/llx_takepos_floor_tables.sql @@ -0,0 +1,26 @@ +-- Copyright (C) 2018 SuperAdmin +-- +-- 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/. + + +CREATE TABLE llx_takepos_floor_tables( + -- BEGIN MODULEBUILDER FIELDS + rowid INTEGER AUTO_INCREMENT PRIMARY KEY, + entity INTEGER DEFAULT 1 NOT NULL, + label VARCHAR(255), + leftpos float, + toppos float, + floor int(3) + -- END MODULEBUILDER FIELDS +) ENGINE=innodb; \ No newline at end of file diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php new file mode 100644 index 00000000000..098ba39b603 --- /dev/null +++ b/htdocs/takepos/takepos.php @@ -0,0 +1,406 @@ + + * + * 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 . + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); + +$_GET['theme']="md"; // Force theme. MD theme provides better look and feel to TakePOS + +require '../main.inc.php'; // Load $user and permissions +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; + +$place = GETPOST('place'); +if ($place=="") $place="0"; +$action = GETPOST('action'); + +$langs->load("main"); +$langs->load("bills"); +$langs->load("orders"); +$langs->load("commercial"); + + +/* + * View + */ + +// Title +$title='TakePOS - Dolibarr '.DOL_VERSION; +if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $title='TakePOS - '.$conf->global->MAIN_APPLICATION_TITLE; +top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); + +?> + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + +
+ +$langs->trans("SearchProduct"), + 'action'=>'Search();'); +$menus[$r++]=array('title'=>$langs->trans("FreeZone"), + 'action'=>'FreeZone();'); +$menus[$r++]=array('title'=>$langs->trans("Customer"), + 'action'=>'Customer();'); +$menus[$r++]=array('title'=>$langs->trans("BackOffice"), + 'action'=>'window.open(\''.DOL_URL_ROOT.'\', \'backoffice\');'); +$menus[$r++]=array('title'=>$langs->trans("ValidateBill"), + 'action'=>'CloseBill();'); +$menus[$r++]=array('title'=>$langs->trans("Logout"), + 'action'=>'window.location.href=\''.DOL_URL_ROOT.'/user/logout.php\';'); +if($conf->global->TAKEPOS_BAR_RESTAURANT){ + $menus[$r++]=array('title'=>$langs->trans("Floors"), + 'action'=>'Floors();'); + if ($conf->global->TAKEPOS_ORDER_PRINTERS){ + $menus[$r++]=array('title'=>$langs->trans("Order"), + 'action'=>'TakeposPrintingOrder();'); + } +} +?> +
+'.$menu['title'].''; +} +?> +
+ +
+ +
id='catdiv'> + width="98%" id='catimg'/> +
+
+
+
+ +
+ +
+ +
onclick="MoreProducts('less');" onclick="MoreProducts('more');" > + width="95%" id='proimg'/> +
+
+
+
+ +
+ + +close(); + + + diff --git a/htdocs/takepos/test/phpunit/TakePosFunctionalTest.php b/htdocs/takepos/test/phpunit/TakePosFunctionalTest.php new file mode 100644 index 00000000000..e4917c3cba0 --- /dev/null +++ b/htdocs/takepos/test/phpunit/TakePosFunctionalTest.php @@ -0,0 +1,289 @@ + + * Copyright (C) 2018 SuperAdmin + * + * 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 . + */ + +/** + * \file test/functional/TakePosFunctionalTest.php + * \ingroup takepos + * \brief Example Selenium test. + * + * Put detailed description here. + */ + +namespace test\functional; + +use PHPUnit_Extensions_Selenium2TestCase_WebDriverException; + +/** + * Class TakePosFunctionalTest + * + * Requires chromedriver for Google Chrome + * Requires geckodriver for Mozilla Firefox + * + * @fixme Firefox (Geckodriver/Marionette) support + * @todo Opera linux support + * @todo Windows support (IE, Google Chrome, Mozilla Firefox, Safari) + * @todo OSX support (Safari, Google Chrome, Mozilla Firefox) + * + * @package Testtakepos + */ +class TakePosFunctionalTest extends \PHPUnit_Extensions_Selenium2TestCase +{ + // TODO: move to a global configuration file? + /** @var string Base URL of the webserver under test */ + protected static $base_url = 'http://dev.zenfusion.fr'; + /** + * @var string Dolibarr admin username + * @see authenticate + */ + protected static $dol_admin_user = 'admin'; + /** + * @var string Dolibarr admin password + * @see authenticate + */ + protected static $dol_admin_pass = 'admin'; + /** @var int Dolibarr module ID */ + private static $module_id = 500000; // TODO: autodetect? + + /** @var array Browsers to test with */ + public static $browsers = array( + array( + 'browser' => 'Google Chrome on Linux', + 'browserName' => 'chrome', + 'sessionStrategy' => 'shared', + 'desiredCapabilities' => array() + ), + // Geckodriver does not keep the session at the moment?! + // XPath selectors also don't seem to work +// array( +// 'browser' => 'Mozilla Firefox on Linux', +// 'browserName' => 'firefox', +// 'sessionStrategy' => 'shared', +// 'desiredCapabilities' => array( +// 'marionette' => true +// ) +// ) + ); + + /** + * Helper function to select links by href + * + * @param string $value Href + * @return mixed Helper string + */ + protected function byHref($value) + { + $anchor = null; + $anchors = $this->elements($this->using('tag name')->value('a')); + foreach ($anchors as $anchor) { + if (strstr($anchor->attribute('href'), $value)) { + break; + } + } + return $anchor; + } + + /** + * Global test setup + */ + public static function setUpBeforeClass() + { + } + + /** + * Unit test setup + */ + public function setUp() + { + $this->setSeleniumServerRequestsTimeout(3600); + $this->setBrowserUrl(self::$base_url); + } + + /** + * Verify pre conditions + */ + protected function assertPreConditions() + { + } + + /** + * Handle Dolibarr authentication + */ + private function authenticate() + { + try { + if ($this->byId('login')) { + $login = $this->byId('username'); + $login->clear(); + $login->value('admin'); + $password = $this->byId('password'); + $password->clear(); + $password->value('admin'); + $this->byId('login')->submit(); + } + } catch (PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) { + // Login does not exist. Assume we are already authenticated + } + } + + /** + * Test enabling developer mode + */ + public function testEnableDeveloperMode() + { + $this->url('/admin/const.php'); + $this->authenticate(); + $main_features_level_path='//input[@value="MAIN_FEATURES_LEVEL"]/following::input[@type="text"]'; + $main_features_level = $this->byXPath($main_features_level_path); + $main_features_level->clear(); + $main_features_level->value('2'); + $this->byName('update')->click(); + // Page reloaded, we need a new XPath + $main_features_level = $this->byXPath($main_features_level_path); + return $this->assertEquals('2', $main_features_level->value(), "MAIN_FEATURES_LEVEL value is 2"); + } + + /** + * Test enabling the module + * + * @depends testEnableDeveloperMode + */ + public function testModuleEnabled() + { + $this->url('/admin/modules.php'); + $this->authenticate(); + $module_status_image_path='//a[contains(@href, "' . self::$module_id . '")]/img'; + $module_status_image = $this->byXPath($module_status_image_path); + if (strstr($module_status_image->attribute('src'), 'switch_off.png')) { + // Enable the module + $this->byHref('modTakePos')->click(); + } else { + // Disable the module + $this->byHref('modTakePos')->click(); + // Reenable the module + $this->byHref('modTakePos')->click(); + } + // Page reloaded, we need a new Xpath + $module_status_image = $this->byXPath($module_status_image_path); + return $this->assertContains('switch_on.png', $module_status_image->attribute('src'), "Module enabled"); + } + + /** + * Test access to the configuration page + * + * @depends testModuleEnabled + */ + public function testConfigurationPage() + { + $this->url('/custom/takepos/admin/setup.php'); + $this->authenticate(); + return $this->assertContains('takepos/admin/setup.php', $this->url(), 'Configuration page'); + } + + /** + * Test access to the about page + * + * @depends testConfigurationPage + */ + public function testAboutPage() + { + $this->url('/custom/takepos/admin/about.php'); + $this->authenticate(); + return $this->assertContains('takepos/admin/about.php', $this->url(), 'About page'); + } + + /** + * Test about page is rendering Markdown + * + * @depends testAboutPage + */ + public function testAboutPageRendersMarkdownReadme() + { + $this->url('/custom/takepos/admin/about.php'); + $this->authenticate(); + return $this->assertEquals( + 'Dolibarr Module Template (aka My Module)', + $this->byTag('h1')->text(), + "Readme title" + ); + } + + /** + * Test box is properly declared + * + * @depends testModuleEnabled + */ + public function testBoxDeclared() + { + $this->url('/admin/boxes.php'); + $this->authenticate(); + return $this->assertContains('takeposwidget1', $this->source(), "Box enabled"); + } + + /** + * Test trigger is properly enabled + * + * @depends testModuleEnabled + */ + public function testTriggerDeclared() + { + $this->url('/admin/triggers.php'); + $this->authenticate(); + return $this->assertContains( + 'interface_99_modTakePos_TakePosTriggers.class.php', + $this->byTag('body')->text(), + "Trigger declared" + ); + } + + /** + * Test trigger is properly declared + * + * @depends testTriggerDeclared + */ + public function testTriggerEnabled() + { + $this->url('/admin/triggers.php'); + $this->authenticate(); + return $this->assertContains( + 'tick.png', + $this->byXPath('//td[text()="interface_99_modTakePos_MyTrigger.class.php"]/following::img')->attribute('src'), + "Trigger enabled" + ); + } + + /** + * Verify post conditions + */ + protected function assertPostConditions() + { + } + + /** + * Unit test teardown + */ + public function tearDown() + { + } + + /** + * Global test teardown + */ + public static function tearDownAfterClass() + { + } +} diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 03abd661d7d..9ef1e158382 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1707,6 +1707,10 @@ div.mainmenu.cashdesk { background-image: url(); } +div.mainmenu.takepos { + background-image: url(); +} + div.mainmenu.companies { background-image: url(); } @@ -1776,7 +1780,7 @@ $mainmenuusedarray=array_unique(explode(',',$mainmenuused)); $generic=1; // Put here list of menu entries when the div.mainmenu.menuentry was previously defined -$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','stripe','webservices','website'); +$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','takepos','ecm','geoipmaxmind','gravatar','clicktodial','paypal','stripe','webservices','website'); // Put here list of menu entries we are sure we don't want $divnotrequired=array('multicurrency','salaries','ticket','margin','opensurvey','paybox','expensereport','incoterm','prelevement','propal','workflow','notification','supplier_proposal','cron','product','productbatch','expedition'); foreach($mainmenuusedarray as $val) diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index d88a84c5090..a0714d502fd 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1696,6 +1696,10 @@ div.mainmenu.cashdesk { background-image: url(); } +div.mainmenu.takepos { + background-image: url(); +} + div.mainmenu.companies { background-image: url(); } @@ -1769,7 +1773,7 @@ $mainmenuusedarray=array_unique(explode(',',$mainmenuused)); $generic=1; // Put here list of menu entries when the div.mainmenu.menuentry was previously defined -$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','stripe','webservices','website'); +$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','takepos','ecm','geoipmaxmind','gravatar','clicktodial','paypal','stripe','webservices','website'); // Put here list of menu entries we are sure we don't want $divnotrequired=array('multicurrency','salaries','ticket','margin','opensurvey','paybox','expensereport','incoterm','prelevement','propal','workflow','notification','supplier_proposal','cron','product','productbatch','expedition'); foreach($mainmenuusedarray as $val)