From e572ca69c1fed2e6f19a93c72c3e4c7cbcbd8389 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Tue, 19 Feb 2019 16:43:00 +0100 Subject: [PATCH 0001/1036] Update stripe version api for payment intent --- htdocs/stripe/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php index fb0ef25f8bd..a0234d3c9a2 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/stripe/config.php @@ -55,4 +55,4 @@ else \Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']); \Stripe\Stripe::setAppInfo("Dolibarr Stripe", DOL_VERSION, "https://www.dolibarr.org"); // add dolibarr version -\Stripe\Stripe::setApiVersion("2018-11-08"); // force version API +\Stripe\Stripe::setApiVersion("2018-02-11"); // force version API From e8a6b64b6b2957aa37b0f37cf0e02aba78265d88 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Tue, 19 Feb 2019 16:50:05 +0100 Subject: [PATCH 0002/1036] Update config.php --- htdocs/stripe/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php index a0234d3c9a2..aa5d5889d94 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/stripe/config.php @@ -55,4 +55,4 @@ else \Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']); \Stripe\Stripe::setAppInfo("Dolibarr Stripe", DOL_VERSION, "https://www.dolibarr.org"); // add dolibarr version -\Stripe\Stripe::setApiVersion("2018-02-11"); // force version API +\Stripe\Stripe::setApiVersion("2019-02-11"); // force version API From 665174f9aaaba9af4101465156bf56b11741b565 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Tue, 19 Feb 2019 19:55:06 +0100 Subject: [PATCH 0003/1036] Update config.php --- htdocs/stripe/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php index aa5d5889d94..3b0e5ba9f6e 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/stripe/config.php @@ -55,4 +55,4 @@ else \Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']); \Stripe\Stripe::setAppInfo("Dolibarr Stripe", DOL_VERSION, "https://www.dolibarr.org"); // add dolibarr version -\Stripe\Stripe::setApiVersion("2019-02-11"); // force version API +\Stripe\Stripe::setApiVersion("2019-02-19"); // force version API From ad485b55b6015b4502bf25277fd7a385bf4c7f39 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 10 Mar 2019 20:01:39 +0100 Subject: [PATCH 0004/1036] NEW: Add category to bank transaction in various payment --- .../bank/class/paymentvarious.class.php | 5 +- htdocs/compta/bank/various_payment/card.php | 89 ++++++++++++------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/htdocs/compta/bank/class/paymentvarious.class.php b/htdocs/compta/bank/class/paymentvarious.class.php index 5a7ac205fe5..fad76c45d1b 100644 --- a/htdocs/compta/bank/class/paymentvarious.class.php +++ b/htdocs/compta/bank/class/paymentvarious.class.php @@ -63,6 +63,7 @@ class PaymentVarious extends CommonObject public $amount; public $type_payment; public $num_payment; + public $category_transaction; /** * @var string various payments label @@ -414,13 +415,13 @@ class PaymentVarious extends CommonObject $sign=1; if ($this->sens == '0') $sign=-1; - $bank_line_id = $acc->addline( + $bank_line_id = $acc->addline( $this->datep, $this->type_payment, $this->label, $sign * abs($this->amount), $this->num_payment, - '', + ($category_transaction > 0 ? $category_transaction : 0), $user ); diff --git a/htdocs/compta/bank/various_payment/card.php b/htdocs/compta/bank/various_payment/card.php index a1c1d8ae349..176fea7e8db 100644 --- a/htdocs/compta/bank/various_payment/card.php +++ b/htdocs/compta/bank/various_payment/card.php @@ -45,14 +45,15 @@ $action = GETPOST('action', 'alpha'); $cancel = GETPOST('cancel', 'aZ09'); $backtopage = GETPOST('backtopage', 'alpha'); -$accountid=GETPOST("accountid") > 0 ? GETPOST("accountid", "int") : 0; -$label=GETPOST("label", "alpha"); -$sens=GETPOST("sens", "int"); -$amount=GETPOST("amount", "alpha"); -$paymenttype=GETPOST("paymenttype", "int"); -$accountancy_code=GETPOST("accountancy_code", "alpha"); -$subledger_account=GETPOST("subledger_account", "alpha"); -$projectid = (GETPOST('projectid', 'int') ? GETPOST('projectid', 'int') : GETPOST('fk_project', 'int')); +$accountid = GETPOST("accountid") > 0 ? GETPOST("accountid", "int") : 0; +$label = GETPOST("label", "alpha"); +$sens = GETPOST("sens", "int"); +$amount = GETPOST("amount", "alpha"); +$paymenttype = GETPOST("paymenttype", "int"); +$accountancy_code = GETPOST("accountancy_code", "alpha"); +$subledger_account = GETPOST("subledger_account", "alpha"); +$projectid = (GETPOST('projectid', 'int') ? GETPOST('projectid', 'int') : GETPOST('fk_project', 'int')); +$cat1 = GETPOST("cat1", 'alpha'); // Security check $socid = GETPOST("socid", "int"); @@ -64,8 +65,6 @@ $object = new PaymentVarious($db); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context $hookmanager->initHooks(array('variouscard','globalcard')); - - /** * Actions */ @@ -113,6 +112,7 @@ if (empty($reshook)) $object->type_payment=GETPOST("paymenttype", 'int') > 0 ? GETPOST("paymenttype", "int") : 0; $object->num_payment=GETPOST("num_payment", 'alpha'); $object->fk_user_author=$user->id; + $object->category_transaction=GETPOST("cat1", 'alpha'); $object->accountancy_code=GETPOST("accountancy_code") > 0 ? GETPOST("accountancy_code", "alpha") : ""; $object->subledger_account=GETPOST("subledger_account") > 0 ? GETPOST("subledger_account", "alpha") : ""; @@ -240,6 +240,16 @@ if ($id) } } +$options = array(); + +// Load bank groups +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/bankcateg.class.php'; +$bankcateg = new BankCateg($db); + +foreach ($bankcateg->fetchAll() as $bankcategory) { + $options[$bankcategory->id] = $bankcategory->label; +} + /* ************************************************************************** */ /* */ /* Create mode */ @@ -259,7 +269,7 @@ if ($action == 'create') print ''; // Date payment - print ''; @@ -314,17 +324,50 @@ if ($action == 'create') print ''."\n"; } + // Category + if (is_array($options) && count($options)) + { + print ''; + } + + // Project + if (! empty($conf->projet->enabled)) + { + $formproject=new FormProjets($db); + + // Associated project + $langs->load("projects"); + + print ''; + } + + // Other attributes + $parameters=array(); + $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + + print ''; + print '
'; + print '
'; print $form->editfieldkey('DatePayment', 'datep', '', $object, 0, 'string', '', 1).''; print $form->selectDate((empty($datep)?-1:$datep), "datep", '', '', '', 'add', 1, 1); print '
'.$langs->trans("Rubrique").''; + print Form::selectarray('cat1', $options, GETPOST('cat1'), 1); + print '
'.$langs->trans("Project").''; + + $numproject=$formproject->select_projects(-1, $projectid, 'fk_project', 0, 0, 1, 1); + + print '
'; + print '
'; + + print ''; // Accountancy account if (! empty($conf->accounting->enabled)) { - print ''; + print ''; print ''; } else // For external software { - print ''; + print ''; print ''; } @@ -351,26 +394,6 @@ if ($action == 'create') print ''; } - // Project - if (! empty($conf->projet->enabled)) - { - $formproject=new FormProjets($db); - - // Associated project - $langs->load("projects"); - - print ''; - } - - // Other attributes - $parameters=array(); - $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - print '
'.$langs->trans("AccountAccounting").'
'.$langs->trans("AccountAccounting").''; print $formaccounting->select_account($accountancy_code, 'accountancy_code', 1, null, 1, 1, ''); print '
'.$langs->trans("AccountAccounting").'
'.$langs->trans("AccountAccounting").''; print '
'.$langs->trans("Project").''; - - $numproject=$formproject->select_projects(-1, $projectid, 'fk_project', 0, 0, 1, 1); - - print '
'; dol_fiche_end(); From 9da734569dcd6a4d76d2a51ed5842293a361581a Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 15 Mar 2019 12:34:21 +0100 Subject: [PATCH 0005/1036] Update config.php --- htdocs/stripe/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php index 3b0e5ba9f6e..5638a10d332 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/stripe/config.php @@ -55,4 +55,4 @@ else \Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']); \Stripe\Stripe::setAppInfo("Dolibarr Stripe", DOL_VERSION, "https://www.dolibarr.org"); // add dolibarr version -\Stripe\Stripe::setApiVersion("2019-02-19"); // force version API +\Stripe\Stripe::setApiVersion("2019-03-14"); // force version API From aa28079e789df1c306aa3702029fd2761b7a1f27 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 12:42:31 +0100 Subject: [PATCH 0006/1036] NEW morphy value in member type add value: mor / phy / both(aka null) --- htdocs/adherents/type.php | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 72ea99ff18d..31ce9768de1 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -1,10 +1,11 @@ +/* Copyright (C) 2001-2002 Rodolphe Quiedeville * Copyright (C) 2003 Jean-Louis Bergamo * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2017 Regis Houssin * Copyright (C) 2013 Florian Henry * Copyright (C) 2015 Alexandre Spangaro + * Copyright (C) 2019 Thibault Foucart * * 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 @@ -57,6 +58,7 @@ if (! $sortorder) { $sortorder="DESC"; } if (! $sortfield) { $sortfield="d.lastname"; } $label=GETPOST("label", "alpha"); +$morphy=GETPOST("morphy","alpha"); $statut=GETPOST("statut", "int"); $subscription=GETPOST("subscription", "int"); $vote=GETPOST("vote", "int"); @@ -103,6 +105,7 @@ if ($cancel) { if ($action == 'add' && $user->rights->adherent->configurer) { $object->label = trim($label); + $object->morphy = trim($morphy); $object->statut = (int) $statut; $object->subscription = (int) $subscription; $object->note = trim($comment); @@ -157,6 +160,7 @@ if ($action == 'update' && $user->rights->adherent->configurer) $object->oldcopy = clone $object; $object->label = trim($label); + $object->morphy = trim($morphy); $object->statut = (int) $statut; $object->subscription = (int) $subscription; $object->note = trim($comment); @@ -215,7 +219,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') { //dol_fiche_head(''); - $sql = "SELECT d.rowid, d.libelle as label, d.subscription, d.vote, d.statut"; + $sql = "SELECT d.rowid, d.libelle as label, d.subscription, d.vote, d.statut, d.morphy"; $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as d"; $sql.= " WHERE d.entity IN (".getEntity('member_type').")"; @@ -256,6 +260,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') print ''; print ''.$langs->trans("Ref").''; print ''.$langs->trans("Label").''; + print ''.$langs->trans("Nature").''; print ''.$langs->trans("SubscriptionRequired").''; print ''.$langs->trans("VoteAllowed").''; print ''.$langs->trans("Status").''; @@ -277,6 +282,11 @@ if (! $rowid && $action != 'create' && $action != 'edit') //'.img_object($langs->trans("ShowType"),'group').' '.$objp->rowid.' print ''; print ''.dol_escape_htmltag($objp->label).''; + print ''; + if ($objp->morphy == 'phy') { print $langs->trans("Physical"); } + elseif ($objp->morphy == 'mor') { print $langs->trans("Moral"); } + else print $langs->trans("Physical & Morale"); + print ''; print ''.yn($objp->subscription).''; print ''.yn($objp->vote).''; print ''; @@ -330,6 +340,14 @@ if ($action == 'create') print ''.$langs->trans("Status").''; print $form->selectarray('statut', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')), 1); print ''; + + // Morphy + $morphys[""] = $langs->trans("Physical & Morale"); + $morphys["phy"] = $langs->trans("Physical"); + $morphys["mor"] = $langs->trans("Morale"); + print ''.$langs->trans("Nature").''; + print $form->selectarray("morphy", $morphys, isset($_POST["morphy"])?$_POST["morphy"]:$object->morphy); + print ""; print ''.$langs->trans("SubscriptionRequired").''; print $form->selectyesno("subscription", 1, 1); @@ -411,6 +429,10 @@ if ($rowid > 0) print img_picto($langs->trans('TypeStatusInactive'), 'statut5').' '.$langs->trans("ActivityCeased"); } print ''; + + // Morphy + print ''.$langs->trans("Nature").''.$object->getmorphylib().''; + print ''; print ''.$langs->trans("SubscriptionRequired").''; print yn($object->subscription); @@ -751,6 +773,14 @@ if ($rowid > 0) print ''.$langs->trans("Status").''; print $form->selectarray('statut', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')), $object->statut); print ''; + + // Morphy + $morphys[""] = $langs->trans("Physical & Morale"); + $morphys["phy"] = $langs->trans("Physical"); + $morphys["mor"] = $langs->trans("Morale"); + print ''.$langs->trans("Nature").''; + print $form->selectarray("morphy", $morphys, isset($_POST["morphy"])?$_POST["morphy"]:$object->morphy); + print ""; print ''.$langs->trans("SubscriptionRequired").''; print $form->selectyesno("subscription", $object->subscription, 1); From 2e9badd21db0ac0a096c7e796d6fda2cca29a813 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 12:45:33 +0100 Subject: [PATCH 0007/1036] Update api_memberstypes.class.php --- htdocs/adherents/class/api_memberstypes.class.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php index abfaf84993d..519a0cecfb3 100644 --- a/htdocs/adherents/class/api_memberstypes.class.php +++ b/htdocs/adherents/class/api_memberstypes.class.php @@ -79,6 +79,7 @@ class MembersTypes extends DolibarrApi * * @param string $sortfield Sort field * @param string $sortorder Sort order + * @param string $nature Nature of type phy, mor or both (for only both not mor or phy only) * @param int $limit Limit for list * @param int $page Page number * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.libelle:like:'SO-%') and (t.subscription:=:'1')" @@ -86,7 +87,7 @@ class MembersTypes extends DolibarrApi * * @throws RestException */ - public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '') + public function index($sortfield = "t.rowid", $sortorder = 'ASC', $nature = 'all', $limit = 100, $page = 0, $sqlfilters = '') { global $db, $conf; @@ -100,6 +101,15 @@ class MembersTypes extends DolibarrApi $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t"; $sql.= ' WHERE t.entity IN ('.getEntity('member_type').')'; + // Nature + if ($nature != 'all') { + if ($nature == 'both') { + $sql.= ' AND t.morphy IS NULL '; + } else { + $sql.= ' AND (t.morphy IS NULL OR t.morphy = "'.$nature.'")'; + } + } + // Add sql filters if ($sqlfilters) { From fa302db84fff94f565c947a109e1ab27122b4bda Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 12:48:18 +0100 Subject: [PATCH 0008/1036] Update adherent_type.class.php --- htdocs/adherents/class/adherent_type.class.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index 65085caf42a..9c7fcfc5baa 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -1,8 +1,9 @@ +/* Copyright (C) 2002 Rodolphe Quiedeville * Copyright (C) 2004-2008 Laurent Destailleur * Copyright (C) 2009-2017 Regis Houssin * Copyright (C) 2016 Charlie Benke + * Copyright (C) 2019 Thibault Foucart * * 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 @@ -64,6 +65,11 @@ class AdherentType extends CommonObject * @var string Adherent type label */ public $label; + + /** + * @var string Adherent type nature + */ + public $morphy; /** * @var int Subsription required (0 or 1) @@ -184,6 +190,7 @@ class AdherentType extends CommonObject $sql.= "SET "; $sql.= "statut = ".$this->statut.","; $sql.= "libelle = '".$this->db->escape($this->label) ."',"; + $sql.= "morphy = '".$this->db->escape($this->morphy) ."',"; $sql.= "subscription = '".$this->db->escape($this->subscription)."',"; $sql.= "note = '".$this->db->escape($this->note)."',"; $sql.= "vote = ".(integer) $this->db->escape($this->vote).","; @@ -274,7 +281,7 @@ class AdherentType extends CommonObject */ public function fetch($rowid) { - $sql = "SELECT d.rowid, d.libelle as label, d.statut, d.subscription, d.mail_valid, d.note, d.vote"; + $sql = "SELECT d.rowid, d.libelle as label, d.morphy, d.statut, d.subscription, d.mail_valid, d.note, d.vote"; $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type as d"; $sql .= " WHERE d.rowid = ".(int) $rowid; @@ -290,6 +297,7 @@ class AdherentType extends CommonObject $this->id = $obj->rowid; $this->ref = $obj->rowid; $this->label = $obj->label; + $this->morphy = $obj->morphy; $this->statut = $obj->statut; $this->subscription = $obj->subscription; $this->mail_valid = $obj->mail_valid; From 63ad6b779ace4dad5ef242c8cdf72df2877ecc41 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 12:49:26 +0100 Subject: [PATCH 0009/1036] Update llx_adherent_type.sql --- htdocs/install/mysql/tables/llx_adherent_type.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/tables/llx_adherent_type.sql b/htdocs/install/mysql/tables/llx_adherent_type.sql index 88867f9d2ad..084d0457941 100644 --- a/htdocs/install/mysql/tables/llx_adherent_type.sql +++ b/htdocs/install/mysql/tables/llx_adherent_type.sql @@ -29,6 +29,7 @@ create table llx_adherent_type tms timestamp, statut smallint NOT NULL DEFAULT 0, libelle varchar(50) NOT NULL, + morphy varchar(3) NOT NULL, subscription varchar(3) NOT NULL DEFAULT 'yes', vote varchar(3) NOT NULL DEFAULT 'yes', note text, From 3723da43ca6c509bcf83d8861360eac27df33871 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 12:50:16 +0100 Subject: [PATCH 0010/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index f75c618612d..5b16aa18151 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -84,6 +84,7 @@ create table llx_mailing_unsubscribe ALTER TABLE llx_mailing_unsubscribe ADD UNIQUE uk_mailing_unsubscribe(email, entity, unsubscribegroup); ALTER TABLE llx_adherent ADD gender VARCHAR(10); +ALTER TABLE llx_adherent_type ADD morphy VARCHAR(3); ALTER TABLE llx_subscription ADD fk_type integer; -- Add url_id into unique index of bank_url From 7a84cb1fc8e0153d486f5661c7c1f556c3ea013a Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 14:03:37 +0100 Subject: [PATCH 0011/1036] Update type.php --- htdocs/adherents/type.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 31ce9768de1..9a241c027ab 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -58,7 +58,7 @@ if (! $sortorder) { $sortorder="DESC"; } if (! $sortfield) { $sortfield="d.lastname"; } $label=GETPOST("label", "alpha"); -$morphy=GETPOST("morphy","alpha"); +$morphy=GETPOST("morphy", "alpha"); $statut=GETPOST("statut", "int"); $subscription=GETPOST("subscription", "int"); $vote=GETPOST("vote", "int"); From 22ea6fa0ab56e5bd7ac0ff9084938fac5e06e1f7 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Wed, 27 Mar 2019 14:04:13 +0100 Subject: [PATCH 0012/1036] Update api_memberstypes.class.php --- htdocs/adherents/class/api_memberstypes.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php index 519a0cecfb3..c80a3c3fe6c 100644 --- a/htdocs/adherents/class/api_memberstypes.class.php +++ b/htdocs/adherents/class/api_memberstypes.class.php @@ -101,13 +101,13 @@ class MembersTypes extends DolibarrApi $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t"; $sql.= ' WHERE t.entity IN ('.getEntity('member_type').')'; - // Nature + // Nature if ($nature != 'all') { if ($nature == 'both') { $sql.= ' AND t.morphy IS NULL '; } else { - $sql.= ' AND (t.morphy IS NULL OR t.morphy = "'.$nature.'")'; - } + $sql.= ' AND (t.morphy IS NULL OR t.morphy = "'.$nature.'")'; + } } // Add sql filters From 64e91fa25b1ccfdb8ba510293fcf0582be0dec01 Mon Sep 17 00:00:00 2001 From: Cristian Torres Date: Wed, 27 Mar 2019 17:09:59 -0600 Subject: [PATCH 0013/1036] [CHANGE] Making State available in .odt templates... ...making use of the same strategy when loading Country info from single attribute. Previously attempted on PR #10463 which has been closed This also relates to #7428 --- htdocs/admin/company.php | 12 +++++++++++- htdocs/societe/class/societe.class.php | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index 949038b4413..1a5f963a46a 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -74,11 +74,21 @@ if ( ($action == 'update' && ! GETPOST("cancel",'alpha')) activateModulesRequiredByCountry($mysoc->country_code); } + $tmparray=getState(GETPOST('state_id','int'),'all',$db,$langs,0); + if (! empty($tmparray['id'])) + { + $mysoc->state_id =$tmparray['id']; + $mysoc->state_code =$tmparray['code']; + $mysoc->state_label=$tmparray['label']; + + $s=$mysoc->state_id.':'.$mysoc->state_code.':'.$mysoc->state_label; + dolibarr_set_const($db, "MAIN_INFO_SOCIETE_STATE", $s,'chaine',0,'',$conf->entity); + } + dolibarr_set_const($db, "MAIN_INFO_SOCIETE_NOM", GETPOST("nom",'nohtml'),'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_INFO_SOCIETE_ADDRESS", GETPOST("MAIN_INFO_SOCIETE_ADDRESS",'nohtml'),'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_INFO_SOCIETE_TOWN", GETPOST("MAIN_INFO_SOCIETE_TOWN",'nohtml'),'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_INFO_SOCIETE_ZIP", GETPOST("MAIN_INFO_SOCIETE_ZIP",'alpha'),'chaine',0,'',$conf->entity); - dolibarr_set_const($db, "MAIN_INFO_SOCIETE_STATE", GETPOST("state_id",'alpha'),'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_INFO_SOCIETE_REGION", GETPOST("region_code",'alpha'),'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_MONNAIE", GETPOST("currency",'aZ09'),'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_INFO_SOCIETE_TEL", GETPOST("tel",'alpha'),'chaine',0,'',$conf->entity); diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 38d07e8e4db..ba268b0b269 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3310,6 +3310,31 @@ class Societe extends CommonObject $this->country=$country_label; if (is_object($langs)) $this->country=($langs->trans('Country'.$country_code)!='Country'.$country_code)?$langs->trans('Country'.$country_code):$country_label; + //TODO This could be replicated for region but function `getRegion` didn't exist, so I didn't added it. + // We define state_id, state_code and state + $state_id=$state_code=$state_label=''; + if (! empty($conf->global->MAIN_INFO_SOCIETE_STATE)) + { + $tmp=explode(':',$conf->global->MAIN_INFO_SOCIETE_STATE); + $state_id=$tmp[0]; + if (! empty($tmp[1])) // If $conf->global->MAIN_INFO_SOCIETE_STATE is "id:code:label" + { + $state_code=$tmp[1]; + $state_label=$tmp[2]; + } + else // For backward compatibility + { + dol_syslog("Your state setup use an old syntax. Reedit it using setup area.", LOG_ERR); + include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; + $state_code=getState($state_id,2,$this->db); // This need a SQL request, but it's the old feature that should not be used anymore + $state_label=getState($state_id,0,$this->db); // This need a SQL request, but it's the old feature that should not be used anymore + } + } + $this->state_id=$state_id; + $this->state_code=$state_code; + $this->state=$state_label; + if (is_object($langs)) $this->state=($langs->trans('State'.$state_code)!='State'.$state_code)?$langs->trans('State'.$state_code):$state_label; + $this->phone=empty($conf->global->MAIN_INFO_SOCIETE_TEL)?'':$conf->global->MAIN_INFO_SOCIETE_TEL; $this->fax=empty($conf->global->MAIN_INFO_SOCIETE_FAX)?'':$conf->global->MAIN_INFO_SOCIETE_FAX; $this->url=empty($conf->global->MAIN_INFO_SOCIETE_WEB)?'':$conf->global->MAIN_INFO_SOCIETE_WEB; From 2da9cfbbe45404482dd208c32aa8c349acd7987c Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 1 Apr 2019 20:25:37 +0200 Subject: [PATCH 0014/1036] Update api_memberstypes.class.php --- htdocs/adherents/class/api_memberstypes.class.php | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php index c80a3c3fe6c..1b477fd567c 100644 --- a/htdocs/adherents/class/api_memberstypes.class.php +++ b/htdocs/adherents/class/api_memberstypes.class.php @@ -79,7 +79,6 @@ class MembersTypes extends DolibarrApi * * @param string $sortfield Sort field * @param string $sortorder Sort order - * @param string $nature Nature of type phy, mor or both (for only both not mor or phy only) * @param int $limit Limit for list * @param int $page Page number * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.libelle:like:'SO-%') and (t.subscription:=:'1')" @@ -87,7 +86,7 @@ class MembersTypes extends DolibarrApi * * @throws RestException */ - public function index($sortfield = "t.rowid", $sortorder = 'ASC', $nature = 'all', $limit = 100, $page = 0, $sqlfilters = '') + public function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $sqlfilters = '') { global $db, $conf; @@ -100,15 +99,6 @@ class MembersTypes extends DolibarrApi $sql = "SELECT t.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t"; $sql.= ' WHERE t.entity IN ('.getEntity('member_type').')'; - - // Nature - if ($nature != 'all') { - if ($nature == 'both') { - $sql.= ' AND t.morphy IS NULL '; - } else { - $sql.= ' AND (t.morphy IS NULL OR t.morphy = "'.$nature.'")'; - } - } // Add sql filters if ($sqlfilters) From abd8dca3eac7f4e56cf845a8a78e4ce42fc2e6be Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 1 Apr 2019 20:26:04 +0200 Subject: [PATCH 0015/1036] Update api_memberstypes.class.php --- htdocs/adherents/class/api_memberstypes.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php index 1b477fd567c..abfaf84993d 100644 --- a/htdocs/adherents/class/api_memberstypes.class.php +++ b/htdocs/adherents/class/api_memberstypes.class.php @@ -99,7 +99,7 @@ class MembersTypes extends DolibarrApi $sql = "SELECT t.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t"; $sql.= ' WHERE t.entity IN ('.getEntity('member_type').')'; - + // Add sql filters if ($sqlfilters) { From 29b31bd7abb03899ee590aabe2cee2e89114d87b Mon Sep 17 00:00:00 2001 From: ATM john Date: Thu, 11 Apr 2019 00:38:44 +0200 Subject: [PATCH 0016/1036] New title button first step --- htdocs/comm/action/peruser.php | 5 +- htdocs/compta/facture/list.php | 5 +- htdocs/don/list.php | 3 +- htdocs/fourn/facture/list.php | 5 +- htdocs/theme/eldy/btn.inc.php | 189 +++++++++++++++++++++++++++ htdocs/theme/eldy/global.inc.php | 138 +------------------ htdocs/theme/eldy/theme_vars.inc.php | 2 +- 7 files changed, 204 insertions(+), 143 deletions(-) create mode 100644 htdocs/theme/eldy/btn.inc.php diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index e5ade3fdf55..6afbccefe65 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -367,8 +367,9 @@ if ($user->rights->agenda->myactions->create || $user->rights->agenda->allaction //$param='month='.$monthshown.'&year='.$year; $hourminsec='100000'; - $newcardbutton = ''.$langs->trans("AddAction").''; - $newcardbutton.= ''; + $newcardbutton = ''; + $newcardbutton.= ''; + $newcardbutton.= ''.$langs->trans("AddAction").''; $newcardbutton.= ''; } diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 749a0b28cfb..a41f8aaf93c 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -594,8 +594,9 @@ if ($resql) $newcardbutton=''; if($user->rights->facture->creer) { - $newcardbutton=''.$langs->trans('NewBill').''; - $newcardbutton.= ''; + $newcardbutton=''; + $newcardbutton.= ''; + $newcardbutton.= ''.$langs->trans('NewBill').''; $newcardbutton.= ''; } diff --git a/htdocs/don/list.php b/htdocs/don/list.php index e68b4e46399..46384f3569c 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -142,8 +142,9 @@ if ($resql) $newcardbutton=''; if ($user->rights->don->creer) { - $newcardbutton=''.$langs->trans('NewDonation').''; + $newcardbutton=''; $newcardbutton.= ''; + $newcardbutton.= ''.$langs->trans('NewDonation').''; $newcardbutton.= ''; } diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 608759e1531..c857fbddefa 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -466,8 +466,9 @@ if ($resql) $newcardbutton=''; if ($user->rights->fournisseur->facture->creer) { - $newcardbutton=''.$langs->trans('NewBill').''; - $newcardbutton.= ''; + $newcardbutton =''; + $newcardbutton.= ''; + $newcardbutton.= ''.$langs->trans('NewBill').''; $newcardbutton.= ''; } diff --git a/htdocs/theme/eldy/btn.inc.php b/htdocs/theme/eldy/btn.inc.php new file mode 100644 index 00000000000..160c86b98ea --- /dev/null +++ b/htdocs/theme/eldy/btn.inc.php @@ -0,0 +1,189 @@ + +/* '; - print ' + print '
'; -
-
'; + print ''; print ''."\n"; print ''."\n"; @@ -1860,41 +1878,60 @@ if (preg_match('/^dopayment/', $action)) print ''; print ''; - print ' - - -
'; + if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION) || ! empty($paymentintent)) + { + print ' + + +
'; + + if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) + { + print '
'; + } + + print ' +
+ + '; + + if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) + { + print '
'; + } + + print '
+ +
+ + + + +
+ +
'; + + print ''; + print ''; + + print ' +
'; + } if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) { - print '
'; + if (empty($paymentintent)) + { + print '
'.$langs->trans("Error").'
'; + } + else + { + print ''; + //$_SESSION["paymentintent_id"] = $paymentintent->id; + } } - print ' -
- - '; - - if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) - { - print '
'; - } - - print '
- -
- - - - -
'; - - print '
- - -
- -
'."\n"; + print ''."\n"; print ''."\n"; @@ -1931,7 +1968,6 @@ if (preg_match('/^dopayment/', $action)) }; var cardElement = elements.create('card', {style: style}); - var cardholderName = document.getElementById('cardholder-name'); // Add an instance of the card Element into the `card-element`
cardElement.mount('#card-element'); @@ -1940,44 +1976,70 @@ if (preg_match('/^dopayment/', $action)) cardElement.addEventListener('change', function(event) { var displayError = document.getElementById('card-errors'); if (event.error) { - console.log("Show event error"); + console.log("Show event error (like 'Incorrect card number', ...)"); displayError.textContent = event.error.message; } else { - console.log("No error"); + console.log("Reset error message"); displayError.textContent = ''; } }); // Handle form submission + var cardholderName = document.getElementById('cardholder-name'); var cardButton = document.getElementById('buttontopay'); var clientSecret = cardButton.dataset.secret; cardButton.addEventListener('click', function(event) { - stripe.handleCardPayment( - clientSecret, cardElement, { - source_data: { - owner: { - name: cardholderName.value, + console.log("We click on buttontopay"); + event.preventDefault(); + + if (cardholderName.value == '') + { + console.log("Field Card holder is empty"); + var displayError = document.getElementById('card-errors'); + displayError.textContent = 'trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CardOwner"))); ?>'; + } + else + { + stripe.handleCardPayment( + clientSecret, cardElement, { + payment_method_data: { + billing_details: { + name: cardholderName.value + , email: '', + thirdparty)) { ?>, phone: thirdparty->phone; ?>', + thirdparty)) { + print ', address: {'."\n"; + print ' city: '.$object->thirdparty->town.','; + print ' country: '.$object->thirdparty->country_code.','; + print ' line1: '.$object->thirdparty->address.','; + print ' postal_code: '.$object->thirdparty->zip; + print '}'."\n"; + } ?> + } /* TODO Add all other known data like emails, ... to be SCA compliant */ + }, + save_payment_method: false } - } + ).then(function(result) { + console.log(result); + if (result.error) { + console.log("Error on result of handleCardPayment"); + jQuery('#buttontopay').show(); + jQuery('#hourglasstopay').hide(); + // Inform the user if there was an error + var errorElement = document.getElementById('card-errors'); + errorElement.textContent = result.error.message; + } else { + // The payment has succeeded. Display a success message. + console.log("No error on result of handleCardPayment, so we submit the form"); + // Submit the form + jQuery('#buttontopay').hide(); + jQuery('#hourglasstopay').show(); + // Send form (action=charge that will do nothing) + jQuery('#payment-form').submit(); + } + }); } - ).then(function(result) { - jQuery('#buttontopay').hide(); - jQuery('#hourglasstopay').show(); - if (result.error) { - console.log("Error on result of handleCardPayment"); - jQuery('#buttontopay').show(); - jQuery('#hourglasstopay').hide(); - // Inform the user if there was an error - var errorElement = document.getElementById('card-errors'); - errorElement.textContent = result.error.message; - } else { - console.log("No error on result of handleCardPayment, so we submit the form"); - // Submit the form - jQuery('#buttontopay').hide(); - jQuery('#hourglasstopay').show(); - } - }); }); diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php index 62d709fc674..52413921f90 100644 --- a/htdocs/public/payment/paymentok.php +++ b/htdocs/public/payment/paymentok.php @@ -280,7 +280,7 @@ $fulltag = $FULLTAG; $tmptag=dolExplodeIntoArray($fulltag, '.', '='); -dol_syslog("ispaymentok=".$ispaymentok, LOG_DEBUG, 0, '_payment'); +dol_syslog("ispaymentok=".$ispaymentok." tmptag=".var_export($tmptag, true), LOG_DEBUG, 0, '_payment'); // Make complementary actions @@ -296,7 +296,7 @@ if ($ispaymentok) $user->rights->facture->creer = 1; $user->rights->adherent->cotisation->creer = 1; - if (in_array('MEM', array_keys($tmptag))) + if (array_key_exists('MEM', $tmptag) && $tmptag['MEM'] > 0) { // Validate member // Create subscription @@ -583,7 +583,7 @@ if ($ispaymentok) $ispostactionok = -1; } } - elseif (in_array('INV', array_keys($tmptag))) + elseif (array_key_exists('INV', $tmptag) && $tmptag['INV'] > 0) { // Record payment include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; @@ -769,14 +769,14 @@ if ($ispaymentok) $urlback=$_SERVER["REQUEST_URI"]; $topic='['.$appli.'] '.$companylangs->transnoentitiesnoconv("NewOnlinePaymentReceived"); $content=""; - if (in_array('MEM', array_keys($tmptag))) + if (array_key_exists('MEM', $tmptag)) { $url=$urlwithroot."/adherents/subscription.php?rowid=".$tmptag['MEM']; $content.=''.$companylangs->trans("PaymentSubscription")."

\n"; $content.=$companylangs->trans("MemberId").': '.$tmptag['MEM']."
\n"; $content.=$companylangs->trans("Link").': '.$url.''."
\n"; } - elseif (in_array('INV', array_keys($tmptag))) + elseif (array_key_exists('INV', $tmptag)) { $url=$urlwithroot."/compta/facture/card.php?id=".$tmptag['INV']; $content.=''.$companylangs->trans("Payment")."

\n"; diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 1f2f39719a8..ee1c1a67f0a 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -243,6 +243,7 @@ class Stripe extends CommonObject * @param double $amount Amount * @param string $currency_code Currency code * @param string $tag Tag + * @param string $description Description * @param Societe $object Object to pay with Stripe * @param string $customer Stripe customer ref 'cus_xxxxxxxxxxxxx' via customerStripe() * @param string $key ''=Use common API. If not '', it is the Stripe connect account 'acc_....' to use Stripe connect @@ -252,10 +253,14 @@ class Stripe extends CommonObject * @param boolean $confirmnow false=default, true=try to confirm immediatly after create (if conditions are ok) * @return \Stripe\PaymentIntent|null Stripe PaymentIntent or null if not found */ - public function getPaymentIntent($amount, $currency_code, $tag, $object = null, $customer = null, $key = null, $status = 0, $usethirdpartyemailforreceiptemail = 0, $mode = 'automatic', $confirmnow = false) + public function getPaymentIntent($amount, $currency_code, $tag, $description = '', $object = null, $customer = null, $key = null, $status = 0, $usethirdpartyemailforreceiptemail = 0, $mode = 'automatic', $confirmnow = false) { global $conf, $user, $mysoc; + dol_syslog("getPaymentIntent"); + + $error = 0; + if (empty($status)) $service = 'StripeTest'; else $service = 'StripeLive'; @@ -305,6 +310,7 @@ class Stripe extends CommonObject } catch(Exception $e) { + $error++; $this->error = $e->getMessage(); } } @@ -314,9 +320,6 @@ class Stripe extends CommonObject if (empty($paymentintent)) { $ipaddress=getUserRemoteIP(); - // Not enough space for a ref so we store id. Also with multicompany we can have same ref for 2 different - // object and we need a unique (this is used later as idempotency_key) - $description=$tag; $metadata = array('dol_version'=>DOL_VERSION, 'dol_entity'=>$conf->entity, 'ipaddress'=>$ipaddress); if (is_object($object)) { @@ -330,12 +333,14 @@ class Stripe extends CommonObject "amount" => $stripeamount, "currency" => $currency_code, "payment_method_types" => ["card"], - "statement_descriptor" => dol_trunc($description, 10, 'right', 'UTF-8', 1), // 22 chars that appears on bank receipt (company + description) + "description" => $description, + "statement_descriptor" => dol_trunc($tag, 10, 'right', 'UTF-8', 1), // 22 chars that appears on bank receipt (company + description) "metadata" => $metadata ); if (! is_null($customer)) $dataforintent["customer"]=$customer; // save_payment_method = true, // payment_method = + //var_dump($dataforintent); if ($conf->entity!=$conf->global->STRIPECONNECT_PRINCIPAL && $fee>0) { @@ -353,9 +358,12 @@ class Stripe extends CommonObject if (empty($key)) { // If the Stripe connect account not set, we use common API usage $paymentintent = \Stripe\PaymentIntent::create($dataforintent, array("idempotency_key" => "$description")); + //$paymentintent = \Stripe\PaymentIntent::create($dataforintent, array()); } else { $paymentintent = \Stripe\PaymentIntent::create($dataforintent, array("idempotency_key" => "$description", "stripe_account" => $key)); + //$paymentintent = \Stripe\PaymentIntent::create($dataforintent, array("stripe_account" => $key)); } + //var_dump($paymentintent); // Store the payment intent if (is_object($object)) @@ -366,6 +374,7 @@ class Stripe extends CommonObject $resql = $this->db->query($sql); if (! $resql) { + $error++; $this->error = $this->db->lasterror(); dol_syslog(get_class($this) . "::PaymentIntent failed to insert paymentintent with id=".$paymentintent->id." into database."); } @@ -377,10 +386,18 @@ class Stripe extends CommonObject } catch(Exception $e) { + /*var_dump($dataforintent); + var_dump($description); + var_dump($key); + var_dump($paymentintent); + var_dump($e->getMessage());*/ + $error++; $this->error = $e->getMessage(); } } + dol_syslog("getPaymentIntent return error=".$error); + return $paymentintent; } diff --git a/htdocs/stripe/lib/stripe.lib.php b/htdocs/stripe/lib/stripe.lib.php index d806d6a39b3..100ce840e24 100644 --- a/htdocs/stripe/lib/stripe.lib.php +++ b/htdocs/stripe/lib/stripe.lib.php @@ -87,12 +87,12 @@ function showStripePaymentUrl($type, $ref) * @param string $freetag Free tag * @return string Url string */ -function getStripePaymentUrl($mode, $type, $ref = '', $amount = '9.99', $freetag = 'your_free_tag') +function getStripePaymentUrl($mode, $type, $ref = '', $amount = '9.99', $freetag = 'your_tag') { global $conf; $ref=str_replace(' ', '', $ref); - + if ($type == 'free') { $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?amount='.($mode?'':'').$amount.($mode?'':'').'&tag='.($mode?'':'').$freetag.($mode?'':''); diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index b8ffa08fbaf..7302191fc84 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -132,19 +132,27 @@ input.smallpadd { /* Used for timesheet input */ input.buttongen { vertical-align: middle; } -input.buttonpayment { +input.buttonpayment, button.buttonpayment, div.buttonpayment { min-width: 320px; margin-bottom: 15px; background-image: none; line-height: 24px; padding: 8px; background: none; - padding-left: 38px; - text-align: ; - border: 1px solid #ddd; - background-color: #eee; + text-align: center; + border: 0; + background-color: #9999bb; white-space: normal; - box-shadow: 1px 1px 8px #bbb; + box-shadow: 1px 1px 4px #bbb; + color: #fff; + border-radius: 4px; +} +div.buttonpayment input { + background-color: unset; + color: #fff; + border-bottom: unset; + font-weight: bold; + text-transform: uppercase; } input.buttonpaymentcb { background-image: url(); @@ -3569,6 +3577,7 @@ div#card-errors { color: #fa755a; text-align: center; padding-top: 3px; + max-width: 320px; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 755736eb79f..2906da3729c 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -352,18 +352,25 @@ input.smallpadd { /* Used for timesheet input */ input.buttongen { vertical-align: middle; } -input.buttonpayment { +input.buttonpayment, button.buttonpayment, div.buttonpayment { min-width: 320px; margin-bottom: 15px; background-image: none; line-height: 24px; padding: 8px; background: none; - padding-left: 30px; - text-align: ; + text-align: center; border: 2px solid #ccc; background-color: #eee; white-space: normal; + color: #888 !important; +} +div.buttonpayment input { + background-color: unset; + border-bottom: unset; + font-weight: bold; + text-transform: uppercase; + color: #333; } input.buttonpaymentcb { background-image: url(); @@ -3660,6 +3667,7 @@ div#card-errors { color: #fa755a; text-align: center; padding-top: 3px; + max-width: 320px; } From e0c3cf8360a03d7c1ed1705a7b1c02840893821d Mon Sep 17 00:00:00 2001 From: atm-greg Date: Fri, 3 May 2019 10:24:49 +0200 Subject: [PATCH 0235/1036] fix project link for stock correction --- htdocs/product/stock/tpl/stockcorrection.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/stock/tpl/stockcorrection.tpl.php b/htdocs/product/stock/tpl/stockcorrection.tpl.php index 3d2e1c99e9b..4a9f23301a8 100644 --- a/htdocs/product/stock/tpl/stockcorrection.tpl.php +++ b/htdocs/product/stock/tpl/stockcorrection.tpl.php @@ -100,7 +100,7 @@ if (empty($conf) || ! is_object($conf)) { print ''.$langs->trans('Project').''; print ''; - $formproject->select_projects(0, '', 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth300'); + $formproject->select_projects(-1, '', 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth300'); print ''; } print ''; From ab3ad77704aaea548c00bab00f24c85b87fe8262 Mon Sep 17 00:00:00 2001 From: ATM-Nicolas Date: Fri, 3 May 2019 10:55:51 +0200 Subject: [PATCH 0236/1036] FIX : Sale representative column didn't increase nbfield variable on proposal list --- htdocs/comm/propal/list.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index a253b1e2eb1..24c53d26526 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -968,6 +968,7 @@ if ($resql) print ' '; } print ''; + if (! $i) $totalarray['nbfield']++; } // Extra fields From 01ea4c28cff6efe403c310ad5718fb03f70965c7 Mon Sep 17 00:00:00 2001 From: Joa Date: Fri, 3 May 2019 11:02:37 +0200 Subject: [PATCH 0237/1036] adding hooks loading for form customization to card.php of adherents module --- htdocs/adherents/card.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 5d57208eb0e..850537356ee 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -1059,6 +1059,13 @@ else // Other attributes include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; + //Hooks here + $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + //print $hookmanager->resPrint; //it double prints? + if (empty($reshook)) + { + print $object->showOptionals($extrafields, 'edit'); + } print ''; print "\n"; @@ -1357,9 +1364,15 @@ else // Other attributes include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; - + //Hooks here + $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + //print $hookmanager->resPrint; //it double prints? + if (empty($reshook)) + { + print $object->showOptionals($extrafields, 'edit'); + } + print ''; - dol_fiche_end(); print '
'; From 9115df743944e10464ae61cbdd1b5193c78f7477 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 3 May 2019 11:25:53 +0200 Subject: [PATCH 0238/1036] Debug v10 --- htdocs/admin/dict.php | 46 +++++++++++-------------- htdocs/core/modules/modTicket.class.php | 7 ++-- htdocs/fourn/facture/card.php | 2 +- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index ae4fde1876b..ab5803a086a 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -652,6 +652,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) if ($fieldnamekey == 'sortorder') $fieldnamekey = 'SortOrder'; if ($fieldnamekey == 'category_type') $fieldnamekey = 'Calculated'; if ($fieldnamekey == 'revenuestamp_type') $fieldnamekey = 'TypeOfRevenueStamp'; + if ($fieldnamekey == 'use_default') $fieldnamekey = 'UseByDefault'; setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities($fieldnamekey)), null, 'errors'); } @@ -1053,11 +1054,12 @@ if ($id) continue; } - // Determine le nom du champ par rapport aux noms possibles - // dans les dictionnaires de donnees + // Define field friedly name from its technical name $valuetoshow=ucfirst($fieldlist[$field]); // Par defaut $valuetoshow=$langs->trans($valuetoshow); // try to translate $class=''; + + if ($fieldlist[$field]=='pos') { $valuetoshow=$langs->trans("Position"); $class='width100'; } if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } if ($fieldlist[$field]=='taux') { @@ -1125,6 +1127,7 @@ if ($id) if ($fieldlist[$field]=='range_ik') { $valuetoshow=$langs->trans("RangeIk"); } if ($fieldlist[$field]=='fk_c_exp_tax_cat') { $valuetoshow=$langs->trans("CarCategory"); } if ($fieldlist[$field]=='revenuestamp_type') { $valuetoshow=$langs->trans('TypeOfRevenueStamp'); } + if ($fieldlist[$field]=='use_default') { $valuetoshow=$langs->trans('Default'); } if ($id == 2) // Special cas for state page { @@ -1197,8 +1200,10 @@ if ($id) print ''; + print '
'; + print '
'; print ''; print ''; @@ -1221,7 +1226,7 @@ if ($id) print '
'; print ''; - // Title line with search boxes + // Title line with search input fields print ''; $filterfound=0; foreach ($fieldlist as $field => $value) @@ -1276,17 +1281,12 @@ if ($id) // dans les dictionnaires de donnees $showfield=1; // By defaut $align="left"; + $cssprefix=''; $sortable=1; - $valuetoshow=''; - /* - $tmparray=getLabelOfField($fieldlist[$field]); - $showfield=$tmp['showfield']; - $valuetoshow=$tmp['valuetoshow']; - $align=$tmp['align']; - $sortable=$tmp['sortable']; - */ $valuetoshow=ucfirst($fieldlist[$field]); // By defaut $valuetoshow=$langs->trans($valuetoshow); // try to translate + + // Special cases if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } if ($fieldlist[$field]=='taux') { @@ -1304,10 +1304,7 @@ if ($id) if ($fieldlist[$field]=='code') { $valuetoshow=$langs->trans("Code"); } if ($fieldlist[$field]=='position') { $align='right'; } if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') { $valuetoshow=$langs->trans("Label"); } - if ($fieldlist[$field]=='libelle_facture') { - //$valuetoshow=$form->textwithtooltip($langs->trans("LabelOnDocuments"), $langs->trans("LabelUsedByDefault"),2,1,img_help(1,'')); - $valuetoshow=$langs->trans("LabelOnDocuments"); - } + if ($fieldlist[$field]=='libelle_facture') { $valuetoshow=$langs->trans("LabelOnDocuments"); } if ($fieldlist[$field]=='country') { $valuetoshow=$langs->trans("Country"); } if ($fieldlist[$field]=='recuperableonly') { $valuetoshow=$langs->trans("NPR"); $align="center"; } if ($fieldlist[$field]=='nbjour') { $valuetoshow=$langs->trans("NbOfDays"); } @@ -1316,7 +1313,6 @@ if ($id) if ($fieldlist[$field]=='width' || $fieldlist[$field]=='nx') { $valuetoshow=$langs->trans("Width"); } if ($fieldlist[$field]=='height' || $fieldlist[$field]=='ny') { $valuetoshow=$langs->trans("Height"); } if ($fieldlist[$field]=='unit' || $fieldlist[$field]=='metric') { $valuetoshow=$langs->trans("MeasuringUnit"); } - if ($fieldlist[$field]=='region_id' || $fieldlist[$field]=='country_id') { $showfield=0; } if ($fieldlist[$field]=='accountancy_code'){ $valuetoshow=$langs->trans("AccountancyCode"); } if ($fieldlist[$field]=='accountancy_code_sell'){ $valuetoshow=$langs->trans("AccountancyCodeSell"); $sortable=0; } if ($fieldlist[$field]=='accountancy_code_buy'){ $valuetoshow=$langs->trans("AccountancyCodeBuy"); $sortable=0; } @@ -1347,11 +1343,14 @@ if ($id) if ($fieldlist[$field]=='range_ik') { $valuetoshow=$langs->trans("RangeIk"); } if ($fieldlist[$field]=='fk_c_exp_tax_cat') { $valuetoshow=$langs->trans("CarCategory"); } if ($fieldlist[$field]=='revenuestamp_type') { $valuetoshow=$langs->trans('TypeOfRevenueStamp'); } + if ($fieldlist[$field]=='use_default') { $valuetoshow=$langs->trans('Default'); } - // Affiche nom du champ + if ($fieldlist[$field]=='region_id' || $fieldlist[$field]=='country_id') { $showfield=0; } + + // Show field title if ($showfield) { - print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable?$fieldlist[$field]:''), ($page?'page='.$page.'&':''), $param, "align=".$align, $sortfield, $sortorder); + print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable?$fieldlist[$field]:''), ($page?'page='.$page.'&':''), $param, "align=".$align, $sortfield, $sortorder, $cssprefix); } } // Favorite - Only activated on country dictionary @@ -1806,7 +1805,6 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') if (in_array('region_id', $fieldlist)) { print ''; continue; } // For state page, we do not show the country input (we link to region, not country) @@ -1912,7 +1910,7 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') print ''; } elseif ($fieldlist[$field] == 'code' && isset($obj->{$fieldlist[$field]})) { - print ''; + print ''; } elseif ($fieldlist[$field]=='unit') { print ''; + print ''; } /* From 6797c951644e2cea922d42c2495d5a9295e175de Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 3 May 2019 12:10:29 +0200 Subject: [PATCH 0239/1036] Fix syntax error --- .../accountancy/bookkeeping/thirdparty_lettering_supplier.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index 3795099c78d..fab30066982 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -197,7 +197,7 @@ if ($resql) { print ''; print ''; - $letteringbutton = '\'; + $letteringbutton = ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies', 0, $letteringbutton, '', $limit); From 61547e3f824c8c68c9a800a8cace7c1857b14cfe Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Fri, 3 May 2019 14:08:20 +0200 Subject: [PATCH 0240/1036] NEW Manage account sell_intra & sell_export in page default product --- htdocs/accountancy/admin/productaccount.php | 141 +++++++++++++++----- htdocs/langs/en_US/accountancy.lang | 4 + 2 files changed, 111 insertions(+), 34 deletions(-) diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 537eddfceb4..bd79791f709 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -1,6 +1,6 @@ - * Copyright (C) 2013-2016 Alexandre Spangaro + * Copyright (C) 2013-2019 Alexandre Spangaro * Copyright (C) 2014 Florian Henry * Copyright (C) 2014 Juanjo Menent * Copyright (C) 2015 Ari Elbaz (elarifr) @@ -111,6 +111,8 @@ if ($action == 'update') { $accounting_product_modes = array ( 'ACCOUNTANCY_SELL', + 'ACCOUNTANCY_SELL_INTRA', + 'ACCOUNTANCY_SELL_EXPORT', 'ACCOUNTANCY_BUY' ); @@ -158,6 +160,12 @@ if ($action == 'update') { if ($accounting_product_mode == 'ACCOUNTANCY_SELL') { $sql .= " SET accountancy_code_sell = " . $accounting->account_number; } + if ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') { + $sql .= " SET accountancy_code_sell_intra = " . $accounting->account_number; + } + if ($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') { + $sql .= " SET accountancy_code_sell_export = " . $accounting->account_number; + } $sql .= " WHERE rowid = " . $productid; dol_syslog("/accountancy/admin/productaccount.php sql=" . $sql, LOG_DEBUG); @@ -193,15 +201,19 @@ $form = new FormAccounting($db); // so we need to get those default value rowid first $accounting = new AccountingAccount($db); // TODO: we should need to check if result is a really exist accountaccount rowid..... -$aarowid_servbuy = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT, 1); -$aarowid_prodbuy = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT, 1); -$aarowid_servsell = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT, 1); -$aarowid_prodsell = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT, 1); +$aarowid_servbuy = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT, 1); +$aarowid_prodbuy = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT, 1); +$aarowid_servsell = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT, 1); +$aarowid_prodsell = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT, 1); +$aarowid_prodsell_intra = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT, 1); +$aarowid_prodsell_export = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT, 1); -$aacompta_servbuy = (! empty($conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT : $langs->trans("CodeNotDef")); -$aacompta_prodbuy = (! empty($conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT : $langs->trans("CodeNotDef")); -$aacompta_servsell = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); -$aacompta_prodsell = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); +$aacompta_servbuy = (! empty($conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT : $langs->trans("CodeNotDef")); +$aacompta_prodbuy = (! empty($conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT : $langs->trans("CodeNotDef")); +$aacompta_servsell = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); +$aacompta_prodsell = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); +$aacompta_prodsell_intra = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT : $langs->trans("CodeNotDef")); +$aacompta_prodsell_export = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT : $langs->trans("CodeNotDef")); llxHeader('', $langs->trans("ProductsBinding")); @@ -209,27 +221,45 @@ $pcgverid = $conf->global->CHARTOFACCOUNTS; $pcgvercode = dol_getIdFromCode($db, $pcgverid, 'accounting_system', 'rowid', 'pcg_version'); if (empty($pcgvercode)) $pcgvercode=$pcgverid; -$sql = "SELECT p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.accountancy_code_sell, p.accountancy_code_buy, p.tms, p.fk_product_type as product_type,"; +$sql = "SELECT p.rowid, p.ref, p.label, p.description, p.tosell, p.tobuy, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.tms, p.fk_product_type as product_type,"; $sql.= " aa.rowid as aaid"; $sql.= " FROM " . MAIN_DB_PREFIX . "product as p"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."accounting_account as aa ON"; if ($accounting_product_mode == 'ACCOUNTANCY_BUY') { $sql.=" p.accountancy_code_buy = aa.account_number AND aa.fk_pcg_version = '" . $pcgvercode . "'"; } -else +elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') { $sql.=" p.accountancy_code_sell = aa.account_number AND aa.fk_pcg_version = '" . $pcgvercode . "'"; } +elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') +{ + $sql.=" p.accountancy_code_sell_intra = aa.account_number AND aa.fk_pcg_version = '" . $pcgvercode . "'"; +} +else +{ + $sql.=" p.accountancy_code_sell_intra = aa.account_number AND aa.fk_pcg_version = '" . $pcgvercode . "'"; +} $sql.= ' WHERE p.entity IN ('.getEntity('product').')'; if ($accounting_product_mode == 'ACCOUNTANCY_BUY') { if (strlen(trim($search_current_account))) { $sql .= natural_search("p.accountancy_code_buy", $search_current_account); } -} else { +} elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') { if (strlen(trim($search_current_account))) { $sql .= natural_search("p.accountancy_code_sell", $search_current_account); } } +elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') { + if (strlen(trim($search_current_account))) { + $sql .= natural_search("p.accountancy_code_sell_intra", $search_current_account); + } +} +else { + if (strlen(trim($search_current_account))) { + $sql .= natural_search("p.accountancy_code_sell_export", $search_current_account); + } +} if ($search_current_account_valid == 'withoutvalidaccount') { $sql .= " AND aa.account_number IS NULL"; @@ -280,7 +310,7 @@ if ($result) if ($search_current_account > 0) $param.="&search_current_account=".urlencode($search_current_account); if ($search_current_account_valid && $search_current_account_valid != '-1') $param.="&search_current_account_valid=".urlencode($search_current_account_valid); if ($accounting_product_mode) $param.='&accounting_product_mode='.urlencode($accounting_product_mode); - + print ''; if ($optioncss != '') print ''; print ''; @@ -301,9 +331,15 @@ if ($result) print ''; print ''; print "\n"; - print ''; + print ''; print '\n"; + print ''; + print '\n"; + print ''; + print '\n"; print ''; print '\n"; print "
'; - //print join(',',$fieldlist); print ''; @@ -1972,12 +1970,8 @@ function fieldList($fieldlist, $obj = '', $tabname = '', $context = '') $classtd=''; $class=''; if ($fieldlist[$field]=='code') $classtd='width100'; - if ($fieldlist[$field]=='affect') $class='maxwidth50'; - if ($fieldlist[$field]=='delay') $class='maxwidth50'; - if ($fieldlist[$field]=='position') $class='maxwidth50'; - if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') $class='quatrevingtpercent'; - if ($fieldlist[$field]=='tracking') $class='quatrevingtpercent'; - if ($fieldlist[$field]=='sortorder' || $fieldlist[$field]=='sens' || $fieldlist[$field]=='category_type') $class='maxwidth50'; + if (in_array($fieldlist[$field], array('pos', 'use_default', 'affect', 'delay', 'position', 'sortorder', 'sens', 'category_type'))) $class='maxwidth50'; + if (in_array($fieldlist[$field], array('libelle', 'label', 'tracking'))) $class='quatrevingtpercent'; print ''; $transfound=0; if (in_array($fieldlist[$field], array('label','libelle'))) diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php index 5aef264a11e..871bc94670d 100644 --- a/htdocs/core/modules/modTicket.class.php +++ b/htdocs/core/modules/modTicket.class.php @@ -120,15 +120,16 @@ class modTicket extends DolibarrModules } $this->dictionaries = array( 'langs' => 'ticket', - 'tabname' => array(MAIN_DB_PREFIX . "c_ticket_type", MAIN_DB_PREFIX . "c_ticket_category", MAIN_DB_PREFIX . "c_ticket_severity"), - 'tablib' => array("TicketDictType", "TicketDictCategory", "TicketDictSeverity"), - 'tabsql' => array('SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default FROM ' . MAIN_DB_PREFIX . 'c_ticket_type as f', 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default FROM ' . MAIN_DB_PREFIX . 'c_ticket_category as f', 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default FROM ' . MAIN_DB_PREFIX . 'c_ticket_severity as f'), + 'tabname' => array(MAIN_DB_PREFIX . "c_ticket_type", MAIN_DB_PREFIX . "c_ticket_severity", MAIN_DB_PREFIX . "c_ticket_category"), + 'tablib' => array("TicketDictType", "TicketDictSeverity", "TicketDictCategory"), + 'tabsql' => array('SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default FROM ' . MAIN_DB_PREFIX . 'c_ticket_type as f', 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default FROM ' . MAIN_DB_PREFIX . 'c_ticket_severity as f', 'SELECT f.rowid as rowid, f.code, f.pos, f.label, f.active, f.use_default FROM ' . MAIN_DB_PREFIX . 'c_ticket_category as f'), 'tabsqlsort' => array("pos ASC", "pos ASC", "pos ASC"), 'tabfield' => array("pos,code,label,use_default", "pos,code,label,use_default", "pos,code,label,use_default"), 'tabfieldvalue' => array("pos,code,label,use_default", "pos,code,label,use_default", "pos,code,label,use_default"), 'tabfieldinsert' => array("pos,code,label,use_default", "pos,code,label,use_default", "pos,code,label,use_default"), 'tabrowid' => array("rowid", "rowid", "rowid"), 'tabcond' => array($conf->ticket->enabled, $conf->ticket->enabled, $conf->ticket->enabled), + 'tabhelp' => array(array('code'=>$langs->trans("EnterAnyCode"), 'use_default'=>$langs->trans("Enter0or1")), array('code'=>$langs->trans("EnterAnyCode"), 'use_default'=>$langs->trans("Enter0or1")), array('code'=>$langs->trans("EnterAnyCode"), 'use_default'=>$langs->trans("Enter0or1"))), ); // Boxes diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 5c47aa41f40..f7a1c800443 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2789,7 +2789,7 @@ else } else { - print '
'.$langs->trans("None").'
'.$langs->trans("None").'
' . $langs->trans('Options') . '' . $langs->trans('Description') . '
' . $langs->trans('OptionModeProductSell') . '
' . $langs->trans('OptionModeProductSell') . ''.$langs->trans('OptionModeProductSellDesc'); print "
' . $langs->trans('OptionModeProductSellIntra') . ''.$langs->trans('OptionModeProductSellIntraDesc'); + print "
' . $langs->trans('OptionModeProductSellExport') . ''.$langs->trans('OptionModeProductSellExportDesc'); + print "
' . $langs->trans('OptionModeProductBuy') . ''.$langs->trans('OptionModeProductBuyDesc')."
\n"; @@ -318,9 +354,9 @@ if ($result) $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields - $buttonsave = ''; - //print '
'.$buttonsave.'
'; - + $buttonsave = ''; + //print '
'.$buttonsave.'
'; + $texte=$langs->trans("ListOfProductsServices"); print_barre_liste($texte, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $buttonsave, $num, $nbtotalofrecords, '', 0, '', '', $limit); @@ -332,7 +368,7 @@ if ($result) print ''; if (! empty($conf->global->ACCOUNTANCY_SHOW_PROD_DESC)) print ''; // On sell - if ($accounting_product_mode == 'ACCOUNTANCY_SELL') print ''; + if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') print ''; // On buy if ($accounting_product_mode == 'ACCOUNTANCY_BUY') print ''; // Current account @@ -352,10 +388,19 @@ if ($result) print_liste_field_titre("Ref", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Label", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder); if (! empty($conf->global->ACCOUNTANCY_SHOW_PROD_DESC)) print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "p.description", "", $param, '', $sortfield, $sortorder); - if ($accounting_product_mode == 'ACCOUNTANCY_SELL') print_liste_field_titre("OnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center '); - if ($accounting_product_mode == 'ACCOUNTANCY_BUY') print_liste_field_titre("OnBuy", $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'center '); - if ($accounting_product_mode == 'ACCOUNTANCY_BUY') $fieldtosortaccount="p.accountancy_code_buy"; - else $fieldtosortaccount="p.accountancy_code_sell"; + if ($accounting_product_mode == 'ACCOUNTANCY_SELL') { + print_liste_field_titre("OnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center '); + $fieldtosortaccount="p.accountancy_code_sell"; + } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') { + print_liste_field_titre("OnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center '); + $fieldtosortaccount="p.accountancy_code_sell_intra"; + } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') { + print_liste_field_titre("OnSell", $_SERVER["PHP_SELF"], "p.tosell", "", $param, '', $sortfield, $sortorder, 'center '); + $fieldtosortaccount="p.accountancy_code_sell_export"; + } else { + if ($accounting_product_mode == 'ACCOUNTANCY_BUY') print_liste_field_titre("OnBuy", $_SERVER["PHP_SELF"], "p.tobuy", "", $param, '', $sortfield, $sortorder, 'center '); + $fieldtosortaccount="p.accountancy_code_buy"; + } print_liste_field_titre("CurrentDedicatedAccountingAccount", $_SERVER["PHP_SELF"], $fieldtosortaccount, "", $param, '', $sortfield, $sortorder); print_liste_field_titre("AssignDedicatedAccountingAccount"); $clickpitco=$form->showCheckAddButtons('checkforselect', 1); @@ -378,10 +423,16 @@ if ($result) $product_static->status = $obj->tosell; $product_static->status_buy = $obj->tobuy; - if ($obj->product_type == 0) { + if ($obj->product_type == 0 && $accounting_product_mode == 'ACCOUNTANCY_SELL') { $compta_prodsell = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); $compta_prodsell_id = $aarowid_prodsell; - } else { + } elseif ($obj->product_type == 0 && $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') { + $compta_prodsell = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT : $langs->trans("CodeNotDef")); + $compta_prodsell_id = $aarowid_prodsell_intra; + } elseif ($obj->product_type == 0 && $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') { + $compta_prodsell = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT : $langs->trans("CodeNotDef")); + $compta_prodsell_id = $aarowid_prodsell_export; + } else { $compta_prodsell = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef")); $compta_prodsell_id = $aarowid_servsell; } @@ -411,7 +462,7 @@ if ($result) print '' . nl2br(dol_trunc($obj->description, $trunclengh)) . ''; } - if ($accounting_product_mode == 'ACCOUNTANCY_SELL') + if ($accounting_product_mode == 'ACCOUNTANCY_SELL' || $accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA' || $accounting_product_mode == 'ACCOUNTANCY_SELL_EXPORT') print ''.$product_static->getLibStatut(3, 0).''; if ($accounting_product_mode == 'ACCOUNTANCY_BUY') @@ -422,12 +473,16 @@ if ($result) if ($accounting_product_mode == 'ACCOUNTANCY_BUY') { print length_accountg($obj->accountancy_code_buy); if ($obj->accountancy_code_buy && empty($obj->aaid)) print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount")); - } - else - { - print length_accountg($obj->accountancy_code_sell); - if ($obj->accountancy_code_sell && empty($obj->aaid)) print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount")); - } + } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') { + print length_accountg($obj->accountancy_code_sell); + if ($obj->accountancy_code_sell && empty($obj->aaid)) print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount")); + } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') { + print length_accountg($obj->accountancy_code_sell_intra); + if ($obj->accountancy_code_sell_intra && empty($obj->aaid)) print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount")); + } else { + print length_accountg($obj->accountancy_code_sell_export); + if ($obj->accountancy_code_sell_export && empty($obj->aaid)) print ' '.img_warning($langs->trans("ValueNotIntoChartOfAccount")); + } print ''; // Dedicated account @@ -441,7 +496,7 @@ if ($result) if (! empty($obj->aaid)) $defaultvalue = ''; // Do not suggest default new value is code is already valid print $form->select_account($defaultvalue, 'codeventil_' . $product_static->id, 1, array(), 1); print ''; - } else { + } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL') { // Accounting account sell print ''; //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code @@ -451,7 +506,26 @@ if ($result) if (! empty($obj->aaid)) $defaultvalue = ''; // Do not suggest default new value is code is already valid print $form->select_account($defaultvalue, 'codeventil_' . $product_static->id, 1, array(), 1); print ''; - } + } elseif ($accounting_product_mode == 'ACCOUNTANCY_SELL_INTRA') { + // Accounting account sell intra (In EEC) + print ''; + //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code + if (empty($defaultvalue)) $defaultvalue=$compta_prodsell; + $codesell=length_accountg($obj->accountancy_code_sell_intra); + //var_dump($defaultvalue.' - '.$codesell.' - '.$compta_prodsell); + if (! empty($obj->aaid)) $defaultvalue = ''; // Do not suggest default new value is code is already valid + print $form->select_account($defaultvalue, 'codeventil_' . $product_static->id, 1, array(), 1); + print ''; + } else { + // Accounting account sell export (Out of EEC) + print ''; + //$defaultvalue=GETPOST('codeventil_' . $product_static->id,'alpha'); This is id and we need a code + if (empty($defaultvalue)) $defaultvalue=$compta_prodsell; + $codesell=length_accountg($obj->accountancy_code_sell_export); + if (! empty($obj->aaid)) $defaultvalue = ''; // Do not suggest default new value is code is already valid + print $form->select_account($defaultvalue, 'codeventil_' . $product_static->id, 1, array(), 1); + print ''; + } // Checkbox select print ''; @@ -462,7 +536,6 @@ if ($result) print ''; print '
'; - // Example : Adding jquery code print ''; + } + } + } + return $out; } diff --git a/htdocs/core/tpl/admin_extrafields_add.tpl.php b/htdocs/core/tpl/admin_extrafields_add.tpl.php index 45c620db456..04720004492 100644 --- a/htdocs/core/tpl/admin_extrafields_add.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_add.tpl.php @@ -107,7 +107,7 @@ $langs->load("modulebuilder"); else if (type == 'link') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").show();jQuery("#helppassword").hide();} else if (type == 'separate') { langfile.val('').prop('disabled',true);size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); required.val('').prop('disabled', true); - jQuery("#value_choice").hide();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide(); + jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide();jQuery("#helppassword").hide(); } else { // type = string size.val('').prop('disabled', true); diff --git a/htdocs/core/tpl/admin_extrafields_edit.tpl.php b/htdocs/core/tpl/admin_extrafields_edit.tpl.php index 1ba83bc393f..7ed41af9281 100644 --- a/htdocs/core/tpl/admin_extrafields_edit.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_edit.tpl.php @@ -103,7 +103,7 @@ $langs->load("modulebuilder"); else if (type == 'checkbox') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); jQuery("#value_choice").show();jQuery("#helpselect").show();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide();jQuery("#helppassword").hide();} else if (type == 'chkbxlst') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").show();jQuery("#helplink").hide();jQuery("#helppassword").hide();} else if (type == 'link') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").show();jQuery("#helppassword").hide();} - else if (type == 'separate') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); required.val('').prop('disabled', true); default_value.val('').prop('disabled', true); jQuery("#value_choice").hide();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide();jQuery("#helppassword").hide();} + else if (type == 'separate') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); required.val('').prop('disabled', true); default_value.val('').prop('disabled', true); jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide();jQuery("#helppassword").hide();} else { // type = string size.val('').prop('disabled', true); unique.removeAttr('disabled'); @@ -173,7 +173,7 @@ if((($type == 'select') || ($type == 'checkbox') || ($type == 'radio')) && is_ar } } } -elseif (($type== 'sellist') || ($type == 'chkbxlst') || ($type == 'link') || ($type == 'password')) +elseif (($type== 'sellist') || ($type == 'chkbxlst') || ($type == 'link') || ($type == 'password') || ($type == 'separate')) { $paramlist=array_keys($param['options']); $param_chain = $paramlist[0]; diff --git a/htdocs/core/tpl/extrafields_view.tpl.php b/htdocs/core/tpl/extrafields_view.tpl.php index db0d6a4897d..00a617a3e6c 100644 --- a/htdocs/core/tpl/extrafields_view.tpl.php +++ b/htdocs/core/tpl/extrafields_view.tpl.php @@ -48,8 +48,8 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e //var_dump($extrafields->attributes[$object->table_element]); if (empty($reshook) && is_array($extrafields->attributes[$object->table_element]['label'])) - { + $extrafields_collapse_num = ''; foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $label) { // Discard if extrafield is a hidden field on form @@ -86,11 +86,25 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] } if ($extrafields->attributes[$object->table_element]['type'][$key] == 'separate') { + $extrafields_collapse_num = ''; + $extrafield_param = $extrafields->attributes[$object->table_element]['param'][$key]; + if (!empty($extrafield_param) && is_array($extrafield_param)) { + $extrafield_param_list = array_keys($extrafield_param['options']); + + if (count($extrafield_param_list)>0) { + $extrafield_collapse_display_value = intval($extrafield_param_list[0]); + + if ($extrafield_collapse_display_value==1 || $extrafield_collapse_display_value==2) { + $extrafields_collapse_num = $extrafields->attributes[$object->table_element]['pos'][$key]; + } + } + } + print $extrafields->showSeparator($key, $object); } else { - print ''; + print ''; print ''; print ''; print ''; From 24775fec1b0457d8815c79d1fe82893717140d62 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 3 May 2019 17:06:57 +0200 Subject: [PATCH 0244/1036] FIX footer public ticket page --- htdocs/public/ticket/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/public/ticket/index.php b/htdocs/public/ticket/index.php index 5e241c4edfb..05b992b3e40 100644 --- a/htdocs/public/ticket/index.php +++ b/htdocs/public/ticket/index.php @@ -36,6 +36,7 @@ require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Load translation files required by the page From 78c18b1961038824612f32cccd50dae027e98684 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 3 May 2019 17:11:13 +0200 Subject: [PATCH 0245/1036] Fix footer on view ticket page --- htdocs/public/ticket/view.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/htdocs/public/ticket/view.php b/htdocs/public/ticket/view.php index c7ee74715c3..a0311ce1430 100644 --- a/htdocs/public/ticket/view.php +++ b/htdocs/public/ticket/view.php @@ -39,6 +39,9 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Load translation files required by the page $langs->loadLangs(array("companies","other","ticket")); @@ -318,6 +321,11 @@ if ($action == "view_ticket" || $action == "add_message" || $action == "close" | print "\n"; } +print ""; + // End of page -llxFooter(); +htmlPrintOnlinePaymentFooter($mysoc, $langs, 1, $suffix, $object); + +llxFooter('', 'public'); + $db->close(); From a3bb37eb84af97d7f19996beff4994371b848608 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 3 May 2019 17:13:58 +0200 Subject: [PATCH 0246/1036] FIX footer on list ticket page --- htdocs/public/ticket/list.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/htdocs/public/ticket/list.php b/htdocs/public/ticket/list.php index c9786268f4f..443af658cb5 100644 --- a/htdocs/public/ticket/list.php +++ b/htdocs/public/ticket/list.php @@ -38,6 +38,9 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Load translation files required by the page $langs->loadLangs(array("companies","other","ticket")); @@ -696,6 +699,11 @@ if ($action == "view_ticketlist") print "\n"; } +print ""; + // End of page -llxFooter(); +htmlPrintOnlinePaymentFooter($mysoc, $langs, 1, $suffix, $object); + +llxFooter('', 'public'); + $db->close(); From 965cf0410fd175f8f03e3afd4934572a355f5c61 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 3 May 2019 17:16:04 +0200 Subject: [PATCH 0247/1036] Fix footer in create ticket page --- htdocs/public/ticket/create_ticket.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/public/ticket/create_ticket.php b/htdocs/public/ticket/create_ticket.php index 206dc65acd7..42774772eb5 100644 --- a/htdocs/public/ticket/create_ticket.php +++ b/htdocs/public/ticket/create_ticket.php @@ -33,6 +33,9 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/ticket/class/actions_ticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formticket.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/ticket.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; @@ -366,7 +369,8 @@ if ($action != "infos_success") { print ''; // End of page +htmlPrintOnlinePaymentFooter($mysoc, $langs, 1, $suffix, $object); -llxFooter(''); +llxFooter('', 'public'); $db->close(); From 476d15868cbfeb63fdb2675e94f0dc7080e49e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9onard?= Date: Sat, 4 May 2019 06:25:53 +0200 Subject: [PATCH 0248/1036] Fix civility translation in dutch dict language file --- htdocs/langs/nl_NL/dict.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/nl_NL/dict.lang b/htdocs/langs/nl_NL/dict.lang index 0243032a0fe..dd8a3ec9ad1 100644 --- a/htdocs/langs/nl_NL/dict.lang +++ b/htdocs/langs/nl_NL/dict.lang @@ -250,7 +250,7 @@ CountryMF=Saint Martin ##### Civilities ##### CivilityMME=Mevrouw -CivilityMR=Meneer +CivilityMR=De Heer CivilityMLE=Mejuffrouw CivilityMTRE=Meester CivilityDR=Dokter From a7a8eb3648b2d0a634d76583c24249ee19924900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9onard?= Date: Sat, 4 May 2019 06:33:23 +0200 Subject: [PATCH 0249/1036] Add customer code in customer orders documents --- htdocs/core/modules/commande/doc/pdf_einstein.modules.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index 9d73384cf3a..0aada45f7f0 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -1320,6 +1320,14 @@ class pdf_einstein extends ModelePDFCommandes $pdf->SetTextColor(0, 0, 60); $pdf->MultiCell(100, 3, $outputlangs->transnoentities("OrderDate")." : " . dol_print_date($object->date, "%d %b %Y", false, $outputlangs, true), '', 'R'); + if ($object->thirdparty->code_client) + { + $posy+=4; + $pdf->SetXY($posx, $posy); + $pdf->SetTextColor(0, 0, 60); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("CustomerCode")." : " . $outputlangs->transnoentities($object->thirdparty->code_client), '', 'R'); + } + // Get contact if (!empty($conf->global->DOC_SHOW_FIRST_SALES_REP)) { From 8d659d8078b23992ca49263865f12bf4f4e75a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9onard?= Date: Sat, 4 May 2019 07:12:13 +0200 Subject: [PATCH 0250/1036] Fix date format in customer orders documents --- htdocs/core/modules/commande/doc/pdf_einstein.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index 9d73384cf3a..0be2f169153 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -1318,7 +1318,7 @@ class pdf_einstein extends ModelePDFCommandes $posy+=4; $pdf->SetXY($posx, $posy); $pdf->SetTextColor(0, 0, 60); - $pdf->MultiCell(100, 3, $outputlangs->transnoentities("OrderDate")." : " . dol_print_date($object->date, "%d %b %Y", false, $outputlangs, true), '', 'R'); + $pdf->MultiCell(100, 3, $outputlangs->transnoentities("OrderDate")." : " . dol_print_date($object->date, "day", false, $outputlangs, true), '', 'R'); // Get contact if (!empty($conf->global->DOC_SHOW_FIRST_SALES_REP)) From 4b8083832cf013fe3f40edcb16e82a2986e9a162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 4 May 2019 10:13:44 +0200 Subject: [PATCH 0251/1036] Update thirdparty_lettering_customer.php --- .../bookkeeping/thirdparty_lettering_customer.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php index 640fa657ffe..931754bc266 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php @@ -4,7 +4,7 @@ * Copyright (C) 2013 Olivier Geffroy * Copyright (C) 2013 Florian Henry * Copyright (C) 2013-2019 Alexandre Spangaro - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018-2019 Frédéric France * * 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 @@ -239,7 +239,7 @@ if ($resql) { print_liste_field_titre("Balancing", $_SERVER["PHP_SELF"], "", "", $param, "", $sortfield, $sortorder); print_liste_field_titre("Codejournal", $_SERVER["PHP_SELF"], "bk.code_journal", "", $param, "", $sortfield, $sortorder, 'center '); print_liste_field_titre("LetteringCode", $_SERVER["PHP_SELF"], "bk.lettering_code", "", $param, "", $sortfield, $sortorder, 'center '); - print_liste_field_titre("", "","",'','',"",$sortfield,$sortorder,'maxwidthsearch center '); + print_liste_field_titre("", "", "", '', '', "", $sortfield, $sortorder, 'maxwidthsearch center '); print "\n"; $solde = 0; @@ -268,7 +268,7 @@ if ($resql) { if (empty($obj->lettering_code)) { print ''; - print '' . "\n"; } else { From 4e9b9b61d8bf488ba386f0c3701f709c0439bc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 4 May 2019 10:16:27 +0200 Subject: [PATCH 0252/1036] Update thirdparty_lettering_supplier.php --- .../bookkeeping/thirdparty_lettering_supplier.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index e73e27efaeb..4b038a6147e 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -4,7 +4,7 @@ * Copyright (C) 2013 Olivier Geffroy * Copyright (C) 2013 Florian Henry * Copyright (C) 2013-2019 Alexandre Spangaro - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018-2019 Frédéric France * * 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 @@ -237,7 +237,7 @@ if ($resql) { print_liste_field_titre("Balancing", $_SERVER["PHP_SELF"], "", "", $param, "", $sortfield, $sortorder); print_liste_field_titre("Codejournal", $_SERVER["PHP_SELF"], "bk.code_journal", "", $param, "", $sortfield, $sortorder, 'center '); print_liste_field_titre("LetteringCode", $_SERVER["PHP_SELF"], "bk.lettering_code", "", $param, "", $sortfield, $sortorder, 'center '); - print_liste_field_titre("", "","",'','',"",$sortfield,$sortorder,'maxwidthsearch center '); + print_liste_field_titre("", "", "", '', '', "", $sortfield, $sortorder, 'maxwidthsearch center '); print "\n"; $solde = 0; @@ -265,7 +265,7 @@ if ($resql) { if (empty($obj->lettering_code)) { print ''; - print '' . "\n"; } else { From fc520810b78f5fca846009588248e888668f4d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 4 May 2019 10:17:04 +0200 Subject: [PATCH 0253/1036] Update thirdparty_lettering_customer.php --- .../accountancy/bookkeeping/thirdparty_lettering_customer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php index 931754bc266..910ba310792 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php @@ -268,7 +268,7 @@ if ($resql) { if (empty($obj->lettering_code)) { print ''; - print '' . "\n"; } else { From c595a591a2173f253470b78297df1ad560108a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 4 May 2019 10:37:29 +0200 Subject: [PATCH 0254/1036] Update thirdparty_lettering_customer.php --- .../accountancy/bookkeeping/thirdparty_lettering_customer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php index 910ba310792..2dbbd42988f 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php @@ -262,8 +262,8 @@ if ($resql) { // Journal $accountingjournal = new AccountingJournal($db); - $result = $accountingjournal->fetch('',$obj->code_journal); - $journaltoshow = (($result > 0)?$accountingjournal->getNomUrl(0,0,0,'',0) : $obj->code_journal); + $result = $accountingjournal->fetch('', $obj->code_journal); + $journaltoshow = (($result > 0)?$accountingjournal->getNomUrl(0, 0, 0, '', 0) : $obj->code_journal); print ''; if (empty($obj->lettering_code)) { From 0c5d9de13fbcb3d241d3b31614d9c1718a0ee583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 4 May 2019 10:38:49 +0200 Subject: [PATCH 0255/1036] Update thirdparty_lettering_supplier.php --- .../accountancy/bookkeeping/thirdparty_lettering_supplier.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index 4b038a6147e..5d5ebf06843 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -259,8 +259,8 @@ if ($resql) { // Journal $accountingjournal = new AccountingJournal($db); - $result = $accountingjournal->fetch('',$obj->code_journal); - $journaltoshow = (($result > 0)?$accountingjournal->getNomUrl(0,0,0,'',0) : $obj->code_journal); + $result = $accountingjournal->fetch('', $obj->code_journal); + $journaltoshow = (($result > 0)?$accountingjournal->getNomUrl(0, 0, 0, '', 0) : $obj->code_journal); print ''; if (empty($obj->lettering_code)) { From 8927b37ae2bb16b5a67bbfbcf648eef51a81a65e Mon Sep 17 00:00:00 2001 From: Sof Date: Sat, 4 May 2019 11:18:14 +0200 Subject: [PATCH 0256/1036] FIX : Fatal Errors "Countable array" and Class "Facture" not found --- htdocs/projet/tasks/time.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 9ce431d889b..e8d7506c313 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -29,6 +29,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; @@ -1054,7 +1055,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields - $selectedfields.=(count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); + $selectedfields.=(is_array($arrayofmassactions) && count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); print '
'; print '
'; + print ''; print img_edit(); print '
'; + print ''; print img_edit(); print ''; + print ''; print img_edit(); print '' . $journaltoshow . '' . $journaltoshow . '
'."\n"; From 648b2506abd78e7708df22e956fb3d0edfa2059a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 4 May 2019 11:45:31 +0200 Subject: [PATCH 0257/1036] FIX visible ref on contract link for old contract without ref --- htdocs/contrat/class/contrat.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 9bd2d022ace..316983a5d0a 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1939,7 +1939,7 @@ class Contrat extends CommonObject if ($user->rights->contrat->lire) { $label = ''.$langs->trans("ShowContract").''; - $label .= '
'.$langs->trans('Ref').': '.$this->ref; + $label .= '
'.$langs->trans('Ref').': '.($this->ref?$this->ref:$this->id); $label .= '
'.$langs->trans('RefCustomer').': '.($this->ref_customer ? $this->ref_customer : $this->ref_client); $label .= '
'.$langs->trans('RefSupplier').': '.$this->ref_supplier; if (!empty($this->total_ht)) { @@ -1971,7 +1971,7 @@ class Contrat extends CommonObject $result .= $linkstart; if ($withpicto) $result.=img_object(($notooltip?'':$label), $this->picto, ($notooltip?(($withpicto != 2) ? 'class="paddingright"' : ''):'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip?0:1); - if ($withpicto != 2) $result.= $this->ref; + if ($withpicto != 2) $result.= ($this->ref?$this->ref:$this->id); $result .= $linkend; return $result; From d7504bb3f690f1087328dbaf70d706222dbceb51 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sat, 4 May 2019 12:00:14 +0200 Subject: [PATCH 0258/1036] Fix variable error php with constant main.inc.php --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index fa3a8c1cd43..f195d5f945e 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1920,7 +1920,7 @@ function left_menu($menu_array_before, $helppagename = '', $notused = '', $menu_ } else { - if (is_array(arrayresult)) + if (is_array($arrayresult)) { foreach($arrayresult as $key => $val) { From 9c69c8acc7db9fc27f1dcce206c2e9b2a3691814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn?= Date: Sat, 4 May 2019 12:08:28 +0200 Subject: [PATCH 0259/1036] trying to pass travis check --- htdocs/adherents/card.php | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 850537356ee..17ccdb0c546 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -1060,17 +1060,16 @@ else // Other attributes include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; //Hooks here - $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - //print $hookmanager->resPrint; //it double prints? - if (empty($reshook)) - { + $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + //print $hookmanager->resPrint; //it double prints? + if (empty($reshook)) + { print $object->showOptionals($extrafields, 'edit'); - } - - print '
'; + } + + print ''; print "
\n"; - - dol_fiche_end(); + dol_fiche_end(); print '
'; print ''; @@ -1365,12 +1364,12 @@ else // Other attributes include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php'; //Hooks here - $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - //print $hookmanager->resPrint; //it double prints? - if (empty($reshook)) - { + $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + //print $hookmanager->resPrint; //it double prints? + if (empty($reshook)) + { print $object->showOptionals($extrafields, 'edit'); - } + } print ''; dol_fiche_end(); From 9aed9359adc5017d31de8e2169d225f412ce4b1d Mon Sep 17 00:00:00 2001 From: Supermanu Date: Sat, 4 May 2019 12:22:45 +0200 Subject: [PATCH 0260/1036] FIX: Remove link between categories and project when deleting --- htdocs/projet/class/project.class.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 09eadbbc8ea..8ebe6f71425 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -688,6 +688,18 @@ class Project extends CommonObject } } + // Remove linked categories. + if (! $error) { + $sql = "DELETE FROM ".MAIN_DB_PREFIX. "categorie_project"; + $sql.= " WHERE fk_project = ". $this->id; + + $result = $this->db->query($sql); + if (! $result) { + $error++; + $this->errors[] = $this->db->lasterror(); + } + } + // Fetch tasks $this->getLinesArray($user); From 60bf3452c3acc4d216392753fca134fadd14d78a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 4 May 2019 12:26:54 +0200 Subject: [PATCH 0261/1036] Hide export in EEC for non european countries --- htdocs/accountancy/admin/productaccount.php | 11 +++++++---- htdocs/langs/en_US/accountancy.lang | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index bd79791f709..80c2ed052c0 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -200,7 +200,7 @@ $form = new FormAccounting($db); // at this time ACCOUNTING_SERVICE_SOLD_ACCOUNT & ACCOUNTING_PRODUCT_SOLD_ACCOUNT are account number not accountingacount rowid // so we need to get those default value rowid first $accounting = new AccountingAccount($db); -// TODO: we should need to check if result is a really exist accountaccount rowid..... +// TODO: we should need to check if result is already exists accountaccount rowid..... $aarowid_servbuy = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT, 1); $aarowid_prodbuy = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_BUY_ACCOUNT, 1); $aarowid_servsell = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT, 1); @@ -334,9 +334,12 @@ if ($result) print ' ' . $langs->trans('OptionModeProductSell') . ''; print ''.$langs->trans('OptionModeProductSellDesc'); print "\n"; - print ' ' . $langs->trans('OptionModeProductSellIntra') . ''; - print ''.$langs->trans('OptionModeProductSellIntraDesc'); - print "\n"; + if ($mysoc->isInEEC()) + { + print ' ' . $langs->trans('OptionModeProductSellIntra') . ''; + print ''.$langs->trans('OptionModeProductSellIntraDesc'); + print "\n"; + } print ' ' . $langs->trans('OptionModeProductSellExport') . ''; print ''.$langs->trans('OptionModeProductSellExportDesc'); print "\n"; diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 92b78223a60..c441d71ef3d 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -300,12 +300,12 @@ DefaultBindingDesc=This page can be used to set a default account to use to link DefaultClosureDesc=This page can be used to set parameters to use to enclose a balance sheet. Options=Options OptionModeProductSell=Mode sales -OptionModeProductSellIntra=Mode sales in EEC -OptionModeProductSellExport=Mode sales out of EEC +OptionModeProductSellIntra=Mode sales exported in EEC +OptionModeProductSellExport=Mode sales exported in other countries OptionModeProductBuy=Mode purchases OptionModeProductSellDesc=Show all products with accounting account for sales. OptionModeProductSellIntraDesc=Show all products with accounting account for sales in EEC. -OptionModeProductSellExportDesc=Show all products with accounting account for sales out of EEC. +OptionModeProductSellExportDesc=Show all products with accounting account for other foreign sales. OptionModeProductBuyDesc=Show all products with accounting account for purchases. CleanFixHistory=Remove accounting code from lines that not exists into charts of account CleanHistory=Reset all bindings for selected year From 5caae1f50d06d87e3272e2751717d77fcf0e08f2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 4 May 2019 12:42:16 +0200 Subject: [PATCH 0262/1036] css --- htdocs/theme/eldy/global.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 7302191fc84..012346ede0b 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2651,6 +2651,9 @@ tr.liste_titre_filter td.liste_titre { padding-top: 1px; padding-bottom: 0px; } +tr.liste_titre_filter td.liste_titre:first-of-type { +/* height: 36px; */ +} .liste_titre_create td, .liste_titre_create th, .liste_titre_create .tagtd { border-bottom-width: 0 !important; From e01476e10b5b5e4a4b813d8077ea0f4abeed2d4d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 4 May 2019 13:03:18 +0200 Subject: [PATCH 0263/1036] CSS --- htdocs/index.php | 2 +- htdocs/theme/eldy/global.inc.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/index.php b/htdocs/index.php index ce59ad4f476..1faa29665ce 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -563,7 +563,7 @@ $boxwork.=''."\n"; $nbworkboardempty=0; if (! empty($valid_dashboardlines)) { - $boxwork.='
'; + $boxwork.='
'; foreach($valid_dashboardlines as $board) { diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 012346ede0b..18ca2e4f100 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2959,6 +2959,9 @@ form.pair, form.impair { form.tagtr:last-of-type div.tagtd, tr.pair:last-of-type td, tr.impair:last-of-type td { border-bottom: 0px !important; } +tr.nobottom td { + border-bottom: 0px !important; +} div.tableforcontact form.tagtr:last-of-type div.tagtd { border-bottom: 1px solid #ddd !important; } From e42caf1dd97773739deb7cbecf990dc24265d094 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 4 May 2019 14:54:25 +0200 Subject: [PATCH 0264/1036] CSS --- htdocs/index.php | 4 +--- htdocs/theme/eldy/global.inc.php | 12 +++++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/index.php b/htdocs/index.php index 1faa29665ce..3d813c35118 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -121,7 +121,7 @@ if (empty($user->societe_id)) $boxstat.='
'.$langs->trans("DolibarrStateBoard").'
'; $boxstat.=''; $boxstat.=''; - $boxstat.=''; + $boxstat.=''; $object=new stdClass(); $parameters=array(); @@ -602,8 +602,6 @@ if (! empty($valid_dashboardlines)) $boxwork .='
'; $boxwork .='
'; $boxwork .='
'; - $boxwork .='
'; - $boxwork .='
'; $boxwork .='
'; $boxwork .=''; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 18ca2e4f100..83e2989256f 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1447,8 +1447,7 @@ li.menuhider:hover { background-image: none !important; } li.tmenusel, li.tmenu:hover { - background: rgba(0, 0, 0, 0.1); - /* background: rgb(); */ + /* background: rgba(0, 0, 0, 0.1); */ } li.tmenusel::after, li.tmenu:hover::after{ @@ -3150,7 +3149,7 @@ div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth- .noborder > tbody > tr:nth-child(even):not(:last-child) td:not(.liste_titre), .liste > tbody > tr:nth-child(even):not(:last-child) td:not(.liste_titre), .noborder .oddeven.tagtr:nth-child(even):not(:last-child) .tagtd:not(.liste_titre) { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #e0e0e0; } .noborder > tbody > tr:nth-child(odd):not(.liste_titre), .liste > tbody > tr:nth-child(odd):not(.liste_titre), @@ -3166,7 +3165,7 @@ div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth- .noborder > tbody > tr:nth-child(odd):not(:last-child) td:not(.liste_titre), .liste > tbody > tr:nth-child(odd):not(:last-child) td:not(.liste_titre), .noborder .oddeven.tagtr:nth-child(odd):not(:last-child) .tagtd:not(.liste_titre) { - border-bottom: 1px solid #ddd; + border-bottom: 1px solid #e0e0e0; } ul.noborder li:nth-child(even):not(.liste_titre) { @@ -3212,7 +3211,10 @@ ul.noborder li:nth-child(even):not(.liste_titre) { padding: 3px; } .boxstats { - padding: 3px; + padding-left: 3px; + padding-right: 3px; + padding-top: 2px; + padding-bottom: 2px; width: 121px; } .boxstatscontent { From 15dc5f9d2349b75c9aa154edc48be160e8c02ba1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 4 May 2019 16:46:09 +0200 Subject: [PATCH 0265/1036] Fix css --- htdocs/product/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 0a5508ae725..df2c466f1f0 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -1078,7 +1078,7 @@ if ($resql) // Date creation if (! empty($arrayfields['p.datec']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); print ''; if (! $i) $totalarray['nbfield']++; @@ -1086,7 +1086,7 @@ if ($resql) // Date modification if (! empty($arrayfields['p.tms']['checked'])) { - print ''; + print ''; print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); print ''; if (! $i) $totalarray['nbfield']++; From c94e62105925cf39035af0adb0977ce4c4bcf8d1 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sat, 4 May 2019 17:23:57 +0200 Subject: [PATCH 0266/1036] FIX : facnumber to ref report takepos --- htdocs/compta/cashcontrol/report.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/cashcontrol/report.php b/htdocs/compta/cashcontrol/report.php index 736090bd07b..04ff015a498 100644 --- a/htdocs/compta/cashcontrol/report.php +++ b/htdocs/compta/cashcontrol/report.php @@ -72,7 +72,7 @@ llxHeader('', $langs->trans("CashControl"), '', '', 0, 0, array(), array(), $par $sql.= " b.fk_account, b.fk_type,"; $sql.= " ba.rowid as bankid, ba.ref as bankref,"; $sql.= " bu.url_id,"; -$sql.= " f.module_source, f.facnumber as facnumber"; +$sql.= " f.module_source, f.ref as ref"; $sql.= " FROM "; //if ($bid) $sql.= MAIN_DB_PREFIX."bank_class as l,"; $sql.= " ".MAIN_DB_PREFIX."bank_account as ba,"; @@ -95,7 +95,7 @@ $sql.=" OR b.fk_account=".$conf->global->CASHDESK_ID_BANKACCOUNT_CB; $sql.=" OR b.fk_account=".$conf->global->CASHDESK_ID_BANKACCOUNT_CHEQUE; $sql.=")"; */ -$sql = "SELECT f.rowid as facid, f.facnumber, f.datef as do, pf.amount as amount, b.fk_account as bankid, cp.code"; +$sql = "SELECT f.rowid as facid, f.ref, f.datef as do, pf.amount as amount, b.fk_account as bankid, cp.code"; $sql.= " FROM ".MAIN_DB_PREFIX."paiement_facture as pf, ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."paiement as p, ".MAIN_DB_PREFIX."c_paiement as cp, ".MAIN_DB_PREFIX."bank as b"; $sql.= " WHERE pf.fk_facture = f.rowid AND p.rowid = pf.fk_paiement AND cp.id = p.fk_paiement AND p.fk_bank = b.rowid"; $sql.= " AND f.module_source = '".$db->escape($posmodule)."'"; From 703324357204ccfc9387d899f806d50d7ba34460 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 15:02:00 +0200 Subject: [PATCH 0267/1036] FIX url lettre max & colissimo --- htdocs/install/mysql/data/llx_c_shipment_mode.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/data/llx_c_shipment_mode.sql b/htdocs/install/mysql/data/llx_c_shipment_mode.sql index 56e8fe68a7e..d3f353ff016 100644 --- a/htdocs/install/mysql/data/llx_c_shipment_mode.sql +++ b/htdocs/install/mysql/data/llx_c_shipment_mode.sql @@ -31,8 +31,8 @@ -- INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (1,'CATCH','In-Store Collection','In-store collection by the customer','',1); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (2,'TRANS','Courier Service','Courier Service','',1); -INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (3,'COLSUI','Colissimo Suivi','Colissimo Suivi','http://www.colissimo.fr/portail_colissimo/suivre.do?colispart={TRACKID}',0); -INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (4,'LETTREMAX','Lettre Max','Courrier Suivi et Lettre Max','',0); +INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (3,'COLSUI','Colissimo Suivi','Colissimo Suivi','https://www.laposte.fr/outils/suivre-vos-envois?code={TRACKID}',0); +INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (4,'LETTREMAX','Lettre Max','Courrier Suivi et Lettre Max','https://www.laposte.fr/outils/suivre-vos-envois?code={TRACKID}',0); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (5,'UPS','UPS','United Parcel Service','http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber2=&InquiryNumber3=&tracknums_displayed=3&loc=fr_FR&TypeOfInquiryNumber=T&HTMLVersion=4.0&InquiryNumber22=&InquiryNumber32=&track=Track&Suivi.x=64&Suivi.y=7&Suivi=Valider&InquiryNumber1={TRACKID}',0); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (6,'KIALA','KIALA','Relais Kiala','http://www.kiala.fr/tnt/delivery/{TRACKID}',0); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (7,'GLS','GLS','General Logistics Systems','https://gls-group.eu/FR/fr/suivi-colis?match={TRACKID}',0); From f0fd0ece60d04d0213281f6d83fec5a3efd54d53 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 15:06:10 +0200 Subject: [PATCH 0268/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index e5b925b0d83..e4cdd9351e6 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -300,3 +300,5 @@ ALTER TABLE llx_inventorydet DROP COLUMN pmp; ALTER TABLE llx_inventorydet DROP COLUMN pa; ALTER TABLE llx_inventorydet DROP COLUMN new_pmp; +UPDATE llx_c_shipment_mode SET label = 'https://www.laposte.fr/outils/suivre-vos-envois?code={TRACKID}' WHERE code IN ('COLSUI'); +UPDATE llx_c_shipment_mode SET label = 'https://www.laposte.fr/outils/suivre-vos-envois?code={TRACKID}' WHERE code IN ('LETTREMAX'); From 11ece5603816221f531c35dbede74d84e61b58a0 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 19:08:27 +0200 Subject: [PATCH 0269/1036] NEW add API shipment mode --- htdocs/api/class/api_setup.class.php | 62 ++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 783ec6540e3..e3bb7f4a799 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -4,6 +4,7 @@ * Copyright (C) 2017 Regis Houssin * Copyright (C) 2017 Neil Orley * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018 Thibault FOUCART * * * This program is free software; you can redistribute it and/or modify @@ -706,6 +707,67 @@ class Setup extends DolibarrApi return $list; } + + /** + * Get the list of shipping methods. + * + * @param int $limit Number of items per page + * @param int $page Page number {@min 0} + * @param int $active Shipping methodsm is active or not {@min 0} {@max 1} + * @param string $sqlfilters SQL criteria to filter. Syntax example "(t.code:=:'CHQ')" + * + * @url GET dictionary/shipping_methods + * + * @return array List of shipping methods + * + * @throws 400 RestException + * @throws 200 OK + */ + public function getShippingModes($limit = 100, $page = 0, $active = 1, $sqlfilters = '') + { + $list = array(); + + $sql = "SELECT rowid as id, code, libelle as label, description, tracking, module"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_shipment_mode as t"; + $sql.= " WHERE t.entity IN (".getEntity('c_shipment_mode').")"; + $sql.= " AND t.active = ".$active; + // Add sql filters + if ($sqlfilters) + { + if (! DolibarrApi::_checkFilters($sqlfilters)) + { + throw new RestException(400, 'Error when validating parameter sqlfilters '.$sqlfilters); + } + $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; + $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + + //$sql.= $this->db->order($sortfield, $sortorder); + + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit, $offset); + } + + $result = $this->db->query($sql); + + if ($result) { + $num = $this->db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { + $list[] = $this->db->fetch_object($result); + } + } else { + throw new RestException(400, $this->db->lasterror()); + } + + return $list; + } /** * Get the list of tickets categories. From 15cff25bbc68738e6c11a7d12081fa7842c2f9b0 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 19:10:39 +0200 Subject: [PATCH 0270/1036] Update llx_c_shipment_mode.sql --- htdocs/install/mysql/tables/llx_c_shipment_mode.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/tables/llx_c_shipment_mode.sql b/htdocs/install/mysql/tables/llx_c_shipment_mode.sql index 7945c9f9fb0..efacec420c9 100644 --- a/htdocs/install/mysql/tables/llx_c_shipment_mode.sql +++ b/htdocs/install/mysql/tables/llx_c_shipment_mode.sql @@ -19,6 +19,7 @@ create table llx_c_shipment_mode ( rowid integer AUTO_INCREMENT PRIMARY KEY, + entity integer DEFAULT 1 NOT NULL, -- multi company id tms timestamp, code varchar(30) NOT NULL, libelle varchar(50) NOT NULL, From 499798b2e01b725b35027dd94dcc2dadf2bb2340 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 19:11:18 +0200 Subject: [PATCH 0271/1036] Update llx_c_shipment_mode.key.sql --- htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql b/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql index 15058c0630e..3a90d15330f 100644 --- a/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql +++ b/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql @@ -16,5 +16,5 @@ -- -- =================================================================== -ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (code); +ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (entity, code); From e65c8399e60b0310648bd8368dc48fd0c6428706 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 19:14:09 +0200 Subject: [PATCH 0272/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index e5b925b0d83..2e143209d9a 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -108,6 +108,8 @@ ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_id varchar(12 ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_site varchar(128) NULL; -- Fix if table exists +ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer; + ALTER TABLE llx_c_units DROP INDEX uk_c_units_code; ALTER TABLE llx_c_units ADD COLUMN scale integer; ALTER TABLE llx_c_units ADD COLUMN unit_type varchar(10); From a0ba8d98a1fee2b2d414c4a6ed137e792cfaa755 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 5 May 2019 20:54:31 +0200 Subject: [PATCH 0273/1036] Update api_setup.class.php --- htdocs/api/class/api_setup.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index e3bb7f4a799..78b794a996c 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -4,7 +4,7 @@ * Copyright (C) 2017 Regis Houssin * Copyright (C) 2017 Neil Orley * Copyright (C) 2018 Frédéric France - * Copyright (C) 2018 Thibault FOUCART + * Copyright (C) 2018 Thibault FOUCART * * * This program is free software; you can redistribute it and/or modify @@ -767,7 +767,7 @@ class Setup extends DolibarrApi } return $list; - } + } /** * Get the list of tickets categories. From 99b068b625a9118a80bb7fcd6b026c8cfe3441cb Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 5 May 2019 21:46:56 +0200 Subject: [PATCH 0274/1036] FIX sortfield on lettering function --- .../thirdparty_lettering_customer.php | 15 ++++++++++----- .../thirdparty_lettering_supplier.php | 18 ++++++++++++------ htdocs/societe/consumption.php | 2 +- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php index 87377a189a6..7d10acfa4cd 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php @@ -37,11 +37,12 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php'; // Load translation files required by the page $langs->loadLangs(array("compta","accountancy")); -$action = GETPOST('action', 'aZ09'); +$action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); -$confirm = GETPOST('confirm', 'alpha'); -$toselect = GETPOST('toselect', 'array'); +$confirm = GETPOST('confirm', 'alpha'); +$toselect = GETPOST('toselect', 'array'); +$socid = GETPOST('socid','int')?GETPOST('socid','int'):GETPOST('id','int'); $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST("sortfield", 'alpha'); @@ -186,21 +187,25 @@ if (! $resql) { exit(); } +$param=''; +$param.="&socid=".urlencode($socid); + $num = $db->num_rows($resql); dol_syslog("/accountancy/bookkeeping/thirdparty_lettering_customer.php", LOG_DEBUG); if ($resql) { $i = 0; + $param="&socid=".$socid; print ''; print ''; $letteringbutton = ''; - //$letteringbutton = '' . $langs->trans("Lettering") . ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies', 0, $letteringbutton, '', $limit); - print ""; + print '
'; + print '
'."\n"; /* print ''; diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index fab30066982..b7902efa3e6 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -37,11 +37,12 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php'; // Load translation files required by the page $langs->loadLangs(array("compta","accountancy")); -$action = GETPOST('action', 'aZ09'); +$action = GETPOST('action', 'aZ09'); $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); -$confirm = GETPOST('confirm', 'alpha'); -$toselect = GETPOST('toselect', 'array'); +$confirm = GETPOST('confirm', 'alpha'); +$toselect = GETPOST('toselect', 'array'); +$socid = GETPOST('socid','int')?GETPOST('socid','int'):GETPOST('id','int'); $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST("sortfield", 'alpha'); @@ -178,7 +179,7 @@ while ($obj = $db->fetch_object($resql)) { $sql.= $db->plimit($limit+1, $offset); -dol_syslog ( "/accountancy/bookkeeping/thirdparty_lettrage_supplier.php", LOG_DEBUG ); +dol_syslog ( "/accountancy/bookkeeping/thirdparty_lettering_supplier.php", LOG_DEBUG ); $resql = $db->query($sql); if (! $resql) { @@ -186,14 +187,18 @@ if (! $resql) exit; } +$param=''; +$param.="&socid=".urlencode($socid); + $num = $db->num_rows($resql); -dol_syslog ( "/accountancy/bookkeeping/thirdparty_lettrage_supplier.php", LOG_DEBUG ); +dol_syslog ( "/accountancy/bookkeeping/thirdparty_lettering_supplier.php", LOG_DEBUG ); $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); $i = 0; + $param="&socid=".$socid; print ''; print ''; @@ -201,7 +206,8 @@ if ($resql) { print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies', 0, $letteringbutton, '', $limit); - print "
"; + print '
'; + print '
'."\n"; /* print ''; diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index 3a3fb8507c9..dc8dbcbdba2 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -22,7 +22,7 @@ /** * \file htdocs/societe/consumption.php * \ingroup societe - * \brief Add a tab on thirpdarty view to list all products/services bought or sells by thirdparty + * \brief Add a tab on thirddarty view to list all products/services bought or sells by thirdparty */ require "../main.inc.php"; From c86318ea66f26a1c216c8bab34380322b2875703 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 5 May 2019 21:49:04 +0200 Subject: [PATCH 0275/1036] fix --- htdocs/societe/consumption.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index dc8dbcbdba2..ed8b3e41d4b 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -22,7 +22,7 @@ /** * \file htdocs/societe/consumption.php * \ingroup societe - * \brief Add a tab on thirddarty view to list all products/services bought or sells by thirdparty + * \brief Add a tab on thirdparty view to list all products/services bought or sells by thirdparty */ require "../main.inc.php"; From 2aafef4017b0927b947ba0fd5a26559e8bc6e12c Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 6 May 2019 10:27:13 +0200 Subject: [PATCH 0276/1036] NEW add multicurrency rate at currency list API --- htdocs/api/class/api_setup.class.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 783ec6540e3..8d5d6d581f9 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -448,6 +448,7 @@ class Setup extends DolibarrApi /** * Get the list of currencies. * + * @param int $multicurrency Multicurrency rates (0: no multicurrency, 1: last rate) {@min 0} {@max 1} * @param string $sortfield Sort field * @param string $sortorder Sort order * @param int $limit Number of items per page @@ -460,13 +461,22 @@ class Setup extends DolibarrApi * * @throws RestException */ - public function getListOfCurrencies($sortfield = "code_iso", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $sqlfilters = '') + public function getListOfCurrencies($multicurrency = 0, $sortfield = "code_iso", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $sqlfilters = '') { $list = array(); - //TODO link with multicurrency module $sql = "SELECT t.code_iso, t.label, t.unicode"; + if (!empty($multicurrency)) $sql.= " , cr.date_sync, cr.rate "; $sql.= " FROM ".MAIN_DB_PREFIX."c_currencies as t"; + if (!empty($multicurrency)) { + $sql.= " JOIN ".MAIN_DB_PREFIX."multicurrency as m ON m.code=t.code_iso"; + $sql.= " JOIN ".MAIN_DB_PREFIX."multicurrency_rate as cr ON (m.rowid = cr.fk_multicurrency)"; + } $sql.= " WHERE t.active = ".$active; + if (!empty($multicurrency)) { + $sql.= " AND m.entity IN (".getEntity('multicurrency').")"; + $sql.= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX."multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid)"; + } + // Add sql filters if ($sqlfilters) { From 650fbb2bbf7c8af2a193cb3736e7bff1a9d61d73 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 6 May 2019 10:55:11 +0200 Subject: [PATCH 0277/1036] Update api_setup.class.php --- htdocs/api/class/api_setup.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 8d5d6d581f9..386c04cdd9f 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -475,7 +475,7 @@ class Setup extends DolibarrApi if (!empty($multicurrency)) { $sql.= " AND m.entity IN (".getEntity('multicurrency').")"; $sql.= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX."multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid)"; - } + } // Add sql filters if ($sqlfilters) From 8bb4b3f33926b37a28d3599e08ab960075a441c4 Mon Sep 17 00:00:00 2001 From: Lionel VESSILLER Date: Mon, 6 May 2019 11:12:56 +0200 Subject: [PATCH 0278/1036] Fix contact address substitution before sending by mail in shipment card --- htdocs/core/tpl/card_presend.tpl.php | 49 ++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/htdocs/core/tpl/card_presend.tpl.php b/htdocs/core/tpl/card_presend.tpl.php index 27d6b8ca913..a8594ec1b62 100644 --- a/htdocs/core/tpl/card_presend.tpl.php +++ b/htdocs/core/tpl/card_presend.tpl.php @@ -210,10 +210,55 @@ if ($action == 'presend') ); complete_substitutions_array($substitutionarray, $outputlangs, $object, $parameters); - // Find the good contact adress + // Find the good contact address + $tmpobject = $object; + if (($object->element == 'shipping'|| $object->element == 'reception')) { + $origin = $object->origin; + $origin_id = $object->origin_id; + + if (!empty($origin) && !empty($origin_id)) { + $element = $subelement = $origin; + if (preg_match('/^([^_]+)_([^_]+)/i', $origin, $regs)) { + $element = $regs[1]; + $subelement = $regs[2]; + } + // For compatibility + if ($element == 'order') { + $element = $subelement = 'commande'; + } + if ($element == 'propal') { + $element = 'comm/propal'; + $subelement = 'propal'; + } + if ($element == 'contract') { + $element = $subelement = 'contrat'; + } + if ($element == 'inter') { + $element = $subelement = 'ficheinter'; + } + if ($element == 'shipping') { + $element = $subelement = 'expedition'; + } + if ($element == 'order_supplier') { + $element = 'fourn'; + $subelement = 'fournisseur.commande'; + } + if ($element == 'project') { + $element = 'projet'; + } + + dol_include_once('/' . $element . '/class/' . $subelement . '.class.php'); + $classname = ucfirst($origin); + $objectsrc = new $classname($db); + $objectsrc->fetch($origin_id); + + $tmpobject = $objectsrc; + } + } + $custcontact = ''; $contactarr = array(); - $contactarr = $object->liste_contact(- 1, 'external'); + $contactarr = $tmpobject->liste_contact(- 1, 'external'); if (is_array($contactarr) && count($contactarr) > 0) { require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php'; From 80ed080800954f31b35eae42b43bff6ea09dacc6 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 6 May 2019 11:31:41 +0200 Subject: [PATCH 0279/1036] Update api_setup.class.php --- htdocs/api/class/api_setup.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 386c04cdd9f..227921889e6 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -448,7 +448,7 @@ class Setup extends DolibarrApi /** * Get the list of currencies. * - * @param int $multicurrency Multicurrency rates (0: no multicurrency, 1: last rate) {@min 0} {@max 1} + * @param int $multicurrency Multicurrency rates (0: no multicurrency, 1: last rate, 2: all rates) {@min 0} {@max 2} * @param string $sortfield Sort field * @param string $sortorder Sort order * @param int $limit Number of items per page @@ -474,7 +474,7 @@ class Setup extends DolibarrApi $sql.= " WHERE t.active = ".$active; if (!empty($multicurrency)) { $sql.= " AND m.entity IN (".getEntity('multicurrency').")"; - $sql.= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX."multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid)"; + if (!empty($multicurrency) && $multicurrecny != 2) $sql.= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX."multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid)"; } // Add sql filters From 96cc4f7774a9aef072c79644ec401d172373b902 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 6 May 2019 12:37:55 +0200 Subject: [PATCH 0280/1036] Update api_setup.class.php --- htdocs/api/class/api_setup.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 227921889e6..e72f178cd68 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -474,7 +474,7 @@ class Setup extends DolibarrApi $sql.= " WHERE t.active = ".$active; if (!empty($multicurrency)) { $sql.= " AND m.entity IN (".getEntity('multicurrency').")"; - if (!empty($multicurrency) && $multicurrecny != 2) $sql.= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX."multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid)"; + if (!empty($multicurrency) && $multicurrency != 2) $sql.= " AND cr.date_sync = (SELECT MAX(cr2.date_sync) FROM ".MAIN_DB_PREFIX."multicurrency_rate AS cr2 WHERE cr2.fk_multicurrency = m.rowid)"; } // Add sql filters From 4008e26328974a878f5f62e1a466d01f18a6b045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Hahn?= Date: Mon, 6 May 2019 13:12:41 +0200 Subject: [PATCH 0281/1036] Add support for units Fetch units from db when they've been enabled in configuration --- htdocs/core/class/html.form.class.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 3c4ac0b9804..987331d1e0c 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2084,6 +2084,11 @@ class Form $sql.=' pcp.price_base_type as custprice_base_type, pcp.tva_tx as custtva_tx'; $selectFields.= ", idprodcustprice, custprice, custprice_ttc, custprice_base_type, custtva_tx"; } + // Units + if($conf->global->PRODUCT_USE_UNITS) { + $sql .= ', u.label as unit_long, u.short_label as unit_short'; + $selectFields .= ', unit_long, unit_short'; + } // Multilang : we add translation if (! empty($conf->global->MAIN_MULTILANGS)) @@ -2121,6 +2126,10 @@ class Form if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES) && !empty($socid)) { $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."product_customer_price as pcp ON pcp.fk_soc=".$socid." AND pcp.fk_product=p.rowid"; } + // Units + if($conf->global->PRODUCT_USE_UNITS) { + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_units u ON u.rowid = p.fk_unit"; + } // Multilang : we add translation if (! empty($conf->global->MAIN_MULTILANGS)) { @@ -2382,6 +2391,10 @@ class Form $opt.= $objp->ref; if ($outbarcode) $opt.=' ('.$outbarcode.')'; $opt.=' - '.dol_trunc($label, $maxlengtharticle); + // Units + if($conf->global->PRODUCT_USE_UNITS) { + $opt .= ' (' . $objp->unit_short . ')'; + } $objRef = $objp->ref; if (! empty($filterkey) && $filterkey != '') $objRef=preg_replace('/('.preg_quote($filterkey).')/i', '$1', $objRef, 1); From acb2f59f560dcf48d6a8060ac6bdbb16f7c17ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BCdiger=20Hahn?= Date: Mon, 6 May 2019 19:22:49 +0200 Subject: [PATCH 0282/1036] Fetch db value for cond_reglement_doc/cond_reglement_libelle_doc cond_reglement and cond_reglement_doc got the same value cond_reglement_libelle. It looks like that the db field libelle_facture was intended to be used for cond_reglement_libelle_doc. --- htdocs/fourn/class/fournisseur.commande.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index f1910c5ab38..a0c31505d5e 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -264,7 +264,7 @@ class CommandeFournisseur extends CommonOrder $sql.= " c.note_private, c.note_public, c.model_pdf, c.extraparams, c.billed,"; $sql.= " c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc,"; $sql.= " cm.libelle as methode_commande,"; - $sql.= " cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle,"; + $sql.= " cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc,"; $sql.= " p.code as mode_reglement_code, p.libelle as mode_reglement_libelle"; $sql.= ', c.fk_incoterms, c.location_incoterms'; $sql.= ', i.libelle as libelle_incoterms'; @@ -322,7 +322,7 @@ class CommandeFournisseur extends CommonOrder $this->cond_reglement_id = $obj->fk_cond_reglement; $this->cond_reglement_code = $obj->cond_reglement_code; $this->cond_reglement = $obj->cond_reglement_libelle; - $this->cond_reglement_doc = $obj->cond_reglement_libelle; + $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc; $this->fk_account = $obj->fk_account; $this->mode_reglement_id = $obj->fk_mode_reglement; $this->mode_reglement_code = $obj->mode_reglement_code; From c4798c34b01fb479e45e8f5ee5041fc949417b5e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 7 May 2019 00:26:31 +0200 Subject: [PATCH 0283/1036] Fix autocompletion of product on stock correction --- htdocs/cashdesk/tpl/facturation1.tpl.php | 11 ----------- htdocs/core/class/html.form.class.php | 4 +++- htdocs/product/stock/tpl/stocktransfer.tpl.php | 3 +-- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/htdocs/cashdesk/tpl/facturation1.tpl.php b/htdocs/cashdesk/tpl/facturation1.tpl.php index 3a3fcd0a6b8..763ad6a257e 100644 --- a/htdocs/cashdesk/tpl/facturation1.tpl.php +++ b/htdocs/cashdesk/tpl/facturation1.tpl.php @@ -55,17 +55,6 @@ $langs->loadLangs(array("main","bills","cashdesk")); onfocus="javascript: this.select();" /> '; } + // Units + if ($conf->global->PRODUCT_USE_UNITS) { + print ''; + } print ''; print ''; print ''; From a386f0e9ea697b75d9902be3af67d634573dfe5a Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 7 May 2019 09:18:27 +0200 Subject: [PATCH 0285/1036] Fix Eldy menu --- htdocs/core/menus/standard/eldy.lib.php | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index dcee245f257..e9876271dc3 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -318,7 +318,7 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout = $tmpentry = array( 'enabled'=>(! empty($conf->comptabilite->enabled) || ! empty($conf->accounting->enabled) || ! empty($conf->asset->enabled)), 'perms'=>(! empty($user->rights->compta->resultat->lire) || ! empty($user->rights->accounting->mouvements->lire) || ! empty($user->rights->asset->read)), - 'comptabilite|accounting|asset' + 'module'=>'comptabilite|accounting|asset' ); $menu_arr[] = array( 'name' => 'Accounting', @@ -337,7 +337,7 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout = 'session' => ( ( $_SESSION["mainmenu"] && $_SESSION["mainmenu"] == "accountancy" ) ? 0 : 1 ), - 'loadLangs' => array("compta"), + 'loadLangs' => array("compta","accountancy","assets"), 'submenus' => array(), ); @@ -1154,8 +1154,6 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM // Accounting (Double entries) if (! empty($conf->accounting->enabled)) { - $langs->load("accountancy"); - $permtoshowmenu=(! empty($conf->accounting->enabled) || $user->rights->accounting->bind->write || $user->rights->compta->resultat->lire); //$newmenu->add("/accountancy/index.php?leftmenu=accountancy", $langs->trans("MenuAccountancy"), 0, $permtoshowmenu, '', $mainmenu, 'accountancy'); @@ -1252,7 +1250,6 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM // Accounting $newmenu->add("/accountancy/index.php?leftmenu=accountancy_accountancy", $langs->trans("MenuAccountancy"), 0, $user->rights->accounting->mouvements->lire, '', $mainmenu, 'accountancy', 1); - // General Ledger $newmenu->add("/accountancy/bookkeeping/list.php?mainmenu=accountancy&leftmenu=accountancy_accountancy", $langs->trans("Bookkeeping"), 1, $user->rights->accounting->mouvements->lire); @@ -1266,8 +1263,6 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM } // Reports - $langs->load("compta"); - $newmenu->add("/compta/resultat/index.php?mainmenu=accountancy&leftmenu=accountancy_report", $langs->trans("Reportings"), 1, $user->rights->accounting->comptarapport->lire, '', $mainmenu, 'ca'); if ($usemenuhider || empty($leftmenu) || preg_match('/accountancy_report/', $leftmenu)) { @@ -1338,8 +1333,6 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM // Accountancy (simple) if (! empty($conf->comptabilite->enabled)) { - $langs->load("compta"); - // Bilan, resultats $newmenu->add("/compta/resultat/index.php?leftmenu=report&mainmenu=accountancy", $langs->trans("Reportings"), 0, $user->rights->compta->resultat->lire, '', $mainmenu, 'ca'); @@ -1370,11 +1363,10 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM } //if ($leftmenu=="ca") $newmenu->add("/compta/journaux/index.php?leftmenu=ca",$langs->trans("Journaux"),1,$user->rights->compta->resultat->lire||$user->rights->accounting->comptarapport->lire); } - + // Assets if (! empty($conf->asset->enabled)) { - $langs->load("assets"); $newmenu->add("/asset/list.php?leftmenu=asset&mainmenu=accountancy", $langs->trans("MenuAssets"), 0, $user->rights->asset->read, '', $mainmenu, 'asset'); $newmenu->add("/asset/card.php?leftmenu=asset&action=create", $langs->trans("MenuNewAsset"), 1, $user->rights->asset->write); $newmenu->add("/asset/list.php?leftmenu=asset&mainmenu=accountancy", $langs->trans("MenuListAssets"), 1, $user->rights->asset->read); From f661b926fa42d1aba99f610e63e6de731feb1408 Mon Sep 17 00:00:00 2001 From: gauthier Date: Tue, 7 May 2019 14:33:17 +0200 Subject: [PATCH 0286/1036] FIX : use dol_sanitizeFileName() function to remove double spaces in filenames, as well as done on document.php when we want to download pdf Example : if you upload a file like "my file.pdf" (with 2 spaces), it's impossible to download it after. then we have to remove at least 1 space --- htdocs/core/lib/files.lib.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 210626f461c..8a1fecd999a 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1556,7 +1556,8 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio $destfull = $info['dirname'].'/'.dol_sanitizeFileName($info['filename'].'.'.strtolower($info['extension'])); $info = pathinfo($destfile); $destfile = dol_sanitizeFileName($info['filename'].'.'.strtolower($info['extension'])); - + $destfile = dol_string_nohtmltag($destfile); + $destfull = dol_string_nohtmltag($destfull); $resupload = dol_move_uploaded_file($TFile['tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile['error'][$i], 0, $varfiles); if (is_numeric($resupload) && $resupload > 0) // $resupload can be 'ErrorFileAlreadyExists' From 77d3f221631a1a92e7c27c82126c33f505eea90c Mon Sep 17 00:00:00 2001 From: ATM-Nicolas Date: Mon, 6 May 2019 11:21:39 +0200 Subject: [PATCH 0287/1036] NEW : Amount invoiced column in propal list --- htdocs/comm/propal/list.php | 30 ++++++++++++++++++++++++++++++ htdocs/langs/fr_FR/main.lang | 1 + 2 files changed, 31 insertions(+) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 24c53d26526..7355ea83269 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -160,6 +160,7 @@ $arrayfields=array( 'p.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1), 'p.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0), 'p.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), + 'p.total_invoiced'=>array('label'=>$langs->trans("AmountInvoicedTTC"), 'checked'=>0), 'u.login'=>array('label'=>$langs->trans("Author"), 'checked'=>1, 'position'=>10), 'sale_representative'=>array('label'=>$langs->trans("SaleRepresentativesOfThirdParty"), 'checked'=>1), 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), @@ -637,6 +638,12 @@ if ($resql) print ''; print ''; } + if (! empty($arrayfields['p.total_invoiced']['checked'])) + { + // Amount invoiced + print ''; + } if (! empty($arrayfields['u.login']['checked'])) { // Author @@ -701,6 +708,7 @@ if ($resql) if (! empty($arrayfields['p.total_ht']['checked'])) print_liste_field_titre($arrayfields['p.total_ht']['label'], $_SERVER["PHP_SELF"], 'p.total_ht', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['p.total_vat']['checked'])) print_liste_field_titre($arrayfields['p.total_vat']['label'], $_SERVER["PHP_SELF"], 'p.tva', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['p.total_ttc']['checked'])) print_liste_field_titre($arrayfields['p.total_ttc']['label'], $_SERVER["PHP_SELF"], 'p.total', '', $param, 'class="right"', $sortfield, $sortorder); + if (! empty($arrayfields['p.total_invoiced']['checked'])) print_liste_field_titre($arrayfields['p.total_invoiced']['label'], $_SERVER["PHP_SELF"], 'p.total', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['u.login']['checked'])) print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, 'align="center"', $sortfield, $sortorder); if (! empty($arrayfields['sale_representative']['checked'])) print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", "$param", '', $sortfield, $sortorder); // Extra fields @@ -911,6 +919,27 @@ if ($resql) if (! $i) $totalarray['totalttcfield']=$totalarray['nbfield']; $totalarray['totalttc'] += $obj->total_ttc; } + // Amount invoiced + if(! empty($arrayfields['p.total_invoiced']['checked'])) { + $totalInvoiced = 0; + $p = new Propal($db); + $TInvoiceData = $p->InvoiceArrayList($obj->rowid); + + if(! empty($TInvoiceData)) { + foreach($TInvoiceData as $invoiceData) { + $invoice = new Facture($db); + $invoice->fetch($invoiceData->facid); + + if(! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS) && $invoice->type == Facture::TYPE_DEPOSIT) continue; + $totalInvoiced += $invoice->total_ttc; + } + } + + print '\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totalinvoicedfield']=$totalarray['nbfield']; + $totalarray['totalinvoiced'] += $totalInvoiced; + } $userstatic->id=$obj->fk_user_author; $userstatic->login=$obj->login; @@ -1037,6 +1066,7 @@ if ($resql) elseif ($totalarray['totalhtfield'] == $i) print ''; elseif ($totalarray['totalvatfield'] == $i) print ''; elseif ($totalarray['totalttcfield'] == $i) print ''; + elseif ($totalarray['totalinvoicedfield'] == $i) print ''; elseif ($totalarray['totalizable']) { $printed = false; foreach ($totalarray['totalizable'] as $totalizable) { diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 552c3334bbe..22e6914dcd9 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -347,6 +347,7 @@ PriceUTTC=P.U TTC Amount=Montant AmountInvoice=Montant facture AmountInvoiced=Montant facturé +AmountInvoicedTTC=Montant TTC facturé AmountPayment=Montant paiement AmountHTShort=Montant HT AmountTTCShort=Montant TTC From e37519ed89848d3bf739dc343be9300308b720f8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 7 May 2019 22:43:59 +0200 Subject: [PATCH 0288/1036] Fix label --- htdocs/accountancy/admin/accountmodel.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/htdocs/accountancy/admin/accountmodel.php b/htdocs/accountancy/admin/accountmodel.php index 36ecf11a4c7..6404b6119e7 100644 --- a/htdocs/accountancy/admin/accountmodel.php +++ b/htdocs/accountancy/admin/accountmodel.php @@ -522,7 +522,6 @@ if ($id) if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') { $valuetoshow=$langs->trans("Label"); - if ($id != 25) $valuetoshow.="*"; } if ($fieldlist[$field]=='country') { if (in_array('region_id', $fieldlist)) { print ''; continue; } // For region page, we do not show the country input @@ -583,10 +582,6 @@ if ($id) $colspan=count($fieldlist)+3; - if (! empty($alabelisused)) // If there is one label among fields, we show legend of * - { - print ''; - } print ''; // Keep   to have a line with enough height } @@ -667,7 +662,6 @@ if ($id) } if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') { $valuetoshow=$langs->trans("Label"); - if ($id != 25) $valuetoshow.="*"; } if ($fieldlist[$field]=='country') { $valuetoshow=$langs->trans("Country"); From 12409e944c265bd5e3d0a0d8105360810f8f5414 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 7 May 2019 22:57:27 +0200 Subject: [PATCH 0289/1036] Fix duplicate error message --- htdocs/expedition/card.php | 2 +- htdocs/expedition/class/expedition.class.php | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index b2d45e11a6f..9cf79ba3f18 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -442,7 +442,7 @@ if (empty($reshook)) if ($result < 0) { $langs->load("errors"); - setEventMessages($langs->trans($object->error), null, 'errors'); + setEventMessages($langs->trans($object->error), $object->errors, 'errors'); } else { diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index e68eecbca81..3e9175c95e3 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -757,7 +757,7 @@ class Expedition extends CommonObject $result=$mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans("ShipmentValidatedInDolibarr",$numref)); if ($result < 0) { $error++; - $this->errors[]=$mouvS->error; + $this->error = $mouvS->error; $this->errors = array_merge($this->errors, $mouvS->errors); break; } @@ -771,7 +771,7 @@ class Expedition extends CommonObject $result=$mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans("ShipmentValidatedInDolibarr",$numref), '', $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, $obj->fk_origin_stock); if ($result < 0) { $error++; - $this->errors[]=$mouvS->error; + $this->error = $mouvS->error; $this->errors = array_merge($this->errors, $mouvS->errors); break; } @@ -851,11 +851,6 @@ class Expedition extends CommonObject } else { - foreach($this->errors as $errmsg) - { - dol_syslog(get_class($this)."::valid ".$errmsg, LOG_ERR); - $this->error.=($this->error?', '.$errmsg:$errmsg); - } $this->db->rollback(); return -1*$error; } From dc1ee29feffe0e2333655bb47acb5e3e2316a105 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 7 May 2019 23:03:45 +0200 Subject: [PATCH 0290/1036] Fix default permission of new users --- htdocs/core/modules/modBom.class.php | 6 +++--- htdocs/core/modules/modBookmark.class.php | 4 ++-- htdocs/core/modules/modDav.class.php | 6 +++--- htdocs/core/modules/modEmailCollector.class.php | 6 +++--- htdocs/core/modules/modExpenseReport.class.php | 2 +- htdocs/core/modules/modTicket.class.php | 2 +- .../template/core/modules/modMyModule.class.php | 6 +++--- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/htdocs/core/modules/modBom.class.php b/htdocs/core/modules/modBom.class.php index 6b13ae39ae4..8e1e1f1288b 100644 --- a/htdocs/core/modules/modBom.class.php +++ b/htdocs/core/modules/modBom.class.php @@ -211,21 +211,21 @@ class modBom extends DolibarrModules $r=0; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Read bom of Bom'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->bom->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->bom->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Create/Update bom of Bom'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->bom->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->bom->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Delete bom of Bom'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->bom->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->bom->level1->level2) diff --git a/htdocs/core/modules/modBookmark.class.php b/htdocs/core/modules/modBookmark.class.php index 0717236a1bb..e3a332c8e58 100644 --- a/htdocs/core/modules/modBookmark.class.php +++ b/htdocs/core/modules/modBookmark.class.php @@ -93,8 +93,8 @@ class modBookmark extends DolibarrModules $r++; $this->rights[$r][0] = 333; // id de la permission $this->rights[$r][1] = 'Supprimer les bookmarks'; // libelle de la permission - $this->rights[$r][2] = 'r'; // type de la permission (d�pr�ci� � ce jour) - $this->rights[$r][3] = 0; // La permission est-elle une permission par d�faut + $this->rights[$r][2] = 'r'; // type de la permission (deprecie a ce jour) + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut $this->rights[$r][4] = 'supprimer'; diff --git a/htdocs/core/modules/modDav.class.php b/htdocs/core/modules/modDav.class.php index 676b8e9b8bc..53790e8eba6 100644 --- a/htdocs/core/modules/modDav.class.php +++ b/htdocs/core/modules/modDav.class.php @@ -188,21 +188,21 @@ class modDav extends DolibarrModules $r=0; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Read myobject of dav'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->dav->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->dav->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 dav'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->dav->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->dav->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Delete myobject of dav'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->dav->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->dav->level1->level2) */ diff --git a/htdocs/core/modules/modEmailCollector.class.php b/htdocs/core/modules/modEmailCollector.class.php index b3daf4ade09..bd9f65df960 100644 --- a/htdocs/core/modules/modEmailCollector.class.php +++ b/htdocs/core/modules/modEmailCollector.class.php @@ -185,21 +185,21 @@ class modEmailCollector extends DolibarrModules $r=0; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Read myobject of dav'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->dav->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->dav->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 dav'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->dav->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->dav->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Delete myobject of dav'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->dav->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->dav->level1->level2) */ diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index d6ef55fe646..6a2ba294b7e 100644 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -150,7 +150,7 @@ class modExpenseReport extends DolibarrModules $this->rights[$r][0] = 777; $this->rights[$r][1] = 'Read expense reports of everybody'; $this->rights[$r][2] = 'r'; - $this->rights[$r][3] = 1; + $this->rights[$r][3] = 0; $this->rights[$r][4] = 'readall'; $r++; diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php index 871bc94670d..9436bfa84e8 100644 --- a/htdocs/core/modules/modTicket.class.php +++ b/htdocs/core/modules/modTicket.class.php @@ -151,7 +151,7 @@ class modTicket extends DolibarrModules $this->rights[$r][0] = 56001; // id de la permission $this->rights[$r][1] = "Read ticket"; // libelle de la permission $this->rights[$r][2] = 'r'; // type de la permission (deprecie a ce jour) - $this->rights[$r][3] = 1; // La permission est-elle une permission par defaut + $this->rights[$r][3] = 0; // La permission est-elle une permission par defaut $this->rights[$r][4] = 'read'; $r++; diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php index 2dd29d10195..622e3fd0bac 100644 --- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php +++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php @@ -237,19 +237,19 @@ class modMyModule extends DolibarrModules $r=0; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Read objects of MyModule'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->mymodule->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mymodule->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Create/Update objects of MyModule'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->mymodule->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mymodule->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Delete objects of MyModule'; // Permission label - $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + $this->rights[$r][3] = 0; // 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->mymodule->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mymodule->level1->level2) From 1e036f35135c61bcba6313358e2a0d82271787cf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 01:09:38 +0200 Subject: [PATCH 0291/1036] Correct support for type price on module builder Fix link of ref in cash fence list --- .../compta/cashcontrol/cashcontrol_card.php | 2 +- .../compta/cashcontrol/cashcontrol_list.php | 41 ++++--- .../cashcontrol/class/cashcontrol.class.php | 108 +++++++++--------- htdocs/core/class/commonobject.class.php | 2 +- htdocs/langs/en_US/cashdesk.lang | 3 +- .../modulebuilder/template/myobject_list.php | 8 +- 6 files changed, 87 insertions(+), 77 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_card.php b/htdocs/compta/cashcontrol/cashcontrol_card.php index 76a265e842e..8fc53fbdb53 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_card.php +++ b/htdocs/compta/cashcontrol/cashcontrol_card.php @@ -561,7 +561,7 @@ if (empty($action) || $action=="view") print ''; if ($object->status == CashControl::STATUS_DRAFT) { - print ''; + print ''; print ''; } diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index da6c5d728cc..32a5e50a452 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -212,7 +212,7 @@ else $sql.=" WHERE 1 = 1"; foreach($search as $key => $val) { if ($key == 'status' && $search[$key] == -1) continue; - $mode_search=(($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key]))?1:0); + $mode_search=(($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0); if ($search[$key] != '') $sql.=natural_search($key, $search[$key], (($key == 'status')?2:$mode_search)); } if ($search_all) $sql.= natural_search(array_keys($fieldstosearchall), $search_all); @@ -387,10 +387,11 @@ print '
- price_level; - print ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/product/ajax/products.php', 'outjson=1&price_level='.$price_level.'&type='.$filtertype.'&mode=1&status='.$status.'&finished='.$finished, $conf->global->PRODUIT_USE_SEARCH_TO_SELECT); - if (! $hidelabel) print $langs->trans("RefOrLabel").' : '; - print ''; - */ - ?> - ' . $objp->unit_short . ''.$langs->trans("Movements").''.$product->LibStatut($objp->statut, 5, 0).''.$product->LibStatut($objp->tobuy, 5, 1).''; + print ''.price($totalInvoiced)."'.price($totalarray['totalht']).''.price($totalarray['totalvat']).''.price($totalarray['totalttc']).''.price($totalarray['totalinvoiced']).' 
* '.$langs->trans("LabelUsedByDefault").'.
 
'; foreach($object->fields as $key => $val) { - $cssforfield=''; - if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; - if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; - if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; + $cssforfield=''; + if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; + if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price'))) $cssforfield.=($cssforfield?' ':'').'right'; + if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; if (! empty($arrayfields['t.'.$key]['checked'])) print ''; } // Extra fields @@ -413,14 +414,15 @@ print ''."\n"; print ''; foreach($object->fields as $key => $val) { - $cssforfield=''; - if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; - if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; - if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; - if (! empty($arrayfields['t.'.$key]['checked'])) - { - print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield?'class="'.$cssforfield.'"':''), $sortfield, $sortorder, ($cssforfield?$cssforfield.' ':''))."\n"; - } + $cssforfield=''; + if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; + if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price'))) $cssforfield.=($cssforfield?' ':'').'right'; + if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; + if (! empty($arrayfields['t.'.$key]['checked'])) + { + print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield?'class="'.$cssforfield.'"':''), $sortfield, $sortorder, ($cssforfield?$cssforfield.' ':''))."\n"; + } } // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; @@ -463,10 +465,15 @@ while ($i < min($num, $limit)) print ''; foreach($object->fields as $key => $val) { - $cssforfield=''; - if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; - if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; - if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; + $cssforfield=''; + if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; + elseif ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; + + if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; + elseif ($key == 'ref') $cssforfield.=($cssforfield?' ':'').'nowrap'; + + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price'))) $cssforfield.=($cssforfield?' ':'').'right'; + if (! empty($arrayfields['t.'.$key]['checked'])) { print 'array('type'=>'integer', 'label'=>'ID', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>10), + 'rowid' =>array('type'=>'integer', 'label'=>'ID', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>10), 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>15), 'ref' =>array('type'=>'varchar(64)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>18), - 'posmodule' =>array('type'=>'varchar(30)', 'label'=>'Module', 'enabled'=>1, 'visible'=>1, 'notnul'=>1, 'position'=>19), - 'posnumber' =>array('type'=>'varchar(30)', 'label'=>'CashDesk', 'enabled'=>1, 'visible'=>1, 'notnul'=>1, 'position'=>20), + 'posmodule' =>array('type'=>'varchar(30)', 'label'=>'Module', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>19), + 'posnumber' =>array('type'=>'varchar(30)', 'label'=>'CashDesk', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>20), 'label' =>array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>0, 'position'=>24), - 'opening' =>array('type'=>'double(24,8)', 'label'=>'Opening', 'enabled'=>1, 'visible'=>1, 'position'=>25), - 'cash' =>array('type'=>'double(24,8)', 'label'=>'Cash', 'enabled'=>1, 'visible'=>1, 'position'=>30), - 'cheque' =>array('type'=>'double(24,8)', 'label'=>'Cheque', 'enabled'=>1, 'visible'=>1, 'position'=>33), - 'card' =>array('type'=>'double(24,8)', 'label'=>'CreditCard', 'enabled'=>1, 'visible'=>1, 'position'=>36), - 'year_close' =>array('type'=>'integer', 'label'=>'Year close', 'enabled'=>1, 'visible'=>1, 'notnul'=>1, 'position'=>50), - 'month_close' =>array('type'=>'integer', 'label'=>'Month close', 'enabled'=>1, 'visible'=>1, 'position'=>55), - 'day_close' =>array('type'=>'integer', 'label'=>'Day close', 'enabled'=>1, 'visible'=>1, 'position'=>60), - 'date_valid' =>array('type'=>'datetime', 'label'=>'DateValid', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>490), + 'opening' =>array('type'=>'price', 'label'=>'Opening', 'enabled'=>1, 'visible'=>1, 'position'=>25), + 'cash' =>array('type'=>'price', 'label'=>'Cash', 'enabled'=>1, 'visible'=>1, 'position'=>30), + 'cheque' =>array('type'=>'price', 'label'=>'Cheque', 'enabled'=>1, 'visible'=>1, 'position'=>33), + 'card' =>array('type'=>'price', 'label'=>'CreditCard', 'enabled'=>1, 'visible'=>1, 'position'=>36), + 'year_close' =>array('type'=>'integer', 'label'=>'Year close', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'position'=>50, 'css'=>'center'), + 'month_close' =>array('type'=>'integer', 'label'=>'Month close', 'enabled'=>1, 'visible'=>1, 'position'=>55, 'css'=>'center'), + 'day_close' =>array('type'=>'integer', 'label'=>'Day close', 'enabled'=>1, 'visible'=>1, 'position'=>60, 'css'=>'center'), + 'date_valid' =>array('type'=>'datetime', 'label'=>'DateValidation', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>490), 'date_creation' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-1, 'notnull'=>1, 'position'=>500), 'tms' =>array('type'=>'timestamp', 'label'=>'Tms', 'enabled'=>1, 'visible'=>0, 'notnull'=>1, 'position'=>505), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'Import key', 'enabled'=>1, 'visible'=>0, 'position'=>510), @@ -355,66 +355,68 @@ class CashControl extends CommonObject } /** - * Return clicable link of object (with eventually picto) + * Return clicable link of object (with eventually picto) * - * @param int $withpicto Add picto into link - * @param string $option Where point the link ('stock', 'composition', 'category', 'supplier', '') - * @param int $maxlength Maxlength of ref - * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking - * @param int $notooltip No tooltip - * @return string String with URL + * @param int $withpicto Add picto into link + * @param string $option On what the link point to ('nolink', ...) + * @param int $notooltip 1=Disable tooltip + * @param string $morecss Add more css on link + * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @return string String with URL */ - public function getNomUrl($withpicto = 0, $option = '', $maxlength = 0, $save_lastsearch_value = -1, $notooltip = 0) + public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1) { global $conf, $langs, $hookmanager; - include_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php'; + + if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips $result=''; + $newref=($this->ref?$this->ref:$this->id); - if ($maxlength) { $newref=dol_trunc($newref, $maxlength, 'middle'); } $label = '' . $langs->trans("ShowCashFence") . ''; - $label .= '
' . $langs->trans('ProductRef') . ': ' . ($this->ref?$this->ref:$this->id); - - $linkclose=''; - if (empty($notooltip)) { - if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { - $label=$langs->trans("ShowCashFence"); - $linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"'; - } - - $linkclose.= ' title="'.dol_escape_htmltag($label, 1, 1).'"'; - $linkclose.= ' class="classfortooltip"'; - - /* - $hookmanager->initHooks(array('productdao')); - $parameters=array('id'=>$this->id); - $reshook=$hookmanager->executeHooks('getnomurltooltip',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if ($reshook > 0) $linkclose = $hookmanager->resPrint; - */ - } + $label.= '
'; + $label.= '' . $langs->trans('Ref') . ': ' . ($this->ref?$this->ref:$this->id); $url = DOL_URL_ROOT.'/compta/cashcontrol/cashcontrol_card.php?id='.$this->id; - if ($option !== 'nolink') { - // Add param to save lastsearch_values or not - $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); - if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) { $add_save_lastsearch_values=1; - } - if ($add_save_lastsearch_values) { $url.='&save_lastsearch_values=1'; - } + if ($option != 'nolink') + { + // Add param to save lastsearch_values or not + $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); + if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) $add_save_lastsearch_values=1; + if ($add_save_lastsearch_values) $url.='&save_lastsearch_values=1'; } + $linkclose=''; + if (empty($notooltip)) + { + if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) + { + $label=$langs->trans("ShowMyObject"); + $linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"'; + } + $linkclose.=' title="'.dol_escape_htmltag($label, 1).'"'; + $linkclose.=' class="classfortooltip'.($morecss?' '.$morecss:'').'"'; + + /* + $hookmanager->initHooks(array('myobjectdao')); + $parameters=array('id'=>$this->id); + $reshook=$hookmanager->executeHooks('getnomurltooltip',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if ($reshook > 0) $linkclose = $hookmanager->resPrint; + */ + } + else $linkclose = ($morecss?' class="'.$morecss.'"':''); + $linkstart = ''; $linkend=''; - $result.=$linkstart; - if ($withpicto) { - $result.=(img_object(($notooltip?'':$label), 'bank', ($notooltip?'class="paddingright"':'class="paddingright classfortooltip"'), 0, 0, $notooltip?0:1)); - } - $result.= $newref; - $result.= $linkend; + $result .= $linkstart; + if ($withpicto) $result.=img_object(($notooltip?'':$label), ($this->picto?$this->picto:'generic'), ($notooltip?(($withpicto != 2) ? 'class="paddingright"' : ''):'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip?0:1); + if ($withpicto != 2) $result.= $this->ref; + $result .= $linkend; + //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : ''); global $action; $hookmanager->initHooks(array('cashfencedao')); diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index fae9ab49cc8..3c4793bdb6f 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -7010,7 +7010,7 @@ abstract class CommonObject { if(is_array($info)) { - if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true; + if (isset($info['type']) && (preg_match('/^(double|real|price)/i', $info['type']))) return true; else return false; } else return false; diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index dd077e54045..8dfc4dcd015 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -62,4 +62,5 @@ TicketVatGrouped=Group VAT by rate in tickets AutoPrintTickets=Automatically print tickets EnableBarOrRestaurantFeatures=Enable features for Bar or Restaurant ConfirmDeletionOfThisPOSSale=Do your confirm the deletion of this current sale ? -History=History \ No newline at end of file +History=History +ValidateAndClose=Validate and close \ No newline at end of file diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 4035b82328d..4d6e1387ed7 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -229,7 +229,7 @@ else $sql.=" WHERE 1 = 1"; foreach($search as $key => $val) { if ($key == 'status' && $search[$key] == -1) continue; - $mode_search=(($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key]))?1:0); + $mode_search=(($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0); if ($search[$key] != '') $sql.=natural_search($key, $search[$key], (($key == 'status')?2:$mode_search)); } if ($search_all) $sql.= natural_search(array_keys($fieldstosearchall), $search_all); @@ -414,7 +414,7 @@ foreach($object->fields as $key => $val) $cssforfield=''; if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real'))) $cssforfield.=($cssforfield?' ':'').'right'; + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price'))) $cssforfield.=($cssforfield?' ':'').'right'; if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; if (! empty($arrayfields['t.'.$key]['checked'])) print '
'; } @@ -441,7 +441,7 @@ foreach($object->fields as $key => $val) $cssforfield=''; if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real'))) $cssforfield.=($cssforfield?' ':'').'right'; + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price'))) $cssforfield.=($cssforfield?' ':'').'right'; if ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; if (! empty($arrayfields['t.'.$key]['checked'])) { @@ -497,7 +497,7 @@ while ($i < min($num, $limit)) if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; elseif ($key == 'ref') $cssforfield.=($cssforfield?' ':'').'nowrap'; - if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real'))) $cssforfield.=($cssforfield?' ':'').'right'; + if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price'))) $cssforfield.=($cssforfield?' ':'').'right'; if (! empty($arrayfields['t.'.$key]['checked'])) { From 53b1dec317f9b8bee27e39437916f899021cbd37 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 01:56:52 +0200 Subject: [PATCH 0292/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 2e143209d9a..66839713bb7 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -107,9 +107,11 @@ ALTER TABLE llx_prelevement_facture_demande ADD COLUMN sourcetype varchar(32); ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_id varchar(128) NULL; ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_site varchar(128) NULL; --- Fix if table exists -ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer; +ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer DEFAULT 1; +ALTER TABLE llx_c_shipment_mode DROP INDEX uk_c_shipment_mode; +ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (entity, code); +-- Fix if table exists ALTER TABLE llx_c_units DROP INDEX uk_c_units_code; ALTER TABLE llx_c_units ADD COLUMN scale integer; ALTER TABLE llx_c_units ADD COLUMN unit_type varchar(10); From 249893a4ab1774b55fb8bf4e066aebb962ba450a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 01:57:23 +0200 Subject: [PATCH 0293/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 66839713bb7..43e12c6c05f 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -109,7 +109,7 @@ ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_site varchar( ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer DEFAULT 1; ALTER TABLE llx_c_shipment_mode DROP INDEX uk_c_shipment_mode; -ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (entity, code); +ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (code, entity); -- Fix if table exists ALTER TABLE llx_c_units DROP INDEX uk_c_units_code; From 95bb8a1f755f323fef09be8a8f6129a3951ef612 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 01:57:39 +0200 Subject: [PATCH 0294/1036] Update llx_c_shipment_mode.key.sql --- htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql b/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql index 3a90d15330f..a75dfaf2740 100644 --- a/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql +++ b/htdocs/install/mysql/tables/llx_c_shipment_mode.key.sql @@ -16,5 +16,5 @@ -- -- =================================================================== -ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (entity, code); +ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (code, entity); From 2ee72e2fdf46f8b07b9521cd95db68414e38e7c4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 02:02:07 +0200 Subject: [PATCH 0295/1036] Update html.form.class.php --- htdocs/core/class/html.form.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 987331d1e0c..1ad6017b9d4 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2085,7 +2085,7 @@ class Form $selectFields.= ", idprodcustprice, custprice, custprice_ttc, custprice_base_type, custtva_tx"; } // Units - if($conf->global->PRODUCT_USE_UNITS) { + if (! empty($conf->global->PRODUCT_USE_UNITS)) { $sql .= ', u.label as unit_long, u.short_label as unit_short'; $selectFields .= ', unit_long, unit_short'; } @@ -2127,7 +2127,7 @@ class Form $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."product_customer_price as pcp ON pcp.fk_soc=".$socid." AND pcp.fk_product=p.rowid"; } // Units - if($conf->global->PRODUCT_USE_UNITS) { + if (! empty($conf->global->PRODUCT_USE_UNITS)) { $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_units u ON u.rowid = p.fk_unit"; } // Multilang : we add translation @@ -2392,7 +2392,7 @@ class Form if ($outbarcode) $opt.=' ('.$outbarcode.')'; $opt.=' - '.dol_trunc($label, $maxlengtharticle); // Units - if($conf->global->PRODUCT_USE_UNITS) { + if (! empty($conf->global->PRODUCT_USE_UNITS)) { $opt .= ' (' . $objp->unit_short . ')'; } From c4fdec9481c3469dcae8f0622abc127ab09eda58 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 02:05:03 +0200 Subject: [PATCH 0296/1036] Update api_setup.class.php --- htdocs/api/class/api_setup.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index e72f178cd68..57aac1b3bb0 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -448,7 +448,7 @@ class Setup extends DolibarrApi /** * Get the list of currencies. * - * @param int $multicurrency Multicurrency rates (0: no multicurrency, 1: last rate, 2: all rates) {@min 0} {@max 2} + * @param int $multicurrency Multicurrency rates (0: no multicurrency, 1: last rate, 2: all rates) {@min 0} {@max 2} * @param string $sortfield Sort field * @param string $sortorder Sort order * @param int $limit Number of items per page From 953c9148ffb65b9bedd472486d57362a8181d7ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 02:11:12 +0200 Subject: [PATCH 0297/1036] Update reassort.php --- htdocs/product/reassort.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 0b62fdf97ba..dcaf9438cbf 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -119,10 +119,10 @@ $sql = 'SELECT p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price $sql.= ' p.fk_product_type, p.tms as datem,'; $sql.= ' p.duration, p.tosell as statut, p.tobuy, p.seuil_stock_alerte, p.desiredstock,'; $sql.= ' SUM(s.reel) as stock_physique,'; -$sql.= ' u.short_label as unit_short'; +if (! empty($conf->global->PRODUCT_USE_UNITS)) $sql.= ' u.short_label as unit_short'; $sql.= ' FROM '.MAIN_DB_PREFIX.'product as p'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as s on p.rowid = s.fk_product'; -$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_units as u on p.fk_unit = u.rowid'; +if (! empty($conf->global->PRODUCT_USE_UNITS)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_units as u on p.fk_unit = u.rowid'; // We'll need this table joined to the select in order to filter by categ if ($search_categ) $sql.= ", ".MAIN_DB_PREFIX."categorie_product as cp"; $sql.= " WHERE p.entity IN (".getEntity('product').")"; From af2c15882162c33429dbae022c0914f6fe286672 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 02:11:50 +0200 Subject: [PATCH 0298/1036] Update reassort.php --- htdocs/product/reassort.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index dcaf9438cbf..72c36daa2a2 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -321,7 +321,7 @@ if ($resql) } if ($virtualdiffersfromphysical) print_liste_field_titre("VirtualStock", $_SERVER["PHP_SELF"], "", $param, "", '', $sortfield, $sortorder, 'right '); // Units - if($conf->global->PRODUCT_USE_UNITS) { + if (! empty($conf->global->PRODUCT_USE_UNITS)) { print_liste_field_titre("Unit", $_SERVER["PHP_SELF"], "unit_short", $param, "", 'align="right"', $sortfield, $sortorder); } print_liste_field_titre(''); @@ -385,7 +385,7 @@ if ($resql) print ''; } // Units - if ($conf->global->PRODUCT_USE_UNITS) { + if (! empty($conf->global->PRODUCT_USE_UNITS)) { print ''; } print ''; From a67d6e7208cd1a3b7a77d4c20a705da0fec63dbe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 13:27:26 +0200 Subject: [PATCH 0299/1036] css --- htdocs/product/stats/facture.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index cad0bb2849d..d60c4d835a5 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -142,7 +142,7 @@ if ($id > 0 || ! empty($ref)) if ($showmessage && $nboflines > 1) { - print $langs->trans("ClinkOnALinkOfColumn", $langs->transnoentitiesnoconv("Referers")); + print ''.$langs->trans("ClinkOnALinkOfColumn", $langs->transnoentitiesnoconv("Referers")).''; } elseif ($user->rights->facture->lire) { From 5fd3109e7f27849d52eca1f9fa467890d2b8bb60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 8 May 2019 16:28:18 +0200 Subject: [PATCH 0300/1036] fix reassort with no product units --- htdocs/product/reassort.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 72c36daa2a2..2d0cdf7eebe 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -118,8 +118,8 @@ $htmlother=new FormOther($db); $sql = 'SELECT p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; $sql.= ' p.fk_product_type, p.tms as datem,'; $sql.= ' p.duration, p.tosell as statut, p.tobuy, p.seuil_stock_alerte, p.desiredstock,'; -$sql.= ' SUM(s.reel) as stock_physique,'; -if (! empty($conf->global->PRODUCT_USE_UNITS)) $sql.= ' u.short_label as unit_short'; +$sql.= ' SUM(s.reel) as stock_physique'; +if (! empty($conf->global->PRODUCT_USE_UNITS)) $sql.= ', u.short_label as unit_short'; $sql.= ' FROM '.MAIN_DB_PREFIX.'product as p'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'product_stock as s on p.rowid = s.fk_product'; if (! empty($conf->global->PRODUCT_USE_UNITS)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_units as u on p.fk_unit = u.rowid'; From 3a3b04f31b6147dddff1460fa3ef3cf6b77bbc47 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 17:31:50 +0200 Subject: [PATCH 0301/1036] Fix showdocument for external modules --- htdocs/core/class/html.formfile.class.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index d161f32d92a..a8568ca104b 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -290,7 +290,7 @@ class FormFile * Return a string to show the box with list of available documents for object. * This also set the property $this->numoffiles * - * @param string $modulepart Module the files are related to ('propal', 'facture', 'facture_fourn', 'mymodule', 'mymodule_temp', ...) + * @param string $modulepart Module the files are related to ('propal', 'facture', 'facture_fourn', 'mymodule', 'mymodule:nameofsubmodule', 'mymodule_temp', ...) * @param string $modulesubdir Existing (so sanitized) sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into subdir of module. * @param string $filedir Directory to scan * @param string $urlsource Url of origin page (for return) @@ -336,7 +336,7 @@ class FormFile } $printer=0; - if (in_array($modulepart, array('facture','supplier_proposal','propal','proposal','order','commande','expedition', 'commande_fournisseur', 'expensereport','livraison'))) // The direct print feature is implemented only for such elements + if (in_array($modulepart, array('facture', 'supplier_proposal', 'propal', 'proposal', 'order', 'commande', 'expedition', 'commande_fournisseur', 'expensereport', 'livraison', 'ticket'))) // The direct print feature is implemented only for such elements { $printer = (!empty($user->rights->printing->read) && !empty($conf->printing->enabled))?true:false; } @@ -643,19 +643,23 @@ class FormFile } else { + $submodulepart = $modulepart; + // For normalized standard modules $file=dol_buildpath('/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php', 0); if (file_exists($file)) { $res=include_once $file; } - // For normalized external modules + // For normalized external modules. modulepart = 'nameofmodule' or 'nameofmodule:nameofsubmodule' else { - $file=dol_buildpath('/'.$modulepart.'/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php', 0); + $tmp=explode(':', $modulepart); + if (! empty($tmp[2])) $submodulepart=$tmp[2]; + $file=dol_buildpath('/'.$modulepart.'/core/modules/'.$modulepart.'/modules_'.$submodulepart.'.php', 0); $res=include_once $file; } - $class='ModelePDF'.ucfirst($modulepart); + $class='ModelePDF'.ucfirst($submodulepart); if (class_exists($class)) { $modellist=call_user_func($class.'::liste_modeles', $this->db); @@ -670,7 +674,6 @@ class FormFile // Set headershown to avoid to have table opened a second time later $headershown=1; - $buttonlabeltoshow=$buttonlabel; if (empty($buttonlabel)) $buttonlabel=$langs->trans('Generate'); if ($conf->browser->layout == 'phone') $urlsource.='#'.$forname.'_form'; // So we switch to form after a generation From f2e24ed96ee533f19b258d06271ee52e2e7bf8c9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 18:19:26 +0200 Subject: [PATCH 0302/1036] Fix bad contact used --- htdocs/core/class/commonobject.class.php | 2 +- .../modules/supplier_order/pdf/pdf_muscadet.modules.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 9b2db295296..de6bdcceef6 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1192,7 +1192,7 @@ abstract class CommonObject $sql.= " AND ec.fk_c_type_contact = tc.rowid"; $sql.= " AND tc.element = '".$element."'"; $sql.= " AND tc.source = '".$source."'"; - $sql.= " AND tc.code = '".$code."'"; + if ($code) $sql.= " AND tc.code = '".$code."'"; $sql.= " AND tc.active = 1"; if ($status) $sql.= " AND ec.statut = ".$status; diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php index 06cf28daaed..e0546fd61aa 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php @@ -110,7 +110,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders /** * Issuer - * @var Company object that emits + * @var Societe object that emits */ public $emetteur; @@ -1306,9 +1306,9 @@ class pdf_muscadet extends ModelePDFSuppliersOrders - // If BILLING contact defined on order, we use it + // If CUSTOMER contact defined on order, we use it. Note: Even if this is a supplier object, the code for external contat that follow object is 'CUSTOMER' $usecontact=false; - $arrayidcontact=$object->getIdContact('external','BILLING'); + $arrayidcontact=$object->getIdContact('external','CUSTOMER'); if (count($arrayidcontact) > 0) { $usecontact=true; From 84cfa00bf14eac3891a5f9e7494b8ac02d933a9f Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Wed, 8 May 2019 18:29:00 +0200 Subject: [PATCH 0303/1036] Terminals --- htdocs/core/lib/takepos.lib.php | 51 ++++++++ htdocs/langs/en_US/cashdesk.lang | 4 +- htdocs/takepos/admin/setup.php | 15 ++- htdocs/takepos/admin/terminal.php | 198 ++++++++++++++++++++++++++++++ htdocs/takepos/invoice.php | 22 ++-- htdocs/takepos/pay.php | 2 +- htdocs/takepos/receipt.php | 2 +- htdocs/takepos/takepos.php | 43 ++++++- 8 files changed, 320 insertions(+), 17 deletions(-) create mode 100644 htdocs/core/lib/takepos.lib.php create mode 100644 htdocs/takepos/admin/terminal.php diff --git a/htdocs/core/lib/takepos.lib.php b/htdocs/core/lib/takepos.lib.php new file mode 100644 index 00000000000..76c6a358c4b --- /dev/null +++ b/htdocs/core/lib/takepos.lib.php @@ -0,0 +1,51 @@ + + * + * 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 . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/lib/takepos.lib.php + * \brief Library file with function for TakePOS module + */ + +/** + * Prepare array with list of tabs + * + */ +function takepos_prepare_head() +{ + global $langs, $conf; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/takepos/admin/setup.php'; + $head[$h][1] = $langs->trans("Parameters"); + $head[$h][2] = 'setup'; + $h++; + + for ($i = 2; $i <= $conf->global->TAKEPOS_NUM_TERMINALS; $i++) + { + $head[$h][0] = DOL_URL_ROOT.'/takepos/admin/terminal.php?terminal='.$i; + $head[$h][1] = $langs->trans("Terminal"). " ".$i; + $head[$h][2] = 'terminal'.$i; + $h++; + } + + complete_head_from_modules($conf, $langs, null, $head, $h, 'takepos'); + + return $head; +} diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index 8dfc4dcd015..629416df6ed 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -63,4 +63,6 @@ AutoPrintTickets=Automatically print tickets EnableBarOrRestaurantFeatures=Enable features for Bar or Restaurant ConfirmDeletionOfThisPOSSale=Do your confirm the deletion of this current sale ? History=History -ValidateAndClose=Validate and close \ No newline at end of file +ValidateAndClose=Validate and close +Terminals=Terminals +TerminalSelect=Select terminal you want to use: \ No newline at end of file diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php index e17ea0ee036..7f51508dfc5 100644 --- a/htdocs/takepos/admin/setup.php +++ b/htdocs/takepos/admin/setup.php @@ -27,6 +27,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT."/core/lib/takepos.lib.php"; // If socid provided by ajax company selector if (! empty($_REQUEST['CASHDESK_ID_THIRDPARTY_id'])) @@ -88,6 +89,7 @@ if (GETPOST('action', 'alpha') == 'set') $res = dolibarr_set_const($db, "TAKEPOS_HEADER", GETPOST('TAKEPOS_HEADER', 'alpha'), 'chaine', 0, '', $conf->entity); $res = dolibarr_set_const($db, "TAKEPOS_FOOTER", GETPOST('TAKEPOS_FOOTER', 'alpha'), 'chaine', 0, '', $conf->entity); $res = dolibarr_set_const($db, "TAKEPOS_NUMPAD", GETPOST('TAKEPOS_NUMPAD', 'alpha'), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "TAKEPOS_NUM_TERMINALS", GETPOST('TAKEPOS_NUM_TERMINALS', 'alpha'), 'chaine', 0, '', $conf->entity); if ($conf->global->TAKEPOS_ORDER_NOTES==1) { @@ -122,6 +124,8 @@ llxHeader('', $langs->trans("CashDeskSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("CashDeskSetup").' (TakePOS)', $linkback, 'title_setup'); +$head = takepos_prepare_head(); +dol_fiche_head($head, 'setup', 'TakePOS', -1); print '
'; @@ -249,6 +253,14 @@ else } print "
\n"; +// Terminals +print '\n"; + print '
' . $objp->unit_short . ''.$langs->trans("Movements").'
'; +print $langs->trans("Terminals"); +print ''; +$array=array(1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5"); +print $form->selectarray('TAKEPOS_NUM_TERMINALS', $array, (empty($conf->global->TAKEPOS_NUM_TERMINALS)?'0':$conf->global->TAKEPOS_NUM_TERMINALS), 0); +print "
'; print '
'; @@ -256,7 +268,8 @@ print '
'; print ''; print ''; -print ''; +if (!$conf->global->TAKEPOS_NUM_TERMINALS || $conf->global->TAKEPOS_NUM_TERMINALS=="1") print ''; +else print ''; print "\n"; print ''; diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php new file mode 100644 index 00000000000..fadf5b971f9 --- /dev/null +++ b/htdocs/takepos/admin/terminal.php @@ -0,0 +1,198 @@ + + * 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'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT."/core/lib/takepos.lib.php"; + +$terminal=GETPOST('terminal', 'int'); +// If socid provided by ajax company selector +if (! empty($_REQUEST['CASHDESK_ID_THIRDPARTY'.$terminal.'_id'])) +{ + $_GET['CASHDESK_ID_THIRDPARTY'.$terminal] = GETPOST('CASHDESK_ID_THIRDPARTY'.$terminal.'_id', 'alpha'); + $_POST['CASHDESK_ID_THIRDPARTY'.$terminal] = GETPOST('CASHDESK_ID_THIRDPARTY'.$terminal.'_id', 'alpha'); + $_REQUEST['CASHDESK_ID_THIRDPARTY'.$terminal] = GETPOST('CASHDESK_ID_THIRDPARTY'.$terminal.'_id', 'alpha'); +} + +// Security check +if (!$user->admin) accessforbidden(); + +$langs->loadLangs(array("admin", "cashdesk")); + +global $db; + +$sql = "SELECT code, libelle FROM ".MAIN_DB_PREFIX."c_paiement"; +$sql.= " WHERE entity IN (".getEntity('c_paiement').")"; +$sql.= " AND active = 1"; +$sql.= " ORDER BY libelle"; +$resql = $db->query($sql); +$paiements = array(); +if($resql){ + while ($obj = $db->fetch_object($resql)){ + array_push($paiements, $obj); + } +} + +/* + * Actions + */ +if (GETPOST('action', 'alpha') == 'set') +{ + $db->begin(); + if (GETPOST('socid', 'int') < 0) $_POST["socid"]=''; + + $res = dolibarr_set_const($db, "CASHDESK_ID_THIRDPARTY".$terminal, (GETPOST('socid', 'int') > 0 ? GETPOST('socid', 'int') : ''), 'chaine', 0, '', $conf->entity); + + $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CASH".$terminal, (GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CHEQUE".$terminal, (GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CB".$terminal, (GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + foreach($paiements as $modep) { + if (in_array($modep->code, array('LIQ', 'CB', 'CHQ'))) continue; + $name="CASHDESK_ID_BANKACCOUNT_".$modep->code.$terminal; + $res = dolibarr_set_const($db, $name, (GETPOST($name, 'alpha') > 0 ? GETPOST($name, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + } + $res = dolibarr_set_const($db, "CASHDESK_ID_WAREHOUSE".$terminal, (GETPOST('CASHDESK_ID_WAREHOUSE'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_WAREHOUSE'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_NO_DECREASE_STOCK".$terminal, GETPOST('CASHDESK_NO_DECREASE_STOCK'.$terminal, '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").' (TakePOS)', $linkback, 'title_setup'); +$head = takepos_prepare_head(); +dol_fiche_head($head, 'terminal'.$terminal, 'TakePOS', -1); +print '
'; + + +// Mode +print ''; +print ''; +print ''; + +print '
'.$langs->trans("Terminal").' 0'.$langs->trans("Value").''.$langs->trans("Parameters").''.$langs->trans("Value").''.$langs->trans("Terminal").' 1'.$langs->trans("Value").'
'.$langs->trans("CashDeskThirdPartyForSell").'
'; +print ''; +print ''; +print "\n"; + +print ''; +print ''; +if (! empty($conf->banque->enabled)) +{ + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + foreach($paiements as $modep) { + if (in_array($modep->code, array('LIQ', 'CB', 'CHQ'))) continue; + $name="CASHDESK_ID_BANKACCOUNT_".$modep->code.$terminal; + print ''; + print ''; + } +} + +if (! empty($conf->stock->enabled)) +{ + + print ''; // Force warehouse (this is not a default value) + print ''; + + $disabled=$conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$terminal}; + + + print ''; // Force warehouse (this is not a default value) + print ''; +} + +print '
'.$langs->trans("Parameters").''.$langs->trans("Value").'
'.$langs->trans("CashDeskThirdPartyForSell").''; +print $form->select_company($conf->global->{'CASHDESK_ID_THIRDPARTY'.$terminal}, 'socid', 's.client in (1, 3) AND s.status = 1', 1, 0, 0, array(), 0); +print '
'.$langs->trans("CashDeskBankAccountForSell").''; + $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$terminal}, 'CASHDESK_ID_BANKACCOUNT_CASH'.$terminal, 0, "courant=2", 1); + print '
'.$langs->trans("CashDeskBankAccountForCheque").''; + $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal}, 'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal, 0, "courant=1", 1); + print '
'.$langs->trans("CashDeskBankAccountForCB").''; + $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$terminal}, 'CASHDESK_ID_BANKACCOUNT_CB'.$terminal, 0, "courant=1", 1); + print '
'.$langs->trans("CashDeskBankAccountFor").' '.$langs->trans($modep->libelle).''; + $cour=preg_match('/^LIQ.*/', $modep->code)?2:1; + $form->select_comptes($conf->global->$name, $name, 0, "courant=".$cour, 1); + print '
'.$langs->trans("CashDeskDoNotDecreaseStock").''; + if (empty($conf->productbatch->enabled)) { + print $form->selectyesno('CASHDESK_NO_DECREASE_STOCK'.$terminal, $conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$terminal}, 1); + } + else + { + if (!$conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$terminal}) { + $res = dolibarr_set_const($db, "CASHDESK_NO_DECREASE_STOCK".$terminal, 1, 'chaine', 0, '', $conf->entity); + } + print $langs->trans("Yes").'
'; + print ''.$langs->trans('StockDecreaseForPointOfSaleDisabledbyBatch').''; + } + print '
'.$langs->trans("CashDeskIdWareHouse").''; + if (! $disabled) + { + print $formproduct->selectWarehouses($conf->global->{'CASHDESK_ID_WAREHOUSE'.$terminal}, 'CASHDESK_ID_WAREHOUSE'.$terminal, '', 1, $disabled); + print ' ('.$langs->trans("Create").')'; + } + else + { + print ''.$langs->trans("StockDecreaseForPointOfSaleDisabled").''; + } + print '
'; +print '
'; + +print '
'; + +print "\n"; + +print '
'; + +llxFooter(); +$db->close(); diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index 2fc99b1a587..7645ef176c5 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -90,7 +90,7 @@ if ($invoiceid > 0) } else { - $ret = $invoice->fetch('', '(PROV-POS-'.$place.')'); + $ret = $invoice->fetch('', '(PROV-POS'.$_SESSION["takepostermvar"].'-'.$place.')'); } if ($ret > 0) { @@ -104,12 +104,12 @@ if ($ret > 0) if ($action == 'valid' && $user->rights->facture->creer) { - if ($pay == "cash") $bankaccount = $conf->global->CASHDESK_ID_BANKACCOUNT_CASH; // For backward compatibility - elseif ($pay == "card") $bankaccount = $conf->global->CASHDESK_ID_BANKACCOUNT_CB; // For backward compatibility - elseif ($pay == "cheque") $bankaccount = $conf->global->CASHDESK_ID_BANKACCOUNT_CHEQUE; // For backward compatibility + if ($pay == "cash") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takepostermvar"]}; // For backward compatibility + elseif ($pay == "card") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$_SESSION["takepostermvar"]}; // For backward compatibility + elseif ($pay == "cheque") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takepostermvar"]}; // For backward compatibility else { - $accountname="CASHDESK_ID_BANKACCOUNT_".$pay; + $accountname="CASHDESK_ID_BANKACCOUNT_".$pay.$_SESSION["takepostermvar"]; $bankaccount=$conf->global->$accountname; } $now=dol_now(); @@ -137,9 +137,9 @@ if ($action == 'valid' && $user->rights->facture->creer) $invoice->update($user); } - if (! empty($conf->stock->enabled) && $conf->global->CASHDESK_NO_DECREASE_STOCK != "1") + if (! empty($conf->stock->enabled) && $conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$_SESSION["takepostermvar"]} != "1") { - $invoice->validate($user, '', $conf->global->CASHDESK_ID_WAREHOUSE); + $invoice->validate($user, '', $conf->global->{'CASHDESK_ID_WAREHOUSE'.$_SESSION["takepostermvar"]}); } else { @@ -180,13 +180,13 @@ if ($action == 'history') if (($action=="addline" || $action=="freezone") && $placeid == 0) { - $invoice->socid = $conf->global->CASHDESK_ID_THIRDPARTY; + $invoice->socid = $conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takepostermvar"]}; $invoice->date = dol_now(); $invoice->module_source = 'takepos'; $invoice->pos_source = (string) $posnb; $placeid = $invoice->create($user); - $sql="UPDATE ".MAIN_DB_PREFIX."facture set ref='(PROV-POS-".$place.")' where rowid=".$placeid; + $sql="UPDATE ".MAIN_DB_PREFIX."facture set ref='(PROV-POS".$_SESSION["takepostermvar"]."-".$place.")' where rowid=".$placeid; $db->query($sql); } @@ -559,11 +559,11 @@ else { // No invoice generated yet print ''; -if ($invoice->socid != $conf->global->CASHDESK_ID_THIRDPARTY) +if ($invoice->socid != $conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takepostermvar"]}) { $soc = new Societe($db); if ($invoice->socid > 0) $soc->fetch($invoice->socid); - else $soc->fetch($conf->global->CASHDESK_ID_THIRDPARTY); + else $soc->fetch($conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takepostermvar"]}); print '

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

'; diff --git a/htdocs/takepos/pay.php b/htdocs/takepos/pay.php index 1fe325dfdeb..74af8f62ae9 100644 --- a/htdocs/takepos/pay.php +++ b/htdocs/takepos/pay.php @@ -51,7 +51,7 @@ if ($invoiceid > 0) } else { - $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS-".$place.")'"; + $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS".$_SESSION["takepostermvar"]."-".$place.")'"; $resql = $db->query($sql); $obj = $db->fetch_object($resql); if ($obj) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index 7f3d5bdc0cc..c80b3b5b932 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -44,7 +44,7 @@ top_httphead('text/html'); if ($place > 0) { - $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS-".$place.")'"; + $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS".$_SESSION["takepostermvar"]."-".$place.")'"; $resql = $db->query($sql); $obj = $db->fetch_object($resql); if ($obj) diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index d5d81880a4e..0db03a20080 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -40,8 +40,15 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant $posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS - $action = GETPOST('action', 'alpha'); +$setterminal = GETPOST('setterminal', 'int'); + +if ($setterminal>0) +{ + $_SESSION["takeposterminal"]=$setterminal; + if ($setterminal==1) $_SESSION["takepostermvar"]=""; + else $_SESSION["takepostermvar"]=$setterminal; +} $langs->loadLangs(array("bills","orders","commercial","cashdesk","receiptprinter")); @@ -538,15 +545,47 @@ function MoreActions(totalactions){ } } +function TerminalsDialog() +{ + jQuery("#dialog-info").dialog({ + resizable: false, + height:200, + width:400, + modal: true, + buttons: { + Terminal1: function() { + location.href='takepos.php?setterminal=1'; + } + global->TAKEPOS_NUM_TERMINALS; $i++) + { + print " + , + Terminal".$i.": function() { + location.href='takepos.php?setterminal=".$i."'; + } + "; + } + ?> + } + }); +} + $( document ).ready(function() { PrintCategories(0); LoadProducts(0); Refresh(); + global->TAKEPOS_NUM_TERMINALS!="1" && $_SESSION["takeposterminal"]=="") print "TerminalsDialog();"; + ?> }); - +global->TAKEPOS_NUM_TERMINALS!="1" && $_SESSION["takeposterminal"]=="") print '
'.$langs->trans('TerminalSelect').'
'; +?>
From 5317d0432da355b1c6a271d3892f59c994e5b948 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 18:32:26 +0200 Subject: [PATCH 0304/1036] Fix bad link --- htdocs/stripe/charge.php | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/htdocs/stripe/charge.php b/htdocs/stripe/charge.php index fb122948dd0..e8823119e30 100644 --- a/htdocs/stripe/charge.php +++ b/htdocs/stripe/charge.php @@ -150,27 +150,30 @@ if (!$rowid) print ''; - if (!empty($stripeacc)) $connect=$stripeacc.'/'; + if (!empty($stripeacc)) $connect=$stripeacc.'/'; // Ref $url='https://dashboard.stripe.com/'.$connect.'test/payments/'.$charge->id; - if ($servicestatus) - { - $url='https://dashboard.stripe.com/'.$connect.'payments/'.$charge->id; - } - print "".img_picto($langs->trans('ShowInStripe'), 'object_globe')." ".$charge->id."\n"; + if ($servicestatus) + { + $url='https://dashboard.stripe.com/'.$connect.'payments/'.$charge->id; + } + print ""; + print "".img_picto($langs->trans('ShowInStripe'), 'object_globe')." ".$charge->id.""; + print "\n"; // Stripe customer print ""; - - if (! empty($conf->stripe->enabled) && !empty($stripeacc)) $connect=$stripeacc.'/'; + if (! empty($conf->stripe->enabled) && !empty($stripeacc)) $connect=$stripeacc.'/'; $url='https://dashboard.stripe.com/'.$connect.'test/customers/'.$charge->customer; if ($servicestatus) { - $url='https://dashboard.stripe.com/'.$connect.'customers/'.$charge->customer; + $url='https://dashboard.stripe.com/'.$connect.'customers/'.$charge->customer; } - print ''.img_picto($langs->trans('ShowInStripe'), 'object_globe').' '.$charge->customer.''; - - print "\n"; + if (! empty($charge->customer)) + { + print ''.img_picto($langs->trans('ShowInStripe'), 'object_globe').' '.$charge->customer.''; + } + print "\n"; // Link print ""; if ($societestatic->id > 0) From f6de2d091d365375565ef7f74ecf487f3ed60a6a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 19:07:12 +0200 Subject: [PATCH 0305/1036] FIX Sending email to mass actions send same email on same customer --- htdocs/compta/facture/list.php | 2 -- htdocs/core/actions_massactions.inc.php | 15 ++++++++------- htdocs/core/tpl/massactions_pre.tpl.php | 3 ++- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index f83b024e6ed..e24c0dc23d4 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -354,8 +354,6 @@ $facturestatic=new Facture($db); $formcompany=new FormCompany($db); $thirdpartystatic=new Societe($db); -// llxHeader('',$langs->trans('CustomersInvoices'),'EN:Customers_Invoices|FR:Factures_Clients|ES:Facturas_a_clientes'); - $sql = 'SELECT'; if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT'; $sql.= ' f.rowid as id, f.facnumber as ref, f.ref_client, f.type, f.note_private, f.note_public, f.increment, f.fk_mode_reglement, f.total as total_ht, f.tva as total_vat, f.total_ttc,'; diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 910f9eca27a..381adbff567 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -365,8 +365,8 @@ if (! $error && $massaction == 'confirm_presend') $looparray[0]=$objectforloop; } //var_dump($looparray);exit; - dol_syslog("We have set an array of ".count($looparray)." emails to send"); - + dol_syslog("We have set an array of ".count($looparray)." emails to send. oneemailperrecipient=".$oneemailperrecipient); + //var_dump($oneemailperrecipient); var_dump($listofqualifiedobj); var_dump($listofqualifiedref); foreach ($looparray as $objectid => $objecttmp) // $objecttmp is a real object or an empty object if we choose to send one email per thirdparty instead of one per object { // Make substitution in email content @@ -387,8 +387,8 @@ if (! $error && $massaction == 'confirm_presend') complete_substitutions_array($substitutionarray, $langs, $objecttmp, $parameters); - $subject=make_substitutions($subject, $substitutionarray); - $message=make_substitutions($message, $substitutionarray); + $subjectreplaced=make_substitutions($subject, $substitutionarray); + $messagereplaced=make_substitutions($message, $substitutionarray); $filepath = $attachedfiles['paths']; $filename = $attachedfiles['names']; @@ -416,10 +416,11 @@ if (! $error && $massaction == 'confirm_presend') } //var_dump($filepath); //var_dump($trackid);exit; + //var_dump($subjectreplaced); // Send mail (substitutionarray must be done just before this) require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,$sendtobcc,$deliveryreceipt,-1,'','',$trackid); + $mailfile = new CMailFile($subjectreplaced, $sendto, $from, $messagereplaced, $filepath, $mimetype, $filename, $sendtocc, $sendtobcc, $deliveryreceipt, -1, '', '', $trackid); if ($mailfile->error) { $resaction.='
'.$mailfile->error.'
'; @@ -451,9 +452,9 @@ if (! $error && $massaction == 'confirm_presend') if ($message) { if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc); - $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject); + $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subjectreplaced); $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); - $actionmsg = dol_concatdesc($actionmsg, $message); + $actionmsg = dol_concatdesc($actionmsg, $messagereplaced); } $actionmsg2=''; diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 9c586f82e9e..a5d7883f3e5 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -112,7 +112,8 @@ if ($massaction == 'presend') $formmail->withtoreadonly = 1; } - $formmail->withoptiononeemailperrecipient = (count($listofselectedref) == 1 || empty($liste))? 0 : ((GETPOST('oneemailperrecipient')=='on')?1:-1); + $formmail->withoptiononeemailperrecipient = ((count($listofselectedref) == 1 && count(reset($listofselectedref)) == 1) || empty($liste)) ? 0 : ((GETPOST('oneemailperrecipient')=='on')?1:-1); + $formmail->withto = empty($liste)?(GETPOST('sendto','alpha')?GETPOST('sendto','alpha'):array()):$liste; $formmail->withtofree = empty($liste)?1:0; $formmail->withtocc = 1; From bb4cda67194fe065216d23234713911827411043 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 19:08:40 +0200 Subject: [PATCH 0306/1036] Fix phpcs --- .../accountancy/bookkeeping/thirdparty_lettering_customer.php | 2 +- .../accountancy/bookkeeping/thirdparty_lettering_supplier.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php index 15de7204e93..81754d121b9 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_customer.php @@ -42,7 +42,7 @@ $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); -$socid = GETPOST('socid','int')?GETPOST('socid','int'):GETPOST('id','int'); +$socid = GETPOST('socid', 'int')?GETPOST('socid', 'int'):GETPOST('id', 'int'); $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST("sortfield", 'alpha'); diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index 16c13caa335..50b80c72338 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -41,7 +41,7 @@ $massaction = GETPOST('massaction', 'alpha'); $show_files = GETPOST('show_files', 'int'); $confirm = GETPOST('confirm', 'alpha'); $toselect = GETPOST('toselect', 'array'); -$socid = GETPOST('socid','int')?GETPOST('socid','int'):GETPOST('id','int'); +$socid = GETPOST('socid', 'int')?GETPOST('socid', 'int'):GETPOST('id', 'int'); $limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; $sortfield = GETPOST("sortfield", 'alpha'); From c3693cb007f7c3ab607b4441d349aa3a2e435168 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 19:10:12 +0200 Subject: [PATCH 0307/1036] Fix phpcs --- htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php index 825771f76cc..23e81826cf7 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php @@ -1312,7 +1312,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders // If CUSTOMER contact defined on order, we use it. Note: Even if this is a supplier object, the code for external contat that follow order is 'CUSTOMER' $usecontact=false; - $arrayidcontact=$object->getIdContact('external','CUSTOMER'); + $arrayidcontact=$object->getIdContact('external', 'CUSTOMER'); if (count($arrayidcontact) > 0) { $usecontact=true; From 96c021773e469236df4861718200d3f42e78e852 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 19:11:17 +0200 Subject: [PATCH 0308/1036] Update takepos.lib.php --- htdocs/core/lib/takepos.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/lib/takepos.lib.php b/htdocs/core/lib/takepos.lib.php index 76c6a358c4b..896a46c8189 100644 --- a/htdocs/core/lib/takepos.lib.php +++ b/htdocs/core/lib/takepos.lib.php @@ -24,6 +24,7 @@ /** * Prepare array with list of tabs * + * @return array Array of tabs */ function takepos_prepare_head() { From 541da011a4db7a34ef87521337d15da84c3d2725 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 21:59:55 +0200 Subject: [PATCH 0309/1036] Prepare 9.0.2 --- ChangeLog | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/ChangeLog b/ChangeLog index 4be15921a53..143aa9859f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,39 @@ English Dolibarr ChangeLog -------------------------------------------------------------- + +***** ChangeLog for 9.0.3 compared to 9.0.2 ***** +FIX: #11013 +FIX: #11041 +FIX: actioncomm: sort events by date after external calendars and hook (into 7.0) +FIX: better test +FIX: Combo list was limited to 20 in stock correction +FIX: Confusion between expired and late +FIX: Cursor pointer in payment screen for autofill +FIX: CVE-2019-11199 +FIX: CVE-2019-11200 +FIX: CVE-2019-11201 +FIX: Default value on form to send email +FIX: error messages not displayed +FIX: Massive debug in lettering function +FIX: missing compatibility with multicompany +FIX: missing global $user +FIX: missing situation invoice in list +FIX: MultiEntity in lettering functionality +FIX: Product accountancey sell intra code must be visible if main feature level 1 +FIX: ref for table without ref manager are set to NULL. +FIX: Sending email to mass actions send same email on same customer +FIX: Several fixes on import of services/products +FIX: shipping default warehouse if only one warehouse +FIX: sortfield on lettering function +FIX: Status of opportunity should never be -1 +FIX: test to display create invoice button on supplier_order card +FIX: The autocopy feature was ko for suppliers +FIX: Total per day in timespent per week +FIX: Total per day shows 00:00 if the total time spent is equal to 12:00 +FIX: Update/delete currency on same languages +FIX: Wrong variable name make contact of supplier order not used on PDF. + ***** ChangeLog for 9.0.2 compared to 9.0.1 ***** FIX: #10822 FIX: Accountancy - Format EBP import From 08fcfded76bc9bf8334cf332477659fa586fc43f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 21:59:55 +0200 Subject: [PATCH 0310/1036] Prepare 9.0.3 --- ChangeLog | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/ChangeLog b/ChangeLog index 4be15921a53..143aa9859f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,39 @@ English Dolibarr ChangeLog -------------------------------------------------------------- + +***** ChangeLog for 9.0.3 compared to 9.0.2 ***** +FIX: #11013 +FIX: #11041 +FIX: actioncomm: sort events by date after external calendars and hook (into 7.0) +FIX: better test +FIX: Combo list was limited to 20 in stock correction +FIX: Confusion between expired and late +FIX: Cursor pointer in payment screen for autofill +FIX: CVE-2019-11199 +FIX: CVE-2019-11200 +FIX: CVE-2019-11201 +FIX: Default value on form to send email +FIX: error messages not displayed +FIX: Massive debug in lettering function +FIX: missing compatibility with multicompany +FIX: missing global $user +FIX: missing situation invoice in list +FIX: MultiEntity in lettering functionality +FIX: Product accountancey sell intra code must be visible if main feature level 1 +FIX: ref for table without ref manager are set to NULL. +FIX: Sending email to mass actions send same email on same customer +FIX: Several fixes on import of services/products +FIX: shipping default warehouse if only one warehouse +FIX: sortfield on lettering function +FIX: Status of opportunity should never be -1 +FIX: test to display create invoice button on supplier_order card +FIX: The autocopy feature was ko for suppliers +FIX: Total per day in timespent per week +FIX: Total per day shows 00:00 if the total time spent is equal to 12:00 +FIX: Update/delete currency on same languages +FIX: Wrong variable name make contact of supplier order not used on PDF. + ***** ChangeLog for 9.0.2 compared to 9.0.1 ***** FIX: #10822 FIX: Accountancy - Format EBP import From 50563ab126fd0ddd72047bfb0bdebf7b1d01b965 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 8 May 2019 22:03:16 +0200 Subject: [PATCH 0311/1036] Prepare 9.0.3 --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 03f949c6fe6..3ad0cfa96e4 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION','9.0.2'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION','9.0.3'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO',chr(128)); From ed98817f0da6a5401eb8c37d5f922812bc6311eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 10:15:38 +0200 Subject: [PATCH 0312/1036] Fix template for situation --- .../modules/facture/doc/pdf_crabe.modules.php | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index 444a2cdcb4e..6e7acdc88ef 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -179,7 +179,7 @@ class pdf_crabe extends ModelePDFFactures // Define position of columns $this->posxdesc=$this->marge_gauche+1; - if($conf->global->PRODUCT_USE_UNITS) + if (!empty($conf->global->PRODUCT_USE_UNITS)) { $this->posxtva=101; $this->posxup=118; @@ -192,8 +192,8 @@ class pdf_crabe extends ModelePDFFactures $this->posxup=126; $this->posxqty=145; } + $this->posxprogress=151; // Only displayed for situation invoices $this->posxdiscount=162; - $this->posxprogress=126; // Only displayed for situation invoices $this->postotalht=174; if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT) || ! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN)) $this->posxtva=$this->posxup; $this->posxpicture=$this->posxtva - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images @@ -382,8 +382,8 @@ class pdf_crabe extends ModelePDFFactures $this->posxtva -= $progress_width; $this->posxup -= $progress_width; $this->posxqty -= $progress_width; - if(empty($conf->global->PRODUCT_USE_UNITS)) { - $this->posxprogress += $progress_width; + if (empty($conf->global->PRODUCT_USE_UNITS)) { + $this->posxunit -= $progress_width; } /*$this->posxdiscount -= $progress_width; $this->posxprogress -= $progress_width;*/ @@ -444,7 +444,7 @@ class pdf_crabe extends ModelePDFFactures complete_substitutions_array($substitutionarray, $outputlangs, $object); $notetoshow = make_substitutions($notetoshow, $substitutionarray, $outputlangs); $notetoshow = convertBackOfficeMediasLinksToPublicLinks($notetoshow); - + $pdf->SetFont('', '', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($notetoshow), 0, 1); $nexY = $pdf->GetY(); @@ -568,7 +568,6 @@ class pdf_crabe extends ModelePDFFactures $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); // Enough for 6 chars - if ($this->situationinvoice) { $pdf->MultiCell($this->posxprogress-$this->posxqty-0.8, 4, $qty, 0, 'R'); @@ -587,7 +586,7 @@ class pdf_crabe extends ModelePDFFactures { $progress = pdf_getlineprogress($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxprogress, $curY); - if($conf->global->PRODUCT_USE_UNITS) + if (! empty($conf->global->PRODUCT_USE_UNITS)) { $pdf->MultiCell($this->posxunit-$this->posxprogress-1, 3, $progress, 0, 'R'); } @@ -602,7 +601,7 @@ class pdf_crabe extends ModelePDFFactures } // Unit - if($conf->global->PRODUCT_USE_UNITS) + if (! empty($conf->global->PRODUCT_USE_UNITS)) { $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails, $hookmanager); $pdf->SetXY($this->posxunit, $curY); @@ -1550,15 +1549,15 @@ class pdf_crabe extends ModelePDFFactures if($conf->global->PRODUCT_USE_UNITS) { - $pdf->MultiCell($this->posxunit-$this->posxprogress, 2, $outputlangs->transnoentities("Progress"), '', 'C'); + $pdf->MultiCell($this->posxunit-$this->posxprogress, 2, $outputlangs->transnoentities("%"), '', 'C'); } elseif ($this->atleastonediscount) { - $pdf->MultiCell($this->posxdiscount-$this->posxprogress, 2, $outputlangs->transnoentities("Progress"), '', 'C'); + $pdf->MultiCell($this->posxdiscount-$this->posxprogress, 2, $outputlangs->transnoentities("%"), '', 'C'); } else { - $pdf->MultiCell($this->postotalht-$this->posxprogress, 2, $outputlangs->transnoentities("Progress"), '', 'C'); + $pdf->MultiCell($this->postotalht-$this->posxprogress, 2, $outputlangs->transnoentities("%"), '', 'C'); } } } @@ -1582,16 +1581,6 @@ class pdf_crabe extends ModelePDFFactures } } - if ($this->situationinvoice) - { - $pdf->line($this->postotalht+4, $tab_top, $this->postotalht+4, $tab_top + $tab_height); - if (empty($hidetop)) - { - $pdf->SetXY($this->postotalht-19, $tab_top+1); - $pdf->MultiCell(30, 2, $outputlangs->transnoentities("Situation"), '', 'C'); - } - } - if ($this->atleastonediscount) { $pdf->line($this->postotalht, $tab_top, $this->postotalht, $tab_top + $tab_height); From 4c90ba1a64f2f21c8b9dbd7a2da777043bd843c4 Mon Sep 17 00:00:00 2001 From: atm-arnaud Date: Thu, 9 May 2019 12:11:18 +0200 Subject: [PATCH 0313/1036] FIX attached files list with link file was broked --- htdocs/core/class/html.formfile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index da2f697d5d4..73aa32ece79 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -833,7 +833,7 @@ class FormFile { $out.=''; $out.=''; - $out.=''; + $out.=''; $out.=$file->label; $out.=''; $out.=''; From d3bbb93ada807222bb77ca755205f0862f8bf557 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 10:15:38 +0200 Subject: [PATCH 0314/1036] Fix template for situation Conflicts: htdocs/core/modules/facture/doc/pdf_crabe.modules.php --- .../commande/doc/pdf_einstein.modules.php | 36 ++-- .../commande/doc/pdf_eratosthene.modules.php | 9 - .../doc/pdf_standard.modules.php | 2 +- .../modules/facture/doc/pdf_crabe.modules.php | 164 ++++++------------ .../product/doc/pdf_standard.modules.php | 19 +- .../modules/propale/doc/pdf_azur.modules.php | 36 ++-- .../stock/doc/pdf_standard.modules.php | 80 +-------- .../pdf/pdf_canelle.modules.php | 38 ++-- .../pdf/pdf_muscadet.modules.php | 38 ++-- .../doc/pdf_aurore.modules.php | 36 ++-- htdocs/langs/en_US/main.lang | 1 + 11 files changed, 119 insertions(+), 340 deletions(-) diff --git a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php index 7009773e582..def09507b92 100644 --- a/htdocs/core/modules/commande/doc/pdf_einstein.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_einstein.modules.php @@ -180,6 +180,7 @@ class pdf_einstein extends ModelePDFCommandes $this->posxtva=110; $this->posxup=126; $this->posxqty=145; + $this->posxunit=162; } $this->posxdiscount=162; $this->postotalht=174; @@ -314,14 +315,16 @@ class pdf_einstein extends ModelePDFCommandes $this->atleastonediscount++; } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) + if (empty($this->atleastonediscount)) { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; + $delta = ($this->postotalht - $this->posxdiscount); + $this->posxpicture+=$delta; + $this->posxtva+=$delta; + $this->posxup+=$delta; + $this->posxqty+=$delta; + $this->posxunit+=$delta; + $this->posxdiscount+=$delta; + // post of fields after are not modified, stay at same position } // New page @@ -475,15 +478,7 @@ class pdf_einstein extends ModelePDFCommandes // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit if($conf->global->PRODUCT_USE_UNITS) @@ -1185,14 +1180,7 @@ class pdf_einstein extends ModelePDFCommandes if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } if($conf->global->PRODUCT_USE_UNITS) { diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 07173f7db13..835e20b2480 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -256,15 +256,6 @@ class pdf_eratosthene extends ModelePDFCommandes } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) - { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; - } // New page $pdf->AddPage(); diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php index 596be42c96c..4dc07ad6140 100644 --- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php @@ -915,7 +915,7 @@ class pdf_standard extends ModeleExpenseReport $pdf->line($this->posxqty-1, $tab_top, $this->posxqty-1, $tab_top + $tab_height); if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - $pdf->MultiCell($this->postotalttc-$this->posxqty - 1,2, $outputlangs->transnoentities("Qty"),'','R'); + $pdf->MultiCell($this->postotalttc-$this->posxqty - 1,2, $outputlangs->transnoentities("Qty"),'','C'); } // Total with all taxes diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index c22b1d23ef7..d6eb5191bb4 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -117,7 +117,7 @@ class pdf_crabe extends ModelePDFFactures /** * Issuer - * @var Company object that emits + * @var Societe object that emits */ public $emetteur; @@ -179,7 +179,7 @@ class pdf_crabe extends ModelePDFFactures // Define position of columns $this->posxdesc=$this->marge_gauche+1; - if($conf->global->PRODUCT_USE_UNITS) + if (!empty($conf->global->PRODUCT_USE_UNITS)) { $this->posxtva=101; $this->posxup=118; @@ -191,9 +191,10 @@ class pdf_crabe extends ModelePDFFactures $this->posxtva=110; $this->posxup=126; $this->posxqty=145; + $this->posxunit=162; } $this->posxdiscount=162; - $this->posxprogress=126; // Only displayed for situation invoices + $this->posxprogress=174; $this->postotalht=174; if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT) || ! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN)) $this->posxtva=$this->posxup; $this->posxpicture=$this->posxtva - (empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?20:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); // width of images @@ -363,14 +364,16 @@ class pdf_crabe extends ModelePDFFactures $this->atleastonediscount++; } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) // retreive space not used by discount + if (empty($this->atleastonediscount)) // retreive space not used by discount { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; + $delta = ($this->posxprogress - $this->posxdiscount); + $this->posxpicture+=$delta; + $this->posxtva+=$delta; + $this->posxup+=$delta; + $this->posxqty+=$delta; + $this->posxunit+=$delta; + $this->posxdiscount+=$delta; + // post of fields after are not modified, stay at same position } $progress_width = 0; @@ -378,15 +381,14 @@ class pdf_crabe extends ModelePDFFactures if ($object->situation_cycle_ref) { $this->situationinvoice = true; - $progress_width = 18; + $progress_width = 10; + $this->posxpicture -= $progress_width; $this->posxtva -= $progress_width; $this->posxup -= $progress_width; $this->posxqty -= $progress_width; - if(empty($conf->global->PRODUCT_USE_UNITS)) { - $this->posxprogress += $progress_width; - } - /*$this->posxdiscount -= $progress_width; - $this->posxprogress -= $progress_width;*/ + $this->posxunit -= $progress_width; + $this->posxdiscount -= $progress_width; + $this->posxprogress -= $progress_width; } // New page @@ -444,7 +446,7 @@ class pdf_crabe extends ModelePDFFactures complete_substitutions_array($substitutionarray, $outputlangs, $object); $notetoshow = make_substitutions($notetoshow, $substitutionarray, $outputlangs); - $pdf->SetFont('','', $default_font_size - 1); + $pdf->SetFont('', '', $default_font_size - 1); $pdf->writeHTMLCell(190, 3, $this->posxdesc-1, $tab_top-1, dol_htmlentitiesbr($notetoshow), 0, 1); $nexY = $pdf->GetY(); $height_note=$nexY-$tab_top; @@ -566,42 +568,10 @@ class pdf_crabe extends ModelePDFFactures // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - - if ($this->situationinvoice) - { - $pdf->MultiCell($this->posxprogress-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - - // Situation progress - if ($this->situationinvoice) - { - $progress = pdf_getlineprogress($object, $i, $outputlangs, $hidedetails); - $pdf->SetXY($this->posxprogress, $curY); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxprogress-1, 3, $progress, 0, 'R'); - } - else if ($this->atleastonediscount) - { - $pdf->MultiCell($this->posxdiscount-$this->posxprogress-1, 3, $progress, 0, 'R'); - } - else - { - $pdf->MultiCell($this->postotalht-$this->posxprogress-1, 3, $progress, 0, 'R'); - } - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit - if($conf->global->PRODUCT_USE_UNITS) + if (! empty($conf->global->PRODUCT_USE_UNITS)) { $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails, $hookmanager); $pdf->SetXY($this->posxunit, $curY); @@ -613,7 +583,15 @@ class pdf_crabe extends ModelePDFFactures { $pdf->SetXY($this->posxdiscount-2, $curY); $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); - $pdf->MultiCell($this->postotalht-$this->posxdiscount+2, 3, $remise_percent, 0, 'R'); + $pdf->MultiCell($this->posxprogress-$this->posxdiscount+2, 3, $remise_percent, 0, 'R'); + } + + // Situation progress + if ($this->situationinvoice) + { + $progress = pdf_getlineprogress($object, $i, $outputlangs, $hidedetails); + $pdf->SetXY($this->posxprogress, $curY); + $pdf->MultiCell($this->postotalht-$this->posxprogress-1, 3, $progress, 0, 'R'); } // Total HT line @@ -1524,76 +1502,38 @@ class pdf_crabe extends ModelePDFFactures if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - - if($this->situationinvoice) - { - $pdf->MultiCell($this->posxprogress-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } - if ($this->situationinvoice) { - $pdf->line($this->posxprogress - 1, $tab_top, $this->posxprogress - 1, $tab_top + $tab_height); - - if (empty($hidetop)) { - - $pdf->SetXY($this->posxprogress, $tab_top+1); - - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxprogress,2, $outputlangs->transnoentities("Progress"),'','C'); - } - else if ($this->atleastonediscount) - { - $pdf->MultiCell($this->posxdiscount-$this->posxprogress,2, $outputlangs->transnoentities("Progress"),'','C'); - } - else - { - $pdf->MultiCell($this->postotalht-$this->posxprogress,2, $outputlangs->transnoentities("Progress"),'','C'); - } - } - } - - if($conf->global->PRODUCT_USE_UNITS) { + if (! empty($conf->global->PRODUCT_USE_UNITS)) + { $pdf->line($this->posxunit - 1, $tab_top, $this->posxunit - 1, $tab_top + $tab_height); if (empty($hidetop)) { $pdf->SetXY($this->posxunit - 1, $tab_top + 1); - $pdf->MultiCell($this->posxdiscount - $this->posxunit - 1, 2, $outputlangs->transnoentities("Unit"), '', - 'C'); - } - } - - $pdf->line($this->posxdiscount-1, $tab_top, $this->posxdiscount-1, $tab_top + $tab_height); - if (empty($hidetop)) - { - if ($this->atleastonediscount) - { - $pdf->SetXY($this->posxdiscount-1, $tab_top+1); - $pdf->MultiCell($this->postotalht-$this->posxdiscount+1,2, $outputlangs->transnoentities("ReductionShort"),'','C'); - } - } - - if ($this->situationinvoice) - { - $pdf->line($this->postotalht+4, $tab_top, $this->postotalht+4, $tab_top + $tab_height); - if (empty($hidetop)) - { - $pdf->SetXY($this->postotalht-19, $tab_top+1); - $pdf->MultiCell(30,2, $outputlangs->transnoentities("Situation"),'','C'); + $pdf->MultiCell($this->posxdiscount - $this->posxunit - 1, 2, $outputlangs->transnoentities("Unit"), '', 'C'); } } if ($this->atleastonediscount) { - $pdf->line($this->postotalht, $tab_top, $this->postotalht, $tab_top + $tab_height); - } + $pdf->line($this->posxdiscount-1, $tab_top, $this->posxdiscount-1, $tab_top + $tab_height); + if (empty($hidetop)) + { + $pdf->SetXY($this->posxdiscount-1, $tab_top+1); + $pdf->MultiCell($this->posxprogress-$this->posxdiscount+1,2, $outputlangs->transnoentities("ReductionShort"),'','C'); + } + } + + if ($this->situationinvoice) { + $pdf->line($this->posxprogress - 1, $tab_top, $this->posxprogress - 1, $tab_top + $tab_height); + if (empty($hidetop)) { + $pdf->SetXY($this->posxprogress, $tab_top+1); + $pdf->MultiCell($this->postotalht-$this->posxprogress, 2, $outputlangs->transnoentities("ProgressShort"), '', 'C'); + } + } + + $pdf->line($this->postotalht, $tab_top, $this->postotalht, $tab_top + $tab_height); + if (empty($hidetop)) { $pdf->SetXY($this->postotalht-1, $tab_top+1); diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index e9af5b9aa6e..cf3a31d5c3a 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -422,15 +422,7 @@ class pdf_standard extends ModelePDFProduct // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit if($conf->global->PRODUCT_USE_UNITS) @@ -663,14 +655,7 @@ class pdf_standard extends ModelePDFProduct if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } if($conf->global->PRODUCT_USE_UNITS) { diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index 3d7b5b44c34..8aef1aff7b0 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -179,6 +179,7 @@ class pdf_azur extends ModelePDFPropales $this->posxtva=110; $this->posxup=126; $this->posxqty=145; + $this->posxunit=162; } $this->posxdiscount=162; $this->postotalht=174; @@ -368,14 +369,16 @@ class pdf_azur extends ModelePDFPropales $this->atleastonediscount++; } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) + if (empty($this->atleastonediscount)) { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; + $delta = ($this->postotalht - $this->posxdiscount); + $this->posxpicture+=$delta; + $this->posxtva+=$delta; + $this->posxup+=$delta; + $this->posxqty+=$delta; + $this->posxunit+=$delta; + $this->posxdiscount+=$delta; + // post of fields after are not modified, stay at same position } // New page @@ -573,15 +576,7 @@ class pdf_azur extends ModelePDFPropales // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit if($conf->global->PRODUCT_USE_UNITS) @@ -1389,14 +1384,7 @@ class pdf_azur extends ModelePDFPropales if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } if($conf->global->PRODUCT_USE_UNITS) { diff --git a/htdocs/core/modules/stock/doc/pdf_standard.modules.php b/htdocs/core/modules/stock/doc/pdf_standard.modules.php index c27eb0e2f81..711bd84e8a3 100644 --- a/htdocs/core/modules/stock/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/stock/doc/pdf_standard.modules.php @@ -636,89 +636,11 @@ class pdf_standard extends ModelePDFStock $pdf->SetFont('','', $default_font_size - 1); // On repositionne la police par defaut - // VAT Rate - if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT) && empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN)) - { - $vat_rate = pdf_getlinevatrate($object, $i, $outputlangs, $hidedetails); - $pdf->SetXY($this->posxtva, $curY); - $pdf->MultiCell($this->posxup-$this->posxtva-0.8, 3, $vat_rate, 0, 'R'); - } - - // Unit price before discount - $up_excl_tax = pdf_getlineupexcltax($object, $i, $outputlangs, $hidedetails); - $pdf->SetXY($this->posxup, $curY); - $pdf->MultiCell($this->posxqty-$this->posxup-0.8, 3, $up_excl_tax, 0, 'R', 0); - // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - - // Unit - if($conf->global->PRODUCT_USE_UNITS) - { - $unit = pdf_getlineunit($object, $i, $outputlangs, $hidedetails, $hookmanager); - $pdf->SetXY($this->posxunit, $curY); - $pdf->MultiCell($this->posxdiscount-$this->posxunit-0.8, 4, $unit, 0, 'L'); - } - - // Discount on line - $pdf->SetXY($this->posxdiscount, $curY); - if ($object->lines[$i]->remise_percent) - { - $pdf->SetXY($this->posxdiscount-2, $curY); - $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); - $pdf->MultiCell($this->postotalht-$this->posxdiscount+2, 3, $remise_percent, 0, 'R'); - } - - // Total HT line - $total_excl_tax = pdf_getlinetotalexcltax($object, $i, $outputlangs, $hidedetails); - $pdf->SetXY($this->postotalht, $curY); - $pdf->MultiCell($this->page_largeur-$this->marge_droite-$this->postotalht, 3, $total_excl_tax, 0, 'R', 0); - - // Collecte des totaux par valeur de tva dans $this->tva["taux"]=total_tva - if ($conf->multicurrency->enabled && $object->multicurrency_tx != 1) $tvaligne=$object->lines[$i]->multicurrency_total_tva; - else $tvaligne=$object->lines[$i]->total_tva; - - $localtax1ligne=$object->lines[$i]->total_localtax1; - $localtax2ligne=$object->lines[$i]->total_localtax2; - $localtax1_rate=$object->lines[$i]->localtax1_tx; - $localtax2_rate=$object->lines[$i]->localtax2_tx; - $localtax1_type=$object->lines[$i]->localtax1_type; - $localtax2_type=$object->lines[$i]->localtax2_type; - - if ($object->remise_percent) $tvaligne-=($tvaligne*$object->remise_percent)/100; - if ($object->remise_percent) $localtax1ligne-=($localtax1ligne*$object->remise_percent)/100; - if ($object->remise_percent) $localtax2ligne-=($localtax2ligne*$object->remise_percent)/100; - - $vatrate=(string) $object->lines[$i]->tva_tx; - - // Retrieve type from database for backward compatibility with old records - if ((! isset($localtax1_type) || $localtax1_type=='' || ! isset($localtax2_type) || $localtax2_type=='') // if tax type not defined - && (! empty($localtax1_rate) || ! empty($localtax2_rate))) // and there is local tax - { - $localtaxtmp_array=getLocalTaxesFromRate($vatrate,0,$object->thirdparty,$mysoc); - $localtax1_type = $localtaxtmp_array[0]; - $localtax2_type = $localtaxtmp_array[2]; - } - - // retrieve global local tax - if ($localtax1_type && $localtax1ligne != 0) - $this->localtax1[$localtax1_type][$localtax1_rate]+=$localtax1ligne; - if ($localtax2_type && $localtax2ligne != 0) - $this->localtax2[$localtax2_type][$localtax2_rate]+=$localtax2ligne; - - if (($object->lines[$i]->info_bits & 0x01) == 0x01) $vatrate.='*'; - if (! isset($this->tva[$vatrate])) $this->tva[$vatrate]=0; - $this->tva[$vatrate] += $tvaligne; + $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Add line if (! empty($conf->global->MAIN_PDF_DASH_BETWEEN_LINES) && $i < ($nblignes - 1)) diff --git a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php index f44240daa83..88ad771d1cd 100644 --- a/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php +++ b/htdocs/core/modules/supplier_invoice/pdf/pdf_canelle.modules.php @@ -153,6 +153,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $this->posxtva=112; $this->posxup=126; $this->posxqty=145; + $this->posxunit=162; $this->posxdiscount=162; $this->postotalht=174; @@ -302,14 +303,16 @@ class pdf_canelle extends ModelePDFSuppliersInvoices $this->atleastonediscount++; } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) + if (empty($this->atleastonediscount)) { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; + $delta = ($this->postotalht - $this->posxdiscount); + $this->posxpicture+=$delta; + $this->posxtva+=$delta; + $this->posxup+=$delta; + $this->posxqty+=$delta; + $this->posxunit+=$delta; + $this->posxdiscount+=$delta; + // post of fields after are not modified, stay at same position } // New page @@ -447,15 +450,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit if($conf->global->PRODUCT_USE_UNITS) @@ -470,7 +465,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices if ($object->lines[$i]->remise_percent) { $remise_percent = pdf_getlineremisepercent($object, $i, $outputlangs, $hidedetails); - $pdf->MultiCell($this->postotalht-$this->posxdiscount-1, 3, $remise_percent."%", 0, 'R'); + $pdf->MultiCell($this->postotalht-$this->posxdiscount-1, 3, $remise_percent, 0, 'R'); } // Total HT line @@ -887,14 +882,7 @@ class pdf_canelle extends ModelePDFSuppliersInvoices if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } if($conf->global->PRODUCT_USE_UNITS) { diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php index e0546fd61aa..a6d7a71ef24 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_muscadet.modules.php @@ -159,7 +159,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $this->emetteur=$mysoc; if (empty($this->emetteur->country_code)) $this->emetteur->country_code=substr($langs->defaultlang,-2); // By default, if was not defined - // Defini position des colonnes + // Define position of columns $this->posxdesc=$this->marge_gauche+1; $this->posxdiscount=162; $this->postotalht=174; @@ -174,6 +174,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $this->posxtva=110; $this->posxup=126; $this->posxqty=145; + $this->posxunit=162; } if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) $this->posxup = $this->posxtva; // posxtva is picture position reference @@ -350,14 +351,16 @@ class pdf_muscadet extends ModelePDFSuppliersOrders $this->atleastonediscount++; } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) + if (empty($this->atleastonediscount)) { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; + $delta = ($this->postotalht - $this->posxdiscount); + $this->posxpicture+=$delta; + $this->posxtva+=$delta; + $this->posxup+=$delta; + $this->posxqty+=$delta; + $this->posxunit+=$delta; + $this->posxdiscount+=$delta; + // post of fields after are not modified, stay at same position } // New page @@ -526,15 +529,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 4, $qty, 0, 'R'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit if($conf->global->PRODUCT_USE_UNITS) @@ -1072,14 +1067,7 @@ class pdf_muscadet extends ModelePDFSuppliersOrders if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } if($conf->global->PRODUCT_USE_UNITS) { diff --git a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php index b9f9aa39dcf..8e2985369b6 100644 --- a/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php +++ b/htdocs/core/modules/supplier_proposal/doc/pdf_aurore.modules.php @@ -171,6 +171,7 @@ class pdf_aurore extends ModelePDFSupplierProposal $this->posxtva=102; $this->posxup=126; $this->posxqty=145; + $this->posxunit=162; } if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT) || ! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN)) $this->posxup=$this->posxtva; @@ -339,14 +340,16 @@ class pdf_aurore extends ModelePDFSupplierProposal $this->atleastonediscount++; } } - if (empty($this->atleastonediscount) && empty($conf->global->PRODUCT_USE_UNITS)) + if (empty($this->atleastonediscount)) { - $this->posxpicture+=($this->postotalht - $this->posxdiscount); - $this->posxtva+=($this->postotalht - $this->posxdiscount); - $this->posxup+=($this->postotalht - $this->posxdiscount); - $this->posxqty+=($this->postotalht - $this->posxdiscount); - $this->posxdiscount+=($this->postotalht - $this->posxdiscount); - //$this->postotalht; + $delta = ($this->postotalht - $this->posxdiscount); + $this->posxpicture+=$delta; + $this->posxtva+=$delta; + $this->posxup+=$delta; + $this->posxqty+=$delta; + $this->posxunit+=$delta; + $this->posxdiscount+=$delta; + // post of fields after are not modified, stay at same position } // New page @@ -518,15 +521,7 @@ class pdf_aurore extends ModelePDFSupplierProposal // Quantity $qty = pdf_getlineqty($object, $i, $outputlangs, $hidedetails); $pdf->SetXY($this->posxqty, $curY); - // Enough for 6 chars - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 3, $qty, 0, 'R'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-0.8, 3, $qty, 0, 'R'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-0.8, 4, $qty, 0, 'R'); // Enough for 6 chars // Unit if($conf->global->PRODUCT_USE_UNITS) @@ -1230,14 +1225,7 @@ class pdf_aurore extends ModelePDFSupplierProposal if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - if($conf->global->PRODUCT_USE_UNITS) - { - $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } - else - { - $pdf->MultiCell($this->posxdiscount-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); - } + $pdf->MultiCell($this->posxunit-$this->posxqty-1,2, $outputlangs->transnoentities("Qty"),'','C'); } if($conf->global->PRODUCT_USE_UNITS) { diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 7891a7c1d7b..6efba19536b 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -827,6 +827,7 @@ RelatedObjects=Related Objects ClassifyBilled=Classify billed ClassifyUnbilled=Classify unbilled Progress=Progress +ProgressShort=Progr. FrontOffice=Front office BackOffice=Back office View=View From f1fd4108ae9d8e0833845289f6910682020fbe7f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 12:17:20 +0200 Subject: [PATCH 0315/1036] Debug/Clean code --- .../core/modules/bank/doc/pdf_ban.modules.php | 1 - .../bank/doc/pdf_sepamandate.modules.php | 9 ++------- .../commande/doc/pdf_eratosthene.modules.php | 18 +----------------- .../modules/propale/doc/pdf_cyan.modules.php | 16 ---------------- .../supplier_order/pdf/pdf_cornas.modules.php | 18 +----------------- 5 files changed, 4 insertions(+), 58 deletions(-) diff --git a/htdocs/core/modules/bank/doc/pdf_ban.modules.php b/htdocs/core/modules/bank/doc/pdf_ban.modules.php index 53a38eb70ed..5deb40fc7ad 100644 --- a/htdocs/core/modules/bank/doc/pdf_ban.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_ban.modules.php @@ -84,7 +84,6 @@ class pdf_ban extends ModeleBankAccountDoc $this->posxref=$this->marge_gauche+1; $this->posxlabel=$this->marge_gauche+25; $this->posxworkload=$this->marge_gauche+100; - $this->posxprogress=$this->marge_gauche+130; $this->posxdatestart=$this->marge_gauche+150; $this->posxdateend=$this->marge_gauche+170; } diff --git a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php index 1c10871eae1..9783c4690b2 100644 --- a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php @@ -83,12 +83,7 @@ class pdf_sepamandate extends ModeleBankAccountDoc if (! $this->emetteur->country_code) $this->emetteur->country_code=substr($langs->defaultlang, -2); // By default if not defined // Defini position des colonnes - $this->posxref=$this->marge_gauche+1; - $this->posxlabel=$this->marge_gauche+25; - $this->posxworkload=$this->marge_gauche+100; - $this->posxprogress=$this->marge_gauche+130; - $this->posxdatestart=$this->marge_gauche+150; - $this->posxdateend=$this->marge_gauche+170; + $this->posxref=$this->marge_gauche; } @@ -203,7 +198,7 @@ class pdf_sepamandate extends ModeleBankAccountDoc if (! empty($object->note_public)) { $pdf->SetFont('', '', $default_font_size - 1); - $pdf->writeHTMLCell(190, 3, $this->posxref-1, $tab_top-2, dol_htmlentitiesbr($object->note_public), 0, 1); + $pdf->writeHTMLCell(190, 3, $this->posxref, $tab_top-2, dol_htmlentitiesbr($object->note_public), 0, 1); $nexY = $pdf->GetY(); $height_note=$nexY-($tab_top-2); diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 3695576d0d3..2b059eec331 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -424,7 +424,7 @@ class pdf_eratosthene extends ModelePDFCommandes complete_substitutions_array($substitutionarray, $outputlangs, $object); $notetoshow = make_substitutions($notetoshow, $substitutionarray, $outputlangs); $notetoshow = convertBackOfficeMediasLinksToPublicLinks($notetoshow); - + $tab_top -= 2; $pdf->startTransaction(); @@ -1711,22 +1711,6 @@ class pdf_eratosthene extends ModelePDFCommandes 'border-left' => true, // add left line separator ); - $rank = $rank + 10; - $this->cols['progress'] = array( - 'rank' => $rank, - 'width' => 19, // in mm - 'status' => false, - 'title' => array( - 'textkey' => 'Progress' - ), - 'border-left' => false, // add left line separator - ); - - if($this->situationinvoice) - { - $this->cols['progress']['status'] = true; - } - $rank = $rank + 10; $this->cols['unit'] = array( 'rank' => $rank, diff --git a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php index 5a71c060a51..14a2456157a 100644 --- a/htdocs/core/modules/propale/doc/pdf_cyan.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_cyan.modules.php @@ -1863,22 +1863,6 @@ class pdf_cyan extends ModelePDFPropales 'border-left' => true, // add left line separator ); - $rank = $rank + 10; - $this->cols['progress'] = array( - 'rank' => $rank, - 'width' => 19, // in mm - 'status' => false, - 'title' => array( - 'textkey' => 'Progress' - ), - 'border-left' => false, // add left line separator - ); - - if($this->situationinvoice) - { - $this->cols['progress']['status'] = true; - } - $rank = $rank + 10; $this->cols['unit'] = array( 'rank' => $rank, diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php index 0e3da7781cd..cf71d691715 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php @@ -376,7 +376,7 @@ class pdf_cornas extends ModelePDFSuppliersOrders complete_substitutions_array($substitutionarray, $outputlangs, $object); $notetoshow = make_substitutions($notetoshow, $substitutionarray, $outputlangs); $notetoshow = convertBackOfficeMediasLinksToPublicLinks($notetoshow); - + $tab_top -= 2; $pdf->startTransaction(); @@ -1550,22 +1550,6 @@ class pdf_cornas extends ModelePDFSuppliersOrders 'border-left' => true, // add left line separator ); - $rank = $rank + 10; - $this->cols['progress'] = array( - 'rank' => $rank, - 'width' => 19, // in mm - 'status' => false, - 'title' => array( - 'textkey' => 'Progress' - ), - 'border-left' => false, // add left line separator - ); - - if($this->situationinvoice) - { - $this->cols['progress']['status'] = true; - } - $rank = $rank + 10; $this->cols['unit'] = array( 'rank' => $rank, From af8d2e0e1adf9de4ba156752e605d5ffecf85d0c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 12:31:51 +0200 Subject: [PATCH 0316/1036] Fix error message when module disabled --- htdocs/admin/emailcollector_card.php | 4 ++-- htdocs/admin/emailcollector_list.php | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/admin/emailcollector_card.php b/htdocs/admin/emailcollector_card.php index eaef18c9543..ca30af7ae69 100644 --- a/htdocs/admin/emailcollector_card.php +++ b/htdocs/admin/emailcollector_card.php @@ -33,8 +33,8 @@ include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollectorfilter.class include_once DOL_DOCUMENT_ROOT.'/emailcollector/class/emailcollectoraction.class.php'; include_once DOL_DOCUMENT_ROOT.'/emailcollector/lib/emailcollector.lib.php'; -if (!$user->admin) - accessforbidden(); +if (!$user->admin) accessforbidden(); +if (empty($conf->emailcollector->enabled)) accessforbidden(); // Load traductions files requiredby by page $langs->loadLangs(array("admin", "mails", "other")); diff --git a/htdocs/admin/emailcollector_list.php b/htdocs/admin/emailcollector_list.php index cacebb8e55d..f56afd9074d 100644 --- a/htdocs/admin/emailcollector_list.php +++ b/htdocs/admin/emailcollector_list.php @@ -32,6 +32,7 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php'; dol_include_once('/emailcollector/class/emailcollector.class.php'); if (!$user->admin) accessforbidden(); +if (empty($conf->emailcollector->enabled)) accessforbidden(); // Load traductions files requiredby by page $langs->loadLangs(array("admin", "other")); @@ -450,10 +451,10 @@ while ($i < min($num, $limit)) $cssforfield=''; if (in_array($val['type'], array('date','datetime','timestamp'))) $cssforfield.=($cssforfield?' ':'').'center'; elseif ($key == 'status') $cssforfield.=($cssforfield?' ':'').'center'; - + if (in_array($val['type'], array('timestamp'))) $cssforfield.=($cssforfield?' ':'').'nowrap'; elseif ($key == 'ref') $cssforfield.=($cssforfield?' ':'').'nowrap'; - + if (! empty($arrayfields['t.'.$key]['checked'])) { print ' Date: Thu, 9 May 2019 12:38:00 +0200 Subject: [PATCH 0317/1036] FIX: Add hidden option MAIN_PDF_HIDE_SITUATION to hide situation (quick hack to fix output pb). --- ChangeLog | 1 + htdocs/core/modules/facture/doc/pdf_crabe.modules.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 143aa9859f3..b92b23a0748 100644 --- a/ChangeLog +++ b/ChangeLog @@ -34,6 +34,7 @@ FIX: Total per day in timespent per week FIX: Total per day shows 00:00 if the total time spent is equal to 12:00 FIX: Update/delete currency on same languages FIX: Wrong variable name make contact of supplier order not used on PDF. +FIX: Add hidden option MAIN_PDF_HIDE_SITUATION to hide situation (quick hack to fix output pb). ***** ChangeLog for 9.0.2 compared to 9.0.1 ***** FIX: #10822 diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index d6eb5191bb4..c1172587ab5 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -378,7 +378,7 @@ class pdf_crabe extends ModelePDFFactures $progress_width = 0; // Situation invoice handling - if ($object->situation_cycle_ref) + if ($object->situation_cycle_ref && empty($conf->global->MAIN_PDF_HIDE_SITUATION)) { $this->situationinvoice = true; $progress_width = 10; From 5aa7382aee2ee183f698de58e53294cba86b9f80 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 12:42:57 +0200 Subject: [PATCH 0318/1036] Fix packager for 10.0 --- build/makepack-dolibarr.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index 96ae320e1b5..8f9951ef157 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -129,7 +129,7 @@ $BUILDROOT="$TEMP/buildroot"; $result = open( IN, "<" . $SOURCE . "/htdocs/filefunc.inc.php" ); if ( !$result ) { die "Error: Can't open descriptor file " . $SOURCE . "/htdocs/filefunc.inc.php\n"; } while () { - if ( $_ =~ /define\('DOL_VERSION','([\d\.a-z\-]+)'\)/ ) { $PROJVERSION = $1; break; } + if ( $_ =~ /define\('DOL_VERSION',\s*'([\d\.a-z\-]+)'\)/ ) { $PROJVERSION = $1; break; } } close IN; ($MAJOR,$MINOR,$BUILD)=split(/\./,$PROJVERSION,3); From bf3de83c5d1ff49c088e62f889b897c969125ed6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 12:45:14 +0200 Subject: [PATCH 0319/1036] Fix typo --- build/makepack-dolibarr.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index 16b4f64a0d2..0f1f98ea08b 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -357,7 +357,7 @@ if ($nboftargetok) { } else { - print "ChangeLog for $MAJOR.$MINOR\.$BUILD was found into '$SOURCE/ChangeLog. But you can regenerate it with command:'\n"; + print "ChangeLog for $MAJOR.$MINOR\.$BUILD was found into '$SOURCE/ChangeLog'. But you can regenerate it with command:\n"; } if (! $BUILD || $BUILD eq '0-rc') # For a major version { From 84714f39e21ea0be702a7f7e556471f787514f78 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 13:37:20 +0200 Subject: [PATCH 0320/1036] Fix setup of terminal --- htdocs/core/lib/takepos.lib.php | 4 ++-- htdocs/langs/en_US/cashdesk.lang | 3 ++- htdocs/takepos/admin/setup.php | 30 +++++++++++++++++------------ htdocs/takepos/admin/terminal.php | 32 ++++++++++++++++++------------- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/htdocs/core/lib/takepos.lib.php b/htdocs/core/lib/takepos.lib.php index 896a46c8189..d5e2d3be854 100644 --- a/htdocs/core/lib/takepos.lib.php +++ b/htdocs/core/lib/takepos.lib.php @@ -37,8 +37,8 @@ function takepos_prepare_head() $head[$h][1] = $langs->trans("Parameters"); $head[$h][2] = 'setup'; $h++; - - for ($i = 2; $i <= $conf->global->TAKEPOS_NUM_TERMINALS; $i++) + + for ($i = 1; $i <= $conf->global->TAKEPOS_NUM_TERMINALS; $i++) { $head[$h][0] = DOL_URL_ROOT.'/takepos/admin/terminal.php?terminal='.$i; $head[$h][1] = $langs->trans("Terminal"). " ".$i; diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index 629416df6ed..f0e2d029878 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -64,5 +64,6 @@ EnableBarOrRestaurantFeatures=Enable features for Bar or Restaurant ConfirmDeletionOfThisPOSSale=Do your confirm the deletion of this current sale ? History=History ValidateAndClose=Validate and close -Terminals=Terminals +Terminal=Terminal +NumberOfTerminals=Number of Terminals TerminalSelect=Select terminal you want to use: \ No newline at end of file diff --git a/htdocs/takepos/admin/setup.php b/htdocs/takepos/admin/setup.php index 7f51508dfc5..b685d9e97d2 100644 --- a/htdocs/takepos/admin/setup.php +++ b/htdocs/takepos/admin/setup.php @@ -64,6 +64,7 @@ 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); @@ -76,6 +77,8 @@ if (GETPOST('action', 'alpha') == 'set') } $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, "TAKEPOS_ROOT_CATEGORY_ID", GETPOST('TAKEPOS_ROOT_CATEGORY_ID', 'alpha'), 'chaine', 0, '', $conf->entity); @@ -140,6 +143,15 @@ print ''; print ''.$langs->trans("Parameters").''.$langs->trans("Value").''; print "\n"; +// Terminals +print ''; +print $langs->trans("NumberOfTerminals"); +print ''; +$array=array(1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5", 6=>"6", 7=>"7", 8=>"8", 9=>"9"); +print $form->selectarray('TAKEPOS_NUM_TERMINALS', $array, (empty($conf->global->TAKEPOS_NUM_TERMINALS)?'0':$conf->global->TAKEPOS_NUM_TERMINALS), 0); +print "\n"; + +// Services if (! empty($conf->service->enabled)) { print ''; @@ -148,14 +160,15 @@ if (! empty($conf->service->enabled)) print $form->selectyesno("CASHDESK_SERVICES", $conf->global->CASHDESK_SERVICES, 1); print "\n"; } + +// Auto print tickets print ''; print $langs->trans("AutoPrintTickets"); print ''; print $form->selectyesno("TAKEPOS_AUTO_PRINT_TICKETS", $conf->global->TAKEPOS_AUTO_PRINT_TICKETS, 1); print "\n"; - - +// Root category for products print ''; print $form->textwithpicto($langs->trans("RootCategoryForProductsToSell"), $langs->trans("RootCategoryForProductsToSellDesc")); print ''; @@ -253,19 +266,11 @@ else } print "\n"; -// Terminals -print ''; -print $langs->trans("Terminals"); -print ''; -$array=array(1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5"); -print $form->selectarray('TAKEPOS_NUM_TERMINALS', $array, (empty($conf->global->TAKEPOS_NUM_TERMINALS)?'0':$conf->global->TAKEPOS_NUM_TERMINALS), 0); -print "\n"; - print ''; print '
'; - +/* print ''; print ''; if (!$conf->global->TAKEPOS_NUM_TERMINALS || $conf->global->TAKEPOS_NUM_TERMINALS=="1") print ''; @@ -296,7 +301,7 @@ if (! empty($conf->banque->enabled)) $name="CASHDESK_ID_BANKACCOUNT_".$modep->code; print ''; print ''; } @@ -339,6 +344,7 @@ if (! empty($conf->stock->enabled)) print '
'.$langs->trans("Parameters").''.$langs->trans("Value").'
'.$langs->trans("CashDeskBankAccountFor").' '.$langs->trans($modep->libelle).''; - $cour=preg_match('/^LIQ.*/', $modep->code)?2:1; + $cour=preg_match('|^LIQ.*|', $modep->code)?2:1; $form->select_comptes($conf->global->$name, $name, 0, "courant=".$cour, 1); print '
'; print '
'; +*/ print '
'; diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php index fadf5b971f9..7085d904891 100644 --- a/htdocs/takepos/admin/terminal.php +++ b/htdocs/takepos/admin/terminal.php @@ -57,26 +57,31 @@ if($resql){ } } +$terminaltouse = $terminal; +if ($terminaltouse == '1') $terminaltouse = ''; + + /* * Actions */ + if (GETPOST('action', 'alpha') == 'set') { $db->begin(); if (GETPOST('socid', 'int') < 0) $_POST["socid"]=''; - $res = dolibarr_set_const($db, "CASHDESK_ID_THIRDPARTY".$terminal, (GETPOST('socid', 'int') > 0 ? GETPOST('socid', 'int') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_THIRDPARTY".$terminaltouse, (GETPOST('socid', 'int') > 0 ? GETPOST('socid', 'int') : ''), 'chaine', 0, '', $conf->entity); - $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CASH".$terminal, (GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); - $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CHEQUE".$terminal, (GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); - $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CB".$terminal, (GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CASH".$terminaltouse, (GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CASH'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CHEQUE".$terminaltouse, (GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_BANKACCOUNT_CB".$terminaltouse, (GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_BANKACCOUNT_CB'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity); foreach($paiements as $modep) { if (in_array($modep->code, array('LIQ', 'CB', 'CHQ'))) continue; - $name="CASHDESK_ID_BANKACCOUNT_".$modep->code.$terminal; + $name="CASHDESK_ID_BANKACCOUNT_".$modep->code.$terminaltouse; $res = dolibarr_set_const($db, $name, (GETPOST($name, 'alpha') > 0 ? GETPOST($name, 'alpha') : ''), 'chaine', 0, '', $conf->entity); } - $res = dolibarr_set_const($db, "CASHDESK_ID_WAREHOUSE".$terminal, (GETPOST('CASHDESK_ID_WAREHOUSE'.$terminal, 'alpha') > 0 ? GETPOST('CASHDESK_ID_WAREHOUSE'.$terminal, 'alpha') : ''), 'chaine', 0, '', $conf->entity); - $res = dolibarr_set_const($db, "CASHDESK_NO_DECREASE_STOCK".$terminal, GETPOST('CASHDESK_NO_DECREASE_STOCK'.$terminal, 'alpha'), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_ID_WAREHOUSE".$terminaltouse, (GETPOST('CASHDESK_ID_WAREHOUSE'.$terminaltouse, 'alpha') > 0 ? GETPOST('CASHDESK_ID_WAREHOUSE'.$terminaltouse, 'alpha') : ''), 'chaine', 0, '', $conf->entity); + $res = dolibarr_set_const($db, "CASHDESK_NO_DECREASE_STOCK".$terminaltouse, GETPOST('CASHDESK_NO_DECREASE_STOCK'.$terminaltouse, 'alpha'), 'chaine', 0, '', $conf->entity); dol_syslog("admin/cashdesk: level ".GETPOST('level', 'alpha')); @@ -94,6 +99,7 @@ if (GETPOST('action', 'alpha') == 'set') } } + /* * View */ @@ -111,7 +117,7 @@ print '
'; // Mode -print '
'; +print ''; print ''; print ''; @@ -122,26 +128,26 @@ print "\n"; print ''.$langs->trans("CashDeskThirdPartyForSell").''; print ''; -print $form->select_company($conf->global->{'CASHDESK_ID_THIRDPARTY'.$terminal}, 'socid', 's.client in (1, 3) AND s.status = 1', 1, 0, 0, array(), 0); +print $form->select_company($conf->global->{'CASHDESK_ID_THIRDPARTY'.$terminaltouse}, 'socid', 's.client in (1, 3) AND s.status = 1', 1, 0, 0, array(), 0); print ''; if (! empty($conf->banque->enabled)) { print ''.$langs->trans("CashDeskBankAccountForSell").''; print ''; - $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$terminal}, 'CASHDESK_ID_BANKACCOUNT_CASH'.$terminal, 0, "courant=2", 1); + $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$terminaltouse}, 'CASHDESK_ID_BANKACCOUNT_CASH'.$terminaltouse, 0, "courant=2", 1); print ''; print ''.$langs->trans("CashDeskBankAccountForCheque").''; print ''; - $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal}, 'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminal, 0, "courant=1", 1); + $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminaltouse}, 'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$terminaltouse, 0, "courant=1", 1); print ''; print ''.$langs->trans("CashDeskBankAccountForCB").''; print ''; - $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$terminal}, 'CASHDESK_ID_BANKACCOUNT_CB'.$terminal, 0, "courant=1", 1); + $form->select_comptes($conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$terminaltouse}, 'CASHDESK_ID_BANKACCOUNT_CB'.$terminaltouse, 0, "courant=1", 1); print ''; foreach($paiements as $modep) { if (in_array($modep->code, array('LIQ', 'CB', 'CHQ'))) continue; - $name="CASHDESK_ID_BANKACCOUNT_".$modep->code.$terminal; + $name="CASHDESK_ID_BANKACCOUNT_".$modep->code.$terminaltouse; print ''.$langs->trans("CashDeskBankAccountFor").' '.$langs->trans($modep->libelle).''; print ''; $cour=preg_match('/^LIQ.*/', $modep->code)?2:1; From 18071fb2384e965eae74690782f47c47135589bb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 13:40:03 +0200 Subject: [PATCH 0321/1036] Works with 9 terminals --- htdocs/takepos/takepos.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index 0db03a20080..f5de960223d 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -549,7 +549,7 @@ function TerminalsDialog() { jQuery("#dialog-info").dialog({ resizable: false, - height:200, + height:220, width:400, modal: true, buttons: { From 3ddd5110efc54a6185770f8cbf07a43f6312d68c Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 9 May 2019 13:42:32 +0200 Subject: [PATCH 0322/1036] Update adherent.class.php --- htdocs/adherents/class/adherent.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 68575d2e279..540ae425cb2 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -1279,7 +1279,7 @@ class Adherent extends CommonObject $this->login = $obj->login; $this->societe = $obj->company; $this->company = $obj->company; - $this->fk_soc = $obj->fk_soc; + $this->socid = $obj->fk_soc; $this->address = $obj->address; $this->zip = $obj->zip; $this->town = $obj->town; From 3bf162dcd61152609a198565fbeacbd27962b383 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 14:36:48 +0200 Subject: [PATCH 0323/1036] Clean code for v10 --- .../compta/cashcontrol/cashcontrol_card.php | 49 +++++++++++----- htdocs/modulebuilder/template/admin/setup.php | 5 +- .../core/modules/modMyModule.class.php | 57 +++++++++++-------- 3 files changed, 73 insertions(+), 38 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_card.php b/htdocs/compta/cashcontrol/cashcontrol_card.php index 8fc53fbdb53..5e16d090d3b 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_card.php +++ b/htdocs/compta/cashcontrol/cashcontrol_card.php @@ -234,6 +234,8 @@ if ($action=="create" || $action=="start") { $posmodule = GETPOST('posmodule', 'alpha'); $terminalid = GETPOST('posnumber', 'alpha'); + $terminaltouse = $terminalid; + if ($terminaltouse == '1') $terminaltouse = ''; // Calculate $initialbalanceforterminal for terminal 0 foreach($arrayofpaymentmode as $key => $val) @@ -245,24 +247,33 @@ if ($action=="create" || $action=="start") } // Get the bank account dedicated to this point of sale module/terminal - $bankid = $conf->global->CASHDESK_ID_BANKACCOUNT_CASH; // This value is ok for 'Terminal 0' for module 'CashDesk' and 'TakePos' (they manage only 1 terminal) + $vartouse=CASHDESK_ID_BANKACCOUNT_CASH.$terminaltouse; + $bankid = $conf->global->$vartouse; // This value is ok for 'Terminal 0' for module 'CashDesk' and 'TakePos' (they manage only 1 terminal) // Hook to get the good bank id according to posmodule and posnumber. // @TODO add hook here - $sql = "SELECT SUM(amount) as total FROM ".MAIN_DB_PREFIX."bank"; - $sql.= " WHERE fk_account = ".$bankid; - if ($syear && ! $smonth) $sql.= " AND dateo < '".$db->idate(dol_get_first_day($syear, 1))."'"; - elseif ($syear && $smonth && ! $sday) $sql.= " AND dateo < '".$db->idate(dol_get_first_day($syear, $smonth))."'"; - elseif ($syear && $smonth && $sday) $sql.= " AND dateo < '".$db->idate(dol_mktime(0, 0, 0, $smonth, $sday, $syear))."'"; - else dol_print_error('', 'Year not defined'); - - $resql = $db->query($sql); - if ($resql) + if ($bankid > 0) { - $obj = $db->fetch_object($resql); - if ($obj) $initialbalanceforterminal[$terminalid][$key] = $obj->total; + $sql = "SELECT SUM(amount) as total FROM ".MAIN_DB_PREFIX."bank"; + $sql.= " WHERE fk_account = ".$bankid; + if ($syear && ! $smonth) $sql.= " AND dateo < '".$db->idate(dol_get_first_day($syear, 1))."'"; + elseif ($syear && $smonth && ! $sday) $sql.= " AND dateo < '".$db->idate(dol_get_first_day($syear, $smonth))."'"; + elseif ($syear && $smonth && $sday) $sql.= " AND dateo < '".$db->idate(dol_mktime(0, 0, 0, $smonth, $sday, $syear))."'"; + else dol_print_error('', 'Year not defined'); + + $resql = $db->query($sql); + if ($resql) + { + $obj = $db->fetch_object($resql); + if ($obj) $initialbalanceforterminal[$terminalid][$key] = $obj->total; + } + else dol_print_error($db); + } + else + { + setEventMessages($langs->trans("SetupOfTerminalNotComplete", $terminalid), null, 'errors'); + $error++; } - else dol_print_error($db); } // Calculate $theoricalamountforterminal for terminal 0 @@ -332,7 +343,16 @@ if ($action=="create" || $action=="start") print ''; print ''.$form->selectarray('posmodule', $arrayofposavailable, GETPOST('posmodule', 'alpha'), (count($arrayofposavailable)>1?1:0)).''; - print ''; + print ''; + $array=array(1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5", 6=>"6", 7=>"7", 8=>"8", 9=>"9"); + $selectedposnumber=0; $showempty=1; + if ($conf->global->TAKEPOS_NUM_TERMINALS == '1') + { + $selectedposnumber=1; $showempty=0; + } + print $form->selectarray('posnumber', $array, GETPOSTISSET('posnumber')?GETPOST('posnumber','int'):$selectedposnumber, $showempty); + //print ''; + print ''; // Year print ''; $retstring=''; @@ -380,6 +400,7 @@ if ($action=="create" || $action=="start") print ''; print ''; + // Table to see/enter balance if ($action == 'start' && GETPOST('posnumber') != '' && GETPOST('posnumber') != '' && GETPOST('posnumber') != '-1') { $posmodule = GETPOST('posmodule', 'alpha'); diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php index e39d31c8c7a..a434833c792 100644 --- a/htdocs/modulebuilder/template/admin/setup.php +++ b/htdocs/modulebuilder/template/admin/setup.php @@ -59,15 +59,18 @@ $arrayofparameters=array( ); + /* * Actions */ + if ((float) DOL_VERSION >= 6) { include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; } + /* * View */ @@ -85,7 +88,7 @@ $head = mymoduleAdminPrepareHead(); dol_fiche_head($head, 'settings', '', -1, "mymodule@mymodule"); // Setup page goes here -echo $langs->trans("MyModuleSetupPage").'

'; +echo ''.$langs->trans("MyModuleSetupPage").'

'; if ($action == 'edit') diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php index 622e3fd0bac..9c04db22c12 100644 --- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php +++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2018-2019 Nicolas ZABOURI + * Copyright (C) 2018-2019 Nicolas ZABOURI * Copyright (C) 2019 Frédéric France * Copyright (C) ---Put here your own copyright and developer email--- * @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + /** * \defgroup mymodule Module MyModule * \brief MyModule module descriptor. @@ -26,6 +27,7 @@ * \brief Description and activation file for module MyModule */ include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; + /** * Description and activation class for module MyModule */ @@ -40,9 +42,10 @@ class modMyModule extends DolibarrModules { 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 = 500000; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module + $this->numero = 500000; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve an id number for your module // Key text used to identify module (for permissions, menus, etc...) $this->rights_class = 'mymodule'; // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...' @@ -62,8 +65,9 @@ class modMyModule extends DolibarrModules $this->editor_url = 'https://www.example.com'; // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' $this->version = '1.0'; - //Url to the file with your last numberversion of this module + // Url to the file with your last numberversion of this module //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; + // Key used in llx_const table to save module status enabled/disabled (where MYMODULE 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. @@ -96,7 +100,7 @@ class modMyModule extends DolibarrModules 'js' => array( // '/mymodule/js/mymodule.js.php', ), - // 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' + // 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 to 'all' 'hooks' => array( // 'data' => array( // 'hookcontext1', @@ -104,7 +108,7 @@ class modMyModule extends DolibarrModules // ), // 'entity' => '0', ), - // Set this to 1 if feature of module are opened to external users + // Set this to 1 if features of module are opened to external users 'moduleforexternal' => 0, ); // Data directories to create when module is enabled. @@ -120,8 +124,8 @@ class modMyModule extends DolibarrModules $this->requiredby = array(); // List of module class names as string to disable if this one is disabled. Example: array('modModuleToDisable1', ...) $this->conflictwith = array(); // List of module class names as string this module is in conflict with. Example: array('modModuleToDisable1', ...) $this->langfiles = array("mymodule@mymodule"); - //$this->phpmin = array(5,4); // Minimum version of PHP required by module - $this->need_dolibarr_version = array(4,0); // Minimum version of Dolibarr required by module + $this->phpmin = array(5,5); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(8,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'=>'MyModuleWasAutomaticallyActivatedBecauseOfYourCountryChoice'); @@ -134,15 +138,18 @@ class modMyModule extends DolibarrModules $this->const = array( // 1 => array('MYMODULE_MYCONSTANT', 'chaine', 'avalue', 'This is a constant to add', 1, 'allentities', 1) ); + // Some keys to add into the overwriting translation tables /*$this->overwrite_translation = array( 'en_US:ParentCompany'=>'Parent company or reseller', 'fr_FR:ParentCompany'=>'Maison mère ou revendeur' )*/ + if (! isset($conf->mymodule) || ! isset($conf->mymodule->enabled)) { $conf->mymodule=new stdClass(); $conf->mymodule->enabled=0; } + // Array to add new pages in new tabs $this->tabs = array(); // Example: @@ -198,15 +205,14 @@ class modMyModule extends DolibarrModules */ // Boxes/Widgets - // Add here list of php file(s) stored in mymodule/core/boxes that contains class to show a widget. + // Add here list of php file(s) stored in mymodule/core/boxes that contains a class to show a widget. $this->boxes = array( // 0 => array( // 'file' => 'mymodulewidget1.php@mymodule', // 'note' => 'Widget provided by MyModule', // 'enabledbydefaulton' => 'Home', // ), - //1=>array('file'=>'mymodulewidget2.php@mymodule','note'=>'Widget provided by MyModule'), - //2=>array('file'=>'mymodulewidget3.php@mymodule','note'=>'Widget provided by MyModule') + // ... ); // Cronjobs (List of cron jobs entries to add when module is enabled) @@ -232,29 +238,30 @@ class modMyModule extends DolibarrModules // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'status'=>0, 'test'=>'$conf->mymodule->enabled', 'priority'=>50) // ); - // Permissions - $this->rights = array(); // Permission array used by this module + // Permissions provided by this module + $this->rights = array(); $r=0; + // Add here entries to declare new permissions + /* BEGIN MODULEBUILDER PERMISSIONS */ $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Read objects of MyModule'; // Permission label - $this->rights[$r][3] = 0; // 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->mymodule->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mymodule->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Create/Update objects of MyModule'; // Permission label - $this->rights[$r][3] = 0; // 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->mymodule->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mymodule->level1->level2) $r++; $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) $this->rights[$r][1] = 'Delete objects of MyModule'; // Permission label - $this->rights[$r][3] = 0; // 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->mymodule->level1->level2) $this->rights[$r][5] = ''; // In php code, permission will be checked by test if ($user->rights->mymodule->level1->level2) + $r++; + /* END MODULEBUILDER PERMISSIONS */ - // Main menu entries - $this->menu = array(); // List of menus to add + // Main menu entries to add + $this->menu = array(); $r=0; // Add here entries to declare new menus /* BEGIN MODULEBUILDER TOPMENU */ @@ -304,7 +311,7 @@ class modMyModule extends DolibarrModules ); END MODULEBUILDER LEFTMENU MYOBJECT */ - // Exports + // Exports profiles provided by this module $r=1; /* BEGIN MODULEBUILDER EXPORT MYOBJECT */ /* @@ -324,7 +331,7 @@ class modMyModule extends DolibarrModules $r++; */ /* END MODULEBUILDER EXPORT MYOBJECT */ - // Imports + // Imports profiles provided by this module $r=1; /* BEGIN MODULEBUILDER IMPORT MYOBJECT */ /* @@ -344,6 +351,7 @@ class modMyModule extends DolibarrModules $r++; */ /* END MODULEBUILDER IMPORT MYOBJECT */ } + /** * Function called when module is enabled. * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. @@ -355,18 +363,21 @@ class modMyModule extends DolibarrModules public function init($options = '') { $result=$this->_load_tables('/mymodule/sql/'); - if ($result < 0) return -1; // Do not activate module if not allowed errors found on module SQL queries (the _load_table run sql with run_sql with error allowed parameter to 'default') - // Create extrafields - include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; - $extrafields = new ExtraFields($this->db); + if ($result < 0) return -1; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default') + + // Create extrafields during init + //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, '', '', 'mymodule@mymodule', '$conf->mymodule->enabled'); //$result2=$extrafields->addExtraField('myattr2', "New Attr 2 label", 'varchar', 1, 10, 'project', 0, 0, '', '', 1, '', 0, 0, '', '', 'mymodule@mymodule', '$conf->mymodule->enabled'); //$result3=$extrafields->addExtraField('myattr3', "New Attr 3 label", 'varchar', 1, 10, 'bank_account', 0, 0, '', '', 1, '', 0, 0, '', '', 'mymodule@mymodule', '$conf->mymodule->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, '', '', 'mymodule@mymodule', '$conf->mymodule->enabled'); //$result5=$extrafields->addExtraField('myattr5', "New Attr 5 label", 'text', 1, 10, 'user', 0, 0, '', '', 1, '', 0, 0, '', '', 'mymodule@mymodule', '$conf->mymodule->enabled'); + $sql = array(); return $this->_init($sql, $options); } + /** * Function called when module is disabled. * Remove from database constants, boxes and permissions from Dolibarr database. From d53117da3f7d755c68a2460ed1eddfb27e75b897 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 15:34:42 +0200 Subject: [PATCH 0324/1036] Update log --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index b92b23a0748..e09192752d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -35,6 +35,7 @@ FIX: Total per day shows 00:00 if the total time spent is equal to 12:00 FIX: Update/delete currency on same languages FIX: Wrong variable name make contact of supplier order not used on PDF. FIX: Add hidden option MAIN_PDF_HIDE_SITUATION to hide situation (quick hack to fix output pb). +FIX: attached files list with link file was broked ***** ChangeLog for 9.0.2 compared to 9.0.1 ***** FIX: #10822 From d78900478290f33441eeb7ef0a69ae8771a6b741 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 15:35:55 +0200 Subject: [PATCH 0325/1036] Update adherent.class.php --- htdocs/adherents/class/adherent.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 540ae425cb2..fc61e56115c 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -1280,6 +1280,7 @@ class Adherent extends CommonObject $this->societe = $obj->company; $this->company = $obj->company; $this->socid = $obj->fk_soc; + $this->fk_soc = $obj->fk_soc; // For backward comaptibility $this->address = $obj->address; $this->zip = $obj->zip; $this->town = $obj->town; From 9672c7ccca2808c75923964f5e88d18f8cf6c259 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 16:21:53 +0200 Subject: [PATCH 0326/1036] Translation --- htdocs/langs/en_US/admin.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index daba22fe660..0862719289b 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -470,7 +470,7 @@ TheKeyIsTheNameOfHtmlField=This is the name of the HTML field. Technical knowled PageUrlForDefaultValues=You must enter the relative path of the page URL. If you include parameters in URL, the default values will be effective if all parameters are set to same value. PageUrlForDefaultValuesCreate=
Example:
For the form to create a new third party, it is %s.
For URL of external modules installed into custom directory, do not include the "custom/", so use path like mymodule/mypage.php and not custom/mymodule/mypage.php.
If you want default value only if url has some parameter, you can use %s PageUrlForDefaultValuesList=
Example:
For the page that lists third parties, it is %s.
For URL of external modules installed into custom directory, do not include the "custom/" so use a path like mymodule/mypagelist.php and not custom/mymodule/mypagelist.php.
If you want default value only if url has some parameter, you can use %s -AlsoDefaultValuesAreEffectiveForActionCreate=Also note that overwritting default values for form creation works only for pages that were correctly designed (so with parameter action=create...) +AlsoDefaultValuesAreEffectiveForActionCreate=Also note that overwritting default values for form creation works only for pages that were correctly designed (so with parameter action=create or presend...) EnableDefaultValues=Enable customization of default values EnableOverwriteTranslation=Enable usage of overwritten translation GoIntoTranslationMenuToChangeThis=A translation has been found for the key with this code. To change this value, you must edit it from Home-Setup-translation. From 2ffad20e9f094840efef76ad8717e2ce57effa9a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 16:37:46 +0200 Subject: [PATCH 0327/1036] fix typo --- htdocs/langs/en_US/modulebuilder.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index 5cb927dc8b7..c3f75301f67 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -25,7 +25,7 @@ EnterNameOfModuleToDeleteDesc=You can delete your module. WARNING: All coding fi EnterNameOfObjectToDeleteDesc=You can delete an object. WARNING: All coding files (generated or created manually) related to object will be deleted! DangerZone=Danger zone BuildPackage=Build package -BuildPackageDesc=You can generate a zip package or your application so your are ready to distribute it on any Dolibarr. You can also distribute it or sell it on marketplace like DoliStore.com. +BuildPackageDesc=You can generate a zip package of your application so your are ready to distribute it on any Dolibarr. You can also distribute it or sell it on marketplace like DoliStore.com. BuildDocumentation=Build documentation ModuleIsNotActive=This module is not activated yet. Go to %s to make it live or click here: ModuleIsLive=This module has been activated. Any change may break a current live feature. From 57911150d16ca441aeb7a876d259d972c45d561e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 16:50:22 +0200 Subject: [PATCH 0328/1036] CSS --- htdocs/admin/modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index d06f5d393d9..0507596caec 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -709,8 +709,8 @@ if ($mode == 'common') { if (method_exists($objMod, 'alreadyUsed') && $objMod->alreadyUsed()) print $langs->trans("Used"); else { - print img_picto($langs->trans("Required"), 'switch_on'); - print $langs->trans("Required"); + print img_picto($langs->trans("Required"), 'switch_on', '', false, 0, 0, '', 'opacitymedium'); + //print $langs->trans("Required"); } if (! empty($conf->multicompany->enabled) && $user->entity) $disableSetup++; } From b8f2f957bf52ea3399ac4c0bbd20bae78db1ac5e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 16:58:31 +0200 Subject: [PATCH 0329/1036] Sync transifex --- htdocs/langs/en_US/products.lang | 2 +- htdocs/langs/fr_FR/accountancy.lang | 5 +++++ htdocs/langs/fr_FR/admin.lang | 21 ++++++++++++++++----- htdocs/langs/fr_FR/assets.lang | 6 ++++++ htdocs/langs/fr_FR/cashdesk.lang | 5 +++++ htdocs/langs/fr_FR/companies.lang | 2 +- htdocs/langs/fr_FR/contracts.lang | 3 ++- htdocs/langs/fr_FR/cron.lang | 2 +- htdocs/langs/fr_FR/mails.lang | 2 ++ htdocs/langs/fr_FR/main.lang | 4 +++- htdocs/langs/fr_FR/members.lang | 10 +++++----- htdocs/langs/fr_FR/modulebuilder.lang | 26 ++++++++++++++++---------- htdocs/langs/fr_FR/mrp.lang | 13 +++++++++++++ htdocs/langs/fr_FR/multicurrency.lang | 4 ++-- htdocs/langs/fr_FR/paypal.lang | 4 +++- htdocs/langs/fr_FR/products.lang | 3 ++- htdocs/langs/fr_FR/projects.lang | 4 ++-- htdocs/langs/fr_FR/stripe.lang | 6 ++++-- htdocs/langs/fr_FR/ticket.lang | 9 +++++---- htdocs/langs/fr_FR/trips.lang | 2 +- htdocs/langs/fr_FR/website.lang | 2 ++ 21 files changed, 97 insertions(+), 38 deletions(-) create mode 100644 htdocs/langs/fr_FR/mrp.lang diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index be20d1a7504..5f07a7f2eb0 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -260,7 +260,7 @@ AddVariable=Add Variable AddUpdater=Add Updater GlobalVariables=Global variables VariableToUpdate=Variable to update -GlobalVariableUpdaters=Global variable updaters +GlobalVariableUpdaters=External updaters for variables GlobalVariableUpdaterType0=JSON data GlobalVariableUpdaterHelp0=Parses JSON data from specified URL, VALUE specifies the location of relevant value, GlobalVariableUpdaterHelpFormat0=Format for request {"URL": "http://example.com/urlofjson", "VALUE": "array1,array2,targetvalue"} diff --git a/htdocs/langs/fr_FR/accountancy.lang b/htdocs/langs/fr_FR/accountancy.lang index 7a47a8fe2e3..638afa65361 100644 --- a/htdocs/langs/fr_FR/accountancy.lang +++ b/htdocs/langs/fr_FR/accountancy.lang @@ -177,6 +177,7 @@ LabelAccount=Libellé du compte LabelOperation=Libellé opération Sens=Sens LetteringCode=Code de lettrage +Lettering=Lettrage Codejournal=Journal JournalLabel=Libellé journal NumPiece=Numéro de pièce @@ -299,8 +300,12 @@ DefaultBindingDesc=Cette page peut être utilisée pour définir un compte par d DefaultClosureDesc=Cette page peut être utilisée pour définir les paramètres pour clore un bilan. Options=Options OptionModeProductSell=Mode ventes +OptionModeProductSellIntra=Mode ventes exportées dans la CEE +OptionModeProductSellExport=Mode ventes exportées dans d'autres pays OptionModeProductBuy=Mode achats OptionModeProductSellDesc=Afficher tous les produits/services avec le compte comptable pour les ventes. +OptionModeProductSellIntraDesc=Afficher tous les produits avec un compte comptabilité pour les ventes dans la CEE. +OptionModeProductSellExportDesc=Afficher tous les produits avec un compte comptable pour les autres ventes à les autres pays. OptionModeProductBuyDesc=Afficher tous les produits/services avec le compte comptable pour les achats. CleanFixHistory=Effacer les données comptables des lignes qui n'existent pas dans le plan comptable CleanHistory=Réinitialiser tous les liens pour l'année sélectionnée diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index b60cd875f58..7503dc955ff 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -71,7 +71,9 @@ UseSearchToSelectCompanyTooltip=Si vous avez un nombre important de tiers (>100 UseSearchToSelectContactTooltip=Si vous avez un nombre important de contacts (>100 000), vous pourrez améliorer les performances en positionnant la constante CONTACT_DONOTSEARCH_ANYWHERE à 1 dans Configuration->Divers. La recherche sera alors limité au début des chaines. DelaiedFullListToSelectCompany=Attendre que vous ayez appuyé sur une touche avant de charger le contenu de la liste déroulante des tiers.
Cela peut augmenter les performances si vous avez un grand nombre de tiers, mais cela est moins convivial. DelaiedFullListToSelectContact=Attendre que vous ayez appuyé sur une touche avant de charger le contenu de la liste déroulante des adresses de contact.
Cela peut augmenter les performances si vous avez un grand nombre de contacts, mais cela est moins convivial -NumberOfKeyToSearch=Nb carac. déclenchant recherche : %s +NumberOfKeyToSearch=Nb de caractère déclenchant la recherche : %s +NumberOfBytes=Nombre d'octets +SearchString=Chaîne de recherche NotAvailableWhenAjaxDisabled=Non disponible quand Ajax est désactivé AllowToSelectProjectFromOtherCompany=Sur les éléments d'un tiers, autorise la sélection d'un projet lié à un autre tiers JavascriptDisabled=Javascript désactivé @@ -329,7 +331,7 @@ CallUpdatePage=Aller à la page de mise à jour de la structure et des données LastStableVersion=Dernière version stable disponible LastActivationDate=Date de dernière activation LastActivationAuthor=Auteur de la dernière activation -LastActivationIP=Dernière adresse IP d'activation +LastActivationIP=Adresse IP dernière d'activation UpdateServerOffline=Serveur de mise à jour hors ligne WithCounter=Gérer un compteur GenericMaskCodes=Vous pouvez saisir tout masque de numérotation. Dans ce masque, les balises suivantes peuvent être utilisées:
{000000} correspond à un numéro qui sera incrémenté à chaque %s. Mettre autant de zéro que la longueur désirée du compteur. Le compteur sera complété par des 0 à gauche afin d'avoir autant de zéro que dans le masque.
{000000+000} idem que précédemment mais un décalage correspondant au nombre à droite du + est appliqué dès la première %s.
{000000@x} idem que précédemment mais le compteur est remis à zéro le xème mois de l'année (x entre 1 et 12, ou 0 pour utiliser le mois de début d'exercice fiscal défini dans votre configuration, ou 99 pour remise à zéro chaque mois). Si cette option est utilisée et x vaut 2 ou plus, alors la séquence {yy}{mm} ou {yyyy}{mm} est obligatoire.
{dd} jour (01 à 31).
{mm} mois (01 à 12).
{yy}, {yyyy} ou {y} année sur 2, 4 ou 1 chiffres.
@@ -457,7 +459,7 @@ ModuleCompanyCodeCustomerAquarium=%s suivi d'un code client tiers pour un code c ModuleCompanyCodeSupplierAquarium=%s suivi du code fournisseur tiers pour le code comptable fournisseur ModuleCompanyCodePanicum=Retourne un code comptable vide ModuleCompanyCodeDigitaria=Renvoie un code comptable composé suivant le code tiers. Le code est composé du caractère 'C' en première position suivi des 5 premiers caractères du code tiers. -Use3StepsApproval=Par défaut, les commandes fournisseurs nécessitent d'être créées et approuvées en deux étapes/utilisateurs (une étape/utilisateur pour créer et une étape/utilisateur pour approuver. Si un utilisateur à les deux permissions, ces deux actions sont effectuées en une seule fois). Cette option ajoute la nécessité d'une approbation par une troisième étape/utilisateur, si le montant de la commande est supérieur au montant d'une valeur définie (soit 3 étapes nécessaire: 1 =Validation, 2=Première approbation et 3=seconde approbation si le montant l'exige).
Laissez le champ vide si une seule approbation (2 étapes) sont suffisantes, placez une valeur très faibe (0.1) si une deuxième approbation (3 étapes) est toujours exigée. +Use3StepsApproval=Par défaut, les commandes fournisseurs nécessitent d'être créées et approuvées par 2 utilisateurs différents (une étape/utilisateur pour créer et une étape/utilisateur pour approuver. Notez que si un utilisateur à les deux permissions, ces deux actions sont effectuées en une seule fois). Cette option ajoute la nécessité d'une approbation par une troisième étape/utilisateur, si le montant de la commande est supérieur au montant d'une valeur définie (soit 3 étapes nécessaire: 1 =Validation, 2=Première approbation et 3=seconde approbation si le montant l'exige).
Laissez le champ vide si une seule approbation (2 étapes) est suffisante, placez une valeur très faible (0.1) si une deuxième approbation (3 étapes) est toujours exigée. UseDoubleApproval=Activer l'approbation en trois étapes si le montant HT est supérieur à... WarningPHPMail=Attention : Il est préférable de configurer les emails sortant pour utiliser le serveur email de votre fournisseur plutôt que la configuration par défaut. Certains fournisseurs email (comme Yahoo) ne permettent pas l'envoi d'e-mails depuis un autre serveur que le leur si l'adresse d'envoi utilisée est une adresse autre que la leur. Votre configuration actuelle utilise le serveur de l'application pour l'envoi d'e-mails et non le serveur de votre fournisseur de messagerie, aussi certains destinataires (ceux compatibles avec le protocole restrictif DMARC) demanderont au fournisseur d'email si ils peuvent accepter l'email et certains fournisseurs (comme Yahoo) peuvent répondre "non" car le serveur utilisé pour l'envoi n'est pas un serveur appartenant au fournisseur, aussi certains de vos emails envoyés peuvent ne pas etre accepté (faites attention aussi aux quotas de votre fournisseur d'email).
SI votre fournisseur d'email (comme Yahoo) impose cette restriction, vous devrez modifier votre configuration et opter pour l'autre méthode d'envoi "SMTP server" et saisir les identifiants SMTP de votre compte fournis par votre fournisseur d'e-mail (à demander à votre fournisseur d'e-mail) WarningPHPMail2=Si votre fournisseur de messagerie SMTP a besoin de restreindre le client de messagerie à certaines adresses IP (très rare), voici l'adresse IP du mail user agent (MUA) de votre application CRM ERP : %s . @@ -468,6 +470,7 @@ TheKeyIsTheNameOfHtmlField=C'est le nom du champ HTML. Cela nécessite d'avoir d PageUrlForDefaultValues=Vous devez entrer ici l'URL relative de la page. Si vous indiquez des paramètres dans l'URL, les valeurs par défaut seront effectives si tous les paramètres sont définis avec la même valeur. PageUrlForDefaultValuesCreate=
Example:
Pour le formulaire pour créer un nouveau tiers, c'est %s .
Pour l'URL des modules externes installés dans le répertoire custom, n'incluez pas le "custom/", aussi le chemin ressemblera à monmodule/mapage.php et non custom/monmodule/mapache.php.
Si voulez une valeur par défaut seulement si l'url a certains paramètres, vous pouvez utiliser %s PageUrlForDefaultValuesList=
Example:
Pour la page de liste des tiers, c'est %s,
Pour une URL des modules externes installés dans le répertoire custom, n'incluez pas le "custom/" aussi le chemin sera monmodule/mapage.php et non custom/monmodule/mapage.php.
Si vous voulez une valeur par défaut uniquement si l'url a certains paramètres, vous pouvez utiliser %s +AlsoDefaultValuesAreEffectiveForActionCreate=Notez également que le remplacement des valeurs par défaut pour la création de formulaire ne fonctionne que pour les pages correctement conçues (donc avec le paramètre action=create ou presend ...). EnableDefaultValues=Activer la fonction de valeurs par défaut personnalisées EnableOverwriteTranslation=Permettre la réécriture des traductions GoIntoTranslationMenuToChangeThis=Une traduction a été trouvée pour le code de cette valeur. Pour changer cette valeur, vous devez modifier le fichier depuis Accueil > Configuration > Traduction. @@ -1819,7 +1822,7 @@ ChartLoaded=Modèle de plan de compte chargé SocialNetworkSetup=Configuration du module Réseaux Sociaux EnableFeatureFor=Activer les fonctionnalités pour %s VATIsUsedIsOff=Remarque: l'option d'utilisation de la taxe de vente ou de la TVA a été définie sur Désactivée dans le menu %s - %s, aussi la taxe de vente ou la TVA utilisée sera toujours égale à 0 pour les ventes. -SwapSenderAndRecipientOnPDF=Échanger adresses expéditeurs et destinataires sur le PDF +SwapSenderAndRecipientOnPDF=Inverser la position des adresses expéditeurs et destinataires sur les documents PDF FeatureSupportedOnTextFieldsOnly=Attention, fonctionnalité prise en charge sur les champs de texte uniquement. De plus, un paramètre d'URL action=create ou action=edit doit être défini OU le nom de la page doit se terminer par 'new.php' pour déclencher cette fonctionnalité. EmailCollector=Collecteur de courrier électronique EmailCollectorDescription=Ajoute un travail planifié et une page de configuration pour analyser régulièrement les boîtes aux lettres (à l'aide du protocole IMAP) et enregistrer les courriers électroniques reçus dans votre application, au bon endroit et/ou créer automatiquement certains enregistrements (comme des opportunités). @@ -1828,7 +1831,9 @@ EMailHost=Hôte du serveur de messagerie IMAP MailboxSourceDirectory=Répertoire source de la boîte aux lettres MailboxTargetDirectory=Répertoire cible de la boîte aux lettres EmailcollectorOperations=Opérations à effectuer par le collecteur +MaxEmailCollectPerCollect=Nombre maximum d'emails collectés par collecte CollectNow=Collecter maintenant +ConfirmCloneEmailCollector=Êtes-vous sûr de vouloir cloner ce collecteur de courrier électronique %s? DateLastCollectResult=Date de dernière collecte essayée DateLastcollectResultOk=Date de dernière collecte réussie LastResult=Dernier résultat @@ -1849,7 +1854,7 @@ WithoutDolTrackingID=ID Tracker Dolibarr non trouvé FormatZip=Zip MainMenuCode=Code d'entrée du menu (mainmenu) ECMAutoTree=Afficher l'arborescence GED automatique -OperationParamDesc=Définissez les valeurs à utiliser pour l'action, ou comment extraire les valeurs. Par exemple:
objproperty1 = SET:abc
objproperty2 = EXTRACT: HEADER:X-Myheaderkey.*[^\\s]+(.*)
options_myextrafield=EXTRACT:SUBJECT:([^\\s]*)
object.objproperty4=EXTRACT:BODY:My company name is\\s([^\\s]*)

Utilisez un charactère ; comme séparateur pour extraire ou définir plusieurs propriétés. +OperationParamDesc=Définissez les valeurs à utiliser pour l'action, ou comment extraire les valeurs. Par exemple:
objproperty1 = SET:abc
objproperty2=SET:a value with replacement of __objproperty1__
objproperty3=SETIFEMPTY:abc
objproperty4 = EXTRACT: HEADER:X-Myheaderkey.*[^\\s]+(.*)
options_myextrafield=EXTRACT:SUBJECT:([^\\s]*)
object.objproperty4=EXTRACT:BODY:My company name is\\s([^\\s]*)

Utilisez un charactère ; comme séparateur pour extraire ou définir plusieurs propriétés. OpeningHours=Heures d'ouverture OpeningHoursDesc=Entrez ici les heures d'ouverture régulières de votre entreprise. ResourceSetup=Configuration du module Ressource @@ -1882,3 +1887,9 @@ SmallerThan=Plus petit que LargerThan=Plus grand que IfTrackingIDFoundEventWillBeLinked=Notez que si un ID de suivi est trouvé dans le courrier électronique entrant, l'événement sera automatiquement lié aux bons objets. WithGMailYouCanCreateADedicatedPassword=Avec un compte GMail, si vous avez activé la validation en 2 étapes, il est recommandé de créer un deuxième mot de passe dédié à l'application, au lieu d'utiliser votre propre mot de passe de compte, à partir de https://myaccount.google.com/. +IFTTTSetup=Configuration du module IFTTT +IFTTT_SERVICE_KEY=Clé de service IFTTT +IFTTT_DOLIBARR_ENDPOINT_SECUREKEY=Clé de sécurité pour sécuriser l'URL du point de terminaison utilisé par IFTTT pour envoyer des messages à votre Dolibarr. +IFTTTDesc=Ce module est conçu pour déclencher des événements sur IFTTT et/ou pour exécuter une action sur des déclencheurs IFTTT externes. +UrlForIFTTT=URL endpoint pour IFTTT +YouWillFindItOnYourIFTTTAccount=Vous le trouverez sur votre compte IFTTT diff --git a/htdocs/langs/fr_FR/assets.lang b/htdocs/langs/fr_FR/assets.lang index 847e5a6cb15..b277f033860 100644 --- a/htdocs/langs/fr_FR/assets.lang +++ b/htdocs/langs/fr_FR/assets.lang @@ -57,3 +57,9 @@ MenuTypeAssets = Type d'immobilisations MenuListAssets = Liste MenuNewTypeAssets = Nouveau type MenuListTypeAssets = Liste + +# +# Module +# +NewAssetType=Nouveau type d'immobilisation +NewAsset=Nouvelle immobilisation diff --git a/htdocs/langs/fr_FR/cashdesk.lang b/htdocs/langs/fr_FR/cashdesk.lang index 6bd8326e3ed..d69afd0f4e2 100644 --- a/htdocs/langs/fr_FR/cashdesk.lang +++ b/htdocs/langs/fr_FR/cashdesk.lang @@ -62,3 +62,8 @@ TicketVatGrouped=Grouper la TVA par taux sur les tickets AutoPrintTickets=Imprimer automatiquement les tickets EnableBarOrRestaurantFeatures=Activer les fonctionnalités pour bar ou restaurant ConfirmDeletionOfThisPOSSale=Confirmez-vous la suppression de cette vente en cours? +History=Historique +ValidateAndClose=Valider et fermer +Terminal=Terminal +NumberOfTerminals=Nombre de terminaux +TerminalSelect=Sélectionnez le terminal que vous souhaitez utiliser: diff --git a/htdocs/langs/fr_FR/companies.lang b/htdocs/langs/fr_FR/companies.lang index 98888ae7fbd..0a666b88f2c 100644 --- a/htdocs/langs/fr_FR/companies.lang +++ b/htdocs/langs/fr_FR/companies.lang @@ -28,7 +28,7 @@ AliasNames=Nom alternatif (commercial, marque, ...) AliasNameShort=Nom alternatif Companies=Sociétés CountryIsInEEC=Pays de la Communauté Économique Européenne -PriceFormatInCurrentLanguage=Format de prix dans la langue actuelle +PriceFormatInCurrentLanguage=Format d'affichage du prix dans la langue et monnaie actuelle ThirdPartyName=Nom du tiers ThirdPartyEmail=E-mail de tiers ThirdParty=Tiers diff --git a/htdocs/langs/fr_FR/contracts.lang b/htdocs/langs/fr_FR/contracts.lang index 0166ecfd85a..491ab0e384e 100644 --- a/htdocs/langs/fr_FR/contracts.lang +++ b/htdocs/langs/fr_FR/contracts.lang @@ -64,7 +64,8 @@ DateStartRealShort=Date début DateEndReal=Date effective fin de service DateEndRealShort=Date effective fin CloseService=Fermer service -BoardRunningServices=Services actifs et expirés en contrat +BoardRunningServices=Services actifs +BoardExpiredServices=Services expirés ServiceStatus=Statut du service DraftContracts=Contrats brouillons CloseRefusedBecauseOneServiceActive=Le contrat ne peut pas être fermé car il y a au moins un service ouvert dessus diff --git a/htdocs/langs/fr_FR/cron.lang b/htdocs/langs/fr_FR/cron.lang index 93d37547396..0952bae8f37 100644 --- a/htdocs/langs/fr_FR/cron.lang +++ b/htdocs/langs/fr_FR/cron.lang @@ -42,7 +42,7 @@ CronModule=Module CronNoJobs=Aucun travail enregistré CronPriority=Priorité CronLabel=Libellé -CronNbRun=Nb. lancements +CronNbRun=Nb. de lancements CronMaxRun=Nb max de lancement CronEach=Tous les JobFinished=Travail lancé et terminé diff --git a/htdocs/langs/fr_FR/mails.lang b/htdocs/langs/fr_FR/mails.lang index 79decf39473..459a02a91a7 100644 --- a/htdocs/langs/fr_FR/mails.lang +++ b/htdocs/langs/fr_FR/mails.lang @@ -19,6 +19,8 @@ MailTopic=Sujet du mail MailText=Message MailFile=Fichiers joints MailMessage=Corps du message +SubjectNotIn=Pas dans le Sujet +BodyNotIn=Pas dans le Message ShowEMailing=Afficher emailing ListOfEMailings=Liste des emailings NewMailing=Nouvel emailing diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 552c3334bbe..dabe27f0368 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -371,6 +371,7 @@ Percentage=Pourcentage Total=Total SubTotal=Sous-total TotalHTShort=Total HT +TotalHT100Short=Total 100%% HT TotalHTShortCurrency=Total HT (devise d'origine) TotalTTCShort=Total TTC TotalHT=Total HT @@ -834,6 +835,7 @@ RelatedObjects=Objets liés ClassifyBilled=Classer facturé ClassifyUnbilled=Classer non facturé Progress=Progression +ProgressShort=Progr. FrontOffice=Front office BackOffice=Back office View=Vue @@ -854,7 +856,7 @@ Download=Téléchargement DownloadDocument=Télécharger le document ActualizeCurrency=Mettre à jour le taux de devise Fiscalyear=Exercice fiscal -ModuleBuilder=Générateur de Module +ModuleBuilder=Générateur de Module et Application SetMultiCurrencyCode=Choisir la devise BulkActions=Actions de masse ClickToShowHelp=Cliquez pour montrer l'info-bulle d'aide diff --git a/htdocs/langs/fr_FR/members.lang b/htdocs/langs/fr_FR/members.lang index 979e59190e5..97951474aa0 100644 --- a/htdocs/langs/fr_FR/members.lang +++ b/htdocs/langs/fr_FR/members.lang @@ -128,11 +128,11 @@ ThisIsContentOfSubscriptionReminderEmail=Nous voulons vous informer que votre ad ThisIsContentOfYourCard=Ceci est un rappel des informations que nous avons vous concernant. N'hésitez pas à nous contacter en cas d'erreur.

DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Sujet de l'email reçu en cas d'auto-inscription d'un invité DescADHERENT_AUTOREGISTER_NOTIF_MAIL=Email reçu en cas d'auto-inscription d'un invité -DescADHERENT_EMAIL_TEMPLATE_AUTOREGISTER=Modèle de courrier électronique à utiliser pour envoyer un courrier électronique à un membre lors de son inscription automatique -DescADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION=Modèle de courrier électronique à utiliser pour envoyer un courrier électronique à un membre lors de sa validation -DescADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION=Modèle de courrier électronique à utiliser pour envoyer un courrier électronique à un membre lors de l'enregistrement d'un nouvel abonnement -DescADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION=Modèle de courrier électronique à utiliser pour envoyer un rappel par courrier électronique lorsque l'abonnement est sur le point d'expirer -DescADHERENT_EMAIL_TEMPLATE_CANCELATION=Modèle de courrier électronique à utiliser pour envoyer un courrier électronique à un membre lors d'une annulation de membre +DescADHERENT_EMAIL_TEMPLATE_AUTOREGISTER=Modèle Email à utiliser pour envoyer un email à un adhérent sur auto-adhésion de l'adhérent +DescADHERENT_EMAIL_TEMPLATE_MEMBER_VALIDATION=Modèle d'email à utiliser pour envoyer un email à un membre sur la validation d'un membre +DescADHERENT_EMAIL_TEMPLATE_SUBSCRIPTION=Modèle d'email électronique à utiliser pour envoyer un courrier électronique à un membre lors de l'enregistrement d'un nouvel abonnement +DescADHERENT_EMAIL_TEMPLATE_REMIND_EXPIRATION=Modèle d'email électronique à utiliser pour envoyer un rappel par courrier électronique lorsque l'abonnement est sur le point d'expirer +DescADHERENT_EMAIL_TEMPLATE_CANCELATION=Modèle d'email utilisé pour envoyer un email à un adhérent lors de l'annulation d'adhésion DescADHERENT_MAIL_FROM=Email émetteur pour les mails automatiques DescADHERENT_ETIQUETTE_TYPE=Format pages étiquettes DescADHERENT_ETIQUETTE_TEXT=Texte imprimé sur les planches d'adresses adhérent diff --git a/htdocs/langs/fr_FR/modulebuilder.lang b/htdocs/langs/fr_FR/modulebuilder.lang index f6795693cf1..e88221e1995 100644 --- a/htdocs/langs/fr_FR/modulebuilder.lang +++ b/htdocs/langs/fr_FR/modulebuilder.lang @@ -1,5 +1,5 @@ # Dolibarr language file - Source file is en_US - loan -ModuleBuilderDesc=Cet outil ne doit être utilisé que par des utilisateurs expérimentés ou des développeurs. Il vous fournit des utilitaires pour construire ou éditer votre propre module.
La documentation relative au développement manuel est ici . +ModuleBuilderDesc=Cet outil ne doit être utilisé que par des utilisateurs expérimentés ou des développeurs. Il vous fournit des utilitaires pour construire ou éditer votre propre module. La documentation relative au développement manuel est ici . EnterNameOfModuleDesc=Saisissez le nom du module/application à créer, sans espaces. Utilisez les majuscules pour identifier les mots (par exemple : MonModule, BoutiqueECommerce,...) EnterNameOfObjectDesc=Entrez le nom de l'objet à créer sans espaces. Utilisez les majuscules pour séparer des mots (par exemple: MyObject, Student, Teacher ...). Le fichier de classe CRUD, mais aussi le fichier API, les pages à afficher / ajouter / éditer / supprimer des objets et des fichiers SQL seront générés. ModuleBuilderDesc2=Chemin ou les modules sont générés/modifiés (premier répertoire pour les modules externes défini dans %s):%s @@ -10,7 +10,7 @@ NewObject=Nouvel objet ModuleKey=Clé du module ObjectKey=Clé de l'objet ModuleInitialized=Module initialisé -FilesForObjectInitialized=Fichiers pour les nouvel objet '%s' initialisés +FilesForObjectInitialized=Fichiers pour le nouvel objet '%s' initialisés FilesForObjectUpdated=Les fichiers pour l'objet '%s' ont été mis à jour ( fichiers .sql et .class.php ) ModuleBuilderDescdescription=Entrez ici toutes les informations générales qui décrivent votre module. ModuleBuilderDescspecifications=Vous pouvez entrer ici une description détaillée des spécifications de votre module qui n'est pas déjà structurée dans d'autres onglets. Vous avez donc à portée de main toutes les règles à développer. Ce contenu textuel sera également inclus dans la documentation générée (voir dernier onglet). Vous pouvez utiliser le format Markdown, mais il est recommandé d'utiliser le format Asciidoc (comparaison entre .md et .asciidoc: http://asciidoctor.org/docs/user-manual/#compared-to-markdown). @@ -21,13 +21,14 @@ ModuleBuilderDesctriggers=Vue des triggers ajoutés par votre module. Pour inclu ModuleBuilderDeschooks=Cet onglet est dédié aux points d'accroche. ModuleBuilderDescwidgets=Cet onglet est dédié à la gestion/construction de widgets. ModuleBuilderDescbuildpackage=Vous pouvez générer ici un fichier de package "prêt à distribuer" (un fichier .zip normalisé) de votre module et un fichier de documentation "prêt à distribuer". Cliquez simplement sur le bouton pour créer le paquet ou le fichier de documentation. -EnterNameOfModuleToDeleteDesc=Vous pouvez supprimer votre module. ATTENTION: Tous fichiers relatifs a ce module ET toutes bases de donnes seront supprimés! -EnterNameOfObjectToDeleteDesc=Vous pouvez effacer un objet. ATTENTION : Tous les fichiers reliés à cet objet seront définitivement perdus ! +EnterNameOfModuleToDeleteDesc=Vous pouvez supprimer votre module. ATTENTION: Tous les fichiers relatifs a ce module (générés ou créés manuellement) ET toutes les données et documentation seront supprimés! +EnterNameOfObjectToDeleteDesc=Vous pouvez effacer un objet. ATTENTION : Tous les fichiers (générés ou créés manuellement) en rapport avec cet objet seront définitivement effacés ! DangerZone=Zone de danger BuildPackage=Construire le package +BuildPackageDesc=Vous pouvez générer un package zip de votre application afin que vous soyez prêt à le distribuer sur n’importe quel Dolibarr. Vous pouvez également le distribuer ou le vendre sur une place de marché, comme DoliStore.com . BuildDocumentation=Générez la documentation ModuleIsNotActive=Le module n'est pas encore activé. Aller à %s pour l'activer ou cliquer ici : -ModuleIsLive=Ce module a été activé. Tout changement sur lui pourrait casser une fonctionnalité actuellement activée. +ModuleIsLive=Ce module a été activé. Tout changement dessus pourrait casser une fonctionnalité actuellement en ligne. DescriptionLong=Description longue EditorName=Nom de l'éditeur EditorUrl=URL de l'éditeur @@ -43,10 +44,11 @@ PathToModulePackage=Chemin du zip du package du module/application PathToModuleDocumentation=Chemin d'accès au fichier de documentation du module (%s) SpaceOrSpecialCharAreNotAllowed=Les espaces et les caractères spéciaux ne sont pas autorisés. FileNotYetGenerated=Fichier non encore généré -RegenerateClassAndSql=Effacer et générer à nouveau les fichiers de classe et SQL +RegenerateClassAndSql=Forcer la mise à jour des fichiers .class et .sql RegenerateMissingFiles=Générer les fichiers manquant SpecificationFile=Fichier de documentation LanguageFile=Fichier langue +ObjectProperties=Propriétés de l'objet ConfirmDeleteProperty=Voulez-vous vraiment supprimer la propriété %s ? Cela modifiera le code de la classe PHP, mais supprimera également la colonne de la définition de la table de l'objet. NotNull=Non NULL NotNullDesc=1=Définir le champ en base à NOT NULL. -1=Autoriser les valeurs nulles et forcer la valeur à NULL si vide ('' ou 0). @@ -62,7 +64,8 @@ ReadmeFile=Fichier Readme ChangeLog=Fichier ChangeLog TestClassFile=Fichier de tests unitaires PHP SqlFile=Fichier SQL -PageForLib=Fichier pour les librairies PHP +PageForLib=Fichier pour la librairie PHP +PageForObjLib=Fichier pour la librairie PHP dédiée à l'objet SqlFileExtraFields=Fichier SQL pour les attributs complémentaires SqlFileKey=Fichier SQL pour les clés et index AnObjectAlreadyExistWithThisNameAndDiffCase=Un objet existe déjà avec ce nom dans une casse différente @@ -81,15 +84,17 @@ IsAMeasureDesc=Peut-on cumuler la valeur du champ pour obtenir un total dans les SearchAllDesc=Le champ doit-il être utilisé pour effectuer une recherche à partir de l'outil de recherche rapide ? (Exemples: 1 ou 0) SpecDefDesc=Entrez ici toute la documentation que vous souhaitez joindre au module et qui n'a pas encore été définis dans d'autres onglets. Vous pouvez utiliser .md ou, mieux, la syntaxe enrichie .asciidoc. LanguageDefDesc=Entrez dans ces fichiers, toutes les clés et la traduction pour chaque fichier de langue. -MenusDefDesc=Définissez ici les menus fournis par votre module (une fois définis, ils sont visibles dans l'éditeur de menu %s) -PermissionsDefDesc=Définissez ici les nouvelles permissions fournies par votre module (une fois définies, elles sont visibles dans la configuration des permissions %s) +MenusDefDesc=Définissez ici les menus fournis par votre module +PermissionsDefDesc=Définissez ici les nouvelles permissions fournies par votre module +MenusDefDescTooltip=Les menus fournis par votre module / application sont définis dans le tableau $this->menus dans le fichier descripteur de module. Vous pouvez modifier manuellement ce fichier ou utiliser l'éditeur intégré.

Remarque: une fois définis (et les modules réactivés), les menus sont également visibles dans l'éditeur de menus mis à la disposition des utilisateurs administrateurs sur %s. +PermissionsDefDescTooltip=Les autorisations fournies par votre module / application sont définies dans le tableau $this->rights dans le fichier descripteur de module. Vous pouvez modifier manuellement ce fichier ou utiliser l'éditeur intégré.

Remarque: une fois définies (et le module réactivé), les autorisations sont visibles dans la configuration par défaut des autorisations %s. HooksDefDesc=Définissez dans la propriété module_parts ['hooks'] , dans le descripteur de module, le contexte des hooks à gérer (la liste des contextes peut être trouvée par une recherche sur ' initHooks (' dans le code du noyau).
Editez le fichier hook pour ajouter le code de vos fonctions hookées (les fonctions hookables peuvent être trouvées par une recherche sur ' executeHooks ' dans le code core). TriggerDefDesc=Définissez dans le fichier trigger le code que vous souhaitez exécuter pour chaque événement métier exécuté. SeeIDsInUse=Voir les IDs utilisés dans votre installation SeeReservedIDsRangeHere=Voir la plage des ID réservés ToolkitForDevelopers=Boîte à outils pour développeurs Dolibarr TryToUseTheModuleBuilder=Si vous connaissez SQL et PHP, vous pouvez utiliser l'assistant de création de module natif.
Activez le module %s et utilisez l'assistant en cliquant sur la . dans le menu en haut à droite.
Avertissement: Il s'agit d'une fonctionnalité avancée pour les développeurs. Ne pas expérimenter sur votre site de production! -SeeTopRightMenu=Voir à droite de votre barre de menu principal +SeeTopRightMenu=Voir à droite de votre barre de menu principal AddLanguageFile=Ajouter le fichier de langue YouCanUseTranslationKey=Vous pouvez utiliser ici une clé qui est la clé de traduction trouvée dans le fichier de langue (voir l'onglet "Langues") DropTableIfEmpty=(Supprimer la table si vide) @@ -110,3 +115,4 @@ UseSpecificEditorURL = Utiliser une URL d'éditeur spécifique UseSpecificFamily = Utiliser une famille spécifique UseSpecificAuthor = Utiliser un auteur spécifique UseSpecificVersion = Utiliser une version initiale spécifique +ModuleMustBeEnabled=Le module / application doit être activé d'abord diff --git a/htdocs/langs/fr_FR/mrp.lang b/htdocs/langs/fr_FR/mrp.lang new file mode 100644 index 00000000000..a0169705681 --- /dev/null +++ b/htdocs/langs/fr_FR/mrp.lang @@ -0,0 +1,13 @@ +MRPArea=Espace MRP +MenuBOM=Nomenclatures BOM +LatestBOMModified=Le %sdernières BOMs modifiées +BillOfMaterials=Nomenclature BOM +BOMsSetup=Configuration du module BOM +ListOfBOMs=Liste des BOMs +NewBOM=Nouveau BOM +ProductBOMHelp=Produit à créer avec cette BOM +BOMsNumberingModules=Modèles de numérotation de BOMs +BOMsModelModule=Modèles de documents de BOMs +FreeLegalTextOnBOMs=Texte libre sur documents BOMs +WatermarkOnDraftBOMs=Filigrane sur les brouillons de BOMs +ConfirmCloneBillOfMaterials=Êtes-vous sûr de vouloir cloner cette nomenclature ? diff --git a/htdocs/langs/fr_FR/multicurrency.lang b/htdocs/langs/fr_FR/multicurrency.lang index 3270b11714e..73dd1aa7cf6 100644 --- a/htdocs/langs/fr_FR/multicurrency.lang +++ b/htdocs/langs/fr_FR/multicurrency.lang @@ -7,10 +7,10 @@ multicurrency_syncronize_error=Erreur de synchronisation: %s MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE=Utilisez la date du document pour trouver le taux de change, au lieu d'utiliser dernier taux connu multicurrency_useOriginTx=Quand un objet est créé à partir d'un autre, garder le taux original de l'objet source (sinon utiliser le dernier taux connu) CurrencyLayerAccount=API CurrencyLayer -CurrencyLayerAccount_help_to_synchronize=Vous devez créer un compte sur leur site web pour pouvoir utiliser cette fonctionnalité.
Obtenez votre Clé API
Si vous utilisez un compte gratuit, vous ne pouvez pas changer la devise source(USD par défaut)
Mais si votre devise principale n'est pas USD, vous pouvez utiliser une devise source alternative pour forcer votre devise principale

Vous êtes limité à 1000 synchronisations par mois. +CurrencyLayerAccount_help_to_synchronize=Vous devez créer un compte sur le site web %spour pouvoir utiliser cette fonctionnalité.
Obtenez votre Clé API.
Si vous utilisez un compte gratuit, vous ne pouvez pas changer la devise source(USD par défaut).
Mais si votre devise principale n'est pas USD, l'application la calulera automatiquement pour vous.

Vous êtes limité à 1000 synchronisations par mois. multicurrency_appId=Clé API multicurrency_appCurrencySource=Devise source -multicurrency_alternateCurrencySource=Devise du document source +multicurrency_alternateCurrencySource=Devise source alternative CurrenciesUsed=Devises utilisées CurrenciesUsed_help_to_add=Ajoutez les différentes devises et taux que vous devez utiliser pour vos propositions , commandes , etc. rate=taux diff --git a/htdocs/langs/fr_FR/paypal.lang b/htdocs/langs/fr_FR/paypal.lang index 4255bd0f6c7..c0d7a9adadb 100644 --- a/htdocs/langs/fr_FR/paypal.lang +++ b/htdocs/langs/fr_FR/paypal.lang @@ -1,7 +1,7 @@ # Dolibarr language file - Source file is en_US - paypal PaypalSetup=Configuration module PayPal PaypalDesc=Ce module permet d'offrir aux clients une page de paiement via le prestataire Paypal. Ceci peut être utiliser pour réaliser un paiement quelconque ou un paiement par rapport à un objet Dolibarr particulier (facture, commande…) -PaypalOrCBDoPayment=Payer avec Paypal (Carte de crédit ou Paypal) +PaypalOrCBDoPayment=Payer avec Paypal (Carte ou solde Paypal) PaypalDoPayment=Payer par PayPal PAYPAL_API_SANDBOX=Mode test/bac à sable (sandbox) PAYPAL_API_USER=Nom utilisateur API @@ -14,6 +14,7 @@ PaypalModeOnlyPaypal=PayPal seul ONLINE_PAYMENT_CSS_URL=URL optionnelle de la feuille de style CSS sur la page de paiement en ligne ThisIsTransactionId=Voici l'identifiant de la transaction: %s PAYPAL_ADD_PAYMENT_URL=Ajouter l'URL de paiement Paypal lors de l'envoi d'un document par email +YouAreCurrentlyInSandboxMode=Vous travaillez actuellement dans le mode "bac à sable" de %s NewOnlinePaymentReceived=Nouveau paiement en ligne reçu NewOnlinePaymentFailed=Nouvelle tentative de paiement en ligne échouée ONLINE_PAYMENT_SENDEMAIL=Email à prévenir en cas de paiement (succès ou non) @@ -32,3 +33,4 @@ PaypalImportPayment=Importer des paiements Paypal PostActionAfterPayment=Actions complémentaires après paiement ARollbackWasPerformedOnPostActions=Une annulation a été effectuée sur toutes les actions Post paiement. Vous devez compléter les actions complémentaires manuellement si elles sont nécessaires. ValidationOfPaymentFailed=La validation du paiement a échoué +CardOwner=Titulaire de la carte diff --git a/htdocs/langs/fr_FR/products.lang b/htdocs/langs/fr_FR/products.lang index 21cf78ca23f..481710345f6 100644 --- a/htdocs/langs/fr_FR/products.lang +++ b/htdocs/langs/fr_FR/products.lang @@ -294,7 +294,7 @@ ProductSheet=Fiche produit ServiceSheet=Fiche service PossibleValues=Valeurs possibles GoOnMenuToCreateVairants=Allez sur le menu %s - %s pour ajouter les attributs de variantes (comme les couleurs, tailles, ...) -UseProductFournDesc=Utiliser les descriptions des produits des fournisseurs dans les documents fournisseurs +UseProductFournDesc=Ajouter une fonctionnalité pour définir les descriptions des produits définies par les fournisseurs en plus des descriptions pour les clients ProductSupplierDescription=Description du fournisseur du produit #Attributes VariantAttributes=Attributs de variante @@ -339,3 +339,4 @@ ErrorCopyProductCombinations=Une erreur s'est produite lors de la copie des vari ErrorDestinationProductNotFound=Produit destination non trouvé ErrorProductCombinationNotFound=Variante du produit non trouvé ActionAvailableOnVariantProductOnly=Action disponible uniquement sur la variante du produit +ProductsPricePerCustomer=Prix produit par clients diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index fbacef599f2..3c0fc3dbbf3 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -222,11 +222,11 @@ OppStatusPENDING=En attente OppStatusWON=Gagné OppStatusLOST=Perdu Budget=Budget -AllowToLinkFromOtherCompany=Permet de lier un projet d'une autre société

Valeurs compatibles :
- Conserver vide : Peut lier à n'importe quel projet de la société (défaut)
- "all" : Peut lier à tous les projets, y compris ceux d'autres sociétés
- Une liste de tiers ID séparés par des virgules: peut lier à tous les projets de ces tiers (Exemple:123,4795,53)
+AllowToLinkFromOtherCompany=Permettre de lier un projet à une autre société

Valeurs supportées:
- Conserver vide: Peut lier à n'importe quel projet de l'entreprise (défaut)
- "all": Peut lier à tous les projets, même le projet d'autres sociétés
- Une liste d'ID de tiers séparés par des virgules: Peut lier à tous les projets de ces tiers définis (Exemple: 123,4795,53)
LatestProjects=Les %s derniers projets LatestModifiedProjects=Les %s derniers projets modifiés OtherFilteredTasks=Autres tâches filtrées -NoAssignedTasks=Aucune tâche assignée trouvée (affectez le projet / les tâches à l'utilisateur actuel dans la zone de sélection supérieure pour saisir l'heure) +NoAssignedTasks=Aucune tâche assignée (assignez un projet/tâche à l'utilisateur depuis la liste déroulante utilisateur en haut pour pouvoir saisir du temps dessus) ThirdPartyRequiredToGenerateInvoice=Un tiers doit être défini sur le projet pour pouvoir le facturer. # Comments trans AllowCommentOnTask=Autoriser les utilisateurs à ajouter des commentaires sur les tâches diff --git a/htdocs/langs/fr_FR/stripe.lang b/htdocs/langs/fr_FR/stripe.lang index 9e7b3c3a640..f3b30d50615 100644 --- a/htdocs/langs/fr_FR/stripe.lang +++ b/htdocs/langs/fr_FR/stripe.lang @@ -1,6 +1,6 @@ # Dolibarr language file - Source file is en_US - stripe StripeSetup=Configuration module Stripe -StripeDesc=Ce module offre des pages pour autoriser les paiements sur Stripe par les clients. Elles peuvent êtres utilisées pour un paiement libre ou un paiement sur un objet particulier de Dolibarr ( facture, commande, ... ) +StripeDesc=Ce module offre des pages pour autoriser les paiements par carte sur Stripe par les clients. Elles peuvent êtres utilisées pour un paiement libre ou un paiement sur un objet particulier de Dolibarr (facture, commande, ... ) StripeOrCBDoPayment=Payez avec une carte bancaire ou Stripe FollowingUrlAreAvailableToMakePayments=Les URL suivantes sont disponibles pour permettre à un client de faire un paiement PaymentForm=Formulaire de paiement @@ -40,7 +40,7 @@ STRIPE_LIVE_WEBHOOK_KEY=Clé live des Webhooks ONLINE_PAYMENT_WAREHOUSE=Stock à utiliser pour diminuer le stock lorsque le paiement en ligne est effectué
(TODO Quand l'option de réduction de stock est effectuée sur une action sur facture et que le paiement en ligne génère lui-même la facture?) StripeLiveEnabled=Mode live activé (sinon mode test/bac a sable) StripeImportPayment=Importer paiements Stripe -ExampleOfTestCreditCard=Exemple de carte de crédit pour le test: %s (valide), %s (erreur CVC), %s (expiré), %s (paiement en échec) +ExampleOfTestCreditCard=Exemple de carte de crédit pour le test: %s => valide, %s => erreur CVC, %s => expiré, %s => paiement en échec StripeGateways=Stripe gateways OAUTH_STRIPE_TEST_ID=Stripe Connect ID client (ca _...) OAUTH_STRIPE_LIVE_ID=Stripe Connect ID client (ca _...) @@ -63,3 +63,5 @@ CreateCardOnStripe=Créer carte sur Stripe ShowInStripe=Afficher dans Stripe StripeUserAccountForActions=Compte d'utilisateur à utiliser pour certains e-mails de notification d'événements Stripe (Stripe payouts) StripePayoutList=Liste des paiements Stripe +ToOfferALinkForTestWebhook=Lien pour la configuration de Stripe WebHook pour appeler l'IPN (mode test) +ToOfferALinkForLiveWebhook=Lien pour la configuration de Stripe WebHook pour appeler l'IPN (mode actif) diff --git a/htdocs/langs/fr_FR/ticket.lang b/htdocs/langs/fr_FR/ticket.lang index f117d44db4b..cdf5e18a9ee 100644 --- a/htdocs/langs/fr_FR/ticket.lang +++ b/htdocs/langs/fr_FR/ticket.lang @@ -58,9 +58,10 @@ Notify_TICKET_SENTBYMAIL=Envoi d'un message du ticket par e-mail # Status NotRead=Non lu Read=Lu -Answered=Répondu Assigned=Assigné InProgress=En cours +NeedMoreInformation=En attente d'information +Answered=Répondu Waiting=En attente Closed=Fermé Deleted=Supprimé @@ -115,7 +116,7 @@ TicketsShowCompanyLogo=Afficher le logo de la société dans l'interface publiqu TicketsShowCompanyLogoHelp=Activez cette option pour masquer le logo de la société dans les pages de l'interface publique TicketsEmailAlsoSendToMainAddress=Envoyer également une notification à l'adresse e-mail principale TicketsEmailAlsoSendToMainAddressHelp=Activer cette option pour envoyer un email à "Email de notification de" adresse (voir configuration ci-dessous) -TicketsLimitViewAssignedOnly=Restreindre l'affichage aux tickets attribués à l'utilisateur actuel (non efficace pour les utilisateurs externes, toujours se limiter au tiers dont ils dépendent) +TicketsLimitViewAssignedOnly=Limiter l'afficher des tickets assignés à l'utilisateur courant (non valable pour les utilisateurs externes, toujours limité par le tiers dont ils dépendent) TicketsLimitViewAssignedOnlyHelp=Seuls les tickets affectés à l'utilisateur actuel seront visibles. Ne s'applique pas à un utilisateur disposant de droits de gestion des tickets. TicketsActivatePublicInterface=Activer l'interface publique TicketsActivatePublicInterfaceHelp=L'interface publique permet à tous les visiteurs de créer des tickets. @@ -216,7 +217,7 @@ TicketMailExchanges=Échanges de courrier TicketInitialMessageModified=Message initial modifié TicketMessageSuccesfullyUpdated=Message mis à jour avec succès TicketChangeStatus=Changer l'état -TicketConfirmChangeStatus=Confirmez le changement de statut: %s? +TicketConfirmChangeStatus=Confirmez le changement d'état: %s? TicketLogStatusChanged=Statut modifié: %s à %s TicketNotNotifyTiersAtCreate=Ne pas notifier l'entreprise à la création Unread=Non lu @@ -261,7 +262,7 @@ ViewTicket=Voir le ticket ViewMyTicketList=Voir la liste de mes tickets ErrorEmailMustExistToCreateTicket=Erreur: adresse email introuvable dans notre base de données TicketNewEmailSubjectAdmin=Nouveau ticket créé -TicketNewEmailBodyAdmin=

Le ticket vient d'être créé sous l'ID n ° %s, voir informations: +TicketNewEmailBodyAdmin=

Le ticket vient d'être créé avec l'ID # %s, voir les informations:

SeeThisTicketIntomanagementInterface=Voir ticket dans l'interface de gestion TicketPublicInterfaceForbidden=L'interface publique pour les tickets n'a pas été activée ErrorEmailOrTrackingInvalid=Mauvaise valeur pour l'ID de suivi ou l'e-mail diff --git a/htdocs/langs/fr_FR/trips.lang b/htdocs/langs/fr_FR/trips.lang index 41eb80a4349..cffe2cc14e8 100644 --- a/htdocs/langs/fr_FR/trips.lang +++ b/htdocs/langs/fr_FR/trips.lang @@ -148,4 +148,4 @@ nolimitbyEX_EXP=par ligne (sans limite) CarCategory=Catégorie de voiture ExpenseRangeOffset=Montant décalage: %s RangeIk=Barème kilométrique -AttachTheNewLineToTheDocument=Lié la nouvelle ligne à un document existant +AttachTheNewLineToTheDocument=Lié la ligne à un document téléversé diff --git a/htdocs/langs/fr_FR/website.lang b/htdocs/langs/fr_FR/website.lang index 5fe7de0a471..7b333653e0a 100644 --- a/htdocs/langs/fr_FR/website.lang +++ b/htdocs/langs/fr_FR/website.lang @@ -96,3 +96,5 @@ ThisPageIsTranslationOf=Cette page/container est la traduction de ThisPageHasTranslationPages=Cette page / container a une traduction NoWebSiteCreateOneFirst=Aucun site Web n'a encore été créé. Créez-en un d'abord. GoTo=Aller à +DynamicPHPCodeContainsAForbiddenInstruction=Vous ajoutez du code PHP dynamique contenant l'instruction PHP '%s ' qui est interdite par défaut en tant que contenu dynamique (voir les options masquées WEBSITE_PHP_ALLOW_xxx pour augmenter la liste des commandes autorisées). +NotAllowedToAddDynamicContent=Vous n'êtes pas autorisé à ajouter ou modifier du contenu dynamique PHP sur des sites Web. Demandez la permission ou conservez simplement le code dans les balises php non modifié. From a94c291b7680f3b63b5997f6f95110871ecb6d86 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 16:59:06 +0200 Subject: [PATCH 0330/1036] Dolibarization --- htdocs/commande/card.php | 0 htdocs/compta/facture/card.php | 0 htdocs/langs/en_GB/admin.lang | 1 - htdocs/product/admin/dynamic_prices.php | 16 ++++++++++------ 4 files changed, 10 insertions(+), 7 deletions(-) mode change 100755 => 100644 htdocs/commande/card.php mode change 100755 => 100644 htdocs/compta/facture/card.php diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php old mode 100755 new mode 100644 diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php old mode 100755 new mode 100644 diff --git a/htdocs/langs/en_GB/admin.lang b/htdocs/langs/en_GB/admin.lang index 71ab11d9bb9..29082562fee 100644 --- a/htdocs/langs/en_GB/admin.lang +++ b/htdocs/langs/en_GB/admin.lang @@ -9,7 +9,6 @@ ErrorModuleRequireDolibarrVersion=Error: This module requires Dolibarr version % ErrorDecimalLargerThanAreForbidden=Error: A precision higher than %s is not supported. ErrorReservedTypeSystemSystemAuto=Entry of 'system' and 'systemauto' for this type is reserved. You can use 'user' as a value to add your own record ErrorCodeCantContainZero=Code can't contain value 0 (zero) -NumberOfKeyToSearch=Number of characters to trigger search: %s MaxSizeForUploadedFiles=Maximum size for uploaded files (0 to prevent any uploads) CurrentValueSeparatorThousand=Thousands separator PositionByDefault=Default position diff --git a/htdocs/product/admin/dynamic_prices.php b/htdocs/product/admin/dynamic_prices.php index bbaa5f43e2f..91ef33694c5 100644 --- a/htdocs/product/admin/dynamic_prices.php +++ b/htdocs/product/admin/dynamic_prices.php @@ -153,12 +153,14 @@ llxHeader("", "", $langs->trans("CardProduct".$product->type)); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("DynamicPriceConfiguration"), $linkback, 'title_setup'); -print $langs->trans("DynamicPriceDesc").'
'; +print ''.$langs->trans("DynamicPriceDesc").'
'; print '
'; //Global variables table -if ($action != 'create_updater' && $action != 'edit_updater') { - print $langs->trans("GlobalVariables"); +if ($action != 'create_updater' && $action != 'edit_updater') +{ + print load_fiche_titre($langs->trans("GlobalVariables"), '', ''); + print ''; print ''; print ''; @@ -236,8 +238,10 @@ if ($action == 'create_variable' || $action == 'edit_variable') { } // Updaters table -if ($action != 'create_variable' && $action != 'edit_variable') { - print $langs->trans("GlobalVariableUpdaters"); +if ($action != 'create_variable' && $action != 'edit_variable') +{ + print load_fiche_titre($langs->trans("GlobalVariableUpdaters"), '', ''); + print '
'.$langs->trans("Variable").'
'; print ''; print ''; @@ -274,7 +278,7 @@ if ($action != 'create_variable' && $action != 'edit_variable') { } else { - print ''; } From 1c558c685c2c740b8ffe518663382ce6950c012e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 17:16:35 +0200 Subject: [PATCH 0331/1036] Fix class not found --- .../class/fournisseur.commande.class.php | 2 + .../install/mysql/migration/9.0.0-10.0.0.sql | 62 +++++++++++++++++++ htdocs/reception/class/reception.class.php | 6 +- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index a0c31505d5e..e876d5caee2 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -2639,6 +2639,8 @@ class CommandeFournisseur extends CommonOrder { global $user,$langs,$conf; + include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php'; + dol_syslog(get_class($this)."::initAsSpecimen"); $now=dol_now(); diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index e4cdd9351e6..39df4d2f59c 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -302,3 +302,65 @@ ALTER TABLE llx_inventorydet DROP COLUMN new_pmp; UPDATE llx_c_shipment_mode SET label = 'https://www.laposte.fr/outils/suivre-vos-envois?code={TRACKID}' WHERE code IN ('COLSUI'); UPDATE llx_c_shipment_mode SET label = 'https://www.laposte.fr/outils/suivre-vos-envois?code={TRACKID}' WHERE code IN ('LETTREMAX'); + + + +create table llx_reception +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + ref varchar(30) NOT NULL, + entity integer DEFAULT 1 NOT NULL, -- multi company id + fk_soc integer NOT NULL, + fk_projet integer DEFAULT NULL, + + ref_ext varchar(30), -- reference into an external system (not used by dolibarr) + ref_int varchar(30), -- reference into an internal system (used by dolibarr to store extern id like paypal info) + ref_supplier varchar(30), -- customer number + + date_creation datetime, -- date de creation + fk_user_author integer, -- author of creation + fk_user_modif integer, -- author of last change + date_valid datetime, -- date de validation + fk_user_valid integer, -- valideur + date_delivery datetime DEFAULT NULL, -- date planned of delivery + date_reception datetime, + fk_shipping_method integer, + tracking_number varchar(50), + fk_statut smallint DEFAULT 0, -- 0 = draft, 1 = validated, 2 = billed or closed depending on WORKFLOW_BILL_ON_SHIPMENT option + billed smallint DEFAULT 0, + + height float, -- height + width float, -- with + size_units integer, -- unit of all sizes (height, width, depth) + size float, -- depth + weight_units integer, -- unit of weight + weight float, -- weight + note_private text, + note_public text, + model_pdf varchar(255), + fk_incoterms integer, -- for incoterms + location_incoterms varchar(255), -- for incoterms + + import_key varchar(14), + extraparams varchar(255) -- for other parameters with json format +)ENGINE=innodb; + +ALTER TABLE llx_reception ADD UNIQUE INDEX idx_reception_uk_ref (ref, entity); + +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_soc (fk_soc); +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_user_author (fk_user_author); +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_user_valid (fk_user_valid); +ALTER TABLE llx_reception ADD INDEX idx_reception_fk_shipping_method (fk_shipping_method); + +create table llx_reception_extrafields +( + rowid integer AUTO_INCREMENT PRIMARY KEY, + tms timestamp, + fk_object integer NOT NULL, + import_key varchar(14) -- import key +) ENGINE=innodb; + +ALTER TABLE llx_reception_extrafields ADD INDEX idx_reception_extrafields (fk_object); + + diff --git a/htdocs/reception/class/reception.class.php b/htdocs/reception/class/reception.class.php index 0b416512ffa..15c021f53bc 100644 --- a/htdocs/reception/class/reception.class.php +++ b/htdocs/reception/class/reception.class.php @@ -1183,7 +1183,9 @@ class Reception extends CommonObject public function initAsSpecimen() { global $langs; - dol_include_once('/fourn/class/fournisseur.commande.dispatch.class.php'); + + include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; + include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.dispatch.class.php'; $now=dol_now(); dol_syslog(get_class($this)."::initAsSpecimen"); @@ -1207,7 +1209,7 @@ class Reception extends CommonObject } } - $order=new Commande($this->db); + $order=new CommandeFournisseur($this->db); $order->initAsSpecimen(); // Initialise parametres From 46b0545c4a8ce13099ba1ba76daa334f2bd81eb1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 17:26:06 +0200 Subject: [PATCH 0332/1036] Debug module reception --- htdocs/admin/reception_setup.php | 13 +++++-------- htdocs/langs/en_US/receptions.lang | 9 ++++++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/htdocs/admin/reception_setup.php b/htdocs/admin/reception_setup.php index a32d95e9c5e..f97c1d7823b 100644 --- a/htdocs/admin/reception_setup.php +++ b/htdocs/admin/reception_setup.php @@ -16,8 +16,8 @@ */ /** - * \file htdocs/admin/confexped.php - * \ingroup produit + * \file htdocs/admin/reception_setup.php + * \ingroup reception * \brief Page to setup reception module */ @@ -27,13 +27,10 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/reception.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; -$langs->load("admin"); -$langs->load("receptions"); -$langs->load('other'); +$langs->loadLangs(array("admin", "receptions", 'other')); -if (!$user->admin) - accessforbidden(); +if (!$user->admin) accessforbidden(); $action=GETPOST('action', 'alpha'); $value=GETPOST('value', 'alpha'); @@ -225,7 +222,7 @@ clearstatcache(); foreach ($dirmodels as $reldir) { $dir = dol_buildpath($reldir."core/modules/reception/"); - + if (is_dir($dir)) { $handle = opendir($dir); diff --git a/htdocs/langs/en_US/receptions.lang b/htdocs/langs/en_US/receptions.lang index 7fd8ba25202..0847d7550fc 100644 --- a/htdocs/langs/en_US/receptions.lang +++ b/htdocs/langs/en_US/receptions.lang @@ -1,10 +1,11 @@ # Dolibarr language file - Source file is en_US - receptions +ReceptionsSetup=Product Reception setup RefReception=Ref. reception Reception=Reception Receptions=Receptions AllReceptions=All Receptions -Reception=Reception -Receptions=Receptions +Reception=Product reception +Receptions=Reception ShowReception=Show Receptions ReceptionsArea=Receptions area ListOfReceptions=List of receptions @@ -39,4 +40,6 @@ ReceptionCreationIsDoneFromOrder=For the moment, creation of a new reception is ReceptionLine=Reception line ProductQtyInReceptionAlreadySent=Product quantity from open sales order already sent ProductQtyInSuppliersReceptionAlreadyRecevied=Product quantity from open supplier order already received -ValidateOrderFirstBeforeReception=You must first validate the order before being able to make receptions. \ No newline at end of file +ValidateOrderFirstBeforeReception=You must first validate the order before being able to make receptions. +ReceptionsNumberingModules=Numbering module for receptions +ReceptionsReceiptModel=Document templates for receptions \ No newline at end of file From cdebca14a7678a0f1cb6b1c9dae41a87c2298329 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 17:32:13 +0200 Subject: [PATCH 0333/1036] Fix migration --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 39df4d2f59c..b53d0603be6 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -363,4 +363,7 @@ create table llx_reception_extrafields ALTER TABLE llx_reception_extrafields ADD INDEX idx_reception_extrafields (fk_object); +ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_projet integer DEFAULT NULL; +ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_reception integer DEFAULT NULL; + \ No newline at end of file From a1f0df9a301c86eb8857012826cd13c5c3f3ca0a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 17:45:16 +0200 Subject: [PATCH 0334/1036] Debug receipt module --- htdocs/fourn/commande/card.php | 2 +- htdocs/fourn/commande/dispatch.php | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index d1c8d444283..98048552911 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1958,7 +1958,7 @@ elseif (! empty($object->id)) print '"; diff --git a/htdocs/fourn/commande/dispatch.php b/htdocs/fourn/commande/dispatch.php index 7a8bb2bcd22..0c6091b694a 100644 --- a/htdocs/fourn/commande/dispatch.php +++ b/htdocs/fourn/commande/dispatch.php @@ -414,13 +414,13 @@ if ($id > 0 || ! empty($ref)) { print '
'; print '
'; - print '
'.$langs->trans("VariableToUpdate").'
'; + print '
'; print $langs->trans("None"); print '
'.$langs->trans("Date").''; if ($object->date_commande) { - print dol_print_date($object->date_commande, "dayhourtext")."\n"; + print dol_print_date($object->date_commande, "dayhour")."\n"; } print "
'; + print '
'; // Date if ($object->methode_commande_id > 0) { print '"; @@ -450,7 +450,7 @@ if ($id > 0 || ! empty($ref)) { // Line of orders if ($object->statut <= CommandeFournisseur::STATUS_ACCEPTED || $object->statut >= CommandeFournisseur::STATUS_CANCELED) { - print ''.$langs->trans("OrderStatusNotReadyToDispatch").''; + print '
'.$langs->trans("OrderStatusNotReadyToDispatch").''; } if ($object->statut == CommandeFournisseur::STATUS_ORDERSENT @@ -714,13 +714,12 @@ if ($id > 0 || ! empty($ref)) { print "
' . $langs->trans("Date") . ''; if ($object->date_commande) { - print dol_print_date($object->date_commande, "dayhourtext") . "\n"; + print dol_print_date($object->date_commande, "dayhour") . "\n"; } print "
\n"; print '
'; - print "
\n"; if ($nbproduct) { $checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically", $langs->transnoentitiesnoconv('StatusOrderReceivedAll')); - print '
'; + print '
'; $parameters = array(); $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been // modified by hook @@ -737,7 +736,7 @@ if ($id > 0 || ! empty($ref)) { } empty($conf->reception->enabled)?$dispatchBt=$langs->trans("DispatchVerb"):$dispatchBt=$langs->trans("Receive"); - print '
'; @@ -747,7 +746,8 @@ if ($id > 0 || ! empty($ref)) { // Message if nothing to dispatch if (! $nbproduct) { - if (empty($conf->global->SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED)) + print "
\n"; + if (empty($conf->global->SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED)) print '
'.$langs->trans("NoPredefinedProductToDispatch").'
'; // No predefined line at all else print '
'.$langs->trans("NoMorePredefinedProductToDispatch").'
'; // No predefined line that remain to be dispatched. From a5b1de4f6aeec2704c1d5e83af8b2b1202ce7867 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 17:52:55 +0200 Subject: [PATCH 0335/1036] Fix tab that should not be visible --- htdocs/comm/propal/card.php | 2 +- htdocs/core/lib/propal.lib.php | 4 ++-- htdocs/langs/fr_FR/orders.lang | 2 +- htdocs/langs/fr_FR/stocks.lang | 16 ++++++++-------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index abed072bc2c..4d7c0ac5181 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -507,7 +507,7 @@ if (empty($reshook)) // Reset fk_parent_line for no child products and special product if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { $fk_parent_line = 0; - } + 2 } // Extrafields if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && method_exists($lines[$i], 'fetch_optionals')) { diff --git a/htdocs/core/lib/propal.lib.php b/htdocs/core/lib/propal.lib.php index 2ef8d02e025..a8b8623cf4d 100644 --- a/htdocs/core/lib/propal.lib.php +++ b/htdocs/core/lib/propal.lib.php @@ -42,8 +42,8 @@ function propal_prepare_head($object) $head[$h][2] = 'comm'; $h++; - if ((empty($conf->commande->enabled) && ((! empty($conf->expedition_bon->enabled) && $user->rights->expedition->lire) - || (! empty($conf->livraison_bon->enabled) && $user->rights->expedition->livraison->lire)))) + if ((empty($conf->commande->enabled) && ((! empty($conf->expedition->enabled) && ! empty($conf->expedition_bon->enabled) && $user->rights->expedition->lire) + || (! empty($conf->expedition->enabled) && ! empty($conf->livraison_bon->enabled) && $user->rights->expedition->livraison->lire)))) { $langs->load("sendings"); $text = ''; diff --git a/htdocs/langs/fr_FR/orders.lang b/htdocs/langs/fr_FR/orders.lang index 98ff4d54671..a4a8827ca05 100644 --- a/htdocs/langs/fr_FR/orders.lang +++ b/htdocs/langs/fr_FR/orders.lang @@ -114,7 +114,7 @@ ConfirmCloneOrder=Êtes-vous sûr de vouloir cloner cette commande %s ? DispatchSupplierOrder=Réception de la commande fournisseur %s FirstApprovalAlreadyDone=Premier niveau d'approbation déjà réalisé SecondApprovalAlreadyDone=Deuxième niveau d'approbation déjà réalisé -SupplierOrderReceivedInDolibarr=Commande fournisseur %s reçue %s +SupplierOrderReceivedInDolibarr=Commande fournisseur %s réceptionné %s SupplierOrderSubmitedInDolibarr=Commande fournisseur %s soumise SupplierOrderClassifiedBilled=Commande fournisseur %s classée facturée OtherOrders=Autres commandes diff --git a/htdocs/langs/fr_FR/stocks.lang b/htdocs/langs/fr_FR/stocks.lang index 12ecdcd243e..224b81c9b8c 100644 --- a/htdocs/langs/fr_FR/stocks.lang +++ b/htdocs/langs/fr_FR/stocks.lang @@ -3,7 +3,7 @@ WarehouseCard=Fiche entrepôt Warehouse=Entrepôt Warehouses=Entrepôts ParentWarehouse=Entrepôt parent -NewWarehouse=Nouvel entrepôt ou zone de stockage +NewWarehouse=Nouvel entrepôt / emplacement WarehouseEdit=Édition entrepôt MenuNewWarehouse=Nouvel entrepôt WarehouseSource=Entrepôt source @@ -29,6 +29,8 @@ MovementId=Id du mouvement StockMovementForId=ID mouvement %d ListMouvementStockProject=Liste des mouvements de stocks associés au projet StocksArea=Espace entrepôts +AllWarehouses=Tous les entrepôts +IncludeAlsoDraftOrders=Inclure également les commandes brouillons Location=Lieu LocationSummary=Nom court du lieu NumberOfDifferentProducts=Nombre de produits différents @@ -53,12 +55,12 @@ PMPValue=Valorisation (PMP) PMPValueShort=PMP EnhancedValueOfWarehouses=Valorisation des stocks UserWarehouseAutoCreate=Créer automatiquement un stock/entrepôt propre à l'utilisateur lors de sa création -AllowAddLimitStockByWarehouse=Autoriser l'ajout d'une limite et d'un stock désiré par produit et entrepôt à la place de produit seul +AllowAddLimitStockByWarehouse=Gérez également les valeurs des stocks minimum et souhaités par paire (produit-entrepôt) en plus des valeurs par produit IndependantSubProductStock=Le stock du produit et le stock des sous-produits sont indépendant QtyDispatched=Quantité ventilée QtyDispatchedShort=Qté ventilée QtyToDispatchShort=Qté à ventiler -OrderDispatch=Biens reçus +OrderDispatch=Réceptions d'articles RuleForStockManagementDecrease=Règle de gestion des décrémentations automatiques de stock (la décrémentation manuelle est toujours possible, même si une décrémentation automatique est activée) RuleForStockManagementIncrease=Règle de gestion des incrémentations de stock (l'incrémentation manuelle est toujours possible, même si une incrémentation automatique est activée) DeStockOnBill=Décrémenter les stocks physiques sur validation des factures/avoirs clients @@ -68,8 +70,6 @@ DeStockOnShipmentOnClosing=Décrémenter les stocks physiques au classement "cl ReStockOnBill=Incrémenter les stocks physiques sur validation des factures/avoirs fournisseurs ReStockOnValidateOrder=Incrémenter les stocks physiques sur approbation des commandes fournisseurs ReStockOnDispatchOrder=Incrémenter les stocks physiques sur ventilation manuelle dans les entrepôts, après réception de la marchandise -StockOnReception=Augmenter les stocks physiques sur validation des réceptions -StockOnReceptionOnClosing=Augmenter les stocks réels au classement "clôturée" de la réception OrderStatusNotReadyToDispatch=La commande n'a pas encore ou n'a plus un statut permettant une ventilation en stock. StockDiffPhysicTeoric=Explication de l'écart stock physique-virtuel NoPredefinedProductToDispatch=Pas de produits prédéfinis dans cet objet. Aucune ventilation en stock n'est donc à faire. @@ -149,7 +149,7 @@ NoPendingReceptionOnSupplierOrder=Pas de réception en attente consécutive à d ThisSerialAlreadyExistWithDifferentDate=Ce lot/numéro de série (%s) existe déjà mais avec des dates de consommation ou péremption différente (trouvé %s mais vous avez entré %s). OpenAll=Accepte tous les mouvements OpenInternal=Limité aux mouvements internes -UseDispatchStatus=Utiliser le statut de la commande (approuvée/refusée) pour les lignes de produits sur les bons de réception fournisseur +UseDispatchStatus=Utiliser un statut de contrôle (approuvé / refusé) pour les lignes de produits lors de la réception de la commande OptionMULTIPRICESIsOn=L'option "plusieurs prix par tranches" est activée. Cela signifie qu'un produit à plusieurs prix de vente donc sa valeur de vente ne peut être calculée. ProductStockWarehouseCreated=Alerte de limite de stock et de stock désiré ajoutée ProductStockWarehouseUpdated=Alerte de limite de stock et de stock désiré actualisée @@ -173,14 +173,14 @@ inventoryValidate=Validé inventoryDraft=En service inventorySelectWarehouse=Chois de l'entrepôt inventoryConfirmCreate=Créer -inventoryOfWarehouse=Enventaire pour l'entrepôt: %s +inventoryOfWarehouse=Inventaire pour l'entrepôt: %s inventoryErrorQtyAdd=Erreur: une quantité est inférieure à zéro inventoryMvtStock=Par inventaire inventoryWarningProductAlreadyExists=Ce produit est déjà dans la liste SelectCategory=Filtre par catégorie SelectFournisseur=Filtre fournisseur inventoryOnDate=Inventaire -INVENTORY_DISABLE_VIRTUAL=Autoriser à ne pas déstocker les produits enfants d'un kit dans l'inventaire +INVENTORY_DISABLE_VIRTUAL=Autoriser à ne pas déstocker les produits enfants d'un produit virtuel (kit) dans l'inventaire INVENTORY_USE_MIN_PA_IF_NO_LAST_PA=Utiliser le prix d'achat si aucun dernier prix d'achat n'a pu être trouvé INVENTORY_USE_INVENTORY_DATE_FROM_DATEMVT=Le mouvement de stock a la date d'inventaire inventoryChangePMPPermission=Autoriser à changer la valeur PMP d'un produit From c3d80b217bd313522e520e02a13ed3922e328616 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 18:00:40 +0200 Subject: [PATCH 0336/1036] Fix css --- htdocs/theme/eldy/global.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index 83e2989256f..b797ec69b9e 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2645,6 +2645,10 @@ table.paddingtopbottomonly tr td { .liste_titre_filter { background: rgb() !important; } +table:not(.listwithfilterbefore) tr.liste_titre_filter:first-of-type td.liste_titre { + padding-top: 5px; +} + tr.liste_titre_filter td.liste_titre { /* border-bottom: 1px solid #ddd; */ padding-top: 1px; From 2ff81cd2625579e5e9078b2903c4729e599ce163 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 18:08:23 +0200 Subject: [PATCH 0337/1036] Fix duplicate key --- htdocs/langs/en_US/paypal.lang | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/langs/en_US/paypal.lang b/htdocs/langs/en_US/paypal.lang index de2f0b19958..1db01a59012 100644 --- a/htdocs/langs/en_US/paypal.lang +++ b/htdocs/langs/en_US/paypal.lang @@ -14,7 +14,6 @@ PaypalModeOnlyPaypal=PayPal only ONLINE_PAYMENT_CSS_URL=Optional URL of CSS stylesheet on online payment page ThisIsTransactionId=This is id of transaction: %s PAYPAL_ADD_PAYMENT_URL=Include the PayPal payment url when you send a document by email -YouAreCurrentlyInSandboxMode=You are currently in the %s "sandbox" mode NewOnlinePaymentReceived=New online payment received NewOnlinePaymentFailed=New online payment tried but failed ONLINE_PAYMENT_SENDEMAIL=Email address for notifications after each payment attempt (for success and fail) From 78c4a3cced35dfbf7d367ad45b1c1d7b327655cd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 18:33:50 +0200 Subject: [PATCH 0338/1036] Fix lang --- htdocs/compta/journal/purchasesjournal.php | 2 +- htdocs/compta/journal/sellsjournal.php | 2 +- htdocs/langs/en_US/admin.lang | 3 --- htdocs/langs/en_US/bills.lang | 1 - htdocs/langs/en_US/main.lang | 2 -- 5 files changed, 2 insertions(+), 8 deletions(-) diff --git a/htdocs/compta/journal/purchasesjournal.php b/htdocs/compta/journal/purchasesjournal.php index db69324d5e5..cd3bf06f43a 100644 --- a/htdocs/compta/journal/purchasesjournal.php +++ b/htdocs/compta/journal/purchasesjournal.php @@ -35,7 +35,7 @@ require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php'; // Load translation files required by the page -$langs->loadlangs(array('companies', 'other', 'compta')); +$langs->loadlangs(array('companies', 'other', 'bills', 'compta')); $date_startmonth=GETPOST('date_startmonth'); $date_startday=GETPOST('date_startday'); diff --git a/htdocs/compta/journal/sellsjournal.php b/htdocs/compta/journal/sellsjournal.php index ea5f54639a1..fe51665163e 100644 --- a/htdocs/compta/journal/sellsjournal.php +++ b/htdocs/compta/journal/sellsjournal.php @@ -37,7 +37,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; // Load translation files required by the page -$langs->loadLangs(array('companies', 'other', 'compta')); +$langs->loadLangs(array('companies', 'other', 'bills', 'compta')); $date_startmonth=GETPOST('date_startmonth'); $date_startday=GETPOST('date_startday'); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 0862719289b..8893626156b 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -992,7 +992,6 @@ Port=Port VirtualServerName=Virtual server name OS=OS PhpWebLink=Web-Php link -Browser=Browser Server=Server Database=Database DatabaseServer=Database host @@ -1240,8 +1239,6 @@ BillsNumberingModule=Invoices and credit notes numbering model BillsPDFModules=Invoice documents models BillsPDFModulesAccordindToInvoiceType=Invoice documents models according to invoice type PaymentsPDFModules=Payment documents models -CreditNote=Credit note -CreditNotes=Credit notes ForceInvoiceDate=Force invoice date to validation date SuggestedPaymentModesIfNotDefinedInInvoice=Suggested payments mode on invoice by default if not defined for invoice SuggestPaymentByRIBOnAccount=Suggest payment by withdrawal on account diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index 8aa6d8ffb52..8d9aa039fcd 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -89,7 +89,6 @@ PaymentTerm=Payment Term PaymentConditions=Payment Terms PaymentConditionsShort=Payment Terms PaymentAmount=Payment amount -ValidatePayment=Validate payment PaymentHigherThanReminderToPay=Payment higher than reminder to pay HelpPaymentHigherThanReminderToPay=Attention, the payment amount of one or more bills is higher than the outstanding amount to pay.
Edit your entry, otherwise confirm and consider creating a credit note for the excess received for each overpaid invoice. HelpPaymentHigherThanReminderToPaySupplier=Attention, the payment amount of one or more bills is higher than the outstanding amount to pay.
Edit your entry, otherwise confirm and consider creating a credit note for the excess paid for each overpaid invoice. diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 59c8ba3412c..f91cbd8f1eb 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -644,7 +644,6 @@ SendAcknowledgementByMail=Send confirmation email SendMail=Send email Email=Email NoEMail=No email -Email=Email AlreadyRead=Already read NotRead=Not read NoMobilePhone=No mobile phone @@ -672,7 +671,6 @@ Method=Method Receive=Receive CompleteOrNoMoreReceptionExpected=Complete or nothing more expected ExpectedValue=Expected Value -CurrentValue=Current value PartialWoman=Partial TotalWoman=Total NeverReceived=Never received From acc57343a992548d3a198c5bfea51c7877e18e7e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 18:34:10 +0200 Subject: [PATCH 0339/1036] Trans --- htdocs/langs/en_US/compta.lang | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang index 02feb47ccb9..9a5f9768d24 100644 --- a/htdocs/langs/en_US/compta.lang +++ b/htdocs/langs/en_US/compta.lang @@ -80,7 +80,6 @@ AddSocialContribution=Add social/fiscal tax ContributionsToPay=Social/fiscal taxes to pay AccountancyTreasuryArea=Billing and payment area NewPayment=New payment -Payments=Payments PaymentCustomerInvoice=Customer invoice payment PaymentSupplierInvoice=vendor invoice payment PaymentSocialContribution=Social/fiscal tax payment @@ -205,7 +204,6 @@ SellsJournal=Sales Journal PurchasesJournal=Purchases Journal DescSellsJournal=Sales Journal DescPurchasesJournal=Purchases Journal -InvoiceRef=Invoice ref. CodeNotDef=Not defined WarningDepositsNotIncluded=Down payment invoices are not included in this version with this accountancy module. DatePaymentTermCantBeLowerThanObjectDate=Payment term date can't be lower than object date. From 314dc26b87cda82f06e828c4e0775bf4bd501718 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 19:32:19 +0200 Subject: [PATCH 0340/1036] Look and feel v10 --- htdocs/core/lib/admin.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 62271148ff0..243e943143e 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -683,7 +683,7 @@ function translation_prepare_head() $head = array(); $head[$h][0] = DOL_URL_ROOT."/admin/translation.php?mode=overwrite"; - $head[$h][1] = $langs->trans("TranslationOverwriteKey"); + $head[$h][1] = $langs->trans("TranslationOverwriteKey").''; $head[$h][2] = 'overwrite'; $h++; From d8c1c24028db9d84061fe7b5c4b55b42584ce5da Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 19:46:10 +0200 Subject: [PATCH 0341/1036] Fix syntax error --- htdocs/comm/propal/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 4d7c0ac5181..abed072bc2c 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -507,7 +507,7 @@ if (empty($reshook)) // Reset fk_parent_line for no child products and special product if (($lines[$i]->product_type != 9 && empty($lines[$i]->fk_parent_line)) || $lines[$i]->product_type == 9) { $fk_parent_line = 0; - 2 } + } // Extrafields if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && method_exists($lines[$i], 'fetch_optionals')) { From bc49f47718ee5aea8f293fde9a38e9f273c90845 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 19:48:13 +0200 Subject: [PATCH 0342/1036] Fix phpcs --- htdocs/core/modules/facture/doc/pdf_crabe.modules.php | 2 +- htdocs/core/modules/product/doc/pdf_standard.modules.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php index dd7c63d299a..a641e209f9e 100644 --- a/htdocs/core/modules/facture/doc/pdf_crabe.modules.php +++ b/htdocs/core/modules/facture/doc/pdf_crabe.modules.php @@ -1523,7 +1523,7 @@ class pdf_crabe extends ModelePDFFactures if (empty($hidetop)) { $pdf->SetXY($this->posxdiscount-1, $tab_top+1); - $pdf->MultiCell($this->posxprogress-$this->posxdiscount+1, 2, $outputlangs->transnoentities("ReductionShort"),'','C'); + $pdf->MultiCell($this->posxprogress-$this->posxdiscount+1, 2, $outputlangs->transnoentities("ReductionShort"), '', 'C'); } } diff --git a/htdocs/core/modules/product/doc/pdf_standard.modules.php b/htdocs/core/modules/product/doc/pdf_standard.modules.php index fd25cb86a78..04d566248b9 100644 --- a/htdocs/core/modules/product/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/product/doc/pdf_standard.modules.php @@ -661,7 +661,7 @@ class pdf_standard extends ModelePDFProduct if (empty($hidetop)) { $pdf->SetXY($this->posxqty-1, $tab_top+1); - $pdf->MultiCell($this->posxunit-$this->posxqty-1, 2, $outputlangs->transnoentities("Qty"),'','C'); + $pdf->MultiCell($this->posxunit-$this->posxqty-1, 2, $outputlangs->transnoentities("Qty"), '', 'C'); } if($conf->global->PRODUCT_USE_UNITS) { From 2b182c1cc15281bc64a43a18342b3e82d42d5afb Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Thu, 9 May 2019 20:39:30 +0200 Subject: [PATCH 0343/1036] FIX: #11097 --- htdocs/admin/holiday.php | 6 +++--- htdocs/core/modules/holiday/mod_holiday_immaculate.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/holiday.php b/htdocs/admin/holiday.php index 82037fa85d1..6b65f168137 100644 --- a/htdocs/admin/holiday.php +++ b/htdocs/admin/holiday.php @@ -1,8 +1,8 @@ +/* Copyright (C) 2011-2019 Juanjo Menent * Copyright (C) 2011-2018 Philippe Grand * Copyright (C) 2018 Charlene Benke - * Copyright (C) 2018 Frédéric France + * Copyright (C) 2018 Frédéric France * * 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 @@ -55,7 +55,7 @@ include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; if ($action == 'updateMask') { - $maskconst = GETPOST('maskconstholidaty','alpha'); + $maskconst = GETPOST('maskconstholiday','alpha'); $maskvalue = GETPOST('maskholiday','alpha'); if ($maskconst) $res = dolibarr_set_const($db,$maskconst,$maskvalue,'chaine',0,'',$conf->entity); diff --git a/htdocs/core/modules/holiday/mod_holiday_immaculate.php b/htdocs/core/modules/holiday/mod_holiday_immaculate.php index 338b553166e..fb95b08a5e0 100644 --- a/htdocs/core/modules/holiday/mod_holiday_immaculate.php +++ b/htdocs/core/modules/holiday/mod_holiday_immaculate.php @@ -1,6 +1,6 @@ - * Copyright (C) 2018 Charlene Benke +/* Copyright (C) 2011-2019 Juanjo Menent + * Copyright (C) 2018 Charlene Benke * * 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 @@ -72,7 +72,7 @@ class mod_holiday_immaculate extends ModelNumRefHolidays $texte.= ''; $texte.= ''; $texte.= ''; - $texte.= ''; + $texte.= ''; $texte.= ''; $tooltip=$langs->trans("GenericMaskCodes",$langs->transnoentities("Holiday"),$langs->transnoentities("Holiday")); From 2df026b903ed8d983f474ae7071915a7bdba44a5 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Thu, 9 May 2019 20:59:22 +0200 Subject: [PATCH 0344/1036] FIX: #11032 --- htdocs/product/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 22767b69cda..03163989094 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2018 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2012-2016 Marcos García - * Copyright (C) 2013-2018 Juanjo Menent + * Copyright (C) 2013-2019 Juanjo Menent * Copyright (C) 2013-2015 Raphaël Doursenaud * Copyright (C) 2013 Jean Heimburger * Copyright (C) 2013 Cédric Salvador @@ -269,7 +269,7 @@ else $sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; $sql.= ' p.fk_product_type, p.duration, p.weight, p.length, p.surface, p.volume, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,'; $sql.= ' p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy,'; -$sql.= ' p.datec as date_creation, p.tms as date_update, p.pmp,'; +$sql.= ' p.datec as date_creation, p.tms as date_update, p.pmp, p.stock,'; $sql.= ' MIN(pfp.unitprice) as minsellprice'; if (!empty($conf->variants->enabled) && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && ! $show_childproducts )) { $sql .= ', pac.rowid prod_comb_id'; From 6cb96b926bd8cc6d070c0f56f5701f112dd998d0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 9 May 2019 21:34:22 +0200 Subject: [PATCH 0345/1036] Fix phpcs --- htdocs/compta/cashcontrol/cashcontrol_card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_card.php b/htdocs/compta/cashcontrol/cashcontrol_card.php index 5e16d090d3b..61acf6e3a89 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_card.php +++ b/htdocs/compta/cashcontrol/cashcontrol_card.php @@ -350,7 +350,7 @@ if ($action=="create" || $action=="start") { $selectedposnumber=1; $showempty=0; } - print $form->selectarray('posnumber', $array, GETPOSTISSET('posnumber')?GETPOST('posnumber','int'):$selectedposnumber, $showempty); + print $form->selectarray('posnumber', $array, GETPOSTISSET('posnumber')?GETPOST('posnumber', 'int'):$selectedposnumber, $showempty); //print ''; print ''; // Year From 5e06a2497d25a29ce94ce08dbc52022373ce7f24 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 10 May 2019 00:39:34 +0200 Subject: [PATCH 0346/1036] Fix list of webhook for stripe --- htdocs/stripe/admin/stripe.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 9b9914d6c7e..2bc257e1f77 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -155,7 +155,7 @@ print ''; dol_fiche_head($head, 'stripeaccount', '', -1); -$stripearrayofwebhookevents=array('payout.created','payout.paid','charge.pending','charge.refunded','charge.succeeded','charge.failed','payment_intent.succeeded','payment_intent.payment_failed','source.chargeable','customer.deleted'); +$stripearrayofwebhookevents=array('payout.created','payout.paid','charge.pending','charge.refunded','charge.succeeded','charge.failed','payment_intent.succeeded','payment_intent.payment_failed','payment_method.attached','payment_method.updated','payment_method.card_automatically_updated','payment_method.detached','source.chargeable','customer.deleted'); print $langs->trans("StripeDesc")."
\n"; From f50280f13b2860d873eff563e8214fc3c2b139e4 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 10 May 2019 01:16:58 +0200 Subject: [PATCH 0347/1036] Fix img_credit_card with payment methods --- htdocs/core/lib/functions.lib.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 80aeb83b064..3ee0cd1f3e1 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3593,12 +3593,12 @@ function img_allow($allow, $titlealt = 'default') */ function img_credit_card($brand) { - if ($brand == 'Visa') {$brand='cc-visa';} - elseif ($brand == 'MasterCard') {$brand='cc-mastercard';} - elseif ($brand == 'American Express') {$brand='cc-amex';} - elseif ($brand == 'Discover') {$brand='cc-discover';} - elseif ($brand == 'JCB') {$brand='cc-jcb';} - elseif ($brand == 'Diners Club') {$brand='cc-diners-club';} + if ($brand == 'visa' || $brand == 'Visa') {$brand='cc-visa';} + elseif ($brand == 'mastercard' || $brand == 'MasterCard') {$brand='cc-mastercard';} + elseif ($brand == 'amex' || $brand == 'American Express') {$brand='cc-amex';} + elseif ($brand == 'discover' || $brand == 'Discover') {$brand='cc-discover';} + elseif ($brand == 'jcb' || $brand == 'JCB') {$brand='cc-jcb';} + elseif ($brand == 'diners' || $brand == 'Diners club') {$brand='cc-diners-club';} elseif (! in_array($brand, array('cc-visa','cc-mastercard','cc-amex','cc-discover','cc-jcb','cc-diners-club'))) {$brand='credit-card';} return ''; From 00f626587067a37710fc6ab6e9d94ede75930782 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 09:33:21 +0200 Subject: [PATCH 0348/1036] Fix responsive --- htdocs/core/boxes/box_project.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/boxes/box_project.php b/htdocs/core/boxes/box_project.php index 86e092de7c3..e7281708802 100644 --- a/htdocs/core/boxes/box_project.php +++ b/htdocs/core/boxes/box_project.php @@ -118,7 +118,7 @@ class box_project extends ModeleBoxes $projectstatic->public = $objp->public; $this->info_box_contents[$i][] = array( - 'td' => '', + 'td' => 'class="nowraponall"', 'text' => $projectstatic->getNomUrl(1), 'asis' => 1 ); From e87a32e92fbf7b4807b5aae900c57de004286712 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 09:53:10 +0200 Subject: [PATCH 0349/1036] Fix Try to fix DAV pb with some buggy clients by disabling browser --- htdocs/admin/dav.php | 2 +- htdocs/dav/fileserver.php | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/htdocs/admin/dav.php b/htdocs/admin/dav.php index 894706576b5..6ac210c1ddb 100644 --- a/htdocs/admin/dav.php +++ b/htdocs/admin/dav.php @@ -153,7 +153,7 @@ print "\n"; clearstatcache(); -print $langs->trans("WebDAVSetupDesc")."
\n"; +print ''.$langs->trans("WebDAVSetupDesc")."
\n"; print "
"; diff --git a/htdocs/dav/fileserver.php b/htdocs/dav/fileserver.php index 55284036bea..3d484fa8b01 100644 --- a/htdocs/dav/fileserver.php +++ b/htdocs/dav/fileserver.php @@ -14,6 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * You can test with the WebDav client cadaver: + * cadaver http://myurl/dav/fileserver.php */ /** @@ -59,7 +62,8 @@ $publicDir = $conf->dav->multidir_output[$entity].'/public'; $privateDir = $conf->dav->multidir_output[$entity].'/private'; $ecmDir = $conf->ecm->multidir_output[$entity]; $tmpDir = $conf->dav->multidir_temp[$entity]; -//var_dump($tmpDir);exit; +//var_dump($tmpDir);mkdir($tmpDir);exit; + // Authentication callback function $authBackend = new \Sabre\DAV\Auth\Backend\BasicCallBack(function ($username, $password) { @@ -147,13 +151,17 @@ if ((empty($conf->global->DAV_ALLOW_PUBLIC_DIR) $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend)); } // Support for LOCK and UNLOCK +dol_mkdir($tmpDir); $lockBackend = new \Sabre\DAV\Locks\Backend\File($tmpDir . '/.locksdb'); $lockPlugin = new \Sabre\DAV\Locks\Plugin($lockBackend); $server->addPlugin($lockPlugin); // Support for html frontend -$browser = new \Sabre\DAV\Browser\Plugin(); -$server->addPlugin($browser); +if (empty($conf->global->DAV_DISABLE_BROWSER)) +{ + $browser = new \Sabre\DAV\Browser\Plugin(); + $server->addPlugin($browser); +} // Automatically guess (some) contenttypes, based on extension //$server->addPlugin(new \Sabre\DAV\Browser\GuessContentType()); From c12a45597d8038c274dec4bce1476058b03d31f8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 09:57:15 +0200 Subject: [PATCH 0350/1036] Fix move .lockdb into root dir --- htdocs/dav/fileserver.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/dav/fileserver.php b/htdocs/dav/fileserver.php index 3d484fa8b01..4e99cf92613 100644 --- a/htdocs/dav/fileserver.php +++ b/htdocs/dav/fileserver.php @@ -61,7 +61,7 @@ $entity = (GETPOST('entity', 'int') ? GETPOST('entity', 'int') : (!empty($conf-> $publicDir = $conf->dav->multidir_output[$entity].'/public'; $privateDir = $conf->dav->multidir_output[$entity].'/private'; $ecmDir = $conf->ecm->multidir_output[$entity]; -$tmpDir = $conf->dav->multidir_temp[$entity]; +$tmpDir = $conf->dav->multidir_output[$entity]; // We need root dir, not a dir that can be deleted //var_dump($tmpDir);mkdir($tmpDir);exit; @@ -151,7 +151,6 @@ if ((empty($conf->global->DAV_ALLOW_PUBLIC_DIR) $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend)); } // Support for LOCK and UNLOCK -dol_mkdir($tmpDir); $lockBackend = new \Sabre\DAV\Locks\Backend\File($tmpDir . '/.locksdb'); $lockPlugin = new \Sabre\DAV\Locks\Plugin($lockBackend); $server->addPlugin($lockPlugin); From 8a29d9f2d1d1d104fa6fcf631c3e48861fa2138c Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 11:23:19 +0200 Subject: [PATCH 0351/1036] FIX possibility to override permissions (multicompany) --- htdocs/product/fournisseurs.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index cc922cb724b..d5ec0d6d2df 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -102,6 +102,9 @@ if (! $sortorder) $sortorder="ASC"; if ($cancel) $action=''; +$usercanread = (($object->type == Product::TYPE_PRODUCT && $user->rights->produit->lire) || ($object->type == Product::TYPE_SERVICE && $user->rights->service->lire)); +$usercancreate = (($object->type == Product::TYPE_PRODUCT && $user->rights->produit->creer) || ($object->type == Product::TYPE_SERVICE && $user->rights->service->creer)); + $parameters=array('socid'=>$socid, 'id_prod'=>$id); $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'); @@ -385,9 +388,9 @@ if ($id > 0 || $ref) $textdesc =$langs->trans("CostPriceDescription"); $textdesc.="
".$langs->trans("CostPriceUsage"); $text=$form->textwithpicto($langs->trans("CostPrice"), $textdesc, 1, 'help', ''); - print $form->editfieldkey($text, 'cost_price', $object->cost_price, $object, $user->rights->produit->creer||$user->rights->service->creer, 'amount:6'); + print $form->editfieldkey($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6'); print '
'; print '
'; - print $form->editfieldval($text, 'cost_price', $object->cost_price, $object, $user->rights->produit->creer||$user->rights->service->creer, 'amount:6'); + print $form->editfieldval($text, 'cost_price', $object->cost_price, $object, $usercancreate, 'amount:6'); print '
'; @@ -399,7 +402,7 @@ if ($id > 0 || $ref) // Form to add or update a price - if (($action == 'add_price' || $action == 'updateprice' ) && ($user->rights->produit->creer || $user->rights->service->creer)) + if (($action == 'add_price' || $action == 'updateprice' ) && $usercancreate) { $langs->load("suppliers"); @@ -747,7 +750,7 @@ SCRIPT; $reshook=$hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { - if ($user->rights->produit->creer || $user->rights->service->creer) + if ($usercancreate) { print ''; print $langs->trans("AddSupplierPrice").''; @@ -758,7 +761,7 @@ SCRIPT; print "\n
\n"; print '
'; - if ($user->rights->fournisseur->lire) + if ($user->rights->fournisseur->lire) // Duplicate ? this check is already in the head of this file { $param=''; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); @@ -822,7 +825,7 @@ SCRIPT; print ''.$productfourn->getSocNomUrl(1, 'supplier').''; // Supplier ref - if ($user->rights->produit->creer || $user->rights->service->creer) // change required right here + if ($usercancreate) // change required right here { print ''.$productfourn->getNomUrl().''; } @@ -924,7 +927,7 @@ SCRIPT; // Modify-Remove print ''; - if ($user->rights->produit->creer || $user->rights->service->creer) + if ($usercancreate) { print ''.img_edit().""; print '   '; From de84f12b241cc05d363c5d1e588719eae2fe18f4 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 11:47:44 +0200 Subject: [PATCH 0352/1036] FIX broken feature with ldap trigger !!! --- htdocs/user/class/user.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index f6a8eb9f8d9..97970dd6909 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2522,7 +2522,7 @@ class User extends CommonObject * 2=Return key only (RDN) (uid=qqq) * @return string DN */ - private function _load_ldap_dn($info, $mode = 0) + public function _load_ldap_dn($info, $mode = 0) { // phpcs:enable global $conf; @@ -2539,7 +2539,7 @@ class User extends CommonObject * * @return array Tableau info des attributs */ - private function _load_ldap_info() + public function _load_ldap_info() { // phpcs:enable global $conf,$langs; From 2ce96290eb18a87927ea0f784650c9c6ca101bef Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 11:50:01 +0200 Subject: [PATCH 0353/1036] FIX broken feature !! --- htdocs/user/class/usergroup.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index eada58c3e3b..2fd401a48e9 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -934,7 +934,7 @@ class UserGroup extends CommonObject * 2=Return key only (uid=qqq) * @return string DN */ - private function _load_ldap_dn($info, $mode = 0) + public function _load_ldap_dn($info, $mode = 0) { // phpcs:enable global $conf; @@ -952,7 +952,7 @@ class UserGroup extends CommonObject * * @return array Tableau info des attributs */ - private function _load_ldap_info() + public function _load_ldap_info() { // phpcs:enable global $conf,$langs; From 3dbfc08a1353c66d81c368f850cd5149b0250420 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 12:24:02 +0200 Subject: [PATCH 0354/1036] NEW add "printBucktrackInfo" hook, an external module can add info --- ChangeLog | 1 + htdocs/main.inc.php | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/ChangeLog b/ChangeLog index 355d9baa561..4e36f831197 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,7 @@ FIX: Disallow line start date if after end date. For Developers: NEW: Module "DebugBar" is available as a stable module. +NEW: add "printBucktrackInfo" hook, an external module can add info WARNING: diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index f195d5f945e..2f3455f7631 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -2030,6 +2030,16 @@ function left_menu($menu_array_before, $helppagename = '', $notused = '', $menu_ $bugbaseurl.= urlencode("- **PHP**: " . php_sapi_name() . ' ' . phpversion() . "\n"); $bugbaseurl.= urlencode("- **Database**: " . $db::LABEL . ' ' . $db->getVersion() . "\n"); $bugbaseurl.= urlencode("- **URL**: " . $_SERVER["REQUEST_URI"] . "\n"); + + // Execute hook printBugtrackInfo + $parameters=array('searchform'=>$searchform); + $reshook=$hookmanager->executeHooks('printBugtrackInfo', $parameters); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) + { + $bugbaseurl.=$hookmanager->resPrint; + } + else $bugbaseurl=$hookmanager->resPrint; + $bugbaseurl.= urlencode("\n"); $bugbaseurl.= urlencode("## Report\n"); print '
'; From a91b462a898cb871fe7e91c886194853b42c7128 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 12:28:27 +0200 Subject: [PATCH 0355/1036] FIX wrong parameter --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 2f3455f7631..7dc8df05499 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -2032,7 +2032,7 @@ function left_menu($menu_array_before, $helppagename = '', $notused = '', $menu_ $bugbaseurl.= urlencode("- **URL**: " . $_SERVER["REQUEST_URI"] . "\n"); // Execute hook printBugtrackInfo - $parameters=array('searchform'=>$searchform); + $parameters=array('bugbaseurl'=>$bugbaseurl); $reshook=$hookmanager->executeHooks('printBugtrackInfo', $parameters); // Note that $action and $object may have been modified by some hooks if (empty($reshook)) { From cd8f601cdc315bcb8fa331c291f8ada0d80beece Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:01:11 +0200 Subject: [PATCH 0356/1036] Fix length of vat number --- htdocs/core/lib/functions2.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index e5c765383af..76d3d54515d 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -577,7 +577,7 @@ function isValidVATID($company) $vatprefix = $company->country_code; if ($vatprefix == 'GR') $vatprefix = '(EL|GR)'; else $vatprefix = preg_quote($vatprefix, '/'); - if (! preg_match('/^'.$vatprefix.'[a-zA-Z0-9\-\.]{5,10}$/', $company->tva_intra)) + if (! preg_match('/^'.$vatprefix.'[a-zA-Z0-9\-\.]{5,12}$/', $company->tva_intra)) { return 0; } From 71ba368d578aa49b0ce5bab0ace17d9ad20f1859 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:02:45 +0200 Subject: [PATCH 0357/1036] Fix phpdoc --- htdocs/core/ajax/getaccountcurrency.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/core/ajax/getaccountcurrency.php b/htdocs/core/ajax/getaccountcurrency.php index d4168b17174..a24133f4448 100644 --- a/htdocs/core/ajax/getaccountcurrency.php +++ b/htdocs/core/ajax/getaccountcurrency.php @@ -16,8 +16,8 @@ */ /** - * \file htdocs/core/ajax/vatrates.php - * \brief File to load vat rates combobox + * \file htdocs/core/ajax/getaccountcurrency.php + * \brief File to load currency rates */ if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Disables token renewal @@ -26,7 +26,8 @@ if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); require '../../main.inc.php'; -$id = GETPOST('id', 'int'); +$id = GETPOST('id', 'int'); + /* * View From 0e7be8365c498f51a963c30b79d0433e4ed23c40 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:22:07 +0200 Subject: [PATCH 0358/1036] Fix size of box --- htdocs/societe/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 885d699b096..31328706271 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1370,7 +1370,7 @@ else print "\n"; print ''; print "\n"; From 7d2d12348cc9c8d32eda2d6fa008b20736a575bf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:27:48 +0200 Subject: [PATCH 0359/1036] Fix popup --- htdocs/societe/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 31328706271..292d109fd74 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1370,12 +1370,12 @@ else print "\n"; print ''; print "\n"; $s.=''.$langs->trans("VATIntraCheck").''; - $s = $form->textwithpicto($s, $langs->trans("VATIntraCheckDesc", $langs->trans("VATIntraCheck")), 1); + $s = $form->textwithpicto($s, $langs->trans("VATIntraCheckDesc", $langs->transnoentitiesnoconv("VATIntraCheck")), 1); } else { From 0e8184332e377c4e4b3f21047d203e78cb4827e7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:39:05 +0200 Subject: [PATCH 0360/1036] Fix missing label on project tooltip --- htdocs/comm/propal/list.php | 25 +++++++++++++------------ htdocs/commande/list.php | 17 ++++++++++------- htdocs/compta/facture/list.php | 5 ++--- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 24c53d26526..e59700b78e0 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -265,13 +265,12 @@ $sql.= " ava.rowid as availability,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' p.rowid, p.entity, p.note_private, p.total_ht, p.tva as total_vat, p.total as total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,p.date_livraison as ddelivery,'; $sql.= ' p.datec as date_creation, p.tms as date_update,'; -$sql.= " pr.rowid as project_id, pr.ref as project_ref,"; -if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; +$sql.= " pr.rowid as project_id, pr.ref as project_ref, p.title as project_label,"; $sql.= ' u.login'; +if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user,"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; - // Add fields from extrafields -foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +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 @@ -725,6 +724,12 @@ if ($resql) $objectstatic->id=$obj->rowid; $objectstatic->ref=$obj->ref; + $companystatic->id=$obj->socid; + $companystatic->name=$obj->name; + $companystatic->client=$obj->client; + $companystatic->code_client=$obj->code_client; + $companystatic->email=$obj->email; + print ''; if (! empty($arrayfields['p.ref']['checked'])) @@ -777,20 +782,16 @@ if ($resql) { // Project ref print ''; - if ($obj->project_id) { - $projectstatic->fetch($obj->project_id); + if ($obj->project_id > 0) { + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; print $projectstatic->getNomUrl(1); } print ''; if (! $i) $totalarray['nbfield']++; } - $companystatic->id=$obj->socid; - $companystatic->name=$obj->name; - $companystatic->client=$obj->client; - $companystatic->code_client=$obj->code_client; - $companystatic->email=$obj->email; - // Thirdparty if (! empty($arrayfields['s.nom']['checked'])) { diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 13f9d2a2b1d..d991fb1cc97 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -245,11 +245,10 @@ $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' c.rowid, c.ref, c.total_ht, c.tva as total_tva, c.total_ttc, c.ref_client,'; $sql.= ' c.date_valid, c.date_commande, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; $sql.= ' c.date_creation as date_creation, c.tms as date_update,'; -$sql.= " p.rowid as project_id, p.ref as project_ref"; +$sql.= " p.rowid as project_id, p.ref as project_ref, p.title as project_label"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; - // Add fields from extrafields -foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +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 @@ -936,10 +935,14 @@ if ($resql) // Project if (! empty($arrayfields['p.project_ref']['checked'])) { - $projectstatic->id=$obj->project_id; - $projectstatic->ref=$obj->project_ref; - print ''; - if ($obj->project_id > 0) print $projectstatic->getNomUrl(1); + print ''; + if ($obj->project_id > 0) + { + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; + print $projectstatic->getNomUrl(1); + } print ''; if (! $i) $totalarray['nbfield']++; } diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index a418696c15d..7961ca58730 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -379,9 +379,8 @@ $sql.= " p.rowid as project_id, p.ref as project_ref, p.title as project_label"; // TODO Better solution to be able to sort on already payed or remain to pay is to store amount_payed in a denormalized field. if (! $sall) $sql.= ', SUM(pf.amount) as dynamount_payed'; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; - // Add fields from extrafields -foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +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 @@ -1030,7 +1029,7 @@ if ($resql) // Project if (! empty($arrayfields['p.ref']['checked'])) { - print ''; + print ''; if ($obj->project_id > 0) { $projectstatic->id=$obj->project_id; From 5625c94c44b9f28474584835b603dcbba184f800 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:39:05 +0200 Subject: [PATCH 0361/1036] Fix missing label on project tooltip --- htdocs/comm/propal/list.php | 25 +++++++++++++------------ htdocs/commande/list.php | 17 ++++++++++------- htdocs/compta/facture/list.php | 5 ++--- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index f87a73b5288..1bb81c88ec4 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -265,13 +265,12 @@ $sql.= " ava.rowid as availability,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' p.rowid, p.entity, p.note_private, p.total_ht, p.tva as total_vat, p.total as total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,p.date_livraison as ddelivery,'; $sql.= ' p.datec as date_creation, p.tms as date_update,'; -$sql.= " pr.rowid as project_id, pr.ref as project_ref,"; -if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; +$sql.= " pr.rowid as project_id, pr.ref as project_ref, p.title as project_label,"; $sql.= ' u.login'; +if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user,"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; - // Add fields from extrafields -foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +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 @@ -760,6 +759,12 @@ if ($resql) $objectstatic->id=$obj->rowid; $objectstatic->ref=$obj->ref; + $companystatic->id=$obj->socid; + $companystatic->name=$obj->name; + $companystatic->client=$obj->client; + $companystatic->code_client=$obj->code_client; + $companystatic->email=$obj->email; + print ''; if (! empty($arrayfields['p.ref']['checked'])) @@ -812,20 +817,16 @@ if ($resql) { // Project ref print ''; - if ($obj->project_id) { - $projectstatic->fetch($obj->project_id); + if ($obj->project_id > 0) { + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; print $projectstatic->getNomUrl(1); } print ''; if (! $i) $totalarray['nbfield']++; } - $companystatic->id=$obj->socid; - $companystatic->name=$obj->name; - $companystatic->client=$obj->client; - $companystatic->code_client=$obj->code_client; - $companystatic->email=$obj->email; - // Thirdparty if (! empty($arrayfields['s.nom']['checked'])) { diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 91aee2e6bdc..06175069f37 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -243,11 +243,10 @@ $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' c.rowid, c.ref, c.total_ht, c.tva as total_tva, c.total_ttc, c.ref_client,'; $sql.= ' c.date_valid, c.date_commande, c.note_private, c.date_livraison as date_delivery, c.fk_statut, c.facture as billed,'; $sql.= ' c.date_creation as date_creation, c.tms as date_update,'; -$sql.= " p.rowid as project_id, p.ref as project_ref"; +$sql.= " p.rowid as project_id, p.ref as project_ref, p.title as project_label"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; - // Add fields from extrafields -foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +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 @@ -957,10 +956,14 @@ if ($resql) // Project if (! empty($arrayfields['p.project_ref']['checked'])) { - $projectstatic->id=$obj->project_id; - $projectstatic->ref=$obj->project_ref; - print ''; - if ($obj->project_id > 0) print $projectstatic->getNomUrl(1); + print ''; + if ($obj->project_id > 0) + { + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; + print $projectstatic->getNomUrl(1); + } print ''; if (! $i) $totalarray['nbfield']++; } diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index e24c0dc23d4..d5acdbfb30c 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -370,9 +370,8 @@ $sql.= " p.rowid as project_id, p.ref as project_ref, p.title as project_label"; // TODO Better solution to be able to sort on already payed or remain to pay is to store amount_payed in a denormalized field. if (! $sall) $sql.= ', SUM(pf.amount) as dynamount_payed'; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; - // Add fields from extrafields -foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +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 @@ -1022,7 +1021,7 @@ if ($resql) // Project if (! empty($arrayfields['p.ref']['checked'])) { - print ''; + print ''; if ($obj->project_id > 0) { $projectstatic->id=$obj->project_id; From 14b11b3cc5578233c81576a0f3955ef1a2489643 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:43:01 +0200 Subject: [PATCH 0362/1036] Prepare 9.0.4 --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 3ad0cfa96e4..3804dad9a86 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION','9.0.3'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION','9.0.4'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO',chr(128)); From 22c548e80b2d350c963e4f2d36a3cb974129e558 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 14:46:43 +0200 Subject: [PATCH 0363/1036] Fix sql --- htdocs/comm/propal/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 1bb81c88ec4..893a3935cba 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -265,7 +265,7 @@ $sql.= " ava.rowid as availability,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' p.rowid, p.entity, p.note_private, p.total_ht, p.tva as total_vat, p.total as total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,p.date_livraison as ddelivery,'; $sql.= ' p.datec as date_creation, p.tms as date_update,'; -$sql.= " pr.rowid as project_id, pr.ref as project_ref, p.title as project_label,"; +$sql.= " pr.rowid as project_id, pr.ref as project_ref, pr.title as project_label,"; $sql.= ' u.login'; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user,"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; From 9de0e694569d82c2b5110c36917d3ae49c37e887 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 15:11:06 +0200 Subject: [PATCH 0364/1036] FIX column project into list --- htdocs/comm/propal/list.php | 85 +++++++++++++++++++++------------- htdocs/commande/list.php | 75 +++++++++++++++++++----------- htdocs/compta/facture/list.php | 49 +++++++++++++++----- 3 files changed, 140 insertions(+), 69 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index e59700b78e0..19fe59062dd 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -62,6 +62,7 @@ $search_ref=GETPOST('sf_ref')?GETPOST('sf_ref', 'alpha'):GETPOST('search_ref', ' $search_refcustomer=GETPOST('search_refcustomer', 'alpha'); $search_refproject=GETPOST('search_refproject', 'alpha'); +$search_project=GETPOST('search_project', 'alpha'); $search_societe=GETPOST('search_societe', 'alpha'); $search_montant_ht=GETPOST('search_montant_ht', 'alpha'); @@ -144,27 +145,28 @@ if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; $checkedtypetiers=0; $arrayfields=array( - 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), - 'p.ref_client'=>array('label'=>$langs->trans("RefCustomer"), 'checked'=>1), - 'pr.ref'=>array('label'=>$langs->trans("ProjectRef"), 'checked'=>1, 'enabled'=>(empty($conf->projet->enabled)?0:1)), - 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), - 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1), - 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1), - 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0), - 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0), - 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers), - 'p.date'=>array('label'=>$langs->trans("Date"), 'checked'=>1), - 'p.fin_validite'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1), - 'p.date_livraison'=>array('label'=>$langs->trans("DeliveryDate"), 'checked'=>0), - 'ava.rowid'=>array('label'=>$langs->trans("AvailabilityPeriod"), 'checked'=>0), - 'p.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1), - 'p.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0), - 'p.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), - 'u.login'=>array('label'=>$langs->trans("Author"), 'checked'=>1, 'position'=>10), - 'sale_representative'=>array('label'=>$langs->trans("SaleRepresentativesOfThirdParty"), 'checked'=>1), - 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), - 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), - 'p.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), + 'p.ref'=>array('label'=>"Ref", 'checked'=>1), + 'p.ref_client'=>array('label'=>"RefCustomer", 'checked'=>1), + 'pr.ref'=>array('label'=>"ProjectRef", 'checked'=>1, 'enabled'=>(empty($conf->projet->enabled)?0:1)), + 'pr.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(empty($conf->projet->enabled)?0:1)), + 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1), + 's.town'=>array('label'=>"Town", 'checked'=>1), + 's.zip'=>array('label'=>"Zip", 'checked'=>1), + 'state.nom'=>array('label'=>"StateShort", 'checked'=>0), + 'country.code_iso'=>array('label'=>"Country", 'checked'=>0), + 'typent.code'=>array('label'=>"ThirdPartyType", 'checked'=>$checkedtypetiers), + 'p.date'=>array('label'=>"Date", 'checked'=>1), + 'p.fin_validite'=>array('label'=>"DateEnd", 'checked'=>1), + 'p.date_livraison'=>array('label'=>"DeliveryDate", 'checked'=>0), + 'ava.rowid'=>array('label'=>"AvailabilityPeriod", 'checked'=>0), + 'p.total_ht'=>array('label'=>"AmountHT", 'checked'=>1), + 'p.total_vat'=>array('label'=>"AmountVAT", 'checked'=>0), + 'p.total_ttc'=>array('label'=>"AmountTTC", 'checked'=>0), + 'u.login'=>array('label'=>"Author", 'checked'=>1, 'position'=>10), + 'sale_representative'=>array('label'=>"SaleRepresentativesOfThirdParty", 'checked'=>1), + 'p.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), + 'p.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500), + 'p.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000), ); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) @@ -197,6 +199,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_ref=''; $search_refcustomer=''; $search_refproject=''; + $search_project=''; $search_societe=''; $search_montant_ht=''; $search_montant_vat=''; @@ -265,7 +268,7 @@ $sql.= " ava.rowid as availability,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' p.rowid, p.entity, p.note_private, p.total_ht, p.tva as total_vat, p.total as total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,p.date_livraison as ddelivery,'; $sql.= ' p.datec as date_creation, p.tms as date_update,'; -$sql.= " pr.rowid as project_id, pr.ref as project_ref, p.title as project_label,"; +$sql.= " pr.rowid as project_id, pr.ref as project_ref, pr.title as project_label,"; $sql.= ' u.login'; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user,"; if ($search_categ_cus) $sql .= ", cc.fk_categorie, cc.fk_soc"; @@ -309,6 +312,7 @@ if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$db->escape($search if ($search_ref) $sql .= natural_search('p.ref', $search_ref); if ($search_refcustomer) $sql .= natural_search('p.ref_client', $search_refcustomer); if ($search_refproject) $sql .= natural_search('pr.ref', $search_refproject); +if ($search_project) $sql .= natural_search('pr.title', $search_project); if ($search_availability) $sql .= " AND p.fk_availability IN (".$db->escape($search_availability).')'; if ($search_societe) $sql .= natural_search('s.nom', $search_societe); @@ -536,19 +540,25 @@ if ($resql) { print ''; print ''; - print ''; + print ''; } if (! empty($arrayfields['pr.ref']['checked'])) { print ''; print ''; - print ''; + print ''; + } + if (! empty($arrayfields['pr.title']['checked'])) + { + print ''; + print ''; + print ''; } if (! empty($arrayfields['s.nom']['checked'])) { print ''; print ''; - print ''; + print ''; } if (! empty($arrayfields['s.town']['checked'])) print ''; if (! empty($arrayfields['s.zip']['checked'])) print ''; @@ -686,7 +696,8 @@ if ($resql) print ''; if (! empty($arrayfields['p.ref']['checked'])) print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], 'p.ref', '', $param, '', $sortfield, $sortorder); if (! empty($arrayfields['p.ref_client']['checked'])) print_liste_field_titre($arrayfields['p.ref_client']['label'], $_SERVER["PHP_SELF"], 'p.ref_client', '', $param, '', $sortfield, $sortorder); - if (! empty($arrayfields['pr.ref']['checked'])) print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); + if (! empty($arrayfields['pr.ref']['checked'])) print_liste_field_titre($arrayfields['pr.ref']['label'], $_SERVER["PHP_SELF"], 'pr.ref', '', $param, '', $sortfield, $sortorder); + if (! empty($arrayfields['pr.title']['checked'])) print_liste_field_titre($arrayfields['pr.title']['label'], $_SERVER["PHP_SELF"], 'pr.title', '', $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.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); @@ -730,6 +741,10 @@ if ($resql) $companystatic->code_client=$obj->code_client; $companystatic->email=$obj->email; + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; + print ''; if (! empty($arrayfields['p.ref']['checked'])) @@ -772,7 +787,7 @@ if ($resql) if (! empty($arrayfields['p.ref_client']['checked'])) { // Customer ref - print ''; + print ''; print $obj->ref_client; print ''; if (! $i) $totalarray['nbfield']++; @@ -781,17 +796,25 @@ if ($resql) if (! empty($arrayfields['pr.ref']['checked'])) { // Project ref - print ''; + print ''; if ($obj->project_id > 0) { - $projectstatic->id=$obj->project_id; - $projectstatic->ref=$obj->project_ref; - $projectstatic->title=$obj->project_label; print $projectstatic->getNomUrl(1); } print ''; if (! $i) $totalarray['nbfield']++; } + if (! empty($arrayfields['pr.title']['checked'])) + { + // Project ref + print ''; + if ($obj->project_id > 0) { + print $projectstatic->title; + } + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Thirdparty if (! empty($arrayfields['s.nom']['checked'])) { diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index d991fb1cc97..4ff7fe364bd 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -84,6 +84,7 @@ $viewstatut=GETPOST('viewstatut'); $search_btn=GETPOST('button_search', 'alpha'); $search_remove_btn=GETPOST('button_removefilter', 'alpha'); $search_project_ref=GETPOST('search_project_ref', 'alpha'); +$search_project=GETPOST('search_project', 'alpha'); // Security check $id = (GETPOST('orderid')?GETPOST('orderid', 'int'):GETPOST('id', 'int')); @@ -125,24 +126,25 @@ if (empty($user->socid)) $fieldstosearchall["c.note_private"]="NotePrivate"; $checkedtypetiers=0; $arrayfields=array( - 'c.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), - 'c.ref_client'=>array('label'=>$langs->trans("RefCustomerOrder"), 'checked'=>1), - 'p.project_ref'=>array('label'=>$langs->trans("ProjectRef"), 'checked'=>0, 'enabled'=>1), - 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), - 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1), - 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1), - 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0), - 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0), - 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers), - 'c.date_commande'=>array('label'=>$langs->trans("OrderDateShort"), 'checked'=>1), - 'c.date_delivery'=>array('label'=>$langs->trans("DateDeliveryPlanned"), 'checked'=>1, 'enabled'=>empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)), - 'c.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1), - 'c.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0), - 'c.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), - 'c.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), - 'c.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), - 'c.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), - 'c.facture'=>array('label'=>$langs->trans("Billed"), 'checked'=>1, 'position'=>1000, 'enabled'=>(empty($conf->global->WORKFLOW_BILL_ON_SHIPMENT))) + 'c.ref'=>array('label'=>"Ref", 'checked'=>1), + 'c.ref_client'=>array('label'=>"RefCustomerOrder", 'checked'=>1), + 'p.ref'=>array('label'=>"ProjectRef", 'checked'=>1, 'enabled'=>(empty($conf->projet->enabled)?0:1)), + 'p.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(empty($conf->projet->enabled)?0:1)), + 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1), + 's.town'=>array('label'=>"Town", 'checked'=>1), + 's.zip'=>array('label'=>"Zip", 'checked'=>1), + 'state.nom'=>array('label'=>"StateShort", 'checked'=>0), + 'country.code_iso'=>array('label'=>"Country", 'checked'=>0), + 'typent.code'=>array('label'=>"ThirdPartyType", 'checked'=>$checkedtypetiers), + 'c.date_commande'=>array('label'=>"OrderDateShort", 'checked'=>1), + 'c.date_delivery'=>array('label'=>"DateDeliveryPlanned", 'checked'=>1, 'enabled'=>empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)), + 'c.total_ht'=>array('label'=>"AmountHT", 'checked'=>1), + 'c.total_vat'=>array('label'=>"AmountVAT", 'checked'=>0), + 'c.total_ttc'=>array('label'=>"AmountTTC", 'checked'=>0), + 'c.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), + 'c.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500), + 'c.fk_statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000), + 'c.facture'=>array('label'=>"Billed", 'checked'=>1, 'position'=>1000, 'enabled'=>(empty($conf->global->WORKFLOW_BILL_ON_SHIPMENT))) ); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) @@ -197,6 +199,7 @@ if (empty($reshook)) $search_deliverymonth=''; $search_deliveryyear=''; $search_project_ref=''; + $search_project=''; $viewstatut=''; $billed=''; $toselect=''; @@ -315,6 +318,7 @@ if ($search_user > 0) $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.elemen if ($search_total_ht != '') $sql.= natural_search('c.total_ht', $search_total_ht, 1); if ($search_total_ttc != '') $sql.= natural_search('c.total_ttc', $search_total_ttc, 1); if ($search_project_ref != '') $sql.= natural_search("p.ref", $search_project_ref); +if ($search_project != '') $sql.= natural_search("p.title", $search_project); if ($search_categ_cus > 0) $sql.= " AND cc.fk_categorie = ".$db->escape($search_categ_cus); if ($search_categ_cus == -2) $sql.= " AND cc.fk_categorie IS NULL"; // Add where from extra fields @@ -595,10 +599,15 @@ if ($resql) print ''; } // Project ref - if (! empty($arrayfields['p.project_ref']['checked'])) + if (! empty($arrayfields['p.ref']['checked'])) { print ''; } + // Project title + if (! empty($arrayfields['p.title']['checked'])) + { + print ''; + } // Thirpdarty if (! empty($arrayfields['s.nom']['checked'])) { @@ -721,7 +730,8 @@ if ($resql) print ''; if (! empty($arrayfields['c.ref']['checked'])) print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], 'c.ref', '', $param, '', $sortfield, $sortorder); if (! empty($arrayfields['c.ref_client']['checked'])) print_liste_field_titre($arrayfields['c.ref_client']['label'], $_SERVER["PHP_SELF"], 'c.ref_client', '', $param, '', $sortfield, $sortorder); - if (! empty($arrayfields['p.project_ref']['checked'])) print_liste_field_titre($arrayfields['p.project_ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder); + if (! empty($arrayfields['p.ref']['checked'])) print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder); + if (! empty($arrayfields['p.title']['checked'])) print_liste_field_titre($arrayfields['p.title']['label'], $_SERVER["PHP_SELF"], "p.title", "", $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.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); @@ -781,6 +791,10 @@ if ($resql) $generic_commande->total_tva = $obj->total_tva; $generic_commande->total_ttc = $obj->total_ttc; + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; + print ''; // Ref @@ -932,21 +946,30 @@ if ($resql) if (! $i) $totalarray['nbfield']++; } - // Project - if (! empty($arrayfields['p.project_ref']['checked'])) + // Project ref + if (! empty($arrayfields['p.ref']['checked'])) { - print ''; + print ''; if ($obj->project_id > 0) { - $projectstatic->id=$obj->project_id; - $projectstatic->ref=$obj->project_ref; - $projectstatic->title=$obj->project_label; print $projectstatic->getNomUrl(1); } print ''; if (! $i) $totalarray['nbfield']++; } + // Project label + if (! empty($arrayfields['p.title']['checked'])) + { + print ''; + if ($obj->project_id > 0) + { + print $projectstatic->title; + } + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Third party if (! empty($arrayfields['s.nom']['checked'])) { diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 7961ca58730..fe669a73312 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -78,6 +78,7 @@ $search_product_category=GETPOST('search_product_category', 'int'); $search_ref=GETPOST('sf_ref')?GETPOST('sf_ref', 'alpha'):GETPOST('search_ref', 'alpha'); $search_refcustomer=GETPOST('search_refcustomer', 'alpha'); $search_type=GETPOST('search_type', 'int'); +$search_project_ref=GETPOST('search_project_ref', 'alpha'); $search_project=GETPOST('search_project', 'alpha'); $search_societe=GETPOST('search_societe', 'alpha'); $search_montant_ht=GETPOST('search_montant_ht', 'alpha'); @@ -160,8 +161,9 @@ $arrayfields=array( 'f.type'=>array('label'=>"Type", 'checked'=>0), 'f.date'=>array('label'=>"DateInvoice", 'checked'=>1), 'f.date_lim_reglement'=>array('label'=>"DateDue", 'checked'=>1), - 'p.ref'=>array('label'=>"ProjectRef", 'checked'=>0, 'enabled'=>(empty($conf->projet->enabled)?0:1)), - 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1), + 'p.ref'=>array('label'=>"ProjectRef", 'checked'=>1, 'enabled'=>(empty($conf->projet->enabled)?0:1)), + 'p.title'=>array('label'=>"ProjectLabel", 'checked'=>0, 'enabled'=>(empty($conf->projet->enabled)?0:1)), + 's.nom'=>array('label'=>"ThirdParty", 'checked'=>1), 's.town'=>array('label'=>"Town", 'checked'=>1), 's.zip'=>array('label'=>"Zip", 'checked'=>1), 'state.nom'=>array('label'=>"StateShort", 'checked'=>0), @@ -212,6 +214,7 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter', $search_ref=''; $search_refcustomer=''; $search_type=''; + $search_project_ref=''; $search_project=''; $search_societe=''; $search_montant_ht=''; @@ -426,7 +429,8 @@ if ($filtre) if ($search_ref) $sql .= natural_search('f.ref', $search_ref); if ($search_refcustomer) $sql .= natural_search('f.ref_client', $search_refcustomer); if ($search_type != '' && $search_type != '-1') $sql.=" AND f.type IN (".$db->escape($search_type).")"; -if ($search_project) $sql .= natural_search('p.ref', $search_project); +if ($search_project_ref) $sql .= natural_search('p.ref', $search_project_ref); +if ($search_project) $sql .= natural_search('p.title', $search_project); if ($search_societe) $sql .= natural_search('s.nom', $search_societe); if ($search_town) $sql.= natural_search('s.town', $search_town); if ($search_zip) $sql.= natural_search("s.zip", $search_zip); @@ -452,7 +456,7 @@ if ($search_status != '-1' && $search_status != '') } else { - $sql.= " AND f.fk_statut IN (".$search_status.")"; // When search_status is '1,2' for example + $sql.= " AND f.fk_statut IN (".$db->escape($search_status).")"; // When search_status is '1,2' for example } } if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$db->escape($search_paymentmode); @@ -460,7 +464,7 @@ if ($search_paymentterms > 0) $sql .= " AND f.fk_cond_reglement = ".$db->escape( $sql.= dolSqlDateFilter("f.datef", $search_day, $search_month, $search_year); $sql.= dolSqlDateFilter("f.date_lim_reglement", $search_day_lim, $search_month_lim, $search_year_lim); if ($option == 'late') $sql.=" AND f.date_lim_reglement < '".$db->idate(dol_now() - $conf->facture->client->warning_delay)."'"; -if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; +if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .(int) $search_sale; if ($search_user > 0) { $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='facture' AND tc.source='internal' AND ec.element_id = f.rowid AND ec.fk_socpeople = ".$search_user; @@ -554,6 +558,8 @@ if ($resql) if ($search_year_lim) $param.='&search_year_lim=' .urlencode($search_year_lim); if ($search_ref) $param.='&search_ref=' .urlencode($search_ref); if ($search_refcustomer) $param.='&search_refcustomer=' .urlencode($search_refcustomer); + if ($search_project_ref) $param.='&search_project_ref='.urlencode($search_project_ref); + if ($search_project) $param.='&search_project='.urlencode($search_project); if ($search_type != '') $param.='&search_type='.urlencode($search_type); if ($search_societe) $param.='&search_societe=' .urlencode($search_societe); if ($search_town) $param.='&search_town='.urlencode($search_town); @@ -741,10 +747,15 @@ if ($resql) print '
'.$langs->trans("Alert"); print ''; } - // Project + // Project ref if (! empty($arrayfields['p.ref']['checked'])) { - print ''; + print ''; + } + // Project label + if (! empty($arrayfields['p.title']['checked'])) + { + print ''; } // Thirpdarty if (! empty($arrayfields['s.nom']['checked'])) @@ -876,6 +887,7 @@ if ($resql) if (! empty($arrayfields['f.date']['checked'])) print_liste_field_titre($arrayfields['f.date']['label'], $_SERVER['PHP_SELF'], 'f.datef', '', $param, 'align="center"', $sortfield, $sortorder); if (! empty($arrayfields['f.date_lim_reglement']['checked'])) print_liste_field_titre($arrayfields['f.date_lim_reglement']['label'], $_SERVER['PHP_SELF'], "f.date_lim_reglement", '', $param, 'align="center"', $sortfield, $sortorder); if (! empty($arrayfields['p.ref']['checked'])) print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER['PHP_SELF'], "p.ref", '', $param, '', $sortfield, $sortorder); + if (! empty($arrayfields['p.title']['checked'])) print_liste_field_titre($arrayfields['p.title']['label'], $_SERVER['PHP_SELF'], "p.title", '', $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.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); @@ -941,6 +953,10 @@ if ($resql) $thirdpartystatic->email=$obj->email; $thirdpartystatic->country_code=$obj->country_code; + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + $projectstatic->title=$obj->project_label; + $paiement = $facturestatic->getSommePaiement(); $totalcreditnotes = $facturestatic->getSumCreditNotesUsed(); $totaldeposits = $facturestatic->getSumDepositsUsed(); @@ -1026,21 +1042,30 @@ if ($resql) if (! $i) $totalarray['nbfield']++; } - // Project + // Project ref if (! empty($arrayfields['p.ref']['checked'])) { - print ''; + print ''; if ($obj->project_id > 0) { - $projectstatic->id=$obj->project_id; - $projectstatic->ref=$obj->project_ref; - $projectstatic->title=$obj->project_label; print $projectstatic->getNomUrl(1); } print ''; if (! $i) $totalarray['nbfield']++; } + // Project title + if (! empty($arrayfields['p.title']['checked'])) + { + print ''; + if ($obj->project_id > 0) + { + print $projectstatic->title; + } + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Third party if (! empty($arrayfields['s.nom']['checked'])) { From 97de84d1e78ac6abcd35a1478c797e2f320d6d11 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 15:48:48 +0200 Subject: [PATCH 0365/1036] FIX wrong permissions in products/services menu --- htdocs/core/menus/standard/eldy.lib.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index e9876271dc3..ee9ef7d71ed 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -142,12 +142,8 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout = // Products-Services $tmpentry = array( - 'enabled'=> (( ! empty($conf->societe->enabled) && - ( empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) ) - ) - || ! empty($conf->fournisseur->enabled) - ), - 'perms'=> (! empty($user->rights->societe->lire) || ! empty($user->rights->fournisseur->lire)), + 'enabled'=> (! empty($conf->product->enabled) || ! empty($conf->service->enabled)), + 'perms'=> (! empty($user->rights->produit->lire)), 'module'=>'product|service' ); $menu_arr[] = array( From f296093f8dadacc6f2182e872b271a9c6fe1cf9f Mon Sep 17 00:00:00 2001 From: John BOTELLA Date: Fri, 10 May 2019 15:52:46 +0200 Subject: [PATCH 0366/1036] fix travis --- htdocs/accountancy/bookkeeping/list.php | 4 ++-- htdocs/compta/bank/bankentries_list.php | 6 +++--- htdocs/compta/localtax/list.php | 2 +- htdocs/compta/tva/list.php | 2 +- htdocs/contact/agenda.php | 2 +- htdocs/expedition/list.php | 2 +- htdocs/expensereport/list.php | 2 +- htdocs/exports/index.php | 2 +- htdocs/holiday/list.php | 2 +- htdocs/opensurvey/list.php | 2 +- htdocs/product/list.php | 2 +- htdocs/resource/list.php | 2 +- htdocs/supplier_proposal/list.php | 2 +- htdocs/variants/list.php | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 94afb5d9fbb..bafce35142f 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -449,9 +449,9 @@ else $buttonLabel = $langs->trans("ExportList"); $newcardbutton = dolGetButtonTitle($buttonLabel ,'', 'fa fa-file-export', $_SERVER["PHP_SELF"].'?action=export_file'.($param?'&'.$param:'')); -$newcardbutton.= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'),'', 'fa fa-object-group', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param); +$newcardbutton.= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-object-group', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param); -$newcardbutton.= dolGetButtonTitle($langs->trans('NewAccountingMvt'),'', 'fa fa-plus-circle', './card.php?action=create'); +$newcardbutton.= dolGetButtonTitle($langs->trans('NewAccountingMvt'), '', 'fa fa-plus-circle', './card.php?action=create'); print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $result, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit); diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index e8b4e45d606..68c0ada46df 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -756,16 +756,16 @@ if ($resql) { if (empty($conf->global->BANK_USE_OLD_VARIOUS_PAYMENT)) // If direct entries is done using miscellaneous payments { - $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/compta/bank/various_payment/card.php?action=create&accountid='.$search_account.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.urlencode($search_account)), '', $user->rights->banque->modifier); + $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/bank/various_payment/card.php?action=create&accountid='.$search_account.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.urlencode($search_account)), '', $user->rights->banque->modifier); } else // If direct entries is not done using miscellaneous payments { - $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle',$_SERVER["PHP_SELF"].'?action=addline&page='.$page.$param, '', $user->rights->banque->modifier); + $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?action=addline&page='.$page.$param, '', $user->rights->banque->modifier); } } else { - $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle',$_SERVER["PHP_SELF"].'?action=addline&page='.$page.$param, '', -1); + $newcardbutton = dolGetButtonTitle($langs->trans('AddBankRecord'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?action=addline&page='.$page.$param, '', -1); } } diff --git a/htdocs/compta/localtax/list.php b/htdocs/compta/localtax/list.php index 4943081b0c6..b7f9c307f14 100644 --- a/htdocs/compta/localtax/list.php +++ b/htdocs/compta/localtax/list.php @@ -45,7 +45,7 @@ $localtax_static = new Localtax($db); $newcardbutton=''; if ($user->rights->tax->charges->creer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('NewLocalTaxPayment', ($ltt+1)), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/compta/localtax/card.php?action=create&localTaxType='.$ltt); + $newcardbutton.= dolGetButtonTitle($langs->trans('NewLocalTaxPayment', ($ltt+1)), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/localtax/card.php?action=create&localTaxType='.$ltt); } print load_fiche_titre($langs->transcountry($ltt==2?"LT2Payments":"LT1Payments", $mysoc->country_code), $newcardbutton); diff --git a/htdocs/compta/tva/list.php b/htdocs/compta/tva/list.php index e370f2e7d6d..1d6b08735a0 100644 --- a/htdocs/compta/tva/list.php +++ b/htdocs/compta/tva/list.php @@ -150,7 +150,7 @@ if ($result) $newcardbutton=''; if ($user->rights->tax->charges->creer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('NewVATPayment', ($ltt+1)), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/compta/tva/card.php?action=create'); + $newcardbutton.= dolGetButtonTitle($langs->trans('NewVATPayment', ($ltt+1)), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/compta/tva/card.php?action=create'); } print '
'; diff --git a/htdocs/contact/agenda.php b/htdocs/contact/agenda.php index 6a2593b57a6..6e093a934dd 100644 --- a/htdocs/contact/agenda.php +++ b/htdocs/contact/agenda.php @@ -261,7 +261,7 @@ else { if (! empty($user->rights->agenda->myactions->create) || ! empty($user->rights->agenda->allactions->create)) { - $newcardbutton.= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); + $newcardbutton.= dolGetButtonTitle($langs->trans('AddAction'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/comm/action/card.php?action=create'.$out); } } diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index 43e28456c62..f5c111f2268 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -280,7 +280,7 @@ if ($resql) $newcardbutton=''; if ($user->rights->expedition->creer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/expedition/card.php?action=create2'); + $newcardbutton.= dolGetButtonTitle($langs->trans('NewSending'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/expedition/card.php?action=create2'); } $i = 0; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index aadfa5b55f9..bf819429348 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -455,7 +455,7 @@ if ($resql) $newcardbutton=''; if ($user->rights->expensereport->creer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('NewTrip'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/expensereport/card.php?action=create'); + $newcardbutton.= dolGetButtonTitle($langs->trans('NewTrip'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/expensereport/card.php?action=create'); } print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic.png', 0, $newcardbutton, '', $limit); diff --git a/htdocs/exports/index.php b/htdocs/exports/index.php index be0853587ce..755c9bc4773 100644 --- a/htdocs/exports/index.php +++ b/htdocs/exports/index.php @@ -50,7 +50,7 @@ print '
'; print '
'; if (count($export->array_export_code)) { - print dolGetButtonTitle($langs->trans('NewExport'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/exports/export.php?leftmenu=export', '',$user->rights->export->creer); + print dolGetButtonTitle($langs->trans('NewExport'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/exports/export.php?leftmenu=export', '', $user->rights->export->creer); } print '
'; print '
'; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index c432a929d5d..a93be6e096d 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -340,7 +340,7 @@ else $newcardbutton=''; if ($user->rights->holiday->write) { - $newcardbutton.= dolGetButtonTitle($langs->trans('MenuAddCP'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/holiday/card.php?action=request'); + $newcardbutton.= dolGetButtonTitle($langs->trans('MenuAddCP'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/holiday/card.php?action=request'); } print_barre_liste($langs->trans("ListeCP"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_hrm.png', 0, $newcardbutton, '', $limit); diff --git a/htdocs/opensurvey/list.php b/htdocs/opensurvey/list.php index 800b6827f56..025f7099577 100644 --- a/htdocs/opensurvey/list.php +++ b/htdocs/opensurvey/list.php @@ -243,7 +243,7 @@ print ''; print ''; $newcardbutton=''; -$newcardbutton.= dolGetButtonTitle($langs->trans('NewSurvey'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/opensurvey/wizard/index.php','',$user->rights->opensurvey->write); +$newcardbutton.= dolGetButtonTitle($langs->trans('NewSurvey'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/opensurvey/wizard/index.php', '', $user->rights->opensurvey->write); print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic.png', 0, $newcardbutton, '', $limit); diff --git a/htdocs/product/list.php b/htdocs/product/list.php index e96c263497b..a2eea46406d 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -439,7 +439,7 @@ if ($resql) { $label='NewProduct'; if($type == Product::TYPE_SERVICE) $label='NewService'; - $newcardbutton.= dolGetButtonTitle($langs->trans($label), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/product/card.php?action=create&type='.$type); + $newcardbutton.= dolGetButtonTitle($langs->trans($label), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/product/card.php?action=create&type='.$type); } print ''; diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php index 8768c117792..3e613c3d99c 100644 --- a/htdocs/resource/list.php +++ b/htdocs/resource/list.php @@ -197,7 +197,7 @@ if($ret == -1) { $newcardbutton=''; if ($user->rights->resource->write) { - $newcardbutton.= dolGetButtonTitle($langs->trans('MenuResourceAdd'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/resource/card.php?action=create'); + $newcardbutton.= dolGetButtonTitle($langs->trans('MenuResourceAdd'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/resource/card.php?action=create'); } print_barre_liste($pagetitle, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $ret+1, $nbtotalofrecords, 'title_generic.png', 0, $newcardbutton, '', $limit); diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index 4017d84c54e..095235b9270 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -388,7 +388,7 @@ if ($resql) $newcardbutton=''; if($user->rights->supplier_proposal->creer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('NewAskPrice'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/supplier_proposal/card.php?action=create'); + $newcardbutton.= dolGetButtonTitle($langs->trans('NewAskPrice'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/supplier_proposal/card.php?action=create'); } // Lignes des champs de filtre diff --git a/htdocs/variants/list.php b/htdocs/variants/list.php index 75d9c3df44e..af9275de0ae 100644 --- a/htdocs/variants/list.php +++ b/htdocs/variants/list.php @@ -59,7 +59,7 @@ llxHeader('', $title); $newcardbutton=''; if ($user->rights->produit->creer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('Create'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/variants/create.php'); + $newcardbutton.= dolGetButtonTitle($langs->trans('Create'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/variants/create.php'); } print load_fiche_titre($title, $newcardbutton, 'title_products'); From 449117ba528aacf2d70030a6100ab2ad8571d7ae Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 15:53:49 +0200 Subject: [PATCH 0367/1036] FIX missing service --- htdocs/core/menus/standard/eldy.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index ee9ef7d71ed..9f81d343c8b 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -143,7 +143,7 @@ function print_eldy_menu($db, $atarget, $type_user, &$tabMenu, &$menu, $noout = // Products-Services $tmpentry = array( 'enabled'=> (! empty($conf->product->enabled) || ! empty($conf->service->enabled)), - 'perms'=> (! empty($user->rights->produit->lire)), + 'perms'=> (! empty($user->rights->produit->lire) || ! empty($user->rights->service->lire)), 'module'=>'product|service' ); $menu_arr[] = array( From 9a6029b1d9d14098b091b4567d4b56edfb95e75b Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 16:12:16 +0200 Subject: [PATCH 0368/1036] FIX disable phpcs --- htdocs/user/class/user.class.php | 4 ++-- htdocs/user/class/usergroup.class.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 97970dd6909..3409a9599d0 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2512,7 +2512,7 @@ class User extends CommonObject } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * @@ -2533,7 +2533,7 @@ class User extends CommonObject return $dn; } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Initialize the info array (array of LDAP values) that will be used to call LDAP functions * diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 2fd401a48e9..721ef661cc2 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -924,7 +924,7 @@ class UserGroup extends CommonObject return $result; } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * @@ -946,7 +946,7 @@ class UserGroup extends CommonObject } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Initialize the info array (array of LDAP values) that will be used to call LDAP functions * From 02b8e77df2107d510cfb6d5b81a4610b79114c1e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 16:14:05 +0200 Subject: [PATCH 0369/1036] Fix responsive --- htdocs/core/boxes/box_factures_fourn_imp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/boxes/box_factures_fourn_imp.php b/htdocs/core/boxes/box_factures_fourn_imp.php index 3c1b486b50d..09de3b874e3 100644 --- a/htdocs/core/boxes/box_factures_fourn_imp.php +++ b/htdocs/core/boxes/box_factures_fourn_imp.php @@ -138,7 +138,7 @@ class box_factures_fourn_imp extends ModeleBoxes $tooltip = $langs->trans('SupplierInvoice') . ': ' . ($objp->ref?$objp->ref:$objp->facid) . '
' . $langs->trans('RefSupplier') . ': ' . $objp->ref_supplier; $this->info_box_contents[$line][] = array( - 'td' => '', + 'td' => 'class="nowraponall"', 'text' => $facturestatic->getNomUrl(1), 'text2'=> $late, 'asis' => 1 From 95326c3d63883e829311108b7427d2373e260a67 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 16:27:38 +0200 Subject: [PATCH 0370/1036] Update list.php --- htdocs/product/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 03163989094..a85c4686ca9 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -330,7 +330,7 @@ $reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // No $sql.=$hookmanager->resPrint; $sql.= " GROUP BY p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type,"; $sql.= " p.fk_product_type, p.duration, p.weight, p.length, p.surface, p.volume, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,"; -$sql.= ' p.datec, p.tms, p.entity, p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.pmp'; +$sql.= ' p.datec, p.tms, p.entity, p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.pmp, p.stock'; if (!empty($conf->variants->enabled) && (!empty($conf->global->PRODUIT_ATTRIBUTES_HIDECHILD) && ! $show_childproducts )) { $sql .= ', pac.rowid'; From 10da976b93159db257164cff0e413f3a90a0ab87 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Fri, 10 May 2019 16:37:03 +0200 Subject: [PATCH 0371/1036] FIX try to fix phpcs error --- htdocs/user/class/user.class.php | 2 ++ htdocs/user/class/usergroup.class.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 3409a9599d0..13ae44463d6 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2513,6 +2513,7 @@ class User extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * @@ -2534,6 +2535,7 @@ class User extends CommonObject } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Initialize the info array (array of LDAP values) that will be used to call LDAP functions * diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 721ef661cc2..c3fe000292c 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -925,6 +925,7 @@ class UserGroup extends CommonObject } // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * @@ -947,6 +948,7 @@ class UserGroup extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Initialize the info array (array of LDAP values) that will be used to call LDAP functions * From 069df823805f8fec1a5519ea13ce37d82685b169 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 17:40:34 +0200 Subject: [PATCH 0372/1036] FIX javascript error when ckeditor module not enabled --- htdocs/core/class/doleditor.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php index 548721be05f..405aa04456a 100644 --- a/htdocs/core/class/doleditor.class.php +++ b/htdocs/core/class/doleditor.class.php @@ -177,7 +177,7 @@ class DolEditor $out.= $this->content; $out.= ''; - if ($this->tool == 'ckeditor' && ! empty($conf->use_javascript_ajax)) + if ($this->tool == 'ckeditor' && ! empty($conf->use_javascript_ajax) && ! empty($conf->fckeditor->enabled)) { if (! defined('REQUIRE_CKEDITOR')) define('REQUIRE_CKEDITOR','1'); From 0bd4c610095948dc2d9147ac0fa1685068288e0d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 18:15:09 +0200 Subject: [PATCH 0373/1036] Fix default setup of module workflow was not set --- htdocs/admin/workflow.php | 2 +- htdocs/core/modules/modWorkflow.class.php | 21 ++++++++++++++----- .../core/modules/modMyModule.class.php | 1 + 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/htdocs/admin/workflow.php b/htdocs/admin/workflow.php index 380f2cac9e3..53ebb5dd21d 100644 --- a/htdocs/admin/workflow.php +++ b/htdocs/admin/workflow.php @@ -87,7 +87,7 @@ $workflowcodes=array( // Automatic classification supplier order 'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER'=>array('family'=>'classify_supplier_order', 'position'=>62, 'enabled'=>'! empty($conf->fournisseur->enabled)', 'picto'=>'order','warning'=>''), //Automatic classification reception - 'WORKFLOW_BILL_ON_RECEPTION'=>array('family'=>'classify_reception', 'position'=>30, 'enabled'=>'! empty($conf->reception->enabled) && ! empty($conf->fournisseur->enabled)', 'picto'=>'bill'), + 'WORKFLOW_BILL_ON_RECEPTION'=>array('family'=>'classify_reception', 'position'=>64, 'enabled'=>'! empty($conf->reception->enabled) && ! empty($conf->fournisseur->enabled)', 'picto'=>'bill'), ); if (! empty($conf->modules_parts['workflow']) && is_array($conf->modules_parts['workflow'])) diff --git a/htdocs/core/modules/modWorkflow.class.php b/htdocs/core/modules/modWorkflow.class.php index 7d2e833a4fc..6c79265f382 100644 --- a/htdocs/core/modules/modWorkflow.class.php +++ b/htdocs/core/modules/modWorkflow.class.php @@ -68,7 +68,7 @@ class modWorkflow extends DolibarrModules $this->config_page_url = array('workflow.php'); // Dependencies - $this->hidden = false; // A condition to hide module + $this->hidden = false; // A condition to hide module $this->depends = array(); // 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 @@ -77,10 +77,21 @@ class modWorkflow extends DolibarrModules $this->langfiles = array("@workflow"); // Constants - // List of particular constants to add when module is enabled - //Example: $this->const=array(0=>array('MODULE_MY_NEW_CONST1','chaine','myvalue','This is a constant to add',0), - // 1=>array('MODULE_MY_NEW_CONST2','chaine','myvalue','This is another constant to add',0) ); - $this->const=array(); + // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) + // Example: $this->const=array(1 => array('MYMODULE_MYNEWCONST1', 'chaine', 'myvalue', 'This is a constant to add', 1), + // 2 => array('MYMODULE_MYNEWCONST2', 'chaine', 'myvalue', 'This is another constant to add', 0, 'current', 1) + // ); + $this->const=array( + //0=>array('WORKFLOW_PROPAL_AUTOCREATE_ORDER', 'chaine', '1', 'WORKFLOW_PROPAL_AUTOCREATE_ORDER', 0, 'current', 0), + //0=>array('WORKFLOW_ORDER_AUTOCREATE_INVOICE', 'chaine', '1', 'WORKFLOW_ORDER_AUTOCREATE_INVOICE', 0, 'current', 0), + 0=>array('WORKFLOW_ORDER_CLASSIFY_BILLED_PROPAL', 'chaine', '1', 'WORKFLOW_ORDER_CLASSIFY_BILLED_PROPAL', 0, 'current', 0), + 1=>array('WORKFLOW_INVOICE_CLASSIFY_BILLED_PROPAL', 'chaine', '1', 'WORKFLOW_INVOICE_CLASSIFY_BILLED_PROPAL', 0, 'current', 0), + 2=>array('WORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING', 'chaine', '1', 'WORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING', 0, 'current', 0), + 4=>array('WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER', 'chaine', '1', 'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER', 0, 'current', 0), + 5=>array('WORKFLOW_ORDER_CLASSIFY_BILLED_SUPPLIER_PROPOSAL', 'chaine', '1', 'WORKFLOW_ORDER_CLASSIFY_BILLED_SUPPLIER_PROPOSAL', 0, 'current', 0), + 6=>array('WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER', 'chaine', '1', 'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER', 0, 'current', 0), + 7=>array('WORKFLOW_BILL_ON_RECEPTION', 'chaine', '1', 'WORKFLOW_BILL_ON_RECEPTION', 0, 'current', 0) + ); // Boxes $this->boxes = array(); diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php index 9c04db22c12..046419e4987 100644 --- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php +++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php @@ -130,6 +130,7 @@ class modMyModule extends DolibarrModules $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'=>'MyModuleWasAutomaticallyActivatedBecauseOfYourCountryChoice'); //$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(1 => array('MYMODULE_MYNEWCONST1', 'chaine', 'myvalue', 'This is a constant to add', 1), From 1206e465d90d13a4fcad4129d6a441ca9ba52099 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 18:19:10 +0200 Subject: [PATCH 0374/1036] Fix function name --- htdocs/admin/workflow.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/workflow.php b/htdocs/admin/workflow.php index 53ebb5dd21d..b1e8c310ed0 100644 --- a/htdocs/admin/workflow.php +++ b/htdocs/admin/workflow.php @@ -34,9 +34,11 @@ if (! $user->admin) accessforbidden(); $action = GETPOST('action', 'alpha'); + /* * Actions */ + if (preg_match('/set(.*)/', $action, $reg)) { if (! dolibarr_set_const($db, $reg[1], '1', 'chaine', 0, '', $conf->entity) > 0) @@ -47,7 +49,7 @@ if (preg_match('/set(.*)/', $action, $reg)) if (preg_match('/del(.*)/', $action, $reg)) { - if (! dolibarr_del_const($db, $reg[1], $conf->entity) > 0) + if (! dolibarr_set_const($db, $reg[1], '0', 'chaine', 0, '', $conf->entity) > 0) { dol_print_error($db); } From 3def11d5c91e4487e2ef86e857d0bd1cefc4ccd2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 19:32:46 +0200 Subject: [PATCH 0375/1036] Standardize translation --- htdocs/comm/propal/list.php | 4 ++-- htdocs/commande/list.php | 5 ++--- htdocs/contrat/list.php | 4 ++-- htdocs/expensereport/list.php | 4 ++-- htdocs/fichinter/list.php | 4 ++-- htdocs/fourn/commande/list.php | 4 ++-- htdocs/fourn/facture/list.php | 4 ++-- htdocs/fourn/product/list.php | 4 ++-- .../modulebuilder/template/myobject_list.php | 6 ++++-- htdocs/product/list.php | 6 +++--- htdocs/projet/list.php | 6 +++--- htdocs/supplier_proposal/list.php | 4 ++-- htdocs/user/perms.php | 20 ++++++++----------- 13 files changed, 36 insertions(+), 39 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index e996bf29907..b02f788f040 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -429,9 +429,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - 'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + 'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->propal->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if ($user->rights->propal->cloturer) $arrayofmassactions['closed']=$langs->trans("Close"); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 4ff7fe364bd..ad3fd777a5c 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -430,11 +430,10 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - 'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), 'cancelorders'=>$langs->trans("Cancel"), - + 'presend'=>$langs->trans("SendByMail"), ); if($user->rights->facture->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); if ($user->rights->commande->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 410973bb5b7..935c990e1bf 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -365,9 +365,9 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - 'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + 'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->contrat->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 465b054569b..7dd91443417 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -340,9 +340,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - 'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + 'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->expensereport->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 10eace0fe57..b893f6e6511 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -305,9 +305,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - //'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + //'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->ficheinter->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index a9a2963c78d..e4b71768456 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -620,9 +620,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - 'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + 'presend'=>$langs->trans("SendByMail"), ); //if($user->rights->fournisseur->facture->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); if ($user->rights->fournisseur->commande->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 608759e1531..2415167f8ae 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -454,9 +454,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( 'validate'=>$langs->trans("Validate"), - 'generate_doc'=>$langs->trans("Generate"), - //'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), //'builddoc'=>$langs->trans("PDFMerge"), + //'presend'=>$langs->trans("SendByMail"), ); //if($user->rights->fournisseur->facture->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); if ($user->rights->fournisseur->facture->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); diff --git a/htdocs/fourn/product/list.php b/htdocs/fourn/product/list.php index 2aafa512aff..218379ce7b8 100644 --- a/htdocs/fourn/product/list.php +++ b/htdocs/fourn/product/list.php @@ -117,9 +117,9 @@ if ($fourn_id) $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - 'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + 'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->mymodule->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index 4d6e1387ed7..e8efedcf075 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -335,8 +335,10 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( - //'presend'=>$langs->trans("SendByMail"), - //'builddoc'=>$langs->trans("PDFMerge"), + //'validate'=>$langs->trans("Validate"), + //'generate_doc'=>$langs->trans("ReGeneratePDF"), + //'builddoc'=>$langs->trans("PDFMerge"), + //'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->mymodule->delete) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (GETPOST('nomassaction', 'int') || in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 16d141d3e23..fed4ac64c43 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -437,9 +437,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - //'presend'=>$langs->trans("SendByMail"), - //'builddoc'=>$langs->trans("PDFMerge"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), + //'builddoc'=>$langs->trans("PDFMerge"), + //'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->produit->supprimer) $arrayofmassactions['predelete']="".$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index c58ac17f980..bf3fddf3bc5 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -436,9 +436,9 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), -// 'presend'=>$langs->trans("SendByMail"), -// 'builddoc'=>$langs->trans("PDFMerge"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), + //'builddoc'=>$langs->trans("PDFMerge"), + //'presend'=>$langs->trans("SendByMail"), ); //if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); if ($user->rights->projet->creer) $arrayofmassactions['close']=$langs->trans("Close"); diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index 63c2a004982..d8e47dcb040 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -377,9 +377,9 @@ if ($resql) // List of mass actions available $arrayofmassactions = array( - 'generate_doc'=>$langs->trans("Generate"), - //'presend'=>$langs->trans("SendByMail"), + 'generate_doc'=>$langs->trans("ReGeneratePDF"), 'builddoc'=>$langs->trans("PDFMerge"), + //'presend'=>$langs->trans("SendByMail"), ); if ($user->rights->supplier_proposal->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index e1551310a43..992de6850db 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -272,7 +272,7 @@ if (($caneditperms && empty($objMod->rights_admin_allowed)) || empty($object->ad { print ''; print ''.$langs->trans("All").""; - print '/'; + print ' / '; print ''.$langs->trans("None").""; print ''; } @@ -316,27 +316,23 @@ if ($result) // Show break line print ''; - print ''.img_object('', $picto, 'class="pictoobjectwidth"').' '.$objMod->getName(); - print ''; + print ''; + print img_object('', $picto, 'class="pictoobjectwidth"').' '.$objMod->getName(); + print ''; + print ''; if (($caneditperms && empty($objMod->rights_admin_allowed)) || empty($object->admin)) { if ($caneditperms) { print ''; print 'module.'">'.$langs->trans("All").""; - print '/'; + print ' / '; print 'module.'">'.$langs->trans("None").""; print ''; } + print ''; } - else - { - if ($caneditperms) - { - print ''; - } - } - print ' '; + print ''; print ''."\n"; } From cc64e3e5c02cd19e4fde2ec8758c862eadc297b0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 19:38:08 +0200 Subject: [PATCH 0376/1036] Fix responsive --- htdocs/core/class/html.formfile.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index f3a3ca135e3..576aff4db66 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -644,7 +644,7 @@ class FormFile else { $submodulepart = $modulepart; - + // For normalized standard modules $file=dol_buildpath('/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php', 0); if (file_exists($file)) @@ -1320,7 +1320,7 @@ class FormFile { // Delete or view link // ($param must start with &) - print ''; + print ''; if ($useinecm == 1 || $useinecm == 5) { print ''.img_edit('default', 0, 'class="paddingrightonly"').''; From a664cd6461fae6220bb5dcc21d42362a85f03d15 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 10 May 2019 20:09:41 +0200 Subject: [PATCH 0377/1036] Fix check when uploading a non image as user photo --- htdocs/admin/company.php | 8 ++++---- htdocs/core/class/html.form.class.php | 4 ++-- htdocs/langs/en_US/admin.lang | 2 +- htdocs/user/card.php | 16 ++++++++++++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index 878a1081b40..54f3a4cbb73 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -271,7 +271,7 @@ if ($action == 'addthumb') // Regenerate thumbs $error++; $langs->load("errors"); setEventMessages($langs->trans("ErrorBadImageFormat"), null, 'errors'); - dol_syslog($langs->transnoentities("ErrorBadImageFormat"), LOG_WARNING); + dol_syslog($langs->transnoentities("ErrorBadImageFormat"), LOG_INFO); } } else @@ -412,9 +412,9 @@ if ($action == 'edit' || $action == 'updateedit') } // Logo - print ''; + print ''; print ''; // Barcode + if (! empty($conf->barcode->enabled)) { - print ''; } diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index a519d4b92bf..c86874cdde9 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1901,7 +1901,7 @@ class Form // check parameters $price_level = (! empty($price_level) ? $price_level : 0); if (is_null($ajaxoptions)) $ajaxoptions=array(); - + if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->PRODUIT_USE_SEARCH_TO_SELECT)) { $placeholder=''; @@ -7204,7 +7204,7 @@ class Form if ($object->photo) $ret.="
\n"; $ret.='
'; - print ''; + print ''; print ''; if (! empty($mysoc->logo_mini)) { print ''.img_delete($langs->trans("Delete")).''; @@ -798,9 +798,9 @@ else print '
'.$langs->trans("Gencod").'' . $conf->global->MAIN_INFO_SOCIETE_GENCOD . '
'; if ($object->photo) $ret.=''; - $ret.=''; + $ret.=''; $ret.='
'.$langs->trans("Delete").'

'; } } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 8893626156b..e0c2afd7e34 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1079,7 +1079,7 @@ SystemInfoDesc=System information is miscellaneous technical information you get SystemAreaForAdminOnly=This area is available to administrator users only. Dolibarr user permissions cannot change this restriction. CompanyFundationDesc=Edit the information of the company/entity. Click on "%s" or "%s" button at the bottom of the page. AccountantDesc=Edit the details of your accountant/bookkeeper -AccountantFileNumber=File number +AccountantFileNumber=Accountant code DisplayDesc=Parameters affecting the look and behaviour of Dolibarr can be modified here. AvailableModules=Available app/modules ToActivateModule=To activate modules, go on setup Area (Home->Setup->Modules). diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 479604ddc36..926cb50836e 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -423,8 +423,20 @@ if (empty($reshook)) { if (GETPOST('deletephoto')) { $object->photo = ''; } - if (!empty($_FILES['photo']['name'])) { - $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); + if (!empty($_FILES['photo']['name'])) + { + $isimage=image_format_supported($_FILES['photo']['name']); + if ($isimage > 0) + { + $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); + } + else + { + $error++; + $langs->load("errors"); + setEventMessages($langs->trans("ErrorBadImageFormat"), null, 'errors'); + dol_syslog($langs->transnoentities("ErrorBadImageFormat"), LOG_INFO); + } } if (!$error) { From f91cc2e2d397a40a384c0339ac7410cee371ee93 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 11 May 2019 14:36:19 +0200 Subject: [PATCH 0378/1036] Prepare beta --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index ef8baf8748f..22cc1036f52 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE', 'Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION', '10.0.0-alpha'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION', '10.0.0-beta'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO', chr(128)); From 9ea42c85cbe11a6419a6fec7f1f4271466b31203 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 11 May 2019 15:11:47 +0200 Subject: [PATCH 0379/1036] Prepare ChangeLog v10 --- ChangeLog | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 148 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b6a3d9d78d..7a054bbf45b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,14 +6,159 @@ English Dolibarr ChangeLog ***** ChangeLog for 10.0.0 compared to 9.0.0 ***** For Users: NEW: Module "Ticket" is available as a stable module. -NEW: module "Email Collector" is available as a stable module. -NEW: module "TakePOS" is available as a stable module. +NEW: Module "Email Collector" is available as a stable module. +NEW: Module "TakePOS" is available as a stable module. NEW: Experimental module "Vendor receptions". NEW: Experimental module "BOM". -FIX: Disallow line start date if after end date. +NEW: Accounting - Add default accounting account for member subcriptions +NEW: Accounting - More comprehensive menu +NEW: Agenda/event list: add description column (hidden by default) +NEW: Add accounting account for result +NEW: Add accounting code for EEC sales and export sales on products +NEW: Add a security permission to edit php dynamic content on website. +NEW: Add attached document on bank account visible in automatic ECM. +NEW: Add Autofill Remainder Amount to Expense Report Payment Page +NEW: Add conf to set a search entry to the top +NEW: add hidden option DISPLAY_DISCOUNTED_SUPPLIER_PRICE +NEW: add hidden option MAIN_DEFAULT_LANGUAGE_FILTER +NEW: add hidden option NO_CONCAT_DESCRIPTION +NEW: Add contact status in category export +NEW: Add Default Warehouse to user record (if module stock is on) +NEW: Add employee/user to subledger account list +NEW: Add gender in member card +NEW: Add getFormatedCustomerRef and getFormatedSupplierRef methods +NEW: Add hidden option for ACCOUNTANCY_COMBO_FOR_AUX +NEW: Add hidden option 'ADD_UNSPLASH_LOGIN_BACKGROUND' +NEW: Add Hidden option 'OVERRIDE_VAT_FOR_EXPENSE_REPORT' +NEW: Add hidden option to set a search entry to the top +NEW: add hidden option MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT +NEW: Add history to view and print previous sales on TakePos. +NEW: Add import of accounting account for intra/export selling on product card +NEW: Adding code to show update date of supplier price shown +NEW: Add line total on list of payments +NEW: Add LinkedIn field in social network module +NEW: Add more complete error messages in log on stripe payments +NEW: Add no_email field in contact list +NEW: Add notes are show in tooltips +NEW: Add option DONATION_USE_THIRDPARTIES in admin of membership module +NEW: Add option MAIN_ALLOW_SELECT2_WITH_SMARTPHONE +NEW: Add option STOCK_SHOW_VIRTUAL_STOCK_IN_PRODUCTS_COMBO +NEW: add page to setup opening hours of the company +NEW: add payments table to pdf of expense report +NEW: add payment terms to invoices list +NEW: Add picto of deletion on mass action combo lists +NEW: add product extrafields available into shipping export +NEW: add ref supplier on supplier invoice +NEW: Add stats on entries & movements by fiscal year +NEW: Add subledger in various payment module +NEW: Add tag for ODT generation for localtax rates +NEW: Add the now link when creating expense report +NEW: Ask date of invoice when using the Clone feature. +NEW: auto event msg +NEW: Automatically binding for intra/export accountancy code in customer list +NEW: automatic / manual selector form +NEW: Better explanation for setup of WebDav module +NEW: Can add more lines on situation invoices at end of project when there is extra to add. +NEW: Can change the customer account of an instance +NEW: Can choose the root category to show products for TakePOS module +NEW: Can edit supplier on draft order supplier +NEW: Can enter price with or without tax when entering expense repor line +NEW: Can filter on the date of period for social contributions +NEW: Can generate invoices from the timespent entered on a project +NEW: Can update product supplier price ref +NEW: Can upload files from the edit page of expense report +NEW: Color for hover and for checked line is on by default +NEW: Column of parent company is available in list of third parties +NEW: conditionnal add member button by statut +NEW: constant KEEP_DISCOUNT_LINES_FROM_ORIGIN +NEW: Contact related items tab +NEW: Can create of supplier invoice from a reception +NEW: Ensure External RSS Links Open in New Window +NEW: Export available for reception module +NEW: Extend import option to Order's card and Propal's card +NEW: filter by thirdparty on report CA by prod/serv +NEW: Save space by moving the meteo on the title line +NEW: Get the list of groups of a user with the REST API. +NEW: Grant right to child classes to use Category methods +NEW: Hidden conf to improve pdf desc item visibitity +NEW: Hidden option MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER to edit supplier on draft supplier order +NEW: Improve Displaying Access Keys in Navigation +NEW: improve Expensereport, Inverse Receiver +NEW: improve pdf desc item visibitity +NEW: Introduce a config parameter $dolibarr_main_instance_unique_id +NEW: Introduce css "nobottomiftotal" +NEW: Introduce PhpSpreadsheet for export (need php5.6+) +NEW: Invoice creation from the timesheet +NEW: list of stripe's payout +NEW: Look and feel v10 - Add CSS tabBarNoTop +NEW: | make credit note from invoice +NEW: Manage account sell_intra & sell_export in page accoutancy admin default product +NEW: manage loan schedule +NEW: manage status of member type +NEW: mass action "create bills" for validated reception +NEW: measuring unit dictionary and product size/unit import +NEW: modele pdf canelle_reception to display linked reception to line +NEW: moral/physic status can be defined at member type level +NEW: Pagination into list of time spent +NEW: Performance enhancement (Replace dirname(__FILE__) with __DIR__) +NEW: POS support in order (ex: online cart) +NEW: Preview of images into the filemanager component. +NEW: Resource module can be used in products/services (in a dedicated tab) +NEW: Retrieve invoice infos from order when billing shipment +NEW: save and display type of membership in subscription table for more explicit historic +NEW: setup default thirdparty type (customer or prospect/customer) +NEW: add shipping set draft button and can update line +NEW: show in blod, the invoice amount where we came from, when making payment +NEW: Show product dimensions in product tooltips. +NEW: Show the latest date of subscription in member statistics reports. +NEW: sort list of models alphabetically +NEW: Stripe Payment Intent (need option to use this new Stripe api method) +NEW: Prepare to support stripe payment prelevement +NEW: Can support barcode on supplier price references. +NEW: Support tag {ccc} on payment ref +NEW: The preview of PDF files generates only 1 png file, even if several pages. +NEW: thirdparty in donation if option ON +NEW: Tooltip with vat amount and price incl tax on lines of objects. +NEW: Unsubscribed emails are now stored in a dedicated table +NEW: Update working chkbxlst filter for lists +NEW: Use ajax switch into setup of donation.php and multi-currency module. +NEW: use recipient language when generating the fullname for emails +NEW: When you create product or service, sell accountancy account by default is suggested. +NEW: Widget birthdays of the month. +NEW: Option in workflow module to set a reception billed on validate supplier bill For Developers: NEW: Module "DebugBar" is available as a stable module. +NEW: Add afterSelectContactOptions hook +NEW: add API REST for donations +NEW: Add a script to purge data older than a defined creation date +NEW: Add constant XFRAMEOPTIONS_ALLOWALL +NEW: Add function isValidVATID() +NEW: ADD document's product support in API +NEW: REST API: get the list of objects in a category. +NEW: Update Stripe library to 6.34.3 +NEW: Upgrade jquery lib to 3.3.1 +NEW: link/delete contact in invoice API and object +NEW: link/delete contact in order API and object +NEW: Add hook 'addHtmlHeader' +NEW: Add hooks in accountancy index +NEW: adding hooks to createRecurringInvoices() +NEW: Adding hooks to facturerec +NEW: Add parameter replaceambiguouschars on getRandomPassword function +NEW: Add property 'noteditable' in modulebuilder +NEW: Add the current modulepart to the Conf class +NEW: Add trigger FICHINTER_UNVALIDATE +NEW: Add visibility with value 4 in framework to define fields to show +NEW: advanced parameters for initiate a new module +NEW: API to list currencies +NEW: API Proposal, Orders, Invoices: Add contact details +NEW: conf to change concat desc order +NEW: enhance management of webhooks +NEW: Generation of doc by modulebuilder can include README and CHANGELOG +NEW: massfilesarea feature for plugin modules +NEW: Show enabled modules in dol_print_error +NEW: Simplification of styles. +NEW: Clean code of a lot of deprecated code. WARNING: From 759427f6acf9d69b1e2fb07d6957033251461a45 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 16:36:35 +0200 Subject: [PATCH 0380/1036] FIX: #11025 --- htdocs/projet/list.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 86f1c2ffcad..45ab6348aa9 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -5,6 +5,7 @@ * Copyright (C) 2005-2010 Regis Houssin * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2015 Claudio Aschieri + * Copyright (C) 2019 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 @@ -69,9 +70,9 @@ $pagenext = $page + 1; $search_all=GETPOST('search_all', 'alphanohtml'); $search_categ=GETPOST("search_categ",'alpha'); -$search_ref=GETPOST("search_ref"); -$search_label=GETPOST("search_label"); -$search_societe=GETPOST("search_societe"); +$search_ref=GETPOST("search_ref",'alpha'); +$search_label=GETPOST("search_label",'alpha'); +$search_societe=GETPOST("search_societe",'alpha'); $search_year=GETPOST("search_year"); $search_status=GETPOST("search_status",'int'); $search_opp_status=GETPOST("search_opp_status",'alpha'); From 80ef97e2159cb0e804996a8ed6a9fa103480b2bd Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 16:41:01 +0200 Subject: [PATCH 0381/1036] FIX: #11025 --- htdocs/fourn/commande/card.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 9c777b8c159..7b3561a0bf0 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005 Eric Seigne * Copyright (C) 2005-2016 Regis Houssin - * Copyright (C) 2010-2019 Juanjo Menent + * Copyright (C) 2010-2015 Juanjo Menent * Copyright (C) 2011-2015 Philippe Grand * Copyright (C) 2012-2016 Marcos García * Copyright (C) 2013 Florian Henry @@ -400,8 +400,6 @@ if (empty($reshook)) $localtax1_tx= get_localtax($tva_tx, 1, $mysoc, $object->thirdparty, $tva_npr); $localtax2_tx= get_localtax($tva_tx, 2, $mysoc, $object->thirdparty, $tva_npr); - $remise_percent = $productsupplier->remise_percent?$productsupplier->remise_percent:$remise_percent; - $result=$object->addline( $desc, $productsupplier->fourn_pu, From 1dda59dac19ebcb2495372f063fe2c01f5c763c4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 11 May 2019 16:46:16 +0200 Subject: [PATCH 0382/1036] Update changelog --- ChangeLog | 120 ++++++++++++++++++++++++++---------------------------- 1 file changed, 57 insertions(+), 63 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7a054bbf45b..4f578a54709 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,28 +10,19 @@ NEW: Module "Email Collector" is available as a stable module. NEW: Module "TakePOS" is available as a stable module. NEW: Experimental module "Vendor receptions". NEW: Experimental module "BOM". -NEW: Accounting - Add default accounting account for member subcriptions -NEW: Accounting - More comprehensive menu -NEW: Agenda/event list: add description column (hidden by default) -NEW: Add accounting account for result -NEW: Add accounting code for EEC sales and export sales on products -NEW: Add a security permission to edit php dynamic content on website. -NEW: Add attached document on bank account visible in automatic ECM. -NEW: Add Autofill Remainder Amount to Expense Report Payment Page -NEW: Add conf to set a search entry to the top -NEW: add hidden option DISPLAY_DISCOUNTED_SUPPLIER_PRICE -NEW: add hidden option MAIN_DEFAULT_LANGUAGE_FILTER -NEW: add hidden option NO_CONCAT_DESCRIPTION +NEW: Accounting - Add default accounting account for member subcriptions. +NEW: Accounting - More comprehensive menu. +NEW: Agenda/event - add description column available in list (hidden by default). +NEW: Add accounting account for result. +NEW: Add accounting code for EEC sales and export sales on products. +NEW: Add a security permission to edit php dynamic content on the WebSite module. +NEW: Attached document on bank account are now visible in automatic ECM. +NEW: Add Autofill Remainder Amount picto on the Expense Report Payment Page. NEW: Add contact status in category export NEW: Add Default Warehouse to user record (if module stock is on) NEW: Add employee/user to subledger account list NEW: Add gender in member card NEW: Add getFormatedCustomerRef and getFormatedSupplierRef methods -NEW: Add hidden option for ACCOUNTANCY_COMBO_FOR_AUX -NEW: Add hidden option 'ADD_UNSPLASH_LOGIN_BACKGROUND' -NEW: Add Hidden option 'OVERRIDE_VAT_FOR_EXPENSE_REPORT' -NEW: Add hidden option to set a search entry to the top -NEW: add hidden option MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT NEW: Add history to view and print previous sales on TakePos. NEW: Add import of accounting account for intra/export selling on product card NEW: Adding code to show update date of supplier price shown @@ -41,7 +32,6 @@ NEW: Add more complete error messages in log on stripe payments NEW: Add no_email field in contact list NEW: Add notes are show in tooltips NEW: Add option DONATION_USE_THIRDPARTIES in admin of membership module -NEW: Add option MAIN_ALLOW_SELECT2_WITH_SMARTPHONE NEW: Add option STOCK_SHOW_VIRTUAL_STOCK_IN_PRODUCTS_COMBO NEW: add page to setup opening hours of the company NEW: add payments table to pdf of expense report @@ -79,86 +69,90 @@ NEW: Extend import option to Order's card and Propal's card NEW: filter by thirdparty on report CA by prod/serv NEW: Save space by moving the meteo on the title line NEW: Get the list of groups of a user with the REST API. -NEW: Grant right to child classes to use Category methods -NEW: Hidden conf to improve pdf desc item visibitity NEW: Hidden option MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER to edit supplier on draft supplier order -NEW: Improve Displaying Access Keys in Navigation -NEW: improve Expensereport, Inverse Receiver -NEW: improve pdf desc item visibitity +NEW: Improve Displaying Shortcut Access Keys in Navigation. +NEW: Improve Expensereport, Inverse Receiver. +NEW: Improve pdf description item visibitity. NEW: Introduce a config parameter $dolibarr_main_instance_unique_id NEW: Introduce css "nobottomiftotal" NEW: Introduce PhpSpreadsheet for export (need php5.6+) NEW: Invoice creation from the timesheet -NEW: list of stripe's payout -NEW: Look and feel v10 - Add CSS tabBarNoTop -NEW: | make credit note from invoice +NEW: Can list remote stripe's payout in a dedicated page. NEW: Manage account sell_intra & sell_export in page accoutancy admin default product -NEW: manage loan schedule -NEW: manage status of member type -NEW: mass action "create bills" for validated reception -NEW: measuring unit dictionary and product size/unit import -NEW: modele pdf canelle_reception to display linked reception to line -NEW: moral/physic status can be defined at member type level -NEW: Pagination into list of time spent +NEW: Manage loan schedule. +NEW: Manage status of member types. +NEW: Mass action "create bills" for validated reception +NEW: Measuring unit are now defined into an editable dictionary. Add product size/unit into product import. +NEW: Template pdf 'canelle_reception' displays linked reception lines. +NEW: Moral/physic status can be defined at member type level +NEW: Pagination into list of time spent. NEW: Performance enhancement (Replace dirname(__FILE__) with __DIR__) -NEW: POS support in order (ex: online cart) +NEW: POS support in order (ex: online cart). NEW: Preview of images into the filemanager component. NEW: Resource module can be used in products/services (in a dedicated tab) NEW: Retrieve invoice infos from order when billing shipment -NEW: save and display type of membership in subscription table for more explicit historic -NEW: setup default thirdparty type (customer or prospect/customer) -NEW: add shipping set draft button and can update line +NEW: Save and display type of membership in subscription table for more explicit historic +NEW: Setup default thirdparty type (customer or prospect/customer) +NEW: Add shipping "set draft" button and can update lines. NEW: show in blod, the invoice amount where we came from, when making payment NEW: Show product dimensions in product tooltips. NEW: Show the latest date of subscription in member statistics reports. -NEW: sort list of models alphabetically +NEW: Sort list of templates alphabetically NEW: Stripe Payment Intent (need option to use this new Stripe api method) -NEW: Prepare to support stripe payment prelevement NEW: Can support barcode on supplier price references. NEW: Support tag {ccc} on payment ref NEW: The preview of PDF files generates only 1 png file, even if several pages. -NEW: thirdparty in donation if option ON -NEW: Tooltip with vat amount and price incl tax on lines of objects. -NEW: Unsubscribed emails are now stored in a dedicated table -NEW: Update working chkbxlst filter for lists +NEW: Can select a Thirdparty object in donation module if option ON. +NEW: Tooltip with VAT amount and price incl tax on lines of objects. +NEW: Unsubscribed emails are now stored in a dedicated table. +NEW: Update working chkbxlst filter for lists. NEW: Use ajax switch into setup of donation.php and multi-currency module. -NEW: use recipient language when generating the fullname for emails +NEW: use recipient language when generating the fullname for emails. NEW: When you create product or service, sell accountancy account by default is suggested. NEW: Widget birthdays of the month. -NEW: Option in workflow module to set a reception billed on validate supplier bill +NEW: Option in workflow module to set a reception billed on validate supplier bill. +NEW: Autocompletion on lists should be available on mobile applications. For Developers: NEW: Module "DebugBar" is available as a stable module. -NEW: Add afterSelectContactOptions hook -NEW: add API REST for donations -NEW: Add a script to purge data older than a defined creation date +NEW: Add API REST for donations +NEW: Add a script 'purge-data.php' to purge data older than a defined creation date NEW: Add constant XFRAMEOPTIONS_ALLOWALL NEW: Add function isValidVATID() -NEW: ADD document's product support in API +NEW: ADD document's product support in APIs NEW: REST API: get the list of objects in a category. NEW: Update Stripe library to 6.34.3 NEW: Upgrade jquery lib to 3.3.1 -NEW: link/delete contact in invoice API and object -NEW: link/delete contact in order API and object -NEW: Add hook 'addHtmlHeader' -NEW: Add hooks in accountancy index -NEW: adding hooks to createRecurringInvoices() -NEW: Adding hooks to facturerec -NEW: Add parameter replaceambiguouschars on getRandomPassword function +NEW: Add hook 'addHtmlHeader()' +NEW: Add hook 'createRecurringInvoices()' +NEW: Add hook 'afterSelectContactOptions' +NEW: Add hook support in accountancy index +NEW: Add hook support in list of template invoices +NEW: Add parameter 'replaceambiguouschars' on getRandomPassword function NEW: Add property 'noteditable' in modulebuilder -NEW: Add the current modulepart to the Conf class +NEW: Add the current modulepart into the Conf class object NEW: Add trigger FICHINTER_UNVALIDATE NEW: Add visibility with value 4 in framework to define fields to show -NEW: advanced parameters for initiate a new module +NEW: More option to tune initialization of a new module with modulebuilder. NEW: API to list currencies NEW: API Proposal, Orders, Invoices: Add contact details -NEW: conf to change concat desc order -NEW: enhance management of webhooks +NEW: hidden option to change concat desc order +NEW: Enhance management of webhooks NEW: Generation of doc by modulebuilder can include README and CHANGELOG -NEW: massfilesarea feature for plugin modules -NEW: Show enabled modules in dol_print_error -NEW: Simplification of styles. +NEW: massfilesarea feature for external modules +NEW: Show enabled modules in dol_print_error() +NEW: Simplification of CSS styles of default themes. NEW: Clean code of a lot of deprecated code. +NEW: Add hidden option to set a search entry to the top +NEW: add hidden option DISPLAY_DISCOUNTED_SUPPLIER_PRICE +NEW: add hidden option MAIN_DEFAULT_LANGUAGE_FILTER +NEW: add hidden option NO_CONCAT_DESCRIPTION +NEW: Add hidden option for ACCOUNTANCY_COMBO_FOR_AUX +NEW: Add hidden option 'ADD_UNSPLASH_LOGIN_BACKGROUND' +NEW: Add Hidden option 'OVERRIDE_VAT_FOR_EXPENSE_REPORT' +NEW: add hidden option MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT +NEW: Hidden conf to improve pdf desc item visibitity +NEW: Look and feel v10 - Add CSS 'tabBarNoTop' WARNING: From f910d5ff55fc0cd333c47558850621c886f009f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 11 May 2019 16:46:46 +0200 Subject: [PATCH 0383/1036] Doc --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 4f578a54709..bbf3ace694e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -159,7 +159,7 @@ WARNING: Following changes may create regressions for some external modules, but were necessary to make Dolibarr better: * PHP 5.4 is no more supported. Minimum PHP is now 5.5+. -* The PHP extension php-intl is not mandatory but should be installed to have new features working correctly. +* The PHP extension php-intl is not mandatory and must be installed to have new features working correctly. * Method GetUrlTrackingStatus were renamed into getUrlTrackingStatus for consistency with naming rules. * API getListOfCivility has been renamed into getListOfCivilities for consistency with naming rules. * Deprecated function img_phone as been removed. You can use img_picto(..., 'call|call_out') instead.; From dc9f8a349f837322d2bd81a03c37e9795769d53d Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 16:50:31 +0200 Subject: [PATCH 0384/1036] Fix: missing GETPOST params --- htdocs/product/list.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 071080edc58..da2fab61c32 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2012-2016 Marcos García - * Copyright (C) 2013-2016 Juanjo Menent + * Copyright (C) 2013-2019 Juanjo Menent * Copyright (C) 2013-2015 Raphaël Doursenaud * Copyright (C) 2013 Jean Heimburger * Copyright (C) 2013 Cédric Salvador @@ -52,11 +52,11 @@ $confirm=GETPOST('confirm','alpha'); $toselect = GETPOST('toselect', 'array'); $sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); -$search_ref=GETPOST("search_ref"); -$search_barcode=GETPOST("search_barcode"); -$search_label=GETPOST("search_label"); +$search_ref=GETPOST("search_ref",'alpha'); +$search_barcode=GETPOST("search_barcode",'alpha'); +$search_label=GETPOST("search_label", 'alpha'); $search_type = GETPOST("search_type",'int'); -$search_sale = GETPOST("search_sale"); +$search_sale = GETPOST("search_sale", 'int'); $search_categ = GETPOST("search_categ",'int'); $search_tosell = GETPOST("search_tosell", 'int'); $search_tobuy = GETPOST("search_tobuy", 'int'); From 2e6cb2afaa121fe7100dd0b39dd55554421b8f8e Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 16:53:16 +0200 Subject: [PATCH 0385/1036] Fix: missing GETPOST params --- htdocs/product/reassort.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index a3afebbc356..769d3898c13 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -4,6 +4,7 @@ * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2015 Raphaël Doursenaud + * Copyright (C) 2019 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 @@ -40,11 +41,11 @@ $result=restrictedArea($user,'produit|service'); $action=GETPOST('action','alpha'); -$sref=GETPOST("sref"); -$snom=GETPOST("snom"); +$sref=GETPOST("sref", 'alpha'); +$snom=GETPOST("snom", 'alpha'); $sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); $type=GETPOST("type","int"); -$search_barcode=GETPOST("search_barcode"); +$search_barcode=GETPOST("search_barcode", 'alpha'); $catid=GETPOST('catid','int'); $toolowstock=GETPOST('toolowstock'); $tosell = GETPOST("tosell"); From 62065194562de7b1024a6e902f0a598a128d9f6f Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 16:54:56 +0200 Subject: [PATCH 0386/1036] Fix: missing GETPOST params --- htdocs/product/reassortlot.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 3d2b0f6f35e..cedde29d572 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -5,6 +5,7 @@ * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2019 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 @@ -43,8 +44,8 @@ $result=restrictedArea($user,'produit|service'); $action=GETPOST('action','alpha'); -$sref=GETPOST("sref"); -$snom=GETPOST("snom"); +$sref=GETPOST("sref", 'alpha'); +$snom=GETPOST("snom", 'alpha'); $sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); $type=GETPOST("type","int"); $search_barcode=GETPOST("search_barcode",'alpha'); From 91ae36558881afc96a464d34d039c46e4b876452 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 16:58:00 +0200 Subject: [PATCH 0387/1036] Fix: missing GETPOST params --- htdocs/contrat/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index cdafbd6c2fd..9dc075d7d27 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2013 Cédric Salvador - * Copyright (C) 2014 Juanjo Menent + * Copyright (C) 2014-2019 Juanjo Menent * Copyright (C) 2015 Claudio Aschieri * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2016 Ferran Marcet @@ -46,14 +46,14 @@ $show_files=GETPOST('show_files','int'); $confirm=GETPOST('confirm','alpha'); $toselect = GETPOST('toselect', 'array'); -$search_name=GETPOST('search_name'); -$search_email=GETPOST('search_email'); +$search_name=GETPOST('search_name', 'alpha'); +$search_email=GETPOST('search_email', 'alpha'); $search_town=GETPOST('search_town','alpha'); $search_zip=GETPOST('search_zip','alpha'); $search_state=trim(GETPOST("search_state")); $search_country=GETPOST("search_country",'int'); $search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); -$search_contract=GETPOST('search_contract'); +$search_contract=GETPOST('search_contract','alpha'); $search_ref_customer=GETPOST('search_ref_customer','alpha'); $search_ref_supplier=GETPOST('search_ref_supplier','alpha'); $sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); From 3ae2d71ea697b84447c78efea737f8afe85e4cac Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 17:00:55 +0200 Subject: [PATCH 0388/1036] Fix: missing GETPOST params --- htdocs/contrat/services_list.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 108fb6d4403..69757e57c7a 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -3,6 +3,7 @@ * Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2019 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 @@ -46,9 +47,9 @@ if (! $sortorder) $sortorder="ASC"; $mode = GETPOST("mode"); $filter=GETPOST("filter"); -$search_name=GETPOST("search_name"); -$search_contract=GETPOST("search_contract"); -$search_service=GETPOST("search_service"); +$search_name=GETPOST("search_name", 'alpha'); +$search_contract=GETPOST("search_contract", 'alpha'); +$search_service=GETPOST("search_service", 'alpha'); $search_status=GETPOST("search_status","alpha"); $statut=GETPOST('statut')?GETPOST('statut'):1; $search_product_category=GETPOST('search_product_category','int'); From 3a99ef7319e7e0588fc25973493a3e21cd4a80f4 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 17:04:05 +0200 Subject: [PATCH 0389/1036] Fix: missing GETPOST params --- htdocs/expensereport/list.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 5b633552380..873c3c97d9a 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -4,6 +4,7 @@ * Copyright (C) 2004 Eric Seigne * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2015 Alexandre Spangaro + * Copyright (C) 2019 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 @@ -67,7 +68,7 @@ if (!$sortfield) $sortfield="d.date_debut"; $id = GETPOST('id', 'int'); $sall = trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); -$search_ref = GETPOST('search_ref'); +$search_ref = GETPOST('search_ref', 'alpha'); $search_user = GETPOST('search_user','int'); $search_amount_ht = GETPOST('search_amount_ht','alpha'); $search_amount_vat = GETPOST('search_amount_vat','alpha'); From 166ac1b8c254e047cb4e3aa08e0fbbe87885f036 Mon Sep 17 00:00:00 2001 From: andreubisquerra Date: Sat, 11 May 2019 21:33:26 +0200 Subject: [PATCH 0390/1036] TakePOS as stable as indicated in the Changelog --- htdocs/core/modules/modTakePos.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/modTakePos.class.php b/htdocs/core/modules/modTakePos.class.php index ecbd3b9c8c4..e961e6924f3 100644 --- a/htdocs/core/modules/modTakePos.class.php +++ b/htdocs/core/modules/modTakePos.class.php @@ -65,7 +65,7 @@ class modTakePos extends DolibarrModules $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'; + $this->version = 'dolibarr'; // 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. From 7041c3246ec1fa4c3a0e6ec59594bf692b345851 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 22:35:56 +0200 Subject: [PATCH 0391/1036] Prepare 8.0.5 --- ChangeLog | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/ChangeLog b/ChangeLog index 6664dbe8941..d4bcd3ea17c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,90 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 8.0.5 compared to 8.0.4 ***** +FIX: #10381 +FIX: #10460 compatibility with MariaDB 10.4 +FIX: #11025 +FIX: Accountancy - Add transaction with multicompany use all the time 1st entity +FIX: Accountancy - Format EBP import +FIX: actioncomm export: ORDER BY clause is in wrong export property + event type filter does not work +FIX: actioncomm: sort events by date after external calendars and hook +FIX: action list: add printFieldListSelect and printFieldListWhere hooks +FIX: add fk_unit on addline action +FIX: avoid php warning +FIX: bad sql request +FIX: better method +FIX: better test +FIX: better test on fetch +FIX: broken external authentication module feature and avoid warning +FIX: Can not create contract with numbering module without autogen rule +FIX: can't add lines on invoices +FIX: Can't generate invoice pdf +FIX: Can't insert if there is extrafields mandatory on another entity. +FIX: Can't insert if there is extrafields mandatory on another entity. FIX: Can't set default value of extrafield of type varchar +FIX: Check for old picture name if the new one was not found +FIX: Civility not saved when creating a member. +FIX: $conf->fournisseur->commande->enabled doesn't exist, we must use $conf->fournisseur->enabled +FIX: could not create several superadmin in transversal mode +FIX: credit note can have negative value +FIX: Default value on sales representative on third party creation +FIX: Don't show journal:getNomUrl without data +FIX: Erreur dans le Total +FIX: error messages not displayed +FIX: expedition: reset status on rollback + replace hardcoded status with const +FIX: Fix PHP warning "count(): Parameter must be an array..." +FIX: fk_default_warehouse missing in group by +FIX: function sendEmailsReminder isn't completely developed, then MAIN_FEATURES_LEVEL must be 2 to "use" it +FIX: holidays get natural_search if search params are set only +FIX: if empty error message, we just see "error" displayed +FIX: if(!method_exists(dol_loginfunction)) +FIX: If we build one invoice for several orders, we must put the ref of order on the line to not lose information. +FIX: in fact expensereport must be in $check array +FIX: Interface regression for bind people. Fix option MAIN_OPTIMIZEFORTEXTBROWSER +FIX: line edit template: keep fk_parent_line +FIX: Loan impossible to account +FIX: Mark credit note as available for credit note in other currency +FIX: missing access security checking with multicompany +FIX: missing entity filter and wrong var name +FIX: missing entity filter in function "build_filterField()" (export) +FIX: Missing field in import/export of users +FIX: missing hook completeTabsHead in margins module +FIX: missing $ismultientitymanaged for previous/next ref +FIX: Missing province in export of invoice +FIX: multicompany compatibility +FIX: must fetch member in current entity +FIX: need an order by in case we found other invoice with same number but not same date +FIX: need to round with 2 decimals to avoid movements not correctly balanced +FIX: no need to test anything to display documents tabs on expense report +FIX: positive values creating diff on addline rounding +FIX: problem with multicompany transverse mode +FIX: Product accountancey sell intra code must be visible if main feature level 1 +FIX: project_title for display of getNomUrl() +FIX: quick search for supplier orders +FIX: Remane of project +FIX: same thing here +FIX: Selection of email recipient with option MAIN_OPTIMIZEFORTEXTBROWSER +FIX: several hooks in shipping/delivery cards +FIX: shipping default warehouse if only one warehouse +FIX: SQL injection on rowid of dict.php +FIX: 'statut' is ignored when updating a user with the REST API. +FIX: supplier invoice payment total dont care about deposit or credit +FIX: supplier invoice product stats total ht is line total not invoice total +FIX: The minimum amount filter does not work in the VAT report per customer +FIX: Total per day shows 00:00 if the total time spent is equal to 12:00 +FIX: Update/delete currency on same languages +FIX: [URGENT] broken feature, "$usercancreate" is for Dolibarr 9 +FIX: useless join +FIX: we need to keep originline special_code +FIX: we want to be able to reopen fourn credit note +FIX: when 2 extra fields are mandatory in 2 different entities +FIX: when we add a payment on an invoice which already has payments with credit note or deposit amount, and then we get an excess received, discount amount must be $total_paiements + $total_creditnote_and_deposit - $object->total_ttc; +FIX: when we create deposit with multi tva, we mustn't add line if amount = 0 (example when we have a 100% reduc on one of origin invoice line) +FIX: wrong redirect link on holiday refuse +FIX: wrong test enabled +FIX: Wrong variable name +FIX: XSS + ***** ChangeLog for 8.0.4 compared to 8.0.3 ***** FIX: #10030 better german chart FIX: #10036 From 072a455ca41f7ac32fb910e80184b64b81304d4d Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Sat, 11 May 2019 22:55:42 +0200 Subject: [PATCH 0392/1036] Prepare 8.0.6 --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 3981de21751..fbc1f52cac7 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION','8.0.5'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION','8.0.6'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO',chr(128)); From 5876582030c66ca817f0caa0ff3133703e711a78 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 12 May 2019 15:56:29 +0200 Subject: [PATCH 0393/1036] Fix responsive --- htdocs/commande/orderstoinvoice.php | 79 +++++++++++++++-------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/htdocs/commande/orderstoinvoice.php b/htdocs/commande/orderstoinvoice.php index fe017a6b1aa..0d0b202a8c3 100644 --- a/htdocs/commande/orderstoinvoice.php +++ b/htdocs/commande/orderstoinvoice.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2004-2019 Laurent Destailleur * Copyright (C) 2005 Marc Barilley / Ocebo * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2012 Andreu Bisquerra Gaya @@ -50,14 +50,14 @@ $id = (GETPOST('id')?GETPOST('id', 'int'):GETPOST("facid", "int")); // For b $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); -$sref = GETPOST('sref'); -$sref_client = GETPOST('sref_client'); +$sref = GETPOST('sref', 'alpha'); +$sref_client = GETPOST('sref_client', 'alpha'); $sall = trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); $socid = GETPOST('socid', 'int'); $selected = GETPOST('orders_to_invoice'); $sortfield = GETPOST("sortfield", 'alpha'); $sortorder = GETPOST("sortorder", 'alpha'); -$viewstatut = GETPOST('viewstatut'); +$viewstatut = GETPOST('viewstatut', 'alpha'); $error = 0; @@ -290,32 +290,32 @@ if (($action == 'create' || $action == 'add') && !$error) $array_options = $lines[$i]->array_options; } - $result = $object->addline( - $desc, - $lines[$i]->subprice, - $lines[$i]->qty, - $lines[$i]->tva_tx, - $lines[$i]->localtax1_tx, - $lines[$i]->localtax2_tx, - $lines[$i]->fk_product, - $lines[$i]->remise_percent, - $date_start, - $date_end, - 0, - $lines[$i]->info_bits, - $lines[$i]->fk_remise_except, - 'HT', - 0, - $product_type, - $ii, - $lines[$i]->special_code, - $object->origin, - $lines[$i]->rowid, - $fk_parent_line, - $lines[$i]->fk_fournprice, - $lines[$i]->pa_ht, - $lines[$i]->label, - $array_options + $result = $object->addline( + $desc, + $lines[$i]->subprice, + $lines[$i]->qty, + $lines[$i]->tva_tx, + $lines[$i]->localtax1_tx, + $lines[$i]->localtax2_tx, + $lines[$i]->fk_product, + $lines[$i]->remise_percent, + $date_start, + $date_end, + 0, + $lines[$i]->info_bits, + $lines[$i]->fk_remise_except, + 'HT', + 0, + $product_type, + $ii, + $lines[$i]->special_code, + $object->origin, + $lines[$i]->rowid, + $fk_parent_line, + $lines[$i]->fk_fournprice, + $lines[$i]->pa_ht, + $lines[$i]->label, + $array_options ); if ($result > 0) { @@ -578,9 +578,9 @@ if (($action != 'create' && $action != 'add') || ($action == 'create' && $error) { $sql.= ' AND c.ref_client LIKE \'%'.$db->escape($sref_client).'%\''; } - $sql.= ' ORDER BY '.$sortfield.' '.$sortorder; - $resql = $db->query($sql); + $sql.= $db->order($sortfield, $sortorder); + $resql = $db->query($sql); if ($resql) { if ($socid) @@ -604,6 +604,7 @@ if (($action != 'create' && $action != 'add') || ($action == 'create' && $error) print '

'.$companystatic->getNomUrl(1, 'customer').'

'; } + print '
'; print ''; print ''; print_liste_field_titre('Ref', $_SERVER["PHP_SELF"], 'c.ref', '', '&socid='.$socid, '', $sortfield, $sortorder); @@ -618,8 +619,9 @@ if (($action != 'create' && $action != 'add') || ($action == 'create' && $error) print ''; print ''; print ''; - print ''; @@ -668,11 +670,11 @@ if (($action != 'create' && $action != 'add') || ($action == 'create' && $error) $generic_commande->date_livraison = $db->jdate($objp->date_livraison); print '
'; + //REF + print ''; print ''; print '
'; - print ''; - print '
'; + print ''; print $generic_commande->getNomUrl(1, 0); print ''; + print ''; if ($generic_commande->hasDelay()) { print img_picto($langs->trans("Late"), "warning"); } @@ -713,10 +715,9 @@ if (($action != 'create' && $action != 'add') || ($action == 'create' && $error) $i++; } print '
'; + print '
'; - /* - * Boutons actions - */ + // Buttons actions print '
global->INVOICE_CLOSE_ORDERS_OFF_BY_DEFAULT_FORMASSINVOICE)?' checked="checked"':'').' name="autocloseorders"> '.$langs->trans("CloseProcessedOrdersAutomatically"); print '
'; print ''; @@ -726,7 +727,9 @@ if (($action != 'create' && $action != 'add') || ($action == 'create' && $error) print ''; print '
'; print '
'; + print ''; + $db->free($resql); } else From 7a75567ad938fd018a97de1566c28aa797a97daf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 12 May 2019 16:34:49 +0200 Subject: [PATCH 0394/1036] FIX Debug ticket module --- ...terface_50_modAgenda_ActionsAuto.class.php | 29 +++++++++++++++++++ ...terface_50_modTicket_TicketEmail.class.php | 2 ++ .../mysql/data/llx_c_action_trigger.sql | 7 +++-- .../install/mysql/migration/9.0.0-10.0.0.sql | 8 ++--- htdocs/langs/en_US/agenda.lang | 1 + htdocs/langs/en_US/ticket.lang | 2 ++ htdocs/ticket/card.php | 6 ++-- htdocs/ticket/class/ticket.class.php | 16 +++++----- 8 files changed, 55 insertions(+), 16 deletions(-) diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 0f219330669..bdd07c4e38d 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -783,6 +783,35 @@ class InterfaceActionsAuto extends DolibarrTriggers $object->sendtoid=0; } + elseif($action == 'TICKET_ASSIGNED') + { + // Load translation files required by the page + $langs->loadLangs(array("agenda","other","projects")); + + if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("TICKET_ASSIGNEDInDolibarr", $object->ref); + $object->actionmsg=$langs->transnoentities("TICKET_ASSIGNEDInDolibarr", $object->ref); + if ($object->oldcopy->fk_user_assign > 0) + { + $tmpuser=new User($this->db); + $tmpuser->fetch($object->oldcopy->fk_user_assign); + $object->actionmsg.="\n".$langs->transnoentities("OldUser").': '.$tmpuser->getFullName($langs); + } + else + { + $object->actionmsg.="\n".$langs->transnoentities("OldUser").': '.$langs->trans("None"); + } + if ($object->fk_user_assign > 0) + { + $tmpuser=new User($this->db); + $tmpuser->fetch($object->fk_user_assign); + $object->actionmsg.="\n".$langs->transnoentities("NewUser").': '.$tmpuser->getFullName($langs); + } + else + { + $object->actionmsg.="\n".$langs->transnoentities("NewUser").': '.$langs->trans("None"); + } + $object->sendtoid=0; + } // TODO Merge all previous cases into this generic one else // $action = TICKET_CREATE, TICKET_MODIFY, TICKET_DELETE, ... { diff --git a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php index c484ba7c6d4..f43b64bf54c 100644 --- a/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php +++ b/htdocs/core/triggers/interface_50_modTicket_TicketEmail.class.php @@ -121,6 +121,8 @@ class InterfaceTicketEmail extends DolibarrTriggers $res = $userstat->fetch($object->fk_user_assign); if ($res > 0) { + // Send email to notification email + if (empty($conf->global->TICKET_DISABLE_ALL_MAILS)) { // Init to avoid errors diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index c1f7ec24ef1..3bc705c7a19 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -109,9 +109,10 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PROJECT_DELETE','Project deleted','Executed when a project is deleted','project',143); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CREATE','Ticket created','Executed when a ticket is created','ticket',161); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_MODIFY','Ticket modified','Executed when a ticket is modified','ticket',163); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CLOSE','Ticket closed','Executed when a ticket is closed','ticket',164); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_SENTBYMAIL','Ticket message sent by email','Executed when a message is sent from the ticket record','ticket',165); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',166); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_ASSIGNED','Ticket assigned','Executed when a ticket is modified','ticket',164); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CLOSE','Ticket closed','Executed when a ticket is closed','ticket',165); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_SENTBYMAIL','Ticket message sent by email','Executed when a message is sent from the ticket record','ticket',166); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',167); -- actions not enabled by default (no constant created for that) when we enable module agenda insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_MODIFY','Product or service modified','Executed when a product or sevice is modified','product',41); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('MEMBER_MODIFY','Member modified','Executed when a member is modified','member',23); diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index b53d0603be6..e12d591e041 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -70,7 +70,10 @@ ALTER TABLE llx_facture ADD UNIQUE INDEX uk_facture_ref (ref, entity); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CREATE','Ticket created','Executed when a ticket is created','ticket',161); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_MODIFY','Ticket modified','Executed when a ticket is modified','ticket',163); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',164); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_ASSIGNED','Ticket assigned','Executed when a ticket is assigned to another user','ticket',164); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CLOSE','Ticket closed','Executed when a ticket is closed','ticket',165); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_SENTBYMAIL','Ticket message sent by email','Executed when a message is sent from the ticket record','ticket',166); +insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_DELETE','Ticket deleted','Executed when a ticket is deleted','ticket',167); create table llx_mailing_unsubscribe ( @@ -293,9 +296,6 @@ ALTER TABLE llx_emailcollector_emailcollector ADD COLUMN maxemailpercollect inte DELETE FROM llx_const WHERE name = 'THEME_ELDY_USE_HOVER' AND value = '0'; DELETE FROM llx_const WHERE name = 'THEME_ELDY_USE_CHECKED' AND value = '0'; -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_CLOSE','Ticket closed','Executed when a ticket is closed','ticket',164); -insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('TICKET_SENTBYMAIL','Ticket message sent by email','Executed when a message is sent from the ticket record','ticket',166); - ALTER TABLE llx_inventorydet DROP COLUMN pmp; ALTER TABLE llx_inventorydet DROP COLUMN pa; ALTER TABLE llx_inventorydet DROP COLUMN new_pmp; diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index b928554b328..88f41d2c3c9 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -95,6 +95,7 @@ PROJECT_MODIFYInDolibarr=Project %s modified PROJECT_DELETEInDolibarr=Project %s deleted TICKET_CREATEInDolibarr=Ticket %s created TICKET_MODIFYInDolibarr=Ticket %s modified +TICKET_ASSIGNEDInDolibarr=Ticket %s assigned TICKET_CLOSEInDolibarr=Ticket %s closed TICKET_DELETEInDolibarr=Ticket %s deleted ##### End agenda events ##### diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index 030858eecce..9d70262a519 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -266,6 +266,8 @@ TicketNewEmailBodyAdmin=

Ticket has just been created with ID #%s, see informa SeeThisTicketIntomanagementInterface=See ticket in management interface TicketPublicInterfaceForbidden=The public interface for the tickets was not enabled ErrorEmailOrTrackingInvalid=Bad value for tracking ID or email +OldUser=Old user +NewUser=New user # notifications TicketNotificationEmailSubject=Ticket %s updated diff --git a/htdocs/ticket/card.php b/htdocs/ticket/card.php index 26fec804370..475c9f5beae 100644 --- a/htdocs/ticket/card.php +++ b/htdocs/ticket/card.php @@ -283,8 +283,8 @@ if (GETPOST('update') && GETPOST('id') && $user->rights->ticket->write) { if (!$error) { $db->begin(); - $object->label = GETPOST("label"); - $object->description = GETPOST("description"); + $object->label = GETPOST("label", 'alphanohtml'); + $object->description = GETPOST("description", 'none'); //... $ret = $object->update($user); @@ -302,6 +302,7 @@ if (GETPOST('update') && GETPOST('id') && $user->rights->ticket->write) { } } +// Mark as Read if ($action == "mark_ticket_read" && $user->rights->ticket->write) { $object->fetch('', '', GETPOST("track_id", 'alpha')); @@ -317,6 +318,7 @@ if ($action == "mark_ticket_read" && $user->rights->ticket->write) { $action = 'view'; } +// Assign to someone if ($action == "assign_user" && GETPOST('btn_assign_user', 'aplha') && $user->rights->ticket->write) { $object->fetch('', '', GETPOST("track_id", 'alpha')); $useroriginassign = $object->fk_user_assign; diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index c049712d623..5430932f53d 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -1370,7 +1370,7 @@ class Ticket extends CommonObject $this->db->begin(); $sql = "UPDATE " . MAIN_DB_PREFIX . "ticket"; - $sql .= " SET fk_statut = 1, date_read='" . $this->db->idate(dol_now()) . "'"; + $sql .= " SET fk_statut = ".Ticket::STATUS_READ.", date_read='" . $this->db->idate(dol_now()) . "'"; $sql .= " WHERE rowid = " . $this->id; dol_syslog(get_class($this) . "::markAsRead"); @@ -1388,7 +1388,6 @@ class Ticket extends CommonObject // End call triggers } - if (!$error) { $this->db->commit(); return 1; @@ -1421,20 +1420,23 @@ class Ticket extends CommonObject $this->db->begin(); + $this->oldcopy = dol_clone($this); + $sql = "UPDATE " . MAIN_DB_PREFIX . "ticket"; if ($id_assign_user > 0) { - $sql .= " SET fk_user_assign=".$id_assign_user.", fk_statut=4"; + $sql .= " SET fk_user_assign=".$id_assign_user.", fk_statut = ".Ticket::STATUS_ASSIGNED; } else { - $sql .= " SET fk_user_assign=null, fk_statut=1"; + $sql .= " SET fk_user_assign=null, fk_statut = ".Ticket::STATUS_READ; } $sql .= " WHERE rowid = " . $this->id; dol_syslog(get_class($this) . "::assignUser sql=" . $sql); $resql = $this->db->query($sql); - if ($resql) { + if ($resql) + { $this->fk_user_assign = $id_assign_user; // May be used by trigger if (! $notrigger) { @@ -1710,11 +1712,11 @@ class Ticket extends CommonObject { global $conf, $langs; - if ($this->fk_statut != 9) { // not closed + if ($this->fk_statut != Ticket::STATUS_CLOSED) { // not closed $this->db->begin(); $sql = "UPDATE " . MAIN_DB_PREFIX . "ticket"; - $sql .= " SET fk_statut=8, progress=100, date_close='" . $this->db->idate(dol_now()) . "'"; + $sql .= " SET fk_statut=".Ticket::STATUS_CLOSED.", progress=100, date_close='" . $this->db->idate(dol_now()) . "'"; $sql .= " WHERE rowid = " . $this->id; dol_syslog(get_class($this) . "::close sql=" . $sql); From e84003d4ff2193a94aed3a74e0c9dfa331b1240a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 09:29:34 +0200 Subject: [PATCH 0395/1036] Escape param --- htdocs/core/tpl/login.tpl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php index db830a9bb68..ceebe454cfb 100644 --- a/htdocs/core/tpl/login.tpl.php +++ b/htdocs/core/tpl/login.tpl.php @@ -70,7 +70,7 @@ $colorbackhmenu1 = join(',', colorStringToArray($colorbackhmenu1)); // Normal if (!empty($conf->global->ADD_UNSPLASH_LOGIN_BACKGROUND)) { // For example $conf->global->ADD_UNSPLASH_LOGIN_BACKGROUND = 'https://source.unsplash.com/random' ?> - + From b0e780fab05024243589d8a344c930421559a812 Mon Sep 17 00:00:00 2001 From: John BOTELLA Date: Mon, 13 May 2019 09:39:45 +0200 Subject: [PATCH 0396/1036] Fix travis --- htdocs/accountancy/bookkeeping/list.php | 2 +- htdocs/adherents/type.php | 2 +- htdocs/cron/list.php | 2 +- htdocs/projet/ganttview.php | 2 +- htdocs/projet/tasks.php | 2 +- htdocs/societe/website.php | 2 +- htdocs/theme/eldy/btn.inc.php | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index bafce35142f..073d180cd16 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -447,7 +447,7 @@ $listofformat=AccountancyExport::getType(); if (count($filter)) $buttonLabel = $langs->trans("ExportFilteredList"); else $buttonLabel = $langs->trans("ExportList"); -$newcardbutton = dolGetButtonTitle($buttonLabel ,'', 'fa fa-file-export', $_SERVER["PHP_SELF"].'?action=export_file'.($param?'&'.$param:'')); +$newcardbutton = dolGetButtonTitle($buttonLabel, '', 'fa fa-file-export', $_SERVER["PHP_SELF"].'?action=export_file'.($param?'&'.$param:'')); $newcardbutton.= dolGetButtonTitle($langs->trans('GroupByAccountAccounting'), '', 'fa fa-object-group', DOL_URL_ROOT.'/accountancy/bookkeeping/listbyaccount.php?'.$param); diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index d822834e308..5029c3a570f 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -232,7 +232,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') $newcardbutton=''; if ($user->rights->adherent->configurer) { - $newcardbutton.= dolGetButtonTitle($langs->trans('NewMemberType'), '', 'fa fa-plus-circle',DOL_URL_ROOT.'/adherents/type.php?action=create'); + $newcardbutton.= dolGetButtonTitle($langs->trans('NewMemberType'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/type.php?action=create'); } print '

'; diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index c141d272323..e600f7244cf 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -344,7 +344,7 @@ print ''; // Line with explanation and button new job $newcardbutton=''; -$newcardbutton.= dolGetButtonTitle($langs->trans('New'), $langs->trans('CronCreateJob'), 'fa fa-plus-circle', DOL_URL_ROOT.'/societe/card.php?action=create'.$typefilter, '',$user->rights->cron->create); +$newcardbutton.= dolGetButtonTitle($langs->trans('New'), $langs->trans('CronCreateJob'), 'fa fa-plus-circle', DOL_URL_ROOT.'/societe/card.php?action=create'.$typefilter, '', $user->rights->cron->create); print_barre_liste($pagetitle, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_setup', 0, $newcardbutton, '', $limit); diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php index 0e897497f62..a30fce71ef1 100644 --- a/htdocs/projet/ganttview.php +++ b/htdocs/projet/ganttview.php @@ -204,7 +204,7 @@ if ($user->rights->projet->all->creer || $user->rights->projet->creer) { } } -$linktocreatetask = dolGetButtonTitle($langs->trans('AddTask'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/projet/tasks.php?id='.$object->id.'&action=create'.$param.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$object->id), '', $linktocreatetaskUserRight, $linktocreatetaskParam ); +$linktocreatetask = dolGetButtonTitle($langs->trans('AddTask'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/projet/tasks.php?id='.$object->id.'&action=create'.$param.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$object->id), '', $linktocreatetaskUserRight, $linktocreatetaskParam); $linktolist = dolGetButtonTitle($langs->trans('GoToListOfTasks'), '', 'fa fa-tasks', DOL_URL_ROOT.'/projet/tasks.php?id='.$object->id); diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index f7278a7b296..c7053bc7079 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -653,7 +653,7 @@ elseif ($id > 0 || ! empty($ref)) } } - $linktocreatetask = dolGetButtonTitle($langs->trans('AddTask'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/projet/tasks.php?id='.$object->id.'&action=create'.$param.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$object->id), '', $linktocreatetaskUserRight, $linktocreatetaskParam ); + $linktocreatetask = dolGetButtonTitle($langs->trans('AddTask'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/projet/tasks.php?id='.$object->id.'&action=create'.$param.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$object->id), '', $linktocreatetaskUserRight, $linktocreatetaskParam); print ''; diff --git a/htdocs/societe/website.php b/htdocs/societe/website.php index 7e5dded1375..3b2db772034 100644 --- a/htdocs/societe/website.php +++ b/htdocs/societe/website.php @@ -226,7 +226,7 @@ if (! empty($conf->website->enabled)) { if (! empty($user->rights->societe->lire)) { $morehtmlright.= dolGetButtonTitle($langs->trans("AddWebsiteAccount"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/website/websiteaccount_card.php?action=create&fk_soc='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id)); } else { - $morehtmlright.= dolGetButtonTitle($langs->trans("AddAction"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/website/websiteaccount_card.php?action=create&fk_soc='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id),'',0); + $morehtmlright.= dolGetButtonTitle($langs->trans("AddAction"), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/website/websiteaccount_card.php?action=create&fk_soc='.$object->id.'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id), '', 0); } } diff --git a/htdocs/theme/eldy/btn.inc.php b/htdocs/theme/eldy/btn.inc.php index c3bd2c490f4..927c92c5f41 100644 --- a/htdocs/theme/eldy/btn.inc.php +++ b/htdocs/theme/eldy/btn.inc.php @@ -216,4 +216,4 @@ TITLE BUTTON .butActionRefused, .butActionNewRefused, .btnTitle.refused { display: none !important; } - \ No newline at end of file + Date: Mon, 13 May 2019 09:47:58 +0200 Subject: [PATCH 0397/1036] Fix responsive of help center --- htdocs/support/default.css | 27 ++++++++++++++++++++------- htdocs/support/inc.php | 1 + htdocs/support/index.php | 6 +++--- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/htdocs/support/default.css b/htdocs/support/default.css index 6737a6ede00..63fe087330f 100644 --- a/htdocs/support/default.css +++ b/htdocs/support/default.css @@ -16,11 +16,11 @@ */ body { -font-size:12px; +font-size:14px; font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; background: #f9f9f9; /* background-color: #F4F4F4; */ -margin: 5px 10px; +margin: 5px 5px; } div.titre { @@ -29,7 +29,7 @@ margin: 0 0 0 0; } span.titre { -font-size: 14px; +font-size: 15px; font-weight: bold; background: #FFFFFF; color: #4965B3; @@ -150,13 +150,26 @@ tr.title background: #DDDFDD; } -table { font-size: 12px; } -table.login { border: 1px solid #C0C0C0; background: #FFF; font-size: 12px; } +table.login { border: 1px solid #C0C0C0; background: #FFF; } + +.tablesupport { + padding: 6px; +} + +.blocksupport { + padding: 12px; + /* width: 90%; */ +} +/* Force values for small screen 570 */ +@media only screen and (max-width: 570px) +{ + .blocksupport { + width: 90%; + } +} .inline-block { display:inline-block; vertical-align: top; - margin: 12px; - min-width: 400px; } diff --git a/htdocs/support/inc.php b/htdocs/support/inc.php index 6f386dd4b4b..78c8c1ca30d 100644 --- a/htdocs/support/inc.php +++ b/htdocs/support/inc.php @@ -217,6 +217,7 @@ function pHeader($soutitre, $next, $action = 'none') print ''."\n"; print ''."\n"; print ''."\n"; + print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; diff --git a/htdocs/support/index.php b/htdocs/support/index.php index c5f0494eb59..5344cdb76f1 100644 --- a/htdocs/support/index.php +++ b/htdocs/support/index.php @@ -60,7 +60,7 @@ $style1='color: #333344; font-size: 16px; font-weight: bold'; $style2='color: #5D4455; font-weight: bold;'; print "\n"; -print '
'; +print '
'; print "\n"; // Forum/wiki support @@ -103,7 +103,7 @@ print ''; print ''."\n"; print "\n"; -print '
'; +print '
'; // EMail support print ''; @@ -135,7 +135,7 @@ print ''; print ''."\n"; -print '
'; +print '
'; // Other support From ec8b6401825b4bb1f361c01a1fc6cf1ed257bf4c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 10:22:26 +0200 Subject: [PATCH 0398/1036] Fix remove non existing status --- htdocs/cron/list.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index 1f10f333644..e84cddfaa10 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -2,7 +2,7 @@ /* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr * Copyright (C) 2013 Florian Henry * Copyright (C) 2013-2016 Laurent Destailleur - * Copyright (C) 2019 Frédéric France + * Copyright (C) 2019 Frédéric France * * 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 @@ -299,11 +299,11 @@ $num = $db->num_rows($result); $arrayofselected=is_array($toselect)?$toselect:array(); $param = ''; -if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; -if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; -if ($search_status) $param.='&search_status='.$search_status; -if ($search_label) $param.='&search_label='.$search_label; -if ($optioncss != '') $param.='&optioncss='.$optioncss; +if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); +if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); +if ($search_status) $param.='&search_status='.urlencode($search_status); +if ($search_label) $param.='&search_label='.urlencode($search_label); +if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); // Add $param from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; @@ -393,7 +393,7 @@ print ' '; print ' '; print ' '; print ''; -print $form->selectarray('search_status', array('0'=>$langs->trans("Disabled"), '1'=>$langs->trans("Enabled"), '-2'=>$langs->trans("EnabledAndDisabled"), '2'=>$langs->trans("Archived")), $search_status, 1); +print $form->selectarray('search_status', array('0'=>$langs->trans("Disabled"), '1'=>$langs->trans("Enabled"), '-2'=>$langs->trans("EnabledAndDisabled")), $search_status, 1); print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; From 39c9efbc51e7d6b152ea0d83c21bdb8bef686de3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 10:23:09 +0200 Subject: [PATCH 0399/1036] Fix remove non existing status --- htdocs/cron/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index e84cddfaa10..c6c2d8e154a 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -393,7 +393,7 @@ print ' '; print ' '; print ' '; print ''; -print $form->selectarray('search_status', array('0'=>$langs->trans("Disabled"), '1'=>$langs->trans("Enabled"), '-2'=>$langs->trans("EnabledAndDisabled")), $search_status, 1); +print $form->selectarray('search_status', array('0'=>$langs->trans("Disabled"), '1'=>$langs->trans("Enabled")), $search_status, 1); print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; From f0cdaff9369ba4c8f8edbddcd698bd251e9cbcc4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 10:26:30 +0200 Subject: [PATCH 0400/1036] Fix status of crons --- htdocs/core/modules/modCron.class.php | 2 +- htdocs/cron/card.php | 6 +++--- htdocs/cron/info.php | 2 +- htdocs/cron/list.php | 2 -- htdocs/modulebuilder/index.php | 2 +- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/htdocs/core/modules/modCron.class.php b/htdocs/core/modules/modCron.class.php index f07ddeaeaae..ad516e9a787 100644 --- a/htdocs/core/modules/modCron.class.php +++ b/htdocs/core/modules/modCron.class.php @@ -134,7 +134,7 @@ class modCron extends DolibarrModules $this->menu[$r] = array('fk_menu'=>'fk_mainmenu=home,fk_leftmenu=admintools', // 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'=>'CronList', - 'url'=>'/cron/list.php?status=-2&leftmenu=admintools', + 'url'=>'/cron/list.php?leftmenu=admintools', 'langs'=>'cron', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. 'position'=>200, 'enabled'=>'$conf->cron->enabled && preg_match(\'/^(admintools|all)/\', $leftmenu)', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. diff --git a/htdocs/cron/card.php b/htdocs/cron/card.php index 0eca0189ab4..fa1e923fd64 100644 --- a/htdocs/cron/card.php +++ b/htdocs/cron/card.php @@ -75,7 +75,7 @@ if (!empty($cancel)) } else { - header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-2'); + header("Location: ".DOL_URL_ROOT.'/cron/list.php'); exit; } } @@ -93,7 +93,7 @@ if ($action == 'confirm_delete' && $confirm == "yes" && $user->rights->cron->del } else { - Header("Location: ".DOL_URL_ROOT.'/cron/list.php?status=-2'); + Header("Location: ".DOL_URL_ROOT.'/cron/list.php'); exit; } } @@ -557,7 +557,7 @@ else dol_fiche_head($head, 'card', $langs->trans("CronTask"), -1, 'cron'); - $linkback = '' . $langs->trans("BackToList") . ''; + $linkback = '' . $langs->trans("BackToList") . ''; $morehtmlref='
'; $morehtmlref.='
'; diff --git a/htdocs/cron/info.php b/htdocs/cron/info.php index e6c7a0ae7fc..bb00d26dc90 100644 --- a/htdocs/cron/info.php +++ b/htdocs/cron/info.php @@ -50,7 +50,7 @@ $head = cron_prepare_head($object); dol_fiche_head($head, 'info', $langs->trans("CronTask"), -1, 'cron'); -$linkback = '' . $langs->trans("BackToList") . ''; +$linkback = '' . $langs->trans("BackToList") . ''; $morehtmlref='
'; $morehtmlref.='
'; diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index c6c2d8e154a..de321443a6c 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -56,7 +56,6 @@ if (! $sortfield) $sortfield='t.status,t.priority'; if (! $sortorder) $sortorder='DESC,ASC'; $search_status=GETPOST('search_status', 'int')?GETPOST('search_status', 'int'):GETPOST('status', 'int'); -if ($search_status == '') $search_status=-2; //Search criteria $search_label=GETPOST("search_label", 'alpha'); @@ -253,7 +252,6 @@ $sql.= " t.test"; $sql.= " FROM ".MAIN_DB_PREFIX."cronjob as t"; $sql.= " WHERE entity IN (0,".$conf->entity.")"; if ($search_status >= 0 && $search_status < 2) $sql.= " AND t.status = ".(empty($search_status)?'0':'1'); -if ($search_status == 2) $sql.= " AND t.status = 2"; //Manage filter if (is_array($filter) && count($filter)>0) { foreach($filter as $key => $value) { diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 0ad297221be..21fb23f017c 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -2737,7 +2737,7 @@ elseif (! empty($module)) if ($action != 'editfile' || empty($file)) { - print ''.$langs->trans("CronJobDefDesc", ''.$langs->transnoentities('CronList').'').'
'; + print ''.$langs->trans("CronJobDefDesc", ''.$langs->transnoentities('CronList').'').'
'; print '
'; print ' '.$langs->trans("DescriptorFile").' : '.$pathtofile.''; From c67d79a4e2ece3a0b87b752c05577629d3aacec1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 12:00:13 +0200 Subject: [PATCH 0401/1036] Update files.lib.php --- htdocs/core/lib/files.lib.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 8a1fecd999a..3e7e2796eca 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1556,6 +1556,8 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio $destfull = $info['dirname'].'/'.dol_sanitizeFileName($info['filename'].'.'.strtolower($info['extension'])); $info = pathinfo($destfile); $destfile = dol_sanitizeFileName($info['filename'].'.'.strtolower($info['extension'])); + // We apply dol_string_nohtmltag also to clean file names (this remove duplicate spaces) because + // this function is also applied when we make try to download file (by the GETPOST(filename, 'alphanohtml') call). $destfile = dol_string_nohtmltag($destfile); $destfull = dol_string_nohtmltag($destfull); $resupload = dol_move_uploaded_file($TFile['tmp_name'][$i], $destfull, $allowoverwrite, 0, $TFile['error'][$i], 0, $varfiles); From 644f247910b7c9fbd24e370ec4fb2a942c760be4 Mon Sep 17 00:00:00 2001 From: atm-greg Date: Mon, 13 May 2019 12:02:46 +0200 Subject: [PATCH 0402/1036] fix useless calculation --- htdocs/core/class/html.formmargin.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formmargin.class.php b/htdocs/core/class/html.formmargin.class.php index da8acce83d4..72352bc5bdb 100644 --- a/htdocs/core/class/html.formmargin.class.php +++ b/htdocs/core/class/html.formmargin.class.php @@ -91,7 +91,7 @@ class FormMargin $line->pa_ht = $line->subprice * (1 - ($line->remise_percent / 100)); } - $pv = $line->qty * $line->subprice * (1 - $line->remise_percent / 100); + $pv = $line->total_ht; $pa_ht = ($pv < 0 ? - $line->pa_ht : $line->pa_ht); // We choosed to have line->pa_ht always positive in database, so we guess the correct sign $pa = $line->qty * $pa_ht; From f576d441bccff4f151e7ce4f9039efb57c6bbba2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 19:53:04 +0200 Subject: [PATCH 0403/1036] FIX #11171 Upgrade Mobile_Detect. This --- COPYRIGHT | 2 +- .../mobiledetect/mobiledetectlib/.gitignore | 11 - .../mobiledetect/mobiledetectlib/.php_cs | 24 - .../mobiledetect/mobiledetectlib/.travis.yml | 17 - .../mobiledetectlib/Mobile_Detect.json | 2 +- .../mobiledetectlib/Mobile_Detect.php | 159 +- .../mobiledetect/mobiledetectlib/README.md | 479 +- .../mobiledetectlib/composer.json | 7 +- .../mobiledetectlib/composer.lock | 983 ++ .../mobiledetectlib/examples/demo.php | 272 - .../examples/session_example.php | 146 - .../mobiledetectlib/examples/test.php | 29 - .../mobiledetectlib/export/exportToJSON.php | 67 +- .../namespaced/Detection/MobileDetect.php | 2 +- .../mobiledetect/mobiledetectlib/phpcs.xml | 20 + .../mobiledetectlib/tests/BasicsTest.php | 520 -- .../mobiledetectlib/tests/UA_List.inc.php | 27 - .../mobiledetectlib/tests/UA_List.pending.txt | 1242 --- .../mobiledetectlib/tests/UserAgentTest.php | 189 - .../mobiledetectlib/tests/VendorsTest_tmp.php | 88 - .../mobiledetectlib/tests/bootstrap.php | 2 - .../mobiledetectlib/tests/phpunit.xml | 27 - .../tests/providers/vendors/Acer.php | 28 - .../tests/providers/vendors/Alcatel.php | 49 - .../tests/providers/vendors/Allview.php | 11 - .../tests/providers/vendors/Amazon.php | 14 - .../tests/providers/vendors/Apple.php | 27 - .../tests/providers/vendors/Archos.php | 67 - .../tests/providers/vendors/Asus.php | 22 - .../tests/providers/vendors/Blackberry.php | 35 - .../tests/providers/vendors/Dell.php | 13 - .../tests/providers/vendors/Google.php | 18 - .../tests/providers/vendors/HP.php | 21 - .../tests/providers/vendors/HTC.php | 363 - .../tests/providers/vendors/Huawei.php | 17 - .../tests/providers/vendors/LG.php | 35 - .../tests/providers/vendors/Lava.php | 23 - .../tests/providers/vendors/Leader.php | 6 - .../tests/providers/vendors/Lenovo.php | 46 - .../tests/providers/vendors/Mi.php | 22 - .../tests/providers/vendors/Microsoft.php | 30 - .../tests/providers/vendors/Motorola.php | 52 - .../tests/providers/vendors/Nokia.php | 84 - .../tests/providers/vendors/Onda.php | 12 - .../tests/providers/vendors/Others.php | 531 -- .../tests/providers/vendors/Prestigio.php | 12 - .../tests/providers/vendors/Samsung.php | 131 - .../tests/providers/vendors/Sony.php | 85 - .../tests/providers/vendors/SpecialCases.php | 206 - .../tests/providers/vendors/Vodafone.php | 11 - .../tests/providers/vendors/ZTE.php | 6 - .../mobiledetectlib/tests/ualist.json | 8196 ----------------- 52 files changed, 1425 insertions(+), 13063 deletions(-) delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/.gitignore delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/.php_cs delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/composer.lock delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/examples/session_example.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/examples/test.php create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/phpcs.xml delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.pending.txt delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/bootstrap.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/phpunit.xml delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php delete mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json diff --git a/COPYRIGHT b/COPYRIGHT index 510bf5d3b4f..7cebde7c362 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -19,7 +19,7 @@ PHPDebugBar 1.15.0 MIT License Yes Used only by EvalMath 1.0 BSD Yes Safe math expressions evaluation Escpos-php ? MIT License Yes Thermal receipt printer library, for use with ESC/POS compatible printers GeoIP 1.4 LGPL-2.1+ Yes Sample code to make geoip convert (not into deb package) -Mobiledetect 2.8.17 MIT License Yes Detect mobile devices browsers +Mobiledetect 2.8.83 MIT License Yes Detect mobile devices browsers NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package) PEAR Mail_MIME 1.8.9 BSD Yes NuSoap dependency odtPHP 1.0.1 GPL-2+ Yes Library to build/edit ODT files diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore b/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore deleted file mode 100644 index 48b35e71455..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -vendor/ -nbproject/ -/*.buildpath -/*.project -/.settings -/error.log -/export/nicejson -.idea/ -*.iml -/coverage -/phpunit.phar diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/.php_cs b/htdocs/includes/mobiledetect/mobiledetectlib/.php_cs deleted file mode 100644 index 336ef0c87d4..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/.php_cs +++ /dev/null @@ -1,24 +0,0 @@ -notName('LICENSE') - ->notName('README.md') - ->notName('.php_cs') - ->notName('composer.*') - ->notName('phpunit.xml*') - ->notName('*.phar') - ->exclude('vendor') - ->exclude('examples') - ->exclude('Symfony/CS/Tests/Fixer') - ->notName('ElseifFixer.php') - ->exclude('data') - ->in(__DIR__) -; - -return Symfony\CS\Config\Config::create() - ->finder($finder) -; - - diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml b/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml deleted file mode 100644 index 29af5249f0d..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: php -php: - - "5.2" - - "5.3" - - "5.4" - - "5.5" - - "5.6" - -branches: - only: - - devel - -script: - - phpunit -v -c tests/phpunit.xml - -notifications: - email: false diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json index 323b1e2a50a..a4361a9f5e1 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json +++ b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.json @@ -1 +1 @@ -{"version":"2.8.17","headerMatch":{"HTTP_ACCEPT":{"matches":["application\/x-obml2d","application\/vnd.rim.html","text\/vnd.wap.wml","application\/vnd.wap.xhtml+xml"]},"HTTP_X_WAP_PROFILE":null,"HTTP_X_WAP_CLIENTID":null,"HTTP_WAP_CONNECTION":null,"HTTP_PROFILE":null,"HTTP_X_OPERAMINI_PHONE_UA":null,"HTTP_X_NOKIA_GATEWAY_ID":null,"HTTP_X_ORANGE_ID":null,"HTTP_X_VODAFONE_3GPDPCONTEXT":null,"HTTP_X_HUAWEI_USERID":null,"HTTP_UA_OS":null,"HTTP_X_MOBILE_GATEWAY":null,"HTTP_X_ATT_DEVICEID":null,"HTTP_UA_CPU":{"matches":["ARM"]}},"uaHttpHeaders":["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA"],"uaMatch":{"phones":{"iPhone":"\\biPhone\\b|\\biPod\\b","BlackBerry":"BlackBerry|\\bBB10\\b|rim[0-9]+","HTC":"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m","Nexus":"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6","Dell":"Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b","Motorola":"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b","Samsung":"Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205","LG":"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)","Sony":"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533","Asus":"Asus.*Galaxy|PadFone.*Mobile","Micromax":"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b","Palm":"PalmSource|Palm","Vertu":"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature","Pantech":"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790","Fly":"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250","Wiko":"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM","iMobile":"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)","SimValley":"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b","Wolfgang":"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q","Alcatel":"Alcatel","Nintendo":"Nintendo 3DS","Amoi":"Amoi","INQ":"INQ","GenericPhone":"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},"tablets":{"iPad":"iPad|iPad.*Mobile","NexusTablet":"Android.*Nexus[\\s]+(7|9|10)","SamsungTablet":"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T360","Kindle":"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\\b","SurfaceTablet":"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)","HPTablet":"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10","AsusTablet":"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C","BlackBerryTablet":"PlayBook|RIM Tablet","HTCtablet":"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410","MotorolaTablet":"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617","NookTablet":"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2","AcerTablet":"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b","ToshibaTablet":"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO","LGTablet":"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b","FujitsuTablet":"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b","PrestigioTablet":"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002","LenovoTablet":"Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)","DellTablet":"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7","YarvikTablet":"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b","MedionTablet":"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB","ArnovaTablet":"AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2","IntensoTablet":"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004","IRUTablet":"M702pro","MegafonTablet":"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b","EbodaTablet":"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)","AllViewTablet":"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)","ArchosTablet":"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b","AinolTablet":"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark","SonyTablet":"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31","PhilipsTablet":"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b","CubeTablet":"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT","CobyTablet":"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010","MIDTablet":"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733","MSITablet":"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b","SMiTTablet":"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)","RockChipTablet":"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A","FlyTablet":"IQ310|Fly Vision","bqTablet":"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus","HuaweiTablet":"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim","NecTablet":"\\bN-06D|\\bN-08D","PantechTablet":"Pantech.*P4100","BronchoTablet":"Broncho.*(N701|N708|N802|a710)","VersusTablet":"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b","ZyncTablet":"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900","PositivoTablet":"TB07STA|TB10STA|TB07FTA|TB10FTA","NabiTablet":"Android.*\\bNabi","KoboTablet":"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build","DanewTablet":"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b","TexetTablet":"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE","PlaystationTablet":"Playstation.*(Portable|Vita)","TrekstorTablet":"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab","PyleAudioTablet":"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b","AdvanTablet":"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ","DanyTechTablet":"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1","GalapadTablet":"Android.*\\bG1\\b","MicromaxTablet":"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b","KarbonnTablet":"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b","AllFineTablet":"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide","PROSCANTablet":"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b","YONESTablet":"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026","ChangJiaTablet":"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503","GUTablet":"TX-A1301|TX-M9002|Q702|kf026","PointOfViewTablet":"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10","OvermaxTablet":"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)","HCLTablet":"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync","DPSTablet":"DPS Dream 9|DPS Dual 7","VistureTablet":"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10","CrestaTablet":"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989","MediatekTablet":"\\bMT8125|MT8389|MT8135|MT8377\\b","ConcordeTablet":"Concorde([ ]+)?Tab|ConCorde ReadMan","GoCleverTablet":"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042","ModecomTablet":"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003","VoninoTablet":"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b","ECSTablet":"V07OT2|TM105A|S10OT1|TR10CS1","StorexTablet":"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab","VodafoneTablet":"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7","EssentielBTablet":"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2","RossMoorTablet":"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711","iMobileTablet":"i-mobile i-note","TolinoTablet":"tolino tab [0-9.]+|tolino shine","AudioSonicTablet":"\\bC-22Q|T7-QC|T-17B|T-17P\\b","AMPETablet":"Android.* A78 ","SkkTablet":"Android.* (SKYPAD|PHOENIX|CYCLOPS)","TecnoTablet":"TECNO P9","JXDTablet":"Android.*\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b","iJoyTablet":"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)","FX2Tablet":"FX2 PAD7|FX2 PAD10","XoroTablet":"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151","ViewsonicTablet":"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a","OdysTablet":"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10","CaptivaTablet":"CAPTIVA PAD","IconbitTablet":"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S","TeclastTablet":"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi","OndaTablet":"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+","JaytechTablet":"TPC-PA762","BlaupunktTablet":"Endeavour 800NG|Endeavour 1010","DigmaTablet":"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b","EvolioTablet":"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b","LavaTablet":"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b","CelkonTablet":"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b","WolderTablet":"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b","MiTablet":"\\bMI PAD\\b|\\bHM NOTE 1W\\b","NibiruTablet":"Nibiru M1|Nibiru Jupiter One","NexoTablet":"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI","LeaderTablet":"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100","UbislateTablet":"UbiSlate[\\s]?7C","PocketBookTablet":"Pocketbook","Hudl":"Hudl HT7S3","TelstraTablet":"T-Hub2","GenericTablet":"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bJolla\\b|\\bTP750\\b"},"browsers":{"Chrome":"\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?","Dolfin":"\\bDolfin\\b","Opera":"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+","Skyfire":"Skyfire","IE":"IEMobile|MSIEMobile","Firefox":"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile","Bolt":"bolt","TeaShark":"teashark","Blazer":"Blazer","Safari":"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari","Tizen":"Tizen","UCBrowser":"UC.*Browser|UCWEB","baiduboxapp":"baiduboxapp","baidubrowser":"baidubrowser","DiigoBrowser":"DiigoBrowser","Puffin":"Puffin","Mercury":"\\bMercury\\b","ObigoBrowser":"Obigo","NetFront":"NF-Browser","GenericBrowser":"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger"},"os":{"AndroidOS":"Android","BlackBerryOS":"blackberry|\\bBB10\\b|rim tablet os","PalmOS":"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino","SymbianOS":"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b","WindowsMobileOS":"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;","WindowsPhoneOS":"Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;","iOS":"\\biPhone.*Mobile|\\biPod|\\biPad","MeeGoOS":"MeeGo","MaemoOS":"Maemo","JavaOS":"J2ME\/|\\bMIDP\\b|\\bCLDC\\b","webOS":"webOS|hpwOS","badaOS":"\\bBada\\b","BREWOS":"BREW"},"utilities":{"Bot":"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom","MobileBot":"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2","DesktopMode":"WPDesktop","TV":"SonyDTV|HbbTV","WebKit":"(webkit)[ \/]([\\w.]+)","Console":"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b","Watch":"SM-V700"}}} \ No newline at end of file +{"version":"2.8.33","headerMatch":{"HTTP_ACCEPT":{"matches":["application\/x-obml2d","application\/vnd.rim.html","text\/vnd.wap.wml","application\/vnd.wap.xhtml+xml"]},"HTTP_X_WAP_PROFILE":null,"HTTP_X_WAP_CLIENTID":null,"HTTP_WAP_CONNECTION":null,"HTTP_PROFILE":null,"HTTP_X_OPERAMINI_PHONE_UA":null,"HTTP_X_NOKIA_GATEWAY_ID":null,"HTTP_X_ORANGE_ID":null,"HTTP_X_VODAFONE_3GPDPCONTEXT":null,"HTTP_X_HUAWEI_USERID":null,"HTTP_UA_OS":null,"HTTP_X_MOBILE_GATEWAY":null,"HTTP_X_ATT_DEVICEID":null,"HTTP_UA_CPU":{"matches":["ARM"]}},"uaHttpHeaders":["HTTP_USER_AGENT","HTTP_X_OPERAMINI_PHONE_UA","HTTP_X_DEVICE_USER_AGENT","HTTP_X_ORIGINAL_USER_AGENT","HTTP_X_SKYFIRE_PHONE","HTTP_X_BOLT_PHONE_UA","HTTP_DEVICE_STOCK_UA","HTTP_X_UCBROWSER_DEVICE_UA"],"uaMatch":{"phones":{"iPhone":"\\biPhone\\b|\\biPod\\b","BlackBerry":"BlackBerry|\\bBB10\\b|rim[0-9]+","HTC":"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel","Nexus":"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6","Dell":"Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b","Motorola":"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b|XT1068|XT1092|XT1052","Samsung":"\\bSamsung\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F","LG":"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323|M257)","Sony":"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533","Asus":"Asus.*Galaxy|PadFone.*Mobile","NokiaLumia":"Lumia [0-9]{3,4}","Micromax":"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b","Palm":"PalmSource|Palm","Vertu":"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature","Pantech":"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790","Fly":"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250","Wiko":"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM","iMobile":"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)","SimValley":"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b","Wolfgang":"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q","Alcatel":"Alcatel","Nintendo":"Nintendo (3DS|Switch)","Amoi":"Amoi","INQ":"INQ","GenericPhone":"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},"tablets":{"iPad":"iPad|iPad.*Mobile","NexusTablet":"Android.*Nexus[\\s]+(7|9|10)","GoogleTablet":"Android.*Pixel C","SamsungTablet":"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835","Kindle":"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk\/[0-9.]+ like Chrome\/[0-9.]+ (?!Mobile)","SurfaceTablet":"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)","HPTablet":"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10","AsusTablet":"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b|\\bP024\\b|\\bP00C\\b","BlackBerryTablet":"PlayBook|RIM Tablet","HTCtablet":"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410","MotorolaTablet":"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617","NookTablet":"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2","AcerTablet":"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20\\b|\\bA3-A30","ToshibaTablet":"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO","LGTablet":"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b","FujitsuTablet":"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b","PrestigioTablet":"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002","LenovoTablet":"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-X304L|TB-8703F|Tab2A7-10F|TB2-X30L","DellTablet":"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7","YarvikTablet":"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b","MedionTablet":"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB","ArnovaTablet":"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2","IntensoTablet":"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004","IRUTablet":"M702pro","MegafonTablet":"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b","EbodaTablet":"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)","AllViewTablet":"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)","ArchosTablet":"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b","AinolTablet":"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark","NokiaLumiaTablet":"Lumia 2520","SonyTablet":"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|SGP612|SGP712","PhilipsTablet":"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b","CubeTablet":"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT","CobyTablet":"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010","MIDTablet":"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10","MSITablet":"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b","SMiTTablet":"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)","RockChipTablet":"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A","FlyTablet":"IQ310|Fly Vision","bqTablet":"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus","HuaweiTablet":"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09","NecTablet":"\\bN-06D|\\bN-08D","PantechTablet":"Pantech.*P4100","BronchoTablet":"Broncho.*(N701|N708|N802|a710)","VersusTablet":"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b","ZyncTablet":"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900","PositivoTablet":"TB07STA|TB10STA|TB07FTA|TB10FTA","NabiTablet":"Android.*\\bNabi","KoboTablet":"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build","DanewTablet":"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b","TexetTablet":"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE","PlaystationTablet":"Playstation.*(Portable|Vita)","TrekstorTablet":"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab","PyleAudioTablet":"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b","AdvanTablet":"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ","DanyTechTablet":"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1","GalapadTablet":"Android.*\\bG1\\b(?!\\))","MicromaxTablet":"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b","KarbonnTablet":"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b","AllFineTablet":"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide","PROSCANTablet":"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b","YONESTablet":"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026","ChangJiaTablet":"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503","GUTablet":"TX-A1301|TX-M9002|Q702|kf026","PointOfViewTablet":"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10","OvermaxTablet":"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027","HCLTablet":"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync","DPSTablet":"DPS Dream 9|DPS Dual 7","VistureTablet":"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10","CrestaTablet":"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989","MediatekTablet":"\\bMT8125|MT8389|MT8135|MT8377\\b","ConcordeTablet":"Concorde([ ]+)?Tab|ConCorde ReadMan","GoCleverTablet":"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042","ModecomTablet":"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003","VoninoTablet":"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b","ECSTablet":"V07OT2|TM105A|S10OT1|TR10CS1","StorexTablet":"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab","VodafoneTablet":"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497","EssentielBTablet":"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2","RossMoorTablet":"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711","iMobileTablet":"i-mobile i-note","TolinoTablet":"tolino tab [0-9.]+|tolino shine","AudioSonicTablet":"\\bC-22Q|T7-QC|T-17B|T-17P\\b","AMPETablet":"Android.* A78 ","SkkTablet":"Android.* (SKYPAD|PHOENIX|CYCLOPS)","TecnoTablet":"TECNO P9|TECNO DP8D","JXDTablet":"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b","iJoyTablet":"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)","FX2Tablet":"FX2 PAD7|FX2 PAD10","XoroTablet":"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151","ViewsonicTablet":"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a","VerizonTablet":"QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1","OdysTablet":"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10","CaptivaTablet":"CAPTIVA PAD","IconbitTablet":"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S","TeclastTablet":"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi","OndaTablet":"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+|V10 \\b4G\\b","JaytechTablet":"TPC-PA762","BlaupunktTablet":"Endeavour 800NG|Endeavour 1010","DigmaTablet":"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b","EvolioTablet":"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b","LavaTablet":"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b","AocTablet":"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712","MpmanTablet":"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010","CelkonTablet":"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b","WolderTablet":"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b","MediacomTablet":"M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA","MiTablet":"\\bMI PAD\\b|\\bHM NOTE 1W\\b","NibiruTablet":"Nibiru M1|Nibiru Jupiter One","NexoTablet":"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI","LeaderTablet":"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100","UbislateTablet":"UbiSlate[\\s]?7C","PocketBookTablet":"Pocketbook","KocasoTablet":"\\b(TB-1207)\\b","HisenseTablet":"\\b(F5281|E2371)\\b","Hudl":"Hudl HT7S3|Hudl 2","TelstraTablet":"T-Hub2","GenericTablet":"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b|WVT101|TM1088|KT107"},"browsers":{"Chrome":"\\bCrMo\\b|CriOS|Android.*Chrome\/[.0-9]* (Mobile)?","Dolfin":"\\bDolfin\\b","Opera":"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+$|Coast\/[0-9.]+","Skyfire":"Skyfire","Edge":"Mobile Safari\/[.0-9]* Edge","IE":"IEMobile|MSIEMobile","Firefox":"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS","Bolt":"bolt","TeaShark":"teashark","Blazer":"Blazer","Safari":"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari","WeChat":"\\bMicroMessenger\\b","UCBrowser":"UC.*Browser|UCWEB","baiduboxapp":"baiduboxapp","baidubrowser":"baidubrowser","DiigoBrowser":"DiigoBrowser","Puffin":"Puffin","Mercury":"\\bMercury\\b","ObigoBrowser":"Obigo","NetFront":"NF-Browser","GenericBrowser":"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger","PaleMoon":"Android.*PaleMoon|Mobile.*PaleMoon"},"os":{"AndroidOS":"Android","BlackBerryOS":"blackberry|\\bBB10\\b|rim tablet os","PalmOS":"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino","SymbianOS":"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b","WindowsMobileOS":"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;","WindowsPhoneOS":"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;","iOS":"\\biPhone.*Mobile|\\biPod|\\biPad|AppleCoreMedia","MeeGoOS":"MeeGo","MaemoOS":"Maemo","JavaOS":"J2ME\/|\\bMIDP\\b|\\bCLDC\\b","webOS":"webOS|hpwOS","badaOS":"\\bBada\\b","BREWOS":"BREW"},"utilities":{"Bot":"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom","MobileBot":"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\/M1A1-R2D2","DesktopMode":"WPDesktop","TV":"SonyDTV|HbbTV","WebKit":"(webkit)[ \/]([\\w.]+)","Console":"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|Nintendo Switch|PLAYSTATION|Xbox)\\b","Watch":"SM-V700"}}} \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php index fe55d7fedc9..c65b3812f56 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php @@ -1,30 +1,25 @@ - * Nick Ilyin + * Homepage: http://mobiledetect.net + * GitHub: https://github.com/serbanghita/Mobile-Detect + * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md + * CONTRIBUTING: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/CONTRIBUTING.md + * KNOWN LIMITATIONS: https://github.com/serbanghita/Mobile-Detect/blob/master/docs/KNOWN_LIMITATIONS.md + * EXAMPLES: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples * - * Original author: Victor Stanciu + * @license https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt MIT License + * @author Serban Ghita + * @author Nick Ilyin + * Original author: Victor Stanciu * - * @license Code and contributions have 'MIT License' - * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt - * - * @link Homepage: http://mobiledetect.net - * GitHub Repo: https://github.com/serbanghita/Mobile-Detect - * Google Code: http://code.google.com/p/php-mobile-detect/ - * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md - * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples - * - * @version 2.8.17 + * @version 2.8.33 */ - class Mobile_Detect { /** @@ -66,7 +61,7 @@ class Mobile_Detect /** * Stores the version number of the current release. */ - const VERSION = '2.8.17'; + const VERSION = '2.8.33'; /** * A type for the version() method indicating a string return value. @@ -112,6 +107,7 @@ class Mobile_Detect /** * The matches extracted from the regex expression. * This is good for debug. + * * @var string */ protected $matchesArray = null; @@ -169,15 +165,16 @@ class Mobile_Detect protected static $phoneDevices = array( 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', - 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', + 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel', 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', // @todo: Is 'Dell Streak' a tablet or a phone? ;) - 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', - 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b', - 'Samsung' => 'Samsung|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205', - 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', + 'Dell' => 'Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', + 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b|XT1068|XT1092|XT1052', + 'Samsung' => '\bSamsung\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F', + 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323|M257)', 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', + 'NokiaLumia' => 'Lumia [0-9]{3,4}', // http://www.micromaxinfo.com/mobiles/smartphones // Added because the codes might conflict with Acer Tablets. 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', @@ -190,7 +187,7 @@ class Mobile_Detect // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', // http://fr.wikomobile.com - 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', + 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', // Added simvalley mobile just for fun. They have some interesting devices. // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html @@ -199,7 +196,7 @@ class Mobile_Detect // http://www.wolfgangmobile.com/ 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', 'Alcatel' => 'Alcatel', - 'Nintendo' => 'Nintendo 3DS', + 'Nintendo' => 'Nintendo (3DS|Switch)', // http://en.wikipedia.org/wiki/Amoi 'Amoi' => 'Amoi', // http://en.wikipedia.org/wiki/INQ @@ -218,10 +215,13 @@ class Mobile_Detect 'iPad' => 'iPad|iPad.*Mobile', // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$ // @see #442 - 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', - 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T360', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. + // @todo Merge NexusTablet into GoogleTablet. + 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', + // https://en.wikipedia.org/wiki/Pixel_C + 'GoogleTablet' => 'Android.*Pixel C', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html - 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b', + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)', // Only the Surface tablets with Windows RT are considered mobile. // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', @@ -229,7 +229,7 @@ class Mobile_Detect 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', // Watch out for PadFone, see #132. // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ - 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K017 |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C', + 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b|\bP024\b|\bP00C\b', 'BlackBerryTablet' => 'PlayBook|RIM Tablet', 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', @@ -239,7 +239,7 @@ class Mobile_Detect // http://us.acer.com/ac/en/US/content/group/tablets // http://www.acer.de/ac/de/DE/content/models/tablets/ // Can conflict with Micromax and Motorola phones codes. - 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b', + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30', // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ // http://us.toshiba.com/tablets/tablet-finder // http://www.toshiba.co.jp/regza/tablet/ @@ -251,13 +251,13 @@ class Mobile_Detect // Prestigio Tablets http://www.prestigio.com/support 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', // http://support.lenovo.com/en_GB/downloads/default.page?# - 'LenovoTablet' => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', + 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-X304L|TB-8703F|Tab2A7-10F|TB2-X30L', // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', // http://www.yarvik.com/en/matrix/tablets/ 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', - 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', + 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', // http://www.intenso.de/kategorie_en.php?kategorie=33 // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', @@ -269,13 +269,15 @@ class Mobile_Detect // http://www.allview.ro/produse/droseries/lista-tablete-pc/ 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', // http://wiki.archosfans.com/index.php?title=Main_Page - 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', + // @note Rewrite the regex format after we add more UAs. + 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', // http://www.ainol.com/plugin.php?identifier=ainol&module=product 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', + 'NokiaLumiaTablet' => 'Lumia 2520', // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser // http://www.sony.jp/support/tablet/ - 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31', + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|SGP612|SGP712', // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', // db + http://www.cube-tablet.com/buy-products.html @@ -283,7 +285,7 @@ class Mobile_Detect // http://www.cobyusa.com/?p=pcat&pcat_id=3001 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', // http://www.match.net.cn/products.asp - 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', + 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10', // http://www.msi.com/support // @todo Research the Windows Tablets. 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', @@ -299,10 +301,10 @@ class Mobile_Detect // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ 'FlyTablet' => 'IQ310|Fly Vision', // http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris E10)|Maxwell.*Lite|Maxwell.*Plus', + 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus', // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) - 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', + 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09', // Nec or Medias Tab 'NecTablet' => '\bN-06D|\bN-08D', // Pantech Tablets: http://www.pantechusa.com/phones/ @@ -334,7 +336,7 @@ class Mobile_Detect // http://www.danytech.com/category/tablet-pc 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', // http://www.galapad.net/product.html - 'GalapadTablet' => 'Android.*\bG1\b', + 'GalapadTablet' => 'Android.*\bG1\b(?!\))', // http://www.micromaxinfo.com/tablet/funbook 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', // http://www.karbonnmobiles.com/products_tablet.php @@ -358,7 +360,7 @@ class Mobile_Detect 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ // @todo: add more tests. - 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', + 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027', // http://hclmetablet.com/India/index.php 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html @@ -383,7 +385,7 @@ class Mobile_Detect // @note: no need to add all the tablet codes since they are guided by the first regex. 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', // Generic Vodafone tablets. - 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7', + 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497', // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb // Aka: http://www.essentielb.fr/ 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', @@ -402,9 +404,9 @@ class Mobile_Detect // Skk Mobile - http://skkmobile.com.ph/product_tablets.php 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 - 'TecnoTablet' => 'TECNO P9', + 'TecnoTablet' => 'TECNO P9|TECNO DP8D', // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 - 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', + 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', // http://www.intracon.eu/tablet @@ -414,6 +416,8 @@ class Mobile_Detect 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', // http://www1.viewsonic.com/products/computing/tablets/ 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', + // https://www.verizonwireless.com/tablets/verizon/ + 'VerizonTablet' => 'QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1', // http://www.odys.de/web/internet-tablet_en.html 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', // http://www.captiva-power.de/products.html#tablets-en @@ -423,7 +427,7 @@ class Mobile_Detect // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price - 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+', + 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+|V10 \b4G\b', 'JaytechTablet' => 'TPC-PA762', 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', // http://www.digma.ru/support/download/ @@ -435,15 +439,21 @@ class Mobile_Detect 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', // @todo http://www.lavamobiles.com/tablets-data-cards 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', + // http://www.breezetablet.com/ + 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712', + // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/ + 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010', // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', + 'MediacomTablet' => 'M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA', // http://www.mi.com/en 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', // http://www.nbru.cn/index.html 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', // http://navroad.com/products/produkty/tablety/ + // http://navroad.com/products/produkty/tablety/ 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', // http://leader-online.com/new_site/product-category/tablets/ // http://www.leader-online.net.au/List/Tablet @@ -452,11 +462,15 @@ class Mobile_Detect 'UbislateTablet' => 'UbiSlate[\s]?7C', // http://www.pocketbook-int.com/ru/support 'PocketBookTablet' => 'Pocketbook', + // http://www.kocaso.com/product_tablet.html + 'KocasoTablet' => '\b(TB-1207)\b', + // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm + 'HisenseTablet' => '\b(F5281|E2371)\b', // http://www.tesco.com/direct/hudl/ - 'Hudl' => 'Hudl HT7S3', + 'Hudl' => 'Hudl HT7S3|Hudl 2', // http://www.telstra.com.au/home-phone/thub-2/ 'TelstraTablet' => 'T-Hub2', - 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b|\bTP750\b' + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b|WVT101|TM1088|KT107' ); /** @@ -475,8 +489,9 @@ class Mobile_Detect // http://wifeng.cn/?r=blog&a=view&id=106 // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx // http://msdn.microsoft.com/library/ms537503.aspx - 'WindowsPhoneOS' => 'Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', - 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', + // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx + 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', + 'iOS' => '\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia', // http://en.wikipedia.org/wiki/MeeGo // @todo: research MeeGo in UAs 'MeeGoOS' => 'MeeGo', @@ -492,16 +507,23 @@ class Mobile_Detect /** * List of mobile User Agents. * + * IMPORTANT: This is a list of only mobile browsers. + * Mobile Detect 2.x supports only mobile browsers, + * it was never designed to detect all browsers. + * The change will come in 2017 in the 3.x release for PHP7. + * * @var array */ protected static $browsers = array( + //'Vivaldi' => 'Vivaldi', // @reference: https://developers.google.com/chrome/mobile/docs/user-agent 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', 'Dolfin' => '\bDolfin\b', - 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', + 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+$|Coast/[0-9.]+', 'Skyfire' => 'Skyfire', + 'Edge' => 'Mobile Safari/[.0-9]* Edge', 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ - 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', + 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', 'Bolt' => 'bolt', 'TeaShark' => 'teashark', 'Blazer' => 'Blazer', @@ -509,7 +531,8 @@ class Mobile_Detect 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', // http://en.wikipedia.org/wiki/Midori_(web_browser) //'Midori' => 'midori', - 'Tizen' => 'Tizen', + //'Tizen' => 'Tizen', + 'WeChat' => '\bMicroMessenger\b', 'UCBrowser' => 'UC.*Browser|UCWEB', 'baiduboxapp' => 'baiduboxapp', 'baidubrowser' => 'baidubrowser', @@ -526,6 +549,8 @@ class Mobile_Detect // @reference: http://en.wikipedia.org/wiki/Minimo // http://en.wikipedia.org/wiki/Vision_Mobile_Browser 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', + // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser) + 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon', ); /** @@ -538,13 +563,13 @@ class Mobile_Detect // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 // https://developers.facebook.com/docs/sharing/best-practices - 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', + 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', 'DesktopMode' => 'WPDesktop', 'TV' => 'SonyDTV|HbbTV', // experimental 'WebKit' => '(webkit)[ /]([\w.]+)', // @todo: Include JXD consoles. - 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', + 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|Nintendo Switch|PLAYSTATION|Xbox)\b', 'Watch' => 'SM-V700', ); @@ -593,11 +618,12 @@ class Mobile_Detect 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), 'Coast' => array('Coast/[VER]'), 'Dolfin' => 'Dolfin/[VER]', - // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference - 'Firefox' => 'Firefox/[VER]', + // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox + 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'), 'Fennec' => 'Fennec/[VER]', // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx + 'Edge' => 'Edge/[VER]', 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), // http://en.wikipedia.org/wiki/NetFront 'NetFront' => 'NetFront/[VER]', @@ -605,11 +631,12 @@ class Mobile_Detect 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), 'Opera Mini' => 'Opera Mini/[VER]', 'Opera Mobi' => 'Version/[VER]', - 'UC Browser' => 'UC Browser[VER]', + 'UCBrowser' => array( 'UCWEB[VER]', 'UC.*Browser/[VER]' ), 'MQQBrowser' => 'MQQBrowser/[VER]', 'MicroMessenger' => 'MicroMessenger/[VER]', 'baiduboxapp' => 'baiduboxapp/[VER]', 'baidubrowser' => 'baidubrowser/[VER]', + 'SamsungBrowser' => 'SamsungBrowser/[VER]', 'Iron' => 'Iron/[VER]', // @note: Safari 7534.48.3 is actually Version 5.1. // @note: On BlackBerry the Version is overwriten by the OS. @@ -617,11 +644,13 @@ class Mobile_Detect 'Skyfire' => 'Skyfire/[VER]', 'Tizen' => 'Tizen/[VER]', 'Webkit' => 'webkit[ /][VER]', + 'PaleMoon' => 'PaleMoon/[VER]', // Engine 'Gecko' => 'Gecko/[VER]', 'Trident' => 'Trident/[VER]', 'Presto' => 'Presto/[VER]', + 'Goanna' => 'Goanna/[VER]', // OS 'iOS' => ' \bi?OS\b [VER][ ;]{1}', @@ -673,7 +702,7 @@ class Mobile_Detect * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. * * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract - * the headers. The default null is left for backwards compatibilty. + * the headers. The default null is left for backwards compatibility. */ public function setHttpHeaders($httpHeaders = null) { @@ -754,11 +783,11 @@ class Mobile_Detect return self::$uaHttpHeaders; } - + /** * Set CloudFront headers * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device - * + * * @param array $cfHeaders List of HTTP headers * * @return boolean If there were CloudFront headers to be set @@ -795,6 +824,16 @@ class Mobile_Detect return $this->cloudfrontHeaders; } + /** + * @param string $userAgent + * @return string + */ + private function prepareUserAgent($userAgent) { + $userAgent = trim($userAgent); + $userAgent = substr($userAgent, 0, 500); + return $userAgent; + } + /** * Set the User-Agent to be used. * @@ -808,7 +847,7 @@ class Mobile_Detect $this->cache = array(); if (false === empty($userAgent)) { - return $this->userAgent = $userAgent; + return $this->userAgent = $this->prepareUserAgent($userAgent); } else { $this->userAgent = null; foreach ($this->getUaHttpHeaders() as $altHeader) { @@ -818,7 +857,7 @@ class Mobile_Detect } if (!empty($this->userAgent)) { - return $this->userAgent = trim($this->userAgent); + return $this->userAgent = $this->prepareUserAgent($this->userAgent); } } @@ -1075,7 +1114,7 @@ class Mobile_Detect /** * Search for a certain key in the rules array. - * If the key is found the try to match the corresponding + * If the key is found then try to match the corresponding * regex against the User-Agent. * * @param string $key diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/README.md b/htdocs/includes/mobiledetect/mobiledetectlib/README.md index d96db2dea3d..310d9f3661d 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/README.md +++ b/htdocs/includes/mobiledetect/mobiledetectlib/README.md @@ -1,45 +1,63 @@ -[![Build Status](https://travis-ci.org/serbanghita/Mobile-Detect.svg?branch=devel)](https://travis-ci.org/serbanghita/Mobile-Detect) [![Latest Stable Version](https://poser.pugx.org/mobiledetect/mobiledetectlib/v/stable.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![Total Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/downloads.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![Daily Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/d/daily.png)](https://packagist.org/packages/mobiledetect/mobiledetectlib) [![License](https://poser.pugx.org/mobiledetect/mobiledetectlib/license.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) -[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/serbanghita/Mobile-Detect?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - ![Mobile Detect](http://demo.mobiledetect.net/logo-github.png) -> Motto: "Every business should have a mobile detection script to detect mobile readers." +> Motto: "Every business should have a detection script to detect mobile readers." -*Mobile_Detect is a lightweight PHP class for detecting mobile devices (including tablets). -It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.* +[![Build Status](https://travis-ci.org/serbanghita/Mobile-Detect.svg?branch=devel)](https://travis-ci.org/serbanghita/Mobile-Detect) +[![Latest Stable Version](https://poser.pugx.org/mobiledetect/mobiledetectlib/v/stable.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![Total Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/downloads.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![Daily Downloads](https://poser.pugx.org/mobiledetect/mobiledetectlib/d/daily.png)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![License](https://poser.pugx.org/mobiledetect/mobiledetectlib/license.svg)](https://packagist.org/packages/mobiledetect/mobiledetectlib) +[![Chat on Slack](https://img.shields.io/badge/Slack%20%23general-join-orange.svg)](https://join.slack.com/t/mobiledetect/shared_invite/enQtMjg1NDY0OTg5NzgzLTcwMzEzMWJjZjRlOWFkY2ZiNzE1ZmRmNzEwM2VhOGY5OGVkYWMxNjdkZDU5YjQ5MmM5MGUxYjhlZDQwOGVjZjE) + +#### About + +Mobile Detect is a lightweight PHP class for detecting mobile devices (including tablets). +It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment. + +*Why* + +Your website's _content strategy_ is important! You need a complete toolkit to deliver an experience that is _optimized_, +_fast_ and _relevant_ to your users. Mobile Detect class is a +[server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool that can help you with your RWD strategy, +it is not a replacement for CSS3 media queries or other forms of client-side feature detection. + +*How* We're committed to make Mobile_Detect the best open-source mobile detection resource and this is why before -each release we're running [unit tests](./tests), we also research and update the detection rules on **daily** -and **weekly** basis. +each release we're running [unit tests](./tests) and research and update the detection rules on **monthly** basis. -Your website's _content strategy_ is important! You need a complete toolkit to deliver an experience that is _optimized_, _fast_ and _relevant_ to your users. Mobile_Detect class is a [server-side detection](http://www.w3.org/TR/mwabp/#bp-devcap-detection) tool that can help you with your RWD strategy, it is not a replacement for CSS3 media queries or other forms of client-side feature detection. +*Who* -##### This month updates +See [the history](./docs/HISTORY.md) of the project. -**THANK YOU** for your continuous support and feedback! +#### Announcements -Still working on `3.0.0` branch to provide you with device detection! We're really excited on this one! -We would like to speed this up, but life and family gets in the way ;) +* **JetBrains** is sponsoring the project by providing licenses for [PHPStorm](https://www.jetbrains.com/phpstorm/) and +[DataGrip](https://www.jetbrains.com/datagrip/). +* **Mobile_Detect `2.x.x`** is only integrating new regexes, User-Agents and tests. We are focusing on **new tablets only**. +The rest of the PRs about TVs, bots or optimizations will be closed and analyzed after `3.0.0-beta` is released. +* **Mobile_Detect `3.x.x`** is experimental and WIP. -Special thanks to **JetBrains** for providing licenses for **PHPStorm**. In case you never heard or tried PHPStorm, you're -clearly missing out! [Check PHPStorm](https://www.jetbrains.com/phpstorm/) out! -##### Download and demo +#### Install -|Download|Docs|Examples| -|-------------|-------------|-------------| -|[Go to releases](../../tags)|[Become a contributor](../../wiki/Become-a-contributor)|[Code examples](../../wiki/Code-examples) -|[Mobile_Detect.php](./Mobile_Detect.php)|[History](../../wiki/History)|[:iphone: Live demo!](http://is.gd/mobiletest) -|[Composer package](https://packagist.org/packages/mobiledetect/mobiledetectlib)| +**Download and include manually** +> Use this to quickly test the demo. -#### Continuous updates +* [Download latest release](../../tags) +* [Mobile_Detect.php](./Mobile_Detect.php) -You can use [composer](https://getcomposer.org/doc/00-intro.md) in your release and update process to make sure you have the latest Mobile_Detect version. +```php +require_once "libs/Mobile_Detect.php"; +``` + +**Install as a [composer package](https://packagist.org/packages/mobiledetect/mobiledetectlib)** +> Use this method to get continuous updates. ``` composer require mobiledetect/mobiledetectlib ``` - +or include the dependency in the `composer.json` file: ```json { "require": { @@ -48,208 +66,279 @@ composer require mobiledetect/mobiledetectlib } ``` -##### Help +#### Demo -|Pledgie|Paypal| -|-------|------| -|[Donate :+1:](http://pledgie.com/campaigns/21856)|[Donate :beer:](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mobiledetectlib%40gmail%2ecom&lc=US&item_name=Mobile%20Detect¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)| +* [:iphone: Live demo!](http://is.gd/mobiletest) +* [Code examples](../../wiki/Code-examples) + +#### Contribute + +*Submit a PR* +> Submit a pull request but before make sure you read [how to contribute](../../docs/CONTRIBUTING.md) guide. + +*Donate* + +|Paypal| +|------| +|[Donate :+1:](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=mobiledetectlib%40gmail%2ecom&lc=US&item_name=Mobile%20Detect¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)| I'm currently paying for hosting and spend a lot of my family time to maintain the project and planning the future releases. I would highly appreciate any money donations that will keep the research going. -Special thanks to the community :+1: for donations, [BrowserStack](http://browserstack.com) - for providing access to their great platform, [Zend](http://zend.com) - for donating licenses, [Dragos Gavrila](https://twitter.com/grafician) who contributed with the logo. +Special thanks to the community :+1: for donations, JetBrains team for the continuous support and [Dragos Gavrila](https://twitter.com/grafician) who contributed with the logo. -##### 3rd party modules / [Submit new](../../issues/new?title=New%203rd%20party%20module&body=Name, Link and Description of the module.) +#### Modules, plugins, ports +> [Submit new module, plugin, port](../../issues/new?title=New%203rd%20party%20module&body=Name,%20Link%20and%20Description%20of%20the%20module.) :point_right: Keep `Mobile_Detect.php` class in a separate `module` and do NOT include it in your script core because of the high frequency of updates. :point_right: When including the class into you `web application` or `module` always use `include_once '../path/to/Mobile_Detect.php` to prevent conflicts. - +**JavaScript** - - - - +* mobile-detect.js - A [JavaScript port](https://github.com/hgoebl/mobile-detect.js) of Mobile-Detect class. Made by [Heinrich Goebl](https://github.com/hgoebl). - - - - +* [WP247 Body Classes](https://wordpress.org/plugins/wp247-body-classes/) - Add unique classes to the `body` tag for +easy styling based on various attributes (archive, user, post, mobile) and various WordPress "is" functions. +Mobile attributes include type of device, Operating System, Browser, etc. Examples: .is-mobile, .is-not-mobile, +.is-tablet, .is-ios, .is-not-ios, .is-androidos, .is-chromebrowser. +Made by [wescleveland56](https://github.com/wescleveland56). - - - - +**Drupal** - - - - +* [Drupal Mobile Switch](https://www.drupal.org/project/mobile_switch) - The Mobile Switch Drupal module provides a +automatic theme switch functionality for mobile devices, detected by Browscap or Mobile Detect. +Made by [Siegfried Neumann](https://www.drupal.org/user/45267). - - - - +* [Drupal Context Mobile Detect](https://www.drupal.org/project/context_mobile_detect) - This is a Drupal context module +which integrates Context and PHP Mobile Detect library. +Created by [Artem Shymko](https://www.drupal.org/user/432492). - - - - +* [Drupal Mobile Detect](https://www.drupal.org/project/mobile_detect) - Lightweight mobile detect module for Drupal + created by [Matthew Donadio](https://www.drupal.org/user/325244). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +* [yagendoo Joomla! Mobile Detection Plugin](http://www.yagendoo.com/en/blog/free-mobile-detection-plugin-for-joomla.html) - Lightweight PHP plugin for Joomla! +that detects a mobile browser using the Mobile Detect class. +Made by yagendoo media. - - - - +* [User Agent Detector plugin](https://github.com/renekreijveld/UserAgentDetector) - This system plugin detects the user +agent of your website visitor and sets a session variable accordingly. Based on the user agent, the plugin detects if the +site is running on a desktop pc, tablet or smartphone. It can also detect if the visitor is a spider bot (search engine). +Session variable that is set: `ualayout`. Possible values: desktop, tablet, mobile, bot. +Made by @ReneKreijveld. - - - - +**Magento** - - - - +* [Magento helper](http://www.magentocommerce.com/magento-connect/catalog/product/view/id/16835/) from Optimise Web enables +the use of all functions provided by Mobile Detect. Made by [Kathir Vel](http://www.kathirvel.com). - - - - +* [Magento 2 Mobile Detect Theme Change](https://github.com/EaDesgin/magento2-mobiledetect) is an extension for Magento 2 +that will change the theme or redirect to a different URL. Also containing a helper to check for the device type. - - - - +**PrestaShop** - - - - +* [PrestaShop](https://www.prestashop.com) is a free, secure and open source shopping cart platform. Mobile_Detect +is included in the default package since 1.5.x. - - - - +**Laravel** - - - - +* [Agent](https://github.com/jenssegers/agent) is a user agent class for Laravel based on Mobile Detect with some +additional functionality. +Made by [Jens Segers](https://github.com/jenssegers). - - - - +* [Laravel Mobile Detect](https://github.com/riverskies/laravel-mobile-detect) is a package that enables you to use device detection right in your Laravel Blade templates. (Utilises the well-known, constantly updated PHP mobile detection library.) +Made by [Barnabas Kecskes](https://github.com/barnabaskecskes). -
Varnish Cache -

Varnish Mobile Detect - Drop-in varnish solution to mobile user detection based on the Mobile-Detect library. Made by willemk

-

mobiledetect2vcl - Python script to transform the Mobile Detect JSON database into an UA-based mobile detection VCL subroutine easily integrable in any Varnish Cache configuration. Made by Carlos Abalde

-
WordPress -

WordPress Mobile Detect - Gives you the ability to wrap that infographic in a [notdevice][/notdevice] shortcode so at the server level WordPress will decide to show that content only if the user is NOT on a phone or tablet. Made by Jesse Friedman.

+**Varnish Cache** -

mobble - provides mobile related conditional functions for your site. e.g. is_iphone(), is_mobile() and is_tablet(). Made by Scott Evans.

+* [Varnish Mobile Detect](https://github.com/willemk/varnish-mobiletranslate) - Drop-in varnish solution to mobile user +detection based on the Mobile-Detect library. Made by [willemk](https://github.com/willemk). +* [mobiledetect2vcl](https://github.com/carlosabalde/mobiledetect2vcl) - Python script to transform the Mobile +Detect JSON database into an UA-based mobile detection VCL subroutine easily integrable in any Varnish Cache +configuration. Made by [Carlos Abalde](https://github.com/carlosabalde). -

WordPress Responsage - A small WordPress theme plugin that allows you to make your images responsive. Made by Adrian Ciaschetti.

+**LUA** + +* [mobile-detect.lua](https://github.com/yourpalmark/mobile-detect.lua) is a port of Mobile-Detect to Lua for +NGINX HTTP servers. Follows closely to mobile-detect.js. Supports all methods that server-side +mobile-detect.js supports. Fully unit-tested and synced with Travis CI (Build Passing badge included). +Made by [Mark Walters](https://github.com/yourpalmark). + +**PHP** + +**WordPress** + +* [Mobile Detect for WordPress](https://wordpress.org/plugins/tinywp-mobile-detect/) - WordPress has a built-in function +(`wp_is_mobile()`) to detect mobile devices. There is (at least) one catch, though. It considers iPad (iPad pro, +and any tablet) as a mobile. So, this 3rd party module changes the way `wp_is_mobile()` works with the help of +Mobile Detect PHP library! +Made by [Pothi Kalimuthu](https://github.com/pothi) + +* [WordPress Mobile Detect](https://wordpress.org/plugins/wp-mobile-detect/) - Gives you the ability to wrap that +infographic in a `[notdevice][/notdevice]` shortcode so at the server level WordPress will +decide to show that content only if the user is NOT on a phone or tablet. +Made by [Jesse Friedman](https://profiles.wordpress.org/professor44/). + +* [mobble](https://wordpress.org/plugins/mobble/) - provides mobile related conditional functions for your site. +e.g. `is_iphone()`, `is_mobile()` and `is_tablet()`. Made by Scott Evans. + +* [WordPress Responsage](https://github.com/iamspacehead/responsage) - A small WordPress theme plugin that allows +you to make your images responsive. Made by [Adrian Ciaschetti](https://github.com/iamspacehead). -

WP247 Body Classes - Add unique classes to the body tag for easy styling based on various attributes (archive, user, post, mobile) and various WordPress "is" functions. Mobile attributes include type of device, Operating System, Browser, etc. Examples: .is-mobile, .is-not-mobile, .is-tablet, .is-ios, .is-not-ios, .is-androidos, .is-chromebrowser. Made by wescleveland56

-
Drupal -

Drupal Mobile Switch - The Mobile Switch Drupal module provides a automatic theme switch functionality for mobile devices, - detected by Browscap or Mobile Detect. Made by Siegfried Neumann.

+* [Adaptive Content](https://wordpress.org/plugins/addfunc-adaptive-content/) for WordPress provides the most +intuitive set of shortcodes for including/excluding content on mobile devices, tablets desktops and other +more specific device parameters. This lightweight plugin lets content writers and theme authors choose when +WordPress should or shouldn’t show any give content item using shortcodes and quicktags or theme elements using functions. +Made by [AddFunc](https://profiles.wordpress.org/addfunc). -

Drupal Context Mobile Detect - This is a Drupal context module which integrates Context and PHP Mobile Detect library. - Created by Artem Shymko.

+* [AddFunc Mobile Detect](https://wordpress.org/plugins/addfunc-mobile-detect/) for WordPress redirects +mobile traffic to your mobile website and, basically, gives you loads of control over your mobile redirects. +Made by [AddFunc](https://profiles.wordpress.org/addfunc). -

Drupal Mobile Detect - Lightweight mobile detect module for Drupal created by Matthew Donadio

-
Joomla -

yagendoo Joomla! Mobile Detection Plugin - Lightweight PHP plugin for Joomla! - that detects a mobile browser using the Mobile Detect class. Made by yagendoo media.

- -

User Agent Detector plugin by @ReneKreijveld. This system plugin detects the user agent of your - website visitor and sets a session variable accordingly. Based on the user agent, the plugin detects if the site is running on a desktop pc, tablet or smartphone. - It can also detect if the visitor is a spider bot (search engine). Session variable that is set: ualayout. Possible values: desktop, tablet, mobile, bot..

-
Magento

Magento - This Magento helper from Optimise Web enables the use of all functions provided by MobileDetect.net. - Made by Kathir Vel.

PrestaShop

PrestaShop is a free, secure and open source shopping cart platform. Mobile_Detect is included in the default package since 1.5.x.

Zend Framework -

ZF2 Mobile-Detect - Zend Framework 2 module that provides Mobile-Detect features (Mobile_Detect class as a service, helper for views and plugin controllers). Made by neilime

+**Joomla** -

ZF2 MobileDetectModule - Facilitates integration of a PHP MobileDetect class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, but differs in initialization and provision routine of the actual Mobile_Detect class. Appropriate view helper and controller plugin also have different conceptions. Made by Nikola Posa

-
Symfony

Symfony2 Mobile Detect Bundle - The bundle for detecting mobile devices, manage mobile view and redirect to the mobile and tablet version. - Made by Nikolay Ivlev.

-

Silex Mobile Detect Service Provider - Silex service provider to interact with Mobile detect class methods. Made by Lhassan Baazzi.

-
Laravel -

Laravel-Agent a user agent class for Laravel, based on Mobile Detect with some additional functionality. Made by Jens Segers.

-

BrowserDetect is a browser & mobile detection package, collects and wrap together the best user-agent identifiers for Laravel. Created by Varga Zsolt.

-
ExpressionEngine

EE2 Detect Mobile - Lightweight PHP plugin for EE2 that detects a mobile browser using the Mobile Detect class. Made by Gareth Davies.

Yii Framework -

Yii Extension - Mobile detect plugin for Yii framework. - Made by Alexey Salnikov.

- -

Yii2 Device Detect - Yii2 extension for Mobile-Detect library. Made by Alexander Nestorov

- -
CakePHP

CakePHP MobileDetect - plugin component for CakePHP 2.x. Made by Gregory Gaskill

FuelPHPSpecial Agent is a FuelPHP package which uses php-mobile-detect to determine whether a device is mobile or not. -It overrides the Fuelphp Agent class its methods. Made by Robbie Bardjin.
Typo3px_mobiledetect is an extension that helps to detect visitor's mobile device class (if that’s tablet or mobile device like smartphone). Made by Alexander Tretyak.
Statamic

Statamic CMS Mobile Detect - plugin. Made by Sergei Filippov of Haiku Lab.

Kohana

Kohana Mobile Detect - an example of implementation of Mobile_Detect class with Kohana framework. Written by Luiz Alberto S. Ribeiro.

mobile-detect.js

A JavaScript port of Mobile-Detect class. Made by Heinrich Goebl

Perl

MobileDetect.pm - Perl module for Mobile Detect. Made by Sebastian Enger.

python

pymobiledetect - Mobile detect python package. Made by Bas van Oostveen.

Ruby

mobile_detect.rb - A Ruby gem using the JSON data exposed by the php project and implementing a basic subset of the API (as much as can be done by the exposed data). Made by Karthik T.

GoMobileDetect

GoMobileDetect - Go port of Mobile Detect class. Made by Shaked.

LUA

ua-lua is a small lib written in LUA providing device type detection. ua-lua is detecting mobile or tablet devices based on user-agent inside nginx daemon. Made by Frédéric Robinet.

MemHT

MemHT is a Free PHP CMS and Blog that permit the creation and the management online of websites with few and easy steps. Has the class included in the core.

concrete5

concrete5 is a CMS that is free and open source. The library is included in the core.

engine7

ExEngine 7 PHP Open Source Framework. The Mobile_Detect class is included in the engine.

Zikula

Zikula is a free and open-source Content Management Framework, which allows you to run impressive websites and build powerful online applications. The core uses Mobile-Detect to switch to a special Mobile theme, using jQueryMobile

UserAgentInfo

UserAgentInfo is a PHP class for parsing user agent strings (HTTP_USER_AGENT). Includes mobile checks, bot checks, browser types/versions and more. -Based on browscap, Mobile_Detect and ua-parser. Created for high traffic websites and fast batch processing. Made by quentin389

Craft CMS

LJ Mobile Detect is a simple implementation of Mobile Detect for Craft CMS. Made by Lewis Jenkins

+* [BrowserDetect](https://github.com/hisorange/browser-detect) is a browser and mobile detection package, collects +and wrap together the best user-agent identifiers for Laravel. +Created by [Varga Zsolt](https://github.com/hisorange). + +**Zend Framework** + +* [ZF2 Mobile-Detect](https://github.com/neilime/zf2-mobile-detect.git) is a Zend Framework 2 module that provides +Mobile-Detect features (Mobile_Detect class as a service, helper for views and plugin controllers). +Made by [neilime](https://github.com/neilime). + +* [ZF2 MobileDetectModule](https://github.com/nikolaposa/MobileDetectModule) facilitates integration of a PHP MobileDetect +class with some ZF2-based application. Has similar idea like the existing ZF2 Mobile-Detect module, +but differs in initialization and provision routine of the actual Mobile_Detect class. +Appropriate view helper and controller plugin also have different conceptions. +Made by [Nikola Posa](https://github.com/nikolaposa). + +**Symfony** + +* [Symfony2 Mobile Detect Bundle](https://github.com/suncat2000/MobileDetectBundle) is a bundle for detecting mobile devices, +manage mobile view and redirect to the mobile and tablet version. +Made by [Nikolay Ivlev](https://github.com/suncat2000). + +* [Silex Mobile Detect Service Provider](https://github.com/jbinfo/MobileDetectServiceProvider) is a service provider to +interact with Mobile detect class methods. +Made by [Lhassan Baazzi](https://github.com/jbinfo). + +**Slim Framework** + +* [Slim_Mobile_Detect](https://github.com/zguillez/slim_mobile_detect) implements Mobile_Detect lib for different +responses write on Slim Framework App. + +**ExpressionEngine** + +* [EE2 Detect Mobile](https://github.com/garethtdavies/detect-mobile) is a lightweight PHP plugin for EE2 that detects + a mobile browser using the Mobile Detect class. Made by [Gareth Davies](https://github.com/garethtdavies). + +**Yii Framework** + +* [Yii Extension](https://github.com/iamsalnikov/MobileDetect) - Mobile detect plugin for Yii framework. +Made by [Alexey Salnikov](https://github.com/iamsalnikov). + +* [Yii Extension](https://github.com/candasm/yii1-mobile-detect-component) - Mobile detect component for Yii framework +1.x version which supports composer package manager. Made by [Candas Minareci](https://github.com/candasm). + +* [Yii2 Device Detect](https://github.com/alexandernst/yii2-device-detect/) - Yii2 extension for Mobile-Detect library. +Made by [Alexander Nestorov](https://github.com/alexandernst). + +**CakePHP** + +* [CakePHP MobileDetect](https://github.com/chronon/CakePHP-MobileDetectComponent-Plugin) is a plugin component for +CakePHP 2.x. Made by [Gregory Gaskill](https://github.com/chronon). + +**FuelPHP** + +* [Special Agent](https://github.com/rob-bar/special_agent) is a FuelPHP package which uses php-mobile-detect to +determine whether a device is mobile or not. It overrides the Fuelphp Agent class its methods. +Made by [Robbie Bardjin](https://github.com/rob-bar). + + +**TYPO3** + +* [px_mobiledetect](https://typo3.org/extensions/repository/view/px_mobiledetect) is an extension that helps to detect +visitor's mobile device class (if that’s tablet or mobile device like smartphone). Made by Alexander Tretyak. + +**Other** + +* [PageCache](https://github.com/mmamedov/page-cache) is a lightweight PHP library for full page cache, +with built-in Mobile-Detect support. Made by [Muhammed Mamedov](https://github.com/mmamedov). + +* [Statamic CMS Mobile Detect](https://github.com/haikulab/statamic-mobile-detect) is a plugin. +Made by [Sergei Filippov](https://github.com/haikulab/statamic-mobile-detect) of Haiku Lab. + +* [Kohana Mobile Detect](https://github.com/madeinnordeste/kohana-mobile-detect) is an example of implementation of +Mobile_Detect class with Kohana framework. +Written by [Luiz Alberto S. Ribeiro](https://github.com/madeinnordeste). + +* [MemHT](https://www.memht.com) is a Free PHP CMS and Blog that permit the creation and the management online +of websites with few and easy steps. Has the class included in the core. + +* [concrete5](https://www.concrete5.org) is a CMS that is free and open source. The library is included in the core. + +* [engine7](https://github.com/QOXCorp/exengine) is PHP Open Source Framework. The Mobile_Detect class is included in +the engine. + +* [Zikula](http://zikula.org) is a free and open-source Content Management Framework, which allows you to run +impressive websites and build powerful online applications. The core uses Mobile-Detect to switch to a special +Mobile theme, using jQueryMobile. + +* [UserAgentInfo](https://github.com/quentin389/UserAgentInfo) is a PHP class for parsing user agent strings +(HTTP_USER_AGENT). Includes mobile checks, bot checks, browser types/versions and more. +Based on browscap, Mobile_Detect and ua-parser. Created for high traffic websites and fast batch processing. +Made by [quentin389](https://github.com/quentin389). + +* [LJ Mobile Detect](https://github.com/lewisjenkins/craft-lj-mobiledetect) is a simple implementation of Mobile Detect +for Craft CMS. Made by [Lewis Jenkins](https://github.com/lewisjenkins). + +* [Detect Craft](https://github.com/mmikkel/Detect-Craft) is a Craft CMS wrapper for the Mobile_Detect library. Made by [Mikkel Rummelhoff](https://github.com/mmikkel). + +* [Grav Plugin Mobile Detect](https://github.com/dimitrilongo/grav-plugin-mobile-detect/) is a simple implementation +of Mobile Detect for Grav CMS. Made by [Dimitri Longo](https://github.com/dimitrilongo). + +* [Mobile_Detect module for UliCMS](https://github.com/derUli/ulicms-Mobile_Detect). +Made by [derUli](https://github.com/derUli). + +**Perl** + + * [MobileDetect.pm](https://www.buzzerstar.com/development/) is a Perl module for Mobile Detect. + Made by [Sebastian Enger](https://devop.tools/). + +**Python** + +* [pymobiledetect](https://pypi.python.org/pypi/pymobiledetect) - Mobile detect python package. +Made by Bas van Oostveen. + +**Ruby** + +* [mobile_detect.rb](https://github.com/ktaragorn/mobile_detect) is a Ruby gem using the JSON data exposed by the +php project and implementing a basic subset of the API (as much as can be done by the exposed data). +Made by [Karthik T](https://github.com/ktaragorn). + +**Go** + +* [GoMobileDetect](https://github.com/Shaked/gomobiledetect) is a Go port of Mobile Detect class. +Made by [https://github.com/Shaked](Shaked). + + +**LUA** + +* [ua-lua](https://github.com/robinef/ua-lua) is a small lib written in LUA providing device type detection. +ua-lua is detecting mobile or tablet devices based on user-agent inside nginx daemon. +Made by [Frédéric Robinet](https://github.com/robinef). + +**.Net** + +* [mobile-detect](https://github.com/validide/mobile-detect) is a .Net partial port written in C#. +Made by [Valentin Dide](https://github.com/validide). + +**ColdFusion** + +* [MobileDetect](https://github.com/GiancarloGomez/ColdFusion-MobileDetect) is a CFC port of the +Mobile_Detect PHP Library. Made by [Giancarlo Gomez](https://github.com/GiancarloGomez). + +**Experiments** :bulb: + +* [Mobile Detect Fast](https://bitbucket.org/lanaguani/mobile-detect-fast/) (See: [#474](https://github.com/serbanghita/Mobile-Detect/issues/474)) is a class to increase the performance of Mobile Detect lib. Made by [LanaGuani](https://github.com/lanaguanifw). diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/composer.json b/htdocs/includes/mobiledetect/mobiledetectlib/composer.json index c56611fb6b7..25cd99a375f 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/composer.json +++ b/htdocs/includes/mobiledetect/mobiledetectlib/composer.json @@ -17,14 +17,15 @@ "php": ">=5.0.0" }, "require-dev": { - "phpunit/phpunit": "*", - "johnkary/phpunit-speedtrap": "~1.0@dev", - "codeclimate/php-test-reporter": "dev-master" + "phpunit/phpunit": "~4.8.35||~5.7" }, "autoload": { "classmap": ["Mobile_Detect.php"], "psr-0": { "Detection": "namespaced/" } + }, + "archive": { + "exclude": ["docs", "examples", "export"] } } diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/composer.lock b/htdocs/includes/mobiledetect/mobiledetectlib/composer.lock new file mode 100644 index 00000000000..2e39472b2a1 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/composer.lock @@ -0,0 +1,983 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "4a5fd4cd7cc7247a6df7411b031d4845", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-01-25T08:17:30+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", + "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2017-11-24T13:59:53+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-10-06T15:47:00+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2017-11-27T13:52:08+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-12-04T08:55:13+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.36", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "46023de9a91eec7dfb06cc56cb4e260017298517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517", + "reference": "46023de9a91eec7dfb06cc56cb4e260017298517", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.2.2", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2017-06-21T08:07:12+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-10-02T06:51:40+00:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-05-22T07:24:03+00:00" + }, + { + "name": "sebastian/environment", + "version": "1.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-08-18T05:49:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2016-06-17T09:04:28+00:00" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12T03:26:01+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2016-10-03T07:41:43+00:00" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21T13:59:46+00:00" + }, + { + "name": "symfony/yaml", + "version": "v2.8.32", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "968ef42161e4bc04200119da473077f9e7015128" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/968ef42161e4bc04200119da473077f9e7015128", + "reference": "968ef42161e4bc04200119da473077f9e7015128", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-11-29T09:33:18+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.0.0" + }, + "platform-dev": [] +} diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php b/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php deleted file mode 100644 index 38dad6b2879..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/examples/demo.php +++ /dev/null @@ -1,272 +0,0 @@ - - * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt - * - */ - -require_once '../Mobile_Detect.php'; -$detect = new Mobile_Detect; - -$deviceType = ($detect->isMobile() ? ($detect->isTablet() ? 'tablet' : 'phone') : 'computer'); -$scriptVersion = $detect->getScriptVersion(); - -?> - - - - - Mobile Detect Local Demo - - - - - - - - -
-

Mobile_Detect v.

-

The lightweight PHP class for detecting mobile devices.

-
- - -
- -

This is a . Your UA is

- -

Please help us improve the mobile detection by choosing the correct answer.
- Before sending an answer double check that you are using the browser in its normal mode, not in 'Desktop mode'.
- You can contribute by:
- 1. forking the project
- 2. submiting an issue
- 3. sending us feedback below -

- - -
- Contribute - -

Is your device really a ?

- -

-
- -

- -
- - -
- - - -
-

Supported methods

- - - - - - - - - - - - - - - - - getRules() as $name => $regex): - $check = $detect->{'is'.$name}(); - ?> - - - - - - - - - - - getProperties() as $name => $match): - $check = $detect->version($name); - if($check!==false): - ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Basic detection methods
isMobile()isMobile(); if($check): ?>class="true">
isTablet()isTablet(); if($check): ?>class="true">
Custom detection methods
is()class="true">
Experimental version() method
version()
Other tests
isiphone()isiphone()); ?>
isIphone()isIphone()); ?>
istablet()istablet()); ?>
isIOS()isIOS()); ?>
isWhateverYouWant()isWhateverYouWant()); ?>
Debug
Matching RegexgetMatchingRegex()); ?>
Matching ArraygetMatchesArray()); ?>
- -
- - - diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/examples/session_example.php b/htdocs/includes/mobiledetect/mobiledetectlib/examples/session_example.php deleted file mode 100644 index ed74c588b3d..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/examples/session_example.php +++ /dev/null @@ -1,146 +0,0 @@ - - * @license MIT License https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt - * - */ - -// This is mandatory if you're using sessions. -session_start(); - -// It's mandatory to include the library. -require_once '../Mobile_Detect.php'; - -/** - * Begin helper functions. - */ - -// Your default site layouts. -// Update this array if you have fewer layout types. -function layoutTypes() -{ - return array('classic', 'mobile', 'tablet'); - -} - -function initLayoutType() -{ - // Safety check. - if (!class_exists('Mobile_Detect')) { return 'classic'; } - - $detect = new Mobile_Detect; - $isMobile = $detect->isMobile(); - $isTablet = $detect->isTablet(); - - $layoutTypes = layoutTypes(); - - // Set the layout type. - if ( isset($_GET['layoutType']) ) { - - $layoutType = $_GET['layoutType']; - - } else { - - if (empty($_SESSION['layoutType'])) { - - $layoutType = ($isMobile ? ($isTablet ? 'tablet' : 'mobile') : 'classic'); - - } else { - - $layoutType = $_SESSION['layoutType']; - - } - - } - - // Fallback. If everything fails choose classic layout. - if ( !in_array($layoutType, $layoutTypes) ) { $layoutType = 'classic'; } - - // Store the layout type for future use. - $_SESSION['layoutType'] = $layoutType; - - return $layoutType; - -} - -/** - * End helper functions. - */ - -// Let's roll. Call this function! -$layoutType = initLayoutType(); - -/** - * - * Example of layout switch links. - * Eg. ['Classic' | Mobile | 'Tablet'] - * - */ -?> - - - - -

Demo page number one.

-

You can go to page two.

-

Showing you the version.

-

Note: When running this test using the same browser with multiple User-Agents, clear your cookies/session before each test.

- - - - - - -

Demo page number two.

-

You can go back to page one.

-

Showing you the version.

- - - - - - - - - - -setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.59 Mobile/12A405 Safari/600.1.4'); -var_dump($detect->version('Chrome')); -var_dump($detect->version('iPhone')); -*/ - -/* -$user_agents = array( - 'android' => 'Mozilla/5.0 (Linux; Android 4.2; Nexus 7 Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', - 'iphone6' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25', - 'blackberry' => 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' -); -$mobile_detect = new Mobile_Detect; - -foreach($user_agents as $user_agent) -{ - $mobile_detect->setUserAgent($user_agent); - var_dump($mobile_detect->isAndroidOS()); -} -*/ - -$detect = new Mobile_Detect; -//$detect->setUserAgent('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'); -//var_dump($detect->version('IE')); -$detect->setUserAgent('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'); -var_dump($detect->version('IE')); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php b/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php index 88ff6a10991..e2c72aece1c 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/export/exportToJSON.php @@ -26,45 +26,42 @@ require_once dirname(__FILE__).'/../Mobile_Detect.php'; $detect = new Mobile_Detect; $json = array( - // The current version of Mobile Detect class that - // is being exported. - 'version' => $detect->getScriptVersion(), + // The current version of Mobile Detect class that + // is being exported. + 'version' => $detect->getScriptVersion(), - // All headers that trigger 'isMobile' to be 'true', - // before reaching the User-Agent match detection. - 'headerMatch' => $detect->getMobileHeaders(), + // All headers that trigger 'isMobile' to be 'true', + // before reaching the User-Agent match detection. + 'headerMatch' => $detect->getMobileHeaders(), - // All possible User-Agent headers. - 'uaHttpHeaders' => $detect->getUaHttpHeaders(), + // All possible User-Agent headers. + 'uaHttpHeaders' => $detect->getUaHttpHeaders(), - // All the regexes that trigger 'isMobile' or 'isTablet' - // to be true. - 'uaMatch' => array( - // If match is found, triggers 'isMobile' to be true. - 'phones' => $detect->getPhoneDevices(), - // Triggers 'isTablet' to be true. - 'tablets' => $detect->getTabletDevices(), - // If match is found, triggers 'isMobile' to be true. - 'browsers' => $detect->getBrowsers(), - // If match is found, triggers 'isMobile' to be true. - 'os' => $detect->getOperatingSystems(), - // Various utilities. To be further discussed. - 'utilities' => $detect->getUtilities() - ) + // All the regexes that trigger 'isMobile' or 'isTablet' + // to be true. + 'uaMatch' => array( + // If match is found, triggers 'isMobile' to be true. + 'phones' => $detect->getPhoneDevices(), + // Triggers 'isTablet' to be true. + 'tablets' => $detect->getTabletDevices(), + // If match is found, triggers 'isMobile' to be true. + 'browsers' => $detect->getBrowsers(), + // If match is found, triggers 'isMobile' to be true. + 'os' => $detect->getOperatingSystems(), + // Various utilities. To be further discussed. + 'utilities' => $detect->getUtilities() + ) +); - ); - -$jsonString = function_exists('json_format') ? json_format($json) : json_encode($json); - -// Write the JSON file to disk. -// You can import this file in your app. $fileName = dirname(__FILE__).'/../Mobile_Detect.json'; -$handle = fopen($fileName, 'w'); -$fwrite = fwrite($handle, $jsonString); -fclose($handle); - -if($fwrite){ +// Write the JSON file to disk.11 +// You can import this file in your app. +if (file_put_contents( + $fileName, + function_exists('json_format') ? json_format($json) : json_encode($json) +)) { echo 'Done. Check '.realpath($fileName).' file.'; -} else { +} +else { echo 'Failed to write '.realpath($fileName).' to disk.'; -} \ No newline at end of file +} diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/namespaced/Detection/MobileDetect.php b/htdocs/includes/mobiledetect/mobiledetectlib/namespaced/Detection/MobileDetect.php index ca70fe80768..ca7efec23fb 100644 --- a/htdocs/includes/mobiledetect/mobiledetectlib/namespaced/Detection/MobileDetect.php +++ b/htdocs/includes/mobiledetect/mobiledetectlib/namespaced/Detection/MobileDetect.php @@ -4,7 +4,7 @@ * the Symfony Universal ClassLoader by Fabien Potencier. Since PSR-0 handles an underscore in * classnames (on the filesystem) as a slash, "Mobile_Detect.php" autoloaders will try to convert * the classname and path to "Mobile\Detect.php". This script will ensure autoloading with: - * - Namespace: Detection + * - Namespace: Detection * - Classname: MobileDetect * - Namespased: \Detection\MobileDetect * - Autoload path: ./namespaced diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/phpcs.xml b/htdocs/includes/mobiledetect/mobiledetectlib/phpcs.xml new file mode 100644 index 00000000000..3c666649046 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/phpcs.xml @@ -0,0 +1,20 @@ + + + The PSR-2 coding standard extended. + + + + + + + + + + error + + + + + + + \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php deleted file mode 100644 index 5519665ee7a..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/BasicsTest.php +++ /dev/null @@ -1,520 +0,0 @@ -assertTrue(class_exists('Mobile_Detect')); - } - - public function setUp() - { - $this->detect = new Mobile_Detect; - } - - public function testBasicMethods() - { - $this->assertNotEmpty( $this->detect->getScriptVersion() ); - - $this->detect->setHttpHeaders(array( - 'SERVER_SOFTWARE' => 'Apache/2.2.15 (Linux) Whatever/4.0 PHP/5.2.13', - 'REQUEST_METHOD' => 'POST', - 'HTTP_HOST' => 'home.ghita.org', - 'HTTP_X_REAL_IP' => '1.2.3.4', - 'HTTP_X_FORWARDED_FOR' => '1.2.3.5', - 'HTTP_CONNECTION' => 'close', - 'HTTP_USER_AGENT' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25', - 'HTTP_ACCEPT' => 'text/vnd.wap.wml, application/json, text/javascript, */*; q=0.01', - 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', - 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', - 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest', - 'HTTP_REFERER' => 'http://mobiledetect.net', - 'HTTP_PRAGMA' => 'no-cache', - 'HTTP_CACHE_CONTROL' => 'no-cache', - 'REMOTE_ADDR' => '11.22.33.44', - 'REQUEST_TIME' => '01-10-2012 07:57' - )); - - //12 because only 12 start with HTTP_ - $this->assertCount( 12, $this->detect->getHttpHeaders() ); - $this->assertTrue( $this->detect->checkHttpHeadersForMobile() ); - - $this->detect->setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25'); - $this->assertNotEmpty( $this->detect->getUserAgent() ); - - $this->assertTrue( $this->detect->isMobile() ); - $this->assertFalse( $this->detect->isTablet() ); - - $this->assertTrue( $this->detect->isIphone() ); - $this->assertTrue( $this->detect->isiphone() ); - $this->assertTrue( $this->detect->isiOS() ); - $this->assertTrue( $this->detect->isios() ); - $this->assertTrue( $this->detect->is('iphone') ); - $this->assertTrue( $this->detect->is('ios') ); - - } - - public function headersProvider() - { - return array( - array(array( - 'SERVER_SOFTWARE' => 'Apache/2.2.15 (Linux) Whatever/4.0 PHP/5.2.13', - 'REQUEST_METHOD' => 'POST', - 'HTTP_HOST' => 'home.ghita.org', - 'HTTP_X_REAL_IP' => '1.2.3.4', - 'HTTP_X_FORWARDED_FOR' => '1.2.3.5', - 'HTTP_CONNECTION' => 'close', - 'HTTP_USER_AGENT' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25', - 'HTTP_ACCEPT' => 'text/vnd.wap.wml, application/json, text/javascript, */*; q=0.01', - 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', - 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', - 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest', - 'HTTP_REFERER' => 'http://mobiledetect.net', - 'HTTP_PRAGMA' => 'no-cache', - 'HTTP_CACHE_CONTROL' => 'no-cache', - 'REMOTE_ADDR' => '11.22.33.44', - 'REQUEST_TIME' => '01-10-2012 07:57' - )), - array(array( - 'SERVER_SOFTWARE' => 'Rogue software', - 'REQUEST_METHOD' => 'GET', - 'REMOTE_ADDR' => '8.8.8.8', - 'REQUEST_TIME' => '07-10-2013 23:56', - 'HTTP_USER_AGENT' => "garbage/1.0" - )), - array(array( - 'SERVER_SOFTWARE' => 'Apache/1.3.17 (Linux) PHP/5.5.2', - 'REQUEST_METHOD' => 'HEAD', - 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1', - 'REMOTE_ADDR' => '1.250.250.0', - 'REQUEST_TIME' => '06-12-2006 11:06' - )), - ); - } - - /** - * @dataProvider headersProvider - * @covers Mobile_Detect::getHttpHeader - */ - public function testConstructorInjection(array $headers) - { - $md = new Mobile_Detect($headers); - - foreach ($headers as $header => $value) { - if (substr($header, 0, 5) !== 'HTTP_') { - //make sure it wasn't set - $this->assertNull($md->getHttpHeader($value)); - } else { - //make sure it's equal - $this->assertEquals($value, $md->getHttpHeader($header)); - } - } - - //verify some of the headers work with the translated getter - $this->assertNull($md->getHttpHeader('Remote-Addr')); - $this->assertNull($md->getHttpHeader('Server-Software')); - $this->assertEquals($headers['HTTP_USER_AGENT'], $md->getHttpHeader('User-Agent')); - } - - /** - * @dataProvider headersProvider - * @covers Mobile_Detect::getHttpHeader - */ - public function testInvalidHeader($headers) - { - $md = new Mobile_Detect($headers); - $this->assertNull($md->getHttpHeader('garbage_is_Garbage')); - } - - public function userAgentProvider() - { - return array( - array(array( - 'HTTP_USER_AGENT' => 'blah' - ), 'blah'), - array(array( - 'HTTP_USER_AGENT' => 'iphone', - 'HTTP_X_OPERAMINI_PHONE_UA' => 'some other stuff' - ), 'iphone some other stuff'), - array(array( - 'HTTP_X_DEVICE_USER_AGENT' => 'hello world' - ), 'hello world'), - array(array(), null) - ); - } - - /** - * @dataProvider userAgentProvider - * @covers Mobile_Detect::setUserAgent - * @covers Mobile_Detect::getUserAgent - */ - public function testGetUserAgent($headers, $expectedUserAgent) - { - $md = new Mobile_Detect($headers); - $md->setUserAgent(); - $this->assertSame($expectedUserAgent, $md->getUserAgent()); - } - - /** - * Headers should be reset when you use setHttpHeaders. - * @covers Mobile_Detect::setHttpHeaders - * @issue #144 - */ - public function testSetHttpHeaders() - { - $header1 = array('HTTP_PINK_PONY' => 'I secretly love ponies >_>'); - $md = new Mobile_Detect($header1); - $this->assertSame($md->getHttpHeaders(), $header1); - - $header2 = array('HTTP_FIRE_BREATHING_DRAGON' => 'yeah!'); - $md->setHttpHeaders($header2); - $this->assertSame($md->getHttpHeaders(), $header2); - } - - /** - * Read response from cloudfront, if the cloudfront headers are detected - * @covers Mobile_Detect::setCfHeaders - */ - public function testSetCfHeaders() - { - // Test mobile detected - $header1 = array( - 'HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER' => 'false', - 'HTTP_CLOUDFRONT_IS_MOBILE_VIEWER' => 'true', - 'HTTP_CLOUDFRONT_IS_TABLET_VIEWER' => 'false' - ); - $md = new Mobile_Detect($header1); - $this->assertSame($md->getCfHeaders(), $header1); - $this->assertSame($md->getUserAgent(), 'Amazon CloudFront'); - $this->assertSame($md->isTablet(), false); - $this->assertSame($md->isMobile(), true); - - // Test neither mobile nor tablet (desktop) - $header2 = array( - 'HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER' => 'true', - 'HTTP_CLOUDFRONT_IS_MOBILE_VIEWER' => 'false', - 'HTTP_CLOUDFRONT_IS_TABLET_VIEWER' => 'false' - ); - $md->setHttpHeaders($header2); - $this->assertSame($md->getCfHeaders(), $header2); - $this->assertSame($md->getUserAgent(), 'Amazon CloudFront'); - $this->assertSame($md->isTablet(), false); - $this->assertSame($md->isMobile(), false); - - // Test tablet detected - $header3 = array( - 'HTTP_CLOUDFRONT_IS_DESKTOP_VIEWER' => 'false', - 'HTTP_CLOUDFRONT_IS_MOBILE_VIEWER' => 'false', - 'HTTP_CLOUDFRONT_IS_TABLET_VIEWER' => 'true' - ); - $md->setCfHeaders($header3); - $this->assertSame($md->getCfHeaders(), $header3); - $this->assertSame($md->getUserAgent(), 'Amazon CloudFront'); - $this->assertSame($md->isTablet(), true); - $this->assertSame($md->isMobile(), false); - - // Check if the headers are cleared - $header4 = array(); - $md->setHttpHeaders($header4); - $this->assertSame($md->getCfHeaders(), $header4); - } - - /** - * @covers Mobile_Detect::setUserAgent - * @covers Mobile_Detect::getUserAgent - */ - public function testSetUserAgent() - { - $md = new Mobile_Detect(array()); - $md->setUserAgent('hello world'); - $this->assertSame('hello world', $md->getUserAgent()); - } - - /** - * @covers Mobile_Detect::setDetectionType - */ - public function testSetDetectionType() - { - $md = new Mobile_Detect(array()); - - $md->setDetectionType('bskdfjhs'); - $this->assertAttributeEquals( - Mobile_Detect::DETECTION_TYPE_MOBILE, - 'detectionType', - $md - ); - - $md->setDetectionType(); - $this->assertAttributeEquals( - Mobile_Detect::DETECTION_TYPE_MOBILE, - 'detectionType', - $md - ); - - $md->setDetectionType(Mobile_Detect::DETECTION_TYPE_MOBILE); - $this->assertAttributeEquals( - Mobile_Detect::DETECTION_TYPE_MOBILE, - 'detectionType', - $md - ); - - $md->setDetectionType(Mobile_Detect::DETECTION_TYPE_EXTENDED); - $this->assertAttributeEquals( - Mobile_Detect::DETECTION_TYPE_EXTENDED, - 'detectionType', - $md - ); - } - - //special headers that give 'quick' indication that a device is mobile - public function quickHeadersData() - { - return array( - array(array( - 'HTTP_ACCEPT' => 'application/json; q=0.2, application/x-obml2d; q=0.8, image/gif; q=0.99, */*' - )), - array(array( - 'HTTP_ACCEPT' => 'text/*; q=0.1, application/vnd.rim.html' - )), - array(array( - 'HTTP_ACCEPT' => 'text/vnd.wap.wml', - )), - array(array( - 'HTTP_ACCEPT' => 'application/vnd.wap.xhtml+xml', - )), - array(array( - 'HTTP_X_WAP_PROFILE' => 'hello', - )), - array(array( - 'HTTP_X_WAP_CLIENTID' => '' - )), - array(array( - 'HTTP_WAP_CONNECTION' => '' - )), - array(array( - 'HTTP_PROFILE' => '' - )), - array(array( - 'HTTP_X_OPERAMINI_PHONE_UA' => '' - )), - array(array( - 'HTTP_X_NOKIA_GATEWAY_ID' => '' - )), - array(array( - 'HTTP_X_ORANGE_ID' => '' - )), - array(array( - 'HTTP_X_VODAFONE_3GPDPCONTEXT' => '' - )), - array(array( - 'HTTP_X_HUAWEI_USERID' => '' - )), - array(array( - 'HTTP_UA_OS' => '' - )), - array(array( - 'HTTP_X_MOBILE_GATEWAY' => '' - )), - array(array( - 'HTTP_X_ATT_DEVICEID' => '' - )), - array(array( - 'HTTP_UA_CPU' => 'ARM' - )) - ); - } - - /** - * @dataProvider quickHeadersData - * @covers Mobile_Detect::checkHttpHeadersForMobile - */ - public function testQuickHeaders($headers) - { - $md = new Mobile_Detect($headers); - $this->assertTrue($md->checkHttpHeadersForMobile()); - } - - // Headers that are not mobile. - public function quickNonMobileHeadersData() - { - - return array( - array(array( - 'HTTP_UA_CPU' => 'AMD64' - )), - array(array( - 'HTTP_UA_CPU' => 'X86' - )), - array(array( - 'HTTP_ACCEPT' => 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01' - )), - array(array( - 'HTTP_REQUEST_METHOD' => 'DELETE' - )), - array(array( - 'HTTP_VIA' => '1.1 ws-proxy.stuff.co.il C0A800FA' - )), - ); - - } - - /** - * @dataProvider quickNonMobileHeadersData - * @covers Mobile_Detect::checkHttpHeadersForMobile - */ - public function testNonMobileQuickHeaders($headers) - { - $md = new Mobile_Detect($headers); - $this->assertFalse($md->checkHttpHeadersForMobile()); - } - - /** - * @expectedException BadMethodCallException - * @coversNothing - */ - public function testBadMethodCall() - { - $md = new Mobile_Detect(array()); - $md->badmethodthatdoesntexistatall(); - } - - public function versionDataProvider() - { - return array( - array( - 'Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', - 'Android', - '4.0.4', - 4.04 - ), - array( - 'Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', - 'Webkit', - '535.19', - 535.19 - ), - array( - 'Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19', - 'Chrome', - '18.0.1025.166', - 18.01025166 - ), - array( - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8', - 'BlackBerry', - '6.0.0.448', - 6.00448 - ), - array( - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8', - 'Webkit', - '534.8', - 534.8 - ), - array( - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+', - 'BlackBerry', - '6.0.0.546', - 6.00546 - ) - ); - } - - /** - * @dataProvider versionDataProvider - * @covers Mobile_Detect::version - */ - public function testVersionExtraction($userAgent, $property, $stringVersion, $floatVersion) - { - $md = new Mobile_Detect(array('HTTP_USER_AGENT' => $userAgent)); - $prop = $md->version($property); - - $this->assertSame($stringVersion, $prop); - - $prop = $md->version($property, 'float'); - $this->assertSame($floatVersion, $prop); - - //assert that garbage data is always === false - $prop = $md->version('garbage input is always garbage'); - $this->assertFalse($prop); - } - - /** - * @covers Mobile_Detect::getMobileDetectionRules - */ - public function testRules() - { - $md = new Mobile_Detect; - $count = array_sum(array( - count(Mobile_Detect::getPhoneDevices()), - count(Mobile_Detect::getTabletDevices()), - count(Mobile_Detect::getOperatingSystems()), - count(Mobile_Detect::getBrowsers()) - )); - $rules = $md->getRules(); - $this->assertEquals($count, count($rules)); - } - - /** - * @covers Mobile_Detect::getMobileDetectionRulesExtended - */ - public function testRulesExtended() - { - $md = new Mobile_Detect; - $count = array_sum(array( - count(Mobile_Detect::getPhoneDevices()), - count(Mobile_Detect::getTabletDevices()), - count(Mobile_Detect::getOperatingSystems()), - count(Mobile_Detect::getBrowsers()), - count(Mobile_Detect::getUtilities()) - )); - $md->setDetectionType(Mobile_Detect::DETECTION_TYPE_EXTENDED); - $rules = $md->getRules(); - $this->assertEquals($count, count($rules)); - } - - /** - * @covers Mobile_Detect::getScriptVersion - */ - public function testScriptVersion() - { - $v = Mobile_Detect::getScriptVersion(); - $formatCheck = (bool)preg_match('/^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9])?$/', $v); - - $this->assertTrue($formatCheck, "Fails the semantic version test. The version " . var_export($v, true) - . ' does not match X.Y.Z pattern'); - } - - public function crazyVersionNumbers() - { - return array( - array('2.5.6', 2.56), - array('12142.2142.412521.24.152', 12142.214241252124152), - array('6_3', 6.3), - array('4_7 /7 7 12_9', 4.777129), - array('49', 49.0), - array('2.6.x', 2.6), - array('45.6.1.x.12', 45.61) - ); - } - - /** - * @dataProvider crazyVersionNumbers - * @covers Mobile_Detect::prepareVersionNo - */ - public function testPrepareVersionNo($raw, $expected) - { - $md = new Mobile_Detect; - $actual = $md->prepareVersionNo($raw); - $this->assertSame($expected, $actual, "We expected " . var_export($raw, true) . " to convert to " - . var_export($expected, true) . ', but got ' . var_export($actual, true) . ' instead'); - } -} diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php deleted file mode 100644 index 5c4df79b9a4..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.inc.php +++ /dev/null @@ -1,27 +0,0 @@ -isDot()) { - continue; - } - $listNew = include $includeBasePath . '/' . $fileInfo->getFilename(); - if (is_array($listNew)) { - $list = array_merge($list, $listNew); - } -} - -return $list; diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.pending.txt b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.pending.txt deleted file mode 100644 index c673c8f76db..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UA_List.pending.txt +++ /dev/null @@ -1,1242 +0,0 @@ - req / hits / tag (444758 / 73555 / 44678) - user_agent (1041) -58989 / 6933 / 5240 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) -55308 / 9884 / 7995 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 -36138 / 1681 / 1819 - Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.15 -25387 / 4668 / 3863 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 -23850 / 4623 / 3909 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 -17258 / 1634 / 1391 - Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0 - 9315 / 1535 / 1304 - Mozilla/5.0 (X11; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0 - 7146 / 1271 / 1121 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 - 6559 / 1234 / 991 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 - 5639 / 1297 / 863 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0 - 5448 / 0 / 0 - msnbot-media/1.1 ( http://search.msn.com/msnbot.htm) - 5320 / 563 / 700 - Opera/9.80 (Windows NT 6.2; WOW64; MRA 6.0 (build 6011)) Presto/2.12.388 Version/12.15 - 4948 / 910 / 593 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) - 4719 / 78 / 75 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1) - 4318 / 278 / 208 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E) - 4162 / 2554 / 3 - Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html) - 4140 / 903 / 919 - Mozilla/5.0 (Windows NT 6.2; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 - 3864 / 344 / 333 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 - 3812 / 807 / 11 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 3799 / 563 / 496 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31 - 3251 / 601 / 629 - Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.15 - 3202 / 0 / 0 - Mozilla/5.0 (compatible; YandexImages/3.0; http://yandex.com/bots) - 3129 / 738 / 131 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1106.241 YaBrowser/1.5.1106.241 Safari/537.4 - 3105 / 491 / 370 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22 - 3039 / 350 / 346 - Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.15 - 3038 / 2351 / 0 - Mozilla/5.0 (compatible; bingbot/2.0; http://www.bing.com/bingbot.htm) - 2971 / 392 / 399 - Opera/9.80 (Windows NT 6.2; WOW64) Presto/2.12.388 Version/12.15 - 2766 / 147 / 172 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.60 - 2764 / 739 / 17 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0 - 2650 / 2044 / 0 - Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html) - 2514 / 304 / 262 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1 - 2500 / 306 / 134 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) - 2494 / 250 / 256 - Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.15 - 2478 / 362 / 331 - Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0 - 2433 / 378 / 299 - Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0 - 2369 / 234 / 127 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 - 2269 / 488 / 348 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22 - 2137 / 405 / 256 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 1A820D29-8445-92BE-2384-712BBCEDFDB1; MRSPUTNIK 2, 4, 1, 12; BTRS124447; GTB7.4; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727; AskTbFXTV5/5.8.0.12304) - 2050 / 391 / 464 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E) - 1937 / 1676 / 0 - Mozilla/5.0 (compatible; YandexBot/3.0; http://yandex.com/bots) - 1900 / 0 / 0 - Googlebot-Image/1.0 - 1894 / 289 / 299 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17 - 1842 / 335 / 157 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 - 1836 / 354 / 298 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 1829 / 176 / 171 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) - 1608 / 260 / 181 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) - 1594 / 273 / 195 - Opera/9.80 (X11; Linux x86_64) Presto/2.12.388 Version/12.14 - 1543 / 1408 / 0 - Mozilla/5.0 (compatible; SearchBot) - 1511 / 176 / 115 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25 - 1496 / 248 / 217 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31 - 1403 / 174 / 158 - Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 - 1299 / 203 / 173 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Iron/25.0.1400.0 Chrome/25.0.1400.0 Safari/537.22 - 1220 / 206 / 207 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17 YE - 1219 / 209 / 211 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0 - 1210 / 81 / 80 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB6.6; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) - 1136 / 173 / 139 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.04 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19 - 1125 / 194 / 158 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22 - 1068 / 173 / 130 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 5680)) Presto/2.12.388 Version/12.13 - 1040 / 202 / 207 - Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0 - 1032 / 206 / 176 - Opera/9.80 (Windows NT 6.1; WOW64; U; Edition Next; ru) Presto/2.11.310 Version/12.50 - 1008 / 278 / 180 - Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 - 941 / 153 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 929 / 181 / 88 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25 - 896 / 148 / 44 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 893 / 213 / 3 - Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0 - 840 / 165 / 62 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22 - 825 / 143 / 67 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; InfoPath.2; .NET CLR 2.0.50727) - 821 / 170 / 85 - Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 - 793 / 55 / 37 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; GTB7.4; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; eSobiSubscriber 2.0.4.16; .NET4.0C) - 781 / 183 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 770 / 125 / 32 - Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.14 - 757 / 0 / 0 - contype - 755 / 159 / 94 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31 - 742 / 81 / 22 - Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14 - 709 / 180 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 - 702 / 201 / 204 - Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1 - 696 / 106 / 116 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 685 / 76 / 21 - Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 - 667 / 149 / 265 - Mozilla/5.0 (X11; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 - 648 / 51 / 49 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.60 - 645 / 175 / 20 - Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0 - 643 / 87 / 86 - Opera/9.80 (Windows NT 6.1; WOW64; Edition Yx) Presto/2.12.388 Version/12.15 - 642 / 59 / 59 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.54 - 642 / 122 / 124 - Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0 - 603 / 69 / 50 - Opera/9.80 (Windows NT 6.2; WOW64) Presto/2.12.388 Version/12.12 - 596 / 64 / 0 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (FlipboardProxy/0.0.5; http://flipboard.com/browserproxy) - 593 / 30 / 39 - Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.289 Version/12.02 - 589 / 72 / 14 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MAAU; InfoPath.1) - 562 / 93 / 83 - Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20100101 Firefox/10.0.12 Iceweasel/10.0.12 - 557 / 98 / 24 - Opera/9.80 (X11; Linux x86_64) Presto/2.12.388 Version/12.15 - 545 / 108 / 137 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:20.0) Gecko/20100101 Firefox/20.0 - 532 / 87 / 62 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.28 Safari/537.31 - 519 / 280 / 0 - SolomonoBot/1.04 (http://www.solomono.ru) - 518 / 106 / 69 - Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.13 - 518 / 95 / 28 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.46 Safari/537.31 - 506 / 55 / 16 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C) - 476 / 66 / 67 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13 - 437 / 61 / 18 - Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.15 - 435 / 0 / 0 - Mozilla/5.0 (compatible) Feedfetcher-Google; ( http://www.google.com/feedfetcher.html) - 434 / 56 / 51 - Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.14 - 431 / 28 / 29 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 1, 110; chromeframe/26.0.1410.64; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; InfoPath.2) - 431 / 422 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20110814 Firefox/6.0 Google ( https://developers.google.com/ /web/snippet/) - 426 / 62 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 422 / 62 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 (.NET CLR 3.5.30729) - 417 / 56 / 21 - Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.12 - 401 / 64 / 64 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.65 Safari/537.36 - 400 / 387 / 0 - Mozilla/5.0 (compatible; Linux i686; Yandex.Gazeta Bot/1.0; http://gazeta.yandex.ru) - 397 / 85 / 60 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0 Iceweasel/20.0 - 387 / 50 / 49 - Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0 - 379 / 71 / 0 - Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.11 - 368 / 40 / 41 - Mozilla/5.0 (Windows NT 5.1; rv:20.0) Gecko/20100101 Firefox/20.0 SeaMonkey/2.17.1 - 367 / 47 / 33 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31 - 366 / 24 / 24 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.1) - 366 / 85 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 - 360 / 60 / 30 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; DefView) - 359 / 17 / 17 - Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1212030820) Presto/2.11.355 Version/12.10 - 356 / 60 / 48 - Mozilla/5.0 (Linux; U; Android 2.2; ru-ru; HTC_Gratia_A6380 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 355 / 18 / 20 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 352 / 51 / 49 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 CoolNovo/2.0.7.11 - 348 / 74 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 340 / 47 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.0 (build 6007)) Presto/2.12.388 Version/12.14 - 340 / 95 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 - 333 / 58 / 59 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1106.241 YaBrowser/1.5.1106.241 Safari/537.4 - 311 / 21 / 16 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 310 / 30 / 39 - Mozilla/5.0 (Linux; Android 4.0.4; HTC Incredible S Build/IMM76D) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 308 / 47 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1 - 306 / 18 / 0 - facebookexternalhit/1.1 ( http://www.facebook.com/externalhit_uatext.php) - 305 / 20 / 21 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 304 / 65 / 62 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5 - 303 / 293 / 0 - Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; http://go.mail.ru/help/robots) - 302 / 76 / 0 - Microsoft-WebDAV-MiniRedir/6.1.7601 - 300 / 88 / 29 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0 - 285 / 184 / 0 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (FlipboardProxy/1.1; http://flipboard.com/browserproxy) - 282 / 35 / 40 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 - 282 / 58 / 5 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3 Safari/536.28.10 - 276 / 22 / 25 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13 - 273 / 12 / 0 - Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.11) Gecko/2009061118 Fedora/3.0.11-1.fc9 Firefox/3.0.11 - 267 / 27 / 14 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 - 261 / 75 / 12 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.50.2 (KHTML, like Gecko) Version/5.0.6 Safari/533.22.3 - 254 / 0 / 0 - Wget/1.11.4 - 253 / 21 / 14 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 - 250 / 24 / 14 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25 - 250 / 57 / 0 - Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 250 / 218 / 0 - msnbot/2.0b ( http://search.msn.com/msnbot.htm) - 244 / 0 / 0 - Googlebot/2.1 ( http://www.google.com/bot.html) - 240 / 25 / 33 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart T8698) - 238 / 132 / 23 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 - 233 / 63 / 39 - Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0 - 232 / 12 / 11 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 - 228 / 29 / 34 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31 - 219 / 34 / 10 - Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.12 - 219 / 26 / 2 - Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0 - 216 / 41 / 45 - Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20130415 Firefox/22.0 - 214 / 16 / 14 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7) - 214 / 49 / 19 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 214 / 24 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 213 / 13 / 14 - Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.24) Gecko/20111109 CentOS/3.6.24-3.el6.centos Firefox/3.6.24 - 207 / 26 / 26 - Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20100101 Firefox/21.0 - 206 / 38 / 69 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 504; GTB7.4; BTRS99144; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; InfoPath.2; Zune 4.7) - 203 / 23 / 23 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 5.9 (build 4947)) Presto/2.12.388 Version/12.15 - 202 / 78 / 1 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch) - 201 / 60 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 - 199 / 11 / 13 - Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; HTC Sensation Z710e Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 197 / 93 / 0 - Mozilla/5.0 (compatible; Butterfly/1.0; http://labs.topsy.com/butterfly/) Gecko/2009032608 Firefox/3.0.8 - 197 / 41 / 42 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 193 / 59 / 6 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; MS-RTC LM 8; BRI/2; .NET4.0E) - 193 / 13 / 12 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) - 193 / 11 / 12 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11 - 186 / 45 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 185 / 154 / 0 - SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html) - 184 / 43 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:19.0) Gecko/20100101 Firefox/19.0 - 184 / 6 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 - 184 / 14 / 13 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.47 Safari/535.11 MRCHROME - 183 / 61 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; http://www.changedetection.com/bot.html ) - 182 / 15 / 15 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.64 - 182 / 13 / 15 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1106.241 YaBrowser/1.5.1106.241 Safari/537.4 - 179 / 8 / 9 - Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0 - 178 / 31 / 23 - Opera/9.80 (Windows NT 6.1; Edition Yx) Presto/2.12.388 Version/12.15 - 178 / 24 / 27 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25 - 177 / 17 / 18 - Opera/9.80 (Android 4.0.3; Linux; Opera Mobi/ADR-1301080958) Presto/2.11.355 Version/12.10 - 177 / 31 / 33 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Comodo_Dragon/15.0.3.0 Chrome/15.0.874.102 Safari/535.2 - 176 / 43 / 45 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Iron/19.0.1100.0 Chrome/19.0.1100.0 Safari/536.5 - 175 / 148 / 0 - DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html) - 175 / 35 / 12 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 174 / 19 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) - 172 / 52 / 0 - Opera/9.80 (Windows NT 6.0; U; en) Presto/2.10.289 Version/12.02 - 170 / 21 / 32 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 - 170 / 27 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0 - 170 / 25 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MALC) - 167 / 27 / 30 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0 - 167 / 33 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E) - 165 / 9 / 9 - Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25 - 164 / 19 / 0 - Mozilla/5.0 (Windows NT 6.0; rv:17.0) Gecko/20100101 Firefox/17.0 - 163 / 19 / 1 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9300 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 162 / 54 / 2 - Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.14 - 158 / 21 / 13 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0 - 156 / 39 / 11 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3 Safari/536.28.10 - 155 / 18 / 8 - Opera/9.80 (Android 4.0.4; Linux; Opera Mobi/ADR-1301080958) Presto/2.11.355 Version/12.10 - 154 / 50 / 1 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1106.241 YaBrowser/1.5.1106.241 Safari/537.4 - 150 / 27 / 14 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17 - 150 / 5 / 6 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0 - 148 / 27 / 1 - Mozilla/5.0 (Windows NT 6.0; rv:19.0) Gecko/20100101 Firefox/19.0 - 145 / 26 / 9 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25 - 143 / 32 / 4 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;RURU) - 142 / 13 / 11 - Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 - 142 / 121 / 1 - Java/1.7.0_21 - 140 / 16 / 3 - Mozilla/5.0 (Windows NT 6.0; rv:20.0) Gecko/20100101 Firefox/20.0 - 140 / 18 / 3 - Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0 - 140 / 9 / 13 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; HTC_Sensation_Z710e; ru-ru) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 - 139 / 12 / 0 - Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.14) Gecko/2009090216 Ubuntu/9.04 (jaunty) Firefox/3.0.14 - 134 / 16 / 18 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1 - 134 / 0 / 0 - Evernote Clip Resolver - 132 / 30 / 8 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20130409 Firefox/20.0 - 132 / 17 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0 - 132 / 38 / 0 - Wget/1.13.4 (linux-gnu) - 132 / 35 / 0 - Opera/9.80 (Windows NT 6.1; Edition Yx) Presto/2.12.388 Version/12.14 - 132 / 13 / 15 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25 - 132 / 113 / 0 - Mozilla/5.0 (compatible; Mail.RU_Bot/2.0; http://go.mail.ru/help/robots) - 131 / 41 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.62 - 131 / 15 / 1 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729; .NET4.0E) - 131 / 103 / 0 - UnwindFetchor/1.0 ( http://www.gnip.com/) - 130 / 27 / 19 - Opera/9.63 (Windows NT 6.0; U; ru) Presto/2.1.1 - 128 / 9 / 12 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 - 128 / 62 / 1 - - - 126 / 0 / 50 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534 (KHTML, like Gecko) BingPreview/1.0b - 124 / 14 / 19 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E) - 122 / 25 / 2 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; InfoPath.1) - 121 / 58 / 0 - Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com) - 121 / 3 / 3 - Opera/9.80 (Android; Opera Mini/6.5.27452/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 120 / 24 / 9 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.1) Gecko/20100101 Firefox/6.0.1 - 120 / 5 / 6 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 119 / 17 / 19 - Opera/9.80 (Windows NT 6.1; MRA 5.9 (build 4953)) Presto/2.12.388 Version/12.15 - 118 / 46 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.3) - 118 / 35 / 8 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 - 117 / 23 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 116 / 20 / 24 - Mozilla/5.0 (X11; SunOS i86pc; rv:10.0.4) Gecko/20100101 Firefox/10.0.4 - 115 / 6 / 2 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko; Google Web Preview) Chrome/22.0.1229 Safari/537.4 - 115 / 17 / 16 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22 - 112 / 9 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 111 / 15 / 17 - Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 111 / 13 / 16 - Opera/9.80 (Windows NT 6.0; MRA 5.5 (build 02842)) Presto/2.12.388 Version/12.14 - 110 / 61 / 0 - Mozilla/5.0 (compatible; TourlentaScanner/0.6; http://tourlenta.com) - 110 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; InfoPath.1; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 108 / 15 / 3 - Mozilla/5.0 (Windows NT 5.1; rv:10.0) Gecko/20100101 Firefox/10.0 - 107 / 40 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_1) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25 - 104 / 11 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0 - 104 / 13 / 13 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 104 / 41 / 1 - Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 103 / 80 / 0 - NING/1.0 - 103 / 16 / 12 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 103 / 30 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1106.240 YaBrowser/1.5.1106.240 Safari/537.4 - 102 / 12 / 15 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7 - 101 / 17 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 - 101 / 14 / 2 - Mozilla/5.0 (Windows NT 6.1; rv:18.0) Gecko/20100101 Firefox/18.0 - 101 / 15 / 16 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2; .NET4.0C; .NET4.0E) - 98 / 2 / 2 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) QupZilla/1.4.3 Safari/537.21 - 98 / 9 / 8 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146 - 96 / 14 / 5 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; InfoPath.1; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 95 / 26 / 2 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.7.62 Version/11.00 - 94 / 21 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 - 93 / 22 / 22 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; AskTbAVR-3/5.15.11.30498) - 92 / 36 / 36 - Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0 - 92 / 17 / 0 - Opera/9.80 (Windows NT 6.1; U; en) Presto/2.10.229 Version/11.62 - 92 / 23 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; MRSPUTNIK 2, 4, 1, 162; MRA 5.5 (build 02842); SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.30729) - 91 / 12 / 13 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800) - 91 / 15 / 19 - Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.10 - 89 / 1 / 1 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 CoolNovo/2.0.7.11 - 88 / 17 / 20 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A8426 Safari/8536.25 - 88 / 45 / 0 - Mozilla/5.0 (compatible; vkShare; http://vk.com/dev/Share) - 88 / 12 / 15 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 YaBrowser/1.7.1364.12390 Safari/537.22 - 87 / 24 / 24 - Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.11 - 87 / 11 / 12 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 5976)) Presto/2.12.388 Version/12.15 - 85 / 3 / 0 - Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:24.0) Gecko/20130525 Firefox/24.0 - 85 / 2 / 2 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MDDC; InfoPath.3; .NET4.0C) - 84 / 5 / 5 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0) Gecko/20100101 Firefox/20.0 - 83 / 27 / 8 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17 YE - 82 / 10 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0 - 81 / 16 / 0 - Mozilla/5.0 (X11; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0 - 81 / 9 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) - 81 / 2 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 81 / 6 / 8 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30; .NET4.0C; .NET4.0E) - 80 / 9 / 9 - Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0 - 79 / 11 / 0 - Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 - 78 / 4 / 4 - Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Safari/537.22 - 78 / 20 / 21 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24 - 78 / 26 / 0 - Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 76 / 8 / 14 - Opera/9.80 (Windows NT 6.1; WOW64; Edition Rambler) Presto/2.12.388 Version/12.15 - 75 / 56 / 0 - Mozilla/5.0 (compatible; MJ12bot/v1.4.3; http://www.majestic12.co.uk/bot.php? ) - 74 / 18 / 19 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0) - 74 / 5 / 13 - Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 74 / 9 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5 (.NET CLR 3.5.30729) - 74 / 4 / 1 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.289 Version/12.02 - 74 / 6 / 4 - Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 74 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; MRSPUTNIK 2, 2, 0, 94; GTB7.4; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 73 / 8 / 8 - Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) - 72 / 40 / 0 - Mozilla/5.0 (compatible; YandexDirect/3.0; http://yandex.com/bots) - 71 / 24 / 5 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MASMJS) - 70 / 2 / 1 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.47 Safari/535.11 MRCHROME - 70 / 24 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 484; MRA 6.0 (build 5970); .NET4.0E; AskTbFXTV5/5.14.1.20007; .NET4.0C) - 70 / 11 / 0 - Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp) - 69 / 6 / 8 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 69 / 5 / 8 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 5.10 (build 5282)) Presto/2.12.388 Version/12.15 - 69 / 4 / 5 - Opera/9.80 (Android; Opera Mini/7.5.33286/29.3345; U; en) Presto/2.8.119 Version/11.10 - 67 / 15 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Media Center PC 6.0; BRI/2; InfoPath.3) - 67 / 10 / 8 - Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1 - 67 / 17 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.36 YaBrowser/2.0.1364.6141 Safari/537.22 - 67 / 11 / 7 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 67 / 3 / 3 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) - 65 / 6 / 1 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:19.0) Gecko/20100101 Firefox/19.0 - 65 / 8 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:16.0; Avant TriCore) Gecko/20121105 Firefox/16.0 - 64 / 16 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31 - 64 / 5 / 5 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.53 Mobile/10B329 Safari/8536.25 - 64 / 9 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 - 64 / 4 / 6 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17 - 63 / 6 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 63 / 6 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 Iceweasel/18.0.1 - 63 / 0 / 0 - Microsoft Office Existence Discovery - 63 / 2 / 5 - Mozilla/5.0 (Linux; U; Android 2.3.5; en-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 63 / 10 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB7.4; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 63 / 7 / 12 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 6081)) Presto/2.12.388 Version/12.15 - 62 / 43 / 0 - ia_archiver ( http://www.alexa.com/site/help/webmasters; crawler@alexa.com) - 60 / 17 / 0 - Opera/9.80 (Windows NT 5.2; Edition Yx) Presto/2.12.388 Version/12.14 - 60 / 0 / 0 - Opera/9.80 (Series 60; Opera Mini/7.0.29482/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 59 / 3 / 4 - Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 58 / 0 / 2 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 58 / 6 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E) - 57 / 5 / 5 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 - 57 / 7 / 0 - Mozilla/5.0 (Linux; Android 4.0.4; ZTE Grand Era Build/IMM76L) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.40 Mobile Safari/537.31 OPR/14.0.1074.54070 - 57 / 5 / 7 - Mozilla/5.0 (Linux; Android 4.0.4; U8836D Build/HuaweiU8836D) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 56 / 3 / 4 - Opera/9.80 (Windows NT 6.1; Edition Yx 01) Presto/2.12.388 Version/12.14 - 56 / 4 / 4 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ru-ru) AppleWebKit/535 (KHTML, like Gecko) Version/5.0 Safari/535.18 Midori/0.4 - 55 / 11 / 1 - Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25 - 55 / 13 / 14 - Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/ADR-1301080958) Presto/2.11.355 Version/12.10 - 54 / 4 / 4 - Opera/9.80 (Windows NT 6.1; Edition Yx 01) Presto/2.12.388 Version/12.11 - 54 / 35 / 0 - ichiro/3.0 (http://search.goo.ne.jp/option/use/sub4/sub4-1/) - 54 / 20 / 0 - Microsoft-WebDAV-MiniRedir/6.1.7600 - 54 / 5 / 7 - Mozilla/5.0 (Linux; U; Android 2.2.1; ru-ru; HTC Wildfire Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 53 / 18 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 - 53 / 2 / 3 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; MS-RTC LM 8; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 53 / 10 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31 - 53 / 9 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1 - 52 / 2 / 1 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 CoolNovo/2.0.6.12 - 52 / 5 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 SeaMonkey/2.16.2 - 52 / 2 / 4 - Opera/9.80 (Windows NT 6.2; WOW64; YZF) Presto/2.12.388 Version/12.15 - 52 / 8 / 0 - Mozilla/5.0 (Linux; U; Android 3.2; ru-ru; GT-P7300 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 - 51 / 12 / 18 - Opera/9.80 (Windows NT 5.1; WOW64) Presto/2.12.388 Version/12.14 - 51 / 11 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0 - 51 / 41 / 0 - Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; http://tweetedtimes.com) - 51 / 7 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0) - 51 / 5 / 0 - Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 49 / 12 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14 - 49 / 4 / 4 - Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 - 48 / 4 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) - 47 / 11 / 3 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.36 YaBrowser/2.0.1364.6141 Safari/537.22 - 47 / 39 / 0 - Wotbox/2.01 ( http://www.wotbox.com/bot/) - 47 / 4 / 4 - Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 - 46 / 12 / 2 - Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0 - 46 / 4 / 5 - Opera/9.80 (Windows NT 6.1; MRA 5.10 (build 5310)) Presto/2.12.388 Version/12.14 - 45 / 3 / 4 - Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 - 45 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22 - 44 / 8 / 8 - Opera/9.80 (X11; Linux i686; U; en) Presto/2.10.289 Version/12.02 - 43 / 0 / 0 - Microsoft Office Protocol Discovery - 43 / 1 / 2 - Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120714 Iceweasel/3.5.16 (like Firefox/3.5.16) - 43 / 10 / 0 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/25.0.1364.124 Mobile/10B329 Safari/8536.25 - 42 / 5 / 5 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B350 Safari/8536.25 - 42 / 3 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2) - 42 / 9 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0 - 42 / 40 / 0 - Mozilla/5.0 (compatible; Genieo/1.0 http://www.genieo.com/webfilter.html) - 41 / 2 / 4 - Mozilla/5.0 (Linux; Android 4.0.4; ZTE Grand Era Build/IMM76L) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 40 / 5 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0 - 40 / 19 / 0 - rogerbot/1.0 (http://www.seomoz.org/dp/rogerbot, rogerbot-crawler shiny@seomoz.org) - 40 / 4 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; SP-A20i Build/MF_ICS_02.19) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 40 / 0 / 0 - Mozilla/5.0 (compatible; YandexImageResizer/2.0; http://yandex.com/bots) - 40 / 9 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; SonyEricssonLT26w Build/6.1.A.2.55) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 40 / 1 / 1 - Opera/9.80 (Android; Opera Mini/7.5.33361/29.3530; U; en) Presto/2.8.119 Version/11.10 - 40 / 13 / 13 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0.1) Gecko/20100101 Firefox/5.0.1 - 40 / 4 / 5 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU) - 39 / 19 / 0 - Twitterbot/1.0 - 38 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; chromeframe/26.0.1410.64; EasyBits GO v1.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 37 / 4 / 0 - Opera/9.80 (Android; Opera Mini/7.0.29733/29.3271; U; en) Presto/2.8.119 Version/11.10 - 37 / 16 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25 - 37 / 3 / 4 - Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B208 Safari/7534.48.3 - 37 / 11 / 14 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/10.04 Chromium/18.0.1025.168 Chrome/18.0.1025.168 Safari/535.19 - 37 / 4 / 4 - Mozilla/5.0 (Linux; Android 4.0.4; ST26i Build/11.0.A.3.18) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 37 / 1 / 0 - Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/ADR-1301071820) Presto/2.11.355 Version/12.10 - 36 / 16 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729) - 36 / 3 / 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 - 36 / 2 / 4 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9300 Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 36 / 4 / 0 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 - 35 / 6 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 sputnik 2.5.3.53 - 35 / 3 / 4 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MASMJS) - 35 / 9 / 5 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Ubuntu Chromium/24.0.1312.56 Chrome/24.0.1312.56 Safari/537.17 - 35 / 4 / 7 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.56 Safari/537.36 - 34 / 2 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31 - 34 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 - 33 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:18.0) Gecko/20130119 Firefox/18.0 - 33 / 3 / 0 - Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.50 Mobile/10B141 Safari/8536.25 - 33 / 2 / 5 - Mozilla/5.0 (Linux; Android 4.0.3; HUAWEI MediaPad Build/HuaweiMediaPad) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 - 33 / 3 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 32 / 4 / 0 - Mozilla/5.0 (Linux; Android 4.1.2; ST26i Build/11.2.A.0.21) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 32 / 4 / 6 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 32 / 2 / 6 - Mozilla/5.0 (Android; Tablet; rv:20.0) Gecko/20.0 Firefox/20.0 - 32 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (via ggpht.com) - 32 / 3 / 5 - Mozilla/5.0 (Windows NT 6.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 - 32 / 26 / 0 - JS-Kit URL Resolver, http://js-kit.com/ - 32 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 - 32 / 1 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Ubuntu Chromium/23.0.1271.97 Chrome/23.0.1271.97 Safari/537.11 - 32 / 29 / 0 - Mozilla/5.0 (compatible; SISTRIX Crawler; http://crawler.sistrix.net/) - 32 / 27 / 0 - Mozilla/5.0 (compatible; TweetmemeBot/3.0; http://tweetmeme.com/) - 32 / 7 / 0 - Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.13 - 31 / 5 / 5 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B145 [FBAN/FBIOS;FBAV/6.0.2;FBBV/183159;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.1.1;FBSS/2; FBCR/O2;FBID/phone;FBLC/en_US;FBOP/1] - 31 / 9 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20130403 Firefox/19.0 - 31 / 3 / 0 - Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146 - 31 / 3 / 1 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25 - 31 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 30 / 2 / 5 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Win64; x64; Trident/4.0; Avant Browser; .NET CLR 2.0.50727) - 30 / 1 / 0 - Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.50 Mobile/10B146 Safari/8536.25 - 30 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.0.04506.30; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 30 / 4 / 3 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 - 30 / 7 / 7 - Opera/9.80 (Windows NT 6.1; WOW64; Edition Yx) Presto/2.12.388 Version/12.14 - 29 / 7 / 8 - Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; EVO3D_X515m Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 29 / 2 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0 - 29 / 4 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.229 Version/11.64 - 29 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E) - 29 / 5 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; HTC_DesireS_S510e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 28 / 3 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; (R1 1.6); AskTbIMB/5.9.1.14019) - 28 / 2 / 3 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22 - 28 / 0 / 4 - Opera/9.80 (Windows NT 6.1; U; en) Presto/2.10.289 Version/12.01 - 28 / 24 / 0 - Mozilla/5.0 (compatible; PaperLiBot/2.1; http://support.paper.li/entries/20023257-what-is-paper-li) - 28 / 3 / 2 - Mozilla/5.0 (Android; Tablet; rv:21.0) Gecko/21.0 Firefox/21.0 - 28 / 2 / 0 - Mozilla/5.0 (Linux; Android 4.2.2; Galaxy Nexus Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.54 Mobile Safari/537.31 - 28 / 2 / 0 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 - 28 / 3 / 4 - Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0 - 28 / 1 / 1 - Mozilla/5.0 (Android; Mobile; rv:20.0) Gecko/20.0 Firefox/20.0 - 27 / 21 / 1 - Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.11 - 27 / 2 / 0 - Opera/9.80 (Android; Opera Mini/6.5.29194/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 27 / 1 / 3 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 5972)) Presto/2.12.388 Version/12.15 - 27 / 2 / 0 - Opera/9.80 (Windows NT 6.0; U; ru) Presto/2.8.131 Version/11.10 - 27 / 1 / 1 - Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.6) Gecko/20100625 MRA 5.5 (build 02842) Firefox/3.6.6 ( .NET CLR 3.5.30729; .NET4.0C) sputnik 2.5.0.142 - 27 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64; Trident/6.0) - 27 / 3 / 5 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30 - 27 / 1 / 0 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I8190 Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 26 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; AskTbFF/5.15.4.23821; MSOffice 12) - 26 / 2 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 - 26 / 1 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 - 26 / 4 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; BRI/2) - 26 / 20 / 0 - Mozilla/5.0 (compatible; ZumBot/1.0; http://help.zum.com/inquiry) - 26 / 7 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34 - 25 / 2 / 2 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 920) - 25 / 3 / 3 - Opera/9.80 (J2ME/MIDP; Opera Mini/7.1.32052/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 25 / 6 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28 - 25 / 2 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.40 Safari/537.31 - 25 / 2 / 2 - Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireHD_A9191 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 25 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 1.1.4322) - 25 / 1 / 4 - Mozilla/5.0 (Linux; Android 4.0.4; ST25i Build/6.1.1.B.1.10) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 25 / 12 / 2 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2) - 25 / 2 / 0 - Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; Liquid MT Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 25 / 2 / 2 - Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 25 / 4 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0 - 24 / 3 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130404 Firefox/23.0 - 24 / 4 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:19.0) Gecko/20100101 Firefox/19.0 - 24 / 0 / 0 - Wget/1.14 (linux-gnu) - 24 / 14 / 0 - Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) - 24 / 1 / 1 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 24 / 2 / 0 - Opera/9.80 (Windows NT 6.2; WOW64) Presto/2.12.388 Version/12.14 - 24 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; BRI/2) - 24 / 2 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 YB/5.1.3 - 23 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1 - 23 / 1 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch) - 23 / 3 / 3 - Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 - 22 / 1 / 0 - Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 - 22 / 2 / 0 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.5.24 Version/10.53 - 22 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/6.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; ms-office; MSOffice 14) - 22 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) - 22 / 2 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.10 - 22 / 3 / 4 - Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 22 / 2 / 2 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20130430 Firefox/20.0 - 22 / 2 / 2 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.28 (KHTML, like Gecko) Chrome/26.0.1397.2 Safari/537.28 - 22 / 6 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.1634 Safari/535.19 YE - 22 / 20 / 0 - MetaURI API/2.0 metauri.com - 21 / 1 / 2 - Mozilla/5.0 (Linux; Android 4.1.2; SAMSUNG-SGH-I727 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 21 / 2 / 2 - Opera/9.80 (Android 4.1.2; Linux; Opera Mobi/ADR-1301071820) Presto/2.11.355 Version/12.10 - 21 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 - 21 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.47 Safari/535.11 MRCHROME - 21 / 21 / 0 - Mozilla/3.0 (compatible; Indy Library) - 20 / 2 / 0 - Opera/9.80 (Windows NT 6.1; U; Edition Campaign 09; ru) Presto/2.9.168 Version/11.52 - 20 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.0.30729) - 20 / 2 / 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B143 Safari/8536.25 - 20 / 3 / 5 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; SonyST26i Build/11.2.A.0.21) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 20 / 10 / 0 - Microsoft Data Access Internet Publishing Provider Protocol Discovery - 20 / 14 / 0 - curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 - 20 / 0 / 1 - Mozilla/5.0 (compatible; MSIE 10.0; AOL 9.6; AOLBuild 4340.168; Windows NT 6.1; Trident/6.0) - 19 / 1 / 0 - Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 - 19 / 1 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 - 19 / 3 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.4 (KHTML, like Gecko) Ubuntu/12.10 Chromium/22.0.1229.94 Chrome/22.0.1229.94 Safari/537.4 - 19 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 19 / 1 / 0 - Opera/9.80 (Windows NT 6.1; U; Edition Ukraine Local; ru) Presto/2.9.168 Version/11.52 - 19 / 0 / 1 - Opera/9.80 (Windows NT 6.1; MRA 6.0 (build 6089)) Presto/2.12.388 Version/12.15 - 19 / 0 / 0 - Mozilla/5.0 (compatible; special_archiver/3.1.1 http://www.archive.org/details/archive.org_bot) - 19 / 2 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0) - 19 / 0 / 1 - Opera/9.80 (Windows NT 5.1; Edition Rambler) Presto/2.12.388 Version/12.15 - 19 / 0 / 1 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.289 Version/12.00 - 19 / 3 / 1 - Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0 - 18 / 1 / 0 - Mozilla/5.0 (Windows NT 5.2; rv:17.0) Gecko/20100101 Firefox/17.0 - 18 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS124829; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 18 / 1 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3183; U; ru) Presto/2.8.119 Version/11.10 - 18 / 3 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.3; MS-RTC LM 8) - 18 / 2 / 2 - Mozilla/5.0 (Linux; Android 4.0.3; U9200 Build/HuaweiU9200) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 18 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1 - 18 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3) - 18 / 11 / 0 - Mozilla/5.0 (compatible - 18 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 18 / 4 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C) - 18 / 1 / 1 - Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; NEWMAN N1 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 18 / 9 / 0 - Mozilla/5.0 (compatible; YandexFavicons/1.0; http://yandex.com/bots) - 17 / 1 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 17 / 0 / 0 - Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 17 / 1 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 - 17 / 1 / 2 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Iron/27.0.1500.0 Chrome/27.0.1500.0 Safari/537.36 - 17 / 1 / 1 - Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2 (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2 - 17 / 1 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19 - 17 / 3 / 3 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3417; U; ru) Presto/2.8.119 Version/11.10 - 17 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2) - 17 / 1 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22 - 17 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 17 / 0 / 1 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11 MRCHROME - 17 / 0 / 1 - Mozilla/5.0 (X11; Linux i686; rv:10.0.11) Gecko/20100101 Firefox/10.0.11 - 17 / 0 / 1 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X; ru-ru) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.82 Mobile/10A523 Safari/7534.48.3 - 16 / 1 / 1 - Opera/9.80 (Windows NT 5.2; WOW64) Presto/2.12.388 Version/12.15 - 16 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 AlexaToolbar/alxf-2.17 - 16 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36 - 16 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.2 (KHTML, like Gecko) Chrome/6.0.447.0 Safari/534.2 - 16 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; LEN2) - 16 / 3 / 0 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146 - 16 / 1 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-I8350) - 16 / 0 / 0 - AppEngine-Google; ( http://code.google.com/appengine; appid: s~pc-gizmos) - 16 / 1 / 3 - Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 16 / 0 / 1 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 - 16 / 1 / 1 - Opera/9.80 (Windows NT 6.2) Presto/2.12.388 Version/12.15 - 15 / 0 / 1 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 u01-04 - 15 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1 - 15 / 0 / 1 - Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 15 / 0 / 1 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20130416 Firefox/22.0 - 15 / 3 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:10.0.5) Gecko/20100101 Firefox/10.0.5 - 15 / 0 / 1 - Opera/9.80 (Android; Opera Mini/7.5.33286/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 15 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC Sensation Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 15 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 15 / 1 / 1 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next) - 15 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; GT-I9070 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 15 / 1 / 0 - Mozilla/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko/20100101 Firefox/14.0.1 - 15 / 0 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 - 15 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 - 15 / 0 / 1 - Opera/9.80 (Windows NT 5.1; U; MRA 5.7 (build 03686); ru) Presto/2.10.289 Version/12.01 - 15 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 15 / 1 / 1 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next) - 15 / 0 / 1 - Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 5970)) Presto/2.12.388 Version/12.15 - 14 / 1 / 3 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20130413 Firefox/20.0 - 14 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.2; .NET CLR 1.1.4322; MS-RTC LM 8) - 14 / 1 / 1 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5 Nichrome/self/19 - 14 / 1 / 0 - Mozilla/5.0 (Linux; Android 4.1.1; GT-N8000 Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 - 14 / 1 / 1 - Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.13907/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 14 / 6 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 - 14 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 14 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS) - 14 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS126674; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) - 14 / 14 / 0 - W3C_Validator/1.3 http://validator.w3.org/services - 14 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I9001 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 14 / 2 / 2 - Opera/9.80 (Android; Opera Mini/7.5.33361/29.3594; U; ru) Presto/2.8.119 Version/11.10 - 14 / 0 / 0 - Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20110328 Firefox/6.0.2 - 14 / 1 / 1 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1485.0 Safari/537.36 - 14 / 1 / 1 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.65 Safari/537.36 - 14 / 2 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 WebMoney Advisor MRA 5.7 (build 03796); - 14 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; DefView; .NET4.0C; Tablet PC 2.0; ya.ru) - 14 / 1 / 1 - Opera/9.80 (Android; Opera Mini/7.5.33361/29.3345; U; en) Presto/2.8.119 Version/11.10 - 13 / 1 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 - 13 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0 - 13 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.2; .NET4.0E; MS-RTC LM 8) - 13 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 13 / 1 / 1 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17 YE - 13 / 1 / 1 - Mozilla/5.0 (Linux; Android 4.1.1; HTC Desire X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 13 / 2 / 1 - Opera/9.80 (Android 2.3.6; Linux; Opera Mobi/ADR-1301071820) Presto/2.11.355 Version/12.10 - 13 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; Dealio Deskball 3.0) - 13 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 13 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; DefView) - 13 / 2 / 0 - Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 - 13 / 1 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1478.0 Safari/537.36 - 13 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30) - 12 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; BTRS129253; MRSPUTNIK 2, 4, 1, 105; MRA 8.0 (build 6017); SIMBAR={FB3C092F-6650-11E2-B314-00197D7E8F2A}; Avant Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Avant Browser) - 12 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3134; U; ru) Presto/2.8.119 Version/11.10 - 12 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 - 12 / 1 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36 - 12 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22 - 12 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 - 12 / 2 / 0 - Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1 - 12 / 0 / 0 - Mozilla/5.0 (compatible) Feedfetcher-Google;( http://www.google.com/feedfetcher.html) - 12 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 12 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) - 12 / 1 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20130405 Firefox/23.0 - 12 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; E15i Build/3.0.1.A.0.145; MiniCM7-2.2.1) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 12 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2) - 12 / 9 / 0 - Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0 - 12 / 1 / 0 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.5.22 Version/10.50 - 12 / 1 / 0 - Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1210091050) Presto/2.11.355 Version/12.10 - 12 / 1 / 1 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.8 (KHTML, like Gecko) Chrome/23.0.1250.0 Safari/537.8 - 12 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC_One_S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 11 / 1 / 1 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.73 Safari/537.36 - 11 / 1 / 1 - Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 - 11 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208 - 11 / 1 / 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B145 - 11 / 1 / 0 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 - 11 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 - 11 / 11 / 0 - Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) - 11 / 1 / 1 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1 - 11 / 1 / 1 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710) - 11 / 0 / 0 - facebookplatform/1.0 ( http://developers.facebook.com) - 11 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 11 / 1 / 0 - Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 - 11 / 0 / 0 - Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8C148 - 11 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.2; .NET CLR 1.1.4322; MS-RTC LM 8; .NET4.0E) - 11 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 11 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 - 10 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.15) Gecko/20101026 Firefox/3.5.15 - 10 / 4 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.10 Chromium/14.0.835.202 Chrome/14.0.835.202 Safari/535.1 - 10 / 2 / 0 - Mozilla/4.0 (compatible; MSIE 5.0; Windows 3.1; TUCOWS Network) - 10 / 8 / 0 - Kimengi/nineconnections.com - 10 / 0 / 0 - AppEngine-Google; ( http://code.google.com/appengine; appid: s~testpzgizmo) - 10 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) - 9 / 0 / 0 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10 - 9 / 5 / 0 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.50 Mobile/10B329 Safari/8536.25 - 9 / 3 / 0 - Mozilla/5.0 (compatible; AhrefsBot/4.0; http://ahrefs.com/robot/) - 9 / 1 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; en-ru; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 9 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MS-RTC LM 8; AskTbFXTV5/5.15.15.35882; MSOffice 12) - 9 / 4 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0 - 9 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.47 Safari/537.36 - 9 / 1 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6 - 9 / 7 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; en) Presto/2.10.289 Version/12.01 - 8 / 0 / 0 - Mozilla/4.0 (compatible;) - 8 / 1 / 0 - Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Qt/4.7.1 Safari/533.3 - 8 / 8 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9) Gecko/2008052906 Firefox/3.0 - 8 / 0 / 0 - Mozilla/5.0 (X11; Linux x86_64) KHTML/4.10.1 (like Gecko) Konqueror/4.10 - 8 / 0 / 0 - MobileSafari/8536.25 CFNetwork/609 Darwin/13.0.0 - 8 / 6 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/26.0.1410.64) - 7 / 0 / 0 - Microsoft-WebDAV-MiniRedir/6.2.9200 - 7 / 0 / 0 - Mozilla/5.0 (compatible; bingbot/2.0; http://www.bing.com/bingbot.htm) SitemapProbe - 7 / 0 / 0 - Sogou web spider/4.0( http://www.sogou.com/docs/help/webmasters.htm#07) - 7 / 3 / 0 - Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:11.0) Gecko/20120313 Firefox/11.0 - 7 / 3 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/17.0 Firefox/17.0 - 7 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; Edition Next) Presto/2.12.388 Version/12.12 - 6 / 0 / 0 - Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 - 6 / 0 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20130512 Firefox/20.0 - 6 / 0 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17 - 6 / 0 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14 - 6 / 0 / 0 - Mozilla/5.0 (compatible; Google Desktop/5.9.1005.12335; http://desktop.google.com/) - 6 / 6 / 0 - Opera/9.80 (Windows NT 6.1; Edition Yx) Presto/2.12.388 Version/12.10 - 6 / 5 / 0 - Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.10 - 6 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/6.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AlexaToolbar/amzni-3.0; MALN; ms-office; MSOffice 14) - 6 / 3 / 0 - peerindex - 6 / 0 / 0 - Mozilla/5.001 (windows; U; NT4.0; en-us) Gecko/25250101 - 6 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:6.0.1) Gecko/20100101 Firefox/6.0.1 - 5 / 0 / 0 - Mozilla/3.0 (OS/2; U) - 5 / 3 / 0 - msnbot-NewsBlogs/2.0b ( http://search.msn.com/msnbot.htm) - 5 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.61 - 5 / 3 / 0 - Opera/9.80 (Android 2.3.5; Linux; Opera Mobi/ADR-1210241511) Presto/2.11.355 Version/12.10 - 5 / 1 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 - 5 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 u01-09 - 5 / 5 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 - 5 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17 - 5 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) - 5 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; InfoPath.2) - 5 / 2 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.289 Version/12.00 - 4 / 0 / 0 - Mozilla/5.0 (Linux; Android 4.1.1; A701 Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 - 4 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1518.0 Safari/537.36 - 4 / 2 / 0 - Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.10.289 Version/12.00 - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; MSOffice 12) - 4 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648) - 4 / 0 / 0 - MSFrontPage/12.0 - 4 / 0 / 0 - Mozilla/4.61 (Macintosh; I; PPC) - 4 / 0 / 0 - Mozilla/4.0 (compatible; MS FrontPage 12.0) - 4 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648) - 4 / 0 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.102 Safari/535.2 - 4 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) - 4 / 4 / 0 - DavClnt - 4 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.40607; .NET CLR 3.0.04506.648) - 4 / 0 / 0 - Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17 - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E) - 4 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.40607; .NET CLR 3.0.04506.648) - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2) - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; 1A820D29-8445-92BE-2384-712BBCEDFDB1; MRSPUTNIK 2, 4, 1, 12; BTRS124447; GTB7.4; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727; AskTbFXTV5/5.8.0.12304; MSOffice 12) - 4 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3183; U; en) Presto/2.8.119 Version/11.10 - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6.6; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 4 / 4 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1 - 4 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 AlexaToolbar/alxg-3.1 - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AlexaToolbar/amzni-3.0; MALN; MSOffice 12) - 4 / 1 / 1 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; SLCC1; .NET CLR 1.1.4322; .NET CLR 2.0.40607; .NET CLR 3.0.04506.648) - 4 / 3 / 0 - Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); http://www.exabot.com/go/robot) - 4 / 1 / 1 - Mozilla/5.0 (Linux; U; Android 2.3.3; ru-ru; LG-P500 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2 - 4 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3271; U; en) Presto/2.8.119 Version/11.10 - 4 / 0 / 0 - Opera/9.80 (Windows NT 6.1; MRA 5.8 (build 4664)) Presto/2.12.388 Version/12.10 - 4 / 0 / 0 - MobileSafari/8536.25 CFNetwork/609.1.4 Darwin/13.0.0 - 4 / 0 / 0 - Sogou web spider/4.0 - 4 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.1; .NET4.0C) - 3 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02 - 3 / 1 / 0 - Mozilla/5.0 (compatible; archive.org_bot http://www.archive.org/details/archive.org_bot) - 3 / 2 / 0 - Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.11 - 3 / 0 / 0 - Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3 - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C) - 3 / 0 / 0 - Googlebot-Video/1.0 - 3 / 1 / 0 - Xenu Link Sleuth/1.3.8 - 3 / 0 / 0 - Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 6089)) Presto/2.12.388 Version/12.15 - 3 / 0 / 0 - WordPress/3.5.1; http://peterpen-ctf.net - 3 / 2 / 0 - Lynx/2.8.8dev.15 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.20 - 3 / 3 / 0 - Java/1.6.0_26 - 3 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0 - 3 / 0 / 0 - Xenu Link Sleuth/1.3.9 beta - 3 / 0 / 0 - Opera/9.80 (Series 60; Opera Mini/7.0.29482/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 3 / 0 / 0 - WordPress/3.5.1; https://peterpen-ctf.net - 3 / 2 / 0 - Opera/9.80 (Windows NT 5.1; Edition Yx) Presto/2.12.388 Version/12.11 - 3 / 0 / 0 - URLGrabber - 3 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 2.2.1; ru-ru; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 3 / 0 / 0 - Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 5711)) Presto/2.12.388 Version/12.15 - 3 / 0 / 0 - Microsoft Office Word 2013 - 3 / 2 / 0 - Mozilla/5.0 (Windows NT 6.2; rv:16.0) Gecko/20100101 Firefox/16.0 - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser) - 3 / 0 / 0 - AndroidDownloadManager - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 3 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 3 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0 - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) - 3 / 0 / 0 - GFGET/0.1 - 3 / 0 / 0 - Wget/1.10.1 - 3 / 0 / 0 - Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition MacAppStore; ru) Presto/2.9.168 Version/11.52 - 3 / 0 / 0 - Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.15 - 3 / 2 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.12 (KHTML, like Gecko) Maxthon/3.0 Chrome/18.0.966.0 Safari/535.12 - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 508; GTB7.4; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) - 3 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; ms-office; MSOffice 14) - 3 / 0 / 0 - ia_archiver(OS-Wayback) - 2 / 1 / 0 - Links (2.7; Linux 3.8.0-19-generic i686; GNU C 4.7.1; text) - 2 / 2 / 0 - Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector; http://yandex.com/bots) - 2 / 0 / 0 - Mozilla/5.0 (en-us) AppleWebKit/534.14 (KHTML, like Gecko; Google Wireless Transcoder) Chrome/9.0.597 Safari/534.14 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.03 [de] - 2 / 0 / 0 - Mozilla/5.0 (Android; Tablet; rv:17.0) Gecko/17.0 Firefox/17.0 - 2 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/6.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AlexaToolbar/amzni-3.0; MALN) - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0) - 2 / 0 / 0 - Opera/9.80 (Windows NT 5.1; Edition Yx) Presto/2.12.388 Version/12.15 - 2 / 0 / 1 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1) - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 - 2 / 0 / 0 - Mozilla/5.0 (Linux; Android 4.0.4; MT27i Build/6.1.1.B.1.54) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3134; U; en) Presto/2.8.119 Version/11.10 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 - 2 / 2 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.52.7 (KHTML, like Gecko) Version/5.1.2 Safari/534.52.7 - 2 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 5.8 (build 4133)) Presto/2.12.388 Version/12.15 - 2 / 0 / 0 - User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 2 / 0 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:20.0) Gecko/20130507 Firefox/20.0 - 2 / 2 / 0 - Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com) - 2 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 - 2 / 1 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 5976)) Presto/2.12.388 Version/12.11 - 2 / 1 / 0 - DoCoMo/2.0 P900i(c100;TB;W24H11) (compatible; ichiro/mobile goo; http://search.goo.ne.jp/option/use/sub4/sub4-1/) - 2 / 0 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0 - 2 / 1 / 0 - Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.91 Safari/537.11 - 2 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0 - 2 / 1 / 0 - Opera/9.80 (Windows NT 6.1; MRA 6.0 (build 5976)) Presto/2.12.388 Version/12.10 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRA 5.5 (build 02842); InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 2 / 1 / 1 - Opera/9.80 (X11; Linux x86_64; Edition Next) Presto/2.12.388 Version/12.15 - 2 / 2 / 0 - Java/1.6.0_35 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0 05/02/2013 3:20:45 AM - 2 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; PAP4040_DUO Build/PrestigioPAP4040DUO) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 2 / 1 / 0 - Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.11 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.3; .NET4.0E; MS-RTC LM 8; Microsoft Outlook 14.0.6025; ms-office; MSOffice 14) - 2 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11) Firefox/1.5.0.11; 360Spider - 2 / 0 / 0 - Mozilla/5.0 (X11; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0 TinEye/1.0 (via http://www.tineye.com/) - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Win64; x64; Trident/4.0; Avant Browser; .NET CLR 2.0.50727) - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32195/29.3417; U; ru) Presto/2.8.119 Version/11.10 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS129253; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET4.0C; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 2 / 1 / 0 - Mozilla/5.0 - 2 / 1 / 0 - Mozilla/5.0 (Windows NT 6.0; rv:16.0) Gecko/20100101 Firefox/16.0 - 2 / 2 / 0 - Mozilla/4.0 (compatible; Netcraft Web Server Survey) - 2 / 0 / 0 - Opera/9.80 (Windows NT 5.1; Edition Yx) Presto/2.12.388 Version/12.14 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MANM) - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32195/29.3638; U; ru) Presto/2.8.119 Version/11.10 - 2 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.1.1084.5409 Chrome/19.1.1084.5409 Safari/536.5 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5 Nichrome/self/19 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 1, 209; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C) - 2 / 0 / 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A525 Safari/8536.25 - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32195/29.3134; U; ru) Presto/2.8.119 Version/11.10 - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/6.5.29194/29.3507; U; ru) Presto/2.8.119 Version/11.10 - 2 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; eSobiSubscriber 1.0.0.40; BRI/2; MAAR; .NET4.0C) - 2 / 2 / 0 - Crowsnest/0.5 ( http://www.crowsnest.tv/) - 2 / 1 / 0 - Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.10 - 2 / 0 / 0 - Mozilla/5.0 (Linux; Android 4.1.2; GT-N8000 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36 - 2 / 1 / 0 - Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3) - 2 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.289 Version/12.01 - 2 / 0 / 0 - Opera/9.80 (Windows NT 6.1; Edition Ukraine Local) Presto/2.12.388 Version/12.12 - 2 / 0 / 0 - Mozilla/5.0 (iPad; U; CPU OS 4_3_5 like Mac OS X; ru-ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5 - 2 / 1 / 0 - netEstate NE Crawler ( http://www.website-datenbank.de/) - 2 / 1 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 - 2 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.7; Google-SearchByImage) Gecko/2009021910 Firefox/3.0.7 - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3345; U; en) Presto/2.8.119 Version/11.10 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1485.0 Safari/537.36 - 2 / 1 / 0 - Links (2.7; Linux 3.8.8 x86_64; GNU C 4.7.1; text) - 2 / 1 / 0 - SurcentroBot - 2 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MANMJS) - 2 / 2 / 0 - Mozilla/5.0 (compatible; Firefox Addon; Windows XP 5.1) - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 516; GTB7.4; MRA 5.10 (build 5310); .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 2 / 0 / 0 - Mozilla/5.0 (Java; U; ru; nokiac5-00) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.6.0.199/69/444/UCWEB Mobile UNTRUSTED/1.0 3gpp-gba - 2 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.0.29530/29.3709; U; ru) Presto/2.8.119 Version/11.10 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre - 2 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MASMJS) - 2 / 2 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 - 2 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; NP06) - 2 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; InfoPath.3) - 2 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 - 2 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6.6; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.30618; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; .NET4.0C) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30 Nichrome/self/12 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0 IceDragon/20.0.1.14 - 1 / 0 / 0 - Opera/9.80 (Android; Opera Mini/7.0.29952/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.96 Safari/537.4 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.13 - 1 / 1 / 0 - SEO Browser - 1 / 0 / 0 - CodeGator Crawler v1.0 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0) Gecko/20100101 Firefox/7.0 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; InfoPath.1) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; MRA 6.0 (build 6068)) Presto/2.12.388 Version/12.15 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 5972)) Presto/2.12.388 Version/12.15 - 1 / 0 / 0 - Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10 - 1 / 1 / 0 - Microsoft Office Mobile /14.0 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/17.0 Firefox/17.0 - 1 / 1 / 0 - Opera/9.80 (Windows NT 5.1; U; YB/3.5.1; ru) Presto/2.10.229 Version/11.64 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 - 1 / 0 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 1 / 0 / 0 - Opera/9.80 (J2ME/MIDP; Opera Mini/7.1.32052/29.3417; U; ru) Presto/2.8.119 Version/11.10 - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ENUS) - 1 / 1 / 0 - Opera/9.80 (Windows NT 6.2; WOW64) Presto/2.12.388 Version/12.11 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; U; MRA 5.8 (build 4664); ru) Presto/2.10.229 Version/11.60 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0 - 1 / 1 / 0 - Opera/9.80 (Windows NT 6.1; MRA 6.0 (build 5970)) Presto/2.12.388 Version/12.11 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 5704)) Presto/2.12.388 Version/12.11 - 1 / 1 / 0 - Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1) Gecko/20090630 Fedora/3.5-1.fc11 Firefox/3.5 GTB5 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 999.1; Unknown) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/6.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AlexaToolbar/amzni-3.0; MALN; ms-office) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; MRA 8.0 (build 6008)) Presto/2.12.388 Version/12.14 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; TencentTraveler ; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727 ; .NET CLR 4.0.30319) - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; MRA 5.7 (build 03789)) Presto/2.12.388 Version/12.15 - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MASMJS) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Nevz Group Policy option; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; Nevz Group Policy option) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; Edition Yx) Presto/2.12.388 Version/12.10 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MS-RTC LM 8; ms-office; MSOffice 14) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; Edition Next; Edition Yx; ru) Presto/2.11.310 Version/12.50 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20121026 Firefox/16.0 SeaMonkey/2.13.2 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 TinEye/1.0 (via http://www.tineye.com/) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; {E3AFBC29-379F-6981-3477-F67AEAD253D3}; .NET CLR 1.1.4322; .NET CLR 2.0.50727; OfficeLiveConnector.1.3; OfficeLivePatch.0.0) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; DepositFiles/FileManager 0.9.9.206 YB/5.0.3) Presto/2.12.388 Version/12.14 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 2, 0, 86; MRIE8PACK 2.0.1) - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.60 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.9.168 Version/11.51 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; MRA 6.0 (build 5972)) Presto/2.12.388 Version/12.10 - 1 / 0 / 0 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 - 1 / 1 / 0 - Jakarta Commons-HttpClient/3.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729) - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto/2.12.388 Version/12.11 - 1 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; MRA 4.9 (build 01863); MRSPUTNIK 2, 4, 1, 162) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 1 / 0 / 0 - Opera/9.80 (X11; Linux i686; U; ru) Presto/2.7.62 Version/11.01 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.53 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.3; .NET4.0E; ms-office; MSOffice 14) - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.9.168 Version/11.50 - 1 / 0 / 0 - Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; ru-ru) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/3.0 Chrome/22.0.1229.79 Safari/537.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.1.1084.5409 Chrome/19.1.1084.5409 Safari/536.5 - 1 / 1 / 0 - Opera/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.289 Version/12.02 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1.0 Safari/537.11 - 1 / 1 / 0 - MFE_expand/0.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.60 Safari/534.24 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.1) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0) Gecko/20100101 Firefox/9.0 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 - 1 / 0 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 - 1 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 - 1 / 0 / 0 - Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; ru-ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; MRA 6.0 (build 5998)) Presto/2.12.388 Version/12.11 - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MASEJS) - 1 / 0 / 0 - Linguee Bot (http://www.linguee.com/bot; bot@linguee.com) - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.289 Version/12.00 - 1 / 0 / 0 - Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; MRA 5.9 (build 4953); ru) Presto/2.10.229 Version/11.60 - 1 / 0 / 0 - HttpComponents/1.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0 05/02/2013 3:20:44 AM - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/6.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; ms-office) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 - 1 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; GT-I9100 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 1 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13 BuiltWith/1.2 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 5.2; rv:12.0) Gecko/20100101 Firefox/12.0 - 1 / 1 / 0 - Opera/9.80 (Windows NT 5.1; U; MRA 8.0 (build 5784); ru) Presto/2.10.289 Version/12.02 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 - 1 / 1 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.82 Safari/537.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.2; rv:14.0) Gecko/20100101 Firefox/14.0.1 - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; KB974488) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.10 (build 5218); MRSPUTNIK 2, 4, 0, 501; InfoPath.2) - 1 / 0 / 0 - QuerySeekerSpider ( http://queryseeker.com/bot.html ) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2) - 1 / 1 / 0 - PageAnalyzer/1.3b (www.the-escape.co.uk) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; MRA 6.0 (build 6005); User-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1); .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; .NET4.0C; .NET4.0E; MRIE8PACK 2.0.1) - 1 / 1 / 0 - CheckSite Verification Agent ( http://www.checksite.us) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Iron/25.0.1400.0 Chrome/25.0.1400.0 Safari/537.22 - 1 / 1 / 0 - EventMachine HttpClient - 1 / 0 / 0 - Mozilla/5.0 (Android; Mobile; rv:20.0.1) Gecko/20.0.1 Firefox/20.0.1 - 1 / 1 / 0 - Opera/9.80 (Windows NT 6.1; U; YB/3.5.1; ru) Presto/2.6.30 Version/10.63 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 8.0 (build 5988)) Presto/2.12.388 Version/12.15 - 1 / 1 / 0 - Opera/9.80 (Windows NT 6.1; U; Edition Next; ru) Presto/2.11.310 Version/12.50 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; U; Edition Yx; ru) Presto/2.10.289 Version/12.02 - 1 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22,gzip(gfe) (via docs.google.com/viewer) - 1 / 1 / 0 - Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.10 - 1 / 1 / 0 - Apache-HttpClient/4.2.3 (java 1.5) - 1 / 1 / 0 - Mozilla/5.0 (compatible; NetSeer crawler/2.0; http://www.netseer.com/crawler.html; crawler@netseer.com) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 (C67D51D4-DE8A-25CA-C613-17B73EBB7584) Firefox/7.0.1 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 - 1 / 0 / 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22 CoolNovo/2.0.7.11 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20100101 Firefox/20.0 SeaMonkey/2.17.1 - 1 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1469.0 Safari/537.36 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.65 Safari/537.36 - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; BOIE9;RURU) - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20 - 1 / 1 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; MRA 8.0 (build 5880); ru) Presto/2.10.289 Version/12.02 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.15 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.25) Gecko/20111212 Firefox/3.6.25 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en] - 1 / 1 / 0 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Contact: feedback@getprismatic.com - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30618; .NET4.0C) - 1 / 0 / 0 - Opera/9.80 (Android 4.0.3; Linux; Opera Tablet/ADR-1301080958) Presto/2.11.355 Version/12.10 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 1, 105; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; AskTbPTV/5.15.1.22229; .NET4.0C) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.2; MRSPUTNIK 2, 4, 1, 105; InfoPath.1) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.1634 Safari/535.19 YI - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) YaBrowser/1.1.1084.5409 Chrome/19.1.1084.5409 Safari/536.5 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 6048)) Presto/2.12.388 Version/12.15 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.2; WOW64; Edition Yx) Presto/2.12.388 Version/12.14 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.10 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; Edition Next; ru) Presto/2.9.220 Version/12.00 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; MRA 6.0 (build 5680); ru) Presto/2.10.289 Version/12.00 - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0,gzip(gfe) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 6015)) Presto/2.12.388 Version/12.15 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590) - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729) - 1 / 0 / 0 - NSPlayer/12.00.7601.17514 WMFSDK/12.00.7601.17514 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; U; MRA 5.9 (build 4953); ru) Presto/2.10.229 Version/11.60 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 5.10 (build 5310)) Presto/2.12.388 Version/12.10 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.229 Version/11.62 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31 AlexaToolbar/alxg-3.1 - 1 / 1 / 0 - Microsoft Office Mobile/15.0 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.2; rv:20.0) Gecko/20100101 Firefox/20.0 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.51 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729; .NET4.0E) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 516; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0) - 1 / 0 / 0 - Dalvik/1.6.0 (Linux; U; Android 4.1.2; GT-I9100 Build/JZO54K) - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;RURUWOL) - 1 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 - 1 / 0 / 0 - (null) - 1 / 0 / 0 - Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322) - 1 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; MS-RTC LM 8; BRI/2; .NET4.0E) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.0; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0 - 1 / 0 / 0 - Opera/9.80 (Series 60; Opera Mini/7.1.32449/29.3530; U; ru) Presto/2.8.119 Version/11.10 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.2.2.0 Safari/537.31 - 1 / 0 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1105.412 YaBrowser/1.5.1105.412 Safari/537.4 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1300.0 Iron/23.0.1300.0 Safari/537.11 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.289 Version/12.02 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; MSOffice 12) - 1 / 0 / 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 1 / 0 / 0 - Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.01 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.91 Safari/537.11 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; MRA 6.0 (build 6001); ru) Presto/2.10.289 Version/12.01 - 1 / 0 / 0 - Opera/9.64 (Windows NT 5.1; U; ru) Presto/2.1.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.0; U; ru) Presto/2.9.168 Version/11.50 - 1 / 1 / 0 - Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.10 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.229 Version/11.62 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 YE - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.3; .NET CLR 2.0.50727) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; ru; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 11.60 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; MRA 5.8 (build 4157)) Presto/2.12.388 Version/12.14 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 5.1; en-US) AppleWebKit/535.12 (KHTML, like Gecko) Version/5.0.1 Safari/535.12 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; MRSPUTNIK 2, 4, 0, 501; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 5976)) Presto/2.12.388 Version/12.14 - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; MSOffice 12) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; Win64; x64; Edition Yx) Presto/2.12.388 Version/12.11 - 1 / 0 / 0 - rarely used - 1 / 1 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 - 1 / 1 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C) - 1 / 0 / 0 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; MRSPUTNIK 2, 4, 1, 105; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Tablet PC 2.0) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31 AlexaToolbar/pDvbmwUg-1.3 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; NP06) - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0 - 1 / 0 / 0 - Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20100101 Firefox/20.0 - 1 / 0 / 0 - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; MSOffice 12) - 1 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0 - 1 / 0 / 0 - Opera/9.80 (Android 4.0.3; Linux; Opera Mobi/ADY-1305080823) Presto/2.11.355 Version/12.10 - 1 / 0 / 0 - Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.13057/29.3530; U; ru) Presto/2.8.119 Version/11.10 - 1 / 1 / 0 - Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19 YB/3.5.1 (.NET CLR 3.5.30729) - 1 / 0 / 0 - Opera/9.80 (Windows NT 6.1; WOW64; MRA 6.0 (build 6042)) Presto/2.12.388 Version/12.15 - - botreq / bothits (26916 / 12055) - user_agent (40) -5448 / 0 - msnbot-media/1.1 ( http://search.msn.com/msnbot.htm) -4162 / 2557 - Mozilla/5.0 (compatible; Googlebot/2.1; http://www.google.com/bot.html) -3202 / 0 - Mozilla/5.0 (compatible; YandexImages/3.0; http://yandex.com/bots) -3038 / 2351 - Mozilla/5.0 (compatible; bingbot/2.0; http://www.bing.com/bingbot.htm) -2650 / 2044 - Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html) -1937 / 1676 - Mozilla/5.0 (compatible; YandexBot/3.0; http://yandex.com/bots) -1900 / 0 - Googlebot-Image/1.0 -1543 / 1408 - Mozilla/5.0 (compatible; SearchBot) - 519 / 280 - SolomonoBot/1.04 (http://www.solomono.ru) - 400 / 387 - Mozilla/5.0 (compatible; Linux i686; Yandex.Gazeta Bot/1.0; http://gazeta.yandex.ru) - 303 / 293 - Mozilla/5.0 (compatible; Linux x86_64; Mail.RU_Bot/2.0; http://go.mail.ru/help/robots) - 250 / 218 - msnbot/2.0b ( http://search.msn.com/msnbot.htm) - 244 / 0 - Googlebot/2.1 ( http://www.google.com/bot.html) - 185 / 154 - SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html) - 183 / 61 - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; http://www.changedetection.com/bot.html ) - 175 / 148 - DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; http://www.google.com/bot.html) - 132 / 113 - Mozilla/5.0 (compatible; Mail.RU_Bot/2.0; http://go.mail.ru/help/robots) - 121 / 58 - Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com) - 75 / 56 - Mozilla/5.0 (compatible; MJ12bot/v1.4.3; http://www.majestic12.co.uk/bot.php? ) - 72 / 40 - Mozilla/5.0 (compatible; YandexDirect/3.0; http://yandex.com/bots) - 51 / 41 - Mozilla/5.0 (compatible; TweetedTimes Bot/1.0; http://tweetedtimes.com) - 47 / 39 - Wotbox/2.01 ( http://www.wotbox.com/bot/) - 40 / 0 - Mozilla/5.0 (compatible; YandexImageResizer/2.0; http://yandex.com/bots) - 40 / 19 - rogerbot/1.0 (http://www.seomoz.org/dp/rogerbot, rogerbot-crawler shiny@seomoz.org) - 39 / 19 - Twitterbot/1.0 - 32 / 27 - Mozilla/5.0 (compatible; TweetmemeBot/3.0; http://tweetmeme.com/) - 28 / 24 - Mozilla/5.0 (compatible; PaperLiBot/2.1; http://support.paper.li/entries/20023257-what-is-paper-li) - 26 / 20 - Mozilla/5.0 (compatible; ZumBot/1.0; http://help.zum.com/inquiry) - 19 / 0 - Mozilla/5.0 (compatible; special_archiver/3.1.1 http://www.archive.org/details/archive.org_bot) - 18 / 9 - Mozilla/5.0 (compatible; YandexFavicons/1.0; http://yandex.com/bots) - 9 / 3 - Mozilla/5.0 (compatible; AhrefsBot/4.0; http://ahrefs.com/robot/) - 7 / 0 - Mozilla/5.0 (compatible; bingbot/2.0; http://www.bing.com/bingbot.htm) SitemapProbe - 5 / 3 - msnbot-NewsBlogs/2.0b ( http://search.msn.com/msnbot.htm) - 4 / 3 - Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter); http://www.exabot.com/go/robot) - 3 / 0 - Googlebot-Video/1.0 - 3 / 1 - Mozilla/5.0 (compatible; archive.org_bot http://www.archive.org/details/archive.org_bot) - 2 / 1 - SurcentroBot - 2 / 2 - Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector; http://yandex.com/bots) - 1 / 0 - Linguee Bot (http://www.linguee.com/bot; bot@linguee.com) - 1 / 0 - QuerySeekerSpider ( http://queryseeker.com/bot.html ) - - mobihits (1107) - user_agent (156) -181 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25 -176 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25 - 76 - Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 - 60 - Mozilla/5.0 (Linux; U; Android 2.2; ru-ru; HTC_Gratia_A6380 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 30 - Mozilla/5.0 (Linux; Android 4.0.4; HTC Incredible S Build/IMM76D) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 26 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25 - 25 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart T8698) - 24 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25 - 24 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25 - 21 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 - 19 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9300 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 18 - Opera/9.80 (Android 4.0.4; Linux; Opera Mobi/ADR-1301080958) Presto/2.11.355 Version/12.10 - 17 - Opera/9.80 (Android 4.0.3; Linux; Opera Mobi/ADR-1301080958) Presto/2.11.355 Version/12.10 - 17 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A8426 Safari/8536.25 - 17 - Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1212030820) Presto/2.11.355 Version/12.10 - 16 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 15 - Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 13 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25 - 13 - Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/ADR-1301080958) Presto/2.11.355 Version/12.10 - 12 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800) - 11 - Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25 - 11 - Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; HTC Sensation Z710e Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 11 - Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 - 11 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 10 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/25.0.1364.124 Mobile/10B329 Safari/8536.25 - 9 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; SonyEricssonLT26w Build/6.1.A.2.55) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 9 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146 - 9 - Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25 - 8 - Mozilla/5.0 (Linux; U; Android 3.2; ru-ru; GT-P7300 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 - 8 - Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) - 7 - Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; EVO3D_X515m Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 7 - Mozilla/5.0 (Linux; Android 4.0.4; ZTE Grand Era Build/IMM76L) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.40 Mobile Safari/537.31 OPR/14.0.1074.54070 - 6 - Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 5 - Mozilla/5.0 (Linux; U; Android 2.2.1; ru-ru; HTC Wildfire Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 5 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; HTC_DesireS_S510e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 5 - Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 5 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B145 [FBAN/FBIOS;FBAV/6.0.2;FBBV/183159;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.1.1;FBSS/2; FBCR/O2;FBID/phone;FBLC/en_US;FBOP/1] - 5 - Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 5 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.53 Mobile/10B329 Safari/8536.25 - 5 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B350 Safari/8536.25 - 5 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.50 Mobile/10B329 Safari/8536.25 - 5 - Mozilla/5.0 (Linux; Android 4.0.4; U8836D Build/HuaweiU8836D) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 5 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9100 Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 4 - Opera/9.80 (Android; Opera Mini/7.0.29733/29.3271; U; en) Presto/2.8.119 Version/11.10 - 4 - Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 - 4 - Mozilla/5.0 (Linux; Android 4.0.4; ST26i Build/11.0.A.3.18) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 4 - Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Safari/537.22 - 4 - Opera/9.80 (Android; Opera Mini/7.5.33286/29.3345; U; en) Presto/2.8.119 Version/11.10 - 4 - Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 - 4 - Mozilla/5.0 (Linux; Android 4.1.2; ST26i Build/11.2.A.0.21) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 4 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; SP-A20i Build/MF_ICS_02.19) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 3 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B146 Safari/8536.25 - 3 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146 - 3 - Opera/9.80 (Android; Opera Mini/6.5.27452/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 3 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3417; U; ru) Presto/2.8.119 Version/11.10 - 3 - Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B146 - 3 - Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 3 - Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0 - 3 - Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 - 3 - Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B208 Safari/7534.48.3 - 3 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; SonyST26i Build/11.2.A.0.21) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 3 - Mozilla/5.0 (Android; Tablet; rv:21.0) Gecko/21.0 Firefox/21.0 - 3 - Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 - 3 - Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.50 Mobile/10B141 Safari/8536.25 - 3 - Opera/9.80 (Android 2.3.5; Linux; Opera Mobi/ADR-1210241511) Presto/2.11.355 Version/12.10 - 2 - Mozilla/5.0 (Linux; Android 4.0.3; U9200 Build/HuaweiU9200) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 2 - Mozilla/5.0 (iPod; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 - 2 - Mozilla/5.0 (Linux; Android 4.2.2; Galaxy Nexus Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.54 Mobile Safari/537.31 - 2 - Opera/9.80 (Android; Opera Mini/6.5.29194/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 2 - Opera/9.80 (Android; Opera Mini/7.5.33361/29.3594; U; ru) Presto/2.8.119 Version/11.10 - 2 - Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireHD_A9191 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2 - Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 - 2 - Mozilla/5.0 (Linux; Android 4.0.4; ZTE Grand Era Build/IMM76L) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 2 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I9300 Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 2 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 920) - 2 - Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; Liquid MT Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2 - Mozilla/5.0 (Android; Tablet; rv:20.0) Gecko/20.0 Firefox/20.0 - 2 - Opera/9.80 (Android 4.1.2; Linux; Opera Mobi/ADR-1301071820) Presto/2.11.355 Version/12.10 - 2 - Mozilla/5.0 (Linux; Android 4.0.3; HUAWEI MediaPad Build/HuaweiMediaPad) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 - 2 - Mozilla/5.0 (Linux; U; Android 2.3.5; en-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2 - Opera/9.80 (Android 2.3.6; Linux; Opera Mobi/ADR-1301071820) Presto/2.11.355 Version/12.10 - 2 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B143 Safari/8536.25 - 1 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710) - 1 - Mozilla/5.0 (Linux; Android 4.1.2; SAMSUNG-SGH-I727 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 1 - Mozilla/5.0 (Linux; Android 4.0.4; ST25i Build/6.1.1.B.1.10) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 1 - Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/26.0.1410.50 Mobile/10B146 Safari/8536.25 - 1 - Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-I8350) - 1 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 1 - Mozilla/5.0 (Android; Mobile; rv:20.0) Gecko/20.0 Firefox/20.0 - 1 - Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC Sensation Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 1 - Mozilla/5.0 (Linux; U; Android 4.0.4; en-ru; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 1 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; GT-I9070 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 1 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 1 - Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 1 - Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 1 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 - 1 - Mozilla/5.0 (Linux; Android 4.2.2; Nexus 7 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 - 1 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 1 - Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/ADR-1301071820) Presto/2.11.355 Version/12.10 - 1 - Opera/9.80 (Android; Opera Mini/7.5.33361/29.3530; U; en) Presto/2.8.119 Version/11.10 - 1 - Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; NEWMAN N1 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 1 - Mozilla/5.0 (Linux; U; Android 2.3.3; ru-ru; LG-P500 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2 - 1 - Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; E15i Build/3.0.1.A.0.145; MiniCM7-2.2.1) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 1 - Mozilla/5.0 (Linux; Android 4.1.1; GT-N8000 Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31 - 1 - Microsoft Office Mobile/15.0 - 1 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3183; U; ru) Presto/2.8.119 Version/11.10 - 1 - Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1210091050) Presto/2.11.355 Version/12.10 - 1 - Opera/9.80 (Android; Opera Mini/7.5.33361/29.3345; U; en) Presto/2.8.119 Version/11.10 - 1 - Microsoft Office Mobile /14.0 - 1 - Mozilla/5.0 (Linux; Android 4.1.1; HTC Desire X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 1 - Mozilla/5.0 (Linux; Android 4.1.2; GT-I8190 Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 - 1 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B145 - 1 - Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 1 - DoCoMo/2.0 P900i(c100;TB;W24H11) (compatible; ichiro/mobile goo; http://search.goo.ne.jp/option/use/sub4/sub4-1/) - 0 - Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3183; U; en) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 0 - Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; ru-ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5 - 0 - Mozilla/5.0 (iPad; U; CPU OS 4_3_5 like Mac OS X; ru-ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5 - 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A525 Safari/8536.25 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3271; U; en) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8C148 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3134; U; ru) Presto/2.8.119 Version/11.10 - 0 - Opera/9.80 (Android 4.0.3; Linux; Opera Tablet/ADR-1301080958) Presto/2.11.355 Version/12.10 - 0 - Opera/9.80 (Android; Opera Mini/6.5.29194/29.3507; U; ru) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Linux; Android 4.1.1; A701 Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19 - 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - 0 - Opera/9.80 (Android; Opera Mini/7.5.33286/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3345; U; en) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Linux; Android 4.0.4; MT27i Build/6.1.1.B.1.54) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32195/29.3134; U; ru) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 0 - Opera/9.80 (Android; Opera Mini/7.0.29530/29.3709; U; ru) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; GT-I9100 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 0 - Mozilla/5.0 (Java; U; ru; nokiac5-00) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.6.0.199/69/444/UCWEB Mobile UNTRUSTED/1.0 3gpp-gba - 0 - Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I9001 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32195/29.3417; U; ru) Presto/2.8.119 Version/11.10 - 0 - Dalvik/1.6.0 (Linux; U; Android 4.1.2; GT-I9100 Build/JZO54K) - 0 - Mozilla/5.0 (Linux; Android 4.1.2; GT-N8000 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36 - 0 - Mozilla/5.0 (Linux; U; Android 2.2.1; ru-ru; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 0 - MobileSafari/8536.25 CFNetwork/609 Darwin/13.0.0 - 0 - Mozilla/5.0 (Android; Tablet; rv:17.0) Gecko/17.0 Firefox/17.0 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32200/29.3134; U; en) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Android; Mobile; rv:20.0.1) Gecko/20.0.1 Firefox/20.0.1 - 0 - Opera/9.80 (Android 4.0.3; Linux; Opera Mobi/ADY-1305080823) Presto/2.11.355 Version/12.10 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32195/29.3638; U; ru) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25 - 0 - Opera/9.80 (Android; Opera Mini/7.0.29952/29.3271; U; ru) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X; ru-ru) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.82 Mobile/10A523 Safari/7534.48.3 - 0 - Opera/9.80 (Android; Opera Mini/7.5.32193/29.3345; U; ru) Presto/2.8.119 Version/11.10 - 0 - Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 - 0 - Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 0 - MobileSafari/8536.25 CFNetwork/609.1.4 Darwin/13.0.0 - 0 - Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC_One_S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 - 0 - AndroidDownloadManager - 0 - Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; PAP4040_DUO Build/PrestigioPAP4040DUO) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php deleted file mode 100644 index 6aca913ae66..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/UserAgentTest.php +++ /dev/null @@ -1,189 +0,0 @@ -detect = new Mobile_Detect; - } - - public static function generateJson() - { - //in case this gets run multiple times - if (isset(self::$json)) { - return self::$json; - } - - //the json and PHP formatted files - $jsonFile = dirname(__FILE__) . '/ualist.json'; - $phpFile = dirname(__FILE__) . '/UA_List.inc.php'; - - //currently stored as a PHP array - $list = include $phpFile; - - //check recency of the file - if (file_exists($jsonFile) && is_readable($jsonFile)) { - //read the json file - $json = json_decode(file_get_contents($jsonFile), true); - - //check that the hash matches - $hash = isset($json['hash']) ? $json['hash'] : null; - - if ($hash == sha1(serialize($list))) { - //file is up to date, just read the json file - self::$json = $json['user_agents']; - - return self::$json; - } - } - - - //uses the UA_List.inc.php to generate a json file - if (file_exists($jsonFile) && !is_writable($jsonFile)) { - throw new RuntimeException("Need to be able to create/update $jsonFile from UA_List.inc.php."); - } - - if (!is_writable(dirname($jsonFile))) { - throw new RuntimeException("Insufficient permissions to create this file: $jsonFile"); - } - - - - //print_r($list['Acer']); exit; - - $json = array(); - - foreach ($list as $vendor => $vendorList) { - foreach ($vendorList as $userAgent => $props) { - if (is_int($userAgent)) { - //this means that the user agent is the props - $userAgent = $props; - $props = array(); - } - - $tmp = array( - 'vendor' => $vendor, - 'user_agent' => $userAgent - ); - - if (isset($props['isMobile'])) { - $tmp['mobile'] = $props['isMobile']; - } - - if (isset($props['isTablet'])) { - $tmp['tablet'] = $props['isTablet']; - } - - if (isset($props['version'])) { - $tmp['version'] = $props['version']; - } - - if (isset($props['model'])) { - $tmp['model'] = $props['model']; - } - - $json[] = $tmp; - } - } - - //save the hash - $hash = sha1(serialize($list)); - $json = array( - 'hash' => $hash, - 'user_agents' => $json - ); - - if (defined('JSON_PRETTY_PRINT')) { - $jsonString = json_encode($json, JSON_PRETTY_PRINT); - } else { - $jsonString = json_encode($json); - } - - file_put_contents($jsonFile, $jsonString); - self::$json = $json['user_agents']; - - return self::$json; - } - - public static function setUpBeforeClass() - { - //generate json file first - self::generateJson(); - - //get the generated JSON data - $json = self::$json; - - //make a list that is usable by functions (THE ORDER OF THE KEYS MATTERS!) - foreach ($json as $userAgent) { - $tmp = array(); - $tmp[] = isset($userAgent['user_agent']) ? $userAgent['user_agent'] : null; - $tmp[] = isset($userAgent['mobile']) ? $userAgent['mobile'] : null; - $tmp[] = isset($userAgent['tablet']) ? $userAgent['tablet'] : null; - $tmp[] = isset($userAgent['version']) ? $userAgent['version'] : null; - $tmp[] = isset($userAgent['model']) ? $userAgent['model'] : null; - $tmp[] = isset($userAgent['vendor']) ? $userAgent['vendor'] : null; - - self::$ualist[] = $tmp; - } - } - - public function userAgentData() - { - if (!count(self::$ualist)) { - self::setUpBeforeClass(); - } - - return self::$ualist; - } - - /** - * @medium - * @dataProvider userAgentData - */ - public function testUserAgents($userAgent, $isMobile, $isTablet, $version, $model, $vendor) - { - //make sure we're passed valid data - if (!is_string($userAgent) || !is_bool($isMobile) || !is_bool($isTablet)) { - $this->markTestIncomplete("The User-Agent $userAgent does not have sufficient information for testing."); - - return; - } - - //setup - $this->detect->setUserAgent($userAgent); - - //is mobile? - $this->assertEquals($this->detect->isMobile(), $isMobile); - - //is tablet? - $this->assertEquals($this->detect->isTablet(), $isTablet, 'FAILED: ' . $userAgent . ' isTablet: ' . $isTablet); - - if (isset($version)) { - foreach ($version as $condition => $assertion) { - $this->assertEquals($assertion, $this->detect->version($condition), 'FAILED UA (version("'.$condition.'")): '.$userAgent); - } - } - - //version property tests - if (isset($version)) { - foreach ($version as $property => $stringVersion) { - $v = $this->detect->version($property); - $this->assertSame($stringVersion, $v); - } - } - - //@todo: model test, not sure how exactly yet - //@todo: vendor test. The below is theoretical, but fails 50% of the tests... - /*if (isset($vendor)) { - $method = "is$vendor"; - $this->assertTrue($this->detect->{$method}(), "Expected Mobile_Detect::{$method}() to be true."); - }*/ - } -} diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php deleted file mode 100644 index b2d7bf215d8..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/VendorsTest_tmp.php +++ /dev/null @@ -1,88 +0,0 @@ -detect = new Mobile_Detect; - - } - - public static function setUpBeforeClass() - { - //this method could be called multiple times - if (!self::$items) { - self::$items = include dirname(__FILE__).'/UA_List.inc.php'; - } - } - - public function testisMobileIsTablet() - { - foreach (self::$items as $brand => $deviceArr) { - foreach ($deviceArr as $userAgent => $conditions) { - if (!is_array($conditions)) { - continue; - } - - $this->detect->setUserAgent($userAgent); - - foreach ($conditions as $condition => $assert) { - // Currently not supporting version and model here. - // @todo: I need to split this tests! - if (in_array($condition, array('model'))) { - continue; - } // 'version', - - switch ($condition) { - case 'version': - // Android, iOS, Chrome, Build, etc. - foreach ($assert as $assertKey => $assertValue) { - //if ($brand == 'Apple') { - // echo 'UA ('.$condition.'('.$assertKey.') === '.$assertValue.'): '.$userAgent . "\n"; - //} - $this->assertTrue( $this->detect->$condition( $assertKey ) == $assertValue, 'UA ('.$condition.'('.$assertKey.') === '.$assertValue.'): '.$userAgent); - } - break; - - default: - $this->assertTrue($this->detect->$condition() === $assert, 'UA ('.$condition.'): '.$userAgent); - break; - } - - } - - } - - } - - } - - public function testVersion() - { - foreach (self::$items as $brand => $deviceArr) { - - foreach ($deviceArr as $userAgent => $conditions) { - - if ( !is_array($conditions) || !isset($conditions['version']) ) { continue; } - - $this->detect->setUserAgent($userAgent); - - foreach ($conditions['version'] as $condition => $assertion) { - - $this->assertEquals( $this->detect->version($condition), $assertion, 'UA (version("'.$condition.'")): '.$userAgent ); - - } - - } - - } - - } - -} diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/bootstrap.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/bootstrap.php deleted file mode 100644 index 6cd37f7bf1d..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/bootstrap.php +++ /dev/null @@ -1,2 +0,0 @@ - - - - - - - - - - ./ - - - - - - - diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php deleted file mode 100644 index d8fc582085f..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Acer.php +++ /dev/null @@ -1,28 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; A100 Build/HTK55D) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; A110 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'IML74K'), 'model' => 'A200' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; A701 Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; B1-A71 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; B1-710 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; A1-810 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; A1-810 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Acer; Allegro)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; A3-A10 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, 'version' => array( - 'Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.36', 'Chrome' => '32.0.1700.99', - ), - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; A1-811 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; A1-830 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; A3-A11 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36'=> array('isMobile' => true, 'isTablet' => true) - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php deleted file mode 100644 index 96a36ac35e0..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Alcatel.php +++ /dev/null @@ -1,49 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-in; MB525 Build/GWK74; CyanogenMod-7.2.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; it-it; ALCATEL ONE TOUCH 918D Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '2.3.5', 'Webkit' => '533.1', 'Safari' => '4.0', 'Build' => 'GRJ90'), 'model' => 'ONE TOUCH 918D' ), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; ALCATEL ONE TOUCH 991 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '2.3.6', 'Webkit' => '533.1', 'Safari' => '4.0', 'Build' => 'GRJ90'), 'model' => 'ONE TOUCH 991' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; ALCATEL ONE TOUCH 993D Build/ICECREAM) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'ICECREAM'), 'model' => 'ONE TOUCH 993D' ), - 'ALCATEL_A392G/1.0 ObigoInternetBrowser/Q05A[TF013513002719521000000013182904148]' => array('isMobile' => true, 'isTablet' => false, 'model' => 'A392G'), - 'ALCATEL_3020D/1.0 ObigoInternetBrowser/Q03C' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2; ALCATEL ONE TOUCH 5037A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'ALCATEL_3020G/1.0 ObigoInternetBrowser/Q03C' => array('isMobile' => true, 'isTablet' => false), - 'ALCATEL_3041D/1.0 ObigoInternetBrowser/Q03C' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037E Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 5037X Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012A Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-nz; ONE TOUCH 6012A Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012D Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; ONE TOUCH 6012D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; En-us; ONE TOUCH 6012E Build/JDQ39) AppleWebKit/534.30 (KHTML, Like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12975 YaBrowser/13.12.1599.12975 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; bg-bg; ONE TOUCH 6012X Build/JDQ39) AppleWebKit/534.30 (KHTML like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6012X_orange Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; fr-fr; ALCATEL ONE TOUCH 6012X_orange Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; fr-fr; 6016E Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; ALCATEL ONE TOUCH 6016E Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; 6016X Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; ALCATEL ONE TOUCH 6016X Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; ru-ru; 6016X Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6032A Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.170 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-ru; ALCATEL ONE TOUCH 6032X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-nz; ALCATEL ONE TOUCH 7040A Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; th-th; ALCATEL ONE TOUCH 7040D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040D Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040E Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; it-it; ALCATEL ONE TOUCH 7041D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041D Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; pt-pt; ALCATEL ONE TOUCH 7041X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020A Build/JDQ39) AppleWebKit/537.36 (KHTML, Like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020A Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020D Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; ALCATEL ONE TOUCH 8020D Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020E Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020E Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php deleted file mode 100644 index 7bbcb5ea25d..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Allview.php +++ /dev/null @@ -1,11 +0,0 @@ - array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; ALLVIEW P5 Build/IML74K) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us ; ALLVIEW SPEEDI Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.5.3.246/145/355' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; AllviewCity Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; ALLVIEWSPEED Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php deleted file mode 100644 index 82fa5ac44d2..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Amazon.php +++ /dev/null @@ -1,14 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.4 Mobile Safari/535.19 Silk-Accelerated =true' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Webkit' => '528.5+', 'Kindle' => '3.0', 'Safari' => '4.0'), 'model' => 'Kindle' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFOTE Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; WFJWAE Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; en-us; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; en-us; KFJWI Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; en-us; KFSOWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.21 Safari/535.19 Silk-Accelerated=true' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.1; xx-xx; T720-WIFI Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php deleted file mode 100644 index 931de962eba..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Apple.php +++ /dev/null @@ -1,27 +0,0 @@ - array( - 'iTunes/9.1.1' => array('isMobile' => false, 'isTablet' => false), - 'iTunes/11.0.2 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit/536.27.1' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A4449d Safari/9537.53' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '420+', 'Safari' => '3.0') ), - 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '3_0', 'Webkit' => '528.18', 'Safari' => '4.0'), 'model' => 'iPhone', 'mobileGrade' => 'B' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '5_1_1', 'Webkit' => '534.46', 'Mobile' => '9B206', 'Safari' => '5.1'), 'model' => 'iPhone' ), - 'Mozilla/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0', 'Webkit' => '536.26', 'Mobile' => '10A403', 'Safari' => '6.0'), 'model' => 'iPod'), - 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.80 Mobile/9B206 Safari/7534.48.3 (6FF046A0-1BC4-4E7D-8A9D-6BF17622A123)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '5_1_1', 'Webkit' => '534.46.0', 'Chrome' => '21.0.1180.80', 'Mobile' => '9B206'), 'model' => 'iPad' ), - 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '6_0', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10A403'), 'model' => 'iPad' ), - 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '4_2_1', 'Webkit' => '533.17.9', 'Safari' => '5.0.2', 'Mobile' => '8C148'), 'model' => 'iPad', 'mobileGrade' => 'B' ), - 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10' => array('isMobile' => true, 'isTablet' => true, 'version' => array('iOS' => '3_2', 'Webkit' => '531.21.10', 'Safari' => '4.0.4', 'Mobile' => '7B334b'), 'model' => 'iPad', 'mobileGrade' => 'B' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.82 Mobile/10A523 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0_1', 'Webkit' => '534.46.0', 'Chrome' => '21.0.1180.82', 'Mobile' => '10A523'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A523 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_0_1', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10A523'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X; ru-ru) AppleWebKit/536.26 (KHTML, like Gecko) CriOS/23.0.1271.100 Mobile/10B142 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_1', 'Webkit' => '536.26', 'Chrome' => '23.0.1271.100', 'Mobile' => '10B142'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '6_1_3', 'Webkit' => '536.26', 'Safari' => '6.0', 'Mobile' => '10B329'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Coast/1.0.2.62956 Mobile/10B329 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Coast' => '1.0.2.62956')), - 'CheckMyBus iOS mobile App 0.9.0 (iPhone; iPhone OS/7.1.1)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.59 Mobile/12A405 Safari/600.1.4' => array('isMobile' => true, 'isTablet' => false), - 'VendorAppName/1.7.0 (iPhone; iOS 8.1.2; Scale/3.00)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('iOS' => '8.1.2'), 'model' => 'iPhone', 'mobileGrade' => 'A' ), - 'Mozilla/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit/601.1.17 (KHTML, like Gecko) Version/8.0 Mobile/13A175 Safari/600.1.4' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.37 (KHTML, like Gecko) Version/8.0 Mobile/13A4293g Safari/600.1.4' => array('isMobile' => true, 'isTablet' => false), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php deleted file mode 100644 index 3fda3c9ab9c..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Archos.php +++ /dev/null @@ -1,67 +0,0 @@ - array( - - 'Mozilla/5.0 (Linux; Android 4.2.2; Qilive 97R Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; Archos 50 Platinum Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; A101IT Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 101 Cobalt Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80 TITANIUM Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.1.1; ARCHOS 101 Titanium Build/JRO03H) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 70b TITANIUM Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; de-de; Archos 80 Xenon Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 79 Xenon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 101 Titanium Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80XSK Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS FAMILYPAD 2 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.1.1; ARCHOS 97B TITANIUM Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; ARCHOS 101 XS 2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; ARCHOS 80b PLATINUM Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 70 Xenon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ARCHOS 97 CARBON Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 97 TITANIUMHD Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Archos 90 Neon Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 1.6; de-de; Archos5 Build/Donut) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS GAMEPAD Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php deleted file mode 100644 index 5d817e34a94..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Asus.php +++ /dev/null @@ -1,22 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '3.2.1', 'Webkit' => '534.13', 'Safari' => '4.0'), 'model' => 'Transformer TF101' ), - 'Mozilla/5.0 (Linux; Android 4.1.1; Transformer Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; asus_laptop Build/IMM76L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03L', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.2.1; ME301T Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.1', 'Build' => 'JOP40D') ), - 'Mozilla/5.0 (Linux; Android 4.2.1; ME173X Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.1', 'Build' => 'JOP40D') ), - 'Mozilla/5.0 (Linux; Android 4.2.2; TF300T Build/JDQ39E) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39E') ), - 'Mozilla/5.0 (Linux; Android 4.2.2; K00C Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; K00E Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; K00F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; K00L Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; ME302KL Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; K010 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; K017 Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php deleted file mode 100644 index 7f1c106e47d..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Blackberry.php +++ /dev/null @@ -1,35 +0,0 @@ - array( - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '534.8+', 'BlackBerry' => '6.0.0.546'), 'model' => 'BlackBerry 9300' ), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9360; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.400 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; he) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.723 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9790; en-GB) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.714 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Webkit' => '534.11+', 'BlackBerry' => '7.1.0.714'), 'model' => 'BlackBerry 9790' ), - 'Opera/9.80 (BlackBerry; Opera Mini/7.0.29990/28.2504; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9981; en-GB) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.342 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9780; es) AppleWebKit/534.8 (KHTML, like Gecko) Version/6.0.0.480 Mobile Safari/534.8' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.0.0.583 Mobile Safari/534.11' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9860; es) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.576 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit/534.11 (KHTML, like Gecko) Version/7.1.0.523 Mobile Safari/534.11' => array('isMobile' => true, 'isTablet' => false), - 'BlackBerry8520/5.0.0.592 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/136' => array('isMobile' => true, 'isTablet' => false), - 'BlackBerry8520/5.0.0.1067 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/603' => array('isMobile' => true, 'isTablet' => false), - 'BlackBerry8520/5.0.0.1036 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/611' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('BlackBerry' => '5.0.0.1036', 'VendorID' => '611'), 'model' => 'BlackBerry8520' ), - 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9220; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.337 Mobile Safari/534.11+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML, like Gecko) Version/7.2.1.0 Safari/536.2+' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.1+ (KHTML, like Gecko) Version/10.0.0.1337 Mobile Safari/537.1+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (BB10; Touch) /537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('BlackBerry' => '10.0.9.2372') ), - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '3.2.1', 'Webkit' => '534.13', 'Safari' => '4.0'), 'model' => 'Transformer TF101' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A200' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A500' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'A501' ), - 'Mozilla/5.0 (Linux; Android 4.1.1; Transformer Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'Transformer' ), - 'Mozilla/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'Transformer Pad TF300T' ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build/JZO54K; CyanogenMod-10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'JZO54K'), 'model' => 'Transformer' ), - 'Mozilla/5.0 (Linux; Android 4.1.2; B1-A71 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Webkit' => '535.19', 'Chrome' => '18.0.1025.166'), 'model' => 'B1-A71' ), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Acer; Allegro)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Windows Phone OS' => '7.5', 'Trident' => '5.0', 'IE' => '9.0'), 'model' => 'Allegro' ), - ), - -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php deleted file mode 100644 index 2c94b9728a1..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Dell.php +++ /dev/null @@ -1,13 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 1.6; en-gb; Dell Streak Build/Donut AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/ 525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; hd-us; Dell Venue Build/GWK74; CyanogenMod-7.2.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; DELL; Venue Pro)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; Venue 8 3830 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; Venue 7 3730 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; Venue 7 HSPA+ Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; Venue 8 3830 Build/JSS15Q) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; zh-cn; Dell Streak 10 Pro Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php deleted file mode 100644 index 688653304cd..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Google.php +++ /dev/null @@ -1,18 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; Nexus 4 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.40 Mobile Safari/537.31 OPR/14.0.1074.54070' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.31', 'Opera' => '14.0.1074.54070') ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Nexus 4 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.2.2', 'Chrome' => '26.0.1410.58')), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Google Nexus 4 - 4.1.1 - API 16 - 768x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Google Galaxy Nexus - 4.1.1 - API 16 - 720x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2; Nexus 7 Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; Nexus 7 Build/JZ054K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Chrome' => '18.0.1025.166') ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; cs-cz; Nexus S Build/JZO54K; CyanogenMod-10.0.0) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android; en_us; Nexus 7 Build/) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 NetFrontLifeBrowser/2.3 Mobile (Dragonfruit)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 5.1; Nexus 5 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 momoWebView/6.3.1 android/404(Nexus 5;android 5.1;zh_CN;10;netType/1)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; Nexus 10 Build/JWR66Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php deleted file mode 100644 index 4f8b14a8217..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HP.php +++ /dev/null @@ -1,21 +0,0 @@ - array( - 'Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.5; U; en-GB) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; HP Slate 7 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; HP Slate 7 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; HP 8 Build/1.0.7_WW-FIR-13) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; HP Slate 10 HD Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; Android 4.4.2; HP Slate 8 Pro Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; Slate 21 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36 OPR/22.0.1485.78487' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; Android 4.3; HP SlateBook 10 x2 PC Build/4.3-17r20-03-23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php deleted file mode 100644 index cf6caebacc1..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/HTC.php +++ /dev/null @@ -1,363 +0,0 @@ - array( - 'Mozilla/5.0 (X11; Linux x86_64; Z520m; en-ca) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24' => array('isMobile' => true, 'isTablet' => false), - 'HTC_Touch_HD_T8282 Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1; xx-xx; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; en-gb; HTC Desire Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; en-dk; Desire_A8181 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; xx-xx; 001HT Build/FRF91) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; xx-xx; HTCA8180/1.0 Android/2.2 release/06.23.2010 Browser/WAP 2.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; de-at; HTC Desire Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; en-sk; Desire_A8181 Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; HTC/DesireS/1.07.163.1 Build/GRH78C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-lv; HTC_DesireZ_A7272 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; ADR6300 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; HTC/DesireS/2.10.161.3 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; Inspire 4G Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; de-de; HTC Explorer A310e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; HTC_ChaCha_A810e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; nl-nl; HTC_DesireHD_A9191 Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC Desire S Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; HTC Desire Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; de-de; HTC_DesireHD Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ua; HTC_WildfireS_A510e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; HTC Vision Build/GRI40; ILWT-CM7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; HTC_GOF_U/1.05.161.1 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; hu-hu; HTC Sensation Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC Sensation XE with Beats Audio Z715e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; pl-pl; EVO3D_X515m Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC_A320e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-tw; HTC Desire V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; PG86100 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-nl; SensationXE_Beats_Z715e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; ADR6425LVW 4G Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; cs-ee; Sensation_Z710e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; HTC Evo 4G Build/MIUI) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; Desire HD Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-my; HTC_One_X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; IncredibleS_S710e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-fr; HTC_Desire_S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC Butterfly Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; EVO Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTCSensation Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-S6312 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC 7 Mozart T8698; QSD8x50)' => array( - 'isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '9.0', 'Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => '7 Mozart T8698', - ), - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-gb;HTC_Flyer_P512 Build/HTK75C) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (Linux; U; Android 3.1; zh-tw; HTC PG09410 Build/HMJ15) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 HTC MOZART)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mondrian T8788)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Mozart; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Pro T7576)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Pro)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Schubert T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Surround)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Trophy T8686)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; 7 Trophy)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Eternity)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Gold)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD2 LEO)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD2)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD7 T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; HD7)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; iPad 3)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; LEO)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mazaa)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mondrian)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Mozart)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; mwp6985)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PC40100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PC40200)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PD67100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PI39100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; PI86100)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar 4G)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 1.08.164.02)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 2.05.164.01)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar C110e; 2.05.168.02)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Radar; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schuber)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schubert T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Schubert)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Spark)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Surround)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T7575)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T8697)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T8788)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T9295)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; T9296)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; TITAN X310e)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Torphy T8686)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; X310e)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC_blocked; T8788)' => array( - 'isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '9.0', 'Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => 'T8788', - ), - - 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One S Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; HTC One X Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-th; HTC One V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One X Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-id; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One S Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-at; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One X Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-pe; HTC One V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Maxthon/4.0.4.1000' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19 AlexaToolbar/alxf-2.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One S Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; de-de; HTC One Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 OPR/14.0.1074.58201' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39E) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One XL Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.60140' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.24 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'HTC One X Linux/3.0.13 Android/4.1.9 Release/10.12.2012 Browser/AppleWebKit534.30 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mobile Safari/534.30 Android 4.0.1;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One 801e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One X Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.61541' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One XL Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X+ Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC One X Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30/4.05d.1002.m7' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-in; HTC One V Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.0.1.352' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; HTC One X Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; HTC One Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One SV Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One mini Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; HTC One Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One 801e Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-ch; HTC One Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC One S Build/IML74K) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 T5/2.0 baidubrowser/3.1.6.4 (Baidu; P1 4.0.3)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X+ Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; HTC One 801e Build/JSS15J) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.4.1.362 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4; HTC One Build/KRT16S.H5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One SV Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.1; ru-ru; HTC One Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-ru; HTC One 801e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One 801e Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One mini Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.12975 YaBrowser/13.12.1599.12975 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4; HTC One Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; HTC One Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One X Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One X Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JWR66Y.H1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; de-at; HTC One Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One dual sim Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One S Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One max Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.132 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One mini Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One 801e Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; HTC One Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.2.380' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.132 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; HTC One X Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; HTC One S Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-kw; HTC One X+ Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One max Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/5.3.0.49_r693790.420' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.5.418 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 MicroMessenger/5.2.1.381' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One mini Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; ru-ru; HTC One mini Build/KOT49H) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.0.435 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One 801e Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; HTC One X - 4.2.2 - API 17 - 720x1280 Build/JDQ39E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.128 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; HTC One VX Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.76 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One V Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One dual sim Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One dual sim Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36 OPR/22.0.1485.78487' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One 801e Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One 801e Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; HTC One X Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36 OPR/22.0.1485.81203' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One 801e Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; HTC One S Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; HTC One V Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One mini Build/JSS15Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; HTC One_M8 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One dual sim Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.72 Mobile Safari/537.36 OPR/19.0.1340.69721' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One SV Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 ACHEETAHI/2100050056' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One_M8 Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JWR66Y.H1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One SV Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/21.0.0.23.12;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-si; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/6.0.0.67_r853700.483 NetType/WIFI' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-US; HTC One X Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/10.0.1.512 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One Build/KTU84P.H1) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One SV Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FBAN/FB4A;FBAV/22.0.0.15.13;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One X+ Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 BingWeb/5.2.0.20140710' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; HTC One Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-mx; HTC One S Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FBAN/FB4A;FBAV/23.0.0.22.14;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.3; es-es; HTC One 801e Build/KTU84L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X+ Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.69 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One S Build/JRO03C) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-th; HTC One Build/KOT49H) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-ar; HTC One X Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One_M8 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-us; HTC One X+ Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-mx; HTC One S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; HTC One Build/KTU84L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One dual sim Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/25.0.0.19.30;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 5.0.1; HTC One_M8 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/25.0.0.19.30;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; HTC One_M8 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; HTC One X Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; HTC One mini Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 5.0.1; HTC One_M8 Build/LRX22C.H5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php deleted file mode 100644 index f5ffca8e568..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Huawei.php +++ /dev/null @@ -1,17 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; bg-bg; Ideos S7 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Ideos S7 Build/ERE27) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; lt-lt; U8660 Build/HuaweiU8660) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; HUAWEI-U8850 Build/HuaweiU8850) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.2; pl-pl; MediaPad Build/HuaweiMediaPad) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; nl-nl; HUAWEI MediaPad Build/HuaweiMediaPad) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'HUAWEI_T8951_TD/1.0 Android/4.0.4 (Linux; U; Android 4.0.4; zh-cn) Release/05.31.2012 Browser/WAP2.0 (AppleWebKit/534.30) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; ar-eg; MediaPad 7 Youth Build/HuaweiMediaPad) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; HW-HUAWEI_C8815/C8815V100R001C541B135; 540*960; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_C8813D/C8813DV100R001C92B172; 480*854; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_Y300C/Y300CV100R001C92B168; 480*800; CTC/2.0) AppleWebKit/534.30 (KHTML, like Gecko) Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false) - ), - -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php deleted file mode 100644 index 1b0bc7dd767..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/LG.php +++ /dev/null @@ -1,35 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; LG-VS410PP Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; LG-P509 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; pt-br; LG-P350f Build/FRG83G) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LG-P500 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LS670 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; VS910 4G Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-P700 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; LG-F160S Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-E610v/V10f Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; LG-E612 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; LG-F180K Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; LG-V500 Build/JDQ39B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; LG-LW770 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; LG-V510 Build/KOT49H.L004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG E-900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-C900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-C900k)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-E900h)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; LG; LG-Optimus 7)' => array('isMobile' => true, 'isTablet' => false), - // @ref: http://ja.wikipedia.org/wiki/L-06C - 'Mozilla/5.0 (Linux; U; Android 3.0.1; ja-jp; L-06C Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; LG-V900 Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-gb; LG-V700 Build/KOT49I.A1403851714) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; LG-V500 Build/KOT49I.V50020d) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LG-V410/V41010d Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.1599.103 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php deleted file mode 100644 index 95c37868842..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lava.php +++ /dev/null @@ -1,23 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Iris 349 Build/MocorDroid2.3.5) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris402+ Build/iris402+) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; IRIS402 Build/LAVAIRIS402) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; iris405 Build/LAVAIRIS405) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; IRIS_501 Build/LAVAIRIS501) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris402e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris503e Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IRIS402) U2/1.0.0 UCBrowser/9.1.1.420 Mobile' => array('isMobile' => true, 'isTablet' => false), - 'UCWEB/2.0 (MIDP-2.0; U; Adr 4.2.2; en-US; IRIS402) U2/1.0.0 UCBrowser/9.1.1.420 U2/1.0.0 Mobile' => array('isMobile' => true, 'isTablet' => false), - 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IRIS355) U2/1.0.0 UCBrowser/9.1.1.420 Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; iris356 Build/irisIRIS356) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.5.0.360 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; iris356) U2/1.0.0 UCBrowser/9.0.2.389 Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; iris500 Build/iris500) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; iris700 Build/iris700) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; QPAD E704 Build/JDQ39) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.131 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; IvoryS Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-US; E-TAB IVORY Build/E702) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.0.321 U3/0.8.0 Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; tr-tr; E-TAB Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true) - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php deleted file mode 100644 index fbdf4b5cdc1..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Leader.php +++ /dev/null @@ -1,6 +0,0 @@ - array('isMobile' => true, 'isTablet' => true) - ) -); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php deleted file mode 100644 index d4f6e6fd53e..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Lenovo.php +++ /dev/null @@ -1,46 +0,0 @@ - array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-au; ThinkPad Tablet Build/ThinkPadTablet_A400_03) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.3697; en-US; IdeaTabA1000-G) U2/1.0.0 UCBrowser/9.2.0.419 Mobile' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; IdeaTabA1000-F Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.1; Lenovo A3000-H Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.117 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaTab A3000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.360' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1; zh-cn; Lenovo-A3000-H/S100) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Mobile Safari/534.300' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-us; IdeaTab A3000-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; IdeaTab A2107A-H Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; IdeaTabA2109A Build/JRO03R) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; nl-nl; IdeaTabA2109A Build/JRO03R) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.300' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaTab S6000-H Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; IdeaTab S6000-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; Lenovo B8000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2;it-it; Lenovo B8000-F/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; it-it; Lenovo B6000-F/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.2.2 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; Lenovo B6000-F Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; IdeaPadA10 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.1.2; Ideapad K1 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; de-de; IdeaPad A1 Build/GRK393; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.3; Lenovo B8080-H Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; hu-hu; Lenovo A3500-FL Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Lenovo A7600-F Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.4.2; Lenovo A5500-F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Lenovo A390 Linux/3.0.13 Android/4.4.2 Release/04.03.2013 Browser/AppleWebKit534.30 Profile/MIDP-2.0 Configuration/CLDC-1.1 Mobile Safari/534.30 Android 4.0.1;' => array('isMobile' => true, 'isTablet' => false), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php deleted file mode 100644 index 4cd332fcdd2..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Mi.php +++ /dev/null @@ -1,22 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; HM NOTE 1W Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 MobilSafari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.1; zh-cn; MI-ONE Plus Build/ITL41D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.1; zh-cn; MI-ONE Plus Build/ITL41D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2SC Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; MI 1S Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.8; zh-cn; xiaomi2 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/4.4 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; MI 2A Build/miui.es JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.1; zh-cn; MI 3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; MI 1S Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; MI 3W Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; HM 1SC Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; HM 1SW Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.0.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; HM NOTE 1W Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.0.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; MI-ONE C1 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.4; en-us; MI 4W Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.0.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4; MI PAD Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php deleted file mode 100644 index e46edc0904b..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Microsoft.php +++ /dev/null @@ -1,30 +0,0 @@ - array( - // Surface tablet - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('IE' => '10.0', 'Windows NT' => '6.2', 'Trident' => '6.0') ), - // Ambiguos. - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' => array('isMobile' => true, 'isTablet' => false), - // Ambiguos. - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => array('isMobile' => true, 'isTablet' => false), - // http://www.whatismybrowser.com/developers/unknown-user-agent-fragments - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; ARMBJS)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - - // Thanks to Jonathan Donzallaz! - // Firefox (nightly) in metro mode on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko/20130626 Firefox/25.0' => array('isMobile' => false, 'isTablet' => false), - // Firefox in desktop mode on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0' => array('isMobile' => false, 'isTablet' => false), - // IE10 in metro mode on Dell XPS 12 - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MDDCJS)' => array('isMobile' => false, 'isTablet' => false), - // IE10 in desktop mode on Dell XPS 12 - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MDDCJS)' => array('isMobile' => false, 'isTablet' => false), - // Opera on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130' => array('isMobile' => false, 'isTablet' => false), - // Chrome on Dell XPS 12 - 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - // Google search app from Windows Store - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; MDDCJS; WebView/1.0)' => array('isMobile' => false, 'isTablet' => false), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php deleted file mode 100644 index d322660d1f3..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Motorola.php +++ /dev/null @@ -1,52 +0,0 @@ - array( - 'MOT-W510/08.11.05R MIB/BER2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 EGE/1.0 UP.Link/6.3.0.0.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; zh-cn; ME722 Build/MLS2GC_2.6.0) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build/4.5.1_57_DX8-51) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; MB855 Build/4.5.1A-1_SUN-254_13) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; es-us; MB526 Build/4.5.2-51_DFL-50) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-ca; MB860 Build/4.5.2A-51_OLL-17.8) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; MOT-XT535 Build/V1.540) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; ko-kr; A853 Build/SHOLS_U2_05.26.3; CyanogenMod-7.1.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.1; en-us; Xoom Build/HMJ25) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; DROID RAZR 4G Build/6.7.2-180_DHD-16_M4-31) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; Xoom Build/IMM76L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-br; XT687 Build/V2.27D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'XT687' ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; MOT-XT910 Build/6.7.2-180_SPU-19-TA-11.6) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT910 Build/9.8.2O-124_SPUL-17) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT915 Build/2_32A_2031) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT919 Build/2_290_2017) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT925 Build/9.8.2Q-50-XT925_VQLM-20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT907 Build/9.8.1Q-66) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT901 Build/9.8.2Q-50_SLS-13) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; DROID BIONIC Build/9.8.2O-72_VZW-22) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (Linux; Android 4.4.2; XT1022 Build/KXC20.82-14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.4; en-in; XT1022 Build/KXC21.5-40) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16'=> array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; XT1025 Build/KXC20.82-13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; XT1052 Build/KLA20.16-2.16.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; XT1052 Build/13.9.0Q2.X_83) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; XT1053 Build/13.9.0Q2.X_61) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; XT1053 Build/13.9.0Q2.X_55) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; XT1056 Build/13.9.0Q2.X-116-MX-17-6-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; XT1031 Build/KXB20.9-1.10-1.18-1.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; XT1032 Build/KXB21.14-L1.40) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; de-de; XT1032 Build/KLB20.9-1.10-1.24-1.1) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; XT1034 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; XT1034 Build/14.10.0Q3.X-84-16) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; XT1035 Build/14.10.0Q3.X-23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.3; XT1039 Build/KXB21.14-L1.31) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; XT919 Build/2_290_2002) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT919 Build/2_290_2004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; XT920 Build/2_290_2014) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; XT920 Build/2_310_2014) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; XT905 Build/7.7.1Q_GCIRD-16) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; XT908 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; XT897 Build/7.7.1Q-6_SPR-ASANTI_LE-18) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 5.0.2; XT1032 Build/LXB22.46-28.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 5.1.1; Moto E Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; XT1021 Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php deleted file mode 100644 index 99cf9d9bb62..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Nokia.php +++ /dev/null @@ -1,84 +0,0 @@ - array( - 'Nokia200/2.0 (12.04) Profile/MIDP-2.1 Configuration/CLDC-1.1 UCWEB/2.0 (Java; U; MIDP-2.0; en-US; nokia200) U2/1.0.0 UCBrowser/8.9.0.251 U2/1.0.0 Mobile UNTRUSTED/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Nokia6303iclassic/5.0 (06.61) Profile/MIDP-2.1 Configuration/CLDC-1.1 Mozilla/5.0 AppleWebKit/420+ (KHTML, like Gecko) Safari/420+' => array('isMobile' => true, 'isTablet' => false), - 'nokian73-1/UC Browser7.8.0.95/69/400 UNTRUSTED/1.0' => array('isMobile' => true, 'isTablet' => false), - 'Nokia2760/2.0 (06.82) Profile/MIDP-2.1 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Nokia3650/1.0 SymbianOS/6.1 Series60/1.2 Profile/MIDP-1.0 Configuration/CLDC-1.0' => array('isMobile' => true, 'isTablet' => false), - 'NokiaN70-1/5.0737.3.0.1 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1/UC Browser7.8.0.95/27/352' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (S60V3; U; ru; NokiaN73) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.6.0.199/28/444/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (S60V3; U; ru; NokiaC5-00.2)/UC Browser8.5.0.183/28/444/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (S60V3; U; ru; NokiaC5-00.2) AppleWebKit/530.13 (KHTML, like Gecko) UCBrowser/8.7.0.218/28/352/UCWEB Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Series40; NokiaC3-00/08.63; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/2.2.0.0.33' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Series 60; Opera Mini/7.0.31380/28.2725; U; es) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Opera Mini' => '7.0.31380', 'Presto' => '2.8.119')), - 'Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/025.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/022.014; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.37 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaE6-00/111.140.0058; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaC6-01/111.040.1511; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaC6-01; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia700/111.030.0609; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia700/111.020.0308; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.1.14 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 NokiaN8-00/111.040.1511; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/535.1 (KHTML, like Gecko) NokiaBrowser/8.3.1.4 Mobile Safari/535.1 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Symbian/3; Series60/5.3 Nokia701/111.030.0609; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.4.2.6 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/3.83; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120ci/7.02; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/7.10; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE66-1/510.21.009; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE71-1/110.07.127; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95-3/20.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE51-1/200.34.36; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE63-1/500.21.009; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN82/10.0.046; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/052.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-1/@version@; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.26 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00/031.022; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.3.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00.2/081.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.32 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaN79-1/32.001; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 Nokia6220c-1/06.101; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00.2/071.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.26 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE72-1/081.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.32 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaC5-00/061.005; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.2 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaX6-00/40.0.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gb' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5800d-1/60.0.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaC5-03/12.0.023; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.9 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5228/40.1.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5230/51.0.002; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.33 Mobile Safari/533.4 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 Nokia5530c-2/32.0.007; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.9 3gpp-gba' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/21.0.045; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.4' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-4/30.0.004; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.28 3gpp-gba' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Symbian' => '9.4', 'Webkit' => '533.4', 'NokiaBrowser' => '7.3.1.28'), 'model' => 'NokiaN97-4' ), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 7 Mozart T8698)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; 710)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 800C; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; 900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; HD7 T9292)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; LG E-900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 610)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; T-Mobile)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 710; Vodafone)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800) UP.Link/5.1.2.6' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; SFR)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; T-Mobile)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800; vodafone)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Lumia 800c)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Lumia 920)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('IE' => '10.0', 'Windows Phone OS' => '8.0', 'Trident' => '6.0'), 'model' => 'Lumia 920' ), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; lumia800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 610)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 710)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 800)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 800C)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Nokia 900)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; Nokia)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Nokia; TITAN X310e)' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Windows Phone OS' => '7.5', 'Trident' => '5.0'), 'model' => 'TITAN X310e' ), - 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' => array('isMobile' => true, 'isTablet' => false), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php deleted file mode 100644 index 3887f5d8018..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Onda.php +++ /dev/null @@ -1,12 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; Android 4.2.2; V975i Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.108 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Android; Tablet; rv:37.0) Gecko/37.0 Firefox/37.0' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; V975m Core4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.3; fr-fr; V975m Core4 Build/JSS15J) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Safari/537.16' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.3; V975m Core4 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; V812 Core4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ) - -); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php deleted file mode 100644 index 56d64079ca2..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Others.php +++ /dev/null @@ -1,531 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; E1C Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; id-id; T3C Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Ainol' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Ainol Novo8 Advanced Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; Novo10 Hero Build/20121115) AppleWebKit/535.19 (KHTML like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; novo9-Spark Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - 'AllFine' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; FINE7 GENIUS Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Amoi' => array( - 'Amoi 8512/R18.0 NF-Browser/3.3' => array('isMobile' => true, 'isTablet' => false, 'model' => '8512'), - ), - - 'Arnova' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; fr-fr; AN9G2I Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'AudioSonic' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-au; T-17B Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - - 'Blaupunkt' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; Endeavour 800NG Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), - - 'Broncho' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - - ), - - // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bq' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; bq Livingstone 2 Build/1.1.7 20121018-10:33) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-es; bq Edison Build/1.1.10-1015 20121230-18:00) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; Maxwell Lite Build/v1.0.0.ICS.maxwell.20120920) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-tw; bq Maxwell Plus Build/1.0.0 20120913-10:39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; Aquaris E10 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Captiva' => array( - 'Opera/9.80 (X11; Linux zvav; U; de) Presto/2.8.119 Version/11.10 Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; CAPTIVA PAD 10.1 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), - - 'Casio' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; C771 Build/C771M120) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'ChangJia' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-br; TPC97113 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; TPC7102 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - - ), - - - 'Celkon' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; Celkon CT 910+ Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-in; CT-1 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'CELKON.C64/R2AE SEMC-Browser/4.0.3 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A125 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-US; Celkon*A86 Build/Celkon_A86) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/8.7.0.315 Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A.R 40 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - ), - - // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 - 'Coby' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; MID7010 Build/FRF85B) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; MID7048 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; MID8042 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Concorde' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde Tab T10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde tab PLAY Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Cresta' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; nl-nl; CRESTA.CTP888 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Cube' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; CUBE U9GT 2 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Danew' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; Dslide 700 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array( 'Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0' ), 'model' => 'Dslide 700' ) - - ), - - 'DanyTech' => array( - 'Mozilla/5.0 (Linux; Android 4.2.2; Genius Tab Q4 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - - - 'Digma' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; iDx10 3G Build/ICS.b02ref.20120331) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'DPS' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; DPS Dream 9 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'ECS' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; TM105A Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30')) - ), - - 'Eboda' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme Dual Core X190 Build/JRO03C) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Essential A160 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; E-Boda Supreme X80 Dual Core Build/ICS.g12refM806A1YBD.20120925) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-boda essential smile Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme X80 Dual Core Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme XL200IPS Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Evolio' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Evolio X7 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ro-ro; ARIA_Mini_wifi Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Fly' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; Fly IQ440; Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; FLY IQ256 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Fujitsu' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ja-jp; F-10D Build/V21R48A) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'V21R48A', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; ru-ru; M532 Build/IML74K) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0') ), - - ), - - 'FX2' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; FX2 PAD7 RK Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - // @ref: http://www.galapad.net/product.html - 'Galapad' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-tw; G1 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Webkit' => '534.30', 'Safari' => '4.0', 'Build' => 'JRO03C') ), - - ), - - 'GoClever' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; el-gr; GOCLEVER TAB A103 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; zh-tw; A7GOCLEVER Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; GOCLEVER TAB A104 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; cs-cz; GOCLEVER TAB A93.2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; sk-sk; GOCLEVER TAB A971 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; lv-lv; GOCLEVER TAB A972BK Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-fr; GOCLEVER TAB A104.2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; pt-pt; GOCLEVER TAB T76 Build/MID) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'GU' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; vi-vn; TX-A1301 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; da-dk; Q702 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '534.30', 'Safari' => '4.0')), - - ), - - 'HCL' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build/HCL ME Tablet U1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build/HCL ME Tablet U1) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; Connect-3G-2.0 Build/HCL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; pt-br; X1 Build/HCL ME Tablet X1) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - - - 'Hudl' => array( - 'Mozilla/5.0 (Linux; Android 4.2.2; Hudl HT7S3 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - - 'Iconbit' => array( - 'Mozilla/5.0 (Linux; Android 4.1.1; NT-3702M Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Safari/537.36 OPR/16.0.1212.65583' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; NetTAB SPACE II Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'iJoy' => array('Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; Tablet Planet II-v3 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), - - 'Intenso' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1.;de-de; INM8002KP Build/JR003H) AppleWebKit/534.30 (KHTML, like Gecko)Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, 'version' => array( - 'Android' => '4.1.1.', 'Webkit' => '534.30', 'Safari' => '4.0' - ), - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; TAB1004 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), - - 'INQ' => array( - 'INQ1/R3.9.12 NF-Browser/3.5' => array('isMobile' => true, 'isTablet' => false, 'model' => 'INQ1'), - ), - - // @todo: Test this - 'Intex' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3; en-US; Cloud_X2 Build/MocorDroid4.0.1) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/9.2.0.419 Mobile' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Cloud Y2 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-in; Cloud X5 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - ), - - 'IRU' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; M702pro Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'JXD' => array('Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; F3000 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - ), - - 'Karbonn' => array( - 'Mozilla/5.0 (Linux; Android 4.1.1; ST10 Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Kobo' => array( - 'Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 (Kobo Touch)' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.0', 'Webkit' => '533.1', 'Safari' => '4.0') ), - ), - - 'Megafon' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.5; ru-ru; MegaFon V9 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; MT7A Build/JRO03C) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true), - ), - - 'MediaTek' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; MT8377 Build/JRO03C) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30/4.05d.1002.m7' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Micromax' => array( - - 'Mozilla/5.0 (Linux; Android 4.1.1; Micromax A110 Build/JRO03C) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.169 Mobile Safari/537.22' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03C', 'Webkit' => '537.22', 'Chrome' => '25.0.1364.169') ), - 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Micromax P250(Funbook) Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Webkit' => '534.30', 'Android' => '4.0', 'Build' => 'IMM76D', 'Safari' => '4.0') ), - - ), - - 'Modecom' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; pl-pl; FreeTAB 1014 IPS X4+ Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'MSI' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.5; el-gr; MSI Enjoy 10 Plus Build/1.2) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - // @ref: https://www.nabitablet.com/ - 'Nabi' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; NABI-A Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - 'NEC' => array( - // @ref: http://www.n-keitai.com/n-08d/?from=mediasnet - // @ref: http://devlog.dcm-gate.com/2012/03/medias-tab-n-06duseragnet.html - // @ref: http://keitaiall.jp/N-08D.html aka MEDIAS TAB - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; N-08D Build/A5001911) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android AAA; BBB; N-06D Build/CCC) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'Nexo' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; pl-pl; NEXO 3G Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 ACHEETAHI/2100050074' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Nibiru' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-tw; Nibiru H1 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Nook' => array( - - 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; NOOK BNRV200 Build/ERD79 1.4.3) Apple WebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.2.1', 'Webkit' => '533.1', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; NOOK BNTV400 Build/ICS) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'ICS', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.0.4; BNTV600 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36 Hughes-PFB/CID5391275.AID1376709964' => array( 'isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76L', 'Webkit' => '537.36', 'Chrome' => '28.0.1500.94') ), - - ), - - 'Oneplus' => array( - 'Mozilla/5.0 (Linux; Android 4.3; A0001 Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; xx-xx; A0001 Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Odys' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Plus Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; XENO10 Build/ODYS XENO 10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2.2; de-de; ODYS Space Build/I700T_P7_T04_TSCL_FT_R_0_03_1010_110623) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ODYS-EVO Build/ODYS-EVO) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; Xelio 10 Pro Build/ODYS_Xelio) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; NEO_QUAD10 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.X; de-de; Xelio10Pro Build/ODYS_Xelio) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 2.3.1; en-us; ODYS-Xpress Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; XELIO7PHONETAB Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; XELIO10EXTREME Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; XELIO Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 Mobile UCBrowser/3.2.1.441' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; XELIOPT2 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; nl-nl; ODYS-NOON Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'OverMax' => array( - 'OV-SteelCore(B) Mozilla/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pl-pl; OV-SteelCore Build/ICS.g08refem611.20121010) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'YONESTablet' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pl-pl; BC1077 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - // @todo: Research http://www.pantech.com/ - 'Pantech' => array( - 'PANTECH-C790/JAUS08312009 Browser/Obigo/Q05A Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; ko-kr; SKY IM-A600S Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; ADR8995 4G Build/GRI40) AppleWebKit/533.1 (KHTML like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.2.1; en-us; PantechP4100 Build/HTK75) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array( - 'isMobile' => true, 'isTablet' => true), - ), - - 'Philips' => array( - 'Mozilla/5.0 (Linux; Android 4.0.4; Philips W336 Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.45 Mobile Safari/537.36 OPR/15.0.1162.59192' => array('isMobile' => true, 'isTablet' => false), - 'Philips_T3500/V1 Linux/3.4.5 Android/4.2.2 Release/03.26.2013 Browser/AppleWebKit534.30 Mobile Safari/534.30 MBBMS/2.2 System/Android 4.2.2;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; Philips W3568 Build/Philips_W3568) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; Philips W832 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux;U;Android 4.2.2;es-us;Philips S388 Build/JDQ39) AppleWebkit/534.30 (HTML,like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; Philips W536 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux;U;Android 4.2.2;es-us;Philips S308 Build/JDQ39) AppleWebkit/534.30 (HTML,like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; ru-ru; Philips-W8500 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru; Philips W8510 Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.9.457 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; ru-RU; Philips W3568 Build/Philips W3568) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; Philips S388 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.1; Build/PI3100.00.00.24) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; W732 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.1; PI7100_93 Build/PI7100.C.00.00.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - ), - - 'PocketBook' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-ru; PocketBook A10 3G Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - 'PointOfView' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; POV_TAB-PROTAB30-IPS10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Praktica' => array( - 'Mozilla/5.0 (Linux; Android 4.0.4; TP750 3GGSM Build/IMM76I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true) - ), - - 'PROSCAN' => array( - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; PLT8088 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '534.30', 'Safari' => '4.0') ), - ), - - 'PyleAudio' => array( - 'Mozilla/5.0 (Linux; Android 4.0.4; PTBL92BC Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '537.36', 'Chrome' => '31.0.1650.59')), - - ), - - 'RockChip' => array( - 'Mozilla/5.0 (Linux; U; Android 2.2.1; hu-hu; RK2818, Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android Android 2.1-RK2818-1.0.0; zh-cn; MD701 Build/ECLAIR) AppleWebKit/530.17 (KHTML like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => true), - ), - - 'RossMoor' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.1; ru-ru; RM-790 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - - ), - - // @ref: http://www.qmobile.com.pk/complete_range.php# - 'QMobile' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; A2 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'simvalley' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.4; de-de; SP-80 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Skk' => array('Mozilla/5.0 (Linux; U; Android 4.1; en-us; CYCLOPS Build/F10) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true)), - - 'Storex' => array( - 'Mozilla/5.0 (Linux; Android 4.1.1; eZee_Tab903 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '537.36')), - "Mozilla/5.0 (Linux; Android 4.1.1; eZee'Tab785 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Safari/537.36" => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03C', 'Webkit' => '537.36')), - "Mozilla/5.0 (Linux; Android 4.0.3; eZee'Tab971 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19" => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'IML74K', 'Webkit' => '535.19')), - ), - - 'Teclast' => array( - 'Mozilla/5.0 (Linux; Android 4.4.2; P98 3G\xE5\x85\xAB\xE6\xA0\xB8(A3HY) Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'QQ\xe9\x9f\xb3\xe4\xb9\x90HD 4.0.1 (iPad; iPhone OS 8.0; zh_CN)' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; A15(E6C2) Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3; xx-xx; A10 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Teclast A10T Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; Teclast P85(A9D3) Build/IMM76D) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; A70H Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.0.435 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Tecno' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; TECNO P9 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - ), - - 'Telstra' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.7; en-au; T-Hub2 Build/TVA301TELBG3) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - ), - - // @info: http://www.texet.ru/tablet/ - 'texet' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; TM-7021 Build/GB.m1ref.20120116) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.3.4', 'Webkit' => '533.1', 'Safari' => '4.0'), 'model' => 'TM-7021' ), - ), - - 'Tolino' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 8.9 Build/JDQ39) AppleWebKit/534.30 (KHTML like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '534.30', 'Safari' => '4.0')), - 'Mozilla/5.0 (Linux; Android 4.2.2; tolino tab 7 Build/JDQ39) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 OPR/18.0.1290.67495' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build/JDQ39) AppleWebkit/537.36 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Toshiba' => array( - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; TOSHIBA; TSUNAGI)' => array('isMobile' => true, 'isTablet' => false), - // @ref: http://www.toshiba.co.uk/discontinued-products/folio-100/ - 'Mozilla/5.0 (Linux; U; Android 2.2; it-it; TOSHIBA_FOLIO_AND_A Build/TOSHIBA_FOLIO_AND_A) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '2.2', 'Webkit' => '533.1', 'Safari' => '4.0') ), - ), - - 'Trekstor' => array( - 'Mozilla/5.0 (Linux; Android 4.2.2; ST70408-1 Build/JDQ39) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => 'JDQ39', 'Webkit' => '537.31', 'Chrome' => '26.0.1410.58')), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; engb; Build/IMM76D) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3 SurfTab_7.0' => array( - 'isMobile' => true, 'isTablet' => true, - ), - 'Mozilla/5.0 (Linux; Android 4.2.2; VT10416-2 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array( - 'isMobile' => true, 'isTablet' => true - ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; de-de; ST10216-2A Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30;SurfTab_10.1' => array( - 'isMobile' => true, 'isTablet' => true - ), - ), - - 'Ubislate' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; UBISLATE7C+ Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true) - ), - - 'Visture' => array( - - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; V97 HD Build/LR-97JC) Apple WebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Visture V4 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V4 HD Build/Visture V4 HD) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; es-es; Visture V5 HD Build/Visture V5 HD) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V10 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Versus' => array( - 'Mozilla/5.0 (Linux; Android 4.0.4; VS-TOUCHPAD 9 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; Versus Touchpad 9.7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; CnM-TOUCHPAD7 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 BMID/E67A45B1AB' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; CnM TouchPad 7DC Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 TwonkyBeamBrowser/3.3.5-95 (Android 4.1.1; rockchip CnM TouchPad 7DC Build/meizhi_V2.80.wifi8723.20121225.b11c800)' => array('isMobile' => true, 'isTablet' => true), - 'OneBrowser/3.5/Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; TOUCHTAB Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.1', 'Build' => 'JRO03H', 'Webkit' => '534.30', 'Safari' => '4.0') ), - ), - - 'Viewsonic' => array( - 'Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; ViewPad 10e Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2; it-it; ViewPad7 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' =>array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; ViewSonic VB733 Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; en-gb; ViewPad7X Build/HTJ85B) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2; pt-br; ViewPad 10S Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; VB100a Pro Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Vonino' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Sirius_Evo_QS Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Q8 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - ), - - 'Wolder' => array( - 'Mozilla/5.0 (Linux; Android 4.4; miTab LIVE Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; pt-pt; miTab FUNK Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), - - 'Wolfgang' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.1; nl-nl; AT-AS45q2 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false) - ), - - 'Xoro' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; PAD 9720QR Build/PAD 9719QR) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; PAD720 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true) - ), - - 'ZTE' => array( - 'Mozilla/5.0 (Linux; U; Android 4.2.1;zh-cn; ZTE V987 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30;' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.5; pt-pt; Blade Build/tejosunhsine) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; N880e_Dawoer_Fulllock; China Telecom)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; V965W)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; ZTE; Windows Phone - Internet 7; SFR)' => array('isMobile' => true, 'isTablet' => false), - ), - - 'Zync' => array( - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us ; Z909 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.4.1.204/145/444' => array('isMobile' => true, 'isTablet' => true) - ) - -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php deleted file mode 100644 index c86e3b192eb..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Prestigio.php +++ /dev/null @@ -1,12 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; PMP5297C_QUAD Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; sk-sk; PMP7100D3G Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.4', 'Build' => 'IMM76D', 'Webkit' => '534.30', 'Safari' => '4.0'), 'model' => 'PMP7100D3G' ), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; sk-sk; PMP7280C3G Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 MobilSafari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; PMT3017_WI Build/KVT49L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; PMT3037_3G Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; PMT5002_Wi Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; el-gr; PMT5887_3G Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - ), -); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php deleted file mode 100644 index e7099c5efc2..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Samsung.php +++ /dev/null @@ -1,131 +0,0 @@ - array( - 'MQQBrowser/4.0/Mozilla/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6800 Build/HTJ85B) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true, 'version' => array('MQQBrowser' => '4.0')), - 'SAMSUNG-SGH-P250-ORANGE/P250BVHH8 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-B2710/B271MCXKF1 SHP/VPP/R5 Dolfin/2.0 QTV/5.3 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Dolfin' => '2.0') ), - 'SAMSUNG-SGH-D900i/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-S5233T/S5233TXEJE3 SHP/VPP/R5 Jasmine/0.8 Qtv5.3 SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5380D/S5380FXXKL3; U; Bada/2.0; ru-ru) AppleWebKit/534.20 (KHTML, like Gecko) Dolfin/3.0 Mobile HVGA SMM-MMS/1.2.0 OPN-B' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-C3312/1.0 NetFront/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'SAMSUNG-GT-S3650/S3650XEII3 SHP/VPP/R5 Jasmine/1.0 Nextreaming SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'JUC (Linux; U; 2.3.6; zh-cn; GT-S5360; 240*320) UCWEB7.9.0.94/140/352' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S5250/S5250XEKJ3; U; Bada/1.0; ru-ru) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WQVGA SMM-MMS/1.2.0 NexPlayer/3.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; SAMSUNG; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8530/S8530XXJKA; U; Bada/1.2; cs-cz) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.2 Mobile WVGA SMM-MMS/1.2.0 OPN-B' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 1.6; ru-ru; Galaxy Build/Donut) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; ru-ru; GT-I5500 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; GALAXY_Tab Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - // @about FROYO: http://gizmodo.com/5543853/what-is-froyo - 'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; GT-I9000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; SCH-i909 Build/FROYO) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; ja-jp; SC-01C Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-gb; GT-P1000 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; el-gr; GT-I9001 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-ca; SGH-I896 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; es-us; GT-S5660L Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.261' => array('isMobile' => true, 'isTablet' => false, 'version' => array('MicroMessenger' => '4.5.1.261')), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6102 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; pt-br; GT-S5367 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-S5839i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S7500 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5830 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-us; GT-B5510L Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; pl-pl; GT-I9001-ORANGE/I9001BVKPC Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; nl-nl; GT-I9070 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5360 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; es-us; GT-S6102B Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5830i Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I8160 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6802 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; ru-ru; GT-S5830 Build/GRWK74; LeWa_ROM_Cooper_12.09.21) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-N7000 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; he-il; GT-P7300 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 3.2; en-gb; GT-P6200 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; GT-I9100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; GT-I9100G Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-P5100 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build/IML74K) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Mobile Safari/535.7' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('Chrome' => '16.0.912.75') ), - 'Mozilla/5.0 (Linux; Android 4.0.3; SGH-T989 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false, 'version' => array('Chrome' => '18.0.1025.166') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; GT-I9300 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; SPH-D710 Build/IMM76I) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300-ORANGE/I9300BVBLG2 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; th-th; GT-I9300T Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-I9100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us ; GT-I9100 Build/IMM76D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.4.1.204/145/355' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-N7000 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; th-th; GT-P6800 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I747 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; GT-P5110 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.4; GT-P5110 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; SAMSUNG-GT-S7568_TD/1.0 Android/4.0.4 Release/07.15.2012 Browser/AppleWebKit534.30 Build/IMM76D) ApplelWebkit/534.30 (KHTML,like Gecko) Version/4.0 Mobile Safari/534.30' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array('Android' => '4.0.4') ), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; tr-tr; GT-P3105 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-ca; GT-N8010 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-S7562 Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; GT-N7100 Build/JZO54K) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.52315' => array( 'isMobile' => true, 'isTablet' => false, 'version' => array( 'Build' => 'JZO54K', 'Webkit' => '537.22', 'Opera' => '14.0.1025.52315' ) ), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; zh-hk; GT-N7105 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; ru-ru; GT-N8000 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.1; SGH-i747M Build/JRO03L) AppleWebKit/535.19(KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720x1280 Build/JRO03S) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; GT-I8262 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; it-it; Galaxy Nexus Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-I777 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-S7710 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; GT-I9082 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T999L Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; GT-P5210 Build/JDQ39) AppleWebKit/537.36 (KHTML, Like Gecko) Chrome/27.0.1453.90 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG GT-I9200 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; nl-nl; SM-T310 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.3; en-us; SAMSUNG SM-P600 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-gb; GT-N5100 Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T800 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; fr-fr; SAMSUNG SM-T800 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T700 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; CETUS)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Focus I917 By TC)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Focus i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; FOCUS S)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-I8350)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-i8700)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; GT-S7530)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; Hljchm\'s Wp)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; I917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA 7)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7 By MWP_HS)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i677)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917.)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917R)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i937)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SMG-917R)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG_blocked_blocked_blocked; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG_blocked_blocked_blocked_blocked; OMNIA7; Orange)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SUMSUNG; OMNIA 7)' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; SAMSUNG; GT-I8750) like Gecko' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; GT-I8750) like Gecko' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; en-gb; SAMSUNG GT-I9205 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; GT-P7510 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SHV-E160K/VI10.1802 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (Linux; Android 5.0.2; SM-T805 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.4; SM-T116NQ Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.92 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 5.0.2; SM-G9250 Build/LRX22G; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/35.0.0.48.273;]' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T705Y Build/KOT49H) AppleWebKit/537.36(KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; SM-T705 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.45 Safari/537.36' => array('isMobile' => true, 'isTablet' => true) - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php deleted file mode 100644 index 4155daf0496..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Sony.php +++ /dev/null @@ -1,85 +0,0 @@ - array( - 'SonyEricssonK800i/R1AA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; es-ar; SonyEricssonE15a Build/2.0.1.A.0.47) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.1-update1; pt-br; SonyEricssonU20a Build/2.1.1.A.0.6) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.3; en-au; SonyEricssonX10i Build/3.0.1.G.0.75) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; ru-ru; SonyEricssonST18i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; hr-hr; SonyEricssonST15i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.4; sk-sk; SonyEricssonLT15i Build/4.0.2.A.0.62) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; th-th; SonyEricssonST27i Build/6.0.B.3.184) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 2.3.7; de-de; SonyEricssonST25i Build/6.0.B.3.184) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; pt-br; Xperia Tablet S Build/TID0092) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.0.3', 'Build' => 'TID0092', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.0.3; LT18i Build/4.1.A.0.562) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.3; Sony Tablet S Build/TISU0R0110) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; es-es; Sony Tablet S Build/TISU0143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; SonyEricssonLT18i Build/4.1.B.0.587) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; fr-ch; SonyEricssonSK17i Build/4.1.B.0.587) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; SonyEricssonLT26i Build/6.1.A.2.45) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; LT22i Build/6.1.B.0.544) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; vi-vn; SonyEricssonLT22i Build/6.1.B.0.544) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; ST23i Build/11.0.A.5.5) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; ST23i Build/11.0.A.2.10) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.0.4; LT28h Build/6.1.E.3.7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; SGPT13 Build/TJDS0170) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySO-03E Build/10.1.E.0.265) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.1.2', 'Build' => '10.1.E.0.265', 'Webkit' => '534.30', 'Safari' => '4.0') ), - 'Mozilla/5.0 (Linux; Android 4.1.2; LT26w Build/6.2.B.1.96) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.72 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; SGP321 Build/10.3.1.A.0.33) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Safari/537.31' => array('isMobile' => true, 'isTablet' => true, 'version' => array('Android' => '4.2.2', 'Build' => '10.3.1.A.0.33', 'Webkit' => '537.31', 'Chrome' => '26.0.1410.58') ), - 'Mozilla/5.0 (Linux; Android 4.3; C5303 Build/12.1.A.1.205) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; XL39h Build/14.2.A.1.136) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; sv-se; C5503 Build/10.1.1.A.1.273) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; C5502 Build/10.1.1.A.1.310) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; SonyL39t Build/14.1.M.0.202) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; L39u Build/14.1.n.0.63) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; M35c Build/12.0.B.5.37) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.1.2; M35c Build/12.0.B.2.42) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-CN; M35t Build/12.0.C.2.42) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/9.3.2.349 U3/0.8.0 Mobile Safari/534.31' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D6502 Build/17.1.A.2.69) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D6503 Build/17.1.A.0.504) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D6543 Build/17.1.A.2.55) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2004 Build/20.0.A.0.29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-gb; D2005 Build/20.0.A.1.12) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2104 Build/20.0.B.0.84) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2105 Build/20.0.B.0.74) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.170 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; pt-br; D2114 Build/20.0.B.0.85) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2302 Build/18.0.B.1.23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; S50h Build/18.0.b.1.23) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.6.3.413 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2303 Build/18.0.C.1.13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2305 Build/18.0.A.1.30) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D2306 Build/18.0.C.1.7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D5303 Build/19.0.1.A.0.207) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D5306 Build/19.1.A.0.264) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; XM50h Build/19.0.D.0.269) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.7.6.428 U3/0.8.0 Mobile Safari/533.1' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; XM50t Build/19.0.C.2.59) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; D5322 Build/19.0.D.0.253) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; M51w Build/14.2.A.1.146) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.3; M51w Build/14.2.A.1.146) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.136 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.1; D5102 Build/18.2.A.0.9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.1; D5103 Build/18.1.A.0.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.92 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.1; D5106 Build/18.1.A.0.11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.3; en-gb; C6902 Build/14.2.A.1.136) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 GSA/3.2.17.1009776.arm' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; es-es; C6943 Build/14.1.G.2.257) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; C6943 Build/14.3.A.0.681) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.2.2; SGP412 Build/14.1.B.3.320) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; SonySGP321 Build/10.2.C.0.143) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.1.2; SGP351 Build/10.1.1.A.1.307) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.3; SGP341 Build/10.4.B.0.569) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SGP511 Build/17.1.A.2.36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SGP512 Build/17.1.A.2.36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; fr-ch; SGP311 Build/10.1.C.0.344) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGP312 Build/10.1.C.0.344) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; de-de; SGP521 Build/17.1.A.2.69) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Safari/537.16' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn; SGP541 Build/17.1.A.2.36) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.4.2; SGP551 Build/17.1.A.2.72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'SonyEricssonU5i/R2CA; Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => array('isMobile' => true, 'isTablet' => false), - 'SonyEricssonU5i/R2AA; Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/4.0 (PDA; PalmOS/sony/model prmr/Revision:1.1.54 (en)) NetFront/3.0' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC/BEL; en) Presto/2.7.61 Version/11.00' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; es-ve; SonyST21a2 Build/11.0.A.6.5) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.2; D2533 Build/19.2.A.0.391) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; Android 4.4.4; Xperia SP Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla / 5.0 (Linux; Android 5.0.2; SOT31 Build / 28.0.D.6.71) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 39.0.2171.93 Safari / 537.36' => array('isMobile' => true, 'isTablet' => true), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php deleted file mode 100644 index 363aac9fcc1..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/SpecialCases.php +++ /dev/null @@ -1,206 +0,0 @@ - array( - 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; Avant Browser; rv:11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; Avant TriCore) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 5.1; rv:27.0; Avant TriCore) Gecko/20100101 Firefox/27.0' => array('isMobile' => false, 'isTablet' => false), - ), - 'Console' => array( - - //Nintendo Wii: - 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/536.28 (KHTML, like Gecko) NX/3.0.3.12.14 NintendoBrowser/3.1.1.9577.EU' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Nintendo WiiU) AppleWebKit/534.52 (KHTML, like Gecko) NX/{Version No} NintendoBrowser/{Version No}.US' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7567.US' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7498.US' => array('isMobile' => true, 'isTablet' => false), - //Sony PlayStation: - 'Mozilla/5.0 (PLAYSTATION 3 4.21) AppleWebKit/531.22.8 (KHTML, like Gecko)' => array('isMobile' => false, 'isTablet' => false), - //Microsoft Xbox: - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)' => array('isMobile' => false, 'isTablet' => false), - // WTF? Must investigate. - //'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Xbox)' => array('isMobile' => false, 'isTablet' => false), - - ), - - 'Other' => array( - // Unknown - 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SV1; [eburo v4.0]; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C; .NET4.0E)' => array('isMobile' => false, 'isTablet' => false), - - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit/600.1.25 (KHTML, like Gecko) Version/8.0 Safari/600.1.25' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - - // @todo 3Q - http://3q-int.com/en/download/tablets7/ - //'Mozilla/5.0 (Linux; U; Android 4.0.4; it-it; MT0729B Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, - //'Mozilla/5.0 (Linux; U; Android 4.0.4; uk-us; RC9716B Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, - - // Sogou Explorer (Browser) - //'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 SE 2.X MetaSr 1.0' => null, - //'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; SV1; SE 2.x)' => null, - - 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Iron/37.0.2000.0 Chrome/37.0.2000.0 Safari/537.36' => array('isMobile' => false, 'isTablet' => false, 'version' => array('Iron' => '37.0.2000.0')), - // Liebao Browser - //'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER', - 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.102 Chrome/32.0.1700.102 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0 AlexaToolbar/psPCtGhf-2.2' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; Linux ppc; rv:17.0) Gecko/20130626 Firefox/17.0 Iceweasel/17.0.7' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; Linux) AppleWebKit/535.22+ Midori/0.4' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit/535+ (KHTML, like Gecko) Version/5.0 Safari/535.20+ Midori/0.4' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 5.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Windows NT 5.2; WOW64) Presto/2.12.388 Version/12.14' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko/20100101 Firefox/14.0.1' => array('isMobile' => false, 'isTablet' => false), - // @todo Inspect https://gist.githubusercontent.com/pongacm/b7775bebf2b26c09e1f8/raw/0aff83747959386663f3a5c68d7f7150764a8e2d/Varnish%20-%20Tablet%20PC%20(TAB) - // https://github.com/varnish/varnish-devicedetect/issues/19 - 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; MANMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MASMJS)' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto/2.12.388 Version/12.11' => array('isMobile' => false, 'isTablet' => false), - // IE 10 - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)' => array('isMobile' => false, 'isTablet' => false), - // IE 11 @todo: Trident(.*)rv.(\d+)\.(\d+) - 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko' => array('isMobile' => false, 'isTablet' => false), - - // TV - 'Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)' => array('isMobile' => false, 'isTablet' => false), - 'HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11' => array('isMobile' => false, 'isTablet' => false), - ), - - 'TV' => array( - //'Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70' => null - ), - - 'Generic' => array( - - 'Mozilla/5.0 (Linux; U; Jolla; Sailfish; Mobile; rv:20.0) Gecko/20.0 Firefox/20.0 Sailfish Browser/1.0 like Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - - // Generic Firefox User-agents - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference#Firefox_OS - 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Tablet; rv:26.0) Gecko/26.0 Firefox/26.0' => array('isMobile' => true, 'isTablet' => true), - - // Facebook WebView - //'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D201 [FBAN/FBIOS;FBAV/12.1.0.24.20;FBBV/3214247;FBDV/iPhone6,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.1.1;FBSS/2; FBCR/AT&T;FBID/phone;FBLC/en_US;FBOP/5]' => null, - - // Outlook - //'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; InfoPath.3; IM-2014-026; IM-2014-043; Microsoft Outlook 14.0.7113; ms-office; MSOffice 14)' => null, - - // Carrefour tablet - 'Mozilla/5.0 (Linux; Android 4.2.2; CT1020W Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.94 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - // @comment: Pipo m6pro tablet - 'Mozilla/5.0 (Linux; Android 4.2.2; M6pro Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - - // https://github.com/varnish/varnish-devicedetect/issues/17 - // To be researched. - 'MobileSafari/9537.53 CFNetwork/672.1.13 Darwin/13.1.0' => array('isMobile' => true, 'isTablet' => false), - 'Appcelerator Titanium/3.2.2.GA (iPod touch/6.1.6; iPhone OS; en_US;)' => array('isMobile' => true, 'isTablet' => false), - - 'Opera Coast/3.0.3.78307 CFNetwork/672.1.15 Darwin/14.0.0' => array('isMobile' => true, 'isTablet' => false), - - 'Mozilla/5.0 (Linux; Android 4.0.3; ALUMIUM10 Build/IML74K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.2.1; en-us; JY-G3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; hu-hu; M758A Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - - 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; EVOTAB Build/IMM76I) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Java/1.6.0_22' => array('isMobile' => false, 'isTablet' => false, 'version' => array('Java' => '1.6.0_22') ), - 'Opera/9.80 (Series 60; Opera Mini/6.5.29260/29.3417; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Android; Opera Mini/6.5.27452/29.3417; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - // New Opera - 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17 OPR/14.0.1025.52315' => array('isMobile' => false, 'isTablet' => false), - // Unknown yet - // Looks like Chromebook - //'Mozilla/5.0 (X11; CrOS armv7l 4920.83.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.103 Safari/537.36' => null, - 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Android 2.3.7; Linux; Opera Mobi/46154) Presto/2.11.355 Version/12.10' => array('isMobile' => true, 'isTablet' => false), - //'Mozilla/5.0 (Linux; U; Android 4.0.3; it-it; DATAM819HD_C Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, - //'Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; SGPT12 Build/TID0142) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, - //'Mozilla/5.0 (Linux; U; Android 4.0.4; en-us; cm_tenderloin Build/IMM76L; CyanogenMod-9) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, - - //'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; A210 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, // Acer Iconia Tab - 'Mozilla/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B141 Safari/8536.25' => array('isMobile' => true, 'isTablet' => true), - //'Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; GT-I8150 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => null, - //'Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mercury/7.2 Mobile/10A523 Safari/8536.25' => null, // Mercurio Browser - //'Opera/9.80 (Android 2.3.7; Linux; Opera Tablet/46154) Presto/2.11.355 Version/12.10' => null, - 'Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build/MASTER) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => false), // sdk - 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), // sdk - - //'Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10' => null, - //'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => null, // 7" Verso Android tablet - //'Mozilla/5.0 (iPhone; U; CPU OS 4_2_1 like Mac OS X) AppleWebKit/532.9 (KHTML, like Gecko) Version/5.0.3 Mobile/8B5097d Safari/6531.22.7' => null, - //'Mozilla/5.0 (Linux; U; Android 4.0.3; en-gb; SGPT12 Build/TID0142) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, // sony xperia tablet s unforts - //'Mozilla/5.0 (Linux; U; Android 2.0.6_b1; ru-ru Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => null, // PocketBook IQ701 (tablet) - //'Mozilla/5.0 (Linux; Android 4.0.4; z1000 Build/IMM76D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => null, // It is a tablet with calling - //'Mozilla/5.0 (Linux; Android 4.0.3; cm_tenderloin Build/GWK74) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => null, // HP touch pad running android cyanogenmod - //'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; Android for Techvision TV1T808 Board Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => null, // My device is tablet but its detected as phone - //'BlackBerry8520/5.0.0.592 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/136' => null, - //'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17' => null, // its a lenovo tablet 2 with windows 8 pro - //'Mozilla/5.0 (Linux; U; Android 3.1; ru-ru; LG-V900 Build/HMJ37) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => null, - //'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8S by HTC)' => null, - //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // MS Surface RT tablet actually! - //'Mozilla/5.0 (PLAYSTATION 3 4.11) AppleWebKit/531.22.8 (KHTML, like Gecko)' => null, - //'Mozilla/5.0 (Linux; U; Android 3.2; ru-ru; V9S_V1.4) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13' => null, // Wrong detection - 7-inch tablet was detected as a phone. Android 3.2.1, native browser - //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // Nope, its a Microsoft Surface tablet running Windows RT (8) with MSIE 10 - //'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => null, // Tablet! - //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // its a Microsoft surface rt (tablet) - //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch; WebView/1.0)' => null, - //'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Next7P12 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => null, // Nextbook 7SE Tablet - //'Opera/9.80 (X11; Linux zbov) Presto/2.11.355 Version/12.10' => null, // allview alldro speed tablet, android ics, opera mobile - //'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0; Touch)' => null, // Its a surface in portrait - // Am ramas la pozitia: 207 - - // Android on Windows :) www.socketeq.com - //'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; full Android on Microsoft Windows, pad, pc, n*books Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => null, - - // TV - //'Opera/9.80 (Linux mips; U; InettvBrowser/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC/BEL; en) Presto/2.7.61 Version/11.00' => null, - - 'Mozilla/5.0 (Android; Mobile; rv:18.0) Gecko/18.0 Firefox/18.0' => array('isMobile' => true, 'isTablet' => false), - // Maxthon - 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.12 (KHTML, like Gecko) Maxthon/3.0 Chrome/18.0.966.0 Safari/535.12' => array('isMobile' => false, 'isTablet' => false), - 'Opera/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto/2.10.289 Version/12.02' => array('isMobile' => false, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/JB_MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)' => array('isMobile' => true, 'isTablet' => false), - 'PalmCentro/v0001 Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/Palm-D061; Blazer/4.5) 16;320x320' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; Microsoft; XDeviceEmulator)' => array('isMobile' => true, 'isTablet' => false), - // ZTE phone - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; MAL; N880E; China Telecom)' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Series 60; Opera Mini/7.0.29482/28.2859; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (S60; SymbOS; Opera Mobi/SYB-1202242143; U; en-GB) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.0.3; en-au; 97D Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Opera/9.80 (Android; Opera Mini/7.0.29952/28.2647; U; ru) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Android; Opera Mini/6.1.25375/28.2555; U; en) Presto/2.8.119 Version/11.10' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Mac OS X; Opera Tablet/35779; U; en) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Android; Tablet; rv:10.0.4) Gecko/10.0.4 Firefox/10.0.4 Fennec/10.0.4' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Android; Tablet; rv:18.0) Gecko/18.0 Firefox/18.0' => array('isMobile' => true, 'isTablet' => true), - 'Opera/9.80 (Linux armv7l; Maemo; Opera Mobi/14; U; en) Presto/2.9.201 Version/11.50' => array('isMobile' => true, 'isTablet' => false), - 'Opera/9.80 (Android 2.2.1; Linux; Opera Mobi/ADR-1207201819; U; en) Presto/2.10.254 Version/12.00' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; sdk Build/JRO03E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' => array('isMobile' => true, 'isTablet' => false), - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Endeavour 1010 Build/ONDA_MID) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), // Blaupunkt Endeavour 1010 - 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de; Tablet-PC-4 Build/ICS.g08refem618.20121102) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - // Tagi tablets - 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; Tagi Tab S10 Build/8089) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), - - 'Bot' => array( - 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http://grub.org)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'Googlebot-Image/1.0' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'Python-urllib/2.5' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'AdsBot-Google (+http://www.google.com/adsbot.html)' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari' => array('isMobile' => true, 'isTablet' => false, /*'isBot' => true*/), - 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko, Google Keyword Suggestion) Chrome/10.0.648.127 Safari/534.16' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/), - 'Facebot' => array('isMobile' => false, 'isTablet' => false, /*'isBot' => true*/) - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php deleted file mode 100644 index 2074a041de0..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/Vodafone.php +++ /dev/null @@ -1,11 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; U; Android 3.2; hu-hu; SmartTab10-MSM8260-V02d-Dec022011-Vodafone-HU) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; Android 4.0.3; SmartTabII10 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.1.1; fr-fr; SmartTAB 1002 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array('isMobile' => true, 'isTablet' => true), - 'Mozilla/5.0 (Linux; U; Android 4.0.4; de-de, SmartTabII7 Build/A2107A_A404_107_055_130124_VODA) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' => array( - 'isMobile' => true, 'isTablet' => true, - ), - ), -); diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php b/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php deleted file mode 100644 index 4f29b7a633b..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/providers/vendors/ZTE.php +++ /dev/null @@ -1,6 +0,0 @@ - array( - 'Mozilla/5.0 (Linux; Android 4.0.4; V8200plus Build/IMM76I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Mobile Safari/537.36' => array('isMobile' => true, 'isTablet' => false) - ) -); \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json b/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json deleted file mode 100644 index 165832d6e6f..00000000000 --- a/htdocs/includes/mobiledetect/mobiledetectlib/tests/ualist.json +++ /dev/null @@ -1,8196 +0,0 @@ -{ - "hash": "169521cbf4b919b69880fa76746cd4f78bbc99f5", - "user_agents": [ - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; A100 Build\/HTK55D) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; en-us; A110 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Webkit": "534.30", - "Safari": "4.0", - "Build": "IML74K" - }, - "model": "A200" - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; A701 Build\/JRO03H) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; B1-A71 Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; B1-710 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A1-810 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; A1-810 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Acer; Allegro)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A3-A10 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.2", - "Build": "JDQ39", - "Webkit": "537.36", - "Chrome": "32.0.1700.99" - } - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; A1-811 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A1-830 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Acer", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; A3-A11 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-in; MB525 Build\/GWK74; CyanogenMod-7.2.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; it-it; ALCATEL ONE TOUCH 918D Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false, - "version": { - "Android": "2.3.5", - "Webkit": "533.1", - "Safari": "4.0", - "Build": "GRJ90" - }, - "model": "ONE TOUCH 918D" - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; ALCATEL ONE TOUCH 991 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false, - "version": { - "Android": "2.3.6", - "Webkit": "533.1", - "Safari": "4.0", - "Build": "GRJ90" - }, - "model": "ONE TOUCH 991" - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; ALCATEL ONE TOUCH 993D Build\/ICECREAM) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false, - "version": { - "Android": "4.0.4", - "Webkit": "534.30", - "Safari": "4.0", - "Build": "ICECREAM" - }, - "model": "ONE TOUCH 993D" - }, - { - "vendor": "Alcatel", - "user_agent": "ALCATEL_A392G\/1.0 ObigoInternetBrowser\/Q05A[TF013513002719521000000013182904148]", - "mobile": true, - "tablet": false, - "model": "A392G" - }, - { - "vendor": "Alcatel", - "user_agent": "ALCATEL_3020D\/1.0 ObigoInternetBrowser\/Q03C", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2; ALCATEL ONE TOUCH 5037A Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "ALCATEL_3020G\/1.0 ObigoInternetBrowser\/Q03C", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "ALCATEL_3041D\/1.0 ObigoInternetBrowser\/Q03C", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037E Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 5037X Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 5037X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012A Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-nz; ONE TOUCH 6012A Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012D Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; ONE TOUCH 6012D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; En-us; ONE TOUCH 6012E Build\/JDQ39) AppleWebKit\/534.30 (KHTML, Like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ONE TOUCH 6012X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.12975 YaBrowser\/13.12.1599.12975 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; bg-bg; ONE TOUCH 6012X Build\/JDQ39) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6012X_orange Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; fr-fr; ALCATEL ONE TOUCH 6012X_orange Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; fr-fr; 6016E Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; ALCATEL ONE TOUCH 6016E Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; 6016X Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; ALCATEL ONE TOUCH 6016X Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; ru-ru; 6016X Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 6032A Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.170 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-ru; ALCATEL ONE TOUCH 6032X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-nz; ALCATEL ONE TOUCH 7040A Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; th-th; ALCATEL ONE TOUCH 7040D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040D Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7040E Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; it-it; ALCATEL ONE TOUCH 7041D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041D Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 7041X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; pt-pt; ALCATEL ONE TOUCH 7041X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020A Build\/JDQ39) AppleWebKit\/537.36 (KHTML, Like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020A Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020D Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; ALCATEL ONE TOUCH 8020D Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020E Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020E Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ALCATEL ONE TOUCH 8020X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Alcatel", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; ALCATEL ONE TOUCH 8020X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Allview", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; ALLVIEW P5 Build\/IML74K) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Allview", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us ; ALLVIEW SPEEDI Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.5.3.246\/145\/355", - "mobile": true, - "tablet": true - }, - { - "vendor": "Allview", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; AllviewCity Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Allview", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; ALLVIEWSPEED Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.4 Mobile Safari\/535.19 Silk-Accelerated =true", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; en-US) AppleWebKit\/528.5+ (KHTML, like Gecko, Safari\/528.5+) Version\/4.0 Kindle\/3.0 (screen 600x800; rotate)", - "mobile": true, - "tablet": true, - "version": { - "Webkit": "528.5+", - "Kindle": "3.0", - "Safari": "4.0" - }, - "model": "Kindle" - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFOTE Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "IML74K", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; WFJWAE Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFTHWI Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFJWI Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; en-us; KFSOWI Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/3.21 Safari\/535.19 Silk-Accelerated=true", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amazon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1; xx-xx; T720-WIFI Build\/ECLAIR) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": true - }, - { - "vendor": "Apple", - "user_agent": "iTunes\/9.1.1", - "mobile": false, - "tablet": false - }, - { - "vendor": "Apple", - "user_agent": "iTunes\/11.0.2 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit\/536.27.1", - "mobile": false, - "tablet": false - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) Version\/7.0 Mobile\/11A4449d Safari\/9537.53", - "mobile": true, - "tablet": false - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit\/420+ (KHTML, like Gecko) Version\/3.0 Mobile\/1A543 Safari\/419.3", - "mobile": true, - "tablet": false, - "version": { - "Webkit": "420+", - "Safari": "3.0" - } - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit\/528.18 (KHTML, like Gecko) Version\/4.0 Mobile\/7A341 Safari\/528.16", - "mobile": true, - "tablet": false, - "version": { - "iOS": "3_0", - "Webkit": "528.18", - "Safari": "4.0" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9B206 Safari\/7534.48.3", - "mobile": true, - "tablet": false, - "version": { - "iOS": "5_1_1", - "Webkit": "534.46", - "Mobile": "9B206", - "Safari": "5.1" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPod; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A403 Safari\/8536.25", - "mobile": true, - "tablet": false, - "version": { - "iOS": "6_0", - "Webkit": "536.26", - "Mobile": "10A403", - "Safari": "6.0" - }, - "model": "iPod" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/21.0.1180.80 Mobile\/9B206 Safari\/7534.48.3 (6FF046A0-1BC4-4E7D-8A9D-6BF17622A123)", - "mobile": true, - "tablet": true, - "version": { - "iOS": "5_1_1", - "Webkit": "534.46.0", - "Chrome": "21.0.1180.80", - "Mobile": "9B206" - }, - "model": "iPad" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A403 Safari\/8536.25", - "mobile": true, - "tablet": true, - "version": { - "iOS": "6_0", - "Webkit": "536.26", - "Safari": "6.0", - "Mobile": "10A403" - }, - "model": "iPad" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8C148 Safari\/6533.18.5", - "mobile": true, - "tablet": true, - "version": { - "iOS": "4_2_1", - "Webkit": "533.17.9", - "Safari": "5.0.2", - "Mobile": "8C148" - }, - "model": "iPad" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit\/531.21.10 (KHTML, like Gecko) Version\/4.0.4 Mobile\/7B334b Safari\/531.21.10", - "mobile": true, - "tablet": true, - "version": { - "iOS": "3_2", - "Webkit": "531.21.10", - "Safari": "4.0.4", - "Mobile": "7B334b" - }, - "model": "iPad" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X; da-dk) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/21.0.1180.82 Mobile\/10A523 Safari\/7534.48.3", - "mobile": true, - "tablet": false, - "version": { - "iOS": "6_0_1", - "Webkit": "534.46.0", - "Chrome": "21.0.1180.82", - "Mobile": "10A523" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10A523 Safari\/8536.25", - "mobile": true, - "tablet": false, - "version": { - "iOS": "6_0_1", - "Webkit": "536.26", - "Safari": "6.0", - "Mobile": "10A523" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X; ru-ru) AppleWebKit\/536.26 (KHTML, like Gecko) CriOS\/23.0.1271.100 Mobile\/10B142 Safari\/8536.25", - "mobile": true, - "tablet": false, - "version": { - "iOS": "6_1", - "Webkit": "536.26", - "Chrome": "23.0.1271.100", - "Mobile": "10B142" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10B329 Safari\/8536.25", - "mobile": true, - "tablet": false, - "version": { - "iOS": "6_1_3", - "Webkit": "536.26", - "Safari": "6.0", - "Mobile": "10B329" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Coast\/1.0.2.62956 Mobile\/10B329 Safari\/7534.48.3", - "mobile": true, - "tablet": true, - "version": { - "Coast": "1.0.2.62956" - } - }, - { - "vendor": "Apple", - "user_agent": "CheckMyBus iOS mobile App 0.9.0 (iPhone; iPhone OS\/7.1.1)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) Version\/7.0 Mobile\/11A465 Safari\/9537.53", - "mobile": true, - "tablet": true - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit\/600.1.4 (KHTML, like Gecko) CriOS\/38.0.2125.59 Mobile\/12A405 Safari\/600.1.4", - "mobile": true, - "tablet": false - }, - { - "vendor": "Apple", - "user_agent": "VendorAppName\/1.7.0 (iPhone; iOS 8.1.2; Scale\/3.00)", - "mobile": true, - "tablet": false, - "version": { - "iOS": "8.1.2" - }, - "model": "iPhone" - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPad; CPU OS 9_0 like Mac OS X) AppleWebKit\/601.1.17 (KHTML, like Gecko) Version\/8.0 Mobile\/13A175 Safari\/600.1.4", - "mobile": true, - "tablet": true - }, - { - "vendor": "Apple", - "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit\/601.1.37 (KHTML, like Gecko) Version\/8.0 Mobile\/13A4293g Safari\/600.1.4", - "mobile": true, - "tablet": false - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Qilive 97R Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Archos 50 Platinum Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; ARCHOS 80G9 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; fr-fr; A101IT Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 101 Neon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 101 Cobalt Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80 TITANIUM Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ARCHOS 101 Titanium Build\/JRO03H) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 70b TITANIUM Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; de-de; Archos 80 Xenon Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 79 Xenon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 101 Titanium Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 80XSK Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS FAMILYPAD 2 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ARCHOS 97B TITANIUM Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ARCHOS 101 XS 2 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; ARCHOS 80b PLATINUM Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 70 Xenon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ARCHOS 97 CARBON Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS 97 TITANIUMHD Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Archos 90 Neon Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.6; de-de; Archos5 Build\/Donut) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Archos", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ARCHOS GAMEPAD Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true, - "version": { - "Android": "3.2.1", - "Webkit": "534.13", - "Safari": "4.0" - }, - "model": "Transformer TF101" - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Transformer Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build\/JZO54K; CyanogenMod-10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; asus_laptop Build\/IMM76L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; PadFone 2 Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Build": "JRO03L", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; ME301T Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.1", - "Build": "JOP40D" - } - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; ME173X Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.1", - "Build": "JOP40D" - } - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; TF300T Build\/JDQ39E) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.2", - "Build": "JDQ39E" - } - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00C Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00E Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; K00L Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ME302KL Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; K010 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.111 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "ASUS", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; K017 Build\/KVT49L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.111 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.546 Mobile Safari\/534.8+", - "mobile": true, - "tablet": false, - "version": { - "Webkit": "534.8+", - "BlackBerry": "6.0.0.546" - }, - "model": "BlackBerry 9300" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9360; en-US) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.0.0.400 Mobile Safari\/534.11+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9700; he) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.723 Mobile Safari\/534.8+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9700; en-US) AppleWebKit\/534.8 (KHTML, like Gecko) Version\/6.0.0.448 Mobile Safari\/534.8", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9790; en-GB) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.714 Mobile Safari\/534.11+", - "mobile": true, - "tablet": false, - "version": { - "Webkit": "534.11+", - "BlackBerry": "7.1.0.714" - }, - "model": "BlackBerry 9790" - }, - { - "vendor": "BlackBerry", - "user_agent": "Opera\/9.80 (BlackBerry; Opera Mini\/7.0.29990\/28.2504; U; en) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9981; en-GB) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.342 Mobile Safari\/534.11+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9800; en-GB) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.546 Mobile Safari\/534.8+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9780; es) AppleWebKit\/534.8 (KHTML, like Gecko) Version\/6.0.0.480 Mobile Safari\/534.8", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9810; en-US) AppleWebKit\/534.11 (KHTML, like Gecko) Version\/7.0.0.583 Mobile Safari\/534.11", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9860; es) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.0.0.576 Mobile Safari\/534.11+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9900; en-US) AppleWebKit\/534.11 (KHTML, like Gecko) Version\/7.1.0.523 Mobile Safari\/534.11", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "BlackBerry8520\/5.0.0.592 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/136", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "BlackBerry8520\/5.0.0.1067 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/603", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "BlackBerry8520\/5.0.0.1036 Profile\/MIDP-2.1 Configuration\/CLDC-1.1 VendorID\/611", - "mobile": true, - "tablet": false, - "version": { - "BlackBerry": "5.0.0.1036", - "VendorID": "611" - }, - "model": "BlackBerry8520" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9220; en) AppleWebKit\/534.11+ (KHTML, like Gecko) Version\/7.1.0.337 Mobile Safari\/534.11+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit\/536.2+ (KHTML, like Gecko) Version\/7.2.1.0 Safari\/536.2+", - "mobile": true, - "tablet": true - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.1+ (KHTML, like Gecko) Version\/10.0.0.1337 Mobile Safari\/537.1+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+", - "mobile": true, - "tablet": false - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (BB10; Touch) \/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+", - "mobile": true, - "tablet": false, - "version": { - "BlackBerry": "10.0.9.2372" - } - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true, - "version": { - "Android": "3.2.1", - "Webkit": "534.13", - "Safari": "4.0" - }, - "model": "Transformer TF101" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; A200 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Webkit": "534.30", - "Safari": "4.0" - }, - "model": "A200" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A500 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Webkit": "534.30", - "Safari": "4.0" - }, - "model": "A500" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; A501 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Webkit": "534.30", - "Safari": "4.0" - }, - "model": "A501" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Transformer Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Webkit": "535.19", - "Chrome": "18.0.1025.166" - }, - "model": "Transformer" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ASUS Transformer Pad TF300T Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Webkit": "535.19", - "Chrome": "18.0.1025.166" - }, - "model": "Transformer Pad TF300T" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-fr; Transformer Build\/JZO54K; CyanogenMod-10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.2", - "Webkit": "534.30", - "Safari": "4.0", - "Build": "JZO54K" - }, - "model": "Transformer" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; B1-A71 Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.2", - "Webkit": "535.19", - "Chrome": "18.0.1025.166" - }, - "model": "B1-A71" - }, - { - "vendor": "BlackBerry", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Acer; Allegro)", - "mobile": true, - "tablet": false, - "version": { - "Windows Phone OS": "7.5", - "Trident": "5.0", - "IE": "9.0" - }, - "model": "Allegro" - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.6; en-gb; Dell Streak Build\/Donut AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/ 525.20.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; hd-us; Dell Venue Build\/GWK74; CyanogenMod-7.2.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; DELL; Venue Pro)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Venue 8 3830 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Venue 7 3730 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Venue 7 HSPA+ Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; Venue 8 3830 Build\/JSS15Q) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Dell", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; zh-cn; Dell Streak 10 Pro Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Nexus 4 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.40 Mobile Safari\/537.31 OPR\/14.0.1074.54070", - "mobile": true, - "tablet": false, - "version": { - "Android": "4.2.2", - "Build": "JDQ39", - "Webkit": "537.31", - "Opera": "14.0.1074.54070" - } - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Nexus 4 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false, - "version": { - "Android": "4.2.2", - "Chrome": "26.0.1410.58" - } - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Google Nexus 4 - 4.1.1 - API 16 - 768x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Google Galaxy Nexus - 4.1.1 - API 16 - 720x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Nexus 7 Build\/JRO03D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2; Nexus 7 Build\/JOP40C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Nexus 7 Build\/JZ054K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.2", - "Chrome": "18.0.1025.166" - } - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; cs-cz; Nexus S Build\/JZO54K; CyanogenMod-10.0.0) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; Nexus 10 Build\/JWR66Y) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; U; Android; en_us; Nexus 7 Build\/) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 NetFrontLifeBrowser\/2.3 Mobile (Dragonfruit)", - "mobile": true, - "tablet": true - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.1; Nexus 5 Build\/LMY47D) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/39.0.0.0 Mobile Safari\/537.36 momoWebView\/6.3.1 android\/404(Nexus 5;android 5.1;zh_CN;10;netType\/1)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Google", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; Nexus 10 Build\/JWR66Y) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (hp-tablet; Linux; hpwOS\/3.0.5; U; en-GB) AppleWebKit\/534.6 (KHTML, like Gecko) wOSBrowser\/234.83 Safari\/534.6 TouchPad\/1.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; HP Slate 7 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HP Slate 7 Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; HP 8 Build\/1.0.7_WW-FIR-13) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HP Slate 10 HD Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HP Slate 8 Pro Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Slate 21 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Safari\/537.36 OPR\/22.0.1485.78487", - "mobile": true, - "tablet": true - }, - { - "vendor": "HP", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HP SlateBook 10 x2 PC Build\/4.3-17r20-03-23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (X11; Linux x86_64; Z520m; en-ca) AppleWebKit\/534.24 (KHTML, like Gecko) Chrome\/11.0.696.34 Safari\/534.24", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "HTC_Touch_HD_T8282 Mozilla\/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.5; en-us; ADR6200 Build\/CUPCAKE) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1; xx-xx; Desire_A8181 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; en-gb; HTC Desire Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; fr-fr; HTC Desire Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-dk; Desire_A8181 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; xx-xx; 001HT Build\/FRF91) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; xx-xx; HTCA8180\/1.0 Android\/2.2 release\/06.23.2010 Browser\/WAP 2.0 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; de-at; HTC Desire Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; en-sk; Desire_A8181 Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3; xx-xx; HTC\/DesireS\/1.07.163.1 Build\/GRH78C) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-lv; HTC_DesireZ_A7272 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; ADR6300 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-gb; HTC\/DesireS\/2.10.161.3 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC_DesireS_S510e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-us; Inspire 4G Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; de-de; HTC Explorer A310e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-gb; HTC_ChaCha_A810e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; nl-nl; HTC_DesireHD_A9191 Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; HTC Desire S Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-au; HTC Desire Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; de-de; HTC_DesireHD Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ua; HTC_WildfireS_A510e Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-us; HTC Vision Build\/GRI40; ILWT-CM7) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; HTC_GOF_U\/1.05.161.1 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; hu-hu; HTC Sensation Z710e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC Sensation XE with Beats Audio Z715e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; pl-pl; EVO3D_X515m Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; HTC_One_V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC_A320e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-tw; HTC Desire V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; PG86100 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-nl; SensationXE_Beats_Z715e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; ADR6425LVW 4G Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; cs-ee; Sensation_Z710e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; HTC Evo 4G Build\/MIUI) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; Desire HD Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-my; HTC_One_X Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; IncredibleS_S710e Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-fr; HTC_Desire_S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC Butterfly Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; EVO Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTCSensation Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-S6312 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC 7 Mozart T8698; QSD8x50)", - "mobile": true, - "tablet": false, - "version": { - "IE": "9.0", - "Windows Phone OS": "7.5", - "Trident": "5.0" - }, - "model": "7 Mozart T8698" - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-gb;HTC_Flyer_P512 Build\/HTK75C) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.1; zh-tw; HTC PG09410 Build\/HMJ15) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 HTC MOZART)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mondrian T8788)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart T8698)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Mozart; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Pro T7576)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Pro)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Schubert T9292)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Surround)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Trophy T8686)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; 7 Trophy)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Eternity)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Gold)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD2 LEO)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD2)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD7 T9292)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; HD7)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; iPad 3)", - "mobile": true, - "tablet": true - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; LEO)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mazaa)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mondrian)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mozart T8698)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Mozart)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; mwp6985)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PC40100)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PC40200)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PD67100)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PI39100)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; PI86100)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar 4G)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 1.08.164.02)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 2.05.164.01)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar C110e; 2.05.168.02)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Radar; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schuber)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schubert T9292)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Schubert)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Spark)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Surround)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T7575)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T8697)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T8788)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T9295)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; T9296)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; TITAN X310e)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Titan)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; Torphy T8686)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC; X310e)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; HTC_blocked; T8788)", - "mobile": true, - "tablet": false, - "version": { - "IE": "9.0", - "Windows Phone OS": "7.5", - "Trident": "5.0" - }, - "model": "T8788" - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One S Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; HTC One X Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-th; HTC One V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One X Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-id; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One S Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-at; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03L) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One X Build\/JZO54K) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-pe; HTC One V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 Maxthon\/4.0.4.1000", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.133 Mobile Safari\/535.19 AlexaToolbar\/alxf-2.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One S Build\/IML74K) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; de-de; HTC One Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31 OPR\/14.0.1074.58201", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39E) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One XL Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.63 Mobile Safari\/537.36 OPR\/15.0.1162.60140", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.24 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "HTC One X Linux\/3.0.13 Android\/4.1.9 Release\/10.12.2012 Browser\/AppleWebKit534.30 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Mobile Safari\/534.30 Android 4.0.1;", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One 801e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One X Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.63 Mobile Safari\/537.36 OPR\/15.0.1162.61541", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One XL Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X+ Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; HTC One X Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30\/4.05d.1002.m7", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-in; HTC One V Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 MicroMessenger\/5.0.1.352", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; HTC One X Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; HTC One Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One SV Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One mini Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; HTC One Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One 801e Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-ch; HTC One Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; zh-cn; HTC One S Build\/IML74K) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17 T5\/2.0 baidubrowser\/3.1.6.4 (Baidu; P1 4.0.3)", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X+ Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HTC One 801e Build\/JSS15J) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.4.1.362 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; HTC One Build\/KRT16S.H5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One SV Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; ru-ru; HTC One Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-ru; HTC One 801e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One 801e Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One mini Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.12975 YaBrowser\/13.12.1599.12975 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; HTC One Build\/KRT16S) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HTC One Build\/JSS15J) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One X Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One X Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JWR66Y.H1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; de-at; HTC One Build\/JSS15J) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One dual sim Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One S Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One max Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.132 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One mini Build\/JSS15Q) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One 801e Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; HTC One Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 MicroMessenger\/5.2.380", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.133 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.132 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; HTC One X Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; HTC One S Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-kw; HTC One X+ Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One max Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 MicroMessenger\/5.3.0.49_r693790.420", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build\/IML74K) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.7.5.418 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 MicroMessenger\/5.2.1.381", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One mini Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; ru-ru; HTC One mini Build\/KOT49H) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru; HTC One V Build\/IML74K) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.8.0.435 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One 801e Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; HTC One X - 4.2.2 - API 17 - 720x1280 Build\/JDQ39E) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.128 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.128 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.128 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; HTC One VX Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.76 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One V Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One dual sim Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One dual sim Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36 OPR\/22.0.1485.78487", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One 801e Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One 801e Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; HTC One X Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36 OPR\/22.0.1485.81203", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One 801e Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; HTC One S Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; HTC One V Build\/IML74K) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.9.2.467 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One mini Build\/JSS15Q) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-us; HTC One_M8 Build\/KOT49H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One dual sim Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/37.0.2062.117 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.72 Mobile Safari\/537.36 OPR\/19.0.1340.69721", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One SV Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 ACHEETAHI\/2100050056", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One_M8 Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JWR66Y.H1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One SV Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/21.0.0.23.12;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-si; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 MicroMessenger\/6.0.0.67_r853700.483 NetType\/WIFI", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-US; HTC One X Build\/JRO03C) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/10.0.1.512 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One Build\/KTU84P.H1) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One SV Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FBAN\/FB4A;FBAV\/22.0.0.15.13;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; HTC One X+ Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 BingWeb\/5.2.0.20140710", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; HTC One Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-mx; HTC One S Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FBAN\/FB4A;FBAV\/23.0.0.22.14;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.3; es-es; HTC One 801e Build\/KTU84L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X+ Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.69 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; HTC One S Build\/JRO03C) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-th; HTC One Build\/KOT49H) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-ar; HTC One X Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One_M8 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-us; HTC One X+ Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-mx; HTC One S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/24.0.0.30.15;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; HTC One Build\/KTU84L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One dual sim Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/25.0.0.19.30;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.1; HTC One_M8 Build\/LRX22C) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/37.0.0.0 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/25.0.0.19.30;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; HTC One_M8 Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.109 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; HTC One X Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; HTC One mini Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.109 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "HTC", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.1; HTC One_M8 Build\/LRX22C.H5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.109 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; bg-bg; Ideos S7 Build\/ERE27) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2", - "mobile": true, - "tablet": true - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1; en-us; Ideos S7 Build\/ERE27) AppleWebKit\/525.10+ (KHTML, like Gecko) Version\/3.0.4 Mobile Safari\/523.12.2", - "mobile": true, - "tablet": true - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; lt-lt; U8660 Build\/HuaweiU8660) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; ru-ru; HUAWEI-U8850 Build\/HuaweiU8850) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; pl-pl; MediaPad Build\/HuaweiMediaPad) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; nl-nl; HUAWEI MediaPad Build\/HuaweiMediaPad) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Huwaei", - "user_agent": "HUAWEI_T8951_TD\/1.0 Android\/4.0.4 (Linux; U; Android 4.0.4; zh-cn) Release\/05.31.2012 Browser\/WAP2.0 (AppleWebKit\/534.30) Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; ar-eg; MediaPad 7 Youth Build\/HuaweiMediaPad) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-cn; HW-HUAWEI_C8815\/C8815V100R001C541B135; 540*960; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_C8813D\/C8813DV100R001C92B172; 480*854; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Huwaei", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; HW-HUAWEI_Y300C\/Y300CV100R001C92B168; 480*800; CTC\/2.0) AppleWebKit\/534.30 (KHTML, like Gecko) Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; Iris 349 Build\/MocorDroid2.3.5) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris402+ Build\/iris402+) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; IRIS402 Build\/LAVAIRIS402) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; iris405 Build\/LAVAIRIS405) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; IRIS_501 Build\/LAVAIRIS501) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris402e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris503e Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IRIS402) U2\/1.0.0 UCBrowser\/9.1.1.420 Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "UCWEB\/2.0 (MIDP-2.0; U; Adr 4.2.2; en-US; IRIS402) U2\/1.0.0 UCBrowser\/9.1.1.420 U2\/1.0.0 Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IRIS355) U2\/1.0.0 UCBrowser\/9.1.1.420 Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; iris356 Build\/irisIRIS356) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.5.0.360 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; iris356) U2\/1.0.0 UCBrowser\/9.0.2.389 Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; iris500 Build\/iris500) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; iris700 Build\/iris700) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; QPAD E704 Build\/JDQ39) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/36.0.1985.131 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2; xx-xx; IvoryS Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-US; E-TAB IVORY Build\/E702) AppleWebKit\/534.31 (KHTML, like Gecko) UCBrowser\/9.3.0.321 U3\/0.8.0 Mobile Safari\/534.31", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lava", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; tr-tr; E-TAB Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": 0, - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-au; TBLT10Q-32GB Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build\/MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-au; ThinkPad Tablet Build\/ThinkPadTablet_A400_03) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "UCWEB\/2.0 (Linux; U; Opera Mini\/7.1.32052\/30.3697; en-US; IdeaTabA1000-G) U2\/1.0.0 UCBrowser\/9.2.0.419 Mobile", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; IdeaTabA1000-F Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; Lenovo A3000-H Build\/JOP40D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.117 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; IdeaTab A3000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.360", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; zh-cn; Lenovo-A3000-H\/S100) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.1 Mobile Safari\/534.300", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-us; IdeaTab A3000-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; IdeaTab A2107A-H Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; IdeaTabA2109A Build\/JRO03R) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; nl-nl; IdeaTabA2109A Build\/JRO03R) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; IdeaTab_A1107 Build\/MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.300", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; IdeaTab S6000-H Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; IdeaTab S6000-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Lenovo B8000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2;it-it; Lenovo B8000-F\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; it-it; Lenovo B6000-F\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.2.2 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Lenovo B6000-F Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; IdeaPadA10 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Ideapad K1 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; de-de; IdeaPad A1 Build\/GRK393; CyanogenMod-7) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; Lenovo B8080-H Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; hu-hu; Lenovo A3500-FL Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Lenovo A7600-F Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Lenovo A5500-F Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.131 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Lenovo", - "user_agent": "Lenovo A390 Linux\/3.0.13 Android\/4.4.2 Release\/04.03.2013 Browser\/AppleWebKit534.30 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 Mobile Safari\/534.30 Android 4.0.1;", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; LG-VS410PP Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; LG-P509 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; pt-br; LG-P350f Build\/FRG83G) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; LG-P500 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; LS670 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; LG-E510 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MMS\/LG-Android-MMS-V1.0\/1.2", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; VS910 4G Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-P700 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build\/IML74K) AppleWebkit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; LG-F160S Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; LG-E610v\/V10f Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; LG-E612 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; LG-F180K Build\/JZO54K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; LG-V500 Build\/JDQ39B) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; LG-LW770 Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; LG-V510 Build\/KOT49H.L004) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG E-900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-C900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-C900k)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-E900h)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; LG; LG-Optimus 7)", - "mobile": true, - "tablet": false - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0.1; ja-jp; L-06C Build\/HRI66) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0; en-us; LG-V900 Build\/HRI39) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-gb; LG-V700 Build\/KOT49I.A1403851714) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.1599.103 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; LG-V500 Build\/KOT49I.V50020d) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.102 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "LG", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-us; LG-V410\/V41010d Build\/KOT49I.V41010d) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.1599.103 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2; xx-xx; HM NOTE 1W Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 MobilSafari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.1; zh-cn; MI-ONE Plus Build\/ITL41D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2SC Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build\/JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-tw; MI 1S Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.8; zh-cn; xiaomi2 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko)Version\/4.0 MQQBrowser\/4.4 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; MI 2A Build\/miui.es JRO03L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; zh-cn; MI 3 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; MI 1S Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; MI 3W Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; HM 1SC Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HM 1SW Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/2.0.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; HM NOTE 1W Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/2.0.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; MI-ONE C1 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.4; en-us; MI 4W Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36 XiaoMi\/MiuiBrowser\/2.0.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Mi", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; MI PAD Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)", - "mobile": true, - "tablet": true, - "version": { - "IE": "10.0", - "Windows NT": "6.2", - "Trident": "6.0" - } - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident\/6.0; Touch; ARMBJS)", - "mobile": true, - "tablet": true - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; MASMJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko\/20130626 Firefox\/25.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko\/20100101 Firefox\/22.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; MDDCJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; MDDCJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.52 Safari\/537.36 OPR\/15.0.1147.130", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.116 Safari\/537.36", - "mobile": false, - "tablet": false - }, - { - "vendor": "Microsoft", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; MDDCJS; WebView\/1.0)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "MOT-W510\/08.11.05R MIB\/BER2.2 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 EGE\/1.0 UP.Link\/6.3.0.0.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; zh-cn; ME722 Build\/MLS2GC_2.6.0) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; DROIDX Build\/4.5.1_57_DX8-51) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; en-us; MB855 Build\/4.5.1A-1_SUN-254_13) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; es-us; MB526 Build\/4.5.2-51_DFL-50) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-ca; MB860 Build\/4.5.2A-51_OLL-17.8) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-us; MOT-XT535 Build\/V1.540) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; ko-kr; A853 Build\/SHOLS_U2_05.26.3; CyanogenMod-7.1.2) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0; en-us; Xoom Build\/HRI39) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.1; en-us; Xoom Build\/HMJ25) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; DROID RAZR 4G Build\/6.7.2-180_DHD-16_M4-31) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; Xoom Build\/IMM76L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-br; XT687 Build\/V2.27D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false, - "version": { - "Android": "4.0.4", - "Webkit": "534.30", - "Safari": "4.0" - }, - "model": "XT687" - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; MOT-XT910 Build\/6.7.2-180_SPU-19-TA-11.6) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT910 Build\/9.8.2O-124_SPUL-17) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT915 Build\/2_32A_2031) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT919 Build\/2_290_2017) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT925 Build\/9.8.2Q-50-XT925_VQLM-20) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT907 Build\/9.8.1Q-66) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT901 Build\/9.8.2Q-50_SLS-13) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; DROID BIONIC Build\/9.8.2O-72_VZW-22) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1022 Build\/KXC20.82-14) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.4; en-in; XT1022 Build\/KXC21.5-40) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1025 Build\/KXC20.82-13) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1052 Build\/KLA20.16-2.16.2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; XT1052 Build\/13.9.0Q2.X_83) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; XT1053 Build\/13.9.0Q2.X_61) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Mobile Safari\/537.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; XT1053 Build\/13.9.0Q2.X_55) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; XT1056 Build\/13.9.0Q2.X-116-MX-17-6-2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.64 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1031 Build\/KXB20.9-1.10-1.18-1.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; XT1032 Build\/KXB21.14-L1.40) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; de-de; XT1032 Build\/KLB20.9-1.10-1.24-1.1) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.16", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT1034 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-us; XT1034 Build\/14.10.0Q3.X-84-16) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; XT1035 Build\/14.10.0Q3.X-23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.3; XT1039 Build\/KXB21.14-L1.31) AppleWebKit\/537.36 (KHTML like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; XT919 Build\/2_290_2002) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT919 Build\/2_290_2004) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; XT920 Build\/2_290_2014) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; XT920 Build\/2_310_2014) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; XT905 Build\/7.7.1Q_GCIRD-16) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; XT908 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; XT897 Build\/7.7.1Q-6_SPR-ASANTI_LE-18) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.2; XT1032 Build\/LXB22.46-28.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.1.1; Moto E Build\/LMY47V) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/39.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Motorola", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; XT1021 Build\/KTU84Q) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/33.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Nokia200\/2.0 (12.04) Profile\/MIDP-2.1 Configuration\/CLDC-1.1 UCWEB\/2.0 (Java; U; MIDP-2.0; en-US; nokia200) U2\/1.0.0 UCBrowser\/8.9.0.251 U2\/1.0.0 Mobile UNTRUSTED\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Nokia6303iclassic\/5.0 (06.61) Profile\/MIDP-2.1 Configuration\/CLDC-1.1 Mozilla\/5.0 AppleWebKit\/420+ (KHTML, like Gecko) Safari\/420+", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "nokian73-1\/UC Browser7.8.0.95\/69\/400 UNTRUSTED\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Nokia2760\/2.0 (06.82) Profile\/MIDP-2.1 Configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Nokia3650\/1.0 SymbianOS\/6.1 Series60\/1.2 Profile\/MIDP-1.0 Configuration\/CLDC-1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "NokiaN70-1\/5.0737.3.0.1 Series60\/2.8 Profile\/MIDP-2.0 Configuration\/CLDC-1.1\/UC Browser7.8.0.95\/27\/352", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (S60V3; U; ru; NokiaN73) AppleWebKit\/530.13 (KHTML, like Gecko) UCBrowser\/8.6.0.199\/28\/444\/UCWEB Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (S60V3; U; ru; NokiaC5-00.2)\/UC Browser8.5.0.183\/28\/444\/UCWEB Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (S60V3; U; ru; NokiaC5-00.2) AppleWebKit\/530.13 (KHTML, like Gecko) UCBrowser\/8.7.0.218\/28\/352\/UCWEB Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Series40; NokiaC3-00\/08.63; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) Gecko\/20100401 S40OviBrowser\/2.2.0.0.33", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Opera\/9.80 (Series 60; Opera Mini\/7.0.31380\/28.2725; U; es) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false, - "version": { - "Opera Mini": "7.0.31380", - "Presto": "2.8.119" - } - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.2 NokiaC7-00\/025.007; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.37 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.2 NokiaX7-00\/022.014; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.37 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaE6-00\/111.140.0058; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaC6-01\/111.040.1511; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaC6-01; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia700\/111.030.0609; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia700\/111.020.0308; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.1.14 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 NokiaN8-00\/111.040.1511; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/535.1 (KHTML, like Gecko) NokiaBrowser\/8.3.1.4 Mobile Safari\/535.1 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Symbian\/3; Series60\/5.3 Nokia701\/111.030.0609; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.4.2.6 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120c\/3.83; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120ci\/7.02; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 Nokia6120c\/7.10; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE66-1\/510.21.009; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE71-1\/110.07.127; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaN95-3\/20.2.011 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE51-1\/200.34.36; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaE63-1\/500.21.009; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.2; U; Series60\/3.1 NokiaN82\/10.0.046; Profile\/MIDP-2.0 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE52-1\/052.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.2", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE52-1\/@version@; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.26 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00\/031.022; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.3.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00.2\/081.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.32 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; U; Series60\/3.2 NokiaN79-1\/32.001; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; U; Series60\/3.2 Nokia6220c-1\/06.101; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/413 (KHTML, like Gecko) Safari\/413", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00.2\/071.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.26 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaE72-1\/081.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.32 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.3; Series60\/3.2 NokiaC5-00\/061.005; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.2 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaX6-00\/40.0.002; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gb", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5800d-1\/60.0.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaC5-03\/12.0.023; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.9 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5228\/40.1.003; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.7.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5230\/51.0.002; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.33 Mobile Safari\/533.4 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 Nokia5530c-2\/32.0.007; Profile\/MIDP-2.1 Configuration\/CLDC-1.1 ) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 BrowserNG\/7.2.6.9 3gpp-gba", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaN97-1\/21.0.045; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) BrowserNG\/7.1.4", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (SymbianOS\/9.4; Series60\/5.0 NokiaN97-4\/30.0.004; Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/533.4 (KHTML, like Gecko) NokiaBrowser\/7.3.1.28 3gpp-gba", - "mobile": true, - "tablet": false, - "version": { - "Symbian": "9.4", - "Webkit": "533.4", - "NokiaBrowser": "7.3.1.28" - }, - "model": "NokiaN97-4" - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 7 Mozart T8698)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; 710)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800C)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 800C; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; 900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; HD7 T9292)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; LG E-900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 610)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; T-Mobile)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 710; Vodafone)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800) UP.Link\/5.1.2.6", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; SFR)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; T-Mobile)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 800; vodafone)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Lumia 800c)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Lumia 900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Lumia 920)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident\/6.0; IEMobile\/10.0; ARM; Touch; NOKIA; Lumia 920)", - "mobile": true, - "tablet": false, - "version": { - "IE": "10.0", - "Windows Phone OS": "8.0", - "Trident": "6.0" - }, - "model": "Lumia 920" - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; lumia800)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 610)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 710)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 800)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 800C)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; NOKIA; Nokia 900)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; Nokia)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; SGH-i917)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Nokia; TITAN X310e)", - "mobile": true, - "tablet": false, - "version": { - "Windows Phone OS": "7.5", - "Trident": "5.0" - }, - "model": "TITAN X310e" - }, - { - "vendor": "Nokia", - "user_agent": "Mozilla\/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident\/7.0; Touch; rv:11.0; IEMobile\/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit\/537 (KHTML, like Gecko) Mobile Safari\/537", - "mobile": true, - "tablet": false - }, - { - "vendor": "Onda", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; V975i Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.108 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Onda", - "user_agent": "Mozilla\/5.0 (Android; Tablet; rv:37.0) Gecko\/37.0 Firefox\/37.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "Onda", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; V975m Core4 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Onda", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; fr-fr; V975m Core4 Build\/JSS15J) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Safari\/537.16", - "mobile": true, - "tablet": true - }, - { - "vendor": "Onda", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; V975m Core4 Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.96 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Onda", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; V812 Core4 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "AdvanDigital", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; E1C Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "AdvanDigital", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; id-id; T3C Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Ainol", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; Ainol Novo8 Advanced Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Ainol", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Novo10 Hero Build\/20121115) AppleWebKit\/535.19 (KHTML like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Ainol", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; novo9-Spark Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "AllFine", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; FINE7 GENIUS Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Amoi", - "user_agent": "Amoi 8512\/R18.0 NF-Browser\/3.3", - "mobile": true, - "tablet": false, - "model": "8512" - }, - { - "vendor": "Arnova", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; fr-fr; AN9G2I Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "AudioSonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-au; T-17B Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Blaupunkt", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; Endeavour 800NG Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Broncho", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; es-es; Broncho N701 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "bq", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; bq Livingstone 2 Build\/1.1.7 20121018-10:33) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "bq", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-es; bq Edison Build\/1.1.10-1015 20121230-18:00) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "bq", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; Maxwell Lite Build\/v1.0.0.ICS.maxwell.20120920) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "bq", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-tw; bq Maxwell Plus Build\/1.0.0 20120913-10:39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "bq", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; Aquaris E10 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Captiva", - "user_agent": "Opera\/9.80 (X11; Linux zvav; U; de) Presto\/2.8.119 Version\/11.10 Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; CAPTIVA PAD 10.1 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Casio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; C771 Build\/C771M120) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "ChangJia", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-br; TPC97113 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "ChangJia", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; TPC7102 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Celkon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; Celkon CT 910+ Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Celkon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-in; CT-1 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Celkon", - "user_agent": "CELKON.C64\/R2AE SEMC-Browser\/4.0.3 Profile\/MIDP-2.0 Configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Celkon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A125 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Celkon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-US; Celkon*A86 Build\/Celkon_A86) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1 UCBrowser\/8.7.0.315 Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Celkon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Celkon A.R 40 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Coby", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; MID7010 Build\/FRF85B) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Coby", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; MID7048 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Coby", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; MID8042 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Concorde", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde Tab T10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Concorde", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; ConCorde tab PLAY Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Cresta", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; nl-nl; CRESTA.CTP888 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Cube", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; CUBE U9GT 2 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Danew", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; Dslide 700 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "IML74K", - "Webkit": "534.30", - "Safari": "4.0" - }, - "model": "Dslide 700" - }, - { - "vendor": "DanyTech", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Genius Tab Q4 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Digma", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; iDx10 3G Build\/ICS.b02ref.20120331) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "DPS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; DPS Dream 9 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "ECS", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; it-it; TM105A Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.4", - "Build": "IMM76D", - "Webkit": "534.30" - } - }, - { - "vendor": "Eboda", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme Dual Core X190 Build\/JRO03C) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Eboda", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Essential A160 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Eboda", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; E-Boda Supreme X80 Dual Core Build\/ICS.g12refM806A1YBD.20120925) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Eboda", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-boda essential smile Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Eboda", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme X80 Dual Core Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Eboda", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; E-Boda Supreme XL200IPS Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Evolio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Evolio X7 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Evolio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ro-ro; ARIA_Mini_wifi Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Fly", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; Fly IQ440; Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Fly", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; FLY IQ256 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Fujitsu", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ja-jp; F-10D Build\/V21R48A) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "V21R48A", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Fujitsu", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; ru-ru; M532 Build\/IML74K) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "IML74K", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "FX2", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; FX2 PAD7 RK Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Galapad", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-tw; G1 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Webkit": "534.30", - "Safari": "4.0", - "Build": "JRO03C" - } - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; el-gr; GOCLEVER TAB A103 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; zh-tw; A7GOCLEVER Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; GOCLEVER TAB A104 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; cs-cz; GOCLEVER TAB A93.2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; sk-sk; GOCLEVER TAB A971 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; lv-lv; GOCLEVER TAB A972BK Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-fr; GOCLEVER TAB A104.2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "GoClever", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; pt-pt; GOCLEVER TAB T76 Build\/MID) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "GU", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; vi-vn; TX-A1301 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.4", - "Build": "IMM76D", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "GU", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; da-dk; Q702 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "IML74K", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "HCL", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build\/HCL ME Tablet U1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "HCL", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; U1 Build\/HCL ME Tablet U1) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "HCL", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; Connect-3G-2.0 Build\/HCL) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "HCL", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; pt-br; X1 Build\/HCL ME Tablet X1) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Hudl", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Hudl HT7S3 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.82 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Iconbit", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; NT-3702M Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Safari\/537.36 OPR\/16.0.1212.65583", - "mobile": true, - "tablet": true - }, - { - "vendor": "Iconbit", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; NetTAB SPACE II Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "iJoy", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; Tablet Planet II-v3 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Intenso", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1.;de-de; INM8002KP Build\/JR003H) AppleWebKit\/534.30 (KHTML, like Gecko)Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1.", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Intenso", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; TAB1004 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "INQ", - "user_agent": "INQ1\/R3.9.12 NF-Browser\/3.5", - "mobile": true, - "tablet": false, - "model": "INQ1" - }, - { - "vendor": "Intex", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3; en-US; Cloud_X2 Build\/MocorDroid4.0.1) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1 UCBrowser\/9.2.0.419 Mobile", - "mobile": true, - "tablet": false - }, - { - "vendor": "Intex", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Cloud Y2 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Intex", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-in; Cloud X5 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "IRU", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; M702pro Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "JXD", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; F3000 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Karbonn", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; ST10 Build\/JRO03C) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Kobo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 (Kobo Touch)", - "mobile": true, - "tablet": true, - "version": { - "Android": "2.0", - "Webkit": "533.1", - "Safari": "4.0" - } - }, - { - "vendor": "Megafon", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; ru-ru; MegaFon V9 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Megafon", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; MT7A Build\/JRO03C) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", - "mobile": true, - "tablet": true - }, - { - "vendor": "MediaTek", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; MT8377 Build\/JRO03C) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30\/4.05d.1002.m7", - "mobile": true, - "tablet": true - }, - { - "vendor": "Micromax", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Micromax A110 Build\/JRO03C) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.169 Mobile Safari\/537.22", - "mobile": true, - "tablet": false, - "version": { - "Android": "4.1.1", - "Build": "JRO03C", - "Webkit": "537.22", - "Chrome": "25.0.1364.169" - } - }, - { - "vendor": "Micromax", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; Micromax P250(Funbook) Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Webkit": "534.30", - "Android": "4.0", - "Build": "IMM76D", - "Safari": "4.0" - } - }, - { - "vendor": "Modecom", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; pl-pl; FreeTAB 1014 IPS X4+ Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "MSI", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.5; el-gr; MSI Enjoy 10 Plus Build\/1.2) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Nabi", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; en-us; NABI-A Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "NEC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ja-jp; N-08D Build\/A5001911) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "NEC", - "user_agent": "Mozilla\/5.0 (Linux; U; Android AAA; BBB; N-06D Build\/CCC) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Nexo", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; pl-pl; NEXO 3G Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 ACHEETAHI\/2100050074", - "mobile": true, - "tablet": true - }, - { - "vendor": "Nibiru", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-tw; Nibiru H1 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 XiaoMi\/MiuiBrowser\/1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Nook", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; en-us; NOOK BNRV200 Build\/ERD79 1.4.3) Apple WebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true, - "version": { - "Android": "2.2.1", - "Webkit": "533.1", - "Safari": "4.0" - } - }, - { - "vendor": "Nook", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; NOOK BNTV400 Build\/ICS) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.4", - "Build": "ICS", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Nook", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; BNTV600 Build\/IMM76L) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36 Hughes-PFB\/CID5391275.AID1376709964", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.4", - "Build": "IMM76L", - "Webkit": "537.36", - "Chrome": "28.0.1500.94" - } - }, - { - "vendor": "Oneplus", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; A0001 Build\/JLS36C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Oneplus", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; xx-xx; A0001 Build\/JLS36C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; LOOX Plus Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; XENO10 Build\/ODYS XENO 10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.2; de-de; ODYS Space Build\/I700T_P7_T04_TSCL_FT_R_0_03_1010_110623) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ODYS-EVO Build\/ODYS-EVO) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; Xelio 10 Pro Build\/ODYS_Xelio) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; NEO_QUAD10 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.X; de-de; Xelio10Pro Build\/ODYS_Xelio) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.1; en-us; ODYS-Xpress Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; XELIO7PHONETAB Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; XELIO10EXTREME Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; XELIO Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 Mobile UCBrowser\/3.2.1.441", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; XELIOPT2 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Odys", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; nl-nl; ODYS-NOON Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "OverMax", - "user_agent": "OV-SteelCore(B) Mozilla\/5.0 (iPad; CPU OS 5_0_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9A405 Safari\/7534.48.3", - "mobile": true, - "tablet": true - }, - { - "vendor": "OverMax", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pl-pl; OV-SteelCore Build\/ICS.g08refem611.20121010) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "YONESTablet", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pl-pl; BC1077 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Pantech", - "user_agent": "PANTECH-C790\/JAUS08312009 Browser\/Obigo\/Q05A Profile\/MIDP-2.0 Configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Pantech", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; ko-kr; SKY IM-A600S Build\/FRG83) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Pantech", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us; ADR8995 4G Build\/GRI40) AppleWebKit\/533.1 (KHTML like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Pantech", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2.1; en-us; PantechP4100 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; Philips W336 Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.45 Mobile Safari\/537.36 OPR\/15.0.1162.59192", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Philips_T3500\/V1 Linux\/3.4.5 Android\/4.2.2 Release\/03.26.2013 Browser\/AppleWebKit534.30 Mobile Safari\/534.30 MBBMS\/2.2 System\/Android 4.2.2;", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Philips W3568 Build\/Philips_W3568) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; Philips W832 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux;U;Android 4.2.2;es-us;Philips S388 Build\/JDQ39) AppleWebkit\/534.30 (HTML,like Gecko) Version\/4.0 Mobile Safari\/534.30;", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; Philips W536 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux;U;Android 4.2.2;es-us;Philips S308 Build\/JDQ39) AppleWebkit\/534.30 (HTML,like Gecko) Version\/4.0 Mobile Safari\/534.30;", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; ru-ru; Philips-W8500 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru; Philips W8510 Build\/JDQ39) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.8.9.457 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; ru-RU; Philips W3568 Build\/Philips W3568) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.1 Mobile Safari\/534.30;", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; Philips S388 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; Build\/PI3100.00.00.24) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; W732 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Philips", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.1; PI7100_93 Build\/PI7100.C.00.00.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "PocketBook", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-ru; PocketBook A10 3G Build\/GRJ90) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "PointOfView", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; POV_TAB-PROTAB30-IPS10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Praktica", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; TP750 3GGSM Build\/IMM76I) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "PROSCAN", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; PLT8088 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Build": "JRO03H", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "PyleAudio", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; PTBL92BC Build\/IMM76D) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Mobile Safari\/537.36", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.4", - "Build": "IMM76D", - "Webkit": "537.36", - "Chrome": "31.0.1650.59" - } - }, - { - "vendor": "RockChip", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; hu-hu; RK2818, Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "RockChip", - "user_agent": "Mozilla\/5.0 (Linux; U; Android Android 2.1-RK2818-1.0.0; zh-cn; MD701 Build\/ECLAIR) AppleWebKit\/530.17 (KHTML like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": true - }, - { - "vendor": "RossMoor", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; ru-ru; RM-790 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "QMobile", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; A2 Build\/GRK39F) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "simvalley", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; de-de; SP-80 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Skk", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; en-us; CYCLOPS Build\/F10) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Storex", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; eZee_Tab903 Build\/JRO03H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Build": "JRO03H", - "Webkit": "537.36" - } - }, - { - "vendor": "Storex", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; eZee'Tab785 Build\/JRO03C) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.59 Safari\/537.36", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Build": "JRO03C", - "Webkit": "537.36" - } - }, - { - "vendor": "Storex", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; eZee'Tab971 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "IML74K", - "Webkit": "535.19" - } - }, - { - "vendor": "Teclast", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; P98 3G\\xE5\\x85\\xAB\\xE6\\xA0\\xB8(A3HY) Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Teclast", - "user_agent": "QQ\\xe9\\x9f\\xb3\\xe4\\xb9\\x90HD 4.0.1 (iPad; iPhone OS 8.0; zh_CN)", - "mobile": true, - "tablet": true - }, - { - "vendor": "Teclast", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0; xx-xx; A15(E6C2) Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Teclast", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3; xx-xx; A10 Build\/GRJ22) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Teclast", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; Teclast A10T Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Teclast", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; Teclast P85(A9D3) Build\/IMM76D) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Teclast", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; A70H Build\/JDQ39) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.8.0.435 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Tecno", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; TECNO P9 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Telstra", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; en-au; T-Hub2 Build\/TVA301TELBG3) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "texet", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; TM-7021 Build\/GB.m1ref.20120116) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true, - "version": { - "Android": "2.3.4", - "Webkit": "533.1", - "Safari": "4.0" - }, - "model": "TM-7021" - }, - { - "vendor": "Tolino", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.2", - "Build": "JDQ39", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Tolino", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 8.9 Build\/JDQ39) AppleWebKit\/534.30 (KHTML like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.2", - "Build": "JDQ39", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Tolino", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; tolino tab 7 Build\/JDQ39) AppleWebkit\/537.36 (KHTML, like Gecko) Chrome\/31.0.1650.57 Safari\/537.36 OPR\/18.0.1290.67495", - "mobile": true, - "tablet": true - }, - { - "vendor": "Tolino", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; tolino tab 7 Build\/JDQ39) AppleWebkit\/537.36 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Toshiba", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; TOSHIBA; TSUNAGI)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Toshiba", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; it-it; TOSHIBA_FOLIO_AND_A Build\/TOSHIBA_FOLIO_AND_A) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true, - "version": { - "Android": "2.2", - "Webkit": "533.1", - "Safari": "4.0" - } - }, - { - "vendor": "Trekstor", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; ST70408-1 Build\/JDQ39) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.2", - "Build": "JDQ39", - "Webkit": "537.31", - "Chrome": "26.0.1410.58" - } - }, - { - "vendor": "Trekstor", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; engb; Build\/IMM76D) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9A405 Safari\/7534.48.3 SurfTab_7.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "Trekstor", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; VT10416-2 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Trekstor", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; de-de; ST10216-2A Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30;SurfTab_10.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Ubislate", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; UBISLATE7C+ Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Visture", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; V97 HD Build\/LR-97JC) Apple WebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Visture", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; Visture V4 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Visture", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V4 HD Build\/Visture V4 HD) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Visture", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; es-es; Visture V5 HD Build\/Visture V5 HD) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Visture", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; Visture V10 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Versus", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; VS-TOUCHPAD 9 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Versus", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; Versus Touchpad 9.7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Versus", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; CnM-TOUCHPAD7 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 BMID\/E67A45B1AB", - "mobile": true, - "tablet": true - }, - { - "vendor": "Versus", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; CnM TouchPad 7DC Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30 TwonkyBeamBrowser\/3.3.5-95 (Android 4.1.1; rockchip CnM TouchPad 7DC Build\/meizhi_V2.80.wifi8723.20121225.b11c800)", - "mobile": true, - "tablet": true - }, - { - "vendor": "Versus", - "user_agent": "OneBrowser\/3.5\/Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; TOUCHPAD 7 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Versus", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; TOUCHTAB Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.1", - "Build": "JRO03H", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Viewsonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; de-de; ViewPad 10e Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Viewsonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; it-it; ViewPad7 Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Viewsonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; en-ca; ViewSonic VB733 Build\/FRG83) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Viewsonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; en-gb; ViewPad7X Build\/HTJ85B) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Viewsonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; pt-br; ViewPad 10S Build\/FRF91) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Viewsonic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; VB100a Pro Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Vonino", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; Sirius_Evo_QS Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Vonino", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; Q8 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Wolder", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4; miTab LIVE Build\/KVT49L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Wolder", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; pt-pt; miTab FUNK Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Wolfgang", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; nl-nl; AT-AS45q2 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Xoro", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; PAD 9720QR Build\/PAD 9719QR) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Xoro", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; PAD720 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "ZTE", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; V8200plus Build\/IMM76I) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.166 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Zync", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-us ; Z909 Build\/GRI40) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.4.1.204\/145\/444", - "mobile": true, - "tablet": true - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; PMP5297C_QUAD Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; sk-sk; PMP7100D3G Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.4", - "Build": "IMM76D", - "Webkit": "534.30", - "Safari": "4.0" - }, - "model": "PMP7100D3G" - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; sk-sk; PMP7280C3G Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 MobilSafari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; PMT3017_WI Build\/KVT49L) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; PMT3037_3G Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; PMT5002_Wi Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/39.0.2171.93 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Prestigio", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; el-gr; PMT5887_3G Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "MQQBrowser\/4.0\/Mozilla\/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6800 Build\/HTJ85B) AppleWebKit\/533.1 (KHTML, like Gecko) Mobile Safari\/533.1", - "mobile": true, - "tablet": true, - "version": { - "MQQBrowser": "4.0" - } - }, - { - "vendor": "Samsung", - "user_agent": "SAMSUNG-SGH-P250-ORANGE\/P250BVHH8 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 UP.Browser\/6.2.3.3.c.1.101 (GUI) MMP\/2.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "SAMSUNG-GT-B2710\/B271MCXKF1 SHP\/VPP\/R5 Dolfin\/2.0 QTV\/5.3 SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1 OPN-B", - "mobile": true, - "tablet": false, - "version": { - "Dolfin": "2.0" - } - }, - { - "vendor": "Samsung", - "user_agent": "SAMSUNG-SGH-D900i\/1.0 Profile\/MIDP-2.0 Configuration\/CLDC-1.1 UP.Browser\/6.2.3.3.c.1.101 (GUI) MMP\/2.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "SAMSUNG-GT-S5233T\/S5233TXEJE3 SHP\/VPP\/R5 Jasmine\/0.8 Qtv5.3 SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S5380D\/S5380FXXKL3; U; Bada\/2.0; ru-ru) AppleWebKit\/534.20 (KHTML, like Gecko) Dolfin\/3.0 Mobile HVGA SMM-MMS\/1.2.0 OPN-B", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "SAMSUNG-GT-C3312\/1.0 NetFront\/4.2 Profile\/MIDP-2.0 Configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build\/CUPCAKE) AppleWebKit\/528.5 (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "SAMSUNG-GT-S3650\/S3650XEII3 SHP\/VPP\/R5 Jasmine\/1.0 Nextreaming SMM-MMS\/1.2.0 profile\/MIDP-2.1 configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "JUC (Linux; U; 2.3.6; zh-cn; GT-S5360; 240*320) UCWEB7.9.0.94\/140\/352", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S5250\/S5250XEKJ3; U; Bada\/1.0; ru-ru) AppleWebKit\/533.1 (KHTML, like Gecko) Dolfin\/2.0 Mobile WQVGA SMM-MMS\/1.2.0 NexPlayer\/3.0 profile\/MIDP-2.1 configuration\/CLDC-1.1 OPN-B", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident\/3.1; IEMobile\/7.0; SAMSUNG; SGH-i917)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (SAMSUNG; SAMSUNG-GT-S8530\/S8530XXJKA; U; Bada\/1.2; cs-cz) AppleWebKit\/533.1 (KHTML, like Gecko) Dolfin\/2.2 Mobile WVGA SMM-MMS\/1.2.0 OPN-B", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 1.6; ru-ru; Galaxy Build\/Donut) AppleWebKit\/528.5+ (KHTML, like Gecko) Version\/3.1.2 Mobile Safari\/525.20.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; ru-ru; GT-I5500 Build\/ERE27) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; GALAXY_Tab Build\/MASTER) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2; fr-fr; GT-I9000 Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.2.1; zh-cn; SCH-i909 Build\/FROYO) UC AppleWebKit\/534.31 (KHTML, like Gecko) Mobile Safari\/534.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; ja-jp; SC-01C Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-gb; GT-P1000 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; el-gr; GT-I9001 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-ca; SGH-I896 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; es-us; GT-S5660L Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 MicroMessenger\/4.5.1.261", - "mobile": true, - "tablet": false, - "version": { - "MicroMessenger": "4.5.1.261" - } - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5660 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6102 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; pt-br; GT-S5367 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; fr-fr; GT-S5839i Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S7500 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5830 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; es-us; GT-B5510L Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; pl-pl; GT-I9001-ORANGE\/I9001BVKPC Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-I8150 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; nl-nl; GT-I9070 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-gb; GT-S5360 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; es-us; GT-S6102B Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; en-us; GT-S5830i Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-I8160 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-S6802 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; ru-ru; GT-S5830 Build\/GRWK74; LeWa_ROM_Cooper_12.09.21) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.6; ru-ru; GT-N7000 Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build\/HRI83) AppleWebkit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; he-il; GT-P7300 Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; en-gb; GT-P6200 Build\/HTJ85B) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-gb; GT-I9100 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; GT-I9100G Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-P5100 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android-4.0.3; en-us; Galaxy Nexus Build\/IML74K) AppleWebKit\/535.7 (KHTML, like Gecko) CrMo\/16.0.912.75 Mobile Safari\/535.7", - "mobile": true, - "tablet": false, - "version": { - "Chrome": "16.0.912.75" - } - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; SGH-T989 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false, - "version": { - "Chrome": "18.0.1025.166" - } - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P5100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; GT-I9300 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; SPH-D710 Build\/IMM76I) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; GT-I9300 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300-ORANGE\/I9300BVBLG2 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; th-th; GT-I9300T Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-I9100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us ; GT-I9100 Build\/IMM76D) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1\/UCBrowser\/8.4.1.204\/145\/355", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; GT-N7000 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; th-th; GT-P6800 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I747 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; GT-P5110 Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; GT-P5110 Build\/IMM76D) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; zh-cn; SAMSUNG-GT-S7568_TD\/1.0 Android\/4.0.4 Release\/07.15.2012 Browser\/AppleWebKit534.30 Build\/IMM76D) ApplelWebkit\/534.30 (KHTML,like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false, - "version": { - "Android": "4.0.4" - } - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-P3100 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; tr-tr; GT-P3105 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-ca; GT-N8010 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; ru-ru; GT-S7562 Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; GT-N7100 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; GT-N7100 Build\/JZO54K) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.123 Mobile Safari\/537.22 OPR\/14.0.1025.52315", - "mobile": true, - "tablet": false, - "version": { - "Build": "JZO54K", - "Webkit": "537.22", - "Opera": "14.0.1025.52315" - } - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; zh-hk; GT-N7105 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; ru-ru; GT-N8000 Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.1; SGH-i747M Build\/JRO03L) AppleWebKit\/535.19(KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-gb; Galaxy Nexus - 4.1.1 - with Google Apps - API 16 - 720x1280 Build\/JRO03S) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; GT-I8262 Build\/JZO54K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; it-it; Galaxy Nexus Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGH-I777 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-S7710 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; GT-I9082 Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T999L Build\/JZO54K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; GT-P5210 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, Like Gecko) Chrome\/27.0.1453.90 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; en-us; SAMSUNG GT-I9200 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; nl-nl; SM-T310 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; en-us; SAMSUNG SM-P600 Build\/JSS15J) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-gb; GT-N5100 Build\/JDQ39) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-T530NU Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T800 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; fr-fr; SAMSUNG SM-T800 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T700 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.517 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; CETUS)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Focus I917 By TC)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Focus i917)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; FOCUS S)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-I8350)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-i8700)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; GT-S7530)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; Hljchm's Wp)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; I917)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA 7)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7 By MWP_HS)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; OMNIA7; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i677)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917.)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917R)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i937)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SMG-917R)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG_blocked_blocked_blocked; OMNIA7; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG_blocked_blocked_blocked_blocked; OMNIA7; Orange)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SUMSUNG; OMNIA 7)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; ARM; Trident\/7.0; Touch; rv:11.0; WPDesktop; SAMSUNG; GT-I8750) like Gecko", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; ARM; Trident\/7.0; Touch; rv:11.0; WPDesktop; GT-I8750) like Gecko", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; en-gb; SAMSUNG GT-I9205 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; GT-P7510 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; SHV-E160K\/VI10.1802 Build\/IMM76D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.2; SM-T805 Build\/LRX22G) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.92 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; SM-T116NQ Build\/KTU84P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.92 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 5.0.2; SM-G9250 Build\/LRX22G; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/43.0.2357.121 Mobile Safari\/537.36 [FB_IAB\/FB4A;FBAV\/35.0.0.48.273;]", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T705Y Build\/KOT49H) AppleWebKit\/537.36(KHTML, like Gecko) Chrome\/42.0.2311.111 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; GT-I9505 Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/1.5 Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Samsung", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SM-T705 Build\/KOT49H) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.45 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "SonyEricssonK800i\/R1AA Browser\/NetFront\/3.3 Profile\/MIDP-2.0 Configuration\/CLDC-1.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; es-ar; SonyEricssonE15a Build\/2.0.1.A.0.47) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.1-update1; pt-br; SonyEricssonU20a Build\/2.1.1.A.0.6) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.3; en-au; SonyEricssonX10i Build\/3.0.1.G.0.75) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; ru-ru; SonyEricssonST18i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; hr-hr; SonyEricssonST15i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.4; sk-sk; SonyEricssonLT15i Build\/4.0.2.A.0.62) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; th-th; SonyEricssonST27i Build\/6.0.B.3.184) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 2.3.7; de-de; SonyEricssonST25i Build\/6.0.B.3.184) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; pt-br; Xperia Tablet S Build\/TID0092) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.0.3", - "Build": "TID0092", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; LT18i Build\/4.1.A.0.562) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; Sony Tablet S Build\/TISU0R0110) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; es-es; Sony Tablet S Build\/TISU0143) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-gb; SonyEricssonLT18i Build\/4.1.B.0.587) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; fr-ch; SonyEricssonSK17i Build\/4.1.B.0.587) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; SonyEricssonLT26i Build\/6.1.A.2.45) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; LT22i Build\/6.1.B.0.544) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; vi-vn; SonyEricssonLT22i Build\/6.1.B.0.544) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; ST23i Build\/11.0.A.5.5) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; ST23i Build\/11.0.A.2.10) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Mobile Safari\/535.19", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.4; LT28h Build\/6.1.E.3.7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; SGPT13 Build\/TJDS0170) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; ja-jp; SonySO-03E Build\/10.1.E.0.265) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.1.2", - "Build": "10.1.E.0.265", - "Webkit": "534.30", - "Safari": "4.0" - } - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; LT26w Build\/6.2.B.1.96) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/29.0.1547.72 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; SGP321 Build\/10.3.1.A.0.33) AppleWebKit\/537.31 (KHTML, like Gecko) Chrome\/26.0.1410.58 Safari\/537.31", - "mobile": true, - "tablet": true, - "version": { - "Android": "4.2.2", - "Build": "10.3.1.A.0.33", - "Webkit": "537.31", - "Chrome": "26.0.1410.58" - } - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; C5303 Build\/12.1.A.1.205) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.135 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; XL39h Build\/14.2.A.1.136) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; sv-se; C5503 Build\/10.1.1.A.1.273) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; C5502 Build\/10.1.1.A.1.310) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; SonyL39t Build\/14.1.M.0.202) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; zh-cn; L39u Build\/14.1.n.0.63) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-tw; M35c Build\/12.0.B.5.37) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; M35c Build\/12.0.B.2.42) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.90 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; zh-CN; M35t Build\/12.0.C.2.42) AppleWebKit\/534.31 (KHTML, like Gecko) UCBrowser\/9.3.2.349 U3\/0.8.0 Mobile Safari\/534.31", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D6502 Build\/17.1.A.2.69) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D6503 Build\/17.1.A.0.504) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D6543 Build\/17.1.A.2.55) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2004 Build\/20.0.A.0.29) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-gb; D2005 Build\/20.0.A.1.12) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2104 Build\/20.0.B.0.84) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2105 Build\/20.0.B.0.74) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.170 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; pt-br; D2114 Build\/20.0.B.0.85) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2302 Build\/18.0.B.1.23) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; S50h Build\/18.0.b.1.23) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.6.3.413 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2303 Build\/18.0.C.1.13) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2305 Build\/18.0.A.1.30) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.138 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D2306 Build\/18.0.C.1.7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D5303 Build\/19.0.1.A.0.207) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D5306 Build\/19.1.A.0.264) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-CN; XM50h Build\/19.0.D.0.269) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 UCBrowser\/9.7.6.428 U3\/0.8.0 Mobile Safari\/533.1", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; XM50t Build\/19.0.C.2.59) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; D5322 Build\/19.0.D.0.253) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.131", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; zh-cn; M51w Build\/14.2.A.1.146) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; M51w Build\/14.2.A.1.146) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/33.0.1750.136 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.1; D5102 Build\/18.2.A.0.9) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.1; D5103 Build\/18.1.A.0.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.92 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.1; D5106 Build\/18.1.A.0.11) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.3; en-gb; C6902 Build\/14.2.A.1.136) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30 GSA\/3.2.17.1009776.arm", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; es-es; C6943 Build\/14.1.G.2.257) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; C6943 Build\/14.3.A.0.681) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; SGP412 Build\/14.1.B.3.320) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1; en-us; SonySGP321 Build\/10.2.C.0.143) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.1.2; SGP351 Build\/10.1.1.A.1.307) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.3; SGP341 Build\/10.4.B.0.569) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SGP511 Build\/17.1.A.2.36) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SGP512 Build\/17.1.A.2.36) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.122 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; fr-ch; SGP311 Build\/10.1.C.0.344) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; SGP312 Build\/10.1.C.0.344) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; de-de; SGP521 Build\/17.1.A.2.69) AppleWebKit\/537.16 (KHTML, like Gecko) Version\/4.0 Safari\/537.16", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.4.2; zh-cn; SGP541 Build\/17.1.A.2.36) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; SGP551 Build\/17.1.A.2.72) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/34.0.1847.114 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Sony", - "user_agent": "SonyEricssonU5i\/R2CA; Mozilla\/5.0 (SymbianOS\/9.4; U; Series60\/5.0 Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 Safari\/525", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "SonyEricssonU5i\/R2AA; Mozilla\/5.0 (SymbianOS\/9.4; U; Series60\/5.0 Profile\/MIDP-2.1 Configuration\/CLDC-1.1) AppleWebKit\/525 (KHTML, like Gecko) Version\/3.0 Safari\/525", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/4.0 (PDA; PalmOS\/sony\/model prmr\/Revision:1.1.54 (en)) NetFront\/3.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Opera\/9.80 (Linux mips; U; InettvBrowser\/2.2 (00014A;SonyDTV115;0002;0100) KDL40EX720; CC\/BEL; en) Presto\/2.7.61 Version\/11.00", - "mobile": false, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Opera\/9.80 (Linux armv7l; HbbTV\/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto\/2.12.362 Version\/12.11", - "mobile": false, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; es-ve; SonyST21a2 Build\/11.0.A.6.5) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.2; D2533 Build\/19.2.A.0.391) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/30.0.0.0 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.4.4; Xperia SP Build\/KTU84Q) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.96 Mobile Safari\/537.36", - "mobile": true, - "tablet": false - }, - { - "vendor": "Sony", - "user_agent": "Mozilla \/ 5.0 (Linux; Android 5.0.2; SOT31 Build \/ 28.0.D.6.71) AppleWebKit \/ 537.36 (KHTML, like Gecko) Chrome \/ 39.0.2171.93 Safari \/ 537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Avant", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; Trident\/7.0; Avant Browser; rv:11.0) like Gecko", - "mobile": false, - "tablet": false - }, - { - "vendor": "Avant", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; Avant TriCore) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.101 Safari\/537.36", - "mobile": false, - "tablet": false - }, - { - "vendor": "Avant", - "user_agent": "Mozilla\/5.0 (Windows NT 5.1; rv:27.0; Avant TriCore) Gecko\/20100101 Firefox\/27.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Console", - "user_agent": "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/536.28 (KHTML, like Gecko) NX\/3.0.3.12.14 NintendoBrowser\/3.1.1.9577.EU", - "mobile": false, - "tablet": false - }, - { - "vendor": "Console", - "user_agent": "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/534.52 (KHTML, like Gecko) NX\/{Version No} NintendoBrowser\/{Version No}.US", - "mobile": false, - "tablet": false - }, - { - "vendor": "Console", - "user_agent": "Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7567.US", - "mobile": true, - "tablet": false - }, - { - "vendor": "Console", - "user_agent": "Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7498.US", - "mobile": true, - "tablet": false - }, - { - "vendor": "Console", - "user_agent": "Mozilla\/5.0 (PLAYSTATION 3 4.21) AppleWebKit\/531.22.8 (KHTML, like Gecko)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Console", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident\/5.0; Xbox)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident\/4.0; SV1; [eburo v4.0]; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C; .NET4.0E)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit\/600.1.25 (KHTML, like Gecko) Version\/8.0 Safari\/600.1.25", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.111 Safari\/537.36", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/537.36 (KHTML, like Gecko) Iron\/37.0.2000.0 Chrome\/37.0.2000.0 Safari\/537.36", - "mobile": false, - "tablet": false, - "version": { - "Iron": "37.0.2000.0" - } - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (X11; Linux i686) AppleWebKit\/537.36 (KHTML, like Gecko) Ubuntu Chromium\/32.0.1700.102 Chrome\/32.0.1700.102 Safari\/537.36", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko\/20100101 Firefox\/24.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko\/20100101 Firefox\/18.0 AlexaToolbar\/psPCtGhf-2.2", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko\/20100101 Firefox\/22.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (X11; Linux ppc; rv:17.0) Gecko\/20130626 Firefox\/17.0 Iceweasel\/17.0.7", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (X11; Linux) AppleWebKit\/535.22+ Midori\/0.4", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X; en-us) AppleWebKit\/535+ (KHTML, like Gecko) Version\/5.0 Safari\/535.20+ Midori\/0.4", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.20 Safari\/537.36 OPR\/15.0.1147.18 (Edition Next)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.2) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.94 Safari\/537.36", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 5.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.94 Safari\/537.36", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 5.2; WOW64; rv:21.0) Gecko\/20100101 Firefox\/21.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Opera\/9.80 (Windows NT 5.2; WOW64) Presto\/2.12.388 Version\/12.14", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko\/20100101 Firefox\/19.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (X11; FreeBSD amd64; rv:14.0) Gecko\/20100101 Firefox\/14.0.1", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Win64; x64; Trident\/6.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Tablet PC 2.0; MASMJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; MANMJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident\/6.0; MASMJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident\/6.0; Touch; MASMJS)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Opera\/9.80 (Windows NT 6.2; WOW64; MRA 8.0 (build 5784)) Presto\/2.12.388 Version\/12.11", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident\/6.0)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.3; Trident\/7.0; rv 11.0) like Gecko", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Windows NT 6.3; WOW64; Trident\/7.0; Touch; rv:11.0) like Gecko", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Mozilla\/5.0 (Unknown; Linux armv7l) AppleWebKit\/537.1+ (KHTML, like Gecko) Safari\/537.1+ HbbTV\/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "HbbTV\/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Other", - "user_agent": "Opera\/9.80 (Linux armv7l; HbbTV\/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto\/2.12.362 Version\/12.11", - "mobile": false, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Jolla; Sailfish; Mobile; rv:20.0) Gecko\/20.0 Firefox\/20.0 Sailfish Browser\/1.0 like Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Mobile; rv:26.0) Gecko\/26.0 Firefox\/26.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Tablet; rv:26.0) Gecko\/26.0 Firefox\/26.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; CT1020W Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.94 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.2.2; M6pro Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/35.0.1916.141 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "MobileSafari\/9537.53 CFNetwork\/672.1.13 Darwin\/13.1.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Appcelerator Titanium\/3.2.2.GA (iPod touch\/6.1.6; iPhone OS; en_US;)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera Coast\/3.0.3.78307 CFNetwork\/672.1.15 Darwin\/14.0.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; ALUMIUM10 Build\/IML74K) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Safari\/537.36", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.1; en-us; JY-G3 Build\/JOP40D) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; hu-hu; M758A Build\/JRO03C) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; en-us; EVOTAB Build\/IMM76I) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Java\/1.6.0_22", - "mobile": false, - "tablet": false, - "version": { - "Java": "1.6.0_22" - } - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Series 60; Opera Mini\/6.5.29260\/29.3417; U; ru) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Android; Opera Mini\/6.5.27452\/29.3417; U; ru) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (iPhone; Opera Mini\/7.1.32694\/27.1407; U; en) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.17 (KHTML, like Gecko) Chrome\/24.0.1312.60 Safari\/537.17 OPR\/14.0.1025.52315", - "mobile": false, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8H7 Safari\/6533.18.5", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Android 2.3.7; Linux; Opera Mobi\/46154) Presto\/2.11.355 Version\/12.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (iPad; CPU OS 6_1 like Mac OS X) AppleWebKit\/536.26 (KHTML, like Gecko) Version\/6.0 Mobile\/10B141 Safari\/8536.25", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.2; en-us; sdk Build\/MASTER) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2; en-us; sdk Build\/JB_MR1) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Android; Mobile; rv:18.0) Gecko\/18.0 Firefox\/18.0", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/535.12 (KHTML, like Gecko) Maxthon\/3.0 Chrome\/18.0.966.0 Safari\/535.12", - "mobile": false, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Windows NT 5.1; U; Edition Yx; ru) Presto\/2.10.289 Version\/12.02", - "mobile": false, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "PalmCentro\/v0001 Mozilla\/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource\/Palm-D061; Blazer\/4.5) 16;320x320", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Microsoft; XDeviceEmulator)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; MAL; N880E; China Telecom)", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Series 60; Opera Mini\/7.0.29482\/28.2859; U; ru) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (S60; SymbOS; Opera Mobi\/SYB-1202242143; U; en-GB) Presto\/2.10.254 Version\/12.00", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-au; 97D Build\/IML74K) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Android; Opera Mini\/7.0.29952\/28.2647; U; ru) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Android; Opera Mini\/6.1.25375\/28.2555; U; en) Presto\/2.8.119 Version\/11.10", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Mac OS X; Opera Tablet\/35779; U; en) Presto\/2.10.254 Version\/12.00", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Android; Tablet; rv:10.0.4) Gecko\/10.0.4 Firefox\/10.0.4 Fennec\/10.0.4", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Android; Tablet; rv:18.0) Gecko\/18.0 Firefox\/18.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Linux armv7l; Maemo; Opera Mobi\/14; U; en) Presto\/2.9.201 Version\/11.50", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Opera\/9.80 (Android 2.2.1; Linux; Opera Mobi\/ADR-1207201819; U; en) Presto\/2.10.254 Version\/12.00", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; en-us; sdk Build\/JRO03E) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30", - "mobile": true, - "tablet": false - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Endeavour 1010 Build\/ONDA_MID) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de; Tablet-PC-4 Build\/ICS.g08refem618.20121102) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Generic", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.2.2; de-de; Tagi Tab S10 Build\/8089) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Bot", - "user_agent": "Mozilla\/5.0 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "grub-client-1.5.3; (grub-client-1.5.3; Crawl your own stuff with http:\/\/grub.org)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "Googlebot-Image\/1.0", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "Python-urllib\/2.5", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "facebookexternalhit\/1.0 (+http:\/\/www.facebook.com\/externalhit_uatext.php)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "AdsBot-Google (+http:\/\/www.google.com\/adsbot.html)", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "AdsBot-Google-Mobile (+http:\/\/www.google.com\/mobile\/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari", - "mobile": true, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "Mozilla\/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit\/534.16 (KHTML, like Gecko, Google Keyword Suggestion) Chrome\/10.0.648.127 Safari\/534.16", - "mobile": false, - "tablet": false - }, - { - "vendor": "Bot", - "user_agent": "Facebot", - "mobile": false, - "tablet": false - }, - { - "vendor": "Vodafone", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 3.2; hu-hu; SmartTab10-MSM8260-V02d-Dec022011-Vodafone-HU) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0", - "mobile": true, - "tablet": true - }, - { - "vendor": "Vodafone", - "user_agent": "Mozilla\/5.0 (Linux; Android 4.0.3; SmartTabII10 Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Chrome\/18.0.1025.166 Safari\/535.19", - "mobile": true, - "tablet": true - }, - { - "vendor": "Vodafone", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.1.1; fr-fr; SmartTAB 1002 Build\/JRO03H) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - }, - { - "vendor": "Vodafone", - "user_agent": "Mozilla\/5.0 (Linux; U; Android 4.0.4; de-de, SmartTabII7 Build\/A2107A_A404_107_055_130124_VODA) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Safari\/534.30", - "mobile": true, - "tablet": true - } - ] -} \ No newline at end of file From b63803e8efb30668eaa6681dbc8b404ff56fd700 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 20:42:09 +0200 Subject: [PATCH 0404/1036] Fix missing dir --- .../mobiledetectlib/docs/CONTRIBUTING.md | 48 +++++++++++++++++++ .../mobiledetectlib/docs/HISTORY.md | 11 +++++ .../mobiledetectlib/docs/ISSUE_TEMPLATE.md | 15 ++++++ .../mobiledetectlib/docs/KNOWN_LIMITATIONS.md | 11 +++++ 4 files changed, 85 insertions(+) create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/docs/CONTRIBUTING.md create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/docs/HISTORY.md create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/docs/ISSUE_TEMPLATE.md create mode 100644 htdocs/includes/mobiledetect/mobiledetectlib/docs/KNOWN_LIMITATIONS.md diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/docs/CONTRIBUTING.md b/htdocs/includes/mobiledetect/mobiledetectlib/docs/CONTRIBUTING.md new file mode 100644 index 00000000000..01a266ed83c --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/docs/CONTRIBUTING.md @@ -0,0 +1,48 @@ +**Reporting issues** + +1. Specify the User-agent by visiting [http://demo.mobiledetect.net](http://demo.mobiledetect.net). +1. Specify the expected behaviour. + +**Developing** + +1. Fork Mobile Detect repository. See ["How to fork"](https://help.github.com/articles/fork-a-repo/#fork-an-example-repository) example. +1. `git clone https://github.com/[yourname]/Mobile-Detect.git` +1. `git add remote serbanghita https://github.com/serbanghita/Mobile-Detect.git` +1. `git remote -v` - You should see: + ``` + origin git@github.com:serbanghita/Mobile-Detect.git + serbanghita https://github.com/serbanghita/Mobile-Detect.git + ``` +1. `git checkout -b devel origin/devel` +1. `composer install` +1. Start working on your changes. + 1. If you add new methods or make structural changes to the `Mobile_Detect.php` class + you need to add unit tests! + 1. If you add new regexes make sure you commit the User-Agents in [`tests/providers/vendors`](https://github.com/serbanghita/Mobile-Detect/tree/master/tests/providers/vendors) +1. Run tests `vendor/bin/phpunit -v -c tests/phpunit.xml --coverage-text --strict-coverage --stop-on-risky` +1. `git status` or `git diff` - inspect your changes +1 `git stage .` +1. `git commit -m "[your commit message here]` +1. `git push origin devel` +1. Go to your repo on GitHub and ["Submit the PR"](https://help.github.com/articles/about-pull-requests/) + +**New module, plugin, plugin or port** + +[Submit new module, plugin, port](../../issues/new?title=New%203rd%20party%20module&body=Name,%20Link%20and%20Description%20of%20the%20module.) + including the following information: +* Module name +* Description +* Link +* Author + +Or you can submit a PR against `README.md`. + +**Website updates** + +1. Our official website is hosted at [http://mobiledetect.net](http://mobiledetect.net). +1. The files are found on the `gh-pages` branch. +1. `git checkout gh-pages` +1. `npm install -g browser-sync` +1. `browser-sync start --s . --f . --port 3000 --reload-debounce 1500 --no-ui` +1. Go to `http://localhost:3000` and make changes. +1. Commit, push and submit the PR against `serbanghita:gh-pages`. \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/docs/HISTORY.md b/htdocs/includes/mobiledetect/mobiledetectlib/docs/HISTORY.md new file mode 100644 index 00000000000..3483985258e --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/docs/HISTORY.md @@ -0,0 +1,11 @@ +The first version of the script was developed in 2009 and it was hosted at https://code.google.com/p/php-mobile-detect/, it was a small project with around 30 stars. (Original blog post by Victor: http://victorstanciu.ro/detectarea-platformelor-mobile-in-php/) + +In December 2011 it received a major update from the first version, an important number of issues were fixed, then 2.0 was launched. The new version marks a new mindset and also featuring tablet detection. + +Throughout 2012 the script has been updated constantly and we have received tons of feedback and requests. + +In July 2012 we moved the repository from Google Code to GitHub in order to quickly accommodate the frequent updates and to involve more people. + +In August 2013 the library has 1800+ stargazers and support for: composer, PHPUnit tests, PSR standards and a new webpage http://mobiledetect.net + +Mobile Detect library and user contributions are MIT Licensed. diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/docs/ISSUE_TEMPLATE.md b/htdocs/includes/mobiledetect/mobiledetectlib/docs/ISSUE_TEMPLATE.md new file mode 100644 index 00000000000..8d6384fce89 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/docs/ISSUE_TEMPLATE.md @@ -0,0 +1,15 @@ +-------------delete this message------------- +* By submitting a new issue I acknowledge that I already read the README, CODE EXAMPLES and KNOWN LIMITATIONS. +* I understand that the current version `2.x` is only meant to detect `mobile` devices. +* Please post your User-Agent string! On a real device/s, the library is expected to work correctly. +-------------delete this message------------- + + + +**Issue description** + + +**User-Agent(s)** + + +**Suggestions** \ No newline at end of file diff --git a/htdocs/includes/mobiledetect/mobiledetectlib/docs/KNOWN_LIMITATIONS.md b/htdocs/includes/mobiledetect/mobiledetectlib/docs/KNOWN_LIMITATIONS.md new file mode 100644 index 00000000000..8b5d461fe38 --- /dev/null +++ b/htdocs/includes/mobiledetect/mobiledetectlib/docs/KNOWN_LIMITATIONS.md @@ -0,0 +1,11 @@ +**Known limitations** + +* Mobile Detect script was designed to detect `mobile` devices. Implicitly other devices are considered to be `desktop`. +* User-Agent and HTTP headers sniffing is a non reliable method of detecting a mobile device. +* If the mobile browser is set on `Desktop mode`, the Mobile Detect script has no way of knowing that the device is `mobile`. +* Some touchscreen devices (eg. Microsoft Surface) are tough to detect as mobile since they can be used in a laptop mode. +* Detecting the device brand (eg. Apple, Samsung, HTC) is not 100% reliable. +* We don't monitor the quality of the 3rd party tools based on Mobile Detect script. +We cannot guarantee that they are using the class properly or if they provide the latest version. +* Version `2.x` is made to be PHP 5.3 compatible because of the backward compatibility changes of PHP. +* There are hundreds of devices launched every month, we cannot keep a 100% up to date detection rate. \ No newline at end of file From 278d4fdb8e7bed6fe78d21ba817d992eba13a39f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 20:55:05 +0200 Subject: [PATCH 0405/1036] Fix css --- htdocs/theme/eldy/global.inc.php | 8 ++++++-- htdocs/theme/md/style.css.php | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index b797ec69b9e..efa32a7747d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -266,6 +266,10 @@ input#onlinepaymenturl, input#directdownloadlink { opacity: 0.7; } +div#moretabsListaction { + z-index: 5; +} + hr { border: 0; border-top: 1px solid #ccc; } .tabBar hr { margin-top: 20px; margin-bottom: 17px; } @@ -2251,8 +2255,8 @@ div.popuptabset { border: 1px solid #888; } div.popuptab { - padding-top: 3px; - padding-bottom: 3px; + padding-top: 5px; + padding-bottom: 5px; padding-left: 5px; padding-right: 5px; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 2906da3729c..3aea173df6c 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -492,6 +492,10 @@ input[name=surface] { margin-right: 4px; } fieldset { border: 1px solid #AAAAAA !important; } .legendforfieldsetstep { padding-bottom: 10px; } +div#moretabsListaction { + z-index: 5; +} + hr { border: 0; border-top: 1px solid #ccc; } .button, .buttonDelete, input[name="sbmtConnexion"] { @@ -2405,8 +2409,8 @@ div.popuptabset { border: 1px solid #888; } div.popuptab { - padding-top: 3px; - padding-bottom: 3px; + padding-top: 5px; + padding-bottom: 5px; padding-left: 5px; padding-right: 5px; } From d99424cdf0620df4cc9a07d528a113e85105d31e Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 13 May 2019 21:19:18 +0200 Subject: [PATCH 0406/1036] NEW Add accoutancy sell intra and export in product import --- htdocs/core/modules/modAccounting.class.php | 7 ++++--- htdocs/core/modules/modProduct.class.php | 15 +++++++++++---- htdocs/langs/en_US/banks.lang | 8 ++++---- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/htdocs/core/modules/modAccounting.class.php b/htdocs/core/modules/modAccounting.class.php index 8250549b9e1..fa44bd7163b 100644 --- a/htdocs/core/modules/modAccounting.class.php +++ b/htdocs/core/modules/modAccounting.class.php @@ -242,12 +242,13 @@ class modAccounting extends DolibarrModules $this->export_label[$r]='Chartofaccounts'; $this->export_icon[$r]='Accounting'; $this->export_permission[$r]=array(array("accounting","chartofaccount")); - $this->export_fields_array[$r]=array('ac.rowid'=>'ChartofaccountsId','ac.pcg_version'=>'Chartofaccounts','aa.rowid'=>'Id','aa.account_number'=>"AccountAccounting",'aa.label'=>"Label",'aa.account_parent'=>"Accountparent",'aa.pcg_type'=>"Pcgtype",'aa.pcg_subtype'=>'Pcgsubtype','aa.active'=>'Status'); - $this->export_TypeFields_array[$r]=array('ac.rowid'=>'List:accounting_system:pcg_version','aa.account_number'=>"Text",'aa.label'=>"Text",'aa.pcg_type'=>'Text','aa.pcg_subtype'=>'Text','aa.active'=>'Status'); - $this->export_entities_array[$r]=array('ac.rowid'=>"Accounting",'ac.pcg_version'=>"Accounting",'aa.rowid'=>'Accounting','aa.account_number'=>"Accounting",'aa.label'=>"Accounting",'aa.accountparent'=>"Accounting",'aa.pcg_type'=>"Accounting",'aa.pcgsubtype'=>"Accounting",'aa_active'=>"Accounting"); + $this->export_fields_array[$r]=array('ac.rowid'=>'ChartofaccountsId','ac.pcg_version'=>'Chartofaccounts','aa.rowid'=>'Id','aa.account_number'=>"AccountAccounting",'aa.label'=>"Label",'aa.account_parent'=>"Accountparent","cac.code"=>"AccountingCategory",'aa.pcg_type'=>"Pcgtype",'aa.pcg_subtype'=>'Pcgsubtype','aa.active'=>'Status'); + $this->export_TypeFields_array[$r]=array('ac.rowid'=>'List:accounting_system:pcg_version','aa.account_number'=>"Text",'aa.label'=>"Text",'aa.account_parent'=>"Text",'cac.code'=>"Text",'aa.pcg_type'=>'Text','aa.pcg_subtype'=>'Text','aa.active'=>'Status'); + $this->export_entities_array[$r]=array('ac.rowid'=>"Accounting",'ac.pcg_version'=>"Accounting",'aa.rowid'=>'Accounting','aa.account_number'=>"Accounting",'aa.label'=>"Accounting",'aa.accountparent'=>"Accounting",'cac.code'=>"accounting",'aa.pcg_type'=>"Accounting",'aa.pcgsubtype'=>"Accounting",'aa_active'=>"Accounting"); $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'accounting_account as aa, '.MAIN_DB_PREFIX.'accounting_system as ac'; + $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_accounting_category as cac ON cac.rowid = aa.fk_accounting_category'; $this->export_sql_end[$r] .=' WHERE ac.pcg_version = aa.fk_pcg_version AND aa.entity IN ('.getEntity('accounting').') '; diff --git a/htdocs/core/modules/modProduct.class.php b/htdocs/core/modules/modProduct.class.php index 5ee2a6ba8a3..3a18749bcde 100644 --- a/htdocs/core/modules/modProduct.class.php +++ b/htdocs/core/modules/modProduct.class.php @@ -169,6 +169,7 @@ class modProduct extends DolibarrModules $this->export_permission[$r]=array(array("produit","export")); $this->export_fields_array[$r]=array( 'p.rowid'=>"Id",'p.ref'=>"Ref",'p.label'=>"Label",'p.description'=>"Description",'p.url'=>"PublicUrl",'p.accountancy_code_sell'=>"ProductAccountancySellCode", + 'p.accountancy_code_sell_intra'=>"ProductAccountancySellIntraCode", 'p.accountancy_code_sell_export'=>"ProductAccountancySellExportCode", 'p.accountancy_code_buy'=>"ProductAccountancyBuyCode",'p.note'=>"Note",'p.length'=>"Length",'p.width'=>"Width",'p.height'=>"Height",'p.surface'=>"Surface", 'p.volume'=>"Volume",'p.weight'=>"Weight",'p.customcode'=>'CustomCode','p.price_base_type'=>"PriceBase",'p.price'=>"UnitPriceHT",'p.price_ttc'=>"UnitPriceTTC", 'p.tva_tx'=>'VATRate','p.tosell'=>"OnSell",'p.tobuy'=>"OnBuy",'p.datec'=>'DateCreation','p.tms'=>'DateModification' @@ -184,7 +185,8 @@ class modProduct extends DolibarrModules if (! empty($conf->global->MAIN_MULTILANGS)) $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('l.lang'=>'Language', 'l.label'=>'TranslatedLabel','l.description'=>'TranslatedDescription','l.note'=>'TranslatedNote')); if (! empty($conf->global->PRODUCT_USE_UNITS)) $this->export_fields_array[$r]['p.fk_unit'] = 'Unit'; $this->export_TypeFields_array[$r]=array( - 'p.ref'=>"Text",'p.label'=>"Text",'p.description'=>"Text",'p.url'=>"Text",'p.accountancy_code_sell'=>"Text",'p.accountancy_code_buy'=>"Text", + 'p.ref'=>"Text",'p.label'=>"Text",'p.description'=>"Text",'p.url'=>"Text",'p.accountancy_code_sell'=>"Text", + 'p.accountancy_code_sell_intra'=>"Text",'p.accountancy_code_sell_export'=>"Text",'p.accountancy_code_buy'=>"Text", 'p.note'=>"Text",'p.length'=>"Numeric",'p.width'=>"Numeric",'p.height'=>"Numeric",'p.surface'=>"Numeric",'p.volume'=>"Numeric",'p.weight'=>"Numeric", 'p.customcode'=>'Text','p.price_base_type'=>"Text",'p.price'=>"Numeric",'p.price_ttc'=>"Numeric",'p.tva_tx'=>'Numeric','p.tosell'=>"Boolean", 'p.tobuy'=>"Boolean",'p.datec'=>'Date','p.tms'=>'Date' @@ -289,7 +291,8 @@ class modProduct extends DolibarrModules $this->export_permission[$r]=array(array("produit","export")); $this->export_fields_array[$r]=array( 'p.rowid'=>"Id",'p.ref'=>"Ref",'p.label'=>"Label",'p.description'=>"Description",'p.url'=>"PublicUrl", - 'p.accountancy_code_sell'=>"ProductAccountancySellCode",'p.accountancy_code_buy'=>"ProductAccountancyBuyCode",'p.note'=>"Note", + 'p.accountancy_code_sell'=>"ProductAccountancySellCode",'p.accountancy_code_sell_intra'=>"ProductAccountancySellIntraCode", + 'p.accountancy_code_sell_export'=>"ProductAccountancySellExportCode",'p.accountancy_code_buy'=>"ProductAccountancyBuyCode",'p.note'=>"Note", 'p.length'=>"Length",'p.surface'=>"Surface",'p.volume'=>"Volume",'p.weight'=>"Weight",'p.customcode'=>'CustomCode', 'p.price_base_type'=>"PriceBase",'p.price'=>"UnitPriceHT",'p.price_ttc'=>"UnitPriceTTC",'p.tva_tx'=>'VATRate','p.tosell'=>"OnSell", 'p.tobuy'=>"OnBuy",'p.datec'=>'DateCreation','p.tms'=>'DateModification' @@ -298,7 +301,8 @@ class modProduct extends DolibarrModules if (! empty($conf->barcode->enabled)) $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('p.barcode'=>'BarCode')); $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('pa.qty'=>'Qty','pa.incdec'=>'ComposedProductIncDecStock')); $this->export_TypeFields_array[$r]=array( - 'p.ref'=>"Text",'p.label'=>"Text",'p.description'=>"Text",'p.url'=>"Text",'p.accountancy_code_sell'=>"Text",'p.accountancy_code_buy'=>"Text", + 'p.ref'=>"Text",'p.label'=>"Text",'p.description'=>"Text",'p.url'=>"Text",'p.accountancy_code_sell'=>"Text", + 'p.accountancy_code_sell_intra'=>"Text",'p.accountancy_code_sell_export'=>"Text",'p.accountancy_code_buy'=>"Text", 'p.note'=>"Text",'p.length'=>"Numeric",'p.surface'=>"Numeric",'p.volume'=>"Numeric",'p.weight'=>"Numeric",'p.customcode'=>'Text', 'p.price_base_type'=>"Text",'p.price'=>"Numeric",'p.price_ttc'=>"Numeric",'p.tva_tx'=>'Numeric','p.tosell'=>"Boolean",'p.tobuy'=>"Boolean", 'p.datec'=>'Date','p.tms'=>'Date' @@ -308,7 +312,8 @@ class modProduct extends DolibarrModules $this->export_TypeFields_array[$r]=array_merge($this->export_TypeFields_array[$r], array('pa.qty'=>'Numeric')); $this->export_entities_array[$r]=array( 'p.rowid'=>"virtualproduct",'p.ref'=>"virtualproduct",'p.label'=>"virtualproduct",'p.description'=>"virtualproduct",'p.url'=>"virtualproduct", - 'p.accountancy_code_sell'=>'virtualproduct','p.accountancy_code_buy'=>'virtualproduct','p.note'=>"virtualproduct",'p.length'=>"virtualproduct", + 'p.accountancy_code_sell'=>'virtualproduct','p.accountancy_code_sell_intra'=>'virtualproduct','p.accountancy_code_sell_export'=>'virtualproduct', + 'p.accountancy_code_buy'=>'virtualproduct','p.note'=>"virtualproduct",'p.length'=>"virtualproduct", 'p.surface'=>"virtualproduct",'p.volume'=>"virtualproduct",'p.weight'=>"virtualproduct",'p.customcode'=>'virtualproduct', 'p.price_base_type'=>"virtualproduct",'p.price'=>"virtualproduct",'p.price_ttc'=>"virtualproduct",'p.tva_tx'=>"virtualproduct", 'p.tosell'=>"virtualproduct",'p.tobuy'=>"virtualproduct",'p.datec'=>"virtualproduct",'p.tms'=>"virtualproduct" @@ -492,6 +497,8 @@ class modProduct extends DolibarrModules 'p.duration' => "eg. 365d/12m/1y", 'p.url' => 'link to product (no https)', 'p.accountancy_code_sell' => "", + 'p.accountancy_code_sell_intra' => "", + 'p.accountancy_code_sell_export' => "", 'p.accountancy_code_buy' => "", 'p.weight' => "", 'p.weight_units' => 'use a unit of measure from the dictionary. g/Kg/T etc....matches field "Short Label" for unit type "weight" in table "' . MAIN_DB_PREFIX . 'c_units', diff --git a/htdocs/langs/en_US/banks.lang b/htdocs/langs/en_US/banks.lang index ae62cfcb755..cb39150b627 100644 --- a/htdocs/langs/en_US/banks.lang +++ b/htdocs/langs/en_US/banks.lang @@ -156,11 +156,11 @@ CheckRejectedAndInvoicesReopened=Check returned and invoices reopened BankAccountModelModule=Document templates for bank accounts DocumentModelSepaMandate=Template of SEPA mandate. Useful for European countries in EEC only. DocumentModelBan=Template to print a page with BAN information. -NewVariousPayment=New miscellaneous payments -VariousPayment=Miscellaneous payments +NewVariousPayment=New miscellaneous payment +VariousPayment=Miscellaneous payment VariousPayments=Miscellaneous payments -ShowVariousPayment=Show miscellaneous payments -AddVariousPayment=Add miscellaneous payments +ShowVariousPayment=Show miscellaneous payment +AddVariousPayment=Add miscellaneous payment SEPAMandate=SEPA mandate YourSEPAMandate=Your SEPA mandate FindYourSEPAMandate=This is your SEPA mandate to authorize our company to make direct debit order to your bank. Return it signed (scan of the signed document) or send it by mail to From 04f7261bfc58e37b99d98269a2a8a23e16ccf128 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 13 May 2019 21:34:30 +0200 Subject: [PATCH 0407/1036] Fix field date was not visible --- htdocs/product/fournisseurs.php | 2 +- htdocs/theme/eldy/global.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index d5ec0d6d2df..15ee6539239 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -819,7 +819,7 @@ SCRIPT; print ''; // Date from - print ''.dol_print_date($productfourn->date_creation, 'dayhour').''; + print ''.dol_print_date(($productfourn->fourn_date_creation ? $productfourn->fourn_date_creation: $productfourn->date_creation), 'dayhour').''; // Supplier print ''.$productfourn->getSocNomUrl(1, 'supplier').''; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index efa32a7747d..c07fad24dab 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -861,7 +861,7 @@ select.selectarrowonleft option { input, input[type=text], input[type=password], select, textarea { min-width: 20px; } - input[type=text], input[type=password] { + .trinputlogin input[type=text], input[type=password] { max-width: 180px; } .vmenu .searchform input { From 6e5d826d651ee6a525e440baeb1d8067cb589702 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 13 May 2019 22:02:33 +0200 Subject: [PATCH 0408/1036] Clean PHPCS for commonobject.class --- htdocs/core/class/commonobject.class.php | 195 ++++++++++++----------- 1 file changed, 98 insertions(+), 97 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 57f2a7ef97c..a32c55a13e8 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1227,12 +1227,12 @@ abstract class CommonObject $result=array(); $i=0; //cas particulier pour les expeditions - if($this->element=='shipping' && $this->origin_id != 0) { + if ($this->element=='shipping' && $this->origin_id != 0) { $id=$this->origin_id; $element='commande'; - } elseif($this->element=='reception' && $this->origin_id != 0) { - $id=$this->origin_id; - $element='order_supplier'; + } elseif ($this->element=='reception' && $this->origin_id != 0) { + $id=$this->origin_id; + $element='order_supplier'; } else { $id=$this->id; $element=$this->element; @@ -2086,25 +2086,25 @@ abstract class CommonObject * Change the shipping method * * @param int $shipping_method_id Id of shipping method - * @param bool $notrigger false=launch triggers after, true=disable triggers - * @param User $userused Object user + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @param User $userused Object user * * @return int 1 if OK, 0 if KO */ public function setShippingMethod($shipping_method_id, $notrigger = false, $userused = null) { - global $user; + global $user; - if (empty($userused)) $userused=$user; + if (empty($userused)) $userused=$user; - $error = 0; + $error = 0; if (! $this->table_element) { dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined", LOG_ERR); return -1; } - $this->db->begin(); + $this->db->begin(); if ($shipping_method_id<0) $shipping_method_id='NULL'; dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')'); @@ -2112,30 +2112,30 @@ abstract class CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element; $sql.= " SET fk_shipping_method = ".$shipping_method_id; $sql.= " WHERE rowid=".$this->id; - $resql = $this->db->query($sql); + $resql = $this->db->query($sql); if (! $resql) { dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG); $this->error = $this->db->lasterror(); $error++; - } else { - if (!$notrigger) - { - // Call trigger - $this->context=array('shippingmethodupdate'=>1); - $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused); - if ($result < 0) $error++; - // End call trigger - } - } - if ($error) - { - $this->db->rollback(); - return -1; - } else { - $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id; - $this->db->commit(); - return 1; - } + } else { + if (!$notrigger) + { + // Call trigger + $this->context=array('shippingmethodupdate'=>1); + $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused); + if ($result < 0) $error++; + // End call trigger + } + } + if ($error) + { + $this->db->rollback(); + return -1; + } else { + $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id; + $this->db->commit(); + return 1; + } } @@ -2217,17 +2217,17 @@ abstract class CommonObject */ public function setBankAccount($fk_account, $notrigger = false, $userused = null) { - global $user; + global $user; - if (empty($userused)) $userused=$user; + if (empty($userused)) $userused=$user; - $error = 0; + $error = 0; if (! $this->table_element) { dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined", LOG_ERR); return -1; } - $this->db->begin(); + $this->db->begin(); if ($fk_account<0) $fk_account='NULL'; dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')'); @@ -2236,36 +2236,36 @@ abstract class CommonObject $sql.= " SET fk_account = ".$fk_account; $sql.= " WHERE rowid=".$this->id; - $resql = $this->db->query($sql); - if (! $resql) - { - dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error()); - $this->error = $this->db->lasterror(); - $error++; - } - else - { - if (!$notrigger) - { - // Call trigger - $this->context=array('bankaccountupdate'=>1); - $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused); - if ($result < 0) $error++; - // End call trigger - } - } - if ($error) - { - $this->db->rollback(); - return -1; - } - else - { - $this->fk_account = ($fk_account=='NULL')?null:$fk_account; - $this->db->commit(); - return 1; - } - } + $resql = $this->db->query($sql); + if (! $resql) + { + dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error()); + $this->error = $this->db->lasterror(); + $error++; + } + else + { + if (!$notrigger) + { + // Call trigger + $this->context=array('bankaccountupdate'=>1); + $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused); + if ($result < 0) $error++; + // End call trigger + } + } + if ($error) + { + $this->db->rollback(); + return -1; + } + else + { + $this->fk_account = ($fk_account=='NULL')?null:$fk_account; + $this->db->commit(); + return 1; + } + } // TODO: Move line related operations to CommonObjectLine? @@ -2967,7 +2967,7 @@ abstract class CommonObject } } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Add objects linked in llx_element_element. * @@ -2978,7 +2978,7 @@ abstract class CommonObject */ public function add_object_linked($origin = null, $origin_id = null) { - // phpcs:enable + // phpcs:enable $origin = (! empty($origin) ? $origin : $this->origin); $origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id); @@ -2986,7 +2986,7 @@ abstract class CommonObject if ($origin == 'order') $origin='commande'; if ($origin == 'invoice') $origin='facture'; if ($origin == 'invoice_template') $origin='facturerec'; - if ($origin == 'supplierorder') $origin='order_supplier'; + if ($origin == 'supplierorder') $origin='order_supplier'; $this->db->begin(); $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element ("; @@ -3003,16 +3003,16 @@ abstract class CommonObject dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG); if ($this->db->query($sql)) - { - $this->db->commit(); - return 1; - } - else - { - $this->error=$this->db->lasterror(); - $this->db->rollback(); - return 0; - } + { + $this->db->commit(); + return 1; + } + else + { + $this->error=$this->db->lasterror(); + $this->db->rollback(); + return 0; + } } /** @@ -3649,10 +3649,11 @@ abstract class CommonObject { if (empty($totalToShip)) $totalToShip=0; // Avoid warning because $totalToShip is '' $totalToShip+=$line->qty_shipped; // defined for shipment only - }elseif ($line->element == 'commandefournisseurdispatch' && isset($line->qty)) - { - if (empty($totalToShip)) $totalToShip=0; - $totalToShip+=$line->qty; // defined for reception only + } + elseif ($line->element == 'commandefournisseurdispatch' && isset($line->qty)) + { + if (empty($totalToShip)) $totalToShip=0; + $totalToShip+=$line->qty; // defined for reception only } // Define qty, weight, volume, weight_units, volume_units @@ -4271,7 +4272,7 @@ abstract class CommonObject $productstatic->id = $line->fk_product; $productstatic->ref = $line->ref; $productstatic->type = $line->fk_product_type; - if(empty($productstatic->ref)){ + if (empty($productstatic->ref)) { $line->fetch_product(); $productstatic = $line->product; } @@ -4637,14 +4638,14 @@ abstract class CommonObject if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true; } if ($this->element == 'commande' && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD)) { - $setsharekey=true; - } + $setsharekey=true; + } if ($this->element == 'facture' && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD)) { - $setsharekey=true; - } + $setsharekey=true; + } if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) { - $setsharekey=true; - } + $setsharekey=true; + } if ($setsharekey) { @@ -4807,7 +4808,7 @@ abstract class CommonObject /* For triggers */ - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Call trigger based on this instance. * Some context information may also be provided into array property this->context. @@ -4818,9 +4819,9 @@ abstract class CommonObject * @param User $user Object user * @return int Result of run_triggers */ - public function call_trigger($trigger_name, $user) + public function call_trigger($trigger_name, $user) { - // phpcs:enable + // phpcs:enable global $langs,$conf; include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; @@ -4845,7 +4846,7 @@ abstract class CommonObject /* Functions for extrafields */ - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Function to get extra fields of an object into $this->array_options * This method is in most cases called by method fetch of objects but you can call it separately. @@ -4854,9 +4855,9 @@ abstract class CommonObject * @param array $optionsArray Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters. * @return int <0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded */ - public function fetch_optionals($rowid = null, $optionsArray = null) + public function fetch_optionals($rowid = null, $optionsArray = null) { - // phpcs:enable + // phpcs:enable if (empty($rowid)) $rowid=$this->id; // To avoid SQL errors. Probably not the better solution though @@ -5484,7 +5485,7 @@ abstract class CommonObject elseif (in_array($type, array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/', $type)) { $morecss = 'maxwidth75'; - } elseif ($type == 'url') { + } elseif ($type == 'url') { $morecss='minwidth400'; } elseif ($type == 'boolean') @@ -7178,8 +7179,8 @@ abstract class CommonObject * @param array $fieldsentry Properties of field * @return string */ - protected function quote($value, $fieldsentry) - { + protected function quote($value, $fieldsentry) + { if (is_null($value)) return 'NULL'; elseif (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) return $this->db->escape("$value"); else return "'".$this->db->escape($value)."'"; From 6f9010c362c771867fd6b822733ebeb62af96001 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 13 May 2019 22:02:43 +0200 Subject: [PATCH 0409/1036] NEW add category in export of chart of accounts --- htdocs/core/modules/modAccounting.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modAccounting.class.php b/htdocs/core/modules/modAccounting.class.php index fa44bd7163b..a09ef981363 100644 --- a/htdocs/core/modules/modAccounting.class.php +++ b/htdocs/core/modules/modAccounting.class.php @@ -244,11 +244,12 @@ class modAccounting extends DolibarrModules $this->export_permission[$r]=array(array("accounting","chartofaccount")); $this->export_fields_array[$r]=array('ac.rowid'=>'ChartofaccountsId','ac.pcg_version'=>'Chartofaccounts','aa.rowid'=>'Id','aa.account_number'=>"AccountAccounting",'aa.label'=>"Label",'aa.account_parent'=>"Accountparent","cac.code"=>"AccountingCategory",'aa.pcg_type'=>"Pcgtype",'aa.pcg_subtype'=>'Pcgsubtype','aa.active'=>'Status'); $this->export_TypeFields_array[$r]=array('ac.rowid'=>'List:accounting_system:pcg_version','aa.account_number'=>"Text",'aa.label'=>"Text",'aa.account_parent'=>"Text",'cac.code'=>"Text",'aa.pcg_type'=>'Text','aa.pcg_subtype'=>'Text','aa.active'=>'Status'); - $this->export_entities_array[$r]=array('ac.rowid'=>"Accounting",'ac.pcg_version'=>"Accounting",'aa.rowid'=>'Accounting','aa.account_number'=>"Accounting",'aa.label'=>"Accounting",'aa.accountparent'=>"Accounting",'cac.code'=>"accounting",'aa.pcg_type'=>"Accounting",'aa.pcgsubtype'=>"Accounting",'aa_active'=>"Accounting"); + $this->export_entities_array[$r]=array('ac.rowid'=>"Accounting",'ac.pcg_version'=>"Accounting",'aa.rowid'=>'Accounting','aa.account_number'=>"Accounting",'aa.label'=>"Accounting",'aa.accountparent'=>"Accounting",'cac.code'=>"Accounting",'aa.pcg_type'=>"Accounting",'aa.pcgsubtype'=>"Accounting",'aa_active'=>"Accounting"); $this->export_sql_start[$r]='SELECT DISTINCT '; - $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'accounting_account as aa, '.MAIN_DB_PREFIX.'accounting_system as ac'; + $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'accounting_account as aa'; $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_accounting_category as cac ON cac.rowid = aa.fk_accounting_category'; + $this->export_sql_end[$r] .=' ,'.MAIN_DB_PREFIX.'accounting_system as ac'; $this->export_sql_end[$r] .=' WHERE ac.pcg_version = aa.fk_pcg_version AND aa.entity IN ('.getEntity('accounting').') '; From d4e2fab9834ab10bcd9be6b90f8b4c4aba8d74df Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 13 May 2019 22:25:15 +0200 Subject: [PATCH 0410/1036] Replace term "Advanced accountancy" by Accountancy (Double entries) --- htdocs/accountancy/admin/account.php | 2 +- htdocs/accountancy/admin/accountmodel.php | 2 +- htdocs/accountancy/admin/card.php | 2 +- htdocs/accountancy/admin/categories.php | 2 +- htdocs/accountancy/admin/closure.php | 2 +- htdocs/accountancy/admin/defaultaccounts.php | 2 +- htdocs/accountancy/admin/export.php | 2 +- htdocs/accountancy/admin/fiscalyear.php | 2 +- htdocs/accountancy/admin/fiscalyear_card.php | 2 +- htdocs/accountancy/admin/fiscalyear_info.php | 2 +- htdocs/accountancy/admin/index.php | 2 +- htdocs/accountancy/admin/journals_list.php | 2 +- htdocs/accountancy/admin/productaccount.php | 2 +- htdocs/accountancy/bookkeeping/balance.php | 2 +- htdocs/accountancy/bookkeeping/balancebymonth.php | 2 +- htdocs/accountancy/bookkeeping/card.php | 2 +- htdocs/accountancy/bookkeeping/list.php | 7 +++++-- htdocs/accountancy/bookkeeping/listbyaccount.php | 2 +- .../bookkeeping/thirdparty_lettering_supplier.php | 2 +- htdocs/accountancy/class/accountancycategory.class.php | 2 +- htdocs/accountancy/class/accountancyexport.class.php | 2 +- htdocs/accountancy/class/accountancysystem.class.php | 2 +- htdocs/accountancy/class/accountingaccount.class.php | 2 +- htdocs/accountancy/class/accountingjournal.class.php | 2 +- htdocs/accountancy/class/bookkeeping.class.php | 2 +- htdocs/accountancy/class/lettering.class.php | 2 +- htdocs/accountancy/customer/card.php | 2 +- htdocs/accountancy/customer/index.php | 2 +- htdocs/accountancy/customer/lines.php | 2 +- htdocs/accountancy/customer/list.php | 2 +- htdocs/accountancy/expensereport/card.php | 2 +- htdocs/accountancy/expensereport/index.php | 2 +- htdocs/accountancy/expensereport/lines.php | 2 +- htdocs/accountancy/expensereport/list.php | 2 +- htdocs/accountancy/index.php | 2 +- htdocs/accountancy/journal/bankjournal.php | 2 +- htdocs/accountancy/journal/expensereportsjournal.php | 2 +- htdocs/accountancy/journal/purchasesjournal.php | 2 +- htdocs/accountancy/journal/sellsjournal.php | 2 +- htdocs/accountancy/supplier/card.php | 2 +- htdocs/accountancy/supplier/index.php | 2 +- htdocs/accountancy/supplier/lines.php | 2 +- htdocs/accountancy/supplier/list.php | 2 +- 43 files changed, 47 insertions(+), 44 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 9d4f4b68370..1a42b927506 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/admin/account.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief List accounting account */ diff --git a/htdocs/accountancy/admin/accountmodel.php b/htdocs/accountancy/admin/accountmodel.php index 6404b6119e7..f44ff0071d2 100644 --- a/htdocs/accountancy/admin/accountmodel.php +++ b/htdocs/accountancy/admin/accountmodel.php @@ -28,7 +28,7 @@ /** * \file htdocs/accountancy/admin/accountmodel.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to administer model of chart of accounts */ diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 6d43f01b03f..a6c3969e64a 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/admin/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card of accounting account */ diff --git a/htdocs/accountancy/admin/categories.php b/htdocs/accountancy/admin/categories.php index faba7fb1c62..17fa65d4f5e 100644 --- a/htdocs/accountancy/admin/categories.php +++ b/htdocs/accountancy/admin/categories.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/categories.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to assign mass categories to accounts */ diff --git a/htdocs/accountancy/admin/closure.php b/htdocs/accountancy/admin/closure.php index ff559332316..a638d598ac9 100644 --- a/htdocs/accountancy/admin/closure.php +++ b/htdocs/accountancy/admin/closure.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/closure.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/admin/defaultaccounts.php b/htdocs/accountancy/admin/defaultaccounts.php index 4ea9ff9139a..cba9ac92f3b 100644 --- a/htdocs/accountancy/admin/defaultaccounts.php +++ b/htdocs/accountancy/admin/defaultaccounts.php @@ -24,7 +24,7 @@ /** * \file htdocs/accountancy/admin/defaultaccounts.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/admin/export.php b/htdocs/accountancy/admin/export.php index 15e455cf84c..74090e54120 100644 --- a/htdocs/accountancy/admin/export.php +++ b/htdocs/accountancy/admin/export.php @@ -23,7 +23,7 @@ /** * \file htdocs/accountancy/admin/export.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/admin/fiscalyear.php b/htdocs/accountancy/admin/fiscalyear.php index df2dec9d3b1..47211087956 100644 --- a/htdocs/accountancy/admin/fiscalyear.php +++ b/htdocs/accountancy/admin/fiscalyear.php @@ -17,7 +17,7 @@ /** * \file htdocs/accountancy/admin/fiscalyear.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure fiscal year */ diff --git a/htdocs/accountancy/admin/fiscalyear_card.php b/htdocs/accountancy/admin/fiscalyear_card.php index 4063e28f369..5dc6010d465 100644 --- a/htdocs/accountancy/admin/fiscalyear_card.php +++ b/htdocs/accountancy/admin/fiscalyear_card.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/fiscalyear_card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to show a fiscal year */ diff --git a/htdocs/accountancy/admin/fiscalyear_info.php b/htdocs/accountancy/admin/fiscalyear_info.php index 86b01fa7397..dfec49949a3 100644 --- a/htdocs/accountancy/admin/fiscalyear_info.php +++ b/htdocs/accountancy/admin/fiscalyear_info.php @@ -17,7 +17,7 @@ /** * \file htdocs/accountancy/admin/fiscalyear_info.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to show info of a fiscal year */ diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php index 965b63ba9b9..fefa081848e 100644 --- a/htdocs/accountancy/admin/index.php +++ b/htdocs/accountancy/admin/index.php @@ -24,7 +24,7 @@ /** * \file htdocs/accountancy/admin/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ diff --git a/htdocs/accountancy/admin/journals_list.php b/htdocs/accountancy/admin/journals_list.php index c48e1a5989d..cac81bfbcae 100644 --- a/htdocs/accountancy/admin/journals_list.php +++ b/htdocs/accountancy/admin/journals_list.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/admin/journals_list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Setup page to configure journals */ diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 80c2ed052c0..4d5561e3aca 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/admin/productaccount.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief To define accounting account on product / service */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 6d2c7644d85..44a12b76f36 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/balance.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Balance of book keeping */ diff --git a/htdocs/accountancy/bookkeeping/balancebymonth.php b/htdocs/accountancy/bookkeeping/balancebymonth.php index edf7383b595..b9568228a36 100644 --- a/htdocs/accountancy/bookkeeping/balancebymonth.php +++ b/htdocs/accountancy/bookkeeping/balancebymonth.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/balancebymonth.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Balance by month */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index 8974b65a68f..24a0e9605a4 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page to show book-entry */ diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 207ea3464d8..7df29416878 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -1,7 +1,7 @@ * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2013-2018 Alexandre Spangaro + * Copyright (C) 2013-2019 Alexandre Spangaro * Copyright (C) 2016-2017 Laurent Destailleur * Copyright (C) 2018 Frédéric France * @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief List operation of book keeping */ require '../../main.inc.php'; @@ -47,6 +47,9 @@ $search_date_creation_start = dol_mktime(0, 0, 0, GETPOST('date_creation_startmo $search_date_creation_end = dol_mktime(0, 0, 0, GETPOST('date_creation_endmonth', 'int'), GETPOST('date_creation_endday', 'int'), GETPOST('date_creation_endyear', 'int')); $search_date_modification_start = dol_mktime(0, 0, 0, GETPOST('date_modification_startmonth', 'int'), GETPOST('date_modification_startday', 'int'), GETPOST('date_modification_startyear', 'int')); $search_date_modification_end = dol_mktime(0, 0, 0, GETPOST('date_modification_endmonth', 'int'), GETPOST('date_modification_endday', 'int'), GETPOST('date_modification_endyear', 'int')); +$search_date_export_start = dol_mktime(0, 0, 0, GETPOST('date_export_startmonth', 'int'), GETPOST('date_export_startday', 'int'), GETPOST('date_export_startyear', 'int')); +$search_date_export_end = dol_mktime(0, 0, 0, GETPOST('date_export_endmonth', 'int'), GETPOST('date_export_endday', 'int'), GETPOST('date_export_endyear', 'int')); + //var_dump($search_date_start);exit; if (GETPOST("button_delmvt_x") || GETPOST("button_delmvt.x") || GETPOST("button_delmvt")) { $action = 'delbookkeepingyear'; diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 38dc49c5bf6..7b57f443ef9 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/bookkeeping/listbyaccount.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief List operation of book keeping ordered by account number */ diff --git a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php index 50b80c72338..87bd79bb64d 100644 --- a/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php +++ b/htdocs/accountancy/bookkeeping/thirdparty_lettering_supplier.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/bookkeeping/thirdparty_lettrage_supplier.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Tab to setup lettering */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/class/accountancycategory.class.php b/htdocs/accountancy/class/accountancycategory.class.php index 523fba7acda..f11ff3957f7 100644 --- a/htdocs/accountancy/class/accountancycategory.class.php +++ b/htdocs/accountancy/class/accountancycategory.class.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/class/accountancycategory.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage categories of an accounting category_type */ diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 344a45f19fc..5da52e05784 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -27,7 +27,7 @@ /** * \file htdocs/accountancy/class/accountancyexport.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Class accountancy export */ diff --git a/htdocs/accountancy/class/accountancysystem.class.php b/htdocs/accountancy/class/accountancysystem.class.php index c8a855c0d8a..102ee4cce61 100644 --- a/htdocs/accountancy/class/accountancysystem.class.php +++ b/htdocs/accountancy/class/accountancysystem.class.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/class/accountancysystem.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage accountancy systems */ diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index 33f8990bc8d..dc5d8eab77d 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/class/accountingaccount.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage accounting accounts */ diff --git a/htdocs/accountancy/class/accountingjournal.class.php b/htdocs/accountancy/class/accountingjournal.class.php index eb99badd5f3..e8caaab8a89 100644 --- a/htdocs/accountancy/class/accountingjournal.class.php +++ b/htdocs/accountancy/class/accountingjournal.class.php @@ -17,7 +17,7 @@ /** * \file htdocs/accountancy/class/accountingjournal.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage accounting journals */ diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index 3c985d325bc..c1df8b1045c 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/class/bookkeeping.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class to manage Ledger (General Ledger and Subledger) */ diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index 555e1a244a6..a0c977a8d5a 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/class/lettering.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class for lettering */ diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php index 5c1dfc5ccbb..eb66b235d0b 100644 --- a/htdocs/accountancy/customer/card.php +++ b/htdocs/accountancy/customer/card.php @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/customer/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card customer ventilation */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index aa8161b9c52..1086800e355 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/customer/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home customer journalization page */ diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index f7a53c9e210..2801e234486 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/customer/lines.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page of detail of the lines of ventilation of invoices customers */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 4b3906d60da..90bb9574961 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/customer/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Ventilation page from customers invoices */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/expensereport/card.php b/htdocs/accountancy/expensereport/card.php index eb620d7bf14..1052a1d485d 100644 --- a/htdocs/accountancy/expensereport/card.php +++ b/htdocs/accountancy/expensereport/card.php @@ -23,7 +23,7 @@ */ /** * \file htdocs/accountancy/supplier/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card expense report ventilation */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index e350a3011a0..f5e71082bfa 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/expensereport/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home expense report ventilation */ diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index 3a322c07ef3..30734bb803b 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/expensereport/lines.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page of detail of the lines of ventilation of expense reports */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 4f037f3c72b..ffb9297626b 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/expensereport/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Ventilation page from expense reports */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/index.php b/htdocs/accountancy/index.php index b34efe5ea04..922f1285b3c 100644 --- a/htdocs/accountancy/index.php +++ b/htdocs/accountancy/index.php @@ -18,7 +18,7 @@ /** * \file htdocs/accountancy/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home accounting module */ diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 275af10701d..49e76c51dde 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -27,7 +27,7 @@ /** * \file htdocs/accountancy/journal/bankjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with bank journal */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php index 30ed5a07207..fcb0ac8713f 100644 --- a/htdocs/accountancy/journal/expensereportsjournal.php +++ b/htdocs/accountancy/journal/expensereportsjournal.php @@ -25,7 +25,7 @@ /** * \file htdocs/accountancy/journal/expensereportsjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with expense reports journal */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 6bbc4ad9c62..f23bc48c134 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -25,7 +25,7 @@ /** * \file htdocs/accountancy/journal/purchasesjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with purchases journal */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 25c53863162..ac36238af6e 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -26,7 +26,7 @@ /** * \file htdocs/accountancy/journal/sellsjournal.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page with sells journal */ diff --git a/htdocs/accountancy/supplier/card.php b/htdocs/accountancy/supplier/card.php index 10e52d6c029..97f7d618ce8 100644 --- a/htdocs/accountancy/supplier/card.php +++ b/htdocs/accountancy/supplier/card.php @@ -23,7 +23,7 @@ */ /** * \file htdocs/accountancy/supplier/card.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Card supplier ventilation */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index ab85507a7b4..95bcc15b9fd 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -20,7 +20,7 @@ /** * \file htdocs/accountancy/supplier/index.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Home supplier journalization page */ diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 4af51060b4b..7752d8355f0 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -21,7 +21,7 @@ /** * \file htdocs/accountancy/supplier/lines.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Page of detail of the lines of ventilation of invoices suppliers */ require '../../main.inc.php'; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 27cccdb7eb2..c6480c6d6eb 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -22,7 +22,7 @@ /** * \file htdocs/accountancy/supplier/list.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Ventilation page from suppliers invoices */ require '../../main.inc.php'; From 79a347ab115052a7b1c723e87cf2c92b8c5a273c Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 13 May 2019 22:49:43 +0200 Subject: [PATCH 0411/1036] Fix PHPCS contract list --- htdocs/contrat/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index cd833f07894..1ba35031041 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -48,8 +48,8 @@ $contextpage= GETPOST('contextpage', 'aZ')?GETPOST('contextpage', 'aZ'):'contrac $search_name=GETPOST('search_name', 'alpha'); $search_email=GETPOST('search_email', 'alpha'); -$search_town=GETPOST('search_town','alpha'); -$search_zip=GETPOST('search_zip','alpha'); +$search_town=GETPOST('search_town', 'alpha'); +$search_zip=GETPOST('search_zip', 'alpha'); $search_state=trim(GETPOST("search_state")); $search_country=GETPOST("search_country", 'int'); $search_type_thirdparty=GETPOST("search_type_thirdparty", 'int'); @@ -709,8 +709,8 @@ while ($i < min($num, $limit)) $listsalesrepresentatives=$socstatic->getSalesRepresentatives($user); if ($listsalesrepresentatives < 0) dol_print_error($db); $nbofsalesrepresentative=count($listsalesrepresentatives); - if ($nbofsalesrepresentative > 3) { - // We print only number + if ($nbofsalesrepresentative > 3) { + // We print only number print ''; print $nbofsalesrepresentative; print ''; From 7c9ccee64d21634b3a364cdb2bc0d5ec780f0c8c Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 14 May 2019 05:45:36 +0200 Subject: [PATCH 0412/1036] NEW Accountancy - Differentiated export --- htdocs/accountancy/bookkeeping/list.php | 66 +++++++++++++++++-- .../accountancy/class/bookkeeping.class.php | 23 ++++--- .../install/mysql/migration/9.0.0-10.0.0.sql | 2 + .../tables/llx_accounting_bookkeeping.sql | 5 +- htdocs/langs/en_US/main.lang | 1 + 5 files changed, 80 insertions(+), 17 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 7df29416878..ac9811c687c 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -146,6 +146,7 @@ $arrayfields=array( 't.code_journal'=>array('label'=>$langs->trans("Codejournal"), 'checked'=>1), 't.date_creation'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0), 't.tms'=>array('label'=>$langs->trans("DateModification"), 'checked'=>0), + 't.date_export'=>array('label'=>$langs->trans("DateExport"), 'checked'=>0), ); if (empty($conf->global->ACCOUNTING_ENABLE_LETTERING)) unset($arrayfields['t.lettering_code']); @@ -181,6 +182,8 @@ if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x' $search_date_creation_end = ''; $search_date_modification_start = ''; $search_date_modification_end = ''; + $search_date_export_start = ''; + $search_date_export_end = ''; $search_debit = ''; $search_credit = ''; $search_lettering_code = ''; @@ -272,6 +275,16 @@ if (! empty($search_date_modification_end)) { $tmp=dol_getdate($search_date_modification_end); $param .= '&date_modification_endmonth=' . $tmp['mon'] . '&date_modification_endday=' . $tmp['mday'] . '&date_modification_endyear=' . $tmp['year']; } +if (! empty($search_date_export_start)) { + $filter['t.date_export>='] = $search_date_export_start; + $tmp=dol_getdate($search_date_export_start); + $param .= '&date_export_startmonth=' . $tmp['mon'] . '&date_export_startday=' . $tmp['mday'] . '&date_export_startyear=' . $tmp['year']; +} +if (! empty($search_date_export_end)) { + $filter['t.date_export<='] = $search_date_export_end; + $tmp=dol_getdate($search_date_export_end); + $param .= '&date_export_endmonth=' . $tmp['mon'] . '&date_export_endday=' . $tmp['mday'] . '&date_export_endyear=' . $tmp['year']; +} if (! empty($search_debit)) { $filter['t.debit'] = $search_debit; $param .= '&search_debit=' . urlencode($search_debit); @@ -351,8 +364,9 @@ if ($action == 'delmouvconfirm') { // Export into a file with format defined into setup (FEC, CSV, ...) if ($action == 'export_file') { + $reexportMovements = GETPOST('already_exported')=='on'?1:0; - $result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter); + $result = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter, 'AND', $reexportMovements); if ($result < 0) { @@ -363,6 +377,22 @@ if ($action == 'export_file') { $accountancyexport = new AccountancyExport($db); $accountancyexport->export($object->lines); + // TODO Move in class bookKeeping + // Specify as export : update field date_export + foreach ( $object->lines as $movement ) { + $now = dol_now(); + $sql = " UPDATE " . MAIN_DB_PREFIX . "accounting_bookkeeping"; + $sql .= " SET date_export = '" . $db->idate($now) . "'"; + $sql .= " WHERE rowid = " . $movement->id; + + dol_syslog("/accountancy/bookeeping/list.php Function export_file Specify movements as exported sql=" . $sql, LOG_DEBUG); + if ($db->query($sql)) { + $db->commit(); + } else { + $db->rollback(); + } + } + if (!empty($accountancyexport->errors)) { setEventMessages('', $accountancyexport->errors, 'errors'); @@ -446,10 +476,10 @@ print ''; print ''; $listofformat=AccountancyExport::getType(); -$button = ''; +$button = ' ' . $langs->trans("IncludeDocsAlreadyExported"); +$button .= 'global->ACCOUNTING_EXPORT_MODELCSV].')'.'" name="button_export_file" href="'.$_SERVER["PHP_SELF"].'?action=export_file'.($param?'&'.$param:'').'">'; if (count($filter)) $button.= $langs->trans("ExportFilteredList"); else $button.= $langs->trans("ExportList"); -//$button.=' ('.$listofformat[$conf->global->ACCOUNTING_EXPORT_MODELCSV].')'; $button.= ''; @@ -600,6 +630,20 @@ if (! empty($arrayfields['t.tms']['checked'])) print '
'; print ''; } +// Date export +if (! empty($arrayfields['t.date_export']['checked'])) +{ + print ''; + print '
'; + print $langs->trans('From') . ' '; + print $form->selectDate($search_date_export_start, 'date_export_start', 0, 0, 1); + print '
'; + print '
'; + print $langs->trans('to') . ' '; + print $form->selectDate($search_date_export_end, 'date_export_end', 0, 0, 1); + print '
'; + print ''; +} // Action column print ''; $searchpicto=$form->showFilterButtons(); @@ -620,6 +664,7 @@ if (! empty($arrayfields['t.lettering_code']['checked'])) print_liste_field_tit if (! empty($arrayfields['t.code_journal']['checked'])) print_liste_field_titre($arrayfields['t.code_journal']['label'], $_SERVER['PHP_SELF'], "t.code_journal", "", $param, '', $sortfield, $sortorder, 'center '); if (! empty($arrayfields['t.date_creation']['checked'])) print_liste_field_titre($arrayfields['t.date_creation']['label'], $_SERVER['PHP_SELF'], "t.date_creation", "", $param, '', $sortfield, $sortorder, 'center '); if (! empty($arrayfields['t.tms']['checked'])) print_liste_field_titre($arrayfields['t.tms']['label'], $_SERVER['PHP_SELF'], "t.tms", "", $param, '', $sortfield, $sortorder, 'center '); +if (! empty($arrayfields['t.date_export']['checked'])) print_liste_field_titre($arrayfields['t.date_export']['label'], $_SERVER['PHP_SELF'], "t.date_export", "", $param, '', $sortfield, $sortorder, 'center '); print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch '); print "\n"; @@ -732,11 +777,20 @@ if ($num > 0) if (! $i) $totalarray['nbfield']++; } + // Exported operation date + if (! empty($arrayfields['t.date_export']['checked'])) + { + print '' . dol_print_date($line->date_export, 'dayhour') . ''; + if (! $i) $totalarray['nbfield']++; + } + // Action column print ''; - print '' . img_edit() . ' '; - print '' . img_delete() . ''; - print ''; + if(empty($line->date_export)) { + print '' . img_edit() . ' '; + print '' . img_delete() . ''; + } + print ''; if (! $i) $totalarray['nbfield']++; print "\n"; diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index c1df8b1045c..872bd56ca0f 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -866,15 +866,16 @@ class BookKeeping extends CommonObject /** * Load object in memory from the database * - * @param string $sortorder Sort Order - * @param string $sortfield Sort field - * @param int $limit Offset limit - * @param int $offset Offset limit - * @param array $filter Filter array - * @param string $filtermode Filter mode (AND or OR) - * @return int <0 if KO, >0 if OK + * @param string $sortorder Sort Order + * @param string $sortfield Sort field + * @param int $limit Offset limit + * @param int $offset Offset limit + * @param array $filter Filter array + * @param string $filtermode Filter mode (AND or OR) + * @param int $showAlreadyExportMovements Show movements when field 'date_export' is not empty (0:No / 1:Yes (Default)) + * @return int <0 if KO, >0 if OK */ - public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') + public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND', $showAlreadyExportMovements = 1) { global $conf; @@ -904,7 +905,8 @@ class BookKeeping extends CommonObject $sql .= " t.journal_label,"; $sql .= " t.piece_num,"; $sql .= " t.date_creation,"; - $sql .= " t.tms as date_modification"; + $sql .= " t.tms as date_modification,"; + $sql .= " t.date_export"; $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; // Manage filter $sqlwhere = array (); @@ -924,6 +926,8 @@ class BookKeeping extends CommonObject $sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\''; } elseif ($key == 't.tms>=' || $key == 't.tms<=') { $sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\''; + } elseif ($key == 't.date_export>=' || $key == 't.date_export<=') { + $sqlwhere[] = $key . '\'' . $this->db->idate($value) . '\''; } elseif ($key == 't.credit' || $key == 't.debit') { $sqlwhere[] = natural_search($key, $value, 1, 1); } else { @@ -978,6 +982,7 @@ class BookKeeping extends CommonObject $line->piece_num = $obj->piece_num; $line->date_creation = $this->db->jdate($obj->date_creation); $line->date_modification = $this->db->jdate($obj->date_modification); + $line->date_export = $this->db->jdate($obj->date_export); $this->lines[] = $line; diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index b53d0603be6..ef8a8c7b750 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -366,4 +366,6 @@ ALTER TABLE llx_reception_extrafields ADD INDEX idx_reception_extrafields (fk_ob ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_projet integer DEFAULT NULL; ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_reception integer DEFAULT NULL; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_export datetime DEFAULT NULL after date_validated; + \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql index af693c273a4..4a8f3ac7587 100644 --- a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql +++ b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql @@ -1,6 +1,6 @@ -- ============================================================================ -- Copyright (C) 2013-2014 Olivier Geffroy --- Copyright (C) 2013-2017 Alexandre Spangaro +-- Copyright (C) 2013-2019 Alexandre Spangaro -- -- 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 @@ -51,6 +51,7 @@ CREATE TABLE llx_accounting_bookkeeping piece_num integer NOT NULL, -- FEC:EcritureNum | accounting source document validated tinyint DEFAULT 0 NOT NULL, -- | 0 line not validated / 1 line validated (No deleting / No modification) date_validated datetime, -- FEC:ValidDate - import_key varchar(14), + date_export datetime DEFAULT NULL, -- + import_key varchar(14), -- extraparams varchar(255) -- for other parameters with json format ) ENGINE=innodb; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index f91cbd8f1eb..be4d25cfef5 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -842,6 +842,7 @@ Exports=Exports ExportFilteredList=Export filtered list ExportList=Export list ExportOptions=Export Options +IncludeDocsAlreadyExported=Include docs already exported Miscellaneous=Miscellaneous Calendar=Calendar GroupBy=Group by... From 60d00e2f5c6e6878c5ced7e6a3ef0fa449f5d62b Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 14 May 2019 06:46:06 +0200 Subject: [PATCH 0413/1036] FIX FEC Remove useless field 'validated' --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 2 ++ htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql | 3 +-- htdocs/install/mysql/tables/llx_accounting_bookkeeping_tmp.sql | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index b53d0603be6..0195d57aa50 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -61,6 +61,8 @@ CREATE TABLE llx_pos_cash_fence( -- For 10.0 DROP TABLE llx_cotisation; +ALTER TABLE llx_accounting_bookkeeping DROP COLUMN validated; +ALTER TABLE llx_accounting_bookkeeping_tmp DROP COLUMN validated; ALTER TABLE llx_loan ADD COLUMN insurance_amount double(24,8) DEFAULT 0; diff --git a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql index af693c273a4..8a5045186e6 100644 --- a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql +++ b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql @@ -49,8 +49,7 @@ CREATE TABLE llx_accounting_bookkeeping code_journal varchar(32) NOT NULL, -- FEC:JournalCode journal_label varchar(255), -- FEC:JournalLib piece_num integer NOT NULL, -- FEC:EcritureNum | accounting source document - validated tinyint DEFAULT 0 NOT NULL, -- | 0 line not validated / 1 line validated (No deleting / No modification) - date_validated datetime, -- FEC:ValidDate + date_validated datetime, -- FEC:ValidDate | if empty: movement not validated / if not empty: movement validated (No deleting / No modification) import_key varchar(14), extraparams varchar(255) -- for other parameters with json format ) ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_accounting_bookkeeping_tmp.sql b/htdocs/install/mysql/tables/llx_accounting_bookkeeping_tmp.sql index d8b1fd81066..56088ac1c01 100644 --- a/htdocs/install/mysql/tables/llx_accounting_bookkeeping_tmp.sql +++ b/htdocs/install/mysql/tables/llx_accounting_bookkeeping_tmp.sql @@ -49,8 +49,7 @@ CREATE TABLE llx_accounting_bookkeeping_tmp code_journal varchar(32) NOT NULL, -- FEC:JournalCode journal_label varchar(255), -- FEC:JournalLib piece_num integer NOT NULL, -- FEC:EcritureNum - validated tinyint DEFAULT 0 NOT NULL, -- | 0 line not validated / 1 line validated (No deleting / No modification) - date_validated datetime, -- FEC:ValidDate + date_validated datetime, -- FEC:ValidDate | if empty: movement not validated / if not empty: movement validated (No deleting / No modification) import_key varchar(14), extraparams varchar(255) -- for other parameters with json format ) ENGINE=innodb; From 49d65710bac17bb7ec0e8858d7232e838c4d5e65 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 14 May 2019 10:31:11 +0200 Subject: [PATCH 0414/1036] Fix date missing --- htdocs/product/fournisseurs.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 15ee6539239..67574b56318 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -673,9 +673,11 @@ SCRIPT; print ''.$langs->trans("SupplierReputation").''; echo $form->selectarray('supplier_reputation', $object->reputations, $supplier_reputation?$supplier_reputation:$object->supplier_reputation); print ''; - if(!empty($conf->barcode->enabled)) { - // Option to define a transport cost on supplier price + // Barcode + if (! empty($conf->barcode->enabled)) + { + // Option to define a transport cost on supplier price print ''; print '' . $langs->trans('BarcodeValue') . ''; print ''; @@ -690,6 +692,7 @@ SCRIPT; print ''; print ''; } + // Option to define a transport cost on supplier price if ($conf->global->PRODUCT_CHARGES) { @@ -907,7 +910,6 @@ SCRIPT; // Barcode type print ''; - $productfourn->barcode_type = !empty($productfourn->fk_barcode_type) ? $productfourn->fk_barcode_type:0; $productfourn->fetch_barcode(); print $productfourn->barcode_type_label?$productfourn->barcode_type_label:($productfourn->barcode?'
'.$langs->trans("SetDefaultBarcodeType").'
':''); @@ -916,7 +918,7 @@ SCRIPT; // Date print ''; - print dol_print_date($productfourn->date_modification, "dayhour"); + print dol_print_date(($productfourn->fourn_date_modification ? $productfourn->fourn_date_modification : $productfourn->date_modification), "dayhour"); print ''; if (is_object($hookmanager)) From 9f8f45d5bc667bf5ec21b1138a48bde69251a50a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 14 May 2019 12:00:58 +0200 Subject: [PATCH 0415/1036] FIX Payment on supplier invoice should not mix credit note and standard invoices. --- htdocs/compta/facture/card.php | 15 ++--- htdocs/compta/paiement.php | 40 +++++++------ htdocs/fourn/facture/paiement.php | 99 +++++++++++++++++++------------ htdocs/langs/en_US/cashdesk.lang | 3 +- 4 files changed, 95 insertions(+), 62 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index beebe3cb561..85b4e3bb728 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -4656,6 +4656,14 @@ elseif ($id > 0 || ! empty($ref)) } } + // POS Ticket + if (! empty($conf->takepos->enabled) && $object->module_source == 'takepos') + { + $langs->load("cashdesk"); + $receipt_url=DOL_URL_ROOT."/takepos/receipt.php"; + print ''; + } + // Create payment if ($object->type != Facture::TYPE_CREDIT_NOTE && $object->statut == 1 && $object->paye == 0 && $usercanissuepayment) { if ($objectidnext) { @@ -4700,13 +4708,6 @@ elseif ($id > 0 || ! empty($ref)) } } - // POS Ticket - if (! empty($conf->takepos->enabled) && $object->module_source != '') - { - $receipt_url=DOL_URL_ROOT."/takepos/receipt.php"; - print ''; - } - // Classify paid if ($object->statut == 1 && $object->paye == 0 && $usercanissuepayment && (($object->type != Facture::TYPE_CREDIT_NOTE && $object->type != Facture::TYPE_DEPOSIT && $resteapayer <= 0) || ($object->type == Facture::TYPE_CREDIT_NOTE && $resteapayer >= 0)) || ($object->type == Facture::TYPE_DEPOSIT && $object->paye == 0 && $object->total_ttc > 0 && $resteapayer == 0 && $usercanissuepayment && empty($discount->id)) diff --git a/htdocs/compta/paiement.php b/htdocs/compta/paiement.php index 336b306fff1..ab141f028bd 100644 --- a/htdocs/compta/paiement.php +++ b/htdocs/compta/paiement.php @@ -222,19 +222,26 @@ if (empty($reshook)) if ($socid > 0) $thirdparty->fetch($socid); // Clean parameters amount if payment is for a credit note - if (GETPOST('type') == Facture::TYPE_CREDIT_NOTE) + foreach ($amounts as $key => $value) // How payment is dispatched { - foreach ($amounts as $key => $value) // How payment is dispatch - { - $newvalue = price2num($value, 'MT'); - $amounts[$key] = -$newvalue; - } + $tmpinvoice = new Facture($db); + $tmpinvoice->fetch($key); + if ($tmpinvoice->type == Facture::TYPE_CREDIT_NOTE) + { + $newvalue = price2num($value, 'MT'); + $amounts[$key] = - abs($newvalue); + } + } - foreach ($multicurrency_amounts as $key => $value) // How payment is dispatch - { - $newvalue = price2num($value, 'MT'); - $multicurrency_amounts[$key] = -$newvalue; - } + foreach ($multicurrency_amounts as $key => $value) // How payment is dispatched + { + $tmpinvoice = new Facture($db); + $tmpinvoice->fetch($key); + if ($tmpinvoice->type == Facture::TYPE_CREDIT_NOTE) + { + $newvalue = price2num($value, 'MT'); + $multicurrency_amounts[$key] = - abs($newvalue); + } } if (! empty($conf->banque->enabled)) @@ -544,7 +551,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie } $sql.= ') AND f.paye = 0'; $sql.= ' AND f.fk_statut = 1'; // Statut=0 => not validated, Statut=2 => canceled - if ($facture->type != 2) + if ($facture->type != Facture::TYPE_CREDIT_NOTE) { $sql .= ' AND type IN (0,1,3,5)'; // Standard invoice, replacement, deposit, situation } @@ -552,7 +559,6 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie { $sql .= ' AND type = 2'; // If paying back a credit note, we show all credit notes } - // Sort invoices by date and serial number: the older one comes first $sql.=' ORDER BY f.datef ASC, f.ref ASC'; @@ -562,9 +568,6 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie $num = $db->num_rows($resql); if ($num > 0) { - $sign=1; - if ($facture->type == 2) $sign=-1; - $arraytitle=$langs->trans('Invoice'); if ($facture->type == 2) $arraytitle=$langs->trans("CreditNotes"); $alreadypayedlabel=$langs->trans('Received'); @@ -606,6 +609,9 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie { $objp = $db->fetch_object($resql); + $sign=1; + if ($facture->type == Facture::TYPE_CREDIT_NOTE) $sign=-1; + $soc = new Societe($db); $soc->fetch($objp->socid); @@ -631,7 +637,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie print ''; print $invoice->getNomUrl(1, ''); - if($objp->socid != $facture->thirdparty->id) print ' - '.$soc->getNomUrl(1).' '; + if ($objp->socid != $facture->thirdparty->id) print ' - '.$soc->getNomUrl(1).' '; print "\n"; // Date diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php index aa24196ec2f..a84acde6e04 100644 --- a/htdocs/fourn/facture/paiement.php +++ b/htdocs/fourn/facture/paiement.php @@ -251,21 +251,32 @@ if (empty($reshook)) $datepaye = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); // Clean parameters amount if payment is for a credit note - if (GETPOST('type', 'int') == FactureFournisseur::TYPE_CREDIT_NOTE) + foreach ($amounts as $key => $value) // How payment is dispatched { - foreach ($amounts as $key => $value) // How payment is dispatch + $tmpinvoice = new FactureFournisseur($db); + $tmpinvoice->fetch($key); + if ($tmpinvoice->type == FactureFournisseur::TYPE_CREDIT_NOTE) { $newvalue = price2num($value, 'MT'); - $amounts[$key] = -$newvalue; - } - - foreach ($multicurrency_amounts as $key => $value) // How payment is dispatch - { - $newvalue = price2num($value, 'MT'); - $multicurrency_amounts[$key] = -$newvalue; + $amounts[$key] = - abs($newvalue); } } + foreach ($multicurrency_amounts as $key => $value) // How payment is dispatched + { + $tmpinvoice = new FactureFournisseur($db); + $tmpinvoice->fetch($key); + if ($tmpinvoice->type == FactureFournisseur::TYPE_CREDIT_NOTE) + { + $newvalue = price2num($value, 'MT'); + $multicurrency_amounts[$key] = - abs($newvalue); + } + } + + //var_dump($amounts); + //var_dump($multicurrency_amounts); + //exit; + if (! $error) { $db->begin(); @@ -491,26 +502,35 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie if (empty($reshook)) { /* - * Autres factures impayees + * All unpayed supplier invoices */ - $sql = 'SELECT f.rowid as facid, f.ref, f.ref_supplier, f.total_ht, f.total_ttc, f.multicurrency_total_ttc, f.datef as df,'; - $sql.= ' SUM(pf.amount) as am, SUM(pf.multicurrency_amount) as multicurrency_am, f.date_lim_reglement as dlr'; + $sql = 'SELECT f.rowid as facid, f.ref, f.ref_supplier, f.type, f.total_ht, f.total_ttc, f.multicurrency_total_ttc, f.datef as df, f.date_lim_reglement as dlr,'; + $sql.= ' SUM(pf.amount) as am, SUM(pf.multicurrency_amount) as multicurrency_am'; $sql.= ' FROM '.MAIN_DB_PREFIX.'facture_fourn as f'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid'; $sql.= " WHERE f.entity = ".$conf->entity; $sql.= ' AND f.fk_soc = '.$object->socid; $sql.= ' AND f.paye = 0'; $sql.= ' AND f.fk_statut = 1'; // Statut=0 => non validee, Statut=2 => annulee - $sql.= ' GROUP BY f.rowid, f.ref, f.ref_supplier, f.total_ht, f.total_ttc, f.multicurrency_total_ttc, f.datef, f.date_lim_reglement'; + if ($object->type != FactureFournisseur::TYPE_CREDIT_NOTE) + { + $sql .= ' AND f.type IN (0,1,3,5)'; // Standard invoice, replacement, deposit, situation + } + else + { + $sql .= ' AND f.type = 2'; // If paying back a credit note, we show all credit notes + } + // Group by because we have a total + $sql.= ' GROUP BY f.datef, f.ref, f.ref_supplier, f.rowid, f.type, f.total_ht, f.total_ttc, f.multicurrency_total_ttc, f.datef, f.date_lim_reglement'; + // Sort invoices by date and serial number: the older one comes first + $sql.= ' ORDER BY f.datef ASC, f.ref ASC'; + $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); if ($num > 0) { - $sign=1; - if ($object->type == 2) $sign=-1; - $i = 0; print '
'; @@ -551,8 +571,15 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie { $objp = $db->fetch_object($resql); + $sign=1; + if ($objp->type == FactureFournisseur::TYPE_CREDIT_NOTE) $sign=-1; + $invoice=new FactureFournisseur($db); $invoice->fetch($objp->facid); + + $invoicesupplierstatic->ref=$objp->ref; + $invoicesupplierstatic->id=$objp->facid; + $paiement = $invoice->getSommePaiement(); $creditnotes=$invoice->getSumCreditNotesUsed(); $deposits=$invoice->getSumDepositsUsed(); @@ -572,9 +599,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie print ''; // Ref - print ''; - $invoicesupplierstatic->ref=$objp->ref; - $invoicesupplierstatic->id=$objp->facid; + print ''; print $invoicesupplierstatic->getNomUrl(1); print ''; @@ -582,7 +607,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie print ''.$objp->ref_supplier.''; // Date - if ($objp->df > 0 ) + if ($objp->df > 0) { print ''; print dol_print_date($db->jdate($objp->df), 'day').''; @@ -593,7 +618,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie } // Date Max Payment - if ($objp->dlr > 0 ) + if ($objp->dlr > 0) { print ''; print dol_print_date($db->jdate($objp->dlr), 'day'); @@ -648,7 +673,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie print ''.price($sign * $remaintopay).''; // Amount - print ''; + print ''; $namef = 'amount_'.$objp->facid; $nameRemain = 'remain_'.$objp->facid; @@ -711,12 +736,12 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie if (!empty($conf->multicurrency->enabled)) print ' '; if (!empty($conf->multicurrency->enabled)) print ' '; if (!empty($conf->multicurrency->enabled)) print ' '; - print ''.price($total_ttc).''; - print ''.price($totalrecu); + print ''.price($sign * $total_ttc).''; + print ''.price($sign * $totalrecu); if ($totalrecucreditnote) print '+'.price($totalrecucreditnote); if ($totalrecudeposits) print '+'.price($totalrecudeposits); print ''; - print ''.price(price2num($total_ttc - $totalrecu - $totalrecucreditnote - $totalrecudeposits, 'MT')).''; + print ''.price($sign * price2num($total_ttc - $totalrecu - $totalrecucreditnote - $totalrecudeposits, 'MT')).''; print ''; // Autofilled if (!empty($conf->multicurrency->enabled)) print ''; print "\n"; @@ -936,11 +961,11 @@ if (empty($action) || $action == 'list') print_liste_field_titre("Account", $_SERVER["PHP_SELF"], 'ba.label', '', $param, '', $sortfield, $sortorder); } print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], 'p.amount', '', $param, '', $sortfield, $sortorder, 'right '); - + $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; - + print_liste_field_titre('', $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch '); print "\n"; @@ -955,29 +980,29 @@ if (empty($action) || $action == 'list') // Ref payment print ''.img_object($langs->trans('ShowPayment'), 'payment').' '.$objp->pid.''; if (! $i) $totalarray['nbfield']++; - + // Date $dateformatforpayment = 'day'; if (! empty($conf->global->INVOICE_USE_HOURS_FOR_PAYMENT)) $dateformatforpayment='dayhour'; print ''.dol_print_date($db->jdate($objp->dp), $dateformatforpayment)."\n"; if (! $i) $totalarray['nbfield']++; - + // Thirdparty print ''; if ($objp->socid) print ''.img_object($langs->trans('ShowCompany'), 'company').' '.dol_trunc($objp->name, 32).''; else print ' '; print ''; if (! $i) $totalarray['nbfield']++; - + // Type $payment_type = $langs->trans("PaymentType".$objp->paiement_type)!=("PaymentType".$objp->paiement_type)?$langs->trans("PaymentType".$objp->paiement_type):$objp->paiement_libelle; print ''.$payment_type.' '.dol_trunc($objp->num_paiement, 32)."\n"; if (! $i) $totalarray['nbfield']++; - + // Payment number print ''.$objp->num_paiement.''; if (! $i) $totalarray['nbfield']++; - + // Account if (! empty($conf->banque->enabled)) { @@ -987,13 +1012,13 @@ if (empty($action) || $action == 'list') print ''; if (! $i) $totalarray['nbfield']++; } - + // Amount print ''.price($objp->pamount).''; if (! $i) $totalarray['nbfield']++; $totalarray['pos'][7]='amount'; $totalarray['val']['amount'] += $objp->pamount; - + // Ref invoice /*$invoicesupplierstatic->ref=$objp->ref_supplier; $invoicesupplierstatic->id=$objp->facid; @@ -1003,11 +1028,11 @@ if (empty($action) || $action == 'list') print ''; if (! $i) $totalarray['nbfield']++; - + print ''; $i++; } - + // Show total line if (isset($totalarray['pos'])) { @@ -1029,7 +1054,7 @@ if (empty($action) || $action == 'list') } print ''; } - + print ""; print "
"; print "\n"; diff --git a/htdocs/langs/en_US/cashdesk.lang b/htdocs/langs/en_US/cashdesk.lang index f0e2d029878..8ba3bda053f 100644 --- a/htdocs/langs/en_US/cashdesk.lang +++ b/htdocs/langs/en_US/cashdesk.lang @@ -66,4 +66,5 @@ History=History ValidateAndClose=Validate and close Terminal=Terminal NumberOfTerminals=Number of Terminals -TerminalSelect=Select terminal you want to use: \ No newline at end of file +TerminalSelect=Select terminal you want to use: +POSTicket=POS Ticket \ No newline at end of file From 114ddea54faee666ed9e19062c2eab6ee344992e Mon Sep 17 00:00:00 2001 From: javierybar Date: Tue, 14 May 2019 19:58:08 +0200 Subject: [PATCH 0416/1036] Simplify terminal variables --- htdocs/societe/list.php | 1 - htdocs/takepos/admin/terminal.php | 1 - htdocs/takepos/floors.php | 1 - htdocs/takepos/freezone.php | 1 - htdocs/takepos/invoice.php | 25 ++++++++++++------------- htdocs/takepos/pay.php | 3 +-- htdocs/takepos/receipt.php | 3 +-- htdocs/takepos/takepos.php | 3 --- 8 files changed, 14 insertions(+), 24 deletions(-) diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index c4a9ebf1b94..42584c5621b 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -227,7 +227,6 @@ if ($action=="change") { $idcustomer = GETPOST('idcustomer', 'int'); $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant - $posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS $sql="UPDATE ".MAIN_DB_PREFIX."facture set fk_soc=".$idcustomer." where ref='(PROV-POS-".$place.")'"; $resql = $db->query($sql); diff --git a/htdocs/takepos/admin/terminal.php b/htdocs/takepos/admin/terminal.php index 7085d904891..66a8a90f528 100644 --- a/htdocs/takepos/admin/terminal.php +++ b/htdocs/takepos/admin/terminal.php @@ -58,7 +58,6 @@ if($resql){ } $terminaltouse = $terminal; -if ($terminaltouse == '1') $terminaltouse = ''; /* diff --git a/htdocs/takepos/floors.php b/htdocs/takepos/floors.php index 9401d61b9a0..a2a0f0bc4c0 100644 --- a/htdocs/takepos/floors.php +++ b/htdocs/takepos/floors.php @@ -43,7 +43,6 @@ $left = GETPOST('left', 'alpha'); $top = GETPOST('top', 'alpha'); $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant -$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS $newname = GETPOST('newname', 'alpha'); $mode = GETPOST('mode', 'alpha'); diff --git a/htdocs/takepos/freezone.php b/htdocs/takepos/freezone.php index 64c21a30304..b47d7114528 100644 --- a/htdocs/takepos/freezone.php +++ b/htdocs/takepos/freezone.php @@ -36,7 +36,6 @@ require '../main.inc.php'; // Load $user and permissions $langs->loadLangs(array("bills", "cashdesk")); $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant -$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS $idline = GETPOST('idline', 'int'); $action = GETPOST('action', 'alpha'); diff --git a/htdocs/takepos/invoice.php b/htdocs/takepos/invoice.php index 7645ef176c5..510b949b92b 100644 --- a/htdocs/takepos/invoice.php +++ b/htdocs/takepos/invoice.php @@ -43,7 +43,6 @@ $id = GETPOST('id', 'int'); $action = GETPOST('action', 'alpha'); $idproduct = GETPOST('idproduct', 'int'); $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant -$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS /** * Abort invoice creationg with a given error message @@ -90,7 +89,7 @@ if ($invoiceid > 0) } else { - $ret = $invoice->fetch('', '(PROV-POS'.$_SESSION["takepostermvar"].'-'.$place.')'); + $ret = $invoice->fetch('', '(PROV-POS'.$_SESSION["takeposterminal"].'-'.$place.')'); } if ($ret > 0) { @@ -104,12 +103,12 @@ if ($ret > 0) if ($action == 'valid' && $user->rights->facture->creer) { - if ($pay == "cash") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takepostermvar"]}; // For backward compatibility - elseif ($pay == "card") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$_SESSION["takepostermvar"]}; // For backward compatibility - elseif ($pay == "cheque") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takepostermvar"]}; // For backward compatibility + if ($pay == "cash") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CASH'.$_SESSION["takeposterminal"]}; // For backward compatibility + elseif ($pay == "card") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CB'.$_SESSION["takeposterminal"]}; // For backward compatibility + elseif ($pay == "cheque") $bankaccount = $conf->global->{'CASHDESK_ID_BANKACCOUNT_CHEQUE'.$_SESSION["takeposterminal"]}; // For backward compatibility else { - $accountname="CASHDESK_ID_BANKACCOUNT_".$pay.$_SESSION["takepostermvar"]; + $accountname="CASHDESK_ID_BANKACCOUNT_".$pay.$_SESSION["takeposterminal"]; $bankaccount=$conf->global->$accountname; } $now=dol_now(); @@ -137,9 +136,9 @@ if ($action == 'valid' && $user->rights->facture->creer) $invoice->update($user); } - if (! empty($conf->stock->enabled) && $conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$_SESSION["takepostermvar"]} != "1") + if (! empty($conf->stock->enabled) && $conf->global->{'CASHDESK_NO_DECREASE_STOCK'.$_SESSION["takeposterminal"]} != "1") { - $invoice->validate($user, '', $conf->global->{'CASHDESK_ID_WAREHOUSE'.$_SESSION["takepostermvar"]}); + $invoice->validate($user, '', $conf->global->{'CASHDESK_ID_WAREHOUSE'.$_SESSION["takeposterminal"]}); } else { @@ -180,13 +179,13 @@ if ($action == 'history') if (($action=="addline" || $action=="freezone") && $placeid == 0) { - $invoice->socid = $conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takepostermvar"]}; + $invoice->socid = $conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takeposterminal"]}; $invoice->date = dol_now(); $invoice->module_source = 'takepos'; - $invoice->pos_source = (string) $posnb; + $invoice->pos_source = $_SESSION["takeposterminal"]; $placeid = $invoice->create($user); - $sql="UPDATE ".MAIN_DB_PREFIX."facture set ref='(PROV-POS".$_SESSION["takepostermvar"]."-".$place.")' where rowid=".$placeid; + $sql="UPDATE ".MAIN_DB_PREFIX."facture set ref='(PROV-POS".$_SESSION["takeposterminal"]."-".$place.")' where rowid=".$placeid; $db->query($sql); } @@ -559,11 +558,11 @@ else { // No invoice generated yet print ''; -if ($invoice->socid != $conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takepostermvar"]}) +if ($invoice->socid != $conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takeposterminal"]}) { $soc = new Societe($db); if ($invoice->socid > 0) $soc->fetch($invoice->socid); - else $soc->fetch($conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takepostermvar"]}); + else $soc->fetch($conf->global->{'CASHDESK_ID_THIRDPARTY'.$_SESSION["takeposterminal"]}); print '

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

'; diff --git a/htdocs/takepos/pay.php b/htdocs/takepos/pay.php index 74af8f62ae9..37676f1b1e1 100644 --- a/htdocs/takepos/pay.php +++ b/htdocs/takepos/pay.php @@ -35,7 +35,6 @@ require '../main.inc.php'; // Load $user and permissions require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant -$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS $invoiceid = GETPOST('invoiceid', 'int'); @@ -51,7 +50,7 @@ if ($invoiceid > 0) } else { - $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS".$_SESSION["takepostermvar"]."-".$place.")'"; + $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS".$_SESSION["takeposterminal"]."-".$place.")'"; $resql = $db->query($sql); $obj = $db->fetch_object($resql); if ($obj) diff --git a/htdocs/takepos/receipt.php b/htdocs/takepos/receipt.php index c80b3b5b932..5905592607c 100644 --- a/htdocs/takepos/receipt.php +++ b/htdocs/takepos/receipt.php @@ -31,7 +31,6 @@ include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; $langs->loadLangs(array("main", "cashdesk")); $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant -$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS $facid=GETPOST('facid', 'int'); @@ -44,7 +43,7 @@ top_httphead('text/html'); if ($place > 0) { - $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS".$_SESSION["takepostermvar"]."-".$place.")'"; + $sql="SELECT rowid FROM ".MAIN_DB_PREFIX."facture where ref='(PROV-POS".$_SESSION["takeposterminal"]."-".$place.")'"; $resql = $db->query($sql); $obj = $db->fetch_object($resql); if ($obj) diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index f5de960223d..9601c6d0f36 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -39,15 +39,12 @@ require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; $place = (GETPOST('place', 'int') > 0 ? GETPOST('place', 'int') : 0); // $place is id of table for Ba or Restaurant -$posnb = (GETPOST('posnb', 'int') > 0 ? GETPOST('posnb', 'int') : 0); // $posnb is id of POS $action = GETPOST('action', 'alpha'); $setterminal = GETPOST('setterminal', 'int'); if ($setterminal>0) { $_SESSION["takeposterminal"]=$setterminal; - if ($setterminal==1) $_SESSION["takepostermvar"]=""; - else $_SESSION["takepostermvar"]=$setterminal; } $langs->loadLangs(array("bills","orders","commercial","cashdesk","receiptprinter")); From 710e2085e67c1e6150d15da02d9cd11f40ff8791 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 11:55:07 +0200 Subject: [PATCH 0417/1036] Fix editorconfig --- .editorconfig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3c4bd7d679d..d00183bc073 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,8 @@ -# EditorConfig is awesome: http://EditorConfig.org +# EditorConfig is awesome: https://editorconfig.org # top-most EditorConfig file root = true + # Unix-style newlines with a newline ending every file [*] charset = utf-8 @@ -11,9 +12,10 @@ insert_final_newline = true # PHP PSR-2 Coding Standards # http://www.php-fig.org/psr/psr-2/ [*.php] -indent_style = space +indent_style = tab # An exception of PSR2 indent_size = 4 trim_trailing_whitespace = true +insert_final_newline = true [*.js] indent_style = tab [*.css] From f123f9951f9ab7c1c1b1ccb919835c33d493e695 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 15 May 2019 12:16:03 +0200 Subject: [PATCH 0418/1036] NEW Add OpenConcerto export format --- .../class/accountancyexport.class.php | 43 +++++++++++++++++++ htdocs/langs/en_US/accountancy.lang | 3 +- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index 344a45f19fc..b9339a8150b 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -50,6 +50,7 @@ class AccountancyExport public static $EXPORT_TYPE_COGILOG = 8; public static $EXPORT_TYPE_AGIRIS = 9; public static $EXPORT_TYPE_FEC = 11; + public static $EXPORT_TYPE_OPENCONCERTO = 12; /** @@ -103,6 +104,7 @@ class AccountancyExport self::$EXPORT_TYPE_EBP => $langs->trans('Modelcsv_ebp'), self::$EXPORT_TYPE_COGILOG => $langs->trans('Modelcsv_cogilog'), self::$EXPORT_TYPE_AGIRIS => $langs->trans('Modelcsv_agiris'), + self::$EXPORT_TYPE_OPENCONCERTO => $langs->trans('Modelcsv_openconcerto'), self::$EXPORT_TYPE_FEC => $langs->trans('Modelcsv_FEC'), ); } @@ -126,6 +128,7 @@ class AccountancyExport self::$EXPORT_TYPE_EBP => 'ebp', self::$EXPORT_TYPE_COGILOG => 'cogilog', self::$EXPORT_TYPE_AGIRIS => 'agiris', + self::$EXPORT_TYPE_OPENCONCERTO => 'openconcerto', self::$EXPORT_TYPE_FEC => 'fec', ); @@ -187,6 +190,10 @@ class AccountancyExport 'label' => $langs->trans('Modelcsv_FEC'), 'ACCOUNTING_EXPORT_FORMAT' => 'txt', ), + self::$EXPORT_TYPE_OPENCONCERTO => array( + 'label' => $langs->trans('Modelcsv_openconcerto'), + 'ACCOUNTING_EXPORT_FORMAT' => 'csv', + ), ), 'cr'=> array ( '1' => $langs->trans("Unix"), @@ -248,6 +255,9 @@ class AccountancyExport case self::$EXPORT_TYPE_AGIRIS : $this->exportAgiris($TData); break; + case self::$EXPORT_TYPE_OPENCONCERTO : + $this->exportOpenConcerto($TData); + break; case self::$EXPORT_TYPE_FEC : $this->exportFEC($TData); break; @@ -588,6 +598,39 @@ class AccountancyExport } } + /** + * Export format : OpenConcerto + * + * @param array $objectLines data + * + * @return void + */ + public function exportOpenConcerto($objectLines) + { + + $separator = ';'; + $end_line = "\n"; + + foreach ($objectLines as $line) { + + $date = dol_print_date($line->doc_date, '%d/%m/%Y'); + + print $date . $separator; + print $line->code_journal; + if (empty($line->subledger_account)) { + print length_accountg($line->numero_compte) . $separator; + } else { + print length_accounta($line->subledger_account) . $separator; + } + print $line->doc_ref . $separator; + print $line->label_operation . $separator; + print price($line->debit) . $separator; + print price($line->credit) . $separator; + + print $end_line; + } + } + /** * Export format : Configurable * diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index c441d71ef3d..25b8f8d11aa 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -289,8 +289,9 @@ Modelcsv_quadratus=Export for Quadratus QuadraCompta Modelcsv_ebp=Export for EBP Modelcsv_cogilog=Export for Cogilog Modelcsv_agiris=Export for Agiris +Modelcsv_openconcerto=Export for OpenConcerto (Test) Modelcsv_configurable=Export CSV Configurable -Modelcsv_FEC=Export FEC (Art. L47 A) (Test) +Modelcsv_FEC=Export FEC (Art. L47 A) ChartofaccountsId=Chart of accounts Id ## Tools - Init accounting account on product / service From f94b9e5a12799975cca486f7499be4da51a37e93 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 12:46:55 +0200 Subject: [PATCH 0419/1036] Fix editorconfig --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index d00183bc073..3e3bd16bb34 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,7 +12,7 @@ insert_final_newline = true # PHP PSR-2 Coding Standards # http://www.php-fig.org/psr/psr-2/ [*.php] -indent_style = tab # An exception of PSR2 +indent_style = tab indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true From a9b374800699211fcd96eecb4011d9ebaeeced14 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 13:20:02 +0200 Subject: [PATCH 0420/1036] __DIR__ was not replaced into scripts dir --- scripts/bank/export-bank-receipts.php | 528 ++++++++---------- .../company/export-contacts-xls-example.php | 87 ++- .../company/sync_contacts_dolibarr2ldap.php | 137 +++-- .../email_expire_services_to_customers.php | 448 +++++++-------- ...ail_expire_services_to_representatives.php | 382 ++++++------- scripts/cron/cron_run_jobs.php | 253 ++++----- scripts/emailings/mailing-send.php | 431 +++++++------- .../email_unpaid_invoices_to_customers.php | 430 +++++++------- ...ail_unpaid_invoices_to_representatives.php | 365 ++++++------ scripts/invoices/rebuild_merge_pdf.php | 344 +++++------- .../members/sync_members_dolibarr2ldap.php | 148 +++-- .../members/sync_members_ldap2dolibarr.php | 361 +++++------- .../sync_members_types_dolibarr2ldap.php | 109 ++-- .../sync_members_types_ldap2dolibarr.php | 200 +++---- scripts/modulebuilder/builddoc.php | 91 ++- scripts/modulebuilder/initmodule.php | 169 +++--- scripts/product/migrate_picture_path.php | 140 ++--- scripts/product/regenerate_thumbs.php | 88 ++- scripts/user/sync_groups_dolibarr2ldap.php | 97 ++-- scripts/user/sync_groups_ldap2dolibarr.php | 230 ++++---- scripts/user/sync_users_dolibarr2ldap.php | 97 ++-- scripts/user/sync_users_ldap2dolibarr.php | 349 ++++++------ scripts/withdrawals/build_withdrawal_file.php | 54 +- 23 files changed, 2523 insertions(+), 3015 deletions(-) diff --git a/scripts/bank/export-bank-receipts.php b/scripts/bank/export-bank-receipts.php index f1654b92d2a..1fb0058610a 100755 --- a/scripts/bank/export-bank-receipts.php +++ b/scripts/bank/export-bank-receipts.php @@ -1,7 +1,7 @@ #!/usr/bin/env php + * Copyright (C) 2013 Laurent Destailleur * * 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 @@ -10,7 +10,7 @@ * * 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 + * 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 @@ -18,200 +18,160 @@ */ /** - * \file scripts/bank/export-bank-receipts.php - * \ingroup bank - * \brief Script file to export bank receipts into Excel files + * \file scripts/bank/export-bank-receipts.php + * \ingroup bank + * \brief Script file to export bank receipts into Excel files */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; -require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php'; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/bank.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/sociales/class/chargesociales.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT . '/fourn/class/paiementfourn.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT . '/compta/sociales/class/paymentsocialcontribution.class.php'; // Global variables -$version=DOL_VERSION; -$error=0; - - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); if (! isset($argv[3]) || ! $argv[3]) { - print "Usage: ".$script_file." bank_ref [bank_receipt_number|all] (csv|tsv|excel|excel2007) [lang=xx_XX]\n"; - exit(-1); + print "Usage: " . $script_file . " bank_ref [bank_receipt_number|all] (csv|tsv|excel|excel2007) [lang=xx_XX]\n"; + exit(- 1); } -$bankref=$argv[1]; -$num=$argv[2]; -$model=$argv[3]; -$newlangid='en_EN'; // To force a new lang id - - -$invoicestatic=new Facture($db); -$invoicesupplierstatic=new FactureFournisseur($db); -$societestatic=new Societe($db); -$chargestatic=new ChargeSociales($db); -$memberstatic=new Adherent($db); -$paymentstatic=new Paiement($db); -$paymentsupplierstatic=new PaiementFourn($db); -$paymentsocialcontributionstatic=new PaymentSocialContribution($db); -$paymentvatstatic=new Tva($db); -$bankstatic=new Account($db); -$banklinestatic=new AccountLine($db); +$bankref = $argv[1]; +$num = $argv[2]; +$model = $argv[3]; +$newlangid = 'en_EN'; // To force a new lang id +$invoicestatic = new Facture($db); +$invoicesupplierstatic = new FactureFournisseur($db); +$societestatic = new Societe($db); +$chargestatic = new ChargeSociales($db); +$memberstatic = new Adherent($db); +$paymentstatic = new Paiement($db); +$paymentsupplierstatic = new PaiementFourn($db); +$paymentsocialcontributionstatic = new PaymentSocialContribution($db); +$paymentvatstatic = new Tva($db); +$bankstatic = new Account($db); +$banklinestatic = new AccountLine($db); // Parse parameters -foreach ($argv as $key => $value) -{ - $found=false; +foreach ($argv as $key => $value) { + $found = false; // Define options - if (preg_match('/^lang=/i', $value)) - { - $found=true; - $valarray=explode('=', $value); - $newlangid=$valarray[1]; - print 'Use language '.$newlangid.".\n"; + if (preg_match('/^lang=/i', $value)) { + $found = true; + $valarray = explode('=', $value); + $newlangid = $valarray[1]; + print 'Use language ' . $newlangid . ".\n"; } } $outputlangs = $langs; -if (! empty($newlangid)) -{ - if ($outputlangs->defaultlang != $newlangid) - { +if (! empty($newlangid)) { + if ($outputlangs->defaultlang != $newlangid) { $outputlangs = new Translate("", $conf); $outputlangs->setDefaultLang($newlangid); } } // Load translation files required by the page -$outputlangs->loadLangs(array("main", "companies", "bills", "banks", "members", "compta")); +$outputlangs->loadLangs(array("main","companies","bills","banks","members","compta")); -$acct=new Account($db); -$result=$acct->fetch('', $bankref); -if ($result <= 0) -{ - print "Failed to find bank account with ref ".$bankref.".\n"; - exit(-1); +$acct = new Account($db); +$result = $acct->fetch('', $bankref); +if ($result <= 0) { + print "Failed to find bank account with ref " . $bankref . ".\n"; + exit(- 1); +} else { + print "Export for bank account " . $acct->ref . " (" . $acct->label . ").\n"; } -else -{ - print "Export for bank account ".$acct->ref." (".$acct->label.").\n"; -} - // Creation de la classe d'export du model ExportXXX $dir = DOL_DOCUMENT_ROOT . "/core/modules/export/"; -$file = "export_".$model.".modules.php"; -$classname = "Export".$model; -if (! dol_is_file($dir.$file)) -{ - print "No driver to export with format ".$model."\n"; - exit(-1); +$file = "export_" . $model . ".modules.php"; +$classname = "Export" . $model; +if (! dol_is_file($dir . $file)) { + print "No driver to export with format " . $model . "\n"; + exit(- 1); } -require_once $dir.$file; +require_once $dir . $file; $objmodel = new $classname($db); - // Define target path $dirname = $conf->bank->dir_temp; -$filename = 'export-bank-receipts-'.$bankref.'-'.$num.'.'.$objmodel->extension; - - -$array_fields=array( -'bankreceipt'=>$outputlangs->transnoentitiesnoconv("AccountStatementShort"), 'bankaccount'=>$outputlangs->transnoentitiesnoconv("BankAccount"), -'dateop'=>$outputlangs->transnoentitiesnoconv("DateOperationShort"),'dateval'=>$outputlangs->transnoentitiesnoconv("DateValueShort"),'type'=>$outputlangs->transnoentitiesnoconv("Type"), -'description'=>$outputlangs->transnoentitiesnoconv("Description"), 'thirdparty'=>$outputlangs->transnoentitiesnoconv("Tiers"), 'accountelem'=>$outputlangs->transnoentitiesnoconv("Piece"), -'debit'=>$outputlangs->transnoentitiesnoconv("Debit"), 'credit'=>$outputlangs->transnoentitiesnoconv("Credit"), -'soldbefore'=>$outputlangs->transnoentitiesnoconv("BankBalanceBefore"), 'soldafter'=>$outputlangs->transnoentitiesnoconv("BankBalanceAfter"), -'comment'=>$outputlangs->transnoentitiesnoconv("Comment") -); -$array_selected=array( -'bankreceipt'=>'bankreceipt', 'bankaccount'=>'bankaccount', -'dateop'=>'dateop','dateval'=>'dateval','type'=>'type', -'description'=>'description', 'thirdparty'=>'thirdparty', 'accountelem'=>'accountelem', -'debit'=>'debit', 'credit'=>'credit', -'soldbefore'=>'soldbefore','soldafter'=>'soldafter', -'comment'=>'comment' -); -$array_export_TypeFields=array( -'bankreceipt'=>'Text', 'bankaccount'=>'Text', -'dateop'=>'Date','dateval'=>'Date','type'=>'Text', -'description'=>'Text', 'thirdparty'=>'Text', 'accountelem'=>'Text', -'debit'=>'Number', 'credit'=>'Number', -'soldbefore'=>'Number','soldafter'=>'Number', -'comment'=>'Text' -); +$filename = 'export-bank-receipts-' . $bankref . '-' . $num . '.' . $objmodel->extension; +$array_fields = array('bankreceipt' => $outputlangs->transnoentitiesnoconv("AccountStatementShort"),'bankaccount' => $outputlangs->transnoentitiesnoconv("BankAccount"),'dateop' => $outputlangs->transnoentitiesnoconv("DateOperationShort"),'dateval' => $outputlangs->transnoentitiesnoconv("DateValueShort"),'type' => $outputlangs->transnoentitiesnoconv("Type"),'description' => $outputlangs->transnoentitiesnoconv("Description"),'thirdparty' => $outputlangs->transnoentitiesnoconv("Tiers"),'accountelem' => $outputlangs->transnoentitiesnoconv("Piece"),'debit' => $outputlangs->transnoentitiesnoconv("Debit"),'credit' => $outputlangs->transnoentitiesnoconv("Credit"),'soldbefore' => $outputlangs->transnoentitiesnoconv("BankBalanceBefore"),'soldafter' => $outputlangs->transnoentitiesnoconv("BankBalanceAfter"),'comment' => $outputlangs->transnoentitiesnoconv("Comment")); +$array_selected = array('bankreceipt' => 'bankreceipt','bankaccount' => 'bankaccount','dateop' => 'dateop','dateval' => 'dateval','type' => 'type','description' => 'description','thirdparty' => 'thirdparty','accountelem' => 'accountelem','debit' => 'debit','credit' => 'credit','soldbefore' => 'soldbefore','soldafter' => 'soldafter','comment' => 'comment'); +$array_export_TypeFields = array('bankreceipt' => 'Text','bankaccount' => 'Text','dateop' => 'Date','dateval' => 'Date','type' => 'Text','description' => 'Text','thirdparty' => 'Text','accountelem' => 'Text','debit' => 'Number','credit' => 'Number','soldbefore' => 'Number','soldafter' => 'Number','comment' => 'Text'); // Build request to find records for a bank account/receipt -$listofnum=""; -if (! empty($num) && $num != "all") -{ - $listofnum.="'"; - $arraynum=explode(',', $num); - foreach($arraynum as $val) - { - if ($listofnum != "'") $listofnum.="','"; - $listofnum.=$val; +$listofnum = ""; +if (! empty($num) && $num != "all") { + $listofnum .= "'"; + $arraynum = explode(',', $num); + foreach ($arraynum as $val) { + if ($listofnum != "'") + $listofnum .= "','"; + $listofnum .= $val; } - $listofnum.="'"; + $listofnum .= "'"; } $sql = "SELECT b.rowid, b.dateo as do, b.datev as dv,"; -$sql.= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,"; -$sql.= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel"; -$sql.= " FROM ".MAIN_DB_PREFIX."bank_account as ba"; -$sql.= ", ".MAIN_DB_PREFIX."bank as b"; -$sql.= " WHERE b.fk_account = ".$acct->id; -if ($listofnum) $sql.= " AND b.num_releve IN (".$listofnum.")"; -if (!isset($num)) $sql.= " OR b.num_releve is null"; -$sql.= " AND b.fk_account = ba.rowid"; -$sql.= $db->order("b.num_releve, b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day -//print $sql; +$sql .= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,"; +$sql .= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel"; +$sql .= " FROM " . MAIN_DB_PREFIX . "bank_account as ba"; +$sql .= ", " . MAIN_DB_PREFIX . "bank as b"; +$sql .= " WHERE b.fk_account = " . $acct->id; +if ($listofnum) + $sql .= " AND b.num_releve IN (" . $listofnum . ")"; +if (! isset($num)) + $sql .= " OR b.num_releve is null"; +$sql .= " AND b.fk_account = ba.rowid"; +$sql .= $db->order("b.num_releve, b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day + // print $sql; -$resql=$db->query($sql); -if ($resql) -{ - $balancebefore=array(); +$resql = $db->query($sql); +if ($resql) { + $balancebefore = array(); $numrows = $db->num_rows($resql); - if ($numrows > 0) - { + if ($numrows > 0) { // Open file - print 'Open file '.$filename.' into directory '.$dirname."\n"; + print 'Open file ' . $filename . ' into directory ' . $dirname . "\n"; dol_mkdir($dirname); - $result=$objmodel->open_file($dirname."/".$filename, $outputlangs); + $result = $objmodel->open_file($dirname . "/" . $filename, $outputlangs); - if ($result < 0) - { - print 'Failed to create file '.$filename.' into dir '.$dirname.'.'."\n"; - return -1; + if ($result < 0) { + print 'Failed to create file ' . $filename . ' into dir ' . $dirname . '.' . "\n"; + return - 1; } // Genere en-tete @@ -221,35 +181,30 @@ if ($resql) $objmodel->write_title($array_fields, $array_selected, $outputlangs, $array_export_TypeFields); } - $i=0; - while ($i < $numrows) - { - $thirdparty=''; - $accountelem=''; - $comment=''; + $i = 0; + while ($i < $numrows) { + $thirdparty = ''; + $accountelem = ''; + $comment = ''; $objp = $db->fetch_object($resql); // Calculate start balance - if (! isset($balancebefore[$objp->num_releve])) - { - print 'Calculate start balance for receipt '.$objp->num_releve."\n"; + if (! isset($balancebefore[$objp->num_releve])) { + print 'Calculate start balance for receipt ' . $objp->num_releve . "\n"; $sql2 = "SELECT sum(b.amount) as amount"; - $sql2.= " FROM ".MAIN_DB_PREFIX."bank as b"; - $sql2.= " WHERE b.num_releve < '".$db->escape($objp->num_releve)."'"; - $sql2.= " AND b.fk_account = ".$objp->bankid; - $resql2=$db->query($sql2); - if ($resql2) - { - $obj2=$db->fetch_object($resql2); - $balancebefore[$objp->num_releve] = ($obj2->amount?$obj2->amount:0); + $sql2 .= " FROM " . MAIN_DB_PREFIX . "bank as b"; + $sql2 .= " WHERE b.num_releve < '" . $db->escape($objp->num_releve) . "'"; + $sql2 .= " AND b.fk_account = " . $objp->bankid; + $resql2 = $db->query($sql2); + if ($resql2) { + $obj2 = $db->fetch_object($resql2); + $balancebefore[$objp->num_releve] = ($obj2->amount ? $obj2->amount : 0); $db->free($resql2); - } - else - { + } else { dol_print_error($db); - exit(-1); + exit(- 1); } $total = $balancebefore[$objp->num_releve]; @@ -258,168 +213,153 @@ if ($resql) $totalbefore = $total; $total = $total + $objp->amount; - - // Date operation - $dateop=$db->jdate($objp->do); + $dateop = $db->jdate($objp->do); // Date de valeur - $datevalue=$db->jdate($objp->dv); + $datevalue = $db->jdate($objp->dv); // Num cheque - $numchq=($objp->num_chq?$objp->num_chq:''); + $numchq = ($objp->num_chq ? $objp->num_chq : ''); // Libelle - $reg=array(); - preg_match('/\((.+)\)/i', $objp->label, $reg); // Si texte entoure de parenthese on tente recherche de traduction - if ($reg[1] && $langs->transnoentitiesnoconv($reg[1])!=$reg[1]) $description=$langs->transnoentitiesnoconv($reg[1]); - else $description=$objp->label; + $reg = array(); + preg_match('/\((.+)\)/i', $objp->label, $reg); // Si texte entoure de parenthese on tente recherche de traduction + if ($reg[1] && $langs->transnoentitiesnoconv($reg[1]) != $reg[1]) + $description = $langs->transnoentitiesnoconv($reg[1]); + else + $description = $objp->label; /* * Ajout les liens (societe, company...) */ $links = $acct->get_url($objp->rowid); - foreach($links as $key=>$val) - { - if ($links[$key]['type']=='payment') - { + foreach ($links as $key => $val) { + if ($links[$key]['type'] == 'payment') { $paymentstatic->fetch($links[$key]['url_id']); - $tmparray=$paymentstatic->getBillsArray(''); - if (is_array($tmparray)) - { - foreach($tmparray as $key => $val) - { + $tmparray = $paymentstatic->getBillsArray(''); + if (is_array($tmparray)) { + foreach ($tmparray as $key => $val) { $invoicestatic->fetch($val); - if ($accountelem) $accountelem.= ', '; - $accountelem.=$invoicestatic->ref; + if ($accountelem) + $accountelem .= ', '; + $accountelem .= $invoicestatic->ref; } } - } - elseif ($links[$key]['type']=='payment_supplier') - { + } elseif ($links[$key]['type'] == 'payment_supplier') { $paymentsupplierstatic->fetch($links[$key]['url_id']); - $tmparray=$paymentsupplierstatic->getBillsArray(''); - if (is_array($tmparray)) - { - foreach($tmparray as $key => $val) - { + $tmparray = $paymentsupplierstatic->getBillsArray(''); + if (is_array($tmparray)) { + foreach ($tmparray as $key => $val) { $invoicesupplierstatic->fetch($val); - if ($accountelem) $accountelem.= ', '; - $accountelem.=$invoicesupplierstatic->ref; + if ($accountelem) + $accountelem .= ', '; + $accountelem .= $invoicesupplierstatic->ref; } } - } - elseif ($links[$key]['type']=='payment_sc') - { + } elseif ($links[$key]['type'] == 'payment_sc') { $paymentsocialcontributionstatic->fetch($links[$key]['url_id']); - if ($accountelem) $accountelem.= ', '; - $accountelem.=$langs->transnoentitiesnoconv("SocialContribution").' '.$paymentsocialcontributionstatic->ref; - } - elseif ($links[$key]['type']=='payment_vat') - { + if ($accountelem) + $accountelem .= ', '; + $accountelem .= $langs->transnoentitiesnoconv("SocialContribution") . ' ' . $paymentsocialcontributionstatic->ref; + } elseif ($links[$key]['type'] == 'payment_vat') { $paymentvatstatic->fetch($links[$key]['url_id']); - if ($accountelem) $accountelem.= ', '; - $accountelem.=$langs->transnoentitiesnoconv("VATPayments").' '.$paymentvatstatic->ref; - } - elseif ($links[$key]['type']=='banktransfert') - { - $comment=$outputlangs->transnoentitiesnoconv("Transfer"); - if ($objp->amount > 0) - { - if ($comment) $comment.= ' '; + if ($accountelem) + $accountelem .= ', '; + $accountelem .= $langs->transnoentitiesnoconv("VATPayments") . ' ' . $paymentvatstatic->ref; + } elseif ($links[$key]['type'] == 'banktransfert') { + $comment = $outputlangs->transnoentitiesnoconv("Transfer"); + if ($objp->amount > 0) { + if ($comment) + $comment .= ' '; $banklinestatic->fetch($links[$key]['url_id']); - $bankstatic->id=$banklinestatic->fk_account; - $bankstatic->label=$banklinestatic->bank_account_label; - $comment.= ' ('.$langs->transnoentitiesnoconv("from").' '; - $comment.= $bankstatic->getNomUrl(1, 'transactions'); - $comment.= ' '.$langs->transnoentitiesnoconv("toward").' '; - $bankstatic->id=$objp->bankid; - $bankstatic->label=$objp->bankref; - $comment.= $bankstatic->getNomUrl(1, ''); - $comment.= ')'; - } - else - { - if ($comment) $comment.= ' '; - $bankstatic->id=$objp->bankid; - $bankstatic->label=$objp->bankref; - $comment.= ' ('.$langs->transnoentitiesnoconv("from").' '; - $comment.= $bankstatic->getNomUrl(1, ''); - $comment.= ' '.$langs->transnoentitiesnoconv("toward").' '; + $bankstatic->id = $banklinestatic->fk_account; + $bankstatic->label = $banklinestatic->bank_account_label; + $comment .= ' (' . $langs->transnoentitiesnoconv("from") . ' '; + $comment .= $bankstatic->getNomUrl(1, 'transactions'); + $comment .= ' ' . $langs->transnoentitiesnoconv("toward") . ' '; + $bankstatic->id = $objp->bankid; + $bankstatic->label = $objp->bankref; + $comment .= $bankstatic->getNomUrl(1, ''); + $comment .= ')'; + } else { + if ($comment) + $comment .= ' '; + $bankstatic->id = $objp->bankid; + $bankstatic->label = $objp->bankref; + $comment .= ' (' . $langs->transnoentitiesnoconv("from") . ' '; + $comment .= $bankstatic->getNomUrl(1, ''); + $comment .= ' ' . $langs->transnoentitiesnoconv("toward") . ' '; $banklinestatic->fetch($links[$key]['url_id']); - $bankstatic->id=$banklinestatic->fk_account; - $bankstatic->label=$banklinestatic->bank_account_label; - $comment.= $bankstatic->getNomUrl(1, 'transactions'); - $comment.= ')'; + $bankstatic->id = $banklinestatic->fk_account; + $bankstatic->label = $banklinestatic->bank_account_label; + $comment .= $bankstatic->getNomUrl(1, 'transactions'); + $comment .= ')'; } + } elseif ($links[$key]['type'] == 'company') { + if ($thirdparty) + $thirdparty .= ', '; + $thirdparty .= dol_trunc($links[$key]['label'], 24); + $newline = 0; + } elseif ($links[$key]['type'] == 'member') { + if ($thirdparty) + $accountelem .= ', '; + $thirdparty .= $links[$key]['label']; + $newline = 0; } - elseif ($links[$key]['type']=='company') - { - if ($thirdparty) $thirdparty.= ', '; - $thirdparty.= dol_trunc($links[$key]['label'], 24); - $newline=0; - } - elseif ($links[$key]['type']=='member') - { - if ($thirdparty) $accountelem.= ', '; - $thirdparty.= $links[$key]['label']; - $newline=0; - } - /*elseif ($links[$key]['type']=='sc') - { - if ($accountelem) $accountelem.= ', '; - //$accountelem.= ''; - //$accountelem.= img_object($langs->transnoentitiesnoconv('ShowBill'),'bill').' '; - $accountelem.= $langs->transnoentitiesnoconv("SocialContribution"); - //$accountelem.= ''; - $newline=0; - } - else - { - if ($accountelem) $accountelem.= ', '; - //$accountelem.= ''; - $accountelem.= $links[$key]['label']; - //$accountelem.= ''; - $newline=0; - }*/ + /* + * elseif ($links[$key]['type']=='sc') + * { + * if ($accountelem) $accountelem.= ', '; + * //$accountelem.= ''; + * //$accountelem.= img_object($langs->transnoentitiesnoconv('ShowBill'),'bill').' '; + * $accountelem.= $langs->transnoentitiesnoconv("SocialContribution"); + * //$accountelem.= ''; + * $newline=0; + * } + * else + * { + * if ($accountelem) $accountelem.= ', '; + * //$accountelem.= ''; + * $accountelem.= $links[$key]['label']; + * //$accountelem.= ''; + * $newline=0; + * } + */ } - $debit=$credit=''; - if ($objp->amount < 0) - { + $debit = $credit = ''; + if ($objp->amount < 0) { $totald = $totald + abs($objp->amount); - $debit=price2num($objp->amount * -1); - } - else - { + $debit = price2num($objp->amount * - 1); + } else { $totalc = $totalc + abs($objp->amount); - $credit=price2num($objp->amount); + $credit = price2num($objp->amount); } - $i++; + $i ++; - $rec=new stdClass(); - $rec->bankreceipt=$objp->num_releve; - $rec->bankaccount=$objp->banklabel; - $rec->dateop=dol_print_date($dateop, 'dayrfc'); - $rec->dateval=dol_print_date($datevalue, 'dayrfc'); - $rec->type=$objp->fk_type.' '.($objp->num_chq?$objp->num_chq:''); - $rec->description=$description; - $rec->thirdparty=$thirdparty; - $rec->accountelem=$accountelem; - $rec->debit=$debit; - $rec->credit=$credit; - $rec->comment=$comment; - $rec->soldbefore=price2num($totalbefore); - $rec->soldafter=price2num($total); + $rec = new stdClass(); + $rec->bankreceipt = $objp->num_releve; + $rec->bankaccount = $objp->banklabel; + $rec->dateop = dol_print_date($dateop, 'dayrfc'); + $rec->dateval = dol_print_date($datevalue, 'dayrfc'); + $rec->type = $objp->fk_type . ' ' . ($objp->num_chq ? $objp->num_chq : ''); + $rec->description = $description; + $rec->thirdparty = $thirdparty; + $rec->accountelem = $accountelem; + $rec->debit = $debit; + $rec->credit = $credit; + $rec->comment = $comment; + $rec->soldbefore = price2num($totalbefore); + $rec->soldafter = price2num($total); // end of special operation processing $objmodel->write_record($array_selected, $rec, $outputlangs, $array_export_TypeFields); } - if ($numrows > 0) - { - print "Found ".$numrows." records for receipt ".$num."\n"; + if ($numrows > 0) { + print "Found " . $numrows . " records for receipt " . $num . "\n"; // Genere en-tete $objmodel->write_footer($outputlangs); @@ -427,21 +367,17 @@ if ($resql) // Close file $objmodel->close_file(); - print 'File '.$filename.' was generated into dir '.$dirname.'.'."\n"; + print 'File ' . $filename . ' was generated into dir ' . $dirname . '.' . "\n"; - $ret=0; - } - else - { - print "No records found for receipt ".$num."\n"; + $ret = 0; + } else { + print "No records found for receipt " . $num . "\n"; - $ret=0; + $ret = 0; } -} -else -{ +} else { dol_print_error($db); - $ret=-1; + $ret = - 1; } $db->close(); diff --git a/scripts/company/export-contacts-xls-example.php b/scripts/company/export-contacts-xls-example.php index 1850cbece74..856496c0842 100755 --- a/scripts/company/export-contacts-xls-example.php +++ b/scripts/company/export-contacts-xls-example.php @@ -1,8 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2009-2013 Laurent Destailleur + * Copyright (C) 2004 Rodolphe Quiedeville + * Copyright (C) 2009-2013 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,52 +19,49 @@ */ /** - * \file scripts/company/export-contacts-xls-example.php - * \ingroup company - * \brief Script file to export contacts into an Excel file + * \file scripts/company/export-contacts-xls-example.php + * \ingroup company + * \brief Script file to export contacts into an Excel file */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { print "Usage: $script_file now\n"; - exit(-1); + exit(- 1); } -$now=$argv[1]; +$now = $argv[1]; +require_once $path . "../../htdocs/master.inc.php"; +// require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_workbook.inc.php"; +// require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_worksheet.inc.php"; -require_once $path."../../htdocs/master.inc.php"; -//require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_workbook.inc.php"; -//require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_worksheet.inc.php"; - -require_once PHPEXCEL_PATH."/PHPExcel.php"; -//require_once PHPEXCEL_PATH."/PHPExcel/Writer/Excel2007.php"; -require_once PHPEXCEL_PATH."/PHPExcel/Writer/Excel5.php"; +require_once PHPEXCEL_PATH . "/PHPExcel.php"; +// require_once PHPEXCEL_PATH."/PHPExcel/Writer/Excel2007.php"; +require_once PHPEXCEL_PATH . "/PHPExcel/Writer/Excel5.php"; // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); -$fname = DOL_DATA_ROOT.'/export-contacts.xls'; +$fname = DOL_DATA_ROOT . '/export-contacts.xls'; -//$objPHPExcel = new writeexcel_workbook($fname); +// $objPHPExcel = new writeexcel_workbook($fname); $objPHPExcel = new PHPExcel(); $objPHPExcel->getProperties()->setCreator("Dolibarr script"); $objPHPExcel->getProperties()->setLastModifiedBy("Dolibarr script"); @@ -72,23 +69,21 @@ $objPHPExcel->getProperties()->setTitle("Test Document"); $objPHPExcel->getProperties()->setSubject("Test Document"); $objPHPExcel->getProperties()->setDescription("Test document, generated using PHP classes."); - -//$page = &$objPHPExcel->addworksheet('Export Dolibarr'); +// $page = &$objPHPExcel->addworksheet('Export Dolibarr'); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setTitle('Contacts'); -//$page->set_column(0,4,18); // A +// $page->set_column(0,4,18); // A $sql = "SELECT distinct c.lastname, c.firstname, c.email, s.nom as name"; -$sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c"; -$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = c.fk_soc"; +$sql .= " FROM " . MAIN_DB_PREFIX . "socpeople as c"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as s on s.rowid = c.fk_soc"; -$resql=$db->query($sql); -if ($resql) -{ +$resql = $db->query($sql); +if ($resql) { $num = $db->num_rows($resql); - print "Lines ".$num."\n"; + print "Lines " . $num . "\n"; $i = 0; $j = 1; @@ -98,27 +93,25 @@ if ($resql) $objPHPExcel->getActiveSheet()->SetCellValue('C1', $langs->trans("Email")); $objPHPExcel->getActiveSheet()->SetCellValue('D1', $langs->trans("ThirdPart")); - while ($i < $num) - { + while ($i < $num) { $obj = $db->fetch_object($resql); - $objPHPExcel->getActiveSheet()->SetCellValue('A'.($i+2), $obj->firstname); - $objPHPExcel->getActiveSheet()->SetCellValue('B'.($i+2), $obj->lastname); - $objPHPExcel->getActiveSheet()->SetCellValue('C'.($i+2), $obj->email); - $objPHPExcel->getActiveSheet()->SetCellValue('D'.($i+2), $obj->name); + $objPHPExcel->getActiveSheet()->SetCellValue('A' . ($i + 2), $obj->firstname); + $objPHPExcel->getActiveSheet()->SetCellValue('B' . ($i + 2), $obj->lastname); + $objPHPExcel->getActiveSheet()->SetCellValue('C' . ($i + 2), $obj->email); + $objPHPExcel->getActiveSheet()->SetCellValue('D' . ($i + 2), $obj->name); - $j++; - $i++; + $j ++; + $i ++; } } - -//$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); +// $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); $objWriter->save($fname); -//$objPHPExcel->close(); +// $objPHPExcel->close(); -print 'File '.$fname.' was generated.'."\n"; +print 'File ' . $fname . ' was generated.' . "\n"; exit(0); diff --git a/scripts/company/sync_contacts_dolibarr2ldap.php b/scripts/company/sync_contacts_dolibarr2ldap.php index d70ad7d20b3..9ee59e6cada 100755 --- a/scripts/company/sync_contacts_dolibarr2ldap.php +++ b/scripts/company/sync_contacts_dolibarr2ldap.php @@ -1,8 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2006-2009 Laurent Destailleur + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006-2009 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,74 +19,70 @@ */ /** - * \file scripts/company/sync_contacts_dolibarr2ldap.php - * \ingroup ldap company - * \brief Script to update all contacts from Dolibarr into a LDAP database + * \file scripts/company/sync_contacts_dolibarr2ldap.php + * \ingroup ldap company + * \brief Script to update all contacts from Dolibarr into a LDAP database */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } - -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/contact/class/contact.class.php"; -require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/contact/class/contact.class.php"; +require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; // Global variables -$version=DOL_VERSION; -$error=0; -$confirmed=0; - +$version = DOL_VERSION; +$error = 0; +$confirmed = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: $script_file now [-y]\n"; - exit(-1); + print "Usage: $script_file now [-y]\n"; + exit(- 1); } -foreach($argv as $key => $val) -{ - if (preg_match('/-y$/', $val, $reg)) $confirmed=1; +foreach ($argv as $key => $val) { + if (preg_match('/-y$/', $val, $reg)) + $confirmed = 1; } -$now=$argv[1]; +$now = $argv[1]; print "Mails sending disabled (useless in batch mode)\n"; -$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails print "\n"; print "----- Synchronize all records from Dolibarr database:\n"; -print "type=".$conf->db->type."\n"; -print "host=".$conf->db->host."\n"; -print "port=".$conf->db->port."\n"; -print "login=".$conf->db->user."\n"; -//print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons -print "database=".$conf->db->name."\n"; +print "type=" . $conf->db->type . "\n"; +print "host=" . $conf->db->host . "\n"; +print "port=" . $conf->db->port . "\n"; +print "login=" . $conf->db->user . "\n"; +// print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons +print "database=" . $conf->db->name . "\n"; print "\n"; print "----- To LDAP database:\n"; -print "host=".$conf->global->LDAP_SERVER_HOST."\n"; -print "port=".$conf->global->LDAP_SERVER_PORT."\n"; -print "login=".$conf->global->LDAP_ADMIN_DN."\n"; -print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n"; -print "DN target=".$conf->global->LDAP_CONTACT_DN."\n"; +print "host=" . $conf->global->LDAP_SERVER_HOST . "\n"; +print "port=" . $conf->global->LDAP_SERVER_PORT . "\n"; +print "login=" . $conf->global->LDAP_ADMIN_DN . "\n"; +print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n"; +print "DN target=" . $conf->global->LDAP_CONTACT_DN . "\n"; print "\n"; -if (! $confirmed) -{ +if (! $confirmed) { print "Press a key to confirm...\n"; $input = trim(fgets(STDIN)); print "Warning, this operation may result in data loss if it failed.\n"; @@ -96,28 +92,26 @@ if (! $confirmed) } /* -if (! $conf->global->LDAP_CONTACT_ACTIVE) -{ - print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); - exit(-1); -} -*/ + * if (! $conf->global->LDAP_CONTACT_ACTIVE) + * { + * print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); + * exit(-1); + * } + */ $sql = "SELECT rowid"; -$sql .= " FROM ".MAIN_DB_PREFIX."socpeople"; +$sql .= " FROM " . MAIN_DB_PREFIX . "socpeople"; $resql = $db->query($sql); -if ($resql) -{ +if ($resql) { $num = $db->num_rows($resql); $i = 0; - $ldap=new Ldap(); + $ldap = new Ldap(); $ldap->connect_bind(); - while ($i < $num) - { - $ldap->error=""; + while ($i < $num) { + $ldap->error = ""; $obj = $db->fetch_object($resql); @@ -125,37 +119,32 @@ if ($resql) $contact->id = $obj->rowid; $contact->fetch($contact->id); - print $langs->trans("UpdateContact")." rowid=".$contact->id." ".$contact->getFullName($langs); + print $langs->trans("UpdateContact") . " rowid=" . $contact->id . " " . $contact->getFullName($langs); - $oldobject=$contact; + $oldobject = $contact; - $oldinfo=$oldobject->_load_ldap_info(); - $olddn=$oldobject->_load_ldap_dn($oldinfo); + $oldinfo = $oldobject->_load_ldap_info(); + $olddn = $oldobject->_load_ldap_dn($oldinfo); - $info=$contact->_load_ldap_info(); - $dn=$contact->_load_ldap_dn($info); + $info = $contact->_load_ldap_info(); + $dn = $contact->_load_ldap_dn($info); - $result=$ldap->add($dn, $info, $user); // Wil fail if already exists - $result=$ldap->update($dn, $info, $user, $olddn); - if ($result > 0) - { - print " - ".$langs->trans("OK"); - } - else - { - $error++; - print " - ".$langs->trans("KO").' - '.$ldap->error; + $result = $ldap->add($dn, $info, $user); // Wil fail if already exists + $result = $ldap->update($dn, $info, $user, $olddn); + if ($result > 0) { + print " - " . $langs->trans("OK"); + } else { + $error ++; + print " - " . $langs->trans("KO") . ' - ' . $ldap->error; } print "\n"; - $i++; + $i ++; } $ldap->unbind(); $ldap->close(); -} -else -{ +} else { dol_print_error($db); } diff --git a/scripts/contracts/email_expire_services_to_customers.php b/scripts/contracts/email_expire_services_to_customers.php index eeb5967556e..041f9dd0b1c 100755 --- a/scripts/contracts/email_expire_services_to_customers.php +++ b/scripts/contracts/email_expire_services_to_customers.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2005-2013 Laurent Destailleur - * Copyright (C) 2013 Juanjo Menent + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2005-2013 Laurent Destailleur + * Copyright (C) 2013 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 @@ -12,7 +12,7 @@ * * 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 + * 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 @@ -20,297 +20,283 @@ */ /** - * \file scripts/contracts/email_expire_services_to_customers.php - * \ingroup facture - * \brief Script to send a mail to customers with services to expire + * \file scripts/contracts/email_expire_services_to_customers.php + * \ingroup facture + * \brief Script to send a mail to customers with services to expire */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test si mode batch $sapi_type = php_sapi_name(); if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts'))) -{ +if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts'))) { print "Usage: $script_file (test|confirm) (thirdparties|contacts) [delay] [after]\n"; print "\n"; print "Send an email to customers to remind all contracts services to expire or expired.\n"; print "If you choose 'test' mode, no emails are sent.\n"; print "If you add param delay (nb of days), only services with expired date < today + delay are included.\n"; print "If you add param after (nb of days), only services with expired date >= today + delay are included.\n"; - exit(-1); + exit(- 1); } -$mode=$argv[1]; -$targettype=$argv[2]; +$mode = $argv[1]; +$targettype = $argv[2]; +require $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php"; -require $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"; - -$langs->loadLangs(array('main', 'contracts')); +$langs->loadLangs(array('main','contracts')); // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); -$now=dol_now('tzserver'); -$duration_value=isset($argv[3])?$argv[3]:'none'; -$duration_value2=isset($argv[4])?$argv[4]:'none'; +$now = dol_now('tzserver'); +$duration_value = isset($argv[3]) ? $argv[3] : 'none'; +$duration_value2 = isset($argv[4]) ? $argv[4] : 'none'; $error = 0; -print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"").(is_numeric($duration_value2)?" after=".$duration_value2:"")."\n"; +print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . (is_numeric($duration_value2) ? " after=" . $duration_value2 : "") . "\n"; -if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1; +if ($mode != 'confirm') + $conf->global->MAIN_DISABLE_ALL_MAILS = 1; -$sql = "SELECT c.ref, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel,"; -$sql.= " s.rowid as sid, s.nom as name, s.email, s.default_lang"; -if ($targettype == 'contacts') $sql.= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail"; -$sql .= " FROM ".MAIN_DB_PREFIX."societe AS s"; -if ($targettype == 'contacts') $sql.= ", ".MAIN_DB_PREFIX."socpeople as sp"; -$sql .= ", ".MAIN_DB_PREFIX."contrat AS c"; -$sql .= ", ".MAIN_DB_PREFIX."contratdet AS cd"; -$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product AS p ON p.rowid = cd.fk_product"; +$sql = "SELECT c.ref, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel,"; +$sql .= " s.rowid as sid, s.nom as name, s.email, s.default_lang"; +if ($targettype == 'contacts') + $sql .= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail"; +$sql .= " FROM " . MAIN_DB_PREFIX . "societe AS s"; +if ($targettype == 'contacts') + $sql .= ", " . MAIN_DB_PREFIX . "socpeople as sp"; +$sql .= ", " . MAIN_DB_PREFIX . "contrat AS c"; +$sql .= ", " . MAIN_DB_PREFIX . "contratdet AS cd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product AS p ON p.rowid = cd.fk_product"; $sql .= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut < 5"; -if (is_numeric($duration_value2)) $sql.= " AND cd.date_fin_validite >= '".$db->idate(dol_time_plus_duree($now, $duration_value2, "d"))."'"; -if (is_numeric($duration_value)) $sql.= " AND cd.date_fin_validite < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; -if ($targettype == 'contacts') $sql.= " AND s.rowid = sp.fk_soc"; -$sql.= " ORDER BY"; -if ($targettype == 'contacts') $sql.= " sp.email, sp.rowid,"; -$sql.= " s.email ASC, s.rowid ASC, cd.date_fin_validite ASC"; // Order by email to allow one message per email +if (is_numeric($duration_value2)) + $sql .= " AND cd.date_fin_validite >= '" . $db->idate(dol_time_plus_duree($now, $duration_value2, "d")) . "'"; +if (is_numeric($duration_value)) + $sql .= " AND cd.date_fin_validite < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'"; +if ($targettype == 'contacts') + $sql .= " AND s.rowid = sp.fk_soc"; +$sql .= " ORDER BY"; +if ($targettype == 'contacts') + $sql .= " sp.email, sp.rowid,"; +$sql .= " s.email ASC, s.rowid ASC, cd.date_fin_validite ASC"; // Order by email to allow one message per email -//print $sql; -$resql=$db->query($sql); -if ($resql) -{ - $num = $db->num_rows($resql); - $i = 0; - $oldemail = 'none'; $oldsid = 0; $oldcid = 0; $oldlang=''; - $total = 0; $foundtoprocess = 0; - $trackthirdpartiessent = array(); +// print $sql; +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + $oldemail = 'none'; + $oldsid = 0; + $oldcid = 0; + $oldlang = ''; + $total = 0; + $foundtoprocess = 0; + $trackthirdpartiessent = array(); - print "We found ".$num." couples (services to expire-".$targettype.") qualified\n"; - dol_syslog("We found ".$num." couples (services to expire-".$targettype.") qualified"); - $message=''; + print "We found " . $num . " couples (services to expire-" . $targettype . ") qualified\n"; + dol_syslog("We found " . $num . " couples (services to expire-" . $targettype . ") qualified"); + $message = ''; - if ($num) - { - while ($i < $num) - { - $obj = $db->fetch_object($resql); + if ($num) { + while ($i < $num) { + $obj = $db->fetch_object($resql); - $newemail=empty($obj->cemail)?$obj->email:$obj->cemail; + $newemail = empty($obj->cemail) ? $obj->email : $obj->cemail; - // Check if this record is a break after previous one - $startbreak=false; - if ($newemail <> $oldemail || $oldemail == 'none') $startbreak=true; - if ($obj->sid && $obj->sid <> $oldsid) $startbreak=true; - if ($obj->cid && $obj->cid <> $oldcid) $startbreak=true; + // Check if this record is a break after previous one + $startbreak = false; + if ($newemail != $oldemail || $oldemail == 'none') + $startbreak = true; + if ($obj->sid && $obj->sid != $oldsid) + $startbreak = true; + if ($obj->cid && $obj->cid != $oldcid) + $startbreak = true; - if ($startbreak) - { - // Break onto sales representative (new email or cid) - if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value); - $trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid; - } - else - { - if ($oldemail != 'none') - { - if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n"; - else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n"; - } - } - $oldemail = $newemail; - $oldsid = $obj->sid; - $oldcid = $obj->cid; - $oldlang = $obj->lang; - $oldtarget=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname); - $message = ''; - $total = 0; - $foundtoprocess = 0; - $target=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname); - //if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n"; - } + if ($startbreak) { + // Break onto sales representative (new email or cid) + if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) { + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value); + $trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid; + } else { + if ($oldemail != 'none') { + if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) + print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n"; + else + print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n"; + } + } + $oldemail = $newemail; + $oldsid = $obj->sid; + $oldcid = $obj->cid; + $oldlang = $obj->lang; + $oldtarget = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname); + $message = ''; + $total = 0; + $foundtoprocess = 0; + $target = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname); + // if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n"; + } - // Define line content - $outputlangs=new Translate('', $conf); - $outputlangs->setDefaultLang(empty($obj->default_lang)?$langs->defaultlang:$obj->default_lang); // By default language of customer + // Define line content + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang(empty($obj->default_lang) ? $langs->defaultlang : $obj->default_lang); // By default language of customer - // Load translation files required by the page - $outputlangs->loadLangs(array("main", "contracts", "bills", "products")); + // Load translation files required by the page + $outputlangs->loadLangs(array("main","contracts","bills","products")); - if (dol_strlen($newemail)) - { - $message .= $outputlangs->trans("Contract")." ".$obj->ref.": ".$outputlangs->trans("Service")." ".dol_concatdesc($obj->plabel, $obj->description)." (".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency)."), ".$outputlangs->trans("DateEndPlannedShort")." ".dol_print_date($db->jdate($obj->date_fin_validite), 'day')."\n\n"; - dol_syslog("email_expire_services_to_customers.php: ".$newemail." ".$message); - $foundtoprocess++; - } - print "Service to expire ".$obj->ref.", label ".dol_concatdesc($obj->plabel, $obj->description).", due date ".dol_print_date($db->jdate($obj->date_fin_validite), 'day').", customer id ".$obj->sid." ".$obj->name.", ".($obj->cid?"contact id ".$obj->cid." ".$obj->clastname." ".$obj->cfirstname.", ":"")."email ".$newemail.", lang ".$outputlangs->defaultlang.": "; - if (dol_strlen($newemail)) print "qualified."; - else print "disqualified (no email)."; + if (dol_strlen($newemail)) { + $message .= $outputlangs->trans("Contract") . " " . $obj->ref . ": " . $outputlangs->trans("Service") . " " . dol_concatdesc($obj->plabel, $obj->description) . " (" . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . "), " . $outputlangs->trans("DateEndPlannedShort") . " " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . "\n\n"; + dol_syslog("email_expire_services_to_customers.php: " . $newemail . " " . $message); + $foundtoprocess ++; + } + print "Service to expire " . $obj->ref . ", label " . dol_concatdesc($obj->plabel, $obj->description) . ", due date " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . ", customer id " . $obj->sid . " " . $obj->name . ", " . ($obj->cid ? "contact id " . $obj->cid . " " . $obj->clastname . " " . $obj->cfirstname . ", " : "") . "email " . $newemail . ", lang " . $outputlangs->defaultlang . ": "; + if (dol_strlen($newemail)) + print "qualified."; + else + print "disqualified (no email)."; print "\n"; - unset($outputlangs); + unset($outputlangs); - $total += $obj->total_ttc; + $total += $obj->total_ttc; - $i++; - } + $i ++; + } - // Si il reste des envois en buffer - if ($foundtoprocess) - { - if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) // Break onto email (new email) - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value); - $trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid; - } - else + // Si il reste des envois en buffer + if ($foundtoprocess) { + if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) // Break onto email (new email) { - if ($oldemail != 'none') - { - if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n"; - else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n"; - } - } - } - } - else - { - print "No services to expire found\n"; - } + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value); + $trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid; + } else { + if ($oldemail != 'none') { + if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) + print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n"; + else + print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n"; + } + } + } + } else { + print "No services to expire found\n"; + } - exit(0); + exit(0); +} else { + dol_print_error($db); + dol_syslog("email_expire_services_to_customers.php: Error"); + + exit(- 1); } -else -{ - dol_print_error($db); - dol_syslog("email_expire_services_to_customers.php: Error"); - - exit(-1); -} - /** - * Send email + * Send email * - * @param string $mode Mode (test | confirm) - * @param string $oldemail Target email - * @param string $message Message to send - * @param string $total Total amount of unpayed invoices - * @param string $userlang Code lang to use for email output. - * @param string $oldtarget Target name - * @param int $duration_value duration value - * @return int <0 if KO, >0 if OK + * @param string $mode + * Mode (test | confirm) + * @param string $oldemail + * Target email + * @param string $message + * Message to send + * @param string $total + * Total amount of unpayed invoices + * @param string $userlang + * Code lang to use for email output. + * @param string $oldtarget + * Target name + * @param int $duration_value + * duration value + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldtarget, $duration_value) { - global $conf,$langs; + global $conf, $langs; - if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO'); + if (getenv('DOL_FORCE_EMAIL_TO')) + $oldemail = getenv('DOL_FORCE_EMAIL_TO'); - $newlangs=new Translate('', $conf); - $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); - $newlangs->load("main"); - $newlangs->load("contracts"); + $newlangs = new Translate('', $conf); + $newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang); + $newlangs->load("main"); + $newlangs->load("contracts"); - if ($duration_value) - { - if ($duration_value > 0) $title=$newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value); - else $title=$newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value); - } - else - $title= $newlangs->transnoentities("ListOfServicesToExpire"); + if ($duration_value) { + if ($duration_value > 0) + $title = $newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value); + else + $title = $newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value); + } else + $title = $newlangs->transnoentities("ListOfServicesToExpire"); - $subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT)?$title:$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT); - $sendto = $oldemail; - $from = $conf->global->MAIN_MAIL_EMAIL_FROM; - $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; - $msgishtml = -1; + $subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT) ? $title : $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT); + $sendto = $oldemail; + $from = $conf->global->MAIN_MAIL_EMAIL_FROM; + $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; + $msgishtml = - 1; - print "- Send email to '".$oldtarget."' (".$oldemail."), total: ".$total."\n"; - dol_syslog("email_expire_services_to_customers.php: send mail to ".$oldemail); + print "- Send email to '" . $oldtarget . "' (" . $oldemail . "), total: " . $total . "\n"; + dol_syslog("email_expire_services_to_customers.php: send mail to " . $oldemail); - $usehtml=0; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) $usehtml+=1; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER)) $usehtml+=1; + $usehtml = 0; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) + $usehtml += 1; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER)) + $usehtml += 1; - $allmessage=''; - if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER; - } - else - { - $allmessage.= "Dear customer".($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - $allmessage.= "Please, find a summary of the services contracted by you that are about to expire.".($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - } - $allmessage.= $message.($usehtml?"
\n":"\n"); - //$allmessage.= $langs->trans("Total")." = ".price($total,0,$userlang,0,0,-1,$conf->currency).($usehtml?"
\n":"\n"); - if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) $usehtml+=1; - } + $allmessage = ''; + if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER; + } else { + $allmessage .= "Dear customer" . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + $allmessage .= "Please, find a summary of the services contracted by you that are about to expire." . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + } + $allmessage .= $message . ($usehtml ? "
\n" : "\n"); + // $allmessage.= $langs->trans("Total")." = ".price($total,0,$userlang,0,0,-1,$conf->currency).($usehtml?"
\n":"\n"); + if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) + $usehtml += 1; + } - $mail = new CMailFile( - $subject, - $sendto, - $from, - $allmessage, - array(), - array(), - array(), - '', - '', - 0, - $msgishtml - ); + $mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml); - $mail->errors_to = $errorsto; + $mail->errors_to = $errorsto; - // Send or not email - if ($mode == 'confirm') - { - $result=$mail->sendfile(); - if (! $result) - { - print "Error sending email ".$mail->error."\n"; - dol_syslog("Error sending email ".$mail->error."\n"); - } - } - else - { - print "No email sent (test mode)\n"; - dol_syslog("No email sent (test mode)"); - $mail->dump_mail(); - $result=1; - } + // Send or not email + if ($mode == 'confirm') { + $result = $mail->sendfile(); + if (! $result) { + print "Error sending email " . $mail->error . "\n"; + dol_syslog("Error sending email " . $mail->error . "\n"); + } + } else { + print "No email sent (test mode)\n"; + dol_syslog("No email sent (test mode)"); + $mail->dump_mail(); + $result = 1; + } - unset($newlangs); - if ($result) - { - return 1; - } - else - { - return -1; - } + unset($newlangs); + if ($result) { + return 1; + } else { + return - 1; + } } diff --git a/scripts/contracts/email_expire_services_to_representatives.php b/scripts/contracts/email_expire_services_to_representatives.php index 19b57c10fc5..be63d4804f9 100755 --- a/scripts/contracts/email_expire_services_to_representatives.php +++ b/scripts/contracts/email_expire_services_to_representatives.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2005-2013 Laurent Destailleur - * Copyright (C) 2013 Juanjo Menent + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2005-2013 Laurent Destailleur + * Copyright (C) 2013 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 @@ -12,7 +12,7 @@ * * 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 + * 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 @@ -20,263 +20,241 @@ */ /** - * \file scripts/contracts/email_expire_services_to_representatives.php - * \ingroup contracts - * \brief Script to send a mail to dolibarr users linked to companies with services to expire + * \file scripts/contracts/email_expire_services_to_representatives.php + * \ingroup contracts + * \brief Script to send a mail to dolibarr users linked to companies with services to expire */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test si mode batch $sapi_type = php_sapi_name(); if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm'))) -{ +if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm'))) { print "Usage: $script_file (test|confirm) [delay]\n"; print "\n"; print "Send an email to remind all contracts services to expire, to users that are sale representative for.\n"; print "If you choose 'test' mode, no emails are sent.\n"; print "If you add a delay (nb of days), only services with expired date < today + delay are included.\n"; - exit(-1); + exit(- 1); } -$mode=$argv[1]; +$mode = $argv[1]; +require $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php"; -require $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"; - -$langs->loadLangs(array('main', 'contracts')); +$langs->loadLangs(array('main','contracts')); // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); -$now=dol_now('tzserver'); -$duration_value=isset($argv[2])?$argv[2]:'none'; +$now = dol_now('tzserver'); +$duration_value = isset($argv[2]) ? $argv[2] : 'none'; -print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"")."\n"; +print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . "\n"; -if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1; +if ($mode != 'confirm') + $conf->global->MAIN_DISABLE_ALL_MAILS = 1; -$sql = "SELECT DISTINCT c.ref, c.fk_soc, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel, s.rowid, s.nom as name, s.email, s.default_lang,"; -$sql.= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang"; -$sql.= " FROM ".MAIN_DB_PREFIX."societe AS s, ".MAIN_DB_PREFIX."contrat AS c, ".MAIN_DB_PREFIX."contratdet AS cd"; -$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product AS p ON p.rowid = cd.fk_product, ".MAIN_DB_PREFIX."societe_commerciaux AS sc, ".MAIN_DB_PREFIX."user AS u"; -$sql.= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut<5"; -if (is_numeric($duration_value)) $sql .= " AND cd.date_fin_validite < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; -$sql.= " AND sc.fk_soc = s.rowid AND sc.fk_user = u.rowid"; -$sql .= " ORDER BY u.email ASC, s.rowid ASC, c.ref ASC"; // Order by email to allow one message per email +$sql = "SELECT DISTINCT c.ref, c.fk_soc, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel, s.rowid, s.nom as name, s.email, s.default_lang,"; +$sql .= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang"; +$sql .= " FROM " . MAIN_DB_PREFIX . "societe AS s, " . MAIN_DB_PREFIX . "contrat AS c, " . MAIN_DB_PREFIX . "contratdet AS cd"; +$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product AS p ON p.rowid = cd.fk_product, " . MAIN_DB_PREFIX . "societe_commerciaux AS sc, " . MAIN_DB_PREFIX . "user AS u"; +$sql .= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut<5"; +if (is_numeric($duration_value)) + $sql .= " AND cd.date_fin_validite < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'"; +$sql .= " AND sc.fk_soc = s.rowid AND sc.fk_user = u.rowid"; +$sql .= " ORDER BY u.email ASC, s.rowid ASC, c.ref ASC"; // Order by email to allow one message per email -//print $sql; -$resql=$db->query($sql); -if ($resql) -{ - $num = $db->num_rows($resql); - $i = 0; - $oldemail = 'none'; $olduid = 0; $oldlang=''; - $total = 0; $foundtoprocess = 0; - print "We found ".$num." couples (services to expire - sale representative) qualified\n"; - dol_syslog("We found ".$num." couples (services to expire - sale representative) qualified"); - $message=''; +// print $sql; +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + $oldemail = 'none'; + $olduid = 0; + $oldlang = ''; + $total = 0; + $foundtoprocess = 0; + print "We found " . $num . " couples (services to expire - sale representative) qualified\n"; + dol_syslog("We found " . $num . " couples (services to expire - sale representative) qualified"); + $message = ''; - if ($num) - { - while ($i < $num) - { - $obj = $db->fetch_object($resql); + if ($num) { + while ($i < $num) { + $obj = $db->fetch_object($resql); - if (($obj->email <> $oldemail || $obj->uid <> $olduid) || $oldemail == 'none') - { - // Break onto sales representative (new email or uid) - if (dol_strlen($oldemail) && $oldemail != 'none') - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value); - } - else - { - if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n"; - } - $oldemail = $obj->email; - $olduid = $obj->uid; - $oldlang = $obj->lang; - $oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname); - $message = ''; - $total = 0; - $foundtoprocess = 0; - $salerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname); - if (empty($obj->email)) print "Warning: Sale representative ".$salerepresentative." has no email. Notice disabled.\n"; - } + if (($obj->email != $oldemail || $obj->uid != $olduid) || $oldemail == 'none') { + // Break onto sales representative (new email or uid) + if (dol_strlen($oldemail) && $oldemail != 'none') { + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value); + } else { + if ($oldemail != 'none') + print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n"; + } + $oldemail = $obj->email; + $olduid = $obj->uid; + $oldlang = $obj->lang; + $oldsalerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname); + $message = ''; + $total = 0; + $foundtoprocess = 0; + $salerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname); + if (empty($obj->email)) + print "Warning: Sale representative " . $salerepresentative . " has no email. Notice disabled.\n"; + } - // Define line content - $outputlangs=new Translate('', $conf); - $outputlangs->setDefaultLang(empty($obj->lang)?$langs->defaultlang:$obj->lang); // By default language of sale representative + // Define line content + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang(empty($obj->lang) ? $langs->defaultlang : $obj->lang); // By default language of sale representative - // Load translation files required by the page - $outputlangs->loadLangs(array("main", "contracts", "bills", "products")); + // Load translation files required by the page + $outputlangs->loadLangs(array("main","contracts","bills","products")); - if (dol_strlen($obj->email)) - { - $message .= $outputlangs->trans("Contract")." ".$obj->ref.": ".$langs->trans("Service")." ".dol_concatdesc($obj->plabel, $obj->description)." (".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency).") ".$obj->name.", ".$outputlangs->trans("DateEndPlannedShort")." ".dol_print_date($db->jdate($obj->date_fin_validite), 'day')."\n\n"; - dol_syslog("email_expire_services_to_representatives.php: ".$obj->email); - $foundtoprocess++; - } - print "Service to expire ".$obj->ref.", label ".dol_concatdesc($obj->plabel, $obj->description).", due date ".dol_print_date($db->jdate($obj->date_fin_validite), 'day')." (linked to company ".$obj->name.", sale representative ".dolGetFirstLastname($obj->firstname, $obj->lastname).", email ".$obj->email."): "; - if (dol_strlen($obj->email)) print "qualified."; - else print "disqualified (no email)."; + if (dol_strlen($obj->email)) { + $message .= $outputlangs->trans("Contract") . " " . $obj->ref . ": " . $langs->trans("Service") . " " . dol_concatdesc($obj->plabel, $obj->description) . " (" . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . ") " . $obj->name . ", " . $outputlangs->trans("DateEndPlannedShort") . " " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . "\n\n"; + dol_syslog("email_expire_services_to_representatives.php: " . $obj->email); + $foundtoprocess ++; + } + print "Service to expire " . $obj->ref . ", label " . dol_concatdesc($obj->plabel, $obj->description) . ", due date " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . " (linked to company " . $obj->name . ", sale representative " . dolGetFirstLastname($obj->firstname, $obj->lastname) . ", email " . $obj->email . "): "; + if (dol_strlen($obj->email)) + print "qualified."; + else + print "disqualified (no email)."; print "\n"; unset($outputlangs); $total += $obj->total_ttc; - $i++; - } + $i ++; + } - // Si il reste des envois en buffer - if ($foundtoprocess) - { - if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email) - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value); - } - else + // Si il reste des envois en buffer + if ($foundtoprocess) { + if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email) { - if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n"; - } - } - } - else - { - print "No services to expire (for companies linked to a particular commercial dolibarr user) found\n"; - } + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value); + } else { + if ($oldemail != 'none') + print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n"; + } + } + } else { + print "No services to expire (for companies linked to a particular commercial dolibarr user) found\n"; + } - exit(0); + exit(0); +} else { + dol_print_error($db); + dol_syslog("email_expire_services_to_representatives.php: Error"); + + exit(- 1); } -else -{ - dol_print_error($db); - dol_syslog("email_expire_services_to_representatives.php: Error"); - - exit(-1); -} - /** - * Send email + * Send email * - * @param string $mode Mode (test | confirm) - * @param string $oldemail Old email - * @param string $message Message to send - * @param string $total Total amount of unpayed invoices - * @param string $userlang Code lang to use for email output. - * @param string $oldsalerepresentative Old sale representative - * @param int $duration_value duration value - * @return int <0 if KO, >0 if OK + * @param string $mode + * Mode (test | confirm) + * @param string $oldemail + * Old email + * @param string $message + * Message to send + * @param string $total + * Total amount of unpayed invoices + * @param string $userlang + * Code lang to use for email output. + * @param string $oldsalerepresentative + * Old sale representative + * @param int $duration_value + * duration value + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldsalerepresentative, $duration_value) { - global $conf,$langs; + global $conf, $langs; - if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO'); + if (getenv('DOL_FORCE_EMAIL_TO')) + $oldemail = getenv('DOL_FORCE_EMAIL_TO'); - $newlangs=new Translate('', $conf); - $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); - $newlangs->load("main"); - $newlangs->load("contracts"); + $newlangs = new Translate('', $conf); + $newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang); + $newlangs->load("main"); + $newlangs->load("contracts"); - if ($duration_value) - { - if ($duration_value > 0) $title=$newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value); - else $title=$newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value); - } - else - $title= $newlangs->transnoentities("ListOfServicesToExpire"); + if ($duration_value) { + if ($duration_value > 0) + $title = $newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value); + else + $title = $newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value); + } else + $title = $newlangs->transnoentities("ListOfServicesToExpire"); - $subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT)?$title:$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT); - $sendto = $oldemail; - $from = $conf->global->MAIN_MAIL_EMAIL_FROM; - $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; - $msgishtml = -1; + $subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT) ? $title : $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT); + $sendto = $oldemail; + $from = $conf->global->MAIN_MAIL_EMAIL_FROM; + $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; + $msgishtml = - 1; - print "- Send email for ".$oldsalerepresentative." (".$oldemail."), total: ".$total."\n"; - dol_syslog("email_expire_services_to_representatives.php: send mail to ".$oldemail); + print "- Send email for " . $oldsalerepresentative . " (" . $oldemail . "), total: " . $total . "\n"; + dol_syslog("email_expire_services_to_representatives.php: send mail to " . $oldemail); - $usehtml=0; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER)) $usehtml+=1; + $usehtml = 0; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) + $usehtml += 1; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER)) + $usehtml += 1; - $allmessage=''; - if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER; - } - else - { - $allmessage.= $title.($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - $allmessage.= $newlangs->transnoentities("NoteListOfYourExpiredServices").($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - } - $allmessage.= $message.($usehtml?"
\n":"\n"); - $allmessage.= $langs->trans("Total")." = ".price($total, 0, $userlang, 0, 0, -1, $conf->currency).($usehtml?"
\n":"\n"); - if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1; - } + $allmessage = ''; + if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER; + } else { + $allmessage .= $title . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + $allmessage .= $newlangs->transnoentities("NoteListOfYourExpiredServices") . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + } + $allmessage .= $message . ($usehtml ? "
\n" : "\n"); + $allmessage .= $langs->trans("Total") . " = " . price($total, 0, $userlang, 0, 0, - 1, $conf->currency) . ($usehtml ? "
\n" : "\n"); + if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) + $usehtml += 1; + } - $mail = new CMailFile( - $subject, - $sendto, - $from, - $allmessage, - array(), - array(), - array(), - '', - '', - 0, - $msgishtml - ); + $mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml); - $mail->errors_to = $errorsto; + $mail->errors_to = $errorsto; - // Send or not email - if ($mode == 'confirm') - { - $result=$mail->sendfile(); - if (! $result) - { - print "Error sending email ".$mail->error."\n"; - dol_syslog("Error sending email ".$mail->error."\n"); - } - } - else - { - print "No email sent (test mode)\n"; - dol_syslog("No email sent (test mode)"); - $mail->dump_mail(); - $result=1; - } + // Send or not email + if ($mode == 'confirm') { + $result = $mail->sendfile(); + if (! $result) { + print "Error sending email " . $mail->error . "\n"; + dol_syslog("Error sending email " . $mail->error . "\n"); + } + } else { + print "No email sent (test mode)\n"; + dol_syslog("No email sent (test mode)"); + $mail->dump_mail(); + $result = 1; + } - if ($result) - { - return 1; - } - else - { - return -1; - } + if ($result) { + return 1; + } else { + return - 1; + } } diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index b115f4bbea9..54559e28c19 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -1,7 +1,8 @@ #!/usr/bin/env php * * This program is free software; you can redistribute it and/or modify @@ -11,7 +12,7 @@ * * 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 + * 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 @@ -19,255 +20,231 @@ */ /** - * \file scripts/cron/cron_run_jobs.php - * \ingroup cron - * \brief Execute pendings jobs + * \file scripts/cron/cron_run_jobs.php + * \ingroup cron + * \brief Execute pendings jobs */ -if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Disables token renewal -if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); -if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); -if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); -if (! defined('NOLOGIN')) define('NOLOGIN', '1'); -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); - +if (! defined('NOTOKENRENEWAL')) + define('NOTOKENRENEWAL', '1'); // Disables token renewal +if (! defined('NOREQUIREMENU')) + define('NOREQUIREMENU', '1'); +if (! defined('NOREQUIREHTML')) + define('NOREQUIREHTML', '1'); +if (! defined('NOREQUIREAJAX')) + define('NOREQUIREAJAX', '1'); +if (! defined('NOLOGIN')) + define('NOLOGIN', '1'); +// if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Error if Web mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/cron/class/cronjob.class.php"; -require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/cron/class/cronjob.class.php"; +require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php'; // Check parameters if (! isset($argv[1]) || ! $argv[1]) { usage($path, $script_file); - exit(-1); + exit(- 1); } -$key=$argv[1]; +$key = $argv[1]; if (! isset($argv[2]) || ! $argv[2]) { usage($path, $script_file); - exit(-1); + exit(- 1); } -$userlogin=$argv[2]; - +$userlogin = $argv[2]; // Global variables -$version=DOL_VERSION; -$error=0; - - +$version = DOL_VERSION; +$error = 0; /* * Main */ -$langs->loadLangs(array('main', 'dict')); +$langs->loadLangs(array('main','dict')); // current date -$now=dol_now(); +$now = dol_now(); @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." ***** userlogin=" . $userlogin . " ***** " . dol_print_date($now, 'dayhourrfc') . " *****\n"; +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " ***** userlogin=" . $userlogin . " ***** " . dol_print_date($now, 'dayhourrfc') . " *****\n"; // Check module cron is activated -if (empty($conf->cron->enabled)) -{ +if (empty($conf->cron->enabled)) { print "Error: module Scheduled jobs (cron) not activated\n"; - exit(-1); + exit(- 1); } // Check module cron is activated -if (empty($conf->cron->enabled)) -{ +if (empty($conf->cron->enabled)) { print "Error: module Scheduled jobs (cron) not activated\n"; - exit(-1); + exit(- 1); } // Check security key -if ($key != $conf->global->CRON_KEY) -{ +if ($key != $conf->global->CRON_KEY) { print "Error: securitykey is wrong\n"; - exit(-1); + exit(- 1); } // If param userlogin is reserved word 'firstadmin' -if ($userlogin == 'firstadmin') -{ - $sql='SELECT login, entity from '.MAIN_DB_PREFIX.'user WHERE admin = 1 and statut = 1 ORDER BY entity LIMIT 1'; - $resql=$db->query($sql); - if ($resql) - { - $obj=$db->fetch_object($resql); - if ($obj) - { - $userlogin = $obj->login; - echo "First admin user found is login '".$userlogin."', entity ".$obj->entity."\n"; - } - } - else dol_print_error($db); +if ($userlogin == 'firstadmin') { + $sql = 'SELECT login, entity from ' . MAIN_DB_PREFIX . 'user WHERE admin = 1 and statut = 1 ORDER BY entity LIMIT 1'; + $resql = $db->query($sql); + if ($resql) { + $obj = $db->fetch_object($resql); + if ($obj) { + $userlogin = $obj->login; + echo "First admin user found is login '" . $userlogin . "', entity " . $obj->entity . "\n"; + } + } else + dol_print_error($db); } // Check user login -$user=new User($db); -$result=$user->fetch('', $userlogin); -if ($result < 0) -{ - echo "User Error: ".$user->error; - dol_syslog("cron_run_jobs.php:: User Error:".$user->error, LOG_ERR); - exit(-1); -} -else -{ - if (empty($user->id)) - { - echo "User login: ".$userlogin." does not exists"; - dol_syslog("User login:".$userlogin." does not exists", LOG_ERR); - exit(-1); +$user = new User($db); +$result = $user->fetch('', $userlogin); +if ($result < 0) { + echo "User Error: " . $user->error; + dol_syslog("cron_run_jobs.php:: User Error:" . $user->error, LOG_ERR); + exit(- 1); +} else { + if (empty($user->id)) { + echo "User login: " . $userlogin . " does not exists"; + dol_syslog("User login:" . $userlogin . " does not exists", LOG_ERR); + exit(- 1); } } $user->getrights(); -if (isset($argv[3]) || $argv[3]) -{ +if (isset($argv[3]) || $argv[3]) { $id = $argv[3]; } // create a jobs object $object = new Cronjob($db); -$filter=array(); +$filter = array(); if (! empty($id)) { - if (! is_numeric($id)) - { + if (! is_numeric($id)) { echo "Error: Bad value for parameter job id"; dol_syslog("cron_run_jobs.php Bad value for parameter job id", LOG_WARNING); - exit; + exit(); } - $filter['t.rowid']=$id; + $filter['t.rowid'] = $id; } $result = $object->fetch_all('ASC,ASC,ASC', 't.priority,t.entity,t.rowid', 0, 0, 1, $filter, 0); -if ($result<0) -{ - echo "Error: ".$object->error; - dol_syslog("cron_run_jobs.php:: fetch Error ".$object->error, LOG_ERR); - exit(-1); +if ($result < 0) { + echo "Error: " . $object->error; + dol_syslog("cron_run_jobs.php:: fetch Error " . $object->error, LOG_ERR); + exit(- 1); } - $qualifiedjobs = array(); -foreach($object->lines as $val) -{ - if (! verifCond($val->test)) continue; +foreach ($object->lines as $val) { + if (! verifCond($val->test)) + continue; $qualifiedjobs[] = $val; } // TODO Duplicate. This sequence of code must be shared with code into public/cron/cron_run_jobs.php php page. -$nbofjobs=count($qualifiedjobs); -$nbofjobslaunchedok=0; -$nbofjobslaunchedko=0; +$nbofjobs = count($qualifiedjobs); +$nbofjobslaunchedok = 0; +$nbofjobslaunchedko = 0; -if (is_array($qualifiedjobs) && (count($qualifiedjobs)>0)) -{ +if (is_array($qualifiedjobs) && (count($qualifiedjobs) > 0)) { // Loop over job - foreach($qualifiedjobs as $line) - { - dol_syslog("cron_run_jobs.php cronjobid: ".$line->id." priority=".$line->priority." entity=".$line->entity." label=".$line->label, LOG_DEBUG); + foreach ($qualifiedjobs as $line) { + dol_syslog("cron_run_jobs.php cronjobid: " . $line->id . " priority=" . $line->priority . " entity=" . $line->entity . " label=" . $line->label, LOG_DEBUG); - echo "cron_run_jobs.php cronjobid: ".$line->id." priority=".$line->priority." entity=".$line->entity." label=".$line->label; + echo "cron_run_jobs.php cronjobid: " . $line->id . " priority=" . $line->priority . " entity=" . $line->entity . " label=" . $line->label; - //If date_next_jobs is less of current date, execute the program, and store the execution time of the next execution in database - if (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now)) - { + // If date_next_jobs is less of current date, execute the program, and store the execution time of the next execution in database + if (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now)) { echo " - qualified"; - dol_syslog("cron_run_jobs.php line->datenextrun:".dol_print_date($line->datenextrun, 'dayhourrfc')." line->datestart:".dol_print_date($line->datestart, 'dayhourrfc')." line->dateend:".dol_print_date($line->dateend, 'dayhourrfc')." now:".dol_print_date($now, 'dayhourrfc')); + dol_syslog("cron_run_jobs.php line->datenextrun:" . dol_print_date($line->datenextrun, 'dayhourrfc') . " line->datestart:" . dol_print_date($line->datestart, 'dayhourrfc') . " line->dateend:" . dol_print_date($line->dateend, 'dayhourrfc') . " now:" . dol_print_date($now, 'dayhourrfc')); - $cronjob=new Cronjob($db); - $result=$cronjob->fetch($line->id); - if ($result < 0) - { - echo "Error cronjobid: ".$line->id." cronjob->fetch: ".$cronjob->error."\n"; - echo "Failed to fetch job ".$line->id."\n"; - dol_syslog("cron_run_jobs.php::fetch Error ".$cronjob->error, LOG_ERR); - exit(-1); + $cronjob = new Cronjob($db); + $result = $cronjob->fetch($line->id); + if ($result < 0) { + echo "Error cronjobid: " . $line->id . " cronjob->fetch: " . $cronjob->error . "\n"; + echo "Failed to fetch job " . $line->id . "\n"; + dol_syslog("cron_run_jobs.php::fetch Error " . $cronjob->error, LOG_ERR); + exit(- 1); } // Execute job - $result=$cronjob->run_jobs($userlogin); - if ($result < 0) - { - echo "Error cronjobid: ".$line->id." cronjob->run_job: ".$cronjob->error."\n"; + $result = $cronjob->run_jobs($userlogin); + if ($result < 0) { + echo "Error cronjobid: " . $line->id . " cronjob->run_job: " . $cronjob->error . "\n"; echo "At least one job failed. Go on menu Home-Setup-Admin tools to see result for each job.\n"; echo "You can also enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n"; - dol_syslog("cron_run_jobs.php::run_jobs Error ".$cronjob->error, LOG_ERR); - $nbofjobslaunchedko++; - } - else - { - $nbofjobslaunchedok++; + dol_syslog("cron_run_jobs.php::run_jobs Error " . $cronjob->error, LOG_ERR); + $nbofjobslaunchedko ++; + } else { + $nbofjobslaunchedok ++; } - echo " - result of run_jobs = ".$result; + echo " - result of run_jobs = " . $result; // we re-program the next execution and stores the last execution time for this job - $result=$cronjob->reprogram_jobs($userlogin, $now); - if ($result<0) - { - echo "Error cronjobid: ".$line->id." cronjob->reprogram_job: ".$cronjob->error."\n"; + $result = $cronjob->reprogram_jobs($userlogin, $now); + if ($result < 0) { + echo "Error cronjobid: " . $line->id . " cronjob->reprogram_job: " . $cronjob->error . "\n"; echo "Enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n"; - dol_syslog("cron_run_jobs.php::reprogram_jobs Error ".$cronjob->error, LOG_ERR); - exit(-1); + dol_syslog("cron_run_jobs.php::reprogram_jobs Error " . $cronjob->error, LOG_ERR); + exit(- 1); } echo " - reprogrammed\n"; - } - else - { + } else { echo " - not qualified\n"; - dol_syslog("cron_run_jobs.php job not qualified line->datenextrun:".dol_print_date($line->datenextrun, 'dayhourrfc')." line->datestart:".dol_print_date($line->datestart, 'dayhourrfc')." line->dateend:".dol_print_date($line->dateend, 'dayhourrfc')." now:".dol_print_date($now, 'dayhourrfc')); + dol_syslog("cron_run_jobs.php job not qualified line->datenextrun:" . dol_print_date($line->datenextrun, 'dayhourrfc') . " line->datestart:" . dol_print_date($line->datestart, 'dayhourrfc') . " line->dateend:" . dol_print_date($line->dateend, 'dayhourrfc') . " now:" . dol_print_date($now, 'dayhourrfc')); } } -} -else -{ +} else { echo "cron_run_jobs.php no qualified job found\n"; } $db->close(); -if ($nbofjobslaunchedko) exit(1); +if ($nbofjobslaunchedko) + exit(1); exit(0); - - /** * script cron usage * - * @param string $path path - * @param string $script_file filename + * @param string $path + * path + * @param string $script_file + * filename * @return void */ function usage($path, $script_file) { global $conf; - print "Usage: ".$script_file." securitykey userlogin|'firstadmin' [cronjobid]\n"; + print "Usage: " . $script_file . " securitykey userlogin|'firstadmin' [cronjobid]\n"; print "The script return 0 when everything worked successfully.\n"; print "\n"; print "On Linux system, you can have cron jobs ran automatically by adding an entry into cron.\n"; print "For example, to run pending tasks each day at 3:30, you can add this line:\n"; - print "30 3 * * * ".$path.$script_file." securitykey userlogin > ".DOL_DATA_ROOT."/".$script_file.".log\n"; + print "30 3 * * * " . $path . $script_file . " securitykey userlogin > " . DOL_DATA_ROOT . "/" . $script_file . ".log\n"; print "For example, to run pending tasks every 5mn, you can add this line:\n"; - print "*/5 * * * * ".$path.$script_file." securitykey userlogin > ".DOL_DATA_ROOT."/".$script_file.".log\n"; + print "*/5 * * * * " . $path . $script_file . " securitykey userlogin > " . DOL_DATA_ROOT . "/" . $script_file . ".log\n"; } diff --git a/scripts/emailings/mailing-send.php b/scripts/emailings/mailing-send.php index f3d88592dc4..0e161a9c9cc 100755 --- a/scripts/emailings/mailing-send.php +++ b/scripts/emailings/mailing-send.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2005-2013 Laurent Destailleur - * Copyright (C) 2005-2016 Regis Houssin + * Copyright (C) 2004 Rodolphe Quiedeville + * Copyright (C) 2005-2013 Laurent Destailleur + * Copyright (C) 2005-2016 Regis Houssin * * 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 @@ -12,386 +12,347 @@ * * 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 + * 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 scripts/emailings/mailing-send.php - * \ingroup mailing - * \brief Script d'envoi d'un mailing prepare et valide + * \file scripts/emailings/mailing-send.php + * \ingroup mailing + * \brief Script d'envoi d'un mailing prepare et valide */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: ".$script_file." (ID_MAILING|all)\n"; - exit(-1); + print "Usage: " . $script_file . " (ID_MAILING|all)\n"; + exit(- 1); } -$id=$argv[1]; -if (isset($argv[2]) || !empty($argv[2])) $login = $argv[2]; -else $login = ''; - -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"; -require_once DOL_DOCUMENT_ROOT."/comm/mailing/class/mailing.class.php"; +$id = $argv[1]; +if (isset($argv[2]) || ! empty($argv[2])) + $login = $argv[2]; +else + $login = ''; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php"; +require_once DOL_DOCUMENT_ROOT . "/comm/mailing/class/mailing.class.php"; // Global variables -$version=DOL_VERSION; -$error=0; - - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; -if ($conf->global->MAILING_LIMIT_SENDBYCLI == '-1') -{ -} +if ($conf->global->MAILING_LIMIT_SENDBYCLI == '-1') {} $user = new User($db); // for signature, we use user send as parameter -if (! empty($login)) $user->fetch('', $login); +if (! empty($login)) + $user->fetch('', $login); // We get list of emailing id to process $sql = "SELECT m.rowid"; -$sql.= " FROM ".MAIN_DB_PREFIX."mailing as m"; -$sql.= " WHERE m.statut IN (1,2)"; -if ($id != 'all') -{ - $sql.= " AND m.rowid= ".$id; - $sql.= " LIMIT 1"; +$sql .= " FROM " . MAIN_DB_PREFIX . "mailing as m"; +$sql .= " WHERE m.statut IN (1,2)"; +if ($id != 'all') { + $sql .= " AND m.rowid= " . $id; + $sql .= " LIMIT 1"; } -$resql=$db->query($sql); -if ($resql) -{ +$resql = $db->query($sql); +if ($resql) { $num = $db->num_rows($resql); $j = 0; - if ($num) - { - for ($j=0; $j<$num; $j++) - { + if ($num) { + for ($j = 0; $j < $num; $j ++) { $obj = $db->fetch_object($resql); - dol_syslog("Process mailing with id ".$obj->rowid); - print "Process mailing with id ".$obj->rowid."\n"; + dol_syslog("Process mailing with id " . $obj->rowid); + print "Process mailing with id " . $obj->rowid . "\n"; $emailing = new Mailing($db); $emailing->fetch($obj->rowid); - $id = $emailing->id; - $subject = $emailing->sujet; - $message = $emailing->body; - $from = $emailing->email_from; - $replyto = $emailing->email_replyto; + $id = $emailing->id; + $subject = $emailing->sujet; + $message = $emailing->body; + $from = $emailing->email_from; + $replyto = $emailing->email_replyto; $errorsto = $emailing->email_errorsto; // Le message est-il en html - $msgishtml=-1; // Unknown by default - if (preg_match('/[\s\t]*/i', $message)) $msgishtml=1; + $msgishtml = - 1; // Unknown by default + if (preg_match('/[\s\t]*/i', $message)) + $msgishtml = 1; - $nbok=0; $nbko=0; + $nbok = 0; + $nbko = 0; // On choisit les mails non deja envoyes pour ce mailing (statut=0) // ou envoyes en erreur (statut=-1) $sql2 = "SELECT mc.rowid, mc.fk_mailing, mc.lastname, mc.firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag"; - $sql2.= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc"; - $sql2.= " WHERE mc.statut < 1 AND mc.fk_mailing = ".$id; - if ($conf->global->MAILING_LIMIT_SENDBYCLI > 0) - { - $sql2.= " LIMIT ".$conf->global->MAILING_LIMIT_SENDBYCLI; + $sql2 .= " FROM " . MAIN_DB_PREFIX . "mailing_cibles as mc"; + $sql2 .= " WHERE mc.statut < 1 AND mc.fk_mailing = " . $id; + if ($conf->global->MAILING_LIMIT_SENDBYCLI > 0) { + $sql2 .= " LIMIT " . $conf->global->MAILING_LIMIT_SENDBYCLI; } - $resql2=$db->query($sql2); - if ($resql2) - { + $resql2 = $db->query($sql2); + if ($resql2) { $num2 = $db->num_rows($resql2); - dol_syslog("Nb of targets = ".$num2, LOG_DEBUG); - print "Nb of targets = ".$num2."\n"; + dol_syslog("Nb of targets = " . $num2, LOG_DEBUG); + print "Nb of targets = " . $num2 . "\n"; - if ($num2) - { - $now=dol_now(); + if ($num2) { + $now = dol_now(); // Positionne date debut envoi - $sqlstartdate="UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi='".$db->idate($now)."' WHERE rowid=".$id; - $resqlstartdate=$db->query($sqlstartdate); - if (! $resqlstartdate) - { + $sqlstartdate = "UPDATE " . MAIN_DB_PREFIX . "mailing SET date_envoi='" . $db->idate($now) . "' WHERE rowid=" . $id; + $resqlstartdate = $db->query($sqlstartdate); + if (! $resqlstartdate) { dol_print_error($db); - $error++; + $error ++; } // Look on each email and sent message $i = 0; - while ($i < $num2) - { + while ($i < $num2) { // Here code is common with same loop ino card.php - $res=1; - $now=dol_now(); + $res = 1; + $now = dol_now(); $obj = $db->fetch_object($resql2); // sendto en RFC2822 - $sendto = str_replace(',', ' ', dolGetFirstLastname($obj->firstname, $obj->lastname) ." <".$obj->email.">"); + $sendto = str_replace(',', ' ', dolGetFirstLastname($obj->firstname, $obj->lastname) . " <" . $obj->email . ">"); // Make subtsitutions on topic and body - $other=explode(';', $obj->other); - $tmpfield=explode('=', $other[0], 2); $other1=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]); - $tmpfield=explode('=', $other[1], 2); $other2=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]); - $tmpfield=explode('=', $other[2], 2); $other3=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]); - $tmpfield=explode('=', $other[3], 2); $other4=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]); - $tmpfield=explode('=', $other[4], 2); $other5=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]); - $signature = ((!empty($user->signature) && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))?$user->signature:''); + $other = explode(';', $obj->other); + $tmpfield = explode('=', $other[0], 2); + $other1 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]); + $tmpfield = explode('=', $other[1], 2); + $other2 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]); + $tmpfield = explode('=', $other[2], 2); + $other3 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]); + $tmpfield = explode('=', $other[3], 2); + $other4 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]); + $tmpfield = explode('=', $other[4], 2); + $other5 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]); + $signature = ((! empty($user->signature) && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $user->signature : ''); - $object = null; // Not defined with mass emailing - $parameters=array('mode'=>'emailing'); - $substitutionarray=getCommonSubstitutionArray($langs, 0, array('object','objectamount'), $object); // Note: On mass emailing, this is null because we don't know object + $object = null; // Not defined with mass emailing + $parameters = array('mode' => 'emailing'); + $substitutionarray = getCommonSubstitutionArray($langs, 0, array('object','objectamount'), $object); // Note: On mass emailing, this is null because we don't know object // Array of possible substitutions (See also file mailing-send.php that should manage same substitutions) $substitutionarray['__ID__'] = $obj->source_id; $substitutionarray['__EMAIL__'] = $obj->email; $substitutionarray['__LASTNAME__'] = $obj->lastname; $substitutionarray['__FIRSTNAME__'] = $obj->firstname; - $substitutionarray['__MAILTOEMAIL__'] = ''.$obj->email.''; + $substitutionarray['__MAILTOEMAIL__'] = '' . $obj->email . ''; $substitutionarray['__OTHER1__'] = $other1; $substitutionarray['__OTHER2__'] = $other2; $substitutionarray['__OTHER3__'] = $other3; $substitutionarray['__OTHER4__'] = $other4; $substitutionarray['__OTHER5__'] = $other5; - $substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter) - $substitutionarray['__SIGNATURE__'] = $signature; // For backward compatibility - $substitutionarray['__CHECK_READ__'] = ''; - $substitutionarray['__UNSUBSCRIBE__'] = ''.$langs->trans("MailUnsubcribe").''; + $substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter) + $substitutionarray['__SIGNATURE__'] = $signature; // For backward compatibility + $substitutionarray['__CHECK_READ__'] = ''; + $substitutionarray['__UNSUBSCRIBE__'] = '' . $langs->trans("MailUnsubcribe") . ''; $onlinepaymentenabled = 0; - if (! empty($conf->paypal->enabled)) $onlinepaymentenabled++; - if (! empty($conf->paybox->enabled)) $onlinepaymentenabled++; - if (! empty($conf->stripe->enabled)) $onlinepaymentenabled++; - if ($onlinepaymentenabled && ! empty($conf->global->PAYMENT_SECURITY_TOKEN)) - { - $substitutionarray['__SECUREKEYPAYMENT__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); - if (empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) - { - $substitutionarray['__SECUREKEYPAYMENT_MEMBER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); - $substitutionarray['__SECUREKEYPAYMENT_ORDER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); - $substitutionarray['__SECUREKEYPAYMENT_INVOICE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); - $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); - } - else - { - $substitutionarray['__SECUREKEYPAYMENT_MEMBER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2); - $substitutionarray['__SECUREKEYPAYMENT_ORDER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'order' . $obj->source_id, 2); - $substitutionarray['__SECUREKEYPAYMENT_INVOICE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2); - $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2); + if (! empty($conf->paypal->enabled)) + $onlinepaymentenabled ++; + if (! empty($conf->paybox->enabled)) + $onlinepaymentenabled ++; + if (! empty($conf->stripe->enabled)) + $onlinepaymentenabled ++; + if ($onlinepaymentenabled && ! empty($conf->global->PAYMENT_SECURITY_TOKEN)) { + $substitutionarray['__SECUREKEYPAYMENT__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); + if (empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) { + $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); + $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); + $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); + $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); + } else { + $substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2); + $substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'order' . $obj->source_id, 2); + $substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2); + $substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2); } } /* For backward compatibility */ - if (! empty($conf->paypal->enabled) && ! empty($conf->global->PAYPAL_SECURITY_TOKEN)) - { - $substitutionarray['__SECUREKEYPAYPAL__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + if (! empty($conf->paypal->enabled) && ! empty($conf->global->PAYPAL_SECURITY_TOKEN)) { + $substitutionarray['__SECUREKEYPAYPAL__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_MEMBER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - else $substitutionarray['__SECUREKEYPAYPAL_MEMBER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2); + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) + $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + else + $substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2); - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_ORDER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - else $substitutionarray['__SECUREKEYPAYPAL_ORDER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'order' . $obj->source_id, 2); + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) + $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + else + $substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'order' . $obj->source_id, 2); - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_INVOICE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - else $substitutionarray['__SECUREKEYPAYPAL_INVOICE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2); + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) + $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + else + $substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2); - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - else $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2); + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) + $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + else + $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2); } complete_substitutions_array($substitutionarray, $langs); - $newsubject=make_substitutions($subject, $substitutionarray); - $newmessage=make_substitutions($message, $substitutionarray); + $newsubject = make_substitutions($subject, $substitutionarray); + $newmessage = make_substitutions($message, $substitutionarray); - $substitutionisok=true; + $substitutionisok = true; // Fabrication du mail - $trackid='emailing-'.$obj->fk_mailing.'-'.$obj->rowid; - $mail = new CMailFile( - $newsubject, - $sendto, - $from, - $newmessage, - array(), - array(), - array(), - '', - '', - 0, - $msgishtml, - $errorsto, - '', - $trackid, - '', - 'emailing' - ); + $trackid = 'emailing-' . $obj->fk_mailing . '-' . $obj->rowid; + $mail = new CMailFile($newsubject, $sendto, $from, $newmessage, array(), array(), array(), '', '', 0, $msgishtml, $errorsto, '', $trackid, '', 'emailing'); - if ($mail->error) - { - $res=0; + if ($mail->error) { + $res = 0; } - if (! $substitutionisok) - { - $mail->error='Some substitution failed'; - $res=0; + if (! $substitutionisok) { + $mail->error = 'Some substitution failed'; + $res = 0; } // Send Email - if ($res) - { - $res=$mail->sendfile(); + if ($res) { + $res = $mail->sendfile(); } - if ($res) - { + if ($res) { // Mail successful - $nbok++; + $nbok ++; - dol_syslog("ok for emailing id ".$id." #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG); + dol_syslog("ok for emailing id " . $id . " #" . $i . ($mail->error ? ' - ' . $mail->error : ''), LOG_DEBUG); // Note: If emailing is 100 000 targets, 100 000 entries are added, so we don't enter events for each target here // We must union table llx_mailing_taget for event tab OR enter 1 event with a special table link (id of email in event) // Run trigger /* - if ($obj->source_type == 'contact') - { - $emailing->sendtoid = $obj->source_id; - } - if ($obj->source_type == 'thirdparty') - { - $emailing->socid = $obj->source_id; - } - // Call trigger - $result=$emailing->call_trigger('EMAILING_SENTBYMAIL',$user); - if ($result < 0) $error++; - // End call triggers - */ + * if ($obj->source_type == 'contact') + * { + * $emailing->sendtoid = $obj->source_id; + * } + * if ($obj->source_type == 'thirdparty') + * { + * $emailing->socid = $obj->source_id; + * } + * // Call trigger + * $result=$emailing->call_trigger('EMAILING_SENTBYMAIL',$user); + * if ($result < 0) $error++; + * // End call triggers + */ - $sqlok ="UPDATE ".MAIN_DB_PREFIX."mailing_cibles"; - $sqlok.=" SET statut=1, date_envoi='".$db->idate($now)."' WHERE rowid=".$obj->rowid; - $resqlok=$db->query($sqlok); - if (! $resqlok) - { + $sqlok = "UPDATE " . MAIN_DB_PREFIX . "mailing_cibles"; + $sqlok .= " SET statut=1, date_envoi='" . $db->idate($now) . "' WHERE rowid=" . $obj->rowid; + $resqlok = $db->query($sqlok); + if (! $resqlok) { dol_print_error($db); - $error++; - } - else - { - //if cheack read is use then update prospect contact status - if (strpos($message, '__CHECK_READ__') !== false) - { - //Update status communication of thirdparty prospect - $sqlx = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=2 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE rowid=".$obj->rowid.")"; + $error ++; + } else { + // if cheack read is use then update prospect contact status + if (strpos($message, '__CHECK_READ__') !== false) { + // Update status communication of thirdparty prospect + $sqlx = "UPDATE " . MAIN_DB_PREFIX . "societe SET fk_stcomm=2 WHERE rowid IN (SELECT source_id FROM " . MAIN_DB_PREFIX . "mailing_cibles WHERE rowid=" . $obj->rowid . ")"; dol_syslog("card.php: set prospect thirdparty status", LOG_DEBUG); - $resqlx=$db->query($sqlx); - if (! $resqlx) - { + $resqlx = $db->query($sqlx); + if (! $resqlx) { dol_print_error($db); - $error++; + $error ++; } - //Update status communication of contact prospect - $sqlx = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=2 WHERE rowid IN (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."socpeople AS sc INNER JOIN ".MAIN_DB_PREFIX."mailing_cibles AS mc ON mc.rowid=".$obj->rowid." AND mc.source_type = 'contact' AND mc.source_id = sc.rowid)"; + // Update status communication of contact prospect + $sqlx = "UPDATE " . MAIN_DB_PREFIX . "societe SET fk_stcomm=2 WHERE rowid IN (SELECT sc.fk_soc FROM " . MAIN_DB_PREFIX . "socpeople AS sc INNER JOIN " . MAIN_DB_PREFIX . "mailing_cibles AS mc ON mc.rowid=" . $obj->rowid . " AND mc.source_type = 'contact' AND mc.source_id = sc.rowid)"; dol_syslog("card.php: set prospect contact status", LOG_DEBUG); - $resqlx=$db->query($sqlx); - if (! $resqlx) - { + $resqlx = $db->query($sqlx); + if (! $resqlx) { dol_print_error($db); - $error++; + $error ++; } } - if (!empty($conf->global->MAILING_DELAY)) { + if (! empty($conf->global->MAILING_DELAY)) { sleep($conf->global->MAILING_DELAY); } } - } - else - { + } else { // Mail failed - $nbko++; + $nbko ++; - dol_syslog("error for emailing id ".$id." #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG); + dol_syslog("error for emailing id " . $id . " #" . $i . ($mail->error ? ' - ' . $mail->error : ''), LOG_DEBUG); - $sqlerror="UPDATE ".MAIN_DB_PREFIX."mailing_cibles"; - $sqlerror.=" SET statut=-1, date_envoi=".$db->idate($now)." WHERE rowid=".$obj->rowid; - $resqlerror=$db->query($sqlerror); - if (! $resqlerror) - { + $sqlerror = "UPDATE " . MAIN_DB_PREFIX . "mailing_cibles"; + $sqlerror .= " SET statut=-1, date_envoi=" . $db->idate($now) . " WHERE rowid=" . $obj->rowid; + $resqlerror = $db->query($sqlerror); + if (! $resqlerror) { dol_print_error($db); - $error++; + $error ++; } } - $i++; + $i ++; } - } - else - { - $mesg="Emailing id ".$id." has no recipient to target"; - print $mesg."\n"; + } else { + $mesg = "Emailing id " . $id . " has no recipient to target"; + print $mesg . "\n"; dol_syslog($mesg, LOG_ERR); } // Loop finished, set global statut of mail - $statut=2; - if (! $nbko) $statut=3; + $statut = 2; + if (! $nbko) + $statut = 3; - $sqlenddate="UPDATE ".MAIN_DB_PREFIX."mailing SET statut=".$statut." WHERE rowid=".$id; + $sqlenddate = "UPDATE " . MAIN_DB_PREFIX . "mailing SET statut=" . $statut . " WHERE rowid=" . $id; dol_syslog("update global status", LOG_DEBUG); - print "Update status of emailing id ".$id." to ".$statut."\n"; - $resqlenddate=$db->query($sqlenddate); - if (! $resqlenddate) - { + print "Update status of emailing id " . $id . " to " . $statut . "\n"; + $resqlenddate = $db->query($sqlenddate); + if (! $resqlenddate) { dol_print_error($db); - $error++; + $error ++; } - } - else - { + } else { dol_print_error($db); - $error++; + $error ++; } } - } - else - { - $mesg="No validated emailing id to send found."; - print $mesg."\n"; + } else { + $mesg = "No validated emailing id to send found."; + print $mesg . "\n"; dol_syslog($mesg, LOG_ERR); - $error++; + $error ++; } -} -else -{ +} else { dol_print_error($db); - $error++; + $error ++; } - exit($error); diff --git a/scripts/invoices/email_unpaid_invoices_to_customers.php b/scripts/invoices/email_unpaid_invoices_to_customers.php index 5681688c645..e64c9e10edb 100755 --- a/scripts/invoices/email_unpaid_invoices_to_customers.php +++ b/scripts/invoices/email_unpaid_invoices_to_customers.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2005-2013 Laurent Destailleur - * Copyright (C) 2013 Juanjo Menent + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2005-2013 Laurent Destailleur + * Copyright (C) 2013 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 @@ -12,7 +12,7 @@ * * 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 + * 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 @@ -20,288 +20,272 @@ */ /** - * \file scripts/invoices/email_unpaid_invoices_to_customers.php - * \ingroup facture - * \brief Script to send a mail to customers with unpaid invoices + * \file scripts/invoices/email_unpaid_invoices_to_customers.php + * \ingroup facture + * \brief Script to send a mail to customers with unpaid invoices */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test si mode batch $sapi_type = php_sapi_name(); if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -if (! isset($argv[2]) || ! $argv[2] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts'))) -{ +if (! isset($argv[2]) || ! $argv[2] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts'))) { print "Usage: $script_file (test|confirm) (thirdparties|contacts) [delay] [after]\n"; print "\n"; print "Send an email to customers to remind all unpaid customer invoices.\n"; print "If you choose 'test' mode, no emails are sent.\n"; print "If you add param delay (nb of days), only invoice with due date < today + delay are included.\n"; print "If you add param after (nb of days), only invoice with due date >= today + delay are included.\n"; - exit(-1); + exit(- 1); } -$mode=$argv[1]; -$targettype=$argv[2]; +$mode = $argv[1]; +$targettype = $argv[2]; - -require $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"; +require $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php"; $langs->load('main'); // Global variables -$version=DOL_VERSION; -$error=0; - - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); -$now=dol_now('tzserver'); -$duration_value=isset($argv[3])?$argv[3]:'none'; -$duration_value2=isset($argv[4])?$argv[4]:'none'; +$now = dol_now('tzserver'); +$duration_value = isset($argv[3]) ? $argv[3] : 'none'; +$duration_value2 = isset($argv[4]) ? $argv[4] : 'none'; $error = 0; -print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"").(is_numeric($duration_value2)?" after=".$duration_value2:"")."\n"; +print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . (is_numeric($duration_value2) ? " after=" . $duration_value2 : "") . "\n"; -if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1; +if ($mode != 'confirm') + $conf->global->MAIN_DISABLE_ALL_MAILS = 1; $sql = "SELECT f.ref, f.total_ttc, f.date_lim_reglement as due_date,"; -$sql.= " s.rowid as sid, s.nom as name, s.email, s.default_lang"; -if ($targettype == 'contacts') $sql.= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail"; -$sql.= " FROM ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."societe as s"; -if ($targettype == 'contacts') $sql.= ", ".MAIN_DB_PREFIX."socpeople as sp"; -$sql.= " WHERE f.fk_statut = 1 AND f.paye = 0"; -$sql.= " AND f.fk_soc = s.rowid"; -if (is_numeric($duration_value2)) $sql.= " AND f.date_lim_reglement >= '".$db->idate(dol_time_plus_duree($now, $duration_value2, "d"))."'"; -if (is_numeric($duration_value)) $sql.= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; -if ($targettype == 'contacts') $sql.= " AND s.rowid = sp.fk_soc"; -$sql.= " ORDER BY"; -if ($targettype == 'contacts') $sql.= " sp.email, sp.rowid,"; -$sql.= " s.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email +$sql .= " s.rowid as sid, s.nom as name, s.email, s.default_lang"; +if ($targettype == 'contacts') + $sql .= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture as f, " . MAIN_DB_PREFIX . "societe as s"; +if ($targettype == 'contacts') + $sql .= ", " . MAIN_DB_PREFIX . "socpeople as sp"; +$sql .= " WHERE f.fk_statut = 1 AND f.paye = 0"; +$sql .= " AND f.fk_soc = s.rowid"; +if (is_numeric($duration_value2)) + $sql .= " AND f.date_lim_reglement >= '" . $db->idate(dol_time_plus_duree($now, $duration_value2, "d")) . "'"; +if (is_numeric($duration_value)) + $sql .= " AND f.date_lim_reglement < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'"; +if ($targettype == 'contacts') + $sql .= " AND s.rowid = sp.fk_soc"; +$sql .= " ORDER BY"; +if ($targettype == 'contacts') + $sql .= " sp.email, sp.rowid,"; +$sql .= " s.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email -//print $sql; -$resql=$db->query($sql); -if ($resql) -{ - $num = $db->num_rows($resql); - $i = 0; - $oldemail = 'none'; $oldsid = 0; $oldcid = 0; $oldlang=''; - $total = 0; $foundtoprocess = 0; - $trackthirdpartiessent = array(); +// print $sql; +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + $oldemail = 'none'; + $oldsid = 0; + $oldcid = 0; + $oldlang = ''; + $total = 0; + $foundtoprocess = 0; + $trackthirdpartiessent = array(); - print "We found ".$num." couples (unpayed validated invoices-".$targettype.") qualified\n"; - dol_syslog("We found ".$num." couples (unpayed validated invoices-".$targettype.") qualified"); - $message=''; + print "We found " . $num . " couples (unpayed validated invoices-" . $targettype . ") qualified\n"; + dol_syslog("We found " . $num . " couples (unpayed validated invoices-" . $targettype . ") qualified"); + $message = ''; - if ($num) - { - while ($i < $num) - { - $obj = $db->fetch_object($resql); + if ($num) { + while ($i < $num) { + $obj = $db->fetch_object($resql); - $newemail=empty($obj->cemail)?$obj->email:$obj->cemail; + $newemail = empty($obj->cemail) ? $obj->email : $obj->cemail; - // Check if this record is a break after previous one - $startbreak=false; - if ($newemail <> $oldemail || $oldemail == 'none') $startbreak=true; - if ($obj->sid && $obj->sid <> $oldsid) $startbreak=true; - if ($obj->cid && $obj->cid <> $oldcid) $startbreak=true; + // Check if this record is a break after previous one + $startbreak = false; + if ($newemail != $oldemail || $oldemail == 'none') + $startbreak = true; + if ($obj->sid && $obj->sid != $oldsid) + $startbreak = true; + if ($obj->cid && $obj->cid != $oldcid) + $startbreak = true; - if ($startbreak) - { - // Break onto sales representative (new email or cid) - if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget); - $trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid; - } - else - { - if ($oldemail != 'none') - { - if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n"; - else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n"; - } - } - $oldemail = $newemail; - $oldsid = $obj->sid; - $oldcid = $obj->cid; - $oldlang = $obj->lang; - $oldtarget=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname); - $message = ''; - $total = 0; - $foundtoprocess = 0; - $target=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname); - //if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n"; - } + if ($startbreak) { + // Break onto sales representative (new email or cid) + if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) { + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget); + $trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid; + } else { + if ($oldemail != 'none') { + if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) + print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n"; + else + print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n"; + } + } + $oldemail = $newemail; + $oldsid = $obj->sid; + $oldcid = $obj->cid; + $oldlang = $obj->lang; + $oldtarget = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname); + $message = ''; + $total = 0; + $foundtoprocess = 0; + $target = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname); + // if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n"; + } - // Define line content - $outputlangs=new Translate('', $conf); - $outputlangs->setDefaultLang(empty($obj->default_lang)?$langs->defaultlang:$obj->default_lang); // By default language of customer + // Define line content + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang(empty($obj->default_lang) ? $langs->defaultlang : $obj->default_lang); // By default language of customer - // Load translation files required by the page - $outputlangs->loadLangs(array("main", "bills")); + // Load translation files required by the page + $outputlangs->loadLangs(array("main","bills")); - if (dol_strlen($newemail)) - { - $message .= $outputlangs->trans("Invoice")." ".$obj->ref." : ".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency)."\n"; - dol_syslog("email_unpaid_invoices_to_customers.php: ".$newemail." ".$message); - $foundtoprocess++; - } - print "Unpaid invoice ".$obj->ref.", price ".price2num($obj->total_ttc).", due date ".dol_print_date($db->jdate($obj->due_date), 'day').", customer id ".$obj->sid." ".$obj->name.", ".($obj->cid?"contact id ".$obj->cid." ".$obj->clastname." ".$obj->cfirstname.", ":"")."email ".$newemail.", lang ".$outputlangs->defaultlang.": "; - if (dol_strlen($newemail)) print "qualified."; - else print "disqualified (no email)."; - print "\n"; + if (dol_strlen($newemail)) { + $message .= $outputlangs->trans("Invoice") . " " . $obj->ref . " : " . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . "\n"; + dol_syslog("email_unpaid_invoices_to_customers.php: " . $newemail . " " . $message); + $foundtoprocess ++; + } + print "Unpaid invoice " . $obj->ref . ", price " . price2num($obj->total_ttc) . ", due date " . dol_print_date($db->jdate($obj->due_date), 'day') . ", customer id " . $obj->sid . " " . $obj->name . ", " . ($obj->cid ? "contact id " . $obj->cid . " " . $obj->clastname . " " . $obj->cfirstname . ", " : "") . "email " . $newemail . ", lang " . $outputlangs->defaultlang . ": "; + if (dol_strlen($newemail)) + print "qualified."; + else + print "disqualified (no email)."; + print "\n"; - unset($outputlangs); + unset($outputlangs); - $total += $obj->total_ttc; + $total += $obj->total_ttc; - $i++; - } + $i ++; + } - // Si il reste des envois en buffer - if ($foundtoprocess) - { - if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) // Break onto email (new email) - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget); - $trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid; - } - else + // Si il reste des envois en buffer + if ($foundtoprocess) { + if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) // Break onto email (new email) { - if ($oldemail != 'none') - { - if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n"; - else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n"; - } - } - } - } - else - { - print "No unpaid invoices found\n"; - } + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget); + $trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid; + } else { + if ($oldemail != 'none') { + if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) + print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n"; + else + print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n"; + } + } + } + } else { + print "No unpaid invoices found\n"; + } - exit(0); + exit(0); +} else { + dol_print_error($db); + dol_syslog("email_unpaid_invoices_to_customers.php: Error"); + + exit(- 1); } -else -{ - dol_print_error($db); - dol_syslog("email_unpaid_invoices_to_customers.php: Error"); - - exit(-1); -} - /** - * Send email + * Send email * - * @param string $mode Mode (test | confirm) - * @param string $oldemail Target email - * @param string $message Message to send - * @param string $total Total amount of unpayed invoices - * @param string $userlang Code lang to use for email output. - * @param string $oldtarget Target name - * @return int <0 if KO, >0 if OK + * @param string $mode + * Mode (test | confirm) + * @param string $oldemail + * Target email + * @param string $message + * Message to send + * @param string $total + * Total amount of unpayed invoices + * @param string $userlang + * Code lang to use for email output. + * @param string $oldtarget + * Target name + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldtarget) { - global $conf,$langs; + global $conf, $langs; - if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO'); + if (getenv('DOL_FORCE_EMAIL_TO')) + $oldemail = getenv('DOL_FORCE_EMAIL_TO'); - $newlangs=new Translate('', $conf); - $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); - $newlangs->load("main"); - $newlangs->load("bills"); + $newlangs = new Translate('', $conf); + $newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang); + $newlangs->load("main"); + $newlangs->load("bills"); - $subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT)?$newlangs->trans("ListOfYourUnpaidInvoices"):$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT); - $sendto = $oldemail; - $from = $conf->global->MAIN_MAIL_EMAIL_FROM; - $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; - $msgishtml = -1; + $subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT) ? $newlangs->trans("ListOfYourUnpaidInvoices") : $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT); + $sendto = $oldemail; + $from = $conf->global->MAIN_MAIL_EMAIL_FROM; + $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; + $msgishtml = - 1; - print "- Send email to '".$oldtarget."' (".$oldemail."), total: ".$total."\n"; - dol_syslog("email_unpaid_invoices_to_customers.php: send mail to ".$oldemail); + print "- Send email to '" . $oldtarget . "' (" . $oldemail . "), total: " . $total . "\n"; + dol_syslog("email_unpaid_invoices_to_customers.php: send mail to " . $oldemail); - $usehtml=0; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) $usehtml+=1; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER)) $usehtml+=1; + $usehtml = 0; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) + $usehtml += 1; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER)) + $usehtml += 1; - $allmessage=''; - if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER; - } - else - { - $allmessage.= "Dear customer".($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - $allmessage.= "Please, find a summary of the bills with pending payments from you.".($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - $allmessage.= "Note: This list contains only unpaid invoices.".($usehtml?"
\n":"\n"); - } - $allmessage.= $message.($usehtml?"
\n":"\n"); - $allmessage.= $langs->trans("Total")." = ".price($total, 0, $userlang, 0, 0, -1, $conf->currency).($usehtml?"
\n":"\n"); - if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) $usehtml+=1; - } + $allmessage = ''; + if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER; + } else { + $allmessage .= "Dear customer" . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + $allmessage .= "Please, find a summary of the bills with pending payments from you." . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + $allmessage .= "Note: This list contains only unpaid invoices." . ($usehtml ? "
\n" : "\n"); + } + $allmessage .= $message . ($usehtml ? "
\n" : "\n"); + $allmessage .= $langs->trans("Total") . " = " . price($total, 0, $userlang, 0, 0, - 1, $conf->currency) . ($usehtml ? "
\n" : "\n"); + if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) + $usehtml += 1; + } - $mail = new CMailFile( - $subject, - $sendto, - $from, - $allmessage, - array(), - array(), - array(), - '', - '', - 0, - $msgishtml - ); + $mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml); - $mail->errors_to = $errorsto; + $mail->errors_to = $errorsto; - // Send or not email - if ($mode == 'confirm') - { - $result=$mail->sendfile(); - if (! $result) - { - print "Error sending email ".$mail->error."\n"; - dol_syslog("Error sending email ".$mail->error."\n"); - } - } - else - { - print "No email sent (test mode)\n"; - dol_syslog("No email sent (test mode)"); - $mail->dump_mail(); - $result=1; - } + // Send or not email + if ($mode == 'confirm') { + $result = $mail->sendfile(); + if (! $result) { + print "Error sending email " . $mail->error . "\n"; + dol_syslog("Error sending email " . $mail->error . "\n"); + } + } else { + print "No email sent (test mode)\n"; + dol_syslog("No email sent (test mode)"); + $mail->dump_mail(); + $result = 1; + } - unset($newlangs); - if ($result) - { - return 1; - } - else - { - return -1; - } + unset($newlangs); + if ($result) { + return 1; + } else { + return - 1; + } } diff --git a/scripts/invoices/email_unpaid_invoices_to_representatives.php b/scripts/invoices/email_unpaid_invoices_to_representatives.php index 126ee5b8bd4..bf4264d57ba 100755 --- a/scripts/invoices/email_unpaid_invoices_to_representatives.php +++ b/scripts/invoices/email_unpaid_invoices_to_representatives.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2005-2013 Laurent Destailleur - * Copyright (C) 2013 Juanjo Menent + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2005-2013 Laurent Destailleur + * Copyright (C) 2013 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 @@ -12,7 +12,7 @@ * * 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 + * 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 @@ -20,260 +20,235 @@ */ /** - * \file scripts/invoices/email_unpaid_invoices_to_representatives.php - * \ingroup facture - * \brief Script to send a mail to dolibarr users linked to companies with unpaid invoices + * \file scripts/invoices/email_unpaid_invoices_to_representatives.php + * \ingroup facture + * \brief Script to send a mail to dolibarr users linked to companies with unpaid invoices */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test si mode batch $sapi_type = php_sapi_name(); if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm'))) -{ +if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm'))) { print "Usage: $script_file (test|confirm) [delay]\n"; print "\n"; print "Send an email to users to remind all unpaid customer invoices user is sale representative for.\n"; print "If you choose 'test' mode, no emails are sent.\n"; print "If you add a delay (nb of days), only invoice with due date < today + delay are included.\n"; - exit(-1); + exit(- 1); } -$mode=$argv[1]; +$mode = $argv[1]; - -require $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"; +require $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php"; $langs->load('main'); - // Global variables -$version=DOL_VERSION; -$error=0; - - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); -$now=dol_now('tzserver'); -$duration_value=isset($argv[2])?$argv[2]:'none'; +$now = dol_now('tzserver'); +$duration_value = isset($argv[2]) ? $argv[2] : 'none'; -print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"")."\n"; +print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . "\n"; -if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1; +if ($mode != 'confirm') + $conf->global->MAIN_DISABLE_ALL_MAILS = 1; $sql = "SELECT f.ref, f.total_ttc, f.date_lim_reglement as due_date, s.nom as name, s.email, s.default_lang,"; -$sql.= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang"; -$sql .= " FROM ".MAIN_DB_PREFIX."facture as f"; -$sql .= " , ".MAIN_DB_PREFIX."societe as s"; -$sql .= " , ".MAIN_DB_PREFIX."societe_commerciaux as sc"; -$sql .= " , ".MAIN_DB_PREFIX."user as u"; +$sql .= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang"; +$sql .= " FROM " . MAIN_DB_PREFIX . "facture as f"; +$sql .= " , " . MAIN_DB_PREFIX . "societe as s"; +$sql .= " , " . MAIN_DB_PREFIX . "societe_commerciaux as sc"; +$sql .= " , " . MAIN_DB_PREFIX . "user as u"; $sql .= " WHERE f.fk_statut = 1 AND f.paye = 0"; $sql .= " AND f.fk_soc = s.rowid"; -if (is_numeric($duration_value)) $sql .= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; +if (is_numeric($duration_value)) + $sql .= " AND f.date_lim_reglement < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'"; $sql .= " AND sc.fk_soc = s.rowid"; $sql .= " AND sc.fk_user = u.rowid"; -$sql .= " ORDER BY u.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email +$sql .= " ORDER BY u.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email -//print $sql; -$resql=$db->query($sql); -if ($resql) -{ - $num = $db->num_rows($resql); - $i = 0; - $oldemail = 'none'; $olduid = 0; $oldlang=''; - $total = 0; $foundtoprocess = 0; - print "We found ".$num." couples (unpayed validated invoice - sale representative) qualified\n"; - dol_syslog("We found ".$num." couples (unpayed validated invoice - sale representative) qualified"); - $message=''; +// print $sql; +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + $i = 0; + $oldemail = 'none'; + $olduid = 0; + $oldlang = ''; + $total = 0; + $foundtoprocess = 0; + print "We found " . $num . " couples (unpayed validated invoice - sale representative) qualified\n"; + dol_syslog("We found " . $num . " couples (unpayed validated invoice - sale representative) qualified"); + $message = ''; - if ($num) - { - while ($i < $num) - { - $obj = $db->fetch_object($resql); + if ($num) { + while ($i < $num) { + $obj = $db->fetch_object($resql); - if (($obj->email <> $oldemail || $obj->uid <> $olduid) || $oldemail == 'none') - { - // Break onto sales representative (new email or uid) - if (dol_strlen($oldemail) && $oldemail != 'none') - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative); - } - else - { - if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n"; - } - $oldemail = $obj->email; - $olduid = $obj->uid; - $oldlang = $obj->lang; - $oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname); - $message = ''; - $total = 0; - $foundtoprocess = 0; - $salerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname); - if (empty($obj->email)) print "Warning: Sale representative ".$salerepresentative." has no email. Notice disabled.\n"; - } + if (($obj->email != $oldemail || $obj->uid != $olduid) || $oldemail == 'none') { + // Break onto sales representative (new email or uid) + if (dol_strlen($oldemail) && $oldemail != 'none') { + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative); + } else { + if ($oldemail != 'none') + print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n"; + } + $oldemail = $obj->email; + $olduid = $obj->uid; + $oldlang = $obj->lang; + $oldsalerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname); + $message = ''; + $total = 0; + $foundtoprocess = 0; + $salerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname); + if (empty($obj->email)) + print "Warning: Sale representative " . $salerepresentative . " has no email. Notice disabled.\n"; + } - // Define line content - $outputlangs=new Translate('', $conf); - $outputlangs->setDefaultLang(empty($obj->lang)?$langs->defaultlang:$obj->lang); // By default language of sale representative + // Define line content + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang(empty($obj->lang) ? $langs->defaultlang : $obj->lang); // By default language of sale representative - // Load translation files required by the page - $outputlangs->loadLangs(array("main", "bills")); + // Load translation files required by the page + $outputlangs->loadLangs(array("main","bills")); - if (dol_strlen($obj->email)) - { - $message .= $outputlangs->trans("Invoice")." ".$obj->ref." : ".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency)." : ".$obj->name."\n"; - dol_syslog("email_unpaid_invoices_to_representatives.php: ".$obj->email); - $foundtoprocess++; - } - print "Unpaid invoice ".$obj->ref.", price ".price2num($obj->total_ttc).", due date ".dol_print_date($db->jdate($obj->due_date), 'day')." (linked to company ".$obj->name.", sale representative ".dolGetFirstLastname($obj->firstname, $obj->lastname).", email ".$obj->email.", lang ".$outputlangs->defaultlang."): "; - if (dol_strlen($obj->email)) print "qualified."; - else print "disqualified (no email)."; + if (dol_strlen($obj->email)) { + $message .= $outputlangs->trans("Invoice") . " " . $obj->ref . " : " . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . " : " . $obj->name . "\n"; + dol_syslog("email_unpaid_invoices_to_representatives.php: " . $obj->email); + $foundtoprocess ++; + } + print "Unpaid invoice " . $obj->ref . ", price " . price2num($obj->total_ttc) . ", due date " . dol_print_date($db->jdate($obj->due_date), 'day') . " (linked to company " . $obj->name . ", sale representative " . dolGetFirstLastname($obj->firstname, $obj->lastname) . ", email " . $obj->email . ", lang " . $outputlangs->defaultlang . "): "; + if (dol_strlen($obj->email)) + print "qualified."; + else + print "disqualified (no email)."; print "\n"; unset($outputlangs); - $total += $obj->total_ttc; - $i++; - } + $total += $obj->total_ttc; + $i ++; + } - // Si il reste des envois en buffer - if ($foundtoprocess) - { - if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email) - { - envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative); - } - else + // Si il reste des envois en buffer + if ($foundtoprocess) { + if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email) { - if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n"; - } - } - } - else - { - print "No unpaid invoices (for companies linked to a particular commercial dolibarr user) found\n"; - } + envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative); + } else { + if ($oldemail != 'none') + print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n"; + } + } + } else { + print "No unpaid invoices (for companies linked to a particular commercial dolibarr user) found\n"; + } - exit(0); + exit(0); +} else { + dol_print_error($db); + dol_syslog("email_unpaid_invoices_to_representatives.php: Error"); + + exit(- 1); } -else -{ - dol_print_error($db); - dol_syslog("email_unpaid_invoices_to_representatives.php: Error"); - - exit(-1); -} - /** - * Send email + * Send email * - * @param string $mode Mode (test | confirm) - * @param string $oldemail Old email - * @param string $message Message to send - * @param string $total Total amount of unpayed invoices - * @param string $userlang Code lang to use for email output. - * @param string $oldsalerepresentative Old sale representative - * @return int <0 if KO, >0 if OK + * @param string $mode + * Mode (test | confirm) + * @param string $oldemail + * Old email + * @param string $message + * Message to send + * @param string $total + * Total amount of unpayed invoices + * @param string $userlang + * Code lang to use for email output. + * @param string $oldsalerepresentative + * Old sale representative + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldsalerepresentative) { - global $conf,$langs; + global $conf, $langs; - if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO'); + if (getenv('DOL_FORCE_EMAIL_TO')) + $oldemail = getenv('DOL_FORCE_EMAIL_TO'); - $newlangs=new Translate('', $conf); - $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); - $newlangs->load("main"); - $newlangs->load("bills"); + $newlangs = new Translate('', $conf); + $newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang); + $newlangs->load("main"); + $newlangs->load("bills"); - $subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT)?$newlangs->trans("ListOfYourUnpaidInvoices"):$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT); - $sendto = $oldemail; - $from = $conf->global->MAIN_MAIL_EMAIL_FROM; - $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; - $msgishtml = -1; + $subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT) ? $newlangs->trans("ListOfYourUnpaidInvoices") : $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT); + $sendto = $oldemail; + $from = $conf->global->MAIN_MAIL_EMAIL_FROM; + $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; + $msgishtml = - 1; - print "- Send email for ".$oldsalerepresentative." (".$oldemail."), total: ".$total."\n"; - dol_syslog("email_unpaid_invoices_to_representatives.php: send mail to ".$oldemail); + print "- Send email for " . $oldsalerepresentative . " (" . $oldemail . "), total: " . $total . "\n"; + dol_syslog("email_unpaid_invoices_to_representatives.php: send mail to " . $oldemail); - $usehtml=0; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER)) $usehtml+=1; + $usehtml = 0; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) + $usehtml += 1; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER)) + $usehtml += 1; - $allmessage=''; - if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER; - } - else - { - $allmessage.= $newlangs->transnoentities("ListOfYourUnpaidInvoices").($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); - $allmessage.= $newlangs->transnoentities("NoteListOfYourUnpaidInvoices").($usehtml?"
\n":"\n"); - } - $allmessage.= $message.($usehtml?"
\n":"\n"); - $allmessage.= $langs->trans("Total")." = ".price($total, 0, $newlangs, 0, 0, -1, $conf->currency).($usehtml?"
\n":"\n"); - if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) - { - $allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER; - if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1; - } + $allmessage = ''; + if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER; + } else { + $allmessage .= $newlangs->transnoentities("ListOfYourUnpaidInvoices") . ($usehtml ? "
\n" : "\n") . ($usehtml ? "
\n" : "\n"); + $allmessage .= $newlangs->transnoentities("NoteListOfYourUnpaidInvoices") . ($usehtml ? "
\n" : "\n"); + } + $allmessage .= $message . ($usehtml ? "
\n" : "\n"); + $allmessage .= $langs->trans("Total") . " = " . price($total, 0, $newlangs, 0, 0, - 1, $conf->currency) . ($usehtml ? "
\n" : "\n"); + if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) { + $allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER; + if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) + $usehtml += 1; + } - $mail = new CMailFile( - $subject, - $sendto, - $from, - $allmessage, - array(), - array(), - array(), - '', - '', - 0, - $msgishtml - ); + $mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml); - $mail->errors_to = $errorsto; + $mail->errors_to = $errorsto; - // Send or not email - if ($mode == 'confirm') - { - $result=$mail->sendfile(); - if (! $result) - { - print "Error sending email ".$mail->error."\n"; - dol_syslog("Error sending email ".$mail->error."\n"); - } - } - else - { - print "No email sent (test mode)\n"; - dol_syslog("No email sent (test mode)"); - $mail->dump_mail(); - $result=1; - } + // Send or not email + if ($mode == 'confirm') { + $result = $mail->sendfile(); + if (! $result) { + print "Error sending email " . $mail->error . "\n"; + dol_syslog("Error sending email " . $mail->error . "\n"); + } + } else { + print "No email sent (test mode)\n"; + dol_syslog("No email sent (test mode)"); + $mail->dump_mail(); + $result = 1; + } - if ($result) - { - return 1; - } - else - { - return -1; - } + if ($result) { + return 1; + } else { + return - 1; + } } diff --git a/scripts/invoices/rebuild_merge_pdf.php b/scripts/invoices/rebuild_merge_pdf.php index 62865570b28..f90f4a615c9 100755 --- a/scripts/invoices/rebuild_merge_pdf.php +++ b/scripts/invoices/rebuild_merge_pdf.php @@ -1,7 +1,7 @@ #!/usr/bin/env php + * Copyright (C) 2009-2012 Laurent Destailleur * * 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 @@ -10,7 +10,7 @@ * * 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 + * 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 @@ -18,251 +18,217 @@ */ /** - * \file scripts/invoices/rebuild_merge_pdf.php - * \ingroup facture - * \brief Script to rebuild PDF and merge PDF files into one + * \file scripts/invoices/rebuild_merge_pdf.php + * \ingroup facture + * \brief Script to rebuild PDF and merge PDF files into one */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } // Include Dolibarr environment -require_once $path."../../htdocs/master.inc.php"; +require_once $path . "../../htdocs/master.inc.php"; // After this $db is an opened handler to database. We close it at end of file. -require_once DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php"; -require_once DOL_DOCUMENT_ROOT."/core/modules/facture/modules_facture.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; -require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice2.lib.php'; - +require_once DOL_DOCUMENT_ROOT . "/compta/facture/class/facture.class.php"; +require_once DOL_DOCUMENT_ROOT . "/core/modules/facture/modules_facture.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php"; +require_once DOL_DOCUMENT_ROOT . '/core/lib/invoice2.lib.php'; // Load main language strings $langs->load("main"); // Global variables -$version=DOL_VERSION; -$error=0; - - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); // Check parameters -if (! isset($argv[1])) -{ +if (! isset($argv[1])) { usage(); - exit(-1); + exit(- 1); } -$diroutputpdf=$conf->facture->dir_output . '/temp'; -$newlangid='en_EN'; // To force a new lang id -$filter=array(); -$regenerate=''; // Ask regenerate (contains name of model to use) -$option=''; -$fileprefix='mergedpdf'; +$diroutputpdf = $conf->facture->dir_output . '/temp'; +$newlangid = 'en_EN'; // To force a new lang id +$filter = array(); +$regenerate = ''; // Ask regenerate (contains name of model to use) +$option = ''; +$fileprefix = 'mergedpdf'; -foreach ($argv as $key => $value) -{ - $found=false; +foreach ($argv as $key => $value) { + $found = false; // Define options - if (preg_match('/^lang=/i', $value)) - { - $found=true; - $valarray=explode('=', $value); - $newlangid=$valarray[1]; - print 'Use language '.$newlangid.".\n"; + if (preg_match('/^lang=/i', $value)) { + $found = true; + $valarray = explode('=', $value); + $newlangid = $valarray[1]; + print 'Use language ' . $newlangid . ".\n"; } - if (preg_match('/^prefix=/i', $value)) - { - $found=true; - $valarray=explode('=', $value); - $fileprefix=$valarray[1]; - print 'Use prefix for filename '.$fileprefix.".\n"; + if (preg_match('/^prefix=/i', $value)) { + $found = true; + $valarray = explode('=', $value); + $fileprefix = $valarray[1]; + print 'Use prefix for filename ' . $fileprefix . ".\n"; } - if (preg_match('/^regenerate=(.*)/i', $value, $reg)) - { - if (! in_array($reg[1], array('','0','no'))) - { - $found=true; - $regenerate=$reg[1]; - print 'Regeneration of PDF is requested with template '.$regenerate."\n"; - } - } - - if ($value == 'filter=all') - { - $found=true; - $option.=(empty($option)?'':'_').'all'; - $filter[]='all'; - - print 'Rebuild PDF for all invoices'."\n"; - } - - if ($value == 'filter=date') - { - $found=true; - $option.=(empty($option)?'':'_').'date_'.$argv[$key+1].'_'.$argv[$key+2]; - $filter[]='date'; - - $dateafterdate=dol_stringtotime($argv[$key+1]); - $datebeforedate=dol_stringtotime($argv[$key+2]); - print 'Rebuild PDF for invoices validated between '.dol_print_date($dateafterdate, 'day', 'gmt')." and ".dol_print_date($datebeforedate, 'day', 'gmt').".\n"; - } - - if ($value == 'filter=payments') - { - $found=true; - $option.=(empty($option)?'':'_').'payments_'.$argv[$key+1].'_'.$argv[$key+2]; - $filter[]='payments'; - - $paymentdateafter=dol_stringtotime($argv[$key+1].'000000'); - $paymentdatebefore=dol_stringtotime($argv[$key+2].'235959'); - if (empty($paymentdateafter) || empty($paymentdatebefore)) - { - print 'Error: Bad date format or value'."\n"; - exit(-1); + if (preg_match('/^regenerate=(.*)/i', $value, $reg)) { + if (! in_array($reg[1], array('','0','no'))) { + $found = true; + $regenerate = $reg[1]; + print 'Regeneration of PDF is requested with template ' . $regenerate . "\n"; } - print 'Rebuild PDF for invoices with at least one payment between '.dol_print_date($paymentdateafter, 'day', 'gmt')." and ".dol_print_date($paymentdatebefore, 'day', 'gmt').".\n"; } - if ($value == 'filter=nopayment') - { - $found=true; - $option.=(empty($option)?'':'_').'nopayment'; - $filter[]='nopayment'; + if ($value == 'filter=all') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'all'; + $filter[] = 'all'; - print 'Rebuild PDF for invoices with no payment done yet.'."\n"; + print 'Rebuild PDF for all invoices' . "\n"; } - if ($value == 'filter=bank') - { - $found=true; - $option.=(empty($option)?'':'_').'bank_'.$argv[$key+1]; - $filter[]='bank'; + if ($value == 'filter=date') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'date_' . $argv[$key + 1] . '_' . $argv[$key + 2]; + $filter[] = 'date'; - $paymentonbankref=$argv[$key+1]; - $bankaccount=new Account($db); - $result=$bankaccount->fetch(0, $paymentonbankref); - if ($result <= 0) - { - print 'Error: Bank account with ref "'.$paymentonbankref.'" not found'."\n"; - exit(-1); + $dateafterdate = dol_stringtotime($argv[$key + 1]); + $datebeforedate = dol_stringtotime($argv[$key + 2]); + print 'Rebuild PDF for invoices validated between ' . dol_print_date($dateafterdate, 'day', 'gmt') . " and " . dol_print_date($datebeforedate, 'day', 'gmt') . ".\n"; + } + + if ($value == 'filter=payments') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'payments_' . $argv[$key + 1] . '_' . $argv[$key + 2]; + $filter[] = 'payments'; + + $paymentdateafter = dol_stringtotime($argv[$key + 1] . '000000'); + $paymentdatebefore = dol_stringtotime($argv[$key + 2] . '235959'); + if (empty($paymentdateafter) || empty($paymentdatebefore)) { + print 'Error: Bad date format or value' . "\n"; + exit(- 1); } - $paymentonbankid=$bankaccount->id; - print 'Rebuild PDF for invoices with at least one payment on financial account '.$bankaccount->ref."\n"; + print 'Rebuild PDF for invoices with at least one payment between ' . dol_print_date($paymentdateafter, 'day', 'gmt') . " and " . dol_print_date($paymentdatebefore, 'day', 'gmt') . ".\n"; } - if ($value == 'filter=nodeposit') - { - $found=true; - $option.=(empty($option)?'':'_').'nodeposit'; - $filter[]='nodeposit'; + if ($value == 'filter=nopayment') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'nopayment'; + $filter[] = 'nopayment'; - print 'Exclude deposit invoices'."\n"; - } - if ($value == 'filter=noreplacement') - { - $found=true; - $option.=(empty($option)?'':'_').'noreplacement'; - $filter[]='noreplacement'; + print 'Rebuild PDF for invoices with no payment done yet.' . "\n"; + } - print 'Exclude replacement invoices'."\n"; - } - if ($value == 'filter=nocreditnote') - { - $found=true; - $option.=(empty($option)?'':'_').'nocreditnote'; - $filter[]='nocreditnote'; + if ($value == 'filter=bank') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'bank_' . $argv[$key + 1]; + $filter[] = 'bank'; - print 'Exclude credit note invoices'."\n"; - } + $paymentonbankref = $argv[$key + 1]; + $bankaccount = new Account($db); + $result = $bankaccount->fetch(0, $paymentonbankref); + if ($result <= 0) { + print 'Error: Bank account with ref "' . $paymentonbankref . '" not found' . "\n"; + exit(- 1); + } + $paymentonbankid = $bankaccount->id; + print 'Rebuild PDF for invoices with at least one payment on financial account ' . $bankaccount->ref . "\n"; + } - if ($value == 'filter=excludethirdparties') - { - $found=true; - $filter[]='excludethirdparties'; + if ($value == 'filter=nodeposit') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'nodeposit'; + $filter[] = 'nodeposit'; - $thirdpartiesid=explode(',', $argv[$key+1]); - print 'Exclude thirdparties with id in list ('.join(',', $thirdpartiesid).").\n"; + print 'Exclude deposit invoices' . "\n"; + } + if ($value == 'filter=noreplacement') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'noreplacement'; + $filter[] = 'noreplacement'; - $option.=(empty($option)?'':'_').'excludethirdparties'.join('-', $thirdpartiesid); - } - if ($value == 'filter=onlythirdparties') - { - $found=true; - $filter[]='onlythirdparties'; + print 'Exclude replacement invoices' . "\n"; + } + if ($value == 'filter=nocreditnote') { + $found = true; + $option .= (empty($option) ? '' : '_') . 'nocreditnote'; + $filter[] = 'nocreditnote'; - $thirdpartiesid=explode(',', $argv[$key+1]); - print 'Only thirdparties with id in list ('.join(',', $thirdpartiesid).").\n"; + print 'Exclude credit note invoices' . "\n"; + } - $option.=(empty($option)?'':'_').'onlythirdparty'.join('-', $thirdpartiesid); - } + if ($value == 'filter=excludethirdparties') { + $found = true; + $filter[] = 'excludethirdparties'; - if (! $found && preg_match('/filter=/i', $value)) - { + $thirdpartiesid = explode(',', $argv[$key + 1]); + print 'Exclude thirdparties with id in list (' . join(',', $thirdpartiesid) . ").\n"; + + $option .= (empty($option) ? '' : '_') . 'excludethirdparties' . join('-', $thirdpartiesid); + } + if ($value == 'filter=onlythirdparties') { + $found = true; + $filter[] = 'onlythirdparties'; + + $thirdpartiesid = explode(',', $argv[$key + 1]); + print 'Only thirdparties with id in list (' . join(',', $thirdpartiesid) . ").\n"; + + $option .= (empty($option) ? '' : '_') . 'onlythirdparty' . join('-', $thirdpartiesid); + } + + if (! $found && preg_match('/filter=/i', $value)) { usage(); - exit(-1); + exit(- 1); } } // Check if an option and a filter has been provided -if (empty($option) && count($filter) <= 0) -{ +if (empty($option) && count($filter) <= 0) { usage(); - exit(-1); + exit(- 1); } // Check if there is no uncompatible choice -if (in_array('payments', $filter) && in_array('nopayment', $filter)) -{ +if (in_array('payments', $filter) && in_array('nopayment', $filter)) { usage(); - exit(-1); + exit(- 1); } -if (in_array('bank', $filter) && in_array('nopayment', $filter)) -{ +if (in_array('bank', $filter) && in_array('nopayment', $filter)) { usage(); - exit(-1); + exit(- 1); } - // Define SQL and SQL request to select invoices // Use $filter, $dateafterdate, datebeforedate, $paymentdateafter, $paymentdatebefore -$result=rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid, $thirdpartiesid, $fileprefix); - - +$result = rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid, $thirdpartiesid, $fileprefix); // -------------------- END OF YOUR CODE -------------------- -if ($result >= 0) -{ - $error=0; - print '--- end ok'."\n"; -} -else -{ - $error=$result; - print '--- end error code='.$error."\n"; +if ($result >= 0) { + $error = 0; + print '--- end ok' . "\n"; +} else { + $error = $result; + print '--- end error code=' . $error . "\n"; } $db->close(); exit($error); - - /** * Show usage of script * @@ -272,29 +238,29 @@ function usage() { global $script_file; - print "Rebuild PDF files for some invoices and merge PDF files into one.\n"; + print "Rebuild PDF files for some invoices and merge PDF files into one.\n"; print "\n"; print "To build/merge PDF for invoices in a date range:\n"; - print "Usage: ".$script_file." filter=date dateafter datebefore\n"; + print "Usage: " . $script_file . " filter=date dateafter datebefore\n"; print "To build/merge PDF for invoices with at least one payment in a date range:\n"; - print "Usage: ".$script_file." filter=payments dateafter datebefore\n"; + print "Usage: " . $script_file . " filter=payments dateafter datebefore\n"; print "To build/merge PDF for invoices with at least one payment onto a bank account:\n"; - print "Usage: ".$script_file." filter=bank bankref\n"; + print "Usage: " . $script_file . " filter=bank bankref\n"; print "To build/merge PDF for all invoices, use filter=all\n"; - print "Usage: ".$script_file." filter=all\n"; + print "Usage: " . $script_file . " filter=all\n"; print "To build/merge PDF for invoices with no payments, use filter=nopayment\n"; - print "Usage: ".$script_file." filter=nopayment\n"; - print "To exclude credit notes, use filter=nocreditnote\n"; - print "To exclude replacement invoices, use filter=noreplacement\n"; - print "To exclude deposit invoices, use filter=nodeposit\n"; - print "To exclude some thirdparties, use filter=excludethirdparties id1,id2...\n"; - print "To limit to some thirdparties, use filter=onlythirdparties id1,id2...\n"; - print "To regenerate existing PDF, use regenerate=templatename\n"; - print "To generate invoices in a language, use lang=xx_XX\n"; - print "To set prefix of generated file name, use prefix=myfileprefix\n"; - print "\n"; - print "Example: ".$script_file." filter=payments 20080101 20081231 lang=fr_FR regenerate=crabe\n"; - print "Example: ".$script_file." filter=all lang=en_US\n"; + print "Usage: " . $script_file . " filter=nopayment\n"; + print "To exclude credit notes, use filter=nocreditnote\n"; + print "To exclude replacement invoices, use filter=noreplacement\n"; + print "To exclude deposit invoices, use filter=nodeposit\n"; + print "To exclude some thirdparties, use filter=excludethirdparties id1,id2...\n"; + print "To limit to some thirdparties, use filter=onlythirdparties id1,id2...\n"; + print "To regenerate existing PDF, use regenerate=templatename\n"; + print "To generate invoices in a language, use lang=xx_XX\n"; + print "To set prefix of generated file name, use prefix=myfileprefix\n"; + print "\n"; + print "Example: " . $script_file . " filter=payments 20080101 20081231 lang=fr_FR regenerate=crabe\n"; + print "Example: " . $script_file . " filter=all lang=en_US\n"; print "\n"; print "Note that some filters can be cumulated.\n"; } diff --git a/scripts/members/sync_members_dolibarr2ldap.php b/scripts/members/sync_members_dolibarr2ldap.php index 598098e240a..82d9a68a1b1 100755 --- a/scripts/members/sync_members_dolibarr2ldap.php +++ b/scripts/members/sync_members_dolibarr2ldap.php @@ -1,8 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2006-2008 Laurent Destailleur + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006-2008 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,74 +19,71 @@ */ /** - * \file scripts/members/sync_members_dolibarr2ldap.php - * \ingroup ldap member - * \brief Script de mise a jour des adherents dans LDAP depuis base Dolibarr + * \file scripts/members/sync_members_dolibarr2ldap.php + * \ingroup ldap member + * \brief Script de mise a jour des adherents dans LDAP depuis base Dolibarr */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent.class.php"; $langs->load("main"); // Global variables -$version=DOL_VERSION; -$error=0; -$confirmed=0; - +$version = DOL_VERSION; +$error = 0; +$confirmed = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: $script_file now [-y]\n"; - exit(-1); + print "Usage: $script_file now [-y]\n"; + exit(- 1); } -foreach($argv as $key => $val) -{ - if (preg_match('/-y$/', $val, $reg)) $confirmed=1; +foreach ($argv as $key => $val) { + if (preg_match('/-y$/', $val, $reg)) + $confirmed = 1; } -$now=$argv[1]; +$now = $argv[1]; print "Mails sending disabled (useless in batch mode)\n"; -$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails print "\n"; print "----- Synchronize all records from Dolibarr database:\n"; -print "type=".$conf->db->type."\n"; -print "host=".$conf->db->host."\n"; -print "port=".$conf->db->port."\n"; -print "login=".$conf->db->user."\n"; -//print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons -print "database=".$conf->db->name."\n"; +print "type=" . $conf->db->type . "\n"; +print "host=" . $conf->db->host . "\n"; +print "port=" . $conf->db->port . "\n"; +print "login=" . $conf->db->user . "\n"; +// print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons +print "database=" . $conf->db->name . "\n"; print "\n"; print "----- To LDAP database:\n"; -print "host=".$conf->global->LDAP_SERVER_HOST."\n"; -print "port=".$conf->global->LDAP_SERVER_PORT."\n"; -print "login=".$conf->global->LDAP_ADMIN_DN."\n"; -print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n"; -print "DN target=".$conf->global->LDAP_MEMBER_DN."\n"; +print "host=" . $conf->global->LDAP_SERVER_HOST . "\n"; +print "port=" . $conf->global->LDAP_SERVER_PORT . "\n"; +print "login=" . $conf->global->LDAP_ADMIN_DN . "\n"; +print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n"; +print "DN target=" . $conf->global->LDAP_MEMBER_DN . "\n"; print "\n"; -if (! $confirmed) -{ +if (! $confirmed) { print "Press a key to confirm...\n"; $input = trim(fgets(STDIN)); print "Warning, this operation may result in data loss if it failed.\n"; @@ -96,76 +93,67 @@ if (! $confirmed) } /* -if (! $conf->global->LDAP_MEMBER_ACTIVE) -{ - print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); - exit(-1); -} -*/ + * if (! $conf->global->LDAP_MEMBER_ACTIVE) + * { + * print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); + * exit(-1); + * } + */ $sql = "SELECT rowid"; -$sql .= " FROM ".MAIN_DB_PREFIX."adherent"; +$sql .= " FROM " . MAIN_DB_PREFIX . "adherent"; $resql = $db->query($sql); -if ($resql) -{ +if ($resql) { $num = $db->num_rows($resql); $i = 0; - $ldap=new Ldap(); + $ldap = new Ldap(); $ldap->connect_bind(); - while ($i < $num) - { - $ldap->error=""; + while ($i < $num) { + $ldap->error = ""; $obj = $db->fetch_object($resql); $member = new Adherent($db); - $result=$member->fetch($obj->rowid); - if ($result < 0) - { + $result = $member->fetch($obj->rowid); + if ($result < 0) { dol_print_error($db, $member->error); - exit(-1); + exit(- 1); } - $result=$member->fetch_subscriptions(); - if ($result < 0) - { + $result = $member->fetch_subscriptions(); + if ($result < 0) { dol_print_error($db, $member->error); - exit(-1); + exit(- 1); } - print $langs->transnoentities("UpdateMember")." rowid=".$member->id." ".$member->getFullName($langs); + print $langs->transnoentities("UpdateMember") . " rowid=" . $member->id . " " . $member->getFullName($langs); - $oldobject=$member; + $oldobject = $member; - $oldinfo=$oldobject->_load_ldap_info(); - $olddn=$oldobject->_load_ldap_dn($oldinfo); + $oldinfo = $oldobject->_load_ldap_info(); + $olddn = $oldobject->_load_ldap_dn($oldinfo); - $info=$member->_load_ldap_info(); - $dn=$member->_load_ldap_dn($info); + $info = $member->_load_ldap_info(); + $dn = $member->_load_ldap_dn($info); - $result=$ldap->add($dn, $info, $user); // Wil fail if already exists - $result=$ldap->update($dn, $info, $user, $olddn); - if ($result > 0) - { - print " - ".$langs->transnoentities("OK"); - } - else - { - $error++; - print " - ".$langs->transnoentities("KO").' - '.$ldap->error; + $result = $ldap->add($dn, $info, $user); // Wil fail if already exists + $result = $ldap->update($dn, $info, $user, $olddn); + if ($result > 0) { + print " - " . $langs->transnoentities("OK"); + } else { + $error ++; + print " - " . $langs->transnoentities("KO") . ' - ' . $ldap->error; } print "\n"; - $i++; + $i ++; } $ldap->unbind(); $ldap->close(); -} -else -{ +} else { dol_print_error($db); } diff --git a/scripts/members/sync_members_ldap2dolibarr.php b/scripts/members/sync_members_ldap2dolibarr.php index 2a9036ca0b2..3a7aee9c5df 100755 --- a/scripts/members/sync_members_ldap2dolibarr.php +++ b/scripts/members/sync_members_ldap2dolibarr.php @@ -1,8 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2006-2015 Laurent Destailleur + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006-2015 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,322 +19,265 @@ */ /** - * \file scripts/members/sync_members_ldap2dolibarr.php - * \ingroup ldap member - * \brief Script de mise a jour des adherents dans Dolibarr depuis LDAP + * \file scripts/members/sync_members_ldap2dolibarr.php + * \ingroup ldap member + * \brief Script de mise a jour des adherents dans Dolibarr depuis LDAP */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php"; -require_once DOL_DOCUMENT_ROOT."/adherents/class/subscription.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent.class.php"; +require_once DOL_DOCUMENT_ROOT . "/adherents/class/subscription.class.php"; -$langs->loadLangs(array("main", "errors")); +$langs->loadLangs(array("main","errors")); // Global variables -$version=DOL_VERSION; -$error=0; -$forcecommit=0; -$confirmed=0; - +$version = DOL_VERSION; +$error = 0; +$forcecommit = 0; +$confirmed = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); // List of fields to get from LDAP -$required_fields = array( - $conf->global->LDAP_KEY_MEMBERS, - $conf->global->LDAP_FIELD_FULLNAME, - $conf->global->LDAP_FIELD_LOGIN, - $conf->global->LDAP_FIELD_LOGIN_SAMBA, - $conf->global->LDAP_FIELD_PASSWORD, - $conf->global->LDAP_FIELD_PASSWORD_CRYPTED, - $conf->global->LDAP_FIELD_NAME, - $conf->global->LDAP_FIELD_FIRSTNAME, - $conf->global->LDAP_FIELD_MAIL, - $conf->global->LDAP_FIELD_PHONE, - $conf->global->LDAP_FIELD_PHONE_PERSO, - $conf->global->LDAP_FIELD_MOBILE, - $conf->global->LDAP_FIELD_FAX, - $conf->global->LDAP_FIELD_ADDRESS, - $conf->global->LDAP_FIELD_ZIP, - $conf->global->LDAP_FIELD_TOWN, - $conf->global->LDAP_FIELD_COUNTRY, - $conf->global->LDAP_FIELD_DESCRIPTION, - $conf->global->LDAP_FIELD_BIRTHDATE, - $conf->global->LDAP_FIELD_MEMBER_STATUS, - $conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION, +$required_fields = array($conf->global->LDAP_KEY_MEMBERS,$conf->global->LDAP_FIELD_FULLNAME,$conf->global->LDAP_FIELD_LOGIN,$conf->global->LDAP_FIELD_LOGIN_SAMBA,$conf->global->LDAP_FIELD_PASSWORD,$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,$conf->global->LDAP_FIELD_NAME,$conf->global->LDAP_FIELD_FIRSTNAME,$conf->global->LDAP_FIELD_MAIL,$conf->global->LDAP_FIELD_PHONE,$conf->global->LDAP_FIELD_PHONE_PERSO,$conf->global->LDAP_FIELD_MOBILE,$conf->global->LDAP_FIELD_FAX,$conf->global->LDAP_FIELD_ADDRESS,$conf->global->LDAP_FIELD_ZIP,$conf->global->LDAP_FIELD_TOWN,$conf->global->LDAP_FIELD_COUNTRY,$conf->global->LDAP_FIELD_DESCRIPTION,$conf->global->LDAP_FIELD_BIRTHDATE,$conf->global->LDAP_FIELD_MEMBER_STATUS,$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION, // Subscriptions - $conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE, - $conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT, - $conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE, - $conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT -); + $conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE,$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT,$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE,$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT); // Remove from required_fields all entries not configured in LDAP (empty) and duplicated -$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement"))); - +$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElement"))); if (! isset($argv[2]) || ! is_numeric($argv[2])) { - print "Usage: $script_file (nocommitiferror|commitiferror) id_member_type [--server=ldapserverhost] [-y]\n"; - exit(-1); + print "Usage: $script_file (nocommitiferror|commitiferror) id_member_type [--server=ldapserverhost] [-y]\n"; + exit(- 1); } -$typeid=$argv[2]; -foreach($argv as $key => $val) -{ - if ($val == 'commitiferror') $forcecommit=1; - if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1]; - if (preg_match('/-y$/', $val, $reg)) $confirmed=1; +$typeid = $argv[2]; +foreach ($argv as $key => $val) { + if ($val == 'commitiferror') + $forcecommit = 1; + if (preg_match('/--server=([^\s]+)$/', $val, $reg)) + $conf->global->LDAP_SERVER_HOST = $reg[1]; + if (preg_match('/-y$/', $val, $reg)) + $confirmed = 1; } print "Mails sending disabled (useless in batch mode)\n"; -$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails print "\n"; print "----- Synchronize all records from LDAP database:\n"; -print "host=".$conf->global->LDAP_SERVER_HOST."\n"; -print "port=".$conf->global->LDAP_SERVER_PORT."\n"; -print "login=".$conf->global->LDAP_ADMIN_DN."\n"; -print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n"; -print "DN to extract=".$conf->global->LDAP_MEMBER_DN."\n"; -if (! empty($conf->global->LDAP_MEMBER_FILTER)) print 'Filter=('.$conf->global->LDAP_MEMBER_FILTER.')'."\n"; // Note: filter is defined into function getRecords -else print 'Filter=('.$conf->global->LDAP_KEY_MEMBERS.'=*)'."\n"; +print "host=" . $conf->global->LDAP_SERVER_HOST . "\n"; +print "port=" . $conf->global->LDAP_SERVER_PORT . "\n"; +print "login=" . $conf->global->LDAP_ADMIN_DN . "\n"; +print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n"; +print "DN to extract=" . $conf->global->LDAP_MEMBER_DN . "\n"; +if (! empty($conf->global->LDAP_MEMBER_FILTER)) + print 'Filter=(' . $conf->global->LDAP_MEMBER_FILTER . ')' . "\n"; // Note: filter is defined into function getRecords +else + print 'Filter=(' . $conf->global->LDAP_KEY_MEMBERS . '=*)' . "\n"; print "----- To Dolibarr database:\n"; -print "type=".$conf->db->type."\n"; -print "host=".$conf->db->host."\n"; -print "port=".$conf->db->port."\n"; -print "login=".$conf->db->user."\n"; -print "database=".$conf->db->name."\n"; +print "type=" . $conf->db->type . "\n"; +print "host=" . $conf->db->host . "\n"; +print "port=" . $conf->db->port . "\n"; +print "login=" . $conf->db->user . "\n"; +print "database=" . $conf->db->name . "\n"; print "----- Options:\n"; -print "commitiferror=".$forcecommit."\n"; -print "Mapped LDAP fields=".join(',', $required_fields)."\n"; +print "commitiferror=" . $forcecommit . "\n"; +print "Mapped LDAP fields=" . join(',', $required_fields) . "\n"; print "\n"; // Check parameters -if (empty($conf->global->LDAP_MEMBER_DN)) -{ - print $langs->trans("Error").': '.$langs->trans("LDAP setup for members not defined inside Dolibarr")."\n"; - exit(-1); +if (empty($conf->global->LDAP_MEMBER_DN)) { + print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for members not defined inside Dolibarr") . "\n"; + exit(- 1); } -if ($typeid <= 0) -{ - print $langs->trans("Error").': Parameter id_member_type is not a valid ref of an existing member type'."\n"; - exit(-2); +if ($typeid <= 0) { + print $langs->trans("Error") . ': Parameter id_member_type is not a valid ref of an existing member type' . "\n"; + exit(- 2); } - -if (! $confirmed) -{ +if (! $confirmed) { print "Hit Enter to continue or CTRL+C to stop...\n"; $input = trim(fgets(STDIN)); } // Load table of correspondence of countries -$hashlib2rowid=array(); -$countries=array(); +$hashlib2rowid = array(); +$countries = array(); $sql = "SELECT rowid, code, label, active"; -$sql.= " FROM ".MAIN_DB_PREFIX."c_country"; -$sql.= " WHERE active = 1"; -$sql.= " ORDER BY code ASC"; -$resql=$db->query($sql); -if ($resql) -{ +$sql .= " FROM " . MAIN_DB_PREFIX . "c_country"; +$sql .= " WHERE active = 1"; +$sql .= " ORDER BY code ASC"; +$resql = $db->query($sql); +if ($resql) { $num = $db->num_rows($resql); $i = 0; - if ($num) - { - while ($i < $num) - { + if ($num) { + while ($i < $num) { $obj = $db->fetch_object($resql); - if ($obj) - { - //print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n"; - $hashlib2rowid[strtolower($obj->label)]=$obj->rowid; - $countries[$obj->rowid]=array('rowid' => $obj->rowid, 'label' => $obj->label, 'code' => $obj->code); + if ($obj) { + // print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n"; + $hashlib2rowid[strtolower($obj->label)] = $obj->rowid; + $countries[$obj->rowid] = array('rowid' => $obj->rowid,'label' => $obj->label,'code' => $obj->code); } - $i++; + $i ++; } } -} -else -{ +} else { dol_print_error($db); - exit(-1); + exit(- 1); } - - $ldap = new Ldap(); $result = $ldap->connect_bind(); -if ($result >= 0) -{ - $justthese=array(); - +if ($result >= 0) { + $justthese = array(); // We disable synchro Dolibarr-LDAP - $conf->global->LDAP_MEMBER_ACTIVE=0; + $conf->global->LDAP_MEMBER_ACTIVE = 0; - $ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_MEMBER_DN, $conf->global->LDAP_KEY_MEMBERS, $required_fields, 'member'); // Fiter on 'member' filter param - if (is_array($ldaprecords)) - { + $ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_MEMBER_DN, $conf->global->LDAP_KEY_MEMBERS, $required_fields, 'member'); // Fiter on 'member' filter param + if (is_array($ldaprecords)) { $db->begin(); // Warning $ldapuser has a key in lowercase - foreach ($ldaprecords as $key => $ldapuser) - { + foreach ($ldaprecords as $key => $ldapuser) { $member = new Adherent($db); // Propriete membre - $member->firstname=$ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME]; - $member->lastname=$ldapuser[$conf->global->LDAP_FIELD_NAME]; - $member->login=$ldapuser[$conf->global->LDAP_FIELD_LOGIN]; - $member->pass=$ldapuser[$conf->global->LDAP_FIELD_PASSWORD]; + $member->firstname = $ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME]; + $member->lastname = $ldapuser[$conf->global->LDAP_FIELD_NAME]; + $member->login = $ldapuser[$conf->global->LDAP_FIELD_LOGIN]; + $member->pass = $ldapuser[$conf->global->LDAP_FIELD_PASSWORD]; - //$member->societe; - $member->address=$ldapuser[$conf->global->LDAP_FIELD_ADDRESS]; - $member->zip=$ldapuser[$conf->global->LDAP_FIELD_ZIP]; - $member->town=$ldapuser[$conf->global->LDAP_FIELD_TOWN]; - $member->country=$ldapuser[$conf->global->LDAP_FIELD_COUNTRY]; - $member->country_id=$countries[$hashlib2rowid[strtolower($member->country)]]['rowid']; - $member->country_code=$countries[$hashlib2rowid[strtolower($member->country)]]['code']; + // $member->societe; + $member->address = $ldapuser[$conf->global->LDAP_FIELD_ADDRESS]; + $member->zip = $ldapuser[$conf->global->LDAP_FIELD_ZIP]; + $member->town = $ldapuser[$conf->global->LDAP_FIELD_TOWN]; + $member->country = $ldapuser[$conf->global->LDAP_FIELD_COUNTRY]; + $member->country_id = $countries[$hashlib2rowid[strtolower($member->country)]]['rowid']; + $member->country_code = $countries[$hashlib2rowid[strtolower($member->country)]]['code']; - $member->phone=$ldapuser[$conf->global->LDAP_FIELD_PHONE]; - $member->phone_perso=$ldapuser[$conf->global->LDAP_FIELD_PHONE_PERSO]; - $member->phone_mobile=$ldapuser[$conf->global->LDAP_FIELD_MOBILE]; - $member->email=$ldapuser[$conf->global->LDAP_FIELD_MAIL]; + $member->phone = $ldapuser[$conf->global->LDAP_FIELD_PHONE]; + $member->phone_perso = $ldapuser[$conf->global->LDAP_FIELD_PHONE_PERSO]; + $member->phone_mobile = $ldapuser[$conf->global->LDAP_FIELD_MOBILE]; + $member->email = $ldapuser[$conf->global->LDAP_FIELD_MAIL]; - $member->note=$ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION]; - $member->morphy='phy'; - $member->photo=''; - $member->public=1; - $member->birth=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_BIRTHDATE]); + $member->note = $ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION]; + $member->morphy = 'phy'; + $member->photo = ''; + $member->public = 1; + $member->birth = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_BIRTHDATE]); - $member->statut=-1; - if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS])) - { - $member->datec=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); - $member->datevalid=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); - $member->statut=$ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]; + $member->statut = - 1; + if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS])) { + $member->datec = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); + $member->datevalid = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); + $member->statut = $ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]; } - //if ($member->statut > 1) $member->statut=1; + // if ($member->statut > 1) $member->statut=1; - //print_r($ldapuser); + // print_r($ldapuser); // Propriete type membre - $member->typeid=$typeid; + $member->typeid = $typeid; // Creation membre - print $langs->transnoentities("MemberCreate").' # '.$key.': login='.$member->login.', fullname='.$member->getFullName($langs); - print ', datec='.$member->datec; - $member_id=$member->create($user); - if ($member_id > 0) - { - print ' --> Created member id='.$member_id.' login='.$member->login; - } - else - { - $error++; - print ' --> '.$member->error; + print $langs->transnoentities("MemberCreate") . ' # ' . $key . ': login=' . $member->login . ', fullname=' . $member->getFullName($langs); + print ', datec=' . $member->datec; + $member_id = $member->create($user); + if ($member_id > 0) { + print ' --> Created member id=' . $member_id . ' login=' . $member->login; + } else { + $error ++; + print ' --> ' . $member->error; } print "\n"; - //print_r($member); + // print_r($member); - $datefirst=''; - if ($conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE) - { - $datefirst=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); - $pricefirst=price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT]); + $datefirst = ''; + if ($conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE) { + $datefirst = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); + $pricefirst = price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT]); } - $datelast=''; - if ($conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE) - { - $datelast=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE]); - $pricelast=price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]); - } - elseif ($conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION) - { - $datelast=dol_time_plus_duree(dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION]), -1, 'y')+60*60*24; - $pricelast=price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]); + $datelast = ''; + if ($conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE) { + $datelast = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE]); + $pricelast = price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]); + } elseif ($conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION) { + $datelast = dol_time_plus_duree(dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION]), - 1, 'y') + 60 * 60 * 24; + $pricelast = price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]); // Cas special ou date derniere <= date premiere - if ($datefirst && $datelast && $datelast <= $datefirst) - { + if ($datefirst && $datelast && $datelast <= $datefirst) { // On ne va inserer que la premiere - $datelast=0; - if (! $pricefirst && $pricelast) $pricefirst = $pricelast; + $datelast = 0; + if (! $pricefirst && $pricelast) + $pricefirst = $pricelast; } } - // Insert first subscription - if ($datefirst) - { + if ($datefirst) { // Cree premiere cotisation et met a jour datefin dans adherent - //print "xx".$datefirst."\n"; - $crowid=$member->subscription($datefirst, $pricefirst, 0); + // print "xx".$datefirst."\n"; + $crowid = $member->subscription($datefirst, $pricefirst, 0); } // Insert last subscription - if ($datelast) - { + if ($datelast) { // Cree derniere cotisation et met a jour datefin dans adherent - //print "yy".dol_print_date($datelast)."\n"; - $crowid=$member->subscription($datelast, $pricelast, 0); + // print "yy".dol_print_date($datelast)."\n"; + $crowid = $member->subscription($datelast, $pricelast, 0); } } - if (! $error || $forcecommit) - { - if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n"; - else print $langs->transnoentities("ErrorButCommitIsDone")."\n"; + if (! $error || $forcecommit) { + if (! $error) + print $langs->transnoentities("NoErrorCommitIsDone") . "\n"; + else + print $langs->transnoentities("ErrorButCommitIsDone") . "\n"; $db->commit(); - } - else - { - print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n"; + } else { + print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n"; $db->rollback(); } print "\n"; - } - else - { + } else { dol_print_error('', $ldap->error); - $error++; + $error ++; } -} -else -{ +} else { dol_print_error('', $ldap->error); - $error++; + $error ++; } - exit($error); - /** * Function to say if a value is empty or not * - * @param string $element Value to test - * @return boolean True of false + * @param string $element + * Value to test + * @return boolean True of false */ function dolValidElement($element) { diff --git a/scripts/members/sync_members_types_dolibarr2ldap.php b/scripts/members/sync_members_types_dolibarr2ldap.php index 0c0da924f98..a5e2f5ace94 100755 --- a/scripts/members/sync_members_types_dolibarr2ldap.php +++ b/scripts/members/sync_members_types_dolibarr2ldap.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2006 Laurent Destailleur - * Copyright (C) 2017 Regis Houssin + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006 Laurent Destailleur + * Copyright (C) 2017 Regis Houssin * * 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 @@ -12,7 +12,7 @@ * * 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 + * 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 @@ -20,69 +20,64 @@ */ /** - * \file scripts/user/sync_members_types_dolibarr2ldap.php - * \ingroup ldap core - * \brief Script de mise a jour des types de membres dans LDAP depuis base Dolibarr + * \file scripts/user/sync_members_types_dolibarr2ldap.php + * \ingroup ldap core + * \brief Script de mise a jour des types de membres dans LDAP depuis base Dolibarr */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: ".$script_file." now\n"; - exit(-1); + print "Usage: " . $script_file . " now\n"; + exit(- 1); } -$now=$argv[1]; +$now = $argv[1]; -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent_type.class.php"; // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); /* -if (! $conf->global->LDAP_SYNCHRO_ACTIVE) -{ - print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); - exit(-1); -} -*/ + * if (! $conf->global->LDAP_SYNCHRO_ACTIVE) + * { + * print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); + * exit(-1); + * } + */ $sql = "SELECT rowid"; -$sql .= " FROM ".MAIN_DB_PREFIX."adherent_type"; +$sql .= " FROM " . MAIN_DB_PREFIX . "adherent_type"; $resql = $db->query($sql); -if ($resql) -{ +if ($resql) { $num = $db->num_rows($resql); $i = 0; - $ldap=new Ldap(); - $result=$ldap->connect_bind(); + $ldap = new Ldap(); + $result = $ldap->connect_bind(); - if ($result > 0) - { - while ($i < $num) - { - $ldap->error=""; + if ($result > 0) { + while ($i < $num) { + $ldap->error = ""; $obj = $db->fetch_object($resql); @@ -90,41 +85,35 @@ if ($resql) $membertype->id = $obj->rowid; $membertype->fetch($membertype->id); - print $langs->trans("UpdateMemberType")." rowid=".$membertype->id." ".$membertype-label; + print $langs->trans("UpdateMemberType") . " rowid=" . $membertype->id . " " . $membertype - label; - $oldobject=$membertype; + $oldobject = $membertype; - $oldinfo=$membertype->_load_ldap_info(); - $olddn=$membertype->_load_ldap_dn($oldinfo); + $oldinfo = $membertype->_load_ldap_info(); + $olddn = $membertype->_load_ldap_dn($oldinfo); - $info=$membertype->_load_ldap_info(); - $dn=$membertype->_load_ldap_dn($info); + $info = $membertype->_load_ldap_info(); + $dn = $membertype->_load_ldap_dn($info); - $result=$ldap->add($dn, $info, $user); // Wil fail if already exists - $result=$ldap->update($dn, $info, $user, $olddn); - if ($result > 0) - { - print " - ".$langs->trans("OK"); - } - else - { - $error++; - print " - ".$langs->trans("KO").' - '.$ldap->error; + $result = $ldap->add($dn, $info, $user); // Wil fail if already exists + $result = $ldap->update($dn, $info, $user, $olddn); + if ($result > 0) { + print " - " . $langs->trans("OK"); + } else { + $error ++; + print " - " . $langs->trans("KO") . ' - ' . $ldap->error; } print "\n"; - $i++; + $i ++; } $ldap->unbind(); $ldap->close(); - } - else { + } else { print $ldap->error; } -} -else -{ +} else { dol_print_error($db); } diff --git a/scripts/members/sync_members_types_ldap2dolibarr.php b/scripts/members/sync_members_types_ldap2dolibarr.php index 3ce15cab13a..fe9a07e14da 100755 --- a/scripts/members/sync_members_types_ldap2dolibarr.php +++ b/scripts/members/sync_members_types_ldap2dolibarr.php @@ -1,10 +1,10 @@ #!/usr/bin/env php - * Copyright (C) 2006-2012 Laurent Destailleur - * Copyright (C) 2013 Maxime Kohlhaas - * Copyright (C) 2017 Regis Houssin + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2013 Maxime Kohlhaas + * Copyright (C) 2017 Regis Houssin * * 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 @@ -13,7 +13,7 @@ * * 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 + * 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 @@ -21,196 +21,172 @@ */ /** - * \file scripts/user/sync_members_types_ldap2dolibarr.php - * \ingroup ldap member - * \brief Script to update members types into Dolibarr from LDAP + * \file scripts/user/sync_members_types_ldap2dolibarr.php + * \ingroup ldap member + * \brief Script to update members types into Dolibarr from LDAP */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent_type.class.php"; -$langs->loadLangs(array("main", "errors")); +$langs->loadLangs(array("main","errors")); // Global variables -$version=DOL_VERSION; -$error=0; -$forcecommit=0; -$confirmed=0; - +$version = DOL_VERSION; +$error = 0; +$forcecommit = 0; +$confirmed = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); // List of fields to get from LDAP -$required_fields = array( - $conf->global->LDAP_KEY_MEMBERS_TYPES, - $conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME, - $conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION, - $conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS -); +$required_fields = array($conf->global->LDAP_KEY_MEMBERS_TYPES,$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME,$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION,$conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS); // Remove from required_fields all entries not configured in LDAP (empty) and duplicated -$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElementType"))); - +$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElementType"))); if (! isset($argv[1])) { - //print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n"; + // print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n"; print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n"; - exit(-1); + exit(- 1); } -foreach($argv as $key => $val) -{ - if ($val == 'commitiferror') $forcecommit=1; - if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1]; - if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) $excludeuser=explode(',', $reg[1]); - if (preg_match('/-y$/', $val, $reg)) $confirmed=1; +foreach ($argv as $key => $val) { + if ($val == 'commitiferror') + $forcecommit = 1; + if (preg_match('/--server=([^\s]+)$/', $val, $reg)) + $conf->global->LDAP_SERVER_HOST = $reg[1]; + if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) + $excludeuser = explode(',', $reg[1]); + if (preg_match('/-y$/', $val, $reg)) + $confirmed = 1; } print "Mails sending disabled (useless in batch mode)\n"; -$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails print "\n"; print "----- Synchronize all records from LDAP database:\n"; -print "host=".$conf->global->LDAP_SERVER_HOST."\n"; -print "port=".$conf->global->LDAP_SERVER_PORT."\n"; -print "login=".$conf->global->LDAP_ADMIN_DN."\n"; -print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n"; -print "DN to extract=".$conf->global->LDAP_MEMBER_TYPE_DN."\n"; -print 'Filter=('.$conf->global->LDAP_KEY_MEMBERS_TYPES.'=*)'."\n"; +print "host=" . $conf->global->LDAP_SERVER_HOST . "\n"; +print "port=" . $conf->global->LDAP_SERVER_PORT . "\n"; +print "login=" . $conf->global->LDAP_ADMIN_DN . "\n"; +print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n"; +print "DN to extract=" . $conf->global->LDAP_MEMBER_TYPE_DN . "\n"; +print 'Filter=(' . $conf->global->LDAP_KEY_MEMBERS_TYPES . '=*)' . "\n"; print "----- To Dolibarr database:\n"; -print "type=".$conf->db->type."\n"; -print "host=".$conf->db->host."\n"; -print "port=".$conf->db->port."\n"; -print "login=".$conf->db->user."\n"; -print "database=".$conf->db->name."\n"; +print "type=" . $conf->db->type . "\n"; +print "host=" . $conf->db->host . "\n"; +print "port=" . $conf->db->port . "\n"; +print "login=" . $conf->db->user . "\n"; +print "database=" . $conf->db->name . "\n"; print "----- Options:\n"; -print "commitiferror=".$forcecommit."\n"; -print "Mapped LDAP fields=".join(',', $required_fields)."\n"; +print "commitiferror=" . $forcecommit . "\n"; +print "Mapped LDAP fields=" . join(',', $required_fields) . "\n"; print "\n"; -if (! $confirmed) -{ +if (! $confirmed) { print "Hit Enter to continue or CTRL+C to stop...\n"; $input = trim(fgets(STDIN)); } -if (empty($conf->global->LDAP_MEMBER_TYPE_DN)) -{ - print $langs->trans("Error").': '.$langs->trans("LDAP setup for members types not defined inside Dolibarr"); - exit(-1); +if (empty($conf->global->LDAP_MEMBER_TYPE_DN)) { + print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for members types not defined inside Dolibarr"); + exit(- 1); } - $ldap = new Ldap(); $result = $ldap->connect_bind(); -if ($result >= 0) -{ - $justthese=array(); - +if ($result >= 0) { + $justthese = array(); // We disable synchro Dolibarr-LDAP - $conf->global->LDAP_MEMBER_TYPE_ACTIVE=0; + $conf->global->LDAP_MEMBER_TYPE_ACTIVE = 0; $ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_MEMBER_TYPE_DN, $conf->global->LDAP_KEY_MEMBERS_TYPES, $required_fields, 0, array($conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS)); - if (is_array($ldaprecords)) - { + if (is_array($ldaprecords)) { $db->begin(); // Warning $ldapuser has a key in lowercase - foreach ($ldaprecords as $key => $ldapgroup) - { + foreach ($ldaprecords as $key => $ldapgroup) { $membertype = new AdherentType($db); $membertype->fetch('', $ldapgroup[$conf->global->LDAP_KEY_MEMBERS_TYPES]); $membertype->label = $ldapgroup[$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME]; $membertype->description = $ldapgroup[$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION]; $membertype->entity = $conf->entity; - //print_r($ldapgroup); + // print_r($ldapgroup); if ($membertype->id > 0) { // Member type update - print $langs->transnoentities("MemberTypeUpdate").' # '.$key.': name='.$membertype->label; - $res=$membertype->update($user); + print $langs->transnoentities("MemberTypeUpdate") . ' # ' . $key . ': name=' . $membertype->label; + $res = $membertype->update($user); - if ($res > 0) - { - print ' --> Updated member type id='.$membertype->id.' name='.$membertype->label; - } - else - { - $error++; - print ' --> '.$res.' '.$membertype->error; + if ($res > 0) { + print ' --> Updated member type id=' . $membertype->id . ' name=' . $membertype->label; + } else { + $error ++; + print ' --> ' . $res . ' ' . $membertype->error; } print "\n"; } else { // Member type creation - print $langs->transnoentities("MemberTypeCreate").' # '.$key.': name='.$membertype->label; - $res=$membertype->create($user); + print $langs->transnoentities("MemberTypeCreate") . ' # ' . $key . ': name=' . $membertype->label; + $res = $membertype->create($user); - if ($res > 0) - { - print ' --> Created member type id='.$membertype->id.' name='.$membertype->label; - } - else - { - $error++; - print ' --> '.$res.' '.$membertype->error; + if ($res > 0) { + print ' --> Created member type id=' . $membertype->id . ' name=' . $membertype->label; + } else { + $error ++; + print ' --> ' . $res . ' ' . $membertype->error; } print "\n"; } - //print_r($membertype); + // print_r($membertype); } - if (! $error || $forcecommit) - { - if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n"; - else print $langs->transnoentities("ErrorButCommitIsDone")."\n"; + if (! $error || $forcecommit) { + if (! $error) + print $langs->transnoentities("NoErrorCommitIsDone") . "\n"; + else + print $langs->transnoentities("ErrorButCommitIsDone") . "\n"; $db->commit(); - } - else - { - print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n"; + } else { + print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n"; $db->rollback(); } print "\n"; - } - else - { + } else { dol_print_error('', $ldap->error); - $error++; + $error ++; } -} -else -{ +} else { dol_print_error('', $ldap->error); - $error++; + $error ++; } - exit($error); - /** * Function to say if a value is empty or not * - * @param string $element Value to test - * @return boolean True of false + * @param string $element + * Value to test + * @return boolean True of false */ function dolValidElementType($element) { diff --git a/scripts/modulebuilder/builddoc.php b/scripts/modulebuilder/builddoc.php index c0b44a0bed8..a13f1f7eae1 100755 --- a/scripts/modulebuilder/builddoc.php +++ b/scripts/modulebuilder/builddoc.php @@ -1,7 +1,7 @@ #!/usr/bin/env php + * Copyright (C) 2005-2013 Laurent Destailleur * * 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 @@ -10,99 +10,94 @@ * * 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 + * 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 scripts/modulebuilder/builddoc.php - * \ingroup modulebuilder - * \brief Script to build a documentation from input files (.asciidoc or .md files). Use asciidoctor tool. + * \file scripts/modulebuilder/builddoc.php + * \ingroup modulebuilder + * \brief Script to build a documentation from input files (.asciidoc or .md files). + * Use asciidoctor tool. * - * If file is a MD file, convert image links into asciidoc format. - * ![Screenshot patient card](img/dolimed_screenshot_patientcard.png?raw=true "Patient card") - * image:img/dolimed_screenshot_patientcard.png[Screenshot patient card] + * If file is a MD file, convert image links into asciidoc format. + * ![Screenshot patient card](img/dolimed_screenshot_patientcard.png?raw=true "Patient card") + * image:img/dolimed_screenshot_patientcard.png[Screenshot patient card] */ - - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: ".$script_file." ModuleName\n"; - exit(-1); + print "Usage: " . $script_file . " ModuleName\n"; + exit(- 1); } -$modulename=$argv[1]; +$modulename = $argv[1]; -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/modulebuilder.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/utils.class.php'; - -$langs->loadLangs(array("admin", "modulebuilder", "other", "cron")); +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/modulebuilder.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/utils.class.php'; +$langs->loadLangs(array("admin","modulebuilder","other","cron")); // Global variables -$version=DOL_VERSION; -$error=0; +$version = DOL_VERSION; +$error = 0; // Dir for custom dirs -$tmp=explode(',', $dolibarr_main_document_root_alt); +$tmp = explode(',', $dolibarr_main_document_root_alt); $dirins = $tmp[0]; $dirread = $dirins; $forceddirread = 0; $tmpdir = explode('@', $module); -if (! empty($tmpdir[1])) -{ - $module=$tmpdir[0]; - $dirread=$tmpdir[1]; - $forceddirread=1; +if (! empty($tmpdir[1])) { + $module = $tmpdir[0]; + $dirread = $tmpdir[1]; + $forceddirread = 1; } -$FILEFLAG='modulebuilder.txt'; +$FILEFLAG = 'modulebuilder.txt'; -$now=dol_now(); +$now = dol_now(); $newmask = 0; -if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK; -if (empty($newmask)) // This should no happen +if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) + $newmask = $conf->global->MAIN_UMASK; +if (empty($newmask)) // This should no happen { - $newmask='0664'; + $newmask = '0664'; } - /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -print "modulename=".$modulename."\n"; -print "dirins=".$dirins."\n"; +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +print "modulename=" . $modulename . "\n"; +print "dirins=" . $dirins . "\n"; -$FILENAMEDOC=strtolower($module).'.html'; // TODO Use/text PDF -$dirofmodule = dol_buildpath(strtolower($module), 0).'/doc'; -$outputfiledoc = $dirofmodule.'/'.$FILENAMEDOC; +$FILENAMEDOC = strtolower($module) . '.html'; // TODO Use/text PDF +$dirofmodule = dol_buildpath(strtolower($module), 0) . '/doc'; +$outputfiledoc = $dirofmodule . '/' . $FILENAMEDOC; $util = new Utils($db); $result = $util->generateDoc($module); -if ($result <= 0) -{ +if ($result <= 0) { print $util->errors; exit(1); } diff --git a/scripts/modulebuilder/initmodule.php b/scripts/modulebuilder/initmodule.php index 46d3e6a7032..6bdab236078 100755 --- a/scripts/modulebuilder/initmodule.php +++ b/scripts/modulebuilder/initmodule.php @@ -1,7 +1,7 @@ #!/usr/bin/env php + * Copyright (C) 2005-2013 Laurent Destailleur * * 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 @@ -10,165 +10,138 @@ * * 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 + * 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 scripts/modulebuilder/initmodule.php - * \ingroup modulebuilder - * \brief Script to initialize a module. + * \file scripts/modulebuilder/initmodule.php + * \ingroup modulebuilder + * \brief Script to initialize a module. */ - - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: ".$script_file." ModuleName\n"; - exit(-1); + print "Usage: " . $script_file . " ModuleName\n"; + exit(- 1); } -$modulename=$argv[1]; +$modulename = $argv[1]; -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/modulebuilder.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - -$langs->loadLangs(array("admin", "modulebuilder", "other", "cron")); +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/modulebuilder.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; +$langs->loadLangs(array("admin","modulebuilder","other","cron")); // Global variables -$version=DOL_VERSION; -$error=0; +$version = DOL_VERSION; +$error = 0; // Dir for custom dirs -$tmp=explode(',', $dolibarr_main_document_root_alt); +$tmp = explode(',', $dolibarr_main_document_root_alt); $dirins = $tmp[0]; $dirread = $dirins; $forceddirread = 0; $tmpdir = explode('@', $module); -if (! empty($tmpdir[1])) -{ - $module=$tmpdir[0]; - $dirread=$tmpdir[1]; - $forceddirread=1; +if (! empty($tmpdir[1])) { + $module = $tmpdir[0]; + $dirread = $tmpdir[1]; + $forceddirread = 1; } -$FILEFLAG='modulebuilder.txt'; +$FILEFLAG = 'modulebuilder.txt'; -$now=dol_now(); +$now = dol_now(); $newmask = 0; -if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK; -if (empty($newmask)) // This should no happen +if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) + $newmask = $conf->global->MAIN_UMASK; +if (empty($newmask)) // This should no happen { - $newmask='0664'; + $newmask = '0664'; } - /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -print "modulename=".$modulename."\n"; -print "dirins=".$dirins."\n"; +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +print "modulename=" . $modulename . "\n"; +print "dirins=" . $dirins . "\n"; -if (preg_match('/[^a-z0-9_]/i', $modulename)) -{ - $error++; - print 'Error '.$langs->trans("SpaceOrSpecialCharAreNotAllowed")."\n"; +if (preg_match('/[^a-z0-9_]/i', $modulename)) { + $error ++; + print 'Error ' . $langs->trans("SpaceOrSpecialCharAreNotAllowed") . "\n"; exit(1); } -if (! $error) -{ - $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; - $destdir = $dirins.'/'.strtolower($modulename); +if (! $error) { + $srcdir = DOL_DOCUMENT_ROOT . '/modulebuilder/template'; + $destdir = $dirins . '/' . strtolower($modulename); - $arrayreplacement=array( - 'mymodule'=>strtolower($modulename), - 'MyModule'=>$modulename - ); + $arrayreplacement = array('mymodule' => strtolower($modulename),'MyModule' => $modulename); $result = dolCopyDir($srcdir, $destdir, 0, 0, $arrayreplacement); - //dol_mkdir($destfile); - if ($result <= 0) - { - if ($result < 0) - { - $error++; + // dol_mkdir($destfile); + if ($result <= 0) { + if ($result < 0) { + $error ++; $langs->load("errors"); - print $langs->trans("ErrorFailToCopyDir", $srcdir, $destdir)."\n"; + print $langs->trans("ErrorFailToCopyDir", $srcdir, $destdir) . "\n"; exit(2); - } - else // $result == 0 + } else // $result == 0 { - print $langs->trans("AllFilesDidAlreadyExist", $srcdir, $destdir)."\n"; + print $langs->trans("AllFilesDidAlreadyExist", $srcdir, $destdir) . "\n"; } } // Delete some files - dol_delete_file($destdir.'/myobject_card.php'); - dol_delete_file($destdir.'/myobject_note.php'); - dol_delete_file($destdir.'/myobject_document.php'); - dol_delete_file($destdir.'/myobject_agenda.php'); - dol_delete_file($destdir.'/myobject_list.php'); - dol_delete_file($destdir.'/lib/myobject.lib.php'); - dol_delete_file($destdir.'/test/phpunit/MyObjectTest.php'); - dol_delete_file($destdir.'/sql/llx_mymodule_myobject.sql'); - dol_delete_file($destdir.'/sql/llx_mymodule_myobject_extrafields.sql'); - dol_delete_file($destdir.'/sql/llx_mymodule_myobject.key.sql'); - dol_delete_file($destdir.'/scripts/myobject.php'); - dol_delete_file($destdir.'/img/object_myobject.png'); - dol_delete_file($destdir.'/class/myobject.class.php'); - dol_delete_file($destdir.'/class/api_mymodule.class.php'); + dol_delete_file($destdir . '/myobject_card.php'); + dol_delete_file($destdir . '/myobject_note.php'); + dol_delete_file($destdir . '/myobject_document.php'); + dol_delete_file($destdir . '/myobject_agenda.php'); + dol_delete_file($destdir . '/myobject_list.php'); + dol_delete_file($destdir . '/lib/myobject.lib.php'); + dol_delete_file($destdir . '/test/phpunit/MyObjectTest.php'); + dol_delete_file($destdir . '/sql/llx_mymodule_myobject.sql'); + dol_delete_file($destdir . '/sql/llx_mymodule_myobject_extrafields.sql'); + dol_delete_file($destdir . '/sql/llx_mymodule_myobject.key.sql'); + dol_delete_file($destdir . '/scripts/myobject.php'); + dol_delete_file($destdir . '/img/object_myobject.png'); + dol_delete_file($destdir . '/class/myobject.class.php'); + dol_delete_file($destdir . '/class/api_mymodule.class.php'); } // Edit PHP files -if (! $error) -{ +if (! $error) { $listofphpfilestoedit = dol_dir_list($destdir, 'files', 1, '\.(php|MD|js|sql|txt|xml|lang)$', '', 'fullname', SORT_ASC, 0, 1); - foreach($listofphpfilestoedit as $phpfileval) - { - //var_dump($phpfileval['fullname']); - $arrayreplacement=array( - 'mymodule'=>strtolower($modulename), - 'MyModule'=>$modulename, - 'MYMODULE'=>strtoupper($modulename), - 'My module'=>$modulename, - 'my module'=>$modulename, - 'Mon module'=>$modulename, - 'mon module'=>$modulename, - 'htdocs/modulebuilder/template'=>strtolower($modulename), - '---Put here your own copyright and developer email---'=>dol_print_date($now, '%Y').' '.$user->getFullName($langs).($user->email?' <'.$user->email.'>':'') - ); + foreach ($listofphpfilestoedit as $phpfileval) { + // var_dump($phpfileval['fullname']); + $arrayreplacement = array('mymodule' => strtolower($modulename),'MyModule' => $modulename,'MYMODULE' => strtoupper($modulename),'My module' => $modulename,'my module' => $modulename,'Mon module' => $modulename,'mon module' => $modulename,'htdocs/modulebuilder/template' => strtolower($modulename),'---Put here your own copyright and developer email---' => dol_print_date($now, '%Y') . ' ' . $user->getFullName($langs) . ($user->email ? ' <' . $user->email . '>' : '')); - - $result=dolReplaceInFile($phpfileval['fullname'], $arrayreplacement); - //var_dump($result); - if ($result < 0) - { - print $langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname'])."\n"; + $result = dolReplaceInFile($phpfileval['fullname'], $arrayreplacement); + // var_dump($result); + if ($result < 0) { + print $langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname']) . "\n"; exit(3); } } } -print 'Module initialized'."\n"; +print 'Module initialized' . "\n"; exit(0); diff --git a/scripts/product/migrate_picture_path.php b/scripts/product/migrate_picture_path.php index a0a17632357..7abbcc59cc5 100755 --- a/scripts/product/migrate_picture_path.php +++ b/scripts/product/migrate_picture_path.php @@ -1,7 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2015 Jean Heimburger +/* + * Copyright (C) 2007-2016 Laurent Destailleur + * Copyright (C) 2015 Jean Heimburger * * 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 @@ -10,7 +11,7 @@ * * 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 + * 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 @@ -18,86 +19,76 @@ */ /** - * \file scripts/product/migrate_picture_path.php - * \ingroup scripts - * \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+ + * \file scripts/product/migrate_picture_path.php + * \ingroup scripts + * \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+ */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -@set_time_limit(0); // No timeout for this script -define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only". +@set_time_limit(0); // No timeout for this script +define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only". // Include and load Dolibarr environment variables -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/product/class/product.class.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/files.lib.php"; // After this $db, $mysoc, $langs, $conf and $hookmanager are defined (Opened $db handler to database will be closed at end of file). // $user is created but empty. -//$langs->setDefaultLang('en_US'); // To change default language of $langs -$langs->load("main"); // To load language file for default language - +// $langs->setDefaultLang('en_US'); // To change default language of $langs +$langs->load("main"); // To load language file for default language // Global variables -$version=DOL_VERSION; -$error=0; -$forcecommit=0; +$version = DOL_VERSION; +$error = 0; +$forcecommit = 0; - -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); if (! isset($argv[1]) || $argv[1] != 'product') { - print "Usage: $script_file product\n"; - exit(-1); + print "Usage: $script_file product\n"; + exit(- 1); } -print '--- start'."\n"; +print '--- start' . "\n"; // Case to migrate products path -if ($argv[1] == 'product') -{ +if ($argv[1] == 'product') { $product = new Product($db); - $sql = "SELECT rowid as pid from ".MAIN_DB_PREFIX."product"; // Get list of all products + $sql = "SELECT rowid as pid from " . MAIN_DB_PREFIX . "product"; // Get list of all products $resql = $db->query($sql); - if ($resql) - { - while ($obj = $db->fetch_object($resql)) - { + if ($resql) { + while ($obj = $db->fetch_object($resql)) { $product->fetch($obj->pid); - print " migrating product id=".$product->id." ref=".$product->ref."\n"; + print " migrating product id=" . $product->id . " ref=" . $product->ref . "\n"; migrate_product_photospath($product); } - } - else - { - print "\n sql error ".$sql; - exit; + } else { + print "\n sql error " . $sql; + exit(); } } - -$db->close(); // Close $db database opened handler +$db->close(); // Close $db database opened handler exit($error); - - /** * Migrate file from old path to new one for product $product * - * @param Product $product Object product - * @return void + * @param Product $product + * Object product + * @return void */ function migrate_product_photospath($product) { @@ -105,43 +96,34 @@ function migrate_product_photospath($product) $dir = $conf->product->multidir_output[$product->entity]; $conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO = 1; - $origin = $dir .'/'. get_exdir($product->id, 2, 0, 0, $product, 'product') . $product->id ."/photos"; - $destin = $dir.'/'.dol_sanitizeFileName($product->ref); + $origin = $dir . '/' . get_exdir($product->id, 2, 0, 0, $product, 'product') . $product->id . "/photos"; + $destin = $dir . '/' . dol_sanitizeFileName($product->ref); $error = 0; - $origin_osencoded=dol_osencode($origin); - $destin_osencoded=dol_osencode($destin); + $origin_osencoded = dol_osencode($origin); + $destin_osencoded = dol_osencode($destin); dol_mkdir($destin); - if (dol_is_dir($origin)) - { - $handle=opendir($origin_osencoded); - if (is_resource($handle)) - { - while (($file = readdir($handle)) !== false) - { - if ($file != '.' && $file != '..' && is_dir($origin_osencoded.'/'.$file)) - { - $thumbs = opendir($origin_osencoded.'/'.$file); - if (is_resource($thumbs)) - { - dol_mkdir($destin.'/'.$file); - while (($thumb = readdir($thumbs)) !== false) - { - dol_move($origin.'/'.$file.'/'.$thumb, $destin.'/'.$file.'/'.$thumb); - } -// dol_delete_dir($origin.'/'.$file); - } - } - else - { - if (dol_is_file($origin.'/'.$file) ) - { - dol_move($origin.'/'.$file, $destin.'/'.$file); - } - } - } - } + if (dol_is_dir($origin)) { + $handle = opendir($origin_osencoded); + if (is_resource($handle)) { + while (($file = readdir($handle)) !== false) { + if ($file != '.' && $file != '..' && is_dir($origin_osencoded . '/' . $file)) { + $thumbs = opendir($origin_osencoded . '/' . $file); + if (is_resource($thumbs)) { + dol_mkdir($destin . '/' . $file); + while (($thumb = readdir($thumbs)) !== false) { + dol_move($origin . '/' . $file . '/' . $thumb, $destin . '/' . $file . '/' . $thumb); + } + // dol_delete_dir($origin.'/'.$file); + } + } else { + if (dol_is_file($origin . '/' . $file)) { + dol_move($origin . '/' . $file, $destin . '/' . $file); + } + } + } + } } } diff --git a/scripts/product/regenerate_thumbs.php b/scripts/product/regenerate_thumbs.php index 84f30b3950f..d034cec1ec9 100755 --- a/scripts/product/regenerate_thumbs.php +++ b/scripts/product/regenerate_thumbs.php @@ -1,7 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2015 Jean Heimburger +/* + * Copyright (C) 2007-2016 Laurent Destailleur + * Copyright (C) 2015 Jean Heimburger * * 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 @@ -10,7 +11,7 @@ * * 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 + * 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 @@ -18,90 +19,85 @@ */ /** - * \file scripts/product/migrate_picture_path.php - * \ingroup scripts - * \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+ + * \file scripts/product/migrate_picture_path.php + * \ingroup scripts + * \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+ */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -@set_time_limit(0); // No timeout for this script -define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only". +@set_time_limit(0); // No timeout for this script +define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only". // Include and load Dolibarr environment variables -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/images.lib.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/product/class/product.class.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/files.lib.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/images.lib.php"; // After this $db, $mysoc, $langs, $conf and $hookmanager are defined (Opened $db handler to database will be closed at end of file). // $user is created but empty. -//$langs->setDefaultLang('en_US'); // To change default language of $langs -$langs->load("main"); // To load language file for default language - +// $langs->setDefaultLang('en_US'); // To change default language of $langs +$langs->load("main"); // To load language file for default language // Global variables -$version=DOL_VERSION; -$error=0; -$forcecommit=0; +$version = DOL_VERSION; +$error = 0; +$forcecommit = 0; - -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); if (empty($argv[1])) { - print "Usage: $script_file subdirtoscan\n"; - print "Example: $script_file produit\n"; - exit(-1); + print "Usage: $script_file subdirtoscan\n"; + print "Example: $script_file produit\n"; + exit(- 1); } -print '--- start'."\n"; +print '--- start' . "\n"; $dir = DOL_DATA_ROOT; -$subdir=$argv[1]; -if (empty($dir) || empty($subdir)) -{ +$subdir = $argv[1]; +if (empty($dir) || empty($subdir)) { dol_print_error('', 'dir not defined'); exit(1); } -if (! dol_is_dir($dir.'/'.$subdir)) -{ - print 'Directory '.$dir.'/'.$subdir.' not found.'."\n"; +if (! dol_is_dir($dir . '/' . $subdir)) { + print 'Directory ' . $dir . '/' . $subdir . ' not found.' . "\n"; exit(2); } -$filearray=dol_dir_list($dir.'/'.$subdir, "directories", 0, '', 'temp$'); +$filearray = dol_dir_list($dir . '/' . $subdir, "directories", 0, '', 'temp$'); global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini; -foreach($filearray as $keyf => $valf) -{ - $ref=basename($valf['name']); - $filearrayimg=dol_dir_list($valf['fullname'], "files", 0, '(\.gif|\.png|\.jpg|\.jpeg|\.bmp)$', '(\.meta|_preview.*\.png)$'); - foreach($filearrayimg as $keyi => $vali) - { - print 'Process image for ref '.$ref.' : '.$vali['name']."\n"; +foreach ($filearray as $keyf => $valf) { + $ref = basename($valf['name']); + $filearrayimg = dol_dir_list($valf['fullname'], "files", 0, '(\.gif|\.png|\.jpg|\.jpeg|\.bmp)$', '(\.meta|_preview.*\.png)$'); + foreach ($filearrayimg as $keyi => $vali) { + print 'Process image for ref ' . $ref . ' : ' . $vali['name'] . "\n"; // Create small thumbs for image // Used on logon for example $imgThumbSmall = vignette($vali['fullname'], $maxwidthsmall, $maxheightsmall, '_small', 50, "thumbs"); - if (preg_match('/Error/', $imgThumbSmall)) print $imgThumbSmall."\n"; + if (preg_match('/Error/', $imgThumbSmall)) + print $imgThumbSmall . "\n"; // Create mini thumbs for image (Ratio is near 16/9) // Used on menu or for setup page for example $imgThumbMini = vignette($vali['fullname'], $maxwidthmini, $maxheightmini, '_mini', 50, "thumbs"); - if (preg_match('/Error/', $imgThumbMini)) print $imgThumbMini."\n"; + if (preg_match('/Error/', $imgThumbMini)) + print $imgThumbMini . "\n"; } } -$db->close(); // Close $db database opened handler +$db->close(); // Close $db database opened handler exit($error); diff --git a/scripts/user/sync_groups_dolibarr2ldap.php b/scripts/user/sync_groups_dolibarr2ldap.php index 2d6a074d9c2..23ca994799f 100755 --- a/scripts/user/sync_groups_dolibarr2ldap.php +++ b/scripts/user/sync_groups_dolibarr2ldap.php @@ -2,7 +2,7 @@ - * Copyright (C) 2006 Laurent Destailleur + * Copyright (C) 2006 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,67 +19,63 @@ */ /** - * \file scripts/user/sync_groups_dolibarr2ldap.php - * \ingroup ldap core - * \brief Script de mise a jour des groupes dans LDAP depuis base Dolibarr + * \file scripts/user/sync_groups_dolibarr2ldap.php + * \ingroup ldap core + * \brief Script de mise a jour des groupes dans LDAP depuis base Dolibarr */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: ".$script_file." now\n"; - exit(-1); + print "Usage: " . $script_file . " now\n"; + exit(- 1); } -$now=$argv[1]; +$now = $argv[1]; -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/user/class/usergroup.class.php"; // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); /* -if (! $conf->global->LDAP_SYNCHRO_ACTIVE) -{ - print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); - exit(-1); -} -*/ + * if (! $conf->global->LDAP_SYNCHRO_ACTIVE) + * { + * print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); + * exit(-1); + * } + */ $sql = "SELECT rowid"; -$sql .= " FROM ".MAIN_DB_PREFIX."usergroup"; +$sql .= " FROM " . MAIN_DB_PREFIX . "usergroup"; $resql = $db->query($sql); -if ($resql) -{ +if ($resql) { $num = $db->num_rows($resql); $i = 0; - $ldap=new Ldap(); + $ldap = new Ldap(); $ldap->connect_bind(); - while ($i < $num) - { - $ldap->error=""; + while ($i < $num) { + $ldap->error = ""; $obj = $db->fetch_object($resql); @@ -87,37 +83,32 @@ if ($resql) $fgroup->id = $obj->rowid; $fgroup->fetch($fgroup->id); - print $langs->trans("UpdateGroup")." rowid=".$fgroup->id." ".$fgroup->name; + print $langs->trans("UpdateGroup") . " rowid=" . $fgroup->id . " " . $fgroup->name; - $oldobject=$fgroup; + $oldobject = $fgroup; - $oldinfo=$oldobject->_load_ldap_info(); - $olddn=$oldobject->_load_ldap_dn($oldinfo); + $oldinfo = $oldobject->_load_ldap_info(); + $olddn = $oldobject->_load_ldap_dn($oldinfo); - $info=$fgroup->_load_ldap_info(); - $dn=$fgroup->_load_ldap_dn($info); + $info = $fgroup->_load_ldap_info(); + $dn = $fgroup->_load_ldap_dn($info); - $result=$ldap->add($dn, $info, $user); // Wil fail if already exists - $result=$ldap->update($dn, $info, $user, $olddn); - if ($result > 0) - { - print " - ".$langs->trans("OK"); - } - else - { - $error++; - print " - ".$langs->trans("KO").' - '.$ldap->error; + $result = $ldap->add($dn, $info, $user); // Wil fail if already exists + $result = $ldap->update($dn, $info, $user, $olddn); + if ($result > 0) { + print " - " . $langs->trans("OK"); + } else { + $error ++; + print " - " . $langs->trans("KO") . ' - ' . $ldap->error; } print "\n"; - $i++; + $i ++; } $ldap->unbind(); $ldap->close(); -} -else -{ +} else { dol_print_error($db); } diff --git a/scripts/user/sync_groups_ldap2dolibarr.php b/scripts/user/sync_groups_ldap2dolibarr.php index 8fca8f9df9b..393a866de5e 100755 --- a/scripts/user/sync_groups_ldap2dolibarr.php +++ b/scripts/user/sync_groups_ldap2dolibarr.php @@ -1,9 +1,9 @@ #!/usr/bin/env php - * Copyright (C) 2006-2012 Laurent Destailleur - * Copyright (C) 2013 Maxime Kohlhaas + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2013 Maxime Kohlhaas * * 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 @@ -12,7 +12,7 @@ * * 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 + * 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 @@ -20,182 +20,166 @@ */ /** - * \file scripts/user/sync_groups_ldap2dolibarr.php - * \ingroup ldap member - * \brief Script to update groups into Dolibarr from LDAP + * \file scripts/user/sync_groups_ldap2dolibarr.php + * \ingroup ldap member + * \brief Script to update groups into Dolibarr from LDAP */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php"; -require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php"; +require_once DOL_DOCUMENT_ROOT . "/user/class/usergroup.class.php"; -$langs->loadLangs(array("main", "errors")); +$langs->loadLangs(array("main","errors")); // Global variables -$version=DOL_VERSION; -$error=0; -$forcecommit=0; -$confirmed=0; - +$version = DOL_VERSION; +$error = 0; +$forcecommit = 0; +$confirmed = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); // List of fields to get from LDAP -$required_fields = array( - $conf->global->LDAP_KEY_GROUPS, - $conf->global->LDAP_GROUP_FIELD_FULLNAME, - $conf->global->LDAP_GROUP_FIELD_DESCRIPTION, - $conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS -); +$required_fields = array($conf->global->LDAP_KEY_GROUPS,$conf->global->LDAP_GROUP_FIELD_FULLNAME,$conf->global->LDAP_GROUP_FIELD_DESCRIPTION,$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS); // Remove from required_fields all entries not configured in LDAP (empty) and duplicated -$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement"))); - +$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElement"))); if (! isset($argv[1])) { - //print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n"; + // print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n"; print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n"; - exit(-1); + exit(- 1); } -foreach($argv as $key => $val) -{ - if ($val == 'commitiferror') $forcecommit=1; - if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1]; - if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) $excludeuser=explode(',', $reg[1]); - if (preg_match('/-y$/', $val, $reg)) $confirmed=1; +foreach ($argv as $key => $val) { + if ($val == 'commitiferror') + $forcecommit = 1; + if (preg_match('/--server=([^\s]+)$/', $val, $reg)) + $conf->global->LDAP_SERVER_HOST = $reg[1]; + if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) + $excludeuser = explode(',', $reg[1]); + if (preg_match('/-y$/', $val, $reg)) + $confirmed = 1; } print "Mails sending disabled (useless in batch mode)\n"; -$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails print "\n"; print "----- Synchronize all records from LDAP database:\n"; -print "host=".$conf->global->LDAP_SERVER_HOST."\n"; -print "port=".$conf->global->LDAP_SERVER_PORT."\n"; -print "login=".$conf->global->LDAP_ADMIN_DN."\n"; -print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n"; -print "DN to extract=".$conf->global->LDAP_GROUP_DN."\n"; -print 'Filter=('.$conf->global->LDAP_KEY_GROUPS.'=*)'."\n"; +print "host=" . $conf->global->LDAP_SERVER_HOST . "\n"; +print "port=" . $conf->global->LDAP_SERVER_PORT . "\n"; +print "login=" . $conf->global->LDAP_ADMIN_DN . "\n"; +print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n"; +print "DN to extract=" . $conf->global->LDAP_GROUP_DN . "\n"; +print 'Filter=(' . $conf->global->LDAP_KEY_GROUPS . '=*)' . "\n"; print "----- To Dolibarr database:\n"; -print "type=".$conf->db->type."\n"; -print "host=".$conf->db->host."\n"; -print "port=".$conf->db->port."\n"; -print "login=".$conf->db->user."\n"; -print "database=".$conf->db->name."\n"; +print "type=" . $conf->db->type . "\n"; +print "host=" . $conf->db->host . "\n"; +print "port=" . $conf->db->port . "\n"; +print "login=" . $conf->db->user . "\n"; +print "database=" . $conf->db->name . "\n"; print "----- Options:\n"; -print "commitiferror=".$forcecommit."\n"; -print "Mapped LDAP fields=".join(',', $required_fields)."\n"; +print "commitiferror=" . $forcecommit . "\n"; +print "Mapped LDAP fields=" . join(',', $required_fields) . "\n"; print "\n"; -if (! $confirmed) -{ +if (! $confirmed) { print "Hit Enter to continue or CTRL+C to stop...\n"; $input = trim(fgets(STDIN)); } -if (empty($conf->global->LDAP_GROUP_DN)) -{ - print $langs->trans("Error").': '.$langs->trans("LDAP setup for groups not defined inside Dolibarr"); - exit(-1); +if (empty($conf->global->LDAP_GROUP_DN)) { + print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for groups not defined inside Dolibarr"); + exit(- 1); } - $ldap = new Ldap(); $result = $ldap->connect_bind(); -if ($result >= 0) -{ - $justthese=array(); - +if ($result >= 0) { + $justthese = array(); // We disable synchro Dolibarr-LDAP - $conf->global->LDAP_SYNCHRO_ACTIVE=0; + $conf->global->LDAP_SYNCHRO_ACTIVE = 0; $ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_GROUP_DN, $conf->global->LDAP_KEY_GROUPS, $required_fields, 0, array($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS)); - if (is_array($ldaprecords)) - { + if (is_array($ldaprecords)) { $db->begin(); // Warning $ldapuser has a key in lowercase - foreach ($ldaprecords as $key => $ldapgroup) - { + foreach ($ldaprecords as $key => $ldapgroup) { $group = new UserGroup($db); $group->fetch('', $ldapgroup[$conf->global->LDAP_KEY_GROUPS]); $group->name = $ldapgroup[$conf->global->LDAP_GROUP_FIELD_FULLNAME]; - $group->nom = $group->name; // For backward compatibility + $group->nom = $group->name; // For backward compatibility $group->note = $ldapgroup[$conf->global->LDAP_GROUP_FIELD_DESCRIPTION]; $group->entity = $conf->entity; - //print_r($ldapgroup); + // print_r($ldapgroup); - if($group->id > 0) { // Group update - print $langs->transnoentities("GroupUpdate").' # '.$key.': name='.$group->name; - $res=$group->update(); + if ($group->id > 0) { // Group update + print $langs->transnoentities("GroupUpdate") . ' # ' . $key . ': name=' . $group->name; + $res = $group->update(); - if ($res > 0) - { - print ' --> Updated group id='.$group->id.' name='.$group->name; - } - else - { - $error++; - print ' --> '.$res.' '.$group->error; + if ($res > 0) { + print ' --> Updated group id=' . $group->id . ' name=' . $group->name; + } else { + $error ++; + print ' --> ' . $res . ' ' . $group->error; } print "\n"; } else { // Group creation - print $langs->transnoentities("GroupCreate").' # '.$key.': name='.$group->name; - $res=$group->create(); + print $langs->transnoentities("GroupCreate") . ' # ' . $key . ': name=' . $group->name; + $res = $group->create(); - if ($res > 0) - { - print ' --> Created group id='.$group->id.' name='.$group->name; - } - else - { - $error++; - print ' --> '.$res.' '.$group->error; + if ($res > 0) { + print ' --> Created group id=' . $group->id . ' name=' . $group->name; + } else { + $error ++; + print ' --> ' . $res . ' ' . $group->error; } print "\n"; } - //print_r($group); + // print_r($group); // Gestion des utilisateurs associés au groupe // 1 - Association des utilisateurs du groupe LDAP au groupe Dolibarr $userList = array(); $userIdList = array(); - foreach($ldapgroup[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] as $key => $userdn) { - if($key === 'count') continue; - if(empty($userList[$userdn])) { // Récupération de l'utilisateur - // Schéma rfc2307: les membres sont listés dans l'attribut memberUid sous form de login uniquement - if ($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS === 'memberUid'){ + foreach ($ldapgroup[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] as $key => $userdn) { + if ($key === 'count') + continue; + if (empty($userList[$userdn])) { // Récupération de l'utilisateur + // Schéma rfc2307: les membres sont listés dans l'attribut memberUid sous form de login uniquement + if ($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS === 'memberUid') { $userKey = array($userdn); } else { // Pour les autres schémas, les membres sont listés sous forme de DN complets $userFilter = explode(',', $userdn); - $userKey = $ldap->getAttributeValues('('.$userFilter[0].')', $conf->global->LDAP_KEY_USERS); + $userKey = $ldap->getAttributeValues('(' . $userFilter[0] . ')', $conf->global->LDAP_KEY_USERS); } - if(!is_array($userKey)) continue; + if (! is_array($userKey)) + continue; $fuser = new User($db); - if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { + if ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { $fuser->fetch('', '', $userKey[0]); // Chargement du user concerné par le SID } elseif ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) { $fuser->fetch('', $userKey[0]); // Chargement du user concerné par le login @@ -209,55 +193,49 @@ if ($result >= 0) $userIdList[$userdn] = $fuser->id; // Ajout de l'utilisateur dans le groupe - if(!in_array($fuser->id, array_keys($group->members))) { + if (! in_array($fuser->id, array_keys($group->members))) { $fuser->SetInGroup($group->id, $group->entity); - echo $fuser->login.' added'."\n"; + echo $fuser->login . ' added' . "\n"; } } // 2 - Suppression des utilisateurs du groupe Dolibarr qui ne sont plus dans le groupe LDAP foreach ($group->members as $guser) { - if(!in_array($guser->id, $userIdList)) { + if (! in_array($guser->id, $userIdList)) { $guser->RemoveFromGroup($group->id, $group->entity); - echo $guser->login.' removed'."\n"; + echo $guser->login . ' removed' . "\n"; } } } - if (! $error || $forcecommit) - { - if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n"; - else print $langs->transnoentities("ErrorButCommitIsDone")."\n"; + if (! $error || $forcecommit) { + if (! $error) + print $langs->transnoentities("NoErrorCommitIsDone") . "\n"; + else + print $langs->transnoentities("ErrorButCommitIsDone") . "\n"; $db->commit(); - } - else - { - print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n"; + } else { + print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n"; $db->rollback(); } print "\n"; - } - else - { + } else { dol_print_error('', $ldap->error); - $error++; + $error ++; } -} -else -{ +} else { dol_print_error('', $ldap->error); - $error++; + $error ++; } - exit($error); - /** * Function to say if a value is empty or not * - * @param string $element Value to test - * @return boolean True of false + * @param string $element + * Value to test + * @return boolean True of false */ function dolValidElement($element) { diff --git a/scripts/user/sync_users_dolibarr2ldap.php b/scripts/user/sync_users_dolibarr2ldap.php index 64536f24a14..9fb613efd0d 100755 --- a/scripts/user/sync_users_dolibarr2ldap.php +++ b/scripts/user/sync_users_dolibarr2ldap.php @@ -2,7 +2,7 @@ - * Copyright (C) 2006 Laurent Destailleur + * Copyright (C) 2006 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,104 +19,95 @@ */ /** - * \file scripts/user/sync_users_dolibarr2ldap.php - * \ingroup ldap core - * \brief Script de mise a jour des users dans LDAP depuis base Dolibarr + * \file scripts/user/sync_users_dolibarr2ldap.php + * \ingroup ldap core + * \brief Script de mise a jour des users dans LDAP depuis base Dolibarr */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: $script_file now\n"; - exit(-1); + print "Usage: $script_file now\n"; + exit(- 1); } -$now=$argv[1]; +$now = $argv[1]; -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php"; // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); /* -if (! $conf->global->LDAP_SYNCHRO_ACTIVE) -{ - print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); - exit(-1); -} -*/ + * if (! $conf->global->LDAP_SYNCHRO_ACTIVE) + * { + * print $langs->trans("LDAPSynchronizationNotSetupInDolibarr"); + * exit(-1); + * } + */ $sql = "SELECT rowid"; -$sql .= " FROM ".MAIN_DB_PREFIX."user"; +$sql .= " FROM " . MAIN_DB_PREFIX . "user"; $resql = $db->query($sql); -if ($resql) -{ +if ($resql) { $num = $db->num_rows($resql); $i = 0; - $ldap=new Ldap(); + $ldap = new Ldap(); $ldap->connect_bind(); - while ($i < $num) - { - $ldap->error=""; + while ($i < $num) { + $ldap->error = ""; $obj = $db->fetch_object($resql); $fuser = new User($db); $fuser->fetch($obj->rowid); - print $langs->trans("UpdateUser")." rowid=".$fuser->id." ".$fuser->getFullName($langs); + print $langs->trans("UpdateUser") . " rowid=" . $fuser->id . " " . $fuser->getFullName($langs); - $oldobject=$fuser; + $oldobject = $fuser; - $oldinfo=$oldobject->_load_ldap_info(); - $olddn=$oldobject->_load_ldap_dn($oldinfo); + $oldinfo = $oldobject->_load_ldap_info(); + $olddn = $oldobject->_load_ldap_dn($oldinfo); - $info=$fuser->_load_ldap_info(); - $dn=$fuser->_load_ldap_dn($info); + $info = $fuser->_load_ldap_info(); + $dn = $fuser->_load_ldap_dn($info); - $result=$ldap->add($dn, $info, $user); // Wil fail if already exists - $result=$ldap->update($dn, $info, $user, $olddn); - if ($result > 0) - { - print " - ".$langs->trans("OK"); - } - else - { - $error++; - print " - ".$langs->trans("KO").' - '.$ldap->error; + $result = $ldap->add($dn, $info, $user); // Wil fail if already exists + $result = $ldap->update($dn, $info, $user, $olddn); + if ($result > 0) { + print " - " . $langs->trans("OK"); + } else { + $error ++; + print " - " . $langs->trans("KO") . ' - ' . $ldap->error; } print "\n"; - $i++; + $i ++; } $ldap->unbind(); $ldap->close(); -} -else -{ +} else { dol_print_error($db); } diff --git a/scripts/user/sync_users_ldap2dolibarr.php b/scripts/user/sync_users_ldap2dolibarr.php index 5a7f7ad5f53..75925b109bf 100755 --- a/scripts/user/sync_users_ldap2dolibarr.php +++ b/scripts/user/sync_users_ldap2dolibarr.php @@ -1,8 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2006-2012 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,301 +19,266 @@ */ /** - * \file scripts/user/sync_users_ldap2dolibarr.php - * \ingroup ldap member - * \brief Script to update users into Dolibarr from LDAP + * \file scripts/user/sync_users_ldap2dolibarr.php + * \ingroup ldap member + * \brief Script to update users into Dolibarr from LDAP */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"; -require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"; -require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php"; +require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php"; +require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php"; -$langs->loadLangs(array("main", "errors")); +$langs->loadLangs(array("main","errors")); // Global variables -$version=DOL_VERSION; -$error=0; -$forcecommit=0; -$excludeuser=array(); -$confirmed=0; +$version = DOL_VERSION; +$error = 0; +$forcecommit = 0; +$excludeuser = array(); +$confirmed = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); // List of fields to get from LDAP -$required_fields = array( - $conf->global->LDAP_KEY_USERS, - $conf->global->LDAP_FIELD_FULLNAME, - $conf->global->LDAP_FIELD_NAME, - $conf->global->LDAP_FIELD_FIRSTNAME, - $conf->global->LDAP_FIELD_LOGIN, - $conf->global->LDAP_FIELD_LOGIN_SAMBA, - $conf->global->LDAP_FIELD_PASSWORD, - $conf->global->LDAP_FIELD_PASSWORD_CRYPTED, - $conf->global->LDAP_FIELD_PHONE, - $conf->global->LDAP_FIELD_FAX, - $conf->global->LDAP_FIELD_MOBILE, - //$conf->global->LDAP_FIELD_ADDRESS, - //$conf->global->LDAP_FIELD_ZIP, - //$conf->global->LDAP_FIELD_TOWN, - //$conf->global->LDAP_FIELD_COUNTRY, - $conf->global->LDAP_FIELD_MAIL, - $conf->global->LDAP_FIELD_TITLE, - $conf->global->LDAP_FIELD_DESCRIPTION, - $conf->global->LDAP_FIELD_SID -); +$required_fields = array($conf->global->LDAP_KEY_USERS,$conf->global->LDAP_FIELD_FULLNAME,$conf->global->LDAP_FIELD_NAME,$conf->global->LDAP_FIELD_FIRSTNAME,$conf->global->LDAP_FIELD_LOGIN,$conf->global->LDAP_FIELD_LOGIN_SAMBA,$conf->global->LDAP_FIELD_PASSWORD,$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,$conf->global->LDAP_FIELD_PHONE,$conf->global->LDAP_FIELD_FAX,$conf->global->LDAP_FIELD_MOBILE, + // $conf->global->LDAP_FIELD_ADDRESS, + // $conf->global->LDAP_FIELD_ZIP, + // $conf->global->LDAP_FIELD_TOWN, + // $conf->global->LDAP_FIELD_COUNTRY, + $conf->global->LDAP_FIELD_MAIL,$conf->global->LDAP_FIELD_TITLE,$conf->global->LDAP_FIELD_DESCRIPTION,$conf->global->LDAP_FIELD_SID); // Remove from required_fields all entries not configured in LDAP (empty) and duplicated -$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement"))); +$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElement"))); if (! isset($argv[1])) { print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n"; - exit(-1); + exit(- 1); } -foreach($argv as $key => $val) -{ - if ($val == 'commitiferror') $forcecommit=1; - if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1]; - if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) $excludeuser=explode(',', $reg[1]); - if (preg_match('/-y$/', $val, $reg)) $confirmed=1; +foreach ($argv as $key => $val) { + if ($val == 'commitiferror') + $forcecommit = 1; + if (preg_match('/--server=([^\s]+)$/', $val, $reg)) + $conf->global->LDAP_SERVER_HOST = $reg[1]; + if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) + $excludeuser = explode(',', $reg[1]); + if (preg_match('/-y$/', $val, $reg)) + $confirmed = 1; } print "Mails sending disabled (useless in batch mode)\n"; -$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails print "\n"; print "----- Synchronize all records from LDAP database:\n"; -print "host=".$conf->global->LDAP_SERVER_HOST."\n"; -print "port=".$conf->global->LDAP_SERVER_PORT."\n"; -print "login=".$conf->global->LDAP_ADMIN_DN."\n"; -print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n"; -print "DN to extract=".$conf->global->LDAP_USER_DN."\n"; -if (! empty($conf->global->LDAP_FILTER_CONNECTION)) print 'Filter=('.$conf->global->LDAP_FILTER_CONNECTION.')'."\n"; // Note: filter is defined into function getRecords -else print 'Filter=('.$conf->global->LDAP_KEY_USERS.'=*)'."\n"; +print "host=" . $conf->global->LDAP_SERVER_HOST . "\n"; +print "port=" . $conf->global->LDAP_SERVER_PORT . "\n"; +print "login=" . $conf->global->LDAP_ADMIN_DN . "\n"; +print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n"; +print "DN to extract=" . $conf->global->LDAP_USER_DN . "\n"; +if (! empty($conf->global->LDAP_FILTER_CONNECTION)) + print 'Filter=(' . $conf->global->LDAP_FILTER_CONNECTION . ')' . "\n"; // Note: filter is defined into function getRecords +else + print 'Filter=(' . $conf->global->LDAP_KEY_USERS . '=*)' . "\n"; print "----- To Dolibarr database:\n"; -print "type=".$conf->db->type."\n"; -print "host=".$conf->db->host."\n"; -print "port=".$conf->db->port."\n"; -print "login=".$conf->db->user."\n"; -print "database=".$conf->db->name."\n"; +print "type=" . $conf->db->type . "\n"; +print "host=" . $conf->db->host . "\n"; +print "port=" . $conf->db->port . "\n"; +print "login=" . $conf->db->user . "\n"; +print "database=" . $conf->db->name . "\n"; print "----- Options:\n"; -print "commitiferror=".$forcecommit."\n"; -print "excludeuser=".join(',', $excludeuser)."\n"; -print "Mapped LDAP fields=".join(',', $required_fields)."\n"; +print "commitiferror=" . $forcecommit . "\n"; +print "excludeuser=" . join(',', $excludeuser) . "\n"; +print "Mapped LDAP fields=" . join(',', $required_fields) . "\n"; print "\n"; -if (! $confirmed) -{ +if (! $confirmed) { print "Hit Enter to continue or CTRL+C to stop...\n"; $input = trim(fgets(STDIN)); } -if (empty($conf->global->LDAP_USER_DN)) -{ - print $langs->trans("Error").': '.$langs->trans("LDAP setup for users not defined inside Dolibarr"); - exit(-1); +if (empty($conf->global->LDAP_USER_DN)) { + print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for users not defined inside Dolibarr"); + exit(- 1); } - // Load table of correspondence of countries -$hashlib2rowid=array(); -$countries=array(); +$hashlib2rowid = array(); +$countries = array(); $sql = "SELECT rowid, code, label, active"; -$sql.= " FROM ".MAIN_DB_PREFIX."c_country"; -$sql.= " WHERE active = 1"; -$sql.= " ORDER BY code ASC"; -$resql=$db->query($sql); -if ($resql) -{ +$sql .= " FROM " . MAIN_DB_PREFIX . "c_country"; +$sql .= " WHERE active = 1"; +$sql .= " ORDER BY code ASC"; +$resql = $db->query($sql); +if ($resql) { $num = $db->num_rows($resql); $i = 0; - if ($num) - { - while ($i < $num) - { + if ($num) { + while ($i < $num) { $obj = $db->fetch_object($resql); - if ($obj) - { - //print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n"; - $hashlib2rowid[strtolower($obj->label)]=$obj->rowid; - $countries[$obj->rowid]=array('rowid' => $obj->rowid, 'label' => $obj->label, 'code' => $obj->code); + if ($obj) { + // print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n"; + $hashlib2rowid[strtolower($obj->label)] = $obj->rowid; + $countries[$obj->rowid] = array('rowid' => $obj->rowid,'label' => $obj->label,'code' => $obj->code); } - $i++; + $i ++; } } -} -else -{ +} else { dol_print_error($db); - exit(-1); + exit(- 1); } - - $ldap = new Ldap(); $result = $ldap->connect_bind(); -if ($result >= 0) -{ - $justthese=array(); - +if ($result >= 0) { + $justthese = array(); // We disable synchro Dolibarr-LDAP - $conf->global->LDAP_SYNCHRO_ACTIVE=0; + $conf->global->LDAP_SYNCHRO_ACTIVE = 0; - $ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields, 'user'); // Fiter on 'user' filter param - if (is_array($ldaprecords)) - { + $ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields, 'user'); // Fiter on 'user' filter param + if (is_array($ldaprecords)) { $db->begin(); // Warning $ldapuser has a key in lowercase - foreach ($ldaprecords as $key => $ldapuser) - { + foreach ($ldaprecords as $key => $ldapuser) { // If login into exclude list, we discard record - if (in_array($ldapuser[$conf->global->LDAP_FIELD_LOGIN], $excludeuser)) - { - print $langs->transnoentities("UserDiscarded").' # '.$key.': login='.$ldapuser[$conf->global->LDAP_FIELD_LOGIN].' --> Discarded'."\n"; + if (in_array($ldapuser[$conf->global->LDAP_FIELD_LOGIN], $excludeuser)) { + print $langs->transnoentities("UserDiscarded") . ' # ' . $key . ': login=' . $ldapuser[$conf->global->LDAP_FIELD_LOGIN] . ' --> Discarded' . "\n"; continue; } $fuser = new User($db); - if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { + if ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { $fuser->fetch('', '', $ldapuser[$conf->global->LDAP_KEY_USERS]); // Chargement du user concerné par le SID } elseif ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) { $fuser->fetch('', $ldapuser[$conf->global->LDAP_KEY_USERS]); // Chargement du user concerné par le login } // Propriete membre - $fuser->firstname=$ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME]; - $fuser->lastname=$ldapuser[$conf->global->LDAP_FIELD_NAME]; - $fuser->login=$ldapuser[$conf->global->LDAP_FIELD_LOGIN]; - $fuser->pass=$ldapuser[$conf->global->LDAP_FIELD_PASSWORD]; - $fuser->pass_indatabase_crypted=$ldapuser[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED]; + $fuser->firstname = $ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME]; + $fuser->lastname = $ldapuser[$conf->global->LDAP_FIELD_NAME]; + $fuser->login = $ldapuser[$conf->global->LDAP_FIELD_LOGIN]; + $fuser->pass = $ldapuser[$conf->global->LDAP_FIELD_PASSWORD]; + $fuser->pass_indatabase_crypted = $ldapuser[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED]; - //$user->societe; + // $user->societe; /* - $fuser->address=$ldapuser[$conf->global->LDAP_FIELD_ADDRESS]; - $fuser->zip=$ldapuser[$conf->global->LDAP_FIELD_ZIP]; - $fuser->town=$ldapuser[$conf->global->LDAP_FIELD_TOWN]; - $fuser->country=$ldapuser[$conf->global->LDAP_FIELD_COUNTRY]; - $fuser->country_id=$countries[$hashlib2rowid[strtolower($fuser->country)]]['rowid']; - $fuser->country_code=$countries[$hashlib2rowid[strtolower($fuser->country)]]['code']; - */ + * $fuser->address=$ldapuser[$conf->global->LDAP_FIELD_ADDRESS]; + * $fuser->zip=$ldapuser[$conf->global->LDAP_FIELD_ZIP]; + * $fuser->town=$ldapuser[$conf->global->LDAP_FIELD_TOWN]; + * $fuser->country=$ldapuser[$conf->global->LDAP_FIELD_COUNTRY]; + * $fuser->country_id=$countries[$hashlib2rowid[strtolower($fuser->country)]]['rowid']; + * $fuser->country_code=$countries[$hashlib2rowid[strtolower($fuser->country)]]['code']; + */ - $fuser->office_phone=$ldapuser[$conf->global->LDAP_FIELD_PHONE]; - $fuser->user_mobile=$ldapuser[$conf->global->LDAP_FIELD_MOBILE]; - $fuser->office_fax=$ldapuser[$conf->global->LDAP_FIELD_FAX]; - $fuser->email=$ldapuser[$conf->global->LDAP_FIELD_MAIL]; - $fuser->ldap_sid=$ldapuser[$conf->global->LDAP_FIELD_SID]; + $fuser->office_phone = $ldapuser[$conf->global->LDAP_FIELD_PHONE]; + $fuser->user_mobile = $ldapuser[$conf->global->LDAP_FIELD_MOBILE]; + $fuser->office_fax = $ldapuser[$conf->global->LDAP_FIELD_FAX]; + $fuser->email = $ldapuser[$conf->global->LDAP_FIELD_MAIL]; + $fuser->ldap_sid = $ldapuser[$conf->global->LDAP_FIELD_SID]; - $fuser->job=$ldapuser[$conf->global->LDAP_FIELD_TITLE]; - $fuser->note=$ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION]; - $fuser->admin=0; - $fuser->societe_id=0; - $fuser->contact_id=0; - $fuser->fk_member=0; + $fuser->job = $ldapuser[$conf->global->LDAP_FIELD_TITLE]; + $fuser->note = $ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION]; + $fuser->admin = 0; + $fuser->societe_id = 0; + $fuser->contact_id = 0; + $fuser->fk_member = 0; - $fuser->statut=1; + $fuser->statut = 1; // TODO : revoir la gestion du status - /*if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS])) - { - $fuser->datec=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); - $fuser->datevalid=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); - $fuser->statut=$ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]; - }*/ - //if ($fuser->statut > 1) $fuser->statut=1; + /* + * if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS])) + * { + * $fuser->datec=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); + * $fuser->datevalid=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]); + * $fuser->statut=$ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]; + * } + */ + // if ($fuser->statut > 1) $fuser->statut=1; - //print_r($ldapuser); + // print_r($ldapuser); - if($fuser->id > 0) { // User update - print $langs->transnoentities("UserUpdate").' # '.$key.': login='.$fuser->login.', fullname='.$fuser->getFullName($langs); - $res=$fuser->update($user); + if ($fuser->id > 0) { // User update + print $langs->transnoentities("UserUpdate") . ' # ' . $key . ': login=' . $fuser->login . ', fullname=' . $fuser->getFullName($langs); + $res = $fuser->update($user); - if ($res < 0) - { - $error++; - print ' --> '.$res.' '.$fuser->error; - } - else - { - print ' --> Updated user id='.$fuser->id.' login='.$fuser->login; + if ($res < 0) { + $error ++; + print ' --> ' . $res . ' ' . $fuser->error; + } else { + print ' --> Updated user id=' . $fuser->id . ' login=' . $fuser->login; } } else { // User creation - print $langs->transnoentities("UserCreate").' # '.$key.': login='.$fuser->login.', fullname='.$fuser->getFullName($langs); - $res=$fuser->create($user); + print $langs->transnoentities("UserCreate") . ' # ' . $key . ': login=' . $fuser->login . ', fullname=' . $fuser->getFullName($langs); + $res = $fuser->create($user); - if ($res > 0) - { - print ' --> Created user id='.$fuser->id.' login='.$fuser->login; - } - else - { - $error++; - print ' --> '.$res.' '.$fuser->error; + if ($res > 0) { + print ' --> Created user id=' . $fuser->id . ' login=' . $fuser->login; + } else { + $error ++; + print ' --> ' . $res . ' ' . $fuser->error; } } print "\n"; - //print_r($fuser); + // print_r($fuser); // Gestion des groupes // TODO : revoir la gestion des groupes (ou script de sync groupes) - /*if(!$error) { - foreach ($ldapuser[$conf->global->LDAP_FIELD_USERGROUPS] as $groupdn) { - $groupdn; - } - }*/ + /* + * if(!$error) { + * foreach ($ldapuser[$conf->global->LDAP_FIELD_USERGROUPS] as $groupdn) { + * $groupdn; + * } + * } + */ } - if (! $error || $forcecommit) - { - if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n"; - else print $langs->transnoentities("ErrorButCommitIsDone")."\n"; + if (! $error || $forcecommit) { + if (! $error) + print $langs->transnoentities("NoErrorCommitIsDone") . "\n"; + else + print $langs->transnoentities("ErrorButCommitIsDone") . "\n"; $db->commit(); - } - else - { - print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n"; + } else { + print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n"; $db->rollback(); } print "\n"; - } - else - { + } else { dol_print_error('', $ldap->error); - $error++; + $error ++; } -} -else -{ +} else { dol_print_error('', $ldap->error); - $error++; + $error ++; } - exit($error); - /** * Function to say if a value is empty or not * - * @param string $element Value to test - * @return boolean True of false + * @param string $element + * Value to test + * @return boolean True of false */ function dolValidElement($element) { diff --git a/scripts/withdrawals/build_withdrawal_file.php b/scripts/withdrawals/build_withdrawal_file.php index c834847a272..a83fc7d7b22 100755 --- a/scripts/withdrawals/build_withdrawal_file.php +++ b/scripts/withdrawals/build_withdrawal_file.php @@ -1,8 +1,8 @@ #!/usr/bin/env php - * Copyright (C) 2005-2010 Laurent Destailleur + * Copyright (C) 2005 Rodolphe Quiedeville + * Copyright (C) 2005-2010 Laurent Destailleur * * 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 @@ -11,7 +11,7 @@ * * 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 + * 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 @@ -19,39 +19,37 @@ */ /** - * \file scripts/withdrawals/build_withdrawal_file.php - * \ingroup prelevement - * \brief Script de prelevement + * \file scripts/withdrawals/build_withdrawal_file.php + * \ingroup prelevement + * \brief Script de prelevement */ - $sapi_type = php_sapi_name(); $script_file = basename(__FILE__); -$path=dirname(__FILE__).'/'; +$path = __DIR__ . '/'; // Test if batch mode if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; - exit(-1); + echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; + exit(- 1); } -require_once $path."../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT."/compta/prelevement/class/bonprelevement.class.php"; -require_once DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php"; -require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"; -require_once DOL_DOCUMENT_ROOT."/compta/paiement/class/paiement.class.php"; +require_once $path . "../../htdocs/master.inc.php"; +require_once DOL_DOCUMENT_ROOT . "/compta/prelevement/class/bonprelevement.class.php"; +require_once DOL_DOCUMENT_ROOT . "/compta/facture/class/facture.class.php"; +require_once DOL_DOCUMENT_ROOT . "/societe/class/societe.class.php"; +require_once DOL_DOCUMENT_ROOT . "/compta/paiement/class/paiement.class.php"; // Global variables -$version=DOL_VERSION; -$error=0; - +$version = DOL_VERSION; +$error = 0; /* * Main */ @set_time_limit(0); -print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; -dol_syslog($script_file." launched with arg ".join(',', $argv)); +print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; +dol_syslog($script_file . " launched with arg " . join(',', $argv)); $datetimeprev = dol_now(); @@ -61,18 +59,16 @@ $year = strftime("%Y", $datetimeprev); $user = new user($db); $user->fetch($conf->global->PRELEVEMENT_USER); -if (! isset($argv[1])) { // Check parameters - print "This script check invoices with a withdrawal request and\n"; - print "then create payment and build a withdraw file.\n"; - print "Usage: ".$script_file." simu|real\n"; - exit(-1); +if (! isset($argv[1])) { // Check parameters + print "This script check invoices with a withdrawal request and\n"; + print "then create payment and build a withdraw file.\n"; + print "Usage: " . $script_file . " simu|real\n"; + exit(- 1); } - -$withdrawreceipt=new BonPrelevement($db); +$withdrawreceipt = new BonPrelevement($db); // $conf->global->PRELEVEMENT_CODE_BANQUE and $conf->global->PRELEVEMENT_CODE_GUICHET should be empty -$result=$withdrawreceipt->create($conf->global->PRELEVEMENT_CODE_BANQUE, $conf->global->PRELEVEMENT_CODE_GUICHET, $argv[1]); - +$result = $withdrawreceipt->create($conf->global->PRELEVEMENT_CODE_BANQUE, $conf->global->PRELEVEMENT_CODE_GUICHET, $argv[1]); $db->close(); From 2b5b6c16b72be98f4c9a3b148e2f61a252accd3f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 13:20:11 +0200 Subject: [PATCH 0421/1036] Add conf for phpstan --- phpstan.neon | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 phpstan.neon diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 00000000000..1c35bd2faf3 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,83 @@ +parameters: + bootstrap: null + excludes_analyse: + - %rootDir%/htdocs/includes/* + autoload_directories: [] + autoload_files: [] + featureToggles: + subtractableTypes: false + validateParameters: false + fileExtensions: + - php + checkAlwaysTrueCheckTypeFunctionCall: false + checkAlwaysTrueInstanceof: false + checkAlwaysTrueStrictComparison: false + checkClassCaseSensitivity: false + checkFunctionArgumentTypes: false + checkFunctionNameCase: false + checkArgumentsPassedByReference: false + checkMaybeUndefinedVariables: false + checkNullables: false + checkThisOnly: true + checkUnionTypes: false + checkExplicitMixedMissingReturn: false + checkPhpDocMissingReturn: false + reportMaybes: false + reportMaybesInMethodSignatures: false + reportStaticMethodSignatures: false + polluteScopeWithLoopInitialAssignments: true + polluteScopeWithAlwaysIterableForeach: true + polluteCatchScopeWithTryAssignments: false + reportMagicMethods: false + reportMagicProperties: false + ignoreErrors: [] + internalErrorsCountLimit: 50 + cache: + nodesByFileCountMax: 512 + nodesByStringCountMax: 512 + reportUnmatchedIgnoredErrors: true + scopeClass: PHPStan\Analyser\Scope + universalObjectCratesClasses: + - stdClass + - SimpleXMLElement + earlyTerminatingMethodCalls: [] + memoryLimitFile: %tmpDir%/.memory_limit + benchmarkFile: null + dynamicConstantNames: + - ICONV_IMPL + - PHP_VERSION + - PHP_MAJOR_VERSION + - PHP_MINOR_VERSION + - PHP_RELEASE_VERSION + - PHP_VERSION_ID + - PHP_EXTRA_VERSION + - PHP_ZTS + - PHP_DEBUG + - PHP_MAXPATHLEN + - PHP_OS + - PHP_OS_FAMILY + - PHP_SAPI + - PHP_EOL + - PHP_INT_MAX + - PHP_INT_MIN + - PHP_INT_SIZE + - PHP_FLOAT_DIG + - PHP_FLOAT_EPSILON + - PHP_FLOAT_MIN + - PHP_FLOAT_MAX + - DEFAULT_INCLUDE_PATH + - PEAR_INSTALL_DIR + - PEAR_EXTENSION_DIR + - PHP_EXTENSION_DIR + - PHP_PREFIX + - PHP_BINDIR + - PHP_BINARY + - PHP_MANDIR + - PHP_LIBDIR + - PHP_DATADIR + - PHP_SYSCONFDIR + - PHP_LOCALSTATEDIR + - PHP_CONFIG_FILE_PATH + - PHP_CONFIG_FILE_SCAN_DIR + - PHP_SHLIB_SUFFIX + - PHP_FD_SETSIZE From 379c6e1bb1ee7938a4f14d9d8527c72933ea0486 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 16:33:38 +0200 Subject: [PATCH 0422/1036] Removed deprecated scripts --- scripts/modulebuilder/builddoc.php | 106 ------------------- scripts/modulebuilder/initmodule.php | 147 --------------------------- 2 files changed, 253 deletions(-) delete mode 100755 scripts/modulebuilder/builddoc.php delete mode 100755 scripts/modulebuilder/initmodule.php diff --git a/scripts/modulebuilder/builddoc.php b/scripts/modulebuilder/builddoc.php deleted file mode 100755 index a13f1f7eae1..00000000000 --- a/scripts/modulebuilder/builddoc.php +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env php - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file scripts/modulebuilder/builddoc.php - * \ingroup modulebuilder - * \brief Script to build a documentation from input files (.asciidoc or .md files). - * Use asciidoctor tool. - * - * If file is a MD file, convert image links into asciidoc format. - * ![Screenshot patient card](img/dolimed_screenshot_patientcard.png?raw=true "Patient card") - * image:img/dolimed_screenshot_patientcard.png[Screenshot patient card] - */ -$sapi_type = php_sapi_name(); -$script_file = basename(__FILE__); -$path = __DIR__ . '/'; - -// Test if batch mode -if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; - exit(- 1); -} - -if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: " . $script_file . " ModuleName\n"; - exit(- 1); -} -$modulename = $argv[1]; - -require_once $path . "../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/modulebuilder.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/utils.class.php'; - -$langs->loadLangs(array("admin","modulebuilder","other","cron")); - -// Global variables -$version = DOL_VERSION; -$error = 0; - -// Dir for custom dirs -$tmp = explode(',', $dolibarr_main_document_root_alt); -$dirins = $tmp[0]; -$dirread = $dirins; -$forceddirread = 0; - -$tmpdir = explode('@', $module); -if (! empty($tmpdir[1])) { - $module = $tmpdir[0]; - $dirread = $tmpdir[1]; - $forceddirread = 1; -} - -$FILEFLAG = 'modulebuilder.txt'; - -$now = dol_now(); -$newmask = 0; -if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) - $newmask = $conf->global->MAIN_UMASK; -if (empty($newmask)) // This should no happen -{ - $newmask = '0664'; -} - -/* - * Main - */ - -@set_time_limit(0); -print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; -print "modulename=" . $modulename . "\n"; -print "dirins=" . $dirins . "\n"; - -$FILENAMEDOC = strtolower($module) . '.html'; // TODO Use/text PDF -$dirofmodule = dol_buildpath(strtolower($module), 0) . '/doc'; -$outputfiledoc = $dirofmodule . '/' . $FILENAMEDOC; - -$util = new Utils($db); -$result = $util->generateDoc($module); - -if ($result <= 0) { - print $util->errors; - exit(1); -} - -print $langs->trans("DocFileGeneratedInto", $outputfiledoc); -exit(0); diff --git a/scripts/modulebuilder/initmodule.php b/scripts/modulebuilder/initmodule.php deleted file mode 100755 index 6bdab236078..00000000000 --- a/scripts/modulebuilder/initmodule.php +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env php - - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file scripts/modulebuilder/initmodule.php - * \ingroup modulebuilder - * \brief Script to initialize a module. - */ -$sapi_type = php_sapi_name(); -$script_file = basename(__FILE__); -$path = __DIR__ . '/'; - -// Test if batch mode -if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n"; - exit(- 1); -} - -if (! isset($argv[1]) || ! $argv[1]) { - print "Usage: " . $script_file . " ModuleName\n"; - exit(- 1); -} -$modulename = $argv[1]; - -require_once $path . "../../htdocs/master.inc.php"; -require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/modulebuilder.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; - -$langs->loadLangs(array("admin","modulebuilder","other","cron")); - -// Global variables -$version = DOL_VERSION; -$error = 0; - -// Dir for custom dirs -$tmp = explode(',', $dolibarr_main_document_root_alt); -$dirins = $tmp[0]; -$dirread = $dirins; -$forceddirread = 0; - -$tmpdir = explode('@', $module); -if (! empty($tmpdir[1])) { - $module = $tmpdir[0]; - $dirread = $tmpdir[1]; - $forceddirread = 1; -} - -$FILEFLAG = 'modulebuilder.txt'; - -$now = dol_now(); -$newmask = 0; -if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) - $newmask = $conf->global->MAIN_UMASK; -if (empty($newmask)) // This should no happen -{ - $newmask = '0664'; -} - -/* - * Main - */ - -@set_time_limit(0); -print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n"; -print "modulename=" . $modulename . "\n"; -print "dirins=" . $dirins . "\n"; - -if (preg_match('/[^a-z0-9_]/i', $modulename)) { - $error ++; - print 'Error ' . $langs->trans("SpaceOrSpecialCharAreNotAllowed") . "\n"; - exit(1); -} - -if (! $error) { - $srcdir = DOL_DOCUMENT_ROOT . '/modulebuilder/template'; - $destdir = $dirins . '/' . strtolower($modulename); - - $arrayreplacement = array('mymodule' => strtolower($modulename),'MyModule' => $modulename); - - $result = dolCopyDir($srcdir, $destdir, 0, 0, $arrayreplacement); - // dol_mkdir($destfile); - if ($result <= 0) { - if ($result < 0) { - $error ++; - $langs->load("errors"); - print $langs->trans("ErrorFailToCopyDir", $srcdir, $destdir) . "\n"; - exit(2); - } else // $result == 0 - { - print $langs->trans("AllFilesDidAlreadyExist", $srcdir, $destdir) . "\n"; - } - } - - // Delete some files - dol_delete_file($destdir . '/myobject_card.php'); - dol_delete_file($destdir . '/myobject_note.php'); - dol_delete_file($destdir . '/myobject_document.php'); - dol_delete_file($destdir . '/myobject_agenda.php'); - dol_delete_file($destdir . '/myobject_list.php'); - dol_delete_file($destdir . '/lib/myobject.lib.php'); - dol_delete_file($destdir . '/test/phpunit/MyObjectTest.php'); - dol_delete_file($destdir . '/sql/llx_mymodule_myobject.sql'); - dol_delete_file($destdir . '/sql/llx_mymodule_myobject_extrafields.sql'); - dol_delete_file($destdir . '/sql/llx_mymodule_myobject.key.sql'); - dol_delete_file($destdir . '/scripts/myobject.php'); - dol_delete_file($destdir . '/img/object_myobject.png'); - dol_delete_file($destdir . '/class/myobject.class.php'); - dol_delete_file($destdir . '/class/api_mymodule.class.php'); -} - -// Edit PHP files -if (! $error) { - $listofphpfilestoedit = dol_dir_list($destdir, 'files', 1, '\.(php|MD|js|sql|txt|xml|lang)$', '', 'fullname', SORT_ASC, 0, 1); - foreach ($listofphpfilestoedit as $phpfileval) { - // var_dump($phpfileval['fullname']); - $arrayreplacement = array('mymodule' => strtolower($modulename),'MyModule' => $modulename,'MYMODULE' => strtoupper($modulename),'My module' => $modulename,'my module' => $modulename,'Mon module' => $modulename,'mon module' => $modulename,'htdocs/modulebuilder/template' => strtolower($modulename),'---Put here your own copyright and developer email---' => dol_print_date($now, '%Y') . ' ' . $user->getFullName($langs) . ($user->email ? ' <' . $user->email . '>' : '')); - - $result = dolReplaceInFile($phpfileval['fullname'], $arrayreplacement); - // var_dump($result); - if ($result < 0) { - print $langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname']) . "\n"; - exit(3); - } - } -} - -print 'Module initialized' . "\n"; -exit(0); From 717cafe213658c05613d940b05b372b94be0eace Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 17:50:35 +0200 Subject: [PATCH 0423/1036] Fix doc --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 3ee0cd1f3e1..35f977fd1d2 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -660,7 +660,7 @@ function dol_buildpath($path, $type = 0, $returnemptyifnotfound = 0) if (empty($type)) // For a filesystem path { $res = DOL_DOCUMENT_ROOT.'/'.$path; // Standard default path - foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) + foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array("main"=>"/home/main/htdocs", "alt0"=>"/home/dirmod/htdocs", ...) { if ($key == 'main') { From 4a6954141936fb411215d4705792c8c32adc1513 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 18:59:46 +0200 Subject: [PATCH 0424/1036] Several bug fixes using phpstan --- build/phpstan/bootstrap.php | 15 ++++++++ htdocs/core/lib/functions.lib.php | 19 +++++----- htdocs/main.inc.php | 4 +-- htdocs/societe/class/societeaccount.class.php | 2 +- htdocs/societe/website.php | 14 +++++--- phpstan.neon | 35 ++++++++++++++++--- 6 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 build/phpstan/bootstrap.php diff --git a/build/phpstan/bootstrap.php b/build/phpstan/bootstrap.php new file mode 100644 index 00000000000..7f232860a2b --- /dev/null +++ b/build/phpstan/bootstrap.php @@ -0,0 +1,15 @@ +file->dol_document_root as $key => $dirroot) // ex: array("main"=>"/home/main/htdocs", "alt0"=>"/home/dirmod/htdocs", ...) + if (is_array($conf->file->dol_document_root)) { - if ($key == 'main') + foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array("main"=>"/home/main/htdocs", "alt0"=>"/home/dirmod/htdocs", ...) { - continue; - } - if (file_exists($dirroot.'/'.$path)) - { - $res=$dirroot.'/'.$path; - return $res; + if ($key == 'main') + { + continue; + } + if (file_exists($dirroot.'/'.$path)) + { + $res=$dirroot.'/'.$path; + return $res; + } } } if ($returnemptyifnotfound) // Not found into alternate dir diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index f195d5f945e..4f7776a3150 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1152,7 +1152,7 @@ function top_httphead($contenttype = 'text/html', $forcenocache = 0) $contentsecuritypolicy = $conf->global->MAIN_HTTP_CONTENT_SECURITY_POLICY; if (! is_object($hookmanager)) $hookmanager = new HookManager($db); - $hookmanager->initHooks("main"); + $hookmanager->initHooks(array("main")); $parameters=array('contentsecuritypolicy'=>$contentsecuritypolicy); $result=$hookmanager->executeHooks('setContentSecurityPolicy', $parameters); // Note that $action and $object may have been modified by some hooks @@ -1212,7 +1212,7 @@ function top_htmlhead($head, $title = '', $disablejs = 0, $disablehead = 0, $arr if (empty($disablehead)) { if (! is_object($hookmanager)) $hookmanager = new HookManager($db); - $hookmanager->initHooks("main"); + $hookmanager->initHooks(array("main")); $ext='layout='.$conf->browser->layout.'&version='.urlencode(DOL_VERSION); diff --git a/htdocs/societe/class/societeaccount.class.php b/htdocs/societe/class/societeaccount.class.php index 14b567a62e6..6f24471a295 100644 --- a/htdocs/societe/class/societeaccount.class.php +++ b/htdocs/societe/class/societeaccount.class.php @@ -20,7 +20,7 @@ */ /** - * \file class/societeaccount.class.php + * \file societe/class/societeaccount.class.php * \ingroup societe * \brief This file is a CRUD class file for SocieteAccount (Create/Read/Update/Delete) */ diff --git a/htdocs/societe/website.php b/htdocs/societe/website.php index 0a5c62b9afb..8f7c83dcef5 100644 --- a/htdocs/societe/website.php +++ b/htdocs/societe/website.php @@ -37,6 +37,12 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; $langs->loadLangs(array("companies","website")); +$action = GETPOST('action', 'aZ09')?GETPOST('action', 'aZ09'):'view'; // The action 'add', 'create', 'edit', 'update', 'view', ... +$show_files = GETPOST('show_files', 'int'); +$contextpage= GETPOST('contextpage', 'aZ')?GETPOST('contextpage', 'aZ'):'myobjectlist'; // To manage different context of search +$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page +$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print') + $search_status=GETPOST('search_status'); // Security check @@ -340,14 +346,14 @@ $objecttmp=new SocieteAccount($db); $trackid='thi'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; -if ($sall) +/*if ($sall) { foreach($fieldstosearchall as $key => $val) $fieldstosearchall[$key]=$langs->trans($val); print '
'.$langs->trans("FilterOnInto", $sall) . join(', ', $fieldstosearchall).'
'; -} +}*/ -/*$moreforfilter = ''; -$moreforfilter.='
'; +$moreforfilter = ''; +/*$moreforfilter.='
'; $moreforfilter.= $langs->trans('MyFilter') . ': '; $moreforfilter.= '
';*/ diff --git a/phpstan.neon b/phpstan.neon index 1c35bd2faf3..aa7d4fbacc2 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,8 +1,27 @@ parameters: - bootstrap: null + bootstrap: %currentWorkingDirectory%/build/phpstan/bootstrap.php excludes_analyse: - - %rootDir%/htdocs/includes/* - autoload_directories: [] + - %currentWorkingDirectory%/htdocs/includes/* + autoload_directories: + - %currentWorkingDirectory%/htdocs/accountancy/class + - %currentWorkingDirectory%/htdocs/adherents/class + - %currentWorkingDirectory%/htdocs/api/class + - %currentWorkingDirectory%/htdocs/asset/class + - %currentWorkingDirectory%/htdocs/blockedlog/class + - %currentWorkingDirectory%/htdocs/bom/class + - %currentWorkingDirectory%/htdocs/bookmarks/class + - %currentWorkingDirectory%/htdocs/cashdesk/class + - %currentWorkingDirectory%/htdocs/categories/class + - %currentWorkingDirectory%/htdocs/comm/action/class + - %currentWorkingDirectory%/htdocs/comm/propal/class + - %currentWorkingDirectory%/htdocs/commande/class + - %currentWorkingDirectory%/htdocs/compta/bank/class + - %currentWorkingDirectory%/htdocs/conf + - %currentWorkingDirectory%/htdocs/contact/class + - %currentWorkingDirectory%/htdocs/contrat/class + - %currentWorkingDirectory%/htdocs/core/class + - %currentWorkingDirectory%/htdocs/societe/class + - %currentWorkingDirectory%/htdocs/user/class autoload_files: [] featureToggles: subtractableTypes: false @@ -30,7 +49,15 @@ parameters: polluteCatchScopeWithTryAssignments: false reportMagicMethods: false reportMagicProperties: false - ignoreErrors: [] + ignoreErrors: + - + message: '#Call to an undefined method abcdef#' + path: %currentWorkingDirectory%/dirtoignoreerror/* + - '#Undefined variable: \$langs#' + - '#Undefined variable: \$user#' + - '#Undefined variable: \$db#' + - '#Undefined variable: \$conf#' + - '#Undefined variable: \$hookmanager#' internalErrorsCountLimit: 50 cache: nodesByFileCountMax: 512 From 2016c0bd932563723f2c301405f08ef80d3d1520 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 19:12:33 +0200 Subject: [PATCH 0425/1036] Fix reported by phpstan --- htdocs/product/fournisseurs.php | 2 +- htdocs/product/price.php | 4 ++-- htdocs/societe/price.php | 4 ++-- phpstan.neon | 2 ++ 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 67574b56318..6d43e4d4a3f 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -778,7 +778,7 @@ SCRIPT; $num = count($product_fourn_list); if (($num + ($offset * $limit)) < $nbtotalofrecords) $num++; - print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVEUR ['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit, 1); + print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVER ['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit, 1); // Suppliers list title print '
'; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 4b753e71838..f6efc0296b1 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1851,7 +1851,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) $backbutton='' . $langs->trans("Back") . ''; - print_barre_liste($title, $page, $_SERVEUR['PHP_SELF'], $option, $sortfield, $sortorder, $backbutton, count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); + print_barre_liste($title, $page, $_SERVER['PHP_SELF'], $option, $sortfield, $sortorder, $backbutton, count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); if (count($prodcustprice->lines) > 0) { @@ -1973,7 +1973,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) $option = '&search_soc=' . $search_soc . '&id=' . $object->id; - print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); + print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVER ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); print '
'; print ''; diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php index 11930b3e009..96df443e420 100644 --- a/htdocs/societe/price.php +++ b/htdocs/societe/price.php @@ -428,7 +428,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { $option = '&socid=' . GETPOST('socid', 'int') . '&prodid=' . GETPOST('prodid', 'int'); - print_barre_liste($langs->trans('PriceByCustomerLog'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); + print_barre_liste($langs->trans('PriceByCustomerLog'), $page, $_SERVER ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); if (count($prodcustprice->lines) > 0) { @@ -519,7 +519,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print ''."\n"; - print_barre_liste($langs->trans('PriceForEachProduct'), $page, $_SERVEUR['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, ''); + print_barre_liste($langs->trans('PriceForEachProduct'), $page, $_SERVER['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, ''); print ''; print ''; diff --git a/phpstan.neon b/phpstan.neon index aa7d4fbacc2..9c373775296 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,7 +1,9 @@ parameters: bootstrap: %currentWorkingDirectory%/build/phpstan/bootstrap.php excludes_analyse: + - %currentWorkingDirectory%/htdocs/includes/restler/framework/Luracast/Restler/AutoLoader.php - %currentWorkingDirectory%/htdocs/includes/* + - %currentWorkingDirectory%/htdocs/*/class/api_* autoload_directories: - %currentWorkingDirectory%/htdocs/accountancy/class - %currentWorkingDirectory%/htdocs/adherents/class From fd5048ef73ebbbbb5ee0bac7d8de9e6672c326b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 15 May 2019 19:12:33 +0200 Subject: [PATCH 0426/1036] Fix reported by phpstan --- htdocs/product/fournisseurs.php | 2 +- htdocs/product/price.php | 4 ++-- htdocs/societe/price.php | 6 +++--- phpstan.neon | 8 ++++++++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 67574b56318..6d43e4d4a3f 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -778,7 +778,7 @@ SCRIPT; $num = count($product_fourn_list); if (($num + ($offset * $limit)) < $nbtotalofrecords) $num++; - print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVEUR ['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit, 1); + print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVER ['PHP_SELF'], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit, 1); // Suppliers list title print '
'; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 4b753e71838..f6efc0296b1 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1851,7 +1851,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) $backbutton='' . $langs->trans("Back") . ''; - print_barre_liste($title, $page, $_SERVEUR['PHP_SELF'], $option, $sortfield, $sortorder, $backbutton, count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); + print_barre_liste($title, $page, $_SERVER['PHP_SELF'], $option, $sortfield, $sortorder, $backbutton, count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); if (count($prodcustprice->lines) > 0) { @@ -1973,7 +1973,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) $option = '&search_soc=' . $search_soc . '&id=' . $object->id; - print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); + print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVER ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, 'title_accountancy.png'); print ''; print ''; diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php index 11930b3e009..76824ca0140 100644 --- a/htdocs/societe/price.php +++ b/htdocs/societe/price.php @@ -428,7 +428,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { $option = '&socid=' . GETPOST('socid', 'int') . '&prodid=' . GETPOST('prodid', 'int'); - print_barre_liste($langs->trans('PriceByCustomerLog'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); + print_barre_liste($langs->trans('PriceByCustomerLog'), $page, $_SERVER ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); if (count($prodcustprice->lines) > 0) { @@ -519,7 +519,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print ''."\n"; - print_barre_liste($langs->trans('PriceForEachProduct'), $page, $_SERVEUR['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, ''); + print_barre_liste($langs->trans('PriceForEachProduct'), $page, $_SERVER['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords, ''); print ''; print ''; @@ -603,7 +603,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { { $colspan=9; if ($user->rights->produit->supprimer || $user->rights->service->supprimer) $colspan+=1; - print '' . $langs->trans('None') . ''; + print '' . $langs->trans('None') . ''; } print ""; diff --git a/phpstan.neon b/phpstan.neon index aa7d4fbacc2..34dd50fb4bc 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,7 +1,9 @@ parameters: bootstrap: %currentWorkingDirectory%/build/phpstan/bootstrap.php excludes_analyse: + - %currentWorkingDirectory%/htdocs/includes/restler/framework/Luracast/Restler/AutoLoader.php - %currentWorkingDirectory%/htdocs/includes/* + - %currentWorkingDirectory%/htdocs/*/class/api_* autoload_directories: - %currentWorkingDirectory%/htdocs/accountancy/class - %currentWorkingDirectory%/htdocs/adherents/class @@ -16,10 +18,16 @@ parameters: - %currentWorkingDirectory%/htdocs/comm/propal/class - %currentWorkingDirectory%/htdocs/commande/class - %currentWorkingDirectory%/htdocs/compta/bank/class + - %currentWorkingDirectory%/htdocs/compta/cashcontrol/class + - %currentWorkingDirectory%/htdocs/compta/deplacement/class + - %currentWorkingDirectory%/htdocs/compta/facture/class + - %currentWorkingDirectory%/htdocs/compta/localtax/class + - %currentWorkingDirectory%/htdocs/compta/paiement/class - %currentWorkingDirectory%/htdocs/conf - %currentWorkingDirectory%/htdocs/contact/class - %currentWorkingDirectory%/htdocs/contrat/class - %currentWorkingDirectory%/htdocs/core/class + - %currentWorkingDirectory%/htdocs/product/class - %currentWorkingDirectory%/htdocs/societe/class - %currentWorkingDirectory%/htdocs/user/class autoload_files: [] From bdb467b17a9516042628a1b2fcb659b251cbe755 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 09:32:06 +0200 Subject: [PATCH 0427/1036] fix typo --- htdocs/modulebuilder/template/myobject_card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index 44da340674a..f4f4e8c34e5 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -346,7 +346,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''."\n"; // Common attributes - //$keyforbreak='fieldkeytoswithonsecondcolumn'; + //$keyforbreak='fieldkeytoswitchonsecondcolumn'; include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php'; // Other attributes From 2d0b3b7b23d2f75fec640b561501557c04f7993b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 12:25:14 +0200 Subject: [PATCH 0428/1036] Fix dol_sort_array for objects --- htdocs/core/lib/functions.lib.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 5ed1802f202..9b8232bb188 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -6585,7 +6585,7 @@ function dol_htmloutput_errors($mesgstring = '', $mesgarray = array(), $keepembe * or descending output and uses optionally natural case insensitive sorting (which * can be optionally case sensitive as well). * - * @param array $array Array to sort (array of array('key','otherkey1','otherkey2'...)) + * @param array $array Array to sort (array of array('key1'=>val1,'key2'=>val2,'key3'...) or array of objects) * @param string $index Key in array to use for sorting criteria * @param int $order Sort order ('asc' or 'desc') * @param int $natsort 1=use "natural" sort (natsort), 0=use "standard" sort (asort) @@ -6604,7 +6604,17 @@ function dol_sort_array(&$array, $index, $order = 'asc', $natsort = 0, $case_sen if ($sizearray>0) { $temp = array(); - foreach(array_keys($array) as $key) $temp[$key]=$array[$key][$index]; + foreach(array_keys($array) as $key) + { + if (is_object($array[$key])) + { + $temp[$key]=$array[$key]->$index; + } + else + { + $temp[$key]=$array[$key][$index]; + } + } if (! $natsort) { ($order=='asc') ? asort($temp) : arsort($temp); From ac1bab171188257371c55008f45463599b2b9f44 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 12:28:57 +0200 Subject: [PATCH 0429/1036] Fix sanitize params --- htdocs/contrat/list.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index cd833f07894..32c67fe7490 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -48,17 +48,17 @@ $contextpage= GETPOST('contextpage', 'aZ')?GETPOST('contextpage', 'aZ'):'contrac $search_name=GETPOST('search_name', 'alpha'); $search_email=GETPOST('search_email', 'alpha'); -$search_town=GETPOST('search_town','alpha'); -$search_zip=GETPOST('search_zip','alpha'); -$search_state=trim(GETPOST("search_state")); +$search_town=GETPOST('search_town', 'alpha'); +$search_zip=GETPOST('search_zip', 'alpha'); +$search_state=trim(GETPOST("search_state", 'alpha')); $search_country=GETPOST("search_country", 'int'); $search_type_thirdparty=GETPOST("search_type_thirdparty", 'int'); -$search_contract=GETPOST('search_contract'); +$search_contract=GETPOST('search_contract', 'alpha'); $search_ref_customer=GETPOST('search_ref_customer', 'alpha'); $search_ref_supplier=GETPOST('search_ref_supplier', 'alpha'); $sall=trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); -$search_status=GETPOST('search_status'); -$socid=GETPOST('socid'); +$search_status=GETPOST('search_status', 'alpha'); +$socid=GETPOST('socid', 'int'); $search_user=GETPOST('search_user', 'int'); $search_sale=GETPOST('search_sale', 'int'); $search_product_category=GETPOST('search_product_category', 'int'); From 399ffb2dcccefa6f7986806b27eb560275d3b4fe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 14:38:01 +0200 Subject: [PATCH 0430/1036] Fix phpcs --- build/phpstan/bootstrap.php | 3 +-- .../email_expire_services_to_customers.php | 23 +++++++------------ ...ail_expire_services_to_representatives.php | 23 +++++++------------ scripts/cron/cron_run_jobs.php | 8 ++----- .../email_unpaid_invoices_to_customers.php | 20 ++++++---------- ...ail_unpaid_invoices_to_representatives.php | 20 ++++++---------- .../members/sync_members_ldap2dolibarr.php | 6 ++--- .../sync_members_types_ldap2dolibarr.php | 6 ++--- scripts/product/migrate_picture_path.php | 5 ++-- scripts/user/sync_groups_ldap2dolibarr.php | 6 ++--- scripts/user/sync_users_ldap2dolibarr.php | 6 ++--- 11 files changed, 47 insertions(+), 79 deletions(-) diff --git a/build/phpstan/bootstrap.php b/build/phpstan/bootstrap.php index 7f232860a2b..e567b609a2f 100644 --- a/build/phpstan/bootstrap.php +++ b/build/phpstan/bootstrap.php @@ -9,7 +9,6 @@ define('DOL_DATA_ROOT', __DIR__ . '/../../documents'); define('DOL_URL_ROOT', '/'); // Load the main.inc.php file to have finctions llx_Header and llx_Footer defined -if (! defined("NOLOGIN")) define("NOLOGIN",'1'); +if (! defined("NOLOGIN")) define("NOLOGIN", '1'); global $conf, $langs, $user, $db; include_once __DIR__ . '/../../htdocs/main.inc.php'; - diff --git a/scripts/contracts/email_expire_services_to_customers.php b/scripts/contracts/email_expire_services_to_customers.php index 041f9dd0b1c..3201cb66d89 100755 --- a/scripts/contracts/email_expire_services_to_customers.php +++ b/scripts/contracts/email_expire_services_to_customers.php @@ -209,21 +209,14 @@ if ($resql) { /** * Send email * - * @param string $mode - * Mode (test | confirm) - * @param string $oldemail - * Target email - * @param string $message - * Message to send - * @param string $total - * Total amount of unpayed invoices - * @param string $userlang - * Code lang to use for email output. - * @param string $oldtarget - * Target name - * @param int $duration_value - * duration value - * @return int <0 if KO, >0 if OK + * @param string $mode Mode (test | confirm) + * @param string $oldemail Target email + * @param string $message Message to send + * @param string $total Total amount of unpayed invoices + * @param string $userlang Code lang to use for email output. + * @param string $oldtarget Target name + * @param int $duration_value duration value + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldtarget, $duration_value) { diff --git a/scripts/contracts/email_expire_services_to_representatives.php b/scripts/contracts/email_expire_services_to_representatives.php index be63d4804f9..669d7f8132f 100755 --- a/scripts/contracts/email_expire_services_to_representatives.php +++ b/scripts/contracts/email_expire_services_to_representatives.php @@ -168,21 +168,14 @@ if ($resql) { /** * Send email * - * @param string $mode - * Mode (test | confirm) - * @param string $oldemail - * Old email - * @param string $message - * Message to send - * @param string $total - * Total amount of unpayed invoices - * @param string $userlang - * Code lang to use for email output. - * @param string $oldsalerepresentative - * Old sale representative - * @param int $duration_value - * duration value - * @return int <0 if KO, >0 if OK + * @param string $mode Mode (test | confirm) + * @param string $oldemail Old email + * @param string $message Message to send + * @param string $total Total amount of unpayed invoices + * @param string $userlang Code lang to use for email output. + * @param string $oldsalerepresentative Old sale representative + * @param int $duration_value Duration value + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldsalerepresentative, $duration_value) { diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index 54559e28c19..0f4f1fecde7 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -229,16 +229,12 @@ exit(0); /** * script cron usage * - * @param string $path - * path - * @param string $script_file - * filename + * @param string $path Path + * @param string $script_file Filename * @return void */ function usage($path, $script_file) { - global $conf; - print "Usage: " . $script_file . " securitykey userlogin|'firstadmin' [cronjobid]\n"; print "The script return 0 when everything worked successfully.\n"; print "\n"; diff --git a/scripts/invoices/email_unpaid_invoices_to_customers.php b/scripts/invoices/email_unpaid_invoices_to_customers.php index e64c9e10edb..3df09258ec1 100755 --- a/scripts/invoices/email_unpaid_invoices_to_customers.php +++ b/scripts/invoices/email_unpaid_invoices_to_customers.php @@ -207,19 +207,13 @@ if ($resql) { /** * Send email * - * @param string $mode - * Mode (test | confirm) - * @param string $oldemail - * Target email - * @param string $message - * Message to send - * @param string $total - * Total amount of unpayed invoices - * @param string $userlang - * Code lang to use for email output. - * @param string $oldtarget - * Target name - * @return int <0 if KO, >0 if OK + * @param string $mode Mode (test | confirm) + * @param string $oldemail Target email + * @param string $message Message to send + * @param string $total Total amount of unpayed invoices + * @param string $userlang Code lang to use for email output. + * @param string $oldtarget Target name + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldtarget) { diff --git a/scripts/invoices/email_unpaid_invoices_to_representatives.php b/scripts/invoices/email_unpaid_invoices_to_representatives.php index bf4264d57ba..396c6d6738a 100755 --- a/scripts/invoices/email_unpaid_invoices_to_representatives.php +++ b/scripts/invoices/email_unpaid_invoices_to_representatives.php @@ -172,19 +172,13 @@ if ($resql) { /** * Send email * - * @param string $mode - * Mode (test | confirm) - * @param string $oldemail - * Old email - * @param string $message - * Message to send - * @param string $total - * Total amount of unpayed invoices - * @param string $userlang - * Code lang to use for email output. - * @param string $oldsalerepresentative - * Old sale representative - * @return int <0 if KO, >0 if OK + * @param string $mode Mode (test | confirm) + * @param string $oldemail Old email + * @param string $message Message to send + * @param string $total Total amount of unpayed invoices + * @param string $userlang Code lang to use for email output. + * @param string $oldsalerepresentative Old sale representative + * @return int <0 if KO, >0 if OK */ function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldsalerepresentative) { diff --git a/scripts/members/sync_members_ldap2dolibarr.php b/scripts/members/sync_members_ldap2dolibarr.php index 3a7aee9c5df..f1e58dd3554 100755 --- a/scripts/members/sync_members_ldap2dolibarr.php +++ b/scripts/members/sync_members_ldap2dolibarr.php @@ -272,12 +272,12 @@ if ($result >= 0) { exit($error); + /** * Function to say if a value is empty or not * - * @param string $element - * Value to test - * @return boolean True of false + * @param string $element Value to test + * @return boolean True of false */ function dolValidElement($element) { diff --git a/scripts/members/sync_members_types_ldap2dolibarr.php b/scripts/members/sync_members_types_ldap2dolibarr.php index fe9a07e14da..9dcc47e45af 100755 --- a/scripts/members/sync_members_types_ldap2dolibarr.php +++ b/scripts/members/sync_members_types_ldap2dolibarr.php @@ -181,12 +181,12 @@ if ($result >= 0) { exit($error); + /** * Function to say if a value is empty or not * - * @param string $element - * Value to test - * @return boolean True of false + * @param string $element Value to test + * @return boolean True of false */ function dolValidElementType($element) { diff --git a/scripts/product/migrate_picture_path.php b/scripts/product/migrate_picture_path.php index 7abbcc59cc5..8d10ce52840 100755 --- a/scripts/product/migrate_picture_path.php +++ b/scripts/product/migrate_picture_path.php @@ -86,9 +86,8 @@ exit($error); /** * Migrate file from old path to new one for product $product * - * @param Product $product - * Object product - * @return void + * @param Product $product Object product + * @return void */ function migrate_product_photospath($product) { diff --git a/scripts/user/sync_groups_ldap2dolibarr.php b/scripts/user/sync_groups_ldap2dolibarr.php index 393a866de5e..93378242c9d 100755 --- a/scripts/user/sync_groups_ldap2dolibarr.php +++ b/scripts/user/sync_groups_ldap2dolibarr.php @@ -230,12 +230,12 @@ if ($result >= 0) { exit($error); + /** * Function to say if a value is empty or not * - * @param string $element - * Value to test - * @return boolean True of false + * @param string $element Value to test + * @return boolean True of false */ function dolValidElement($element) { diff --git a/scripts/user/sync_users_ldap2dolibarr.php b/scripts/user/sync_users_ldap2dolibarr.php index 75925b109bf..dfc8fb737ba 100755 --- a/scripts/user/sync_users_ldap2dolibarr.php +++ b/scripts/user/sync_users_ldap2dolibarr.php @@ -273,12 +273,12 @@ if ($result >= 0) { exit($error); + /** * Function to say if a value is empty or not * - * @param string $element - * Value to test - * @return boolean True of false + * @param string $element Value to test + * @return boolean True of false */ function dolValidElement($element) { From d1e5c525aa031a45127e3602763b54fbe0b80779 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 14:47:42 +0200 Subject: [PATCH 0431/1036] Fix warning --- htdocs/core/class/dolgraph.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index d947d7c129b..d70a63293c5 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -91,7 +91,7 @@ class DolGraph public function __construct($library = 'jflot') { global $conf; - global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet; + global $theme_bordercolor, $theme_datacolor, $theme_bgcolor; // To use old feature if ($library == 'artichow') @@ -883,7 +883,6 @@ class DolGraph private function draw_jflot($file, $fileurl) { // phpcs:enable - global $artichow_defaultfont; dol_syslog(get_class($this)."::draw_jflot this->type=".join(',', $this->type)." this->MaxValue=".$this->MaxValue); From c24c81692dd2ca9b048858d5f7176b0a7db0d286 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 21:13:57 +0200 Subject: [PATCH 0432/1036] Update modAccounting.class.php --- htdocs/core/modules/modAccounting.class.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/htdocs/core/modules/modAccounting.class.php b/htdocs/core/modules/modAccounting.class.php index a09ef981363..66b2a511bf7 100644 --- a/htdocs/core/modules/modAccounting.class.php +++ b/htdocs/core/modules/modAccounting.class.php @@ -242,13 +242,12 @@ class modAccounting extends DolibarrModules $this->export_label[$r]='Chartofaccounts'; $this->export_icon[$r]='Accounting'; $this->export_permission[$r]=array(array("accounting","chartofaccount")); - $this->export_fields_array[$r]=array('ac.rowid'=>'ChartofaccountsId','ac.pcg_version'=>'Chartofaccounts','aa.rowid'=>'Id','aa.account_number'=>"AccountAccounting",'aa.label'=>"Label",'aa.account_parent'=>"Accountparent","cac.code"=>"AccountingCategory",'aa.pcg_type'=>"Pcgtype",'aa.pcg_subtype'=>'Pcgsubtype','aa.active'=>'Status'); - $this->export_TypeFields_array[$r]=array('ac.rowid'=>'List:accounting_system:pcg_version','aa.account_number'=>"Text",'aa.label'=>"Text",'aa.account_parent'=>"Text",'cac.code'=>"Text",'aa.pcg_type'=>'Text','aa.pcg_subtype'=>'Text','aa.active'=>'Status'); - $this->export_entities_array[$r]=array('ac.rowid'=>"Accounting",'ac.pcg_version'=>"Accounting",'aa.rowid'=>'Accounting','aa.account_number'=>"Accounting",'aa.label'=>"Accounting",'aa.accountparent'=>"Accounting",'cac.code'=>"Accounting",'aa.pcg_type'=>"Accounting",'aa.pcgsubtype'=>"Accounting",'aa_active'=>"Accounting"); + $this->export_fields_array[$r]=array('ac.rowid'=>'ChartofaccountsId','ac.pcg_version'=>'Chartofaccounts','aa.rowid'=>'Id','aa.account_number'=>"AccountAccounting",'aa.label'=>"Label",'aa.account_parent'=>"Accountparent",'aa.pcg_type'=>"Pcgtype",'aa.pcg_subtype'=>'Pcgsubtype','aa.active'=>'Status'); + $this->export_TypeFields_array[$r]=array('ac.rowid'=>'List:accounting_system:pcg_version','aa.account_number'=>"Text",'aa.label'=>"Text",'aa.account_parent'=>"Text",'aa.pcg_type'=>'Text','aa.pcg_subtype'=>'Text','aa.active'=>'Status'); + $this->export_entities_array[$r]=array('ac.rowid'=>"Accounting",'ac.pcg_version'=>"Accounting",'aa.rowid'=>'Accounting','aa.account_number'=>"Accounting",'aa.label'=>"Accounting",'aa.accountparent'=>"Accounting",'aa.pcg_type'=>"Accounting",'aa.pcgsubtype'=>"Accounting",'aa_active'=>"Accounting"); $this->export_sql_start[$r]='SELECT DISTINCT '; $this->export_sql_end[$r] =' FROM '.MAIN_DB_PREFIX.'accounting_account as aa'; - $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'c_accounting_category as cac ON cac.rowid = aa.fk_accounting_category'; $this->export_sql_end[$r] .=' ,'.MAIN_DB_PREFIX.'accounting_system as ac'; $this->export_sql_end[$r] .=' WHERE ac.pcg_version = aa.fk_pcg_version AND aa.entity IN ('.getEntity('accounting').') '; From fa5c5a33361c8acb0f94feb70bf9a8519d187675 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 21:41:14 +0200 Subject: [PATCH 0433/1036] Update Stripe API to 6.35 --- COPYRIGHT | 2 +- htdocs/includes/stripe/CHANGELOG.md | 12 + htdocs/includes/stripe/VERSION | 2 +- htdocs/includes/stripe/init.php | 1 + htdocs/includes/stripe/lib/Account.php | 76 ++++- .../stripe/lib/ApiOperations/Create.php | 2 +- .../stripe/lib/ApiOperations/Delete.php | 2 +- .../stripe/lib/ApiOperations/Update.php | 4 +- htdocs/includes/stripe/lib/Capability.php | 83 ++++++ htdocs/includes/stripe/lib/Event.php | 261 +++++++++--------- htdocs/includes/stripe/lib/Stripe.php | 2 +- htdocs/includes/stripe/lib/Util/Util.php | 1 + 12 files changed, 300 insertions(+), 148 deletions(-) create mode 100644 htdocs/includes/stripe/lib/Capability.php diff --git a/COPYRIGHT b/COPYRIGHT index 7cebde7c362..b70640175fc 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -35,7 +35,7 @@ Restler 3.0.0RC6 LGPL-3+ Yes TCPDF 6.2.25 LGPL-3+ Yes PDF generation TCPDI 1.0.0 LGPL-3+ / Apache 2.0 Yes FPDI replacement Swift Mailer 5.4.2-DEV MIT license Yes Comprehensive mailing tools for PHP -Stripe 4.7.0 MIT licence Yes Library for Stripe module +Stripe 6.34.5 MIT licence Yes Library for Stripe module JS libraries: jQuery 3.3.1 MIT License Yes JS library diff --git a/htdocs/includes/stripe/CHANGELOG.md b/htdocs/includes/stripe/CHANGELOG.md index 727ac3d1b43..26b449ff039 100644 --- a/htdocs/includes/stripe/CHANGELOG.md +++ b/htdocs/includes/stripe/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 6.35.0 - 2019-05-14 +* [#651](https://github.com/stripe/stripe-php/pull/651) Add support for the Capability resource and APIs + +## 6.34.6 - 2019-05-13 +* [#654](https://github.com/stripe/stripe-php/pull/654) Fix typo in definition of `Event::PAYMENT_METHOD_ATTACHED` constant + +## 6.34.5 - 2019-05-06 +* [#647](https://github.com/stripe/stripe-php/pull/647) Set the return type to static for more operations + +## 6.34.4 - 2019-05-06 +* [#650](https://github.com/stripe/stripe-php/pull/650) Add missing constants for Event types + ## 6.34.3 - 2019-05-01 * [#644](https://github.com/stripe/stripe-php/pull/644) Update return type to `static` to improve static analysis * [#645](https://github.com/stripe/stripe-php/pull/645) Fix constant for `payment_intent.payment_failed` diff --git a/htdocs/includes/stripe/VERSION b/htdocs/includes/stripe/VERSION index a547a9b46f8..b22907d080c 100644 --- a/htdocs/includes/stripe/VERSION +++ b/htdocs/includes/stripe/VERSION @@ -1 +1 @@ -6.34.3 +6.35.0 diff --git a/htdocs/includes/stripe/init.php b/htdocs/includes/stripe/init.php index 5ccf3327c0b..2f6ccfbf67b 100644 --- a/htdocs/includes/stripe/init.php +++ b/htdocs/includes/stripe/init.php @@ -67,6 +67,7 @@ require(dirname(__FILE__) . '/lib/BalanceTransaction.php'); require(dirname(__FILE__) . '/lib/BankAccount.php'); require(dirname(__FILE__) . '/lib/BitcoinReceiver.php'); require(dirname(__FILE__) . '/lib/BitcoinTransaction.php'); +require(dirname(__FILE__) . '/lib/Capability.php'); require(dirname(__FILE__) . '/lib/Card.php'); require(dirname(__FILE__) . '/lib/Charge.php'); require(dirname(__FILE__) . '/lib/Checkout/Session.php'); diff --git a/htdocs/includes/stripe/lib/Account.php b/htdocs/includes/stripe/lib/Account.php index 1c10fa2f3a1..0e84951dcd0 100644 --- a/htdocs/includes/stripe/lib/Account.php +++ b/htdocs/includes/stripe/lib/Account.php @@ -85,6 +85,7 @@ class Account extends ApiResource return $savedNestedResources; } + const PATH_CAPABILITIES = '/capabilities'; const PATH_EXTERNAL_ACCOUNTS = '/external_accounts'; const PATH_LOGIN_LINKS = '/login_links'; const PATH_PERSONS = '/persons'; @@ -128,21 +129,6 @@ class Account extends ApiResource return $this; } - /** - * @param array|null $params - * @param array|string|null $options - * - * @return Collection The list of persons. - */ - public function persons($params = null, $options = null) - { - $url = $this->instanceUrl() . '/persons'; - list($response, $opts) = $this->_request('get', $url, $params, $options); - $obj = Util\Util::convertToStripeObject($response, $opts); - $obj->setLastResponse($response); - return $obj; - } - /** * @param array|null $clientId * @param array|string|null $opts @@ -158,6 +144,51 @@ class Account extends ApiResource return OAuth::deauthorize($params, $opts); } + /* + * Capabilities methods + * We can not add the capabilities() method today as the Account object already has a + * capabilities property which is a hash and not the sub-list of capabilities. + */ + + + /** + * @param string|null $id The ID of the account to which the capability belongs. + * @param string|null $capabilityId The ID of the capability to retrieve. + * @param array|null $params + * @param array|string|null $opts + * + * @return Capability + */ + public static function retrieveCapability($id, $capabilityId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); + } + + /** + * @param string|null $id The ID of the account to which the capability belongs. + * @param string|null $capabilityId The ID of the capability to update. + * @param array|null $params + * @param array|string|null $opts + * + * @return Capability + */ + public static function updateCapability($id, $capabilityId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); + } + + /** + * @param string|null $id The ID of the account on which to retrieve the capabilities. + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection The list of capabilities. + */ + public static function allCapabilities($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_CAPABILITIES, $params, $opts); + } + /** * @param string|null $id The ID of the account on which to create the external account. * @param array|null $params @@ -233,6 +264,21 @@ class Account extends ApiResource return self::_createNestedResource($id, static::PATH_LOGIN_LINKS, $params, $opts); } + /** + * @param array|null $params + * @param array|string|null $options + * + * @return Collection The list of persons. + */ + public function persons($params = null, $options = null) + { + $url = $this->instanceUrl() . '/persons'; + list($response, $opts) = $this->_request('get', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + return $obj; + } + /** * @param string|null $id The ID of the account on which to create the person. * @param array|null $params diff --git a/htdocs/includes/stripe/lib/ApiOperations/Create.php b/htdocs/includes/stripe/lib/ApiOperations/Create.php index 0fb341d029b..4ec66703f56 100644 --- a/htdocs/includes/stripe/lib/ApiOperations/Create.php +++ b/htdocs/includes/stripe/lib/ApiOperations/Create.php @@ -13,7 +13,7 @@ trait Create * @param array|null $params * @param array|string|null $options * - * @return \Stripe\ApiResource The created resource. + * @return static The created resource. */ public static function create($params = null, $options = null) { diff --git a/htdocs/includes/stripe/lib/ApiOperations/Delete.php b/htdocs/includes/stripe/lib/ApiOperations/Delete.php index 7df6797919a..9581765b8af 100644 --- a/htdocs/includes/stripe/lib/ApiOperations/Delete.php +++ b/htdocs/includes/stripe/lib/ApiOperations/Delete.php @@ -13,7 +13,7 @@ trait Delete * @param array|null $params * @param array|string|null $opts * - * @return \Stripe\ApiResource The deleted resource. + * @return static The deleted resource. */ public function delete($params = null, $opts = null) { diff --git a/htdocs/includes/stripe/lib/ApiOperations/Update.php b/htdocs/includes/stripe/lib/ApiOperations/Update.php index 0683e77af1a..e17db280faa 100644 --- a/htdocs/includes/stripe/lib/ApiOperations/Update.php +++ b/htdocs/includes/stripe/lib/ApiOperations/Update.php @@ -15,7 +15,7 @@ trait Update * @param array|null $params * @param array|string|null $opts * - * @return \Stripe\ApiResource The updated resource. + * @return static The updated resource. */ public static function update($id, $params = null, $opts = null) { @@ -31,7 +31,7 @@ trait Update /** * @param array|string|null $opts * - * @return \Stripe\ApiResource The saved resource. + * @return static The saved resource. */ public function save($opts = null) { diff --git a/htdocs/includes/stripe/lib/Capability.php b/htdocs/includes/stripe/lib/Capability.php new file mode 100644 index 00000000000..78cb0393695 --- /dev/null +++ b/htdocs/includes/stripe/lib/Capability.php @@ -0,0 +1,83 @@ +retrieveCapability('acap_123') instead."; + throw new Error\InvalidRequest($msg, null); + } + + /** + * @param string $_id + * @param array|null $_params + * @param array|string|null $_options + * + * @throws \Stripe\Error\InvalidRequest + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = "Capabilities cannot be accessed without an account ID. " . + "Update a Capability using \$account->updateCapability('acap_123') instead."; + throw new Error\InvalidRequest($msg, null); + } +} diff --git a/htdocs/includes/stripe/lib/Event.php b/htdocs/includes/stripe/lib/Event.php index 90b55c75151..a986c35dfec 100644 --- a/htdocs/includes/stripe/lib/Event.php +++ b/htdocs/includes/stripe/lib/Event.php @@ -27,132 +27,141 @@ class Event extends ApiResource * Possible string representations of event types. * @link https://stripe.com/docs/api#event_types */ - const ACCOUNT_UPDATED = 'account.updated'; - const ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized'; - const ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized'; - const ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created'; - const ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted'; - const ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated'; - const APPLICATION_FEE_CREATED = 'application_fee.created'; - const APPLICATION_FEE_REFUNDED = 'application_fee.refunded'; - const APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated'; - const BALANCE_AVAILABLE = 'balance.available'; - const CHARGE_CAPTURED = 'charge.captured'; - const CHARGE_EXPIRED = 'charge.expired'; - const CHARGE_FAILED = 'charge.failed'; - const CHARGE_PENDING = 'charge.pending'; - const CHARGE_REFUNDED = 'charge.refunded'; - const CHARGE_SUCCEEDED = 'charge.succeeded'; - const CHARGE_UPDATED = 'charge.updated'; - const CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed'; - const CHARGE_DISPUTE_CREATED = 'charge.dispute.created'; - const CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated'; - const CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn'; - const CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated'; - const CHARGE_REFUND_UPDATED = 'charge.refund.updated'; - const COUPON_CREATED = 'coupon.created'; - const COUPON_DELETED = 'coupon.deleted'; - const COUPON_UPDATED = 'coupon.updated'; - const CREDIT_NOTE_CREATED = 'credit_note.created'; - const CREDIT_NOTE_UPDATED = 'credit_note.updated'; - const CREDIT_NOTE_VOIDED = 'credit_note.voided'; - const CUSTOMER_CREATED = 'customer.created'; - const CUSTOMER_DELETED = 'customer.deleted'; - const CUSTOMER_UPDATED = 'customer.updated'; - const CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created'; - const CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted'; - const CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated'; - const CUSTOMER_SOURCE_CREATED = 'customer.source.created'; - const CUSTOMER_SOURCE_DELETED = 'customer.source.deleted'; - const CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring'; - const CUSTOMER_SOURCE_UPDATED = 'customer.source.updated'; - const CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created'; - const CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted'; - const CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end'; - const CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated'; - const FILE_CREATED = 'file.created'; - const INVOICE_CREATED = 'invoice.created'; - const INVOICE_DELETED = 'invoice.deleted'; - const INVOICE_FINALIZED = 'invoice.finalized'; - const INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible'; - const INVOICE_PAYMENT_FAILED = 'invoice.payment_failed'; - const INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded'; - const INVOICE_SENT = 'invoice.sent'; - const INVOICE_UPCOMING = 'invoice.upcoming'; - const INVOICE_UPDATED = 'invoice.updated'; - const INVOICE_VOIDED = 'invoice.voided'; - const INVOICEITEM_CREATED = 'invoiceitem.created'; - const INVOICEITEM_DELETED = 'invoiceitem.deleted'; - const INVOICEITEM_UPDATED = 'invoiceitem.updated'; - const ISSUER_FRAUD_RECORD_CREATED = 'issuer_fraud_record.created'; - const ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created'; - const ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated'; - const ISSUING_CARD_CREATED = 'issuing_card.created'; - const ISSUING_CARD_UPDATED = 'issuing_card.updated'; - const ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created'; - const ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated'; - const ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created'; - const ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated'; - const ORDER_CREATED = 'order.created'; - const ORDER_PAYMENT_FAILED = 'order.payment_failed'; - const ORDER_PAYMENT_SUCCEEDED = 'order.payment_succeeded'; - const ORDER_UPDATED = 'order.updated'; - const ORDER_RETURN_CREATED = 'order_return.created'; - const PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated'; - const PAYMENT_INTENT_CREATED = 'payment_intent.created'; - const PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed'; - const PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded'; - const PAYOUT_CANCELED = 'payout.canceled'; - const PAYOUT_CREATED = 'payout.created'; - const PAYOUT_FAILED = 'payout.failed'; - const PAYOUT_PAID = 'payout.paid'; - const PAYOUT_UPDATED = 'payout.updated'; - const PERSON_CREATED = 'person.created'; - const PERSON_DELETED = 'person.deleted'; - const PERSON_UPDATED = 'person.updated'; - const PING = 'ping'; - const PLAN_CREATED = 'plan.created'; - const PLAN_DELETED = 'plan.deleted'; - const PLAN_UPDATED = 'plan.updated'; - const PRODUCT_CREATED = 'product.created'; - const PRODUCT_DELETED = 'product.deleted'; - const PRODUCT_UPDATED = 'product.updated'; - const RECIPIENT_CREATED = 'recipient.created'; - const RECIPIENT_DELETED = 'recipient.deleted'; - const RECIPIENT_UPDATED = 'recipient.updated'; - const REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed'; - const REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded'; - const REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated'; - const REVIEW_CLOSED = 'review.closed'; - const REVIEW_OPENED = 'review.opened'; - const SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created'; - const SKU_CREATED = 'sku.created'; - const SKU_DELETED = 'sku.deleted'; - const SKU_UPDATED = 'sku.updated'; - const SOURCE_CANCELED = 'source.canceled'; - const SOURCE_CHARGEABLE = 'source.chargeable'; - const SOURCE_FAILED = 'source.failed'; - const SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification'; - const SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required'; - const SOURCE_TRANSACTION_CREATED = 'source.transaction.created'; - const SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated'; - const SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted'; - const SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled'; - const SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed'; - const SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created'; - const SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring'; - const SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released'; - const SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated'; - const TAX_RATE_CREATED = 'tax_rate.created'; - const TAX_RATE_UPDATED = 'tax_rate.updated'; - const TOPUP_CANCELED = 'topup.canceled'; - const TOPUP_CREATED = 'topup.created'; - const TOPUP_FAILED = 'topup.failed'; - const TOPUP_REVERSED = 'topup.reversed'; - const TOPUP_SUCCEEDED = 'topup.succeeded'; - const TRANSFER_CREATED = 'transfer.created'; - const TRANSFER_REVERSED = 'transfer.reversed'; - const TRANSFER_UPDATED = 'transfer.updated'; + const ACCOUNT_UPDATED = 'account.updated'; + const ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized'; + const ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized'; + const ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created'; + const ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted'; + const ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated'; + const APPLICATION_FEE_CREATED = 'application_fee.created'; + const APPLICATION_FEE_REFUNDED = 'application_fee.refunded'; + const APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated'; + const BALANCE_AVAILABLE = 'balance.available'; + const CHARGE_CAPTURED = 'charge.captured'; + const CHARGE_EXPIRED = 'charge.expired'; + const CHARGE_FAILED = 'charge.failed'; + const CHARGE_PENDING = 'charge.pending'; + const CHARGE_REFUNDED = 'charge.refunded'; + const CHARGE_SUCCEEDED = 'charge.succeeded'; + const CHARGE_UPDATED = 'charge.updated'; + const CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed'; + const CHARGE_DISPUTE_CREATED = 'charge.dispute.created'; + const CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated'; + const CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn'; + const CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated'; + const CHARGE_REFUND_UPDATED = 'charge.refund.updated'; + const CHECKOUT_SESSION_COMPLETED = 'checkout.session.completed'; + const COUPON_CREATED = 'coupon.created'; + const COUPON_DELETED = 'coupon.deleted'; + const COUPON_UPDATED = 'coupon.updated'; + const CREDIT_NOTE_CREATED = 'credit_note.created'; + const CREDIT_NOTE_UPDATED = 'credit_note.updated'; + const CREDIT_NOTE_VOIDED = 'credit_note.voided'; + const CUSTOMER_CREATED = 'customer.created'; + const CUSTOMER_DELETED = 'customer.deleted'; + const CUSTOMER_UPDATED = 'customer.updated'; + const CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created'; + const CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted'; + const CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated'; + const CUSTOMER_SOURCE_CREATED = 'customer.source.created'; + const CUSTOMER_SOURCE_DELETED = 'customer.source.deleted'; + const CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring'; + const CUSTOMER_SOURCE_UPDATED = 'customer.source.updated'; + const CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created'; + const CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted'; + const CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end'; + const CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated'; + const FILE_CREATED = 'file.created'; + const INVOICE_CREATED = 'invoice.created'; + const INVOICE_DELETED = 'invoice.deleted'; + const INVOICE_FINALIZED = 'invoice.finalized'; + const INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible'; + const INVOICE_PAYMENT_ACTION_REQUIRED = 'invoice.payment_action_required'; + const INVOICE_PAYMENT_FAILED = 'invoice.payment_failed'; + const INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded'; + const INVOICE_SENT = 'invoice.sent'; + const INVOICE_UPCOMING = 'invoice.upcoming'; + const INVOICE_UPDATED = 'invoice.updated'; + const INVOICE_VOIDED = 'invoice.voided'; + const INVOICEITEM_CREATED = 'invoiceitem.created'; + const INVOICEITEM_DELETED = 'invoiceitem.deleted'; + const INVOICEITEM_UPDATED = 'invoiceitem.updated'; + const ISSUER_FRAUD_RECORD_CREATED = 'issuer_fraud_record.created'; + const ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created'; + const ISSUING_AUTHORIZATION_REQUEST = 'issuing_authorization.request'; + const ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated'; + const ISSUING_CARD_CREATED = 'issuing_card.created'; + const ISSUING_CARD_UPDATED = 'issuing_card.updated'; + const ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created'; + const ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated'; + const ISSUING_DISPUTE_CREATED = 'issuing_dispute.created'; + const ISSUING_DISPUTE_UPDATED = 'issuing_dispute.updated'; + const ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created'; + const ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated'; + const ORDER_CREATED = 'order.created'; + const ORDER_PAYMENT_FAILED = 'order.payment_failed'; + const ORDER_PAYMENT_SUCCEEDED = 'order.payment_succeeded'; + const ORDER_UPDATED = 'order.updated'; + const ORDER_RETURN_CREATED = 'order_return.created'; + const PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated'; + const PAYMENT_INTENT_CREATED = 'payment_intent.created'; + const PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed'; + const PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded'; + const PAYMENT_METHOD_ATTACHED = 'payment_method.attached'; + const PAYMENT_METHOD_CARD_AUTOMATICALLY_UPDATED = 'payment_method.card_automatically_updated'; + const PAYMENT_METHOD_DETACHED = 'payment_method.detached'; + const PAYMENT_METHOD_UPDATED = 'payment_method.updated'; + const PAYOUT_CANCELED = 'payout.canceled'; + const PAYOUT_CREATED = 'payout.created'; + const PAYOUT_FAILED = 'payout.failed'; + const PAYOUT_PAID = 'payout.paid'; + const PAYOUT_UPDATED = 'payout.updated'; + const PERSON_CREATED = 'person.created'; + const PERSON_DELETED = 'person.deleted'; + const PERSON_UPDATED = 'person.updated'; + const PING = 'ping'; + const PLAN_CREATED = 'plan.created'; + const PLAN_DELETED = 'plan.deleted'; + const PLAN_UPDATED = 'plan.updated'; + const PRODUCT_CREATED = 'product.created'; + const PRODUCT_DELETED = 'product.deleted'; + const PRODUCT_UPDATED = 'product.updated'; + const RECIPIENT_CREATED = 'recipient.created'; + const RECIPIENT_DELETED = 'recipient.deleted'; + const RECIPIENT_UPDATED = 'recipient.updated'; + const REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed'; + const REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded'; + const REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated'; + const REVIEW_CLOSED = 'review.closed'; + const REVIEW_OPENED = 'review.opened'; + const SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created'; + const SKU_CREATED = 'sku.created'; + const SKU_DELETED = 'sku.deleted'; + const SKU_UPDATED = 'sku.updated'; + const SOURCE_CANCELED = 'source.canceled'; + const SOURCE_CHARGEABLE = 'source.chargeable'; + const SOURCE_FAILED = 'source.failed'; + const SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification'; + const SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required'; + const SOURCE_TRANSACTION_CREATED = 'source.transaction.created'; + const SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated'; + const SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted'; + const SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled'; + const SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed'; + const SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created'; + const SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring'; + const SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released'; + const SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated'; + const TAX_RATE_CREATED = 'tax_rate.created'; + const TAX_RATE_UPDATED = 'tax_rate.updated'; + const TOPUP_CANCELED = 'topup.canceled'; + const TOPUP_CREATED = 'topup.created'; + const TOPUP_FAILED = 'topup.failed'; + const TOPUP_REVERSED = 'topup.reversed'; + const TOPUP_SUCCEEDED = 'topup.succeeded'; + const TRANSFER_CREATED = 'transfer.created'; + const TRANSFER_REVERSED = 'transfer.reversed'; + const TRANSFER_UPDATED = 'transfer.updated'; use ApiOperations\All; use ApiOperations\Retrieve; diff --git a/htdocs/includes/stripe/lib/Stripe.php b/htdocs/includes/stripe/lib/Stripe.php index 5411f61437b..027f22fd83c 100644 --- a/htdocs/includes/stripe/lib/Stripe.php +++ b/htdocs/includes/stripe/lib/Stripe.php @@ -55,7 +55,7 @@ class Stripe // @var float Initial delay between retries, in seconds private static $initialNetworkRetryDelay = 0.5; - const VERSION = '6.34.3'; + const VERSION = '6.35.0'; /** * @return string The API key used for requests. diff --git a/htdocs/includes/stripe/lib/Util/Util.php b/htdocs/includes/stripe/lib/Util/Util.php index c9cfa9fcbd2..e21d45dac16 100644 --- a/htdocs/includes/stripe/lib/Util/Util.php +++ b/htdocs/includes/stripe/lib/Util/Util.php @@ -80,6 +80,7 @@ abstract class Util \Stripe\BankAccount::OBJECT_NAME => 'Stripe\\BankAccount', \Stripe\BitcoinReceiver::OBJECT_NAME => 'Stripe\\BitcoinReceiver', \Stripe\BitcoinTransaction::OBJECT_NAME => 'Stripe\\BitcoinTransaction', + \Stripe\Capability::OBJECT_NAME => 'Stripe\\Capability', \Stripe\Card::OBJECT_NAME => 'Stripe\\Card', \Stripe\Charge::OBJECT_NAME => 'Stripe\\Charge', \Stripe\Checkout\Session::OBJECT_NAME => 'Stripe\\Checkout\\Session', From 52c1f42734b6170ba89c049e954939a31bd6570e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 16 May 2019 23:11:49 +0200 Subject: [PATCH 0434/1036] Debug payment with stripe Intent --- htdocs/public/payment/newpayment.php | 15 ++++++++++++--- htdocs/stripe/class/stripe.class.php | 26 +++++++++++++++++++++----- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 83acf5d400e..c8135d8dc36 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -396,8 +396,9 @@ if ($action == 'dopayment') } -// Called when choosing Stripe mode, after clicking the 'dopayment' with the Charge API architecture. -// When using the PaymentItent architecture, we dont need this, the Stripe customer is created when creating PaymentItent when showing payment page. +// Called when choosing Stripe mode. +// When using the Charge API architecture, this code is called after clicking the 'dopayment' with the Charge API architecture. +// When using the PaymentIntent API architecture, the Stripe customer is already created when creating PaymentItent when showing payment page and the payment is already ok. if ($action == 'charge' && ! empty($conf->stripe->enabled)) { $amountstripe = $amount; @@ -426,6 +427,7 @@ if ($action == 'charge' && ! empty($conf->stripe->enabled)) $error = 0; $errormessage = ''; + // When using the Charge API architecture if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) { try { @@ -611,6 +613,7 @@ if ($action == 'charge' && ! empty($conf->stripe->enabled)) } } + // When using the PaymentIntent API architecture if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) { $service = 'StripeTest'; @@ -656,6 +659,12 @@ if ($action == 'charge' && ! empty($conf->stripe->enabled)) setEventMessages($e->getMessage(), null, 'errors'); $action=''; } + else + { + // TODO We can alse record the payment mode into llx_societe_rib with stripe $paymentintent->payment_method + // Note that with other Stripe architecture (using Charge API), the payment mode was not recorded, so it is not mandatory to do it here. + //dol_syslog("Create payment_method for ".$paymentintent->payment_method, LOG_DEBUG, 0, '_stripe'); + } } @@ -2008,7 +2017,7 @@ if (preg_match('/^dopayment/', $action)) billing_details: { name: cardholderName.value , email: '' - thirdparty)) { ?>, phone: 'thirdparty->phone; ?>' + thirdparty) && is_object($object->thirdparty->phone)) { ?>, phone: 'thirdparty->phone; ?>' thirdparty)) { ?>, address: { city: 'thirdparty->town; ?>', country: 'thirdparty->country_code; ?>', diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index ee1c1a67f0a..adfac2cd620 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -239,6 +239,10 @@ class Stripe extends CommonObject /** * Get the Stripe payment intent. Create it with confirm=false + * Warning. If a payment was tried and failed, a payment intent was created. + * But if we change someting on object to pay (amount or other), reusing same payment intent is not allowed. + * Recommanded solution is to recreate a new payment intent each time we need one (old one will be automatically closed after a delay), + * that's why i comment the part of code to retreive a payment intent with object id (never mind if we cumulate payment intent with old that will not be used) * * @param double $amount Amount * @param string $currency_code Currency code @@ -279,7 +283,12 @@ class Stripe extends CommonObject if (is_object($object)) { - $sql = "SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site"; + // Warning. If a payment was tried and failed, a payment intent was created. + // But if we change someting on object to pay (amount or other), reusing same payment intent is not allowed. + // Recommanded solution is to recreate a new payment intent each time we need one (old one will be automatically closed after a delay), + // that's why i comment the part of code to retreive a payment intent with object id (never mind if we cumulate payment intent with old that will not be used) + /* + $sql = "SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site"; $sql.= " FROM " . MAIN_DB_PREFIX . "prelevement_facture_demande as pi"; $sql.= " WHERE pi.fk_facture = " . $object->id; $sql.= " AND pi.sourcetype = '" . $object->element . "'"; @@ -314,7 +323,7 @@ class Stripe extends CommonObject $this->error = $e->getMessage(); } } - } + }*/ } if (empty($paymentintent)) @@ -369,8 +378,8 @@ class Stripe extends CommonObject if (is_object($object)) { $now=dol_now(); - $sql = "INSERT INTO " . MAIN_DB_PREFIX . "prelevement_facture_demande (fk_soc, date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site)"; - $sql .= " VALUES ('".$object->socid."','".$this->db->idate($now)."', '0', '".$this->db->escape($paymentintent->id)."', ".$object->id.", '".$this->db->escape($object->element)."', " . $conf->entity . ", '" . $service . "')"; + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "prelevement_facture_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site)"; + $sql .= " VALUES ('".$this->db->idate($now)."', '0', '".$this->db->escape($paymentintent->id)."', ".$object->id.", '".$this->db->escape($object->element)."', " . $conf->entity . ", '" . $service . "')"; $resql = $this->db->query($sql); if (! $resql) { @@ -398,7 +407,14 @@ class Stripe extends CommonObject dol_syslog("getPaymentIntent return error=".$error); - return $paymentintent; + if (! $error) + { + return $paymentintent; + } + else + { + return null; + } } /** From ae3a20d6ff144927b3268313e4e4bc20b6ebe082 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 May 2019 00:10:44 +0200 Subject: [PATCH 0435/1036] FIX compatibility with intent payment_modes --- htdocs/public/payment/newpayment.php | 2 +- htdocs/societe/paymentmodes.php | 76 +++++++++++++++++++++++++++- htdocs/stripe/class/stripe.class.php | 3 +- 3 files changed, 77 insertions(+), 4 deletions(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index c8135d8dc36..6bdaa92f508 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -2025,7 +2025,7 @@ if (preg_match('/^dopayment/', $action)) postal_code: 'thirdparty->zip; ?>'} } /* TODO Add all other known data like emails, ... to be SCA compliant */ }, - save_payment_method: false + save_payment_method: true /* the card will be saved */ } ).then(function(result) { console.log(result); diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 24bdedc946f..e2175142dd4 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -810,7 +810,41 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' try { $customerstripe=$stripe->customerStripe($object, $stripeacc, $servicestatus); if ($customerstripe->id) { - $listofsources=$customerstripe->sources->data; + + // When using the Charge API architecture + if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) + { + $listofsources=$customerstripe->sources->data; + } + else + { + $service = 'StripeTest'; + $servicestatus = 0; + if (! empty($conf->global->STRIPE_LIVE) && ! GETPOST('forcesandbox', 'alpha')) + { + $service = 'StripeLive'; + $servicestatus = 1; + } + + // Force to use the correct API key + global $stripearrayofkeysbyenv; + \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$servicestatus]['secret_key']); + + try { + if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage + $paymentmethodobjs = \Stripe\PaymentMethod::all(array("customer" => $customerstripe->id, "type" => "card")); + } else { + $paymentmethodobjs = \Stripe\PaymentMethod::all(array("customer" => $customerstripe->id, "type" => "card"), array("stripe_account" => $stripeacc)); + } + + $listofsources = $paymentmethodobjs->data; + } + catch(Exception $e) + { + $error++; + setEventMessages($e->getMessage(), null, 'errors'); + } + } } } catch(Exception $e) @@ -1001,6 +1035,14 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' { print ''; } + elseif ($src->object=='payment_method' && $src->type=='card') + { + print img_credit_card($src->card->brand); + } + elseif ($src->object=='payment_method' && $src->type=='sepa_debit') + { + print ''; + } print''; print ''; // Default print ''; + $colspan=8; + if (! empty($conf->global->STRIPE_ALLOW_LOCAL_CARD)) $colspan++; + print ''; } print "
'; if ($src->object=='card') @@ -1040,6 +1082,34 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' } else print img_warning().' '.$langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CompanyCountry")).''; } + elseif ($src->object=='payment_method' && $src->type=='card') + { + print $src->billing_details->name.'
....'.$src->card->last4.' - '.$src->card->exp_month.'/'.$src->card->exp_year.''; + print '
'; + + if ($src->card->country) + { + $img=picto_from_langcode($src->card->country); + print $img?$img.' ':''; + print getCountry($src->card->country, 1); + } + else print img_warning().' '.$langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CompanyCountry")).''; + } + elseif ($src->object=='payment_method' && $src->type=='sepa_debit') + { + print 'info sepa'; + print ''; + if ($src->sepa_debit->country) + { + $img=picto_from_langcode($src->sepa_debit->country); + print $img?$img.' ':''; + print getCountry($src->sepa_debit->country, 1); + } + else print img_warning().' '.$langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CompanyCountry")).''; + } + else { + print ''; + } print ''; @@ -1080,7 +1150,9 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' if ($nbremote == 0 && $nblocal == 0) { - print '
'.$langs->trans("None").'
'.$langs->trans("None").'
"; print "
"; diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index adfac2cd620..f832e061efb 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -344,11 +344,12 @@ class Stripe extends CommonObject "payment_method_types" => ["card"], "description" => $description, "statement_descriptor" => dol_trunc($tag, 10, 'right', 'UTF-8', 1), // 22 chars that appears on bank receipt (company + description) + //"save_payment_method" => true, "metadata" => $metadata ); if (! is_null($customer)) $dataforintent["customer"]=$customer; - // save_payment_method = true, // payment_method = + // payment_method_types = array('card') //var_dump($dataforintent); if ($conf->entity!=$conf->global->STRIPECONNECT_PRINCIPAL && $fee>0) From 8bcc7cb370202be755da0172cfec57a10e701196 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 May 2019 00:26:39 +0200 Subject: [PATCH 0436/1036] Fix creation of duplicate payment intents --- htdocs/stripe/class/stripe.class.php | 38 +++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index f832e061efb..1d81e12da8c 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -378,15 +378,39 @@ class Stripe extends CommonObject // Store the payment intent if (is_object($object)) { - $now=dol_now(); - $sql = "INSERT INTO " . MAIN_DB_PREFIX . "prelevement_facture_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site)"; - $sql .= " VALUES ('".$this->db->idate($now)."', '0', '".$this->db->escape($paymentintent->id)."', ".$object->id.", '".$this->db->escape($object->element)."', " . $conf->entity . ", '" . $service . "')"; + $paymentintentalreadyexists = 0; + // Check that payment intent $paymentintent->id is not already recorded. + $sql = "SELECT pi.rowid"; + $sql.= " FROM " . MAIN_DB_PREFIX . "prelevement_facture_demande as pi"; + $sql.= " WHERE pi.entity IN (".getEntity('societe').")"; + $sql.= " AND pi.ext_payment_site = '" . $service . "'"; + $sql.= " AND pi.ext_payment_id = '".$this->db->escape($paymentintent->id)."'"; + + dol_syslog(get_class($this) . "::getPaymentIntent search if payment intent already in prelevement_facture_demande", LOG_DEBUG); $resql = $this->db->query($sql); - if (! $resql) + if ($resql) { + $num = $this->db->num_rows($resql); + if ($num) + { + $obj = $this->db->fetch_object($resql); + if ($obj) $paymentintentalreadyexists++; + } + } + else dol_print_error($this->db); + + // If not, we create it. + if (! $paymentintentalreadyexists) { - $error++; - $this->error = $this->db->lasterror(); - dol_syslog(get_class($this) . "::PaymentIntent failed to insert paymentintent with id=".$paymentintent->id." into database."); + $now=dol_now(); + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "prelevement_facture_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site)"; + $sql .= " VALUES ('".$this->db->idate($now)."', '0', '".$this->db->escape($paymentintent->id)."', ".$object->id.", '".$this->db->escape($object->element)."', " . $conf->entity . ", '" . $service . "')"; + $resql = $this->db->query($sql); + if (! $resql) + { + $error++; + $this->error = $this->db->lasterror(); + dol_syslog(get_class($this) . "::PaymentIntent failed to insert paymentintent with id=".$paymentintent->id." into database."); + } } } else From 1f789fa26649ce2bedaf9f1524e9fbb5791119a1 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Fri, 17 May 2019 11:24:24 +0200 Subject: [PATCH 0437/1036] FIX syntax --- htdocs/core/modules/DolibarrModules.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index 1fc25035933..5311477e541 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -667,7 +667,7 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it array( 'doc/' => dol_buildpath(strtolower($this->name).'/doc/', 1), 'img/' => dol_buildpath(strtolower($this->name).'/img/', 1), - 'images/' => dol_buildpath(strtolower($this->name).'/imgages/', 1), + 'images/' => dol_buildpath(strtolower($this->name).'/images/', 1), ) ); } From e95acc9a81aba8c8e240c81b5c44a7db005edddd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 17 May 2019 13:19:22 +0200 Subject: [PATCH 0438/1036] Add warning if missing module --- htdocs/admin/debugbar.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/debugbar.php b/htdocs/admin/debugbar.php index b6002d1a4df..8a72e3e40c8 100644 --- a/htdocs/admin/debugbar.php +++ b/htdocs/admin/debugbar.php @@ -77,10 +77,17 @@ $form=new Form($db); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("DebugBarSetup"), $linkback, 'title_setup'); -print '
'; //print load_fiche_titre($langs->trans("DebugBar")); +if (! function_exists('mb_check_encoding')) +{ + $langs->load("errors"); + print info_admin($langs->trans("ErrorPHPNeedModule", 'mbstring'), 0, 0, 'error'); +} + +print '
'; + // Level print ''; print ''; From 6cf01b034b6ff3c3648e6d26eb1817bd7d98edfb Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Fri, 17 May 2019 16:37:24 +0200 Subject: [PATCH 0439/1036] add info into change log --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 70ae8ff8b5c..6862efc47c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -174,6 +174,7 @@ Following changes may create regressions for some external modules, but were nec * Removed deprecated use of string in dol_print_date(). Only date allowed. * Deprecated property ->fk_departement is now ->state_id everywhere. * Removed the method 4 of GETPOST (to get $_COOKIE). It was not used and not recommanded to use in Dolibarr. +* Column llx_facture.facnumber change to llx_facture.ref ***** ChangeLog for 9.0.3 compared to 9.0.2 ***** From 2a2f0557cf9b89ded64860458e1ebaa3c0f2db37 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Fri, 17 May 2019 17:02:44 +0200 Subject: [PATCH 0440/1036] Fix : display hr tab on user if rights to read all --- htdocs/core/lib/usergroups.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 81989d0aaa1..efe0dbb52bd 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -144,8 +144,8 @@ function user_prepare_head($object) if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read)) - || (! empty($conf->expensereport->enabled) && ! empty($user->rights->expensereport->lire) && $user->id == $object->id) - || (! empty($conf->holiday->enabled) && ! empty($user->rights->holiday->read) && $user->id == $object->id ) + || (! empty($conf->expensereport->enabled) && ! empty($user->rights->expensereport->lire) && ($user->id == $object->id || $user->rights->expensereport->readall)) + || (! empty($conf->holiday->enabled) && ! empty($user->rights->holiday->read) && ($user->id == $object->id || $user->rights->holiday->read_all)) ) { // Bank From fcfabd40afcbab12b19a5156b12b250cd64a7706 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Fri, 17 May 2019 18:10:40 +0200 Subject: [PATCH 0441/1036] fix missing cell into perms screen --- htdocs/core/menus/standard/eldy_menu.php | 2 +- htdocs/user/perms.php | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/core/menus/standard/eldy_menu.php b/htdocs/core/menus/standard/eldy_menu.php index 2dea6a53c5d..c6313bfe69e 100644 --- a/htdocs/core/menus/standard/eldy_menu.php +++ b/htdocs/core/menus/standard/eldy_menu.php @@ -1,4 +1,4 @@ - * Copyright (C) 2007-2009 Regis Houssin * diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index 992de6850db..2560ccc7f04 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -331,7 +331,9 @@ if ($result) print ''; } print ''; - } + }else { + print ''; + } print ''; print ''."\n"; } From cf45bbb698bf28520c6c81ab585d6bb9239f9628 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Fri, 17 May 2019 23:50:57 +0200 Subject: [PATCH 0442/1036] FIX #11160 --- .../interface_99_modMyModule_MyModuleTriggers.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php index 1718a6a72d5..93f43711a78 100644 --- a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php +++ b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php @@ -292,6 +292,9 @@ class InterfaceMyModuleTriggers extends DolibarrTriggers //case 'TASK_TIMESPENT_CREATE': //case 'TASK_TIMESPENT_MODIFY': //case 'TASK_TIMESPENT_DELETE': + //case 'PROJECT_ADD_CONTACT': + //case 'PROJECT_DELETE_CONTACT': + //case 'PROJECT_DELETE_RESOURCE': // Shipping //case 'SHIPPING_CREATE': From b85ed3e0b7aaff32ca892235b293cbbfb8c7ad89 Mon Sep 17 00:00:00 2001 From: ATM-Marc Date: Sat, 18 May 2019 00:11:15 +0200 Subject: [PATCH 0443/1036] FIX: mail presend: can overwrite a file previously uploaded --- htdocs/core/actions_sendmails.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/actions_sendmails.inc.php b/htdocs/core/actions_sendmails.inc.php index 539306f3cb3..17f1a70d555 100644 --- a/htdocs/core/actions_sendmails.inc.php +++ b/htdocs/core/actions_sendmails.inc.php @@ -43,7 +43,7 @@ if (GETPOST('addfile','alpha')) $vardir=$conf->user->dir_output."/".$user->id; $upload_dir_tmp = $vardir.'/temp'; // TODO Add $keytoavoidconflict in upload_dir path - dol_add_file_process($upload_dir_tmp, 0, 0, 'addedfile', '', null, $trackid); + dol_add_file_process($upload_dir_tmp, 1, 0, 'addedfile', '', null, $trackid); $action='presend'; } From 9ab718ec5e6b0863d4701f8dd66a214e3763411a Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Sat, 18 May 2019 00:19:06 +0200 Subject: [PATCH 0444/1036] FIX #11045 --- htdocs/modulebuilder/template/myobject_card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index f4f4e8c34e5..f184c34b42c 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -127,7 +127,7 @@ if (empty($reshook)) $backurlforlist = dol_buildpath('/mymodule/myobject_list.php', 1); if (empty($backtopage)) { if (empty($id)) $backtopage = $backurlforlist; - else $backtopage = dol_buildpath('/mymodule/myobject_card.php', 1).($id > 0 ? $id : '__ID__'); + else $backtopage = dol_buildpath('/mymodule/myobject_card.php?id=', 1).($id > 0 ? $id : '__ID__'); } $triggermodname = 'MYMODULE_MYOBJECT_MODIFY'; // Name of trigger action code to execute when we modify record From 13b75e35a067eccef348a33da559eb70ceb2de6d Mon Sep 17 00:00:00 2001 From: Norbert Penel / OSCSS Date: Sat, 18 May 2019 00:20:44 +0200 Subject: [PATCH 0445/1036] FIx tms field made with modulebuilder all new module appear to have a bug on tms, no data can be inserted due to tms default value that can't be null --- htdocs/install/mysql/tables/llx_asset.sql | 2 +- htdocs/install/mysql/tables/llx_bom_bom.sql | 2 +- .../install/mysql/tables/llx_emailcollector_emailcollector.sql | 2 +- .../mysql/tables/llx_emailcollector_emailcollectoraction.sql | 2 +- .../mysql/tables/llx_emailcollector_emailcollectorfilter.sql | 2 +- htdocs/install/mysql/tables/llx_pos_cash_fence.sql | 2 +- htdocs/install/mysql/tables/llx_societe_account.sql | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_asset.sql b/htdocs/install/mysql/tables/llx_asset.sql index a0891ef4b0e..b6b2de3fcb3 100644 --- a/htdocs/install/mysql/tables/llx_asset.sql +++ b/htdocs/install/mysql/tables/llx_asset.sql @@ -26,7 +26,7 @@ CREATE TABLE llx_asset( note_public text, note_private text, date_creation datetime NOT NULL, - tms timestamp NOT NULL, + tms timestamp, fk_user_creat integer NOT NULL, fk_user_modif integer, import_key varchar(14), diff --git a/htdocs/install/mysql/tables/llx_bom_bom.sql b/htdocs/install/mysql/tables/llx_bom_bom.sql index 89a2f8e8bab..a406229a0e4 100644 --- a/htdocs/install/mysql/tables/llx_bom_bom.sql +++ b/htdocs/install/mysql/tables/llx_bom_bom.sql @@ -24,7 +24,7 @@ CREATE TABLE llx_bom_bom( note_public text, note_private text, date_creation datetime NOT NULL, - tms timestamp NOT NULL, + tms timestamp, date_valid datetime, fk_user_creat integer NOT NULL, fk_user_modif integer, diff --git a/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql b/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql index 2a7bc6a4693..df4640a14f4 100644 --- a/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql +++ b/htdocs/install/mysql/tables/llx_emailcollector_emailcollector.sql @@ -34,7 +34,7 @@ CREATE TABLE llx_emailcollector_emailcollector( note_public text, note_private text, date_creation datetime NOT NULL, - tms timestamp NOT NULL, + tms timestamp, fk_user_creat integer NOT NULL, fk_user_modif integer, import_key varchar(14), diff --git a/htdocs/install/mysql/tables/llx_emailcollector_emailcollectoraction.sql b/htdocs/install/mysql/tables/llx_emailcollector_emailcollectoraction.sql index e0239cf98f6..011f2d827ce 100644 --- a/htdocs/install/mysql/tables/llx_emailcollector_emailcollectoraction.sql +++ b/htdocs/install/mysql/tables/llx_emailcollector_emailcollectoraction.sql @@ -21,7 +21,7 @@ CREATE TABLE llx_emailcollector_emailcollectoraction( type varchar(128) NOT NULL, actionparam varchar(255) NULL, date_creation datetime NOT NULL, - tms timestamp NOT NULL, + tms timestamp, fk_user_creat integer NOT NULL, fk_user_modif integer, position integer DEFAULT 0, diff --git a/htdocs/install/mysql/tables/llx_emailcollector_emailcollectorfilter.sql b/htdocs/install/mysql/tables/llx_emailcollector_emailcollectorfilter.sql index e4071e5500a..8ecccedb6d5 100644 --- a/htdocs/install/mysql/tables/llx_emailcollector_emailcollectorfilter.sql +++ b/htdocs/install/mysql/tables/llx_emailcollector_emailcollectorfilter.sql @@ -21,7 +21,7 @@ CREATE TABLE llx_emailcollector_emailcollectorfilter( type varchar(128) NOT NULL, rulevalue varchar(128) NULL, date_creation datetime NOT NULL, - tms timestamp NOT NULL, + tms timestamp, fk_user_creat integer NOT NULL, fk_user_modif integer, import_key varchar(14), diff --git a/htdocs/install/mysql/tables/llx_pos_cash_fence.sql b/htdocs/install/mysql/tables/llx_pos_cash_fence.sql index 607060adab6..f9967ec968b 100644 --- a/htdocs/install/mysql/tables/llx_pos_cash_fence.sql +++ b/htdocs/install/mysql/tables/llx_pos_cash_fence.sql @@ -33,6 +33,6 @@ CREATE TABLE llx_pos_cash_fence( posnumber VARCHAR(30), fk_user_creat integer, fk_user_valid integer, - tms TIMESTAMP NOT NULL, + tms TIMESTAMP, import_key VARCHAR(14) ) ENGINE=innodb; \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_societe_account.sql b/htdocs/install/mysql/tables/llx_societe_account.sql index 4123a3b05e2..b307613ba6e 100644 --- a/htdocs/install/mysql/tables/llx_societe_account.sql +++ b/htdocs/install/mysql/tables/llx_societe_account.sql @@ -32,7 +32,7 @@ CREATE TABLE llx_societe_account( date_last_login datetime, date_previous_login datetime, date_creation datetime NOT NULL, - tms timestamp NOT NULL, + tms timestamp, fk_user_creat integer NOT NULL, fk_user_modif integer, import_key varchar(14), From 5ddf16685f6df965c7440a5db62d12525b0c204e Mon Sep 17 00:00:00 2001 From: Norbert Penel / OSCSS Date: Sat, 18 May 2019 00:25:46 +0200 Subject: [PATCH 0446/1036] fix missing traduction on societe a translation key was missing --- htdocs/societe/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 292d109fd74..e0309ded815 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1207,7 +1207,7 @@ else { // Supplier print ''; - print ''.$form->editfieldkey('Supplier', 'fournisseur', '', $object, 0, 'string', '', 1).''; + print ''.$form->editfieldkey('Vendor', 'fournisseur', '', $object, 0, 'string', '', 1).''; $default = -1; if (! empty($conf->global->THIRDPARTY_SUPPLIER_BY_DEFAULT)) $default=1; print $form->selectyesno("fournisseur", (GETPOST('fournisseur', 'int')!=''?GETPOST('fournisseur', 'int'):(GETPOST("type", 'alpha') == '' ? $default : $object->fournisseur)), 1, 0, (GETPOST("type", 'alpha') == '' ? 1 : 0)); From cf207aa545d09df342177219db23618e73814108 Mon Sep 17 00:00:00 2001 From: Norbert Penel / OSCSS Date: Sat, 18 May 2019 00:29:32 +0200 Subject: [PATCH 0447/1036] FIX new takepos error messages the terminal number implementation must be used on global conf key --- htdocs/takepos/pay.php | 2 +- htdocs/takepos/takepos.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/takepos/pay.php b/htdocs/takepos/pay.php index 37676f1b1e1..83f4aefb5f5 100644 --- a/htdocs/takepos/pay.php +++ b/htdocs/takepos/pay.php @@ -84,7 +84,7 @@ if ($resql) { if ($paycode == 'CB') $paycode = 'CB'; if ($paycode == 'CHQ') $paycode = 'CHEQUE'; - $accountname="CASHDESK_ID_BANKACCOUNT_".$paycode; + $accountname="CASHDESK_ID_BANKACCOUNT_".$paycode.$_SESSION["takeposterminal"]; if (! empty($conf->global->$accountname) && $conf->global->$accountname > 0) array_push($paiements, $obj); } } diff --git a/htdocs/takepos/takepos.php b/htdocs/takepos/takepos.php index 9601c6d0f36..dd2d6524f46 100644 --- a/htdocs/takepos/takepos.php +++ b/htdocs/takepos/takepos.php @@ -624,7 +624,7 @@ if ($resql){ if ($paycode == 'CB') $paycode = 'CARD'; if ($paycode == 'CHQ') $paycode = 'CHEQUE'; - $accountname="CASHDESK_ID_BANKACCOUNT_".$paycode; + $accountname="CASHDESK_ID_BANKACCOUNT_".$paycode.$_SESSION["takeposterminal"]; if (! empty($conf->global->$accountname) && $conf->global->$accountname > 0) array_push($paiementsModes, $obj); } } From f569785e85803181b4042497ee368c7047374f22 Mon Sep 17 00:00:00 2001 From: Norbert Penel / OSCSS Date: Sat, 18 May 2019 00:39:31 +0200 Subject: [PATCH 0448/1036] fix modulebuilder tms mustn't have a not null --- htdocs/modulebuilder/template/sql/llx_mymodule_myobject.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/sql/llx_mymodule_myobject.sql b/htdocs/modulebuilder/template/sql/llx_mymodule_myobject.sql index 0470739573a..b380b1280f2 100644 --- a/htdocs/modulebuilder/template/sql/llx_mymodule_myobject.sql +++ b/htdocs/modulebuilder/template/sql/llx_mymodule_myobject.sql @@ -22,7 +22,7 @@ CREATE TABLE llx_mymodule_myobject( qty INTEGER, status INTEGER, date_creation DATETIME NOT NULL, - tms TIMESTAMP NOT NULL, + tms TIMESTAMP, import_key VARCHAR(14) -- END MODULEBUILDER FIELDS ) ENGINE=innodb; \ No newline at end of file From 1af69d4c8f8e4efe1b58f1c67cd2200ef6ee8180 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 00:40:29 +0200 Subject: [PATCH 0449/1036] Fix varnames in invoice api --- htdocs/compta/facture/class/api_invoices.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/class/api_invoices.class.php b/htdocs/compta/facture/class/api_invoices.class.php index 6fe44440ff5..87377662a62 100644 --- a/htdocs/compta/facture/class/api_invoices.class.php +++ b/htdocs/compta/facture/class/api_invoices.class.php @@ -72,10 +72,10 @@ class Invoices extends DolibarrApi } // Get payment details - $this->invoice->totalpaye = $this->invoice->getSommePaiement(); + $this->invoice->totalpaid = $this->invoice->getSommePaiement(); $this->invoice->totalcreditnotes = $this->invoice->getSumCreditNotesUsed(); $this->invoice->totaldeposits = $this->invoice->getSumDepositsUsed(); - $this->invoice->resteapayer = price2num($this->invoice->total_ttc - $this->invoice->totalpaye - $this->invoice->totalcreditnotes - $this->invoice->totaldeposits, 'MT'); + $this->invoice->remaintopay = price2num($this->invoice->total_ttc - $this->invoice->totalpaye - $this->invoice->totalcreditnotes - $this->invoice->totaldeposits, 'MT'); if (! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) { throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); From 0c3500fc5d45894b8ab3305caf5b7a1c4a7f82a2 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 00:45:41 +0200 Subject: [PATCH 0450/1036] fix : #10562 --- htdocs/core/modules/DolibarrModules.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index 1fc25035933..f16d0d83081 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -746,7 +746,7 @@ class DolibarrModules // Can not be abstract, because we need to instantiate it $filefound= false; // Define path to file README.md. - // First check README-la_LA.md then README.md + // First check ChangeLog-la_LA.md then ChangeLog.md $pathoffile = dol_buildpath(strtolower($this->name).'/ChangeLog-'.$langs->defaultlang.'.md', 0); if (dol_is_file($pathoffile)) { $filefound = true; From 051308c6793b1c98fbfada70888ee9a5135b421e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 00:46:32 +0200 Subject: [PATCH 0451/1036] Update eldy_menu.php --- htdocs/core/menus/standard/eldy_menu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy_menu.php b/htdocs/core/menus/standard/eldy_menu.php index c6313bfe69e..2dea6a53c5d 100644 --- a/htdocs/core/menus/standard/eldy_menu.php +++ b/htdocs/core/menus/standard/eldy_menu.php @@ -1,4 +1,4 @@ - * Copyright (C) 2007-2009 Regis Houssin * From aed71be7f11b7ef590563e60f3585aadba66c0aa Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 00:47:32 +0200 Subject: [PATCH 0452/1036] Fix resource delete with attached file --- htdocs/resource/class/dolresource.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/resource/class/dolresource.class.php b/htdocs/resource/class/dolresource.class.php index ec184cd856d..ba962bf48c1 100644 --- a/htdocs/resource/class/dolresource.class.php +++ b/htdocs/resource/class/dolresource.class.php @@ -408,6 +408,7 @@ class Dolresource extends CommonObject function delete($rowid, $notrigger=0) { global $user,$langs,$conf; + require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; $error=0; From 8fc5fdd1c7b7ce7f6df8969e5fac06f4d29cc466 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 00:54:41 +0200 Subject: [PATCH 0453/1036] Update myobject_card.php --- htdocs/modulebuilder/template/myobject_card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index f184c34b42c..212e86ca93c 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -127,7 +127,7 @@ if (empty($reshook)) $backurlforlist = dol_buildpath('/mymodule/myobject_list.php', 1); if (empty($backtopage)) { if (empty($id)) $backtopage = $backurlforlist; - else $backtopage = dol_buildpath('/mymodule/myobject_card.php?id=', 1).($id > 0 ? $id : '__ID__'); + else $backtopage = dol_buildpath('/mymodule/myobject_card.php', 1).'?id='.($id > 0 ? $id : '__ID__'); } $triggermodname = 'MYMODULE_MYOBJECT_MODIFY'; // Name of trigger action code to execute when we modify record From 68118e55dc4e5a5154243f9bb74dc6d1e98a3ddd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 00:58:43 +0200 Subject: [PATCH 0454/1036] Update api_invoices.class.php --- htdocs/compta/facture/class/api_invoices.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/api_invoices.class.php b/htdocs/compta/facture/class/api_invoices.class.php index 87377662a62..d6103f4085c 100644 --- a/htdocs/compta/facture/class/api_invoices.class.php +++ b/htdocs/compta/facture/class/api_invoices.class.php @@ -75,7 +75,7 @@ class Invoices extends DolibarrApi $this->invoice->totalpaid = $this->invoice->getSommePaiement(); $this->invoice->totalcreditnotes = $this->invoice->getSumCreditNotesUsed(); $this->invoice->totaldeposits = $this->invoice->getSumDepositsUsed(); - $this->invoice->remaintopay = price2num($this->invoice->total_ttc - $this->invoice->totalpaye - $this->invoice->totalcreditnotes - $this->invoice->totaldeposits, 'MT'); + $this->invoice->remaintopay = price2num($this->invoice->total_ttc - $this->invoice->totalpaid - $this->invoice->totalcreditnotes - $this->invoice->totaldeposits, 'MT'); if (! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) { throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); From 095fd2769a3ed6f4b4d0a9b1db180b5afca08972 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 01:11:34 +0200 Subject: [PATCH 0455/1036] Fix project beluga order status --- htdocs/core/modules/project/doc/pdf_beluga.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/project/doc/pdf_beluga.modules.php b/htdocs/core/modules/project/doc/pdf_beluga.modules.php index d7cae4726c5..562f6a093dc 100644 --- a/htdocs/core/modules/project/doc/pdf_beluga.modules.php +++ b/htdocs/core/modules/project/doc/pdf_beluga.modules.php @@ -273,7 +273,7 @@ class pdf_beluga extends ModelePDFProjects 'table'=>'commande', 'datefieldname'=>'date_commande', 'test'=>$conf->commande->enabled && $user->rights->commande->lire, - 'lang'=>'order'), + 'lang'=>'orders'), 'invoice'=>array( 'name'=>"CustomersInvoices", 'title'=>"ListInvoicesAssociatedProject", From bf6dc0ab20c93cf16ebe6efae3efc427cbccf01f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 01:13:29 +0200 Subject: [PATCH 0456/1036] Update changelog --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 70ae8ff8b5c..34ee283e0a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -121,7 +121,7 @@ NEW: Add constant XFRAMEOPTIONS_ALLOWALL NEW: Add function isValidVATID() NEW: ADD document's product support in APIs NEW: REST API: get the list of objects in a category. -NEW: Update Stripe library to 6.34.3 +NEW: Update Stripe library to 6.35 NEW: Upgrade jquery lib to 3.3.1 NEW: Add hook 'addHtmlHeader()' NEW: Add hook 'createRecurringInvoices()' From 26fd2ee99db8dc247b5ce29ca35561bcbd006c83 Mon Sep 17 00:00:00 2001 From: Norbert Penel / OSCSS Date: Sat, 18 May 2019 01:14:35 +0200 Subject: [PATCH 0457/1036] missing file on bom agenda was not here --- htdocs/bom/bom_agenda.php | 261 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 htdocs/bom/bom_agenda.php diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php new file mode 100644 index 00000000000..a1db711dd3e --- /dev/null +++ b/htdocs/bom/bom_agenda.php @@ -0,0 +1,261 @@ + + * Copyright (C) ---Put here your own copyright and developer email--- + * + * 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/modulebuilder/template/myobject_agenda.php + * \ingroup bom + * \brief Page of MyObject events + */ + +// Load Dolibarr environment +$res=0; +// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) +if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; +// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME +$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1; +while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; } +if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include substr($tmp, 0, ($i+1))."/main.inc.php"; +if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include dirname(substr($tmp, 0, ($i+1)))."/main.inc.php"; +// Try main.inc.php using relative path +if (! $res && file_exists("../main.inc.php")) $res=@include "../main.inc.php"; +if (! $res && file_exists("../../main.inc.php")) $res=@include "../../main.inc.php"; +if (! $res && file_exists("../../../main.inc.php")) $res=@include "../../../main.inc.php"; +if (! $res) die("Include of main fails"); + +require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +dol_include_once('/bom/class/bom.class.php'); +dol_include_once('/bom/lib/bom.lib.php'); + + +// Load translation files required by the page +$langs->loadLangs(array("mrp","other")); + +// Get parameters +$id = GETPOST('id', 'int'); +$ref = GETPOST('ref', 'alpha'); +$action = GETPOST('action', 'alpha'); +$cancel = GETPOST('cancel', 'aZ09'); +$backtopage = GETPOST('backtopage', 'alpha'); + +if (GETPOST('actioncode', 'array')) +{ + $actioncode=GETPOST('actioncode', 'array', 3); + if (! count($actioncode)) $actioncode='0'; +} +else +{ + $actioncode=GETPOST("actioncode", "alpha", 3)?GETPOST("actioncode", "alpha", 3):(GETPOST("actioncode")=='0'?'0':(empty($conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)?'':$conf->global->AGENDA_DEFAULT_FILTER_TYPE_FOR_OBJECT)); +} +$search_agenda_label=GETPOST('search_agenda_label'); + +// Security check - Protection if external user +//if ($user->societe_id > 0) access_forbidden(); +//if ($user->societe_id > 0) $socid = $user->societe_id; +//$result = restrictedArea($user, 'bom', $id); + +$limit = GETPOST('limit', 'int')?GETPOST('limit', 'int'):$conf->liste_limit; +$sortfield = GETPOST("sortfield", 'alpha'); +$sortorder = GETPOST("sortorder", 'alpha'); +$page = GETPOST("page", 'int'); +if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (! $sortfield) $sortfield='a.datep,a.id'; +if (! $sortorder) $sortorder='DESC'; + +// Initialize technical objects +$object=new BOM($db); +$extrafields = new ExtraFields($db); +$diroutputmassaction=$conf->bom->dir_output . '/temp/massgeneration/'.$user->id; +$hookmanager->initHooks(array('bomagenda','globalcard')); // Note that conf->hooks_modules contains array +// Fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('bom'); + +// Load object +include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals +if ($id > 0 || ! empty($ref)) $upload_dir = $conf->bom->multidir_output[$object->entity] . "/" . $object->id; + + + +/* + * Actions + */ + +$parameters=array('id'=>$socid); +$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)) +{ + // Cancel + if (GETPOST('cancel', 'alpha') && ! empty($backtopage)) + { + header("Location: ".$backtopage); + exit; + } + + // 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 + { + $actioncode=''; + $search_agenda_label=''; + } +} + + + +/* + * View + */ + +$contactstatic = new Contact($db); + +$form = new Form($db); + +if ($object->id > 0) +{ + $title=$langs->trans("Agenda"); + //if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/thirdpartynameonly/',$conf->global->MAIN_HTML_TITLE) && $object->name) $title=$object->name." - ".$title; + $help_url = ''; + llxHeader('', $title, $help_url); + + if (! empty($conf->notification->enabled)) $langs->load("mails"); + $head = bomPrepareHead($object); + + + dol_fiche_head($head, 'agenda', $langs->trans("BillOfMaterials"), -1, 'bom'); + + // Object card + // ------------------------------------------------------------ + $linkback = '' . $langs->trans("BackToList") . ''; + + $morehtmlref='
'; + /* + // Ref customer + $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, 0, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($user->rights->bom->creer) + { + if ($action != 'classify') + //$morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + $morehtmlref.=' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.=''; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=''; + $morehtmlref.=$proj->ref; + $morehtmlref.=''; + } else { + $morehtmlref.=''; + } + } + }*/ + $morehtmlref.='
'; + + + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + + print '
'; + print '
'; + + $object->info($object->id); + print dol_print_object_info($object, 1); + + print '
'; + + dol_fiche_end(); + + + + // Actions buttons + + $objthirdparty=$object; + $objcon=new stdClass(); + + $out=''; + $permok=$user->rights->agenda->myactions->create; + if ((! empty($objthirdparty->id) || ! empty($objcon->id)) && $permok) + { + //$out.='trans("AddAnAction"),'filenew'); + //$out.=""; + } + + + print '
'; + + if (! empty($conf->agenda->enabled)) + { + if (! empty($user->rights->agenda->myactions->create) || ! empty($user->rights->agenda->allactions->create)) + { + print ''.$langs->trans("AddAction").''; + } + else + { + print ''.$langs->trans("AddAction").''; + } + } + + print '
'; + + if (! empty($conf->agenda->enabled) && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read) )) + { + $param='&socid='.$socid; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + + + //print load_fiche_titre($langs->trans("ActionsOnBom"), '', ''); + + // List of all actions + $filters=array(); + $filters['search_agenda_label']=$search_agenda_label; + + // TODO Replace this with same code than into list.php + //show_actions_done($conf,$langs,$db,$object,null,0,$actioncode, '', $filters, $sortfield, $sortorder); + } +} + +// End of page +llxFooter(); +$db->close(); From 9e38f3122d9234a035ab47fd1e7db98772a6d61f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 01:26:44 +0200 Subject: [PATCH 0458/1036] Update for pgsql --- htdocs/install/pgsql/functions/functions.sql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/htdocs/install/pgsql/functions/functions.sql b/htdocs/install/pgsql/functions/functions.sql index de6d98edf04..66b1fbaf370 100644 --- a/htdocs/install/pgsql/functions/functions.sql +++ b/htdocs/install/pgsql/functions/functions.sql @@ -69,6 +69,12 @@ CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_adherent_type_extraf CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bank FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bank_account FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bank_account_extrafields FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_blockedlog FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_blockedlog_authority FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bom_bom FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bom_bom_extrafields FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bom_bomline FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bom_bomline_extrafields FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_bordereau_cheque FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_boxes_def FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_c_email_templates FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); @@ -96,6 +102,9 @@ CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_deplacement FOR EACH CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_don FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_don_extrafields FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_element_resources FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_emailcollector_emailcollector FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_emailcollector_emailcollectoraction FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); +CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_emailcollector_emailcollectorfilter FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_entrepot FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_events FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON llx_expedition FOR EACH ROW EXECUTE PROCEDURE update_modified_column_tms(); From c6af18b24000ed8cd5afe02fa4052029f9fb106b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 01:38:42 +0200 Subject: [PATCH 0459/1036] Remove infosin debug too dangerous for security --- htdocs/debugbar/class/DebugBar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/debugbar/class/DebugBar.php b/htdocs/debugbar/class/DebugBar.php index d36583d9852..8882b5f4f1e 100644 --- a/htdocs/debugbar/class/DebugBar.php +++ b/htdocs/debugbar/class/DebugBar.php @@ -33,7 +33,7 @@ class DolibarrDebugBar extends DebugBar //$this->addCollector(new PhpInfoCollector()); //$this->addCollector(new DolMessagesCollector()); $this->addCollector(new DolRequestDataCollector()); - $this->addCollector(new DolConfigCollector()); + //$this->addCollector(new DolConfigCollector()); // Disabled for security purpose $this->addCollector(new DolTimeDataCollector()); $this->addCollector(new DolMemoryCollector()); //$this->addCollector(new DolExceptionsCollector()); From a850c7aede4b3341deeb8cbf18ca0fe3fbec6fec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 02:22:23 +0200 Subject: [PATCH 0460/1036] Fix if setup not complete --- htdocs/public/payment/newpayment.php | 464 ++++++++++++++------------- 1 file changed, 236 insertions(+), 228 deletions(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 6bdaa92f508..51b4c0580e0 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -1943,241 +1943,249 @@ if (preg_match('/^dopayment/', $action)) print ''."\n"; - print ''."\n"; - - // Code to ask the credit card. This use the default "API version". No way to force API version when using JS code. - print ''."\n"; + + // Code to ask the credit card. This use the default "API version". No way to force API version when using JS code. + print ''; } - else - { - ?> - - - // Create a Stripe client. - var stripe = Stripe(''); - - // Create an instance of Elements - var elements = stripe.elements(); - - // Custom styling can be passed to options when creating an Element. - // (Note that this demo uses a wider set of styles than the guide below.) - var style = { - base: { - color: '#32325d', - lineHeight: '24px', - fontFamily: '"Helvetica Neue", Helvetica, sans-serif', - fontSmoothing: 'antialiased', - fontSize: '16px', - '::placeholder': { - color: '#aab7c4' - } - }, - invalid: { - color: '#fa755a', - iconColor: '#fa755a' - } - }; - - // Create an instance of the card Element - var card = elements.create('card', {style: style}); - - // Add an instance of the card Element into the `card-element`
- card.mount('#card-element'); - - // Handle real-time validation errors from the card Element. - card.addEventListener('change', function(event) { - var displayError = document.getElementById('card-errors'); - if (event.error) { - displayError.textContent = event.error.message; - } else { - displayError.textContent = ''; - } - }); - - // Handle form submission - var form = document.getElementById('payment-form'); - console.log(form); - form.addEventListener('submit', function(event) { - event.preventDefault(); - global->STRIPE_USE_3DSECURE)) // Ask credit card directly, no 3DS test - { - ?> - /* Use token */ - stripe.createToken(card).then(function(result) { - if (result.error) { - // Inform the user if there was an error - var errorElement = document.getElementById('card-errors'); - errorElement.textContent = result.error.message; - } else { - // Send the token to your server - stripeTokenHandler(result.token); - } - }); - - /* Use 3DS source */ - stripe.createSource(card).then(function(result) { - if (result.error) { - // Inform the user if there was an error - var errorElement = document.getElementById('card-errors'); - errorElement.textContent = result.error.message; - } else { - // Send the source to your server - stripeSourceHandler(result.source); - } - }); - - }); - - - /* Insert the Token into the form so it gets submitted to the server */ - function stripeTokenHandler(token) { - // Insert the token ID into the form so it gets submitted to the server - var form = document.getElementById('payment-form'); - var hiddenInput = document.createElement('input'); - hiddenInput.setAttribute('type', 'hidden'); - hiddenInput.setAttribute('name', 'stripeToken'); - hiddenInput.setAttribute('value', token.id); - form.appendChild(hiddenInput); - - // Submit the form - jQuery('#buttontopay').hide(); - jQuery('#hourglasstopay').show(); - console.log("submit token"); - form.submit(); - } - - /* Insert the Source into the form so it gets submitted to the server */ - function stripeSourceHandler(source) { - // Insert the source ID into the form so it gets submitted to the server - var form = document.getElementById('payment-form'); - var hiddenInput = document.createElement('input'); - hiddenInput.setAttribute('type', 'hidden'); - hiddenInput.setAttribute('name', 'stripeSource'); - hiddenInput.setAttribute('value', source.id); - form.appendChild(hiddenInput); - - // Submit the form - jQuery('#buttontopay').hide(); - jQuery('#hourglasstopay').show(); - console.log("submit source"); - form.submit(); - } - - '; } } From 02af7ca25eaeaae0f56acb88e02e7ec257cbb86f Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 12:11:28 +0200 Subject: [PATCH 0461/1036] fix pb with multicompny payment dictionnary on faxcture card --- htdocs/commande/class/commande.class.php | 2 +- htdocs/compta/facture/card.php | 2 +- htdocs/core/class/html.form.class.php | 5 ++--- htdocs/projet/class/project.class.php | 10 ++++++++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 38a38d45b12..d2012870a31 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1685,7 +1685,7 @@ class Commande extends CommonOrder $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_paiement as p ON c.fk_mode_reglement = p.id'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_availability as ca ON c.fk_availability = ca.rowid'; - $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_input_reason as dr ON c.fk_input_reason = ca.rowid'; + $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_input_reason as dr ON c.fk_input_reason = dr.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON c.fk_incoterms = i.rowid'; if ($id) $sql.= " WHERE c.rowid=".$id; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 85b4e3bb728..b7da8efec87 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -4251,7 +4251,7 @@ elseif ($id > 0 || ! empty($ref)) $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank as b ON p.fk_bank = b.rowid'; $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank_account as ba ON b.fk_account = ba.rowid'; $sql .= ' WHERE pf.fk_facture = ' . $object->id . ' AND pf.fk_paiement = p.rowid'; - $sql .= ' AND p.entity IN (' . getEntity('invoice').')'; + $sql .= ' AND p.entity IN (' . getEntity('invoice').') AND c.entity IN (' . getEntity('invoice').')'; $sql .= ' ORDER BY p.datep, p.tms'; $result = $db->query($sql); diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index c86874cdde9..810a2a87ca9 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -102,8 +102,7 @@ class Form * @param string $paramid Key of parameter for id ('id', 'socid') * @return string HTML edit field */ - public function editfieldkey($text, $htmlname, $preselected, $object, $perm, $typeofdata = 'string', $moreparam = '', $fieldrequired = 0, $notabletag = 0, $paramid = 'id') - { + public function editfieldkey($text, $htmlname, $preselected, $object, $perm, $typeofdata = 'string', $moreparam = '', $fieldrequired = 0, $notabletag = 0, $paramid = 'id') { global $conf,$langs; $ret=''; @@ -144,7 +143,7 @@ class Form } return $ret; - } + } /** * Output value of a field for an editable field diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 8ebe6f71425..5a5e3139d27 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1229,12 +1229,18 @@ class Project extends CommonObject else dol_print_error($this->db); if (count($listofprojectcontacttype) == 0) $listofprojectcontacttype[0]='0'; // To avoid syntax error if not found + + if (!empty($user->contactid)) { + $userid=$user->contactid; + } else { + $userid=$user->id; + } if ($mode == 0) { $sql.= " AND ec.element_id = p.rowid"; $sql.= " AND ( p.public = 1"; $sql.= " OR ( ec.fk_c_type_contact IN (".join(',', array_keys($listofprojectcontacttype)).")"; - $sql.= " AND ec.fk_socpeople = ".$user->id.")"; + $sql.= " AND ec.fk_socpeople = ".$userid.")"; $sql.= " )"; } if ($mode == 1) @@ -1242,7 +1248,7 @@ class Project extends CommonObject $sql.= " AND ec.element_id = p.rowid"; $sql.= " AND ("; $sql.= " ( ec.fk_c_type_contact IN (".join(',', array_keys($listofprojectcontacttype)).")"; - $sql.= " AND ec.fk_socpeople = ".$user->id.")"; + $sql.= " AND ec.fk_socpeople = ".$userid.")"; $sql.= " )"; } if ($mode == 2) From c2b1c8d4392bea85e4ad394d6e0a10b6c127d5a4 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 12:26:36 +0200 Subject: [PATCH 0462/1036] remove bad fix --- htdocs/projet/class/project.class.php | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 5a5e3139d27..8ebe6f71425 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1229,18 +1229,12 @@ class Project extends CommonObject else dol_print_error($this->db); if (count($listofprojectcontacttype) == 0) $listofprojectcontacttype[0]='0'; // To avoid syntax error if not found - - if (!empty($user->contactid)) { - $userid=$user->contactid; - } else { - $userid=$user->id; - } if ($mode == 0) { $sql.= " AND ec.element_id = p.rowid"; $sql.= " AND ( p.public = 1"; $sql.= " OR ( ec.fk_c_type_contact IN (".join(',', array_keys($listofprojectcontacttype)).")"; - $sql.= " AND ec.fk_socpeople = ".$userid.")"; + $sql.= " AND ec.fk_socpeople = ".$user->id.")"; $sql.= " )"; } if ($mode == 1) @@ -1248,7 +1242,7 @@ class Project extends CommonObject $sql.= " AND ec.element_id = p.rowid"; $sql.= " AND ("; $sql.= " ( ec.fk_c_type_contact IN (".join(',', array_keys($listofprojectcontacttype)).")"; - $sql.= " AND ec.fk_socpeople = ".$userid.")"; + $sql.= " AND ec.fk_socpeople = ".$user->id.")"; $sql.= " )"; } if ($mode == 2) From 9ef5767fd558a84864750171aec3a68c87cafc33 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 12:28:39 +0200 Subject: [PATCH 0463/1036] phpcs --- htdocs/core/class/html.form.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 810a2a87ca9..e7d8742a3f5 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -102,7 +102,8 @@ class Form * @param string $paramid Key of parameter for id ('id', 'socid') * @return string HTML edit field */ - public function editfieldkey($text, $htmlname, $preselected, $object, $perm, $typeofdata = 'string', $moreparam = '', $fieldrequired = 0, $notabletag = 0, $paramid = 'id') { + public function editfieldkey($text, $htmlname, $preselected, $object, $perm, $typeofdata = 'string', $moreparam = '', $fieldrequired = 0, $notabletag = 0, $paramid = 'id') + { global $conf,$langs; $ret=''; From 2c104ccc4a2d97ff4e508883f2b14193d9d35b63 Mon Sep 17 00:00:00 2001 From: ATM-Marc Date: Sat, 18 May 2019 14:22:04 +0200 Subject: [PATCH 0464/1036] NEW: contact types for supplier proposals --- htdocs/install/mysql/data/llx_c_type_contact.sql | 7 +++++++ htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/htdocs/install/mysql/data/llx_c_type_contact.sql b/htdocs/install/mysql/data/llx_c_type_contact.sql index 62107525ff9..006a65d2641 100644 --- a/htdocs/install/mysql/data/llx_c_type_contact.sql +++ b/htdocs/install/mysql/data/llx_c_type_contact.sql @@ -92,3 +92,10 @@ INSERT INTO llx_c_type_contact (rowid, element, source, code, libelle, active, m INSERT INTO llx_c_type_contact (rowid, element, source, code, libelle, active, module) VALUES(157, 'ticket', 'external', 'SUPPORTCLI', 'Contact client suivi incident', 1, NULL); INSERT INTO llx_c_type_contact (rowid, element, source, code, libelle, active, module) VALUES(158, 'ticket', 'external', 'CONTRIBUTOR', 'Intervenant', 1, NULL); +-- Supplier proposal + +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (110, 'supplier_proposal', 'internal', 'SALESREPFOLL', 'Responsable suivi de la demande', 1); +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (111, 'supplier_proposal', 'external', 'BILLING', 'Contact fournisseur facturation', 1); +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (112, 'supplier_proposal', 'external', 'SHIPPING', 'Contact fournisseur livraison', 1); +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (113, 'supplier_proposal', 'external', 'SERVICE', 'Contact fournisseur prestation', 1); + diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index c85c1ff9167..27449c9e9e9 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -368,4 +368,10 @@ ALTER TABLE llx_reception_extrafields ADD INDEX idx_reception_extrafields (fk_ob ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_projet integer DEFAULT NULL; ALTER TABLE llx_commande_fournisseur_dispatch ADD COLUMN fk_reception integer DEFAULT NULL; + + +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (110, 'supplier_proposal', 'internal', 'SALESREPFOLL', 'Responsable suivi de la demande', 1); +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (111, 'supplier_proposal', 'external', 'BILLING', 'Contact fournisseur facturation', 1); +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (112, 'supplier_proposal', 'external', 'SHIPPING', 'Contact fournisseur livraison', 1); +insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (113, 'supplier_proposal', 'external', 'SERVICE', 'Contact fournisseur prestation', 1); \ No newline at end of file From f3315bb8f59125c2b5f4fd84cd125766b8adddca Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 15:09:03 +0200 Subject: [PATCH 0465/1036] fix: bad sql request --- htdocs/compta/facture/card.php | 2 +- htdocs/projet/class/project.class.php | 1 + htdocs/projet/index.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index b7da8efec87..85b4e3bb728 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -4251,7 +4251,7 @@ elseif ($id > 0 || ! empty($ref)) $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank as b ON p.fk_bank = b.rowid'; $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank_account as ba ON b.fk_account = ba.rowid'; $sql .= ' WHERE pf.fk_facture = ' . $object->id . ' AND pf.fk_paiement = p.rowid'; - $sql .= ' AND p.entity IN (' . getEntity('invoice').') AND c.entity IN (' . getEntity('invoice').')'; + $sql .= ' AND p.entity IN (' . getEntity('invoice').')'; $sql .= ' ORDER BY p.datep, p.tms'; $result = $db->query($sql); diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 8ebe6f71425..31cd94e7bcf 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1229,6 +1229,7 @@ class Project extends CommonObject else dol_print_error($this->db); if (count($listofprojectcontacttype) == 0) $listofprojectcontacttype[0]='0'; // To avoid syntax error if not found + var_dump($mode); if ($mode == 0) { $sql.= " AND ec.element_id = p.rowid"; diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 0e15403e9cf..0cbc7e283c6 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -61,7 +61,7 @@ $formfile=new FormFile($db); $projectset = ($mine?$mine:(empty($user->rights->projet->all->lire)?0:2)); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, $projetset, 1); -//var_dump($projectsListId); +var_dump($projectsListId); llxHeader("", $langs->trans("Projects"), "EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos"); From f1aad766ca5e2905409ef7016c576711a32288b2 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 15:11:12 +0200 Subject: [PATCH 0466/1036] fix: bad sql request --- htdocs/projet/class/project.class.php | 1 - htdocs/projet/index.php | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 31cd94e7bcf..8ebe6f71425 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1229,7 +1229,6 @@ class Project extends CommonObject else dol_print_error($this->db); if (count($listofprojectcontacttype) == 0) $listofprojectcontacttype[0]='0'; // To avoid syntax error if not found - var_dump($mode); if ($mode == 0) { $sql.= " AND ec.element_id = p.rowid"; diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 0cbc7e283c6..fa77cb4b52c 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -61,8 +61,7 @@ $formfile=new FormFile($db); $projectset = ($mine?$mine:(empty($user->rights->projet->all->lire)?0:2)); $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, $projetset, 1); -var_dump($projectsListId); - +//var_dump($projectsListId); llxHeader("", $langs->trans("Projects"), "EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos"); From c519906c9e9b9a5a4cd7549f510eeea2eac90721 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 15:46:49 +0200 Subject: [PATCH 0467/1036] fix scrunitizer --- htdocs/resource/class/dolresource.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/resource/class/dolresource.class.php b/htdocs/resource/class/dolresource.class.php index 591a57f59f3..7adec8e6009 100644 --- a/htdocs/resource/class/dolresource.class.php +++ b/htdocs/resource/class/dolresource.class.php @@ -842,6 +842,8 @@ class Dolresource extends CommonObject */ public function getElementResources($element, $element_id, $resource_type = '') { + $resources=array(); + // Links beetween objects are stored in this table $sql = 'SELECT rowid, resource_id, resource_type, busy, mandatory'; $sql.= ' FROM '.MAIN_DB_PREFIX.'element_resources'; From f714b45efbb881bb74e8d8ab1ac64ff54412c849 Mon Sep 17 00:00:00 2001 From: ATM John BOTELLA Date: Sat, 18 May 2019 15:53:07 +0200 Subject: [PATCH 0468/1036] FIX scrutinizer feedback --- htdocs/core/lib/functions.lib.php | 2 ++ htdocs/core/lib/pdf.lib.php | 1 + htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php | 1 - htdocs/main.inc.php | 4 ++-- htdocs/product/class/product.class.php | 2 ++ 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 9b8232bb188..e0d129dfaa7 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -8017,6 +8017,8 @@ function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $st { global $conf; + $return = ''; + // image's filename are still in French $statusImg=array( 'status0' => 'statut0' diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index cc40fcb9272..14c0435b4ad 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -1374,6 +1374,7 @@ function pdf_getlinedesc($object, $i, $outputlangs, $hideref = 0, $hidedesc = 0, if (! empty($object->lines[$i]->date_start) || ! empty($object->lines[$i]->date_end)) { $format='day'; + $period = ''; // Show duration if exists if ($object->lines[$i]->date_start && $object->lines[$i]->date_end) { diff --git a/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php b/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php index cf71d691715..612595b8c44 100644 --- a/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php +++ b/htdocs/core/modules/supplier_order/pdf/pdf_cornas.modules.php @@ -1810,7 +1810,6 @@ class pdf_cornas extends ModelePDFSuppliersOrders global $hookmanager; $parameters=array( - 'object' => $object, 'curY' =>& $curY, 'columnText' => $columnText, 'colKey' => $colKey diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 4f7776a3150..b0036b01ed4 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1740,8 +1740,8 @@ function top_menu_user(User $user, Translate $langs) } else{ $nophoto='/public/theme/common/user_anonymous.png'; - if ($object->gender == 'man') $nophoto='/public/theme/common/user_man.png'; - if ($object->gender == 'woman') $nophoto='/public/theme/common/user_woman.png'; + if ($user->gender == 'man') $nophoto='/public/theme/common/user_man.png'; + if ($user->gender == 'woman') $nophoto='/public/theme/common/user_woman.png'; $userImage = 'No photo'; $userDropDownImage = 'No photo'; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 3796f5b022e..de0d28cee83 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -4155,6 +4155,8 @@ class Product extends CommonObject // phpcs:enable global $conf, $langs; + $labelstatut = $labelstatutShort = ''; + $langs->load('products'); if (! empty($conf->productbatch->enabled)) { $langs->load("productbatch"); } From 12a8008107c207c52634bd875155697653371754 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 16:18:14 +0200 Subject: [PATCH 0469/1036] scrunitizer --- htdocs/comm/action/class/actioncomm.class.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index ebe4e48f264..e63e0b91ac9 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -95,6 +95,20 @@ class ActionComm extends CommonObject */ public $datec; + /** + * Date end record (datec) + * + * @var integer + */ + public $datef; + + /** + * Duration (duree) + * + * @var integer + */ + public $duree; + /** * Date modification record (tms) * From ebe37df9db97903ab7e3c4eb9a1368b59a96573e Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 16:19:44 +0200 Subject: [PATCH 0470/1036] scrunitizer --- htdocs/comm/action/class/actioncomm.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index e63e0b91ac9..905b562ab5d 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -96,7 +96,7 @@ class ActionComm extends CommonObject public $datec; /** - * Date end record (datec) + * Date end record (datef) * * @var integer */ From b40eb92ce7ac61672b4447dad64ab46df3e1e4a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 16:25:45 +0200 Subject: [PATCH 0471/1036] Mass action for closing members --- ChangeLog | 1 + htdocs/adherents/list.php | 44 ++++++++++++++++++++++++++++++--- htdocs/langs/en_US/members.lang | 3 ++- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index b379c13036e..06f749cbc34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -112,6 +112,7 @@ NEW: When you create product or service, sell accountancy account by default is NEW: Widget birthdays of the month. NEW: Option in workflow module to set a reception billed on validate supplier bill. NEW: Autocompletion on lists should be available on mobile applications. +NEW: Add mass action to close several members. For Developers: NEW: Module "DebugBar" is available as a stable module. diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 0da7a2b0ea4..bf38b2ca5d8 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -189,6 +189,42 @@ if (empty($reshook)) $search_array_options=array(); } + // Close + if ($massaction == 'close' && $user->rights->adherent->creer) + { + $tmpmember = new Adherent($db); + $error=0; + $nbclose=0; + + $db->begin(); + + foreach($toselect as $idtoclose) + { + $tmpmember->fetch($idtoclose); + $result=$tmpmember->resiliate($user); + + if ($result < 0 && ! count($tmpmember->errors)) + { + setEventMessages($tmpmember->error, $tmpmember->errors, 'errors'); + } + else + { + if ($result > 0) $nbclose++; + } + } + + if (! $error) + { + setEventMessages($langs->trans("XMembersClosed", $nbclose), null, 'mesgs'); + + $db->commit(); + } + else + { + $db->rollback(); + } + } + // Mass actions $objectclass='Adherent'; $objectlabel='Members'; @@ -326,12 +362,11 @@ if ($search_type > 0) } $param=''; -if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; -if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; +if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); +if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); if ($sall != "") $param.="&sall=".urlencode($sall); if ($statut != "") $param.="&statut=".urlencode($statut); if ($search_ref) $param.="&search_ref=".urlencode($search_ref); -if ($search_nom) $param.="&search_nom=".urlencode($search_nom); if ($search_civility) $param.="&search_civility=".urlencode($search_civility); if ($search_firstname) $param.="&search_firstname=".urlencode($search_firstname); if ($search_lastname) $param.="&search_lastname=".urlencode($search_lastname); @@ -358,6 +393,7 @@ $arrayofmassactions = array( //'presend'=>$langs->trans("SendByMail"), //'builddoc'=>$langs->trans("PDFMerge"), ); +if ($user->rights->adherent->creer) $arrayofmassactions['close']=$langs->trans("Resiliate"); if ($user->rights->adherent->supprimer) $arrayofmassactions['predelete']=''.$langs->trans("Delete"); if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); $massactionbutton=$form->selectMassAction('', $arrayofmassactions); @@ -457,7 +493,7 @@ if (! empty($arrayfields['d.lastname']['checked'])) if (! empty($arrayfields['d.gender']['checked'])) { print ''; - $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman")); + $arraygender=array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman")); print $form->selectarray('search_gender', $arraygender, $search_gender, 1); print ''; } diff --git a/htdocs/langs/en_US/members.lang b/htdocs/langs/en_US/members.lang index 299edcbb714..8b33117cc66 100644 --- a/htdocs/langs/en_US/members.lang +++ b/htdocs/langs/en_US/members.lang @@ -196,4 +196,5 @@ EmailSentToMember=Email sent to member at %s SendReminderForExpiredSubscriptionTitle=Send reminder by email for expired subscription SendReminderForExpiredSubscription=Send reminder by email to members when subscription is about to expire (parameter is number of days before end of subscription to send the remind. It can be a list of days separated by a semicolon, for example '10;5;0;-5') MembershipPaid=Membership paid for current period (until %s) -YouMayFindYourInvoiceInThisEmail=You may find your invoice attached to this email \ No newline at end of file +YouMayFindYourInvoiceInThisEmail=You may find your invoice attached to this email +XMembersClosed=%s member(s) closed \ No newline at end of file From 1ad2c0980027e938f17c59e9474e1beaf57952ee Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 16:38:52 +0200 Subject: [PATCH 0472/1036] Fix size of popup --- htdocs/adherents/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 5d57208eb0e..85720de5156 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -1567,7 +1567,7 @@ else $formquestion=array(); if ($object->email) $formquestion[]=array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (! empty($conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL)?'true':'false')); if ($backtopage) $formquestion[]=array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"])); - print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ResiliateMember"), $langs->trans("ConfirmResiliateMember"), "confirm_resign", $formquestion, 'no', 1, 220); + print $form->formconfirm("card.php?rowid=".$id, $langs->trans("ResiliateMember"), $langs->trans("ConfirmResiliateMember"), "confirm_resign", $formquestion, 'no', 1, 240); } // Confirm remove member From e46481d837eb7c4733f913c5efe190efd4c3a2d0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 17:03:21 +0200 Subject: [PATCH 0473/1036] Fix phpcs --- htdocs/public/payment/newpayment.php | 56 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 51b4c0580e0..7eea7e45df6 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -1947,24 +1947,24 @@ if (preg_match('/^dopayment/', $action)) { print info_admin($langs->trans("ErrorModuleSetupNotComplete", "stripe"), 0, 0, 'error'); } - else + else { print ''."\n"; - + // Code to ask the credit card. This use the default "API version". No way to force API version when using JS code. print ''; } } From a9e96031de3261c7b1546b809e9e10a85e5d38f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 17:04:37 +0200 Subject: [PATCH 0474/1036] Fix phpcs --- htdocs/adherents/list.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 941ac829848..eaeb1fe305c 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -189,15 +189,15 @@ if (empty($reshook)) $search_array_options=array(); } - // Close + // Close if ($massaction == 'close' && $user->rights->adherent->creer) { $tmpmember = new Adherent($db); $error=0; $nbclose=0; - + $db->begin(); - + foreach($toselect as $idtoclose) { $tmpmember->fetch($idtoclose); @@ -216,7 +216,7 @@ if (empty($reshook)) if (! $error) { setEventMessages($langs->trans("XMembersClosed", $nbclose), null, 'mesgs'); - + $db->commit(); } else @@ -224,7 +224,7 @@ if (empty($reshook)) $db->rollback(); } } - + // Mass actions $objectclass='Adherent'; $objectlabel='Members'; From 28a4785b3a85e3b3516b47988f03190dfa90a5ea Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 16:39:58 +0200 Subject: [PATCH 0475/1036] Fix missing TOKEN --- htdocs/holiday/card.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index af6772828dc..9f3d17aea63 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -876,6 +876,7 @@ if ((empty($id) && empty($ref)) || $action == 'add' || $action == 'request' || $ // Formulaire de demande print '
'."\n"; + print ''."\n"; print ''."\n"; if (empty($conf->global->HOLIDAY_HIDE_BALANCE)) From ea1efa5e88462240a3d1100c1293a77c2d696966 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 16:40:14 +0200 Subject: [PATCH 0476/1036] Fix missing dashboard stats for holidays --- htdocs/holiday/class/holiday.class.php | 87 ++++++++++++++++++++++++++ htdocs/index.php | 18 +++++- 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index 84156b75e32..84d0d7ae1ed 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -2177,4 +2177,91 @@ class Holiday extends CommonObject $this->fk_type=1; $this->statut=Holiday::STATUS_VALIDATED; } + + /** + * Load this->nb for dashboard + * + * @return int <0 if KO, >0 if OK + */ + public function load_state_board() + { + global $conf; + + $this->nb=array(); + + $sql = "SELECT count(h.rowid) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."holiday as h"; + $sql.= " WHERE h.statut > 1"; + $sql.= " AND h.entity IN (".getEntity('holiday').")"; + + $resql=$this->db->query($sql); + if ($resql) { + while ($obj=$this->db->fetch_object($resql)) { + $this->nb["holidays"]=$obj->nb; + } + $this->db->free($resql); + return 1; + } + else + { + dol_print_error($this->db); + $this->error=$this->db->error(); + return -1; + } + } + + /** + * Load indicators for dashboard (this->nbtodo and this->nbtodolate) + * + * @param User $user Objet user + * @param string $option 'toapprove' + * @return WorkboardResponse|int <0 if KO, WorkboardResponse if OK + */ + public function load_board($user) + { + // phpcs:enable + global $conf, $langs; + + if ($user->societe_id) return -1; // protection pour eviter appel par utilisateur externe + + $now=dol_now(); + + $userchildids = $user->getAllChildIds(1); + + $sql = "SELECT h.rowid, h.date_debut"; + $sql.= " FROM ".MAIN_DB_PREFIX."holiday as h"; + $sql.= " WHERE h.statut = 2"; + $sql.= " AND h.entity IN (".getEntity('holiday').")"; + $sql.= " AND (h.fk_user IN (".join(',', $userchildids).")"; + $sql.= " OR h.fk_validator IN (".join(',', $userchildids)."))"; + + $resql=$this->db->query($sql); + if ($resql) + { + $langs->load("members"); + + $response = new WorkboardResponse(); + $response->warning_delay=$conf->holiday->approve->warning_delay/60/60/24; + $response->label=$langs->trans("HolidaysToApprove"); + $response->url=DOL_URL_ROOT.'/holiday/list.php?search_statut=2&leftmenu=hrm'; + $response->img=img_object('', "holiday"); + + while ($obj=$this->db->fetch_object($resql)) + { + $response->nbtodo++; + + if ($this->db->jdate($obj->date_debut) < ($now - $conf->holiday->approve->warning_delay)) { + $response->nbtodolate++; + } + } + + return $response; + } + else + { + dol_print_error($this->db); + $this->error=$this->db->error(); + return -1; + } + } } diff --git a/htdocs/index.php b/htdocs/index.php index 81503139d88..ca3d22afd85 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -150,6 +150,7 @@ if (empty($user->societe_id)) ! empty($conf->supplier_proposal->enabled) && $user->rights->supplier_proposal->lire && empty($conf->global->SOCIETE_DISABLE_SUPPLIERS_PROPOSAL_STATS), ! empty($conf->projet->enabled) && $user->rights->projet->lire, ! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire, + ! empty($conf->holiday->enabled) && $user->rights->holiday->read, ! empty($conf->don->enabled) && $user->rights->don->lire ); // Class file containing the method load_state_board for each line @@ -172,6 +173,7 @@ if (empty($user->societe_id)) DOL_DOCUMENT_ROOT."/supplier_proposal/class/supplier_proposal.class.php", DOL_DOCUMENT_ROOT."/projet/class/project.class.php", DOL_DOCUMENT_ROOT."/expensereport/class/expensereport.class.php", + DOL_DOCUMENT_ROOT."/holiday/class/holiday.class.php", DOL_DOCUMENT_ROOT."/don/class/don.class.php" ); // Name class containing the method load_state_board for each line @@ -193,6 +195,7 @@ if (empty($user->societe_id)) 'SupplierProposal', 'Project', 'ExpenseReport', + 'Holiday', 'Don' ); // Cle array returned by the method load_state_board for each line @@ -203,7 +206,7 @@ if (empty($user->societe_id)) 'contacts', 'members', 'products', - 'services', + 'services', 'proposals', 'orders', 'invoices', @@ -214,6 +217,7 @@ if (empty($user->societe_id)) 'askprice', 'projects', 'expensereports', + 'holidays', 'donations' ); // Dashboard Icon lines @@ -235,6 +239,7 @@ if (empty($user->societe_id)) 'propal', 'projectpub', 'trip', + 'holiday', 'generic' ); // Translation keyword @@ -256,6 +261,7 @@ if (empty($user->societe_id)) "SupplierProposalShort", "Projects", "ExpenseReports", + "Holidays", "Donations" ); // Dashboard Link lines @@ -278,6 +284,7 @@ if (empty($user->societe_id)) DOL_URL_ROOT.'/supplier_proposal/list.php?mainmenu=commercial&leftmenu=', DOL_URL_ROOT.'/projet/list.php?mainmenu=project', DOL_URL_ROOT.'/expensereport/list.php?mainmenu=hrm&leftmenu=expensereport', + DOL_URL_ROOT.'/holiday/list.php?mainmenu=hrm&leftmenu=holiday', DOL_URL_ROOT.'/don/list.php?leftmenu=donations' ); // Translation lang files @@ -299,6 +306,7 @@ if (empty($user->societe_id)) "supplier_proposal", "projects", "trips", + "holidays", "donations" ); @@ -496,6 +504,14 @@ if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->to_p $dashboardlines[] = $board->load_board($user,'topay'); } +// Number of holidays to approve +if (! empty($conf->holiday->enabled) && $user->rights->holiday->approve) +{ + include_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php'; + $board=new Holiday($db); + $dashboardlines[] = $board->load_board($user); +} + $object=new stdClass(); $parameters=array(); $action=''; From 6c195d7bdf1481f28c96184dd21dc232514972b8 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 16:54:40 +0200 Subject: [PATCH 0477/1036] Add warning delay for holidays --- htdocs/admin/delais.php | 6 ++++++ htdocs/core/class/conf.class.php | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/htdocs/admin/delais.php b/htdocs/admin/delais.php index a48be10b4e0..8632b199d39 100644 --- a/htdocs/admin/delais.php +++ b/htdocs/admin/delais.php @@ -120,6 +120,12 @@ $modules=array( 'img' => 'trip' )*/ ), + 'holiday' => array( + array( + 'code' => 'MAIN_DELAY_HOLIDAYS', + 'img' => 'holiday' + ), + ), ); $labelmeteo = array(0=>$langs->trans("No"), 1=>$langs->trans("Yes"), 2=>$langs->trans("OnMobileOnly")); diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 35705b661d9..f8345f3aaf4 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -615,6 +615,10 @@ class Conf $this->expensereport->payment = new stdClass(); $this->expensereport->payment->warning_delay=(isset($this->global->MAIN_DELAY_EXPENSEREPORTS_TO_PAY)?$this->global->MAIN_DELAY_EXPENSEREPORTS_TO_PAY:0)*24*60*60; } + if (isset($this->holiday)) { + $this->holiday->approve = new stdClass(); + $this->holiday->approve->warning_delay=(isset($this->global->MAIN_DELAY_HOLIDAYS)?$this->global->MAIN_DELAY_HOLIDAYS:0)*24*60*60; + } if (! empty($this->global->PRODUIT_MULTIPRICES) && empty($this->global->PRODUIT_MULTIPRICES_LIMIT)) { From ea4dcbc77a213df8c3a398c3bd28a025f91804fe Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 17:04:24 +0200 Subject: [PATCH 0478/1036] Add translation --- htdocs/langs/en_US/holiday.lang | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/holiday.lang b/htdocs/langs/en_US/holiday.lang index 2fad3d02a7f..c3cdda3cfd6 100644 --- a/htdocs/langs/en_US/holiday.lang +++ b/htdocs/langs/en_US/holiday.lang @@ -126,4 +126,5 @@ HolidaySetup=Setup of module Holiday HolidaysNumberingModules=Leave requests numbering models TemplatePDFHolidays=Template for leave requests PDF FreeLegalTextOnHolidays=Free text on PDF -WatermarkOnDraftHolidayCards=Watermarks on draft leave requests \ No newline at end of file +WatermarkOnDraftHolidayCards=Watermarks on draft leave requests +HolidaysToApprove=Holidays to approve \ No newline at end of file From 4f64250ad670517d315cc4a3d799f78d46ad5a4d Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sat, 18 May 2019 17:12:25 +0200 Subject: [PATCH 0479/1036] Fix menu links for holidays --- htdocs/core/menus/standard/eldy.lib.php | 28 ++++++++++++------------- htdocs/holiday/class/holiday.class.php | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 11ef4a474df..2d4a5c7f4c1 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1439,9 +1439,9 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu { $langs->load("hrm"); - $newmenu->add("/user/list.php?leftmenu=hrm&mode=employee", $langs->trans("Employees"), 0, $user->rights->hrm->employee->read, '', $mainmenu, 'hrm'); - $newmenu->add("/user/card.php?action=create&employee=1", $langs->trans("NewEmployee"), 1,$user->rights->hrm->employee->write); - $newmenu->add("/user/list.php?leftmenu=hrm&mode=employee&contextpage=employeelist", $langs->trans("List"), 1,$user->rights->hrm->employee->read); + $newmenu->add("/user/list.php?mainmenu=hrm&mode=employee", $langs->trans("Employees"), 0, $user->rights->hrm->employee->read, '', $mainmenu, 'hrm'); + $newmenu->add("/user/card.php?mainmenu=hrm&action=create&employee=1", $langs->trans("NewEmployee"), 1,$user->rights->hrm->employee->write); + $newmenu->add("/user/list.php?mainmenu=hrm&mode=employee&contextpage=employeelist", $langs->trans("List"), 1,$user->rights->hrm->employee->read); } // Leave/Holiday/Vacation module @@ -1450,17 +1450,17 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu // Load translation files required by the page $langs->loadLangs(array("holiday","trips")); - $newmenu->add("/holiday/list.php?leftmenu=hrm", $langs->trans("CPTitreMenu"), 0, $user->rights->holiday->read, '', $mainmenu, 'hrm'); - $newmenu->add("/holiday/card.php?action=request", $langs->trans("New"), 1,$user->rights->holiday->write); - $newmenu->add("/holiday/list.php?leftmenu=hrm", $langs->trans("List"), 1,$user->rights->holiday->read); - if ($usemenuhider || empty($leftmenu) || $leftmenu=="hrm") $newmenu->add("/holiday/list.php?search_statut=1&leftmenu=hrm", $langs->trans("DraftCP"), 2, $user->rights->holiday->read); - if ($usemenuhider || empty($leftmenu) || $leftmenu=="hrm") $newmenu->add("/holiday/list.php?search_statut=2&leftmenu=hrm", $langs->trans("ToReviewCP"), 2, $user->rights->holiday->read); - if ($usemenuhider || empty($leftmenu) || $leftmenu=="hrm") $newmenu->add("/holiday/list.php?search_statut=3&leftmenu=hrm", $langs->trans("ApprovedCP"), 2, $user->rights->holiday->read); - if ($usemenuhider || empty($leftmenu) || $leftmenu=="hrm") $newmenu->add("/holiday/list.php?search_statut=4&leftmenu=hrm", $langs->trans("CancelCP"), 2, $user->rights->holiday->read); - if ($usemenuhider || empty($leftmenu) || $leftmenu=="hrm") $newmenu->add("/holiday/list.php?search_statut=5&leftmenu=hrm", $langs->trans("RefuseCP"), 2, $user->rights->holiday->read); - $newmenu->add("/holiday/define_holiday.php?action=request", $langs->trans("MenuConfCP"), 1, $user->rights->holiday->read); - $newmenu->add("/holiday/month_report.php", $langs->trans("MenuReportMonth"), 1, $user->rights->holiday->read_all); - $newmenu->add("/holiday/view_log.php?action=request", $langs->trans("MenuLogCP"), 1, $user->rights->holiday->define_holiday); + $newmenu->add("/holiday/list.php?mainmenu=hrm&leftmenu=holiday", $langs->trans("CPTitreMenu"), 0, $user->rights->holiday->read, '', $mainmenu, 'hrm'); + $newmenu->add("/holiday/card.php?mainmenu=hrm&leftmenu=holiday&action=request", $langs->trans("New"), 1,$user->rights->holiday->write); + $newmenu->add("/holiday/list.php?mainmenu=hrm&leftmenu=holiday", $langs->trans("List"), 1,$user->rights->holiday->read); + if ($usemenuhider || empty($leftmenu) || $leftmenu=="holiday") $newmenu->add("/holiday/list.php?search_statut=1&mainmenu=hrm&leftmenu=holiday", $langs->trans("DraftCP"), 2, $user->rights->holiday->read); + if ($usemenuhider || empty($leftmenu) || $leftmenu=="holiday") $newmenu->add("/holiday/list.php?search_statut=2&mainmenu=hrm&leftmenu=holiday", $langs->trans("ToReviewCP"), 2, $user->rights->holiday->read); + if ($usemenuhider || empty($leftmenu) || $leftmenu=="holiday") $newmenu->add("/holiday/list.php?search_statut=3&mainmenu=hrm&leftmenu=holiday", $langs->trans("ApprovedCP"), 2, $user->rights->holiday->read); + if ($usemenuhider || empty($leftmenu) || $leftmenu=="holiday") $newmenu->add("/holiday/list.php?search_statut=4&mainmenu=hrm&leftmenu=holiday", $langs->trans("CancelCP"), 2, $user->rights->holiday->read); + if ($usemenuhider || empty($leftmenu) || $leftmenu=="holiday") $newmenu->add("/holiday/list.php?search_statut=5&mainmenu=hrm&leftmenu=holiday", $langs->trans("RefuseCP"), 2, $user->rights->holiday->read); + $newmenu->add("/holiday/define_holiday.php?mainmenu=hrm&leftmenu=holiday&action=request", $langs->trans("MenuConfCP"), 1, $user->rights->holiday->read); + $newmenu->add("/holiday/month_report.php?mainmenu=hrm&leftmenu=holiday", $langs->trans("MenuReportMonth"), 1, $user->rights->holiday->read_all); + $newmenu->add("/holiday/view_log.php?mainmenu=hrm&leftmenu=holiday&action=request", $langs->trans("MenuLogCP"), 1, $user->rights->holiday->define_holiday); } // Trips and expenses (old module) diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index 84d0d7ae1ed..d09bbda3cf8 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -2243,7 +2243,7 @@ class Holiday extends CommonObject $response = new WorkboardResponse(); $response->warning_delay=$conf->holiday->approve->warning_delay/60/60/24; $response->label=$langs->trans("HolidaysToApprove"); - $response->url=DOL_URL_ROOT.'/holiday/list.php?search_statut=2&leftmenu=hrm'; + $response->url=DOL_URL_ROOT.'/holiday/list.php?search_statut=2&mainmenu=hrm&leftmenu=holiday'; $response->img=img_object('', "holiday"); while ($obj=$this->db->fetch_object($resql)) From 0787eee9b8d3e927e6808a74fef98efd3e07e8bc Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 18:42:46 +0200 Subject: [PATCH 0480/1036] fix :email collector for event creation --- htdocs/contact/class/contact.class.php | 4 ++-- htdocs/emailcollector/class/emailcollector.class.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index d350c8b3ff3..dfefb8060fe 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -698,9 +698,9 @@ class Contact extends CommonObject $langs->load("dict"); - dol_syslog(get_class($this)."::fetch id=".$id, LOG_DEBUG); + dol_syslog(get_class($this) . "::fetch id=" . $id . " ref_ext=" . $ref_ext . " email=" . $email, LOG_DEBUG); - if (empty($id) && empty($ref_ext)) + if (empty($id) && empty($ref_ext) && empty($email)) { $this->error='BadParameter'; return -1; diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index e52b1bf156e..f60051df970 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -1287,13 +1287,14 @@ class EmailCollector extends CommonObject if (empty($contactid)) // Try to find contact using email { $result = $contactstatic->fetch(0, null, '', $from); + if ($result > 0) { $contactid = $contactstatic->id; $contactfoundby = 'email of contact ('.$from.')'; - if ($contactstatic->fk_soc > 0) + if ($contactstatic->socid > 0) { - $result = $thirdpartystatic->fetch($contactstatic->fk_soc); + $result = $thirdpartystatic->fetch($contactstatic->socid); if ($result > 0) { $thirdpartyid = $thirdpartystatic->id; @@ -1309,7 +1310,6 @@ class EmailCollector extends CommonObject if ($result > 0) $thirdpartyfoundby = 'email ('.$from.')'; } - // Do operations foreach($this->actions as $operation) { @@ -1492,7 +1492,6 @@ class EmailCollector extends CommonObject // Insert record of emails sent $actioncomm = new ActionComm($this->db); - $actioncomm->type_code = 'AC_OTH_AUTO'; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...) $actioncomm->code = 'AC_'.$actioncode; $actioncomm->label = $langs->trans("ActionAC_".$actioncode).' - '.$langs->trans("MailFrom").' '.$from; @@ -1503,6 +1502,7 @@ class EmailCollector extends CommonObject $actioncomm->percentage = -1; // Not applicable $actioncomm->socid = $thirdpartystatic->id; $actioncomm->contactid = $contactstatic->id; + $actioncomm->socpeopleassigned = (!empty($contactstatic->id) ? array($contactstatic->id => '') : array()); $actioncomm->authorid = $user->id; // User saving action $actioncomm->userownerid = $user->id; // Owner of action // Fields when action is an email (content should be added into note) From bdd4f3e2973ec48a3d4d51286959383fdecb1e48 Mon Sep 17 00:00:00 2001 From: ATM John BOTELLA Date: Sat, 18 May 2019 18:59:55 +0200 Subject: [PATCH 0481/1036] add css for html5 ::invalid pseudo element --- htdocs/theme/eldy/global.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index c1167524bf5..3ab314a5321 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -95,6 +95,10 @@ input.button.massactionconfirmed { margin: 4px; } +input:invalid, select:invalid { + border-color: #ea1212; +} + /* Focus definitions must be after standard definition */ textarea:focus { /* v6 box-shadow: 0 0 4px #8091BF; */ From 4517d84e3a769e91691f7ee4c1f70a2386e2f52c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 19:22:17 +0200 Subject: [PATCH 0482/1036] FIX Disable a module --- htdocs/core/lib/admin.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 243e943143e..82769eb6238 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1044,9 +1044,9 @@ function unActivateModule($value, $requiredby = 1) $result=$objMod->remove(); if ($result <= 0) $ret=$objMod->error; } - else + else // We come here when we try to unactivate a module when module does not exists anymore in sources { - //print $dir.$modFile; + //print $dir.$modFile;exit; // TODO Replace this after DolibarrModules is moved as abstract class with a try catch to show module we try to disable has not been found or could not be loaded include_once DOL_DOCUMENT_ROOT.'/core/modules/DolibarrModules.class.php'; $genericMod = new DolibarrModules($db); @@ -1054,7 +1054,7 @@ function unActivateModule($value, $requiredby = 1) $genericMod->rights_class=strtolower(preg_replace('/^mod/i', '', $modName)); $genericMod->const_name='MAIN_MODULE_'.strtoupper(preg_replace('/^mod/i', '', $modName)); dol_syslog("modules::unActivateModule Failed to find module file, we use generic function with name " . $modName); - $genericMod->_remove(array()); + $genericMod->remove(''); } // Desactivation des modules qui dependent de lui From 41cb13b1cc095e24f3de663989ea628e2e410ef4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 19:28:14 +0200 Subject: [PATCH 0483/1036] Fix warning --- htdocs/core/lib/admin.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 82769eb6238..6635220cc23 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1057,8 +1057,8 @@ function unActivateModule($value, $requiredby = 1) $genericMod->remove(''); } - // Desactivation des modules qui dependent de lui - if (! $ret && $requiredby) + // Disable modules that depends on module we disable + if (! $ret && $requiredby && is_object($objMod) && is_array($objMod->requiredby)) { $countrb=count($objMod->requiredby); for ($i = 0; $i < $countrb; $i++) From 9b805f742b577fb26360fe3d83dec348ccdbcd5c Mon Sep 17 00:00:00 2001 From: ATM-Marc Date: Sat, 18 May 2019 20:09:00 +0200 Subject: [PATCH 0484/1036] FIX: modulebuilder: hardcoded llx_ --- htdocs/modulebuilder/template/class/myobject.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 12f31439985..7593d0c550e 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -90,7 +90,7 @@ class MyObject extends CommonObject 'date_creation' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>500), 'tms' =>array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>501), //'date_valid' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>502), - 'fk_user_creat' =>array('type'=>'integer', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>510, 'foreignkey'=>'llx_user.rowid'), + 'fk_user_creat' =>array('type'=>'integer', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-2, 'notnull'=>1, 'position'=>510, 'foreignkey'=>'user.rowid'), 'fk_user_modif' =>array('type'=>'integer', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'position'=>511), //'fk_user_valid' =>array('type'=>'integer', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>512), 'import_key' =>array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'notnull'=>-1, 'index'=>0, 'position'=>1000), From 3e3ed6f9e7b897b84d39c28b2083a134ac1a1977 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 20:11:51 +0200 Subject: [PATCH 0485/1036] Fix phpcs --- htdocs/holiday/class/holiday.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index d09bbda3cf8..b226be03cf7 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -2178,15 +2178,15 @@ class Holiday extends CommonObject $this->statut=Holiday::STATUS_VALIDATED; } - /** + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + /** * Load this->nb for dashboard * * @return int <0 if KO, >0 if OK */ public function load_state_board() { - global $conf; - + // phpcs:enable $this->nb=array(); $sql = "SELECT count(h.rowid) as nb"; @@ -2210,11 +2210,11 @@ class Holiday extends CommonObject } } + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps /** * Load indicators for dashboard (this->nbtodo and this->nbtodolate) * * @param User $user Objet user - * @param string $option 'toapprove' * @return WorkboardResponse|int <0 if KO, WorkboardResponse if OK */ public function load_board($user) From c3dbbe51cf779cd1bcf1ea5db5f64ff9743f1a11 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sat, 18 May 2019 23:57:00 +0200 Subject: [PATCH 0486/1036] fix missing migration sql for ticket now stable on 10 --- .../install/mysql/migration/9.0.0-10.0.0.sql | 3 ++- .../tables/llx_ticket_extrafields.key.sql | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 htdocs/install/mysql/tables/llx_ticket_extrafields.key.sql diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 27449c9e9e9..035cd0d48c5 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -374,4 +374,5 @@ insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) v insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (111, 'supplier_proposal', 'external', 'BILLING', 'Contact fournisseur facturation', 1); insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (112, 'supplier_proposal', 'external', 'SHIPPING', 'Contact fournisseur livraison', 1); insert into llx_c_type_contact(rowid, element, source, code, libelle, active ) values (113, 'supplier_proposal', 'external', 'SERVICE', 'Contact fournisseur prestation', 1); - \ No newline at end of file + +ALTER TABLE llx_ticket_extrafields ADD INDEX idx_ticket_extrafields (fk_object); diff --git a/htdocs/install/mysql/tables/llx_ticket_extrafields.key.sql b/htdocs/install/mysql/tables/llx_ticket_extrafields.key.sql new file mode 100644 index 00000000000..3baba56d9d4 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_ticket_extrafields.key.sql @@ -0,0 +1,23 @@ +-- =================================================================== +-- Copyright (C) 2002-2003 Rodolphe Quiedeville +-- Copyright (C) 2002-2003 Jean-Louis Bergamo +-- Copyright (C) 2009 Regis Houssin +-- Copyright (C) 2011 Laurent Destailleur +-- +-- 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 . +-- +-- =================================================================== + + +ALTER TABLE llx_ticket_extrafields ADD INDEX idx_ticket_extrafields (fk_object); From 1d980342ec6929516e0ab977477969cd181de22f Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Sun, 19 May 2019 00:05:23 +0200 Subject: [PATCH 0487/1036] Fix #8344 --- htdocs/core/lib/functions2.lib.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index dc223f58ec3..c229a26ec3c 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -1244,6 +1244,10 @@ function check_value($mask,$value) if (! empty($reg[3]) && preg_match('/^@/',$reg[3])) $maskraz=preg_replace('/^@/','',$reg[3]); if ($maskraz >= 0) { + if ($maskraz == 99) { + $maskraz = date('m'); + $resetEveryMonth = true; + } if ($maskraz > 12) return 'ErrorBadMaskBadRazMonth'; // Define reg From 83c38570e9d7deddfa8f05db3c0534c7b5f4d41a Mon Sep 17 00:00:00 2001 From: ATM-Marc Date: Sun, 19 May 2019 01:01:21 +0200 Subject: [PATCH 0488/1036] FIX: invoice class: bad SQL request if product type not set --- htdocs/compta/facture/class/facture.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index d303e6edf21..2d78b95990f 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -4492,7 +4492,7 @@ class FactureLigne extends CommonInvoiceLine $sql.= " '".$this->db->escape($this->localtax1_type)."',"; $sql.= " '".$this->db->escape($this->localtax2_type)."',"; $sql.= ' '.(! empty($this->fk_product)?$this->fk_product:"null").','; - $sql.= " ".$this->product_type.","; + $sql.= " '".$this->product_type."',"; $sql.= " ".price2num($this->remise_percent).","; $sql.= " ".price2num($this->subprice).","; $sql.= ' '.(! empty($this->fk_remise_except)?$this->fk_remise_except:"null").','; From c6ccb92a51f77b6f11a3b3e92a433d0b0f352403 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 01:41:42 +0200 Subject: [PATCH 0489/1036] Fix table shown when there is no perm Fix edit admin status of another admin --- htdocs/comm/propal/card.php | 16 ++++-- .../modulebuilder/template/myobject_card.php | 54 +++++++++++++++++++ htdocs/user/card.php | 4 +- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index abed072bc2c..4950efb19ab 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -2421,10 +2421,15 @@ $formquestion = array_merge($formquestion, array( } print '
'; - print ''; + if (! empty($object->lines) || ($object->statut == Propal::STATUS_DRAFT && $usercancreate && $action != 'selectlines' && $action != 'editline')) + { + print '
'; + } if (! empty($object->lines)) + { $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + } // Form to add new line if ($object->statut == Propal::STATUS_DRAFT && $usercancreate && $action != 'selectlines') @@ -2439,16 +2444,21 @@ $formquestion = array_merge($formquestion, array( } } - print '
'; + if (! empty($object->lines) || ($object->statut == Propal::STATUS_DRAFT && $usercancreate && $action != 'selectlines' && $action != 'editline')) + { + print ''; + } print '
'; print "\n"; dol_fiche_end(); + /* - * Boutons Actions + * Button Actions */ + if ($action != 'presend') { print '
'; diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index 212e86ca93c..e5223c86608 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -361,6 +361,60 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea dol_fiche_end(); + /* + * Lines + */ + + if (! empty($object->table_element_line)) + { + // Show object lines + $result = $object->getLinesArray(); + + print '
+ + + + + '; + + if (! empty($conf->use_javascript_ajax) && $object->status == 0) { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } + + print '
'; + if (! empty($object->lines) && $object->status == 0 && $permissiontoadd && $action != 'selectlines' && $action != 'editline') + { + print ''; + } + + if (! empty($object->lines)) + { + $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + } + + // Form to add new line + if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') + { + if ($action != 'editline') + { + // Add products/services form + $object->formAddObjectLine(1, $mysoc, $soc); + + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + } + } + + if (! empty($object->lines) && $object->status == 0 && $permissiontoadd && $action != 'selectlines' && $action != 'editline') + { + print '
'; + } + print '
'; + + print "
\n"; + } + + // Buttons for actions if ($action != 'presend' && $action != 'editline') { print '
'."\n"; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 926cb50836e..a86a4a428f0 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -2123,7 +2123,7 @@ else && ($user->id != $object->id) // Don't downgrade ourself && ( (empty($conf->multicompany->enabled) && $nbAdmin >= 1) - || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone + || (! empty($conf->multicompany->enabled) && (($object->entity > 0 || ($user->entity == 0 && $object->entity == 0)) || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone ) ) { @@ -2543,7 +2543,7 @@ else if (empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity) { print "".''.$langs->trans("Entity").''; - print "".$mc->select_entities($object->entity, 'entity', '', 0, 1); // last parameter 1 means, show also a choice 0=>'all entities' + print "".$mc->select_entities($object->entity, 'entity', '', 0, 1, false, false, 1); // last parameter 1 means, show also a choice 0=>'all entities' print "\n"; } else From 32485c27828e39810793b3f8c1e7cd103b6a8a49 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 01:45:33 +0200 Subject: [PATCH 0490/1036] Fix phpcs --- htdocs/holiday/class/holiday.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index b226be03cf7..ca31d84f48b 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -2178,7 +2178,7 @@ class Holiday extends CommonObject $this->statut=Holiday::STATUS_VALIDATED; } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Load this->nb for dashboard * @@ -2210,7 +2210,7 @@ class Holiday extends CommonObject } } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** * Load indicators for dashboard (this->nbtodo and this->nbtodolate) * From 7f8c11846683845f6736da82f02cac5d20fa8e4e Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sun, 19 May 2019 01:52:50 +0200 Subject: [PATCH 0491/1036] fix: #11015 --- htdocs/compta/cashcontrol/report.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/cashcontrol/report.php b/htdocs/compta/cashcontrol/report.php index 04ff015a498..6584af5db98 100644 --- a/htdocs/compta/cashcontrol/report.php +++ b/htdocs/compta/cashcontrol/report.php @@ -41,7 +41,7 @@ include_once 'class/cashcontrol.class.php'; $cashcontrol= new CashControl($db); $cashcontrol->fetch($id); -$limit = GETPOST('limit')?GETPOST('limit', 'int'):$conf->liste_limit; +//$limit = GETPOST('limit')?GETPOST('limit', 'int'):$conf->liste_limit; $sortorder='ASC'; $sortfield='b.datev,b.dateo,b.rowid'; @@ -152,7 +152,7 @@ if ($resql) $cash=$bank=$cheque=$other=0; $totalarray=array(); - while ($i < min($num, $limit)) + while ($i < $num) { $objp = $db->fetch_object($resql); From 2fd3eb8bdf2f2810d117915cecb14f210ef5783c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 01:58:01 +0200 Subject: [PATCH 0492/1036] Update facture.class.php --- htdocs/compta/facture/class/facture.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 2d78b95990f..93f67a5a064 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -4492,7 +4492,7 @@ class FactureLigne extends CommonInvoiceLine $sql.= " '".$this->db->escape($this->localtax1_type)."',"; $sql.= " '".$this->db->escape($this->localtax2_type)."',"; $sql.= ' '.(! empty($this->fk_product)?$this->fk_product:"null").','; - $sql.= " '".$this->product_type."',"; + $sql.= " ".((int) $this->product_type).","; $sql.= " ".price2num($this->remise_percent).","; $sql.= " ".price2num($this->subprice).","; $sql.= ' '.(! empty($this->fk_remise_except)?$this->fk_remise_except:"null").','; From 4311a1ece8ae08226ae6d2bab94a3b2b0fede48f Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sun, 19 May 2019 01:58:20 +0200 Subject: [PATCH 0493/1036] fix: #11187 --- htdocs/projet/class/project.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index e63cbe80fee..9caa873f170 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -537,7 +537,7 @@ class Project extends CommonObject } elseif ($type == 'project_task') { - $sql = "SELECT DISTINCT pt.rowid FROM " . MAIN_DB_PREFIX . "projet_task as pt, " . MAIN_DB_PREFIX . "projet_task_time as ptt WHERE pt.rowid = ptt.fk_task AND pt.fk_projet IN (". $ids .")"; + $sql = "SELECT DISTINCT pt.rowid FROM " . MAIN_DB_PREFIX . "projet_task as pt WHERE pt.fk_projet IN (". $ids .")"; } elseif ($type == 'project_task_time') // Case we want to duplicate line foreach user { From e4d87ab2e7c1bdb09f9d7a302f621547ae37dd8f Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Sun, 19 May 2019 02:05:13 +0200 Subject: [PATCH 0494/1036] fix: #11189 --- htdocs/core/class/extrafields.class.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index f8ae333935e..b3c257bfaaa 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1194,13 +1194,14 @@ class ExtraFields if ($value == $obj->rowid) { - foreach ($fields_label as $field_toshow) - { - $translabel=$langs->trans($obj->$field_toshow); - if ($translabel!=$obj->$field_toshow) { - $labeltoshow=dol_trunc($translabel,18).' '; - }else { - $labeltoshow=dol_trunc($obj->$field_toshow,18).' '; + if (! $notrans) { + foreach ($fields_label as $field_toshow) { + $translabel = $langs->trans($obj->$field_toshow); + if ($translabel != $obj->$field_toshow) { + $labeltoshow = dol_trunc($translabel, 18) . ' '; + } else { + $labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' '; + } } } $out.=''; From 61c17f8d0fc32b0d12a020bedbe4cb49c60aaa78 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Sun, 19 May 2019 02:06:37 +0200 Subject: [PATCH 0495/1036] FIX #11135 --- htdocs/user/class/user.class.php | 8 ++++++-- htdocs/user/passwordforgotten.php | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 13ae44463d6..923542a08f6 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1961,17 +1961,21 @@ class User extends CommonObject $mesg = ''; $outputlangs=new Translate("", $conf); + if (isset($this->conf->MAIN_LANG_DEFAULT) && $this->conf->MAIN_LANG_DEFAULT != 'auto') { // If user has defined its own language (rare because in most cases, auto is used) $outputlangs->getDefaultLang($this->conf->MAIN_LANG_DEFAULT); } + if($user->conf->MAIN_LANG_DEFAULT){ + $outputlangs->setDefaultLang($user->conf->MAIN_LANG_DEFAULT); + } else { // If user has not defined its own language, we used current language $outputlangs=$langs; } - // Load translation files required by the page + // Load translation files required by the page $outputlangs->loadLangs(array("main", "errors", "users", "other")); $appli=constant('DOL_APPLICATION_TITLE'); @@ -1986,7 +1990,6 @@ class User extends CommonObject if (! $changelater) { $url = $urlwithroot.'/'; - $mesg.= $outputlangs->transnoentitiesnoconv("RequestToResetPasswordReceived").".\n"; $mesg.= $outputlangs->transnoentitiesnoconv("NewKeyIs")." :\n\n"; $mesg.= $outputlangs->transnoentitiesnoconv("Login")." = ".$this->login."\n"; @@ -2015,6 +2018,7 @@ class User extends CommonObject dol_syslog(get_class($this)."::send_password changelater is on, url=".$url); } + $mesg.="
".print_r($user,1)."
"; $mailfile = new CMailFile( $subject, $this->email, diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index e16c4856eba..2bd69799487 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -125,8 +125,9 @@ if ($action == 'buildnewpassword' && $username) } else { + // Success - if ($edituser->send_password($user, $newpassword, 1) > 0) + if ($edituser->send_password($edituser, $newpassword, 1) > 0) { $message = '
'.$langs->trans("PasswordChangeRequestSent", $edituser->login, dolObfuscateEmail($edituser->email)).'
'; From 4b3d0ed50cf671835e0d0fafc9efa95f8feb9c3a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 02:21:42 +0200 Subject: [PATCH 0496/1036] Update user.class.php --- htdocs/user/class/user.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 923542a08f6..34651304b95 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2018,7 +2018,6 @@ class User extends CommonObject dol_syslog(get_class($this)."::send_password changelater is on, url=".$url); } - $mesg.="
".print_r($user,1)."
"; $mailfile = new CMailFile( $subject, $this->email, From 19085ed200d89ee974d18afae0e1ce4d07d37fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:08:59 +0200 Subject: [PATCH 0497/1036] dol_print_object_info return void --- htdocs/bom/bom_agenda.php | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php index a1db711dd3e..a4bf134e3ce 100644 --- a/htdocs/bom/bom_agenda.php +++ b/htdocs/bom/bom_agenda.php @@ -23,25 +23,12 @@ */ // Load Dolibarr environment -$res=0; -// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) -if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; -// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME -$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1; -while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; } -if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include substr($tmp, 0, ($i+1))."/main.inc.php"; -if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include dirname(substr($tmp, 0, ($i+1)))."/main.inc.php"; -// Try main.inc.php using relative path -if (! $res && file_exists("../main.inc.php")) $res=@include "../main.inc.php"; -if (! $res && file_exists("../../main.inc.php")) $res=@include "../../main.inc.php"; -if (! $res && file_exists("../../../main.inc.php")) $res=@include "../../../main.inc.php"; -if (! $res) die("Include of main fails"); - +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -dol_include_once('/bom/class/bom.class.php'); -dol_include_once('/bom/lib/bom.lib.php'); +require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php'; +require_once DOL_DOCUMENT_ROOT.'/bom/lib/bom.lib.php'; // Load translation files required by the page @@ -196,7 +183,7 @@ if ($object->id > 0) print '
'; $object->info($object->id); - print dol_print_object_info($object, 1); + dol_print_object_info($object, 1); print '
'; From 06421c200dbba9e4d79bb2c91f889734bd9c6b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:13:46 +0200 Subject: [PATCH 0498/1036] Update agenda.php --- htdocs/adherents/agenda.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/agenda.php b/htdocs/adherents/agenda.php index 5b2c3e912dd..105251ec114 100644 --- a/htdocs/adherents/agenda.php +++ b/htdocs/adherents/agenda.php @@ -137,7 +137,7 @@ if ($object->id > 0) print '
'; $object->info($id); - print dol_print_object_info($object, 1); + dol_print_object_info($object, 1); print '
'; From 7d66cc1ab1bd0a4905515d36edfec5b4126e119c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:14:29 +0200 Subject: [PATCH 0499/1036] Update agenda.php --- htdocs/societe/agenda.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/agenda.php b/htdocs/societe/agenda.php index 2bf407ec88d..a9283f6e236 100644 --- a/htdocs/societe/agenda.php +++ b/htdocs/societe/agenda.php @@ -127,7 +127,7 @@ if ($socid > 0) print '
'; $object->info($socid); - print dol_print_object_info($object, 1); + dol_print_object_info($object, 1); print '
'; From c8027ccf1a2aac850dfa62064e36d0c633dc7799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:15:10 +0200 Subject: [PATCH 0500/1036] Update agenda.php --- htdocs/contact/agenda.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/contact/agenda.php b/htdocs/contact/agenda.php index 6e093a934dd..2b135c3cc37 100644 --- a/htdocs/contact/agenda.php +++ b/htdocs/contact/agenda.php @@ -227,7 +227,7 @@ else print '
'; $object->info($id); - print dol_print_object_info($object, 1); + dol_print_object_info($object, 1); print '
'; From 53a09a0dd46f06b77357bb3174ec701956e53090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:15:51 +0200 Subject: [PATCH 0501/1036] Update agenda.php --- htdocs/product/agenda.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/agenda.php b/htdocs/product/agenda.php index 28b3c06ffa1..2ec5345009e 100644 --- a/htdocs/product/agenda.php +++ b/htdocs/product/agenda.php @@ -141,7 +141,7 @@ if ($id > 0 || $ref) print '
'; $object->info($object->id); - print dol_print_object_info($object, 1); + dol_print_object_info($object, 1); print '
'; From ff37fddcf16a14407403d3364b6b2a3a16377e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:16:45 +0200 Subject: [PATCH 0502/1036] Update myobject_agenda.php --- htdocs/modulebuilder/template/myobject_agenda.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index 924db3b8632..b536b264952 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -196,7 +196,7 @@ if ($object->id > 0) print '
'; $object->info($object->id); - print dol_print_object_info($object, 1); + dol_print_object_info($object, 1); print '
'; From 7b317c4cbfc8c0ce38b2fec02fc6bcffbc6cf189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:28:34 +0200 Subject: [PATCH 0503/1036] printObjectLines return void --- htdocs/modulebuilder/template/myobject_card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index e5223c86608..ed6a421ac86 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -389,7 +389,8 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea if (! empty($object->lines)) { - $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + // printObjectLines return void + $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); } // Form to add new line From a09584ae4ba93a995db3780870cf83b071d47f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:46:47 +0200 Subject: [PATCH 0504/1036] The method _load_ldap_dn() cannot be called... The method _load_ldap_dn() cannot be called from this context as it is declared private in class AdherentType. --- htdocs/adherents/class/adherent_type.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index c310bb18627..d51bbfef28a 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -462,7 +462,7 @@ class AdherentType extends CommonObject return ''; } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * @@ -472,7 +472,7 @@ class AdherentType extends CommonObject * 2=Return key only (uid=qqq) * @return string DN */ - private function _load_ldap_dn($info, $mode = 0) + public function _load_ldap_dn($info, $mode = 0) { // phpcs:enable global $conf; From 5a05cc184beacdcfba01480b433613b99e5f33d9 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 19 May 2019 10:48:43 +0200 Subject: [PATCH 0505/1036] Fix Accountancy Export OpenConcerto --- htdocs/accountancy/class/accountancyexport.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/class/accountancyexport.class.php b/htdocs/accountancy/class/accountancyexport.class.php index b9339a8150b..8ca2de4a132 100644 --- a/htdocs/accountancy/class/accountancyexport.class.php +++ b/htdocs/accountancy/class/accountancyexport.class.php @@ -616,7 +616,7 @@ class AccountancyExport $date = dol_print_date($line->doc_date, '%d/%m/%Y'); print $date . $separator; - print $line->code_journal; + print $line->code_journal . $separator; if (empty($line->subledger_account)) { print length_accountg($line->numero_compte) . $separator; } else { From a368a6a43ed8b59570289ac855976f5012783e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sun, 19 May 2019 09:51:54 +0200 Subject: [PATCH 0506/1036] Update adherent_type.class.php --- htdocs/adherents/class/adherent_type.class.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index d51bbfef28a..5e7847efa82 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -65,7 +65,7 @@ class AdherentType extends CommonObject * @var string Adherent type label */ public $label; - + /** * @var string Adherent type nature */ @@ -410,7 +410,7 @@ class AdherentType extends CommonObject return -1; } } - + /** * Return translated label by the nature of a adherent (physical or moral) * @@ -422,7 +422,7 @@ class AdherentType extends CommonObject global $langs; if ($morphy == 'phy') { return $langs->trans("Physical"); } elseif ($morphy == 'mor') { return $langs->trans("Moral"); } - else return $langs->trans("Physical & Morale"); + else return $langs->trans("Physical & Morale"); //return $morphy; } @@ -462,7 +462,8 @@ class AdherentType extends CommonObject return ''; } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * @@ -485,12 +486,13 @@ class AdherentType extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Initialize the info array (array of LDAP values) that will be used to call LDAP functions * * @return array Tableau info des attributs */ - private function _load_ldap_info() + public function _load_ldap_info() { // phpcs:enable global $conf,$langs; From d86fc28aba46f06221fc0877e673b2d2a1d24eba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 13:01:11 +0200 Subject: [PATCH 0507/1036] Fix CSS --- htdocs/bom/bom_card.php | 2 +- htdocs/bom/class/bom.class.php | 4 +-- htdocs/core/tpl/commonfields_view.tpl.php | 8 +++-- htdocs/core/tpl/extrafields_view.tpl.php | 1 - htdocs/theme/eldy/global.inc.php | 36 +++++++++++------------ htdocs/theme/md/style.css.php | 24 +++++++-------- 6 files changed, 36 insertions(+), 39 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index 42dd3ba7d95..8052b80da20 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -310,7 +310,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print ''."\n"; // Common attributes - //$keyforbreak='fieldkeytoswithonsecondcolumn'; + $keyforbreak='description'; include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php'; // Other attributes diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 9646b5d0d2e..2ee6399ba65 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -16,7 +16,7 @@ */ /** - * \file class/bom.class.php + * \file bom/class/bom.class.php * \ingroup bom * \brief This file is a CRUD class file for BOM (Create/Read/Update/Delete) */ @@ -98,7 +98,7 @@ class BOM extends CommonObject 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'enabled'=>1, 'visible'=>-1, 'position'=>62, 'notnull'=>-1,), 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>500, 'notnull'=>1,), 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'position'=>501, 'notnull'=>1,), - 'date_valid' => array('type'=>'datetime', 'label'=>'DateValid', 'enabled'=>1, 'visible'=>-2, 'position'=>502, 'notnull'=>0,), + 'date_valid' => array('type'=>'datetime', 'label'=>'DateValidation', 'enabled'=>1, 'visible'=>-2, 'position'=>502, 'notnull'=>0,), 'fk_user_creat' => array('type'=>'integer', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-2, 'position'=>510, 'notnull'=>1, 'foreignkey'=>'llx_user.rowid',), 'fk_user_modif' => array('type'=>'integer', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'position'=>511, 'notnull'=>-1,), 'fk_user_valid' => array('type'=>'integer', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-2, 'position'=>512, 'notnull'=>0,), diff --git a/htdocs/core/tpl/commonfields_view.tpl.php b/htdocs/core/tpl/commonfields_view.tpl.php index 129c1a70575..7c30aa0ce86 100644 --- a/htdocs/core/tpl/commonfields_view.tpl.php +++ b/htdocs/core/tpl/commonfields_view.tpl.php @@ -48,7 +48,7 @@ foreach($object->fields as $key => $val) $value=$object->$key; print ' 0) print ' fieldrequired'; // No fieldrequired on the view output if ($val['type'] == 'text' || $val['type'] == 'html') print ' tdtop'; print '">'; @@ -65,9 +65,11 @@ foreach($object->fields as $key => $val) } print '
'; + +// We close div and reopen for second column print '
'; print '
'; -print '
'; + print '
'; print ''; @@ -87,7 +89,7 @@ foreach($object->fields as $key => $val) $value=$object->$key; print ' 0) print ' fieldrequired'; if ($val['type'] == 'text' || $val['type'] == 'html') print ' tdtop'; print '">'; diff --git a/htdocs/core/tpl/extrafields_view.tpl.php b/htdocs/core/tpl/extrafields_view.tpl.php index db0d6a4897d..a34308432e4 100644 --- a/htdocs/core/tpl/extrafields_view.tpl.php +++ b/htdocs/core/tpl/extrafields_view.tpl.php @@ -155,7 +155,6 @@ if (empty($reshook) && is_array($extrafields->attributes[$object->table_element] print ''; print $extrafields->showInputField($key, $value, '', '', '', 0, $object->id); - print ''; print ''; diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index c1167524bf5..efd47a94631 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1126,15 +1126,14 @@ div.fichetwothirdright { } div.fichehalfleft { browser->layout != 'phone') { print "float: ".$left.";\n"; } ?> - browser->layout != 'phone') { print "width: 50%;\n"; } ?> + browser->layout != 'phone') { print "width: calc(50% - 10px);\n"; } ?> } div.fichehalfright { browser->layout != 'phone') { print "float: ".$right.";\n"; } ?> - browser->layout != 'phone') { print "width: 50%;\n"; } ?> + browser->layout != 'phone') { print "width: calc(50% - 10px);\n"; } ?> } -div.ficheaddleft { - browser->layout != 'phone') { print "padding-".$left.": 16px;\n"; } - else print "margin-top: 10px;\n"; ?> +div.fichehalfright { + browser->layout == 'phone') { print "margin-top: 10px;\n"; } ?> } div.firstcolumn div.box { padding-right: 10px; @@ -1174,8 +1173,7 @@ div.secondcolumn div.box { float: none; width: auto; } - div.ficheaddleft { - + div.fichehalfright { margin-top: 10px; } div.firstcolumn div.box { @@ -1198,13 +1196,13 @@ div.secondcolumn div.box { width: auto; } - .fichehalfright-lg .ficheaddleft{ + .fichehalfright-lg .fichehalfright { padding-left:0; } } /* For table into table into card */ -div.ficheaddleft tr.liste_titre:first-child td table.nobordernopadding td { +div.fichehalfright tr.liste_titre:first-child td table.nobordernopadding td { padding: 0 0 0 0; } div.nopadding { @@ -2466,9 +2464,9 @@ td.border, div.tagtable div div.border { } -/*.ficheaddleft table.noborder { +.fichehalfright table.noborder { margin: 0px 0px 0px 0px; -}*/ +} table.liste, table.noborder, table.formdoc, div.noborder { width: 100%; @@ -2498,7 +2496,7 @@ table.liste tr:last-of-type td, table.noborder:not(#tablelines) tr:last-of-type border-bottom-color: rgb(); border-bottom-style: solid; } -div.tabBar div.ficheaddleft table.noborder:not(.margintable):not(.paymenttable):last-of-type { +div.tabBar div.fichehalfright table.noborder:not(.margintable):not(.paymenttable):last-of-type { border-bottom: 1px solid rgb(); } div.tabBar table.border>tbody>tr:last-of-type>td { @@ -2506,7 +2504,7 @@ div.tabBar table.border>tbody>tr:last-of-type>td { border-bottom-color: rgb(); border-bottom-style: solid; } -div.tabBar div.ficheaddleft table.noborder { +div.tabBar div.fichehalfright table.noborder { border-bottom: none; } @@ -3013,8 +3011,8 @@ div.tabBar .noborder { /* Prepare to remove class pair - impair */ .noborder > tbody > tr:nth-child(even):not(.liste_titre), .liste > tbody > tr:nth-child(even):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(even):not(.liste_titre) +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre), +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(even):not(.liste_titre) { background: linear-gradient(bottom, rgb() 85%, rgb() 100%); background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%); @@ -3029,8 +3027,8 @@ div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth- } .noborder > tbody > tr:nth-child(odd):not(.liste_titre), .liste > tbody > tr:nth-child(odd):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(odd):not(.liste_titre), .liste > tbody > tr:nth-of-type(odd):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(odd):not(.liste_titre) +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(odd):not(.liste_titre), .liste > tbody > tr:nth-of-type(odd):not(.liste_titre), +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(odd):not(.liste_titre) { background: linear-gradient(bottom, rgb() 85%, rgb() 100%); background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%); @@ -3057,9 +3055,9 @@ ul.noborder li:nth-child(even):not(.liste_titre) { overflow-x: auto; min-height: 40px; } -/*.ficheaddleft div.boxstats, .ficheaddright div.boxstats { +.ficheaddleft div.boxstats, .ficheaddright div.boxstats { border: none; -}*/ +} .boxstatsborder { /* border: 1px solid #CCC !important; */ } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 3aea173df6c..6e569fa93d3 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1364,9 +1364,8 @@ div.fichehalfright { browser->layout != 'phone') { print "float: ".$right.";\n"; } ?> browser->layout != 'phone') { print "width: 50%;\n"; } ?> } -div.ficheaddleft { - browser->layout != 'phone') { print "padding-".$left.": 16px;\n"; } - else print "margin-top: 10px;\n"; ?> +div.fichehalfright { + browser->layout == 'phone') { print "margin-top: 10px;\n"; } ?> } div.firstcolumn div.box { padding-right: 10px; @@ -1408,8 +1407,7 @@ div.secondcolumn div.box { float: none; width: auto; } - div.ficheaddleft { - + div.fichehalfright { margin-top: 10px; } div.firstcolumn div.box { @@ -1421,7 +1419,7 @@ div.secondcolumn div.box { } /* For table into table into card */ -div.ficheaddleft tr.liste_titre:first-child td table.nobordernopadding td, div.nopadding { +div.fichehalfright tr.liste_titre:first-child td table.nobordernopadding td, div.nopadding { padding: 0 0 0 0; } div.nopadding { @@ -2736,7 +2734,7 @@ td.border, div.tagtable div div.border { border-bottom: 1px solid rgb(); } -.ficheaddleft table.noborder { +.fichehalfright table.noborder { margin: 0px 0px 0px 0px; } div.colorback @@ -3275,8 +3273,8 @@ div .tdtop { /* Prepare to remove class pair - impair */ .noborder > tbody > tr:nth-child(even):not(.liste_titre), .liste > tbody > tr:nth-child(even):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(even):not(.liste_titre) +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(even):not(.liste_titre), .liste > tbody > tr:nth-of-type(even):not(.liste_titre), +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(even):not(.liste_titre) { background: linear-gradient(to bottom, rgb() 85%, rgb() 100%); background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%); @@ -3291,8 +3289,8 @@ div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth- } .noborder > tbody > tr:nth-child(odd):not(.liste_titre), .liste > tbody > tr:nth-child(odd):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(odd):not(.liste_titre), .liste > tbody > tr:nth-of-type(odd):not(.liste_titre), -div:not(.fichecenter):not(.fichehalfleft):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(odd):not(.liste_titre) +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) > .border > tbody > tr:nth-of-type(odd):not(.liste_titre), .liste > tbody > tr:nth-of-type(odd):not(.liste_titre), +div:not(.fichecenter):not(.fichehalfleft):not(.fichehalfright):not(.ficheaddleft) .oddeven.tagtr:nth-of-type(odd):not(.liste_titre) { background: linear-gradient(to bottom, rgb() 85%, rgb() 100%); background: -o-linear-gradient(bottom, rgb() 85%, rgb() 100%); @@ -3319,9 +3317,9 @@ ul.noborder li:nth-child(even):not(.liste_titre) { overflow-x: auto; min-height: 40px; } -/*.ficheaddleft div.boxstats, .ficheaddright div.boxstats { +.ficheaddleft div.boxstats, .ficheaddright div.boxstats { border: none; -}*/ +} .boxstatsborder { /* border: 1px solid #CCC !important; */ } From 5f23cf7e2a64065ce10f6e32cfd787ab1d76297d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 13:51:47 +0200 Subject: [PATCH 0508/1036] CSS --- htdocs/accountancy/admin/account.php | 2 +- htdocs/admin/agenda.php | 2 +- htdocs/admin/emailcollector_list.php | 2 +- htdocs/admin/mails_senderprofile_list.php | 2 +- htdocs/admin/tools/listevents.php | 2 +- htdocs/asset/list.php | 2 +- htdocs/bom/bom_list.php | 2 +- htdocs/comm/mailing/cibles.php | 2 +- htdocs/comm/mailing/list.php | 2 +- htdocs/compta/bank/bankentries_list.php | 2 +- htdocs/compta/bank/various_payment/list.php | 2 +- htdocs/compta/cashcontrol/cashcontrol_list.php | 2 +- htdocs/compta/deplacement/list.php | 2 +- htdocs/compta/paiement/cheque/list.php | 2 +- htdocs/compta/paiement/list.php | 2 +- htdocs/compta/prelevement/bons.php | 2 +- htdocs/compta/prelevement/list.php | 2 +- htdocs/compta/salaries/list.php | 2 +- htdocs/compta/sociales/list.php | 2 +- htdocs/compta/tva/list.php | 2 +- htdocs/contact/consumption.php | 2 +- htdocs/contact/list.php | 8 ++++---- htdocs/contrat/services_list.php | 2 +- htdocs/don/list.php | 2 +- htdocs/fichinter/list.php | 2 +- htdocs/fourn/facture/impayees.php | 2 +- htdocs/fourn/facture/list.php | 2 +- htdocs/fourn/facture/paiement.php | 2 +- htdocs/fourn/product/list.php | 2 +- htdocs/holiday/define_holiday.php | 2 +- htdocs/holiday/list.php | 2 +- htdocs/holiday/view_log.php | 2 +- htdocs/modulebuilder/template/myobject_list.php | 2 +- htdocs/product/inventory/list.php | 2 +- htdocs/product/list.php | 2 +- htdocs/product/price.php | 2 +- htdocs/product/reassort.php | 2 +- htdocs/product/reassortlot.php | 6 +++--- htdocs/product/stock/list.php | 2 +- htdocs/product/stock/movement_card.php | 2 +- htdocs/product/stock/movement_list.php | 2 +- htdocs/product/stock/productlot_list.php | 2 +- htdocs/product/stock/replenish.php | 2 +- htdocs/projet/list.php | 2 +- htdocs/projet/tasks.php | 2 +- htdocs/projet/tasks/list.php | 2 +- htdocs/resource/list.php | 2 +- htdocs/societe/consumption.php | 2 +- htdocs/societe/price.php | 2 +- htdocs/societe/website.php | 2 +- htdocs/theme/eldy/btn.inc.php | 2 ++ htdocs/ticket/list.php | 2 +- htdocs/user/hierarchy.php | 2 +- htdocs/user/list.php | 2 +- 54 files changed, 60 insertions(+), 58 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index f007d4f8299..8daae94efe6 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -297,7 +297,7 @@ if ($resql) if (! empty($arrayfields['aa.pcg_type']['checked'])) print ''; if (! empty($arrayfields['aa.pcg_subtype']['checked'])) print ''; if (! empty($arrayfields['aa.active']['checked'])) print ''; - print ''; diff --git a/htdocs/admin/agenda.php b/htdocs/admin/agenda.php index 24b4766471d..649bfab3d97 100644 --- a/htdocs/admin/agenda.php +++ b/htdocs/admin/agenda.php @@ -143,7 +143,7 @@ print ''; print ''; print ''; // Action column -print ''; diff --git a/htdocs/admin/emailcollector_list.php b/htdocs/admin/emailcollector_list.php index d67936edfb5..a7e6a1aff67 100644 --- a/htdocs/admin/emailcollector_list.php +++ b/htdocs/admin/emailcollector_list.php @@ -384,7 +384,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/admin/mails_senderprofile_list.php b/htdocs/admin/mails_senderprofile_list.php index fa895f84182..f6a526600d7 100644 --- a/htdocs/admin/mails_senderprofile_list.php +++ b/htdocs/admin/mails_senderprofile_list.php @@ -356,7 +356,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/admin/tools/listevents.php b/htdocs/admin/tools/listevents.php index 987f965576a..d508afe63d2 100644 --- a/htdocs/admin/tools/listevents.php +++ b/htdocs/admin/tools/listevents.php @@ -255,7 +255,7 @@ if ($result) //print ''; print ''; - print ''; diff --git a/htdocs/asset/list.php b/htdocs/asset/list.php index 029b5334d55..c0c67c52331 100644 --- a/htdocs/asset/list.php +++ b/htdocs/asset/list.php @@ -372,7 +372,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/bom/bom_list.php b/htdocs/bom/bom_list.php index 8c9d60f1fe7..62e6a21ac22 100644 --- a/htdocs/bom/bom_list.php +++ b/htdocs/bom/bom_list.php @@ -387,7 +387,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index b9c93ece52c..619f61bdc67 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -505,7 +505,7 @@ if ($object->fetch($id) >= 0) print $formmailing->selectDestinariesStatus($search_dest_status, 'search_dest_status', 1); print ''; // Action column - print ''; diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index 7e058819771..da74efaaf98 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -191,7 +191,7 @@ if ($result) if (! $filteremail) print ''; print ''; print ''; - print ''; diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index 68c0ada46df..0c43475f2fb 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -906,7 +906,7 @@ if ($resql) } if (! empty($arrayfields['balance']['checked'])) { - print ''; diff --git a/htdocs/compta/bank/various_payment/list.php b/htdocs/compta/bank/various_payment/list.php index 8be0b075e40..537bd6aee66 100644 --- a/htdocs/compta/bank/various_payment/list.php +++ b/htdocs/compta/bank/various_payment/list.php @@ -223,7 +223,7 @@ if ($result) // Credit print ''; - print ''; diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index 32a5e50a452..816d1486970 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -402,7 +402,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/compta/deplacement/list.php b/htdocs/compta/deplacement/list.php index 9ad85788ca0..58a8fd32ef5 100644 --- a/htdocs/compta/deplacement/list.php +++ b/htdocs/compta/deplacement/list.php @@ -153,7 +153,7 @@ if ($resql) print ''; - print ''; diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php index 401d12aec4b..11de8aa48a2 100644 --- a/htdocs/compta/paiement/cheque/list.php +++ b/htdocs/compta/paiement/cheque/list.php @@ -175,7 +175,7 @@ if ($resql) print ''; print ''; print ''; - print ''; diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php index c005e0d70e6..39089c31274 100644 --- a/htdocs/compta/paiement/list.php +++ b/htdocs/compta/paiement/list.php @@ -255,7 +255,7 @@ if ($resql) print ''; - print ''; diff --git a/htdocs/compta/prelevement/bons.php b/htdocs/compta/prelevement/bons.php index 9fcb77d9b42..2b67b73c95b 100644 --- a/htdocs/compta/prelevement/bons.php +++ b/htdocs/compta/prelevement/bons.php @@ -134,7 +134,7 @@ if ($result) print ''; print ''; print ''; - print ''; diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index 8180517a2e8..81e58e19cca 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -146,7 +146,7 @@ if ($result) print ''; print ''; print ''; - print ''; diff --git a/htdocs/compta/salaries/list.php b/htdocs/compta/salaries/list.php index 6ce49536d20..4fa8bd09a76 100644 --- a/htdocs/compta/salaries/list.php +++ b/htdocs/compta/salaries/list.php @@ -196,7 +196,7 @@ if ($result) // Amount print ''; - print ''; diff --git a/htdocs/compta/sociales/list.php b/htdocs/compta/sociales/list.php index 01efe621dc8..7e25d8c3423 100644 --- a/htdocs/compta/sociales/list.php +++ b/htdocs/compta/sociales/list.php @@ -236,7 +236,7 @@ if ($resql) print $form->selectarray('search_status', $liststatus, $search_status, 1); print ''; - print ''; diff --git a/htdocs/compta/tva/list.php b/htdocs/compta/tva/list.php index 1d6b08735a0..d735edd5840 100644 --- a/htdocs/compta/tva/list.php +++ b/htdocs/compta/tva/list.php @@ -187,7 +187,7 @@ if ($result) print ''; } print ''; - print ''; diff --git a/htdocs/contact/consumption.php b/htdocs/contact/consumption.php index 667965396a6..3f0d0313ee0 100644 --- a/htdocs/contact/consumption.php +++ b/htdocs/contact/consumption.php @@ -390,7 +390,7 @@ if ($sql_select) print ''; print ''; - print ''; diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 6749ac0a7f5..fa26c5ed30b 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -693,8 +693,8 @@ if (! empty($arrayfields['p.import_key']['checked'])) print ''; } // Action column -print ''; @@ -783,7 +783,7 @@ while ($i < min($num, $limit)) // Name if (! empty($arrayfields['p.lastname']['checked'])) { - print ''; if (! $i) $totalarray['nbfield']++; @@ -791,7 +791,7 @@ while ($i < min($num, $limit)) // Firstname if (! empty($arrayfields['p.firstname']['checked'])) { - print ''; + print ''; if (! $i) $totalarray['nbfield']++; } // Job position diff --git a/htdocs/contrat/services_list.php b/htdocs/contrat/services_list.php index 19b40fa451d..07b5cceee1a 100644 --- a/htdocs/contrat/services_list.php +++ b/htdocs/contrat/services_list.php @@ -524,7 +524,7 @@ if (! empty($arrayfields['status']['checked'])) print ''; } // Action column -print ''; diff --git a/htdocs/don/list.php b/htdocs/don/list.php index f5cf23bceb7..1af11afca24 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -193,7 +193,7 @@ if ($resql) } print ''; print ''; - print ''; diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index bff598873ce..f8697fb52fc 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -433,7 +433,7 @@ if ($resql) { print ''; } - print ''; diff --git a/htdocs/fourn/facture/impayees.php b/htdocs/fourn/facture/impayees.php index 27a659300cc..02c8af6ebc6 100644 --- a/htdocs/fourn/facture/impayees.php +++ b/htdocs/fourn/facture/impayees.php @@ -213,7 +213,7 @@ if ($user->rights->fournisseur->facture->lire) print ''; - print ''; diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index fa13e329b0e..fe3deb6459b 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -728,7 +728,7 @@ if ($resql) } if (! empty($arrayfields['rtp']['checked'])) { - print ''; } // Extra fields diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php index a84acde6e04..f45d4009d05 100644 --- a/htdocs/fourn/facture/paiement.php +++ b/htdocs/fourn/facture/paiement.php @@ -944,7 +944,7 @@ if (empty($action) || $action == 'list') print ''; - print ''; diff --git a/htdocs/fourn/product/list.php b/htdocs/fourn/product/list.php index 218379ce7b8..7b319490815 100644 --- a/htdocs/fourn/product/list.php +++ b/htdocs/fourn/product/list.php @@ -243,7 +243,7 @@ if ($resql) print ''; print ''; print ''; - print ''; diff --git a/htdocs/holiday/define_holiday.php b/htdocs/holiday/define_holiday.php index 1404391f521..c0b25e57769 100644 --- a/htdocs/holiday/define_holiday.php +++ b/htdocs/holiday/define_holiday.php @@ -271,7 +271,7 @@ else print ''; // Action column - print ''; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index a93be6e096d..84e7b36c239 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -460,7 +460,7 @@ $holiday->selectStatutCP($search_statut, 'search_statut'); print ''; // Actions -print ''; diff --git a/htdocs/holiday/view_log.php b/htdocs/holiday/view_log.php index f27f1a5f10b..a37d3490c97 100644 --- a/htdocs/holiday/view_log.php +++ b/htdocs/holiday/view_log.php @@ -193,7 +193,7 @@ print ''; print ''; print ''; // Action column -print ''; diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index e8efedcf075..8fee6ca6664 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -428,7 +428,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/product/inventory/list.php b/htdocs/product/inventory/list.php index 58b34b6e8ea..b102e6ebad4 100644 --- a/htdocs/product/inventory/list.php +++ b/htdocs/product/inventory/list.php @@ -380,7 +380,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 688fef19654..93bcb936e98 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -676,7 +676,7 @@ if ($resql) print $form->selectarray('search_tobuy', array('0'=>$langs->trans('ProductStatusNotOnBuyShort'),'1'=>$langs->trans('ProductStatusOnBuyShort')), $search_tobuy, 1); print ''; } - print ''; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index f6efc0296b1..ccde05d1e24 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1989,7 +1989,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print ''; print ''; // Print the search button - print ''; diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index f8800aabc38..476fec36c2a 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -297,7 +297,7 @@ if ($resql) print ''; print ''; print ''; - print ''; diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 5142b05b4c4..faf91184dd1 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -293,7 +293,7 @@ if ($resql) print ''; print ''; print ''; - print ''; @@ -388,7 +388,7 @@ if ($resql) //print ''; // Warehouse - print ''; // Lot - print ''; - print ''; diff --git a/htdocs/product/stock/movement_card.php b/htdocs/product/stock/movement_card.php index 7983c1d2547..b75042c7cca 100644 --- a/htdocs/product/stock/movement_card.php +++ b/htdocs/product/stock/movement_card.php @@ -904,7 +904,7 @@ if ($resql) print ''; } // Actions - print ''; diff --git a/htdocs/product/stock/movement_list.php b/htdocs/product/stock/movement_list.php index 183927af207..836bb97e50c 100644 --- a/htdocs/product/stock/movement_list.php +++ b/htdocs/product/stock/movement_list.php @@ -880,7 +880,7 @@ if ($resql) print ''; } // Actions - print ''; diff --git a/htdocs/product/stock/productlot_list.php b/htdocs/product/stock/productlot_list.php index ae127bb03b6..d0d7b5da8e6 100644 --- a/htdocs/product/stock/productlot_list.php +++ b/htdocs/product/stock/productlot_list.php @@ -368,7 +368,7 @@ if ($resql) print ''; }*/ // Action column - print ''; diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index 0de9fa76786..069be8aca96 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -562,12 +562,12 @@ print ''; print ''; print ''; print ''; -print ''; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 1e8efc15581..34dd5547f7b 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -655,7 +655,7 @@ if (! empty($arrayfields['p.fk_statut']['checked'])) print ''; } // Action column -print ''; diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index c7053bc7079..ccc8a0548c8 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -762,7 +762,7 @@ elseif ($id > 0 || ! empty($ref)) if (! empty($conf->global->PROJECT_SHOW_CONTACTS_IN_LIST)) print ''; // Action column - print ''; diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 4a6d2633354..b97710ba7b6 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -588,7 +588,7 @@ if (! empty($arrayfields['t.tms']['checked'])) print ''; } // Action column -print ''; diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php index 3e613c3d99c..6765d2d7147 100644 --- a/htdocs/resource/list.php +++ b/htdocs/resource/list.php @@ -224,7 +224,7 @@ if (! empty($arrayfields['ty.label']['checked'])) // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; // Action column -print ''; diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index c16ef378bd0..d158fb49698 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -396,7 +396,7 @@ if ($sql_select) print ''; print ''; - print ''; diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php index 76824ca0140..1476bb8ce75 100644 --- a/htdocs/societe/price.php +++ b/htdocs/societe/price.php @@ -545,7 +545,7 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print ''; print ''; // Print the search button - print ''; diff --git a/htdocs/societe/website.php b/htdocs/societe/website.php index 6b4a85f28c8..ef19f266597 100644 --- a/htdocs/societe/website.php +++ b/htdocs/societe/website.php @@ -391,7 +391,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $objectwebsiteaccount); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/theme/eldy/btn.inc.php b/htdocs/theme/eldy/btn.inc.php index 927c92c5f41..f95940a61a0 100644 --- a/htdocs/theme/eldy/btn.inc.php +++ b/htdocs/theme/eldy/btn.inc.php @@ -70,6 +70,8 @@ border-bottom-left-radius: 0 !important;*/ } a.butActionNew>span.fa-plus-circle, a.butActionNew>span.fa-plus-circle:hover { padding-left: 6px; font-size: 1.5em; border: none; box-shadow: none; webkit-box-shadow: none; } a.butActionNewRefused>span.fa-plus-circle, a.butActionNewRefused>span.fa-plus-circle:hover { padding-left: 6px; font-size: 1.5em; border: none; box-shadow: none; webkit-box-shadow: none; } +a.butActionNew>span.fa-list-alt, a.butActionNew>span.fa-list-alt:hover { padding-left: 6px; font-size: 1.5em; border: none; box-shadow: none; webkit-box-shadow: none; } +a.butActionNewRefused>span.fa-list-alt, a.butActionNewRefused>span.fa-list-alt:hover { padding-left: 6px; font-size: 1.5em; border: none; box-shadow: none; webkit-box-shadow: none; } .butAction:hover { -webkit-box-shadow: 0px 0px 6px 1px rgba(50, 50, 50, 0.4), 0px 0px 0px rgba(60,60,60,0.1); diff --git a/htdocs/ticket/list.php b/htdocs/ticket/list.php index 481ad2add76..1c3995391de 100644 --- a/htdocs/ticket/list.php +++ b/htdocs/ticket/list.php @@ -553,7 +553,7 @@ $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters, $object); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; // Action column -print ''; diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php index a54e3070573..be18cb4051a 100644 --- a/htdocs/user/hierarchy.php +++ b/htdocs/user/hierarchy.php @@ -172,7 +172,7 @@ print ''; print ''; -print ''; diff --git a/htdocs/user/list.php b/htdocs/user/list.php index 62d32bc1654..ad310b0041e 100644 --- a/htdocs/user/list.php +++ b/htdocs/user/list.php @@ -439,7 +439,7 @@ if (! empty($arrayfields['u.statut']['checked'])) print ''; } // Action column -print ''; From 2debffe170136a6ba17aa7ceef15fe3b136e81a8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 16:21:11 +0200 Subject: [PATCH 0509/1036] Debug modulebuilder for lines --- htdocs/bom/bom_card.php | 56 ++++++++++++++ htdocs/bom/class/bom.class.php | 25 ++++++ htdocs/modulebuilder/index.php | 77 ++++++++++++++++--- .../template/class/myobject.class.php | 24 ++++++ 4 files changed, 173 insertions(+), 9 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index 8052b80da20..de6189c946a 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -325,6 +325,62 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea dol_fiche_end(); + + /* + * Lines + */ + + if (! empty($object->table_element_line)) + { + // Show object lines + $result = $object->getLinesArray(); + + print '
+ + + + + '; + + if (! empty($conf->use_javascript_ajax) && $object->status == 0) { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } + + print '
'; + if (! empty($object->lines) && $object->status == 0 && $permissiontoadd && $action != 'selectlines' && $action != 'editline') + { + print '
 '; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); print $searchpicto; print '
'; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); print $searchpicto; print '   '; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $htmltext=$langs->trans("BalanceVisibilityDependsOnSortAndFilters", $langs->transnoentitiesnoconv("DateValue")); print $form->textwithpicto('', $htmltext, 1); print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; // print ''; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; print ''; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print '  '; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print '  '; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; -$searchpicto=$form->showFilterButtons(); +print ''; +$searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; print $contactstatic->getNomUrl(1, '', 0); print ''.$obj->firstname.''.$obj->firstname.''; +print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ' '; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; print ''; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; print ''; print ''; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ' '; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print '  '; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print '   '; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''.$objp->desiredstock.''; + print ''; if ($objp->fk_entrepot > 0) { print $warehousetmp->getNomUrl(1); @@ -396,7 +396,7 @@ if ($resql) print ''; + print ''; if ($product_lot_static->batch) { print $product_lot_static->getNomUrl(1); diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index e36312e196c..b9876bdf36a 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -177,7 +177,7 @@ if ($result) print $form->selectarray('search_status', $warehouse->statuts, $search_status, 1, 0, 0, '', 1); print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); print $searchpicto; print ' ' . $langs->trans('AlertOnly') . ' ' . $langs->trans('IncludeAlsoDraftOrders') . '  '; // Fields from hook $parameters=array('param'=>$param,'sortfield'=>$sortfield,'sortorder'=>$sortorder); $reshook=$hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; +print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; print ''; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ' '; + print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; print ' '; print $form->selectarray('search_statut', array('-1'=>'','1'=>$langs->trans('Enabled')), $search_statut); print ''; +print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print ''; +print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); print $searchpicto; print '
'; + } + + if (! empty($object->lines)) + { +// $ret = $object->printObjectLines($action, $mysoc, $soc, $lineid, 1); + } + + // Form to add new line + if ($object->status == 0 && $permissiontoadd && $action != 'selectlines') + { + if ($action != 'editline') + { + // Add products/services form +// $object->formAddObjectLine(1, $mysoc, $soc); + + $parameters = array(); + $reshook = $hookmanager->executeHooks('formAddObjectLine', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + } + } + + if (! empty($object->lines) && $object->status == 0 && $permissiontoadd && $action != 'selectlines' && $action != 'editline') + { + print '
'; + } + print '
'; + + print "\n"; + } + + + // Buttons for actions if ($action != 'presend' && $action != 'editline') { print '
'."\n"; diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 2ee6399ba65..6ada9b167f9 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -850,6 +850,31 @@ class BOM extends CommonObject } } + /** + * Create an array of lines + * + * @return array|int array of lines if OK, <0 if KO + */ + public function getLinesArray() + { + $this->lines=array(); + + $objectline = new BOMLine($this->db); + $result = $objectline->fetchAll('', '', 0, 0, array('fk_bom'=>$this->id)); + + if (is_numeric($result)) + { + $this->error = $this->error; + $this->errors = $this->errors; + return $result; + } + else + { + $this->lines = $result; + return $this->lines(); + } + } + /** * Initialise object with example values * Id must be 0 if object instance is a specimen diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 21fb23f017c..e5024f6949f 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -163,7 +163,10 @@ if ($dirins && $action == 'initmodule' && $modulename) dol_delete_file($destdir.'/myobject_agenda.php'); dol_delete_file($destdir.'/myobject_list.php'); dol_delete_file($destdir.'/lib/'.strtolower($modulename).'_myobject.lib.php'); + dol_delete_file($destdir.'/test/phpunit/MyObjectFunctionnalTest.php'); dol_delete_file($destdir.'/test/phpunit/MyObjectTest.php'); + dol_delete_file($destdir.'/test/phpunit'); + dol_delete_file($destdir.'/test'); dol_delete_file($destdir.'/sql/llx'.strtolower($modulename).'_myobject.sql'); dol_delete_file($destdir.'/sql/llx_'.strtolower($modulename).'_myobject_extrafields.sql'); dol_delete_file($destdir.'/sql/llx_'.strtolower($modulename).'_myobject.key.sql'); @@ -223,6 +226,9 @@ if ($dirins && $action == 'initmodule' && $modulename) if ($dirins && $action == 'initapi' && !empty($module)) { + $modulename = ucfirst($module); // Force first letter in uppercase + $objectname = $tabobj; + dol_mkdir($dirins.'/'.strtolower($module).'/class'); $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; $srcfile = $srcdir.'/class/api_mymodule.class.php'; @@ -232,9 +238,6 @@ if ($dirins && $action == 'initapi' && !empty($module)) if ($result > 0) { - $modulename = ucfirst($module); // Force first letter in uppercase - $objectname = $tabobj; - //var_dump($phpfileval['fullname']); $arrayreplacement=array( 'mymodule'=>strtolower($modulename), @@ -254,6 +257,46 @@ if ($dirins && $action == 'initapi' && !empty($module)) dolReplaceInFile($destfile, $arrayreplacement); } } + +if ($dirins && $action == 'initphpunit' && !empty($module)) +{ + $modulename = ucfirst($module); // Force first letter in uppercase + $objectname = $tabobj; + + dol_mkdir($dirins.'/'.strtolower($module).'/class'); + $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; + $srcfile = $srcdir.'/test/phpunit/MyObjectTest.php'; + $destfile = $dirins.'/'.strtolower($module).'/test/phpunit/'.strtolower($objectname).'Test.php'; + $result = dol_copy($srcfile, $destfile, 0, 0); + /*$srcfile = $srcdir.'/test/phpunit/MyModuleFunctionnalTest.class.php'; + $destfile = $dirins.'/'.strtolower($module).'/test/phpunit/'.strtolower($module).'FunctionnalTest.class.php'; + $result = dol_copy($srcfile, $destfile, 0, 0);*/ + if ($result > 0) + { + //var_dump($phpfileval['fullname']); + $arrayreplacement=array( + 'mymodule'=>strtolower($modulename), + 'MyModule'=>$modulename, + 'MYMODULE'=>strtoupper($modulename), + 'My module'=>$modulename, + 'my module'=>$modulename, + 'Mon module'=>$modulename, + 'mon module'=>$modulename, + 'htdocs/modulebuilder/template'=>strtolower($modulename), + 'myobject'=>strtolower($objectname), + 'MyObject'=>$objectname, + 'MYOBJECT'=>strtoupper($objectname), + '---Put here your own copyright and developer email---'=>dol_print_date($now, '%Y').' '.$user->getFullName($langs).($user->email?' <'.$user->email.'>':'') + ); + + dolReplaceInFile($destfile, $arrayreplacement); + } + else + { + + } +} + if ($dirins && $action == 'inithook' && !empty($module)) { dol_mkdir($dirins.'/'.strtolower($module).'/class'); @@ -518,7 +561,6 @@ if ($dirins && $action == 'initobject' && $module && $objectname) dol_mkdir($destdir.'/lib'); dol_mkdir($destdir.'/scripts'); dol_mkdir($destdir.'/sql'); - dol_mkdir($destdir.'/test/phpunit'); // Scan dir class to find if an object with same name already exists. if (! $error) @@ -548,7 +590,7 @@ if ($dirins && $action == 'initobject' && $module && $objectname) 'myobject_agenda.php'=>strtolower($objectname).'_agenda.php', 'myobject_list.php'=>strtolower($objectname).'_list.php', 'lib/mymodule_myobject.lib.php'=>'lib/'.strtolower($module).'_'.strtolower($objectname).'.lib.php', - 'test/phpunit/MyObjectTest.php'=>'test/phpunit/'.$objectname.'Test.php', + //'test/phpunit/MyObjectTest.php'=>'test/phpunit/'.strtolower($objectname).'Test.php', 'sql/llx_mymodule_myobject.sql'=>'sql/llx_'.strtolower($module).'_'.strtolower($objectname).'.sql', 'sql/llx_mymodule_myobject_extrafields.sql'=>'sql/llx_'.strtolower($module).'_'.strtolower($objectname).'_extrafields.sql', 'sql/llx_mymodule_myobject.key.sql'=>'sql/llx_'.strtolower($module).'_'.strtolower($objectname).'.key.sql', @@ -912,7 +954,7 @@ if ($dirins && $action == 'confirm_deleteobject' && $objectname) 'myobject_list.php'=>strtolower($objectname).'_list.php', 'lib/mymodule.lib.php'=>'lib/'.strtolower($module).'.lib.php', 'lib/mymodule_myobject.lib.php'=>'lib/'.strtolower($module).'_'.strtolower($objectname).'.lib.php', - 'test/phpunit/MyObjectTest.php'=>'test/phpunit/'.$objectname.'Test.php', + 'test/phpunit/MyObjectTest.php'=>'test/phpunit/'.strtolower($objectname).'Test.php', 'sql/llx_mymodule_myobject.sql'=>'sql/llx_'.strtolower($module).'_'.strtolower($objectname).'.sql', 'sql/llx_mymodule_myobject_extrafields.sql'=>'sql/llx_'.strtolower($module).'_'.strtolower($objectname).'_extrafields.sql', 'sql/llx_mymodule_myobject.key.sql'=>'sql/llx_'.strtolower($module).'_'.strtolower($objectname).'.key.sql', @@ -1803,17 +1845,17 @@ elseif (! empty($module)) $pathtodocument = strtolower($module).'/'.strtolower($tabobj).'_document.php'; $pathtolist = strtolower($module).'/'.strtolower($tabobj).'_list.php'; $pathtonote = strtolower($module).'/'.strtolower($tabobj).'_note.php'; - $pathtophpunit = strtolower($module).'/test/phpunit/'.$tabobj.'Test.php'; + $pathtophpunit = strtolower($module).'/test/phpunit/'.strtolower($tabobj).'Test.php'; $pathtosql = strtolower($module).'/sql/llx_'.strtolower($module).'_'.strtolower($tabobj).'.sql'; $pathtosqlextra = strtolower($module).'/sql/llx_'.strtolower($module).'_'.strtolower($tabobj).'_extrafields.sql'; $pathtosqlkey = strtolower($module).'/sql/llx_'.strtolower($module).'_'.strtolower($tabobj).'.key.sql'; + $pathtosqlextrakey = strtolower($module).'/sql/llx_'.strtolower($module).'_'.strtolower($tabobj).'_extrafields.key.sql'; $pathtolib = strtolower($module).'/lib/'.strtolower($module).'.lib.php'; $pathtoobjlib = strtolower($module).'/lib/'.strtolower($module).'_'.strtolower($tabobj).'.lib.php'; $pathtopicto = strtolower($module).'/img/object_'.strtolower($tabobj).'.png'; $pathtoscript = strtolower($module).'/scripts/'.strtolower($tabobj).'.php'; //var_dump($pathtolib); - $realpathtoclass = dol_buildpath($pathtoclass, 0, 2); $realpathtoapi = dol_buildpath($pathtoapi, 0, 2); $realpathtoagenda = dol_buildpath($pathtoagenda, 0, 2); @@ -1825,6 +1867,7 @@ elseif (! empty($module)) $realpathtosql = dol_buildpath($pathtosql, 0, 2); $realpathtosqlextra = dol_buildpath($pathtosqlextra, 0, 2); $realpathtosqlkey = dol_buildpath($pathtosqlkey, 0, 2); + $realpathtosqlextrakey = dol_buildpath($pathtosqlextrakey, 0, 2); $realpathtolib = dol_buildpath($pathtolib, 0, 2); $realpathtoobjlib = dol_buildpath($pathtoobjlib, 0, 2); $realpathtopicto = dol_buildpath($pathtopicto, 0, 2); @@ -1855,9 +1898,21 @@ elseif (! empty($module)) //print ''.$langs->trans("FileNotYetGenerated").' '; print ''; } + // PHPUnit print '
'; print ' '.$langs->trans("TestClassFile").' : '.($realpathtophpunit?'':'').$pathtophpunit.($realpathtophpunit?'':'').''; - print ' '.img_picto($langs->trans("Edit"), 'edit').''; + + if ($realpathtophpunit) + { + print ' '.img_picto($langs->trans("Edit"), 'edit').''; + print '   '; + print ''.img_picto($langs->trans("Delete"), 'delete').''; + } + else + { + //print ''.$langs->trans("FileNotYetGenerated").' '; + print ''; + } print '
'; print '
'; @@ -1887,6 +1942,10 @@ elseif (! empty($module)) print ' '.img_picto($langs->trans("Edit"), 'edit').''; //print '   '.$langs->trans("RunSql").''; print '
'; + print ' '.$langs->trans("SqlFileKeyExtraFields").' : '.($realpathtosqlextrakey?'':'').$pathtosqlextrakey.($realpathtosqlextrakey?'':'').''; + print ' '.img_picto($langs->trans("Edit"), 'edit').''; + //print '   '.$langs->trans("RunSql").''; + print '
'; print '
'; print '
'; diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 74b2c6b50c0..06658b71576 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -644,6 +644,30 @@ class MyObject extends CommonObject $this->initAsSpecimenCommon(); } + /** + * Create an array of lines + * + * @return array|int array of lines if OK, <0 if KO + */ + public function getLinesArray() + { + $this->lines=array(); + + $objectline = new BOMLine($this->db); + $result = $objectline->fetchAll('', '', 0, 0, array('fk_myobject'=>$this->id)); + + if (is_numeric($result)) + { + $this->error = $this->error; + $this->errors = $this->errors; + return $result; + } + else + { + $this->lines = $result; + return $this->lines(); + } + } /** * Action executed by scheduler From 27ed095181f6d436ce0ea92b52a4f5ba2f89efa7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 16:40:25 +0200 Subject: [PATCH 0510/1036] Debug BOM module --- htdocs/bom/bom_document.php | 6 ++---- htdocs/core/class/html.formfile.class.php | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/htdocs/bom/bom_document.php b/htdocs/bom/bom_document.php index 197b9779988..1738efc605c 100644 --- a/htdocs/bom/bom_document.php +++ b/htdocs/bom/bom_document.php @@ -132,10 +132,8 @@ if ($object->id) dol_fiche_end(); $modulepart = 'bom'; - //$permission = $user->rights->bom->create; - $permission = 1; - //$permtoedit = $user->rights->bom->create; - $permtoedit = 1; + $permission = $user->rights->bom->write; + $permtoedit = $user->rights->bom->write; $param = '&id=' . $object->id; //$relativepathwithnofile='bom/' . dol_sanitizeFileName($object->id).'/'; diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 576aff4db66..55196c91fb5 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1830,7 +1830,7 @@ class FormFile print '' . dol_print_date($link->datea, "dayhour", "tzuser") . ''; print ''; print ''; - print '' . img_edit() . ''; // id= is included into $param + print '' . img_edit() . ''; // id= is included into $param if ($permtodelete) { print '   ' . img_delete() . ''; // id= is included into $param } else { From e84e3ef01fafabd51f10df939c179b03938a09b4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 19:15:18 +0200 Subject: [PATCH 0511/1036] Move module into external module --- build/rpm/dolibarr_fedora.spec | 1 - build/rpm/dolibarr_generic.spec | 1 - build/rpm/dolibarr_mandriva.spec | 1 - build/rpm/dolibarr_opensuse.spec | 1 - htdocs/ifttt/README.md | 7 -- htdocs/ifttt/admin/index.php | 126 ------------------------------- 6 files changed, 137 deletions(-) delete mode 100644 htdocs/ifttt/README.md delete mode 100644 htdocs/ifttt/admin/index.php diff --git a/build/rpm/dolibarr_fedora.spec b/build/rpm/dolibarr_fedora.spec index 881b5b1a6a4..b6d526bf8e1 100755 --- a/build/rpm/dolibarr_fedora.spec +++ b/build/rpm/dolibarr_fedora.spec @@ -191,7 +191,6 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/ftp %_datadir/dolibarr/htdocs/holiday %_datadir/dolibarr/htdocs/hrm -%_datadir/dolibarr/htdocs/ifttt %_datadir/dolibarr/htdocs/imports %_datadir/dolibarr/htdocs/includes %_datadir/dolibarr/htdocs/install diff --git a/build/rpm/dolibarr_generic.spec b/build/rpm/dolibarr_generic.spec index 74d6bf700bb..32c6e50018e 100755 --- a/build/rpm/dolibarr_generic.spec +++ b/build/rpm/dolibarr_generic.spec @@ -271,7 +271,6 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/ftp %_datadir/dolibarr/htdocs/holiday %_datadir/dolibarr/htdocs/hrm -%_datadir/dolibarr/htdocs/ifttt %_datadir/dolibarr/htdocs/imports %_datadir/dolibarr/htdocs/includes %_datadir/dolibarr/htdocs/install diff --git a/build/rpm/dolibarr_mandriva.spec b/build/rpm/dolibarr_mandriva.spec index 181bdb4ded4..dbb8e0d1310 100755 --- a/build/rpm/dolibarr_mandriva.spec +++ b/build/rpm/dolibarr_mandriva.spec @@ -188,7 +188,6 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/ftp %_datadir/dolibarr/htdocs/holiday %_datadir/dolibarr/htdocs/hrm -%_datadir/dolibarr/htdocs/ifttt %_datadir/dolibarr/htdocs/imports %_datadir/dolibarr/htdocs/includes %_datadir/dolibarr/htdocs/install diff --git a/build/rpm/dolibarr_opensuse.spec b/build/rpm/dolibarr_opensuse.spec index 1410e5097cf..aa810a737b9 100755 --- a/build/rpm/dolibarr_opensuse.spec +++ b/build/rpm/dolibarr_opensuse.spec @@ -199,7 +199,6 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/ftp %_datadir/dolibarr/htdocs/holiday %_datadir/dolibarr/htdocs/hrm -%_datadir/dolibarr/htdocs/ifttt %_datadir/dolibarr/htdocs/imports %_datadir/dolibarr/htdocs/includes %_datadir/dolibarr/htdocs/install diff --git a/htdocs/ifttt/README.md b/htdocs/ifttt/README.md deleted file mode 100644 index 581853f80c6..00000000000 --- a/htdocs/ifttt/README.md +++ /dev/null @@ -1,7 +0,0 @@ -API REST -======== - -## Integrate your ERP with any other applications using IFTTT - -This module provides the triggers and services to make Dolibarr compatible with IFTTT Services. - diff --git a/htdocs/ifttt/admin/index.php b/htdocs/ifttt/admin/index.php deleted file mode 100644 index 30ed2ef0a86..00000000000 --- a/htdocs/ifttt/admin/index.php +++ /dev/null @@ -1,126 +0,0 @@ - - * Copyright (C) 2005-2016 Laurent Destailleur - * Copyright (C) 2011 Juanjo Menent - * Copyright (C) 2012-2018 Regis Houssin - * Copyright (C) 2015 Jean-François Ferry - * - * 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/ifttt/admin/index.php - * \ingroup api - * \brief Page to setup IFTTT module - */ - -require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - -// Load translation files required by the page -$langs->load("admin"); - -if (! $user->admin) - accessforbidden(); - -$action=GETPOST('action', 'aZ09'); - - -if ($action == 'set') -{ - $res1 = dolibarr_set_const($db, 'IFTTT_SERVICE_KEY', GETPOST('IFTTT_SERVICE_KEY', 'alpha'), 'chaine', 0, '', 0); - $res2 = dolibarr_set_const($db, 'IFTTT_DOLIBARR_ENDPOINT_SECUREKEY', GETPOST('IFTTT_DOLIBARR_ENDPOINT_SECUREKEY', 'alpha'), 'chaine', 0, '', 0); - - if ($res1 > 0 && $res2) - { - header("Location: ".$_SERVER["PHP_SELF"]); - exit; - } - else - { - dol_print_error($db); - } -} - - -/* - * View - */ - -llxHeader(); - -$linkback=''.$langs->trans("BackToModuleList").''; -print load_fiche_titre($langs->trans("IFTTTSetup"), $linkback, 'title_setup'); - -print ''.$langs->trans("IFTTTDesc")."
\n"; -print "
\n"; - -print '
'; -print ''; -print ''; -print ''; - -print ''; -print ""; -print '"; -print ""; -print ""; - -print ''; -print ''; -print ''; -print ''; -print ''; - -print ''; -print ''; -print ''; -print ''; -print ''; - -print '
".$langs->trans("Parameter")."'.$langs->trans("Value")." 
'.$langs->trans("IFTTT_SERVICE_KEY").''; -print ''; -print ''.$langs->trans("YouWillFindItOnYourIFTTTAccount").'
'.$langs->trans("IFTTT_DOLIBARR_ENDPOINT_SECUREKEY").''; -print ''; -print '
'; - -print '
'; -print ''; -print '
'; - -print '
'; - -print '

'; - - - -// Define $urlwithroot -$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root)); -$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file -//$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current - -// Show message -$message=''; -$url=$urlwithroot.'/public/ifttt/index.php?securekey='.$conf->global->IFTTT_DOLIBARR_ENDPOINT_SECUREKEY; -$message.=$langs->trans("UrlForIFTTT").':
'; -$message.=img_picto('', 'object_globe.png').' '; -print $message; -print ajax_autoselect("endpointforifttt"); -print '
'; -print '
'; - - -llxFooter(); -$db->close(); From 6780befb2df939c48f8378fd6b8200f807ee0a12 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 21:59:03 +0200 Subject: [PATCH 0512/1036] Fix css --- htdocs/theme/eldy/global.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index efd47a94631..f66a037d43a 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -1124,6 +1124,9 @@ div.fichetwothirdright { browser->layout != 'phone') { print "width: 50%;\n"; } ?> browser->layout == 'phone') { print "padding-bottom: 6px\n"; } ?> } +div.fichetwothirdright div.ficheaddleft { + padding-left: 20px; +} div.fichehalfleft { browser->layout != 'phone') { print "float: ".$left.";\n"; } ?> browser->layout != 'phone') { print "width: calc(50% - 10px);\n"; } ?> From 6be48e69521262c461b91d61095362239acec38e Mon Sep 17 00:00:00 2001 From: ATM-Nicolas Date: Mon, 20 May 2019 08:59:44 +0200 Subject: [PATCH 0513/1036] NEW : Amount HT invoiced column in propal list --- htdocs/comm/propal/list.php | 32 +++++++++++++++++++++++++++++++- htdocs/langs/fr_FR/main.lang | 1 + 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 7355ea83269..cd98800f606 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -160,6 +160,7 @@ $arrayfields=array( 'p.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1), 'p.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0), 'p.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), + 'p.total_ht_invoiced'=>array('label'=>$langs->trans("AmountInvoicedHT"), 'checked'=>0), 'p.total_invoiced'=>array('label'=>$langs->trans("AmountInvoicedTTC"), 'checked'=>0), 'u.login'=>array('label'=>$langs->trans("Author"), 'checked'=>1, 'position'=>10), 'sale_representative'=>array('label'=>$langs->trans("SaleRepresentativesOfThirdParty"), 'checked'=>1), @@ -638,6 +639,12 @@ if ($resql) print ''; print ''; } + if (! empty($arrayfields['p.total_ht_invoiced']['checked'])) + { + // Amount invoiced + print ''; + print ''; + } if (! empty($arrayfields['p.total_invoiced']['checked'])) { // Amount invoiced @@ -708,7 +715,8 @@ if ($resql) if (! empty($arrayfields['p.total_ht']['checked'])) print_liste_field_titre($arrayfields['p.total_ht']['label'], $_SERVER["PHP_SELF"], 'p.total_ht', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['p.total_vat']['checked'])) print_liste_field_titre($arrayfields['p.total_vat']['label'], $_SERVER["PHP_SELF"], 'p.tva', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['p.total_ttc']['checked'])) print_liste_field_titre($arrayfields['p.total_ttc']['label'], $_SERVER["PHP_SELF"], 'p.total', '', $param, 'class="right"', $sortfield, $sortorder); - if (! empty($arrayfields['p.total_invoiced']['checked'])) print_liste_field_titre($arrayfields['p.total_invoiced']['label'], $_SERVER["PHP_SELF"], 'p.total', '', $param, 'class="right"', $sortfield, $sortorder); + if (! empty($arrayfields['p.total_ht_invoiced']['checked'])) print_liste_field_titre($arrayfields['p.total_ht_invoiced']['label'], $_SERVER["PHP_SELF"], '', '', $param, 'class="right"', $sortfield, $sortorder); + if (! empty($arrayfields['p.total_invoiced']['checked'])) print_liste_field_titre($arrayfields['p.total_invoiced']['label'], $_SERVER["PHP_SELF"], '', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['u.login']['checked'])) print_liste_field_titre($arrayfields['u.login']['label'], $_SERVER["PHP_SELF"], 'u.login', '', $param, 'align="center"', $sortfield, $sortorder); if (! empty($arrayfields['sale_representative']['checked'])) print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "", "", "$param", '', $sortfield, $sortorder); // Extra fields @@ -920,6 +928,27 @@ if ($resql) $totalarray['totalttc'] += $obj->total_ttc; } // Amount invoiced + if(! empty($arrayfields['p.total_ht_invoiced']['checked'])) { + $totalInvoiced = 0; + $p = new Propal($db); + $TInvoiceData = $p->InvoiceArrayList($obj->rowid); + + if(! empty($TInvoiceData)) { + foreach($TInvoiceData as $invoiceData) { + $invoice = new Facture($db); + $invoice->fetch($invoiceData->facid); + + if(! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS) && $invoice->type == Facture::TYPE_DEPOSIT) continue; + $totalInvoiced += $invoice->total_ht; + } + } + + print ''.price($totalInvoiced)."\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totalhtinvoicedfield']=$totalarray['nbfield']; + $totalarray['totalhtinvoiced'] += $totalInvoiced; + } + // Amount invoiced if(! empty($arrayfields['p.total_invoiced']['checked'])) { $totalInvoiced = 0; $p = new Propal($db); @@ -1066,6 +1095,7 @@ if ($resql) elseif ($totalarray['totalhtfield'] == $i) print ''.price($totalarray['totalht']).''; elseif ($totalarray['totalvatfield'] == $i) print ''.price($totalarray['totalvat']).''; elseif ($totalarray['totalttcfield'] == $i) print ''.price($totalarray['totalttc']).''; + elseif ($totalarray['totalhtinvoicedfield'] == $i) print ''.price($totalarray['totalhtinvoiced']).''; elseif ($totalarray['totalinvoicedfield'] == $i) print ''.price($totalarray['totalinvoiced']).''; elseif ($totalarray['totalizable']) { $printed = false; diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 22e6914dcd9..3cbcf89574e 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -347,6 +347,7 @@ PriceUTTC=P.U TTC Amount=Montant AmountInvoice=Montant facture AmountInvoiced=Montant facturé +AmountInvoicedHT=Montant HT facturé AmountInvoicedTTC=Montant TTC facturé AmountPayment=Montant paiement AmountHTShort=Montant HT From 5def839813af872aa7fff871cf945174fe59540a Mon Sep 17 00:00:00 2001 From: ATM-Nicolas Date: Mon, 20 May 2019 11:56:26 +0200 Subject: [PATCH 0514/1036] FIX : Padding on create project icon --- htdocs/comm/propal/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 4950efb19ab..c8cba5c3dda 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -1679,7 +1679,7 @@ if ($action == 'create') print ''; print '' . $langs->trans("Project") . ''; $numprojet = $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid, 'projectid', 0, 0, 1, 1); - print '   id).'">' . $langs->trans("AddProject") . ''; + print '   id).'">' . $langs->trans("AddProject") . ''; print ''; print ''; } From 3c1b860da475bf3311bae1e81bd515026b80631f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 12:16:39 +0200 Subject: [PATCH 0515/1036] Fix css --- htdocs/bom/bom_card.php | 4 ++-- htdocs/bom/bom_document.php | 6 +++--- htdocs/core/menus/standard/eldy.lib.php | 4 ++-- htdocs/core/tpl/commonfields_view.tpl.php | 2 +- htdocs/core/tpl/resource_add.tpl.php | 2 +- htdocs/core/tpl/resource_view.tpl.php | 2 +- htdocs/modulebuilder/template/myobject_card.php | 2 +- htdocs/modulebuilder/template/myobject_document.php | 4 ++-- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/eldy/theme_vars.inc.php | 4 ++-- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index de6189c946a..fddba91eeeb 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -307,7 +307,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea print '
'; print '
'; print '
'; - print ''."\n"; + print '
'."\n"; // Common attributes $keyforbreak='description'; @@ -391,7 +391,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea if (empty($reshook)) { // Send - print '' . $langs->trans('SendMail') . ''."\n"; + //print '' . $langs->trans('SendMail') . ''."\n"; // Modify if ($user->rights->bom->write) diff --git a/htdocs/bom/bom_document.php b/htdocs/bom/bom_document.php index 1738efc605c..012094fbb05 100644 --- a/htdocs/bom/bom_document.php +++ b/htdocs/bom/bom_document.php @@ -68,8 +68,8 @@ $extralabels = $extrafields->fetch_name_optionals_label('bom'); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals -//if ($id > 0 || ! empty($ref)) $upload_dir = $conf->sellyoursaas->multidir_output[$object->entity] . "/bom/" . dol_sanitizeFileName($object->id); -if ($id > 0 || ! empty($ref)) $upload_dir = $conf->sellyoursaas->multidir_output[$object->entity] . "/bom/" . dol_sanitizeFileName($object->ref); +//if ($id > 0 || ! empty($ref)) $upload_dir = $conf->bom->multidir_output[$object->entity?$object->entity:1] . "/bom/" . dol_sanitizeFileName($object->id); +if ($id > 0 || ! empty($ref)) $upload_dir = $conf->bom->multidir_output[$object->entity?$object->entity:1] . "/bom/" . dol_sanitizeFileName($object->ref); /* @@ -117,7 +117,7 @@ if ($object->id) print '
'; print '
'; - print '
'; + print '
'; // Number of files print ''; diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index fc639802e7f..3710cc2cf91 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -540,10 +540,10 @@ function print_text_menu_entry($text, $showmode, $url, $id, $idsel, $classname, global $langs; if ($showmode == 1) { - print ''; + print ''; print '
'; print '
'; - print ''; + print ''; print ''; print $text; print ''; diff --git a/htdocs/core/tpl/commonfields_view.tpl.php b/htdocs/core/tpl/commonfields_view.tpl.php index 7c30aa0ce86..f6d59435e74 100644 --- a/htdocs/core/tpl/commonfields_view.tpl.php +++ b/htdocs/core/tpl/commonfields_view.tpl.php @@ -71,7 +71,7 @@ print ''; print '
'; print '
'; -print '
'.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
'; +print '
'; $alreadyoutput = 1; foreach($object->fields as $key => $val) diff --git a/htdocs/core/tpl/resource_add.tpl.php b/htdocs/core/tpl/resource_add.tpl.php index 34246bcf0b6..4e5967b30b4 100644 --- a/htdocs/core/tpl/resource_add.tpl.php +++ b/htdocs/core/tpl/resource_add.tpl.php @@ -14,7 +14,7 @@ require_once DOL_DOCUMENT_ROOT.'/resource/class/html.formresource.class.php'; $form = new Form($db); $formresources = new FormResource($db); -$out = '
'; +$out = '
'; $out .= '
'; $out .= ''; diff --git a/htdocs/core/tpl/resource_view.tpl.php b/htdocs/core/tpl/resource_view.tpl.php index 76a565cf7d6..d2e0441b60b 100644 --- a/htdocs/core/tpl/resource_view.tpl.php +++ b/htdocs/core/tpl/resource_view.tpl.php @@ -13,7 +13,7 @@ $form= new Form($db); print '
'; -print ''; +print ''; print '
'; print '
'.$langs->trans('Resource').'
'; diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index e5223c86608..02b7aa42315 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -223,7 +223,7 @@ if (($id || $ref) && $action == 'edit') dol_fiche_head(); - print '
'."\n"; + print '
'."\n"; // Common attributes include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_edit.tpl.php'; diff --git a/htdocs/modulebuilder/template/myobject_document.php b/htdocs/modulebuilder/template/myobject_document.php index d9542daf64f..55fcdc6f9eb 100644 --- a/htdocs/modulebuilder/template/myobject_document.php +++ b/htdocs/modulebuilder/template/myobject_document.php @@ -81,8 +81,8 @@ $extralabels = $extrafields->fetch_name_optionals_label('myobject'); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals -//if ($id > 0 || ! empty($ref)) $upload_dir = $conf->sellyoursaas->multidir_output[$object->entity] . "/myobject/" . dol_sanitizeFileName($object->id); -if ($id > 0 || ! empty($ref)) $upload_dir = $conf->sellyoursaas->multidir_output[$object->entity] . "/myobject/" . dol_sanitizeFileName($object->ref); +//if ($id > 0 || ! empty($ref)) $upload_dir = $conf->mymodule->multidir_output[$object->entity?$object->entity:1] . "/myobject/" . dol_sanitizeFileName($object->id); +if ($id > 0 || ! empty($ref)) $upload_dir = $conf->mymodule->multidir_output[$object->entity?$object->entity:1] . "/myobject/" . dol_sanitizeFileName($object->ref); /* diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index f66a037d43a..691daebf894 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2555,7 +2555,7 @@ table.liste th, table.noborder th, table.noborder tr.liste_titre td, table.nobor } table.liste td, table.noborder td, div.noborder form div, table.tableforservicepart1 td, table.tableforservicepart2 td { padding: 7px 8px 7px 8px; /* t r b l */ - line-height: 1.2em; + line-height: 22px; height: 22px; } div.liste_titre_bydiv .divsearchfield { diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 70479584c5a..dfb180f0dad 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -13,7 +13,7 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FI8TNESS FOR A PARTICULAR PURPOSE. See the + * 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 diff --git a/htdocs/theme/eldy/theme_vars.inc.php b/htdocs/theme/eldy/theme_vars.inc.php index 6437fa2de72..f02c25113ef 100644 --- a/htdocs/theme/eldy/theme_vars.inc.php +++ b/htdocs/theme/eldy/theme_vars.inc.php @@ -51,10 +51,10 @@ $colorbacklinepairhover='230,237,244'; // line hover $colorbacklinepairchecked='230,237,244'; // line checked $colorbacklinebreak='223,218,220'; // line break $colorbackbody='255,255,255'; -$colortexttitlenotab='100,60,20'; +$colortexttitlenotab='110,80,20'; $colortexttitle='0,0,0'; $colortext='0,0,0'; -$colortextlink='8, 85, 134'; +$colortextlink='10, 10, 100'; $fontsize='0.86em'; $fontsizesmaller='0.75em'; $topMenuFontSize='1.2em'; From 827a2e18095bc76a1b3f631fd973799b48e42122 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 12:47:02 +0200 Subject: [PATCH 0516/1036] Fix test if qualified for stock change at wrong place --- htdocs/compta/facture/card.php | 213 ++++++++++++++++++--------------- 1 file changed, 117 insertions(+), 96 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 85b4e3bb728..69f647e0757 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -518,20 +518,23 @@ if (empty($reshook)) } } - $qualified_for_stock_change = 0; - if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - $qualified_for_stock_change = $object->hasProductsOrServices(2); - } else { - $qualified_for_stock_change = $object->hasProductsOrServices(1); - } - // Check for warehouse - if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $qualified_for_stock_change) + if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - if (! $idwarehouse || $idwarehouse == - 1) { - $error++; - setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors'); - $action = ''; + $qualified_for_stock_change = 0; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + $qualified_for_stock_change = $object->hasProductsOrServices(2); + } else { + $qualified_for_stock_change = $object->hasProductsOrServices(1); + } + + if ($qualified_for_stock_change) + { + if (! $idwarehouse || $idwarehouse == - 1) { + $error++; + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors'); + $action = ''; + } } } @@ -575,20 +578,23 @@ if (empty($reshook)) $object->fetch($id); $object->fetch_thirdparty(); - $qualified_for_stock_change = 0; - if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - $qualified_for_stock_change = $object->hasProductsOrServices(2); - } else { - $qualified_for_stock_change = $object->hasProductsOrServices(1); - } - // Check parameters - if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $qualified_for_stock_change) + if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - if (! $idwarehouse || $idwarehouse == - 1) { - $error++; - setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors'); - $action = ''; + $qualified_for_stock_change = 0; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + $qualified_for_stock_change = $object->hasProductsOrServices(2); + } else { + $qualified_for_stock_change = $object->hasProductsOrServices(1); + } + + if ($qualified_for_stock_change)) + { + if (! $idwarehouse || $idwarehouse == - 1) { + $error++; + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv("Warehouse")), null, 'errors'); + $action = ''; + } } } @@ -3426,28 +3432,35 @@ elseif ($id > 0 || ! empty($ref)) $text = $langs->trans('ConfirmDeleteBill', $object->ref); $formquestion = array(); - $qualified_for_stock_change = 0; - if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - $qualified_for_stock_change = $object->hasProductsOrServices(2); - } else { - $qualified_for_stock_change = $object->hasProductsOrServices(1); - } - - if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $qualified_for_stock_change && $object->statut >= 1) + if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $object->statut >= 1) { - $langs->load("stocks"); - require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; - $formproduct = new FormProduct($db); - $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockDecrease") : $langs->trans("SelectWarehouseForStockIncrease"); - $forcecombo=0; - if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy - $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), - array('type' => 'other','name' => 'idwarehouse','label' => $label,'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, $langs->trans("NoStockAction"), 0, $forcecombo)) - ); - $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $langs->trans('DeleteBill'), $text, 'confirm_delete', $formquestion, "yes", 1); + $qualified_for_stock_change = 0; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + $qualified_for_stock_change = $object->hasProductsOrServices(2); + } else { + $qualified_for_stock_change = $object->hasProductsOrServices(1); + } + + if ($qualified_for_stock_change) + { + $langs->load("stocks"); + require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; + $formproduct = new FormProduct($db); + $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockDecrease") : $langs->trans("SelectWarehouseForStockIncrease"); + $forcecombo=0; + if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + array('type' => 'other','name' => 'idwarehouse','label' => $label,'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, $langs->trans("NoStockAction"), 0, $forcecombo)) + ); + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $langs->trans('DeleteBill'), $text, 'confirm_delete', $formquestion, "yes", 1); + } + else + { + $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $langs->trans('DeleteBill'), $text, 'confirm_delete', '', 'no', 1); + } } else { $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $langs->trans('DeleteBill'), $text, 'confirm_delete', '', 'no', 1); } @@ -3496,35 +3509,38 @@ elseif ($id > 0 || ! empty($ref)) } $formquestion = array(); - $qualified_for_stock_change = 0; - if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - $qualified_for_stock_change = $object->hasProductsOrServices(2); - } else { - $qualified_for_stock_change = $object->hasProductsOrServices(1); - } - - if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $qualified_for_stock_change) + if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL)) { - $langs->load("stocks"); - require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; - require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php'; - $formproduct = new FormProduct($db); - $warehouse = new Entrepot($db); - $warehouse_array = $warehouse->list_array(); - if (count($warehouse_array) == 1) { - $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockIncrease", current($warehouse_array)) : $langs->trans("WarehouseForStockDecrease", current($warehouse_array)); - $value = ''; + $qualified_for_stock_change = 0; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + $qualified_for_stock_change = $object->hasProductsOrServices(2); } else { - $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockIncrease") : $langs->trans("SelectWarehouseForStockDecrease"); - $value = $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1); + $qualified_for_stock_change = $object->hasProductsOrServices(1); + } + + if ($qualified_for_stock_change) + { + $langs->load("stocks"); + require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; + require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php'; + $formproduct = new FormProduct($db); + $warehouse = new Entrepot($db); + $warehouse_array = $warehouse->list_array(); + if (count($warehouse_array) == 1) { + $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockIncrease", current($warehouse_array)) : $langs->trans("WarehouseForStockDecrease", current($warehouse_array)); + $value = ''; + } else { + $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockIncrease") : $langs->trans("SelectWarehouseForStockDecrease"); + $value = $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1); + } + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => + // 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' + // => 1), + array('type' => 'other','name' => 'idwarehouse','label' => $label,'value' => $value)); } - $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => - // 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' - // => 1), - array('type' => 'other','name' => 'idwarehouse','label' => $label,'value' => $value)); } if ($object->type != Facture::TYPE_CREDIT_NOTE && $object->total_ttc < 0) // Can happen only if $conf->global->FACTURE_ENABLE_NEGATIVE is on { @@ -3538,33 +3554,38 @@ elseif ($id > 0 || ! empty($ref)) $text = $langs->trans('ConfirmUnvalidateBill', $object->ref); $formquestion = array(); - $qualified_for_stock_change = 0; - if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { - $qualified_for_stock_change = $object->hasProductsOrServices(2); - } else { - $qualified_for_stock_change = $object->hasProductsOrServices(1); - } - if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL) && $qualified_for_stock_change) { - $langs->load("stocks"); - require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; - require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php'; - $formproduct = new FormProduct($db); - $warehouse = new Entrepot($db); - $warehouse_array = $warehouse->list_array(); - if (count($warehouse_array) == 1) { - $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockDecrease", current($warehouse_array)) : $langs->trans("WarehouseForStockIncrease", current($warehouse_array)); - $value = ''; + if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL)) + { + $qualified_for_stock_change = 0; + if (empty($conf->global->STOCK_SUPPORTS_SERVICES)) { + $qualified_for_stock_change = $object->hasProductsOrServices(2); } else { - $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockDecrease") : $langs->trans("SelectWarehouseForStockIncrease"); - $value = $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1); + $qualified_for_stock_change = $object->hasProductsOrServices(1); + } + + if ($qualified_for_stock_change) + { + $langs->load("stocks"); + require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php'; + require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php'; + $formproduct = new FormProduct($db); + $warehouse = new Entrepot($db); + $warehouse_array = $warehouse->list_array(); + if (count($warehouse_array) == 1) { + $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("WarehouseForStockDecrease", current($warehouse_array)) : $langs->trans("WarehouseForStockIncrease", current($warehouse_array)); + $value = ''; + } else { + $label = $object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("SelectWarehouseForStockDecrease") : $langs->trans("SelectWarehouseForStockIncrease"); + $value = $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1); + } + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => + // 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' + // => 1), + array('type' => 'other','name' => 'idwarehouse','label' => $label,'value' => $value)); } - $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => - // 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' - // => 1), - array('type' => 'other','name' => 'idwarehouse','label' => $label,'value' => $value)); } $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?facid=' . $object->id, $langs->trans('UnvalidateBill'), $text, 'confirm_modif', $formquestion, "yes", 1); From 91dd8a71d3d07922008ffc4a4e49fef803828ac7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 12:50:00 +0200 Subject: [PATCH 0517/1036] Fix syntax error --- htdocs/compta/facture/card.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 69f647e0757..329ecbbedcc 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -527,7 +527,7 @@ if (empty($reshook)) } else { $qualified_for_stock_change = $object->hasProductsOrServices(1); } - + if ($qualified_for_stock_change) { if (! $idwarehouse || $idwarehouse == - 1) { @@ -587,8 +587,8 @@ if (empty($reshook)) } else { $qualified_for_stock_change = $object->hasProductsOrServices(1); } - - if ($qualified_for_stock_change)) + + if ($qualified_for_stock_change) { if (! $idwarehouse || $idwarehouse == - 1) { $error++; @@ -3440,7 +3440,7 @@ elseif ($id > 0 || ! empty($ref)) } else { $qualified_for_stock_change = $object->hasProductsOrServices(1); } - + if ($qualified_for_stock_change) { $langs->load("stocks"); @@ -3517,7 +3517,7 @@ elseif ($id > 0 || ! empty($ref)) } else { $qualified_for_stock_change = $object->hasProductsOrServices(1); } - + if ($qualified_for_stock_change) { $langs->load("stocks"); @@ -3562,7 +3562,7 @@ elseif ($id > 0 || ! empty($ref)) } else { $qualified_for_stock_change = $object->hasProductsOrServices(1); } - + if ($qualified_for_stock_change) { $langs->load("stocks"); From 83c369cc0f1f9b0fe50dfdea91e8e719df7d04d4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 13:02:33 +0200 Subject: [PATCH 0518/1036] Add $array_to_check for property in invoice instead of thirdparty --- htdocs/compta/facture/card.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 329ecbbedcc..6cef63af90a 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -477,7 +477,7 @@ if (empty($reshook)) // Check parameters - // Check for mandatory fields defined into setup + // Check for mandatory fields in thirdparty (defined into setup) $array_to_check=array('IDPROF1','IDPROF2','IDPROF3','IDPROF4','IDPROF5','IDPROF6','EMAIL'); foreach($array_to_check as $key) { @@ -518,6 +518,23 @@ if (empty($reshook)) } } + // Check for mandatory fields in invoice + $array_to_check=array('REF_CUSTOMER'=>'RefCustomer'); + foreach($array_to_check as $key => $val) + { + $keymin=strtolower($key); + $vallabel=$object->$keymin; + + // Check for mandatory + $keymandatory ='INVOICE_'.$key.'_MANDATORY_FOR_VALIDATION'; + if (! $vallabel && ! empty($conf->global->$keymandatory)) + { + $langs->load("errors"); + $error++; + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv($val)), null, 'errors'); + } + } + // Check for warehouse if ($object->type != Facture::TYPE_DEPOSIT && ! empty($conf->global->STOCK_CALCULATE_ON_BILL)) { From c3732f2b7a06ffd3aae656633355f8d0c9b0a593 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 14:41:47 +0200 Subject: [PATCH 0519/1036] Fix edition of margins in recurring invoices --- htdocs/compta/facture/card.php | 6 +- .../facture/class/facture-rec.class.php | 47 ++-- htdocs/compta/facture/fiche-rec.php | 254 +++++++++--------- htdocs/core/class/commonobject.class.php | 2 +- htdocs/core/tpl/objectline_create.tpl.php | 4 +- htdocs/core/tpl/objectline_edit.tpl.php | 9 +- htdocs/core/tpl/objectline_view.tpl.php | 106 ++++---- 7 files changed, 224 insertions(+), 204 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 6cef63af90a..894e14eefa7 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -1943,7 +1943,7 @@ if (empty($reshook)) if ($result > 0) { - // Define output language + // Define output language and generate document if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { $outputlangs = $langs; @@ -2055,7 +2055,7 @@ if (empty($reshook)) $line->fetch(GETPOST('lineid')); $percent = $line->get_prev_progress($object->id); - if($object->type == Facture::TYPE_CREDIT_NOTE && $object->situation_cycle_ref>0) + if ($object->type == Facture::TYPE_CREDIT_NOTE && $object->situation_cycle_ref>0) { // in case of situation credit note if(GETPOST('progress') >= 0 ) @@ -2147,7 +2147,7 @@ if (empty($reshook)) } } -$result = $object->updateline(GETPOST('lineid'), $description, $pu_ht, $qty, GETPOST('remise_percent'), + $result = $object->updateline(GETPOST('lineid'), $description, $pu_ht, $qty, GETPOST('remise_percent'), $date_start, $date_end, $vat_rate, $localtax1_rate, $localtax2_rate, 'HT', $info_bits, $type, GETPOST('fk_parent_line'), 0, $fournprice, $buyingprice, $label, $special_code, $array_options, GETPOST('progress'), $_POST['units'], $pu_ht_devise); diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 89f324d2450..c1cc9df9e5c 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -527,7 +527,7 @@ class FactureRec extends CommonInvoice $sql = 'SELECT l.rowid, l.fk_product, l.product_type, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.vat_src_code, l.tva_tx, '; $sql.= ' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise, l.remise_percent, l.subprice,'; - $sql.= ' l.info_bits, l.date_start_fill, l.date_end_fill, l.total_ht, l.total_tva, l.total_ttc,'; + $sql.= ' l.info_bits, l.date_start_fill, l.date_end_fill, l.total_ht, l.total_tva, l.total_ttc, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht,'; //$sql.= ' l.situation_percent, l.fk_prev_id,'; //$sql.= ' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise_percent, l.fk_remise_except, l.subprice,'; $sql.= ' l.rang, l.special_code,'; @@ -583,6 +583,11 @@ class FactureRec extends CommonInvoice $line->total_tva = $objp->total_tva; $line->total_ttc = $objp->total_ttc; $line->code_ventilation = $objp->fk_code_ventilation; + $line->fk_fournprice = $objp->fk_fournprice; + $marginInfos = getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht); + $line->pa_ht = $marginInfos[0]; + $line->marge_tx = $marginInfos[1]; + $line->marque_tx = $marginInfos[2]; $line->rang = $objp->rang; $line->special_code = $objp->special_code; $line->fk_unit = $objp->fk_unit; @@ -695,15 +700,17 @@ class FactureRec extends CommonInvoice * @param double $pu_ht_devise Unit price in currency * @param int $date_start_fill 1=Flag to fill start date when generating invoice * @param int $date_end_fill 1=Flag to fill end date when generating invoice + * @param int $fk_fournprice Supplier price id (to calculate margin) or '' + * @param int $pa_ht Buying price of line (to calculate margin) or '' * @return int <0 if KO, Id of line if OK */ - public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type = 'HT', $info_bits = 0, $fk_remise_except = '', $pu_ttc = 0, $type = 0, $rang = -1, $special_code = 0, $label = '', $fk_unit = null, $pu_ht_devise = 0, $date_start_fill = 0, $date_end_fill = 0) + public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type = 'HT', $info_bits = 0, $fk_remise_except = '', $pu_ttc = 0, $type = 0, $rang = -1, $special_code = 0, $label = '', $fk_unit = null, $pu_ht_devise = 0, $date_start_fill = 0, $date_end_fill = 0, $fk_fournprice = null, $pa_ht = 0) { global $mysoc; $facid=$this->id; - dol_syslog(get_class($this)."::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,txlocaltax1=$txlocaltax1,txlocaltax2=$txlocaltax2,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit,pu_ht_devise=$pu_ht_devise,date_start_fill=$date_start_fill,date_end_fill=$date_end_fill", LOG_DEBUG); + dol_syslog(get_class($this)."::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,txlocaltax1=$txlocaltax1,txlocaltax2=$txlocaltax2,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit,pu_ht_devise=$pu_ht_devise,date_start_fill=$date_start_fill,date_end_fill=$date_end_fill,pa_ht=$pa_ht", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; // Check parameters @@ -795,6 +802,8 @@ class FactureRec extends CommonInvoice $sql.= ", total_ttc"; $sql.= ", date_start_fill"; $sql.= ", date_end_fill"; + $sql.= ", fk_product_fournisseur_price"; + $sql.= ", buy_price_ht"; $sql.= ", info_bits"; $sql.= ", rang"; $sql.= ", special_code"; @@ -824,6 +833,8 @@ class FactureRec extends CommonInvoice $sql.= ", ".price2num($total_ttc); $sql.= ", ".(int) $date_start_fill; $sql.= ", ".(int) $date_end_fill; + $sql.= ", ".($fk_fournprice > 0 ? $fk_fournprice : 'null'); + $sql.= ", ".($pa_ht ? price2num($pa_ht) : 0); $sql.= ", ".$info_bits; $sql.= ", ".$rang; $sql.= ", ".$special_code; @@ -877,9 +888,11 @@ class FactureRec extends CommonInvoice * @param int $notrigger disable line update trigger * @param int $date_start_fill 1=Flag to fill start date when generating invoice * @param int $date_end_fill 1=Flag to fill end date when generating invoice + * @param int $fk_fournprice Id of origin supplier price + * @param int $pa_ht Price (without tax) of product when it was bought * @return int <0 if KO, Id of line if OK */ - public function updateline($rowid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type = 'HT', $info_bits = 0, $fk_remise_except = '', $pu_ttc = 0, $type = 0, $rang = -1, $special_code = 0, $label = '', $fk_unit = null, $pu_ht_devise = 0, $notrigger = 0, $date_start_fill = 0, $date_end_fill = 0) + public function updateline($rowid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type = 'HT', $info_bits = 0, $fk_remise_except = '', $pu_ttc = 0, $type = 0, $rang = -1, $special_code = 0, $label = '', $fk_unit = null, $pu_ht_devise = 0, $notrigger = 0, $date_start_fill = 0, $date_end_fill = 0, $fk_fournprice = null, $pa_ht = 0) { global $mysoc; @@ -894,16 +907,6 @@ class FactureRec extends CommonInvoice // Check parameters if ($type < 0) return -1; - $localtaxes_type=getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc); - - // Clean vat code - $vat_src_code=''; - if (preg_match('/\((.*)\)/', $txtva, $reg)) - { - $vat_src_code = $reg[1]; - $txtva = preg_replace('/\s*\(.*\)/', '', $txtva); // Remove code into vatrate. - } - if ($this->brouillon) { // Clean parameters @@ -932,10 +935,20 @@ class FactureRec extends CommonInvoice $pu=$pu_ttc; } - // Calcul du total TTC et de la TVA pour la ligne a partir de - // qty, pu, remise_percent et txtva + // Calculate total with, without tax and tax from qty, pu, remise_percent and txtva // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. + + $localtaxes_type=getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc); + + // Clean vat code + $vat_src_code=''; + if (preg_match('/\((.*)\)/', $txtva, $reg)) + { + $vat_src_code = $reg[1]; + $txtva = preg_replace('/\s*\(.*\)/', '', $txtva); // Remove code into vatrate. + } + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise); $total_ht = $tabprice[0]; @@ -984,6 +997,8 @@ class FactureRec extends CommonInvoice $sql.= ", total_ttc='".price2num($total_ttc)."'"; $sql.= ", date_start_fill=".((int) $date_start_fill); $sql.= ", date_end_fill=".((int) $date_end_fill); + $sql.= ", fk_product_fournisseur_price=".($fk_fournprice > 0 ? $fk_fournprice : 'null'); + $sql.= ", buy_price_ht=".($pa_ht ? price2num($pa_ht) : 0); $sql.= ", info_bits=".$info_bits; $sql.= ", rang=".$rang; $sql.= ", special_code=".$special_code; diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index fa8af87ac29..e490fa57520 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -100,6 +100,20 @@ $permissionnote = $user->rights->facture->creer; // Used by the include of actio $permissiondellink=$user->rights->facture->creer; // Used by the include of actions_dellink.inc.php $permissiontoedit = $user->rights->facture->creer; // Used by the include of actions_lineupdonw.inc.php +$usercanread = $user->rights->facture->lire; +$usercancreate = $user->rights->facture->creer; +$usercanissuepayment = $user->rights->facture->paiement; +$usercandelete = $user->rights->facture->supprimer; +$usercanvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $usercancreate) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->validate))); +$usercansend = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->facture->invoice_advance->send); +$usercanreopen = (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->facture->invoice_advance->reopen); +$usercanunvalidate = ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($usercancreate)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->facture->invoice_advance->unvalidate))); + +$usercanproductignorepricemin = ((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS)); +$usercancreatemargin = $user->rights->margins->creer; +$usercanreadallmargin = $user->rights->margins->liretous; +$usercancreatewithdrarequest = $user->rights->prelevement->bons->creer; + $now = dol_now(); @@ -435,10 +449,12 @@ if (empty($reshook)) $predef=''; $product_desc=(GETPOST('dp_desc')?GETPOST('dp_desc'):''); $price_ht = GETPOST('price_ht'); - if (GETPOST('prod_entry_mode') == 'free') + $price_ht_devise = GETPOST('multicurrency_price_ht'); + $prod_entry_mode = GETPOST('prod_entry_mode', 'alpha'); + if ($prod_entry_mode == 'free') { $idprod=0; - $tva_tx = (GETPOST('tva_tx') ? GETPOST('tva_tx') : 0); + $tva_tx = (GETPOST('tva_tx', 'alpha') ? GETPOST('tva_tx', 'alpha') : 0); } else { @@ -466,11 +482,11 @@ if (empty($reshook)) setEventMessages($langs->trans('ErrorBothFieldCantBeNegative', $langs->transnoentitiesnoconv('UnitPriceHT'), $langs->transnoentitiesnoconv('Qty')), null, 'errors'); $error ++; } - if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && GETPOST('type') < 0) { + if ($prod_entry_mode == 'free' && empty($idprod) && GETPOST('type') < 0) { setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Type')), null, 'errors'); $error ++; } - if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && (! ($price_ht >= 0) || $price_ht == '')) // Unit price can be 0 but not '' + if ($prod_entry_mode == 'free' && empty($idprod) && (! ($price_ht >= 0) || $price_ht == '')) // Unit price can be 0 but not '' { setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("UnitPriceHT")), null, 'errors'); $error ++; @@ -479,7 +495,7 @@ if (empty($reshook)) setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), null, 'errors'); $error ++; } - if (GETPOST('prod_entry_mode') == 'free' && empty($idprod) && empty($product_desc)) { + if ($prod_entry_mode == 'free' && empty($idprod) && empty($product_desc)) { setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Description')), null, 'errors'); $error ++; } @@ -491,128 +507,97 @@ if (empty($reshook)) if (! $error && ($qty >= 0) && (! empty($product_desc) || ! empty($idprod))) { - $ret = $object->fetch($id); - if ($ret < 0) { - dol_print_error($db, $object->error); - exit(); - } - $ret = $object->fetch_thirdparty(); - - // Clean parameters - $date_start = dol_mktime(GETPOST('date_start' . $predef . 'hour'), GETPOST('date_start' . $predef . 'min'), GETPOST('date_start' . $predef . 'sec'), GETPOST('date_start' . $predef . 'month'), GETPOST('date_start' . $predef . 'day'), GETPOST('date_start' . $predef . 'year')); - $date_end = dol_mktime(GETPOST('date_end' . $predef . 'hour'), GETPOST('date_end' . $predef . 'min'), GETPOST('date_end' . $predef . 'sec'), GETPOST('date_end' . $predef . 'month'), GETPOST('date_end' . $predef . 'day'), GETPOST('date_end' . $predef . 'year')); - $price_base_type = (GETPOST('price_base_type', 'alpha') ? GETPOST('price_base_type', 'alpha') : 'HT'); - - // Define special_code for special lines - $special_code = 0; - // if (empty($_POST['qty'])) $special_code=3; // Options should not exists on invoices - - // Ecrase $pu par celui du produit - // Ecrase $desc par celui du produit - // Ecrase $tva_tx par celui du produit - // Ecrase $base_price_type par celui du produit - // Replaces $fk_unit with the product's - if (! empty($idprod)) - { - $prod = new Product($db); - $prod->fetch($idprod); - - $label = ((GETPOST('product_label') && GETPOST('product_label') != $prod->label) ? GETPOST('product_label') : ''); - - // Update if prices fields are defined - $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); - $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); - if (empty($tva_tx)) $tva_npr=0; - - $pu_ht = $prod->price; - $pu_ttc = $prod->price_ttc; - $price_min = $prod->price_min; - $price_base_type = $prod->price_base_type; - - // We define price for product - if (! empty($conf->global->PRODUIT_MULTIPRICES) && ! empty($object->thirdparty->price_level)) - { - $pu_ht = $prod->multiprices[$object->thirdparty->price_level]; - $pu_ttc = $prod->multiprices_ttc[$object->thirdparty->price_level]; - $price_min = $prod->multiprices_min[$object->thirdparty->price_level]; - $price_base_type = $prod->multiprices_base_type[$object->thirdparty->price_level]; - if (! empty($conf->global->PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL)) // using this option is a bug. kept for backward compatibility - { - if (isset($prod->multiprices_tva_tx[$object->thirdparty->price_level])) $tva_tx=$prod->multiprices_tva_tx[$object->thirdparty->price_level]; - if (isset($prod->multiprices_recuperableonly[$object->thirdparty->price_level])) $tva_npr=$prod->multiprices_recuperableonly[$object->thirdparty->price_level]; - if (empty($tva_tx)) $tva_npr=0; - } + $ret = $object->fetch($id); + if ($ret < 0) { + dol_print_error($db, $object->error); + exit(); } - elseif (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) + $ret = $object->fetch_thirdparty(); + + // Clean parameters + $date_start = dol_mktime(GETPOST('date_start' . $predef . 'hour'), GETPOST('date_start' . $predef . 'min'), GETPOST('date_start' . $predef . 'sec'), GETPOST('date_start' . $predef . 'month'), GETPOST('date_start' . $predef . 'day'), GETPOST('date_start' . $predef . 'year')); + $date_end = dol_mktime(GETPOST('date_end' . $predef . 'hour'), GETPOST('date_end' . $predef . 'min'), GETPOST('date_end' . $predef . 'sec'), GETPOST('date_end' . $predef . 'month'), GETPOST('date_end' . $predef . 'day'), GETPOST('date_end' . $predef . 'year')); + $price_base_type = (GETPOST('price_base_type', 'alpha') ? GETPOST('price_base_type', 'alpha') : 'HT'); + + // Define special_code for special lines + $special_code = 0; + // if (empty($_POST['qty'])) $special_code=3; // Options should not exists on invoices + + // Ecrase $pu par celui du produit + // Ecrase $desc par celui du produit + // Ecrase $tva_tx par celui du produit + // Ecrase $base_price_type par celui du produit + // Replaces $fk_unit with the product's + if (! empty($idprod)) { - include_once DOL_DOCUMENT_ROOT . '/product/class/productcustomerprice.class.php'; + $prod = new Product($db); + $prod->fetch($idprod); - $prodcustprice = new Productcustomerprice($db); + $label = ((GETPOST('product_label') && GETPOST('product_label') != $prod->label) ? GETPOST('product_label') : ''); - $filter = array('t.fk_product' => $prod->id,'t.fk_soc' => $object->thirdparty->id); + // Update if prices fields are defined + $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); + $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); + if (empty($tva_tx)) $tva_npr=0; - $result = $prodcustprice->fetch_all('', '', 0, 0, $filter); - if ($result) + // Search the correct price into loaded array product_price_by_qty using id of array retrieved into POST['pqp']. + $pqp = (GETPOST('pbq', 'int') ? GETPOST('pbq', 'int') : 0); + + $datapriceofproduct = $prod->getSellPrice($mysoc, $object->thirdparty, $pqp); + + $pu_ht = $datapriceofproduct['pu_ht']; + $pu_ttc = $datapriceofproduct['pu_ttc']; + $price_min = $datapriceofproduct['price_min']; + $price_base_type = $datapriceofproduct['price_base_type']; + $tva_tx = $datapriceofproduct['tva_tx']; + $tva_npr = $datapriceofproduct['tva_npr']; + + $tmpvat = price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx)); + $tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx)); + + // if price ht was forced (ie: from gui when calculated by margin rate and cost price). TODO Why this ? + if (! empty($price_ht)) { - if (count($prodcustprice->lines) > 0) + $pu_ht = price2num($price_ht, 'MU'); + $pu_ttc = price2num($pu_ht * (1 + ($tmpvat / 100)), 'MU'); + } + // On reevalue prix selon taux tva car taux tva transaction peut etre different + // de ceux du produit par defaut (par exemple si pays different entre vendeur et acheteur). + elseif ($tmpvat != $tmpprodvat) + { + if ($price_base_type != 'HT') { - $pu_ht = price($prodcustprice->lines[0]->price); - $pu_ttc = price($prodcustprice->lines[0]->price_ttc); - $price_base_type = $prodcustprice->lines[0]->price_base_type; - $tva_tx = $prodcustprice->lines[0]->tva_tx; - if ($prodcustprice->lines[0]->default_vat_code && ! preg_match('/\(.*\)/', $tva_tx)) $tva_tx.= ' ('.$prodcustprice->lines[0]->default_vat_code.')'; - $tva_npr = $prodcustprice->lines[0]->recuperableonly; - if (empty($tva_tx)) $tva_npr=0; + $pu_ht = price2num($pu_ttc / (1 + ($tmpvat / 100)), 'MU'); + } + else + { + $pu_ttc = price2num($pu_ht * (1 + ($tmpvat / 100)), 'MU'); } } - } - $tmpvat = price2num(preg_replace('/\s*\(.*\)/', '', $tva_tx)); - $tmpprodvat = price2num(preg_replace('/\s*\(.*\)/', '', $prod->tva_tx)); + $desc = ''; - // if price ht was forced (ie: from gui when calculated by margin rate and cost price). TODO Why this ? - if (! empty($price_ht)) - { - $pu_ht = price2num($price_ht, 'MU'); - $pu_ttc = price2num($pu_ht * (1 + ($tmpvat / 100)), 'MU'); - } - // On reevalue prix selon taux tva car taux tva transaction peut etre different - // de ceux du produit par defaut (par exemple si pays different entre vendeur et acheteur). - elseif ($tmpvat != $tmpprodvat) - { - if ($price_base_type != 'HT') + // Define output language + if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { - $pu_ht = price2num($pu_ttc / (1 + ($tmpvat / 100)), 'MU'); + $outputlangs = $langs; + $newlang = ''; + if (empty($newlang) && GETPOST('lang_id', 'aZ09')) + $newlang = GETPOST('lang_id', 'aZ09'); + if (empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) + { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + $desc = (! empty($prod->multilangs [$outputlangs->defaultlang] ["description"])) ? $prod->multilangs [$outputlangs->defaultlang] ["description"] : $prod->description; } else { - $pu_ttc = price2num($pu_ht * (1 + ($tmpvat / 100)), 'MU'); + $desc = $prod->description; } - } - - $desc = ''; - - // Define output language - if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) - { - $outputlangs = $langs; - $newlang = ''; - if (empty($newlang) && GETPOST('lang_id', 'aZ09')) - $newlang = GETPOST('lang_id', 'aZ09'); - if (empty($newlang)) - $newlang = $object->thirdparty->default_lang; - if (! empty($newlang)) - { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - } - - $desc = (! empty($prod->multilangs [$outputlangs->defaultlang] ["description"])) ? $prod->multilangs [$outputlangs->defaultlang] ["description"] : $prod->description; - } - else - { - $desc = $prod->description; - } $desc = dol_concatdesc($desc, $product_desc); @@ -620,12 +605,33 @@ if (empty($reshook)) if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code))) { $tmptxt = '('; - if (! empty($prod->customcode)) - $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; - if (! empty($prod->customcode) && ! empty($prod->country_code)) - $tmptxt .= ' - '; - if (! empty($prod->country_code)) - $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); + // Define output language + if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { + $outputlangs = $langs; + $newlang = ''; + if (empty($newlang) && GETPOST('lang_id', 'alpha')) + $newlang = GETPOST('lang_id', 'alpha'); + if (empty($newlang)) + $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('products'); + } + if (! empty($prod->customcode)) + $tmptxt .= $outputlangs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) + $tmptxt .= ' - '; + if (! empty($prod->country_code)) + $tmptxt .= $outputlangs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $outputlangs, 0); + } else { + if (! empty($prod->customcode)) + $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) + $tmptxt .= ' - '; + if (! empty($prod->country_code)) + $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); + } $tmptxt .= ')'; $desc = dol_concatdesc($desc, $tmptxt); } @@ -661,18 +667,18 @@ if (empty($reshook)) if ($tva_npr) $info_bits |= 0x01; - if (((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->produit->ignore_price_min_advance)) || empty($conf->global->MAIN_USE_ADVANCED_PERMS) )&& (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min)))) - { + if ($usercanproductignorepricemin && (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min)))) { $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)); setEventMessages($mesg, null, 'errors'); } else { // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill); + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice); if ($result > 0) { + // Define output language and generate document /*if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) { // Define output language @@ -741,7 +747,7 @@ if (empty($reshook)) } } - elseif ($action == 'updateline' && $user->rights->facture->creer && ! GETPOST('cancel', 'alpha')) + elseif ($action == 'updateline' && $usercancreate && ! GETPOST('cancel', 'alpha')) { if (! $object->fetch($id) > 0) dol_print_error($db); $object->fetch_thirdparty(); @@ -855,7 +861,7 @@ if (empty($reshook)) // Update line if (! $error) { -$result = $object->updateline( + $result = $object->updateline( GETPOST('lineid'), $description, $pu_ht, @@ -877,7 +883,9 @@ $result = $object->updateline( $pu_ht_devise, 0, $date_start_fill, - $date_end_fill + $date_end_fill, + $fournprice, + $buyingprice ); if ($result >= 0) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index a32c55a13e8..ab29a100894 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -3913,7 +3913,7 @@ abstract class CommonObject // Define usemargins $usemargins=0; - if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element, array('facture','propal','commande'))) $usemargins=1; + if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element, array('facture','facturerec','propal','commande'))) $usemargins=1; $num = count($this->lines); diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 4a4febe65d3..bf46ecb9890 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -40,7 +40,7 @@ if (empty($object) || ! is_object($object)) { $usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element, array('facture','propal','commande'))) +if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element, array('facture','facturerec','propal','commande'))) { $usemargins=1; } @@ -55,7 +55,7 @@ if (empty($senderissupplier)) $senderissupplier=0; if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; -// Define colspan for button Add +// Define colspan for the button 'Add' $colspan = 3; // Columns: total ht + col edit + col delete if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) $colspan++;//Add column for Total (currency) if required if (in_array($object->element, array('propal','commande','order','facture','facturerec','invoice','supplier_proposal','order_supplier','invoice_supplier'))) $colspan++; // With this, there is a column move button diff --git a/htdocs/core/tpl/objectline_edit.tpl.php b/htdocs/core/tpl/objectline_edit.tpl.php index f4e5634fbc9..ddb737bbdd6 100644 --- a/htdocs/core/tpl/objectline_edit.tpl.php +++ b/htdocs/core/tpl/objectline_edit.tpl.php @@ -40,7 +40,7 @@ if (empty($object) || ! is_object($object)) $usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element, array('facture','propal','commande'))) $usemargins=1; +if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element, array('facture','facturerec','propal','commande'))) $usemargins=1; global $forceall, $senderissupplier, $inputalsopricewithtax; if (empty($dateSelector)) $dateSelector=0; @@ -49,11 +49,10 @@ if (empty($senderissupplier)) $senderissupplier=0; if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; -// Define colspan for button Add +// Define colspan for the button 'Add' $colspan = 3; // Col total ht + col edit + col delete if (! empty($inputalsopricewithtax)) $colspan++; // We add 1 if col total ttc -if (in_array($object->element, array('propal','supplier_proposal','facture','invoice','commande','order','order_supplier','invoice_supplier'))) $colspan++; // With this, there is a column move button -if (empty($user->rights->margins->creer)) $colspan++; +if (in_array($object->element, array('propal','supplier_proposal','facture','facturerec','invoice','commande','order','order_supplier','invoice_supplier'))) $colspan++; // With this, there is a column move button if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) $colspan+=2; ?> @@ -252,7 +251,7 @@ $coldisplay=0; } ?> - + - - global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous) { ?> - - global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous) {?> - - + if (!empty($user->rights->margins->creer)) { ?> + + + global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous) { ?> + + global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous) {?> + + special_code == 3) { ?> @@ -300,51 +298,51 @@ $domData .= ' data-product_type="'.$line->product_type.'"'; statut == 0 && ($object_rights->creer) && $action != 'selectlines' ) { ?> - + + + - - + if ($num > 1 && $conf->browser->layout != 'phone' && ($this->situation_counter == 1 || !$this->situation_cycle_ref) && empty($disablemove)) { ?> + + + + 1 && $conf->browser->layout != 'phone' && ($this->situation_counter == 1 || !$this->situation_cycle_ref) && empty($disablemove)) { ?> - - - - - - - + + - - + + if($action == 'selectlines'){ ?> + From ec922d3d1714c710d1e6a5e390ddb11868002152 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 14:54:09 +0200 Subject: [PATCH 0520/1036] Add CONTRACT_HIDE_PLANNED_DATE_ON_PDF and CONTRACT_HIDE_REAL_DATE_ON_PDF --- .../modules/contract/doc/pdf_strato.modules.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/htdocs/core/modules/contract/doc/pdf_strato.modules.php b/htdocs/core/modules/contract/doc/pdf_strato.modules.php index 03dae9cbe5e..97fedf45808 100644 --- a/htdocs/core/modules/contract/doc/pdf_strato.modules.php +++ b/htdocs/core/modules/contract/doc/pdf_strato.modules.php @@ -353,11 +353,17 @@ class pdf_strato extends ModelePDFContract $desc=dol_htmlentitiesbr($objectligne->desc, 1); // Desc (not empty for free lines) $txt=''; $txt.=$outputlangs->transnoentities("Quantity").' : '.$objectligne->qty.' - '.$outputlangs->transnoentities("UnitPrice").' : '.price($objectligne->subprice).''; // Desc (not empty for free lines) - $txt.='
'; - $txt.=$outputlangs->transnoentities("DateStartPlannedShort")." : ".$datei." - ".$outputlangs->transnoentities("DateEndPlanned")." : ".$datee.''; - $txt.='
'; - $txt.=$outputlangs->transnoentities("DateStartRealShort")." : ".$daters.''; - if ($objectligne->date_cloture) $txt.=" - ".$outputlangs->transnoentities("DateEndRealShort")." : ''".$datere.''; + if (empty($conf->global->CONTRACT_HIDE_PLANNED_DATE_ON_PDF)) + { + $txt.='
'; + $txt.=$outputlangs->transnoentities("DateStartPlannedShort")." : ".$datei." - ".$outputlangs->transnoentities("DateEndPlanned")." : ".$datee.''; + } + if (empty($conf->global->CONTRACT_HIDE_REAL_DATE_ON_PDF)) + { + $txt.='
'; + $txt.=$outputlangs->transnoentities("DateStartRealShort")." : ".$daters.''; + if ($objectligne->date_cloture) $txt.=" - ".$outputlangs->transnoentities("DateEndRealShort")." : ''".$datere.''; + } $pdf->startTransaction(); $pdf->writeHTMLCell(0, 0, $curX, $curY, dol_concatdesc($txtpredefinedservice, dol_concatdesc($txt, $desc)), 0, 1, 0); From 321544b3fae3aa9bff703cb761166c5c39238682 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 15:25:39 +0200 Subject: [PATCH 0521/1036] Fix phpcs --- htdocs/compta/facture/fiche-rec.php | 401 ++++++++++++++++++---------- 1 file changed, 264 insertions(+), 137 deletions(-) diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index e490fa57520..867b4e8df30 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -281,6 +281,141 @@ if (empty($reshook)) // Set mode elseif ($action == 'setmode' && $user->rights->facture->creer) { + // Add custom code and origin country into description + if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code))) + { + $tmptxt = '('; + // Define output language + if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { + $outputlangs = $langs; + $newlang = ''; + if (empty($newlang) && GETPOST('lang_id', 'alpha')) $newlang = GETPOST('lang_id', 'alpha'); + if (empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('products'); + } + if (! empty($prod->customcode)) $tmptxt .= $outputlangs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) $tmptxt .= ' - '; + if (! empty($prod->country_code)) $tmptxt .= $outputlangs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $outputlangs, 0); + } else { + if (! empty($prod->customcode)) $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) $tmptxt .= ' - '; + if (! empty($prod->country_code)) $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); + } + $tmptxt .= ')'; + $desc = dol_concatdesc($desc, $tmptxt); + } + + $type = $prod->type; + $fk_unit = $prod->fk_unit; + } + else + { + $pu_ht = price2num($price_ht, 'MU'); + $pu_ttc = price2num(GETPOST('price_ttc'), 'MU'); + $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0); + $tva_tx = str_replace('*', '', $tva_tx); + if (empty($tva_tx)) $tva_npr=0; + $label = (GETPOST('product_label') ? GETPOST('product_label') : ''); + $desc = $product_desc; + $type = GETPOST('type'); + $fk_unit= GETPOST('units', 'alpha'); + } + + $date_start_fill = GETPOST('date_start_fill', 'int'); + $date_end_fill = GETPOST('date_end_fill', 'int'); + + // Margin + $fournprice = price2num(GETPOST('fournprice' . $predef) ? GETPOST('fournprice' . $predef) : ''); + $buyingprice = price2num(GETPOST('buying_price' . $predef) != '' ? GETPOST('buying_price' . $predef) : ''); // If buying_price is '0', we must keep this value + + // Local Taxes + $localtax1_tx = get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr); + $localtax2_tx = get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr); + + $info_bits = 0; + if ($tva_npr) + $info_bits |= 0x01; + + if ($usercanproductignorepricemin && (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min)))) { + $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)); + setEventMessages($mesg, null, 'errors'); + } + else + { + // Insert line + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice); + + if ($result > 0) + { + // Define output language and generate document + /*if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang = GETPOST('lang_id','aZ09'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); + }*/ + $object->fetch($object->id); // Reload lines + + unset($_POST['prod_entry_mode']); + + unset($_POST['qty']); + unset($_POST['type']); + unset($_POST['remise_percent']); + unset($_POST['price_ht']); + unset($_POST['multicurrency_price_ht']); + unset($_POST['price_ttc']); + unset($_POST['tva_tx']); + unset($_POST['product_ref']); + unset($_POST['product_label']); + unset($_POST['product_desc']); + unset($_POST['fournprice']); + unset($_POST['buying_price']); + unset($_POST['np_marginRate']); + unset($_POST['np_markRate']); + unset($_POST['dp_desc']); + unset($_POST['idprod']); + unset($_POST['units']); + + unset($_POST['date_starthour']); + unset($_POST['date_startmin']); + unset($_POST['date_startsec']); + unset($_POST['date_startday']); + unset($_POST['date_startmonth']); + unset($_POST['date_startyear']); + unset($_POST['date_endhour']); + unset($_POST['date_endmin']); + unset($_POST['date_endsec']); + unset($_POST['date_endday']); + unset($_POST['date_endmonth']); + unset($_POST['date_endyear']); + + unset($_POST['date_start_fill']); + unset($_POST['date_end_fill']); + + unset($_POST['situations']); + unset($_POST['progress']); + } + else + { + setEventMessages($object->error, $object->errors, 'errors'); + } + + $action = ''; + } $result=$object->setPaymentMethods(GETPOST('mode_reglement_id', 'int')); } // Set project @@ -599,151 +734,143 @@ if (empty($reshook)) $desc = $prod->description; } - $desc = dol_concatdesc($desc, $product_desc); + $desc = dol_concatdesc($desc, $product_desc); - // Add custom code and origin country into description - if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code))) - { - $tmptxt = '('; - // Define output language - if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { - $outputlangs = $langs; - $newlang = ''; - if (empty($newlang) && GETPOST('lang_id', 'alpha')) - $newlang = GETPOST('lang_id', 'alpha'); - if (empty($newlang)) - $newlang = $object->thirdparty->default_lang; - if (! empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - $outputlangs->load('products'); - } - if (! empty($prod->customcode)) - $tmptxt .= $outputlangs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; - if (! empty($prod->customcode) && ! empty($prod->country_code)) - $tmptxt .= ' - '; - if (! empty($prod->country_code)) - $tmptxt .= $outputlangs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $outputlangs, 0); - } else { - if (! empty($prod->customcode)) - $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; - if (! empty($prod->customcode) && ! empty($prod->country_code)) - $tmptxt .= ' - '; - if (! empty($prod->country_code)) - $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); + // Add custom code and origin country into description + if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code))) + { + $tmptxt = '('; + // Define output language + if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { + $outputlangs = $langs; + $newlang = ''; + if (empty($newlang) && GETPOST('lang_id', 'alpha')) $newlang = GETPOST('lang_id', 'alpha'); + if (empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('products'); + } + if (! empty($prod->customcode)) $tmptxt .= $outputlangs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) $tmptxt .= ' - '; + if (! empty($prod->country_code)) $tmptxt .= $outputlangs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $outputlangs, 0); + } else { + if (! empty($prod->customcode)) $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; + if (! empty($prod->customcode) && ! empty($prod->country_code)) $tmptxt .= ' - '; + if (! empty($prod->country_code)) $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); + } + $tmptxt .= ')'; + $desc = dol_concatdesc($desc, $tmptxt); } - $tmptxt .= ')'; - $desc = dol_concatdesc($desc, $tmptxt); - } - $type = $prod->type; - $fk_unit = $prod->fk_unit; - } - else - { - $pu_ht = price2num($price_ht, 'MU'); - $pu_ttc = price2num(GETPOST('price_ttc'), 'MU'); - $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0); - $tva_tx = str_replace('*', '', $tva_tx); - if (empty($tva_tx)) $tva_npr=0; - $label = (GETPOST('product_label') ? GETPOST('product_label') : ''); - $desc = $product_desc; - $type = GETPOST('type'); - $fk_unit= GETPOST('units', 'alpha'); - } - - $date_start_fill = GETPOST('date_start_fill', 'int'); - $date_end_fill = GETPOST('date_end_fill', 'int'); - - // Margin - $fournprice = price2num(GETPOST('fournprice' . $predef) ? GETPOST('fournprice' . $predef) : ''); - $buyingprice = price2num(GETPOST('buying_price' . $predef) != '' ? GETPOST('buying_price' . $predef) : ''); // If buying_price is '0', we must keep this value - - // Local Taxes - $localtax1_tx = get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr); - $localtax2_tx = get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr); - - $info_bits = 0; - if ($tva_npr) - $info_bits |= 0x01; - - if ($usercanproductignorepricemin && (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min)))) { - $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)); - setEventMessages($mesg, null, 'errors'); - } - else - { - // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice); - - if ($result > 0) - { - // Define output language and generate document - /*if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) - { - // Define output language - $outputlangs = $langs; - $newlang = ''; - if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang = GETPOST('lang_id','aZ09'); - if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; - if (! empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - } - $model=$object->modelpdf; - $ret = $object->fetch($id); // Reload to get new records - - $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); - if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); - }*/ - $object->fetch($object->id); // Reload lines - - unset($_POST['prod_entry_mode']); - - unset($_POST['qty']); - unset($_POST['type']); - unset($_POST['remise_percent']); - unset($_POST['price_ht']); - unset($_POST['multicurrency_price_ht']); - unset($_POST['price_ttc']); - unset($_POST['tva_tx']); - unset($_POST['product_ref']); - unset($_POST['product_label']); - unset($_POST['product_desc']); - unset($_POST['fournprice']); - unset($_POST['buying_price']); - unset($_POST['np_marginRate']); - unset($_POST['np_markRate']); - unset($_POST['dp_desc']); - unset($_POST['idprod']); - unset($_POST['units']); - - unset($_POST['date_starthour']); - unset($_POST['date_startmin']); - unset($_POST['date_startsec']); - unset($_POST['date_startday']); - unset($_POST['date_startmonth']); - unset($_POST['date_startyear']); - unset($_POST['date_endhour']); - unset($_POST['date_endmin']); - unset($_POST['date_endsec']); - unset($_POST['date_endday']); - unset($_POST['date_endmonth']); - unset($_POST['date_endyear']); - - unset($_POST['date_start_fill']); - unset($_POST['date_end_fill']); - - unset($_POST['situations']); - unset($_POST['progress']); + $type = $prod->type; + $fk_unit = $prod->fk_unit; } else { - setEventMessages($object->error, $object->errors, 'errors'); + $pu_ht = price2num($price_ht, 'MU'); + $pu_ttc = price2num(GETPOST('price_ttc'), 'MU'); + $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0); + $tva_tx = str_replace('*', '', $tva_tx); + if (empty($tva_tx)) $tva_npr=0; + $label = (GETPOST('product_label') ? GETPOST('product_label') : ''); + $desc = $product_desc; + $type = GETPOST('type'); + $fk_unit= GETPOST('units', 'alpha'); } - $action = ''; - } + $date_start_fill = GETPOST('date_start_fill', 'int'); + $date_end_fill = GETPOST('date_end_fill', 'int'); + + // Margin + $fournprice = price2num(GETPOST('fournprice' . $predef) ? GETPOST('fournprice' . $predef) : ''); + $buyingprice = price2num(GETPOST('buying_price' . $predef) != '' ? GETPOST('buying_price' . $predef) : ''); // If buying_price is '0', we must keep this value + + // Local Taxes + $localtax1_tx = get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr); + $localtax2_tx = get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr); + + $info_bits = 0; + if ($tva_npr) + $info_bits |= 0x01; + + if ($usercanproductignorepricemin && (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min)))) { + $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)); + setEventMessages($mesg, null, 'errors'); + } + else + { + // Insert line + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice); + + if ($result > 0) + { + // Define output language and generate document + /*if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) + { + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang = GETPOST('lang_id','aZ09'); + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; + if (! empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + $model=$object->modelpdf; + $ret = $object->fetch($id); // Reload to get new records + + $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); + }*/ + $object->fetch($object->id); // Reload lines + + unset($_POST['prod_entry_mode']); + + unset($_POST['qty']); + unset($_POST['type']); + unset($_POST['remise_percent']); + unset($_POST['price_ht']); + unset($_POST['multicurrency_price_ht']); + unset($_POST['price_ttc']); + unset($_POST['tva_tx']); + unset($_POST['product_ref']); + unset($_POST['product_label']); + unset($_POST['product_desc']); + unset($_POST['fournprice']); + unset($_POST['buying_price']); + unset($_POST['np_marginRate']); + unset($_POST['np_markRate']); + unset($_POST['dp_desc']); + unset($_POST['idprod']); + unset($_POST['units']); + + unset($_POST['date_starthour']); + unset($_POST['date_startmin']); + unset($_POST['date_startsec']); + unset($_POST['date_startday']); + unset($_POST['date_startmonth']); + unset($_POST['date_startyear']); + unset($_POST['date_endhour']); + unset($_POST['date_endmin']); + unset($_POST['date_endsec']); + unset($_POST['date_endday']); + unset($_POST['date_endmonth']); + unset($_POST['date_endyear']); + + unset($_POST['date_start_fill']); + unset($_POST['date_end_fill']); + + unset($_POST['situations']); + unset($_POST['progress']); + } + else + { + setEventMessages($object->error, $object->errors, 'errors'); + } + + $action = ''; + } } } From 2a2fcf6784843606297ab573cc86edf3425ed158 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 15:38:33 +0200 Subject: [PATCH 0522/1036] FIX only profid1 to 4 were editable for pdf option to show. Not 5 and 6. --- htdocs/admin/pdf.php | 180 ++++++++++--------------------------------- 1 file changed, 40 insertions(+), 140 deletions(-) diff --git a/htdocs/admin/pdf.php b/htdocs/admin/pdf.php index 37c836043a0..70fa3dc38b7 100644 --- a/htdocs/admin/pdf.php +++ b/htdocs/admin/pdf.php @@ -61,6 +61,8 @@ if ($action == 'update') dolibarr_set_const($db, "MAIN_PROFID2_IN_ADDRESS", $_POST["MAIN_PROFID2_IN_ADDRESS"],'chaine',0,'', $conf->entity); dolibarr_set_const($db, "MAIN_PROFID3_IN_ADDRESS", $_POST["MAIN_PROFID3_IN_ADDRESS"],'chaine',0,'', $conf->entity); dolibarr_set_const($db, "MAIN_PROFID4_IN_ADDRESS", $_POST["MAIN_PROFID4_IN_ADDRESS"],'chaine',0,'', $conf->entity); + dolibarr_set_const($db, "MAIN_PROFID5_IN_ADDRESS", $_POST["MAIN_PROFID5_IN_ADDRESS"],'chaine',0,'', $conf->entity); + dolibarr_set_const($db, "MAIN_PROFID6_IN_ADDRESS", $_POST["MAIN_PROFID6_IN_ADDRESS"],'chaine',0,'', $conf->entity); dolibarr_set_const($db, "MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT", $_POST["MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT"],'chaine',0,'', $conf->entity); dolibarr_set_const($db, "MAIN_TVAINTRA_NOT_IN_ADDRESS", $_POST["MAIN_TVAINTRA_NOT_IN_ADDRESS"],'chaine',0,'', $conf->entity); @@ -177,76 +179,25 @@ if ($action == 'edit') // Edit print $form->selectyesno('MAIN_TVAINTRA_NOT_IN_ADDRESS',(! empty($conf->global->MAIN_TVAINTRA_NOT_IN_ADDRESS))?$conf->global->MAIN_TVAINTRA_NOT_IN_ADDRESS:0,1); print ''; - // Show prof id 1 in address into pdf - - if (! $noCountryCode) + // Show prof id in address into pdf + for($i=1; $i<=6; $i++) { - $pid1=$langs->transcountry("ProfId1",$mysoc->country_code); - if ($pid1 == '-') $pid1=false; - } - else - { - $pid1 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid1) - { - print '
'; - } - - // Show prof id 2 in address into pdf - - if (! $noCountryCode) - { - $pid2=$langs->transcountry("ProfId2",$mysoc->country_code); - if ($pid2 == '-') $pid2=false; - } - else - { - $pid2 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid2) - { - print ''; - } - - // Show prof id 3 in address into pdf - - if (! $noCountryCode) - { - $pid3=$langs->transcountry("ProfId3",$mysoc->country_code); - if ($pid3 == '-') $pid3=false; - } - else - { - $pid3 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid3) - { - print ''; - } - - // Show prof id 4 in address into pdf - - if (! $noCountryCode) - { - $pid4=$langs->transcountry("ProfId4",$mysoc->country_code); - if ($pid4 == '-') $pid4=false; - } - else - { - $pid4 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid4) - { - print ''; + if (! $noCountryCode) + { + $pid=$langs->transcountry("ProfId".$i, $mysoc->country_code); + if ($pid == '-') $pid=false; + } + else + { + $pid = img_warning().' '.$langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CompanyCountry")).''; + } + if ($pid) + { + print ''; + } } print '
">
"> diff --git a/htdocs/core/tpl/objectline_view.tpl.php b/htdocs/core/tpl/objectline_view.tpl.php index 09bedf2ec53..53c55a8163b 100644 --- a/htdocs/core/tpl/objectline_view.tpl.php +++ b/htdocs/core/tpl/objectline_view.tpl.php @@ -48,7 +48,7 @@ if (empty($object) || ! is_object($object)) global $forceall, $senderissupplier, $inputalsopricewithtax, $outputalsopricetotalwithtax; $usemargins=0; -if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element, array('facture','propal','commande'))) $usemargins=1; +if (! empty($conf->margin->enabled) && ! empty($object->element) && in_array($object->element, array('facture','facturerec','propal','commande'))) $usemargins=1; if (empty($dateSelector)) $dateSelector=0; if (empty($forceall)) $forceall=0; @@ -253,19 +253,17 @@ $domData .= ' data-product_type="'.$line->product_type.'"'; if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id)) { - ?> - - rights->margins->creer)) { ?> -
pa_ht); ?>pa_ht == 0)?'n/a':price($line->marge_tx, null, null, null, null, $rounding).'%'); ?>marque_tx, null, null, null, null, $rounding).'%'; ?>pa_ht); ?>pa_ht == 0)?'n/a':price($line->marge_tx, null, null, null, null, $rounding).'%'); ?>marque_tx, null, null, null, null, $rounding).'%'; ?>trans('Option'); ?> - info_bits & 2) == 2 || ! empty($disableedit)) { ?> - - id.'#line_'.$line->id; ?>"> - - - - + info_bits & 2) == 2 || ! empty($disableedit)) { ?> + + id.'#line_'.$line->id; ?>"> + + + + + fk_prev_id == null ) && empty($disableremove)) { //La suppression n'est autorisée que si il n'y a pas de ligne dans une précédente situation + print 'id . '">'; + print img_delete(); + print ''; + } + ?> + fk_prev_id == null ) && empty($disableremove)) { //La suppression n'est autorisée que si il n'y a pas de ligne dans une précédente situation - print 'id . '">'; - print img_delete(); - print ''; - } - ?> - + 0) { ?> + id; ?>"> + + + + + id; ?>"> + + + + browser->layout != 'phone' && empty($disablemove)) ?' class="linecolmove tdlineupdown center"':' class="linecolmove center"'); ?>> - 0) { ?> - id; ?>"> - - - - - id; ?>"> - - - - browser->layout != 'phone' && empty($disablemove)) ?' class="linecolmove tdlineupdown center"':' class="linecolmove center"'); ?>>
'.$langs->trans("ShowProfIdInAddress").' - '.$pid1.''; - print $form->selectyesno('MAIN_PROFID1_IN_ADDRESS',isset($conf->global->MAIN_PROFID1_IN_ADDRESS)?$conf->global->MAIN_PROFID1_IN_ADDRESS:0,1,$noCountryCode); - print '
'.$langs->trans("ShowProfIdInAddress").' - '.$pid2.''; - print $form->selectyesno('MAIN_PROFID2_IN_ADDRESS',isset($conf->global->MAIN_PROFID2_IN_ADDRESS)?$conf->global->MAIN_PROFID2_IN_ADDRESS:0,1,$noCountryCode); - print '
'.$langs->trans("ShowProfIdInAddress").' - '.$pid3.''; - print $form->selectyesno('MAIN_PROFID3_IN_ADDRESS',isset($conf->global->MAIN_PROFID3_IN_ADDRESS)?$conf->global->MAIN_PROFID3_IN_ADDRESS:0,1,$noCountryCode); - print '
'.$langs->trans("ShowProfIdInAddress").' - '.$pid4.''; - print $form->selectyesno('MAIN_PROFID4_IN_ADDRESS',isset($conf->global->MAIN_PROFID4_IN_ADDRESS)?$conf->global->MAIN_PROFID4_IN_ADDRESS:0,1,$noCountryCode); - print '
'.$langs->trans("ShowProfIdInAddress").' - '.$pid.''; + $keyforconstant = 'MAIN_PROFID'.$i.'_IN_ADDRESS'; + print $form->selectyesno($keyforconstant, isset($conf->global->$keyforconstant)?$conf->global->$keyforconstant:0, 1, $noCountryCode); + print '
'; @@ -419,77 +370,26 @@ else // Show print yn($conf->global->MAIN_TVAINTRA_NOT_IN_ADDRESS,1); print ''; - // Show prof id 1 in address into pdf - - if (! $noCountryCode) - { - $pid1=$langs->transcountry("ProfId1",$mysoc->country_code); - if ($pid1 == '-') $pid1=false; - } - else - { - $pid1 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid1) - { - print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid1.''; - print yn($conf->global->MAIN_PROFID1_IN_ADDRESS,1); - print ''; - } - - // Show prof id 2 in address into pdf - - if (! $noCountryCode) - { - $pid2=$langs->transcountry("ProfId2",$mysoc->country_code); - if ($pid2 == '-') $pid2=false; - } - else - { - $pid2 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid2) - { - print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid2.''; - print yn($conf->global->MAIN_PROFID2_IN_ADDRESS,1); - print ''; - } - - // Show prof id 3 in address into pdf - - if (! $noCountryCode) - { - $pid3=$langs->transcountry("ProfId3",$mysoc->country_code); - if ($pid3 == '-') $pid3=false; - } - else - { - $pid3 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid3) - { - print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid3.''; - print yn($conf->global->MAIN_PROFID3_IN_ADDRESS,1); - print ''; - } - - // Show prof id 4 in address into pdf - - if (! $noCountryCode) - { - $pid4=$langs->transcountry("ProfId4",$mysoc->country_code); - if ($pid4 == '-') $pid4=false; - } - else - { - $pid4 = img_warning().' '.$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("CompanyCountry")).''; - } - if ($pid4) - { - print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid4.''; - print yn($conf->global->MAIN_PROFID4_IN_ADDRESS,1); - print ''; - } + // Show prof id in address into pdf + for ($i=1; $i<=6; $i++) + { + if (! $noCountryCode) + { + $pid=$langs->transcountry("ProfId".$i, $mysoc->country_code); + if ($pid == '-') $pid=false; + } + else + { + $pid = img_warning().' '.$langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CompanyCountry")).''; + } + if ($pid) + { + print ''.$langs->trans("ShowProfIdInAddress").' - '.$pid.''; + $keyforconstant = 'MAIN_PROFID'.$i.'_IN_ADDRESS'; + print yn($conf->global->$keyforconstant, 1); + print ''; + } + } print ''."\n"; print '
'; From 6365c7cd00b0a0c05d5fbc7685228395ba2a504a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 May 2019 12:17:07 +0200 Subject: [PATCH 0523/1036] Bad cut and paste --- htdocs/compta/facture/fiche-rec.php | 135 ---------------------------- 1 file changed, 135 deletions(-) diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index 867b4e8df30..5eedb9b5740 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -281,141 +281,6 @@ if (empty($reshook)) // Set mode elseif ($action == 'setmode' && $user->rights->facture->creer) { - // Add custom code and origin country into description - if (empty($conf->global->MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE) && (! empty($prod->customcode) || ! empty($prod->country_code))) - { - $tmptxt = '('; - // Define output language - if (! empty($conf->global->MAIN_MULTILANGS) && ! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) { - $outputlangs = $langs; - $newlang = ''; - if (empty($newlang) && GETPOST('lang_id', 'alpha')) $newlang = GETPOST('lang_id', 'alpha'); - if (empty($newlang)) $newlang = $object->thirdparty->default_lang; - if (! empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - $outputlangs->load('products'); - } - if (! empty($prod->customcode)) $tmptxt .= $outputlangs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; - if (! empty($prod->customcode) && ! empty($prod->country_code)) $tmptxt .= ' - '; - if (! empty($prod->country_code)) $tmptxt .= $outputlangs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $outputlangs, 0); - } else { - if (! empty($prod->customcode)) $tmptxt .= $langs->transnoentitiesnoconv("CustomCode") . ': ' . $prod->customcode; - if (! empty($prod->customcode) && ! empty($prod->country_code)) $tmptxt .= ' - '; - if (! empty($prod->country_code)) $tmptxt .= $langs->transnoentitiesnoconv("CountryOrigin") . ': ' . getCountry($prod->country_code, 0, $db, $langs, 0); - } - $tmptxt .= ')'; - $desc = dol_concatdesc($desc, $tmptxt); - } - - $type = $prod->type; - $fk_unit = $prod->fk_unit; - } - else - { - $pu_ht = price2num($price_ht, 'MU'); - $pu_ttc = price2num(GETPOST('price_ttc'), 'MU'); - $tva_npr = (preg_match('/\*/', $tva_tx) ? 1 : 0); - $tva_tx = str_replace('*', '', $tva_tx); - if (empty($tva_tx)) $tva_npr=0; - $label = (GETPOST('product_label') ? GETPOST('product_label') : ''); - $desc = $product_desc; - $type = GETPOST('type'); - $fk_unit= GETPOST('units', 'alpha'); - } - - $date_start_fill = GETPOST('date_start_fill', 'int'); - $date_end_fill = GETPOST('date_end_fill', 'int'); - - // Margin - $fournprice = price2num(GETPOST('fournprice' . $predef) ? GETPOST('fournprice' . $predef) : ''); - $buyingprice = price2num(GETPOST('buying_price' . $predef) != '' ? GETPOST('buying_price' . $predef) : ''); // If buying_price is '0', we must keep this value - - // Local Taxes - $localtax1_tx = get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr); - $localtax2_tx = get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr); - - $info_bits = 0; - if ($tva_npr) - $info_bits |= 0x01; - - if ($usercanproductignorepricemin && (! empty($price_min) && (price2num($pu_ht) * (1 - price2num($remise_percent) / 100) < price2num($price_min)))) { - $mesg = $langs->trans("CantBeLessThanMinPrice", price(price2num($price_min, 'MU'), 0, $langs, 0, 0, - 1, $conf->currency)); - setEventMessages($mesg, null, 'errors'); - } - else - { - // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit, 0, $date_start_fill, $date_end_fill, $fournprice, $buyingprice); - - if ($result > 0) - { - // Define output language and generate document - /*if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) - { - // Define output language - $outputlangs = $langs; - $newlang = ''; - if ($conf->global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id','aZ09')) $newlang = GETPOST('lang_id','aZ09'); - if ($conf->global->MAIN_MULTILANGS && empty($newlang)) $newlang = $object->thirdparty->default_lang; - if (! empty($newlang)) { - $outputlangs = new Translate("", $conf); - $outputlangs->setDefaultLang($newlang); - } - $model=$object->modelpdf; - $ret = $object->fetch($id); // Reload to get new records - - $result = $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); - if ($result < 0) setEventMessages($object->error, $object->errors, 'errors'); - }*/ - $object->fetch($object->id); // Reload lines - - unset($_POST['prod_entry_mode']); - - unset($_POST['qty']); - unset($_POST['type']); - unset($_POST['remise_percent']); - unset($_POST['price_ht']); - unset($_POST['multicurrency_price_ht']); - unset($_POST['price_ttc']); - unset($_POST['tva_tx']); - unset($_POST['product_ref']); - unset($_POST['product_label']); - unset($_POST['product_desc']); - unset($_POST['fournprice']); - unset($_POST['buying_price']); - unset($_POST['np_marginRate']); - unset($_POST['np_markRate']); - unset($_POST['dp_desc']); - unset($_POST['idprod']); - unset($_POST['units']); - - unset($_POST['date_starthour']); - unset($_POST['date_startmin']); - unset($_POST['date_startsec']); - unset($_POST['date_startday']); - unset($_POST['date_startmonth']); - unset($_POST['date_startyear']); - unset($_POST['date_endhour']); - unset($_POST['date_endmin']); - unset($_POST['date_endsec']); - unset($_POST['date_endday']); - unset($_POST['date_endmonth']); - unset($_POST['date_endyear']); - - unset($_POST['date_start_fill']); - unset($_POST['date_end_fill']); - - unset($_POST['situations']); - unset($_POST['progress']); - } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - } - - $action = ''; - } $result=$object->setPaymentMethods(GETPOST('mode_reglement_id', 'int')); } // Set project From 54441a1abda3ef245ec5ea202e81cb251c81033c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 21 May 2019 12:36:18 +0200 Subject: [PATCH 0524/1036] Fix css --- htdocs/main.inc.php | 6 +++--- htdocs/theme/eldy/dropdown.inc.php | 6 +++--- htdocs/theme/md/dropdown.inc.php | 18 ++++++++++++++++++ htdocs/theme/md/style.css.php | 6 ++++-- 4 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 htdocs/theme/md/dropdown.inc.php diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index b0036b01ed4..a7d0669db22 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1811,11 +1811,11 @@ function top_menu_user(User $user, Translate $langs) $btnUser = ' - - - - -
-
-
-
-
-

successful cases

- -
-
-
-
-
- - - -
-
-

Latest News

-
- fetchAll($website->id, 'DESC', 'date_creation', $MAXNEWS, 0, array('type_container'=>'blogpost', 'lang'=>'en_US')); - foreach($arrayofblogs as $blog) - { - $fuser->fetch($blog->fk_user_creat); - ?> - - - -
-
-
- - - - - -
- - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page125.tpl.php b/htdocs/install/doctemplates/websites/template/page125.tpl.php deleted file mode 100644 index dd472fedebc..00000000000 --- a/htdocs/install/doctemplates/websites/template/page125.tpl.php +++ /dev/null @@ -1,97 +0,0 @@ - - - -Privacy Policies - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - - - -
-
-
-
-
-
-
-
-
Privacy Policy -
-
-
-
-
-
-
-
- -


- -
-
-

Information collected and used


-

* Your customer information (email, phone, business name, first and last name of contact, address, postal code, country and VAT number) are stored when you become a customer. This information allows us to bill you. -

* If you paid using our online service, we also store the last 4 digits of your card. The full details of your credit card is stored by our payment provider Stripe (the world leader in online payment).

-

* You have the option to request the deletion of your data and the above information at any time (except data required y fiscal tracking rules, like your invoices).

-

* The Privacy Policies and GDPR referral contact for our services is: global->MAIN_INFO_GDPR; ?>

-


-

Data Storage and Backups


-

* The storage of collected data (see 'Information collected and used') is done in a database.

-

* We made one backup every week. Only 4 weeks are kept.

-


-

Subcontractor


-

* Our services relies on the following subcontractors and service:
-** The host of computer servers, which is ABC company. These servers are hosted in US. No customer information is communicated to this subcontractor who only provides the hardware and network layer, the installation and operation being carried out by us directly.
-** The online payment service Stripe, which is used, to ensure regular payment of subscription or your invoices paid online.

-


-

Software Protection


-

* Our services runs on Linux Ubuntu systems and software. They benefit from regular security updates when the operating system editor (Ubuntu Canonical) publishes them.

-

* Our services are accessible in HTTPS (HTTP encrypted) only, encrypted with SHA256 certificates.

-

* Our technical platform are protected by various solutions.

-


-

Data theft


-

* In case of suspicion of a theft of the data we have collected (see first point 'Information collected and used'), customers will be informed by email, at email corresponding to their customer account

-

 

-
-
- - - - - -
- - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page126.tpl.php b/htdocs/install/doctemplates/websites/template/page126.tpl.php deleted file mode 100644 index fa34ef6f856..00000000000 --- a/htdocs/install/doctemplates/websites/template/page126.tpl.php +++ /dev/null @@ -1,35 +0,0 @@ - - - -test - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -defaultlang); ?> -defaultlang); ?> - - - diff --git a/htdocs/install/doctemplates/websites/template/page136.tpl.php b/htdocs/install/doctemplates/websites/template/page136.tpl.php deleted file mode 100644 index e32aa297ffc..00000000000 --- a/htdocs/install/doctemplates/websites/template/page136.tpl.php +++ /dev/null @@ -1,82 +0,0 @@ - - - -Contact - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Contact -
-
-
-
-
-
-
-
- - -
-
-

Contact us:



- email ?>
- getFullAddress() ?>
-
-
- - - -
-
- -
- -


- - - -
- - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page147.tpl.php b/htdocs/install/doctemplates/websites/template/page147.tpl.php deleted file mode 100644 index 6781f8ed79b..00000000000 --- a/htdocs/install/doctemplates/websites/template/page147.tpl.php +++ /dev/null @@ -1,128 +0,0 @@ - - - -Header and Top Menu - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - - - - - - -
-
-
- - -
-
-
- - - - diff --git a/htdocs/install/doctemplates/websites/template/page148.tpl.php b/htdocs/install/doctemplates/websites/template/page148.tpl.php deleted file mode 100644 index 1f80ccc6238..00000000000 --- a/htdocs/install/doctemplates/websites/template/page148.tpl.php +++ /dev/null @@ -1,120 +0,0 @@ - - - -Footer - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - - -
- - - -
- - - - diff --git a/htdocs/install/doctemplates/websites/template/page149.tpl.php b/htdocs/install/doctemplates/websites/template/page149.tpl.php deleted file mode 100644 index 12e18dbaf87..00000000000 --- a/htdocs/install/doctemplates/websites/template/page149.tpl.php +++ /dev/null @@ -1,88 +0,0 @@ - - - -FAQ - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
FAQs -
-
-
-
-
-
-
-
- - -
-
-


Frequently Asked Questions

-
-
-
-

How can I contact you ?


-You can contact us by using this page. -
-
-
-

What is your privacy policy ?


-You may find information about our privacy policy on this page. - - -



- -
-
- - -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page150.tpl.php b/htdocs/install/doctemplates/websites/template/page150.tpl.php deleted file mode 100644 index 1732ff82327..00000000000 --- a/htdocs/install/doctemplates/websites/template/page150.tpl.php +++ /dev/null @@ -1,75 +0,0 @@ - - - -Our new web site has been launched - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - - - -
-
-
-
-
-
-
-
-
title; ?> -
-
-
-
-
-
-
-
- -
-





- - - Our new website, based on Dolibarr CMS, has been launched.
- Now it is modern and directly integrated with the internal management tools of the company. Many new online services will be available for our customers... - - - -





-
- - - - - - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page151.tpl.php b/htdocs/install/doctemplates/websites/template/page151.tpl.php deleted file mode 100644 index 7fcbcdf023d..00000000000 --- a/htdocs/install/doctemplates/websites/template/page151.tpl.php +++ /dev/null @@ -1,99 +0,0 @@ - - - -Blog - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
The latest news... -
-
-
-
-
-
-
-
- - -
-

- - load("main"); - $websitepage = new WebsitePage($db); - $fuser = new User($db); - $arrayofblogs = $websitepage->fetchAll($website->id, 'DESC', 'date_creation', 5, 0, array('type_container'=>'blogpost')); - foreach($arrayofblogs as $blog) - { - print ''; - } - ?> -
-
- -

- - - -
- - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page152.tpl.php b/htdocs/install/doctemplates/websites/template/page152.tpl.php deleted file mode 100644 index c0c9934a5c2..00000000000 --- a/htdocs/install/doctemplates/websites/template/page152.tpl.php +++ /dev/null @@ -1,80 +0,0 @@ - - - -Our company is now on Dolibarr ERP CRM - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - - - -
-
-
-
-
-
-
-
-
title; ?> -
-
-
-
-
-
-
-
- -
-


- Like several thousands of companies, our company (name ?>) has moved all its information system to Dolibarr ERP CRM. More than 20 applications have been replaced by only one, easier to use and fully integrated. - This is an important step in improving all of our services. - -


- -
- -

-
Screenshot of our new Open Source solution
-
- - - -





-
- - - - - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page191.tpl.php b/htdocs/install/doctemplates/websites/template/page191.tpl.php deleted file mode 100644 index a4a28a3f1e3..00000000000 --- a/htdocs/install/doctemplates/websites/template/page191.tpl.php +++ /dev/null @@ -1,112 +0,0 @@ - - - -Our team - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Our team -
-
-
-
-
-
-
-
- - -
-

-

The crew...




- query($sql); - if (! $resql) dol_print_error($db); - while ($obj = $db->fetch_object($resql)) - { - $arrayofusers[]=$obj->rowid; - } - - print '
'; - foreach($arrayofusers as $id) - { - $fuser->fetch($id); - - print '
'; - print '
'; - print '
'; - if ($fuser->photo) print Form::showphoto('userphoto', $fuser, 100, 0, 0, 'photowithmargin', '', 0); - //print ''; - else print ''; - print '
'; - print '
'; - print '
'.$fuser->firstname.'
'; - print '
    '; - //print '
  • September 24, 2018
  • '; - if ($fuser->job) print '
  • '.$fuser->job.'
  • '; - else print '
  • '; - print '
'; - print '
'; - print '
'; - print '
'; - } - print '
'; - - ?> -
-
- -

- - - -
- - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page192.tpl.php b/htdocs/install/doctemplates/websites/template/page192.tpl.php deleted file mode 100644 index 53317300621..00000000000 --- a/htdocs/install/doctemplates/websites/template/page192.tpl.php +++ /dev/null @@ -1,81 +0,0 @@ - - - -Careers - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Job opportunities -
-
-
-
-
-
-
-
- - -
-
-
-
-
-There is no job opportunities for the moment...
-
-
-
-
-
-
- - -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page193.tpl.php b/htdocs/install/doctemplates/websites/template/page193.tpl.php deleted file mode 100644 index 74347b800bc..00000000000 --- a/htdocs/install/doctemplates/websites/template/page193.tpl.php +++ /dev/null @@ -1,107 +0,0 @@ - - - -Partners - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Partners -
-
-
-
-
-
-
-
- - -
-
-

Our partners...

-
-
-
-
-
- -
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
-
-
- - -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page194.tpl.php b/htdocs/install/doctemplates/websites/template/page194.tpl.php deleted file mode 100644 index 5d56a7f8f2e..00000000000 --- a/htdocs/install/doctemplates/websites/template/page194.tpl.php +++ /dev/null @@ -1,183 +0,0 @@ - - - -Pricing - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Our plans -
-
-
-
-
-
-
-
- - - - - -
-
- -
-
- - - -

- - - -
- - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page238.tpl.php b/htdocs/install/doctemplates/websites/template/page238.tpl.php deleted file mode 100644 index 7be1ec9a8a0..00000000000 --- a/htdocs/install/doctemplates/websites/template/page238.tpl.php +++ /dev/null @@ -1,77 +0,0 @@ - - - -Clients Testimonials - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Testimonials -
-
-
-
-
-
-
-
- - -
-

-

What they say about us

-



- Send us your testimonial (by email to email; ?>) -



-

-
- -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page239.tpl.php b/htdocs/install/doctemplates/websites/template/page239.tpl.php deleted file mode 100644 index 418b792e03f..00000000000 --- a/htdocs/install/doctemplates/websites/template/page239.tpl.php +++ /dev/null @@ -1,81 +0,0 @@ - - - -Product P - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Product P -
-
-
-
-
-
-
-
- - -
-
-
-
-
-This is a description page of our product P...
-
-
-
-
-
-
- - -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page240.tpl.php b/htdocs/install/doctemplates/websites/template/page240.tpl.php deleted file mode 100644 index ece2d0d4c91..00000000000 --- a/htdocs/install/doctemplates/websites/template/page240.tpl.php +++ /dev/null @@ -1,81 +0,0 @@ - - - -Service S - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Service S -
-
-
-
-
-
-
-
- - -
-
-
-
-
-This is a description page of our service S...
-
-
-
-
-
-
- - -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page243.tpl.php b/htdocs/install/doctemplates/websites/template/page243.tpl.php deleted file mode 100644 index a9abdf276ba..00000000000 --- a/htdocs/install/doctemplates/websites/template/page243.tpl.php +++ /dev/null @@ -1,81 +0,0 @@ - - - -Carrière - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Offres d'emploi -
-
-
-
-
-
-
-
- - -
-
-
-
-
-Nous n'avons pas d'offres d'emploi ouvertes en ce moment...
-
-
-
-
-
-
- - -

- - - -
- - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/page244.tpl.php b/htdocs/install/doctemplates/websites/template/page244.tpl.php deleted file mode 100644 index 0fbcf5e0823..00000000000 --- a/htdocs/install/doctemplates/websites/template/page244.tpl.php +++ /dev/null @@ -1,70 +0,0 @@ - - - -search - - - - - - - - - - - - -/ims', '', file_get_contents(DOL_DATA_ROOT."/website/".$websitekey."/htmlheader.html")); ?> - - - - - -
- - - -
-
-
-
-
-
-
-
-
Search -
-
-
-
-
-
-
-
- -


- -
- Search is not yet available... -





-
- - - -
- - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/partners.php b/htdocs/install/doctemplates/websites/template/partners.php deleted file mode 100644 index 59dc87944fe..00000000000 --- a/htdocs/install/doctemplates/websites/template/partners.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page193.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/pricing.php b/htdocs/install/doctemplates/websites/template/pricing.php deleted file mode 100644 index beac94b27c8..00000000000 --- a/htdocs/install/doctemplates/websites/template/pricing.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page194.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/privacy-policies.php b/htdocs/install/doctemplates/websites/template/privacy-policies.php deleted file mode 100644 index 867c6d0e96e..00000000000 --- a/htdocs/install/doctemplates/websites/template/privacy-policies.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page125.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/product-p.php b/htdocs/install/doctemplates/websites/template/product-p.php deleted file mode 100644 index be8afb6d50d..00000000000 --- a/htdocs/install/doctemplates/websites/template/product-p.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page239.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/robots.txt b/htdocs/install/doctemplates/websites/template/robots.txt deleted file mode 100644 index f1d58142a79..00000000000 --- a/htdocs/install/doctemplates/websites/template/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Robot file. Generated with Dolibarr -User-agent: * -Allow: /public/ -Disallow: /administrator/ \ No newline at end of file diff --git a/htdocs/install/doctemplates/websites/template/search.php b/htdocs/install/doctemplates/websites/template/search.php deleted file mode 100644 index 6f74a5c4c56..00000000000 --- a/htdocs/install/doctemplates/websites/template/search.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page244.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/service-s.php b/htdocs/install/doctemplates/websites/template/service-s.php deleted file mode 100644 index 64219bb6d34..00000000000 --- a/htdocs/install/doctemplates/websites/template/service-s.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page240.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/styles.css.php b/htdocs/install/doctemplates/websites/template/styles.css.php deleted file mode 100644 index 74959f7a1ee..00000000000 --- a/htdocs/install/doctemplates/websites/template/styles.css.php +++ /dev/null @@ -1,20910 +0,0 @@ - -/* CSS content (all pages) */ -body.bodywebsite { margin: 0; font-family: 'Open Sans', sans-serif; } -.bodywebsite h1 { margin-top: 0; margin-bottom: 0; padding: 10px;} -.bodywebsite a:focus, -.bodywebsite button:focus { - outline: none !important; -} -.bodywebsite button::-moz-focus-inner { - border: 0; -} -.bodywebsite :focus { - outline: none; -} -.bodywebsite input, -.bodywebsite select, -.bodywebsite textarea { - outline: 0; -} -.bodywebsite p { - margin: 0; -} -.bodywebsite q { - font-size: 18px; - color: #fff; -} -.bodywebsite dl { - margin-bottom: 0; -} -.bodywebsite dt { - font-weight: 400; -} -html .bodywebsite p a:hover { - text-decoration: none; -} -.bodywebsite form { - margin-bottom: 0; -} -.bodywebsite .text-left { - text-align: left; -} -.bodywebsite .text-center { - text-align: center; -} -.bodywebsite .text-right { - text-align: right; -} -.bodywebsite .page .text-middle { - vertical-align: middle; -} -.bodywebsite .page { - overflow: hidden; -} -.bodywebsite .page-head { - position: relative; - z-index: 90; - /* must be lower than 100 */ - background-color: #fff; -} -.bodywebsite .page-content { - position: relative; - z-index: 1; -} -.bodywebsite .page-foot { - background-color: #000; -} -.bodywebsite input, -.bodywebsite button, -.bodywebsite select, -.bodywebsite textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -.bodywebsite a { - display: inline-block; - text-decoration: none; - transition: 0.33s all ease-out; -} -.bodywebsite a, -.bodywebsite a:active, -.bodywebsite a:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite h3 a, -.bodywebsite h3 a:active -{ - font-weight: normal !important; -} -.bodywebsite a:hover, -.bodywebsite a:focus { - color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>; - text-decoration: none; -} -.bodywebsite a:focus { - outline: 0; -} -.bodywebsite a[href*='callto'], -.bodywebsite a[href*='mailto'] { - white-space: nowrap; -} -.bodywebsite img { - vertical-align: middle; - max-width: 100%; -} -.bodywebsite .img-responsive { - max-width: 100%; - height: auto; -} -.bodywebsite .img-circle { - border-radius: 50%; -} -.bodywebsite hr { - margin-top: 0; - margin-bottom: 0; - border: 0; - border-top: 1px solid #2a2b2b; -} -.bodywebsite .margin-lr-30 { - margin-left: 30px !important; - margin-right: 30px !important; -} -.bodywebsite .unit-left, -.bodywebsite .unit-body { - white-space: nowrap; - display: inline-block; - vertical-align: middle; -} -.bodywebsite .unit-left { - padding-right: 10px; -} -.bodywebsite [role="button"] { - cursor: pointer; -} -.bodywebsite #sectionnews .nohover { - color: #000; -} -.bodywebsite .blog-box { - box-shadow: -1px -1px 12px 5px rgba(85, 85, 85, 0.1) !important; -} -.bodywebsite .blog-box:hover { - box-shadow: -1px -1px 12px 5px rgba(65, 65, 65, 0.3) !important; -} -.bodywebsite .margin-top-5 { - margin-top: 5px !important; -} -.bodywebsite .margin-top-10 { - margin-top: 10px !important; -} -.bodywebsite .rights { - display: inline-block; - margin: 0; - line-height: 1.5; - letter-spacing: .025em; - vertical-align: baseline; -} -.bodywebsite .rights * { - display: inline; - margin-right: .25em; -} -.bodywebsite .page-foot-default .rights { - color: #fff; - font-weight: 300; -} -.bodywebsite .page-foot .brand + * { - margin-top: 22px; -} -.bodywebsite .page-foot * + .link-block { - margin-top: 15px; -} -.bodywebsite .page-foot .footer-title + * { - margin-top: 30px; -} -.bodywebsite .page-foot .contact-info * + .unit { - margin-top: 15px; -} -.bodywebsite .privacy-link { - margin-top: 30px; -} -.bodywebsite .one-page-section * + .group-xl { - margin-top: 40px; -} -@media (min-width: 768px) { - .bodywebsite .one-page-section * + .group-xl { - margin-top: 60px; - } -} -@media (min-width: 1200px) { - .bodywebsite .one-page-section * + .group-xl { - margin-top: 100px; - } -} -.bodywebsite h1, -.bodywebsite h2, -.bodywebsite h3, -.bodywebsite h4, -.bodywebsite h5, -.bodywebsite h6, -.bodywebsite .h1, -.bodywebsite .h2, -.bodywebsite .h3, -.bodywebsite .h4, -.bodywebsite .h5, -.bodywebsite .h6 { - margin-top: 0; - margin-bottom: 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 700; - color: #000; -} -.bodywebsite h1 > span, -.bodywebsite h2 > span, -.bodywebsite h3 > span, -.bodywebsite h4 > span, -.bodywebsite h5 > span, -.bodywebsite h6 > span, -.bodywebsite .h1 > span, -.bodywebsite .h2 > span, -.bodywebsite .h3 > span, -.bodywebsite .h4 > span, -.bodywebsite .h5 > span, -.bodywebsite .h6 > span { - display: inline-block; - font-size: inherit; -} -.bodywebsite h1 a, -.bodywebsite h2 a, -.bodywebsite h3 a, -.bodywebsite h4 a, -.bodywebsite h5 a, -.bodywebsite h6 a, -.bodywebsite .h1 a, -.bodywebsite .h2 a, -.bodywebsite .h3 a, -.bodywebsite .h4 a, -.bodywebsite .h5 a, -.bodywebsite .h6 a { - display: inline; - font: inherit; - letter-spacing: inherit; - transition: .33s all ease; -} -.bodywebsite h1 a:hover, -.bodywebsite h2 a:hover, -.bodywebsite h3 a:hover, -.bodywebsite h4 a:hover, -.bodywebsite h5 a:hover, -.bodywebsite h6 a:hover, -.bodywebsite .h1 a:hover, -.bodywebsite .h2 a:hover, -.bodywebsite .h3 a:hover, -.bodywebsite .h4 a:hover, -.bodywebsite .h5 a:hover, -.bodywebsite .h6 a:hover { - color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>; -} -.bodywebsite h1, -.bodywebsite .h1 { - font-size: 18px; - line-height: 1.35; - text-transform: uppercase; -} -@media (min-width: 1200px) { - .bodywebsite h1, - .bodywebsite .h1 { - line-height: 1.2; - font-size: 33px; - } -} -.bodywebsite h1.small, -.bodywebsite .h1.small { - font-size: 40px; -} -@media (min-width: 768px) { - .bodywebsite h1.small, - .bodywebsite .h1.small { - font-size: 40px; - } -} -@media (min-width: 992px) { - .bodywebsite h1.small, - .bodywebsite .h1.small { - font-size: 60px; - } -} -@media (min-width: 1200px) { - .bodywebsite h1.small, - .bodywebsite .h1.small { - font-size: 72px; - line-height: 1.2; - } -} -.bodywebsite h2, -.bodywebsite .h2 { - font-weight: 500; - font-size: 15px; - line-height: 1.2; -} -@media (min-width: 576px) { - .bodywebsite h2, - .bodywebsite .h2 { - line-height: 1.33333; - font-size: 18px; - } -} -.bodywebsite .text-big-18 { - font-size: 18px; -} -.bodywebsite .text-big-19 { - font-size: 19px; -} -.bodywebsite .text-small { - font-size: 12px; -} -.bodywebsite .text-small-16 { - font-size: 16px; -} -.bodywebsite small, -.bodywebsite .small { - font-size: 12px; - line-height: 18px; -} -.bodywebsite code { - padding: 5px 7px; - font-size: 75%; - color: #fe4a21; - background-color: #f9f9f9; - border-radius: 2px; -} -.bodywebsite em { - font-family: Helvetica, Arial, sans-serif; - font-size: inherit; - font-style: italic; - font-weight: 700; - line-height: inherit; - color: #767877; -} -.bodywebsite address { - margin-top: 0; - margin-bottom: 0; -} -.bodywebsite .context-dark, -.bodywebsite .bg-black, -.bodywebsite .bg-gray-darker, -.bodywebsite .bg-gray-dark, -.bodywebsite .bg-mine-shaft, -.bodywebsite .bg-cod-gray, -.bodywebsite .bg-accent, -.bodywebsite .bg-cello { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .context-dark a, -.bodywebsite .bg-black a, -.bodywebsite .bg-gray-darker a, -.bodywebsite .bg-gray-dark a, -.bodywebsite .bg-mine-shaft a, -.bodywebsite .bg-cod-gray a, -.bodywebsite .bg-accent a, -.bodywebsite .bg-cello a, -.bodywebsite .context-dark a:active, -.bodywebsite .bg-black a:active, -.bodywebsite .bg-gray-darker a:active, -.bodywebsite .bg-gray-dark a:active, -.bodywebsite .bg-mine-shaft a:active, -.bodywebsite .bg-cod-gray a:active, -.bodywebsite .bg-accent a:active, -.bodywebsite .bg-cello a:active, -.bodywebsite .context-dark a:focus, -.bodywebsite .bg-black a:focus, -.bodywebsite .bg-gray-darker a:focus, -.bodywebsite .bg-gray-dark a:focus, -.bodywebsite .bg-mine-shaft a:focus, -.bodywebsite .bg-cod-gray a:focus, -.bodywebsite .bg-accent a:focus, -.bodywebsite .bg-cello a:focus { - color: #fff; -} -.bodywebsite .context-dark a:hover, -.bodywebsite .bg-black a:hover, -.bodywebsite .bg-gray-darker a:hover, -.bodywebsite .bg-gray-dark a:hover, -.bodywebsite .bg-mine-shaft a:hover, -.bodywebsite .bg-cod-gray a:hover, -.bodywebsite .bg-accent a:hover, -.bodywebsite .bg-cello a:hover { - color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>; -} -.bodywebsite .context-dark .big, -.bodywebsite .bg-black .big, -.bodywebsite .bg-gray-darker .big, -.bodywebsite .bg-gray-dark .big, -.bodywebsite .bg-mine-shaft .big, -.bodywebsite .bg-cod-gray .big, -.bodywebsite .bg-accent .big, -.bodywebsite .bg-cello .big, -.bodywebsite .context-dark .text-bigger, -.bodywebsite .bg-black .text-bigger, -.bodywebsite .bg-gray-darker .text-bigger, -.bodywebsite .bg-gray-dark .text-bigger, -.bodywebsite .bg-mine-shaft .text-bigger, -.bodywebsite .bg-cod-gray .text-bigger, -.bodywebsite .bg-accent .text-bigger, -.bodywebsite .bg-cello .text-bigger, -.bodywebsite .context-dark .text-extra-large-bordered, -.bodywebsite .bg-black .text-extra-large-bordered, -.bodywebsite .bg-gray-darker .text-extra-large-bordered, -.bodywebsite .bg-gray-dark .text-extra-large-bordered, -.bodywebsite .bg-mine-shaft .text-extra-large-bordered, -.bodywebsite .bg-cod-gray .text-extra-large-bordered, -.bodywebsite .bg-accent .text-extra-large-bordered, -.bodywebsite .bg-cello .text-extra-large-bordered { - color: #fff; -} -.bodywebsite .context-dark .countdown-wrap span, -.bodywebsite .bg-black .countdown-wrap span, -.bodywebsite .bg-gray-darker .countdown-wrap span, -.bodywebsite .bg-gray-dark .countdown-wrap span, -.bodywebsite .bg-mine-shaft .countdown-wrap span, -.bodywebsite .bg-cod-gray .countdown-wrap span, -.bodywebsite .bg-accent .countdown-wrap span, -.bodywebsite .bg-cello .countdown-wrap span, -.bodywebsite .context-dark .countdown-wrap div > h2, -.bodywebsite .bg-black .countdown-wrap div > h2, -.bodywebsite .bg-gray-darker .countdown-wrap div > h2, -.bodywebsite .bg-gray-dark .countdown-wrap div > h2, -.bodywebsite .bg-mine-shaft .countdown-wrap div > h2, -.bodywebsite .bg-cod-gray .countdown-wrap div > h2, -.bodywebsite .bg-accent .countdown-wrap div > h2, -.bodywebsite .bg-cello .countdown-wrap div > h2 { - color: #fff; -} -.bodywebsite .bg-black { - background: #000; - fill: #000; -} -.bodywebsite .bg-gray-darker { - background: #00030a; - fill: #00030a; -} -.bodywebsite .bg-gray-darker .countdown-wrap div > h2 { - color: rgba(255, 255, 255, 0.2); -} -.bodywebsite .bg-gray-dark { - background: #2a2b2b; - fill: #2a2b2b; -} -.bodywebsite .bg-mine-shaft { - background: #333; - fill: #333; -} -.bodywebsite .bg-cod-gray { - background: #111; - fill: #111; -} -.bodywebsite .bg-gray { - background: #9f9f9f; - fill: #9f9f9f; -} -.bodywebsite .bg-accent { - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - fill: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .bg-accent.bg-default-outline-btn .btn-white-outline:hover { - background: #3a3c3e; - border-color: #3a3c3e; -} -.bodywebsite .bg-porcelain { - background: #e5e7e9; - fill: #e5e7e9; -} -.bodywebsite .bg-gray-light { - background: #dedede; - fill: #dedede; -} -.bodywebsite .bg-gray-lighter { - background: #f9f9f9; - fill: #f9f9f9; -} -.bodywebsite .bg-whisper { - background: #f6f7fa; - fill: #f6f7fa; -} -.bodywebsite .bg-whisper-lighten { - background: #f2f3f8; - fill: #f2f3f8; -} -.bodywebsite .bg-athens-gray { - background: #F8F9FB; - fill: #F8F9FB; -} -.bodywebsite .bg-iron { - background: #dcdde0; - fill: #dcdde0; -} -.bodywebsite .bg-cello { - background: #1e3953; - fill: #1e3953; -} -.bodywebsite .bg-cloud-burst { - background: #1e354a; - fill: #1e354a; -} -.bodywebsite .bg-abbey { - background: #464a4d; - fill: #464a4d; -} -.bodywebsite .bg-abbey-04 { - background: rgba(70, 74, 77, 0.4); - fill: rgba(70, 74, 77, 0.4); -} -.bodywebsite .bg-athens-lighten { - background: #f2f3f7; - fill: #f2f3f7; -} -.bodywebsite .bg-cape-cod { - background: #444; - fill: #3a3c3e; -} -.bodywebsite #sectionfirstclass .bg-cape-cod { - background: #fff; - fill: #3a3c3e; -} -.bodywebsite .bg-athens-gray { - background: #F8F9FB; - fill: #F8F9FB; -} -.bodywebsite .page .bg-default-02 { - background: rgba(255, 255, 255, 0.2); - fill: rgba(255, 255, 255, 0.2); -} -.bodywebsite .page .bg-cloud-burst a.text-bismark:hover, -.bodywebsite .page .bg-cloud-burst a.text-bismark:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .bg-overlay-lighten-inverse-md { - background: rgba(255, 255, 255, 0.5); -} -@media (min-width: 992px) { - .bodywebsite .bg-overlay-lighten-inverse-md { - background: transparent; - } -} -.bodywebsite .bg-image { - -webkit-background-size: cover; - background-size: cover; - background-position: center top; - background-repeat: no-repeat; -} -.bodywebsite .bg-image-centered { - -webkit-background-size: auto; - background-size: auto; -} -.bodywebsite .bg-fixed { - background-attachment: fixed; - -webkit-background-size: cover; - background-size: cover; -} -.bodywebsite .bg-image-1 { - -webkit-background-size: auto 100%; - background-size: auto 100%; -} -@media (max-width: 767px) { - .bodywebsite .bg-image-1 { - background-image: none !important; - } -} -.bodywebsite .page .text-primary { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?> !important; -} -.bodywebsite .page a.text-primary:focus, -.bodywebsite .page a.text-primary:hover { - color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important; -} -.bodywebsite .page .text-secondary { - color: #00030a !important; -} -.bodywebsite .page a.text-secondary:focus, -.bodywebsite .page a.text-secondary:hover { - color: black !important; -} -.bodywebsite .page .text-red-orange { - color: #ff4b22 !important; -} -.bodywebsite .page a.text-red-orange:focus, -.bodywebsite .page a.text-red-orange:hover { - color: #ee2c00 !important; -} -.bodywebsite .page .text-black { - color: #000 !important; -} -.bodywebsite .page a.text-black:focus, -.bodywebsite .page a.text-black:hover { - color: black !important; -} -.bodywebsite .page .text-silver { - color: #cdcdcd !important; -} -.bodywebsite .page a.text-silver:focus, -.bodywebsite .page a.text-silver:hover { - color: #b4b4b4 !important; -} -.bodywebsite .page .text-dark { - color: #2a2b2b !important; -} -.bodywebsite .page a.text-dark:focus, -.bodywebsite .page a.text-dark:hover { - color: #111111 !important; -} -.bodywebsite .page .text-gray { - color: #9f9f9f !important; -} -.bodywebsite .page a.text-gray:focus, -.bodywebsite .page a.text-gray:hover { - color: #868686 !important; -} -.bodywebsite .page .text-gray-light { - color: #dedede !important; -} -.bodywebsite .page a.text-gray-light:focus, -.bodywebsite .page a.text-gray-light:hover { - color: #c5c5c5 !important; -} -.bodywebsite .page .text-white { - color: #fff !important; - text-shadow: 1px 1px 8px #222; -} -.bodywebsite .page a.text-white:focus, -.bodywebsite .page a.text-white:hover { - color: #e6e6e6 !important; -} -.bodywebsite .page .text-white-05 { - color: rgba(255, 255, 255, 0.5) !important; -} -.bodywebsite .page a.text-white-05:focus, -.bodywebsite .page a.text-white-05:hover { - color: rgba(230, 230, 230, 0.5) !important; -} -.bodywebsite .page .text-white-03 { - color: rgba(255, 255, 255, 0.3) !important; -} -.bodywebsite .page a.text-white-03:focus, -.bodywebsite .page a.text-white-03:hover { - color: rgba(230, 230, 230, 0.3) !important; -} -.bodywebsite .page .text-white-08 { - color: rgba(255, 255, 255, 0.8) !important; -} -.bodywebsite .page a.text-white-08:focus, -.bodywebsite .page a.text-white-08:hover { - color: rgba(230, 230, 230, 0.8) !important; -} -.bodywebsite .page .text-tundora { - color: #414141 !important; -} -.bodywebsite .page a.text-tundora:focus, -.bodywebsite .page a.text-tundora:hover { - color: #282828 !important; -} -.bodywebsite .page .text-black-05 { - color: rgba(0, 0, 0, 0.5) !important; -} -.bodywebsite .page a.text-black-05:focus, -.bodywebsite .page a.text-black-05:hover { - color: rgba(0, 0, 0, 0.5) !important; -} -.bodywebsite .page .text-bismark { - color: #496a8a !important; -} -.bodywebsite .page a.text-bismark:focus, -.bodywebsite .page a.text-bismark:hover { - color: #375069 !important; -} -.bodywebsite .page .text-black-08 { - color: rgba(0, 0, 0, 0.8) !important; -} -.bodywebsite .page a.text-black-08:focus, -.bodywebsite .page a.text-black-08:hover { - color: rgba(0, 0, 0, 0.8) !important; -} -.bodywebsite .page .text-gray-darker { - color: #00030a !important; -} -.bodywebsite .page a.text-gray-darker:focus, -.bodywebsite .page a.text-gray-darker:hover { - color: black !important; -} -.bodywebsite .page .text-abbey { - color: #464a4d !important; -} -.bodywebsite .page a.text-abbey:focus, -.bodywebsite .page a.text-abbey:hover { - color: #2e3032 !important; -} -.bodywebsite .page .text-rolling-stone { - color: #74787C !important; -} -.bodywebsite .page a.text-rolling-stone:focus, -.bodywebsite .page a.text-rolling-stone:hover { - color: #5b5f62 !important; -} -.bodywebsite .page .text-fuel-yellow { - color: #F0B922 !important; -} -.bodywebsite .page a.text-fuel-yellow:focus, -.bodywebsite .page a.text-fuel-yellow:hover { - color: #d19d0e !important; -} -.bodywebsite .hidden { - display: none; -} -.bodywebsite .text-italic { - font-style: italic; -} -.bodywebsite .text-normal { - font-style: normal; -} -.bodywebsite .text-none { - text-transform: none; -} -.bodywebsite .text-underline { - text-decoration: underline; -} -.bodywebsite .text-strike { - text-decoration: line-through; -} -.bodywebsite .text-thin { - font-weight: 100; -} -.bodywebsite .text-light { - font-weight: 300; -} -.bodywebsite .text-regular { - font-weight: 400; -} -.bodywebsite .text-medium { - font-weight: 500; -} -.bodywebsite .text-sbold { - font-weight: 600; -} -.bodywebsite .text-bold, -.bodywebsite strong { - font-weight: 700; -} -.bodywebsite .text-ubold { - font-weight: 900; -} -.bodywebsite .text-spacing-0 { - letter-spacing: 0; -} -.bodywebsite .text-spacing-40 { - letter-spacing: 0.04em; -} -.bodywebsite .text-spacing-inverse-20 { - letter-spacing: -0.02em; -} -.bodywebsite .text-spacing-120 { - letter-spacing: 0.12em; -} -.bodywebsite .btn { - max-width: 100%; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - font-weight: 700; - border-radius: 0; - border: 2px solid; - text-transform: uppercase; - transition: 0.3s ease-out; - padding: 11px 15px; -} -@media (min-width: 992px) { - .bodywebsite .btn { - padding: 12px 35px; - } -} -.bodywebsite .btn:focus, -.bodywebsite .btn:active, -.bodywebsite .btn:active:focus { - outline: none; -} -.bodywebsite .btn:active, -.bodywebsite .btn.active { - box-shadow: none; -} -.bodywebsite .btn-smaller { - padding: 8px 25px; -} -.bodywebsite .btn-small { - padding-left: 20px; - padding-right: 20px; -} -@media (min-width: 768px) { - .bodywebsite .btn { - min-width: 190px; - } -} -html .bodywebsite .btn-default, -html .bodywebsite .btn-default:active, -html .bodywebsite .btn-default.active, -html .bodywebsite .btn-default:active:focus, -html .bodywebsite .btn-default.active:focus, -html .bodywebsite .btn-default:focus:active, -html .bodywebsite .btn-default:focus { - color: #fff; - background-color: #464a4d; - border-color: #464a4d; -} -.bodywebsite .open > html .btn-default.dropdown-toggle, -html .bodywebsite .btn-default:hover { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -html .bodywebsite .btn-default.disabled, -html .bodywebsite .btn-default[disabled], -.bodywebsite fieldset[disabled] html .btn-default { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-default .badge { - color: #464a4d; - background-color: #fff; -} -html .bodywebsite .btn-primary, -html .bodywebsite .btn-primary:active, -html .bodywebsite .btn-primary.active, -html .bodywebsite .btn-primary:active:focus, -html .bodywebsite .btn-primary.active:focus, -html .bodywebsite .btn-primary:focus:active, -html .bodywebsite .btn-primary:focus { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - /* border: 0; */ -} -.bodywebsite .open > html .btn-primary.dropdown-toggle { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - /* border: none; */ -} -html .bodywebsite .btn-primary:hover { - color: #fff; - box-shadow: 1px 1px 8px #aaa; -} -html .bodywebsite .btn-primary.disabled, -html .bodywebsite .btn-primary[disabled], -.bodywebsite fieldset[disabled] html .btn-primary { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-primary .badge { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background-color: #fff; -} -html .bodywebsite .btn-primary-contrast, -html .bodywebsite .btn-primary-contrast:active, -html .bodywebsite .btn-primary-contrast.active, -html .bodywebsite .btn-primary-contrast:active:focus, -html .bodywebsite .btn-primary-contrast.active:focus, -html .bodywebsite .btn-primary-contrast:focus:active, -html .bodywebsite .btn-primary-contrast:focus { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .open > html .btn-primary-contrast.dropdown-toggle, -html .bodywebsite .btn-primary-contrast:hover { - color: #fff; - background-color: #42b294; - border-color: #42b294; -} -html .bodywebsite .btn-primary-contrast.disabled, -html .bodywebsite .btn-primary-contrast[disabled], -.bodywebsite fieldset[disabled] html .btn-primary-contrast { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-primary-contrast .badge { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background-color: #fff; -} -html .bodywebsite .btn-primary-outline, -html .bodywebsite .btn-primary-outline:active, -html .bodywebsite .btn-primary-outline.active, -html .bodywebsite .btn-primary-outline:active:focus, -html .bodywebsite .btn-primary-outline.active:focus, -html .bodywebsite .btn-primary-outline:focus:active, -html .bodywebsite .btn-primary-outline:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background-color: transparent; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .open > html .btn-primary-outline.dropdown-toggle, -html .bodywebsite .btn-primary-outline:hover { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -html .bodywebsite .btn-primary-outline.disabled, -html .bodywebsite .btn-primary-outline[disabled], -.bodywebsite fieldset[disabled] html .btn-primary-outline { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-primary-outline .badge { - color: transparent; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -html .bodywebsite .btn-cello-outline, -html .bodywebsite .btn-cello-outline:active, -html .bodywebsite .btn-cello-outline.active, -html .bodywebsite .btn-cello-outline:active:focus, -html .bodywebsite .btn-cello-outline.active:focus, -html .bodywebsite .btn-cello-outline:focus:active, -html .bodywebsite .btn-cello-outline:focus { - color: #1e3953; - background-color: transparent; - border-color: #1e3953; -} -.bodywebsite .open > html .btn-cello-outline.dropdown-toggle, -html .bodywebsite .btn-cello-outline:hover { - color: #fff; - background-color: #1e3953; - border-color: #1e3953; -} -html .bodywebsite .btn-cello-outline.disabled, -html .bodywebsite .btn-cello-outline[disabled], -.bodywebsite fieldset[disabled] html .btn-cello-outline { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-cello-outline .badge { - color: transparent; - background-color: #1e3953; -} -html .bodywebsite .btn-white-outline, -html .bodywebsite .btn-white-outline:active, -html .bodywebsite .btn-white-outline.active, -html .bodywebsite .btn-white-outline:active:focus, -html .bodywebsite .btn-white-outline.active:focus, -html .bodywebsite .btn-white-outline:focus:active, -html .bodywebsite .btn-white-outline:focus { - color: #fff; - background-color: transparent; - border-color: #fff; -} -.bodywebsite .open > html .btn-white-outline.dropdown-toggle, -html .bodywebsite .btn-white-outline:hover { - color: #fff; - background-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>; - border-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>; -} -html .bodywebsite .btn-white-outline.disabled, -html .bodywebsite .btn-white-outline[disabled], -.bodywebsite fieldset[disabled] html .btn-white-outline { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-white-outline .badge { - color: transparent; - background-color: #fff; -} -html .bodywebsite .btn-white-outline-variant-1, -html .bodywebsite .btn-white-outline-variant-1:active, -html .bodywebsite .btn-white-outline-variant-1.active, -html .bodywebsite .btn-white-outline-variant-1:active:focus, -html .bodywebsite .btn-white-outline-variant-1.active:focus, -html .bodywebsite .btn-white-outline-variant-1:focus:active, -html .bodywebsite .btn-white-outline-variant-1:focus { - color: #fff; - background-color: transparent; - border-color: #fff; -} -.bodywebsite .open > html .btn-white-outline-variant-1.dropdown-toggle, -html .bodywebsite .btn-white-outline-variant-1:hover { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -html .bodywebsite .btn-white-outline-variant-1.disabled, -html .bodywebsite .btn-white-outline-variant-1[disabled], -.bodywebsite fieldset[disabled] html .btn-white-outline-variant-1 { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-white-outline-variant-1 .badge { - color: transparent; - background-color: #fff; -} -html .bodywebsite .btn-silver-outline, -html .bodywebsite .btn-silver-outline:active, -html .bodywebsite .btn-silver-outline.active, -html .bodywebsite .btn-silver-outline:active:focus, -html .bodywebsite .btn-silver-outline.active:focus, -html .bodywebsite .btn-silver-outline:focus:active, -html .bodywebsite .btn-silver-outline:focus { - color: #000; - background-color: transparent; - border-color: #cdcdcd; -} -.bodywebsite .open > html .btn-silver-outline.dropdown-toggle, -html .bodywebsite .btn-silver-outline:hover { - color: #fff; - background-color: #cdcdcd; - border-color: #cdcdcd; -} -html .bodywebsite .btn-silver-outline.disabled, -html .bodywebsite .btn-silver-outline[disabled], -.bodywebsite fieldset[disabled] html .btn-silver-outline { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-silver-outline .badge { - color: transparent; - background-color: #000; -} -html .bodywebsite .btn-black-outline, -html .bodywebsite .btn-black-outline:active, -html .bodywebsite .btn-black-outline.active, -html .bodywebsite .btn-black-outline:active:focus, -html .bodywebsite .btn-black-outline.active:focus, -html .bodywebsite .btn-black-outline:focus:active, -html .bodywebsite .btn-black-outline:focus { - color: #000; - background-color: transparent; - border-color: #000; -} -.bodywebsite .open > html .btn-black-outline.dropdown-toggle, -html .bodywebsite .btn-black-outline:hover { - color: #fff; - background-color: #000; - border-color: #000; -} -html .bodywebsite .btn-black-outline.disabled, -html .bodywebsite .btn-black-outline[disabled], -.bodywebsite fieldset[disabled] html .btn-black-outline { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-black-outline .badge { - color: transparent; - background-color: #000; -} -html .bodywebsite .btn-cello, -html .bodywebsite .btn-cello:active, -html .bodywebsite .btn-cello.active, -html .bodywebsite .btn-cello:active:focus, -html .bodywebsite .btn-cello.active:focus, -html .bodywebsite .btn-cello:focus:active, -html .bodywebsite .btn-cello:focus { - color: #fff; - background-color: #1e3953; - border-color: #1e3953; -} -.bodywebsite .open > html .btn-cello.dropdown-toggle, -html .bodywebsite .btn-cello:hover { - color: #fff; - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -html .bodywebsite .btn-cello.disabled, -html .bodywebsite .btn-cello[disabled], -.bodywebsite fieldset[disabled] html .btn-cello { - pointer-events: none; - opacity: .5; -} -html .bodywebsite .btn-cello .badge { - color: #1e3953; - background-color: #fff; -} -.bodywebsite .btn-xs { - padding: 12px 25px; - font-size: 11px; - line-height: 1.71429; - border-radius: 0; -} -@media (min-width: 768px) { - .bodywebsite .btn-xs { - min-width: 165px; - } -} -.bodywebsite .btn-sm { - padding: 10px 20px; - font-size: 13px; - line-height: 1.71429; - border-radius: 0; -} -@media (min-width: 768px) { - .bodywebsite .btn-sm { - min-width: 170px; - } -} -.bodywebsite .btn-lg { - padding: 14px 30px; - font-size: 14px; - line-height: 1.71429; - border-radius: 0; -} -@media (min-width: 768px) { - .bodywebsite .btn-lg { - min-width: 270px; - padding: 18px 40px; - } -} -@media (min-width: 992px) { - .bodywebsite .btn-lg-bigger { - padding-top: 28px; - padding-bottom: 28px; - } -} -.bodywebsite .btn-xl { - padding: 20px 35px; - font-size: 15px; - line-height: 1.71429; - border-radius: 0; -} -@media (min-width: 768px) { - .bodywebsite .btn-xl { - padding: 21px 50px; - } -} -@media (min-width: 992px) { - .bodywebsite .btn-xl { - min-width: 270px; - } -} -.bodywebsite .btn-min-width-0 { - min-width: 0; -} -.bodywebsite .btn-block { - min-width: 30px; - max-width: 100%; -} -.bodywebsite .btn-rect { - border-radius: 0; -} -.bodywebsite .btn-round { - border-radius: 12px; -} -.bodywebsite .btn-circle { - border-radius: 35px; -} -.bodywebsite .btn-round-bottom { - border-radius: 0 0 5px 5px; -} -.bodywebsite .btn-shadow { - box-shadow: -3px 3px 3px 0 rgba(0, 0, 0, 0.14); -} -.bodywebsite .btn.btn-icon { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - vertical-align: middle; -} -.bodywebsite .btn.btn-icon .icon { - position: relative; - top: 1px; - display: inline-block; - width: auto; - height: auto; - line-height: 0; - vertical-align: middle; - transition: 0s; -} -.bodywebsite .btn.btn-icon-left .icon { - margin-right: 10px; -} -.bodywebsite .btn.btn-icon-right { - -webkit-flex-direction: row-reverse; - -ms-flex-direction: row-reverse; - flex-direction: row-reverse; -} -.bodywebsite .btn.btn-icon-right .icon { - margin-left: 10px; -} -.bodywebsite .btn-icon-only { - background: none; - border: none; - display: inline-block; - padding: 0; - outline: none; - outline-offset: 0; - cursor: pointer; - -webkit-appearance: none; - font-size: 0; - line-height: 0; - transition: .33s all ease; -} -.bodywebsite .btn-icon-only::-moz-focus-inner { - border: none; - padding: 0; -} -.bodywebsite .btn-icon-only.btn-icon-only-primary, -.bodywebsite .btn-icon-only.btn-icon-only-primary:active, -.bodywebsite .btn-icon-only.btn-icon-only-primary:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .btn-icon-only.btn-icon-only-primary:hover { - color: #000; -} -.bodywebsite .btn-icon-only { - padding: 9px 18px; -} -.bodywebsite .btn-icon-single { - display: inline-block; - padding: 0; - min-width: 0; -} -.bodywebsite .btn-icon-default { - color: #000; -} -.bodywebsite .btn-icon-default:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .btn-cello-outline.btn-icon .icon { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - transition: .33s all ease; -} -.bodywebsite .btn-cello-outline.btn-icon:hover.btn-icon .icon { - color: #fff; -} -.bodywebsite .button-block * + .btn { - margin-top: 0; -} -.bodywebsite .icon { - display: inline-block; - text-align: center; -} -.bodywebsite .icon:before { - display: inline-block; - font-weight: 400; - font-style: normal; - speak: none; - text-transform: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.bodywebsite [class*='icon-circle'] { - border-radius: 50%; - overflow: hidden; -} -.bodywebsite [class*='icon-round'] { - border-radius: 4px; - overflow: hidden; -} -.bodywebsite .page .icon-default { - color: #9f9f9f; -} -.bodywebsite .page .icon-black { - color: #000; -} -.bodywebsite .page .icon-primary { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .icon-gunsmoke { - color: #767877; -} -.bodywebsite .page .icon-tundora { - color: #414141; -} -.bodywebsite .page .icon-gray-dark-filled { - color: #fff; - background: #2a2b2b; -} -.bodywebsite .page .icon-san-juan-filled { - color: #fff; - background: #2e5275; -} -.bodywebsite .page .icon-silver-chalice-filled { - color: #fff; - background: #ababab; -} -.bodywebsite .page .icon-abbey-filled { - color: #fff; - background: #464a4d; -} -.bodywebsite .page .icon-white { - color: #fff; -} -.bodywebsite .page a.icon-default, -.bodywebsite .page a.icon-default:active, -.bodywebsite .page a.icon-default:focus { - color: #9f9f9f; -} -.bodywebsite .page a.icon-default:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page a.icon-primary, -.bodywebsite .page a.icon-primary:active, -.bodywebsite .page a.icon-primary:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page a.icon-primary:hover { - color: #fff; -} -.bodywebsite .page a.icon-abbey-filled:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page a.icon-tundora-inverse, -.bodywebsite .page a.icon-tundora-inverse:active, -.bodywebsite .page a.icon-tundora-inverse:focus { - color: #414141; -} -.bodywebsite .page a.icon-tundora-inverse:hover { - color: #fff; -} -.bodywebsite .page a.icon-gray-dark-filled, -.bodywebsite .page a.icon-gray-dark-filled:active, -.bodywebsite .page a.icon-gray-dark-filled:focus { - color: #fff; - background: #2a2b2b; -} -.bodywebsite .page a.icon-gray-dark-filled:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page a.icon-silver-chalice-filled, -.bodywebsite .page a.icon-silver-chalice-filled:active, -.bodywebsite .page a.icon-silver-chalice-filled:focus { - color: #fff; - background: #ababab; -} -.bodywebsite .page a.icon-silver-chalice-filled:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page a.icon-san-juan-filled, -.bodywebsite .page a.icon-san-juan-filled:active, -.bodywebsite .page a.icon-san-juan-filled:focus { - color: #fff; - background: #2e5275; -} -.bodywebsite .page a.icon-san-juan-filled:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .icon-xxs { - width: 18px; - height: 18px; - font-size: 18px; - line-height: 18px; -} -.bodywebsite .page .icon-xxs-small { - width: 16px; - height: 16px; - font-size: 16px; - line-height: 16px; -} -.bodywebsite .page .icon-xxs-smaller { - width: 14px; - height: 14px; - font-size: 14px; - line-height: 14px; -} -.bodywebsite .page .icon-xxs-smallest { - width: 12px; - height: 12px; - font-size: 12px; - line-height: 12px; -} -.bodywebsite .page .icon-xs { - width: 22px; - height: 22px; - font-size: 22px; - line-height: 22px; -} -.bodywebsite .page .icon-xs-smaller { - width: 20px; - height: 20px; - font-size: 20px; - line-height: 20px; -} -.bodywebsite .page .icon-sm { - width: 24px; - height: 24px; - font-size: 24px; - line-height: 24px; -} -.bodywebsite .page .icon-sm-custom { - width: 24px; - height: 24px; - font-size: 24px; - line-height: 24px; -} -@media (min-width: 992px) { - .bodywebsite .page .icon-sm-custom { - width: 30px; - height: 30px; - font-size: 30px; - line-height: 30px; - } -} -.bodywebsite .page .icon-md { - width: 36px; - height: 36px; - font-size: 36px; - line-height: 36px; -} -.bodywebsite .page .icon-md-custom { - width: 26px; - height: 26px; - font-size: 26px; - line-height: 26px; -} -@media (min-width: 992px) { - .bodywebsite .page .icon-md-custom { - width: 36px; - height: 36px; - font-size: 36px; - line-height: 36px; - } -} -.bodywebsite .page .icon-md-smaller { - width: 30px; - height: 30px; - font-size: 30px; - line-height: 30px; -} -.bodywebsite .page .icon-lg { - width: 45px; - height: 45px; - font-size: 45px; - line-height: 45px; -} -.bodywebsite .page .icon-lg-variant-1 { - width: 42px; - height: 42px; - font-size: 42px; - line-height: 42px; -} -.bodywebsite .page .icon-lg-variant-2 { - width: 44px; - height: 44px; - font-size: 44px; - line-height: 44px; -} -.bodywebsite .page .icon-lg-bigger { - width: 50px; - height: 50px; - font-size: 50px; - line-height: 50px; -} -.bodywebsite .page .icon-xl { - width: 60px; - height: 60px; - font-size: 60px; - line-height: 60px; -} -.bodywebsite .page [class*='icon-round'].icon-xxs-smallest, -.bodywebsite .page [class*='icon-circle'].icon-xxs-smallest { - width: 26px; - height: 26px; - line-height: 26px; -} -.bodywebsite .icon-shift-1 { - position: relative; - top: 2px; -} -.bodywebsite .icon-shift-2 { - position: relative; - top: 2px; -} -@media (min-width: 992px) { - .bodywebsite .icon-shift-2 { - top: 4px; - } -} -.bodywebsite .icon-1:before, -.bodywebsite .icon-2:before, -.bodywebsite .icon-4:before, -.bodywebsite .icon-5:before, -.bodywebsite .icon-6:before, -.bodywebsite .icon-3:before { - content: ''; - display: inline-block; - width: 40px; - height: 40px; -} -.bodywebsite .thumbnail { - position: relative; - z-index: 1; - width: 100%; - max-height: 100%; - overflow: hidden; - padding: 0; - margin: 0; - border: none; - border-radius: 0; - background-color: transparent; -} -.bodywebsite .thumbnail .caption { - padding: 0; -} -.bodywebsite .thumbnail { - box-shadow: none; -} -.bodywebsite .thumbnail-variant-1 { - background-color: transparent; - text-align: center; -} -.bodywebsite .thumbnail-variant-1 .thumbnail-image { - position: relative; - display: inline-block; - overflow: hidden; - pointer-events: none; -} -.bodywebsite .thumbnail-variant-1 .thumbnail-image, -.bodywebsite .thumbnail-variant-1 .thumbnail-image > img { - border-radius: 600px; -} -.bodywebsite .thumbnail-variant-1 .thumbnail-image > img { - width: auto; - pointer-events: auto; -} -.bodywebsite .thumbnail-variant-1 .thumbnail-image-inner { - position: absolute; - top: 0; - right: 1px; - bottom: 0; - left: 1px; - z-index: 2; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding: 20px 5px 5px; - background: rgba(0, 0, 0, 0.4); - border-radius: 600px; -} -.bodywebsite .thumbnail-variant-1 .thumbnail-image-inner * { - pointer-events: auto; -} -.bodywebsite .thumbnail-variant-1 .thumbnail-image-inner > * + * { - margin-top: 0; - margin-left: 20px; -} -.bodywebsite .thumbnail-variant-1 .header { - line-height: 1.2; -} -.bodywebsite .thumbnail-variant-1 * + p { - margin-top: 0; -} -.bodywebsite .thumbnail-variant-1 * + .thumbnail-caption { - margin-top: 18px; -} -@media (min-width: 992px) { - .bodywebsite .desktop .thumbnail-variant-1 .thumbnail-image-inner { - opacity: 0; - visibility: hidden; - transform: rotate3d(0, 1, 0, 60deg); - transition: .55s all ease; - background: rgba(0, 0, 0, 0.6); - } - .bodywebsite .desktop .thumbnail-variant-1 .thumbnail-image:hover .thumbnail-image-inner { - opacity: 1; - visibility: visible; - transform: rotate3d(0, 1, 0, 0deg); - } -} -@media (min-width: 1200px) { - .bodywebsite .thumbnail-variant-1 * + .thumbnail-caption { - margin-top: 30px; - } -} -.bodywebsite .thumbnail-variant-2 { - min-height: 300px; - padding: 30px 0 0; - overflow: visible; - text-align: center; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: flex-end; - -ms-flex-pack: end; - justify-content: flex-end; -} -.bodywebsite .thumbnail-variant-2-wrap { - padding-bottom: 25px; -} -.bodywebsite .thumbnail-variant-2 .thumbnail-image { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - height: 100%; - width: 100%; - overflow: hidden; -} -.bodywebsite .thumbnail-variant-2 .thumbnail-image > img { - position: absolute; - top: 20%; - left: 50%; - transform: translate(-50%, -20%); - width: auto; - min-width: 101%; - max-width: none; - height: auto; - min-height: 100%; - max-height: none; -} -.bodywebsite .thumbnail-variant-2:before { - content: ''; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - background: rgba(0, 0, 0, 0.5); -} -.bodywebsite .thumbnail-variant-2 .thumbnail-inner { - position: relative; - z-index: 2; - padding: 30px 10px; -} -.bodywebsite .thumbnail-variant-2 .thumbnail-caption { - position: relative; - z-index: 3; - width: calc(66%); - padding: 17px 8px 25px; - margin: 31px 17px -25px 17px; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .thumbnail-variant-2 .thumbnail-caption * { - color: #fff; -} -.bodywebsite .thumbnail-variant-2 .thumbnail-caption a, -.bodywebsite .thumbnail-variant-2 .thumbnail-caption a:active, -.bodywebsite .thumbnail-variant-2 .thumbnail-caption a:focus { - color: #fff; -} -.bodywebsite .thumbnail-variant-2 .thumbnail-caption a:hover { - color: #9f9f9f; -} -.bodywebsite .thumbnail-variant-2 .text-header { - font-size: 18px; - font-weight: 700; -} -.bodywebsite .thumbnail-variant-2 .text-caption { - font-style: italic; - line-height: 1.3; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -@media (min-width: 768px) { - .bodywebsite .thumbnail-variant-2 .text-caption { - font-size: 16px; - } -} -@media (min-width: 992px) { - .bodywebsite .desktop .thumbnail-variant-2:before { - top: 40px; - } - .bodywebsite .desktop .thumbnail-variant-2 .thumbnail-inner > * { - position: relative; - transform: translateY(14px); - transition: 0.4s all ease-in-out; - } - .bodywebsite .desktop .thumbnail-variant-2:before, - .bodywebsite .desktop .thumbnail-variant-2 .thumbnail-inner { - opacity: 0; - visibility: hidden; - transition: 0.33s all ease-out; - } - .bodywebsite .desktop .thumbnail-variant-2:hover:before { - top: 0; - left: 0; - right: 0; - } - .bodywebsite .desktop .thumbnail-variant-2:hover .thumbnail-inner > * { - transform: translateY(0); - } - .bodywebsite .desktop .thumbnail-variant-2:hover:before, - .bodywebsite .desktop .thumbnail-variant-2:hover .thumbnail-inner { - opacity: 1; - visibility: visible; - } -} -@media (min-width: 992px) { - .bodywebsite .thumbnail-variant-2 .thumbnail-caption { - width: calc(84%); - margin: 31px 8px -25px 8px; - } -} -@media (min-width: 1200px) { - .bodywebsite .thumbnail-variant-2 { - width: calc(78%); - margin: 0 11px 0; - } - .bodywebsite .thumbnail-variant-2 .thumbnail-caption { - width: calc(66%); - margin: 31px 17px -25px 17px; - } -} -.bodywebsite .ie-11 .thumbnail-variant-2 { - min-height: 0; -} -.bodywebsite .thumbnail-variant-3 { - width: 100.025%; - text-align: center; -} -.bodywebsite .thumbnail-variant-3 img { - position: relative; - left: 50%; - transform: translateX(-50%); - width: auto; - max-width: none; - min-width: 100.5%; -} -.bodywebsite .thumbnail-variant-3 .link-external { - position: absolute; - top: -30px; - right: -30px; - z-index: 1; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - width: 200px; - height: 110px; - padding: 55px 15px 5px; - vertical-align: bottom; - line-height: 40px; - background: #fafafa; - transform-origin: 74% 110%; - transform: rotate(45deg); - will-change: transform; - text-align: center; - /** - @bugfix: color flickering in child objects on hover - @affected: IE Edge - */ - transition: top 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86), right 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86), opacity 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86), visibility 0.28s cubic-bezier(0.79, 0.14, 0.15, 0.86); -} -.bodywebsite .thumbnail-variant-3 .link-external .icon { - transition: none; - transform: rotate(-45deg); - color: #000; - vertical-align: bottom; -} -.bodywebsite .thumbnail-variant-3 .link-external:hover { - top: -12px; - right: -12px; -} -.bodywebsite .thumbnail-variant-3 .link-original { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: flex-end; - -ms-flex-align: end; - align-items: flex-end; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.bodywebsite .thumbnail-variant-3 .link-original, -.bodywebsite .thumbnail-variant-3 .link-original:active, -.bodywebsite .thumbnail-variant-3 .link-original:focus, -.bodywebsite .thumbnail-variant-3 .link-original:hover { - color: #fff; -} -.bodywebsite .thumbnail-variant-3 .link-original:before { - content: '\e8ff'; - position: relative; - left: 20px; - bottom: 30px; - z-index: 3; - font-family: 'Material Icons'; - font-size: 140px; - line-height: 1; - opacity: .2; - transition: .33s all ease; -} -.bodywebsite .thumbnail-variant-3 .caption { - position: absolute; - top: -2px; - right: 0; - bottom: -2px; - left: 0; - padding: 15px; - transition: 0.33s all ease-in-out; - background: rgba(0, 0, 0, 0.6); -} -@media (min-width: 992px) { - .bodywebsite .desktop .thumbnail-variant-3 figure img { - will-change: transform; - transition: 0.4s ease-out; - } - .bodywebsite .desktop .thumbnail-variant-3 .caption, - .bodywebsite .desktop .thumbnail-variant-3 .link-external { - opacity: 0; - visibility: hidden; - } - .bodywebsite .desktop .thumbnail-variant-3 .link-external { - right: -50px; - top: -50px; - } - .bodywebsite .desktop .thumbnail-variant-3:hover .caption, - .bodywebsite .desktop .thumbnail-variant-3:hover .link-external { - opacity: 1; - visibility: visible; - } - .bodywebsite .desktop .thumbnail-variant-3:hover figure img { - transform: translateX(-50%) scale(1.08); - } - .bodywebsite .desktop .thumbnail-variant-3:hover .link-external { - right: -30px; - top: -30px; - } - .bodywebsite .desktop .thumbnail-variant-3:hover .link-external:hover { - top: -20px; - right: -20px; - } -} -.bodywebsite .thumbnail-variant-3 > * + * { - margin-top: 0; -} -@media (min-width: 768px) { - .bodywebsite .thumbnail-wrap { - padding: 0 5px; - } -} -@media (min-width: 1200px) { - .bodywebsite .thumbnail-wrap { - padding: 0 9px; - } -} -.bodywebsite .thumbnail-variant-4 { - position: relative; - overflow: hidden; - box-shadow: 0px 0px 13px 0px rgba(1, 3, 4, 0.15); -} -.bodywebsite .thumbnail-variant-4 .thumbnail-image { - background: #000; -} -.bodywebsite .thumbnail-variant-4 .thumbnail-image img { - opacity: .92; -} -.bodywebsite .thumbnail-variant-4 .caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 16px 15px; - text-align: center; - color: #000; - background: #fff; -} -.bodywebsite .thumbnail-variant-4 .text-light { - color: #0d0d0d; -} -@media (min-width: 992px) { - .bodywebsite .desktop .thumbnail-variant-4 .thumbnail-image img { - position: relative; - will-change: transform; - opacity: 1; - transition: opacity .7s, transform .7s; - transform: scale3d(1.0001, 1.0001, 1); - } - .bodywebsite .desktop .thumbnail-variant-4 .caption, - .bodywebsite .desktop .thumbnail-variant-4 .caption-header { - transition: transform 0.55s; - transform: translate3d(0, 200%, 0); - } - .bodywebsite .desktop .thumbnail-variant-4 .caption-header { - transition-delay: 0.05s; - } - .bodywebsite .desktop .thumbnail-variant-4:hover .thumbnail-image img { - opacity: .9; - transform: scale3d(1.07, 1.07, 1); - } - .bodywebsite .desktop .thumbnail-variant-4:hover .caption, - .bodywebsite .desktop .thumbnail-variant-4:hover .caption-header { - transform: translate3d(0, 0, 0); - } -} -@media (min-width: 992px) { - .bodywebsite .thumbnail-variant-4 .caption { - padding: 20px 15px; - } -} -.bodywebsite .thumbnail-profile .thumbnail-image img { - width: 100%; -} -.bodywebsite .thumbnail-profile .thumbnail-caption { - padding: 20px; - background: #f2f3f7; -} -.bodywebsite .thumbnail-profile .thumbnail-caption-inner { - margin-bottom: -12px; - -webkit-align-items: flex-end; - -ms-flex-align: end; - align-items: flex-end; - transform: translateY(-12px); - text-align: center; -} -.bodywebsite .thumbnail-profile .thumbnail-caption-inner > * { - display: inline-block; - margin-top: 12px; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.bodywebsite .thumbnail-profile .thumbnail-caption-inner, -.bodywebsite .thumbnail-profile .thumbnail-caption-inner > ul { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} -.bodywebsite .thumbnail-profile .thumbnail-caption-inner ul { - position: relative; - margin-bottom: -3px; - transform: translateY(-3px); - -webkit-flex-grow: 2; - -ms-flex-positive: 2; - flex-grow: 2; -} -.bodywebsite .thumbnail-profile .thumbnail-caption-inner ul > li { - display: inline-block; - margin-top: 3px; - padding: 0 7px; -} -.bodywebsite .thumbnail-profile .thumbnail-caption-inner .btn-wrap { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -@media (min-width: 576px) { - .bodywebsite .thumbnail-profile .thumbnail-caption-inner, - .bodywebsite .thumbnail-profile .thumbnail-caption-inner ul { - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - } -} -@media (min-width: 992px) { - .bodywebsite .thumbnail-profile .thumbnail-caption-inner ul { - -webkit-justify-content: space-around; - -ms-flex-pack: distribute; - justify-content: space-around; - } -} -@media (min-width: 1200px) { - .bodywebsite .thumbnail-profile .thumbnail-caption-inner { - text-align: left; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - } - .bodywebsite .thumbnail-profile .thumbnail-caption-inner .btn-wrap { - text-align: right; - } -} -@media (max-width: 767px) { - .bodywebsite .thumbnail-variant-2 { - max-width: 300px; - margin-left: auto; - margin-right: auto; - } - .bodywebsite .thumbnail-variant-3, - .bodywebsite .thumbnail-profile { - max-width: 370px; - margin-left: auto; - margin-right: auto; - } -} -.bodywebsite .thumbnail-block { - display: block; -} -.bodywebsite .thumbnail-block > img, -.bodywebsite .thumbnail-block a > img { - width: 100%; - height: auto; -} -.bodywebsite .thumbnail-variant-5 { - padding: 40px 20px; - display: inline-block; -} -.bodywebsite .thumbnail-variant-5, -.bodywebsite .thumbnail-variant-5 img { - transition: 0.2s ease-in-out; -} -@media (min-width: 992px) { - .bodywebsite .thumbnail-variant-5 { - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - } - .bodywebsite .thumbnail-variant-5 .thumbnail-variant-5-img-wrap { - position: relative; - display: inline-block; - } - .bodywebsite .thumbnail-variant-5 .thumbnail-variant-5-img-wrap:before { - content: ''; - position: absolute; - top: 0; - right: 0; - left: 0; - width: 100%; - height: 100%; - border-radius: 50%; - background: rgba(0, 0, 0, 0.4); - transition: 0.2s ease-in-out; - } - .bodywebsite .thumbnail-variant-5 { - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.15); - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - } - .bodywebsite .thumbnail-variant-5:hover .thumbnail-variant-5-img-wrap:before { - opacity: 0; - } - .bodywebsite .thumbnail-variant-5:hover img { - will-change: transform; - -webkit-transform: scale(1.18); - transform: scale(1.18); - } -} -@media (min-width: 992px) { - .bodywebsite .thumbnail-variant-5 { - padding: 40px 50px; - } -} -@media (min-width: 1200px) { - .bodywebsite .thumbnail-variant-5 { - padding: 65px 50px; - } -} -.bodywebsite .thumbnail-variant-5 * + h2 { - margin-top: 36px; -} -.bodywebsite .thumbnail-variant-5 h2 + * { - margin-top: 0; -} -.bodywebsite .thumbnail-variant-5 .link-group + .link-group { - margin-top: 7px; -} -.bodywebsite .thumbnail-variant-5 .divider-fullwidth { - margin-top: 12px; - margin-bottom: 17px; -} -.bodywebsite .thumbnail-with-img * + .thumbnail-title { - margin-top: 22px; -} -.bodywebsite .thumbnail-with-img .thumbnail-title + * { - margin-top: 10px; -} -.bodywebsite .thumbnail-profile-info h4 + * { - margin-top: 0; -} -.bodywebsite .thumbnail-profile-info * + .profile-quote { - margin-top: 15px; -} -.bodywebsite .thumbnail-profile-info .profile-quote + * { - margin-top: 15px; -} -.bodywebsite .thumbnail-profile-info * + .list-progress { - margin-top: 35px; -} -@media (min-width: 992px) { - .bodywebsite .thumbnail-profile-info * + .profile-quote { - margin-top: 0; - } - .bodywebsite .thumbnail-profile-info .profile-quote + * { - margin-top: 0; - } -} -.bodywebsite figure img { - margin: 18px; - border: 1px solid #ccc; - box-shadow: 1px 1px 25px #aaa; - max-width: calc(44%); -} -.bodywebsite figure img { - width: 100%; - height: auto; - max-width: none; -} -.bodywebsite .figure .caption { - padding: 15px; -} -.bodywebsite .rd-mailform { - position: relative; -} -.bodywebsite label { - margin-bottom: 0; -} -.bodywebsite input::-webkit-autofill + .form-label { - display: none; - transition: none; -} -.bodywebsite .form-label, -.bodywebsite .form-input { - font-weight: 400; -} -.bodywebsite .input-sm, -.bodywebsite .input-lg, -.bodywebsite .form-input { - font-size: 14px; -} -.bodywebsite .input-sm, -.bodywebsite .input-sm:focus, -.bodywebsite .input-lg, -.bodywebsite .input-lg:focus, -.bodywebsite .form-input, -.bodywebsite .form-input:focus { - box-shadow: none; -} -.bodywebsite textarea.form-input { - height: 166px; - min-height: 52px; - max-height: 249px; - resize: vertical; -} -.bodywebsite .form-input { - height: auto; - min-height: 52px; - border: 0px solid #dedede; - border-radius: 0; - -webkit-appearance: none; - line-height: 24px; -} -.bodywebsite .form-input:focus { - outline: 0; -} -.bodywebsite .form-wrap { - position: relative; - margin-bottom: 0; -} -.bodywebsite .form-wrap + .form-wrap { - margin-top: 10px; -} -.bodywebsite .form-label { - position: absolute; - top: 26px; - left: 19px; - font-size: 14px; - color: #9f9f9f; - pointer-events: none; - z-index: 9; - transition: .3s; - transform: translateY(-50%); - will-change: transform; -} -.bodywebsite .form-label.focus { - opacity: 0; -} -.bodywebsite .form-label.auto-fill { - color: #9f9f9f; -} -@media (min-width: 768px) { - .bodywebsite .form-label-outside { - position: static; - margin-bottom: 8px; - } - .bodywebsite .form-label-outside, - .bodywebsite .form-label-outside.focus, - .bodywebsite .form-label-outside.auto-fill { - transform: none; - color: #9f9f9f; - font-size: 14px; - } -} -.bodywebsite .form-wrap-outside { - margin-top: 10px; -} -.bodywebsite .form-wrap-outside .form-label-outside { - position: absolute; - top: -15px; - left: 0; -} -.bodywebsite .form-wrap-outside .form-label-outside.focus { - opacity: 1; -} -@media (min-width: 768px) { - .bodywebsite .form-wrap-outside .form-label-outside { - top: -30px; - } -} -.bodywebsite .form-border-bottom { - border-bottom: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .form-validation { - position: absolute; - right: 10px; - top: 2px; - font-size: 11px; - line-height: 11px; - color: #fe4a21; - margin-top: 2px; - transition: .3s; -} -.bodywebsite form.label-outside .form-validation { - top: 12px; -} -.bodywebsite .has-error .help-block, -.bodywebsite .has-error .control-label, -.bodywebsite .has-error .radio, -.bodywebsite .has-error .checkbox, -.bodywebsite .has-error .radio-inline, -.bodywebsite .has-error .checkbox-inline, -.bodywebsite .has-error.radio label, -.bodywebsite .has-error.checkbox label, -.bodywebsite .has-error.radio-inline label, -.bodywebsite .has-error.checkbox-inline label { - color: #fe4a21; -} -.bodywebsite .has-error .form-input:not(.form-input-impressed), -.bodywebsite .has-error .form-input:not(.form-input-impressed):focus { - border-color: #fe4a21; - box-shadow: none; -} -.bodywebsite .has-error .form-input-impressed, -.bodywebsite .has-error .form-input-impressed:focus { - box-shadow: inset 0 0 0 1px #fe4a21; -} -.bodywebsite .has-error .input-group-addon { - color: #fff; - border-color: #fe4a21; - background-color: #fe4a21; -} -.bodywebsite .form-inline .has-error ~ button[type='submit'] { - border-color: #fe4a21; - background: #fe4a21; -} -.bodywebsite .has-error .form-validation { - color: #fe4a21; -} -.bodywebsite .has-success .help-block, -.bodywebsite .has-success .control-label, -.bodywebsite .has-success .radio, -.bodywebsite .has-success .checkbox, -.bodywebsite .has-success .radio-inline, -.bodywebsite .has-success .checkbox-inline, -.bodywebsite .has-success.radio label, -.bodywebsite .has-success.checkbox label, -.bodywebsite .has-success.radio-inline label, -.bodywebsite .has-success.checkbox-inline label { - color: #58c476; -} -.bodywebsite .has-success .form-input:not(.form-input-impressed), -.bodywebsite .has-success .form-input:not(.form-input-impressed):focus { - border-color: #dff0d8; - box-shadow: none; -} -.bodywebsite .has-success .form-input-impressed, -.bodywebsite .has-success .form-input-impressed:focus { - box-shadow: inset 0 0 0 1px #dff0d8; -} -.bodywebsite .has-success .input-group-addon { - color: #fff; - border-color: #dff0d8; - background-color: #dff0d8; -} -.bodywebsite .form-inline .has-success ~ button[type='submit'] { - border-color: #dff0d8; - background: #dff0d8; -} -.bodywebsite .has-success .form-validation { - color: #58c476; -} -.bodywebsite .has-warning .help-block, -.bodywebsite .has-warning .control-label, -.bodywebsite .has-warning .radio, -.bodywebsite .has-warning .checkbox, -.bodywebsite .has-warning .radio-inline, -.bodywebsite .has-warning .checkbox-inline, -.bodywebsite .has-warning.radio label, -.bodywebsite .has-warning.checkbox label, -.bodywebsite .has-warning.radio-inline label, -.bodywebsite .has-warning.checkbox-inline label { - color: #c49558; -} -.bodywebsite .has-warning .form-input:not(.form-input-impressed), -.bodywebsite .has-warning .form-input:not(.form-input-impressed):focus { - border-color: #fcf8e3; - box-shadow: none; -} -.bodywebsite .has-warning .form-input-impressed, -.bodywebsite .has-warning .form-input-impressed:focus { - box-shadow: inset 0 0 0 1px #fcf8e3; -} -.bodywebsite .has-warning .input-group-addon { - color: #fff; - border-color: #fcf8e3; - background-color: #fcf8e3; -} -.bodywebsite .form-inline .has-warning ~ button[type='submit'] { - border-color: #fcf8e3; - background: #fcf8e3; -} -.bodywebsite .has-warning .form-validation { - color: #c49558; -} -.bodywebsite .has-info .help-block, -.bodywebsite .has-info .control-label, -.bodywebsite .has-info .radio, -.bodywebsite .has-info .checkbox, -.bodywebsite .has-info .radio-inline, -.bodywebsite .has-info .checkbox-inline, -.bodywebsite .has-info.radio label, -.bodywebsite .has-info.checkbox label, -.bodywebsite .has-info.radio-inline label, -.bodywebsite .has-info.checkbox-inline label { - color: #3e9cf6; -} -.bodywebsite .has-info .form-input:not(.form-input-impressed), -.bodywebsite .has-info .form-input:not(.form-input-impressed):focus { - border-color: #d9edf7; - box-shadow: none; -} -.bodywebsite .has-info .form-input-impressed, -.bodywebsite .has-info .form-input-impressed:focus { - box-shadow: inset 0 0 0 1px #d9edf7; -} -.bodywebsite .has-info .input-group-addon { - color: #fff; - border-color: #d9edf7; - background-color: #d9edf7; -} -.bodywebsite .form-inline .has-info ~ button[type='submit'] { - border-color: #d9edf7; - background: #d9edf7; -} -.bodywebsite .has-info .form-validation { - color: #3e9cf6; -} -.bodywebsite #form-output-global { - position: fixed; - bottom: 30px; - left: 15px; - visibility: hidden; - transform: translateX(-500px); - transition: .3s all ease; - z-index: 9999999; -} -.bodywebsite #form-output-global.active { - transform: translateX(0); - visibility: visible; -} -@media (min-width: 576px) { - .bodywebsite #form-output-global { - left: 30px; - } -} -.bodywebsite .form-output { - position: absolute; - top: 100%; - left: 0; - font-size: 14px; - line-height: 1.5; - margin-top: 2px; - transition: .3s; - opacity: 0; - visibility: hidden; -} -.bodywebsite .form-output.active { - opacity: 1; - visibility: visible; -} -.bodywebsite .form-output.error { - color: #fe4a21; -} -.bodywebsite .form-output.success { - color: #58c476; -} -.bodywebsite .radio .radio-custom, -.bodywebsite .radio-inline .radio-custom, -.bodywebsite .checkbox .checkbox-custom, -.bodywebsite .checkbox-inline .checkbox-custom { - opacity: 0; -} -.bodywebsite .radio .radio-custom, -.bodywebsite .radio .radio-custom-dummy, -.bodywebsite .radio-inline .radio-custom, -.bodywebsite .radio-inline .radio-custom-dummy, -.bodywebsite .checkbox .checkbox-custom, -.bodywebsite .checkbox .checkbox-custom-dummy, -.bodywebsite .checkbox-inline .checkbox-custom, -.bodywebsite .checkbox-inline .checkbox-custom-dummy { - position: absolute; - width: 18px; - height: 18px; - margin-left: -20px; - margin-top: 3px; - outline: none; - cursor: pointer; -} -.bodywebsite .radio .radio-custom-dummy, -.bodywebsite .radio-inline .radio-custom-dummy, -.bodywebsite .checkbox .checkbox-custom-dummy, -.bodywebsite .checkbox-inline .checkbox-custom-dummy { - pointer-events: none; -} -.bodywebsite .radio .radio-custom-dummy:after, -.bodywebsite .radio-inline .radio-custom-dummy:after, -.bodywebsite .checkbox .checkbox-custom-dummy:after, -.bodywebsite .checkbox-inline .checkbox-custom-dummy:after { - position: absolute; - opacity: 0; - transition: .22s; -} -.bodywebsite .radio .radio-custom:focus, -.bodywebsite .radio-inline .radio-custom:focus, -.bodywebsite .checkbox .checkbox-custom:focus, -.bodywebsite .checkbox-inline .checkbox-custom:focus { - outline: none; -} -.bodywebsite .radio-custom:checked + .radio-custom-dummy:after, -.bodywebsite .checkbox-custom:checked + .checkbox-custom-dummy:after { - opacity: 1; -} -.bodywebsite .radio, -.bodywebsite .radio-inline { - padding-left: 30px; -} -.bodywebsite .radio .radio-custom-dummy, -.bodywebsite .radio-inline .radio-custom-dummy { - margin-top: 2px; - border-radius: 50%; - margin-left: -30px; - background: transparent; - border: 2px solid #000; -} -.bodywebsite .radio .radio-custom-dummy:after, -.bodywebsite .radio-inline .radio-custom-dummy:after { - content: ''; - top: 3px; - right: 3px; - bottom: 3px; - left: 3px; - background: #00030a; - border-radius: 50%; -} -.bodywebsite .form-wrap-color .radio-inline, -.bodywebsite .form-wrap-size .radio-inline { - padding-left: 0; -} -.bodywebsite .form-wrap-color .radio-control, -.bodywebsite .form-wrap-size .radio-control { - position: relative; - display: block; - width: 24px; - height: 24px; - border-radius: 50%; - margin-top: 23px; - margin-bottom: 23px; -} -.bodywebsite .form-wrap-color .radio-control:after, -.bodywebsite .form-wrap-size .radio-control:after { - bottom: 0; -} -.bodywebsite .form-wrap-color .radio-control:after, -.bodywebsite .form-wrap-size .radio-control:after { - content: ''; - position: absolute; - left: 50%; - bottom: -23px; - transform: translateX(-50%); - width: 0; - max-width: 100%; - height: 3px; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - visibility: hidden; - transition: .2s; -} -.bodywebsite .form-wrap-color .radio-custom:checked ~ .radio-control:after, -.bodywebsite .form-wrap-size .radio-custom:checked ~ .radio-control:after { - visibility: visible; - width: 100%; -} -.bodywebsite .form-wrap-color .radio-custom-dummy, -.bodywebsite .form-wrap-size .radio-custom-dummy { - display: none; -} -.bodywebsite .form-wrap-size .radio-inline { - padding-left: 2px; - padding-right: 2px; -} -.bodywebsite .form-wrap-size .radio-inline + .radio-inline { - margin-left: 1px; -} -.bodywebsite .form-wrap-size .radio-control { - color: #9f9f9f; - text-align: center; - text-transform: uppercase; - transition: .2s; -} -.bodywebsite .form-wrap-size .radio-control:hover { - color: #000; -} -.bodywebsite .form-wrap-size .radio-custom:checked ~ .radio-control { - color: #000; -} -.bodywebsite .checkbox, -.bodywebsite .checkbox-inline { - padding-left: 38px; - color: #000; -} -.bodywebsite .checkbox .checkbox-custom-dummy, -.bodywebsite .checkbox-inline .checkbox-custom-dummy { - pointer-events: none; - border-radius: 2px; - margin-left: 0; - left: 0; - background: #fff; - box-shadow: none; - border: 2px solid #dedede; -} -.bodywebsite .checkbox .checkbox-custom-dummy:after, -.bodywebsite .checkbox-inline .checkbox-custom-dummy:after { - content: '\e5ca'; - font-family: 'Material Icons'; - font-size: 22px; - line-height: 10px; - position: absolute; - top: 0; - left: -1px; - color: #2a2b2b; -} -.bodywebsite .checkbox-small { - padding-left: 26px; -} -.bodywebsite .checkbox-small .checkbox-custom-dummy { - margin-top: 6px; - width: 12px; - height: 12px; - border-width: 1px; - border-radius: 1px; -} -.bodywebsite .checkbox-small .checkbox-custom-dummy:after { - top: -1px; - left: -2px; - font-size: 18px; -} -.bodywebsite .textarea-lined-wrap { - position: relative; - line-height: 2.39; -} -.bodywebsite .textarea-lined-wrap textarea { - height: 203px; - resize: none; - overflow: hidden; - line-height: 2.39; - background-color: transparent; -} -.bodywebsite .textarea-lined-wrap-xs textarea { - height: 68px; -} -.bodywebsite .page .form-classic-bordered .form-label, -.bodywebsite .page .form-classic-bordered .form-label-outside, -.bodywebsite .page .form-classic-bordered .form-input { - color: #000; -} -.bodywebsite .page .form-classic-bordered .form-input { - border: 1px solid #dedede; -} -.bodywebsite .page .form-modern .form-input, -.bodywebsite .page .form-modern .form-label { - color: #9f9f9f; -} -.bodywebsite .page .form-modern input { - height: auto; - min-height: 20px; -} -.bodywebsite .page .form-modern .form-input:focus { - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .form-modern .form-input { - padding: 6px 0; - border-radius: 0; - border-width: 0 0 1px 0; - border-color: #dedede; - background-color: transparent; -} -.bodywebsite .page .form-modern .form-label { - left: 0; - top: 18px; -} -.bodywebsite .page .form-modern .form-validation { - top: auto; - left: auto; - right: 0; - bottom: -12px; - font-style: italic; -} -.bodywebsite .page .form-modern .has-error .help-block, -.bodywebsite .page .form-modern .has-error .control-label, -.bodywebsite .page .form-modern .has-error .radio, -.bodywebsite .page .form-modern .has-error .checkbox, -.bodywebsite .page .form-modern .has-error .radio-inline, -.bodywebsite .page .form-modern .has-error .checkbox-inline, -.bodywebsite .page .form-modern .has-error.radio label, -.bodywebsite .page .form-modern .has-error.checkbox label, -.bodywebsite .page .form-modern .has-error.radio-inline label, -.bodywebsite .page .form-modern .has-error.checkbox-inline label { - color: #fe4a21; -} -.bodywebsite .page .form-modern .has-error .form-input:not(.form-input-impressed), -.bodywebsite .page .form-modern .has-error .form-input:not(.form-input-impressed):focus { - border-color: #fe4a21; - box-shadow: none; -} -.bodywebsite .page .form-modern .has-error .form-input-impressed, -.bodywebsite .page .form-modern .has-error .form-input-impressed:focus { - box-shadow: inset 0 0 0 1px #fe4a21; -} -.bodywebsite .page .form-modern .has-error .input-group-addon { - color: #fff; - border-color: #fe4a21; - background-color: #fe4a21; -} -.bodywebsite .form-inline .page .form-modern .has-error ~ button[type='submit'] { - border-color: #fe4a21; - background: #fe4a21; -} -.bodywebsite .page .form-modern .has-error .form-validation { - color: #fe4a21; -} -.bodywebsite .page .form-modern.form-darker .form-input, -.bodywebsite .page .form-modern.form-darker .form-label { - color: #000; -} -.bodywebsite .page .form-modern.form-darker .form-label:not(.focus) + .form-input { - border-color: #cdcdcd; -} -.bodywebsite .page .form-modern.form-inverse .form-label, -.bodywebsite .page .form-modern.form-inverse .form-input { - color: #9f9f9f; - background-color: transparent; -} -.bodywebsite .page .form-modern.form-inverse .form-label.text-white-05, -.bodywebsite .page .form-modern.form-inverse .form-input.text-white-05 { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .stacktable { - width: 100%; - text-align: left; -} -.bodywebsite .st-head-row { - padding-top: 1em; -} -.bodywebsite .st-head-row.st-head-row-main { - font-size: 1.5em; - padding-top: 0; -} -.bodywebsite .st-key { - width: 49%; - text-align: right; - padding-right: 1%; -} -.bodywebsite .st-val { - width: 49%; - padding-left: 1%; -} -.bodywebsite .stacktable.large-only { - display: none; -} -.bodywebsite .stacktable.small-only { - display: table; -} -@media (min-width: 768px) { - .bodywebsite .stacktable.large-only { - display: table; - } - .bodywebsite .stacktable.small-only { - display: none; - } -} -.bodywebsite .section-relative { - position: relative; -} -.bodywebsite #sectionfooter h4, -.bodywebsite #sectiontestimonies h1 { - color: #fff; -} -@media (min-width: 768px) { - .bodywebsite .section-with-counters { - padding-top: 1px; - padding-bottom: 1px; - } - .bodywebsite .section-with-counters > div { - position: relative; - box-shadow: 2px 2px 27px 0px rgba(1, 3, 4, 0.35); - z-index: 2; - margin-top: -30px; - margin-bottom: -30px; - } -} -@media (min-width: 768px) { - .bodywebsite .section-image-aside { - position: relative; - } -} -.bodywebsite .section-image-aside-img { - position: absolute; - top: 0; - bottom: 0; - width: 190%; - -webkit-background-size: cover; - background-size: cover; -} -@media (min-width: 768px) { - .bodywebsite .section-image-aside-img { - width: 50vw; - } -} -.bodywebsite .section-image-aside-left .section-image-aside-img { - right: -50%; -} -@media (min-width: 768px) { - .bodywebsite .section-image-aside-left .section-image-aside-img { - right: 0; - } -} -.bodywebsite .section-image-aside-right .section-image-aside-img { - left: -50%; -} -@media (min-width: 768px) { - .bodywebsite .section-image-aside-right .section-image-aside-img { - left: 0; - } -} -.bodywebsite .section-15 { - padding-top: 15px; - padding-bottom: 15px; -} -.bodywebsite .section-30 { - padding-top: 30px; - padding-bottom: 30px; -} -.bodywebsite .section-35 { - padding-top: 35px; - padding-bottom: 35px; -} -.bodywebsite .section-40 { - padding-top: 40px; - padding-bottom: 40px; -} -.bodywebsite .section-45 { - padding-top: 45px; - padding-bottom: 45px; -} -.bodywebsite .section-50 { - padding-top: 50px; - padding-bottom: 50px; -} -.bodywebsite .section-60 { - padding-top: 60px; - padding-bottom: 60px; -} -.bodywebsite .section-66 { - padding-top: 66px; - padding-bottom: 66px; -} -.bodywebsite .section-75 { - padding-top: 75px; - padding-bottom: 75px; -} -.bodywebsite .section-90 { - padding-top: 90px; - padding-bottom: 90px; -} -.bodywebsite .section-100 { - padding-top: 100px; - padding-bottom: 100px; -} -.bodywebsite .section-120 { - padding-top: 120px; - padding-bottom: 120px; -} -.bodywebsite .section-130 { - padding-top: 130px; - padding-bottom: 130px; -} -.bodywebsite .section-145 { - padding-top: 145px; - padding-bottom: 145px; -} -.bodywebsite .section-165 { - padding-top: 165px; - padding-bottom: 165px; -} -@media (min-width: 576px) { - .bodywebsite .section-sm-15 { - padding-top: 15px; - padding-bottom: 15px; - } - .bodywebsite .section-sm-30 { - padding-top: 30px; - padding-bottom: 30px; - } - .bodywebsite .section-sm-35 { - padding-top: 35px; - padding-bottom: 35px; - } - .bodywebsite .section-sm-40 { - padding-top: 40px; - padding-bottom: 40px; - } - .bodywebsite .section-sm-45 { - padding-top: 45px; - padding-bottom: 45px; - } - .bodywebsite .section-sm-50 { - padding-top: 50px; - padding-bottom: 50px; - } - .bodywebsite .section-sm-60 { - padding-top: 60px; - padding-bottom: 60px; - } - .bodywebsite .section-sm-66 { - padding-top: 66px; - padding-bottom: 66px; - } - .bodywebsite .section-sm-75 { - padding-top: 75px; - padding-bottom: 75px; - } - .bodywebsite .section-sm-90 { - padding-top: 90px; - padding-bottom: 90px; - } - .bodywebsite .section-sm-100 { - padding-top: 100px; - padding-bottom: 100px; - } - .bodywebsite .section-sm-120 { - padding-top: 120px; - padding-bottom: 120px; - } - .bodywebsite .section-sm-130 { - padding-top: 130px; - padding-bottom: 130px; - } - .bodywebsite .section-sm-145 { - padding-top: 145px; - padding-bottom: 145px; - } - .bodywebsite .section-sm-165 { - padding-top: 165px; - padding-bottom: 165px; - } -} -@media (min-width: 768px) { - .bodywebsite .section-md-15 { - padding-top: 15px; - padding-bottom: 15px; - } - .bodywebsite .section-md-30 { - padding-top: 30px; - padding-bottom: 30px; - } - .bodywebsite .section-md-35 { - padding-top: 35px; - padding-bottom: 35px; - } - .bodywebsite .section-md-40 { - padding-top: 40px; - padding-bottom: 40px; - } - .bodywebsite .section-md-45 { - padding-top: 45px; - padding-bottom: 45px; - } - .bodywebsite .section-md-50 { - padding-top: 50px; - padding-bottom: 50px; - } - .bodywebsite .section-md-60 { - padding-top: 60px; - padding-bottom: 60px; - } - .bodywebsite .section-md-66 { - padding-top: 66px; - padding-bottom: 66px; - } - .bodywebsite .section-md-75 { - padding-top: 75px; - padding-bottom: 75px; - } - .bodywebsite .section-md-90 { - padding-top: 90px; - padding-bottom: 90px; - } - .bodywebsite .section-md-100 { - padding-top: 100px; - padding-bottom: 100px; - } - .bodywebsite .section-md-120 { - padding-top: 120px; - padding-bottom: 120px; - } - .bodywebsite .section-md-130 { - padding-top: 130px; - padding-bottom: 130px; - } - .bodywebsite .section-md-145 { - padding-top: 145px; - padding-bottom: 145px; - } - .bodywebsite .section-md-165 { - padding-top: 165px; - padding-bottom: 165px; - } -} -@media (min-width: 992px) { - .bodywebsite .section-lg-15 { - padding-top: 15px; - padding-bottom: 15px; - } - .bodywebsite .section-lg-30 { - padding-top: 30px; - padding-bottom: 30px; - } - .bodywebsite .section-lg-35 { - padding-top: 35px; - padding-bottom: 35px; - } - .bodywebsite .section-lg-40 { - padding-top: 40px; - padding-bottom: 40px; - } - .bodywebsite .section-lg-45 { - padding-top: 45px; - padding-bottom: 45px; - } - .bodywebsite .section-lg-50 { - padding-top: 50px; - padding-bottom: 50px; - } - .bodywebsite .section-lg-60 { - padding-top: 60px; - padding-bottom: 60px; - } - .bodywebsite .section-lg-66 { - padding-top: 66px; - padding-bottom: 66px; - } - .bodywebsite .section-lg-75 { - padding-top: 75px; - padding-bottom: 75px; - } - .bodywebsite .section-lg-90 { - padding-top: 90px; - padding-bottom: 90px; - } - .bodywebsite .section-lg-100 { - padding-top: 100px; - padding-bottom: 100px; - } - .bodywebsite .section-lg-120 { - padding-top: 120px; - padding-bottom: 120px; - } - .bodywebsite .section-lg-130 { - padding-top: 130px; - padding-bottom: 130px; - } - .bodywebsite .section-lg-145 { - padding-top: 145px; - padding-bottom: 145px; - } - .bodywebsite .section-lg-165 { - padding-top: 165px; - padding-bottom: 165px; - } -} -@media (min-width: 1200px) { - .bodywebsite .section-xl-15 { - padding-top: 15px; - padding-bottom: 15px; - } - .bodywebsite .section-xl-30 { - padding-top: 30px; - padding-bottom: 30px; - } - .bodywebsite .section-xl-35 { - padding-top: 35px; - padding-bottom: 35px; - } - .bodywebsite .section-xl-40 { - padding-top: 40px; - padding-bottom: 40px; - } - .bodywebsite .section-xl-45 { - padding-top: 45px; - padding-bottom: 45px; - } - .bodywebsite .section-xl-50 { - padding-top: 50px; - padding-bottom: 50px; - } - .bodywebsite .section-xl-60 { - padding-top: 60px; - padding-bottom: 60px; - } - .bodywebsite .section-xl-66 { - padding-top: 66px; - padding-bottom: 66px; - } - .bodywebsite .section-xl-75 { - padding-top: 75px; - padding-bottom: 75px; - } - .bodywebsite .section-xl-90 { - padding-top: 90px; - padding-bottom: 90px; - } - .bodywebsite .section-xl-100 { - padding-top: 100px; - padding-bottom: 100px; - } - .bodywebsite .section-xl-120 { - padding-top: 120px; - padding-bottom: 120px; - } - .bodywebsite .section-xl-130 { - padding-top: 130px; - padding-bottom: 130px; - } - .bodywebsite .section-xl-145 { - padding-top: 145px; - padding-bottom: 145px; - } - .bodywebsite .section-xl-165 { - padding-top: 165px; - padding-bottom: 165px; - } -} -@media (min-width: 1800px) { - .bodywebsite .section-xxl-15 { - padding-top: 15px; - padding-bottom: 15px; - } - .bodywebsite .section-xxl-30 { - padding-top: 30px; - padding-bottom: 30px; - } - .bodywebsite .section-xxl-35 { - padding-top: 35px; - padding-bottom: 35px; - } - .bodywebsite .section-xxl-40 { - padding-top: 40px; - padding-bottom: 40px; - } - .bodywebsite .section-xxl-45 { - padding-top: 45px; - padding-bottom: 45px; - } - .bodywebsite .section-xxl-50 { - padding-top: 50px; - padding-bottom: 50px; - } - .bodywebsite .section-xxl-60 { - padding-top: 60px; - padding-bottom: 60px; - } - .bodywebsite .section-xxl-66 { - padding-top: 66px; - padding-bottom: 66px; - } - .bodywebsite .section-xxl-75 { - padding-top: 75px; - padding-bottom: 75px; - } - .bodywebsite .section-xxl-90 { - padding-top: 90px; - padding-bottom: 90px; - } - .bodywebsite .section-xxl-100 { - padding-top: 100px; - padding-bottom: 100px; - } - .bodywebsite .section-xxl-120 { - padding-top: 120px; - padding-bottom: 120px; - } - .bodywebsite .section-xxl-130 { - padding-top: 130px; - padding-bottom: 130px; - } - .bodywebsite .section-xxl-145 { - padding-top: 145px; - padding-bottom: 145px; - } - .bodywebsite .section-xxl-165 { - padding-top: 165px; - padding-bottom: 165px; - } -} -.bodywebsite .section-top-15 { - padding-top: 15px; -} -.bodywebsite .section-top-30 { - padding-top: 30px; -} -.bodywebsite .section-top-35 { - padding-top: 35px; -} -.bodywebsite .section-top-40 { - padding-top: 40px; -} -.bodywebsite .section-top-45 { - padding-top: 45px; -} -.bodywebsite .section-top-50 { - padding-top: 50px; -} -.bodywebsite .section-top-60 { - padding-top: 60px; -} -.bodywebsite .section-top-66 { - padding-top: 66px; -} -.bodywebsite .section-top-75 { - padding-top: 75px; -} -.bodywebsite .section-top-90 { - padding-top: 90px; -} -.bodywebsite .section-top-100 { - padding-top: 100px; -} -.bodywebsite .section-top-120 { - padding-top: 120px; -} -.bodywebsite .section-top-130 { - padding-top: 130px; -} -.bodywebsite .section-top-145 { - padding-top: 145px; -} -.bodywebsite .section-top-165 { - padding-top: 165px; -} -@media (min-width: 576px) { - .bodywebsite .section-sm-top-15 { - padding-top: 15px; - } - .bodywebsite .section-sm-top-30 { - padding-top: 30px; - } - .bodywebsite .section-sm-top-35 { - padding-top: 35px; - } - .bodywebsite .section-sm-top-40 { - padding-top: 40px; - } - .bodywebsite .section-sm-top-45 { - padding-top: 45px; - } - .bodywebsite .section-sm-top-50 { - padding-top: 50px; - } - .bodywebsite .section-sm-top-60 { - padding-top: 60px; - } - .bodywebsite .section-sm-top-66 { - padding-top: 66px; - } - .bodywebsite .section-sm-top-75 { - padding-top: 75px; - } - .bodywebsite .section-sm-top-90 { - padding-top: 90px; - } - .bodywebsite .section-sm-top-100 { - padding-top: 100px; - } - .bodywebsite .section-sm-top-120 { - padding-top: 120px; - } - .bodywebsite .section-sm-top-130 { - padding-top: 130px; - } - .bodywebsite .section-sm-top-145 { - padding-top: 145px; - } - .bodywebsite .section-sm-top-165 { - padding-top: 165px; - } -} -@media (min-width: 768px) { - .bodywebsite .section-md-top-15 { - padding-top: 15px; - } - .bodywebsite .section-md-top-30 { - padding-top: 30px; - } - .bodywebsite .section-md-top-35 { - padding-top: 35px; - } - .bodywebsite .section-md-top-40 { - padding-top: 40px; - } - .bodywebsite .section-md-top-45 { - padding-top: 45px; - } - .bodywebsite .section-md-top-50 { - padding-top: 50px; - } - .bodywebsite .section-md-top-60 { - padding-top: 60px; - } - .bodywebsite .section-md-top-66 { - padding-top: 66px; - } - .bodywebsite .section-md-top-75 { - padding-top: 75px; - } - .bodywebsite .section-md-top-90 { - padding-top: 90px; - } - .bodywebsite .section-md-top-100 { - padding-top: 100px; - } - .bodywebsite .section-md-top-120 { - padding-top: 120px; - } - .bodywebsite .section-md-top-130 { - padding-top: 130px; - } - .bodywebsite .section-md-top-145 { - padding-top: 145px; - } - .bodywebsite .section-md-top-165 { - padding-top: 165px; - } -} -@media (min-width: 992px) { - .bodywebsite .section-lg-top-15 { - padding-top: 15px; - } - .bodywebsite .section-lg-top-30 { - padding-top: 30px; - } - .bodywebsite .section-lg-top-35 { - padding-top: 35px; - } - .bodywebsite .section-lg-top-40 { - padding-top: 40px; - } - .bodywebsite .section-lg-top-45 { - padding-top: 45px; - } - .bodywebsite .section-lg-top-50 { - padding-top: 50px; - } - .bodywebsite .section-lg-top-60 { - padding-top: 60px; - } - .bodywebsite .section-lg-top-66 { - padding-top: 66px; - } - .bodywebsite .section-lg-top-75 { - padding-top: 75px; - } - .bodywebsite .section-lg-top-90 { - padding-top: 90px; - } - .bodywebsite .section-lg-top-100 { - padding-top: 100px; - } - .bodywebsite .section-lg-top-120 { - padding-top: 120px; - } - .bodywebsite .section-lg-top-130 { - padding-top: 130px; - } - .bodywebsite .section-lg-top-145 { - padding-top: 145px; - } - .bodywebsite .section-lg-top-165 { - padding-top: 165px; - } -} -@media (min-width: 1200px) { - .bodywebsite .section-xl-top-15 { - padding-top: 15px; - } - .bodywebsite .section-xl-top-30 { - padding-top: 30px; - } - .bodywebsite .section-xl-top-35 { - padding-top: 35px; - } - .bodywebsite .section-xl-top-40 { - padding-top: 40px; - } - .bodywebsite .section-xl-top-45 { - padding-top: 45px; - } - .bodywebsite .section-xl-top-50 { - padding-top: 50px; - } - .bodywebsite .section-xl-top-60 { - padding-top: 60px; - } - .bodywebsite .section-xl-top-66 { - padding-top: 66px; - } - .bodywebsite .section-xl-top-75 { - padding-top: 75px; - } - .bodywebsite .section-xl-top-90 { - padding-top: 90px; - } - .bodywebsite .section-xl-top-100 { - padding-top: 100px; - } - .bodywebsite .section-xl-top-120 { - padding-top: 120px; - } - .bodywebsite .section-xl-top-130 { - padding-top: 130px; - } - .bodywebsite .section-xl-top-145 { - padding-top: 145px; - } - .bodywebsite .section-xl-top-165 { - padding-top: 165px; - } -} -@media (min-width: 1800px) { - .bodywebsite .section-xxl-top-15 { - padding-top: 15px; - } - .bodywebsite .section-xxl-top-30 { - padding-top: 30px; - } - .bodywebsite .section-xxl-top-35 { - padding-top: 35px; - } - .bodywebsite .section-xxl-top-40 { - padding-top: 40px; - } - .bodywebsite .section-xxl-top-45 { - padding-top: 45px; - } - .bodywebsite .section-xxl-top-50 { - padding-top: 50px; - } - .bodywebsite .section-xxl-top-60 { - padding-top: 60px; - } - .bodywebsite .section-xxl-top-66 { - padding-top: 66px; - } - .bodywebsite .section-xxl-top-75 { - padding-top: 75px; - } - .bodywebsite .section-xxl-top-90 { - padding-top: 90px; - } - .bodywebsite .section-xxl-top-100 { - padding-top: 100px; - } - .bodywebsite .section-xxl-top-120 { - padding-top: 120px; - } - .bodywebsite .section-xxl-top-130 { - padding-top: 130px; - } - .bodywebsite .section-xxl-top-145 { - padding-top: 145px; - } - .bodywebsite .section-xxl-top-165 { - padding-top: 165px; - } -} -.bodywebsite .section-bottom-15 { - padding-bottom: 15px; -} -.bodywebsite .section-bottom-30 { - padding-bottom: 30px; -} -.bodywebsite .section-bottom-35 { - padding-bottom: 35px; -} -.bodywebsite .section-bottom-40 { - padding-bottom: 40px; -} -.bodywebsite .section-bottom-45 { - padding-bottom: 45px; -} -.bodywebsite .section-bottom-50 { - padding-bottom: 50px; -} -.bodywebsite .section-bottom-60 { - padding-bottom: 60px; -} -.bodywebsite .section-bottom-66 { - padding-bottom: 66px; -} -.bodywebsite .section-bottom-75 { - padding-bottom: 75px; -} -.bodywebsite .section-bottom-90 { - padding-bottom: 90px; -} -.bodywebsite .section-bottom-100 { - padding-bottom: 100px; -} -.bodywebsite .section-bottom-120 { - padding-bottom: 120px; -} -.bodywebsite .section-bottom-130 { - padding-bottom: 130px; -} -.bodywebsite .section-bottom-145 { - padding-bottom: 145px; -} -.bodywebsite .section-bottom-165 { - padding-bottom: 165px; -} -@media (min-width: 576px) { - .bodywebsite .section-sm-bottom-15 { - padding-bottom: 15px; - } - .bodywebsite .section-sm-bottom-30 { - padding-bottom: 30px; - } - .bodywebsite .section-sm-bottom-35 { - padding-bottom: 35px; - } - .bodywebsite .section-sm-bottom-40 { - padding-bottom: 40px; - } - .bodywebsite .section-sm-bottom-45 { - padding-bottom: 45px; - } - .bodywebsite .section-sm-bottom-50 { - padding-bottom: 50px; - } - .bodywebsite .section-sm-bottom-60 { - padding-bottom: 60px; - } - .bodywebsite .section-sm-bottom-66 { - padding-bottom: 66px; - } - .bodywebsite .section-sm-bottom-75 { - padding-bottom: 75px; - } - .bodywebsite .section-sm-bottom-90 { - padding-bottom: 90px; - } - .bodywebsite .section-sm-bottom-100 { - padding-bottom: 100px; - } - .bodywebsite .section-sm-bottom-120 { - padding-bottom: 120px; - } - .bodywebsite .section-sm-bottom-130 { - padding-bottom: 130px; - } - .bodywebsite .section-sm-bottom-145 { - padding-bottom: 145px; - } - .bodywebsite .section-sm-bottom-165 { - padding-bottom: 165px; - } -} -@media (min-width: 768px) { - .bodywebsite .section-md-bottom-15 { - padding-bottom: 15px; - } - .bodywebsite .section-md-bottom-30 { - padding-bottom: 30px; - } - .bodywebsite .section-md-bottom-35 { - padding-bottom: 35px; - } - .bodywebsite .section-md-bottom-40 { - padding-bottom: 40px; - } - .bodywebsite .section-md-bottom-45 { - padding-bottom: 45px; - } - .bodywebsite .section-md-bottom-50 { - padding-bottom: 50px; - } - .bodywebsite .section-md-bottom-60 { - padding-bottom: 60px; - } - .bodywebsite .section-md-bottom-66 { - padding-bottom: 66px; - } - .bodywebsite .section-md-bottom-75 { - padding-bottom: 75px; - } - .bodywebsite .section-md-bottom-90 { - padding-bottom: 90px; - } - .bodywebsite .section-md-bottom-100 { - padding-bottom: 100px; - } - .bodywebsite .section-md-bottom-120 { - padding-bottom: 120px; - } - .bodywebsite .section-md-bottom-130 { - padding-bottom: 130px; - } - .bodywebsite .section-md-bottom-145 { - padding-bottom: 145px; - } - .bodywebsite .section-md-bottom-165 { - padding-bottom: 165px; - } -} -@media (min-width: 992px) { - .bodywebsite .section-lg-bottom-15 { - padding-bottom: 15px; - } - .bodywebsite .section-lg-bottom-30 { - padding-bottom: 30px; - } - .bodywebsite .section-lg-bottom-35 { - padding-bottom: 35px; - } - .bodywebsite .section-lg-bottom-40 { - padding-bottom: 40px; - } - .bodywebsite .section-lg-bottom-45 { - padding-bottom: 45px; - } - .bodywebsite .section-lg-bottom-50 { - padding-bottom: 50px; - } - .bodywebsite .section-lg-bottom-60 { - padding-bottom: 60px; - } - .bodywebsite .section-lg-bottom-66 { - padding-bottom: 66px; - } - .bodywebsite .section-lg-bottom-75 { - padding-bottom: 75px; - } - .bodywebsite .section-lg-bottom-90 { - padding-bottom: 90px; - } - .bodywebsite .section-lg-bottom-100 { - padding-bottom: 100px; - } - .bodywebsite .section-lg-bottom-120 { - padding-bottom: 120px; - } - .bodywebsite .section-lg-bottom-130 { - padding-bottom: 130px; - } - .bodywebsite .section-lg-bottom-145 { - padding-bottom: 145px; - } - .bodywebsite .section-lg-bottom-165 { - padding-bottom: 165px; - } -} -@media (min-width: 1200px) { - .bodywebsite .section-xl-bottom-15 { - padding-bottom: 15px; - } - .bodywebsite .section-xl-bottom-30 { - padding-bottom: 30px; - } - .bodywebsite .section-xl-bottom-35 { - padding-bottom: 35px; - } - .bodywebsite .section-xl-bottom-40 { - padding-bottom: 40px; - } - .bodywebsite .section-xl-bottom-45 { - padding-bottom: 45px; - } - .bodywebsite .section-xl-bottom-50 { - padding-bottom: 50px; - } - .bodywebsite .section-xl-bottom-60 { - padding-bottom: 60px; - } - .bodywebsite .section-xl-bottom-66 { - padding-bottom: 66px; - } - .bodywebsite .section-xl-bottom-75 { - padding-bottom: 75px; - } - .bodywebsite .section-xl-bottom-90 { - padding-bottom: 90px; - } - .bodywebsite .section-xl-bottom-100 { - padding-bottom: 100px; - } - .bodywebsite .section-xl-bottom-120 { - padding-bottom: 120px; - } - .bodywebsite .section-xl-bottom-130 { - padding-bottom: 130px; - } - .bodywebsite .section-xl-bottom-145 { - padding-bottom: 145px; - } - .bodywebsite .section-xl-bottom-165 { - padding-bottom: 165px; - } -} -@media (min-width: 1800px) { - .bodywebsite .section-xxl-bottom-15 { - padding-bottom: 15px; - } - .bodywebsite .section-xxl-bottom-30 { - padding-bottom: 30px; - } - .bodywebsite .section-xxl-bottom-35 { - padding-bottom: 35px; - } - .bodywebsite .section-xxl-bottom-40 { - padding-bottom: 40px; - } - .bodywebsite .section-xxl-bottom-45 { - padding-bottom: 45px; - } - .bodywebsite .section-xxl-bottom-50 { - padding-bottom: 50px; - } - .bodywebsite .section-xxl-bottom-60 { - padding-bottom: 60px; - } - .bodywebsite .section-xxl-bottom-66 { - padding-bottom: 66px; - } - .bodywebsite .section-xxl-bottom-75 { - padding-bottom: 75px; - } - .bodywebsite .section-xxl-bottom-90 { - padding-bottom: 90px; - } - .bodywebsite .section-xxl-bottom-100 { - padding-bottom: 100px; - } - .bodywebsite .section-xxl-bottom-120 { - padding-bottom: 120px; - } - .bodywebsite .section-xxl-bottom-130 { - padding-bottom: 130px; - } - .bodywebsite .section-xxl-bottom-145 { - padding-bottom: 145px; - } - .bodywebsite .section-xxl-bottom-165 { - padding-bottom: 165px; - } -} -html .bodywebsite .group { - -webkit-transform: translateY(-15px); - transform: translateY(-15px); - margin-bottom: -15px; - margin-left: -15px; -} -html .bodywebsite .group > *, -html .bodywebsite .group > *:first-child { - display: inline-block; - margin-top: 15px; - margin-left: 15px; -} -html .bodywebsite .group-xs { - -webkit-transform: translateY(-5px); - transform: translateY(-5px); - margin-bottom: -5px; - margin-left: -5px; -} -html .bodywebsite .group-xs > *, -html .bodywebsite .group-xs > *:first-child { - display: inline-block; - margin-top: 5px; - margin-left: 5px; -} -html .bodywebsite .group-sm { - -webkit-transform: translateY(-10px); - transform: translateY(-10px); - margin-bottom: -10px; - margin-left: -10px; -} -html .bodywebsite .group-sm > *, -html .bodywebsite .group-sm > *:first-child { - display: inline-block; - margin-top: 10px; - margin-left: 10px; -} -html .bodywebsite .group-md { - -webkit-transform: translateY(-15px); - transform: translateY(-15px); - margin-bottom: -15px; - margin-left: -15px; -} -html .bodywebsite .group-md > *, -html .bodywebsite .group-md > *:first-child { - display: inline-block; - margin-top: 15px; - margin-left: 15px; -} -html .bodywebsite .group-lg { - -webkit-transform: translateY(-20px); - transform: translateY(-20px); - margin-bottom: -20px; - margin-left: -20px; -} -html .bodywebsite .group-lg > *, -html .bodywebsite .group-lg > *:first-child { - display: inline-block; - margin-top: 20px; - margin-left: 20px; -} -html .bodywebsite .group-xl { - -webkit-transform: translateY(-30px); - transform: translateY(-30px); - margin-bottom: -30px; - margin-left: -30px; -} -html .bodywebsite .group-xl > *, -html .bodywebsite .group-xl > *:first-child { - display: inline-block; - margin-top: 30px; - margin-left: 30px; -} -html .bodywebsite .group-top > *, -html .bodywebsite .group-top > *:first-child { - vertical-align: top; -} -html .bodywebsite .group-middle > *, -html .bodywebsite .group-middle > *:first-child { - vertical-align: middle; -} -html .bodywebsite .group-bottom > *, -html .bodywebsite .group-bottom > *:first-child { - vertical-align: bottom; -} -html .bodywebsite .group-inline > * { - display: inline; -} -html .bodywebsite .group-inline > *:not(:last-child) { - margin-right: .25em; -} -html .bodywebsite .group-xl-responsive { - -webkit-transform: translateY(-18px); - transform: translateY(-18px); - margin-bottom: -18px; - margin-left: -18px; -} -html .bodywebsite .group-xl-responsive > *, -html .bodywebsite .group-xl-responsive > *:first-child { - display: inline-block; - margin-top: 18px; - margin-left: 18px; -} -@media (min-width: 768px) { - html .bodywebsite .group-xl-responsive { - -webkit-transform: translateY(-30px); - transform: translateY(-30px); - margin-bottom: -30px; - margin-left: -30px; - } - html .bodywebsite .group-xl-responsive > *, - html .bodywebsite .group-xl-responsive > *:first-child { - display: inline-block; - margin-top: 30px; - margin-left: 30px; - } -} -.bodywebsite .group-flex-center { - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} -.bodywebsite .relative { - position: relative; -} -.bodywebsite .static { - position: static; -} -.bodywebsite .block-top-level { - position: relative; - z-index: 3; -} -.bodywebsite .height-fill { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.bodywebsite .height-fill > * { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.bodywebsite .centered { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} -.bodywebsite .align-bottom { - -webkit-align-self: flex-end; - -ms-flex-item-align: end; - align-self: flex-end; -} -.bodywebsite .block-centered { - margin-left: auto; - margin-right: auto; -} -@media (max-width: 767px) { - .bodywebsite .responsive-centered { - margin-left: auto; - margin-right: auto; - } -} -.bodywebsite .overflow-hidden { - overflow: hidden; -} -.bodywebsite .page .white-space-normal { - white-space: normal; -} -.bodywebsite * + h1, -.bodywebsite * + .h1 { - margin-top: 20px; -} -@media (min-width: 768px) { - .bodywebsite * + h1, - .bodywebsite * + .h1 { - margin-top: 27px; - } -} -@media (min-width: 992px) { - .bodywebsite * + h1, - .bodywebsite * + .h1 { - margin-top: 34px; - } -} -.bodywebsite * + h2, -.bodywebsite * + .h2 { - margin-top: 25px; -} -.bodywebsite * + h3, -.bodywebsite * + .h3 { - margin-top: 17px; -} -.bodywebsite * + h4, -.bodywebsite * + .h4 { - margin-top: 15px; -} -.bodywebsite h1 + *, -.bodywebsite .h1 + * { - margin-top: 25px; -} -.bodywebsite h2 + *, -.bodywebsite .h2 + * { - margin-top: 18px; -} -.bodywebsite h3 + *, -.bodywebsite .h3 + * { - margin-top: 19px; -} -.bodywebsite h4 + *, -.bodywebsite .h4 + * { - margin-top: 18px; -} -.bodywebsite * + p, -.bodywebsite * + p { - margin-top: 14px; -} -.bodywebsite * + .text-big { - margin-top: 20px; -} -.bodywebsite hr + * { - margin-top: 18px; -} -@media (min-width: 1200px) { - .bodywebsite hr + * { - margin-top: 26px; - } -} -.bodywebsite * + .big { - margin-top: 6px; -} -.bodywebsite * + .text-large { - margin-top: 10px; -} -.bodywebsite * + .text-bigger { - margin-top: 28px; -} -.bodywebsite * + .btn { - margin-top: 30px; -} -@media (min-width: 1200px) { - .bodywebsite * + .btn { - margin-top: 44px; - } -} -.bodywebsite * + .link { - margin-top: 18px; -} -.bodywebsite * + .contact-info { - margin-top: 16px; -} -.bodywebsite * + .list-inline { - margin-top: 32px; -} -.bodywebsite * + .list-terms { - margin-top: 42px; -} -@media (min-width: 1200px) { - .bodywebsite * + .list-terms { - margin-top: 62px; - } -} -.bodywebsite * + .list-marked, -.bodywebsite * + .list-ordered { - margin-top: 22px; -} -.bodywebsite * + .link-wrap { - margin-top: 8px; -} -.bodywebsite * + .link-iconed { - margin-top: 2px; -} -.bodywebsite .contact-info { - vertical-align: baseline; -} -.bodywebsite .contact-info a { - display: inline-block; -} -.bodywebsite .contact-info dl dt, -.bodywebsite .contact-info dl dd { - display: inline-block; -} -.bodywebsite .contact-info dl dt:after { - content: ':'; - display: inline-block; - text-align: center; -} -.bodywebsite .contact-info .dl-inline dt { - padding-right: 0; -} -.bodywebsite .grid-system p { - color: #00030a; -} -@media (max-width: 1199px) { - .bodywebsite .grid-system p { - width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } -} -.bodywebsite .object-inline, -.bodywebsite .object-inline-baseline { - white-space: nowrap; -} -.bodywebsite .object-inline > * + *, -.bodywebsite .object-inline-baseline > * + * { - margin-top: 0; - margin-left: 5px; -} -.bodywebsite .object-inline { - vertical-align: middle; -} -.bodywebsite .object-inline > * { - display: inline-block; - vertical-align: middle; -} -.bodywebsite .object-inline-baseline { - vertical-align: baseline; -} -.bodywebsite .object-inline-baseline > * { - display: inline-block; - vertical-align: baseline; -} -.bodywebsite .row-no-gutter { - margin-left: 0; - margin-right: 0; -} -.bodywebsite .row-no-gutter [class*='col'] { - padding: 0; -} -.bodywebsite .text-width-1 { - max-width: 400px; -} -@media (min-width: 992px) { - .bodywebsite .text-width-1 { - max-width: 310px; - } -} -.bodywebsite .min-width-1 { - min-width: 100%; -} -@media (min-width: 576px) { - .bodywebsite .min-width-1 { - min-width: 270px; - } -} -.bodywebsite .img-shadow { - box-shadow: -3px 2px 4px 0px rgba(0, 0, 0, 0.58); -} -@media (min-width: 768px) { - .bodywebsite .img-shadow { - box-shadow: -5px 4px 8px 0px rgba(0, 0, 0, 0.58); - } -} -.bodywebsite .box { - box-shadow: 0 5px 23px 0 rgba(0, 0, 0, 0.3); - padding: 50px 30px; - margin-top: 10px; - margin-bottom: 10px; -} -@media (min-width: 992px) { - .bodywebsite .box { - padding: 55px 30px 65px 44px; - } -} -@media (min-width: 1200px) { - .bodywebsite .box { - padding: 54px 40px 85px 54px; - } -} -.bodywebsite .box-xs { - padding: 38px 20px; -} -.bodywebsite .page .box-list-xs { - box-shadow: 0 5px 13px 0 rgba(0, 0, 0, 0.2); -} -.bodywebsite .page .box-list-xs .box-xs + .box-xs { - border-top: 1px solid #1c2e3f; -} -@media (min-width: 768px) { - .bodywebsite .page .box-list-xs { - max-width: 170px; - } -} -.bodywebsite .group-item { - width: 100%; - max-width: 220px; - margin-left: auto; - margin-right: auto; -} -@media (min-width: 576px) { - .bodywebsite .group-item { - max-width: 300px; - } -} -@media (min-width: 768px) { - .bodywebsite .group-item { - min-width: 40%; - max-width: 0; - } -} -@media (min-width: 1200px) { - .bodywebsite .group-item { - min-width: 272px; - } - .bodywebsite .group-item-sm { - min-width: 195px; - } -} -@media (min-width: 1200px) { - .bodywebsite .border-modern { - position: relative; - } - .bodywebsite .border-modern .border-modern-item-1, - .bodywebsite .border-modern .border-modern-item-2, - .bodywebsite .border-modern .border-modern-item-3, - .bodywebsite .border-modern .border-modern-item-4 { - position: absolute; - width: 45px; - height: 45px; - border-left: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-top: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - } - .bodywebsite .border-modern .border-modern-item-1, - .bodywebsite .border-modern .border-modern-item-2 { - top: -27px; - } - .bodywebsite .border-modern .border-modern-item-3, - .bodywebsite .border-modern .border-modern-item-4 { - bottom: -68px; - } - .bodywebsite .border-modern .border-modern-item-1, - .bodywebsite .border-modern .border-modern-item-3 { - left: 0px; - } - .bodywebsite .border-modern .border-modern-item-2, - .bodywebsite .border-modern .border-modern-item-4 { - right: 0px; - } - .bodywebsite .border-modern .border-modern-item-2 { - transform: rotate(90deg); - } - .bodywebsite .border-modern .border-modern-item-3 { - transform: rotate(-90deg); - } - .bodywebsite .border-modern .border-modern-item-4 { - transform: rotate(180deg); - } -} -.bodywebsite .pagination-custom { - display: inline-block; - position: relative; - transform: translateY(-4px); - margin-bottom: -4px; -} -.bodywebsite .pagination-custom > * { - margin-top: 4px; -} -.bodywebsite .pagination-custom > *:not(:last-child) { - margin-right: 4px; -} -.bodywebsite .pagination-custom .page-item { - display: inline-block; - line-height: 1; -} -.bodywebsite .pagination-custom .page-item:first-child .page-link, -.bodywebsite .pagination-custom .page-item:last-child .page-link { - padding-left: 25px; - padding-right: 25px; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .pagination-custom .page-item .page-link { - display: block; - width: auto; - min-width: 52px; - height: 52px; - padding: 10px 20px; - border: 2px solid; - border-radius: 0; - font: 700 14px/14px "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - vertical-align: middle; -} -.bodywebsite .pagination-custom .page-item .page-link:after { - content: ''; - height: 108%; - width: 0; - display: inline-block; - vertical-align: middle; -} -.bodywebsite .pagination-custom .page-item .page-link, -.bodywebsite .pagination-custom .page-item .page-link:active, -.bodywebsite .pagination-custom .page-item .page-link:focus { - color: #000; - background: transparent; - border-color: #cdcdcd; -} -.bodywebsite .pagination-custom .page-item .page-link:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .pagination-custom .page-item.disabled, -.bodywebsite .pagination-custom .page-item.active { - pointer-events: none; -} -.bodywebsite .pagination-custom .page-item.active .page-link { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .pagination-custom .page-item.disabled .page-link { - color: #f9f9f9; - background: #cdcdcd; - border-color: #cdcdcd; -} -.bodywebsite .label-custom { - padding: .35em .3em .25em; - font-weight: 400; - font-size: 70%; - text-transform: uppercase; -} -.bodywebsite .mac .label-custom { - padding-top: .4em; -} -.bodywebsite .label-custom.label-danger { - color: #fff; - background: #fe4a21; - box-shadow: inset 0 8px 12px rgba(0, 0, 0, 0.25); -} -.bodywebsite .label-custom.label-info { - color: #fff; - background: #3e9cf6; - box-shadow: inset 0 8px 12px rgba(0, 0, 0, 0.25); -} -.bodywebsite blockquote { - font: inherit; - padding: 0; - margin: 0; - border: 0; -} -.bodywebsite blockquote q:before, -.bodywebsite blockquote q:after { - content: none; -} -.bodywebsite blockquote cite { - font-style: normal; -} -.bodywebsite .quote-default { - position: relative; - padding: 43px 0 43px 6px; - color: #00030a; -} -.bodywebsite .quote-default svg { - fill: #ddd; -} -.bodywebsite .quote-default .quote-open, -.bodywebsite .quote-default .quote-close { - position: absolute; - left: 30px; -} -.bodywebsite .quote-default .quote-open { - top: 0; -} -.bodywebsite .quote-default .quote-close { - bottom: 0; -} -.bodywebsite .quote-bordered { - padding-top: 14px; -} -.bodywebsite .quote-bordered .quote-body { - position: relative; - padding-bottom: 10px; -} -.bodywebsite .quote-bordered h6 { - font-size: 18px; -} -.bodywebsite .quote-bordered .quote-body-inner { - position: relative; - padding: 37px 22px 29px 34px; - border-style: solid; - border-width: 1px 1px 0 1px; - border-color: #e5e7e9; -} -.bodywebsite .quote-bordered .quote-body-inner:before, -.bodywebsite .quote-bordered .quote-body-inner:after { - content: ''; - position: absolute; - bottom: -10px; - height: 10px; - border-style: solid; - border-color: #e5e7e9; - background-color: transparent; -} -.bodywebsite .quote-bordered .quote-body-inner:before { - left: 10px; - width: 46px; - border-width: 1px 1px 0 0; - transform: skew(45deg); - transform-origin: 100% 100%; -} -.bodywebsite .quote-bordered .quote-body-inner:after { - right: 10px; - width: calc(34%); - border-width: 1px 0 0 1px; - transform: skew(-45deg); - transform-origin: 0 100%; -} -.bodywebsite .quote-bordered .quote-open { - position: absolute; - top: -10px; - left: 34px; - z-index: 2; -} -.bodywebsite .quote-bordered .quote-open > svg { - fill: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .quote-bordered .quote-footer { - padding-left: 25px; -} -.bodywebsite .quote-bordered cite { - font-size: 17px; - font-weight: 900; - line-height: 21px; - color: #fff; -} -.bodywebsite .quote-bordered * + .quote-footer { - margin-top: 9px; -} -.bodywebsite .quote-bordered cite + p { - margin-top: 0; -} -.bodywebsite .quote-bordered-inverse cite, -.bodywebsite .quote-bordered-inverse q { - color: #000; -} -.bodywebsite .quote-minimal-bordered { - position: relative; - padding: 16px 0 26px; - text-align: center; -} -.bodywebsite .quote-minimal-bordered q { - font: 400 20px "Roboto", Helvetica, Arial, sans-serif; - font-style: italic; - color: #464a4d; -} -.bodywebsite .quote-minimal-bordered q:before, -.bodywebsite .quote-minimal-bordered q:after { - content: '"'; -} -.bodywebsite .quote-minimal-bordered:before, -.bodywebsite .quote-minimal-bordered:after { - content: ''; - position: absolute; - left: 50%; - width: 270px; - height: 1px; - transform: translateX(-50%); - background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, #dedede 50%, rgba(0, 0, 0, 0) 100%); - background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, #dedede 50%, rgba(0, 0, 0, 0) 100%); - background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, #dedede 50%, rgba(0, 0, 0, 0) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffffff', endColorstr='#00000000', GradientType=1); -} -.bodywebsite .quote-minimal-bordered:before { - top: 0; -} -.bodywebsite .quote-minimal-bordered:after { - bottom: 0; -} -@media (min-width: 768px) { - .bodywebsite .quote-minimal-bordered q { - font-size: 24px; - line-height: 1.55; - } -} -@media (min-width: 1200px) { - .bodywebsite .quote-minimal-bordered q { - font-size: 30px; - } -} -.bodywebsite .quote-minimal q { - font-size: 18px; - font-weight: 300; - font-style: italic; - line-height: 1.2; - color: #000; -} -.bodywebsite .quote-minimal cite { - font: 700 15px "Roboto", Helvetica, Arial, sans-serif; - line-height: 1.1; - color: #000; -} -.bodywebsite .quote-minimal .caption { - color: #9f9f9f; -} -.bodywebsite .quote-minimal.quote-minimal-inverse q { - color: #fff; -} -.bodywebsite .quote-minimal.quote-minimal-inverse cite { - color: #fff; -} -.bodywebsite .quote-minimal.quote-minimal-inverse .caption { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .quote-minimal * + .caption { - margin-top: 0; -} -.bodywebsite .quote-minimal * + .quote-meta { - margin-top: 20px; -} -.bodywebsite .quote-strict q, -.bodywebsite .quote-strict cite { - color: #000; -} -.bodywebsite .quote-strict q { - font-size: 19px; - font-weight: 300; - font-style: italic; - line-height: 28px; -} -.bodywebsite .quote-strict cite { - display: block; - font: 700 16px/21px "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; -} -.bodywebsite .quote-strict * + cite { - margin-top: 20px; -} -.bodywebsite .quote-strict.quote-strict-inverse q, -.bodywebsite .quote-strict.quote-strict-inverse cite { - color: #fff; -} -.bodywebsite .quote-vertical { - max-width: 360px; - margin-left: auto; - margin-right: auto; - text-align: center; -} -.bodywebsite .quote-vertical q { - font-size: 16px; - line-height: 1.57895; - font-weight: 100; - color: rgba(0, 0, 0, 0.5); -} -.bodywebsite .quote-vertical cite { - display: block; - color: #000; - font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif; -} -.bodywebsite .quote-vertical .quote-open > svg { - fill: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .quote-vertical .quote-image, -.bodywebsite .quote-vertical .quote-image > img { - border-radius: 600px; -} -.bodywebsite .quote-vertical .quote-image > img { - width: auto; -} -.bodywebsite .quote-vertical * + cite { - margin-top: 16px; -} -.bodywebsite .quote-vertical * + .caption { - margin-top: 0; -} -.bodywebsite .quote-vertical * + .quote-text { - margin-top: 25px; -} -.bodywebsite .quote-vertical * + .quote-meta { - margin-top: 25px; -} -.bodywebsite .quote-vertical.quote-vertical-inverse q, -.bodywebsite .quote-vertical.quote-vertical-inverse cite { - color: #fff; -} -.bodywebsite .quote-vertical.quote-vertical-inverse .cite { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .quote-vertical.quote-vertical-inverse .quote-open > svg { - fill: #fff; -} -.bodywebsite .quote-review cite { - font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: -0.025em; - color: #000; -} -.bodywebsite .quote-review .quote-header { - position: relative; - transform: translateY(-2px); - margin-bottom: -2px; -} -.bodywebsite .quote-review .quote-header > * { - margin-top: 2px; -} -.bodywebsite .quote-review .quote-header > *:not(:last-child) { - margin-right: 10px; -} -.bodywebsite .quote-review .quote-header > * { - display: inline-block; - vertical-align: middle; -} -.bodywebsite .quote-review * + .quote-body { - margin-top: 10px; -} -.bodywebsite * + .quote-review { - margin-top: 35px; -} -@media (min-width: 768px) { - .bodywebsite .quote-minimal q { - font-size: 22px; - } - .bodywebsite .quote-minimal cite { - font-size: 19px; - } - .bodywebsite .quote-minimal * + .quote-meta { - margin-top: 37px; - } - .bodywebsite * + .quote-review { - margin-top: 45px; - } -} -@media (min-width: 992px) { - .bodywebsite .quote-minimal q { - font-size: 24px; - } - .bodywebsite .quote-vertical q { - font-size: 19px; - } -} -.bodywebsite .quote-left .divider-fullwidth { - margin-top: 20px; - background: #bcd; -} -.bodywebsite .quote-left .quote-name { - font-size: 18px; - font-weight: 500; - color: #fff; -} -@media (min-width: 992px) { - .bodywebsite .quote-left .quote-name { - font-size: 24px; - } -} -.bodywebsite .quote-left .quote-desc-text { - font-size: 26px; - line-height: 1; - font-style: italic; - font-weight: 700; -} -@media (min-width: 992px) { - .bodywebsite .quote-left .quote-desc-text { - font-size: 36px; - } -} -.bodywebsite .quote-left .quote-body { - margin-top: 27px; - padding-left: 75px; - position: relative; - text-align: left; -} -.bodywebsite .quote-left .quote-body:before { - content: ''; - position: absolute; - top: 6px; - left: 0; - width: 50px; - height: 36px; - background: url("medias/image/ref; ?>/icon-quote.png") no-repeat top left; - opacity: .5; -} -.bodywebsite .quote-left .quote-body q { - color: #fff; -} -.bodywebsite .quote-left .h4 + *, -.bodywebsite .quote-left h5 + * { - margin-top: 0; -} -.bodywebsite .page .box-text > * { - display: inline; - margin: 0 .25em 0 0; -} -.bodywebsite .icon-box-horizontal .unit-left { - min-width: 48px; -} -.bodywebsite .icon-box-horizontal [class*='icon-md'] { - margin-top: -2px; -} -.bodywebsite .icon-box-horizontal [class*='icon-lg'] { - margin-top: -5px; -} -.bodywebsite .icon-box-horizontal * + p { - margin-top: 9px; -} -.bodywebsite .icon-box-vertical * + p { - margin-top: 9px; -} -.bodywebsite .icon-box-vertical-sm { - max-width: 370px; -} -@media (max-width: 767px) { - .bodywebsite .icon-box-vertical-sm { - margin-left: auto; - margin-right: auto; - } -} -.bodywebsite .icon-box { - position: relative; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - width: 100%; - padding: 35px 30px; - text-align: center; - cursor: default; -} -@media (min-width: 768px) { - .bodywebsite .icon-box:before, - .bodywebsite .icon-box:after { - content: ''; - position: absolute; - width: 100%; - height: 100%; - border: 1px solid #e5e7e9; - pointer-events: none; - transition: .33s all ease; - } - .bodywebsite .icon-box.icon-box-top-line:before { - border-width: 1px 0 0 0; - } - .bodywebsite .icon-box:before { - top: 0; - left: 0; - border-width: 0 0 0 0; - } - .bodywebsite .icon-box:after { - bottom: 0; - right: 0; - border-width: 0 1px 1px 0; - } -} -.bodywebsite .icon-box .icon:after { - opacity: 0; -} -.bodywebsite .icon-box .btn:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .icon-box .box-top, -.bodywebsite .icon-box .box-body { - position: relative; - will-change: transform; - transition: .33s all ease; - -webkit-filter: blur(0); -} -.bodywebsite .icon-box .box-top { - top: 0; -} -.bodywebsite .icon-box .box-body { - max-width: 100%; -} -.bodywebsite .icon-box .box-header { - bottom: 0; -} -.bodywebsite .icon-box .box-icon { - min-height: 46px; - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} -.bodywebsite .icon-box * + .box-header { - margin-top: 10px; -} -.bodywebsite .icon-box * + .box-body { - margin-top: 22px; -} -.bodywebsite .icon-box .box-body + .btn { - margin-top: 18px; -} -.bodywebsite .icon-box.hover .box-top, -.bodywebsite .icon-box:hover .box-top { - -webkit-transform: translateY(-7px); - transform: translateY(-7px); -} -.bodywebsite .icon-box.hover .btn, -.bodywebsite .icon-box.hover .box-body, -.bodywebsite .icon-box:hover .btn, -.bodywebsite .icon-box:hover .box-body { - -webkit-transform: translateY(7px); - transform: translateY(7px); -} -@media (min-width: 992px) { - .bodywebsite .desktop .icon-box .icon-box-overlay { - position: absolute; - top: 0; - bottom: 0; - right: 0; - left: 0; - opacity: 0; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - transition: 0.2s ease-in-out; - } - .bodywebsite .desktop .icon-box:hover .icon-box-overlay { - opacity: 1; - z-index: 5; - -webkit-transform: scale(1.05); - transform: scale(1.05); - } - .bodywebsite .desktop .icon-box:hover .btn { - z-index: 6; - } - .bodywebsite .desktop .icon-box:hover .box-body, - .bodywebsite .desktop .icon-box:hover .box-top { - z-index: 6; - } -} -@media (min-width: 768px) { - .bodywebsite .icon-box { - padding: 67px 37px 61px; - margin-left: auto; - margin-right: auto; - } -} -@media (min-width: 1400px) { - .bodywebsite .icon-box { - padding: 67px 110px 61px; - } -} -@media (min-width: 1800px) { - .bodywebsite .icon-box { - padding: 90px 165px 82px; - } -} -.bodywebsite .list-blocks { - counter-reset: li; -} -.bodywebsite .list-blocks > li { - display: block; -} -.bodywebsite .list-blocks .block-list-counter:before { - position: relative; - content: counter(li, decimal-leading-zero); - counter-increment: li; - font: 700 30px/30px "Roboto", Helvetica, Arial, sans-serif; - letter-spacing: -0.025em; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-blocks > li + li { - margin-top: 50px; -} -.bodywebsite .block-image-plate { - display: block; - width: 100%; -} -.bodywebsite .block-image-plate .block-header { - max-width: 400px; -} -.bodywebsite .block-image-plate .block-inner { - position: relative; - padding: 45px 30px; -} -.bodywebsite .block-image-plate .block-inner:after { - content: ''; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 0; - background: rgba(0, 0, 0, 0.7); -} -.bodywebsite .block-image-plate .block-inner > * { - position: relative; - z-index: 2; -} -.bodywebsite .block-image-plate * + .block-text { - margin-top: 18px; -} -.bodywebsite .block-image-plate * + .block-body { - margin-top: 22px; -} -@media (max-width: 767px) { - .bodywebsite .block-image-plate { - margin-left: -16px; - margin-right: -15px; - width: calc(132%); - } -} -@media (min-width: 768px) { - .bodywebsite .block-image-plate .block-header { - max-width: 340px; - } - .bodywebsite .block-image-plate .block-header h3 { - line-height: 1.2; - } - .bodywebsite .block-image-plate .block-inner { - padding: 60px 12.5% 60px 8.33333%; - } - .bodywebsite .block-image-plate .block-body { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: flex-start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - } - .bodywebsite .block-image-plate .block-left { - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-flex-basis: 11.11111%; - -ms-flex-preferred-size: 11.11111%; - flex-basis: 11.11111%; - max-width: 11.11111%; - max-width: 100px; - } - .bodywebsite .block-image-plate .block-body { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - } - .bodywebsite .block-image-plate * + .block-text { - margin-top: 0; - } -} -@media (min-width: 992px) { - .bodywebsite .block-image-plate .block-header { - max-width: 410px; - } - .bodywebsite .block-image-plate .block-inner { - padding-right: 16%; - padding-top: 90px; - padding-bottom: 95px; - } -} -.bodywebsite .block-vacation { - position: relative; - width: 100%; - padding: 39px 9% 45px; - border-radius: 4px; - background: #fff; - box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12); -} -.bodywebsite .block-vacation, -.bodywebsite .block-vacation:active, -.bodywebsite .block-vacation:focus, -.bodywebsite .block-vacation:hover { - color: #9f9f9f; -} -.bodywebsite .block-vacation:hover { - box-shadow: -3px 5px 12px 0px rgba(65, 65, 65, 0.16); -} -.bodywebsite .block-vacation * + .block-meta { - margin-top: 14px; -} -@media (min-width: 1200px) { - .bodywebsite .block-vacation * + .block-meta { - margin-top: 5px; - } -} -.bodywebsite .block-shadow { - position: relative; - width: 100%; - padding-top: 30px; - overflow: hidden; - border-radius: 0; - background: #fff; - box-shadow: 0px 1px 10px 0px rgba(65, 65, 65, 0.12); - text-align: center; -} -.bodywebsite .block-shadow .block-inner { - padding: 0 40px; -} -.bodywebsite .block-shadow * + .block-footer { - margin-top: 32px; -} -.bodywebsite .block-shadow * + .icon-block { - margin-top: 40px; -} -@media (min-width: 768px) { - .bodywebsite .block-shadow { - padding-top: 38px; - } - .bodywebsite .block-shadow .block-inner { - padding: 0 70px; - } - .bodywebsite .block-shadow * + .icon-block { - margin-top: 60px; - } -} -.bodywebsite .box-counter { - text-align: center; -} -.bodywebsite .box-counter .box-header { - text-transform: uppercase; -} -.bodywebsite .box-counter * + .box-header { - margin-top: 10px; -} -@media (min-width: 768px) and (max-width: 1199px) { - .bodywebsite .box-counter .box-header { - font-size: 15px; - } -} -.bodywebsite .box-counter-inverse .box-header { - color: rgba(255, 255, 255, 0.2); -} -.bodywebsite .box-counter-inverse .counter { - color: #dedede; -} -.bodywebsite .box-counter-inverse-lighter .box-header { - color: rgba(255, 255, 255, 0.35); -} -.bodywebsite .box-counter-inverse-lighter .counter { - color: #dedede; -} -.bodywebsite .box-container-small { - display: inline-block; - width: 100%; - max-width: 280px; -} -.bodywebsite .post-single .post-footer { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - position: relative; - transform: translateY(-10px); - margin-bottom: -10px; -} -.bodywebsite .post-single .post-footer > * { - margin-top: 10px; -} -.bodywebsite .post-single .post-footer > *:not(:last-child) { - margin-right: 20px; -} -.bodywebsite .post-single * + .post-header { - margin-top: 15px; -} -.bodywebsite .post-single * + .post-meta { - margin-top: 20px; -} -.bodywebsite .post-single * + .post-body { - margin-top: 20px; -} -.bodywebsite .post-single * + .post-footer { - margin-top: 42px; -} -.bodywebsite .post-single + * { - margin-top: 40px; -} -@media (min-width: 768px) { - .bodywebsite .post-single * + .post-header { - margin-top: 22px; - } - .bodywebsite .post-single * + .post-meta { - margin-top: 10px; - } -} -.bodywebsite .post-info * + .post-main { - margin-top: 30px; -} -.bodywebsite .post-info * + .post-body { - margin-top: 20px; -} -@media (min-width: 768px) { - .bodywebsite .post-info .post-main { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .bodywebsite .post-info .post-left { - -webkit-flex-basis: 33.33333%; - -ms-flex-preferred-size: 33.33333%; - flex-basis: 33.33333%; - max-width: 33.33333%; - padding-right: 25px; - } - .bodywebsite .post-info .post-body { - -webkit-flex-basis: 66.66667%; - -ms-flex-preferred-size: 66.66667%; - flex-basis: 66.66667%; - max-width: 66.66667%; - } - .bodywebsite .post-info * + .post-body { - margin-top: 0; - } -} -.bodywebsite .post-minimal { - position: relative; - border-radius: 4px; - overflow: hidden; - background: #fff; - box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12); -} -.bodywebsite .post-minimal .post-body { - padding: 20px; -} -.bodywebsite .post-minimal * + p { - margin-top: 8px; -} -.bodywebsite .post-minimal * + .post-meta { - margin-top: 5px; -} -@media (max-width: 575px) { - .bodywebsite .post-minimal { - display: inline-block; - width: 100%; - max-width: 300px; - } -} -@media (min-width: 576px) { - .bodywebsite .post-minimal { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - } - .bodywebsite .post-minimal .post-left { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-align-self: stretch; - -ms-flex-item-align: stretch; - align-self: stretch; - width: 220px; - } - .bodywebsite .post-minimal .post-image { - position: relative; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-align-self: stretch; - -ms-flex-item-align: stretch; - align-self: stretch; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - overflow: hidden; - } - .bodywebsite .post-minimal .post-image img { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - height: auto; - width: auto; - min-height: 100%; - min-width: 100%; - z-index: 1; - } - .bodywebsite .post-minimal .post-body { - padding: 30px 24px 30px 27px; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - } -} -@media (min-width: 1200px) { - .bodywebsite .post-minimal .post-body { - padding: 40px 26px 40px 50px; - } -} -.bodywebsite .post-preview { - max-width: 320px; -} -.bodywebsite .post-preview a { - display: block; -} -.bodywebsite .post-preview .post-image, -.bodywebsite .post-preview .post-image img { - border-radius: 5px; -} -.bodywebsite .post-preview .post-image img { - width: auto; -} -.bodywebsite .post-preview .post-header { - line-height: 1.5; - color: #000; - transition: .33s all ease; -} -.bodywebsite .post-preview .list-meta > li { - display: inline-block; - font-size: 12px; - font-style: italic; - color: #9b9b9b; -} -.bodywebsite .post-preview .list-meta > li:not(:last-child):after { - content: '/'; -} -.bodywebsite .post-preview:hover .post-header { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .post-preview * + .post-meta { - margin-top: 5px; -} -.bodywebsite .post-preview.post-preview-inverse > li { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .post-preview.post-preview-inverse .post-header { - color: #fff; -} -.bodywebsite .post-preview.post-preview-inverse:hover .post-header { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .blog-timeline > dt { - font: 700 25px "Roboto", Helvetica, Arial, sans-serif; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .blog-timeline > dd { - margin-top: 20px; -} -@media (min-width: 768px) { - .bodywebsite .blog-timeline { - word-spacing: 0; - white-space: nowrap; - } - .bodywebsite .blog-timeline > * { - display: inline-block; - } - .bodywebsite .blog-timeline > dt { - min-width: 65px; - padding-right: 20px; - margin-top: -0.15em; - vertical-align: top; - } - .bodywebsite .blog-timeline > dd { - margin-top: 0; - width: calc(0%); - } -} -@media (min-width: 992px) { - .bodywebsite .blog-timeline > dt { - min-width: 100px; - padding-right: 30px; - } -} -.bodywebsite .post-boxed { - max-width: 330px; - margin-right: auto; - margin-left: auto; - padding-top: 10px; - text-align: center; - box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12); - transition: .3s all ease; -} -.bodywebsite .post-boxed-caption { - height: 120px; -} -.bodywebsite .post-boxed-img-wrap a { - display: block; -} -.bodywebsite .post-boxed-title { - font: 500 18px/28px "Roboto", Helvetica, Arial, sans-serif; -} -.bodywebsite .post-boxed-title { - color: #000; -} -.bodywebsite .post-boxed-title a { - display: inline; - color: #000; -} -.bodywebsite .post-boxed-title a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .post-boxed img { - width: 30%; -} -.bodywebsite .post-boxed .list-inline { - font-size: 12px; - letter-spacing: .05em; -} -.bodywebsite .post-boxed-caption { - padding: 20px; -} -.bodywebsite .post-boxed .post-boxed-title + * { - margin-top: 5px; -} -@media (min-width: 768px) { - .bodywebsite .post-boxed .post-boxed-caption { - padding: 28px 42px 36px 28px; - } -} -@media (min-width: 1200px) { - .bodywebsite .post-boxed:hover { - box-shadow: -3px 5px 12px 0px rgba(65, 65, 65, 0.16); - } -} -.bodywebsite .post-minimal .post-image { - height: 100%; -} -.bodywebsite .post-minimal .post-image img { - width: 100%; - height: 100%; - object-fit: cover; -} -.bodywebsite * + .post-blockquote { - margin-top: 30px; -} -.bodywebsite .post-blockquote + * { - margin-top: 30px; -} -@media (min-width: 768px) { - .bodywebsite * + .post-blockquote { - margin-top: 50px; - } - .bodywebsite .post-blockquote + * { - margin-top: 50px; - } -} -.bodywebsite * + .post-comment-block, -.bodywebsite * + .post-comment-form { - margin-top: 40px; -} -.bodywebsite .post-comment-form h4 + * { - margin-top: 15px; -} -.bodywebsite .comment figure, -.bodywebsite .comment figure img { - border-radius: 50%; - max-width: 71px; -} -.bodywebsite .comment time { - font-size: 12px; - line-height: 1; - color: #9b9b9b; -} -.bodywebsite .comment .user { - font-size: 16px; - line-height: 1.33333; - font-weight: 700; - text-transform: uppercase; - color: #000; -} -.bodywebsite .comment .list-icon-meta { - position: relative; - transform: translateY(0); - margin-bottom: 0; -} -.bodywebsite .comment .list-icon-meta > * { - margin-top: 0; -} -.bodywebsite .comment .list-icon-meta > *:not(:last-child) { - margin-right: 8px; -} -.bodywebsite .comment .list-icon-meta > li { - display: inline-block; -} -.bodywebsite .comment .list-icon-meta li { - font-size: 12px; - line-height: 1; - font-weight: 400; -} -.bodywebsite .comment .comment-body { - padding: 17px 22px; - border: 1px solid #dedede; - border-radius: 7px; -} -.bodywebsite .comment .comment-body-header { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: flex-start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - position: relative; - transform: translateY(-5px); - margin-bottom: -5px; -} -.bodywebsite .comment .comment-body-header > * { - margin-top: 5px; -} -.bodywebsite .comment .comment-body-header > *:not(:last-child) { - margin-right: 5px; -} -@media (min-width: 768px) { - .bodywebsite .comment .comment-body-header { - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - } -} -.bodywebsite .comment .comment-body-header > * { - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.bodywebsite .comment .comment-meta { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - position: relative; - transform: translateY(-5px); - margin-bottom: -5px; -} -.bodywebsite .comment .comment-meta > * { - margin-top: 5px; -} -.bodywebsite .comment .comment-meta > *:not(:last-child) { - margin-right: 10px; -} -@media (min-width: 768px) { - .bodywebsite .comment .comment-meta > * { - display: inline-block; - vertical-align: baseline; - } -} -.bodywebsite .comment .comment-body-text { - margin-top: 10px; -} -.bodywebsite .comment-minimal .author { - font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif; - text-transform: uppercase; - letter-spacing: -0.025em; - color: #000; -} -.bodywebsite .comment-minimal * + .comment-body { - margin-top: 10px; -} -.bodywebsite * + .comment-minimal { - margin-top: 35px; -} -.bodywebsite .comment-group-reply { - padding-left: 12%; -} -.bodywebsite .comment + * { - margin-top: 21px; -} -.bodywebsite * + .comment-group { - margin-top: 30px; -} -@media (min-width: 768px) { - .bodywebsite .comment > .unit > .unit-left { - margin-top: 16px; - } - .bodywebsite * + .comment-minimal { - margin-top: 45px; - } -} -@media (min-width: 992px) { - .bodywebsite * + .post-comment { - margin-top: 80px; - } -} -.bodywebsite .page-title { - text-align: center; -} -.bodywebsite .page-title > * { - letter-spacing: 0; - text-transform: uppercase; -} -.bodywebsite .page-title .page-title-inner { - position: relative; - display: inline-block; -} -.bodywebsite .page-title .page-title-left, -.bodywebsite .page-title .page-title-right { - position: absolute; - top: 50%; - width: auto; - overflow: hidden; - white-space: nowrap; - vertical-align: middle; -} -.bodywebsite .page-title .page-title-left *, -.bodywebsite .page-title .page-title-right * { - display: inline; - white-space: nowrap; -} -.bodywebsite .page-title .page-title-left { - left: 0; - text-align: right; - transform: translate(-100%, -50%); -} -.bodywebsite .page-title .page-title-left * { - padding-right: .85em; -} -.bodywebsite .page-title .page-title-left *:nth-last-child(odd) { - color: rgba(255, 255, 255, 0.1); -} -.bodywebsite .page-title .page-title-left *:nth-last-child(even) { - color: rgba(255, 255, 255, 0.2); -} -.bodywebsite .page-title .page-title-right { - right: 0; - text-align: left; - transform: translate(100%, -50%); -} -.bodywebsite .page-title .page-title-right * { - padding-left: .85em; -} -.bodywebsite .page-title .page-title-right *:nth-child(odd) { - color: rgba(255, 255, 255, 0.1); -} -.bodywebsite .page-title .page-title-right *:nth-child(even) { - color: rgba(255, 255, 255, 0.2); -} -.bodywebsite .page-title-wrap { - background: #000; - background-attachment: fixed; - -webkit-background-size: cover; - background-size: cover; - background-position: center 80%; -} -@media (min-width: 768px) { - .bodywebsite .page-title { - text-align: left; - } -} -.bodywebsite .preloader { - position: fixed; - left: 0; - top: 0; - bottom: 0; - right: 0; - z-index: 10000; - display: flex; - justify-content: center; - align-items: center; - padding: 20px; - background: #fff; - transition: .3s all ease; -} -.bodywebsite .preloader.loaded { - opacity: 0; - visibility: hidden; -} -.bodywebsite .preloader-body { - text-align: center; -} -.bodywebsite .preloader-body p { - position: relative; - right: -8px; -} -.bodywebsite .cssload-container { - width: 100%; - height: 36px; - text-align: center; -} -.bodywebsite .cssload-speeding-wheel { - width: 36px; - height: 36px; - margin: 0 auto; - border: 3px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-radius: 50%; - border-left-color: transparent; - border-bottom-color: transparent; - animation: cssload-spin 0.88s infinite linear; -} -@-webkit-keyframes cssload-spin { - 100% { - transform: rotate(360deg); - } -} -@keyframes cssload-spin { - 100% { - transform: rotate(360deg); - } -} -.bodywebsite .pricing-table { - overflow: hidden; - background: #fff; - text-align: center; - box-shadow: -1px 2px 5px 0 rgba(65, 65, 65, 0.12); -} -.bodywebsite .pricing-table-header { - font-size: 18px; - text-transform: uppercase; - letter-spacing: .05em; - color: #464a4d; -} -.bodywebsite .pricing-table-body { - padding: 35px 30px; -} -.bodywebsite .pricing-table-label { - padding: 17px 15px; - text-align: center; - background: #3a3c3e; -} -.bodywebsite .pricing-table-label p { - font: 700 14px "Roboto", Helvetica, Arial, sans-serif; - letter-spacing: .05em; - text-transform: uppercase; - color: #fff; -} -.bodywebsite .pricing-table .pricing-list { - font-size: 16px; - font-weight: 300; - color: #00030a; -} -.bodywebsite .pricing-table .pricing-list span { - display: inline-block; - margin-right: .25em; -} -.bodywebsite .pricing-table .pricing-list > li + li { - margin-top: 12px; -} -.bodywebsite .pricing-table * + .price-object { - margin-top: 22px; -} -.bodywebsite .pricing-table * + .pricing-list { - margin-top: 22px; -} -.bodywebsite .pricing-object { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 900; - font-size: 0; - line-height: 0; - color: #000; -} -.bodywebsite .pricing-object > * { - margin-top: 0; -} -.bodywebsite .pricing-object .price { - font-family: Helvetica, Arial, sans-serif; - font-weight: 900; -} -.bodywebsite .pricing-object .small { - position: relative; - font: 700 10px "Roboto", Helvetica, Arial, sans-serif; - color: inherit; - text-transform: uppercase; -} -.bodywebsite .pricing-object .small-middle { - vertical-align: middle; -} -.bodywebsite .pricing-object .small-bottom { - vertical-align: bottom; -} -.bodywebsite .pricing-object-sm { - font-size: 32px; - line-height: .8; -} -.bodywebsite .pricing-object-sm .small { - font-size: 12px; -} -.bodywebsite .pricing-object-sm .small-middle { - margin-right: 3px; -} -.bodywebsite .pricing-object-sm .small-bottom { - margin-left: 1px; - vertical-align: bottom; -} -.bodywebsite .price-irrelevant { - color: #9f9f9f; - text-decoration: line-through; -} -.bodywebsite .pricing-object-md { - font-size: 53px; - line-height: 1; -} -.bodywebsite .pricing-object-md .price { - line-height: .5; -} -.bodywebsite .pricing-object-md .small { - font-size: 17px; - font-weight: 400; -} -.bodywebsite .pricing-object-md .small-middle { - font-size: 23px; -} -.bodywebsite .pricing-object-md .small-bottom { - bottom: -0.25em; -} -.bodywebsite .pricing-object-lg, -.bodywebsite .pricing-object-xl { - font-size: 64px; - line-height: .7; -} -.bodywebsite .pricing-object-lg .small, -.bodywebsite .pricing-object-xl .small { - font-size: 9px; -} -.bodywebsite .pricing-object-lg .small-top, -.bodywebsite .pricing-object-xl .small-top { - top: 11px; - margin-right: 5px; - font-size: 14px; - vertical-align: top; - font-weight: 700; -} -.bodywebsite .pricing-object-lg .small-bottom, -.bodywebsite .pricing-object-xl .small-bottom { - bottom: -10px; - margin-left: -2px; - font-weight: 700; - vertical-align: bottom; -} -.bodywebsite .price-current .small { - position: relative; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 400; -} -.bodywebsite .price-current .small-middle { - vertical-align: middle; - top: -0.3em; -} -.bodywebsite .price-current .small-bottom { - top: .3em; -} -@media (min-width: 768px) { - .bodywebsite .pricing-object-lg { - font-size: 72px; - } - .bodywebsite .pricing-object-xl { - font-size: 54px; - } - .bodywebsite .pricing-object-xl .small-middle { - font-size: 30px; - } - .bodywebsite .pricing-object-xl .small-bottom { - font-size: 25px; - } -} -@media (min-width: 992px) { - .bodywebsite .pricing-object-xl { - font-size: 76px; - } -} -.bodywebsite .panel.bg-accent.bg-default-outline-btn.text-center { - background: transparent; -} -.bodywebsite .product .product-label { - padding: 7px 11px; - min-width: 90px; - font: 700 12px/16px "Roboto", Helvetica, Arial, sans-serif; - letter-spacing: .05em; - text-align: center; - border-radius: 0 0 7px 7px; -} -.bodywebsite .product .product-rating { - position: relative; - transform: translateY(-2px); - margin-bottom: -2px; -} -.bodywebsite .product .product-rating > * { - margin-top: 2px; -} -.bodywebsite .product .product-rating > *:not(:last-child) { - margin-right: 5px; -} -.bodywebsite .product .product-rating > * { - display: inline-block; - vertical-align: middle; -} -.bodywebsite .product .product-color { - display: inline-block; - width: 24px; - height: 24px; - font-size: 0; - line-height: 0; - border-radius: 50%; - background: #000; - vertical-align: middle; -} -.bodywebsite .product .product-size { - font: 700 14px/18px "Roboto", Helvetica, Arial, sans-serif; - color: #000; -} -.bodywebsite .product * + .product-brand, -.bodywebsite .product .product-brand + * { - margin-top: 0; -} -.bodywebsite .one-screen-page .page { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; -} -.bodywebsite .one-screen-page .page-inner { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - min-height: 100vh; - text-align: center; -} -.bodywebsite .one-screen-page .page-inner, -.bodywebsite .one-screen-page .page-inner > * { - width: 100%; -} -.bodywebsite .one-screen-page .page-head, -.bodywebsite .one-screen-page .page-foot { - padding: 0; - background: transparent; -} -.bodywebsite .one-screen-page .page-head-inner { - padding: calc(5em) 0 calc(3em); -} -.bodywebsite .one-screen-page .page-content { - padding: calc(5em) 0; -} -.bodywebsite .one-screen-page .page-foot-inner { - padding: calc(3em) 0 calc(5em); -} -.bodywebsite .one-screen-page .rights { - color: #fff; -} -.bodywebsite .one-screen-page .rights a, -.bodywebsite .one-screen-page .rights a:active, -.bodywebsite .one-screen-page .rights a:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .one-screen-page .rights a:hover { - color: #ababab; -} -@media (min-width: 576px) { - .bodywebsite .one-screen-page .page-inner { - text-align: left; - } -} -@media (min-width: 1800px) { - .bodywebsite .one-screen-page .page-head-inner { - padding: 50px 0 10px; - } - .bodywebsite .one-screen-page .page-content { - padding: 30px 0; - } - .bodywebsite .one-screen-page .page-foot-inner { - padding: 50px 0 23px; - } -} -.bodywebsite .ie-10 .one-screen-page, -.bodywebsite .ie-11 .one-screen-page { - overflow-x: hidden; - overflow-y: auto; -} -.bodywebsite .inset-left-0 { - padding-left: 0; -} -.bodywebsite .inset-left-10 { - padding-left: 10px; -} -.bodywebsite .inset-left-15 { - padding-left: 15px; -} -.bodywebsite .inset-left-20 { - padding-left: 20px; -} -.bodywebsite .inset-left-30 { - padding-left: 30px; -} -.bodywebsite .inset-left-40 { - padding-left: 40px; -} -.bodywebsite .inset-left-50 { - padding-left: 50px; -} -.bodywebsite .inset-left-60 { - padding-left: 60px; -} -.bodywebsite .inset-left-70 { - padding-left: 70px; -} -.bodywebsite .inset-left-85 { - padding-left: 85px; -} -.bodywebsite .inset-left-100 { - padding-left: 100px; -} -@media (min-width: 576px) { - .bodywebsite .inset-sm-left-0 { - padding-left: 0; - } - .bodywebsite .inset-sm-left-10 { - padding-left: 10px; - } - .bodywebsite .inset-sm-left-15 { - padding-left: 15px; - } - .bodywebsite .inset-sm-left-20 { - padding-left: 20px; - } - .bodywebsite .inset-sm-left-30 { - padding-left: 30px; - } - .bodywebsite .inset-sm-left-40 { - padding-left: 40px; - } - .bodywebsite .inset-sm-left-50 { - padding-left: 50px; - } - .bodywebsite .inset-sm-left-60 { - padding-left: 60px; - } - .bodywebsite .inset-sm-left-70 { - padding-left: 70px; - } - .bodywebsite .inset-sm-left-85 { - padding-left: 85px; - } - .bodywebsite .inset-sm-left-100 { - padding-left: 100px; - } -} -@media (min-width: 768px) { - .bodywebsite .inset-md-left-0 { - padding-left: 0; - } - .bodywebsite .inset-md-left-10 { - padding-left: 10px; - } - .bodywebsite .inset-md-left-15 { - padding-left: 15px; - } - .bodywebsite .inset-md-left-20 { - padding-left: 20px; - } - .bodywebsite .inset-md-left-30 { - padding-left: 30px; - } - .bodywebsite .inset-md-left-40 { - padding-left: 40px; - } - .bodywebsite .inset-md-left-50 { - padding-left: 50px; - } - .bodywebsite .inset-md-left-60 { - padding-left: 60px; - } - .bodywebsite .inset-md-left-70 { - padding-left: 70px; - } - .bodywebsite .inset-md-left-85 { - padding-left: 85px; - } - .bodywebsite .inset-md-left-100 { - padding-left: 100px; - } -} -@media (min-width: 992px) { - .bodywebsite .inset-lg-left-0 { - padding-left: 0; - } - .bodywebsite .inset-lg-left-10 { - padding-left: 10px; - } - .bodywebsite .inset-lg-left-15 { - padding-left: 15px; - } - .bodywebsite .inset-lg-left-20 { - padding-left: 20px; - } - .bodywebsite .inset-lg-left-30 { - padding-left: 30px; - } - .bodywebsite .inset-lg-left-40 { - padding-left: 40px; - } - .bodywebsite .inset-lg-left-50 { - padding-left: 50px; - } - .bodywebsite .inset-lg-left-60 { - padding-left: 60px; - } - .bodywebsite .inset-lg-left-70 { - padding-left: 70px; - } - .bodywebsite .inset-lg-left-85 { - padding-left: 85px; - } - .bodywebsite .inset-lg-left-100 { - padding-left: 100px; - } -} -@media (min-width: 1200px) { - .bodywebsite .inset-xl-left-0 { - padding-left: 0; - } - .bodywebsite .inset-xl-left-10 { - padding-left: 10px; - } - .bodywebsite .inset-xl-left-15 { - padding-left: 15px; - } - .bodywebsite .inset-xl-left-20 { - padding-left: 20px; - } - .bodywebsite .inset-xl-left-30 { - padding-left: 30px; - } - .bodywebsite .inset-xl-left-40 { - padding-left: 40px; - } - .bodywebsite .inset-xl-left-50 { - padding-left: 50px; - } - .bodywebsite .inset-xl-left-60 { - padding-left: 60px; - } - .bodywebsite .inset-xl-left-70 { - padding-left: 70px; - } - .bodywebsite .inset-xl-left-85 { - padding-left: 85px; - } - .bodywebsite .inset-xl-left-100 { - padding-left: 100px; - } -} -@media (min-width: 1800px) { - .bodywebsite .inset-xxl-left-0 { - padding-left: 0; - } - .bodywebsite .inset-xxl-left-10 { - padding-left: 10px; - } - .bodywebsite .inset-xxl-left-15 { - padding-left: 15px; - } - .bodywebsite .inset-xxl-left-20 { - padding-left: 20px; - } - .bodywebsite .inset-xxl-left-30 { - padding-left: 30px; - } - .bodywebsite .inset-xxl-left-40 { - padding-left: 40px; - } - .bodywebsite .inset-xxl-left-50 { - padding-left: 50px; - } - .bodywebsite .inset-xxl-left-60 { - padding-left: 60px; - } - .bodywebsite .inset-xxl-left-70 { - padding-left: 70px; - } - .bodywebsite .inset-xxl-left-85 { - padding-left: 85px; - } - .bodywebsite .inset-xxl-left-100 { - padding-left: 100px; - } -} -.bodywebsite .inset-right-0 { - padding-right: 0; -} -.bodywebsite .inset-right-10 { - padding-right: 10px; -} -.bodywebsite .inset-right-15 { - padding-right: 15px; -} -.bodywebsite .inset-right-20 { - padding-right: 20px; -} -.bodywebsite .inset-right-30 { - padding-right: 30px; -} -.bodywebsite .inset-right-40 { - padding-right: 40px; -} -.bodywebsite .inset-right-50 { - padding-right: 50px; -} -.bodywebsite .inset-right-60 { - padding-right: 60px; -} -.bodywebsite .inset-right-70 { - padding-right: 70px; -} -.bodywebsite .inset-right-85 { - padding-right: 85px; -} -.bodywebsite .inset-right-100 { - padding-right: 100px; -} -@media (min-width: 576px) { - .bodywebsite .inset-sm-right-0 { - padding-right: 0; - } - .bodywebsite .inset-sm-right-10 { - padding-right: 10px; - } - .bodywebsite .inset-sm-right-15 { - padding-right: 15px; - } - .bodywebsite .inset-sm-right-20 { - padding-right: 20px; - } - .bodywebsite .inset-sm-right-30 { - padding-right: 30px; - } - .bodywebsite .inset-sm-right-40 { - padding-right: 40px; - } - .bodywebsite .inset-sm-right-50 { - padding-right: 50px; - } - .bodywebsite .inset-sm-right-60 { - padding-right: 60px; - } - .bodywebsite .inset-sm-right-70 { - padding-right: 70px; - } - .bodywebsite .inset-sm-right-85 { - padding-right: 85px; - } - .bodywebsite .inset-sm-right-100 { - padding-right: 100px; - } -} -@media (min-width: 768px) { - .bodywebsite .inset-md-right-0 { - padding-right: 0; - } - .bodywebsite .inset-md-right-10 { - padding-right: 10px; - } - .bodywebsite .inset-md-right-15 { - padding-right: 15px; - } - .bodywebsite .inset-md-right-20 { - padding-right: 20px; - } - .bodywebsite .inset-md-right-30 { - padding-right: 30px; - } - .bodywebsite .inset-md-right-40 { - padding-right: 40px; - } - .bodywebsite .inset-md-right-50 { - padding-right: 50px; - } - .bodywebsite .inset-md-right-60 { - padding-right: 60px; - } - .bodywebsite .inset-md-right-70 { - padding-right: 70px; - } - .bodywebsite .inset-md-right-85 { - padding-right: 85px; - } - .bodywebsite .inset-md-right-100 { - padding-right: 100px; - } -} -@media (min-width: 992px) { - .bodywebsite .inset-lg-right-0 { - padding-right: 0; - } - .bodywebsite .inset-lg-right-10 { - padding-right: 10px; - } - .bodywebsite .inset-lg-right-15 { - padding-right: 15px; - } - .bodywebsite .inset-lg-right-20 { - padding-right: 20px; - } - .bodywebsite .inset-lg-right-30 { - padding-right: 30px; - } - .bodywebsite .inset-lg-right-40 { - padding-right: 40px; - } - .bodywebsite .inset-lg-right-50 { - padding-right: 50px; - } - .bodywebsite .inset-lg-right-60 { - padding-right: 60px; - } - .bodywebsite .inset-lg-right-70 { - padding-right: 70px; - } - .bodywebsite .inset-lg-right-85 { - padding-right: 85px; - } - .bodywebsite .inset-lg-right-100 { - padding-right: 100px; - } -} -@media (min-width: 1200px) { - .bodywebsite .inset-xl-right-0 { - padding-right: 0; - } - .bodywebsite .inset-xl-right-10 { - padding-right: 10px; - } - .bodywebsite .inset-xl-right-15 { - padding-right: 15px; - } - .bodywebsite .inset-xl-right-20 { - padding-right: 20px; - } - .bodywebsite .inset-xl-right-30 { - padding-right: 30px; - } - .bodywebsite .inset-xl-right-40 { - padding-right: 40px; - } - .bodywebsite .inset-xl-right-50 { - padding-right: 50px; - } - .bodywebsite .inset-xl-right-60 { - padding-right: 60px; - } - .bodywebsite .inset-xl-right-70 { - padding-right: 70px; - } - .bodywebsite .inset-xl-right-85 { - padding-right: 85px; - } - .bodywebsite .inset-xl-right-100 { - padding-right: 100px; - } -} -@media (min-width: 1800px) { - .bodywebsite .inset-xxl-right-0 { - padding-right: 0; - } - .bodywebsite .inset-xxl-right-10 { - padding-right: 10px; - } - .bodywebsite .inset-xxl-right-15 { - padding-right: 15px; - } - .bodywebsite .inset-xxl-right-20 { - padding-right: 20px; - } - .bodywebsite .inset-xxl-right-30 { - padding-right: 30px; - } - .bodywebsite .inset-xxl-right-40 { - padding-right: 40px; - } - .bodywebsite .inset-xxl-right-50 { - padding-right: 50px; - } - .bodywebsite .inset-xxl-right-60 { - padding-right: 60px; - } - .bodywebsite .inset-xxl-right-70 { - padding-right: 70px; - } - .bodywebsite .inset-xxl-right-85 { - padding-right: 85px; - } - .bodywebsite .inset-xxl-right-100 { - padding-right: 100px; - } -} -.bodywebsite .container + .container { - margin-top: 60px; -} -.bodywebsite h3.section-title { - color: #000; -} -.bodywebsite h4 + .section-title { - margin-top: 2px; -} -.bodywebsite h4 + .comment-list { - margin-top: 30px; -} -.bodywebsite h3 + p { - margin-top: 15px; -} -.bodywebsite h3 + p.h4 { - margin-top: 2px; -} -.bodywebsite h3 + .row { - margin-top: 40px; -} -.bodywebsite h3 + * { - margin-top: 40px; -} -.bodywebsite .row + .row { - margin-top: 60px; -} -.bodywebsite * + .row.list-md-dashed { - margin-top: 60px; -} -.bodywebsite .row + .button-block { - margin-top: 60px; -} -.bodywebsite .slick-slider + .slick-slider.carousel-parent { - margin-top: 35px; -} -.bodywebsite .quote-left + .button-block { - margin-top: 22px; -} -.bodywebsite .aside-title + * { - margin-top: 22px; -} -.bodywebsite * + .button-group { - margin-top: 25px; -} -html .bodywebsite .page .offset-top-0 { - margin-top: 0; -} -html .bodywebsite .page .offset-top-2 { - margin-top: 2px; -} -html .bodywebsite .page .offset-top-5 { - margin-top: 5px; -} -html .bodywebsite .page .offset-top-10 { - margin-top: 10px; -} -html .bodywebsite .page .offset-top-15 { - margin-top: 15px; -} -html .bodywebsite .page .offset-top-22 { - margin-top: 22px; -} -html .bodywebsite .page .offset-top-27 { - margin-top: 27px; -} -html .bodywebsite .page .offset-top-30 { - margin-top: 30px; -} -html .bodywebsite .page .offset-top-35 { - margin-top: 35px; -} -html .bodywebsite .page .offset-top-40 { - margin-top: 40px; -} -html .bodywebsite .page .offset-top-45 { - margin-top: 45px; -} -html .bodywebsite .page .offset-top-50 { - margin-top: 50px; -} -html .bodywebsite .page .offset-top-60 { - margin-top: 60px; -} -html .bodywebsite .page .offset-top-75 { - margin-top: 75px; -} -html .bodywebsite .page .offset-top-90 { - margin-top: 90px; -} -html .bodywebsite .page .offset-top-100 { - margin-top: 100px; -} -html .bodywebsite .page .offset-top-120 { - margin-top: 120px; -} -@media (min-width: 576px) { - html .bodywebsite .page .offset-sm-top-0 { - margin-top: 0; - } - html .bodywebsite .page .offset-sm-top-2 { - margin-top: 2px; - } - html .bodywebsite .page .offset-sm-top-5 { - margin-top: 5px; - } - html .bodywebsite .page .offset-sm-top-10 { - margin-top: 10px; - } - html .bodywebsite .page .offset-sm-top-15 { - margin-top: 15px; - } - html .bodywebsite .page .offset-sm-top-22 { - margin-top: 22px; - } - html .bodywebsite .page .offset-sm-top-27 { - margin-top: 27px; - } - html .bodywebsite .page .offset-sm-top-30 { - margin-top: 30px; - } - html .bodywebsite .page .offset-sm-top-35 { - margin-top: 35px; - } - html .bodywebsite .page .offset-sm-top-40 { - margin-top: 40px; - } - html .bodywebsite .page .offset-sm-top-45 { - margin-top: 45px; - } - html .bodywebsite .page .offset-sm-top-50 { - margin-top: 50px; - } - html .bodywebsite .page .offset-sm-top-60 { - margin-top: 60px; - } - html .bodywebsite .page .offset-sm-top-75 { - margin-top: 75px; - } - html .bodywebsite .page .offset-sm-top-90 { - margin-top: 90px; - } - html .bodywebsite .page .offset-sm-top-100 { - margin-top: 100px; - } - html .bodywebsite .page .offset-sm-top-120 { - margin-top: 120px; - } -} -@media (min-width: 768px) { - html .bodywebsite .page .offset-md-top-0 { - margin-top: 0; - } - html .bodywebsite .page .offset-md-top-2 { - margin-top: 2px; - } - html .bodywebsite .page .offset-md-top-5 { - margin-top: 5px; - } - html .bodywebsite .page .offset-md-top-10 { - margin-top: 10px; - } - html .bodywebsite .page .offset-md-top-15 { - margin-top: 15px; - } - html .bodywebsite .page .offset-md-top-22 { - margin-top: 22px; - } - html .bodywebsite .page .offset-md-top-27 { - margin-top: 27px; - } - html .bodywebsite .page .offset-md-top-30 { - margin-top: 30px; - } - html .bodywebsite .page .offset-md-top-35 { - margin-top: 35px; - } - html .bodywebsite .page .offset-md-top-40 { - margin-top: 40px; - } - html .bodywebsite .page .offset-md-top-45 { - margin-top: 45px; - } - html .bodywebsite .page .offset-md-top-50 { - margin-top: 50px; - } - html .bodywebsite .page .offset-md-top-60 { - margin-top: 60px; - } - html .bodywebsite .page .offset-md-top-75 { - margin-top: 75px; - } - html .bodywebsite .page .offset-md-top-90 { - margin-top: 90px; - } - html .bodywebsite .page .offset-md-top-100 { - margin-top: 100px; - } - html .bodywebsite .page .offset-md-top-120 { - margin-top: 120px; - } -} -@media (min-width: 992px) { - html .bodywebsite .page .offset-lg-top-0 { - margin-top: 0; - } - html .bodywebsite .page .offset-lg-top-2 { - margin-top: 2px; - } - html .bodywebsite .page .offset-lg-top-5 { - margin-top: 5px; - } - html .bodywebsite .page .offset-lg-top-10 { - margin-top: 10px; - } - html .bodywebsite .page .offset-lg-top-15 { - margin-top: 15px; - } - html .bodywebsite .page .offset-lg-top-22 { - margin-top: 22px; - } - html .bodywebsite .page .offset-lg-top-27 { - margin-top: 27px; - } - html .bodywebsite .page .offset-lg-top-30 { - margin-top: 30px; - } - html .bodywebsite .page .offset-lg-top-35 { - margin-top: 35px; - } - html .bodywebsite .page .offset-lg-top-40 { - margin-top: 40px; - } - html .bodywebsite .page .offset-lg-top-45 { - margin-top: 45px; - } - html .bodywebsite .page .offset-lg-top-50 { - margin-top: 50px; - } - html .bodywebsite .page .offset-lg-top-60 { - margin-top: 60px; - } - html .bodywebsite .page .offset-lg-top-75 { - margin-top: 75px; - } - html .bodywebsite .page .offset-lg-top-90 { - margin-top: 90px; - } - html .bodywebsite .page .offset-lg-top-100 { - margin-top: 100px; - } - html .bodywebsite .page .offset-lg-top-120 { - margin-top: 120px; - } -} -@media (min-width: 1200px) { - html .bodywebsite .page .offset-xl-top-0 { - margin-top: 0; - } - html .bodywebsite .page .offset-xl-top-2 { - margin-top: 2px; - } - html .bodywebsite .page .offset-xl-top-5 { - margin-top: 5px; - } - html .bodywebsite .page .offset-xl-top-10 { - margin-top: 10px; - } - html .bodywebsite .page .offset-xl-top-15 { - margin-top: 15px; - } - html .bodywebsite .page .offset-xl-top-22 { - margin-top: 22px; - } - html .bodywebsite .page .offset-xl-top-27 { - margin-top: 27px; - } - html .bodywebsite .page .offset-xl-top-30 { - margin-top: 30px; - } - html .bodywebsite .page .offset-xl-top-35 { - margin-top: 35px; - } - html .bodywebsite .page .offset-xl-top-40 { - margin-top: 40px; - } - html .bodywebsite .page .offset-xl-top-45 { - margin-top: 45px; - } - html .bodywebsite .page .offset-xl-top-50 { - margin-top: 50px; - } - html .bodywebsite .page .offset-xl-top-60 { - margin-top: 60px; - } - html .bodywebsite .page .offset-xl-top-75 { - margin-top: 75px; - } - html .bodywebsite .page .offset-xl-top-90 { - margin-top: 90px; - } - html .bodywebsite .page .offset-xl-top-100 { - margin-top: 100px; - } - html .bodywebsite .page .offset-xl-top-120 { - margin-top: 120px; - } -} -@media (min-width: 1800px) { - html .bodywebsite .page .offset-xxl-top-0 { - margin-top: 0; - } - html .bodywebsite .page .offset-xxl-top-2 { - margin-top: 2px; - } - html .bodywebsite .page .offset-xxl-top-5 { - margin-top: 5px; - } - html .bodywebsite .page .offset-xxl-top-10 { - margin-top: 10px; - } - html .bodywebsite .page .offset-xxl-top-15 { - margin-top: 15px; - } - html .bodywebsite .page .offset-xxl-top-22 { - margin-top: 22px; - } - html .bodywebsite .page .offset-xxl-top-27 { - margin-top: 27px; - } - html .bodywebsite .page .offset-xxl-top-30 { - margin-top: 30px; - } - html .bodywebsite .page .offset-xxl-top-35 { - margin-top: 35px; - } - html .bodywebsite .page .offset-xxl-top-40 { - margin-top: 40px; - } - html .bodywebsite .page .offset-xxl-top-45 { - margin-top: 45px; - } - html .bodywebsite .page .offset-xxl-top-50 { - margin-top: 50px; - } - html .bodywebsite .page .offset-xxl-top-60 { - margin-top: 60px; - } - html .bodywebsite .page .offset-xxl-top-75 { - margin-top: 75px; - } - html .bodywebsite .page .offset-xxl-top-90 { - margin-top: 90px; - } - html .bodywebsite .page .offset-xxl-top-100 { - margin-top: 100px; - } - html .bodywebsite .page .offset-xxl-top-120 { - margin-top: 120px; - } -} -@media (min-width: 768px) { - .bodywebsite .shift-sm-top-1 { - margin-top: -18px; - } -} -@media (min-width: 992px) { - .bodywebsite .shift-sm-top-1 { - margin-top: -23px; - } -} -@media (min-width: 992px) { - .bodywebsite .shift-md-top-1 { - margin-top: -33px; - } -} -@media (min-width: 1200px) { - .bodywebsite .shift-md-top-1 { - margin-top: -43px; - } -} -.bodywebsite .row-0 { - margin-bottom: 0px; -} -.bodywebsite .row-0:empty { - margin-bottom: 0; -} -.bodywebsite .row-0 > * { - margin-bottom: 0px; -} -.bodywebsite .row-15 { - margin-bottom: -15px; -} -.bodywebsite .row-15:empty { - margin-bottom: 0; -} -.bodywebsite .row-15 > * { - margin-bottom: 15px; -} -.bodywebsite .row-20 { - margin-bottom: -20px; -} -.bodywebsite .row-20:empty { - margin-bottom: 0; -} -.bodywebsite .row-20 > * { - margin-bottom: 20px; -} -.bodywebsite .row-30 { - margin-bottom: -30px; -} -.bodywebsite .row-30:empty { - margin-bottom: 0; -} -.bodywebsite .row-30 > * { - margin-bottom: 30px; -} -.bodywebsite .row-40 { - margin-bottom: -40px; -} -.bodywebsite .row-40:empty { - margin-bottom: 0; -} -.bodywebsite .row-40 > * { - margin-bottom: 40px; -} -.bodywebsite .row-50 { - margin-bottom: -50px; -} -.bodywebsite .row-50:empty { - margin-bottom: 0; -} -.bodywebsite .row-50 > * { - margin-bottom: 50px; -} -.bodywebsite .row-60 { - margin-bottom: -60px; -} -.bodywebsite .row-60:empty { - margin-bottom: 0; -} -.bodywebsite .row-60 > * { - margin-bottom: 60px; -} -@media (min-width: 576px) { - .bodywebsite .row-sm-50 { - margin-bottom: -50px; - } - .bodywebsite .row-sm-50:empty { - margin-bottom: 0; - } - .bodywebsite .row-sm-50 > * { - margin-bottom: 50px; - } - .bodywebsite .row-sm-0 { - margin-bottom: 0px; - } - .bodywebsite .row-sm-0:empty { - margin-bottom: 0; - } - .bodywebsite .row-sm-0 > * { - margin-bottom: 0px; - } -} -@media (min-width: 768px) { - .bodywebsite .row-md-60 { - margin-bottom: -60px; - } - .bodywebsite .row-md-60:empty { - margin-bottom: 0; - } - .bodywebsite .row-md-60 > * { - margin-bottom: 60px; - } -} -@media (min-width: 992px) { - .bodywebsite .row-md-30 { - margin-bottom: -30px; - } - .bodywebsite .row-md-30:empty { - margin-bottom: 0; - } - .bodywebsite .row-md-30 > * { - margin-bottom: 30px; - } -} -@media (min-width: 1200px) { - .bodywebsite .row-xl-100 { - margin-bottom: -100px; - } - .bodywebsite .row-xl-100:empty { - margin-bottom: 0; - } - .bodywebsite .row-xl-100 > * { - margin-bottom: 100px; - } - .bodywebsite .row-xl-90 { - margin-bottom: -90px; - } - .bodywebsite .row-xl-90:empty { - margin-bottom: 0; - } - .bodywebsite .row-xl-90 > * { - margin-bottom: 90px; - } -} -.bodywebsite .link { - display: inline-block; -} -.bodywebsite .link-inline { - font: inherit; - line-height: inherit; - text-decoration: underline; -} -.bodywebsite .link-underline, -.bodywebsite .link-underline:active, -.bodywebsite .link-underline:focus { - text-decoration: underline; -} -.bodywebsite .link-underline:hover { - text-decoration: none; -} -.bodywebsite .link-circle { - border-radius: 50%; -} -.bodywebsite .link-circle .icon, -.bodywebsite .link-circle .icon:before { - position: static; -} -.bodywebsite .link-bold { - font: 700 18px/22px "Roboto", Helvetica, Arial, sans-serif; -} -.bodywebsite .link-group { - white-space: nowrap; -} -.bodywebsite .link-group * { - vertical-align: middle; -} -.bodywebsite .link-group span { - display: inline-block; -} -.bodywebsite .link-group span + *, -.bodywebsite .link-group * + span { - margin-left: 5px; -} -.bodywebsite .link-group.link-group-animated .icon { - position: relative; - right: 0; - transition: .22s; -} -.bodywebsite .link-group.link-group-animated:hover .icon { - right: -5px; -} -.bodywebsite .link-group-baseline * { - vertical-align: baseline; -} -.bodywebsite .link-icon, -.bodywebsite .link-icon * { - vertical-align: middle; -} -.bodywebsite .link-icon .icon { - margin-right: 5px; -} -.bodywebsite .link-icon-mod .icon { - position: relative; - top: -3px; -} -.bodywebsite .link-image img { - width: auto; - transition: .44s all ease; - opacity: .5; -} -.bodywebsite .link-image:hover img { - opacity: 1; -} -.bodywebsite .link-image-wrap { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - min-height: 126px; -} -.bodywebsite * + .link-image-wrap { - margin-top: 13px; -} -.bodywebsite .page .link-primary-inline { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-primary-inline.active, -.bodywebsite .page .link-primary-inline:active, -.bodywebsite .page .link-primary-inline:focus { - color: #9b9b9b; -} -.bodywebsite .page .link-primary-inline.hover, -.bodywebsite .page .link-primary-inline:hover { - color: #42b294; -} -.bodywebsite .page .link-default, -.bodywebsite .page .link-default:active, -.bodywebsite .page .link-default:focus { - color: #9f9f9f; -} -.bodywebsite .page .link-default:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-primary, -.bodywebsite .page .link-primary:active, -.bodywebsite .page .link-primary:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-primary:hover { - color: #00030a; -} -.bodywebsite .page .link-primary-inverse, -.bodywebsite .page .link-primary-inverse:active, -.bodywebsite .page .link-primary-inverse:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-primary-inverse:hover { - color: #ddd; -} -.bodywebsite .page .link-primary-inverse-v2, -.bodywebsite .page .link-primary-inverse-v2:active, -.bodywebsite .page .link-primary-inverse-v2:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-primary-inverse-v2:hover { - color: #fff; -} -.bodywebsite .page .link-secondary, -.bodywebsite .page .link-secondary:active, -.bodywebsite .page .link-secondary:focus { - color: #00030a; -} -.bodywebsite .page .link-secondary:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-tundora, -.bodywebsite .page .link-tundora:active, -.bodywebsite .page .link-tundora:focus { - color: #414141; -} -.bodywebsite .page .link-tundora:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-tundora-inverse, -.bodywebsite .page .link-tundora-inverse:active, -.bodywebsite .page .link-tundora-inverse:focus { - color: #414141; -} -.bodywebsite .page .link-tundora-inverse:hover { - color: #fff; -} -.bodywebsite .page .link-secondary, -.bodywebsite .page .link-secondary:active, -.bodywebsite .page .link-secondary:focus { - color: #000; -} -.bodywebsite .page .link-secondary:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-gray-light, -.bodywebsite .page .link-gray-light:active, -.bodywebsite .page .link-gray-light:focus { - color: #dedede; -} -.bodywebsite .page .link-gray-light:hover { - color: #000; -} -.bodywebsite .page .link-white, -.bodywebsite .page .link-white:active, -.bodywebsite .page .link-white:focus { - color: #fff; -} -.bodywebsite .page .link-white:hover { - color: #fff; -} -.bodywebsite .page .link-black, -.bodywebsite .page .link-black:active, -.bodywebsite .page .link-black:focus { - color: #000; -} -.bodywebsite .page .link-black:hover { - color: maincolorbis) ? 'rgb(50, 120, 180)' : '#'.$website->maincolorbis; ?>; -} -.bodywebsite .page .link-black:hover { - text-decoration: underline; -} -.bodywebsite .page .link-gray-dark-filled, -.bodywebsite .page .link-gray-dark-filled:active, -.bodywebsite .page .link-gray-dark-filled:focus { - color: #fff; - background: #2a2b2b; -} -.bodywebsite .page .link-gray-dark-filled:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .page .link-shop { - width: 25px; - height: 25px; - font-size: 25px; - line-height: 25px; -} -.bodywebsite .page .link-shop, -.bodywebsite .page .link-shop:active, -.bodywebsite .page .link-shop:focus { - color: #00030a; -} -.bodywebsite .page .link-shop:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite ul, -.bodywebsite ol { - list-style: none; - padding: 0; - margin: 0; -} -.bodywebsite dl { - margin: 0; -} -.bodywebsite dt { - font-weight: inherit; -} -.bodywebsite .list > li + li { - margin-top: 5px; -} -.bodywebsite .list-xl > li + li { - margin-top: 44px; -} -.bodywebsite .list-inline { - margin-left: -5px; - margin-right: -5px; - vertical-align: baseline; -} -.bodywebsite .list-inline > li { - display: inline-block; - padding-left: 5px; - padding-right: 5px; -} -.bodywebsite .list-inline-xs { - margin-left: -6px; - margin-right: -6px; -} -.bodywebsite .list-inline-xs > li { - display: inline-block; - padding-left: 6px; - padding-right: 6px; -} -.bodywebsite .list-inline-sm { - margin-left: -10px; - margin-right: -10px; -} -.bodywebsite .list-inline-sm > li { - display: inline-block; - padding-left: 10px; - padding-right: 10px; -} -.bodywebsite .list-inline-md { - margin-left: -15px; - margin-right: -15px; -} -.bodywebsite .list-inline-md > li { - display: inline-block; - padding-left: 15px; - padding-right: 15px; -} -.bodywebsite .list-objects-inline { - margin-bottom: -4px; - margin-left: -22px; - transform: translateY(-4px); -} -.bodywebsite .list-objects-inline > *, -.bodywebsite .list-objects-inline > *:first-child { - display: inline-block; - vertical-align: middle; - margin-top: 4px; - margin-left: 22px; -} -.bodywebsite .list-objects-inline > li > * { - display: inline-block; - vertical-align: middle; -} -.bodywebsite .list-objects-inline > li > * + * { - margin-left: 5px; -} -.bodywebsite .list-terms dt + dd { - margin-top: 10px; -} -.bodywebsite .list-terms dd + dt { - margin-top: 31px; -} -.bodywebsite .list-terms-variant-1 dt { - font: 700 16px/22px "Roboto", Helvetica, Arial, sans-serif; - letter-spacing: -0.025em; - color: #000; -} -.bodywebsite .list-terms-variant-1 dt + dd { - margin-top: 18px; -} -.bodywebsite .list-terms-variant-1 dd + dt { - margin-top: 40px; -} -@media (min-width: 1200px) { - .bodywebsite .list-terms-variant-1 dt { - font-size: 24px; - line-height: 1.2; - } - .bodywebsite .list-terms-variant-1 dd + dt { - margin-top: 50px; - } -} -.bodywebsite .list-inline-dashed { - margin-left: -15px; -} -.bodywebsite .list-inline-dashed li { - padding-left: 15px; - padding-right: 10px; -} -.bodywebsite .list-inline-dashed li:after { - content: '|'; - position: relative; - right: -12.5px; - color: #e5e7e9; -} -.bodywebsite .list-inline-dashed li:last-child { - padding-right: 0; -} -.bodywebsite .list-inline-dashed li:last-child:after { - display: none; -} -@media (min-width: 992px) { - .bodywebsite .list-md-dashed > * { - position: relative; - } - .bodywebsite .list-md-dashed > *:after { - content: ''; - position: absolute; - font-weight: 100; - top: 0; - right: -6%; - height: 73px; - -webkit-transform: translateX(-50%) skew(-21deg); - transform: translateX(-50%) skew(-21deg); - width: 1px; - background: #48494a; - } -} -@media (min-width: 992px) and (min-width: 1200px) { - .bodywebsite .list-md-dashed > *:after { - right: -3%; - height: 120px; - } -} -@media (min-width: 992px) { - .bodywebsite .list-md-dashed > *:last-child::after { - display: none; - } -} -.bodywebsite .dl-inline { - vertical-align: middle; -} -.bodywebsite .dl-inline dt, -.bodywebsite .dl-inline dd { - display: inline-block; - vertical-align: middle; -} -.bodywebsite .dl-inline dt { - padding-right: 5px; -} -.bodywebsite .dl-inline dt:after { - content: ':'; -} -.bodywebsite .dl-inline .pricing-object-sm { - position: relative; - top: -5px; -} -.bodywebsite .list-terms-inline dt, -.bodywebsite .list-terms-inline dd { - display: inline-block; -} -.bodywebsite .list-terms-inline dt { - color: #000; -} -.bodywebsite .list-terms-inline dd { - color: #9f9f9f; -} -.bodywebsite .list-terms-inline dt:after { - content: ':'; -} -.bodywebsite .list-index { - counter-reset: li; -} -.bodywebsite .list-index > li .list-index-counter:before { - content: counter(li, decimal-leading-zero); - counter-increment: li; -} -.bodywebsite .list-marked li { - color: #000; - position: relative; - padding-left: 32px; -} -.bodywebsite .list-marked li:before { - position: absolute; - top: 1px; - left: 0; - content: '\e005'; - font-family: "fl-flat-icons-set-2"; - display: inline-block; - margin-right: 11px; - font-size: 13px; - line-height: inherit; - vertical-align: middle; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-marked li:not(:last-child):after { - content: ';'; -} -.bodywebsite .list-marked li:last-child:after { - content: '.'; -} -.bodywebsite .list-marked li + li { - margin-top: 11px; -} -.bodywebsite .list-marked-spacing-lg li { - padding-left: 26px; -} -@media (min-width: 992px) and (max-width: 1799px) { - .bodywebsite .list-marked li { - padding-left: 24px; - font-size: 13px; - } - .bodywebsite .list-marked li:before { - font-size: 11px; - } -} -.bodywebsite .list-marked-variant-2 > li > a { - position: relative; - display: inline-block; -} -.bodywebsite .list-marked-variant-2 > li > a:hover:before { - left: 4px; -} -.bodywebsite .list-marked-variant-2 > li + li { - margin-top: 14px; -} -.bodywebsite .list-ordered { - counter-reset: li; -} -.bodywebsite .list-ordered li { - color: #000; -} -.bodywebsite .list-ordered li:before { - display: inline-block; - margin-right: 13px; - width: 15px; - content: counter(li, decimal) "."; - counter-increment: li; -} -.bodywebsite .list-ordered li:not(:last-child):after { - content: ';'; -} -.bodywebsite .list-ordered li:last-child:after { - content: '.'; -} -.bodywebsite .list-ordered li + li { - margin-top: 11px; -} -.bodywebsite .list-tags > li { - display: inline-block; - font-style: italic; -} -.bodywebsite .list-tags > li a, -.bodywebsite .list-tags > li a:active, -.bodywebsite .list-tags > li a:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-tags > li a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-tags > li:after { - content: ','; - display: inline-block; - color: #f9f9f9; -} -.bodywebsite .list-tags > li:last-child:after { - display: none; -} -.bodywebsite .list-numbered { - counter-reset: li; -} -.bodywebsite .list-numbered > li { - position: relative; - padding-left: 30px; -} -.bodywebsite .list-numbered > li:before { - position: absolute; - top: 0; - left: 0; - content: counter(li, decimal) "."; - counter-increment: li; -} -.bodywebsite .list-numbered > li + li { - margin-top: 10px; -} -.bodywebsite .list-icon-pack { - margin-top: 6px; -} -.bodywebsite .list-icon-pack > li { - margin-top: 25px; -} -.bodywebsite .list-icon-pack > li span { - display: block; -} -.bodywebsite .list-icon-pack > li span + span { - margin-left: .25em; -} -.bodywebsite .list-icon-pack h6 + *, -.bodywebsite .list-icon-pack .h6 + * { - margin-top: 2px; -} -.bodywebsite .list-links > li { - display: inline-block; -} -.bodywebsite .list-links > li:after { - content: ';'; -} -.bodywebsite .list-links > li:last-child:after { - display: none; -} -.bodywebsite .list-hashtags > li { - display: inline-block; -} -.bodywebsite .list-hashtags > li a { - color: inherit; -} -.bodywebsite .list-hashtags > li a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-hashtags > li > a:before { - content: '#'; -} -.bodywebsite .list-marked-bordered { - color: #000; -} -.bodywebsite .list-marked-bordered li a { - display: block; - padding: 10px 7px; - border-bottom: 1px solid #f9f9f9; -} -.bodywebsite .list-marked-bordered li a:before { - position: relative; - display: inline-block; - padding-right: 10px; - font: 400 18px "FontAwesome"; - line-height: inherit; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - content: '\f105'; -} -.bodywebsite .list-marked-bordered li a span { - color: inherit; - transition: color .33s; -} -.bodywebsite .list-marked-bordered li a span:first-child { - color: #000; -} -.bodywebsite .list-marked-bordered li a:hover, -.bodywebsite .list-marked-bordered li a:hover span:nth-child(n) { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-marked-bordered li span:not(:last-child) { - margin-right: .25em; -} -.bodywebsite .list-bordered-horizontal { - position: relative; - transform: translateY(-7px); - margin-bottom: -7px; -} -.bodywebsite .list-bordered-horizontal > * { - margin-top: 7px; -} -.bodywebsite .list-bordered-horizontal > *:not(:last-child) { - margin-right: 35px; -} -@media (min-width: 768px) { - .bodywebsite .list-bordered-horizontal > li { - display: inline-block; - } - .bodywebsite .list-bordered-horizontal > li:not(:last-child) { - position: relative; - } - .bodywebsite .list-bordered-horizontal > li:not(:last-child):after { - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%); - right: -20px; - width: 1px; - height: 22px; - background: #dedede; - } -} -.bodywebsite .list-tag-blocks { - position: relative; - transform: translateY(-6px); - margin-bottom: -6px; -} -.bodywebsite .list-tag-blocks > * { - margin-top: 6px; -} -.bodywebsite .list-tag-blocks > *:not(:last-child) { - margin-right: 6px; -} -.bodywebsite .list-tag-blocks li { - display: inline-block; - font-size: 11px; - font-weight: 700; - text-transform: uppercase; -} -.bodywebsite .list-tag-blocks li a { - display: inline-block; - padding: 6px 19px; - border-radius: 0; - border: 1px solid transparent; -} -.bodywebsite .list-tag-blocks li a, -.bodywebsite .list-tag-blocks li a:active, -.bodywebsite .list-tag-blocks li a:focus { - color: #000; - background: #fff; -} -.bodywebsite .list-tag-blocks li a:hover { - background: transparent; - border-color: #cdcdcd; -} -.bodywebsite .list-progress { - font-family: "Roboto", Helvetica, Arial, sans-serif; - color: #00030a; -} -.bodywebsite .list-progress li + li { - margin-top: 23px; -} -.bodywebsite .list-progress p { - padding-right: 40px; -} -.bodywebsite .list-tags-inline > li { - display: inline; -} -.bodywebsite .list-tags-inline > li a { - color: inherit; -} -.bodywebsite .list-tags-inline > li a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .list-tags-inline > li:not(:last-child):after { - content: ','; -} -.bodywebsite .list-rating { - font-size: 0; - line-height: 0; -} -.bodywebsite .list-rating > li { - display: inline-block; -} -.bodywebsite .list-rating .icon { - color: #ffd400; -} -.bodywebsite .list-wide-bordered { - color: #00030a; - font: 400 14px/22px "Roboto", Helvetica, Arial, sans-serif; - border-top: 1px solid #dedede; -} -.bodywebsite .list-wide-bordered dl { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - width: 100%; - font-weight: 700; -} -.bodywebsite .list-wide-bordered dl dt { - padding-right: 15px; -} -.bodywebsite .list-wide-bordered dl dd { - font-weight: 700; - font-size: 14px; -} -.bodywebsite .list-wide-bordered li { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - min-height: 54px; - padding: 10px 20px; - border-bottom: 1px solid #dedede; -} -.bodywebsite .list-wide-bordered + .list-wide-bordered { - border-top: 0; -} -@media (min-width: 768px) { - .bodywebsite .list-wide-bordered { - font-size: 16px; - } - .bodywebsite .list-wide-bordered li { - min-height: 73px; - padding: 20px 30px; - } -} -.bodywebsite .object-wrap { - position: relative; - overflow: hidden; -} -.bodywebsite .object-wrap-right > .object-wrap-body { - right: 0; -} -.bodywebsite .object-wrap-left > .object-wrap-body { - left: 0; -} -@media (min-width: 768px) { - .bodywebsite .object-wrap-sm-right > .object-wrap-body { - right: 0; - } - .bodywebsite .object-wrap-sm-left > .object-wrap-body { - left: 0; - } -} -@media (max-width: 767px) { - .bodywebsite .object-wrap-body { - position: relative; - overflow: hidden; - min-height: 300px; - width: 100%; - } - .bodywebsite .object-wrap-body > img { - position: absolute; - min-width: 100%; - max-width: none; - height: auto; - max-height: none; - top: 20%; - left: 50%; - transform: translate(-50%, -20%); - } -} -@media (min-width: 768px) { - .bodywebsite .object-wrap-body { - overflow: hidden; - position: absolute; - top: 0; - bottom: 0; - width: 100vw; - min-width: 1px; - max-width: none; - height: 100%; - min-height: 100%; - max-height: none; - margin: 0; - background: inherit; - z-index: 0; - } - .bodywebsite .object-wrap-body > img { - position: relative; - height: auto; - min-height: 100.5%; - width: auto; - min-width: 102%; - max-width: none; - left: 50%; - transform: translateX(-50%); - } - .bodywebsite .object-wrap-body + * { - margin-top: 0; - } -} -@media (min-width: 768px) { - .bodywebsite .sm-width-c6 { - width: calc(50vw); - } -} -@media (min-width: 992px) { - .bodywebsite .md-width-c7d20 { - width: calc(150vw); - } -} -@media (min-width: 1200px) { - .bodywebsite .md-width-c7d20 { - width: calc(167.5vw); - } -} -@media (min-width: 992px) { - .bodywebsite .md-width-c5dm20 { - width: calc(-50vw); - } -} -@media (min-width: 1200px) { - .bodywebsite .md-width-c5dm20 { - width: calc(-67.5vw); - } -} -.bodywebsite .bg-wrap { - position: relative; -} -.bodywebsite .bg-wrap:before { - content: ''; - position: absolute; - top: 0; - bottom: 0; - width: 120vw; - left: 50%; - transform: translateX(-50%); - background: inherit; - z-index: -1; -} -.bodywebsite .bg-wrap-sm-left { - z-index: 1; -} -@media (min-width: 992px) { - .bodywebsite .bg-wrap-sm-left:before { - width: 100vw; - right: 0; - transform: none; - } -} -.bodywebsite .bg-wrap-sm-right { - z-index: 1; -} -@media (min-width: 992px) { - .bodywebsite .bg-wrap-sm-right:before { - width: 100vw; - left: 0; - transform: none; - } -} -@media (min-width: 576px) { - .bodywebsite .wrap-justify { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: space-around; - -ms-flex-pack: distribute; - justify-content: space-around; - } - .bodywebsite .wrap-justify > * + * { - margin-top: 0; - } -} -@media (min-width: 768px) { - .bodywebsite .wrap-justify { - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - } -} -@media (min-width: 1200px) { - .bodywebsite .wrap-justify { - padding-right: 30px; - } -} -.bodywebsite .link-wrap { - line-height: 1; -} -.bodywebsite .link-wrap a { - display: inline; - line-height: 1; -} -.bodywebsite [class*='bg-decoration-wrap'] { - position: relative; - overflow: hidden; -} -.bodywebsite [class*='bg-decoration-wrap'] .bg-decoration-content { - position: relative; - z-index: 2; -} -.bodywebsite [class*='bg-decoration-wrap'] .bg-decoration-object { - top: 0; - bottom: auto; -} -.bodywebsite .bg-decoration-bottom .bg-decoration-object { - top: auto; - bottom: 0; -} -@media (min-width: 768px) { - .bodywebsite .bg-decoration-wrap-sm .bg-decoration-object { - height: 50%; - position: absolute; - right: 0; - left: 0; - } - .bodywebsite .bg-decoration-bottom-sm .bg-decoration-object { - height: 34%; - } -} -@media (min-width: 1200px) { - .bodywebsite .bg-decoration-object { - height: 50%; - position: absolute; - right: 0; - left: 0; - } - .bodywebsite .bg-decoration-bottom-mod .bg-decoration-object { - height: 45%; - } -} -.bodywebsite .divider-fullwidth { - height: 1px; - width: 100%; -} -.bodywebsite .hr { - border: none; - height: 1px; - width: 100%; -} -.bodywebsite .tabs-custom .nav-tabs { - display: block; - word-spacing: 0; - border: 0; -} -.bodywebsite .tabs-custom .nav-tabs:before, -.bodywebsite .tabs-custom .nav-tabs:after { - display: none; -} -.bodywebsite .tabs-custom .nav-tabs .nav-item { - float: none; - border: 0; - cursor: pointer; - transition: .33s all ease; -} -.bodywebsite .tabs-custom .nav-tabs .nav-item .nav-link.active { - cursor: default; - border: 0; -} -.bodywebsite .tabs-custom .nav-tabs .nav-link { - margin: 0; - border: 0; -} -.bodywebsite * + .tabs-custom { - margin-top: 35px; -} -@media (min-width: 992px) { - .bodywebsite * + .tabs-custom { - margin-top: 50px; - } -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs, -.bodywebsite .tabs-custom.tabs-line .nav-tabs, -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs { - font-size: 0; - line-height: 0; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs { - border: 1px solid #dedede; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs li { - margin: -1px 0; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link { - padding: 8px 10px; - font: 700 11px/18px "Roboto", Helvetica, Arial, sans-serif; - color: #000; - background: transparent; - border-bottom: 1px solid #dedede; - text-align: center; - vertical-align: middle; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:after { - font: 400 17px 'Material Design Icons'; - color: transparent; - position: relative; - top: -12px; - display: inline-block; - margin-left: 5px; - content: '\f236'; - vertical-align: middle; - transition: .33s all ease; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:first-child { - border-top: 1px solid #dedede; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .active.nav-link { - color: #fff; - background: #3a3c3e; - border-color: #3a3c3e; -} -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:hover:after, -.bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .active.nav-link:after { - top: -1px; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .tabs-custom.tabs-corporate .tab-content { - padding: 22px 0 0; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item, -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item { - margin: 0; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item + .nav-item, -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item + .nav-item { - margin-top: -1px; -} -.bodywebsite .tabs-custom.tabs-line .tab-content, -.bodywebsite .tabs-custom.tabs-minimal .tab-content { - padding: 22px 0 0; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link { - font: 400 11px/16px "Roboto", Helvetica, Arial, sans-serif; - letter-spacing: -0.05em; - text-transform: uppercase; - color: #9b9b9b; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .active.nav-link { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link { - font: 700 11px/24px "Roboto", Helvetica, Arial, sans-serif; - color: #000; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .active.nav-link { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs { - text-align: center; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item { - display: block; - margin: 0 -1px; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link { - padding: 8px 15px; - border: 1px solid #e5e7e9; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link:last-child { - margin-right: 0; - border-bottom-width: 1px; -} -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .active.nav-link { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs { - text-align: center; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item { - display: block; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link { - padding: 7px 15px; - border: 1px solid #e5e7e9; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link:last-child { - border-bottom-width: 1px; -} -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .active.nav-link { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -@media (min-width: 768px) { - .bodywebsite .tabs-custom.tabs-line .nav-item, - .bodywebsite .tabs-custom.tabs-minimal .nav-item { - margin: 0; - } - .bodywebsite .tabs-custom.tabs-line .nav-tabs .nav-item .nav-link { - font-size: 14px; - line-height: 24px; - } - .bodywebsite .tabs-custom.tabs-minimal .nav-tabs .nav-item .nav-link { - font-size: 14px; - line-height: 24px; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - width: 100%; - text-align: left; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link { - position: relative; - z-index: 10; - display: inline-block; - border: 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item + .nav-item, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item + .nav-item { - margin-top: 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .tab-content, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .tab-content { - padding: 40px 0 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-item, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-link { - display: block; - border: 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs { - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - border-bottom: 2px solid #e5e7e9; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link { - padding: 8px 0 8px 0; - margin: 0 30px 0 0; - font-weight: 700; - background: transparent; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link:after { - content: ''; - position: absolute; - left: 0; - right: 100%; - bottom: -1px; - border-bottom: 2px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - opacity: 0; - visibility: hidden; - transition: .33s all ease; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .nav-link:hover, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .active.nav-link { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-line .nav-tabs .nav-item .active.nav-link:after { - right: 0; - opacity: 1; - visibility: visible; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs { - margin-top: -10px; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item { - display: inline-block; - margin: 10px 15px 0 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link { - position: relative; - bottom: -1px; - z-index: 10; - display: inline-block; - padding: 0 0 5px 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link:after { - content: ''; - position: absolute; - left: 0; - right: 100%; - bottom: 0; - border-bottom: 2px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - opacity: 0; - visibility: hidden; - transition: .33s all ease; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link:last-child { - margin-right: 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .nav-link:hover, - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .active.nav-link { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-minimal .nav-tabs .nav-item .active.nav-link:after { - right: 0; - opacity: 1; - visibility: visible; - } -} -.bodywebsite .tabs-vertical .nav-tabs { - position: relative; -} -.bodywebsite .tabs-vertical .nav-tabs > .nav-item { - z-index: 10; - display: block; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs { - width: 100%; -} -.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item { - display: block; -} -.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link { - position: relative; - padding: 8px 10px; -} -.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-vertical.tabs-corporate .nav-tabs .nav-item .active.nav-link { - border-color: #3a3c3e; -} -.bodywebsite .tabs-vertical.tabs-corporate .tab-content { - padding: 30px 0 0; -} -.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs { - border-right: 1px solid #ddd; -} -.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item .nav-link { - position: relative; - right: -1px; - padding: 0 16px 0 0; - text-align: right; - border-right: 1px solid transparent; - background-color: transparent; -} -.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item .nav-link:hover, -.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item .nav-link.resp-tab-active { - border-right-color: #00030a; -} -.bodywebsite .tabs-vertical.tabs-minimal .nav-tabs .nav-item + .nav-item { - margin-top: 16px; -} -@media (min-width: 768px) { - .bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link { - font-size: 16px; - line-height: 26px; - } - .bodywebsite .tabs-custom.tabs-corporate .nav-tabs .nav-item .nav-link:after { - font-size: 25px; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs { - position: relative; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-item { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .nav-tabs .nav-item .nav-link { - display: block; - padding: 21px 10px 19px; - } - .bodywebsite .tabs-custom.tabs-horizontal.tabs-corporate .tab-content { - padding: 30px 0 0; - } - .bodywebsite .tabs-custom.tabs-vertical { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: flex-start; - -ms-flex-align: start; - align-items: flex-start; - } - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column; - -ms-flex-direction: column; - flex-direction: column; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - max-width: 50%; - } - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item { - width: 100%; - } - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .nav-link { - text-align: left; - } - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .nav-link:hover, - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .active.nav-link { - border-color: #3a3c3e; - } - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .nav-link:hover:after, - .bodywebsite .tabs-custom.tabs-vertical .nav-tabs .nav-item .active.nav-link:after { - right: 15px; - } - .bodywebsite .tabs-custom.tabs-vertical .tab-content { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs { - width: auto; - min-width: 240px; - border-width: 0 0 1px 0; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item { - margin: 0; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link { - padding: 23px 44px 22px 30px; - border-width: 1px 0 0 0; - text-align: left; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link:after { - position: absolute; - top: 50%; - transform: translateY(-50%); - right: 26px; - content: '\f238'; - transition: .33s all ease; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .nav-link:hover:after, - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs .nav-item .active.nav-link:after { - right: 15px; - top: 50%; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .tab-content { - padding: 0 0 0 30px; - margin-top: -5px; - } -} -@media (min-width: 992px) { - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .nav-tabs { - min-width: 300px; - } - .bodywebsite .tabs-custom.tabs-vertical.tabs-corporate .tab-content { - padding: 0 0 0 44px; - } -} -.bodywebsite .card-group.card-group-custom { - margin-bottom: 0; -} -.bodywebsite .card-group.card-group-custom .card-heading + .card-collapse > .card-body, -.bodywebsite .card-group.card-group-custom .card-heading + .card-collapse > .list-group { - border-top: 0; -} -.bodywebsite .card-group.card-group-custom .card + .card { - margin-top: 0; -} -.bodywebsite .card-group.card-group-corporate .card + .card { - margin-top: 30px; -} -.bodywebsite .card-custom { - margin: 0; - background: inherit; - border: 0; - border-radius: 0; - box-shadow: none; -} -.bodywebsite .card-custom a { - display: block; -} -.bodywebsite .card-custom .card-heading { - padding: 0; - border-bottom: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.bodywebsite .card-custom .card-body { - padding: 0; - border: 0; -} -.bodywebsite * + .card-group-custom { - margin-top: 35px; -} -@media (min-width: 768px) { - .bodywebsite * + .card-group-custom { - margin-top: 50px; - } -} -.bodywebsite .card-light:first-child .card-title { - border-top: 1px solid #dedede; -} -.bodywebsite .card-light .card-title { - border-bottom: 1px solid #dedede; -} -.bodywebsite .card-light .card-title:nth-child(n + 2) { - margin-top: -1px; -} -.bodywebsite .card-light .card-title a { - position: relative; - padding: 24px 55px 22px 32px; - font: 500 18px/24px "Roboto", Helvetica, Arial, sans-serif; - color: #000; - transition: 1.5s all ease; -} -.bodywebsite .card-light .card-title a .card-arrow:after { - opacity: 0; - visibility: hidden; -} -.bodywebsite .card-light .card-title a.collapsed .card-arrow:after { - opacity: 1; - visibility: visible; -} -.bodywebsite .card-light .card-arrow { - position: absolute; - top: 50%; - transform: translateY(-50%); - right: 26px; - transition: .33s; - will-change: transform; -} -.bodywebsite .card-light .card-arrow:before, -.bodywebsite .card-light .card-arrow:after { - content: ''; - position: absolute; - top: 50%; - transform: translateY(-50%); - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .card-light .card-arrow:before { - width: 14px; - height: 2px; - right: 0; -} -.bodywebsite .card-light .card-arrow:after { - width: 2px; - height: 14px; - right: 6px; - transition: .2s all ease; -} -.bodywebsite .card-light .card-collapse { - position: relative; - margin-top: -1px; - border-bottom: 1px solid #dedede; - color: #9f9f9f; - will-change: transform; -} -.bodywebsite .card-light .card-body { - padding: 25px 44px 25px 32px; -} -@media (max-width: 767px) { - .bodywebsite .card-light .card-title a, - .bodywebsite .card-light .card-body { - padding-left: 15px; - } -} -.bodywebsite .card-corporate .card-title a, -.bodywebsite .card-corporate .card-collapse { - background: #fff; - box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12); -} -.bodywebsite .card-corporate .card-collapse.in { - box-shadow: -1px 0 5px 0 rgba(65, 65, 65, 0.12); -} -.bodywebsite .card-corporate .card-collapse.in:before { - content: ''; - position: absolute; - top: -1px; - height: 1px; - background: #ededed; - left: 0; - width: 100%; -} -.bodywebsite .card-corporate .card-title a { - position: relative; - z-index: 1; - padding: 24px 82px 22px 32px; - font: 500 18px/24px "Roboto", Helvetica, Arial, sans-serif; - color: #000; - transition: 1.3s all ease; - letter-spacing: -0.025em; - border-radius: 6px 6px 0 0; -} -.bodywebsite .card-corporate .card-title a .card-arrow:after { - opacity: 0; - visibility: hidden; -} -.bodywebsite .card-corporate .card-title a.collapsed { - border-radius: 6px; -} -.bodywebsite .card-corporate .card-title a.collapsed .card-arrow { - border-radius: 0 6px 6px 0; -} -.bodywebsite .card-corporate .card-title a.collapsed .card-arrow:after { - opacity: 1; - visibility: visible; -} -.bodywebsite .card-corporate .card-arrow { - position: absolute; - top: 0; - bottom: 0; - right: 0; - z-index: 2; - width: 70px; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-radius: 0 6px 0 0; - transition: 1.3s all ease; -} -.bodywebsite .card-corporate .card-arrow:before, -.bodywebsite .card-corporate .card-arrow:after { - content: ''; - position: absolute; - top: 50%; - z-index: 4; - transform: translateY(-50%); - background: #fff; -} -.bodywebsite .card-corporate .card-arrow:before { - width: 14px; - height: 2px; - right: 28px; -} -.bodywebsite .card-corporate .card-arrow:after { - width: 2px; - height: 14px; - right: 34px; -} -.bodywebsite .card-corporate .card-collapse { - position: relative; - z-index: 2; - color: #9f9f9f; - border-radius: 0 0 6px 6px; -} -.bodywebsite .card-corporate .card-body { - padding: 25px 44px 25px 32px; -} -@media (max-width: 767px) { - .bodywebsite .card-corporate .card-title a, - .bodywebsite .card-corporate .card-body { - padding-left: 25px; - } -} -.bodywebsite .card-lg { - position: relative; - padding: 50px 15px; -} -.bodywebsite .card-lg:before { - content: ''; - position: absolute; - top: -45px; - left: 50%; - width: 55px; - height: 55px; - margin-left: -10px; - background: #fff; - transform: translateX(-50%) rotate(-45deg); -} -@media (min-width: 768px) { - .bodywebsite .card-lg { - padding: 90px 35px 100px; - } -} -.bodywebsite table { - background-color: transparent; -} -.bodywebsite caption { - padding-top: 17px 25px 18px; - padding-bottom: 17px 25px 18px; - color: #dedede; - text-align: left; -} -.bodywebsite th { - text-align: left; -} -.bodywebsite .table { - width: 100%; - max-width: 100%; - margin-bottom: 0; - color: #00030a; -} -.bodywebsite .table > thead > tr > th, -.bodywebsite .table > thead > tr > td, -.bodywebsite .table > tbody > tr > th, -.bodywebsite .table > tbody > tr > td, -.bodywebsite .table > tfoot > tr > th, -.bodywebsite .table > tfoot > tr > td { - line-height: 1.71429; - vertical-align: top; - border-top: 0; -} -.bodywebsite .table > tbody > tr > th, -.bodywebsite .table > tbody > tr > td, -.bodywebsite .table > tfoot > tr > th, -.bodywebsite .table > tfoot > tr > td { - padding: 17px 25px 18px; - line-height: 1.71429; - vertical-align: top; - border-bottom: 1px solid #d9d9d9; -} -.bodywebsite .table > thead > tr > th { - font-family: "Playfair Display", Helvetica, Arial, sans-serif; - font-size: 16px; - font-weight: 700; - padding: 26px 25px; - vertical-align: bottom; - background: #f6f7fa; - border-bottom: 0; -} -@media (min-width: 576px) { - .bodywebsite .table > thead > tr > th { - padding: 34px 25px 29px; - } -} -.bodywebsite .table > tfoot > tr > td { - font-weight: 700; -} -.bodywebsite .table > caption + thead > tr:first-child > th, -.bodywebsite .table > caption + thead > tr:first-child > td, -.bodywebsite .table > colgroup + thead > tr:first-child > th, -.bodywebsite .table > colgroup + thead > tr:first-child > td, -.bodywebsite .table > thead:first-child > tr:first-child > th, -.bodywebsite .table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.bodywebsite .table > tbody + tbody { - border-top: 0; -} -.bodywebsite .table .table { - background-color: #fff; -} -.bodywebsite .table-condensed > thead > tr > th, -.bodywebsite .table-condensed > thead > tr > td, -.bodywebsite .table-condensed > tbody > tr > th, -.bodywebsite .table-condensed > tbody > tr > td, -.bodywebsite .table-condensed > tfoot > tr > th, -.bodywebsite .table-condensed > tfoot > tr > td { - padding: 5px; -} -.bodywebsite .table-bordered { - border: 1px solid #d9d9d9; -} -.bodywebsite .table-bordered > thead > tr > th, -.bodywebsite .table-bordered > thead > tr > td, -.bodywebsite .table-bordered > tbody > tr > th, -.bodywebsite .table-bordered > tbody > tr > td, -.bodywebsite .table-bordered > tfoot > tr > th, -.bodywebsite .table-bordered > tfoot > tr > td { - border: 1px solid #d9d9d9; -} -.bodywebsite .table-bordered > thead > tr > th, -.bodywebsite .table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.bodywebsite .table-primary { - background: #fff; -} -.bodywebsite .table-primary thead > tr > th { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .table-striped > tbody > tr:nth-of-type(even) { - background-color: #f6f7fa; -} -.bodywebsite .table-striped > tbody > tr:nth-of-type(odd) { - background-color: #fff; -} -.bodywebsite .table-striped > tbody > tr > td { - border-bottom: 0; -} -.bodywebsite .table-hover > tbody > tr:hover { - background-color: #f6f7fa; -} -.bodywebsite table col[class*="col-"] { - position: static; - float: none; - display: table-column; -} -.bodywebsite table td[class*="col-"], -.bodywebsite table th[class*="col-"] { - position: static; - float: none; - display: table-cell; -} -.bodywebsite .table-active, -.bodywebsite .table-active > th, -.bodywebsite .table-active > td { - background-color: #f6f7fa; -} -.bodywebsite .table-hover .table-active:hover { - background-color: #e6e8f1; -} -.bodywebsite .table-hover .table-active:hover > td, -.bodywebsite .table-hover .table-active:hover > th { - background-color: #e6e8f1; -} -.bodywebsite .table-success, -.bodywebsite .table-success > th, -.bodywebsite .table-success > td { - background-color: #dff0d8; -} -.bodywebsite .table-hover .table-success:hover { - background-color: #d0e9c6; -} -.bodywebsite .table-hover .table-success:hover > td, -.bodywebsite .table-hover .table-success:hover > th { - background-color: #d0e9c6; -} -.bodywebsite .table-info, -.bodywebsite .table-info > th, -.bodywebsite .table-info > td { - background-color: #d9edf7; -} -.bodywebsite .table-hover .table-info:hover { - background-color: #c4e3f3; -} -.bodywebsite .table-hover .table-info:hover > td, -.bodywebsite .table-hover .table-info:hover > th { - background-color: #c4e3f3; -} -.bodywebsite .table-warning, -.bodywebsite .table-warning > th, -.bodywebsite .table-warning > td { - background-color: #fcf8e3; -} -.bodywebsite .table-hover .table-warning:hover { - background-color: #faf2cc; -} -.bodywebsite .table-hover .table-warning:hover > td, -.bodywebsite .table-hover .table-warning:hover > th { - background-color: #faf2cc; -} -.bodywebsite .table-danger, -.bodywebsite .table-danger > th, -.bodywebsite .table-danger > td { - background-color: #fe4a21; -} -.bodywebsite .table-hover .table-danger:hover { - background-color: #fe3508; -} -.bodywebsite .table-hover .table-danger:hover > td, -.bodywebsite .table-hover .table-danger:hover > th { - background-color: #fe3508; -} -.bodywebsite .table-responsive { - overflow-x: auto; - min-height: 0.01%; -} -@media (max-width: 575px) { - .bodywebsite .table-responsive { - width: 100%; - margin-bottom: 1.28571; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #d9d9d9; - } - .bodywebsite .table-responsive > .table { - margin-bottom: 0; - } - .bodywebsite .table-responsive > .table > thead > tr > th, - .bodywebsite .table-responsive > .table > thead > tr > td, - .bodywebsite .table-responsive > .table > tbody > tr > th, - .bodywebsite .table-responsive > .table > tbody > tr > td, - .bodywebsite .table-responsive > .table > tfoot > tr > th, - .bodywebsite .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .bodywebsite .table-responsive > .table-bordered { - border: 0; - } - .bodywebsite .table-responsive > .table-bordered > thead > tr > th:first-child, - .bodywebsite .table-responsive > .table-bordered > thead > tr > td:first-child, - .bodywebsite .table-responsive > .table-bordered > tbody > tr > th:first-child, - .bodywebsite .table-responsive > .table-bordered > tbody > tr > td:first-child, - .bodywebsite .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .bodywebsite .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .bodywebsite .table-responsive > .table-bordered > thead > tr > th:last-child, - .bodywebsite .table-responsive > .table-bordered > thead > tr > td:last-child, - .bodywebsite .table-responsive > .table-bordered > tbody > tr > th:last-child, - .bodywebsite .table-responsive > .table-bordered > tbody > tr > td:last-child, - .bodywebsite .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .bodywebsite .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .bodywebsite .table-responsive > .table-bordered > tbody > tr:last-child > th, - .bodywebsite .table-responsive > .table-bordered > tbody > tr:last-child > td, - .bodywebsite .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .bodywebsite .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -.bodywebsite .jumbotron-custom { - font-weight: 900; - font-size: 35px; - line-height: 1.2; - letter-spacing: .01em; -} -.bodywebsite .jumbotron-custom > span { - font-size: 31px; - line-height: 1.2; -} -@media (min-width: 768px) { - .bodywebsite .jumbotron-custom { - font-size: 45px; - } - .bodywebsite .jumbotron-custom > span { - font-size: 41px; - } -} -@media (min-width: 992px) { - .bodywebsite .jumbotron-custom { - font-size: 55px; - } - .bodywebsite .jumbotron-custom > span { - font-size: 51px; - } -} -@media (min-width: 1200px) { - .bodywebsite .jumbotron-custom { - font-size: 65px; - } - .bodywebsite .jumbotron-custom > span { - font-size: 61px; - } -} -.bodywebsite [class^="thin-icon-"]:before, -.bodywebsite [class*=" thin-icon-"]:before, -.bodywebsite .thin-ico { - font-family: "Thin Regular"; - font-weight: 400; - font-style: normal; - font-size: inherit; - text-transform: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.bodywebsite .thin-icon-volume-on:before { - content: '\e800'; -} -.bodywebsite .thin-icon-gift:before { - content: '\e801'; -} -.bodywebsite .thin-icon-cup:before { - content: '\e802'; -} -.bodywebsite .thin-icon-folder:before { - content: '\e803'; -} -.bodywebsite .thin-icon-dublicate:before { - content: '\e804'; -} -.bodywebsite .thin-icon-tag:before { - content: '\e805'; -} -.bodywebsite .thin-icon-chat:before { - content: '\e806'; -} -.bodywebsite .thin-icon-clock:before { - content: '\e807'; -} -.bodywebsite .thin-icon-microphone:before { - content: '\e808'; -} -.bodywebsite .thin-icon-map-marker:before { - content: '\e809'; -} -.bodywebsite .thin-icon-mobile:before { - content: '\e80a'; -} -.bodywebsite .thin-icon-cloud-charge:before { - content: '\e80b'; -} -.bodywebsite .thin-icon-resize:before { - content: '\e80c'; -} -.bodywebsite .thin-icon-cake:before { - content: '\e80d'; -} -.bodywebsite .thin-icon-case:before { - content: '\e80e'; -} -.bodywebsite .thin-icon-address:before { - content: '\e80f'; -} -.bodywebsite .thin-icon-phone-support:before { - content: '\e810'; -} -.bodywebsite .thin-icon-fullscreen:before { - content: '\e811'; -} -.bodywebsite .thin-icon-db:before { - content: '\e812'; -} -.bodywebsite .thin-icon-music:before { - content: '\e813'; -} -.bodywebsite .thin-icon-network:before { - content: '\e814'; -} -.bodywebsite .thin-icon-db-network:before { - content: '\e815'; -} -.bodywebsite .thin-icon-dropbox-upload:before { - content: '\e816'; -} -.bodywebsite .thin-icon-phone-call:before { - content: '\e817'; -} -.bodywebsite .thin-icon-briefcase-2:before { - content: '\e818'; -} -.bodywebsite .thin-icon-card:before { - content: '\e819'; -} -.bodywebsite .thin-icon-support:before { - content: '\e81a'; -} -.bodywebsite .thin-icon-pull:before { - content: '\e81b'; -} -.bodywebsite .thin-icon-desktop:before { - content: '\e81c'; -} -.bodywebsite .thin-icon-pass:before { - content: '\e81d'; -} -.bodywebsite .thin-icon-picture:before { - content: '\e81e'; -} -.bodywebsite .thin-icon-email:before { - content: '\e81f'; -} -.bodywebsite .thin-icon-push:before { - content: '\e820'; -} -.bodywebsite .thin-icon-house:before { - content: '\e821'; -} -.bodywebsite .thin-icon-download:before { - content: '\e822'; -} -.bodywebsite .thin-icon-storage:before { - content: '\e823'; -} -.bodywebsite .thin-icon-milk:before { - content: '\e824'; -} -.bodywebsite .thin-icon-external-right:before { - content: '\e825'; -} -.bodywebsite .thin-icon-email-open:before { - content: '\e826'; -} -.bodywebsite .thin-icon-planet:before { - content: '\e827'; -} -.bodywebsite .thin-icon-pointer:before { - content: '\e828'; -} -.bodywebsite .thin-icon-email-search:before { - content: '\e829'; -} -.bodywebsite .thin-icon-external-left:before { - content: '\e82a'; -} -.bodywebsite .thin-icon-shirt:before { - content: '\e82b'; -} -.bodywebsite .thin-icon-document-edit:before { - content: '\e82c'; -} -.bodywebsite .thin-icon-document-delete:before { - content: '\e82d'; -} -.bodywebsite .thin-icon-money:before { - content: '\e82e'; -} -.bodywebsite .thin-icon-eye:before { - content: '\e82f'; -} -.bodywebsite .thin-icon-settings:before { - content: '\e830'; -} -.bodywebsite .thin-icon-arrow-bottom-right:before { - content: '\e831'; -} -.bodywebsite .thin-icon-arrow-right:before { - content: '\e832'; -} -.bodywebsite .thin-icon-flag:before { - content: '\e833'; -} -.bodywebsite .thin-icon-star:before { - content: '\e834'; -} -.bodywebsite .thin-icon-calculator:before { - content: '\e835'; -} -.bodywebsite .thin-icon-safe:before { - content: '\e836'; -} -.bodywebsite .thin-icon-cart:before { - content: '\e837'; -} -.bodywebsite .thin-icon-bullhorn:before { - content: '\e838'; -} -.bodywebsite .thin-icon-anchor:before { - content: '\e839'; -} -.bodywebsite .thin-icon-globe:before { - content: '\e83a'; -} -.bodywebsite .thin-icon-statistics:before { - content: '\e83b'; -} -.bodywebsite .thin-icon-thumb-up:before { - content: '\e83c'; -} -.bodywebsite .thin-icon-headphones:before { - content: '\e83d'; -} -.bodywebsite .thin-icon-bell:before { - content: '\e83e'; -} -.bodywebsite .thin-icon-study:before { - content: '\e83f'; -} -.bodywebsite .thin-icon-cart-add:before { - content: '\e840'; -} -.bodywebsite .thin-icon-cart-delete:before { - content: '\e841'; -} -.bodywebsite .thin-icon-satelite:before { - content: '\e842'; -} -.bodywebsite .thin-icon-home:before { - content: '\e843'; -} -.bodywebsite .thin-icon-time:before { - content: '\e844'; -} -.bodywebsite .thin-icon-book:before { - content: '\e845'; -} -.bodywebsite .thin-icon-bookmark:before { - content: '\e846'; -} -.bodywebsite .thin-icon-key:before { - content: '\e847'; -} -.bodywebsite .thin-icon-timer:before { - content: '\e848'; -} -.bodywebsite .thin-icon-saturn:before { - content: '\e849'; -} -.bodywebsite .thin-icon-notes:before { - content: '\e84a'; -} -.bodywebsite .thin-icon-ambulance:before { - content: '\e84b'; -} -.bodywebsite .thin-icon-briefcase:before { - content: '\e84c'; -} -.bodywebsite .thin-icon-layers:before { - content: '\e84d'; -} -.bodywebsite .thin-icon-delivery:before { - content: '\e84e'; -} -.bodywebsite .thin-icon-tint:before { - content: '\e84f'; -} -.bodywebsite .thin-icon-trash:before { - content: '\e850'; -} -.bodywebsite .thin-icon-lightbulb:before { - content: '\e851'; -} -.bodywebsite .thin-icon-calendar:before { - content: '\e852'; -} -.bodywebsite .thin-icon-chart:before { - content: '\e853'; -} -.bodywebsite .thin-icon-documents:before { - content: '\e854'; -} -.bodywebsite .thin-icon-checklist:before { - content: '\e855'; -} -.bodywebsite .thin-icon-camera-web:before { - content: '\e856'; -} -.bodywebsite .thin-icon-camera:before { - content: '\e857'; -} -.bodywebsite .thin-icon-lock:before { - content: '\e858'; -} -.bodywebsite .thin-icon-umbrella:before { - content: '\e859'; -} -.bodywebsite .thin-icon-user:before { - content: '\e85a'; -} -.bodywebsite .thin-icon-love:before { - content: '\e85b'; -} -.bodywebsite .thin-icon-hanger:before { - content: '\e85c'; -} -.bodywebsite .thin-icon-car:before { - content: '\e85d'; -} -.bodywebsite .thin-icon-cloth:before { - content: '\e85e'; -} -.bodywebsite .thin-icon-box:before { - content: '\e85f'; -} -.bodywebsite .thin-icon-attachment:before { - content: '\e860'; -} -.bodywebsite .thin-icon-cd:before { - content: '\e861'; -} -.bodywebsite .thin-icon-love-broken:before { - content: '\e862'; -} -.bodywebsite .thin-icon-volume-off:before { - content: '\e863'; -} -.bodywebsite .slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} -.bodywebsite .counter { - font: 900 45px/45px "Roboto", Helvetica, Arial, sans-serif; - margin-bottom: 0; - color: #fff; -} -.bodywebsite .counter-bold { - font-weight: 700; -} -.bodywebsite .counter-k:after { - content: 'k'; -} -.bodywebsite * + .counter-title { - margin-top: 0; -} -.bodywebsite .countdown-default { - color: #000; -} -.bodywebsite .countdown-default .countdown-section { - position: relative; - display: inline-block; - min-width: 90px; - padding: 0 10px; - text-align: center; -} -.bodywebsite .countdown-default .countdown-section > * { - display: block; -} -.bodywebsite .countdown-default .countdown-section:after { - position: absolute; - top: 35%; - transform: translateY(-35%); - border-radius: 20px; - background: #000; -} -.bodywebsite .countdown-default .countdown-section:nth-last-child(n + 3):after { - content: ''; - right: -2px; - width: 5px; - height: 5px; -} -@media (max-width: 767px) { - .bodywebsite .countdown-default .countdown-section:last-child { - display: none; - } -} -.bodywebsite .countdown-default .countdown-amount { - font-family: Helvetica, Arial, sans-serif; - font-size: 30px; - font-weight: 900; - line-height: 1; -} -.bodywebsite .countdown-default .countdown-period { - margin-top: 10px; - font-size: 12px; - text-transform: uppercase; - letter-spacing: -0.025em; - color: rgba(0, 0, 0, 0.4); -} -.bodywebsite .countdown-default.countdown-inverse .countdown-section:after { - background: #fff; -} -.bodywebsite .countdown-default.countdown-inverse .countdown-period { - color: rgba(255, 255, 255, 0.4); -} -@media (min-width: 768px) { - .bodywebsite .countdown-default .countdown-section { - min-width: 150px; - } - .bodywebsite .countdown-default .countdown-section:not(:last-child):after { - content: ''; - top: 50%; - right: -5px; - transform: translateY(-50%); - width: 10px; - height: 10px; - } - .bodywebsite .countdown-default .countdown-amount { - font-size: 50px; - } - .bodywebsite .countdown-default .countdown-period { - font-size: 14px; - } -} -@media (min-width: 992px) { - .bodywebsite .countdown-default .countdown-section { - min-width: 200px; - } - .bodywebsite .countdown-default .countdown-amount { - font-size: 72px; - } -} -.bodywebsite .countdown-inverse { - color: #fff; -} -.bodywebsite .owl-carousel .animated { - -webkit-animation-duration: 1000ms; - animation-duration: 1000ms; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.bodywebsite .owl-carousel .owl-animated-in { - z-index: 0; -} -.bodywebsite .owl-carousel .owl-animated-out { - z-index: 1; -} -.bodywebsite .owl-carousel .fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -@-webkit-keyframes fadeOut { - 0% { - opacity: 1; - } - 100% { - opacity: 0; - } -} -@keyframes fadeOut { - 0% { - opacity: 1; - } - 100% { - opacity: 0; - } -} -.bodywebsite .owl-height { - -webkit-transition: height 500ms ease-in-out; - -moz-transition: height 500ms ease-in-out; - -ms-transition: height 500ms ease-in-out; - -o-transition: height 500ms ease-in-out; - transition: height 500ms ease-in-out; -} -.bodywebsite .owl-carousel { - display: none; - width: 100%; - -webkit-tap-highlight-color: transparent; - /* position relative and z-index fix webkit rendering fonts issue */ - position: relative; - z-index: 1; -} -.bodywebsite .owl-carousel .owl-stage { - position: relative; - -ms-touch-action: pan-Y; -} -.bodywebsite .owl-carousel .owl-stage:after { - content: "."; - display: block; - clear: both; - visibility: hidden; - line-height: 0; - height: 0; -} -.bodywebsite .owl-carousel .owl-stage-outer { - position: relative; - overflow: hidden; - /* fix for flashing background */ - -webkit-transform: translate3d(0px, 0px, 0px); -} -.bodywebsite .owl-carousel .owl-controls .owl-nav .owl-prev, -.bodywebsite .owl-carousel .owl-controls .owl-nav .owl-next, -.bodywebsite .owl-carousel .owl-controls .owl-dot { - cursor: pointer; - cursor: hand; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.bodywebsite .owl-carousel.owl-loaded { - display: block; -} -.bodywebsite .owl-carousel.owl-loading { - opacity: 0; - display: block; -} -.bodywebsite .owl-carousel.owl-hidden { - opacity: 0; -} -.bodywebsite .owl-carousel .owl-refresh .owl-item { - display: none; -} -.bodywebsite .owl-carousel .owl-item { - position: relative; - min-height: 1px; - float: left; - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.bodywebsite .owl-carousel.owl-text-select-on .owl-item { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.bodywebsite .owl-carousel .owl-grab { - cursor: move; - cursor: -webkit-grab; - cursor: grab; -} -.bodywebsite .owl-carousel.owl-rtl { - direction: rtl; -} -.bodywebsite .owl-carousel.owl-rtl .owl-item { - float: right; -} -.bodywebsite .no-js .owl-carousel { - display: block; -} -.bodywebsite .owl-carousel .owl-item .owl-lazy { - opacity: 0; - -webkit-transition: opacity 400ms ease; - -moz-transition: opacity 400ms ease; - -ms-transition: opacity 400ms ease; - -o-transition: opacity 400ms ease; - transition: opacity 400ms ease; -} -.bodywebsite .owl-carousel .owl-video-wrapper { - position: relative; - height: 100%; - background: #000; -} -.bodywebsite .owl-carousel .owl-video-play-icon { - position: absolute; - height: 80px; - width: 80px; - left: 50%; - top: 50%; - margin-left: -40px; - margin-top: -40px; - font: 400 40px/80px 'FontAwesome'; - cursor: pointer; - z-index: 1; - -webkit-transition: scale 100ms ease; - -moz-transition: scale 100ms ease; - -ms-transition: scale 100ms ease; - -o-transition: scale 100ms ease; - transition: scale 100ms ease; -} -.bodywebsite .owl-carousel .owl-video-play-icon:before { - content: '\f144'; -} -.bodywebsite .owl-carousel .owl-video-play-icon:hover { - -webkit-transform: scale(1.3); - transform: scale(1.3); -} -.bodywebsite .owl-carousel .owl-video-playing .owl-video-tn, -.bodywebsite .owl-carousel .owl-video-playing .owl-video-play-icon { - display: none; -} -.bodywebsite .owl-carousel .owl-video-tn { - opacity: 0; - height: 100%; - background-position: center center; - background-repeat: no-repeat; - -webkit-background-size: contain; - -moz-background-size: contain; - -o-background-size: contain; - background-size: contain; - -webkit-transition: opacity 400ms ease; - -moz-transition: opacity 400ms ease; - -ms-transition: opacity 400ms ease; - -o-transition: opacity 400ms ease; - transition: opacity 400ms ease; -} -.bodywebsite .owl-carousel .owl-video-frame { - position: relative; - z-index: 1; -} -.bodywebsite .owl-carousel .owl-stage { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.bodywebsite .owl-carousel .owl-item { - float: none; - display: -webkit-inline-box; - display: -webkit-inline-flex; - display: -ms-inline-flexbox; - display: inline-flex; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.bodywebsite .owl-carousel .item { - width: 100%; -} -.bodywebsite .owl-carousel-center .owl-item { - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} -.bodywebsite .owl-carousel-center .owl-stage { - -webkit-justify-content: space-around; - -ms-flex-pack: distribute; - justify-content: space-around; -} -.bodywebsite .owl-prev, -.bodywebsite .owl-next { - position: absolute; - top: 50%; - transform: translateY(-50%); - color: #000; - transition: .22s; -} -.bodywebsite .owl-prev.disabled, -.bodywebsite .owl-next.disabled { - opacity: 0; -} -.bodywebsite .owl-prev:hover, -.bodywebsite .owl-next:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .owl-prev { - left: 0; -} -.bodywebsite .owl-prev:before { - content: '\e5c4'; -} -.bodywebsite .owl-next { - right: 0; -} -.bodywebsite .owl-next:before { - content: '\e5c8'; -} -.bodywebsite .owl-dots { - text-align: center; -} -.bodywebsite .owl-dot { - display: inline-block; -} -.bodywebsite .owl-numbering-default { - padding-bottom: 15px; -} -.bodywebsite .owl-numbering-default > * { - display: inline-block; -} -.bodywebsite .owl-numbering-default .numbering-current { - min-width: 16px; - font: 700 25px "Roboto", Helvetica, Arial, sans-serif; - color: #000; - transition: .33s all ease; -} -.bodywebsite .owl-numbering-default .numbering-separator { - position: relative; - display: inline-block; - margin: 0 10px; -} -.bodywebsite .owl-numbering-default .numbering-separator:after { - position: absolute; - top: -23px; - left: -12px; - content: ''; - width: 2px; - height: 51px; - transform-origin: 50% 75%; - transform: rotate(30deg); - background: rgba(0, 0, 0, 0.3); -} -.bodywebsite .owl-numbering-default .numbering-count { - position: relative; - top: 19px; - left: -7px; - font: 400 18px "Roboto", Helvetica, Arial, sans-serif; - color: rgba(0, 0, 0, 0.3); -} -.bodywebsite .owl-carousel-inverse .owl-next, -.bodywebsite .owl-carousel-inverse .owl-prev { - color: #fff; -} -.bodywebsite .owl-carousel-inverse .owl-next:hover, -.bodywebsite .owl-carousel-inverse .owl-prev:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .owl-carousel-inverse .owl-numbering-default .numbering-current { - color: #fff; -} -.bodywebsite .owl-carousel-inverse .owl-numbering-default .numbering-separator:after { - background: rgba(255, 255, 255, 0.3); -} -.bodywebsite .owl-carousel-inverse .owl-numbering-default .numbering-count { - color: rgba(255, 255, 255, 0.3); -} -.bodywebsite .owl-carousel-dark .owl-next, -.bodywebsite .owl-carousel-dark .owl-prev { - color: #000; -} -.bodywebsite .owl-carousel-dark .owl-next:hover, -.bodywebsite .owl-carousel-dark .owl-prev:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .owl-nav-position-numbering .owl-next, -.bodywebsite .owl-nav-position-numbering .owl-prev { - top: auto; - bottom: -53px; - transform: none; -} -.bodywebsite .owl-nav-position-numbering .owl-prev { - left: auto; - right: calc(92%); -} -.bodywebsite .owl-nav-position-numbering .owl-next { - right: auto; - left: calc(92%); -} -.bodywebsite .owl-nav-position-numbering + .owl-numbering { - margin-top: 15px; -} -.bodywebsite .owl-nav-bottom-left .owl-nav { - margin-top: 15px; -} -.bodywebsite .owl-nav-bottom-left .owl-next, -.bodywebsite .owl-nav-bottom-left .owl-prev { - display: inline-block; - position: static; - top: auto; - transform: none; -} -.bodywebsite .owl-nav-bottom-left .owl-prev { - left: auto; -} -.bodywebsite .owl-nav-bottom-left .owl-next { - right: auto; - margin-left: 10px; -} -.bodywebsite .owl-style-minimal .item { - width: 100%; -} -.bodywebsite .owl-style-minimal .item img { - width: 100%; -} -.bodywebsite .owl-style-minimal .owl-dots { - margin-top: 10px; - text-align: center; -} -.bodywebsite .owl-style-minimal .owl-dot { - width: 8px; - height: 8px; - border-radius: 10px; - background: #dedede; - transition: .33s all ease; -} -.bodywebsite .owl-style-minimal .owl-dot.active, -.bodywebsite .owl-style-minimal .owl-dot:hover { - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .owl-style-minimal .owl-dot + .owl-dot { - margin-left: 8px; -} -.bodywebsite .owl-style-minimal-inverse .owl-dot { - background: #74787C; -} -@media (min-width: 992px) { - .bodywebsite .owl-spacing-1 { - padding-right: 60px; - padding-left: 60px; - } -} -@media (min-width: 1200px) { - .bodywebsite .owl-spacing-1 { - padding: 0; - } - .bodywebsite .owl-spacing-1 .owl-item { - padding-right: 41px; - padding-left: 41px; - } - .bodywebsite .owl-spacing-1 .owl-prev { - left: -6%; - } - .bodywebsite .owl-spacing-1 .owl-next { - right: -6%; - } -} -.bodywebsite .owl-nav-classic .owl-nav { - display: none; -} -@media (min-width: 992px) { - .bodywebsite .owl-nav-classic .owl-dots { - display: none !important; - } - .bodywebsite .owl-nav-classic .owl-nav { - display: block; - } - .bodywebsite .owl-nav-classic .owl-nav .owl-prev, - .bodywebsite .owl-nav-classic .owl-nav .owl-next { - top: 39%; - transform: translateY(-45%); - width: 45px; - height: 45px; - line-height: 45px; - color: #fff; - background: rgba(255, 255, 255, 0.2); - text-align: center; - font: 400 20px/45px 'fl-flat-icons-set-2'; - } - .bodywebsite .owl-nav-classic .owl-nav .owl-prev:hover, - .bodywebsite .owl-nav-classic .owl-nav .owl-next:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - } - .bodywebsite .owl-nav-classic .owl-nav .owl-prev { - padding-right: 3px; - } - .bodywebsite .owl-nav-classic .owl-nav .owl-prev:before { - position: relative; - display: inline-block; - content: '\e015'; - transform: scale(-1, 1); - } - .bodywebsite .owl-nav-classic .owl-nav .owl-next { - padding-left: 3px; - } - .bodywebsite .owl-nav-classic .owl-nav .owl-next:before { - content: '\e015'; - } -} -.bodywebsite .owl-nav-modern .owl-nav { - display: none; -} -@media (min-width: 1400px) { - .bodywebsite .owl-nav-modern .owl-dots { - display: none !important; - } - .bodywebsite .owl-nav-modern .owl-nav { - display: block; - } - .bodywebsite .owl-nav-modern .owl-nav .owl-prev, - .bodywebsite .owl-nav-modern .owl-nav .owl-next { - top: 50%; - width: 48px; - height: 48px; - background: url("medias/image/ref; ?>/chevron-left.svg") no-repeat top left; - background-size: 48px 48px; - transition: 180ms ease-in-out; - } - .bodywebsite .owl-nav-modern .owl-nav .owl-prev:before, - .bodywebsite .owl-nav-modern .owl-nav .owl-next:before { - content: ''; - } - .bodywebsite .owl-nav-modern .owl-nav .owl-prev:hover, - .bodywebsite .owl-nav-modern .owl-nav .owl-next:hover { - opacity: 0.5; - } - .bodywebsite .owl-nav-modern .owl-nav .owl-prev { - left: -58px; - } - .bodywebsite .owl-nav-modern .owl-nav .owl-next { - right: -50px; - } - .bodywebsite .owl-nav-modern .owl-nav .owl-next { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); - } -} -@-webkit-keyframes rd-navbar-slide-down { - 0% { - transform: translateY(-100%); - } - 100% { - transform: translateY(0); - } -} -@keyframes rd-navbar-slide-down { - 0% { - transform: translateY(-100%); - } - 100% { - transform: translateY(0); - } -} -@-webkit-keyframes rd-navbar-slide-up { - 0% { - transform: translateY(0); - } - 100% { - transform: translateY(-100%); - } -} -@keyframes rd-navbar-slide-up { - 0% { - transform: translateY(0); - } - 100% { - transform: translateY(-100%); - } -} -.bodywebsite .rd-navbar-wrap, -.bodywebsite .rd-navbar-static .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu, -.bodywebsite .rd-navbar-static .rd-navbar-inner, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-wrap, -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu, -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-group, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-group, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search { - transition: 0.3s all cubic-bezier(0.785, 0.135, 0.15, 0.86); -} -.bodywebsite .rd-navbar, -.bodywebsite .rd-navbar.rd-navbar--is-clone { - display: none; -} -.bodywebsite .rd-navbar-fixed, -.bodywebsite .rd-navbar-static, -.bodywebsite .rd-navbar-fullwidth, -.bodywebsite .rd-navbar-sidebar { - display: block; -} -.bodywebsite .rd-navbar--no-transition, -.bodywebsite .rd-navbar--no-transition * { - transition: none !important; -} -.bodywebsite .rd-navbar-wrap { - position: relative; - z-index: 10; -} -.bodywebsite .rd-navbar-wrap, -.bodywebsite .rd-navbar, -.bodywebsite .rd-navbar-brand, -.bodywebsite .rd-navbar-slogan, -.bodywebsite .rd-navbar-dropdown, -.bodywebsite .rd-navbar-megamenu, -.bodywebsite .rd-navbar-collapse-items, -.bodywebsite .brand-name, -.bodywebsite .rd-navbar-nav, -.bodywebsite .rd-navbar-panel, -.bodywebsite .rd-navbar-search-form-input, -.bodywebsite .rd-navbar-search-form-submit, -.bodywebsite .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-live-search-results, -.bodywebsite .rd-navbar-search-form { - transition: 0.33s all ease-out; -} -.bodywebsite .rd-navbar-collapse-toggle { - display: inline-block; - position: relative; - width: 48px; - height: 48px; - line-height: 48px; - cursor: pointer; - color: #00030a; - display: none; -} -.bodywebsite .rd-navbar-collapse-toggle span { - top: 50%; - margin-top: -3px; -} -.bodywebsite .rd-navbar-collapse-toggle span, -.bodywebsite .rd-navbar-collapse-toggle span:before, -.bodywebsite .rd-navbar-collapse-toggle span:after { - position: absolute; - width: 6px; - height: 6px; - line-height: 6px; - text-align: center; - background: #00030a; - left: 50%; - margin-left: -3px; - border-radius: 50%; - transition: .3s all ease; -} -.bodywebsite .rd-navbar-collapse-toggle span:before, -.bodywebsite .rd-navbar-collapse-toggle span:after { - content: ''; -} -.bodywebsite .rd-navbar-collapse-toggle span:before { - bottom: 100%; - margin-bottom: 3px; -} -.bodywebsite .rd-navbar-collapse-toggle span:after { - top: 100%; - margin-top: 3px; -} -.bodywebsite .rd-navbar-collapse-toggle.active span { - transform: scale(0.7); -} -.bodywebsite .rd-navbar-collapse-toggle.active span:before { - transform: translateY(18px); -} -.bodywebsite .rd-navbar-collapse-toggle.active span:after { - transform: translateY(-18px); -} -.bodywebsite .rd-navbar--has-sidebar body { - padding-left: 270px; -} -.bodywebsite .rd-navbar--is-stuck { - border-bottom: 1px solid #e5e7e9; -} -.bodywebsite .rd-navbar.rd-navbar-fixed + .rd-navbar.rd-navbar--is-clone, -.bodywebsite .rd-navbar.rd-navbar-sidebar + .rd-navbar.rd-navbar--is-clone { - display: none; -} -.bodywebsite .rd-navbar { - display: none; - background: #fff; - box-shadow: none; -} -.bodywebsite .rd-navbar-toggle { - display: inline-block; - position: relative; - width: 48px; - height: 48px; - line-height: 48px; - cursor: pointer; - color: #000; - background-color: transparent; - border: none; - display: none; -} -.bodywebsite .rd-navbar-toggle span { - position: relative; - display: block; - margin: auto; - transition: .3s all ease; -} -.bodywebsite .rd-navbar-toggle span:after, -.bodywebsite .rd-navbar-toggle span:before { - content: ""; - position: absolute; - left: 0; - top: -8px; - transition: .3s all ease; -} -.bodywebsite .rd-navbar-toggle span:after { - top: 8px; -} -.bodywebsite .rd-navbar-toggle span:after, -.bodywebsite .rd-navbar-toggle span:before, -.bodywebsite .rd-navbar-toggle span { - width: 24px; - height: 4px; - background-color: #000; - backface-visibility: hidden; - border-radius: 2px; -} -.bodywebsite .rd-navbar-toggle span { - transform: rotate(180deg); -} -.bodywebsite .rd-navbar-toggle span:before, -.bodywebsite .rd-navbar-toggle span:after { - transform-origin: 1.71429px center; -} -.bodywebsite .rd-navbar-toggle.active span { - transform: rotate(360deg); -} -.bodywebsite .rd-navbar-toggle.active span:before, -.bodywebsite .rd-navbar-toggle.active span:after { - top: 0; - width: 15px; -} -.bodywebsite .rd-navbar-toggle.active span:before { - -webkit-transform: rotate3d(0, 0, 1, -40deg); - transform: rotate3d(0, 0, 1, -40deg); -} -.bodywebsite .rd-navbar-toggle.active span:after { - -webkit-transform: rotate3d(0, 0, 1, 40deg); - transform: rotate3d(0, 0, 1, 40deg); -} -.bodywebsite .rd-navbar-toggle:focus { - outline: none; -} -.bodywebsite .rd-navbar-brand { - transition: none !important; -} -.bodywebsite .rd-navbar-brand svg { - fill: #000; -} -.bodywebsite .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-search .rd-search-submit, -.bodywebsite .buttonwithnoborder { - background: none; - border: none; - display: inline-block; - padding: 0; - outline: none; - outline-offset: 0; - cursor: pointer; - -webkit-appearance: none; -} -.bodywebsite .rd-navbar-search .rd-navbar-search-toggle::-moz-focus-inner, -.bodywebsite .rd-navbar-search .rd-search-submit::-moz-focus-inner { - border: none; - padding: 0; -} -.bodywebsite .rd-navbar-search .form-input::-ms-clear { - display: none; -} -.bodywebsite .rd-navbar-search-toggle { - display: inline-block; - width: 36px; - height: 36px; - text-align: center; - font: 400 18px/36px "FontAwesome"; -} -.bodywebsite .rd-navbar-search-toggle:before { - content: '\f002'; - position: absolute; - left: 0; - top: 0; -} -.bodywebsite .rd-navbar-search-toggle:after { - display: none; -} -.bodywebsite .rd-navbar-aside { - pointer-events: none; -} -.bodywebsite .rd-navbar-aside > * { - pointer-events: auto; -} -.bodywebsite .rd-navbar-aside-toggle { - display: none; - pointer-events: auto; -} -.bodywebsite .rd-navbar-static .rd-navbar-search-form-input input, -.bodywebsite .rd-navbar-sidebar .rd-navbar-search-form-input input, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-search-form-input input { - width: 100%; - padding: 0 10px; - font-size: 16px; -} -.bodywebsite .rd-navbar-static:after, -.bodywebsite .rd-navbar-fullwidth:after { - content: ''; - background: #fff; -} -.bodywebsite .rd-navbar-static .rd-navbar-brand, -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-brand, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-search-toggle { - position: relative; - z-index: 2; -} -.bodywebsite .rd-navbar-static .rd-navbar-inner, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-inner { - position: relative; - max-width: 1200px; - padding-left: 15px; - padding-right: 15px; - margin-left: auto; - margin-right: auto; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a { - position: relative; - padding: 5px 0; - font-size: 13px; - line-height: 1.2; - color: #00030a; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a .label, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a .label { - position: absolute; - left: 0; - margin: -18px 0 0 0; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-static .rd-navbar-nav > li > a, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a { - font-size: 14px; - } -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li.active > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.active > a { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li.focus > a, -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.focus > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav .rd-navbar-submenu > .rd-navbar-megamenu { - opacity: 0; - visibility: hidden; - font-size: 14px; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav .rd-navbar-submenu.focus, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav .rd-navbar-submenu.focus { - opacity: 1; - visibility: visible; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu > .rd-navbar-megamenu { - transform: translateY(30px); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.opened > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu.focus > .rd-navbar-megamenu { - transform: translateY(0); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu > .rd-navbar-dropdown { - transform: translateX(-20px); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown { - transform: translateX(0); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > .rd-navbar-submenu .rd-navbar-submenu.opened > .rd-navbar-dropdown { - display: block; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li { - display: inline-block; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav li.rd-navbar--has-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.rd-navbar--has-dropdown { - position: relative; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav li.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav li.focus > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-static .rd-navbar-nav li.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-nav li.opened > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.focus > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.focus > .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav li.opened > .rd-navbar-megamenu { - opacity: 1; - visibility: visible; - transform: translateY(0); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > .rd-navbar-dropdown { - position: absolute; - left: 0; - z-index: 5; - display: block; - margin-top: 27px; - text-align: left; - background: #fff; -} -.bodywebsite .rd-navbar-static .rd-navbar-list li, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list li { - padding-left: 5px; - padding-right: 5px; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a { - position: relative; - display: block; - width: 100%; - padding-left: 0; - padding-right: 14px; - font-size: 14px; - line-height: 1.3; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:before, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:before, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:before, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:before { - transition: .33s all ease; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:before, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:before, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:before, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:before { - position: absolute; - top: 0; - left: -6px; - content: '\f105'; - font-family: 'FontAwesome'; - font-size: 16px; - line-height: inherit; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - opacity: 0; - visibility: hidden; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:hover { - padding-left: 14px; - padding-right: 0; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover:before, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:hover:before, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover:before, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:hover:before { - left: 0; - opacity: 1; - visibility: visible; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:focus, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:active, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:focus, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:active, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:focus, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:active, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:focus, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:active { - color: #9f9f9f; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover, -.bodywebsite .rd-navbar-static .rd-navbar-list > li > a:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li + li, -.bodywebsite .rd-navbar-static .rd-navbar-list > li + li, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li + li, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li + li { - margin-top: 14px; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a, - .bodywebsite .rd-navbar-static .rd-navbar-list > li > a, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li > a { - font-size: 16px; - } -} -@media (min-width: 1800px) { - .bodywebsite .rd-navbar-static .rd-navbar-dropdown > li + li, - .bodywebsite .rd-navbar-static .rd-navbar-list > li + li, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li + li, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-list > li + li { - margin-top: 17px; - } -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown, -.bodywebsite .rd-navbar-static .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu { - box-shadow: 0 0 13px 0 rgba(0, 0, 0, 0.13); - border-top: 2px solid maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown { - width: 188px; - padding: 25px 25px 30px; - margin-left: -32px; - background: #fff; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-static .rd-navbar-dropdown, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown { - width: 235px; - } -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown .rd-navbar-dropdown { - position: absolute; - left: 100%; - margin-left: 91px; - top: -20px; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a { - display: block; - width: 100%; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:focus, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:active, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:focus, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:active { - color: #9f9f9f; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.focus > a, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.opened > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.focus > a, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.opened > a { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; -} -.bodywebsite .rd-navbar-static .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu { - position: absolute; - z-index: 4; - display: table; - table-layout: fixed; - width: calc(70%); - left: 15px; - max-width: 1200px; - margin-top: 27px; - text-align: left; - background: #fff; -} -.bodywebsite .rd-navbar-static .rd-navbar-megamenu > li, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu > li { - position: relative; - display: table-cell; - padding: 34px 20px 30px 35px; -} -.bodywebsite .rd-navbar-static .rd-navbar-megamenu > li + li, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu > li + li { - border-left: 1px solid #ededed; -} -.bodywebsite .rd-navbar-static .rd-navbar-megamenu * + .rd-megamenu-header, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu * + .rd-megamenu-header { - margin-top: 40px; -} -.bodywebsite .rd-navbar-static .rd-navbar-megamenu * + .rd-navbar-list, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu * + .rd-navbar-list { - margin-top: 20px; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-static .rd-navbar-megamenu, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu { - width: 1140px; - } - .bodywebsite .rd-navbar-static .rd-navbar-megamenu > li, - .bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu > li { - padding: 44px 25px 50px 45px; - } -} -.bodywebsite .rd-navbar-static .rd-navbar-submenu-toggle, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-submenu-toggle { - display: none; - cursor: pointer; - z-index: 100; -} -.bodywebsite .rd-navbar-static .rd-navbar-submenu-toggle:hover, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-submenu-toggle:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > .rd-navbar-submenu-toggle { - display: none; - -webkit-align-self: center; - -ms-flex-item-align: center; - align-self: center; - width: 24px; - text-align: center; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > .rd-navbar-submenu-toggle::after { - content: '\f107'; - position: relative; - display: inline-block; - font: 400 16px "FontAwesome"; - text-align: center; - transition: 0.4s all ease; - z-index: 2; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - will-change: transform; - -webkit-filter: blur(0); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-static .rd-navbar-nav > li li.opened > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-static .rd-navbar-nav > li li > a:hover + .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li li.opened > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li li > a:hover + .rd-navbar-submenu-toggle::after { - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-static .rd-navbar-nav > li.opened > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-static .rd-navbar-nav > li > a:hover + .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li.opened > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li > a:hover + .rd-navbar-submenu-toggle::after { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown .rd-navbar-submenu-toggle, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown .rd-navbar-submenu-toggle { - display: none; - vertical-align: middle; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown .rd-navbar-submenu-toggle::after { - top: 1px; -} -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li.opened > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-static .rd-navbar-dropdown > li > a:hover + .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li.opened > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-dropdown > li > a:hover + .rd-navbar-submenu-toggle::after { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-clone, -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone { - display: none; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-clone.rd-navbar--is-stuck, -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone.rd-navbar--is-stuck { - display: block; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-stuck, -.bodywebsite .rd-navbar-static.rd-navbar--is-clone, -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-stuck, -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone { - position: fixed; - left: 0; - top: 0; - right: 0; - z-index: 999; - background: #fff; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-stuck .rd-navbar-megamenu, -.bodywebsite .rd-navbar-static.rd-navbar--is-clone .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-stuck .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-clone .rd-navbar-megamenu { - margin-top: 18px; -} -.bodywebsite .rd-navbar-static .rd-navbar-megamenu, -.bodywebsite .rd-navbar-fullwidth .rd-navbar-megamenu { - position: absolute; - transform: translateY(30px); - text-align: left; - visibility: hidden; - opacity: 0; -} -.bodywebsite .rd-navbar-static .rd-navbar--has-dropdown, -.bodywebsite .rd-navbar-fullwidth .rd-navbar--has-dropdown { - position: relative; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-toggle, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-toggle { - display: inline-block; - z-index: 9999; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-dropdown, -.bodywebsite .rd-navbar-sidebar .rd-navbar-dropdown { - display: block; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items { - position: absolute; - width: 260px; - padding: 25px 15px; - box-shadow: none; - color: #00030a; - background: #fff; - font-size: 16px; - line-height: 34px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items li > *, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items li > * { - vertical-align: middle; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items li + li, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items li + li { - margin-top: 10px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items .icon, -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items a, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items .icon, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items a { - display: inline-block; - font-size: 16px; - line-height: 30px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items .icon, -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse-items a[class*="fa"]:before, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items .icon, -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items a[class*="fa"]:before { - display: inline-block; - width: 30px; - height: 30px; - padding-right: 5px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav, -.bodywebsite .rd-navbar-sidebar { - width: 270px; - left: 0; - top: 0; - font-size: 16px; - line-height: 34px; - color: #00030a; - background: #fff; - z-index: 998; -} -.bodywebsite .rd-navbar-static-smooth .rd-navbar { - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 9999; -} -.bodywebsite .rd-navbar-static { - display: block; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li { - display: inline-block; -} -.bodywebsite .rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 10px; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search { - position: static; - z-index: 2; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search { - position: absolute; - top: -1px; - right: 4px; - bottom: 0; - left: 0; - z-index: 5; - opacity: 0; - visibility: hidden; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search-submit, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit { - width: 39px; - height: 39px; - line-height: 38px; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search-results-live, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search-results-live { - padding: 0; - border: 0; - background: #fff; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .rd-search-results-live > *, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .rd-search-results-live > * { - display: none; - padding: 16px; - border: 1px solid #e5e7e9; - border-top: 0; - border-radius: 0 0 3px 3px; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search .form-label, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search .form-label { - border: 0; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search.active .rd-search, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search.active .rd-search { - opacity: 1; - visibility: visible; - transition: .22s; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search.active .rd-search-results-live > *, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search.active .rd-search-results-live > * { - display: block; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search-wrap.active .rd-navbar-nav-inner, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search-wrap.active .rd-navbar-nav-inner { - position: relative; -} -.bodywebsite .rd-navbar-static.rd-navbar-default .rd-navbar-search.active + .rd-navbar-nav, -.bodywebsite .rd-navbar-static.rd-navbar-corporate-dark .rd-navbar-search.active + .rd-navbar-nav { - opacity: 0; - visibility: hidden; - pointer-events: none; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-clone { - display: block; - transform: translateY(-105%); - transition: .33s all ease; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-clone.rd-navbar--is-stuck { - transform: translateY(0); -} -.bodywebsite .rd-navbar-static.rd-navbar--is-clone .rd-navbar-inner, -.bodywebsite .rd-navbar-static.rd-navbar--is-stuck .rd-navbar-inner { - padding: 13px 30px; -} -.bodywebsite .rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav-wrap, -.bodywebsite .rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav-wrap { - margin-top: 0; -} -.bodywebsite .rd-navbar-fullwidth { - display: block; - text-align: center; -} -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav { - width: 100%; -} -.bodywebsite .rd-navbar-fullwidth .rd-navbar-nav > li + li { - margin-left: 20px; -} -.bodywebsite .rd-navbar-fullwidth.rd-navbar--is-stuck .rd-navbar-panel { - display: none; -} -.bodywebsite .rd-navbar-fixed { - display: block; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-brand { - position: fixed; - top: 10px; - left: 64px; - z-index: 17; - display: block; - overflow: hidden; - text-align: left; - white-space: nowrap; - text-overflow: ellipsis; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-brand .brand-slogan { - display: none; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-panel { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - position: fixed; - left: 0; - top: 0; - right: 0; - padding: 4px; - height: 56px; - color: #9f9f9f; - z-index: 999; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-panel:before { - content: ''; - position: absolute; - left: 0; - top: 0; - bottom: 0; - right: 0; - box-shadow: none; - border-bottom: 1px solid #e5e7e9; - background: #fff; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-toggle { - display: inline-block; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-wrap { - position: fixed; - top: -56px; - left: 0; - bottom: -56px; - z-index: 998; - width: 270px; - padding: 112px 0 56px; - color: #fff; - background: #fff; - border-right: 1px solid #e5e7e9; - transform: translateX(-105%); - pointer-events: none; - overflow: hidden; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-wrap.active { - transform: translateX(0); -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner { - position: relative; - z-index: 100000; - height: 100%; - padding: 10px 0 20px; - pointer-events: auto; - -webkit-overflow-scrolling: touch; - overflow-x: hidden; - overflow-y: auto; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner::-webkit-scrollbar { - width: 4px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner::-webkit-scrollbar-thumb { - background: white; - border: none; - border-radius: 0; - opacity: .2; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav-inner::-webkit-scrollbar-track { - background: #fff; - border: none; - border-radius: 0; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav { - display: block; - font-size: 16px; - line-height: 26px; - text-align: left; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li > a { - display: block; - font-size: 16px; - padding: 14px 56px 14px 16px; - color: #464a4d; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li:hover > a, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li:hover > a:hover, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.focus > a, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.focus > a:hover, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.active > a, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.active > a:hover, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > a, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > a:hover { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li:hover > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.focus > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.active > .rd-navbar-submenu-toggle::after, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle::after { - color: #fff; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav > li + li { - margin-top: 4px; -} -.bodywebsite .rd-navbar-fixed .label-custom { - position: relative; - top: -1px; - display: inline-block; - margin: 0 0 0 8px; - font-size: 60%; - line-height: 1; - padding: 6px .5em 5px; - vertical-align: middle; -} -.bodywebsite .iphone .rd-navbar-fixed .label-custom, -.bodywebsite .ipad .rd-navbar-fixed .label-custom, -.bodywebsite .mac .rd-navbar-fixed .label-custom { - padding: 6px .5em 4px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-dropdown > li > a, -.bodywebsite .rd-navbar-fixed .rd-navbar-list > li > a { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 12px; - line-height: 1.2; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu .rd-megamenu-header { - padding: 0 15px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu > li { - padding-top: 15px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu * + .rd-megamenu-header { - margin-top: 15px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu * + .rd-navbar-list { - margin-top: 10px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fixed .rd-navbar-megamenu { - display: none; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu { - position: relative; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu li > a { - font-size: 14px; - padding-left: 30px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu .rd-navbar-dropdown li li > a, -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu .rd-navbar-megamenu ul li li > a { - padding-left: 48px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu.opened > .rd-navbar-megamenu { - display: block; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-search, -.bodywebsite .rd-navbar-fixed .rd-navbar-btn-wrap { - display: block; - padding: 16px 5px; -} -.bodywebsite .rd-navbar-fixed .rd-search .rd-search-results-live { - display: none; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-btn-wrap { - padding: 16px 10px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-btn-wrap .btn { - width: 100%; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li .rd-navbar-megamenu { - transition: opacity 0.3s, height 0.4s ease; - opacity: 0; - height: 0; - overflow: hidden; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-megamenu { - padding: 3px 0; - opacity: 1; - height: auto; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle { - color: #fff; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle::after { - transform: rotate(180deg); - margin-top: -24px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-submenu-toggle::after { - content: '\f107'; - position: absolute; - top: 24px; - right: 0; - margin-top: -18px; - width: 65px; - height: 44px; - font: 400 15px "FontAwesome"; - line-height: 42px; - text-align: center; - transition: 0.4s all ease; - z-index: 2; - cursor: pointer; - color: #000; - will-change: transform; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse, -.bodywebsite .rd-navbar-fixed .rd-navbar-search-toggle { - position: fixed; - top: 4px; - height: 48px; - z-index: 1000; - background-color: transparent; - border: none; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-collapse:focus, -.bodywebsite .rd-navbar-fixed .rd-navbar-search-toggle:focus { - outline: none; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside { - top: 0; - right: 0; - width: 100%; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside, -.bodywebsite .rd-navbar-fixed .rd-navbar-aside .rd-navbar-aside-toggle { - position: fixed; - z-index: 1000; - display: block; - height: 48px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside.active .rd-navbar-aside-content { - visibility: visible; - opacity: 1; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle { - top: 4px; - right: 4px; - display: inline-block; - position: relative; - width: 48px; - height: 48px; - line-height: 48px; - cursor: pointer; - color: #000; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span { - top: 50%; - margin-top: -3px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span, -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:before, -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:after { - position: absolute; - width: 6px; - height: 6px; - line-height: 6px; - text-align: center; - background: #000; - left: 50%; - margin-left: -3px; - border-radius: 50%; - transition: .3s all ease; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:before, -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:after { - content: ''; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:before { - bottom: 100%; - margin-bottom: 3px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle span:after { - top: 100%; - margin-top: 3px; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle.active span { - transform: scale(0.7); -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle.active span:before { - transform: translateY(18px); -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-toggle.active span:after { - transform: translateY(-18px); -} -.bodywebsite .rd-navbar-fixed .rd-navbar-aside-content { - position: absolute; - top: calc(107%); - right: 0; - width: calc(102%); - padding: 20px 35px; - margin: 0 -1px; - pointer-events: auto; - opacity: 0; - visibility: hidden; - transition: 0.23s all ease-out; -} -@media (min-width: 768px) { - .bodywebsite .rd-navbar-fixed .rd-navbar-aside-content { - width: auto; - } -} -.bodywebsite .rd-navbar-fixed.rd-navbar--is-clone { - display: none; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-fixed--visible { - display: block; -} -.bodywebsite .rd-navbar-fixed .rd-navbar-fixed--hidden { - display: none; -} -.bodywebsite html.rd-navbar-fixed-linked .page { - padding-top: 56px; -} -.bodywebsite html.rd-navbar-sidebar-linked body { - padding-left: 270px; -} -.bodywebsite .rd-navbar-sidebar { - position: fixed; - display: block; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > a, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > a:hover, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > a, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - background: transparent; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > .rd-navbar-submenu-toggle, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > .rd-navbar-submenu-toggle { - color: #fff; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li:hover > .rd-navbar-submenu-toggle:hover, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.focus > .rd-navbar-submenu-toggle:hover { - cursor: pointer; - color: #fff; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li .rd-navbar-dropdown, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li .rd-navbar-megamenu { - transition: opacity 0.3s, height 0.4s ease; - opacity: 0; - height: 0; - overflow: hidden; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-megamenu { - opacity: 1; - height: auto; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > a { - background: transparent; - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle { - color: #fff; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-nav li.opened > .rd-navbar-submenu-toggle::after { - -webkit-transform: rotate(180deg); - transform: rotate(180deg); -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-submenu-toggle::after { - content: '\f078'; - position: absolute; - top: 22px; - right: 0; - margin-top: -22px; - width: 65px; - height: 44px; - font: 400 14px "FontAwesome"; - line-height: 42px; - text-align: center; - transition: 0.4s all ease; - z-index: 2; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-brand { - text-align: center; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse-items { - top: 0; - left: 0; - padding-top: 45px; - transform: scale(0.7); - transform-origin: 0% 0%; - opacity: 0; - visibility: hidden; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse { - position: absolute; - top: 4px; - left: 4px; - display: inline-block; - z-index: 1; -} -.bodywebsite .rd-navbar-sidebar .rd-navbar-collapse.active .rd-navbar-collapse-items { - opacity: 1; - visibility: visible; - transform: scale(1); -} -.bodywebsite .rd-navbar-default .rd-navbar-nav > li > a { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 700; - line-height: 1.2; - text-transform: uppercase; - color: #00030a; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .form-input, -.bodywebsite .rd-navbar-default .rd-navbar-search .form-label { - font-size: 16px; - line-height: 1.3; - color: #9b9b9b; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .form-label { - top: 18px; - left: 22px; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .form-input { - padding: 7px 45px 10px 22px; - height: auto; - min-height: 20px; - border: 1px solid #e5e7e9; - border-radius: 3px; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit { - font-size: 25px; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:active, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:focus, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:active, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:focus { - color: #00030a; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:hover, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit, -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-search-submit:before { - font-family: 'Material Icons'; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle { - position: relative; -} -.bodywebsite .rd-navbar-default .rd-navbar-search .rd-navbar-search-toggle:after { - content: '\e5cd'; -} -.bodywebsite .rd-navbar-default.rd-navbar-fixed .rd-navbar-shop { - position: fixed; - top: 15px; - right: 15px; - z-index: 1001; -} -.bodywebsite .rd-navbar-default.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle { - display: none; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-inner, -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-group { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-inner { - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 44px 15px 42px; - font-size: 0; - line-height: 0; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-panel { - min-width: 100px; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-group { - -webkit-justify-content: flex-end; - -ms-flex-pack: end; - justify-content: flex-end; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav-inner { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row-reverse; - -ms-flex-direction: row-reverse; - flex-direction: row-reverse; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; - margin-right: 12px; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav { - z-index: 0; - margin-right: 40px; - transition: .25s; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 32px; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav { - margin-right: 77px; - } - .bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 48px; - } -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-toggle .rd-navbar-nav > li .rd-navbar-toggle { - display: none; -} -.bodywebsite .rd-navbar-default.rd-navbar-static .rd-navbar-nav > li > .rd-navbar-dropdown { - margin-top: 54px; -} -.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-clone .rd-navbar-inner, -.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-inner { - padding: 18px 15px; -} -.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav > li > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-default.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav > li > .rd-navbar-dropdown { - margin-top: 49px; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-nav > li > a { - font-weight: 700; - font-size: 14px; - letter-spacing: .05em; - text-transform: uppercase; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-input, -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-label { - font-size: 16px; - line-height: 1.3; - color: #9b9b9b; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-label { - top: 18px; - left: 22px; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .form-input { - padding: 7px 45px 7px 22px; - height: auto; - min-height: 20px; - border: 1px solid #e5e7e9; - border-radius: 3px; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit { - text-align: center; - color: #000; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit:before { - position: static; - display: inline-block; - font-family: 'fl-bigmug-line'; - font-size: 20px; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle:hover, -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-search-submit:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-search .rd-navbar-search-toggle:after { - display: none; -} -.bodywebsite .rd-navbar-corporate-dark .rd-navbar-aside { - width: 100%; - font-size: 14px; - line-height: 1.71429; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside-content { - border-bottom: 1px solid #000; - border-left: 1px solid #000; - background: #111; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside .list-units > li + li { - margin-top: 10px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside * + .rd-navbar-aside-group { - margin-top: 14px; -} -@media (min-width: 576px) { - .bodywebsite .rd-navbar-corporate-dark.rd-navbar-fixed .rd-navbar-aside-content { - width: auto; - } -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-group { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-inner { - padding: 0; - font-size: 0; - line-height: 0; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-panel { - min-width: 100px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside { - position: relative; - z-index: 2; - background: #3a3c3e; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside:after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: 50%; - transform: translateX(-50%); - background: inherit; - width: 102vw; - z-index: -1; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content, -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content { - padding: 12px 15px; - margin-bottom: -5px; - transform: translateY(-5px); - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group { - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:first-child { - margin-top: 7px; - -webkit-flex-grow: 8; - -ms-flex-positive: 8; - flex-grow: 8; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; - margin-right: 20px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:last-child { - margin-top: 5px; - -webkit-justify-content: flex-end; - -ms-flex-pack: end; - justify-content: flex-end; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .list-units li { - display: inline-block; - margin-top: 0; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .list-units li:not(:last-child) { - margin-right: 25px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-group { - /* padding: 35px 15px; */ - padding-top: 18px; - padding-bottom: 18px; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav-inner { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row-reverse; - -ms-flex-direction: row-reverse; - flex-direction: row-reverse; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav { - margin-right: 23px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li { - padding-left: 5px; - padding-right: 5px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li > a { - font-size: 13px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li.rd-navbar-submenu { - margin-right: -18px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle { - display: inline-block; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 32px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav .rd-navbar-dropdown > li { - padding-left: 5px; - padding-right: 5px; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li > a { - font-size: 14px; - } - .bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 29px; - } - .bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-aside .list-units li:not(:last-child) { - margin-right: 50px; - } -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search { - position: static; - z-index: 2; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search .rd-search { - position: absolute; - top: -2px; - right: -2px; - bottom: 0; - left: 0; - z-index: 5; - opacity: 0; - visibility: hidden; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search .rd-search-submit { - width: 39px; - height: 39px; - line-height: 38px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search-wrap.active .rd-navbar-nav-wrap { - position: relative; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-search.active + .rd-navbar-nav { - opacity: 0; - visibility: hidden; - pointer-events: none; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static .rd-navbar-toggle .rd-navbar-nav > li .rd-navbar-toggle { - display: none; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-clone .rd-navbar-aside, -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-aside { - display: none; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-clone .rd-navbar-group, -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-group { - padding-top: 18px; - padding-bottom: 18px; -} -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav > li > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-corporate-dark.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav > li > .rd-navbar-dropdown { - margin-top: 18px; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-nav > li > a { - font: 400 16px "Roboto", Helvetica, Arial, sans-serif; - letter-spacing: .025em; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-input, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-label { - font-size: 16px; - line-height: 1.3; - color: #9b9b9b; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-label { - top: 18px; - left: 22px; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .form-input { - padding: 7px 22px 10px; - height: auto; - min-height: 20px; - border: 1px solid #e5e7e9; - border-radius: 3px; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-search-submit { - text-align: center; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-search-submit:before { - font-family: 'fl-bigmug-line'; - position: static; - display: inline-block; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after { - font-size: 20px; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before { - font-family: 'fl-bigmug-line'; - color: #000; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after { - font-family: 'Material Icons'; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:hover:before { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after { - width: 36px; - height: 36px; - text-align: center; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before, -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after { - display: block; - position: absolute; - left: 0; - top: 0; -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:before { - content: ""; - transform: scale(1) rotate(0deg); -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle:after { - content: ""; - opacity: 0; - transform: scale(0) rotate(-90deg); -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle.active:before { - opacity: 0; - transform: scale(0) rotate(90deg); -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-search .rd-navbar-search-toggle.active:after { - opacity: 1; - transform: scale(1) rotate(0deg); -} -.bodywebsite .rd-navbar-corporate-light .rd-navbar-aside { - width: 100%; - font-size: 14px; - line-height: 1.71429; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search { - padding: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search { - opacity: 0; - visibility: hidden; - position: fixed; - width: 100%; - padding: 8px 10px; - transform: translateY(-80%); - background: #fff; - border: 1px solid #e5e7e9; - border-top: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search.active .rd-search { - opacity: 1; - visibility: visible; - transform: translateY(0); -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .form-input { - padding: 7px 46px 10px 22px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit { - font-size: 20px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle:active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle:focus, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit:active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit:focus { - color: #000; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle:hover, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-navbar-search-toggle { - position: fixed; - right: 56px; - top: 10px; - z-index: 1000; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-search .rd-search-submit { - right: 10px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside-content { - border: 1px solid #e5e7e9; - background: #fff; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside .list-units > li + li { - margin-top: 10px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside * + .rd-navbar-aside-group { - margin-top: 14px; -} -@media (min-width: 576px) { - .bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-aside-content { - width: auto; - } -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-fixed .rd-navbar-btn-wrap { - padding: 16px 5px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-group { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-inner { - padding: 0; - font-size: 0; - line-height: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-panel { - min-width: 100px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside { - position: relative; - z-index: 100; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap { - position: relative; - z-index: 1001; - padding: 6px 20px 6px 10px; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap:after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: 50%; - transform: translateX(-50%); - border-bottom: 1px solid #e5e7e9; - width: 101vw; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside-wrap > * + * { - margin-left: 10px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-content { - margin-bottom: -5px; - transform: translateY(-5px); - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group { - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:first-child { - margin-top: 7px; - -webkit-flex-grow: 8; - -ms-flex-positive: 8; - flex-grow: 8; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; - margin-right: 20px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .rd-navbar-aside-group:last-child { - margin-top: 5px; - -webkit-justify-content: flex-end; - -ms-flex-pack: end; - justify-content: flex-end; - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .list-units li { - display: inline-block; - margin-top: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-aside .list-units li:not(:last-child) { - margin-right: 30px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-group { - padding: 35px 15px; - -webkit-justify-content: space-between; - -ms-flex-pack: justify; - justify-content: space-between; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav-inner { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row-reverse; - -ms-flex-direction: row-reverse; - flex-direction: row-reverse; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: flex-start; - -ms-flex-pack: start; - justify-content: flex-start; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav { - margin-right: 40px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li > a { - font-size: 15px; - padding: 7px 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li.rd-navbar-submenu { - margin-right: -24px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li > .rd-navbar-submenu-toggle { - position: relative; - top: 2px; - display: inline-block; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 37px; -} -@media (min-width: 1200px) { - .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li > a { - font-size: 16px; - } - .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-nav > li + li { - margin-left: 48px; - } -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search { - position: relative; - z-index: 1500; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-label { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-input, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-label { - color: #fff; - font-size: 30px; - font-weight: 700; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-label { - top: 24px; - left: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .form-input { - padding: 10px 50px 9px 0; - background-color: transparent; - border: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search .btn { - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: -1000; - opacity: 0; - visibility: hidden; - background: rgba(0, 0, 0, 0.96); -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-inner { - width: 540px; - margin-top: 75px; - margin-left: auto; - margin-right: auto; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - border-bottom: 1px solid #fff; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit { - position: relative; - left: 0; - top: 0; - width: 39px; - height: 39px; - font-size: 25px; - line-height: 39px; - transform: none; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit:active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit:focus { - color: #fff; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-submit:hover { - color: #ababab; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live { - position: relative; - display: block; - top: auto; - right: auto; - bottom: auto; - left: auto; - margin-top: 60px; - margin-left: auto; - margin-right: auto; - width: 800px; - font-size: 20px; - background-color: transparent; - opacity: 1; - visibility: visible; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live > * { - display: block; - padding: 0; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .active .search_list li { - top: 0; - opacity: 1; - visibility: visible; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search-quick-result { - display: none; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list { - margin: 0; - background-color: transparent; - text-align: left; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li { - position: relative; - top: 30px; - display: inline-block; - width: 48%; - padding: 0 15px; - text-align: left; - transition: 0.5s all ease-in-out; - opacity: 0; - visibility: hidden; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list .search_all { - top: 0; - margin-top: 40px; - display: inline-block; - width: 100%; - text-align: right; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(0) { - transition-delay: 0s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(1) { - transition-delay: 0.15s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(2) { - transition-delay: 0.3s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(3) { - transition-delay: 0.45s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(4) { - transition-delay: 0.6s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(5) { - transition-delay: 0.75s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(6) { - transition-delay: 0.9s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(7) { - transition-delay: 1.05s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(8) { - transition-delay: 1.2s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(9) { - transition-delay: 1.35s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li:nth-child(10) { - transition-delay: 1.5s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(0) { - transition-delay: 0s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(1) { - transition-delay: 0.2s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(2) { - transition-delay: 0.4s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(3) { - transition-delay: 0.6s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(4) { - transition-delay: 0.8s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(5) { - transition-delay: 1s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(6) { - transition-delay: 1.2s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(7) { - transition-delay: 1.4s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(8) { - transition-delay: 1.6s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(9) { - transition-delay: 1.8s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_list li.search_all:nth-child(10) { - transition-delay: 2s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .result-item:only-child { - top: 0; - width: 100%; - text-align: center; - transition-delay: 0s; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .result-item:nth-child(n + 3) { - margin-top: 50px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title { - font: 700 30px/26px Helvetica, Arial, sans-serif; - font-style: italic; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a:active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a:focus { - color: #fff; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title a:hover { - color: #ababab; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_title + p { - margin-top: 16px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_error { - line-height: 1.35; - text-align: center; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit { - display: inline-block; - padding: 10px 35px; - border: 2px solid; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:active:focus, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.active:focus, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:focus:active, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:focus { - color: #fff; - background-color: transparent; - border-color: #fff; -} -.bodywebsite .open > .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.dropdown-toggle, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit:hover { - color: #414141; - background-color: #fff; - border-color: #fff; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit.disabled, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit[disabled], -.bodywebsite fieldset[disabled] .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit { - pointer-events: none; - opacity: .5; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search-results-live .search_submit .badge { - color: transparent; - background-color: #fff; -} -@media (min-width: 1600px) and (min-height: 767px) { - .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-inner { - margin-top: 10%; - } -} -@media (max-height: 767px) { - .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-results-live .result-item:nth-child(5), - .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-results-live .result-item:nth-child(6) { - display: none; - } - .bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-search .rd-search-results-live .search_list > li.search_all { - transition-delay: 0.8s; - } -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-search { - display: block; - z-index: 10000; - margin: 0; - opacity: 1; - visibility: visible; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-navbar-search-toggle { - z-index: 10002; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-navbar-search-toggle:after { - color: #fff; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-search.active .rd-navbar-search-toggle:hover:after { - color: #ababab; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static .rd-navbar-toggle .rd-navbar-nav > li .rd-navbar-toggle { - display: none; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-clone .rd-navbar-aside-wrap, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-aside-wrap { - position: absolute; - top: -60px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-clone .rd-navbar-group, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-group { - padding-top: 17px; - padding-bottom: 17px; -} -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-clone .rd-navbar-nav > li > .rd-navbar-dropdown, -.bodywebsite .rd-navbar-corporate-light.rd-navbar-static.rd-navbar--is-stuck .rd-navbar-nav > li > .rd-navbar-dropdown { - margin-top: 50px; -} -html .bodywebsite.boxed.rd-navbar--has-sidebar body { - padding-left: 300px; - padding-right: 30px; -} -html .bodywebsite.boxed .rd-navbar--is-clone { - max-width: 1920px; - margin-left: auto; - margin-right: auto; -} -.bodywebsite .rd-parallax-inner { - position: relative; - overflow: hidden; - -webkit-transform: translate3d(0px, 0px, 0px); - transform: translate3d(0px, 0px, 0px); - z-index: 1; -} -.bodywebsite .rd-parallax-layer[data-type="media"] { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - height: 100%; - pointer-events: none; -} -.bodywebsite .rd-parallax-layer[data-type="media"] iframe { - width: 100%; - height: 100%; -} -.bodywebsite .rd-parallax-layer[data-url] { - -webkit-background-size: cover; - background-size: cover; - background-position: center center; -} -.bodywebsite .rd-parallax[class*="rd-parallax-overlay"] { - background-color: #000; - color: #fff; -} -.bodywebsite .rd-parallax[class*="rd-parallax-overlay"] .rd-parallax-layer[data-type="media"] { - opacity: 0.2; -} -.bodywebsite .rd-parallax[class*="rd-parallax-overlay"] .rd-parallax-layer[data-type="media"] + * { - position: relative; -} -.bodywebsite .rd-parallax.rd-parallax-overlay-2 .rd-parallax-layer[data-type="media"] { - opacity: 0.8; -} -.bodywebsite .google-map-markers { - display: none; -} -.bodywebsite .google-map-container { - width: 100%; -} -.bodywebsite .google-map { - height: 250px; - color: #333; -} -.bodywebsite .google-map img { - max-width: none !important; -} -@media (min-width: 576px) { - .bodywebsite .google-map { - height: 250px; - } -} -@media (min-width: 768px) { - .bodywebsite .google-map { - height: 400px; - } -} -@media (min-width: 1200px) { - .bodywebsite .google-map { - height: 450px; - } -} -@media (min-width: 1800px) { - .bodywebsite .google-map { - height: 532px; - } -} -.bodywebsite .rd-search { - position: relative; -} -.bodywebsite .rd-search .form-wrap { - display: block; - margin: 0; - font-size: 0; -} -.bodywebsite .rd-search label * { - margin-top: 0; -} -.bodywebsite .rd-search .rd-search-submit { - top: 16px; - right: -4px; - background-color: transparent; - border: none; - transform: translateY(-50%); -} -.bodywebsite .rd-search .text-mobile { - display: block; -} -.bodywebsite .rd-search .text-default { - display: none; -} -@media (min-width: 768px) { - .bodywebsite .rd-search .text-mobile { - display: none; - } - .bodywebsite .rd-search .text-default { - display: block; - } -} -.bodywebsite .rd-search-submit { - background: none; - border: none; - padding: 0; - outline: none; - outline-offset: 0; - -webkit-appearance: none; - display: inline-block; - position: relative; - width: 48px; - height: 48px; - line-height: 48px; - cursor: pointer; - color: #00030a; - text-align: center; - font-size: 22px; - position: absolute; - right: 0; - transition: color .33s; -} -.bodywebsite .rd-search-submit::-moz-focus-inner { - border: none; - padding: 0; -} -.bodywebsite .rd-search-submit:before { - font-weight: 400; - font-family: "FontAwesome"; -} -.bodywebsite .rd-search-submit.active { - transform: scale(0.7); -} -.bodywebsite .rd-search-submit:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-search-minimal { - position: relative; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: row; - -ms-flex-direction: row; - flex-direction: row; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 40px; - border-bottom: 1px solid #dedede; -} -.bodywebsite .rd-search-minimal:before { - content: '\e8b6'; - position: absolute; - top: 50%; - transform: translateY(-50%); - left: 10px; - font: 400 21px 'Material Icons'; - color: #000; -} -.bodywebsite .rd-search-minimal .form-wrap { - -webkit-flex-grow: 1; - -ms-flex-positive: 1; - flex-grow: 1; -} -.bodywebsite .rd-search-minimal .form-label, -.bodywebsite .rd-search-minimal .form-input { - font: 400 16px/24px "Roboto", Helvetica, Arial, sans-serif; - color: rgba(0, 0, 0, 0.2); - letter-spacing: -0.025em; -} -.bodywebsite .rd-search-minimal .form-label { - top: 29px; -} -.bodywebsite .rd-search-minimal .form-input { - padding: 17px 20px; -} -.bodywebsite .rd-search-minimal button[type='submit'] { - padding: 0 20px; - -webkit-flex-shrink: 0; - -ms-flex-negative: 0; - flex-shrink: 0; -} -@media (min-width: 768px) { - .bodywebsite .rd-search-minimal .form-label, - .bodywebsite .rd-search-minimal .form-input { - font-size: 19px; - } -} -.bodywebsite .rd-search-classic { - overflow: hidden; - border: 1px solid #dedede; - border-radius: 0; -} -.bodywebsite .rd-search-classic .form-input { - min-height: 50px; - padding: 13px 50px 15px 19px; - border: 0; -} -.bodywebsite .rd-search-classic .rd-search-submit { - position: absolute; - right: 0; - top: 0; - bottom: 0; - width: 40px; - line-height: 0; - height: auto; - transform: none; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - text-align: left; -} -.bodywebsite .rd-search-classic .rd-search-submit:before { - font: 400 25px 'Material Icons'; -} -.bodywebsite .search_error { - max-width: 100%; - overflow: hidden; - text-overflow: ellipsis; -} -.bodywebsite .rd-search-results-live { - position: absolute; - left: 0; - right: 0; - top: 100%; - z-index: 998; - margin: -3px 0 0; - font-size: 14px; - line-height: 34px; - text-align: left; - color: #9f9f9f; - opacity: 0; - visibility: hidden; -} -.bodywebsite .rd-search-results-live > * { - padding: 16px; - border: 0px solid #dedede; - border-top: 0; -} -.bodywebsite .rd-search-results-live .search-quick-result { - font: 700 14px/24px "Roboto", Helvetica, Arial, sans-serif; - color: #000; - letter-spacing: .06em; - text-transform: uppercase; -} -.bodywebsite .rd-search-results-live .search_list { - margin-top: 10px; - font-size: 16px; - line-height: 30px; -} -.bodywebsite .rd-search-results-live .search_list li + li { - margin-top: 20px; -} -.bodywebsite .rd-search-results-live .search_list .search_error { - padding-bottom: 10px; - font-size: 14px; - line-height: 1.1; -} -.bodywebsite .rd-search-results-live .search_link, -.bodywebsite .rd-search-results-live .search_link:active, -.bodywebsite .rd-search-results-live .search_link:focus { - color: #464a4d; -} -.bodywebsite .rd-search-results-live .search_link:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-search-results-live p { - margin-top: 0; - font-size: 14px; - line-height: 1.6; -} -.bodywebsite .rd-search-results-live .search_title { - margin-bottom: 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - font-weight: 700; - color: #000; -} -.bodywebsite .rd-search-results-live .search_submit { - display: block; - padding: 6px 20px; - font-size: 14px; - font-weight: 700; - text-align: center; - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - border-radius: 5px; - border: 0; - text-transform: uppercase; - transition: 0.3s ease-out; -} -.bodywebsite .rd-search-results-live .search_submit:hover { - color: #fff; - background: #3a3c3e; -} -.bodywebsite .rd-search-results-live .match { - display: none; -} -@media (min-width: 1200px) { - .bodywebsite .rd-search-results-live .search_link p { - display: block; - } -} -.bodywebsite .rd-navbar-fixed-linked .rd-search-results-live { - display: none; -} -.bodywebsite .rd-search-results-live.active.cleared { - opacity: 0; - visibility: hidden; - transition-delay: .08s; -} -.bodywebsite .active .rd-search-results-live { - display: block; - opacity: 1; - visibility: visible; -} -.bodywebsite .rd-search-results .search_list { - text-align: left; - padding-left: 0; - font-size: 14px; - list-style-type: none; - counter-reset: result; -} -.bodywebsite .rd-search-results .result-item { - position: relative; - padding-left: 40px; - color: #9f9f9f; -} -.bodywebsite .rd-search-results .result-item:before { - position: absolute; - top: -1px; - left: 0; - content: counter(result, decimal-leading-zero) "."; - counter-increment: result; - font: 500 19px "Roboto", Helvetica, Arial, sans-serif; - line-height: 1; - color: #cdcdcd; -} -.bodywebsite .rd-search-results .result-item:only-child:before { - display: none; -} -.bodywebsite .rd-search-results .search { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .rd-search-results .search_error .search { - color: #9f9f9f; - background-color: transparent; -} -.bodywebsite .rd-search-results .match em { - font: 700 12px/16px "Roboto", Helvetica, Arial, sans-serif; - font-style: normal; - text-transform: uppercase; - color: #000; -} -.bodywebsite .rd-search-results * + p { - margin-top: 10px; -} -.bodywebsite .rd-search-results * + .match { - margin-top: 5px; -} -.bodywebsite .rd-search-results * + .result-item { - margin-top: 35px; -} -@media (min-width: 576px) { - .bodywebsite .rd-search-results .result-item { - padding-left: 60px; - } - .bodywebsite .rd-search-results .result-item:before { - left: 15px; - font-size: 19px; - } -} -@media (min-width: 768px) { - .bodywebsite .rd-search-results .result-item:before { - top: 0; - } -} -@media (min-width: 992px) { - .bodywebsite .rd-search-results .result-item { - padding-left: 85px; - } - .bodywebsite .rd-search-results .result-item:before { - top: 0; - left: 40px; - } -} -@media (min-width: 1200px) { - .bodywebsite .rd-search-results .result-item { - padding-left: 100px; - } - .bodywebsite .rd-search-results .result-item:before { - left: 44px; - } -} -.bodywebsite .twitter-item-minimal .tweet-user { - font-size: 16px; - font-weight: 700; -} -.bodywebsite .twitter-item-minimal .tweet-user a, -.bodywebsite .twitter-item-minimal .tweet-user a:active, -.bodywebsite .twitter-item-minimal .tweet-user a:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .twitter-item-minimal .tweet-user a:hover { - color: #000; -} -.bodywebsite .twitter-item-minimal .tweet-user a:before { - content: '-'; -} -.bodywebsite .twitter-item-minimal .tweet-text a, -.bodywebsite .twitter-item-minimal .tweet-text a:active, -.bodywebsite .twitter-item-minimal .tweet-text a:focus { - color: #000; -} -.bodywebsite .twitter-item-minimal .tweet-text a:hover { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .twitter-item-minimal * + .tweet-text { - margin-top: 0; -} -.bodywebsite .twitter-item-minimal * + .tweet-user { - margin-top: 10px; -} -.bodywebsite .twitter-item-minimal + .twitter-item-minimal { - margin-top: 25px; -} -.bodywebsite .twitter-widget { - overflow: hidden; - background: #fff; - border-radius: 6px; - box-shadow: -1px 0px 10px 0px rgba(65, 65, 65, 0.12); -} -.bodywebsite .twitter-widget > a { - display: block; - color: #9f9f9f; -} -.bodywebsite .twitter-widget .tweet-text a, -.bodywebsite .twitter-widget .tweet-text a:active, -.bodywebsite .twitter-widget .tweet-text a:focus { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .twitter-widget .tweet-text a:hover { - color: #000; -} -.bodywebsite .twitter-widget .twitter-widget-time { - color: #9f9f9f; -} -.bodywebsite .twitter-widget .twitter-widget-meta > * { - line-height: 1.1; -} -.bodywebsite .twitter-widget .twitter-widget-meta > * + * { - margin-top: 5px; -} -.bodywebsite .twitter-widget .twitter-widget-media { - position: relative; - z-index: 1; - overflow: hidden; -} -.bodywebsite .twitter-widget .twitter-widget-media > img { - position: absolute; - top: 0; - right: 0; - left: 0; - min-height: 101%; -} -.bodywebsite .twitter-widget .twitter-widget-media:empty { - display: none; -} -.bodywebsite .twitter-widget .twitter-widget-media:not(:empty) { - padding-bottom: 42.5170068%; -} -.bodywebsite .twitter-widget .tweet-avatar { - display: block; - width: 48px; - height: 48px; - background: #dedede; -} -.bodywebsite .twitter-widget .twitter-widget-header { - padding: 30px 30px 0 30px; -} -.bodywebsite .twitter-widget .twitter-widget-inset { - padding: 25px 30px 15px; -} -.bodywebsite .twitter-widget .twitter-widget-footer { - padding: 15px 30px; -} -.bodywebsite * + .twitter-widget { - margin-top: 30px; -} -.bodywebsite .swiper-container { - margin: 0 auto; - position: relative; - overflow: hidden; - /* Fix of Webkit flickering */ - z-index: 1; - height: auto; -} -.bodywebsite .swiper-container .swiper-wrapper { - height: auto; - min-height: 36.25vw; -} -@media (min-width: 1800px) { - .bodywebsite .swiper-container .swiper-wrapper { - height: auto; - min-height: 680px; - } -} -.bodywebsite .swiper-container-no-flexbox .swiper-slide { - float: left; -} -.bodywebsite .swiper-container-vertical > .swiper-wrapper { - -webkit-box-orient: vertical; - -moz-box-orient: vertical; - -ms-flex-direction: column; - -webkit-flex-direction: column; - flex-direction: column; -} -.bodywebsite .swiper-wrapper { - position: relative; - width: 100%; - z-index: 1; - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-transition-property: -webkit-transform; - -moz-transition-property: -moz-transform; - -o-transition-property: -o-transform; - -ms-transition-property: -ms-transform; - transition-property: transform; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-align-self: stretch; - -ms-flex-item-align: stretch; - align-self: stretch; - -webkit-align-items: stretch; - -ms-flex-align: stretch; - align-items: stretch; -} -.bodywebsite .swiper-container-android .swiper-slide, -.bodywebsite .swiper-wrapper { - -webkit-transform: translate3d(0px, 0, 0); - -moz-transform: translate3d(0px, 0, 0); - -o-transform: translate(0px, 0px); - -ms-transform: translate3d(0px, 0, 0); - transform: translate3d(0px, 0, 0); -} -.bodywebsite .swiper-container-multirow > .swiper-wrapper { - -webkit-box-lines: multiple; - -moz-box-lines: multiple; - -ms-flex-wrap: wrap; - -webkit-flex-wrap: wrap; - flex-wrap: wrap; -} -.bodywebsite .swiper-container-free-mode > .swiper-wrapper { - -webkit-transition-timing-function: ease-out; - -moz-transition-timing-function: ease-out; - -ms-transition-timing-function: ease-out; - -o-transition-timing-function: ease-out; - transition-timing-function: ease-out; - margin: 0 auto; -} -.bodywebsite .swiper-slide { - position: relative; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-flex-shrink: 0; - -ms-flex: 0 0 auto; - flex-shrink: 0; - width: 100%; - min-height: inherit; -} -.bodywebsite .swiper-container .swiper-notification { - position: absolute; - left: 0; - top: 0; - pointer-events: none; - opacity: 0; - z-index: -1000; -} -.bodywebsite .swiper-wp8-horizontal { - -ms-touch-action: pan-y; - touch-action: pan-y; -} -.bodywebsite .swiper-wp8-vertical { - -ms-touch-action: pan-x; - touch-action: pan-x; -} -.bodywebsite .swiper-nav { - position: absolute; - top: 50%; - right: 0; - left: 0; - z-index: 10; - pointer-events: none; - transform: translateY(-50%); -} -.bodywebsite .swiper-button-prev, -.bodywebsite .swiper-button-next { - z-index: 10; - width: 48px; - height: 48px; - background-size: 48px 48px; - color: #fff; - transition: 180ms ease-in-out; - text-align: center; - cursor: pointer; - pointer-events: auto; -} -.bodywebsite .swiper-button-prev:hover, -.bodywebsite .swiper-button-next:hover { - opacity: .7; -} -.bodywebsite .swiper-button-prev.swiper-button-disabled, -.bodywebsite .swiper-button-next.swiper-button-disabled { - opacity: 0; - cursor: auto; - pointer-events: none; -} -.bodywebsite .swiper-button-next { - transform: rotate(180deg); -} -.bodywebsite .swiper-pagination-wrap { - position: absolute; - bottom: 20px; - left: 50%; - width: 100%; - transform: translate3d(-50%, 0, 0); - z-index: 10; -} -@media (min-width: 992px) { - .bodywebsite .swiper-pagination-wrap { - bottom: 35px; - } -} -@media (min-width: 1200px) { - .bodywebsite .swiper-pagination-wrap { - bottom: 55px; - } -} -.bodywebsite .swiper-pagination { - display: block; - width: 100%; - text-align: center; - transition: 300ms; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - z-index: 10; -} -@media (min-width: 768px) { - .bodywebsite .swiper-pagination { - text-align: left; - } -} -.bodywebsite .swiper-pagination.swiper-pagination-hidden { - opacity: 0; -} -.bodywebsite .swiper-pagination-bullet { - display: inline-block; - width: 6px; - height: 6px; - border-radius: 20px; - background: #cdcdcd; - pointer-events: none; - transition: all 0.2s ease-out; -} -.bodywebsite .swiper-pagination-bullet + * { - margin-left: 10px; -} -@media (min-width: 768px) { - .bodywebsite .swiper-pagination-bullet { - width: 12px; - height: 12px; - pointer-events: auto; - } - .bodywebsite .swiper-pagination-bullet + * { - margin-left: 20px; - } -} -.bodywebsite .swiper-pagination-clickable .swiper-pagination-bullet { - cursor: pointer; -} -.bodywebsite .swiper-pagination-white .swiper-pagination-bullet { - background: #fff; -} -.bodywebsite .swiper-pagination-bullet:hover, -.bodywebsite .swiper-pagination-bullet-active { - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .swiper-pagination-white .swiper-pagination-bullet-active { - background: #fff; -} -.bodywebsite .swiper-pagination-black .swiper-pagination-bullet-active { - background: #000; -} -.bodywebsite .swiper-container-vertical > .swiper-pagination { - right: 10px; - top: 50%; - -webkit-transform: translate3d(0px, -50%, 0); - -moz-transform: translate3d(0px, -50%, 0); - -o-transform: translate(0px, -50%); - -ms-transform: translate3d(0px, -50%, 0); - transform: translate3d(0px, -50%, 0); -} -.bodywebsite .swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet { - margin: 5px 0; - display: block; -} -.bodywebsite .swiper-container-horizontal > .swiper-pagination { - bottom: 20px; - left: 0; - width: 100%; -} -.bodywebsite .swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet { - margin: 0 5px; -} -.bodywebsite .swiper-container-3d { - -webkit-perspective: 1200px; - -moz-perspective: 1200px; - -o-perspective: 1200px; - perspective: 1200px; -} -.bodywebsite .swiper-container-3d .swiper-wrapper, -.bodywebsite .swiper-container-3d .swiper-slide, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-left, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-right, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-top, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-bottom, -.bodywebsite .swiper-container-3d .swiper-cube-shadow { - -webkit-transform-style: preserve-3d; - -moz-transform-style: preserve-3d; - -ms-transform-style: preserve-3d; - transform-style: preserve-3d; -} -.bodywebsite .swiper-container-3d .swiper-slide-shadow-left, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-right, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-top, -.bodywebsite .swiper-container-3d .swiper-slide-shadow-bottom { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: 10; -} -.bodywebsite .swiper-container-3d .swiper-slide-shadow-left { - background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); -} -.bodywebsite .swiper-container-3d .swiper-slide-shadow-top { - background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); -} -.bodywebsite .swiper-container-3d .swiper-slide-shadow-bottom { - background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0)); -} -.bodywebsite .swiper-container-coverflow .swiper-wrapper { - /* Windows 8 IE 10 fix */ - -ms-perspective: 1200px; -} -.bodywebsite .swiper-container-fade.swiper-container-free-mode .swiper-slide { - -webkit-transition-timing-function: ease-out; - transition-timing-function: ease-out; -} -.bodywebsite .swiper-container-fade .swiper-slide { - pointer-events: none; -} -.bodywebsite .swiper-container-fade .swiper-slide .swiper-slide { - pointer-events: none; -} -.bodywebsite .swiper-container-fade .swiper-slide-active, -.bodywebsite .swiper-container-fade .swiper-slide-active .swiper-slide-active { - pointer-events: auto; -} -.bodywebsite .swiper-container-cube { - overflow: visible; -} -.bodywebsite .swiper-container-cube .swiper-slide { - pointer-events: none; - visibility: hidden; - -webkit-transform-origin: 0 0; - -moz-transform-origin: 0 0; - -ms-transform-origin: 0 0; - transform-origin: 0 0; - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - width: 100%; - height: 100%; - z-index: 1; -} -.bodywebsite .swiper-container-cube.swiper-container-rtl .swiper-slide { - -webkit-transform-origin: 100% 0; - -moz-transform-origin: 100% 0; - -ms-transform-origin: 100% 0; - transform-origin: 100% 0; -} -.bodywebsite .swiper-container-cube .swiper-slide-active, -.bodywebsite .swiper-container-cube .swiper-slide-next, -.bodywebsite .swiper-container-cube .swiper-slide-prev, -.bodywebsite .swiper-container-cube .swiper-slide-next + .swiper-slide { - pointer-events: auto; - visibility: visible; -} -.bodywebsite .swiper-container-cube .swiper-slide-shadow-top, -.bodywebsite .swiper-container-cube .swiper-slide-shadow-bottom, -.bodywebsite .swiper-container-cube .swiper-slide-shadow-left, -.bodywebsite .swiper-container-cube .swiper-slide-shadow-right { - z-index: 0; - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; -} -.bodywebsite .swiper-container-cube .swiper-cube-shadow { - position: absolute; - left: 0; - bottom: 0px; - width: 100%; - height: 100%; - background: #000; - opacity: 0.6; - -webkit-filter: blur(50px); - filter: blur(50px); - z-index: 0; -} -.bodywebsite .swiper-scrollbar { - position: relative; - -ms-touch-action: none; -} -.bodywebsite .swiper-container-horizontal > .swiper-scrollbar { - position: absolute; - top: 0; - left: 0; - z-index: 50; - height: 5px; - width: 100%; -} -.bodywebsite .swiper-container-vertical > .swiper-scrollbar { - position: absolute; - right: 3px; - top: 1%; - z-index: 50; - width: 5px; - height: 98%; -} -.bodywebsite .swiper-scrollbar-drag { - height: 100%; - width: 100%; - position: relative; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; - left: 0; - top: 0; -} -.bodywebsite .swiper-scrollbar-cursor-drag { - cursor: move; -} -.bodywebsite .swiper-lazy-preloader { - width: 42px; - height: 42px; - position: absolute; - left: 50%; - top: 50%; - margin-left: -21px; - margin-top: -21px; - z-index: 10; - -webkit-transform-origin: 50%; - -moz-transform-origin: 50%; - transform-origin: 50%; - -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite; - -moz-animation: swiper-preloader-spin 1s steps(12, end) infinite; - animation: swiper-preloader-spin 1s steps(12, end) infinite; -} -.bodywebsite .swiper-lazy-preloader:after { - display: block; - content: ""; - width: 100%; - height: 100%; - background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); - background-position: 50%; - -webkit-background-size: 100%; - background-size: 100%; - background-repeat: no-repeat; -} -.bodywebsite .swiper-lazy-preloader-white:after { - background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); -} -@-webkit-keyframes swiper-preloader-spin { - 100% { - -webkit-transform: rotate(360deg); - } -} -@keyframes swiper-preloader-spin { - 100% { - transform: rotate(360deg); - } -} -.bodywebsite .swiper-slide > .vide__body, -.bodywebsite .swiper-slide > .parallax_cnt { - height: 100%; -} -.bodywebsite .swiper-slide { - position: relative; - text-align: center; - white-space: nowrap; - background-position: center center; - overflow: hidden; -} -.bodywebsite .swiper-slide:not(.vide):not(.rd-parallax):before, -.bodywebsite .swiper-slide .parallax_cnt:before, -.bodywebsite .swiper-slide .vide__body:before { - content: ''; - display: inline-block; - height: 50%; -} -.bodywebsite .swiper-slide-caption { - display: inline-block; - width: 100%; - max-height: 100%; - margin-left: -0.25em; - vertical-align: middle; - white-space: normal; - z-index: 1; -} -.bodywebsite .swiper-variant-1, -.bodywebsite .swiper-variant-1 .swiper-wrapper { - height: auto; - min-height: calc(44vh); -} -.bodywebsite .swiper-variant-1 .swiper-slide-caption { - padding: 40px 0 40px; -} -.bodywebsite .swiper-variant-1 .swiper-button-prev, -.bodywebsite .swiper-variant-1 .swiper-button-next { - display: none; -} -.bodywebsite .swiper-variant-1 .slider-text { - display: none; -} -.bodywebsite .swiper-variant-1 .jumbotron-custom + * { - margin-top: 5px; -} -.bodywebsite .swiper-variant-1 * + .button-block { - margin-top: 27px; -} -@media (min-width: 768px) { - .bodywebsite .swiper-variant-1, - .bodywebsite .swiper-variant-1 .swiper-wrapper { - height: auto; - min-height: 36.25vw; - } - .bodywebsite .swiper-variant-1 .swiper-slide-caption { - padding: 60px 0 115px; - } - .bodywebsite .swiper-variant-1 .slider-header { - font-size: 50px; - } - .bodywebsite .swiper-variant-1 .slider-text { - display: block; - } -} -@media (min-width: 992px) { - .bodywebsite .swiper-variant-1 .swiper-slide-caption { - padding: 100px 0 155px; - } - .bodywebsite .swiper-variant-1 .swiper-button-prev, - .bodywebsite .swiper-variant-1 .swiper-button-next { - position: absolute; - top: 50%; - transform: translateY(-59%); - z-index: 10; - display: block; - transition: .3s all ease; - } - .bodywebsite .swiper-variant-1 .swiper-button-prev { - left: 5.1%; - transform: scale(-1, 1); - } - .bodywebsite .swiper-variant-1 .swiper-button-next { - right: 5.1%; - } -} -@media (min-width: 1200px) { - .bodywebsite .swiper-variant-1 .slider-header { - font-size: 59px; - } - .bodywebsite .swiper-variant-1 .swiper-button-prev { - left: 20px; - } - .bodywebsite .swiper-variant-1 .swiper-button-next { - right: 20px; - } -} -@media (min-width: 1599px) { - .bodywebsite .swiper-variant-1 .swiper-button-prev { - left: calc(50vw - 1170px / 2 - 170px + (1170px / 12) * 0); - } - .bodywebsite .swiper-variant-1 .swiper-button-next { - right: calc(50vw - 1170px / 2 - 170px + (1170px / 12) * 0); - } -} -@media (min-width: 1800px) { - .bodywebsite .swiper-variant-1, - .bodywebsite .swiper-variant-1 .swiper-wrapper { - height: auto; - min-height: 680px; - } -} -.bodywebsite .ui-to-top { - width: 40px; - height: 40px; - font-size: 18px; - line-height: 38px; - border-radius: 50%; - position: fixed; - right: 15px; - bottom: 15px; - overflow: hidden; - text-align: center; - text-decoration: none; - z-index: 20; - transition: .3s all ease; - box-shadow: 0 0 1px 0px rgba(55, 195, 134, 0.3); - transform: translateY(100px); -} -.bodywebsite .ui-to-top, -.bodywebsite .ui-to-top:active, -.bodywebsite .ui-to-top:focus { - color: #fff; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .ui-to-top:hover { - color: #fff; - background: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?>; - box-shadow: 0 0 1px 0px rgba(0, 0, 0, 0.4); -} -.bodywebsite .ui-to-top:focus { - outline: 0; -} -.bodywebsite .ui-to-top.active { - transform: translateY(0); -} -.bodywebsite .mobile .ui-to-top, -.bodywebsite .tablet .ui-to-top { - display: none !important; -} -@media (min-width: 576px) { - .bodywebsite .ui-to-top { - right: 40px; - bottom: 40px; - } -} -.bodywebsite .progress-bar-wrap { - max-width: 100%; - width: 210px; -} -@media (min-width: 576px) and (max-width: 767px) { - .bodywebsite .progress-bar-wrap { - max-width: 120px; - } -} -@media (min-width: 768px) { - .bodywebsite .progress-bar-wrap { - max-width: 150px; - } -} -.bodywebsite .progress-bar { - position: relative; - width: 100%; - margin: 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; -} -.bodywebsite .progress-bar .progress-bar__body { - position: absolute; - right: 50%; - width: 100%; - top: 50%; - padding: 0; - margin: 0; - white-space: nowrap; - font-size: 34px; - font-weight: 400; - line-height: 26px; - color: #00030a; - text-align: right; -} -.bodywebsite .progress-bar .progress-bar__body:after { - content: '%'; -} -.bodywebsite .progress-bar .progress-bar__stroke, -.bodywebsite .progress-bar .progress-bar__trail { - stroke-linejoin: round; -} -.bodywebsite .progress-bar-horizontal { - position: relative; - font-family: "Roboto", Helvetica, Arial, sans-serif; - text-align: right; -} -.bodywebsite .progress-bar-horizontal > svg { - margin-top: 3px; - border-radius: 3px; -} -.bodywebsite .progress-bar-horizontal .progress-bar__body { - position: absolute; - top: -27px; - margin-top: 0; - padding-right: 0; -} -.bodywebsite .progress-bar-horizontal .progress-bar__body:after { - content: '%'; -} -.bodywebsite .progress-bar-radial { - position: relative; - padding-bottom: 100%; -} -.bodywebsite .progress-bar-radial > svg { - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - border-radius: 5px; - overflow: hidden; -} -.bodywebsite .progress-bar-radial .progress-bar__stroke, -.bodywebsite .progress-bar-radial .progress-bar__trail { - stroke-location: outside; -} -.bodywebsite .progress-bar-radial .progress-bar__body { - transform: translate(50%, -50%); -} -.bodywebsite .progress-bar-default .progress-bar__stroke { - stroke: #9f9f9f; -} -.bodywebsite .progress-bar-default .progress-bar__trail { - stroke: rgba(159, 159, 159, 0.05); -} -.bodywebsite .progress-bar-primary .progress-bar__stroke { - stroke: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .progress-bar-primary .progress-bar__trail { - stroke: #F8F9FB; -} -.bodywebsite .progress-bar-bermuda-gray .progress-bar__stroke { - stroke: #6f8fad; -} -.bodywebsite .progress-bar-bermuda-gray .progress-bar__trail { - stroke: #F8F9FB; -} -.bodywebsite .progress-bar-contessa .progress-bar__stroke { - stroke: #e76752; -} -.bodywebsite .progress-bar-contessa .progress-bar__trail { - stroke: #F8F9FB; -} -.bodywebsite .progress-bar-red-orange-1 .progress-bar__stroke { - stroke: #f8333c; -} -.bodywebsite .progress-bar-red-orange-1 .progress-bar__trail { - stroke: #ededed; -} -.bodywebsite .progress-bar-dodger-blue .progress-bar__stroke { - stroke: #45a4ff; -} -.bodywebsite .progress-bar-dodger-blue .progress-bar__trail { - stroke: #ededed; -} -.bodywebsite .progress-bar-gorse .progress-bar__stroke { - stroke: #fde74c; -} -.bodywebsite .progress-bar-gorse .progress-bar__trail { - stroke: #ededed; -} -.bodywebsite .progress-bar-old-gold .progress-bar__stroke { - stroke: #ecd746; -} -.bodywebsite .progress-bar-old-gold .progress-bar__trail { - stroke: #F8F9FB; -} -.bodywebsite .progress-bar-secondary-2 .progress-bar__stroke { - stroke: #dedede; -} -.bodywebsite .progress-bar-secondary-2 .progress-bar__trail { - stroke: gray; -} -.bodywebsite .progress-bar-secondary-1 .progress-bar__stroke { - stroke: #dedede; -} -.bodywebsite .progress-bar-secondary-1 .progress-bar__trail { - stroke: rgba(159, 159, 159, 0.05); -} -.bodywebsite .progress-bar-secondary-3 .progress-bar__stroke { - stroke: #c49558; -} -.bodywebsite .progress-bar-secondary-3 .progress-bar__trail { - stroke: rgba(159, 159, 159, 0.05); -} -.bodywebsite .progress-bar-secondary-4 .progress-bar__stroke { - stroke: #fe4a21; -} -.bodywebsite .progress-bar-secondary-4 .progress-bar__trail { - stroke: rgba(159, 159, 159, 0.05); -} -.bodywebsite .countdown-wrap { - max-width: 720px; - max-height: 134px; -} -.bodywebsite .countdown-wrap .time_circles > div { - display: -ms-flexbox; - display: -webkit-flex; - display: flex; - -webkit-flex-direction: column-reverse; - -ms-flex-direction: column-reverse; - flex-direction: column-reverse; - -webkit-flex-wrap: nowrap; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - font-size: 0; - line-height: 0; -} -.bodywebsite .countdown-wrap div > h4 { - position: relative; - margin-top: -2px; - font: 500 12px "Roboto", Helvetica, Arial, sans-serif !important; - color: rgba(0, 0, 0, 0.2); - letter-spacing: -0.025em; - bottom: auto !important; - text-transform: uppercase; -} -@media (min-width: 576px) { - .bodywebsite .countdown-wrap div > h4 { - font-size: 14px !important; - } -} -.bodywebsite .countdown-wrap span { - font: 900 18px "Roboto", Helvetica, Arial, sans-serif !important; - font-style: normal; - color: #000; -} -@media (min-width: 576px) { - .bodywebsite .countdown-wrap span { - font-size: 40px !important; - } -} -@media (min-width: 768px) { - .bodywebsite .countdown-wrap span { - font-size: 45px !important; - line-height: 1; - } -} -.bodywebsite .slick-slider { - position: relative; - display: block; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -ms-touch-action: pan-y; - touch-action: pan-y; - -webkit-tap-highlight-color: transparent; -} -.bodywebsite .slick-list { - position: relative; - overflow: hidden; - display: block; - margin: 0; - padding: 0; -} -.bodywebsite .slick-list:focus { - outline: none; -} -.bodywebsite .slick-list.dragging { - cursor: pointer; - cursor: hand; -} -.bodywebsite .slick-slider .slick-track, -.bodywebsite .slick-slider .slick-list { - -webkit-transform: translate3d(0, 0, 0); - -moz-transform: translate3d(0, 0, 0); - -ms-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.bodywebsite .slick-track { - position: relative; - left: 0; - top: 0; - display: block; -} -.bodywebsite .slick-track:before, -.bodywebsite .slick-track:after { - content: ""; - display: table; -} -.bodywebsite .slick-track:after { - clear: both; -} -.bodywebsite .slick-loading .slick-track { - visibility: hidden; -} -.bodywebsite .slick-slide { - float: left; - min-height: 1px; - display: none; -} -.bodywebsite [dir="rtl"] .slick-slide { - float: right; -} -.bodywebsite .slick-slide img { - display: block; -} -.bodywebsite .slick-slide.slick-loading img { - display: none; -} -.bodywebsite .slick-slide.dragging img { - pointer-events: none; -} -.bodywebsite .slick-initialized .slick-slide { - display: block; -} -.bodywebsite .slick-loading .slick-slide { - visibility: hidden; -} -.bodywebsite .slick-vertical .slick-slide { - display: block; - height: auto; - border: 1px solid transparent; -} -.bodywebsite .slick-arrow.slick-hidden { - display: none; -} -.bodywebsite .slick-loading .slick-list { - background: #fff url("medias/image/ref; ?>/ajax-loading.gif") center center no-repeat; -} -.bodywebsite .slick-prev, -.bodywebsite .slick-next { - position: absolute; - display: block; - height: 20px; - width: 20px; - line-height: 0; - font-size: 0; - cursor: pointer; - background: rgba(0, 0, 0, 0.6); - color: transparent; - top: 50%; - -webkit-transform: translate(0, -50%); - -ms-transform: translate(0, -50%); - transform: translate(0, -50%); - padding: 0; - border: none; - outline: none; - z-index: 999; -} -.bodywebsite .slick-prev:hover, -.bodywebsite .slick-prev:focus, -.bodywebsite .slick-next:hover, -.bodywebsite .slick-next:focus { - outline: none; - background: transparent; - color: transparent; -} -.bodywebsite .slick-prev:hover:before, -.bodywebsite .slick-prev:focus:before, -.bodywebsite .slick-next:hover:before, -.bodywebsite .slick-next:focus:before { - opacity: 1; -} -.bodywebsite .slick-prev.slick-disabled:before, -.bodywebsite .slick-next.slick-disabled:before { - opacity: 0.25; -} -.bodywebsite .slick-prev:before, -.bodywebsite .slick-next:before { - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 20px; - line-height: 1; - color: white; - opacity: 0.75; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.bodywebsite .slick-prev { - left: 0; -} -.bodywebsite [dir="rtl"] .slick-prev { - left: auto; - right: 0; -} -.bodywebsite .slick-prev:before { - content: "←"; -} -.bodywebsite [dir="rtl"] .slick-prev:before { - content: "→"; -} -.bodywebsite .slick-next { - right: 0; -} -.bodywebsite [dir="rtl"] .slick-next { - left: 0; - right: auto; -} -.bodywebsite .slick-next:before { - content: "→"; -} -.bodywebsite [dir="rtl"] .slick-next:before { - content: "←"; -} -.bodywebsite .slick-slider { - margin-top: 30px; -} -.bodywebsite .slick-slider *:focus { - outline: 0; -} -.bodywebsite .slick-dots { - display: block; - margin-top: 20px; - list-style: none; - width: 100%; - padding: 0; - text-align: center; - font-size: 0; - line-height: 0; - word-spacing: 0; -} -.bodywebsite .slick-dots li { - position: relative; - display: inline-block; - height: 20px; - width: 20px; - margin: 0 5px; - padding: 0; - cursor: pointer; -} -.bodywebsite .slick-dots li button { - background: none; - border: none; - display: inline-block; - padding: 0; - outline: none; - outline-offset: 0; - cursor: pointer; - -webkit-appearance: none; - width: 8px; - height: 8px; - border-radius: 100px; - background: #ababab; -} -.bodywebsite .slick-dots li button::-moz-focus-inner { - border: none; - padding: 0; -} -.bodywebsite .slick-dots li.slick-active button, -.bodywebsite .slick-dots li:hover button { - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .slick-dots-variant-1 .slick-dots li button { - height: 12px; - width: 12px; - background: rgba(58, 60, 62, 0.5); - transition: .33s all ease; - position: relative; -} -.bodywebsite .slick-dots-variant-1 .slick-dots li button:after { - content: ''; - position: absolute; - top: 50%; - left: 50%; - width: 19px; - height: 19px; - border: 4px solid #fff; - opacity: 0; - border-radius: 50%; - -webkit-transform: translate(-50%, -50%) scale(0); - transform: translate(-50%, -50%) scale(0); - transition: 180ms ease-in-out; -} -.bodywebsite .slick-dots-variant-1 .slick-dots li.slick-active button, -.bodywebsite .slick-dots-variant-1 .slick-dots li:hover button { - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .slick-dots-variant-1 .slick-dots li.slick-active button:after, -.bodywebsite .slick-dots-variant-1 .slick-dots li:hover button:after { - opacity: 1; - -webkit-transform: translate(-50%, -50%) scale(1); - transform: translate(-50%, -50%) scale(1); -} -.bodywebsite .slick-carousel-complex-variant-1 { - position: relative; - padding-bottom: 60px; -} -.bodywebsite .slick-carousel-complex-variant-1:after { - content: ''; - position: absolute; - top: 80px; - left: 50%; - bottom: 0; - transform: translateX(-50%); - width: 101vw; - background: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .slick-carousel-complex-variant-1 > * { - position: relative; - z-index: 2; -} -.bodywebsite .slick-carousel-complex-variant-1 .slick-slider { - margin-bottom: 0; -} -.bodywebsite .slick-carousel-complex-variant-1 .slick-dots { - margin-top: 30px; -} -@media (min-width: 768px) { - .bodywebsite .slick-carousel-complex-variant-1 { - padding-bottom: 90px; - } -} -.bodywebsite .slick-slider-images .item { - padding: 0 15px; - text-align: right; -} -.bodywebsite .slick-slider-images .item img { - display: inline-block; - transform: scale(0.75); - transform-origin: 100% 50%; - will-change: transform; - cursor: pointer; - transition: .5s all ease; -} -.bodywebsite .slick-slider-images .item.slick-center { - text-align: center; -} -.bodywebsite .slick-slider-images .item.slick-center img { - transform-origin: 50% 50%; - transform: scale(1); -} -.bodywebsite .slick-slider-images .item.slick-center + * { - text-align: left; -} -.bodywebsite .slick-slider-images .item.slick-center + * img { - transform-origin: 0 50%; -} -.bodywebsite .slick-carousel-round-image .item img { - border-radius: 50%; -} -.bodywebsite .carousel-testimonials-home .slick-slide { - text-align: center; -} -.bodywebsite #sectiontestimonies.maincolorbackground { - background-image: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -@media (min-width: 576px) { - .bodywebsite .carousel-testimonials-home .slick-slide { - text-align: left; - } -} -.bodywebsite .carousel-testimonials-home .slick-dots li button { - background: rgba(246, 247, 250, 0.5); -} -.bodywebsite .carousel-testimonials-home .item { - padding-left: 10px; - padding-right: 10px; -} -@media (min-width: 1200px) { - .bodywebsite .carousel-testimonials-home .item { - padding-left: 0; - padding-right: 0; - } -} -@media (min-width: 576px) { - .bodywebsite .carousel-testimonials-home .slick-dots { - display: none !important; - } -} -.bodywebsite .carousel-testimonials-home .slick-images .item { - padding-left: 0; - padding-right: 0; -} -.bodywebsite .carousel-testimonials-home .slick-images .item .imp-wrap { - text-align: center; - position: relative; - padding: 10px; -} -.bodywebsite .carousel-testimonials-home .slick-images .item .imp-wrap:after { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%) scale(0); - content: ''; - display: inline-block; - margin-left: 0px; - border: 1px solid #fccb56; - width: 116px; - height: 116px; - border-radius: 50%; - transition: 200ms ease-in-out; - opacity: 0; - pointer-events: none; -} -.bodywebsite .carousel-testimonials-home .slick-images .item .imp-wrap img { - display: inline-block; - border-radius: 50%; - cursor: pointer; -} -.bodywebsite .carousel-testimonials-home .slick-images .item:hover .imp-wrap:after, -.bodywebsite .carousel-testimonials-home .slick-images .item.slick-current .imp-wrap:after { - transform: translate(-50%, -50%) scale(1); - opacity: 1; -} -.bodywebsite .carousel-testimonials-home .quote-desc { - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} -.bodywebsite .websitemaincolor { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .maincolor { - color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .maincolorbis { - color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important; -} -.bodywebsite .maincolorbackground { - background-color: maincolor) ? 'rgb(50, 120, 180)' : '#'.$website->maincolor; ?>; -} -.bodywebsite .maincolorbisbackground { - background-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important; - border-color: maincolorbis) ? '#6ca' : '#'.$website->maincolorbis; ?> !important; -} -.bodywebsite .maincolorbisbackground:hover { - box-shadow: 1px 1px 8px #aaa; -} -.bodywebsite textarea:focus, -.bodywebsite button:focus { - border: unset !important; -} -.bodywebsite .marginrightonly { - margin-right: 10px !important; -} -.bodywebsite .inline-block { - display: inline-block; -} -.bodywebsite .valignmiddle { - vertical-align: middle; -} -.bodywebsite .center { - text-align: center; -} -.bodywebsite button.buttonwithnoborder.toggle-original.active { - display: none; -} -.bodywebsite .rd-navbar-nav-wrap.active .toggle-original span.icon.icon-xs.icon-dusty-gray.fa.fa-search { - display: none; -} -.bodywebsite ul.rd-navbar-list { - padding-top: 20px; -} -.bodywebsite .photouser:hover, -.bodywebsite .photouser:active { - border: 2px solid #eee; -} -.bodywebsite .imp-wrap { - display: inline-block; -} -.bodywebsite .imp-wrap img { - border-radius: 50px; -} -.bodywebsite .text-green { - color: #6ca; -} -.bodywebsite .plan-tile .plan-title { - padding: 20px 0 0; - font-size: 20px; - font-weight: bold; - text-align: center; -} -.bodywebsite .plan-tile .plan-tag { - color: #687484; - text-align: center; - font-size: 16px; - padding: 0 5px 10px; - font-weight: 300; - min-height: 70px; -} -.bodywebsite .plan-tile .plan-pricer .plan-price-title { - display: block; - text-align: center; - color: #8492A6; - font-style: italic; - position: absolute; - top: 30px; - transform: translateX(-50%); - -webkit-transform: translateX(-50%); - left: 50%; - font-size: 16px; - width: 100%; - font-weight: 300; -} -.bodywebsite .plan-tile .plan-feat { - display: block; - font-size: 14px; - color: #3C4858; - text-align: center; - padding: 22px 10px; - min-height: 90px; -} -.bodywebsite .plan-tile .plan-pricer .plan-price { - border-bottom: 1px solid #d5dadf; - border-top: 1px solid #d5dadf; - padding: 20px 0 20px; - display: block; -} -.bodywebsite .plan-tile .plan-pricer .plan-price > span { - color: #3C4858; - font-size: 32px; -} -.bodywebsite .plan-tile .plan-pricer .plan-price > span > sup { - font-size: 13px; - top: -0.9em; -} -.bodywebsite .plan-tile .plan-pricer { - padding: 5px 0; - text-align: center; - max-width: 90%; - position: relative; - margin: auto; -} -.bodywebsite .pricing-plan-slider .plan-tile .plan-btn { - position: absolute; - bottom: 0px; - left: 0; - width: 100%; -} -.bodywebsite .plan-tile .plan-btn { - text-align: center; - padding: 0 15px 15px 15px; -} -.bodywebsite .plan-features { - padding-top: 20px; - padding-bottom: 20px; - padding-left: 20px; - padding-right: 20px; -} -.bodywebsite .formcontact div { - margin: 2px; -} -.bodywebsite section#sectionfooterdolibarr { - padding-left: 3px; - padding-right: 3px; - padding-bottom: 10px; -} -.bodywebsite button.buttonwithnoborder.toggle-original { - font: 400 18px/36px "FontAwesome"; - /* If removed, the search icon is not visible */ -} -.bodywebsite .rd-navbar-fixed .buttonsearchwhenstatic { - display: none; -} -.bodywebsite input[type="text"] { - display: block; - width: 100%; - padding: 11px 35px; - font-size: 14px; - line-height: 1.25; - background-image: none; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 0.25rem; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} -@media print { - .bodywebsite *, - .bodywebsite *::before, - .bodywebsite *::after { - text-shadow: none !important; - box-shadow: none !important; - } - .bodywebsite a, - .bodywebsite a:visited { - text-decoration: underline; - } - .bodywebsite abbr[title]::after { - content: " (" attr(title) ")"; - } - .bodywebsite pre { - white-space: pre-wrap !important; - } - .bodywebsite pre, - .bodywebsite blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - .bodywebsite thead { - display: table-header-group; - } - .bodywebsite tr, - .bodywebsite img { - page-break-inside: avoid; - } - .bodywebsite p, - .bodywebsite h2, - .bodywebsite h3 { - orphans: 3; - widows: 3; - } - .bodywebsite h2, - .bodywebsite h3 { - page-break-after: avoid; - } - .bodywebsite .navbar { - display: none; - } - .bodywebsite .badge { - border: 1px solid #000; - } - .bodywebsite .table { - border-collapse: collapse !important; - } - .bodywebsite .table td, - .bodywebsite .table th { - background-color: #fff !important; - } - .bodywebsite .table-bordered th, - .bodywebsite .table-bordered td { - border: 1px solid #ddd !important; - } -} -.bodywebsite *, -.bodywebsite *::before, -.bodywebsite *::after { - box-sizing: border-box; -} -html .bodywebsite { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - -ms-overflow-style: scrollbar; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -@-ms-viewport { - width: device-width; -} -.bodywebsite article, -.bodywebsite aside, -.bodywebsite dialog, -.bodywebsite figcaption, -.bodywebsite figure, -.bodywebsite footer, -.bodywebsite header, -.bodywebsite hgroup, -.bodywebsite main, -.bodywebsite nav, -.bodywebsite section { - display: block; -} -.bodywebsite { - margin: 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-size: 14px; - font-weight: 400; - line-height: 1.71429; - text-align: left; - background-color: #fff; -} -.bodywebsite [tabindex="-1"]:focus { - outline: none !important; -} -.bodywebsite hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} -.bodywebsite h1, -.bodywebsite h2, -.bodywebsite h3, -.bodywebsite h4, -.bodywebsite h5, -.bodywebsite h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} -.bodywebsite abbr[title], -.bodywebsite abbr[data-original-title] { - text-decoration: underline; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; -} -.bodywebsite address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} -.bodywebsite ol, -.bodywebsite ul, -.bodywebsite dl { - margin-top: 0; -} -.bodywebsite ol ol, -.bodywebsite ul ul, -.bodywebsite ol ul, -.bodywebsite ul ol { - margin-bottom: 0; -} -.bodywebsite dt { - font-weight: inherit; -} -.bodywebsite dd { - margin-bottom: .5rem; - margin-left: 0; -} -.bodywebsite blockquote { - margin: 0 0 1rem; -} -.bodywebsite dfn { - font-style: italic; -} -.bodywebsite b, -.bodywebsite strong { - font-weight: bolder; -} -.bodywebsite small { - font-size: 80%; -} -.bodywebsite sub, -.bodywebsite sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -.bodywebsite sub { - bottom: -0.25em; -} -.bodywebsite sup { - top: -0.5em; -} -.bodywebsite a { - text-decoration: none; - -webkit-text-decoration-skip: objects; -} -.bodywebsite a:hover { - text-decoration: none; -} -.bodywebsite a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none; -} -.bodywebsite a:not([href]):not([tabindex]):focus, -.bodywebsite a:not([href]):not([tabindex]):hover { - color: inherit; - text-decoration: none; -} -.bodywebsite a:not([href]):not([tabindex]):focus { - outline: 0; -} -.bodywebsite pre, -.bodywebsite code, -.bodywebsite kbd, -.bodywebsite samp { - font-family: monospace, monospace; - font-size: 1em; -} -.bodywebsite pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; -} -.bodywebsite figure { - margin: 0 0 1rem; -} -.bodywebsite img { - vertical-align: middle; - border-style: none; -} -.bodywebsite svg:not(:root) { - overflow: hidden; -} -.bodywebsite a, -.bodywebsite area, -.bodywebsite button, -.bodywebsite [role="button"], -.bodywebsite input:not([type="range"]), -.bodywebsite label, -.bodywebsite select, -.bodywebsite summary, -.bodywebsite textarea { - touch-action: manipulation; -} -.bodywebsite table { - border-collapse: collapse; -} -.bodywebsite caption { - padding-top: 17px 25px 18px; - padding-bottom: 17px 25px 18px; - color: #dedede; - text-align: left; - caption-side: bottom; -} -.bodywebsite th { - text-align: inherit; -} -.bodywebsite label { - display: inline-block; - margin-bottom: .5rem; -} -.bodywebsite button { - border-radius: 0; -} -.bodywebsite button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} -.bodywebsite input, -.bodywebsite button, -.bodywebsite select, -.bodywebsite optgroup, -.bodywebsite textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -.bodywebsite button, -.bodywebsite input { - overflow: visible; -} -.bodywebsite button, -.bodywebsite select { - text-transform: none; -} -.bodywebsite button, -html .bodywebsite [type="button"], -.bodywebsite [type="reset"], -.bodywebsite [type="submit"] { - -webkit-appearance: button; -} -.bodywebsite button::-moz-focus-inner, -.bodywebsite [type="button"]::-moz-focus-inner, -.bodywebsite [type="reset"]::-moz-focus-inner, -.bodywebsite [type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none; -} -.bodywebsite input[type="radio"], -.bodywebsite input[type="checkbox"] { - box-sizing: border-box; - padding: 0; -} -.bodywebsite input[type="date"], -.bodywebsite input[type="time"], -.bodywebsite input[type="datetime-local"], -.bodywebsite input[type="month"] { - -webkit-appearance: listbox; -} -.bodywebsite textarea { - overflow: auto; - resize: vertical; -} -.bodywebsite fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -.bodywebsite legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} -.bodywebsite progress { - vertical-align: baseline; -} -.bodywebsite [type="number"]::-webkit-inner-spin-button, -.bodywebsite [type="number"]::-webkit-outer-spin-button { - height: auto; -} -.bodywebsite [type="search"] { - outline-offset: -2px; - -webkit-appearance: none; -} -.bodywebsite [type="search"]::-webkit-search-cancel-button, -.bodywebsite [type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -.bodywebsite ::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} -.bodywebsite output { - display: inline-block; -} -.bodywebsite summary { - display: list-item; -} -.bodywebsite template { - display: none; -} -.bodywebsite [hidden] { - display: none !important; -} -.bodywebsite h1, -.bodywebsite h2, -.bodywebsite h3, -.bodywebsite h4, -.bodywebsite h5, -.bodywebsite h6, -.bodywebsite .h1, -.bodywebsite .h2, -.bodywebsite .h3, -.bodywebsite .h4, -.bodywebsite .h5, -.bodywebsite .h6 { - margin-bottom: 0.5rem; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-weight: 700; - line-height: 1.1; - color: #000; -} -.bodywebsite h1, -.bodywebsite .h1 { - font-size: 45px; -} -.bodywebsite h2, -.bodywebsite .h2 { - font-size: 24px; -} -.bodywebsite h3, -.bodywebsite .h3 { - font-size: 33px; -} -.bodywebsite h4, -.bodywebsite .h4 { - font-size: 18px; -} -.bodywebsite .lead { - font-size: 24px; - font-weight: 300; -} -.bodywebsite .display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2; -} -.bodywebsite .display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2; -} -.bodywebsite .display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2; -} -.bodywebsite .display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2; -} -.bodywebsite hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid #2a2b2b; -} -.bodywebsite small, -.bodywebsite .small { - font-size: 80%; - font-weight: 400; -} -.bodywebsite mark, -.bodywebsite .mark { - padding: 5px 10px; - background-color: #37c386; -} -.bodywebsite .list-unstyled { - padding-left: 0; - list-style: none; -} -.bodywebsite .list-inline { - padding-left: 0; - list-style: none; -} -.bodywebsite .list-inline-item { - display: inline-block; -} -.bodywebsite .list-inline-item:not(:last-child) { - margin-right: 5px; -} -.bodywebsite .initialism { - font-size: 90%; - text-transform: uppercase; -} -.bodywebsite .blockquote { - margin-bottom: 1rem; - font-size: 17.5px; -} -.bodywebsite .blockquote-footer { - display: block; - font-size: 80%; - color: #dedede; -} -.bodywebsite .blockquote-footer::before { - content: "\2014 \00A0"; -} -.bodywebsite .img-fluid { - max-width: 100%; - height: auto; -} -.bodywebsite code, -.bodywebsite kbd, -.bodywebsite pre, -.bodywebsite samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -.bodywebsite code { - padding: 10px 5px; - font-size: 90%; - color: #00030a; - background-color: #edeff4; - border-radius: 0; -} -.bodywebsite a > code { - padding: 0; - color: inherit; - background-color: inherit; -} -.bodywebsite kbd { - padding: 10px 5px; - font-size: 90%; - color: #fff; - background-color: #212529; - border-radius: 3px; - box-shadow: inset 0 -0.1rem 0 rgba(0, 0, 0, 0.25); -} -.bodywebsite kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; - box-shadow: none; -} -.bodywebsite pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - font-size: 90%; - color: #212529; -} -.bodywebsite pre code { - padding: 0; - font-size: inherit; - color: inherit; - background-color: transparent; - border-radius: 0; -} -.bodywebsite .pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.bodywebsite .container { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 576px) { - .bodywebsite .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .bodywebsite .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .bodywebsite .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .bodywebsite .container { - max-width: 1170px; - } -} -.bodywebsite .container-fluid { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.bodywebsite .row { - display: flex; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} -.bodywebsite .no-gutters { - margin-right: 0; - margin-left: 0; -} -.bodywebsite .no-gutters > .col, -.bodywebsite .no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0; -} -.bodywebsite .col-1, -.bodywebsite .col-2, -.bodywebsite .col-3, -.bodywebsite .col-4, -.bodywebsite .col-5, -.bodywebsite .col-6, -.bodywebsite .col-7, -.bodywebsite .col-8, -.bodywebsite .col-9, -.bodywebsite .col-10, -.bodywebsite .col-11, -.bodywebsite .col-12, -.bodywebsite .col, -.bodywebsite .col-auto, -.bodywebsite .col-sm-1, -.bodywebsite .col-sm-2, -.bodywebsite .col-sm-3, -.bodywebsite .col-sm-4, -.bodywebsite .col-sm-5, -.bodywebsite .col-sm-6, -.bodywebsite .col-sm-7, -.bodywebsite .col-sm-8, -.bodywebsite .col-sm-9, -.bodywebsite .col-sm-10, -.bodywebsite .col-sm-11, -.bodywebsite .col-sm-12, -.bodywebsite .col-sm, -.bodywebsite .col-sm-auto, -.bodywebsite .col-md-1, -.bodywebsite .col-md-2, -.bodywebsite .col-md-3, -.bodywebsite .col-md-4, -.bodywebsite .col-md-5, -.bodywebsite .col-md-6, -.bodywebsite .col-md-7, -.bodywebsite .col-md-8, -.bodywebsite .col-md-9, -.bodywebsite .col-md-10, -.bodywebsite .col-md-11, -.bodywebsite .col-md-12, -.bodywebsite .col-md, -.bodywebsite .col-md-auto, -.bodywebsite .col-lg-1, -.bodywebsite .col-lg-2, -.bodywebsite .col-lg-3, -.bodywebsite .col-lg-4, -.bodywebsite .col-lg-5, -.bodywebsite .col-lg-6, -.bodywebsite .col-lg-7, -.bodywebsite .col-lg-8, -.bodywebsite .col-lg-9, -.bodywebsite .col-lg-10, -.bodywebsite .col-lg-11, -.bodywebsite .col-lg-12, -.bodywebsite .col-lg, -.bodywebsite .col-lg-auto, -.bodywebsite .col-xl-1, -.bodywebsite .col-xl-2, -.bodywebsite .col-xl-3, -.bodywebsite .col-xl-4, -.bodywebsite .col-xl-5, -.bodywebsite .col-xl-6, -.bodywebsite .col-xl-7, -.bodywebsite .col-xl-8, -.bodywebsite .col-xl-9, -.bodywebsite .col-xl-10, -.bodywebsite .col-xl-11, -.bodywebsite .col-xl-12, -.bodywebsite .col-xl, -.bodywebsite .col-xl-auto, -.bodywebsite .col-xxl-1, -.bodywebsite .col-xxl-2, -.bodywebsite .col-xxl-3, -.bodywebsite .col-xxl-4, -.bodywebsite .col-xxl-5, -.bodywebsite .col-xxl-6, -.bodywebsite .col-xxl-7, -.bodywebsite .col-xxl-8, -.bodywebsite .col-xxl-9, -.bodywebsite .col-xxl-10, -.bodywebsite .col-xxl-11, -.bodywebsite .col-xxl-12, -.bodywebsite .col-xxl, -.bodywebsite .col-xxl-auto { - position: relative; - width: 100%; - min-height: 1px; - padding-right: 15px; - padding-left: 15px -} -.bodywebsite .col { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; -} -.bodywebsite .col-auto { - flex: 0 0 auto; - width: auto; - max-width: none; -} -.bodywebsite .col-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; -} -.bodywebsite .col-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; -} -.bodywebsite .col-3 { - flex: 0 0 25%; - max-width: 25%; -} -.bodywebsite .col-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; -} -.bodywebsite .col-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; -} -.bodywebsite .col-6 { - flex: 0 0 50%; - max-width: 50%; -} -.bodywebsite .col-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; -} -.bodywebsite .col-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; -} -.bodywebsite .col-9 { - flex: 0 0 75%; - max-width: 75%; -} -.bodywebsite .col-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; -} -.bodywebsite .col-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; -} -.bodywebsite .col-12 { - flex: 0 0 100%; - max-width: 100%; -} -.bodywebsite .order-first { - order: -1; -} -.bodywebsite .order-1 { - order: 1; -} -.bodywebsite .order-2 { - order: 2; -} -.bodywebsite .order-3 { - order: 3; -} -.bodywebsite .order-4 { - order: 4; -} -.bodywebsite .order-5 { - order: 5; -} -.bodywebsite .order-6 { - order: 6; -} -.bodywebsite .order-7 { - order: 7; -} -.bodywebsite .order-8 { - order: 8; -} -.bodywebsite .order-9 { - order: 9; -} -.bodywebsite .order-10 { - order: 10; -} -.bodywebsite .order-11 { - order: 11; -} -.bodywebsite .order-12 { - order: 12; -} -.bodywebsite .offset-1 { - margin-left: 8.33333%; -} -.bodywebsite .offset-2 { - margin-left: 16.66667%; -} -.bodywebsite .offset-3 { - margin-left: 25%; -} -.bodywebsite .offset-4 { - margin-left: 33.33333%; -} -.bodywebsite .offset-5 { - margin-left: 41.66667%; -} -.bodywebsite .offset-6 { - margin-left: 50%; -} -.bodywebsite .offset-7 { - margin-left: 58.33333%; -} -.bodywebsite .offset-8 { - margin-left: 66.66667%; -} -.bodywebsite .offset-9 { - margin-left: 75%; -} -.bodywebsite .offset-10 { - margin-left: 83.33333%; -} -.bodywebsite .offset-11 { - margin-left: 91.66667%; -} -@media (min-width: 576px) { - .bodywebsite .col-sm { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .bodywebsite .col-sm-auto { - flex: 0 0 auto; - width: auto; - max-width: none; - } - .bodywebsite .col-sm-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .bodywebsite .col-sm-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .bodywebsite .col-sm-3 { - flex: 0 0 25%; - max-width: 25%; - } - .bodywebsite .col-sm-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .bodywebsite .col-sm-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .bodywebsite .col-sm-6 { - flex: 0 0 50%; - max-width: 50%; - } - .bodywebsite .col-sm-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .bodywebsite .col-sm-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .bodywebsite .col-sm-9 { - flex: 0 0 75%; - max-width: 75%; - } - .bodywebsite .col-sm-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .bodywebsite .col-sm-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .bodywebsite .col-sm-12 { - flex: 0 0 100%; - max-width: 100%; - } - .bodywebsite .order-sm-first { - order: -1; - } - .bodywebsite .order-sm-1 { - order: 1; - } - .bodywebsite .order-sm-2 { - order: 2; - } - .bodywebsite .order-sm-3 { - order: 3; - } - .bodywebsite .order-sm-4 { - order: 4; - } - .bodywebsite .order-sm-5 { - order: 5; - } - .bodywebsite .order-sm-6 { - order: 6; - } - .bodywebsite .order-sm-7 { - order: 7; - } - .bodywebsite .order-sm-8 { - order: 8; - } - .bodywebsite .order-sm-9 { - order: 9; - } - .bodywebsite .order-sm-10 { - order: 10; - } - .bodywebsite .order-sm-11 { - order: 11; - } - .bodywebsite .order-sm-12 { - order: 12; - } - .bodywebsite .offset-sm-0 { - margin-left: 0; - } - .bodywebsite .offset-sm-1 { - margin-left: 8.33333%; - } - .bodywebsite .offset-sm-2 { - margin-left: 16.66667%; - } - .bodywebsite .offset-sm-3 { - margin-left: 25%; - } - .bodywebsite .offset-sm-4 { - margin-left: 33.33333%; - } - .bodywebsite .offset-sm-5 { - margin-left: 41.66667%; - } - .bodywebsite .offset-sm-6 { - margin-left: 50%; - } - .bodywebsite .offset-sm-7 { - margin-left: 58.33333%; - } - .bodywebsite .offset-sm-8 { - margin-left: 66.66667%; - } - .bodywebsite .offset-sm-9 { - margin-left: 75%; - } - .bodywebsite .offset-sm-10 { - margin-left: 83.33333%; - } - .bodywebsite .offset-sm-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 768px) { - .bodywebsite .col-md { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .bodywebsite .col-md-auto { - flex: 0 0 auto; - width: auto; - max-width: none; - } - .bodywebsite .col-md-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .bodywebsite .col-md-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .bodywebsite .col-md-3 { - flex: 0 0 25%; - max-width: 25%; - } - .bodywebsite .col-md-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .bodywebsite .col-md-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .bodywebsite .col-md-6 { - flex: 0 0 50%; - max-width: 50%; - } - .bodywebsite .col-md-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .bodywebsite .col-md-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .bodywebsite .col-md-9 { - flex: 0 0 75%; - max-width: 75%; - } - .bodywebsite .col-md-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .bodywebsite .col-md-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .bodywebsite .col-md-12 { - flex: 0 0 100%; - max-width: 100%; - } - .bodywebsite .order-md-first { - order: -1; - } - .bodywebsite .order-md-1 { - order: 1; - } - .bodywebsite .order-md-2 { - order: 2; - } - .bodywebsite .order-md-3 { - order: 3; - } - .bodywebsite .order-md-4 { - order: 4; - } - .bodywebsite .order-md-5 { - order: 5; - } - .bodywebsite .order-md-6 { - order: 6; - } - .bodywebsite .order-md-7 { - order: 7; - } - .bodywebsite .order-md-8 { - order: 8; - } - .bodywebsite .order-md-9 { - order: 9; - } - .bodywebsite .order-md-10 { - order: 10; - } - .bodywebsite .order-md-11 { - order: 11; - } - .bodywebsite .order-md-12 { - order: 12; - } - .bodywebsite .offset-md-0 { - margin-left: 0; - } - .bodywebsite .offset-md-1 { - margin-left: 8.33333%; - } - .bodywebsite .offset-md-2 { - margin-left: 16.66667%; - } - .bodywebsite .offset-md-3 { - margin-left: 25%; - } - .bodywebsite .offset-md-4 { - margin-left: 33.33333%; - } - .bodywebsite .offset-md-5 { - margin-left: 41.66667%; - } - .bodywebsite .offset-md-6 { - margin-left: 50%; - } - .bodywebsite .offset-md-7 { - margin-left: 58.33333%; - } - .bodywebsite .offset-md-8 { - margin-left: 66.66667%; - } - .bodywebsite .offset-md-9 { - margin-left: 75%; - } - .bodywebsite .offset-md-10 { - margin-left: 83.33333%; - } - .bodywebsite .offset-md-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 992px) { - .bodywebsite .col-lg { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .bodywebsite .col-lg-auto { - flex: 0 0 auto; - width: auto; - max-width: none; - } - .bodywebsite .col-lg-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .bodywebsite .col-lg-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .bodywebsite .col-lg-3 { - flex: 0 0 25%; - max-width: 25%; - } - .bodywebsite .col-lg-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .bodywebsite .col-lg-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .bodywebsite .col-lg-6 { - flex: 0 0 50%; - max-width: 50%; - } - .bodywebsite .col-lg-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .bodywebsite .col-lg-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .bodywebsite .col-lg-9 { - flex: 0 0 75%; - max-width: 75%; - } - .bodywebsite .col-lg-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .bodywebsite .col-lg-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .bodywebsite .col-lg-12 { - flex: 0 0 100%; - max-width: 100%; - } - .bodywebsite .order-lg-first { - order: -1; - } - .bodywebsite .order-lg-1 { - order: 1; - } - .bodywebsite .order-lg-2 { - order: 2; - } - .bodywebsite .order-lg-3 { - order: 3; - } - .bodywebsite .order-lg-4 { - order: 4; - } - .bodywebsite .order-lg-5 { - order: 5; - } - .bodywebsite .order-lg-6 { - order: 6; - } - .bodywebsite .order-lg-7 { - order: 7; - } - .bodywebsite .order-lg-8 { - order: 8; - } - .bodywebsite .order-lg-9 { - order: 9; - } - .bodywebsite .order-lg-10 { - order: 10; - } - .bodywebsite .order-lg-11 { - order: 11; - } - .bodywebsite .order-lg-12 { - order: 12; - } - .bodywebsite .offset-lg-0 { - margin-left: 0; - } - .bodywebsite .offset-lg-1 { - margin-left: 8.33333%; - } - .bodywebsite .offset-lg-2 { - margin-left: 16.66667%; - } - .bodywebsite .offset-lg-3 { - margin-left: 25%; - } - .bodywebsite .offset-lg-4 { - margin-left: 33.33333%; - } - .bodywebsite .offset-lg-5 { - margin-left: 41.66667%; - } - .bodywebsite .offset-lg-6 { - margin-left: 50%; - } - .bodywebsite .offset-lg-7 { - margin-left: 58.33333%; - } - .bodywebsite .offset-lg-8 { - margin-left: 66.66667%; - } - .bodywebsite .offset-lg-9 { - margin-left: 75%; - } - .bodywebsite .offset-lg-10 { - margin-left: 83.33333%; - } - .bodywebsite .offset-lg-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 1200px) { - .bodywebsite .col-xl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .bodywebsite .col-xl-auto { - flex: 0 0 auto; - width: auto; - max-width: none; - } - .bodywebsite .col-xl-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .bodywebsite .col-xl-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .bodywebsite .col-xl-3 { - flex: 0 0 25%; - max-width: 25%; - } - .bodywebsite .col-xl-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .bodywebsite .col-xl-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .bodywebsite .col-xl-6 { - flex: 0 0 50%; - max-width: 50%; - } - .bodywebsite .col-xl-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .bodywebsite .col-xl-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .bodywebsite .col-xl-9 { - flex: 0 0 75%; - max-width: 75%; - } - .bodywebsite .col-xl-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .bodywebsite .col-xl-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .bodywebsite .col-xl-12 { - flex: 0 0 100%; - max-width: 100%; - } - .bodywebsite .order-xl-first { - order: -1; - } - .bodywebsite .order-xl-1 { - order: 1; - } - .bodywebsite .order-xl-2 { - order: 2; - } - .bodywebsite .order-xl-3 { - order: 3; - } - .bodywebsite .order-xl-4 { - order: 4; - } - .bodywebsite .order-xl-5 { - order: 5; - } - .bodywebsite .order-xl-6 { - order: 6; - } - .bodywebsite .order-xl-7 { - order: 7; - } - .bodywebsite .order-xl-8 { - order: 8; - } - .bodywebsite .order-xl-9 { - order: 9; - } - .bodywebsite .order-xl-10 { - order: 10; - } - .bodywebsite .order-xl-11 { - order: 11; - } - .bodywebsite .order-xl-12 { - order: 12; - } - .bodywebsite .offset-xl-0 { - margin-left: 0; - } - .bodywebsite .offset-xl-1 { - margin-left: 8.33333%; - } - .bodywebsite .offset-xl-2 { - margin-left: 16.66667%; - } - .bodywebsite .offset-xl-3 { - margin-left: 25%; - } - .bodywebsite .offset-xl-4 { - margin-left: 33.33333%; - } - .bodywebsite .offset-xl-5 { - margin-left: 41.66667%; - } - .bodywebsite .offset-xl-6 { - margin-left: 50%; - } - .bodywebsite .offset-xl-7 { - margin-left: 58.33333%; - } - .bodywebsite .offset-xl-8 { - margin-left: 66.66667%; - } - .bodywebsite .offset-xl-9 { - margin-left: 75%; - } - .bodywebsite .offset-xl-10 { - margin-left: 83.33333%; - } - .bodywebsite .offset-xl-11 { - margin-left: 91.66667%; - } -} -@media (min-width: 1800px) { - .bodywebsite .col-xxl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - .bodywebsite .col-xxl-auto { - flex: 0 0 auto; - width: auto; - max-width: none; - } - .bodywebsite .col-xxl-1 { - flex: 0 0 8.33333%; - max-width: 8.33333%; - } - .bodywebsite .col-xxl-2 { - flex: 0 0 16.66667%; - max-width: 16.66667%; - } - .bodywebsite .col-xxl-3 { - flex: 0 0 25%; - max-width: 25%; - } - .bodywebsite .col-xxl-4 { - flex: 0 0 33.33333%; - max-width: 33.33333%; - } - .bodywebsite .col-xxl-5 { - flex: 0 0 41.66667%; - max-width: 41.66667%; - } - .bodywebsite .col-xxl-6 { - flex: 0 0 50%; - max-width: 50%; - } - .bodywebsite .col-xxl-7 { - flex: 0 0 58.33333%; - max-width: 58.33333%; - } - .bodywebsite .col-xxl-8 { - flex: 0 0 66.66667%; - max-width: 66.66667%; - } - .bodywebsite .col-xxl-9 { - flex: 0 0 75%; - max-width: 75%; - } - .bodywebsite .col-xxl-10 { - flex: 0 0 83.33333%; - max-width: 83.33333%; - } - .bodywebsite .col-xxl-11 { - flex: 0 0 91.66667%; - max-width: 91.66667%; - } - .bodywebsite .col-xxl-12 { - flex: 0 0 100%; - max-width: 100%; - } - .bodywebsite .order-xxl-first { - order: -1; - } - .bodywebsite .order-xxl-1 { - order: 1; - } - .bodywebsite .order-xxl-2 { - order: 2; - } - .bodywebsite .order-xxl-3 { - order: 3; - } - .bodywebsite .order-xxl-4 { - order: 4; - } - .bodywebsite .order-xxl-5 { - order: 5; - } - .bodywebsite .order-xxl-6 { - order: 6; - } - .bodywebsite .order-xxl-7 { - order: 7; - } - .bodywebsite .order-xxl-8 { - order: 8; - } - .bodywebsite .order-xxl-9 { - order: 9; - } - .bodywebsite .order-xxl-10 { - order: 10; - } - .bodywebsite .order-xxl-11 { - order: 11; - } - .bodywebsite .order-xxl-12 { - order: 12; - } - .bodywebsite .offset-xxl-0 { - margin-left: 0; - } - .bodywebsite .offset-xxl-1 { - margin-left: 8.33333%; - } - .bodywebsite .offset-xxl-2 { - margin-left: 16.66667%; - } - .bodywebsite .offset-xxl-3 { - margin-left: 25%; - } - .bodywebsite .offset-xxl-4 { - margin-left: 33.33333%; - } - .bodywebsite .offset-xxl-5 { - margin-left: 41.66667%; - } - .bodywebsite .offset-xxl-6 { - margin-left: 50%; - } - .bodywebsite .offset-xxl-7 { - margin-left: 58.33333%; - } - .bodywebsite .offset-xxl-8 { - margin-left: 66.66667%; - } - .bodywebsite .offset-xxl-9 { - margin-left: 75%; - } - .bodywebsite .offset-xxl-10 { - margin-left: 83.33333%; - } - .bodywebsite .offset-xxl-11 { - margin-left: 91.66667%; - } -} -.bodywebsite .table { - width: 100%; - max-width: 100%; - margin-bottom: 1rem; - background-color: transparent; -} -.bodywebsite .table th, -.bodywebsite .table td { - padding: 17px 25px 18px; - vertical-align: top; - border-top: 1px solid #d9d9d9; -} -.bodywebsite .table thead th { - vertical-align: bottom; - border-bottom: 2px solid #d9d9d9; -} -.bodywebsite .table tbody + tbody { - border-top: 2px solid #d9d9d9; -} -.bodywebsite .table .table { - background-color: #fff; -} -.bodywebsite .table-sm th, -.bodywebsite .table-sm td { - padding: 0.3rem; -} -.bodywebsite .table-bordered { - border: 1px solid #d9d9d9; -} -.bodywebsite .table-bordered th, -.bodywebsite .table-bordered td { - border: 1px solid #d9d9d9; -} -.bodywebsite .table-bordered thead th, -.bodywebsite .table-bordered thead td { - border-bottom-width: 2px; -} -.bodywebsite .table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} -.bodywebsite .table-hover tbody tr:hover { - background-color: rgba(0, 0, 0, 0.075); -} -.bodywebsite .table-primary, -.bodywebsite .table-primary > th, -.bodywebsite .table-primary > td { - background-color: #b8daff; -} -.bodywebsite .table-hover .table-primary:hover { - background-color: #9fcdff; -} -.bodywebsite .table-hover .table-primary:hover > td, -.bodywebsite .table-hover .table-primary:hover > th { - background-color: #9fcdff; -} -.bodywebsite .table-secondary, -.bodywebsite .table-secondary > th, -.bodywebsite .table-secondary > td { - background-color: #dddfe2; -} -.bodywebsite .table-hover .table-secondary:hover { - background-color: #cfd2d6; -} -.bodywebsite .table-hover .table-secondary:hover > td, -.bodywebsite .table-hover .table-secondary:hover > th { - background-color: #cfd2d6; -} -.bodywebsite .table-success, -.bodywebsite .table-success > th, -.bodywebsite .table-success > td { - background-color: #c3e6cb; -} -.bodywebsite .table-hover .table-success:hover { - background-color: #b1dfbb; -} -.bodywebsite .table-hover .table-success:hover > td, -.bodywebsite .table-hover .table-success:hover > th { - background-color: #b1dfbb; -} -.bodywebsite .table-info, -.bodywebsite .table-info > th, -.bodywebsite .table-info > td { - background-color: #bee5eb; -} -.bodywebsite .table-hover .table-info:hover { - background-color: #abdde5; -} -.bodywebsite .table-hover .table-info:hover > td, -.bodywebsite .table-hover .table-info:hover > th { - background-color: #abdde5; -} -.bodywebsite .table-warning, -.bodywebsite .table-warning > th, -.bodywebsite .table-warning > td { - background-color: #ffeeba; -} -.bodywebsite .table-hover .table-warning:hover { - background-color: #ffe8a1; -} -.bodywebsite .table-hover .table-warning:hover > td, -.bodywebsite .table-hover .table-warning:hover > th { - background-color: #ffe8a1; -} -.bodywebsite .table-danger, -.bodywebsite .table-danger > th, -.bodywebsite .table-danger > td { - background-color: #f5c6cb; -} -.bodywebsite .table-hover .table-danger:hover { - background-color: #f1b0b7; -} -.bodywebsite .table-hover .table-danger:hover > td, -.bodywebsite .table-hover .table-danger:hover > th { - background-color: #f1b0b7; -} -.bodywebsite .table-light, -.bodywebsite .table-light > th, -.bodywebsite .table-light > td { - background-color: #fdfdfe; -} -.bodywebsite .table-hover .table-light:hover { - background-color: #ececf6; -} -.bodywebsite .table-hover .table-light:hover > td, -.bodywebsite .table-hover .table-light:hover > th { - background-color: #ececf6; -} -.bodywebsite .table-dark, -.bodywebsite .table-dark > th, -.bodywebsite .table-dark > td { - background-color: #c6c8ca; -} -.bodywebsite .table-hover .table-dark:hover { - background-color: #b9bbbe; -} -.bodywebsite .table-hover .table-dark:hover > td, -.bodywebsite .table-hover .table-dark:hover > th { - background-color: #b9bbbe; -} -.bodywebsite .table-active, -.bodywebsite .table-active > th, -.bodywebsite .table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} -.bodywebsite .table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} -.bodywebsite .table-hover .table-active:hover > td, -.bodywebsite .table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} -.bodywebsite .table .thead-dark th { - color: #fff; - background-color: #212529; - border-color: #32383e; -} -.bodywebsite .table .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: #d9d9d9; -} -.bodywebsite .table-dark { - color: #fff; - background-color: #212529; -} -.bodywebsite .table-dark th, -.bodywebsite .table-dark td, -.bodywebsite .table-dark thead th { - border-color: #32383e; -} -.bodywebsite .table-dark.table-bordered { - border: 0; -} -.bodywebsite .table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); -} -.bodywebsite .table-dark.table-hover tbody tr:hover { - background-color: rgba(255, 255, 255, 0.075); -} -@media (max-width: 575px) { - .bodywebsite .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - } - .bodywebsite .table-responsive-sm.table-bordered { - border: 0; - } -} -@media (max-width: 767px) { - .bodywebsite .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - } - .bodywebsite .table-responsive-md.table-bordered { - border: 0; - } -} -@media (max-width: 991px) { - .bodywebsite .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - } - .bodywebsite .table-responsive-lg.table-bordered { - border: 0; - } -} -@media (max-width: 1199px) { - .bodywebsite .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - } - .bodywebsite .table-responsive-xl.table-bordered { - border: 0; - } -} -@media (max-width: 1799px) { - .bodywebsite .table-responsive-xxl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - } - .bodywebsite .table-responsive-xxl.table-bordered { - border: 0; - } -} -.bodywebsite .table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; -} -.bodywebsite .table-responsive.table-bordered { - border: 0; -} -.bodywebsite .form-input { - display: block; - width: 100%; - padding: 11px 35px; - font-size: 14px; - line-height: 1.25; - background-image: none; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 0.25rem; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} -.bodywebsite .form-input::-ms-expand { - background-color: transparent; - border: 0; -} -.bodywebsite .form-input:focus { - color: #495057; - background-color: #fff; - border-color: #80bdff; - outline: none; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.bodywebsite .form-input::placeholder { - color: #868e96; - opacity: 1; -} -.bodywebsite .form-input:disabled, -.bodywebsite .form-input[readonly] { - background-color: #e9ecef; - opacity: 1; -} -.bodywebsite select.form-input:not([size]):not([multiple]) { - height: calc(4.25rem); -} -.bodywebsite .form-input-file, -.bodywebsite .form-input-range { - display: block; -} -.bodywebsite .col-form-label { - padding-top: calc(12px); - padding-bottom: calc(12px); - margin-bottom: 0; - line-height: 1.25; -} -.bodywebsite .col-form-label-lg { - padding-top: calc(13px); - padding-bottom: calc(13px); - font-size: 18px; - line-height: 1.5; -} -.bodywebsite .col-form-label-sm { - padding-top: calc(6px); - padding-bottom: calc(6px); - font-size: 12px; - line-height: 1.5; -} -.bodywebsite .col-form-legend { - padding-top: 11px; - padding-bottom: 11px; - margin-bottom: 0; - font-size: 14px; -} -.bodywebsite .form-input-plaintext { - padding-top: 11px; - padding-bottom: 11px; - margin-bottom: 0; - line-height: 1.25; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} -.bodywebsite .form-input-plaintext.form-input-sm, -.bodywebsite .input-group-sm > .form-input-plaintext.form-input, -.bodywebsite .input-group-sm > .form-input-plaintext.input-group-addon, -.bodywebsite .input-group-sm > .input-group-btn > .form-input-plaintext.btn, -.bodywebsite .form-input-plaintext.form-input-lg, -.bodywebsite .input-group-lg > .form-input-plaintext.form-input, -.bodywebsite .input-group-lg > .form-input-plaintext.input-group-addon, -.bodywebsite .input-group-lg > .input-group-btn > .form-input-plaintext.btn { - padding-right: 0; - padding-left: 0; -} -.bodywebsite .form-input-sm, -.bodywebsite .input-group-sm > .form-input, -.bodywebsite .input-group-sm > .input-group-addon, -.bodywebsite .input-group-sm > .input-group-btn > .btn { - padding: 5px 25px; - font-size: 12px; - line-height: 1.5; - border-radius: 0.2rem; -} -.bodywebsite select.form-input-sm:not([size]):not([multiple]), -.bodywebsite .input-group-sm > select.form-input:not([size]):not([multiple]), -.bodywebsite .input-group-sm > select.input-group-addon:not([size]):not([multiple]), -.bodywebsite .input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) { - height: calc(3.8125rem); -} -.bodywebsite .form-input-lg, -.bodywebsite .input-group-lg > .form-input, -.bodywebsite .input-group-lg > .input-group-addon, -.bodywebsite .input-group-lg > .input-group-btn > .btn { - padding: 12px 50px; - font-size: 18px; - line-height: 1.5; - border-radius: 0.3rem; -} -.bodywebsite select.form-input-lg:not([size]):not([multiple]), -.bodywebsite .input-group-lg > select.form-input:not([size]):not([multiple]), -.bodywebsite .input-group-lg > select.input-group-addon:not([size]):not([multiple]), -.bodywebsite .input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) { - height: calc(4.875rem); -} -.bodywebsite .form-label { - margin-bottom: 1rem; -} -.bodywebsite .form-text { - display: block; - margin-top: 0.25rem; -} -.bodywebsite .form-row { - display: flex; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px; -} -.bodywebsite .form-row > .col, -.bodywebsite .form-row > [class*="col-"] { - padding-right: 5px; - padding-left: 5px; -} -.bodywebsite .form-check { - position: relative; - display: block; - margin-bottom: 0.5rem; -} -.bodywebsite .form-check.disabled .form-check-label { - color: #dedede; -} -.bodywebsite .form-check-label { - padding-left: 1.25rem; - margin-bottom: 0; -} -.bodywebsite .form-check-input { - position: absolute; - margin-top: 0.25rem; - margin-left: -1.25rem; -} -.bodywebsite .form-check-inline { - display: inline-block; - margin-right: 0.75rem; -} -.bodywebsite .form-check-inline .form-check-label { - vertical-align: middle; -} -.bodywebsite .valid-feedback { - display: none; - margin-top: .25rem; - font-size: .875rem; - color: #98bf44; -} -.bodywebsite .valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - width: 250px; - padding: .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1; - color: #fff; - /* background-color: rgba(152, 191, 68, 0.8); */ - border-radius: .2rem; -} -.bodywebsite .was-validated .form-input:valid, -.bodywebsite .form-input.is-valid, -.bodywebsite .was-validated .custom-select:valid, -.bodywebsite .custom-select.is-valid { - border-color: #98bf44; -} -.bodywebsite .was-validated .form-input:valid:focus, -.bodywebsite .form-input.is-valid:focus, -.bodywebsite .was-validated .custom-select:valid:focus, -.bodywebsite .custom-select.is-valid:focus { - box-shadow: 0 0 0 0.2rem rgba(152, 191, 68, 0.25); -} -.bodywebsite .was-validated .form-input:valid ~ .valid-feedback, -.bodywebsite .was-validated .form-input:valid ~ .valid-tooltip, -.bodywebsite .form-input.is-valid ~ .valid-feedback, -.bodywebsite .form-input.is-valid ~ .valid-tooltip, -.bodywebsite .was-validated .custom-select:valid ~ .valid-feedback, -.bodywebsite .was-validated .custom-select:valid ~ .valid-tooltip, -.bodywebsite .custom-select.is-valid ~ .valid-feedback, -.bodywebsite .custom-select.is-valid ~ .valid-tooltip { - display: block; -} -.bodywebsite .was-validated .form-check-input:valid + .form-check-label, -.bodywebsite .form-check-input.is-valid + .form-check-label { - color: #98bf44; -} -.bodywebsite .was-validated .custom-control-input:valid ~ .custom-control-indicator, -.bodywebsite .custom-control-input.is-valid ~ .custom-control-indicator { - background-color: rgba(152, 191, 68, 0.25); -} -.bodywebsite .was-validated .custom-control-input:valid ~ .custom-control-description, -.bodywebsite .custom-control-input.is-valid ~ .custom-control-description { - color: #98bf44; -} -.bodywebsite .was-validated .custom-file-input:valid ~ .custom-file-control, -.bodywebsite .custom-file-input.is-valid ~ .custom-file-control { - border-color: #98bf44; -} -.bodywebsite .was-validated .custom-file-input:valid ~ .custom-file-control::before, -.bodywebsite .custom-file-input.is-valid ~ .custom-file-control::before { - border-color: inherit; -} -.bodywebsite .was-validated .custom-file-input:valid:focus, -.bodywebsite .custom-file-input.is-valid:focus { - box-shadow: 0 0 0 0.2rem rgba(152, 191, 68, 0.25); -} -.bodywebsite .invalid-feedback { - display: none; - margin-top: .25rem; - font-size: .875rem; - color: #f5543f; -} -.bodywebsite .invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - width: 250px; - padding: .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1; - color: #fff; - background-color: rgba(245, 84, 63, 0.8); - border-radius: .2rem; -} -.bodywebsite .was-validated .form-input:invalid, -.bodywebsite .form-input.is-invalid, -.bodywebsite .was-validated .custom-select:invalid, -.bodywebsite .custom-select.is-invalid { - border-color: #f5543f; -} -.bodywebsite .was-validated .form-input:invalid:focus, -.bodywebsite .form-input.is-invalid:focus, -.bodywebsite .was-validated .custom-select:invalid:focus, -.bodywebsite .custom-select.is-invalid:focus { - box-shadow: 0 0 0 0.2rem rgba(245, 84, 63, 0.25); -} -.bodywebsite .was-validated .form-input:invalid ~ .invalid-feedback, -.bodywebsite .was-validated .form-input:invalid ~ .invalid-tooltip, -.bodywebsite .form-input.is-invalid ~ .invalid-feedback, -.bodywebsite .form-input.is-invalid ~ .invalid-tooltip, -.bodywebsite .was-validated .custom-select:invalid ~ .invalid-feedback, -.bodywebsite .was-validated .custom-select:invalid ~ .invalid-tooltip, -.bodywebsite .custom-select.is-invalid ~ .invalid-feedback, -.bodywebsite .custom-select.is-invalid ~ .invalid-tooltip { - display: block; -} -.bodywebsite .was-validated .form-check-input:invalid + .form-check-label, -.bodywebsite .form-check-input.is-invalid + .form-check-label { - color: #f5543f; -} -.bodywebsite .was-validated .custom-control-input:invalid ~ .custom-control-indicator, -.bodywebsite .custom-control-input.is-invalid ~ .custom-control-indicator { - background-color: rgba(245, 84, 63, 0.25); -} -.bodywebsite .was-validated .custom-control-input:invalid ~ .custom-control-description, -.bodywebsite .custom-control-input.is-invalid ~ .custom-control-description { - color: #f5543f; -} -.bodywebsite .was-validated .custom-file-input:invalid ~ .custom-file-control, -.bodywebsite .custom-file-input.is-invalid ~ .custom-file-control { - border-color: #f5543f; -} -.bodywebsite .was-validated .custom-file-input:invalid ~ .custom-file-control::before, -.bodywebsite .custom-file-input.is-invalid ~ .custom-file-control::before { - border-color: inherit; -} -.bodywebsite .was-validated .custom-file-input:invalid:focus, -.bodywebsite .custom-file-input.is-invalid:focus { - box-shadow: 0 0 0 0.2rem rgba(245, 84, 63, 0.25); -} -.bodywebsite .form-inline { - display: flex; - flex-flow: row wrap; - align-items: center; -} -.bodywebsite .form-inline .form-check { - width: 100%; -} -@media (min-width: 576px) { - .bodywebsite .form-inline label { - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 0; - } - .bodywebsite .form-inline .form-label { - display: flex; - flex: 0 0 auto; - flex-flow: row wrap; - align-items: center; - margin-bottom: 0; - } - .bodywebsite .form-inline .form-input { - display: inline-block; - width: auto; - vertical-align: middle; - } - .bodywebsite .form-inline .form-input-plaintext { - display: inline-block; - } - .bodywebsite .form-inline .input-group { - width: auto; - } - .bodywebsite .form-inline .form-check { - display: flex; - align-items: center; - justify-content: center; - width: auto; - margin-top: 0; - margin-bottom: 0; - } - .bodywebsite .form-inline .form-check-label { - padding-left: 0; - } - .bodywebsite .form-inline .form-check-input { - position: relative; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .bodywebsite .form-inline .custom-control { - display: flex; - align-items: center; - justify-content: center; - padding-left: 0; - } - .bodywebsite .form-inline .custom-control-indicator { - position: static; - display: inline-block; - margin-right: 0.25rem; - vertical-align: text-bottom; - } - .bodywebsite .form-inline .has-feedback .form-input-feedback { - top: 0; - } -} -.bodywebsite .btn { - display: inline-block; - font-weight: 700; - text-align: center; - white-space: nowrap; - vertical-align: middle; - user-select: none; - border: 1px solid transparent; - padding: 11px 35px; - font-size: 14px; - line-height: 1.25; - border-radius: 5px; - transition: all 0.15s ease-in-out; -} -.bodywebsite .btn:focus, -.bodywebsite .btn:hover { - text-decoration: none; -} -.bodywebsite .btn:focus, -.bodywebsite .btn.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.bodywebsite .btn.disabled, -.bodywebsite .btn:disabled { - opacity: .65; - box-shadow: none; -} -.bodywebsite .btn:not([disabled]):not(.disabled):active, -.bodywebsite .btn:not([disabled]):not(.disabled).active { - background-image: none; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25), 0; -} -.bodywebsite a.btn.disabled, -.bodywebsite fieldset[disabled] a.btn { - pointer-events: none; -} -.bodywebsite .btn-primary { - color: #fff; - background-color: #007bff; - border-color: #007bff; - box-shadow: 0; -} -.bodywebsite .btn-primary:focus, -.bodywebsite .btn-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} -.bodywebsite .btn-primary.maincolorbisbackground:focus, -.bodywebsite .btn-primary.maincolorbisbackground.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 255, 123, 0.5); -} -.bodywebsite .btn-primary.maincolorbisbackground:hover { - box-shadow: 1px 1px 8px #aaa; -} -.bodywebsite .btn-primary.disabled, -.bodywebsite .btn-primary:disabled { - background-color: #007bff; - border-color: #007bff; -} -.bodywebsite .btn-primary:not([disabled]):not(.disabled):active, -.bodywebsite .btn-primary:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #0062cc; - border-color: #005cbf; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} -.bodywebsite .btn-secondary { - color: #fff; - background-color: #868e96; - border-color: #868e96; - box-shadow: 0; -} -.bodywebsite .btn-secondary:hover { - color: #fff; - background-color: #727b84; - border-color: #6c757d; -} -.bodywebsite .btn-secondary:focus, -.bodywebsite .btn-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); -} -.bodywebsite .btn-secondary.disabled, -.bodywebsite .btn-secondary:disabled { - background-color: #868e96; - border-color: #868e96; -} -.bodywebsite .btn-secondary:not([disabled]):not(.disabled):active, -.bodywebsite .btn-secondary:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #666e76; - box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); -} -.bodywebsite .btn-success { - color: #fff; - background-color: #28a745; - border-color: #28a745; - box-shadow: 0; -} -.bodywebsite .btn-success:hover { - color: #fff; - background-color: #218838; - border-color: #1e7e34; -} -.bodywebsite .btn-success:focus, -.bodywebsite .btn-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.bodywebsite .btn-success.disabled, -.bodywebsite .btn-success:disabled { - background-color: #28a745; - border-color: #28a745; -} -.bodywebsite .btn-success:not([disabled]):not(.disabled):active, -.bodywebsite .btn-success:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #1e7e34; - border-color: #1c7430; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.bodywebsite .btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; - box-shadow: 0; -} -.bodywebsite .btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b; -} -.bodywebsite .btn-info:focus, -.bodywebsite .btn-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.bodywebsite .btn-info.disabled, -.bodywebsite .btn-info:disabled { - background-color: #17a2b8; - border-color: #17a2b8; -} -.bodywebsite .btn-info:not([disabled]):not(.disabled):active, -.bodywebsite .btn-info:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.bodywebsite .btn-warning { - color: #111; - background-color: #ffc107; - border-color: #ffc107; - box-shadow: 0; -} -.bodywebsite .btn-warning:hover { - color: #111; - background-color: #e0a800; - border-color: #d39e00; -} -.bodywebsite .btn-warning:focus, -.bodywebsite .btn-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.bodywebsite .btn-warning.disabled, -.bodywebsite .btn-warning:disabled { - background-color: #ffc107; - border-color: #ffc107; -} -.bodywebsite .btn-warning:not([disabled]):not(.disabled):active, -.bodywebsite .btn-warning:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-warning.dropdown-toggle { - color: #111; - background-color: #d39e00; - border-color: #c69500; - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.bodywebsite .btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; - box-shadow: 0; -} -.bodywebsite .btn-danger:hover { - color: #fff; - background-color: #c82333; - border-color: #bd2130; -} -.bodywebsite .btn-danger:focus, -.bodywebsite .btn-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.bodywebsite .btn-danger.disabled, -.bodywebsite .btn-danger:disabled { - background-color: #dc3545; - border-color: #dc3545; -} -.bodywebsite .btn-danger:not([disabled]):not(.disabled):active, -.bodywebsite .btn-danger:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #bd2130; - border-color: #b21f2d; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.bodywebsite .btn-light { - color: #111; - background-color: #f8f9fa; - border-color: #f8f9fa; - box-shadow: 0; -} -.bodywebsite .btn-light:hover { - color: #111; - background-color: #e2e6ea; - border-color: #dae0e5; -} -.bodywebsite .btn-light:focus, -.bodywebsite .btn-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.bodywebsite .btn-light.disabled, -.bodywebsite .btn-light:disabled { - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.bodywebsite .btn-light:not([disabled]):not(.disabled):active, -.bodywebsite .btn-light:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-light.dropdown-toggle { - color: #111; - background-color: #dae0e5; - border-color: #d3d9df; - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.bodywebsite .btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40; - box-shadow: 0; -} -.bodywebsite .btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124; -} -.bodywebsite .btn-dark:focus, -.bodywebsite .btn-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.bodywebsite .btn-dark.disabled, -.bodywebsite .btn-dark:disabled { - background-color: #343a40; - border-color: #343a40; -} -.bodywebsite .btn-dark:not([disabled]):not(.disabled):active, -.bodywebsite .btn-dark:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.bodywebsite .btn-outline-primary { - color: #007bff; - background-color: transparent; - background-image: none; - border-color: #007bff; -} -.bodywebsite .btn-outline-primary:hover { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.bodywebsite .btn-outline-primary:focus, -.bodywebsite .btn-outline-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} -.bodywebsite .btn-outline-primary.disabled, -.bodywebsite .btn-outline-primary:disabled { - color: #007bff; - background-color: transparent; -} -.bodywebsite .btn-outline-primary:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-primary:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #007bff; - border-color: #007bff; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} -.bodywebsite .btn-outline-secondary { - color: #868e96; - background-color: transparent; - background-image: none; - border-color: #868e96; -} -.bodywebsite .btn-outline-secondary:hover { - color: #fff; - background-color: #868e96; - border-color: #868e96; -} -.bodywebsite .btn-outline-secondary:focus, -.bodywebsite .btn-outline-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); -} -.bodywebsite .btn-outline-secondary.disabled, -.bodywebsite .btn-outline-secondary:disabled { - color: #868e96; - background-color: transparent; -} -.bodywebsite .btn-outline-secondary:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-secondary:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #868e96; - border-color: #868e96; - box-shadow: 0 0 0 0.2rem rgba(134, 142, 150, 0.5); -} -.bodywebsite .btn-outline-success { - color: #28a745; - background-color: transparent; - background-image: none; - border-color: #28a745; -} -.bodywebsite .btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.bodywebsite .btn-outline-success:focus, -.bodywebsite .btn-outline-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.bodywebsite .btn-outline-success.disabled, -.bodywebsite .btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} -.bodywebsite .btn-outline-success:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-success:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.bodywebsite .btn-outline-info { - color: #17a2b8; - background-color: transparent; - background-image: none; - border-color: #17a2b8; -} -.bodywebsite .btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.bodywebsite .btn-outline-info:focus, -.bodywebsite .btn-outline-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.bodywebsite .btn-outline-info.disabled, -.bodywebsite .btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} -.bodywebsite .btn-outline-info:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-info:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.bodywebsite .btn-outline-warning { - color: #ffc107; - background-color: transparent; - background-image: none; - border-color: #ffc107; -} -.bodywebsite .btn-outline-warning:hover { - color: #fff; - background-color: #ffc107; - border-color: #ffc107; -} -.bodywebsite .btn-outline-warning:focus, -.bodywebsite .btn-outline-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.bodywebsite .btn-outline-warning.disabled, -.bodywebsite .btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} -.bodywebsite .btn-outline-warning:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-warning:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-warning.dropdown-toggle { - color: #fff; - background-color: #ffc107; - border-color: #ffc107; - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.bodywebsite .btn-outline-danger { - color: #dc3545; - background-color: transparent; - background-image: none; - border-color: #dc3545; -} -.bodywebsite .btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.bodywebsite .btn-outline-danger:focus, -.bodywebsite .btn-outline-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.bodywebsite .btn-outline-danger.disabled, -.bodywebsite .btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} -.bodywebsite .btn-outline-danger:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-danger:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.bodywebsite .btn-outline-light { - color: #f8f9fa; - background-color: transparent; - background-image: none; - border-color: #f8f9fa; -} -.bodywebsite .btn-outline-light:hover { - color: #00030a; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.bodywebsite .btn-outline-light:focus, -.bodywebsite .btn-outline-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.bodywebsite .btn-outline-light.disabled, -.bodywebsite .btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} -.bodywebsite .btn-outline-light:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-light:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-light.dropdown-toggle { - color: #00030a; - background-color: #f8f9fa; - border-color: #f8f9fa; - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.bodywebsite .btn-outline-dark { - color: #343a40; - background-color: transparent; - background-image: none; - border-color: #343a40; -} -.bodywebsite .btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.bodywebsite .btn-outline-dark:focus, -.bodywebsite .btn-outline-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.bodywebsite .btn-outline-dark.disabled, -.bodywebsite .btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} -.bodywebsite .btn-outline-dark:not([disabled]):not(.disabled):active, -.bodywebsite .btn-outline-dark:not([disabled]):not(.disabled).active, -.bodywebsite .show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.bodywebsite .btn-link { - font-weight: 400; - color: #37c386; - background-color: transparent; -} -.bodywebsite .btn-link:hover { - color: #26875d; - text-decoration: none; - background-color: transparent; - border-color: transparent; -} -.bodywebsite .btn-link:focus, -.bodywebsite .btn-link.focus { - border-color: transparent; - box-shadow: none; -} -.bodywebsite .btn-link:disabled, -.bodywebsite .btn-link.disabled { - color: #dedede; -} -.bodywebsite .btn-lg, -.bodywebsite .btn-group-lg > .btn { - padding: 12px 50px; - font-size: 18px; - line-height: 1.5; - border-radius: 6px; -} -.bodywebsite .btn-sm, -.bodywebsite .btn-group-sm > .btn { - padding: 5px 25px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.bodywebsite .btn-block { - display: block; - width: 100%; -} -.bodywebsite .btn-block + .btn-block { - margin-top: 0.5rem; -} -.bodywebsite input[type="submit"].btn-block, -.bodywebsite input[type="reset"].btn-block, -.bodywebsite input[type="button"].btn-block { - width: 100%; -} -.bodywebsite .fade { - opacity: 0; - transition: opacity 0.15s linear; -} -.bodywebsite .fade.show { - opacity: 1; -} -.bodywebsite .collapse { - display: none; -} -.bodywebsite .collapse.show { - display: block; -} -.bodywebsite tr.collapse.show { - display: table-row; -} -.bodywebsite tbody.collapse.show { - display: table-row-group; -} -.bodywebsite .collapsing { - position: relative; - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} -.bodywebsite .dropup, -.bodywebsite .dropdown { - position: relative; -} -.bodywebsite .dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.bodywebsite .dropdown-toggle:empty::after { - margin-left: 0; -} -.bodywebsite .dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0; - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.175); -} -.bodywebsite .dropup .dropdown-menu { - margin-top: 0; - margin-bottom: 0.125rem; -} -.bodywebsite .dropup .dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.bodywebsite .dropup .dropdown-toggle:empty::after { - margin-left: 0; -} -.bodywebsite .dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e5e5e5; -} -.bodywebsite .dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #2a2b2b; - text-align: inherit; - white-space: nowrap; - background: none; - border: 0; -} -.bodywebsite .dropdown-item:focus, -.bodywebsite .dropdown-item:hover { - color: #1d1e1e; - text-decoration: none; - background-color: #f5f5f5; -} -.bodywebsite .dropdown-item.active, -.bodywebsite .dropdown-item:active { - color: #2a2b2b; - text-decoration: none; - background-color: #37c386; -} -.bodywebsite .dropdown-item.disabled, -.bodywebsite .dropdown-item:disabled { - color: #dedede; - background-color: transparent; -} -.bodywebsite .dropdown-menu.show { - display: block; -} -.bodywebsite .dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 12px; - color: #dedede; - white-space: nowrap; -} -.bodywebsite .btn-group, -.bodywebsite .btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} -.bodywebsite .btn-group > .btn, -.bodywebsite .btn-group-vertical > .btn { - position: relative; - flex: 0 1 auto; -} -.bodywebsite .btn-group > .btn:hover, -.bodywebsite .btn-group-vertical > .btn:hover { - z-index: 2; -} -.bodywebsite .btn-group > .btn:focus, -.bodywebsite .btn-group > .btn:active, -.bodywebsite .btn-group > .btn.active, -.bodywebsite .btn-group-vertical > .btn:focus, -.bodywebsite .btn-group-vertical > .btn:active, -.bodywebsite .btn-group-vertical > .btn.active { - z-index: 2; -} -.bodywebsite .btn-group .btn + .btn, -.bodywebsite .btn-group .btn + .btn-group, -.bodywebsite .btn-group .btn-group + .btn, -.bodywebsite .btn-group .btn-group + .btn-group, -.bodywebsite .btn-group-vertical .btn + .btn, -.bodywebsite .btn-group-vertical .btn + .btn-group, -.bodywebsite .btn-group-vertical .btn-group + .btn, -.bodywebsite .btn-group-vertical .btn-group + .btn-group { - margin-left: -1px; -} -.bodywebsite .btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} -.bodywebsite .btn-toolbar .input-group { - width: auto; -} -.bodywebsite .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.bodywebsite .btn-group > .btn:first-child { - margin-left: 0; -} -.bodywebsite .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.bodywebsite .btn-group > .btn:last-child:not(:first-child), -.bodywebsite .btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.bodywebsite .btn-group > .btn-group { - float: left; -} -.bodywebsite .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.bodywebsite .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.bodywebsite .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.bodywebsite .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.bodywebsite .btn + .dropdown-toggle-split { - padding-right: 26.25px; - padding-left: 26.25px; -} -.bodywebsite .btn + .dropdown-toggle-split::after { - margin-left: 0; -} -.bodywebsite .btn-sm + .dropdown-toggle-split, -.bodywebsite .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 18.75px; - padding-left: 18.75px; -} -.bodywebsite .btn-lg + .dropdown-toggle-split, -.bodywebsite .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 37.5px; - padding-left: 37.5px; -} -.bodywebsite .btn-group.show .dropdown-toggle { - box-shadow: 0; -} -.bodywebsite .btn-group.show .dropdown-toggle.btn-link { - box-shadow: none; -} -.bodywebsite .btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.bodywebsite .btn-group-vertical .btn, -.bodywebsite .btn-group-vertical .btn-group { - width: 100%; -} -.bodywebsite .btn-group-vertical > .btn + .btn, -.bodywebsite .btn-group-vertical > .btn + .btn-group, -.bodywebsite .btn-group-vertical > .btn-group + .btn, -.bodywebsite .btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.bodywebsite .btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.bodywebsite .btn-group-vertical > .btn:first-child:not(:last-child) { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.bodywebsite .btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.bodywebsite .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.bodywebsite .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.bodywebsite .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.bodywebsite .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.bodywebsite [data-toggle="buttons"] > .btn input[type="radio"], -.bodywebsite [data-toggle="buttons"] > .btn input[type="checkbox"], -.bodywebsite [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -.bodywebsite [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.bodywebsite .input-group { - position: relative; - display: flex; - align-items: stretch; - width: 100%; -} -.bodywebsite .input-group .form-input { - position: relative; - z-index: 2; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0; -} -.bodywebsite .input-group .form-input:focus, -.bodywebsite .input-group .form-input:active, -.bodywebsite .input-group .form-input:hover { - z-index: 3; -} -.bodywebsite .input-group-addon, -.bodywebsite .input-group-btn, -.bodywebsite .input-group .form-input { - display: flex; - align-items: center; -} -.bodywebsite .input-group-addon:not(:first-child):not(:last-child), -.bodywebsite .input-group-btn:not(:first-child):not(:last-child), -.bodywebsite .input-group .form-input:not(:first-child):not(:last-child) { - border-radius: 0; -} -.bodywebsite .input-group-addon, -.bodywebsite .input-group-btn { - white-space: nowrap; -} -.bodywebsite .input-group-addon { - padding: 11px 35px; - margin-bottom: 0; - font-size: 14px; - font-weight: 400; - line-height: 1.25; - color: #495057; - text-align: center; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0.25rem; -} -.bodywebsite .input-group-addon.form-input-sm, -.bodywebsite .input-group-sm > .input-group-addon, -.bodywebsite .input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: 5px 25px; - font-size: 12px; - border-radius: 0.2rem; -} -.bodywebsite .input-group-addon.form-input-lg, -.bodywebsite .input-group-lg > .input-group-addon, -.bodywebsite .input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: 12px 50px; - font-size: 18px; - border-radius: 0.3rem; -} -.bodywebsite .input-group-addon input[type="radio"], -.bodywebsite .input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.bodywebsite .input-group .form-input:not(:last-child), -.bodywebsite .input-group-addon:not(:last-child), -.bodywebsite .input-group-btn:not(:last-child) > .btn, -.bodywebsite .input-group-btn:not(:last-child) > .btn-group > .btn, -.bodywebsite .input-group-btn:not(:last-child) > .dropdown-toggle, -.bodywebsite .input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle), -.bodywebsite .input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.bodywebsite .input-group-addon:not(:last-child) { - border-right: 0; -} -.bodywebsite .input-group .form-input:not(:first-child), -.bodywebsite .input-group-addon:not(:first-child), -.bodywebsite .input-group-btn:not(:first-child) > .btn, -.bodywebsite .input-group-btn:not(:first-child) > .btn-group > .btn, -.bodywebsite .input-group-btn:not(:first-child) > .dropdown-toggle, -.bodywebsite .input-group-btn:not(:last-child) > .btn:not(:first-child), -.bodywebsite .input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.bodywebsite .form-input + .input-group-addon:not(:first-child) { - border-left: 0; -} -.bodywebsite .input-group-btn { - position: relative; - align-items: stretch; - font-size: 0; - white-space: nowrap; -} -.bodywebsite .input-group-btn > .btn { - position: relative; -} -.bodywebsite .input-group-btn > .btn + .btn { - margin-left: -1px; -} -.bodywebsite .input-group-btn > .btn:focus, -.bodywebsite .input-group-btn > .btn:active, -.bodywebsite .input-group-btn > .btn:hover { - z-index: 3; -} -.bodywebsite .input-group-btn:first-child > .btn + .btn { - margin-left: 0; -} -.bodywebsite .input-group-btn:not(:last-child) > .btn, -.bodywebsite .input-group-btn:not(:last-child) > .btn-group { - margin-right: -1px; -} -.bodywebsite .input-group-btn:not(:first-child) > .btn, -.bodywebsite .input-group-btn:not(:first-child) > .btn-group { - z-index: 2; - margin-left: 0; -} -.bodywebsite .input-group-btn:not(:first-child) > .btn:first-child, -.bodywebsite .input-group-btn:not(:first-child) > .btn-group:first-child { - margin-left: -1px; -} -.bodywebsite .input-group-btn:not(:first-child) > .btn:focus, -.bodywebsite .input-group-btn:not(:first-child) > .btn:active, -.bodywebsite .input-group-btn:not(:first-child) > .btn:hover, -.bodywebsite .input-group-btn:not(:first-child) > .btn-group:focus, -.bodywebsite .input-group-btn:not(:first-child) > .btn-group:active, -.bodywebsite .input-group-btn:not(:first-child) > .btn-group:hover { - z-index: 3; -} -.bodywebsite .custom-control { - position: relative; - display: inline-flex; - min-height: 1.71429rem; - padding-left: 1.5rem; - margin-right: 1rem; -} -.bodywebsite .custom-control-input { - position: absolute; - z-index: -1; - opacity: 0; -} -.bodywebsite .custom-control-input:checked ~ .custom-control-indicator { - color: #fff; - background-color: #007bff; - box-shadow: none; -} -.bodywebsite .custom-control-input:focus ~ .custom-control-indicator { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.bodywebsite .custom-control-input:active ~ .custom-control-indicator { - color: #fff; - background-color: #b3d7ff; - box-shadow: none; -} -.bodywebsite .custom-control-input:disabled ~ .custom-control-indicator { - background-color: #e9ecef; -} -.bodywebsite .custom-control-input:disabled ~ .custom-control-description { - color: #868e96; -} -.bodywebsite .custom-control-indicator { - position: absolute; - top: 0.35714rem; - left: 0; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - user-select: none; - background-color: #ddd; - background-repeat: no-repeat; - background-position: center center; - background-size: 50% 50%; - box-shadow: inset 0 0.25rem 0.25rem rgba(0, 0, 0, 0.1); -} -.bodywebsite .custom-checkbox .custom-control-indicator { - border-radius: 0.25rem; -} -.bodywebsite .custom-checkbox .custom-control-input:checked ~ .custom-control-indicator { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"); -} -.bodywebsite .custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator { - background-color: #007bff; - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E"); - box-shadow: none; -} -.bodywebsite .custom-radio .custom-control-indicator { - border-radius: 50%; -} -.bodywebsite .custom-radio .custom-control-input:checked ~ .custom-control-indicator { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E"); -} -.bodywebsite .custom-controls-stacked { - display: flex; - flex-direction: column; -} -.bodywebsite .custom-controls-stacked .custom-control { - margin-bottom: 0.25rem; -} -.bodywebsite .custom-controls-stacked .custom-control + .custom-control { - margin-left: 0; -} -.bodywebsite .custom-select { - display: inline-block; - max-width: 100%; - height: calc(4.25rem); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; - background-size: 8px 10px; - border: 1px solid #ced4da; - border-radius: 0.25rem; - appearance: none; -} -.bodywebsite .custom-select:focus { - border-color: #80bdff; - outline: none; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5); -} -.bodywebsite .custom-select[multiple] { - height: auto; - background-image: none; -} -.bodywebsite .custom-select:disabled { - color: #868e96; - background-color: #e9ecef; -} -.bodywebsite .custom-select::-ms-expand { - opacity: 0; -} -.bodywebsite .custom-select-sm { - height: calc(3.8125rem); - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 75%; -} -.bodywebsite .custom-file { - position: relative; - display: inline-block; - max-width: 100%; - height: calc(4.25rem); - margin-bottom: 0; -} -.bodywebsite .custom-file-input { - min-width: 14rem; - max-width: 100%; - height: calc(4.25rem); - margin: 0; - opacity: 0; -} -.bodywebsite .custom-file-input:focus ~ .custom-file-control { - box-shadow: 0 0 0 0.075rem #fff, 0 0 0 0.2rem #007bff; -} -.bodywebsite .custom-file-control { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 5; - height: calc(4.25rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - pointer-events: none; - user-select: none; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 0.25rem; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} -.bodywebsite .custom-file-control:lang(en):empty::after { - content: "Choose file..."; -} -.bodywebsite .custom-file-control::before { - position: absolute; - top: -1px; - right: -1px; - bottom: -1px; - z-index: 6; - display: block; - height: calc(4.25rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0 0.25rem 0.25rem 0; -} -.bodywebsite .custom-file-control:lang(en)::before { - content: "Browse"; -} -.bodywebsite .nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.bodywebsite .nav-link { - display: block; - padding: 0.5rem 1rem; -} -.bodywebsite .nav-link:focus, -.bodywebsite .nav-link:hover { - text-decoration: none; -} -.bodywebsite .nav-link.disabled { - color: #868e96; -} -.bodywebsite .nav-tabs { - border-bottom: 1px solid #ddd; -} -.bodywebsite .nav-tabs .nav-item { - margin-bottom: -1px; -} -.bodywebsite .nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} -.bodywebsite .nav-tabs .nav-link:focus, -.bodywebsite .nav-tabs .nav-link:hover { - border-color: #f9f9f9 #f9f9f9 #ddd; -} -.bodywebsite .nav-tabs .nav-link.disabled { - color: #868e96; - background-color: transparent; - border-color: transparent; -} -.bodywebsite .nav-tabs .nav-link.active, -.bodywebsite .nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #fff; - border-color: #ddd #ddd #fff; -} -.bodywebsite .nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.bodywebsite .nav-pills .nav-link { - border-radius: 0; -} -.bodywebsite .nav-pills .nav-link.active, -.bodywebsite .nav-pills .show > .nav-link { - color: #fff; - background-color: #007bff; -} -.bodywebsite .nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} -.bodywebsite .nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} -.bodywebsite .tab-content > .tab-pane { - display: none; -} -.bodywebsite .tab-content > .active { - display: block; -} -.bodywebsite .navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: 0.5rem 1rem; -} -.bodywebsite .navbar > .container, -.bodywebsite .navbar > .container-fluid { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} -.bodywebsite .navbar-brand { - display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} -.bodywebsite .navbar-brand:focus, -.bodywebsite .navbar-brand:hover { - text-decoration: none; -} -.bodywebsite .navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.bodywebsite .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} -.bodywebsite .navbar-nav .dropdown-menu { - position: static; - float: none; -} -.bodywebsite .navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} -.bodywebsite .navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; -} -.bodywebsite .navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; -} -.bodywebsite .navbar-toggler:focus, -.bodywebsite .navbar-toggler:hover { - text-decoration: none; -} -.bodywebsite .navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100%; -} -@media (max-width: 575px) { - .bodywebsite .navbar-expand-sm > .container, - .bodywebsite .navbar-expand-sm > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 576px) { - .bodywebsite .navbar-expand-sm { - flex-flow: row nowrap; - justify-content: flex-start; - } - .bodywebsite .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .bodywebsite .navbar-expand-sm .navbar-nav .dropdown-menu-right { - right: 0; - left: auto; - } - .bodywebsite .navbar-expand-sm .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .bodywebsite .navbar-expand-sm > .container, - .bodywebsite .navbar-expand-sm > .container-fluid { - flex-wrap: nowrap; - } - .bodywebsite .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .bodywebsite .navbar-expand-sm .navbar-toggler { - display: none; - } - .bodywebsite .navbar-expand-sm .dropup .dropdown-menu { - top: auto; - bottom: 100%; - } -} -@media (max-width: 767px) { - .bodywebsite .navbar-expand-md > .container, - .bodywebsite .navbar-expand-md > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 768px) { - .bodywebsite .navbar-expand-md { - flex-flow: row nowrap; - justify-content: flex-start; - } - .bodywebsite .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .bodywebsite .navbar-expand-md .navbar-nav .dropdown-menu-right { - right: 0; - left: auto; - } - .bodywebsite .navbar-expand-md .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .bodywebsite .navbar-expand-md > .container, - .bodywebsite .navbar-expand-md > .container-fluid { - flex-wrap: nowrap; - } - .bodywebsite .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .bodywebsite .navbar-expand-md .navbar-toggler { - display: none; - } - .bodywebsite .navbar-expand-md .dropup .dropdown-menu { - top: auto; - bottom: 100%; - } -} -@media (max-width: 991px) { - .bodywebsite .navbar-expand-lg > .container, - .bodywebsite .navbar-expand-lg > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 992px) { - .bodywebsite .navbar-expand-lg { - flex-flow: row nowrap; - justify-content: flex-start; - } - .bodywebsite .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .bodywebsite .navbar-expand-lg .navbar-nav .dropdown-menu-right { - right: 0; - left: auto; - } - .bodywebsite .navbar-expand-lg .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .bodywebsite .navbar-expand-lg > .container, - .bodywebsite .navbar-expand-lg > .container-fluid { - flex-wrap: nowrap; - } - .bodywebsite .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .bodywebsite .navbar-expand-lg .navbar-toggler { - display: none; - } - .bodywebsite .navbar-expand-lg .dropup .dropdown-menu { - top: auto; - bottom: 100%; - } -} -@media (max-width: 1199px) { - .bodywebsite .navbar-expand-xl > .container, - .bodywebsite .navbar-expand-xl > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 1200px) { - .bodywebsite .navbar-expand-xl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .bodywebsite .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .bodywebsite .navbar-expand-xl .navbar-nav .dropdown-menu-right { - right: 0; - left: auto; - } - .bodywebsite .navbar-expand-xl .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .bodywebsite .navbar-expand-xl > .container, - .bodywebsite .navbar-expand-xl > .container-fluid { - flex-wrap: nowrap; - } - .bodywebsite .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .bodywebsite .navbar-expand-xl .navbar-toggler { - display: none; - } - .bodywebsite .navbar-expand-xl .dropup .dropdown-menu { - top: auto; - bottom: 100%; - } -} -@media (max-width: 1799px) { - .bodywebsite .navbar-expand-xxl > .container, - .bodywebsite .navbar-expand-xxl > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 1800px) { - .bodywebsite .navbar-expand-xxl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .bodywebsite .navbar-expand-xxl .navbar-nav { - flex-direction: row; - } - .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu { - position: absolute; - } - .bodywebsite .navbar-expand-xxl .navbar-nav .dropdown-menu-right { - right: 0; - left: auto; - } - .bodywebsite .navbar-expand-xxl .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; - } - .bodywebsite .navbar-expand-xxl > .container, - .bodywebsite .navbar-expand-xxl > .container-fluid { - flex-wrap: nowrap; - } - .bodywebsite .navbar-expand-xxl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .bodywebsite .navbar-expand-xxl .navbar-toggler { - display: none; - } - .bodywebsite .navbar-expand-xxl .dropup .dropdown-menu { - top: auto; - bottom: 100%; - } -} -.bodywebsite .navbar-expand { - flex-flow: row nowrap; - justify-content: flex-start; -} -.bodywebsite .navbar-expand > .container, -.bodywebsite .navbar-expand > .container-fluid { - padding-right: 0; - padding-left: 0; -} -.bodywebsite .navbar-expand .navbar-nav { - flex-direction: row; -} -.bodywebsite .navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.bodywebsite .navbar-expand .navbar-nav .dropdown-menu-right { - right: 0; - left: auto; -} -.bodywebsite .navbar-expand .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem; -} -.bodywebsite .navbar-expand > .container, -.bodywebsite .navbar-expand > .container-fluid { - flex-wrap: nowrap; -} -.bodywebsite .navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} -.bodywebsite .navbar-expand .navbar-toggler { - display: none; -} -.bodywebsite .navbar-expand .dropup .dropdown-menu { - top: auto; - bottom: 100%; -} -.bodywebsite .navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} -.bodywebsite .navbar-light .navbar-brand:focus, -.bodywebsite .navbar-light .navbar-brand:hover { - color: rgba(0, 0, 0, 0.9); -} -.bodywebsite .navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} -.bodywebsite .navbar-light .navbar-nav .nav-link:focus, -.bodywebsite .navbar-light .navbar-nav .nav-link:hover { - color: rgba(0, 0, 0, 0.7); -} -.bodywebsite .navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} -.bodywebsite .navbar-light .navbar-nav .show > .nav-link, -.bodywebsite .navbar-light .navbar-nav .active > .nav-link, -.bodywebsite .navbar-light .navbar-nav .nav-link.show, -.bodywebsite .navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} -.bodywebsite .navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} -.bodywebsite .navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); -} -.bodywebsite .navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} -.bodywebsite .navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} -.bodywebsite .navbar-light .navbar-text a:focus, -.bodywebsite .navbar-light .navbar-text a:hover { - color: rgba(0, 0, 0, 0.9); -} -.bodywebsite .navbar-dark .navbar-brand { - color: #fff; -} -.bodywebsite .navbar-dark .navbar-brand:focus, -.bodywebsite .navbar-dark .navbar-brand:hover { - color: #fff; -} -.bodywebsite .navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .navbar-dark .navbar-nav .nav-link:focus, -.bodywebsite .navbar-dark .navbar-nav .nav-link:hover { - color: rgba(255, 255, 255, 0.75); -} -.bodywebsite .navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} -.bodywebsite .navbar-dark .navbar-nav .show > .nav-link, -.bodywebsite .navbar-dark .navbar-nav .active > .nav-link, -.bodywebsite .navbar-dark .navbar-nav .nav-link.show, -.bodywebsite .navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} -.bodywebsite .navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.5); - border-color: rgba(255, 255, 255, 0.1); -} -.bodywebsite .navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"); -} -.bodywebsite .navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .navbar-dark .navbar-text a { - color: #fff; -} -.bodywebsite .navbar-dark .navbar-text a:focus, -.bodywebsite .navbar-dark .navbar-text a:hover { - color: #fff; -} -.bodywebsite .jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 6px; -} -@media (min-width: 576px) { - .bodywebsite .jumbotron { - padding: 4rem 2rem; - } -} -.bodywebsite .jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} -.bodywebsite .alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; -} -.bodywebsite .alert-heading { - color: inherit; -} -.bodywebsite .alert-link { - font-weight: 700; -} -.bodywebsite .alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - padding: 0.75rem 1.25rem; - color: inherit; -} -.bodywebsite .alert-primary { - color: #004085; - background-color: #cce5ff; - border-color: #b8daff; -} -.bodywebsite .alert-primary hr { - border-top-color: #9fcdff; -} -.bodywebsite .alert-primary .alert-link { - color: #002752; -} -.bodywebsite .alert-secondary { - color: #464a4e; - background-color: #e7e8ea; - border-color: #dddfe2; -} -.bodywebsite .alert-secondary hr { - border-top-color: #cfd2d6; -} -.bodywebsite .alert-secondary .alert-link { - color: #2e3133; -} -.bodywebsite .alert-success { - color: #155724; - background-color: #d4edda; - border-color: #c3e6cb; -} -.bodywebsite .alert-success hr { - border-top-color: #b1dfbb; -} -.bodywebsite .alert-success .alert-link { - color: #0b2e13; -} -.bodywebsite .alert-info { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb; -} -.bodywebsite .alert-info hr { - border-top-color: #abdde5; -} -.bodywebsite .alert-info .alert-link { - color: #062c33; -} -.bodywebsite .alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; -} -.bodywebsite .alert-warning hr { - border-top-color: #ffe8a1; -} -.bodywebsite .alert-warning .alert-link { - color: #533f03; -} -.bodywebsite .alert-danger { - color: #721c24; - background-color: #f8d7da; - border-color: #f5c6cb; -} -.bodywebsite .alert-danger hr { - border-top-color: #f1b0b7; -} -.bodywebsite .alert-danger .alert-link { - color: #491217; -} -.bodywebsite .alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe; -} -.bodywebsite .alert-light hr { - border-top-color: #ececf6; -} -.bodywebsite .alert-light .alert-link { - color: #686868; -} -.bodywebsite .alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca; -} -.bodywebsite .alert-dark hr { - border-top-color: #b9bbbe; -} -.bodywebsite .alert-dark .alert-link { - color: #040505; -} -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} -.bodywebsite .progress { - display: flex; - height: 1rem; - overflow: hidden; - font-size: 0.75rem; - background-color: #e9ecef; - border-radius: 0.25rem; -} -.bodywebsite .progress-bar { - display: flex; - align-items: center; - justify-content: center; - color: #fff; - background-color: #007bff; -} -.bodywebsite .progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} -.bodywebsite .progress-bar-animated { - animation: progress-bar-stripes 1s linear infinite; -} -.bodywebsite .media { - display: flex; - align-items: flex-start; -} -.bodywebsite .media-body { - flex: 1; -} -.bodywebsite .list-group { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; -} -.bodywebsite .list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit; -} -.bodywebsite .list-group-item-action:focus, -.bodywebsite .list-group-item-action:hover { - color: #495057; - text-decoration: none; - background-color: #f8f9fa; -} -.bodywebsite .list-group-item-action:active { - color: #212529; - background-color: #e9ecef; -} -.bodywebsite .list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} -.bodywebsite .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} -.bodywebsite .list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} -.bodywebsite .list-group-item:focus, -.bodywebsite .list-group-item:hover { - text-decoration: none; -} -.bodywebsite .list-group-item.disabled, -.bodywebsite .list-group-item:disabled { - color: #868e96; - background-color: #fff; -} -.bodywebsite .list-group-item.active { - z-index: 2; - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.bodywebsite .list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} -.bodywebsite .list-group-flush:first-child .list-group-item:first-child { - border-top: 0; -} -.bodywebsite .list-group-flush:last-child .list-group-item:last-child { - border-bottom: 0; -} -.bodywebsite .list-group-item-primary { - color: #004085; - background-color: #b8daff; -} -.bodywebsite a.list-group-item-primary, -.bodywebsite button.list-group-item-primary { - color: #004085; -} -.bodywebsite a.list-group-item-primary:focus, -.bodywebsite a.list-group-item-primary:hover, -.bodywebsite button.list-group-item-primary:focus, -.bodywebsite button.list-group-item-primary:hover { - color: #004085; - background-color: #9fcdff; -} -.bodywebsite a.list-group-item-primary.active, -.bodywebsite button.list-group-item-primary.active { - color: #fff; - background-color: #004085; - border-color: #004085; -} -.bodywebsite .list-group-item-secondary { - color: #464a4e; - background-color: #dddfe2; -} -.bodywebsite a.list-group-item-secondary, -.bodywebsite button.list-group-item-secondary { - color: #464a4e; -} -.bodywebsite a.list-group-item-secondary:focus, -.bodywebsite a.list-group-item-secondary:hover, -.bodywebsite button.list-group-item-secondary:focus, -.bodywebsite button.list-group-item-secondary:hover { - color: #464a4e; - background-color: #cfd2d6; -} -.bodywebsite a.list-group-item-secondary.active, -.bodywebsite button.list-group-item-secondary.active { - color: #fff; - background-color: #464a4e; - border-color: #464a4e; -} -.bodywebsite .list-group-item-success { - color: #155724; - background-color: #c3e6cb; -} -.bodywebsite a.list-group-item-success, -.bodywebsite button.list-group-item-success { - color: #155724; -} -.bodywebsite a.list-group-item-success:focus, -.bodywebsite a.list-group-item-success:hover, -.bodywebsite button.list-group-item-success:focus, -.bodywebsite button.list-group-item-success:hover { - color: #155724; - background-color: #b1dfbb; -} -.bodywebsite a.list-group-item-success.active, -.bodywebsite button.list-group-item-success.active { - color: #fff; - background-color: #155724; - border-color: #155724; -} -.bodywebsite .list-group-item-info { - color: #0c5460; - background-color: #bee5eb; -} -.bodywebsite a.list-group-item-info, -.bodywebsite button.list-group-item-info { - color: #0c5460; -} -.bodywebsite a.list-group-item-info:focus, -.bodywebsite a.list-group-item-info:hover, -.bodywebsite button.list-group-item-info:focus, -.bodywebsite button.list-group-item-info:hover { - color: #0c5460; - background-color: #abdde5; -} -.bodywebsite a.list-group-item-info.active, -.bodywebsite button.list-group-item-info.active { - color: #fff; - background-color: #0c5460; - border-color: #0c5460; -} -.bodywebsite .list-group-item-warning { - color: #856404; - background-color: #ffeeba; -} -.bodywebsite a.list-group-item-warning, -.bodywebsite button.list-group-item-warning { - color: #856404; -} -.bodywebsite a.list-group-item-warning:focus, -.bodywebsite a.list-group-item-warning:hover, -.bodywebsite button.list-group-item-warning:focus, -.bodywebsite button.list-group-item-warning:hover { - color: #856404; - background-color: #ffe8a1; -} -.bodywebsite a.list-group-item-warning.active, -.bodywebsite button.list-group-item-warning.active { - color: #fff; - background-color: #856404; - border-color: #856404; -} -.bodywebsite .list-group-item-danger { - color: #721c24; - background-color: #f5c6cb; -} -.bodywebsite a.list-group-item-danger, -.bodywebsite button.list-group-item-danger { - color: #721c24; -} -.bodywebsite a.list-group-item-danger:focus, -.bodywebsite a.list-group-item-danger:hover, -.bodywebsite button.list-group-item-danger:focus, -.bodywebsite button.list-group-item-danger:hover { - color: #721c24; - background-color: #f1b0b7; -} -.bodywebsite a.list-group-item-danger.active, -.bodywebsite button.list-group-item-danger.active { - color: #fff; - background-color: #721c24; - border-color: #721c24; -} -.bodywebsite .list-group-item-light { - color: #818182; - background-color: #fdfdfe; -} -.bodywebsite a.list-group-item-light, -.bodywebsite button.list-group-item-light { - color: #818182; -} -.bodywebsite a.list-group-item-light:focus, -.bodywebsite a.list-group-item-light:hover, -.bodywebsite button.list-group-item-light:focus, -.bodywebsite button.list-group-item-light:hover { - color: #818182; - background-color: #ececf6; -} -.bodywebsite a.list-group-item-light.active, -.bodywebsite button.list-group-item-light.active { - color: #fff; - background-color: #818182; - border-color: #818182; -} -.bodywebsite .list-group-item-dark { - color: #1b1e21; - background-color: #c6c8ca; -} -.bodywebsite a.list-group-item-dark, -.bodywebsite button.list-group-item-dark { - color: #1b1e21; -} -.bodywebsite a.list-group-item-dark:focus, -.bodywebsite a.list-group-item-dark:hover, -.bodywebsite button.list-group-item-dark:focus, -.bodywebsite button.list-group-item-dark:hover { - color: #1b1e21; - background-color: #b9bbbe; -} -.bodywebsite a.list-group-item-dark.active, -.bodywebsite button.list-group-item-dark.active { - color: #fff; - background-color: #1b1e21; - border-color: #1b1e21; -} -.bodywebsite .close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5; -} -.bodywebsite .close:focus, -.bodywebsite .close:hover { - color: #000; - text-decoration: none; - opacity: .75; -} -.bodywebsite button.close { - padding: 0; - background: transparent; - border: 0; - -webkit-appearance: none; -} -.bodywebsite .tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: 400; - line-height: 1.71429; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 12px; - word-wrap: break-word; - opacity: 0; -} -.bodywebsite .tooltip.show { - opacity: 1; -} -.bodywebsite .tooltip .arrow { - position: absolute; - display: block; - width: 6px; - height: 6px; -} -.bodywebsite .tooltip .arrow::before { - position: absolute; - border-color: transparent; - border-style: solid; -} -.bodywebsite .tooltip.bs-tooltip-top, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="top"] { - padding: 6px 0; -} -.bodywebsite .tooltip.bs-tooltip-top .arrow, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow { - bottom: 0; -} -.bodywebsite .tooltip.bs-tooltip-top .arrow::before, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before { - margin-left: -4px; - content: ""; - border-width: 6px 6px 0; - border-top-color: #37c386; -} -.bodywebsite .tooltip.bs-tooltip-right, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="right"] { - padding: 0 6px; -} -.bodywebsite .tooltip.bs-tooltip-right .arrow, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow { - left: 0; -} -.bodywebsite .tooltip.bs-tooltip-right .arrow::before, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before { - margin-top: -4px; - content: ""; - border-width: 6px 6px 6px 0; - border-right-color: #37c386; -} -.bodywebsite .tooltip.bs-tooltip-bottom, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="bottom"] { - padding: 6px 0; -} -.bodywebsite .tooltip.bs-tooltip-bottom .arrow, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow { - top: 0; -} -.bodywebsite .tooltip.bs-tooltip-bottom .arrow::before, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before { - margin-left: -4px; - content: ""; - border-width: 0 6px 6px; - border-bottom-color: #37c386; -} -.bodywebsite .tooltip.bs-tooltip-left, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="left"] { - padding: 0 6px; -} -.bodywebsite .tooltip.bs-tooltip-left .arrow, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow { - right: 0; -} -.bodywebsite .tooltip.bs-tooltip-left .arrow::before, -.bodywebsite .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before { - right: 0; - margin-top: -4px; - content: ""; - border-width: 6px 0 6px 6px; - border-left-color: #37c386; -} -.bodywebsite .tooltip-inner { - max-width: 200px; - padding: 6px 10px; - color: #fff; - text-align: center; - background-color: #37c386; - border-radius: 0; -} -.bodywebsite .popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: "Roboto", Helvetica, Arial, sans-serif; - font-style: normal; - font-weight: 400; - line-height: 1.71429; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 12px; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.2); -} -.bodywebsite .popover .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} -.bodywebsite .popover .arrow::before, -.bodywebsite .popover .arrow::after { - position: absolute; - display: block; - border-color: transparent; - border-style: solid; -} -.bodywebsite .popover .arrow::before { - content: ""; - border-width: 0.8rem; -} -.bodywebsite .popover .arrow::after { - content: ""; - border-width: 0.8rem; -} -.bodywebsite .popover.bs-popover-top, -.bodywebsite .popover.bs-popover-auto[x-placement^="top"] { - margin-bottom: 0.8rem; -} -.bodywebsite .popover.bs-popover-top .arrow, -.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow { - bottom: 0; -} -.bodywebsite .popover.bs-popover-top .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::before, -.bodywebsite .popover.bs-popover-top .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::after { - border-bottom-width: 0; -} -.bodywebsite .popover.bs-popover-top .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::before { - bottom: -0.8rem; - margin-left: -0.8rem; - border-top-color: rgba(0, 0, 0, 0.25); -} -.bodywebsite .popover.bs-popover-top .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="top"] .arrow::after { - bottom: calc(0.2rem); - margin-left: -0.8rem; - border-top-color: #fff; -} -.bodywebsite .popover.bs-popover-right, -.bodywebsite .popover.bs-popover-auto[x-placement^="right"] { - margin-left: 0.8rem; -} -.bodywebsite .popover.bs-popover-right .arrow, -.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow { - left: 0; -} -.bodywebsite .popover.bs-popover-right .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::before, -.bodywebsite .popover.bs-popover-right .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::after { - margin-top: -0.8rem; - border-left-width: 0; -} -.bodywebsite .popover.bs-popover-right .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::before { - left: -0.8rem; - border-right-color: rgba(0, 0, 0, 0.25); -} -.bodywebsite .popover.bs-popover-right .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="right"] .arrow::after { - left: calc(0.2rem); - border-right-color: #fff; -} -.bodywebsite .popover.bs-popover-bottom, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] { - margin-top: 0.8rem; -} -.bodywebsite .popover.bs-popover-bottom .arrow, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow { - top: 0; -} -.bodywebsite .popover.bs-popover-bottom .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before, -.bodywebsite .popover.bs-popover-bottom .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after { - margin-left: -0.8rem; - border-top-width: 0; -} -.bodywebsite .popover.bs-popover-bottom .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before { - top: -0.8rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} -.bodywebsite .popover.bs-popover-bottom .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after { - top: calc(0.2rem); - border-bottom-color: #fff; -} -.bodywebsite .popover.bs-popover-bottom .popover-header::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 20px; - margin-left: -10px; - content: ""; - border-bottom: 1px solid #f7f7f7; -} -.bodywebsite .popover.bs-popover-left, -.bodywebsite .popover.bs-popover-auto[x-placement^="left"] { - margin-right: 0.8rem; -} -.bodywebsite .popover.bs-popover-left .arrow, -.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow { - right: 0; -} -.bodywebsite .popover.bs-popover-left .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::before, -.bodywebsite .popover.bs-popover-left .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::after { - margin-top: -0.8rem; - border-right-width: 0; -} -.bodywebsite .popover.bs-popover-left .arrow::before, -.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::before { - right: -0.8rem; - border-left-color: rgba(0, 0, 0, 0.25); -} -.bodywebsite .popover.bs-popover-left .arrow::after, -.bodywebsite .popover.bs-popover-auto[x-placement^="left"] .arrow::after { - right: calc(0.2rem); - border-left-color: #fff; -} -.bodywebsite .popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 14px; - color: inherit; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(5px); - border-top-right-radius: calc(5px); -} -.bodywebsite .popover-header:empty { - display: none; -} -.bodywebsite .popover-body { - padding: 0.5rem 0.75rem; - color: #212529; -} -.bodywebsite .carousel { - position: relative; -} -.bodywebsite .carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.bodywebsite .carousel-item { - position: relative; - display: none; - align-items: center; - width: 100%; - transition: transform 0.6s ease; - backface-visibility: hidden; - perspective: 1000px; -} -.bodywebsite .carousel-item.active, -.bodywebsite .carousel-item-next, -.bodywebsite .carousel-item-prev { - display: block; -} -.bodywebsite .carousel-item-next, -.bodywebsite .carousel-item-prev { - position: absolute; - top: 0; -} -.bodywebsite .carousel-item-next.carousel-item-left, -.bodywebsite .carousel-item-prev.carousel-item-right { - transform: translateX(0); -} -@supports (transform-style: preserve-3d) { - .bodywebsite .carousel-item-next.carousel-item-left, - .bodywebsite .carousel-item-prev.carousel-item-right { - transform: translate3d(0, 0, 0); - } -} -.bodywebsite .carousel-item-next, -.bodywebsite .active.carousel-item-right { - transform: translateX(100%); -} -@supports (transform-style: preserve-3d) { - .bodywebsite .carousel-item-next, - .bodywebsite .active.carousel-item-right { - transform: translate3d(100%, 0, 0); - } -} -.bodywebsite .carousel-item-prev, -.bodywebsite .active.carousel-item-left { - transform: translateX(-100%); -} -@supports (transform-style: preserve-3d) { - .bodywebsite .carousel-item-prev, - .bodywebsite .active.carousel-item-left { - transform: translate3d(-100%, 0, 0); - } -} -.bodywebsite .carousel-control-prev, -.bodywebsite .carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5; -} -.bodywebsite .carousel-control-prev:focus, -.bodywebsite .carousel-control-prev:hover, -.bodywebsite .carousel-control-next:focus, -.bodywebsite .carousel-control-next:hover { - color: #fff; - text-decoration: none; - outline: 0; - opacity: .9; -} -.bodywebsite .carousel-control-prev { - left: 0; -} -.bodywebsite .carousel-control-next { - right: 0; -} -.bodywebsite .carousel-control-prev-icon, -.bodywebsite .carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: transparent no-repeat center center; - background-size: 100% 100%; -} -.bodywebsite .carousel-control-prev-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"); -} -.bodywebsite .carousel-control-next-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"); -} -.bodywebsite .carousel-indicators { - position: absolute; - right: 0; - bottom: 10px; - left: 0; - z-index: 15; - display: flex; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} -.bodywebsite .carousel-indicators li { - position: relative; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - background-color: rgba(255, 255, 255, 0.5); -} -.bodywebsite .carousel-indicators li::before { - position: absolute; - top: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; -} -.bodywebsite .carousel-indicators li::after { - position: absolute; - bottom: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: ""; -} -.bodywebsite .carousel-indicators .active { - background-color: #fff; -} -.bodywebsite .carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} -.bodywebsite .align-baseline { - vertical-align: baseline !important; -} -.bodywebsite .align-top { - vertical-align: top !important; -} -.bodywebsite .align-middle { - vertical-align: middle !important; -} -.bodywebsite .align-bottom { - vertical-align: bottom !important; -} -.bodywebsite .align-text-bottom { - vertical-align: text-bottom !important; -} -.bodywebsite .align-text-top { - vertical-align: text-top !important; -} -.bodywebsite .bg-primary { - background-color: #007bff !important; -} -.bodywebsite a.bg-primary:focus, -.bodywebsite a.bg-primary:hover { - background-color: #0062cc !important; -} -.bodywebsite .bg-secondary { - background-color: #868e96 !important; -} -.bodywebsite a.bg-secondary:focus, -.bodywebsite a.bg-secondary:hover { - background-color: #6c757d !important; -} -.bodywebsite .bg-success { - background-color: #28a745 !important; -} -.bodywebsite a.bg-success:focus, -.bodywebsite a.bg-success:hover { - background-color: #1e7e34 !important; -} -.bodywebsite .bg-info { - background-color: #17a2b8 !important; -} -.bodywebsite a.bg-info:focus, -.bodywebsite a.bg-info:hover { - background-color: #117a8b !important; -} -.bodywebsite .bg-warning { - background-color: #ffc107 !important; -} -.bodywebsite a.bg-warning:focus, -.bodywebsite a.bg-warning:hover { - background-color: #d39e00 !important; -} -.bodywebsite .bg-danger { - background-color: #dc3545 !important; -} -.bodywebsite a.bg-danger:focus, -.bodywebsite a.bg-danger:hover { - background-color: #bd2130 !important; -} -.bodywebsite .bg-light { - background-color: #f8f9fa !important; -} -.bodywebsite a.bg-light:focus, -.bodywebsite a.bg-light:hover { - background-color: #dae0e5 !important; -} -.bodywebsite .bg-dark { - background-color: #343a40 !important; -} -.bodywebsite a.bg-dark:focus, -.bodywebsite a.bg-dark:hover { - background-color: #1d2124 !important; -} -.bodywebsite .bg-default { - background-color: #fff !important; -} -.bodywebsite .bg-transparent { - background-color: transparent !important; -} -.bodywebsite .border { - border: 1px solid #e9ecef !important; -} -.bodywebsite .border-0 { - border: 0 !important; -} -.bodywebsite .border-top-0 { - border-top: 0 !important; -} -.bodywebsite .border-right-0 { - border-right: 0 !important; -} -.bodywebsite .border-bottom-0 { - border-bottom: 0 !important; -} -.bodywebsite .border-left-0 { - border-left: 0 !important; -} -.bodywebsite .border-primary { - border-color: #007bff !important; -} -.bodywebsite .border-secondary { - border-color: #868e96 !important; -} -.bodywebsite .border-success { - border-color: #28a745 !important; -} -.bodywebsite .border-info { - border-color: #17a2b8 !important; -} -.bodywebsite .border-warning { - border-color: #ffc107 !important; -} -.bodywebsite .border-danger { - border-color: #dc3545 !important; -} -.bodywebsite .border-light { - border-color: #f8f9fa !important; -} -.bodywebsite .border-dark { - border-color: #343a40 !important; -} -.bodywebsite .border-white { - border-color: #fff !important; -} -.bodywebsite .rounded { - border-radius: 0 !important; -} -.bodywebsite .rounded-top { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; -} -.bodywebsite .rounded-right { - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; -} -.bodywebsite .rounded-bottom { - border-bottom-right-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} -.bodywebsite .rounded-left { - border-top-left-radius: 0 !important; - border-bottom-left-radius: 0 !important; -} -.bodywebsite .rounded-circle { - border-radius: 50% !important; -} -.bodywebsite .rounded-0 { - border-radius: 0 !important; -} -.bodywebsite .clearfix::after { - display: block; - clear: both; - content: ""; -} -.bodywebsite .d-none { - display: none !important; -} -.bodywebsite .d-inline { - display: inline !important; -} -.bodywebsite .d-inline-block { - display: inline-block !important; -} -.bodywebsite .d-block { - display: block !important; -} -.bodywebsite .d-table { - display: table !important; -} -.bodywebsite .d-table-row { - display: table-row !important; -} -.bodywebsite .d-table-cell { - display: table-cell !important; -} -.bodywebsite .d-flex { - display: flex !important; -} -.bodywebsite .d-inline-flex { - display: inline-flex !important; -} -@media (min-width: 576px) { - .bodywebsite .d-sm-none { - display: none !important; - } - .bodywebsite .d-sm-inline { - display: inline !important; - } - .bodywebsite .d-sm-inline-block { - display: inline-block !important; - } - .bodywebsite .d-sm-block { - display: block !important; - } - .bodywebsite .d-sm-table { - display: table !important; - } - .bodywebsite .d-sm-table-row { - display: table-row !important; - } - .bodywebsite .d-sm-table-cell { - display: table-cell !important; - } - .bodywebsite .d-sm-flex { - display: flex !important; - } - .bodywebsite .d-sm-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 768px) { - .bodywebsite .d-md-none { - display: none !important; - } - .bodywebsite .d-md-inline { - display: inline !important; - } - .bodywebsite .d-md-inline-block { - display: inline-block !important; - } - .bodywebsite .d-md-block { - display: block !important; - } - .bodywebsite .d-md-table { - display: table !important; - } - .bodywebsite .d-md-table-row { - display: table-row !important; - } - .bodywebsite .d-md-table-cell { - display: table-cell !important; - } - .bodywebsite .d-md-flex { - display: flex !important; - } - .bodywebsite .d-md-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 992px) { - .bodywebsite .d-lg-none { - display: none !important; - } - .bodywebsite .d-lg-inline { - display: inline !important; - } - .bodywebsite .d-lg-inline-block { - display: inline-block !important; - } - .bodywebsite .d-lg-block { - display: block !important; - } - .bodywebsite .d-lg-table { - display: table !important; - } - .bodywebsite .d-lg-table-row { - display: table-row !important; - } - .bodywebsite .d-lg-table-cell { - display: table-cell !important; - } - .bodywebsite .d-lg-flex { - display: flex !important; - } - .bodywebsite .d-lg-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 1200px) { - .bodywebsite .d-xl-none { - display: none !important; - } - .bodywebsite .d-xl-inline { - display: inline !important; - } - .bodywebsite .d-xl-inline-block { - display: inline-block !important; - } - .bodywebsite .d-xl-block { - display: block !important; - } - .bodywebsite .d-xl-table { - display: table !important; - } - .bodywebsite .d-xl-table-row { - display: table-row !important; - } - .bodywebsite .d-xl-table-cell { - display: table-cell !important; - } - .bodywebsite .d-xl-flex { - display: flex !important; - } - .bodywebsite .d-xl-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 1800px) { - .bodywebsite .d-xxl-none { - display: none !important; - } - .bodywebsite .d-xxl-inline { - display: inline !important; - } - .bodywebsite .d-xxl-inline-block { - display: inline-block !important; - } - .bodywebsite .d-xxl-block { - display: block !important; - } - .bodywebsite .d-xxl-table { - display: table !important; - } - .bodywebsite .d-xxl-table-row { - display: table-row !important; - } - .bodywebsite .d-xxl-table-cell { - display: table-cell !important; - } - .bodywebsite .d-xxl-flex { - display: flex !important; - } - .bodywebsite .d-xxl-inline-flex { - display: inline-flex !important; - } -} -.bodywebsite .d-print-block { - display: none !important; -} -@media print { - .bodywebsite .d-print-block { - display: block !important; - } -} -.bodywebsite .d-print-inline { - display: none !important; -} -@media print { - .bodywebsite .d-print-inline { - display: inline !important; - } -} -.bodywebsite .d-print-inline-block { - display: none !important; -} -@media print { - .bodywebsite .d-print-inline-block { - display: inline-block !important; - } -} -@media print { - .bodywebsite .d-print-none { - display: none !important; - } -} -.bodywebsite .embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} -.bodywebsite .embed-responsive::before { - display: block; - content: ""; -} -.bodywebsite .embed-responsive .embed-responsive-item, -.bodywebsite .embed-responsive iframe, -.bodywebsite .embed-responsive embed, -.bodywebsite .embed-responsive object, -.bodywebsite .embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.bodywebsite .embed-responsive-21by9::before { - padding-top: 42.85714%; -} -.bodywebsite .embed-responsive-16by9::before { - padding-top: 56.25%; -} -.bodywebsite .embed-responsive-4by3::before { - padding-top: 75%; -} -.bodywebsite .embed-responsive-1by1::before { - padding-top: 100%; -} -.bodywebsite .flex-row { - flex-direction: row !important; -} -.bodywebsite .flex-column { - flex-direction: column !important; -} -.bodywebsite .flex-row-reverse { - flex-direction: row-reverse !important; -} -.bodywebsite .flex-column-reverse { - flex-direction: column-reverse !important; -} -.bodywebsite .flex-wrap { - flex-wrap: wrap !important; -} -.bodywebsite .flex-nowrap { - flex-wrap: nowrap !important; -} -.bodywebsite .flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} -.bodywebsite .justify-content-start { - justify-content: flex-start !important; -} -.bodywebsite .justify-content-end { - justify-content: flex-end !important; -} -.bodywebsite .justify-content-center { - justify-content: center !important; -} -.bodywebsite .justify-content-between { - justify-content: space-between !important; -} -.bodywebsite .justify-content-around { - justify-content: space-around !important; -} -.bodywebsite .align-items-start { - align-items: flex-start !important; -} -.bodywebsite .align-items-end { - align-items: flex-end !important; -} -.bodywebsite .align-items-center { - align-items: center !important; -} -.bodywebsite .align-items-baseline { - align-items: baseline !important; -} -.bodywebsite .align-items-stretch { - align-items: stretch !important; -} -.bodywebsite .align-content-start { - align-content: flex-start !important; -} -.bodywebsite .align-content-end { - align-content: flex-end !important; -} -.bodywebsite .align-content-center { - align-content: center !important; -} -.bodywebsite .align-content-between { - align-content: space-between !important; -} -.bodywebsite .align-content-around { - align-content: space-around !important; -} -.bodywebsite .align-content-stretch { - align-content: stretch !important; -} -.bodywebsite .align-self-auto { - align-self: auto !important; -} -.bodywebsite .align-self-start { - align-self: flex-start !important; -} -.bodywebsite .align-self-end { - align-self: flex-end !important; -} -.bodywebsite .align-self-center { - align-self: center !important; -} -.bodywebsite .align-self-baseline { - align-self: baseline !important; -} -.bodywebsite .align-self-stretch { - align-self: stretch !important; -} -@media (min-width: 576px) { - .bodywebsite .flex-sm-row { - flex-direction: row !important; - } - .bodywebsite .flex-sm-column { - flex-direction: column !important; - } - .bodywebsite .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - .bodywebsite .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - .bodywebsite .flex-sm-wrap { - flex-wrap: wrap !important; - } - .bodywebsite .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - .bodywebsite .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .bodywebsite .justify-content-sm-start { - justify-content: flex-start !important; - } - .bodywebsite .justify-content-sm-end { - justify-content: flex-end !important; - } - .bodywebsite .justify-content-sm-center { - justify-content: center !important; - } - .bodywebsite .justify-content-sm-between { - justify-content: space-between !important; - } - .bodywebsite .justify-content-sm-around { - justify-content: space-around !important; - } - .bodywebsite .align-items-sm-start { - align-items: flex-start !important; - } - .bodywebsite .align-items-sm-end { - align-items: flex-end !important; - } - .bodywebsite .align-items-sm-center { - align-items: center !important; - } - .bodywebsite .align-items-sm-baseline { - align-items: baseline !important; - } - .bodywebsite .align-items-sm-stretch { - align-items: stretch !important; - } - .bodywebsite .align-content-sm-start { - align-content: flex-start !important; - } - .bodywebsite .align-content-sm-end { - align-content: flex-end !important; - } - .bodywebsite .align-content-sm-center { - align-content: center !important; - } - .bodywebsite .align-content-sm-between { - align-content: space-between !important; - } - .bodywebsite .align-content-sm-around { - align-content: space-around !important; - } - .bodywebsite .align-content-sm-stretch { - align-content: stretch !important; - } - .bodywebsite .align-self-sm-auto { - align-self: auto !important; - } - .bodywebsite .align-self-sm-start { - align-self: flex-start !important; - } - .bodywebsite .align-self-sm-end { - align-self: flex-end !important; - } - .bodywebsite .align-self-sm-center { - align-self: center !important; - } - .bodywebsite .align-self-sm-baseline { - align-self: baseline !important; - } - .bodywebsite .align-self-sm-stretch { - align-self: stretch !important; - } -} -@media (min-width: 768px) { - .bodywebsite .flex-md-row { - flex-direction: row !important; - } - .bodywebsite .flex-md-column { - flex-direction: column !important; - } - .bodywebsite .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - .bodywebsite .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - .bodywebsite .flex-md-wrap { - flex-wrap: wrap !important; - } - .bodywebsite .flex-md-nowrap { - flex-wrap: nowrap !important; - } - .bodywebsite .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .bodywebsite .justify-content-md-start { - justify-content: flex-start !important; - } - .bodywebsite .justify-content-md-end { - justify-content: flex-end !important; - } - .bodywebsite .justify-content-md-center { - justify-content: center !important; - } - .bodywebsite .justify-content-md-between { - justify-content: space-between !important; - } - .bodywebsite .justify-content-md-around { - justify-content: space-around !important; - } - .bodywebsite .align-items-md-start { - align-items: flex-start !important; - } - .bodywebsite .align-items-md-end { - align-items: flex-end !important; - } - .bodywebsite .align-items-md-center { - align-items: center !important; - } - .bodywebsite .align-items-md-baseline { - align-items: baseline !important; - } - .bodywebsite .align-items-md-stretch { - align-items: stretch !important; - } - .bodywebsite .align-content-md-start { - align-content: flex-start !important; - } - .bodywebsite .align-content-md-end { - align-content: flex-end !important; - } - .bodywebsite .align-content-md-center { - align-content: center !important; - } - .bodywebsite .align-content-md-between { - align-content: space-between !important; - } - .bodywebsite .align-content-md-around { - align-content: space-around !important; - } - .bodywebsite .align-content-md-stretch { - align-content: stretch !important; - } - .bodywebsite .align-self-md-auto { - align-self: auto !important; - } - .bodywebsite .align-self-md-start { - align-self: flex-start !important; - } - .bodywebsite .align-self-md-end { - align-self: flex-end !important; - } - .bodywebsite .align-self-md-center { - align-self: center !important; - } - .bodywebsite .align-self-md-baseline { - align-self: baseline !important; - } - .bodywebsite .align-self-md-stretch { - align-self: stretch !important; - } -} -@media (min-width: 992px) { - .bodywebsite .flex-lg-row { - flex-direction: row !important; - } - .bodywebsite .flex-lg-column { - flex-direction: column !important; - } - .bodywebsite .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - .bodywebsite .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - .bodywebsite .flex-lg-wrap { - flex-wrap: wrap !important; - } - .bodywebsite .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - .bodywebsite .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .bodywebsite .justify-content-lg-start { - justify-content: flex-start !important; - } - .bodywebsite .justify-content-lg-end { - justify-content: flex-end !important; - } - .bodywebsite .justify-content-lg-center { - justify-content: center !important; - } - .bodywebsite .justify-content-lg-between { - justify-content: space-between !important; - } - .bodywebsite .justify-content-lg-around { - justify-content: space-around !important; - } - .bodywebsite .align-items-lg-start { - align-items: flex-start !important; - } - .bodywebsite .align-items-lg-end { - align-items: flex-end !important; - } - .bodywebsite .align-items-lg-center { - align-items: center !important; - } - .bodywebsite .align-items-lg-baseline { - align-items: baseline !important; - } - .bodywebsite .align-items-lg-stretch { - align-items: stretch !important; - } - .bodywebsite .align-content-lg-start { - align-content: flex-start !important; - } - .bodywebsite .align-content-lg-end { - align-content: flex-end !important; - } - .bodywebsite .align-content-lg-center { - align-content: center !important; - } - .bodywebsite .align-content-lg-between { - align-content: space-between !important; - } - .bodywebsite .align-content-lg-around { - align-content: space-around !important; - } - .bodywebsite .align-content-lg-stretch { - align-content: stretch !important; - } - .bodywebsite .align-self-lg-auto { - align-self: auto !important; - } - .bodywebsite .align-self-lg-start { - align-self: flex-start !important; - } - .bodywebsite .align-self-lg-end { - align-self: flex-end !important; - } - .bodywebsite .align-self-lg-center { - align-self: center !important; - } - .bodywebsite .align-self-lg-baseline { - align-self: baseline !important; - } - .bodywebsite .align-self-lg-stretch { - align-self: stretch !important; - } -} -@media (min-width: 1200px) { - .bodywebsite .flex-xl-row { - flex-direction: row !important; - } - .bodywebsite .flex-xl-column { - flex-direction: column !important; - } - .bodywebsite .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - .bodywebsite .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - .bodywebsite .flex-xl-wrap { - flex-wrap: wrap !important; - } - .bodywebsite .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - .bodywebsite .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .bodywebsite .justify-content-xl-start { - justify-content: flex-start !important; - } - .bodywebsite .justify-content-xl-end { - justify-content: flex-end !important; - } - .bodywebsite .justify-content-xl-center { - justify-content: center !important; - } - .bodywebsite .justify-content-xl-between { - justify-content: space-between !important; - } - .bodywebsite .justify-content-xl-around { - justify-content: space-around !important; - } - .bodywebsite .align-items-xl-start { - align-items: flex-start !important; - } - .bodywebsite .align-items-xl-end { - align-items: flex-end !important; - } - .bodywebsite .align-items-xl-center { - align-items: center !important; - } - .bodywebsite .align-items-xl-baseline { - align-items: baseline !important; - } - .bodywebsite .align-items-xl-stretch { - align-items: stretch !important; - } - .bodywebsite .align-content-xl-start { - align-content: flex-start !important; - } - .bodywebsite .align-content-xl-end { - align-content: flex-end !important; - } - .bodywebsite .align-content-xl-center { - align-content: center !important; - } - .bodywebsite .align-content-xl-between { - align-content: space-between !important; - } - .bodywebsite .align-content-xl-around { - align-content: space-around !important; - } - .bodywebsite .align-content-xl-stretch { - align-content: stretch !important; - } - .bodywebsite .align-self-xl-auto { - align-self: auto !important; - } - .bodywebsite .align-self-xl-start { - align-self: flex-start !important; - } - .bodywebsite .align-self-xl-end { - align-self: flex-end !important; - } - .bodywebsite .align-self-xl-center { - align-self: center !important; - } - .bodywebsite .align-self-xl-baseline { - align-self: baseline !important; - } - .bodywebsite .align-self-xl-stretch { - align-self: stretch !important; - } -} -@media (min-width: 1800px) { - .bodywebsite .flex-xxl-row { - flex-direction: row !important; - } - .bodywebsite .flex-xxl-column { - flex-direction: column !important; - } - .bodywebsite .flex-xxl-row-reverse { - flex-direction: row-reverse !important; - } - .bodywebsite .flex-xxl-column-reverse { - flex-direction: column-reverse !important; - } - .bodywebsite .flex-xxl-wrap { - flex-wrap: wrap !important; - } - .bodywebsite .flex-xxl-nowrap { - flex-wrap: nowrap !important; - } - .bodywebsite .flex-xxl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - .bodywebsite .justify-content-xxl-start { - justify-content: flex-start !important; - } - .bodywebsite .justify-content-xxl-end { - justify-content: flex-end !important; - } - .bodywebsite .justify-content-xxl-center { - justify-content: center !important; - } - .bodywebsite .justify-content-xxl-between { - justify-content: space-between !important; - } - .bodywebsite .justify-content-xxl-around { - justify-content: space-around !important; - } - .bodywebsite .align-items-xxl-start { - align-items: flex-start !important; - } - .bodywebsite .align-items-xxl-end { - align-items: flex-end !important; - } - .bodywebsite .align-items-xxl-center { - align-items: center !important; - } - .bodywebsite .align-items-xxl-baseline { - align-items: baseline !important; - } - .bodywebsite .align-items-xxl-stretch { - align-items: stretch !important; - } - .bodywebsite .align-content-xxl-start { - align-content: flex-start !important; - } - .bodywebsite .align-content-xxl-end { - align-content: flex-end !important; - } - .bodywebsite .align-content-xxl-center { - align-content: center !important; - } - .bodywebsite .align-content-xxl-between { - align-content: space-between !important; - } - .bodywebsite .align-content-xxl-around { - align-content: space-around !important; - } - .bodywebsite .align-content-xxl-stretch { - align-content: stretch !important; - } - .bodywebsite .align-self-xxl-auto { - align-self: auto !important; - } - .bodywebsite .align-self-xxl-start { - align-self: flex-start !important; - } - .bodywebsite .align-self-xxl-end { - align-self: flex-end !important; - } - .bodywebsite .align-self-xxl-center { - align-self: center !important; - } - .bodywebsite .align-self-xxl-baseline { - align-self: baseline !important; - } - .bodywebsite .align-self-xxl-stretch { - align-self: stretch !important; - } -} -.bodywebsite .float-left { - float: left !important; -} -.bodywebsite .float-right { - float: right !important; -} -.bodywebsite .float-none { - float: none !important; -} -@media (min-width: 576px) { - .bodywebsite .float-sm-left { - float: left !important; - } - .bodywebsite .float-sm-right { - float: right !important; - } - .bodywebsite .float-sm-none { - float: none !important; - } -} -@media (min-width: 768px) { - .bodywebsite .float-md-left { - float: left !important; - } - .bodywebsite .float-md-right { - float: right !important; - } - .bodywebsite .float-md-none { - float: none !important; - } -} -@media (min-width: 992px) { - .bodywebsite .float-lg-left { - float: left !important; - } - .bodywebsite .float-lg-right { - float: right !important; - } - .bodywebsite .float-lg-none { - float: none !important; - } -} -@media (min-width: 1200px) { - .bodywebsite .float-xl-left { - float: left !important; - } - .bodywebsite .float-xl-right { - float: right !important; - } - .bodywebsite .float-xl-none { - float: none !important; - } -} -@media (min-width: 1800px) { - .bodywebsite .float-xxl-left { - float: left !important; - } - .bodywebsite .float-xxl-right { - float: right !important; - } - .bodywebsite .float-xxl-none { - float: none !important; - } -} -.bodywebsite .position-static { - position: static !important; -} -.bodywebsite .position-relative { - position: relative !important; -} -.bodywebsite .position-absolute { - position: absolute !important; -} -.bodywebsite .position-fixed { - position: fixed !important; -} -.bodywebsite .position-sticky { - position: sticky !important; -} -.bodywebsite .fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} -.bodywebsite .fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} -@supports (position: sticky) { - .bodywebsite .sticky-top { - position: sticky; - top: 0; - z-index: 1020; - } -} -.bodywebsite .sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - clip-path: inset(50%); - border: 0; -} -.bodywebsite .sr-only-focusable:active, -.bodywebsite .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; - clip-path: none; -} -.bodywebsite .w-25 { - width: 25% !important; -} -.bodywebsite .w-50 { - width: 50% !important; -} -.bodywebsite .w-75 { - width: 75% !important; -} -.bodywebsite .w-100 { - width: 100% !important; -} -.bodywebsite .h-25 { - height: 25% !important; -} -.bodywebsite .h-50 { - height: 50% !important; -} -.bodywebsite .h-75 { - height: 75% !important; -} -.bodywebsite .h-100 { - height: 100% !important; -} -.bodywebsite .mw-100 { - max-width: 100% !important; -} -.bodywebsite .mh-100 { - max-height: 100% !important; -} -.bodywebsite .m-0 { - margin: 0 !important; -} -.bodywebsite .mt-0, -.bodywebsite .my-0 { - margin-top: 0 !important; -} -.bodywebsite .mr-0, -.bodywebsite .mx-0 { - margin-right: 0 !important; -} -.bodywebsite .mb-0, -.bodywebsite .my-0 { - margin-bottom: 0 !important; -} -.bodywebsite .ml-0, -.bodywebsite .mx-0 { - margin-left: 0 !important; -} -.bodywebsite .m-1 { - margin: 0.25rem !important; -} -.bodywebsite .mt-1, -.bodywebsite .my-1 { - margin-top: 0.25rem !important; -} -.bodywebsite .mr-1, -.bodywebsite .mx-1 { - margin-right: 0.25rem !important; -} -.bodywebsite .mb-1, -.bodywebsite .my-1 { - margin-bottom: 0.25rem !important; -} -.bodywebsite .ml-1, -.bodywebsite .mx-1 { - margin-left: 0.25rem !important; -} -.bodywebsite .m-2 { - margin: 0.5rem !important; -} -.bodywebsite .mt-2, -.bodywebsite .my-2 { - margin-top: 0.5rem !important; -} -.bodywebsite .mr-2, -.bodywebsite .mx-2 { - margin-right: 0.5rem !important; -} -.bodywebsite .mb-2, -.bodywebsite .my-2 { - margin-bottom: 0.5rem !important; -} -.bodywebsite .ml-2, -.bodywebsite .mx-2 { - margin-left: 0.5rem !important; -} -.bodywebsite .m-3 { - margin: 1rem !important; -} -.bodywebsite .mt-3, -.bodywebsite .my-3 { - margin-top: 1rem !important; -} -.bodywebsite .mr-3, -.bodywebsite .mx-3 { - margin-right: 1rem !important; -} -.bodywebsite .mb-3, -.bodywebsite .my-3 { - margin-bottom: 1rem !important; -} -.bodywebsite .ml-3, -.bodywebsite .mx-3 { - margin-left: 1rem !important; -} -.bodywebsite .m-4 { - margin: 1.5rem !important; -} -.bodywebsite .mt-4, -.bodywebsite .my-4 { - margin-top: 1.5rem !important; -} -.bodywebsite .mr-4, -.bodywebsite .mx-4 { - margin-right: 1.5rem !important; -} -.bodywebsite .mb-4, -.bodywebsite .my-4 { - margin-bottom: 1.5rem !important; -} -.bodywebsite .ml-4, -.bodywebsite .mx-4 { - margin-left: 1.5rem !important; -} -.bodywebsite .m-5 { - margin: 3rem !important; -} -.bodywebsite .mt-5, -.bodywebsite .my-5 { - margin-top: 3rem !important; -} -.bodywebsite .mr-5, -.bodywebsite .mx-5 { - margin-right: 3rem !important; -} -.bodywebsite .mb-5, -.bodywebsite .my-5 { - margin-bottom: 3rem !important; -} -.bodywebsite .ml-5, -.bodywebsite .mx-5 { - margin-left: 3rem !important; -} -.bodywebsite .p-0 { - padding: 0 !important; -} -.bodywebsite .pt-0, -.bodywebsite .py-0 { - padding-top: 0 !important; -} -.bodywebsite .pr-0, -.bodywebsite .px-0 { - padding-right: 0 !important; -} -.bodywebsite .pb-0, -.bodywebsite .py-0 { - padding-bottom: 0 !important; -} -.bodywebsite .pl-0, -.bodywebsite .px-0 { - padding-left: 0 !important; -} -.bodywebsite .p-1 { - padding: 0.25rem !important; -} -.bodywebsite .pt-1, -.bodywebsite .py-1 { - padding-top: 0.25rem !important; -} -.bodywebsite .pr-1, -.bodywebsite .px-1 { - padding-right: 0.25rem !important; -} -.bodywebsite .pb-1, -.bodywebsite .py-1 { - padding-bottom: 0.25rem !important; -} -.bodywebsite .pl-1, -.bodywebsite .px-1 { - padding-left: 0.25rem !important; -} -.bodywebsite .p-2 { - padding: 0.5rem !important; -} -.bodywebsite .pt-2, -.bodywebsite .py-2 { - padding-top: 0.5rem !important; -} -.bodywebsite .pr-2, -.bodywebsite .px-2 { - padding-right: 0.5rem !important; -} -.bodywebsite .pb-2, -.bodywebsite .py-2 { - padding-bottom: 0.5rem !important; -} -.bodywebsite .pl-2, -.bodywebsite .px-2 { - padding-left: 0.5rem !important; -} -.bodywebsite .p-3 { - padding: 1rem !important; -} -.bodywebsite .pt-3, -.bodywebsite .py-3 { - padding-top: 1rem !important; -} -.bodywebsite .pr-3, -.bodywebsite .px-3 { - padding-right: 1rem !important; -} -.bodywebsite .pb-3, -.bodywebsite .py-3 { - padding-bottom: 1rem !important; -} -.bodywebsite .pl-3, -.bodywebsite .px-3 { - padding-left: 1rem !important; -} -.bodywebsite .p-4 { - padding: 1.5rem !important; -} -.bodywebsite .pt-4, -.bodywebsite .py-4 { - padding-top: 1.5rem !important; -} -.bodywebsite .pr-4, -.bodywebsite .px-4 { - padding-right: 1.5rem !important; -} -.bodywebsite .pb-4, -.bodywebsite .py-4 { - padding-bottom: 1.5rem !important; -} -.bodywebsite .pl-4, -.bodywebsite .px-4 { - padding-left: 1.5rem !important; -} -.bodywebsite .p-5 { - padding: 3rem !important; -} -.bodywebsite .pt-5, -.bodywebsite .py-5 { - padding-top: 3rem !important; -} -.bodywebsite .pr-5, -.bodywebsite .px-5 { - padding-right: 3rem !important; -} -.bodywebsite .pb-5, -.bodywebsite .py-5 { - padding-bottom: 3rem !important; -} -.bodywebsite .pl-5, -.bodywebsite .px-5 { - padding-left: 3rem !important; -} -.bodywebsite .m-auto { - margin: auto !important; -} -.bodywebsite .mt-auto, -.bodywebsite .my-auto { - margin-top: auto !important; -} -.bodywebsite .mr-auto, -.bodywebsite .mx-auto { - margin-right: auto !important; -} -.bodywebsite .mb-auto, -.bodywebsite .my-auto { - margin-bottom: auto !important; -} -.bodywebsite .ml-auto, -.bodywebsite .mx-auto { - margin-left: auto !important; -} -@media (min-width: 576px) { - .bodywebsite .m-sm-0 { - margin: 0 !important; - } - .bodywebsite .mt-sm-0, - .bodywebsite .my-sm-0 { - margin-top: 0 !important; - } - .bodywebsite .mr-sm-0, - .bodywebsite .mx-sm-0 { - margin-right: 0 !important; - } - .bodywebsite .mb-sm-0, - .bodywebsite .my-sm-0 { - margin-bottom: 0 !important; - } - .bodywebsite .ml-sm-0, - .bodywebsite .mx-sm-0 { - margin-left: 0 !important; - } - .bodywebsite .m-sm-1 { - margin: 0.25rem !important; - } - .bodywebsite .mt-sm-1, - .bodywebsite .my-sm-1 { - margin-top: 0.25rem !important; - } - .bodywebsite .mr-sm-1, - .bodywebsite .mx-sm-1 { - margin-right: 0.25rem !important; - } - .bodywebsite .mb-sm-1, - .bodywebsite .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .bodywebsite .ml-sm-1, - .bodywebsite .mx-sm-1 { - margin-left: 0.25rem !important; - } - .bodywebsite .m-sm-2 { - margin: 0.5rem !important; - } - .bodywebsite .mt-sm-2, - .bodywebsite .my-sm-2 { - margin-top: 0.5rem !important; - } - .bodywebsite .mr-sm-2, - .bodywebsite .mx-sm-2 { - margin-right: 0.5rem !important; - } - .bodywebsite .mb-sm-2, - .bodywebsite .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .bodywebsite .ml-sm-2, - .bodywebsite .mx-sm-2 { - margin-left: 0.5rem !important; - } - .bodywebsite .m-sm-3 { - margin: 1rem !important; - } - .bodywebsite .mt-sm-3, - .bodywebsite .my-sm-3 { - margin-top: 1rem !important; - } - .bodywebsite .mr-sm-3, - .bodywebsite .mx-sm-3 { - margin-right: 1rem !important; - } - .bodywebsite .mb-sm-3, - .bodywebsite .my-sm-3 { - margin-bottom: 1rem !important; - } - .bodywebsite .ml-sm-3, - .bodywebsite .mx-sm-3 { - margin-left: 1rem !important; - } - .bodywebsite .m-sm-4 { - margin: 1.5rem !important; - } - .bodywebsite .mt-sm-4, - .bodywebsite .my-sm-4 { - margin-top: 1.5rem !important; - } - .bodywebsite .mr-sm-4, - .bodywebsite .mx-sm-4 { - margin-right: 1.5rem !important; - } - .bodywebsite .mb-sm-4, - .bodywebsite .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .bodywebsite .ml-sm-4, - .bodywebsite .mx-sm-4 { - margin-left: 1.5rem !important; - } - .bodywebsite .m-sm-5 { - margin: 3rem !important; - } - .bodywebsite .mt-sm-5, - .bodywebsite .my-sm-5 { - margin-top: 3rem !important; - } - .bodywebsite .mr-sm-5, - .bodywebsite .mx-sm-5 { - margin-right: 3rem !important; - } - .bodywebsite .mb-sm-5, - .bodywebsite .my-sm-5 { - margin-bottom: 3rem !important; - } - .bodywebsite .ml-sm-5, - .bodywebsite .mx-sm-5 { - margin-left: 3rem !important; - } - .bodywebsite .p-sm-0 { - padding: 0 !important; - } - .bodywebsite .pt-sm-0, - .bodywebsite .py-sm-0 { - padding-top: 0 !important; - } - .bodywebsite .pr-sm-0, - .bodywebsite .px-sm-0 { - padding-right: 0 !important; - } - .bodywebsite .pb-sm-0, - .bodywebsite .py-sm-0 { - padding-bottom: 0 !important; - } - .bodywebsite .pl-sm-0, - .bodywebsite .px-sm-0 { - padding-left: 0 !important; - } - .bodywebsite .p-sm-1 { - padding: 0.25rem !important; - } - .bodywebsite .pt-sm-1, - .bodywebsite .py-sm-1 { - padding-top: 0.25rem !important; - } - .bodywebsite .pr-sm-1, - .bodywebsite .px-sm-1 { - padding-right: 0.25rem !important; - } - .bodywebsite .pb-sm-1, - .bodywebsite .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .bodywebsite .pl-sm-1, - .bodywebsite .px-sm-1 { - padding-left: 0.25rem !important; - } - .bodywebsite .p-sm-2 { - padding: 0.5rem !important; - } - .bodywebsite .pt-sm-2, - .bodywebsite .py-sm-2 { - padding-top: 0.5rem !important; - } - .bodywebsite .pr-sm-2, - .bodywebsite .px-sm-2 { - padding-right: 0.5rem !important; - } - .bodywebsite .pb-sm-2, - .bodywebsite .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .bodywebsite .pl-sm-2, - .bodywebsite .px-sm-2 { - padding-left: 0.5rem !important; - } - .bodywebsite .p-sm-3 { - padding: 1rem !important; - } - .bodywebsite .pt-sm-3, - .bodywebsite .py-sm-3 { - padding-top: 1rem !important; - } - .bodywebsite .pr-sm-3, - .bodywebsite .px-sm-3 { - padding-right: 1rem !important; - } - .bodywebsite .pb-sm-3, - .bodywebsite .py-sm-3 { - padding-bottom: 1rem !important; - } - .bodywebsite .pl-sm-3, - .bodywebsite .px-sm-3 { - padding-left: 1rem !important; - } - .bodywebsite .p-sm-4 { - padding: 1.5rem !important; - } - .bodywebsite .pt-sm-4, - .bodywebsite .py-sm-4 { - padding-top: 1.5rem !important; - } - .bodywebsite .pr-sm-4, - .bodywebsite .px-sm-4 { - padding-right: 1.5rem !important; - } - .bodywebsite .pb-sm-4, - .bodywebsite .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .bodywebsite .pl-sm-4, - .bodywebsite .px-sm-4 { - padding-left: 1.5rem !important; - } - .bodywebsite .p-sm-5 { - padding: 3rem !important; - } - .bodywebsite .pt-sm-5, - .bodywebsite .py-sm-5 { - padding-top: 3rem !important; - } - .bodywebsite .pr-sm-5, - .bodywebsite .px-sm-5 { - padding-right: 3rem !important; - } - .bodywebsite .pb-sm-5, - .bodywebsite .py-sm-5 { - padding-bottom: 3rem !important; - } - .bodywebsite .pl-sm-5, - .bodywebsite .px-sm-5 { - padding-left: 3rem !important; - } - .bodywebsite .m-sm-auto { - margin: auto !important; - } - .bodywebsite .mt-sm-auto, - .bodywebsite .my-sm-auto { - margin-top: auto !important; - } - .bodywebsite .mr-sm-auto, - .bodywebsite .mx-sm-auto { - margin-right: auto !important; - } - .bodywebsite .mb-sm-auto, - .bodywebsite .my-sm-auto { - margin-bottom: auto !important; - } - .bodywebsite .ml-sm-auto, - .bodywebsite .mx-sm-auto { - margin-left: auto !important; - } -} -@media (min-width: 768px) { - .bodywebsite .m-md-0 { - margin: 0 !important; - } - .bodywebsite .mt-md-0, - .bodywebsite .my-md-0 { - margin-top: 0 !important; - } - .bodywebsite .mr-md-0, - .bodywebsite .mx-md-0 { - margin-right: 0 !important; - } - .bodywebsite .mb-md-0, - .bodywebsite .my-md-0 { - margin-bottom: 0 !important; - } - .bodywebsite .ml-md-0, - .bodywebsite .mx-md-0 { - margin-left: 0 !important; - } - .bodywebsite .m-md-1 { - margin: 0.25rem !important; - } - .bodywebsite .mt-md-1, - .bodywebsite .my-md-1 { - margin-top: 0.25rem !important; - } - .bodywebsite .mr-md-1, - .bodywebsite .mx-md-1 { - margin-right: 0.25rem !important; - } - .bodywebsite .mb-md-1, - .bodywebsite .my-md-1 { - margin-bottom: 0.25rem !important; - } - .bodywebsite .ml-md-1, - .bodywebsite .mx-md-1 { - margin-left: 0.25rem !important; - } - .bodywebsite .m-md-2 { - margin: 0.5rem !important; - } - .bodywebsite .mt-md-2, - .bodywebsite .my-md-2 { - margin-top: 0.5rem !important; - } - .bodywebsite .mr-md-2, - .bodywebsite .mx-md-2 { - margin-right: 0.5rem !important; - } - .bodywebsite .mb-md-2, - .bodywebsite .my-md-2 { - margin-bottom: 0.5rem !important; - } - .bodywebsite .ml-md-2, - .bodywebsite .mx-md-2 { - margin-left: 0.5rem !important; - } - .bodywebsite .m-md-3 { - margin: 1rem !important; - } - .bodywebsite .mt-md-3, - .bodywebsite .my-md-3 { - margin-top: 1rem !important; - } - .bodywebsite .mr-md-3, - .bodywebsite .mx-md-3 { - margin-right: 1rem !important; - } - .bodywebsite .mb-md-3, - .bodywebsite .my-md-3 { - margin-bottom: 1rem !important; - } - .bodywebsite .ml-md-3, - .bodywebsite .mx-md-3 { - margin-left: 1rem !important; - } - .bodywebsite .m-md-4 { - margin: 1.5rem !important; - } - .bodywebsite .mt-md-4, - .bodywebsite .my-md-4 { - margin-top: 1.5rem !important; - } - .bodywebsite .mr-md-4, - .bodywebsite .mx-md-4 { - margin-right: 1.5rem !important; - } - .bodywebsite .mb-md-4, - .bodywebsite .my-md-4 { - margin-bottom: 1.5rem !important; - } - .bodywebsite .ml-md-4, - .bodywebsite .mx-md-4 { - margin-left: 1.5rem !important; - } - .bodywebsite .m-md-5 { - margin: 3rem !important; - } - .bodywebsite .mt-md-5, - .bodywebsite .my-md-5 { - margin-top: 3rem !important; - } - .bodywebsite .mr-md-5, - .bodywebsite .mx-md-5 { - margin-right: 3rem !important; - } - .bodywebsite .mb-md-5, - .bodywebsite .my-md-5 { - margin-bottom: 3rem !important; - } - .bodywebsite .ml-md-5, - .bodywebsite .mx-md-5 { - margin-left: 3rem !important; - } - .bodywebsite .p-md-0 { - padding: 0 !important; - } - .bodywebsite .pt-md-0, - .bodywebsite .py-md-0 { - padding-top: 0 !important; - } - .bodywebsite .pr-md-0, - .bodywebsite .px-md-0 { - padding-right: 0 !important; - } - .bodywebsite .pb-md-0, - .bodywebsite .py-md-0 { - padding-bottom: 0 !important; - } - .bodywebsite .pl-md-0, - .bodywebsite .px-md-0 { - padding-left: 0 !important; - } - .bodywebsite .p-md-1 { - padding: 0.25rem !important; - } - .bodywebsite .pt-md-1, - .bodywebsite .py-md-1 { - padding-top: 0.25rem !important; - } - .bodywebsite .pr-md-1, - .bodywebsite .px-md-1 { - padding-right: 0.25rem !important; - } - .bodywebsite .pb-md-1, - .bodywebsite .py-md-1 { - padding-bottom: 0.25rem !important; - } - .bodywebsite .pl-md-1, - .bodywebsite .px-md-1 { - padding-left: 0.25rem !important; - } - .bodywebsite .p-md-2 { - padding: 0.5rem !important; - } - .bodywebsite .pt-md-2, - .bodywebsite .py-md-2 { - padding-top: 0.5rem !important; - } - .bodywebsite .pr-md-2, - .bodywebsite .px-md-2 { - padding-right: 0.5rem !important; - } - .bodywebsite .pb-md-2, - .bodywebsite .py-md-2 { - padding-bottom: 0.5rem !important; - } - .bodywebsite .pl-md-2, - .bodywebsite .px-md-2 { - padding-left: 0.5rem !important; - } - .bodywebsite .p-md-3 { - padding: 1rem !important; - } - .bodywebsite .pt-md-3, - .bodywebsite .py-md-3 { - padding-top: 1rem !important; - } - .bodywebsite .pr-md-3, - .bodywebsite .px-md-3 { - padding-right: 1rem !important; - } - .bodywebsite .pb-md-3, - .bodywebsite .py-md-3 { - padding-bottom: 1rem !important; - } - .bodywebsite .pl-md-3, - .bodywebsite .px-md-3 { - padding-left: 1rem !important; - } - .bodywebsite .p-md-4 { - padding: 1.5rem !important; - } - .bodywebsite .pt-md-4, - .bodywebsite .py-md-4 { - padding-top: 1.5rem !important; - } - .bodywebsite .pr-md-4, - .bodywebsite .px-md-4 { - padding-right: 1.5rem !important; - } - .bodywebsite .pb-md-4, - .bodywebsite .py-md-4 { - padding-bottom: 1.5rem !important; - } - .bodywebsite .pl-md-4, - .bodywebsite .px-md-4 { - padding-left: 1.5rem !important; - } - .bodywebsite .p-md-5 { - padding: 3rem !important; - } - .bodywebsite .pt-md-5, - .bodywebsite .py-md-5 { - padding-top: 3rem !important; - } - .bodywebsite .pr-md-5, - .bodywebsite .px-md-5 { - padding-right: 3rem !important; - } - .bodywebsite .pb-md-5, - .bodywebsite .py-md-5 { - padding-bottom: 3rem !important; - } - .bodywebsite .pl-md-5, - .bodywebsite .px-md-5 { - padding-left: 3rem !important; - } - .bodywebsite .m-md-auto { - margin: auto !important; - } - .bodywebsite .mt-md-auto, - .bodywebsite .my-md-auto { - margin-top: auto !important; - } - .bodywebsite .mr-md-auto, - .bodywebsite .mx-md-auto { - margin-right: auto !important; - } - .bodywebsite .mb-md-auto, - .bodywebsite .my-md-auto { - margin-bottom: auto !important; - } - .bodywebsite .ml-md-auto, - .bodywebsite .mx-md-auto { - margin-left: auto !important; - } -} -@media (min-width: 992px) { - .bodywebsite .m-lg-0 { - margin: 0 !important; - } - .bodywebsite .mt-lg-0, - .bodywebsite .my-lg-0 { - margin-top: 0 !important; - } - .bodywebsite .mr-lg-0, - .bodywebsite .mx-lg-0 { - margin-right: 0 !important; - } - .bodywebsite .mb-lg-0, - .bodywebsite .my-lg-0 { - margin-bottom: 0 !important; - } - .bodywebsite .ml-lg-0, - .bodywebsite .mx-lg-0 { - margin-left: 0 !important; - } - .bodywebsite .m-lg-1 { - margin: 0.25rem !important; - } - .bodywebsite .mt-lg-1, - .bodywebsite .my-lg-1 { - margin-top: 0.25rem !important; - } - .bodywebsite .mr-lg-1, - .bodywebsite .mx-lg-1 { - margin-right: 0.25rem !important; - } - .bodywebsite .mb-lg-1, - .bodywebsite .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .bodywebsite .ml-lg-1, - .bodywebsite .mx-lg-1 { - margin-left: 0.25rem !important; - } - .bodywebsite .m-lg-2 { - margin: 0.5rem !important; - } - .bodywebsite .mt-lg-2, - .bodywebsite .my-lg-2 { - margin-top: 0.5rem !important; - } - .bodywebsite .mr-lg-2, - .bodywebsite .mx-lg-2 { - margin-right: 0.5rem !important; - } - .bodywebsite .mb-lg-2, - .bodywebsite .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .bodywebsite .ml-lg-2, - .bodywebsite .mx-lg-2 { - margin-left: 0.5rem !important; - } - .bodywebsite .m-lg-3 { - margin: 1rem !important; - } - .bodywebsite .mt-lg-3, - .bodywebsite .my-lg-3 { - margin-top: 1rem !important; - } - .bodywebsite .mr-lg-3, - .bodywebsite .mx-lg-3 { - margin-right: 1rem !important; - } - .bodywebsite .mb-lg-3, - .bodywebsite .my-lg-3 { - margin-bottom: 1rem !important; - } - .bodywebsite .ml-lg-3, - .bodywebsite .mx-lg-3 { - margin-left: 1rem !important; - } - .bodywebsite .m-lg-4 { - margin: 1.5rem !important; - } - .bodywebsite .mt-lg-4, - .bodywebsite .my-lg-4 { - margin-top: 1.5rem !important; - } - .bodywebsite .mr-lg-4, - .bodywebsite .mx-lg-4 { - margin-right: 1.5rem !important; - } - .bodywebsite .mb-lg-4, - .bodywebsite .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .bodywebsite .ml-lg-4, - .bodywebsite .mx-lg-4 { - margin-left: 1.5rem !important; - } - .bodywebsite .m-lg-5 { - margin: 3rem !important; - } - .bodywebsite .mt-lg-5, - .bodywebsite .my-lg-5 { - margin-top: 3rem !important; - } - .bodywebsite .mr-lg-5, - .bodywebsite .mx-lg-5 { - margin-right: 3rem !important; - } - .bodywebsite .mb-lg-5, - .bodywebsite .my-lg-5 { - margin-bottom: 3rem !important; - } - .bodywebsite .ml-lg-5, - .bodywebsite .mx-lg-5 { - margin-left: 3rem !important; - } - .bodywebsite .p-lg-0 { - padding: 0 !important; - } - .bodywebsite .pt-lg-0, - .bodywebsite .py-lg-0 { - padding-top: 0 !important; - } - .bodywebsite .pr-lg-0, - .bodywebsite .px-lg-0 { - padding-right: 0 !important; - } - .bodywebsite .pb-lg-0, - .bodywebsite .py-lg-0 { - padding-bottom: 0 !important; - } - .bodywebsite .pl-lg-0, - .bodywebsite .px-lg-0 { - padding-left: 0 !important; - } - .bodywebsite .p-lg-1 { - padding: 0.25rem !important; - } - .bodywebsite .pt-lg-1, - .bodywebsite .py-lg-1 { - padding-top: 0.25rem !important; - } - .bodywebsite .pr-lg-1, - .bodywebsite .px-lg-1 { - padding-right: 0.25rem !important; - } - .bodywebsite .pb-lg-1, - .bodywebsite .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .bodywebsite .pl-lg-1, - .bodywebsite .px-lg-1 { - padding-left: 0.25rem !important; - } - .bodywebsite .p-lg-2 { - padding: 0.5rem !important; - } - .bodywebsite .pt-lg-2, - .bodywebsite .py-lg-2 { - padding-top: 0.5rem !important; - } - .bodywebsite .pr-lg-2, - .bodywebsite .px-lg-2 { - padding-right: 0.5rem !important; - } - .bodywebsite .pb-lg-2, - .bodywebsite .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .bodywebsite .pl-lg-2, - .bodywebsite .px-lg-2 { - padding-left: 0.5rem !important; - } - .bodywebsite .p-lg-3 { - padding: 1rem !important; - } - .bodywebsite .pt-lg-3, - .bodywebsite .py-lg-3 { - padding-top: 1rem !important; - } - .bodywebsite .pr-lg-3, - .bodywebsite .px-lg-3 { - padding-right: 1rem !important; - } - .bodywebsite .pb-lg-3, - .bodywebsite .py-lg-3 { - padding-bottom: 1rem !important; - } - .bodywebsite .pl-lg-3, - .bodywebsite .px-lg-3 { - padding-left: 1rem !important; - } - .bodywebsite .p-lg-4 { - padding: 1.5rem !important; - } - .bodywebsite .pt-lg-4, - .bodywebsite .py-lg-4 { - padding-top: 1.5rem !important; - } - .bodywebsite .pr-lg-4, - .bodywebsite .px-lg-4 { - padding-right: 1.5rem !important; - } - .bodywebsite .pb-lg-4, - .bodywebsite .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .bodywebsite .pl-lg-4, - .bodywebsite .px-lg-4 { - padding-left: 1.5rem !important; - } - .bodywebsite .p-lg-5 { - padding: 3rem !important; - } - .bodywebsite .pt-lg-5, - .bodywebsite .py-lg-5 { - padding-top: 3rem !important; - } - .bodywebsite .pr-lg-5, - .bodywebsite .px-lg-5 { - padding-right: 3rem !important; - } - .bodywebsite .pb-lg-5, - .bodywebsite .py-lg-5 { - padding-bottom: 3rem !important; - } - .bodywebsite .pl-lg-5, - .bodywebsite .px-lg-5 { - padding-left: 3rem !important; - } - .bodywebsite .m-lg-auto { - margin: auto !important; - } - .bodywebsite .mt-lg-auto, - .bodywebsite .my-lg-auto { - margin-top: auto !important; - } - .bodywebsite .mr-lg-auto, - .bodywebsite .mx-lg-auto { - margin-right: auto !important; - } - .bodywebsite .mb-lg-auto, - .bodywebsite .my-lg-auto { - margin-bottom: auto !important; - } - .bodywebsite .ml-lg-auto, - .bodywebsite .mx-lg-auto { - margin-left: auto !important; - } -} -@media (min-width: 1200px) { - .bodywebsite .m-xl-0 { - margin: 0 !important; - } - .bodywebsite .mt-xl-0, - .bodywebsite .my-xl-0 { - margin-top: 0 !important; - } - .bodywebsite .mr-xl-0, - .bodywebsite .mx-xl-0 { - margin-right: 0 !important; - } - .bodywebsite .mb-xl-0, - .bodywebsite .my-xl-0 { - margin-bottom: 0 !important; - } - .bodywebsite .ml-xl-0, - .bodywebsite .mx-xl-0 { - margin-left: 0 !important; - } - .bodywebsite .m-xl-1 { - margin: 0.25rem !important; - } - .bodywebsite .mt-xl-1, - .bodywebsite .my-xl-1 { - margin-top: 0.25rem !important; - } - .bodywebsite .mr-xl-1, - .bodywebsite .mx-xl-1 { - margin-right: 0.25rem !important; - } - .bodywebsite .mb-xl-1, - .bodywebsite .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .bodywebsite .ml-xl-1, - .bodywebsite .mx-xl-1 { - margin-left: 0.25rem !important; - } - .bodywebsite .m-xl-2 { - margin: 0.5rem !important; - } - .bodywebsite .mt-xl-2, - .bodywebsite .my-xl-2 { - margin-top: 0.5rem !important; - } - .bodywebsite .mr-xl-2, - .bodywebsite .mx-xl-2 { - margin-right: 0.5rem !important; - } - .bodywebsite .mb-xl-2, - .bodywebsite .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .bodywebsite .ml-xl-2, - .bodywebsite .mx-xl-2 { - margin-left: 0.5rem !important; - } - .bodywebsite .m-xl-3 { - margin: 1rem !important; - } - .bodywebsite .mt-xl-3, - .bodywebsite .my-xl-3 { - margin-top: 1rem !important; - } - .bodywebsite .mr-xl-3, - .bodywebsite .mx-xl-3 { - margin-right: 1rem !important; - } - .bodywebsite .mb-xl-3, - .bodywebsite .my-xl-3 { - margin-bottom: 1rem !important; - } - .bodywebsite .ml-xl-3, - .bodywebsite .mx-xl-3 { - margin-left: 1rem !important; - } - .bodywebsite .m-xl-4 { - margin: 1.5rem !important; - } - .bodywebsite .mt-xl-4, - .bodywebsite .my-xl-4 { - margin-top: 1.5rem !important; - } - .bodywebsite .mr-xl-4, - .bodywebsite .mx-xl-4 { - margin-right: 1.5rem !important; - } - .bodywebsite .mb-xl-4, - .bodywebsite .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .bodywebsite .ml-xl-4, - .bodywebsite .mx-xl-4 { - margin-left: 1.5rem !important; - } - .bodywebsite .m-xl-5 { - margin: 3rem !important; - } - .bodywebsite .mt-xl-5, - .bodywebsite .my-xl-5 { - margin-top: 3rem !important; - } - .bodywebsite .mr-xl-5, - .bodywebsite .mx-xl-5 { - margin-right: 3rem !important; - } - .bodywebsite .mb-xl-5, - .bodywebsite .my-xl-5 { - margin-bottom: 3rem !important; - } - .bodywebsite .ml-xl-5, - .bodywebsite .mx-xl-5 { - margin-left: 3rem !important; - } - .bodywebsite .p-xl-0 { - padding: 0 !important; - } - .bodywebsite .pt-xl-0, - .bodywebsite .py-xl-0 { - padding-top: 0 !important; - } - .bodywebsite .pr-xl-0, - .bodywebsite .px-xl-0 { - padding-right: 0 !important; - } - .bodywebsite .pb-xl-0, - .bodywebsite .py-xl-0 { - padding-bottom: 0 !important; - } - .bodywebsite .pl-xl-0, - .bodywebsite .px-xl-0 { - padding-left: 0 !important; - } - .bodywebsite .p-xl-1 { - padding: 0.25rem !important; - } - .bodywebsite .pt-xl-1, - .bodywebsite .py-xl-1 { - padding-top: 0.25rem !important; - } - .bodywebsite .pr-xl-1, - .bodywebsite .px-xl-1 { - padding-right: 0.25rem !important; - } - .bodywebsite .pb-xl-1, - .bodywebsite .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .bodywebsite .pl-xl-1, - .bodywebsite .px-xl-1 { - padding-left: 0.25rem !important; - } - .bodywebsite .p-xl-2 { - padding: 0.5rem !important; - } - .bodywebsite .pt-xl-2, - .bodywebsite .py-xl-2 { - padding-top: 0.5rem !important; - } - .bodywebsite .pr-xl-2, - .bodywebsite .px-xl-2 { - padding-right: 0.5rem !important; - } - .bodywebsite .pb-xl-2, - .bodywebsite .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .bodywebsite .pl-xl-2, - .bodywebsite .px-xl-2 { - padding-left: 0.5rem !important; - } - .bodywebsite .p-xl-3 { - padding: 1rem !important; - } - .bodywebsite .pt-xl-3, - .bodywebsite .py-xl-3 { - padding-top: 1rem !important; - } - .bodywebsite .pr-xl-3, - .bodywebsite .px-xl-3 { - padding-right: 1rem !important; - } - .bodywebsite .pb-xl-3, - .bodywebsite .py-xl-3 { - padding-bottom: 1rem !important; - } - .bodywebsite .pl-xl-3, - .bodywebsite .px-xl-3 { - padding-left: 1rem !important; - } - .bodywebsite .p-xl-4 { - padding: 1.5rem !important; - } - .bodywebsite .pt-xl-4, - .bodywebsite .py-xl-4 { - padding-top: 1.5rem !important; - } - .bodywebsite .pr-xl-4, - .bodywebsite .px-xl-4 { - padding-right: 1.5rem !important; - } - .bodywebsite .pb-xl-4, - .bodywebsite .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .bodywebsite .pl-xl-4, - .bodywebsite .px-xl-4 { - padding-left: 1.5rem !important; - } - .bodywebsite .p-xl-5 { - padding: 3rem !important; - } - .bodywebsite .pt-xl-5, - .bodywebsite .py-xl-5 { - padding-top: 3rem !important; - } - .bodywebsite .pr-xl-5, - .bodywebsite .px-xl-5 { - padding-right: 3rem !important; - } - .bodywebsite .pb-xl-5, - .bodywebsite .py-xl-5 { - padding-bottom: 3rem !important; - } - .bodywebsite .pl-xl-5, - .bodywebsite .px-xl-5 { - padding-left: 3rem !important; - } - .bodywebsite .m-xl-auto { - margin: auto !important; - } - .bodywebsite .mt-xl-auto, - .bodywebsite .my-xl-auto { - margin-top: auto !important; - } - .bodywebsite .mr-xl-auto, - .bodywebsite .mx-xl-auto { - margin-right: auto !important; - } - .bodywebsite .mb-xl-auto, - .bodywebsite .my-xl-auto { - margin-bottom: auto !important; - } - .bodywebsite .ml-xl-auto, - .bodywebsite .mx-xl-auto { - margin-left: auto !important; - } -} -@media (min-width: 1800px) { - .bodywebsite .m-xxl-0 { - margin: 0 !important; - } - .bodywebsite .mt-xxl-0, - .bodywebsite .my-xxl-0 { - margin-top: 0 !important; - } - .bodywebsite .mr-xxl-0, - .bodywebsite .mx-xxl-0 { - margin-right: 0 !important; - } - .bodywebsite .mb-xxl-0, - .bodywebsite .my-xxl-0 { - margin-bottom: 0 !important; - } - .bodywebsite .ml-xxl-0, - .bodywebsite .mx-xxl-0 { - margin-left: 0 !important; - } - .bodywebsite .m-xxl-1 { - margin: 0.25rem !important; - } - .bodywebsite .mt-xxl-1, - .bodywebsite .my-xxl-1 { - margin-top: 0.25rem !important; - } - .bodywebsite .mr-xxl-1, - .bodywebsite .mx-xxl-1 { - margin-right: 0.25rem !important; - } - .bodywebsite .mb-xxl-1, - .bodywebsite .my-xxl-1 { - margin-bottom: 0.25rem !important; - } - .bodywebsite .ml-xxl-1, - .bodywebsite .mx-xxl-1 { - margin-left: 0.25rem !important; - } - .bodywebsite .m-xxl-2 { - margin: 0.5rem !important; - } - .bodywebsite .mt-xxl-2, - .bodywebsite .my-xxl-2 { - margin-top: 0.5rem !important; - } - .bodywebsite .mr-xxl-2, - .bodywebsite .mx-xxl-2 { - margin-right: 0.5rem !important; - } - .bodywebsite .mb-xxl-2, - .bodywebsite .my-xxl-2 { - margin-bottom: 0.5rem !important; - } - .bodywebsite .ml-xxl-2, - .bodywebsite .mx-xxl-2 { - margin-left: 0.5rem !important; - } - .bodywebsite .m-xxl-3 { - margin: 1rem !important; - } - .bodywebsite .mt-xxl-3, - .bodywebsite .my-xxl-3 { - margin-top: 1rem !important; - } - .bodywebsite .mr-xxl-3, - .bodywebsite .mx-xxl-3 { - margin-right: 1rem !important; - } - .bodywebsite .mb-xxl-3, - .bodywebsite .my-xxl-3 { - margin-bottom: 1rem !important; - } - .bodywebsite .ml-xxl-3, - .bodywebsite .mx-xxl-3 { - margin-left: 1rem !important; - } - .bodywebsite .m-xxl-4 { - margin: 1.5rem !important; - } - .bodywebsite .mt-xxl-4, - .bodywebsite .my-xxl-4 { - margin-top: 1.5rem !important; - } - .bodywebsite .mr-xxl-4, - .bodywebsite .mx-xxl-4 { - margin-right: 1.5rem !important; - } - .bodywebsite .mb-xxl-4, - .bodywebsite .my-xxl-4 { - margin-bottom: 1.5rem !important; - } - .bodywebsite .ml-xxl-4, - .bodywebsite .mx-xxl-4 { - margin-left: 1.5rem !important; - } - .bodywebsite .m-xxl-5 { - margin: 3rem !important; - } - .bodywebsite .mt-xxl-5, - .bodywebsite .my-xxl-5 { - margin-top: 3rem !important; - } - .bodywebsite .mr-xxl-5, - .bodywebsite .mx-xxl-5 { - margin-right: 3rem !important; - } - .bodywebsite .mb-xxl-5, - .bodywebsite .my-xxl-5 { - margin-bottom: 3rem !important; - } - .bodywebsite .ml-xxl-5, - .bodywebsite .mx-xxl-5 { - margin-left: 3rem !important; - } - .bodywebsite .p-xxl-0 { - padding: 0 !important; - } - .bodywebsite .pt-xxl-0, - .bodywebsite .py-xxl-0 { - padding-top: 0 !important; - } - .bodywebsite .pr-xxl-0, - .bodywebsite .px-xxl-0 { - padding-right: 0 !important; - } - .bodywebsite .pb-xxl-0, - .bodywebsite .py-xxl-0 { - padding-bottom: 0 !important; - } - .bodywebsite .pl-xxl-0, - .bodywebsite .px-xxl-0 { - padding-left: 0 !important; - } - .bodywebsite .p-xxl-1 { - padding: 0.25rem !important; - } - .bodywebsite .pt-xxl-1, - .bodywebsite .py-xxl-1 { - padding-top: 0.25rem !important; - } - .bodywebsite .pr-xxl-1, - .bodywebsite .px-xxl-1 { - padding-right: 0.25rem !important; - } - .bodywebsite .pb-xxl-1, - .bodywebsite .py-xxl-1 { - padding-bottom: 0.25rem !important; - } - .bodywebsite .pl-xxl-1, - .bodywebsite .px-xxl-1 { - padding-left: 0.25rem !important; - } - .bodywebsite .p-xxl-2 { - padding: 0.5rem !important; - } - .bodywebsite .pt-xxl-2, - .bodywebsite .py-xxl-2 { - padding-top: 0.5rem !important; - } - .bodywebsite .pr-xxl-2, - .bodywebsite .px-xxl-2 { - padding-right: 0.5rem !important; - } - .bodywebsite .pb-xxl-2, - .bodywebsite .py-xxl-2 { - padding-bottom: 0.5rem !important; - } - .bodywebsite .pl-xxl-2, - .bodywebsite .px-xxl-2 { - padding-left: 0.5rem !important; - } - .bodywebsite .p-xxl-3 { - padding: 1rem !important; - } - .bodywebsite .pt-xxl-3, - .bodywebsite .py-xxl-3 { - padding-top: 1rem !important; - } - .bodywebsite .pr-xxl-3, - .bodywebsite .px-xxl-3 { - padding-right: 1rem !important; - } - .bodywebsite .pb-xxl-3, - .bodywebsite .py-xxl-3 { - padding-bottom: 1rem !important; - } - .bodywebsite .pl-xxl-3, - .bodywebsite .px-xxl-3 { - padding-left: 1rem !important; - } - .bodywebsite .p-xxl-4 { - padding: 1.5rem !important; - } - .bodywebsite .pt-xxl-4, - .bodywebsite .py-xxl-4 { - padding-top: 1.5rem !important; - } - .bodywebsite .pr-xxl-4, - .bodywebsite .px-xxl-4 { - padding-right: 1.5rem !important; - } - .bodywebsite .pb-xxl-4, - .bodywebsite .py-xxl-4 { - padding-bottom: 1.5rem !important; - } - .bodywebsite .pl-xxl-4, - .bodywebsite .px-xxl-4 { - padding-left: 1.5rem !important; - } - .bodywebsite .p-xxl-5 { - padding: 3rem !important; - } - .bodywebsite .pt-xxl-5, - .bodywebsite .py-xxl-5 { - padding-top: 3rem !important; - } - .bodywebsite .pr-xxl-5, - .bodywebsite .px-xxl-5 { - padding-right: 3rem !important; - } - .bodywebsite .pb-xxl-5, - .bodywebsite .py-xxl-5 { - padding-bottom: 3rem !important; - } - .bodywebsite .pl-xxl-5, - .bodywebsite .px-xxl-5 { - padding-left: 3rem !important; - } - .bodywebsite .m-xxl-auto { - margin: auto !important; - } - .bodywebsite .mt-xxl-auto, - .bodywebsite .my-xxl-auto { - margin-top: auto !important; - } - .bodywebsite .mr-xxl-auto, - .bodywebsite .mx-xxl-auto { - margin-right: auto !important; - } - .bodywebsite .mb-xxl-auto, - .bodywebsite .my-xxl-auto { - margin-bottom: auto !important; - } - .bodywebsite .ml-xxl-auto, - .bodywebsite .mx-xxl-auto { - margin-left: auto !important; - } -} -.bodywebsite .text-justify { - text-align: justify !important; -} -.bodywebsite .text-nowrap { - white-space: nowrap !important; -} -.bodywebsite .text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.bodywebsite .text-left { - text-align: left !important; -} -.bodywebsite .text-right { - text-align: right !important; -} -.bodywebsite .text-center { - text-align: center !important; -} -@media (min-width: 576px) { - .bodywebsite .text-sm-left { - text-align: left !important; - } - .bodywebsite .text-sm-right { - text-align: right !important; - } - .bodywebsite .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .bodywebsite .text-md-left { - text-align: left !important; - } - .bodywebsite .text-md-right { - text-align: right !important; - } - .bodywebsite .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .bodywebsite .text-lg-left { - text-align: left !important; - } - .bodywebsite .text-lg-right { - text-align: right !important; - } - .bodywebsite .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .bodywebsite .text-xl-left { - text-align: left !important; - } - .bodywebsite .text-xl-right { - text-align: right !important; - } - .bodywebsite .text-xl-center { - text-align: center !important; - } -} -@media (min-width: 1800px) { - .bodywebsite .text-xxl-left { - text-align: left !important; - } - .bodywebsite .text-xxl-right { - text-align: right !important; - } - .bodywebsite .text-xxl-center { - text-align: center !important; - } -} -.bodywebsite .text-lowercase { - text-transform: lowercase !important; -} -.bodywebsite .text-uppercase { - text-transform: uppercase !important; -} -.bodywebsite .text-capitalize { - text-transform: capitalize !important; -} -.bodywebsite .font-weight-light { - font-weight: 300 !important; -} -.bodywebsite .font-weight-normal { - font-weight: 400 !important; -} -.bodywebsite .font-weight-bold { - font-weight: 700 !important; -} -.bodywebsite .font-italic { - font-style: italic !important; -} -.bodywebsite .text-white { - color: #fff !important; -} -.bodywebsite .text-primary { - color: #007bff !important; -} -.bodywebsite a.text-primary:focus, -.bodywebsite a.text-primary:hover { - color: #0062cc !important; -} -.bodywebsite .text-secondary { - color: #868e96 !important; -} -.bodywebsite a.text-secondary:focus, -.bodywebsite a.text-secondary:hover { - color: #6c757d !important; -} -.bodywebsite .text-success { - color: #28a745 !important; -} -.bodywebsite a.text-success:focus, -.bodywebsite a.text-success:hover { - color: #1e7e34 !important; -} -.bodywebsite .text-info { - color: #17a2b8 !important; -} -.bodywebsite a.text-info:focus, -.bodywebsite a.text-info:hover { - color: #117a8b !important; -} -.bodywebsite .text-warning { - color: #ffc107 !important; -} -.bodywebsite a.text-warning:focus, -.bodywebsite a.text-warning:hover { - color: #d39e00 !important; -} -.bodywebsite .text-danger { - color: #dc3545 !important; -} -.bodywebsite a.text-danger:focus, -.bodywebsite a.text-danger:hover { - color: #bd2130 !important; -} -.bodywebsite .text-light { - color: #f8f9fa !important; -} -.bodywebsite a.text-light:focus, -.bodywebsite a.text-light:hover { - color: #dae0e5 !important; -} -.bodywebsite .text-dark { - color: #343a40 !important; -} -.bodywebsite a.text-dark:focus, -.bodywebsite a.text-dark:hover { - color: #1d2124 !important; -} -.bodywebsite .text-muted { - color: #dedede !important; -} -.bodywebsite .text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.bodywebsite .visible { - visibility: visible !important; -} -.bodywebsite .invisible { - visibility: hidden !important; -} -.bodywebsite .animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - opacity: 1; -} -.bodywebsite .animated:not(.page) { - will-change: transform; -} -.bodywebsite .animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} -.bodywebsite .animated.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; -} -html .bodywebsite:not(.lt-ie10) .not-animated { - opacity: 0; -} -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} -@keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} -.bodywebsite .fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} -@keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - 100% { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} -.bodywebsite .fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} - - - - - - - - - - - - - - - - - - - - - - diff --git a/htdocs/install/doctemplates/websites/template/test.php b/htdocs/install/doctemplates/websites/template/test.php deleted file mode 100644 index a6f437b4c3a..00000000000 --- a/htdocs/install/doctemplates/websites/template/test.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page126.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/test2.php b/htdocs/install/doctemplates/websites/template/test2.php deleted file mode 100644 index a6f437b4c3a..00000000000 --- a/htdocs/install/doctemplates/websites/template/test2.php +++ /dev/null @@ -1,5 +0,0 @@ -ref.'/page126.tpl.php'; -?> diff --git a/htdocs/install/doctemplates/websites/template/wrapper.php b/htdocs/install/doctemplates/websites/template/wrapper.php deleted file mode 100644 index 952662e27b1..00000000000 --- a/htdocs/install/doctemplates/websites/template/wrapper.php +++ /dev/null @@ -1,126 +0,0 @@ -entity; -$original_file=GETPOST("file","alpha"); - -// If we have a hash public (hashp), we guess the original_file. -if (! empty($hashp)) -{ - include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; - $ecmfile=new EcmFiles($db); - $result = $ecmfile->fetch(0, '', '', '', $hashp); - if ($result > 0) - { - $tmp = explode('/', $ecmfile->filepath, 2); // $ecmfile->filepath is relative to document directory - // filepath can be 'users/X' or 'X/propale/PR11111' - if (is_numeric($tmp[0])) // If first tmp is numeric, it is subdir of company for multicompany, we take next part. - { - $tmp = explode('/', $tmp[1], 2); - } - $moduleparttocheck = $tmp[0]; // moduleparttocheck is first part of path - - if ($modulepart) // Not required, so often not defined, for link using public hashp parameter. - { - if ($moduleparttocheck == $modulepart) - { - // We remove first level of directory - $original_file = (($tmp[1]?$tmp[1].'/':'').$ecmfile->filename); // this is relative to module dir - //var_dump($original_file); exit; - } - else - { - print 'Bad link. File is from another module part.'; - } - } - else - { - $modulepart = $moduleparttocheck; - $original_file = (($tmp[1]?$tmp[1].'/':'').$ecmfile->filename); // this is relative to module dir - } - } - else - { - print "ErrorFileNotFoundWithSharedLink"; - exit; - } -} - -// Define attachment (attachment=true to force choice popup 'open'/'save as') -$attachment = true; -if (preg_match('/\.(html|htm)$/i',$original_file)) $attachment = false; -if (isset($_GET["attachment"])) $attachment = GETPOST("attachment",'alpha')?true:false; -if (! empty($conf->global->MAIN_DISABLE_FORCE_SAVEAS)) $attachment=false; - -// Define mime type -$type = 'application/octet-stream'; -if (GETPOST('type','alpha')) $type=GETPOST('type','alpha'); -else $type=dol_mimetype($original_file); - -// Security: Delete string ../ into $original_file -$original_file=str_replace("../","/", $original_file); - -// Find the subdirectory name as the reference -$refname=basename(dirname($original_file)."/"); - -if ($_GET["modulepart"] == "mycompany" && preg_match('/^\/?logos\//', $original_file)) -{ - readfile(dol_osencode($conf->mycompany->dir_output."/".$original_file)); -} -else -{ - include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - $check_access = dol_check_secure_access_document($modulepart, $original_file, $entity, $refname); - $accessallowed = $check_access['accessallowed']; - $sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals']; - $fullpath_original_file = $check_access['original_file']; // $fullpath_original_file is now a full path name - if (! empty($_GET["hashp"])) - { - $accessallowed = 1; // When using hashp, link is public so we force $accessallowed - $sqlprotectagainstexternals = ''; - } - - // Security: - // Limit access if permissions are wrong - if (! $accessallowed) - { - print 'Access forbidden'; - exit; - } - - clearstatcache(); - - $filename = basename($fullpath_original_file); - - // Output file on browser - dol_syslog("wrapper.php download $fullpath_original_file filename=$filename content-type=$type"); - $fullpath_original_file_osencoded=dol_osencode($fullpath_original_file); // New file name encoded in OS encoding charset - - // This test if file exists should be useless. We keep it to find bug more easily - if (! file_exists($fullpath_original_file_osencoded)) - { - print "ErrorFileDoesNotExists: ".$original_file; - exit; - } - - // Permissions are ok and file found, so we return it - //top_httphead($type); - header('Content-Description: File Transfer'); - if ($encoding) header('Content-Encoding: '.$encoding); - // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, attachment=need user action to open) - if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"'); - else header('Content-Disposition: inline; filename="'.$filename.'"'); - header('Content-Length: ' . dol_filesize($fullpath_original_file)); - // Ajout directives pour resoudre bug IE - header('Cache-Control: Public, must-revalidate'); - header('Pragma: public'); - - readfile($fullpath_original_file_osencoded); -} -if (is_object($db)) $db->close(); -// END PHP ?> From 2ecde139f04b6b20c4df6a9b9ab67514e8a6d887 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Wed, 5 Jun 2019 19:06:58 +0200 Subject: [PATCH 0752/1036] Fix stock mouvement does not need virtual stock. --- htdocs/product/stock/class/mouvementstock.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index b85e0cfcf23..c6db985f515 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -163,7 +163,7 @@ class MouvementStock extends CommonObject $this->db->begin(); - $product->load_stock(); + $product->load_stock('novirtual'); // Test if product require batch data. If yes, and there is not, we throw an error. if (! empty($conf->productbatch->enabled) && $product->hasbatch() && ! $skip_batch) From b73d287953d44f1d7b0d7c6daf07d73498e165b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 7 Jun 2019 18:09:43 +0200 Subject: [PATCH 0753/1036] Update agenda.lib.php --- htdocs/core/lib/agenda.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/agenda.lib.php b/htdocs/core/lib/agenda.lib.php index 94492e9430b..4326276766b 100644 --- a/htdocs/core/lib/agenda.lib.php +++ b/htdocs/core/lib/agenda.lib.php @@ -469,7 +469,7 @@ function actions_prepare_head($object) $head[$h][0] = DOL_URL_ROOT.'/resource/element_resource.php?element=action&element_id='.$object->id; $listofresourcelinked = $resource->getElementResources($object->element, $object->id); - $nbResources=is_array($listofresourcelinked)?count($listofresourcelinked):0; + $nbResources=(is_array($listofresourcelinked)?count($listofresourcelinked):0); $head[$h][1] = $langs->trans("Resources"); if ($nbResources > 0) $head[$h][1].= ' '.($nbResources).''; $head[$h][2] = 'resources'; From 49646663a124c19ed3d5a13b306e38e3e120bbbb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 7 Jun 2019 22:47:15 +0200 Subject: [PATCH 0754/1036] Fix link on invoice --- htdocs/compta/facture/class/facture.class.php | 6 ++++-- htdocs/fourn/class/fournisseur.facture.class.php | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index fa67f2bf67e..e5041217cb3 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1203,7 +1203,7 @@ class Facture extends CommonInvoice */ public function getNomUrl($withpicto = 0, $option = '', $max = 0, $short = 0, $moretitle = '', $notooltip = 0, $addlinktonotes = 0, $save_lastsearch_value = -1, $target = '') { - global $langs, $conf, $user, $form; + global $langs, $conf, $user; if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips @@ -1225,7 +1225,7 @@ class Facture extends CommonInvoice if ($short) return $url; - $picto='bill'; + $picto=$this->picto; if ($this->type == self::TYPE_REPLACEMENT) $picto.='r'; // Replacement invoice if ($this->type == self::TYPE_CREDIT_NOTE) $picto.='a'; // Credit note if ($this->type == self::TYPE_DEPOSIT) $picto.='d'; // Deposit invoice @@ -1241,6 +1241,8 @@ class Facture extends CommonInvoice $label .= '
'.$langs->trans('Ref') . ': ' . $this->ref; if (! empty($this->ref_client)) $label .= '
' . $langs->trans('RefCustomer') . ': ' . $this->ref_client; + if (! empty($this->date)) + $label .= '
' . $langs->trans('Date') . ': ' . dol_print_date($this->date, 'day'); if (! empty($this->total_ht)) $label.= '
' . $langs->trans('AmountHT') . ': ' . price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency); if (! empty($this->total_tva)) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index d9c6781e74d..883fe383de7 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -2269,7 +2269,7 @@ class FactureFournisseur extends CommonInvoice if ($add_save_lastsearch_values) $url.='&save_lastsearch_values=1'; } - $picto='bill'; + $picto=$this->picto; if ($this->type == self::TYPE_REPLACEMENT) $picto.='r'; // Replacement invoice if ($this->type == self::TYPE_CREDIT_NOTE) $picto.='a'; // Credit note if ($this->type == self::TYPE_DEPOSIT) $picto.='d'; // Deposit invoice @@ -2281,6 +2281,8 @@ class FactureFournisseur extends CommonInvoice $label.= '
' . $langs->trans('RefSupplier') . ': ' . $this->ref_supplier; if (! empty($this->libelle)) $label.= '
' . $langs->trans('Label') . ': ' . $this->libelle; + if (! empty($this->date)) + $label .= '
' . $langs->trans('Date') . ': ' . dol_print_date($this->date, 'day'); if (! empty($this->total_ht)) $label.= '
' . $langs->trans('AmountHT') . ': ' . price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency); if (! empty($this->total_tva)) @@ -2312,7 +2314,7 @@ class FactureFournisseur extends CommonInvoice $linkend=''; $result .= $linkstart; - if ($withpicto) $result.=img_object(($notooltip?'':$label), $this->picto, ($notooltip?(($withpicto != 2) ? 'class="paddingright"' : ''):'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip?0:1); + if ($withpicto) $result.=img_object(($notooltip?'':$label), $picto, ($notooltip?(($withpicto != 2) ? 'class="paddingright"' : ''):'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip?0:1); if ($withpicto != 2) $result.= ($max?dol_trunc($ref, $max):$ref); $result .= $linkend; From 0099c1f602e28f10c160e0dfbe6220e0f58c75b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 7 Jun 2019 22:55:18 +0200 Subject: [PATCH 0755/1036] Fix missing date --- htdocs/compta/index.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index c872fae3def..3e455aebae6 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -136,8 +136,7 @@ if (! empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS)) // This is usele */ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) { - $sql = "SELECT f.ref"; - $sql.= ", f.rowid, f.total as total_ht, f.tva as total_tva, f.total_ttc, f.ref_client"; + $sql = "SELECT f.rowid, f.ref, f.date, f.total as total_ht, f.tva as total_tva, f.total_ttc, f.ref_client"; $sql.= ", f.type"; $sql.= ", s.nom as name"; $sql.= ", s.rowid as socid, s.email"; @@ -177,13 +176,14 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) { $obj = $db->fetch_object($resql); - $facturestatic->ref=$obj->ref; $facturestatic->id=$obj->rowid; + $facturestatic->ref=$obj->ref; + $facturestatic->date=$db->jdate($obj->date); + $facturestatic->type=$obj->type; $facturestatic->total_ht=$obj->total_ht; $facturestatic->total_tva=$obj->total_tva; $facturestatic->total_ttc=$obj->total_ttc; $facturestatic->ref_client=$obj->ref_client; - $facturestatic->type=$obj->type; $companystatic->id=$obj->socid; $companystatic->name=$obj->name; From f713deb0a86a6ffddd9fce925e57264b09cc226f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 7 Jun 2019 22:55:51 +0200 Subject: [PATCH 0756/1036] Fix sql syntax error --- htdocs/compta/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index 3e455aebae6..ae84340333e 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -136,7 +136,7 @@ if (! empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS)) // This is usele */ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) { - $sql = "SELECT f.rowid, f.ref, f.date, f.total as total_ht, f.tva as total_tva, f.total_ttc, f.ref_client"; + $sql = "SELECT f.rowid, f.ref, f.datef as date, f.total as total_ht, f.tva as total_tva, f.total_ttc, f.ref_client"; $sql.= ", f.type"; $sql.= ", s.nom as name"; $sql.= ", s.rowid as socid, s.email"; From 39fa4f936527ea4bfcdcdff0293f86a019d846b8 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 8 Jun 2019 21:34:30 +0200 Subject: [PATCH 0757/1036] Fix Missing language key --- htdocs/langs/en_US/main.lang | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index fd74d0cae07..a89443b345f 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -972,4 +972,5 @@ NoFilesUploadedYet=Please upload a document first SeePrivateNote=See private note PaymentInformation=Payment information ValidFrom=Valid from -ValidUntil=Valid until \ No newline at end of file +ValidUntil=Valid until +NoRecordedUsers=No records users \ No newline at end of file From a0ab2fdfd773692ed99c8884645fe1d74dfe3721 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 9 Jun 2019 08:29:44 +0200 Subject: [PATCH 0758/1036] Fix Missing language key --- htdocs/langs/en_US/errors.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 08ec66f8ea3..bb92e41a537 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -217,6 +217,7 @@ ErrorBadSyntaxForParamKeyForContent=Bad syntax for param keyforcontent. Must hav ErrorVariableKeyForContentMustBeSet=Error, the constant with name %s (with text content to show) or %s (with external url to show) must be set. ErrorURLMustStartWithHttp=URL %s must start with http:// or https:// ErrorNewRefIsAlreadyUsed=Error, the new reference is already used +ErrorDeletePaymentLinkedToAClosedInvoiceNotPossible=Error, delete payment linked to a closed invoice is not possible. # Warnings WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user. WarningMandatorySetupNotComplete=Click here to setup mandatory parameters From ae686ff62a0d30f6e547905e6a51da7d97b49ee4 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 9 Jun 2019 08:39:38 +0200 Subject: [PATCH 0759/1036] Better look --- htdocs/compta/paiement/cheque/card.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/paiement/cheque/card.php b/htdocs/compta/paiement/cheque/card.php index f84a805caef..21480a8496d 100644 --- a/htdocs/compta/paiement/cheque/card.php +++ b/htdocs/compta/paiement/cheque/card.php @@ -474,9 +474,9 @@ if ($action == 'new') print ''; print ''.$langs->trans("DateChequeReceived").''."\n"; print ''.$langs->trans("ChequeNumber")."\n"; - print ''.$langs->trans("CheckTransmitter")."\n"; - print ''.$langs->trans("Bank")."\n"; - print ''.$langs->trans("Amount")."\n"; + print ''.$langs->trans("CheckTransmitter")."\n"; + print ''.$langs->trans("Bank")."\n"; + print ''.$langs->trans("Amount")."\n"; print ''.$langs->trans("Payment")."\n"; print ''.$langs->trans("LineRecord")."\n"; print ''.$langs->trans("Select")."
"; From 33b02b97d5f46b0c318992b63bee3f0afaba10e4 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 9 Jun 2019 08:50:20 +0200 Subject: [PATCH 0760/1036] Better look --- htdocs/compta/bank/bankentries_list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index 444927ea27d..be2d8335afa 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -941,8 +941,8 @@ if ($resql) if (! empty($arrayfields['b.num_chq']['checked'])) print_liste_field_titre($arrayfields['b.num_chq']['label'], $_SERVER['PHP_SELF'], 'b.num_chq', '', $param, 'align="center"', $sortfield, $sortorder); if (! empty($arrayfields['bu.label']['checked'])) print_liste_field_titre($arrayfields['bu.label']['label'], $_SERVER['PHP_SELF'], 'bu.label', '', $param, '', $sortfield, $sortorder); if (! empty($arrayfields['ba.ref']['checked'])) print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, '', $sortfield, $sortorder); - if (! empty($arrayfields['b.debit']['checked'])) print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'class="right"', $sortfield, $sortorder); - if (! empty($arrayfields['b.credit']['checked'])) print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'class="right"', $sortfield, $sortorder); + if (! empty($arrayfields['b.debit']['checked'])) print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'align="center" style="min-width: 100px"', $sortfield, $sortorder, "right "); + if (! empty($arrayfields['b.credit']['checked'])) print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'align="center" style="min-width: 100px"', $sortfield, $sortorder, "right "); if (! empty($arrayfields['balancebefore']['checked'])) print_liste_field_titre($arrayfields['balancebefore']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['balance']['checked'])) print_liste_field_titre($arrayfields['balance']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); if (! empty($arrayfields['b.num_releve']['checked'])) print_liste_field_titre($arrayfields['b.num_releve']['label'], $_SERVER['PHP_SELF'], 'b.num_releve', '', $param, 'align="center"', $sortfield, $sortorder); From 8c5a01dd900022f7d57658018c4e36f445fa02a5 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 9 Jun 2019 08:56:49 +0200 Subject: [PATCH 0761/1036] Show total with decimals --- htdocs/compta/bank/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php index aeb593f53b9..5968505c540 100644 --- a/htdocs/compta/bank/list.php +++ b/htdocs/compta/bank/list.php @@ -594,7 +594,7 @@ if (isset($totalarray['totalbalancefield']) && $lastcurrencycode != 'various') / if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; else print ''.$langs->trans("Totalforthispage").''; } - elseif ($totalarray['totalbalancefield'] == $i) print ''.price($totalarray['totalbalance'], 0, $langs, 0, 0, -1, $lastcurrencycode).''; + elseif ($totalarray['totalbalancefield'] == $i) print ''.price($totalarray['totalbalance'], 0, $langs, 0, -1, -1, $lastcurrencycode).''; else print ''; } print ''; From 6d43efb4a254413ce128dbc201c232099be5c854 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 9 Jun 2019 16:35:45 +0200 Subject: [PATCH 0762/1036] Align right --- htdocs/compta/bank/annuel.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/annuel.php b/htdocs/compta/bank/annuel.php index 98085b34778..78705847bfc 100644 --- a/htdocs/compta/bank/annuel.php +++ b/htdocs/compta/bank/annuel.php @@ -217,7 +217,7 @@ for ($mois = 1 ; $mois < 13 ; $mois++) } print ""; - print ' '; + print ' '; if ($encaiss[$case]>0) { print price($encaiss[$case]); @@ -232,7 +232,7 @@ for ($mois = 1 ; $mois < 13 ; $mois++) print ''.$langs->trans("Total").""; for ($annee = $year_start ; $annee <= $year_end ; $annee++) { - print ''.price($totsorties[$annee]).''.price($totentrees[$annee]).''; + print ''.price($totsorties[$annee]).''.price($totentrees[$annee]).''; } print "\n"; From f3cba862825ac4797a53435c3f68c3605c1e08b7 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 10 Jun 2019 07:49:10 +0200 Subject: [PATCH 0763/1036] Better look --- htdocs/accountancy/journal/bankjournal.php | 28 +++++++--------- .../journal/expensereportsjournal.php | 23 +++++++------ .../accountancy/journal/purchasesjournal.php | 33 +++++++++---------- htdocs/accountancy/journal/sellsjournal.php | 27 ++++++++------- htdocs/compta/paiement/cheque/card.php | 10 +++--- 5 files changed, 57 insertions(+), 64 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 275af10701d..a286e4d8a66 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -987,15 +987,14 @@ if (empty($action) || $action == 'view') { print '
'; print ""; print ""; - print ""; print ""; print ""; print ""; print ""; print ""; - print ""; - print ""; - print ""; + print ""; + print ""; + print ""; print "\n"; $r = ''; @@ -1019,7 +1018,6 @@ if (empty($action) || $action == 'view') { //var_dump($tabpay[$key]); print ''; print ''; - print ""; print ""; print ""; // Ledger account @@ -1043,9 +1041,9 @@ if (empty($action) || $action == 'view') { print ""; - print ""; - print ""; - print ""; + print ""; + print ""; + print ""; print ""; } } @@ -1061,7 +1059,6 @@ if (empty($action) || $action == 'view') { print ''; print ''; - print ""; print ""; print ""; // Ledger account @@ -1125,9 +1122,9 @@ if (empty($action) || $action == 'view') { } print ""; print ""; - print ""; - print ""; - print ""; + print ""; + print ""; + print ""; print ""; } } @@ -1141,7 +1138,6 @@ if (empty($action) || $action == 'view') { print ''; print ''; - print ""; print ""; print ""; // Ledger account @@ -1162,9 +1158,9 @@ if (empty($action) || $action == 'view') { */ print ""; print ""; - print ""; - print ""; - print ""; + print ""; + print ""; + print ""; print ""; } } diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php index 30ed5a07207..9da814e2d8c 100644 --- a/htdocs/accountancy/journal/expensereportsjournal.php +++ b/htdocs/accountancy/journal/expensereportsjournal.php @@ -549,14 +549,13 @@ if (empty($action) || $action == 'view') { print '
'; print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("ObjectsRef") . ")" . $langs->trans("AccountAccounting") . "" . $langs->trans("SubledgerAccount") . "" . $langs->trans("LabelOperation") . "" . $langs->trans("PaymentMode") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "" . $langs->trans("PaymentMode") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $ref . ""; print $reflabel; print "" . $val["type_payment"] . "" . ($mt >= 0 ? price($mt) : '') . "" . ($mt < 0 ? price(- $mt) : '') . "" . $val["type_payment"] . "" . ($mt >= 0 ? price($mt) : '') . "" . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $ref . "" . $reflabel . "" . $val["type_payment"] . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "" . $val["type_payment"] . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
" . $date . "" . $ref . "" . $reflabel . "" . $val["type_payment"] . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "" . $val["type_payment"] . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
"; print ""; - print ""; print ""; print ""; print ""; print ""; print ""; - print ""; - print ""; + print ""; + print ""; print "\n"; $r = ''; @@ -578,7 +577,7 @@ if (empty($action) || $action == 'view') { if ($mt) { print ''; - print ""; + print ""; print ""; print ""; $userstatic->id = $tabuser[$key]['id']; @@ -598,8 +597,8 @@ if (empty($action) || $action == 'view') { $userstatic->id = $tabuser[$key]['id']; $userstatic->name = $tabuser[$key]['name']; print ""; - print '"; - print '"; + print '"; + print '"; print ""; } } @@ -607,7 +606,7 @@ if (empty($action) || $action == 'view') { // Third party foreach ($tabttc[$key] as $k => $mt) { print ''; - print ""; + print ""; print ""; print ""; $userstatic->id = $tabuser[$key]['id']; @@ -631,8 +630,8 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print ''; print ""; - print '"; - print '"; + print '"; + print '"; print ""; } @@ -646,7 +645,7 @@ if (empty($action) || $action == 'view') { foreach ($arrayofvat[$key] as $k => $mt) { if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -663,8 +662,8 @@ if (empty($action) || $action == 'view') { print ''; print ""; - print '"; - print '"; + print '"; + print '"; print ""; } } diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 12e76882adc..8dbcc0989ce 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -783,14 +783,13 @@ if (empty($action) || $action == 'view') { print '
'; print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("ExpenseReportRef") . ")" . $langs->trans("AccountAccounting") . "" . $langs->trans("SubledgerAccount") . "" . $langs->trans("LabelOperation") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $expensereportstatic->getNomUrl(1) . "" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $accountingaccount->label . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $expensereportstatic->getNomUrl(1) . "" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $langs->trans("SubledgerAccount") . "' . ($mt < 0 ? - price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? - price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
" . $date . "" . $expensereportstatic->getNomUrl(1) . "" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $langs->trans("VAT"). ' '.join(', ', $def_tva[$key][$k]).' %'.($numtax?' - Localtax '.$numtax:''); print "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
"; print ""; - print ""; print ""; print ""; print ""; print ""; print ""; - print ""; - print ""; + print ""; + print ""; print "\n"; $r = ''; @@ -830,7 +829,7 @@ if (empty($action) || $action == 'view') { if ($replacedinvoice == 1) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -851,7 +850,7 @@ if (empty($action) || $action == 'view') { if ($errorforinvoice[$key] == 'somelinesarenotbound') { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -872,7 +871,7 @@ if (empty($action) || $action == 'view') { foreach ($tabttc[$key] as $k => $mt) { //if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -894,8 +893,8 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print ''; print ""; - print '"; - print '"; + print '"; + print '"; print ""; //} } @@ -907,7 +906,7 @@ if (empty($action) || $action == 'view') { //if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -925,8 +924,8 @@ if (empty($action) || $action == 'view') { $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; print ""; - print '"; - print '"; + print '"; + print '"; print ""; //} } @@ -941,7 +940,7 @@ if (empty($action) || $action == 'view') { foreach ($arrayofvat[$key] as $k => $mt) { if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -959,8 +958,8 @@ if (empty($action) || $action == 'view') { print ""; - print '"; - print '"; + print '"; + print '"; print ""; } } @@ -972,7 +971,7 @@ if (empty($action) || $action == 'view') { foreach ($tabother[$key] as $k => $mt) { if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -988,8 +987,8 @@ if (empty($action) || $action == 'view') { print "'; print ""; - print '"; - print '"; + print '"; + print '"; print ""; } } diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 08df2e71b32..da1f14dade5 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -720,14 +720,13 @@ if (empty($action) || $action == 'view') { print '
'; print "
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("AccountAccounting") . "" . $langs->trans("SubledgerAccount") . "" . $langs->trans("LabelOperation") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "" . $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $langs->trans("SubledgerAccount") . "'. ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "'. ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "" . $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $accountingaccount->label . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $invoicestatic->getNomUrl(1) . ""; print $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $langs->trans("VAT"). ' '.join(', ', $def_tva[$key][$k]).' %'.($numtax?' - Localtax '.$numtax:''); print "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $invoicestatic->getNomUrl(1) . ""; print '" . $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $langs->trans("VAT") . " NPR (counterpart)' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
"; print ""; - print ""; print ""; print ""; print ""; print ""; print ""; - print ""; - print ""; + print ""; + print ""; print "\n"; $r = ''; @@ -765,7 +764,7 @@ if (empty($action) || $action == 'view') { if ($replacedinvoice == 1) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -786,7 +785,7 @@ if (empty($action) || $action == 'view') { if ($errorforinvoice[$key] == 'somelinesarenotbound') { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -808,7 +807,7 @@ if (empty($action) || $action == 'view') { { //if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -830,8 +829,8 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print ''; print ""; - print '"; - print '"; + print '"; + print '"; print ""; //} } @@ -844,7 +843,7 @@ if (empty($action) || $action == 'view') { //if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -862,8 +861,8 @@ if (empty($action) || $action == 'view') { $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; print ""; - print ""; - print ""; + print ""; + print ""; print ""; //} } @@ -879,7 +878,7 @@ if (empty($action) || $action == 'view') { foreach ($arrayofvat[$key] as $k => $mt) { if ($mt) { print ''; - print ""; + print ""; print ""; print ""; // Account @@ -896,8 +895,8 @@ if (empty($action) || $action == 'view') { print ''; print ""; - print '"; - print '"; + print '"; + print '"; print ""; } } diff --git a/htdocs/compta/paiement/cheque/card.php b/htdocs/compta/paiement/cheque/card.php index 21480a8496d..9372ec84cfe 100644 --- a/htdocs/compta/paiement/cheque/card.php +++ b/htdocs/compta/paiement/cheque/card.php @@ -472,11 +472,11 @@ if ($action == 'new') print '
" . $langs->trans("Date") . "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")" . $langs->trans("AccountAccounting") . "" . $langs->trans("SubledgerAccount") . "" . $langs->trans("LabelOperation") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $langs->trans("SubledgerAccount") . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $accountingaccount->label . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "" . ($mt < 0 ? price(- $mt) : '') . "" . ($mt >= 0 ? price($mt) : '') . "
" . $date . "" . $invoicestatic->getNomUrl(1) . "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $langs->trans("VAT"). ' '.join(', ', $def_tva[$key][$k]).' %'.($numtax?' - Localtax '.$numtax:''); print "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "' . ($mt < 0 ? price(- $mt) : '') . "' . ($mt >= 0 ? price($mt) : '') . "
'."\n"; print ''; - print ''."\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; + print ''."\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; print '\n"; print '\n"; print ''; } +//Birthday +if (! empty($arrayfields['d.birth']['checked'])) +{ + print ''; +} // Date modification if (! empty($arrayfields['d.tms']['checked'])) { @@ -646,6 +653,7 @@ $parameters=array('arrayfields'=>$arrayfields,'param'=>$param,'sortfield'=>$sort $reshook=$hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; if (! empty($arrayfields['d.datec']['checked'])) print_liste_field_titre($arrayfields['d.datec']['label'], $_SERVER["PHP_SELF"], "d.datec", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder); +if (! empty($arrayfields['d.birth']['checked'])) print_liste_field_titre($arrayfields['d.birth']['label'], $_SERVER["PHP_SELF"], "d.birth", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder); if (! empty($arrayfields['d.tms']['checked'])) print_liste_field_titre($arrayfields['d.tms']['label'], $_SERVER["PHP_SELF"], "d.tms", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder); if (! empty($arrayfields['d.statut']['checked'])) print_liste_field_titre($arrayfields['d.statut']['label'], $_SERVER["PHP_SELF"], "d.statut", "", $param, 'class="right"', $sortfield, $sortorder); print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', 'align="center"', $sortfield, $sortorder, 'maxwidthsearch '); @@ -865,6 +873,14 @@ while ($i < min($num, $limit)) print ''; if (! $i) $totalarray['nbfield']++; } + // Birth + if (! empty($arrayfields['d.birth']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } // Date modification if (! empty($arrayfields['d.tms']['checked'])) { From 0ce2c2aab54bdcbce9582d34c4033f8d41ceb3b0 Mon Sep 17 00:00:00 2001 From: Maxime Kohlhaas Date: Mon, 10 Jun 2019 10:11:26 +0200 Subject: [PATCH 0765/1036] Fix missing massaction hook params --- htdocs/core/actions_massactions.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 9be0e0a4b77..71c3f98420a 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -1269,9 +1269,10 @@ if (! $error && $massaction == 'generate_doc' && $permtoread) $parameters['toselect']=$toselect; $parameters['uploaddir']=$uploaddir; +$parameters['massaction']=$massaction; +$parameters['diroutputmassaction']=$diroutputmassaction; $reshook=$hookmanager->executeHooks('doMassActions',$parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - From a72e36cd013bb95c23a0e0d422621713a51a39db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 10 Jun 2019 20:05:49 +0200 Subject: [PATCH 0766/1036] Fix show version removed from left menu --- htdocs/main.inc.php | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 319ee2dc363..d283abd7d15 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1695,12 +1695,8 @@ function top_menu($head, $title = '', $target = '', $disablejs = 0, $disablehead if ($mode == 'wiki') $text.=sprintf($helpbaseurl, urlencode(html_entity_decode($helppage))); else $text.=sprintf($helpbaseurl, $helppage); $text.='">'; - //$text.=img_picto('', 'helpdoc_top').' '; $text.=''; - //$toprightmenu.=$langs->trans($mode == 'wiki' ? 'OnlineHelp': 'Help'); - //if ($mode == 'wiki') $text.=' ('.dol_trunc(strtr($helppage,'_',' '),8).')'; $text.=''; - //$toprightmenu.=''."\n"; $toprightmenu.=@Form::textwithtooltip('', $title, 2, 1, $text, 'login_block_elem', 2); } } @@ -1815,6 +1811,19 @@ function top_menu_user(User $user, Translate $langs) $profilName = ' '.$profilName; } + // Define version to show + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $btnUser = '
'.$langs->trans("DateChequeReceived").''.$langs->trans("ChequeNumber")."'.$langs->trans("CheckTransmitter")."'.$langs->trans("Bank")."'.$langs->trans("Amount")."'.$langs->trans("DateChequeReceived").''.$langs->trans("ChequeNumber")."'.$langs->trans("CheckTransmitter")."'.$langs->trans("Bank")."'.$langs->trans("Amount")."'.$langs->trans("Payment")."'.$langs->trans("LineRecord")."'.$langs->trans("Select")."
"; From cab91e75c6a2fd77682fb08c03d45dc2d3f7002d Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Mon, 10 Jun 2019 10:10:16 +0200 Subject: [PATCH 0764/1036] add missing column adherent list --- htdocs/adherents/list.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index eaeb1fe305c..02f3d319aa3 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -130,6 +130,7 @@ $arrayfields=array( 'd.note_private'=>array('label'=>$langs->trans("NotePrivate"), 'checked'=>0),*/ 'd.datefin'=>array('label'=>$langs->trans("EndSubscription"), 'checked'=>1, 'position'=>500), 'd.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'd.birth'=>array('label'=>$langs->trans("Birthday"), 'checked'=>0, 'position'=>500), 'd.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), 'd.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000) ); @@ -591,6 +592,12 @@ if (! empty($arrayfields['d.datec']['checked'])) print '
'; print ''; + print ''; + print dol_print_date($db->jdate($obj->birth), 'day', 'tzuser'); + print '' . $objp->country .''; + $labelcountry=($objp->country_code && ($langs->trans("Country".$objp->country_code)!="Country".$objp->country_code))?$langs->trans("Country".$objp->country_code):$objp->country_label; + print $labelcountry; + print '' . $objp->tva_intra . ''; + print ''; print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); print ''; + print ''; print length_accountg(html_entity_decode($objp->code_buy)); print '' . $objp->country .''; + $labelcountry=($objp->country_code && ($langs->trans("Country".$objp->country_code)!="Country".$objp->country_code))?$langs->trans("Country".$objp->country_code):$objp->country_label; + print $labelcountry; + print '' . $objp->tva_intra . ''; + print ''; print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); print '
'.$langs->trans("Day").''.$langs->trans("Value").'
'; - print '
'; + print '
'; - print '
'; + print '
'; - print '
'; + print '
'; - print '
'; + print '
'; - //if (empty($country_selected)) $country_selected=substr($langs->defaultlang,-2); // By default, country of localization - print $form->select_country($conf->global->MAIN_INFO_ACCOUNTANT_COUNTRY, 'country_id'); - if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1); - print '
'; + print '
'; - $formcompany->select_departement($conf->global->MAIN_INFO_ACCOUNTANT_STATE, $conf->global->MAIN_INFO_ACCOUNTANT_COUNTRY, 'state_id'); - print '
'; + print '
'; - print '
'; + print '
'; - print '
'; - print '
'; - print '
'; - print '
'; - print '

'; - print '
'; print ''; print ''; - print ''; - - - print ''; - - - print ''; - - - print ''; - - print ''; - - print ''; - - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print '
'.$langs->trans("Day").''.$langs->trans("Value").'
'.$langs->trans("Monday").'' . nl2br(empty($conf->global->MAIN_INFO_ACCOUNTANT_ADDRESS)?'':$conf->global->MAIN_INFO_ACCOUNTANT_ADDRESS) . '
'.$langs->trans("Tuesday").'' . (empty($conf->global->MAIN_INFO_ACCOUNTANT_ZIP)?'':$conf->global->MAIN_INFO_ACCOUNTANT_ZIP) . '
'.$langs->trans("Wednesday").'' . (empty($conf->global->MAIN_INFO_ACCOUNTANT_TOWN)?'':$conf->global->MAIN_INFO_ACCOUNTANT_TOWN) . '
'.$langs->trans("Thursday").''; - if (! empty($conf->global->MAIN_INFO_ACCOUNTANT_COUNTRY)) - { - $code = getCountry($conf->global->MAIN_INFO_ACCOUNTANT_COUNTRY, 2); - $img=picto_from_langcode($code); - print $img?$img.' ':''; - print getCountry($conf->global->MAIN_INFO_ACCOUNTANT_COUNTRY, 1); - } - print '
'.$langs->trans("Friday").'' . dol_print_phone($conf->global->MAIN_INFO_ACCOUNTANT_PHONE, $mysoc->country_code) . '
'.$langs->trans("Saturday").'' . dol_print_phone($conf->global->MAIN_INFO_ACCOUNTANT_FAX, $mysoc->country_code) . '
'.$langs->trans("Sunday").'' . dol_print_email($conf->global->MAIN_INFO_ACCOUNTANT_MAIL, 0, 0, 0, 80) . '
'.$langs->trans("Monday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_MONDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_MONDAY) . '
'.$langs->trans("Tuesday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_TUESDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_TUESDAY) . '
'.$langs->trans("Wednesday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_WEDNESDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_WEDNESDAY) . '
'.$langs->trans("Thursday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_THURSDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_THURSDAY) . '
'.$langs->trans("Friday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_FRIDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_FRIDAY) . '
'.$langs->trans("Saturday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_SATURDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_SATURDAY) . '
'.$langs->trans("Sunday").'' . (empty($conf->global->MAIN_INFO_OPENINGHOURS_SUNDAY)?'':$conf->global->MAIN_INFO_OPENINGHOURS_SUNDAY) . '
'; print "
"; From eb4dc36e055b4f73f390776613135b567e725017 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 12 Jun 2019 04:56:16 +0200 Subject: [PATCH 0773/1036] Responsive on invoice index --- htdocs/compta/index.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index c872fae3def..cc077ed55e1 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -351,6 +351,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) $num = $db->num_rows($resql); $i = 0; + print '
'; print ''; print ''; if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) print ''; @@ -428,7 +429,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) $colspan++; print ''; } - print '
'.$langs->trans("BoxTitleLastCustomerBills", $max).''.$langs->trans("AmountHT").'
'.$langs->trans("NoInvoice").'

'; + print '

'; $db->free($resql); } else @@ -472,6 +473,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture- { $num = $db->num_rows($resql); + print '
'; print ''; print ''; if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) print ''; @@ -524,7 +526,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture- if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) $colspan++; print ''; } - print '
'.$langs->trans("BoxTitleLastSupplierBills", $max).''.$langs->trans("AmountHT").'
'.$langs->trans("NoInvoice").'

'; + print '

'; } else { @@ -561,6 +563,7 @@ if (! empty($conf->don->enabled) && $user->rights->societe->lire) $i = 0; + print '
'; print ''; print ''; print ''; @@ -600,7 +603,7 @@ if (! empty($conf->don->enabled) && $user->rights->societe->lire) { print ''; } - print '
'.$langs->trans("BoxTitleLastModifiedDonations", $max).'
'.$langs->trans("None").'

'; + print '

'; } else dol_print_error($db); } @@ -634,6 +637,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) { $num = $db->num_rows($resql); + print '
'; print ''; print ''; print ''; @@ -676,7 +680,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) { print ''; } - print "
'.$langs->trans("ContributionsToPay").($num?' '.$num.'':'').'
'.$langs->trans("None").'

"; + print "

"; $db->free($resql); } else @@ -726,6 +730,8 @@ if (! empty($conf->facture->enabled) && ! empty($conf->commande->enabled) && $us if ($num) { $i = 0; + + print '
'; print ''; print ""; print ''; @@ -795,7 +801,7 @@ if (! empty($conf->facture->enabled) && ! empty($conf->commande->enabled) && $us print ''; print ''; print ''; - print '
'.$langs->trans("OrdersDeliveredToBill").' '.$num.''.price($tot_tobill).' 

'; + print '

'; } $db->free($resql); } @@ -1053,6 +1059,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture- $resql = 0; if ($resql) { + print '
'; print ''; print ''.$langs->trans("TasksToDo").''; print "\n"; @@ -1067,7 +1074,7 @@ if ($resql) $i++; } $db->free($resql); - print "

"; + print "

"; } From 420f3bbdabfa80206058a8a5c5c707ad58ba091b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 10:05:53 +0200 Subject: [PATCH 0774/1036] FIX #11316 --- htdocs/core/modules/modProjet.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index dcfef83f8e3..54cd897102e 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -247,8 +247,8 @@ class modProjet extends DolibarrModules $keyforselect='projet'; $keyforelement='project'; $keyforaliasextra='extra'; include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; // Add fields for tasks - $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('pt.rowid'=>'RefTask','pt.label'=>'LabelTask','pt.dateo'=>"TaskDateStart",'pt.datee'=>"TaskDateEnd",'pt.duration_effective'=>"DurationEffective",'pt.planned_workload'=>"PlannedWorkload",'pt.progress'=>"Progress",'pt.description'=>"TaskDescription")); - $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('pt.rowid'=>'projecttask','pt.label'=>'projecttask','pt.dateo'=>"projecttask",'pt.datee'=>"projecttask",'pt.duration_effective'=>"projecttask",'pt.planned_workload'=>"projecttask",'pt.progress'=>"projecttask",'pt.description'=>"projecttask")); + $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('pt.rowid'=>'TaskId', 'pt.ref'=>'RefTask', 'pt.label'=>'LabelTask','pt.dateo'=>"TaskDateStart",'pt.datee'=>"TaskDateEnd",'pt.duration_effective'=>"DurationEffective",'pt.planned_workload'=>"PlannedWorkload",'pt.progress'=>"Progress",'pt.description'=>"TaskDescription")); + $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('pt.rowid'=>'projecttask', 'pt.ref'=>'projecttask', 'pt.label'=>'projecttask','pt.dateo'=>"projecttask",'pt.datee'=>"projecttask",'pt.duration_effective'=>"projecttask",'pt.planned_workload'=>"projecttask",'pt.progress'=>"projecttask",'pt.description'=>"projecttask")); // Add extra fields for task $keyforselect='projet_task'; $keyforelement='projecttask'; $keyforaliasextra='extra2'; include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; From 25031e534dacd664bdbb69ba2da2001f266a2352 Mon Sep 17 00:00:00 2001 From: atm-greg Date: Wed, 12 Jun 2019 12:05:02 +0200 Subject: [PATCH 0775/1036] fix massaction presend --- htdocs/core/actions_massactions.inc.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 064acb0b1c6..bb8b03d9366 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -260,6 +260,11 @@ if (! $error && $massaction == 'confirm_presend') $filename=dol_sanitizeFileName($objectobj->ref).'.pdf'; $filedir=$uploaddir . '/' . dol_sanitizeFileName($objectobj->ref); $file = $filedir . '/' . $filename; + if ($object->element == 'invoice_supplier') + { + $fileparams = dol_most_recent_file($uploaddir . '/' . get_exdir($objectobj->id,2,0,0,$objectobj,$objectobj->element).$objectobj->ref, preg_quote($objectobj->ref,'/').'([^\-])+'); + $file = $fileparams['fullname']; + } $mime = dol_mimetype($file); if (dol_is_file($file)) From 9ba102b6b93239599626fe8c60cf0569ad12bcb5 Mon Sep 17 00:00:00 2001 From: atm-greg Date: Wed, 12 Jun 2019 12:08:16 +0200 Subject: [PATCH 0776/1036] bad object used --- htdocs/core/actions_massactions.inc.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index bb8b03d9366..2d0750bbefe 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -260,11 +260,13 @@ if (! $error && $massaction == 'confirm_presend') $filename=dol_sanitizeFileName($objectobj->ref).'.pdf'; $filedir=$uploaddir . '/' . dol_sanitizeFileName($objectobj->ref); $file = $filedir . '/' . $filename; - if ($object->element == 'invoice_supplier') + + if ($objectobj->element == 'invoice_supplier') { $fileparams = dol_most_recent_file($uploaddir . '/' . get_exdir($objectobj->id,2,0,0,$objectobj,$objectobj->element).$objectobj->ref, preg_quote($objectobj->ref,'/').'([^\-])+'); $file = $fileparams['fullname']; } + $mime = dol_mimetype($file); if (dol_is_file($file)) From 91a4e8bc0a79d0a94cb32a8010fe2f2958ab1213 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:09:56 +0200 Subject: [PATCH 0777/1036] Merge --- htdocs/core/modules/modProjet.class.php | 6 +++--- htdocs/langs/en_US/projects.lang | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 5d2ed5126af..106517c638a 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -220,7 +220,7 @@ class modProjet extends DolibarrModules $this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom::thirdparty",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','s.fk_pays'=>'List:c_country:label', 's.phone'=>'Text','s.email'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text', 'p.rowid'=>"List:projet:ref::project",'p.ref'=>"Text",'p.title'=>"Text",'p.datec'=>"Date",'p.dateo'=>"Date",'p.datee'=>"Date",'p.fk_statut'=>'Status','cls.code'=>"Text",'p.opp_percent'=>'Numeric','p.opp_amount'=>'Numeric','p.description'=>"Text",'p.entity'=>'Numeric', - 'pt.rowid'=>'Text','pt.label'=>'Text','pt.dateo'=>"Date",'pt.datee'=>"Date",'pt.duration_effective'=>"Duree",'pt.planned_workload'=>"Numeric",'pt.progress'=>"Numeric",'pt.description'=>"Text", + 'pt.rowid'=>'Numeric','pt.ref'=>'Text','pt.label'=>'Text','pt.dateo'=>"Date",'pt.datee'=>"Date",'pt.duration_effective'=>"Duree",'pt.planned_workload'=>"Numeric",'pt.progress'=>"Numeric",'pt.description'=>"Text", 'ptt.rowid'=>'Numeric','ptt.task_date'=>'Date','ptt.task_duration'=>"Duree",'ptt.fk_user'=>"List:user:CONCAT(lastname,' ',firstname)",'ptt.note'=>"Text"); $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company', 's.phone'=>'company','s.email'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company'); @@ -247,8 +247,8 @@ class modProjet extends DolibarrModules $keyforselect='projet'; $keyforelement='project'; $keyforaliasextra='extra'; include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; // Add fields for tasks - $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('pt.rowid'=>'TaskId', 'pt.ref'=>'RefTask', 'pt.label'=>'LabelTask','pt.dateo'=>"TaskDateStart",'pt.datee'=>"TaskDateEnd",'pt.duration_effective'=>"DurationEffective",'pt.planned_workload'=>"PlannedWorkload",'pt.progress'=>"Progress",'pt.description'=>"TaskDescription")); - $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('pt.rowid'=>'projecttask', 'pt.ref'=>'projecttask', 'pt.label'=>'projecttask','pt.dateo'=>"projecttask",'pt.datee'=>"projecttask",'pt.duration_effective'=>"projecttask",'pt.planned_workload'=>"projecttask",'pt.progress'=>"projecttask",'pt.description'=>"projecttask")); + $this->export_fields_array[$r]=array_merge($this->export_fields_array[$r], array('pt.rowid'=>'TaskId', 'pt.ref'=>'RefTask', 'pt.label'=>'LabelTask', 'pt.dateo'=>"TaskDateStart", 'pt.datee'=>"TaskDateEnd", 'pt.duration_effective'=>"DurationEffective", 'pt.planned_workload'=>"PlannedWorkload", 'pt.progress'=>"Progress", 'pt.description'=>"TaskDescription")); + $this->export_entities_array[$r]=array_merge($this->export_entities_array[$r], array('pt.rowid'=>'projecttask', 'pt.ref'=>'projecttask', 'pt.label'=>'projecttask', 'pt.dateo'=>"projecttask", 'pt.datee'=>"projecttask", 'pt.duration_effective'=>"projecttask", 'pt.planned_workload'=>"projecttask", 'pt.progress'=>"projecttask", 'pt.description'=>"projecttask")); // Add extra fields for task $keyforselect='projet_task'; $keyforelement='projecttask'; $keyforaliasextra='extra2'; include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index fbc43d6e990..ca9a1e2452f 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -45,8 +45,9 @@ TimeSpent=Time spent TimeSpentByYou=Time spent by you TimeSpentByUser=Time spent by user TimesSpent=Time spent -RefTask=Ref. task -LabelTask=Label task +TaskId=Task ID +RefTask=Task ref. +LabelTask=Task label TaskTimeSpent=Time spent on tasks TaskTimeUser=User TaskTimeNote=Note From 5554bd231f697c664b2221abaae92df4b842ae48 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:11:06 +0200 Subject: [PATCH 0778/1036] Update openinghours.php --- htdocs/admin/openinghours.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/openinghours.php b/htdocs/admin/openinghours.php index 435b99bc7f1..b68508f557a 100644 --- a/htdocs/admin/openinghours.php +++ b/htdocs/admin/openinghours.php @@ -17,7 +17,7 @@ /** * \file htdocs/admin/openinghours.php - * \ingroup Opening hours + * \ingroup core * \brief Setup page to configure opening hours */ From 47746fd17d77bb61c965130c325922daa30a01e3 Mon Sep 17 00:00:00 2001 From: atm-greg Date: Wed, 12 Jun 2019 12:30:49 +0200 Subject: [PATCH 0779/1036] fix template type --- htdocs/core/class/html.formmail.class.php | 1 + htdocs/fourn/facture/list.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index e8693af943a..ac742f0dbb7 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -359,6 +359,7 @@ class FormMail extends Form if ($this->param['models'] != 'none') { $result = $this->fetchAllEMailTemplate($this->param["models"], $user, $outputlangs); + if ($result < 0) { setEventMessages($this->error, $this->errors, 'errors'); diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 4b208a99af7..c14c037dc97 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -496,7 +496,7 @@ if ($resql) print_barre_liste($langs->trans("BillsSuppliers").($socid?' '.$soc->name:''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, $newcardbutton, '', $limit); $topicmail="SendBillRef"; - $modelmail="supplier_invoice_send"; + $modelmail="invoice_supplier_send"; $objecttmp=new FactureFournisseur($db); $trackid='sinv'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; From 0bf7512f288411d3e3e982c5522bab6606e920e8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:33:31 +0200 Subject: [PATCH 0780/1036] Update actions_massactions.inc.php --- htdocs/core/actions_massactions.inc.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 2d0750bbefe..34ba465ebff 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -257,10 +257,14 @@ if (! $error && $massaction == 'confirm_presend') { // TODO Use future field $objectobj->fullpathdoc to know where is stored default file // TODO If not defined, use $objectobj->modelpdf (or defaut invoice config) to know what is template to use to regenerate doc. - $filename=dol_sanitizeFileName($objectobj->ref).'.pdf'; - $filedir=$uploaddir . '/' . dol_sanitizeFileName($objectobj->ref); + $filename = dol_sanitizeFileName($objectobj->ref).'.pdf'; + $subdir = ''; + // TODO Set subdir to be compatible with multi levels dir trees + // $subdir = get_exdir($objectobj->id, 2, 0, 0, $objectobj, $objectobj->element) + $filedir = $uploaddir . '/' . $subdir . dol_sanitizeFileName($objectobj->ref); $file = $filedir . '/' . $filename; + // For supplier invoices, we use the file provided by supplier, not the one we generate if ($objectobj->element == 'invoice_supplier') { $fileparams = dol_most_recent_file($uploaddir . '/' . get_exdir($objectobj->id,2,0,0,$objectobj,$objectobj->element).$objectobj->ref, preg_quote($objectobj->ref,'/').'([^\-])+'); From 0f3db439fe459a16f9e9802854e8373796bd7878 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:38:01 +0200 Subject: [PATCH 0781/1036] Update bankjournal.php --- htdocs/accountancy/journal/bankjournal.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index a286e4d8a66..f20d075c05f 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -993,8 +993,8 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("SubledgerAccount") . ""; print "" . $langs->trans("LabelOperation") . ""; print "" . $langs->trans("PaymentMode") . ""; - print "" . $langs->trans("Debit") . ""; - print "" . $langs->trans("Credit") . ""; + print "" . $langs->trans("Debit") . ""; + print "" . $langs->trans("Credit") . ""; print "\n"; $r = ''; From 1182c0d1f58da7311c0d3b4a0c85591055a8baf7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:46:44 +0200 Subject: [PATCH 0782/1036] Update list.php --- htdocs/accountancy/customer/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index b11c7c14cec..3b9a3f23564 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -407,7 +407,7 @@ if ($result) { print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder); //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right minwidth100 '); + print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 '); print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("VATIntra", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder, 'center '); From 3aacd454371bdd0255c1c3ca4a23f4b16c43c142 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:47:35 +0200 Subject: [PATCH 0783/1036] Update list.php --- htdocs/accountancy/expensereport/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index fc590ae140c..a317f7e50b2 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -331,7 +331,7 @@ if ($result) { print_liste_field_titre("Date", $_SERVER["PHP_SELF"], "erd.date, erd.rowid", "", $param, '', $sortfield, $sortorder, 'center '); print_liste_field_titre("TypeFees", $_SERVER["PHP_SELF"], "f.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "erd.comments", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "erd.total_ht", "", $param, '', $sortfield, $sortorder, 'right minwidth100 '); + print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "erd.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 '); print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "erd.tva_tx", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', $sortfield, $sortorder, 'center '); print_liste_field_titre("IntoAccount", '', '', '', '', '', $sortfield, $sortorder, 'center '); From 402cbba4add00c60c9c3177b7ae171d96f2cbe87 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:48:21 +0200 Subject: [PATCH 0784/1036] Update bankjournal.php --- htdocs/accountancy/journal/bankjournal.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index f20d075c05f..403e422f773 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -993,8 +993,8 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("SubledgerAccount") . ""; print "" . $langs->trans("LabelOperation") . ""; print "" . $langs->trans("PaymentMode") . ""; - print "" . $langs->trans("Debit") . ""; - print "" . $langs->trans("Credit") . ""; + print "" . $langs->trans("Debit") . ""; + print "" . $langs->trans("Credit") . ""; print "\n"; $r = ''; From f435f4bd6ab1ad4fd7c21b073bf1f2d3a5040e93 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:49:44 +0200 Subject: [PATCH 0785/1036] Update bankjournal.php --- htdocs/accountancy/journal/bankjournal.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 403e422f773..70d54456c61 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -992,9 +992,9 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("AccountAccounting") . ""; print "" . $langs->trans("SubledgerAccount") . ""; print "" . $langs->trans("LabelOperation") . ""; - print "" . $langs->trans("PaymentMode") . ""; - print "" . $langs->trans("Debit") . ""; - print "" . $langs->trans("Credit") . ""; + print '' . $langs->trans("PaymentMode") . ""; + print '' . $langs->trans("Debit") . ""; + print '' . $langs->trans("Credit") . ""; print "\n"; $r = ''; @@ -1041,9 +1041,9 @@ if (empty($action) || $action == 'view') { print ""; print $reflabel; print ""; - print "" . $val["type_payment"] . ""; - print "" . ($mt >= 0 ? price($mt) : '') . ""; - print "" . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . $val["type_payment"] . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; print ""; } } From a400183bf1f18fdbc5099a0352d57bec69300711 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:52:51 +0200 Subject: [PATCH 0786/1036] Update bankjournal.php --- htdocs/accountancy/journal/bankjournal.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 70d54456c61..cce4c33e383 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -1122,9 +1122,9 @@ if (empty($action) || $action == 'view') { } print ""; print "" . $reflabel . ""; - print "" . $val["type_payment"] . ""; - print "" . ($mt < 0 ? price(- $mt) : '') . ""; - print "" . ($mt >= 0 ? price($mt) : '') . ""; + print '' . $val["type_payment"] . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; } } @@ -1158,9 +1158,9 @@ if (empty($action) || $action == 'view') { */ print ""; print "" . $reflabel . ""; - print "" . $val["type_payment"] . ""; - print "" . ($mt < 0 ? price(- $mt) : '') . ""; - print "" . ($mt >= 0 ? price($mt) : '') . ""; + print '' . $val["type_payment"] . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; } } From 42915d86ec0d3433b49769e306c0b777b936857f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 12:57:02 +0200 Subject: [PATCH 0787/1036] Update expensereportsjournal.php --- .../journal/expensereportsjournal.php | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php index 9da814e2d8c..f02ea6c2212 100644 --- a/htdocs/accountancy/journal/expensereportsjournal.php +++ b/htdocs/accountancy/journal/expensereportsjournal.php @@ -554,8 +554,8 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("AccountAccounting") . ""; print "" . $langs->trans("SubledgerAccount") . ""; print "" . $langs->trans("LabelOperation") . ""; - print "" . $langs->trans("Debit") . ""; - print "" . $langs->trans("Credit") . ""; + print '' . $langs->trans("Debit") . ""; + print '' . $langs->trans("Credit") . ""; print "\n"; $r = ''; @@ -597,20 +597,21 @@ if (empty($action) || $action == 'view') { $userstatic->id = $tabuser[$key]['id']; $userstatic->name = $tabuser[$key]['name']; print "" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $accountingaccount->label . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; print ""; } } // Third party foreach ($tabttc[$key] as $k => $mt) { + $userstatic->id = $tabuser[$key]['id']; + $userstatic->name = $tabuser[$key]['name']; + print ''; print ""; print "" . $date . ""; print "" . $expensereportstatic->getNomUrl(1) . ""; - $userstatic->id = $tabuser[$key]['id']; - $userstatic->name = $tabuser[$key]['name']; // Account print ""; $accountoshow = length_accounta($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT); @@ -630,8 +631,8 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print ''; print "" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $langs->trans("SubledgerAccount") . ""; - print '' . ($mt < 0 ? - price(- $mt) : '') . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? - price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; } @@ -662,8 +663,8 @@ if (empty($action) || $action == 'view') { print ''; print "" . $userstatic->getNomUrl(0, 'user', 16) . ' - ' . $langs->trans("VAT"). ' '.join(', ', $def_tva[$key][$k]).' %'.($numtax?' - Localtax '.$numtax:''); print ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; print ""; } } From eefd30fe1cda3f828b42bbc10c6b79301be61bf3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:01:04 +0200 Subject: [PATCH 0788/1036] Update purchasesjournal.php --- .../accountancy/journal/purchasesjournal.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 8dbcc0989ce..ee59481a419 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -788,8 +788,8 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("AccountAccounting") . ""; print "" . $langs->trans("SubledgerAccount") . ""; print "" . $langs->trans("LabelOperation") . ""; - print "" . $langs->trans("Debit") . ""; - print "" . $langs->trans("Credit") . ""; + print '' . $langs->trans("Debit") . ""; + print '' . $langs->trans("Credit") . ""; print "\n"; $r = ''; @@ -893,8 +893,8 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print ''; print "" . $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $langs->trans("SubledgerAccount") . ""; - print ''. ($mt < 0 ? price(- $mt) : '') . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; + print ''. ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; //} } @@ -924,8 +924,8 @@ if (empty($action) || $action == 'view') { $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; print "" . $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $accountingaccount->label . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; print ""; //} } @@ -958,8 +958,8 @@ if (empty($action) || $action == 'view') { print ""; print $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $langs->trans("VAT"). ' '.join(', ', $def_tva[$key][$k]).' %'.($numtax?' - Localtax '.$numtax:''); print ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; print ""; } } @@ -987,8 +987,8 @@ if (empty($action) || $action == 'view') { print ""; print ''; print "" . $companystatic->getNomUrl(0, 'supplier', 16) . ' - ' . $invoicestatic->ref_supplier . ' - ' . $langs->trans("VAT") . " NPR (counterpart)"; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; } } From 1e87635e8ee034bb1974b89424d0ab17ada441ec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:02:59 +0200 Subject: [PATCH 0789/1036] Update sellsjournal.php --- htdocs/accountancy/journal/sellsjournal.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index da1f14dade5..449f0a278eb 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -725,8 +725,8 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("AccountAccounting") . ""; print "" . $langs->trans("SubledgerAccount") . ""; print "" . $langs->trans("LabelOperation") . ""; - print "" . $langs->trans("Debit") . ""; - print "" . $langs->trans("Credit") . ""; + print '' . $langs->trans("Debit") . ""; + print '' . $langs->trans("Credit") . ""; print "\n"; $r = ''; @@ -829,8 +829,8 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print ''; print "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $langs->trans("SubledgerAccount") . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; print ""; //} } @@ -861,8 +861,8 @@ if (empty($action) || $action == 'view') { $companystatic->id = $tabcompany[$key]['id']; $companystatic->name = $tabcompany[$key]['name']; print "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $accountingaccount->label . ""; - print "" . ($mt < 0 ? price(- $mt) : '') . ""; - print "" . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; //} } @@ -895,8 +895,8 @@ if (empty($action) || $action == 'view') { print ''; print "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $langs->trans("VAT"). ' '.join(', ', $def_tva[$key][$k]).' %'.($numtax?' - Localtax '.$numtax:''); print ""; - print '' . ($mt < 0 ? price(- $mt) : '') . ""; - print '' . ($mt >= 0 ? price($mt) : '') . ""; + print '' . ($mt < 0 ? price(- $mt) : '') . ""; + print '' . ($mt >= 0 ? price($mt) : '') . ""; print ""; } } From 9fa6674e3f76794a9fdca44ddb0887cec96800d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:03:54 +0200 Subject: [PATCH 0790/1036] Update list.php --- htdocs/accountancy/supplier/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 1d53fba9aef..b7b74104f14 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -406,7 +406,7 @@ if ($result) { print_liste_field_titre("ProductRef", $_SERVER["PHP_SELF"], "p.ref", "", $param, '', $sortfield, $sortorder); //print_liste_field_titre("ProductLabel", $_SERVER["PHP_SELF"], "p.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("Description", $_SERVER["PHP_SELF"], "l.description", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right minwidth100 '); + print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right maxwidth50 '); print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("VATIntra", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder); From aaed26b9b0d87bf162107909ff0f2eee5f9a5d6a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:04:28 +0200 Subject: [PATCH 0791/1036] Update main.lang --- htdocs/langs/en_US/main.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index a89443b345f..400d7179b02 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -973,4 +973,4 @@ SeePrivateNote=See private note PaymentInformation=Payment information ValidFrom=Valid from ValidUntil=Valid until -NoRecordedUsers=No records users \ No newline at end of file +NoRecordedUsers=No users From 509ca489b22c9496d73185c9743ea96a48d84b38 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:06:02 +0200 Subject: [PATCH 0792/1036] Update card.php --- htdocs/compta/paiement/cheque/card.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/compta/paiement/cheque/card.php b/htdocs/compta/paiement/cheque/card.php index 9372ec84cfe..3107cf29742 100644 --- a/htdocs/compta/paiement/cheque/card.php +++ b/htdocs/compta/paiement/cheque/card.php @@ -472,14 +472,14 @@ if ($action == 'new') print ''."\n"; print ''; - print ''."\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print '\n"; - print ''."\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print '\n"; + print ''; print "\n"; From 9d958124958d7f700afceaae2bbdcb321ac5d6f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:08:26 +0200 Subject: [PATCH 0793/1036] Update bankentries_list.php --- htdocs/compta/bank/bankentries_list.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index be2d8335afa..e28ea5e9af1 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -935,18 +935,18 @@ if ($resql) print ''; if (! empty($arrayfields['b.rowid']['checked'])) print_liste_field_titre($arrayfields['b.rowid']['label'], $_SERVER['PHP_SELF'], 'b.rowid', '', $param, '', $sortfield, $sortorder); if (! empty($arrayfields['description']['checked'])) print_liste_field_titre($arrayfields['description']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder); - if (! empty($arrayfields['b.dateo']['checked'])) print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, 'align="center"', $sortfield, $sortorder); + if (! empty($arrayfields['b.dateo']['checked'])) print_liste_field_titre($arrayfields['b.dateo']['label'], $_SERVER['PHP_SELF'], 'b.dateo', '', $param, '', $sortfield, $sortorder, "center "); if (! empty($arrayfields['b.datev']['checked'])) print_liste_field_titre($arrayfields['b.datev']['label'], $_SERVER['PHP_SELF'], 'b.datev,b.dateo,b.rowid', '', $param, 'align="center"', $sortfield, $sortorder); if (! empty($arrayfields['type']['checked'])) print_liste_field_titre($arrayfields['type']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'align="center"', $sortfield, $sortorder); - if (! empty($arrayfields['b.num_chq']['checked'])) print_liste_field_titre($arrayfields['b.num_chq']['label'], $_SERVER['PHP_SELF'], 'b.num_chq', '', $param, 'align="center"', $sortfield, $sortorder); + if (! empty($arrayfields['b.num_chq']['checked'])) print_liste_field_titre($arrayfields['b.num_chq']['label'], $_SERVER['PHP_SELF'], 'b.num_chq', '', $param, '', $sortfield, $sortorder, "center "); if (! empty($arrayfields['bu.label']['checked'])) print_liste_field_titre($arrayfields['bu.label']['label'], $_SERVER['PHP_SELF'], 'bu.label', '', $param, '', $sortfield, $sortorder); if (! empty($arrayfields['ba.ref']['checked'])) print_liste_field_titre($arrayfields['ba.ref']['label'], $_SERVER['PHP_SELF'], 'ba.ref', '', $param, '', $sortfield, $sortorder); - if (! empty($arrayfields['b.debit']['checked'])) print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'align="center" style="min-width: 100px"', $sortfield, $sortorder, "right "); - if (! empty($arrayfields['b.credit']['checked'])) print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, 'align="center" style="min-width: 100px"', $sortfield, $sortorder, "right "); - if (! empty($arrayfields['balancebefore']['checked'])) print_liste_field_titre($arrayfields['balancebefore']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); - if (! empty($arrayfields['balance']['checked'])) print_liste_field_titre($arrayfields['balance']['label'], $_SERVER['PHP_SELF'], '', '', $param, 'class="right"', $sortfield, $sortorder); - if (! empty($arrayfields['b.num_releve']['checked'])) print_liste_field_titre($arrayfields['b.num_releve']['label'], $_SERVER['PHP_SELF'], 'b.num_releve', '', $param, 'align="center"', $sortfield, $sortorder); - if (! empty($arrayfields['b.conciliated']['checked'])) print_liste_field_titre($arrayfields['b.conciliated']['label'], $_SERVER['PHP_SELF'], 'b.rappro', '', $param, 'align="center"', $sortfield, $sortorder); + if (! empty($arrayfields['b.debit']['checked'])) print_liste_field_titre($arrayfields['b.debit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, "right "); + if (! empty($arrayfields['b.credit']['checked'])) print_liste_field_titre($arrayfields['b.credit']['label'], $_SERVER['PHP_SELF'], 'b.amount', '', $param, '', $sortfield, $sortorder, "right "); + if (! empty($arrayfields['balancebefore']['checked'])) print_liste_field_titre($arrayfields['balancebefore']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, "right "); + if (! empty($arrayfields['balance']['checked'])) print_liste_field_titre($arrayfields['balance']['label'], $_SERVER['PHP_SELF'], '', '', $param, '', $sortfield, $sortorder, "right "); + if (! empty($arrayfields['b.num_releve']['checked'])) print_liste_field_titre($arrayfields['b.num_releve']['label'], $_SERVER['PHP_SELF'], 'b.num_releve', '', $param, '', $sortfield, $sortorder, "center "); + if (! empty($arrayfields['b.conciliated']['checked'])) print_liste_field_titre($arrayfields['b.conciliated']['label'], $_SERVER['PHP_SELF'], 'b.rappro', '', $param, '', $sortfield, $sortorder, "center "); // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; // Hook fields From 475f59cc2ad8e180933183e6aa10ee74026ffeee Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:10:17 +0200 Subject: [PATCH 0794/1036] Update annuel.php --- htdocs/compta/bank/annuel.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/annuel.php b/htdocs/compta/bank/annuel.php index 78705847bfc..c4352b3b97e 100644 --- a/htdocs/compta/bank/annuel.php +++ b/htdocs/compta/bank/annuel.php @@ -217,7 +217,7 @@ for ($mois = 1 ; $mois < 13 ; $mois++) } print ""; - print '"; for ($annee = $year_start ; $annee <= $year_end ; $annee++) { - print ''; + print ''; } print "\n"; From 330842d67eebc30f56ebc7dc9ed00246ec0a19a8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:14:44 +0200 Subject: [PATCH 0795/1036] Update list.php --- htdocs/comm/propal/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index ee8dacde380..555e89e7a61 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -162,8 +162,8 @@ $arrayfields=array( 'p.total_ht'=>array('label'=>"AmountHT", 'checked'=>1), 'p.total_vat'=>array('label'=>"AmountVAT", 'checked'=>0), 'p.total_ttc'=>array('label'=>"AmountTTC", 'checked'=>0), - 'p.total_ht_invoiced'=>array('label'=>$langs->trans("AmountInvoicedHT"), 'checked'=>0), - 'p.total_invoiced'=>array('label'=>$langs->trans("AmountInvoicedTTC"), 'checked'=>0), + 'p.total_ht_invoiced'=>array('label'=>$langs->trans("AmountInvoicedHT"), 'checked'=>0, 'enabled'=>$conf->global->PROPOSAL_SHOW_INVOICED_AMOUNT), + 'p.total_invoiced'=>array('label'=>$langs->trans("AmountInvoicedTTC"), 'checked'=>0, 'enabled'=>$conf->global->PROPOSAL_SHOW_INVOICED_AMOUNT), 'u.login'=>array('label'=>"Author", 'checked'=>1, 'position'=>10), 'sale_representative'=>array('label'=>"SaleRepresentativesOfThirdParty", 'checked'=>1), 'p.datec'=>array('label'=>"DateCreation", 'checked'=>0, 'position'=>500), From 44f383c8b976537de95d045dd802725671365bfa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:57:34 +0200 Subject: [PATCH 0796/1036] Fix data lost when creation in error --- htdocs/accountancy/bookkeeping/card.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index d94ce0ec315..ca0476f3a3c 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -373,7 +373,7 @@ if ($action == 'create') print ''; print ''; - print ''; + print ''; print ''; /* @@ -615,23 +615,23 @@ if ($action == 'create') if ($action == 'update' && $line->id == $id) { print ''; print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; print ''; print ''; print ''; - print ''; + print ''; print ''; print ''; print ''; From bf6f9dd7eae4d8904c13717c8bccef7166b2db53 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 13:58:48 +0200 Subject: [PATCH 0797/1036] Fix phpcs --- htdocs/admin/multicurrency.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/multicurrency.php b/htdocs/admin/multicurrency.php index 3b071f57fa8..206c251309e 100644 --- a/htdocs/admin/multicurrency.php +++ b/htdocs/admin/multicurrency.php @@ -46,7 +46,7 @@ $action = GETPOST('action', 'alpha'); */ -if (preg_match('/set_([a-z0-9_\-]+)/i',$action,$reg)) +if (preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) { $code=$reg[1]; $value=GETPOST($code, 'alpha'); @@ -60,7 +60,7 @@ if (preg_match('/set_([a-z0-9_\-]+)/i',$action,$reg)) } } -if (preg_match('/del_([a-z0-9_\-]+)/i',$action,$reg)) +if (preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) { $code=$reg[1]; if (dolibarr_del_const($db, $code, 0) > 0) From 47610d0323fb8e51220a9302b56f32069f482622 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 15:42:48 +0200 Subject: [PATCH 0798/1036] Look and feel v10 --- htdocs/accountancy/customer/lines.php | 4 ++-- htdocs/accountancy/customer/list.php | 6 +++--- htdocs/accountancy/expensereport/lines.php | 4 ++-- htdocs/accountancy/expensereport/list.php | 4 ++-- htdocs/accountancy/supplier/lines.php | 4 ++-- htdocs/accountancy/supplier/list.php | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 83bceb04026..9848c4cf7c5 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -310,9 +310,9 @@ if ($result) { print ''; print ''; print ''; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 61c22eb2912..14eac87fdaa 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -377,9 +377,9 @@ if ($result) { print ''; print ''; print ''; @@ -410,7 +410,7 @@ if ($result) { print_liste_field_titre("Amount", $_SERVER["PHP_SELF"], "l.total_ht", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("VATRate", $_SERVER["PHP_SELF"], "l.tva_tx", "", $param, '', $sortfield, $sortorder, 'right '); print_liste_field_titre("Country", $_SERVER["PHP_SELF"], "co.label", "", $param, '', $sortfield, $sortorder); - print_liste_field_titre("VATIntra", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder, 'center '); + print_liste_field_titre("VATIntra", $_SERVER["PHP_SELF"], "s.tva_intra", "", $param, '', $sortfield, $sortorder); print_liste_field_titre("AccountAccountingSuggest", '', '', '', '', '', '', '', 'center '); print_liste_field_titre("IntoAccount", '', '', '', '', '', '', '', 'center '); $checkpicto=''; diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index 734bbfb65d2..3e3a8fd623e 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -263,8 +263,8 @@ if ($result) { print ''; print ''; print ''; print ''; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 4c739a218b9..46d00268174 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -309,8 +309,8 @@ if ($result) { print ''; print ''; print ''; print ''; diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 9b704e21eb3..f68bf107b47 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -314,8 +314,8 @@ if ($result) { print ''; print ''; print ''; print ''; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 47e3570bcbe..afd65cdc645 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -376,8 +376,8 @@ if ($result) { print ''; print ''; print ''; print ''; From e81663ec3495597815266713de87ad1d1e0ea025 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 19:00:34 +0200 Subject: [PATCH 0799/1036] Fix cropping of image files for BOM module was ko --- htdocs/core/class/html.formfile.class.php | 4 ++-- htdocs/core/lib/security.lib.php | 15 ++++++++------- htdocs/core/photos_resize.php | 20 +++++++++++++++++++- htdocs/langs/en_US/mrp.lang | 2 ++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index b729ad51fc5..8f0aee14424 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1040,7 +1040,7 @@ class FormFile * @param string $relativepath Relative path of docs (autodefined if not provided), relative to module dir, not to MAIN_DATA_ROOT. * @param int $permonobject Permission on object (so permission to delete or crop document) * @param int $useinecm Change output for use in ecm module: - * 0 or 6: Add a preview column. Show also a rename and crop button. + * 0 or 6: Add a preview column. Show also a rename button. Show also a crop button for some values of $modulepart (must be supported into hard coded list in this function + photos_resize.php + restrictedArea + checkUserAccessToObject) * 1: Add link to edit ECM entry * 2: Add rename and crop file * 4: Add a preview column @@ -1068,7 +1068,7 @@ class FormFile global $form; $disablecrop=1; - if (in_array($modulepart, array('expensereport','holiday','member','project','product','produit','service','societe','tax','ticket','user'))) $disablecrop=0; + if (in_array($modulepart, array('bom','expensereport','holiday','member','project','product','produit','service','societe','tax','ticket','user'))) $disablecrop=0; // Define relative path used to store the file if (empty($relativepath)) diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index dcdc70c3fe6..69d9173e212 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -247,11 +247,12 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f { if (! $user->rights->projet->lire && ! $user->rights->projet->all->lire) { $readok=0; $nbko++; } } - elseif (! empty($feature2)) // This should be used for future changes + elseif (! empty($feature2)) // This is for permissions on 2 levels { $tmpreadok=1; foreach($feature2 as $subfeature) { + var_dump($subfeature); if ($subfeature == 'user' && $user->id == $objectid) continue; // A user can always read its own card if (! empty($subfeature) && empty($user->rights->$feature->$subfeature->lire) && empty($user->rights->$feature->$subfeature->read)) { $tmpreadok=0; } elseif (empty($subfeature) && empty($user->rights->$feature->lire) && empty($user->rights->$feature->read)) { $tmpreadok=0; } @@ -263,7 +264,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f $nbko++; } } - elseif (! empty($feature) && ($feature!='user' && $feature!='usergroup')) // This is for old permissions + elseif (! empty($feature) && ($feature!='user' && $feature!='usergroup')) // This is permissions on 1 level { if (empty($user->rights->$feature->lire) && empty($user->rights->$feature->read) @@ -307,7 +308,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f { if (! $user->rights->banque->cheque) { $createok=0; $nbko++; } } - elseif (! empty($feature2)) // This should be used + elseif (! empty($feature2)) // This is for permissions on one level { foreach($feature2 as $subfeature) { @@ -317,7 +318,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f else { $createok=1; break; } // Break to bypass second test if the first is ok } } - elseif (! empty($feature)) // This is for old permissions ('creer' or 'write') + elseif (! empty($feature)) // This is for permissions on 2 levels ('creer' or 'write') { //print '
feature='.$feature.' creer='.$user->rights->$feature->creer.' write='.$user->rights->$feature->write; if (empty($user->rights->$feature->creer) @@ -384,7 +385,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f { if (! $user->rights->salaries->delete) $deleteok=0; } - elseif (! empty($feature2)) // This should be used for permissions on 2 levels + elseif (! empty($feature2)) // This is for permissions on 2 levels { foreach($feature2 as $subfeature) { @@ -392,7 +393,7 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f else { $deleteok=1; break; } // For bypass the second test if the first is ok } } - elseif (! empty($feature)) // This is used for permissions on 1 level + elseif (! empty($feature)) // This is used for permissions on 1 level { //print '
feature='.$feature.' creer='.$user->rights->$feature->supprimer.' write='.$user->rights->$feature->delete; if (empty($user->rights->$feature->supprimer) @@ -451,7 +452,7 @@ function checkUserAccessToObject($user, $featuresarray, $objectid = 0, $tableand if ($feature == 'project') $feature='projet'; if ($feature == 'task') $feature='projet_task'; - $check = array('adherent','banque','don','user','usergroup','product','produit','service','produit|service','categorie','resource','expensereport','holiday'); // Test on entity only (Objects with no link to company) + $check = array('adherent','banque','bom','don','user','usergroup','product','produit','service','produit|service','categorie','resource','expensereport','holiday'); // Test on entity only (Objects with no link to company) $checksoc = array('societe'); // Test for societe object $checkother = array('contact','agenda'); // Test on entity and link to third party. Allowed if link is empty (Ex: contacts...). $checkproject = array('projet','project'); // Test for project object diff --git a/htdocs/core/photos_resize.php b/htdocs/core/photos_resize.php index 2ecb127f3b2..47be8cdf974 100644 --- a/htdocs/core/photos_resize.php +++ b/htdocs/core/photos_resize.php @@ -53,6 +53,12 @@ elseif ($modulepart == 'project') if (! $user->rights->projet->lire) accessforbidden(); $accessallowed=1; } +elseif ($modulepart == 'bom') +{ + $result=restrictedArea($user, 'bom', $id, 'bom_bom'); + if (! $user->rights->bom->read) accessforbidden(); + $accessallowed=1; +} elseif ($modulepart == 'expensereport') { $result=restrictedArea($user, 'expensereport', $id, 'expensereport'); @@ -205,8 +211,19 @@ elseif ($modulepart == 'ticket') $dir=$conf->ticket->dir_output; // By default } } +elseif ($modulepart == 'bom') +{ + require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php'; + $object = new BOM($db); + if ($id > 0) + { + $result = $object->fetch($id); + if ($result <= 0) dol_print_error($db, 'Failed to load object'); + $dir=$conf->bom->dir_output; // By default + } +} else { - print 'Action crop for module part '.$modulepart.' is not supported yet.'; + print 'Action crop for modulepart = '.$modulepart.' is not supported yet.'; } if (empty($backtourl)) @@ -220,6 +237,7 @@ if (empty($backtourl)) elseif (in_array($modulepart, array('tax'))) $backtourl=DOL_URL_ROOT."/compta/sociales/document.php?id=".$id.'&file='.urldecode($_POST["file"]); elseif (in_array($modulepart, array('ticket'))) $backtourl=DOL_URL_ROOT."/ticket/document.php?id=".$id.'&file='.urldecode($_POST["file"]); elseif (in_array($modulepart, array('user'))) $backtourl=DOL_URL_ROOT."/user/document.php?id=".$id.'&file='.urldecode($_POST["file"]); + else $backtourl=DOL_URL_ROOT."/".$modulepart."/".$modulepart."_document.php?id=".$id.'&file='.urldecode($_POST["file"]); } diff --git a/htdocs/langs/en_US/mrp.lang b/htdocs/langs/en_US/mrp.lang index c4bb9193a33..360f4303f07 100644 --- a/htdocs/langs/en_US/mrp.lang +++ b/htdocs/langs/en_US/mrp.lang @@ -13,3 +13,5 @@ WatermarkOnDraftBOMs=Watermark on draft BOM ConfirmCloneBillOfMaterials=Are you sure you want to clone this bill of material ? ManufacturingEfficiency=Manufacturing efficiency ValueOfMeansLoss=Value of 0.95 means an average of 5%% of loss during the production +DeleteBillOfMaterials=Delete Bill Of Materials +ConfirmDeleteBillOfMaterials=Are you sure you want to delete this Bill Of Material? From 2be5e9615d57a0ad568be62f817e8c50ee1f7974 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 19:03:22 +0200 Subject: [PATCH 0800/1036] Fix look and field v10 --- htdocs/comm/action/card.php | 2 +- htdocs/core/lib/security.lib.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 71702c7b507..9381b186582 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -690,7 +690,7 @@ if ($action == 'create') dol_fiche_head(); - print '
'.$langs->trans("DateChequeReceived").''.$langs->trans("ChequeNumber")."'.$langs->trans("CheckTransmitter")."'.$langs->trans("Bank")."'.$langs->trans("Amount")."'.$langs->trans("Payment")."'.$langs->trans("LineRecord")."'.$langs->trans("Select")."
"; + print '
'.$langs->trans("DateChequeReceived").''.$langs->trans("ChequeNumber")."'.$langs->trans("CheckTransmitter")."'.$langs->trans("Bank")."'.$langs->trans("Amount")."'.$langs->trans("Payment")."'.$langs->trans("LineRecord")."'.$langs->trans("Select")."
"; if ($conf->use_javascript_ajax) print ''.$langs->trans("All").' / '.$langs->trans("None").''; print '
 '; + print ' '; if ($encaiss[$case]>0) { print price($encaiss[$case]); @@ -232,7 +232,7 @@ for ($mois = 1 ; $mois < 13 ; $mois++) print '
'.$langs->trans("Total")."'.price($totsorties[$annee]).''.price($totentrees[$annee]).''.price($totsorties[$annee]).''.price($totentrees[$annee]).'
' . $langs->trans("Piece") . '
'; - print $formaccounting->select_account($line->numero_compte, 'accountingaccount_number', 1, array (), 1, 1, ''); + print $formaccounting->select_account((GETPOSTISSET("accountingaccount_number") ? GETPOST("accountingaccount_number", "alpha") : $line->numero_compte), 'accountingaccount_number', 1, array (), 1, 1, ''); print ''; // TODO For the moment we keep a free input text instead of a combo. The select_auxaccount has problem because it does not // use setup of keypress to select thirdparty and this hang browser on large database. if (! empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { - print $formaccounting->select_auxaccount($line->subledger_account, 'subledger_account', 1); + print $formaccounting->select_auxaccount((GETPOSTISSET("subledger_account") ? GETPOST("subledger_account", "alpha") : $line->subledger_account), 'subledger_account', 1); } else { - print ''; + print 'subledger_account).'">'; } print 'label_operation). '">debit)) . '">credit)) . '">'; print '' . "\n"; print ''; @@ -672,21 +672,21 @@ if ($action == 'create') if ($action == "" || $action == 'add') { print '
'; - print $formaccounting->select_account($accountingaccount_number, 'accountingaccount_number', 1, array (), 1, 1, ''); + print $formaccounting->select_account('', 'accountingaccount_number', 1, array (), 1, 1, ''); print ''; // TODO For the moment we keep a fre input text instead of a combo. The select_auxaccount has problem because it does not // use setup of keypress to select thirdparty and this hang browser on large database. if (! empty($conf->global->ACCOUNTANCY_COMBO_FOR_AUX)) { - print $formaccounting->select_auxaccount($subledger_account, 'subledger_account', 1); + print $formaccounting->select_auxaccount('', 'subledger_account', 1); } else { print ''; } print ''; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) { - print ''; + print ''; } - print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) { - print ''; + print ''; } - print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; $formother->select_year($search_year, 'search_year', 1, 20, 5); print '
'; + print '
'; // Type of event if (! empty($conf->global->AGENDA_USE_EVENT_TYPE)) diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index 69d9173e212..051f3a5392a 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -252,7 +252,6 @@ function restrictedArea($user, $features, $objectid = 0, $tableandshare = '', $f $tmpreadok=1; foreach($feature2 as $subfeature) { - var_dump($subfeature); if ($subfeature == 'user' && $user->id == $objectid) continue; // A user can always read its own card if (! empty($subfeature) && empty($user->rights->$feature->$subfeature->lire) && empty($user->rights->$feature->$subfeature->read)) { $tmpreadok=0; } elseif (empty($subfeature) && empty($user->rights->$feature->lire) && empty($user->rights->$feature->read)) { $tmpreadok=0; } From 900e860f6dbf9cd8d6ccfb9997e8ae89e8e97baa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 12 Jun 2019 19:32:29 +0200 Subject: [PATCH 0801/1036] Fix list of events for BOM module --- htdocs/bom/bom_agenda.php | 10 +++++----- htdocs/comm/action/card.php | 8 ++++---- htdocs/core/lib/company.lib.php | 12 ++++++++++-- htdocs/modulebuilder/template/myobject_agenda.php | 12 ++++++------ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/htdocs/bom/bom_agenda.php b/htdocs/bom/bom_agenda.php index a4bf134e3ce..d7d86c50543 100644 --- a/htdocs/bom/bom_agenda.php +++ b/htdocs/bom/bom_agenda.php @@ -196,7 +196,7 @@ if ($object->id > 0) $objthirdparty=$object; $objcon=new stdClass(); - $out=''; + $out='&origin='.$object->element.'&originid='.$object->id; $permok=$user->rights->agenda->myactions->create; if ((! empty($objthirdparty->id) || ! empty($objcon->id)) && $permok) { @@ -227,9 +227,9 @@ if ($object->id > 0) if (! empty($conf->agenda->enabled) && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read) )) { - $param='&socid='.$socid; - if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; - if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + $param='&id='.$object->id.'&socid='.$socid; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); //print load_fiche_titre($langs->trans("ActionsOnBom"), '', ''); @@ -239,7 +239,7 @@ if ($object->id > 0) $filters['search_agenda_label']=$search_agenda_label; // TODO Replace this with same code than into list.php - //show_actions_done($conf,$langs,$db,$object,null,0,$actioncode, '', $filters, $sortfield, $sortorder); + show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder); } } diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 9381b186582..8e8d21c51b1 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -238,8 +238,8 @@ if ($action == 'add') $object->fulldayevent = (! empty($fulldayevent)?1:0); $object->location = GETPOST("location"); $object->label = trim(GETPOST('label')); - $object->fk_element = GETPOST("fk_element"); - $object->elementtype = GETPOST("elementtype"); + $object->fk_element = GETPOST("fk_element", 'int'); + $object->elementtype = GETPOST("elementtype", 'alpha'); if (! GETPOST('label')) { if (GETPOST('actioncode') == 'AC_RDV' && $contact->getFullName($langs)) @@ -349,7 +349,7 @@ if ($action == 'add') { $db->begin(); - // On cree l'action + // Creation of action/event $idaction=$object->create($user); if ($idaction > 0) @@ -857,7 +857,7 @@ if ($action == 'create') print '


'; - print '
'; + print '
'; if ($conf->societe->enabled) { diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 99344b12dc1..c3b9bcec2cf 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -1188,7 +1188,8 @@ function show_actions_todo($conf, $langs, $db, $filterobj, $objcon = '', $noprin } /** - * Show html area with actions (done or not, ignore the name of function) + * Show html area with actions (done or not, ignore the name of function). + * Note: Global parameter $param must be defined. * * @param Conf $conf Object conf * @param Translate $langs Object langs @@ -1208,7 +1209,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin global $user, $conf; global $form; - global $param; + global $param, $massactionbutton; dol_include_once('/comm/action/class/actioncomm.class.php'); @@ -1251,6 +1252,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') $sql.= ", o.ref"; elseif (is_object($filterobj) && get_class($filterobj) == 'Product') $sql.= ", o.ref"; elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') $sql.= ", o.ref"; + elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') $sql.= ", o.ref"; $sql.= " FROM ".MAIN_DB_PREFIX."actioncomm as a"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."user as u on u.rowid = a.fk_user_action"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_actioncomm as c ON a.fk_action = c.id"; @@ -1273,6 +1275,7 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin elseif (is_object($filterobj) && get_class($filterobj) == 'CommandeFournisseur') $sql.= ", ".MAIN_DB_PREFIX."commande_fournisseur as o"; elseif (is_object($filterobj) && get_class($filterobj) == 'Product') $sql.= ", ".MAIN_DB_PREFIX."product as o"; elseif (is_object($filterobj) && get_class($filterobj) == 'Ticket') $sql.= ", ".MAIN_DB_PREFIX."ticket as o"; + elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') $sql.= ", ".MAIN_DB_PREFIX."bom_bom as o"; $sql.= " WHERE a.entity IN (".getEntity('agenda').")"; if ($force_filter_contact === false) { @@ -1298,6 +1301,11 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon = '', $noprin $sql.= " AND a.fk_element = o.rowid AND a.elementtype = 'ticket'"; if ($filterobj->id) $sql.= " AND a.fk_element = ".$filterobj->id; } + elseif (is_object($filterobj) && get_class($filterobj) == 'BOM') + { + $sql.= " AND a.fk_element = o.rowid AND a.elementtype = 'bom'"; + if ($filterobj->id) $sql.= " AND a.fk_element = ".$filterobj->id; + } } // Condition on actioncode diff --git a/htdocs/modulebuilder/template/myobject_agenda.php b/htdocs/modulebuilder/template/myobject_agenda.php index 1f693282e5f..183781469ef 100644 --- a/htdocs/modulebuilder/template/myobject_agenda.php +++ b/htdocs/modulebuilder/template/myobject_agenda.php @@ -209,7 +209,7 @@ if ($object->id > 0) $objthirdparty=$object; $objcon=new stdClass(); - $out=''; + $out='&origin='.$object->element.'&originid='.$object->id; $permok=$user->rights->agenda->myactions->create; if ((! empty($objthirdparty->id) || ! empty($objcon->id)) && $permok) { @@ -240,19 +240,19 @@ if ($object->id > 0) if (! empty($conf->agenda->enabled) && (!empty($user->rights->agenda->myactions->read) || !empty($user->rights->agenda->allactions->read) )) { - $param='&socid='.$socid; - if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; - if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + $param='&id='.$object->id.'&socid='.$socid; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); - print load_fiche_titre($langs->trans("ActionsOnMyObject"), '', ''); + //print load_fiche_titre($langs->trans("ActionsOnMyObject"), '', ''); // List of all actions $filters=array(); $filters['search_agenda_label']=$search_agenda_label; // TODO Replace this with same code than into list.php - //show_actions_done($conf,$langs,$db,$object,null,0,$actioncode, '', $filters, $sortfield, $sortorder); + //show_actions_done($conf, $langs, $db, $object, null, 0, $actioncode, '', $filters, $sortfield, $sortorder); } } From a26c86878334b5a29e157ecd8dc83c1aa2c902ac Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Wed, 12 Jun 2019 22:05:10 +0200 Subject: [PATCH 0802/1036] Fix scrutinizer bugs --- .../barcode/doc/tcpdfbarcode.modules.php | 2 - .../doc/pdf_standard.modules.php | 81 ++++++++++--------- .../printsheet/doc/pdf_tcpdflabel.class.php | 16 ++-- htdocs/expedition/class/expedition.class.php | 6 +- .../fourn/class/fournisseur.product.class.php | 48 +++++------ .../product/class/html.formproduct.class.php | 34 ++++---- 6 files changed, 94 insertions(+), 93 deletions(-) diff --git a/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php b/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php index 1b39fe16095..3d2564591da 100644 --- a/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php +++ b/htdocs/core/modules/barcode/doc/tcpdfbarcode.modules.php @@ -116,7 +116,6 @@ class modTcpdfbarcode extends ModeleBarCode $_GET["code"]=$code; $_GET["type"]=$encoding; - $_GET["height"]=$height; $_GET["readable"]=$readable; if ($code) { @@ -166,7 +165,6 @@ class modTcpdfbarcode extends ModeleBarCode $_GET["code"]=$code; $_GET["type"]=$encoding; - $_GET["height"]=$height; $_GET["readable"]=$readable; if ($code) { diff --git a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php index 8bb3eaa7804..e0bba62df3b 100644 --- a/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/expensereport/doc/pdf_standard.modules.php @@ -117,13 +117,13 @@ class pdf_standard extends ModeleExpenseReport public $emetteur; - /** - * Constructor - * - * @param DoliDB $db Database handler - */ - public function __construct($db) - { + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { global $conf, $langs, $mysoc, $user; // Translations @@ -172,12 +172,12 @@ class pdf_standard extends ModeleExpenseReport $this->posxup=145; $this->posxqty=168; $this->postotalttc=178; - // if (empty($conf->projet->enabled)) { - // $this->posxtva-=20; - // $this->posxup-=20; - // $this->posxqty-=20; - // $this->postotalttc-=20; - // } + // if (empty($conf->projet->enabled)) { + // $this->posxtva-=20; + // $this->posxup-=20; + // $this->posxqty-=20; + // $this->postotalttc-=20; + // } if ($this->page_largeur < 210) // To work with US executive format { $this->posxdate-=20; @@ -196,19 +196,19 @@ class pdf_standard extends ModeleExpenseReport } - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * Function to build pdf onto disk - * - * @param Object $object Object to generate - * @param Translate $outputlangs Lang output object - * @param string $srctemplatepath Full path of source filename for generator using a template file - * @param int $hidedetails Do not show line details - * @param int $hidedesc Do not show desc - * @param int $hideref Do not show ref - * @return int 1=OK, 0=KO + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Function to build pdf onto disk + * + * @param Object $object Object to generate + * @param Translate $outputlangs Lang output object + * @param string $srctemplatepath Full path of source filename for generator using a template file + * @param int $hidedetails Do not show line details + * @param int $hidedesc Do not show desc + * @param int $hideref Do not show ref + * @return int 1=OK, 0=KO */ - public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0) + public function write_file($object, $outputlangs, $srctemplatepath = '', $hidedetails = 0, $hidedesc = 0, $hideref = 0) { // phpcs:enable global $user, $langs, $conf, $mysoc, $db, $hookmanager; @@ -501,9 +501,9 @@ class pdf_standard extends ModeleExpenseReport $posy=$this->tablePayments($pdf, $object, $posy_start_of_totals, $outputlangs); } - // Pied de page + // Page footer $this->_pagefoot($pdf, $object, $outputlangs); - if (method_exists($pdf, 'AliasNbPages')) $pdf->AliasNbPage(); + if (method_exists($pdf, 'AliasNbPages')) $pdf->AliasNbPages(); $pdf->Close(); @@ -540,17 +540,17 @@ class pdf_standard extends ModeleExpenseReport } } - /** - * @param TCPDF $pdf Object PDF - * @param Object $object Object to show - * @param int $linenumber line number - * @param int $curY current y position - * @param int $default_font_size default siez of font - * @param Translate $outputlangs Object lang for output - * @param int $hidedetails Hide details (0=no, 1=yes, 2=just special lines) - * @return void - */ - private function printLine(&$pdf, $object, $linenumber, $curY, $default_font_size, $outputlangs, $hidedetails = 0) + /** + * @param TCPDF $pdf Object PDF + * @param Object $object Object to show + * @param int $linenumber line number + * @param int $curY current y position + * @param int $default_font_size default siez of font + * @param Translate $outputlangs Object lang for output + * @param int $hidedetails Hide details (0=no, 1=yes, 2=just special lines) + * @return void + */ + private function printLine(&$pdf, $object, $linenumber, $curY, $default_font_size, $outputlangs, $hidedetails = 0) { global $conf; $pdf->SetFont('', '', $default_font_size - 1); @@ -618,7 +618,7 @@ class pdf_standard extends ModeleExpenseReport } $comment .= $object->lines[$linenumber]->comments; $pdf->writeHTMLCell($this->posxtva-$this->posxcomment-0.8, 4, $this->posxcomment-1, $curY, $comment, 0, 1); - } + } /** * Show top header of page. @@ -846,7 +846,7 @@ class pdf_standard extends ModeleExpenseReport } } } - } + } /** * Show table for lines @@ -1024,6 +1024,7 @@ class pdf_standard extends ModeleExpenseReport if ($resql) { $num = $this->db->num_rows($resql); + $totalpaid = 0; $i=0; while ($i < $num) { $y+=$tab3_height; diff --git a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php index 7670a623c49..b17403e93e7 100644 --- a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php +++ b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php @@ -154,7 +154,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator $widthtouse = $maxwidthtouse; $heighttouse = $maxheighttouse; $logoHeight = $heighttouse; - $logoWidth = $heighttouse; + $logoWidth = $widthtouse; //var_dump($this->_Width.'x'.$this->_Height.' with border and scale '.$imgscale.' => max '.$maxwidthtouse.'x'.$maxheighttouse.' => We use '.$widthtouse.'x'.$heighttouse);exit; @@ -175,9 +175,11 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif ($textleft!='' && $textright!='') // left and right part { + $logoHeight = $heighttouse/2; + $logoWidth = $widthtouse/2; if (($textleft == '%LOGO%' || $textleft == '%PHOTO%' || $textleft == '%BARCODE%') && !strstr($textright, '%') ) // left part logo/barcode right part text { - if ($textleft == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $widthtouse/2, 0); + if ($textleft == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $logoWidth, $logoHeight); elseif ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft, $_PosY+$ytop, $widthtouse/2, $heighttouse); @@ -187,7 +189,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif (($textright == '%LOGO%' || $textright == '%PHOTO%' || $textright == '%BARCODE%') && !strstr($textleft, '%')) // right part logo/barcode left part text { - if ($textright == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+($widthtouse/2), $_PosY+$ytop, $widthtouse/2, 0); + if ($textright == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+($widthtouse/2), $_PosY+$ytop, $logoWidth, $logoHeight); elseif ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+($widthtouse/2), $_PosY+$ytop, $widthtouse/2, $heighttouse); @@ -197,21 +199,21 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif ($textleft == '%LOGO%') // left part logo right part text/barcode { - if ($logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, 0, $logoHeight); + if ($logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $logoWidth, $logoHeight); if ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft+$logoWidth+1, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); } else { $pdf->SetXY($_PosX+$xleft+$logoWidth+1, $_PosY+$ytop); - $pdf->MultiCell($widthtouse-$logoWidth1-1, $this->_Line_Height, $outputlangs->convToOutputCharset($textright), 0, 'R'); + $pdf->MultiCell($widthtouse-$logoWidth-1, $this->_Line_Height, $outputlangs->convToOutputCharset($textright), 0, 'R'); } } elseif ($textright == '%LOGO%') // right part logo left part text/barcode { - if ($logo) $pdf->Image($logo, $_PosX+$xleft+$widthtouse-$logoWidth+1, $_PosY+$ytop, 0, $logoHeight); + if ($logo) $pdf->Image($logo, $_PosX+$xleft+$widthtouse-$logoWidth+1, $_PosY+$ytop, $logoWidth, $logoHeight); if ($code && !empty($encoding)) { - $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); + $this->writeBarcode($pdf, $code, $encoding, $is2d, $_Pos%X+$xleft, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); } else { $pdf->SetXY($_PosX+$xleft, $_PosY+$ytop); $pdf->MultiCell($widthtouse-$logoWidth-1, $this->_Line_Height, $outputlangs->convToOutputCharset($textleft), 0, 'L'); diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index a270af13217..1ff48a67107 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -1398,6 +1398,8 @@ class Expedition extends CommonObject $this->total_localtax1 = 0; $this->total_localtax2 = 0; + $line = new ExpeditionLigne($this->db); + while ($i < $num) { $obj = $this->db->fetch_object($resql); @@ -2562,8 +2564,6 @@ class ExpeditionLigne extends CommonObjectLine $this->error = 'ErrorMandatoryParametersNotProvided'; return -1; } - // Clean parameters - if (empty($this->entrepot_id)) $this->entrepot_id='null'; $this->db->begin(); @@ -2574,7 +2574,7 @@ class ExpeditionLigne extends CommonObjectLine $sql.= ", qty"; $sql.= ") VALUES ("; $sql.= $this->fk_expedition; - $sql.= ", ".$this->entrepot_id; + $sql.= ", ".(empty($this->entrepot_id) ? 'NULL' : $this->entrepot_id); $sql.= ", ".$this->fk_origin_line; $sql.= ", ".$this->qty; $sql.= ")"; diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index 45595471701..f2384b13cf2 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -247,10 +247,10 @@ class ProductFournisseur extends Product if (empty($supplier_reputation) || $supplier_reputation == -1) $supplier_reputation=''; if ($delivery_time_days != '' && ! is_numeric($delivery_time_days)) $delivery_time_days = ''; if ($price_base_type == 'TTC') - { - $ttx = $tva_tx; - $buyprice = $buyprice/(1+($ttx/100)); - } + { + $ttx = $tva_tx; + $buyprice = $buyprice/(1+($ttx/100)); + } // Multicurrency if ($conf->multicurrency->enabled) { @@ -259,10 +259,10 @@ class ProductFournisseur extends Product if (empty($multicurrency_buyprice)) $multicurrency_buyprice=0; if ($multicurrency_price_base_type == 'TTC') - { - $ttx = $tva_tx; - $multicurrency_buyprice = $multicurrency_buyprice/(1+($ttx/100)); - } + { + $ttx = $tva_tx; + $multicurrency_buyprice = $multicurrency_buyprice/(1+($ttx/100)); + } $multicurrency_buyprice=price2num($multicurrency_buyprice, 'MU'); $multicurrency_unitBuyPrice=price2num($multicurrency_buyprice/$qty, 'MU'); @@ -369,7 +369,7 @@ class ProductFournisseur extends Product // End call triggers if (! $error && empty($conf->global->PRODUCT_PRICE_SUPPLIER_NO_LOG)) { - $result = $this->logPrice($user, $now, $buyprice, $qty, $multicurrency_buyprice, $multicurrency_unitBuyPrice, $multicurrency_tx, $fk_multicurrenc, $multicurrency_code); + $result = $this->logPrice($user, $now, $buyprice, $qty, $multicurrency_buyprice, $multicurrency_unitBuyPrice, $multicurrency_tx, $fk_multicurrency, $multicurrency_code); if ($result < 0) { $error++; } @@ -911,21 +911,21 @@ class ProductFournisseur extends Product return $out; } - /** - * Function used to replace a thirdparty id with another one. - * - * @param DoliDB $db Database handler - * @param int $origin_id Old thirdparty id - * @param int $dest_id New thirdparty id - * @return bool - */ - public static function replaceThirdparty(DoliDB $db, $origin_id, $dest_id) - { - $tables = array( - 'product_fournisseur_price' - ); + /** + * Function used to replace a thirdparty id with another one. + * + * @param DoliDB $db Database handler + * @param int $origin_id Old thirdparty id + * @param int $dest_id New thirdparty id + * @return bool + */ + public static function replaceThirdparty(DoliDB $db, $origin_id, $dest_id) + { + $tables = array( + 'product_fournisseur_price' + ); - return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); + return CommonObject::commonReplaceThirdparty($db, $origin_id, $dest_id, $tables); } /** @@ -1089,7 +1089,7 @@ class ProductFournisseur extends Product * * @return int < 0 NOK > 0 OK */ - private function logPrice($user, $datec, $buyprice, $qty, $multicurrency_buyprice, $multicurrency_unitBuyPrice, $multicurrency_tx, $fk_multicurrency, $multicurrency_code) + private function logPrice($user, $datec, $buyprice, $qty, $multicurrency_buyprice = null, $multicurrency_unitBuyPrice = null, $multicurrency_tx = null, $fk_multicurrency = null, $multicurrency_code = null) { // Add record into log table $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_fournisseur_price_log("; diff --git a/htdocs/product/class/html.formproduct.class.php b/htdocs/product/class/html.formproduct.class.php index b4347f82941..a0ebda88cd9 100644 --- a/htdocs/product/class/html.formproduct.class.php +++ b/htdocs/product/class/html.formproduct.class.php @@ -59,12 +59,12 @@ class FormProduct * Load in cache array list of warehouses * If fk_product is not 0, we do not use cache * - * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. - * @param string $batch Add quantity of batch stock in label for product with batch name batch, batch name precedes batch_id. Nothing if ''. - * @param string $status warehouse status filter, following comma separated filter options can be used - * 'warehouseopen' = select products from open warehouses, - * 'warehouseclosed' = select products from closed warehouses, - * 'warehouseinternal' = select products from warehouses for internal correct/transfer only + * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. + * @param string $batch Add quantity of batch stock in label for product with batch name batch, batch name precedes batch_id. Nothing if ''. + * @param string $status warehouse status filter, following comma separated filter options can be used + * 'warehouseopen' = select products from open warehouses, + * 'warehouseclosed' = select products from closed warehouses, + * 'warehouseinternal' = select products from warehouses for internal correct/transfer only * @param boolean $sumStock sum total stock of a warehouse, default true * @param array $exclude warehouses ids to exclude * @return int Nb of loaded lines, 0 if already loaded, <0 if KO @@ -114,9 +114,9 @@ class FormProduct { $sql.= " AND ps.fk_product = '".$fk_product."'"; if (!empty($batch)) - { - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_batch as pb on pb.fk_product_stock = ps.rowid AND pb.batch = '".$batch."'"; - } + { + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_batch as pb on pb.fk_product_stock = ps.rowid AND pb.batch = '".$batch."'"; + } } $sql.= " WHERE e.entity IN (".getEntity('stock').")"; if (count($warehouseStatus)) @@ -173,9 +173,9 @@ class FormProduct * @param String $final_label full label with all parents, separated by ' >> ' (completed on each call) * @return String full label with all parents, separated by ' >> ' */ - private function get_parent_path($tab, $final_label = '') - { - //phpcs:enable + private function get_parent_path($tab, $final_label = '') + { + //phpcs:enable if(empty($final_label)) $final_label = $tab['label']; if(empty($tab['parent_id'])) return $final_label; @@ -195,9 +195,9 @@ class FormProduct * @param int $selected Id of preselected warehouse ('' for no value, 'ifone'=select value if one value otherwise no value) * @param string $htmlname Name of html select html * @param string $filterstatus warehouse status filter, following comma separated filter options can be used - * 'warehouseopen' = select products from open warehouses, - * 'warehouseclosed' = select products from closed warehouses, - * 'warehouseinternal' = select products from warehouses for internal correct/transfer only + * 'warehouseopen' = select products from open warehouses, + * 'warehouseclosed' = select products from closed warehouses, + * 'warehouseinternal' = select products from warehouses for internal correct/transfer only * @param int $empty 1=Can be empty, 0 if not * @param int $disabled 1=Select is disabled * @param int $fk_product Add quantity of stock in label for product with id fk_product. Nothing if 0. @@ -379,9 +379,9 @@ class FormProduct */ public function selectLotStock($selected = '', $htmlname = 'batch_id', $filterstatus = '', $empty = 0, $disabled = 0, $fk_product = 0, $fk_entrepot = 0, $objectLines = array(), $empty_label = '', $forcecombo = 0, $events = array(), $morecss = 'minwidth200') { - global $langs; + global $conf, $langs; - dol_syslog(get_class($this)."::selectLot $selected, $htmlname, $filterstatus, $empty, $disabled, $fk_product, $fk_entrepot, $empty_label, $showstock, $forcecombo, $morecss", LOG_DEBUG); + dol_syslog(get_class($this)."::selectLot $selected, $htmlname, $filterstatus, $empty, $disabled, $fk_product, $fk_entrepot, $empty_label, $forcecombo, $morecss", LOG_DEBUG); $out=''; $productIdArray = array(); From 3f63be60457e0440c777f54769bd527dd369eb94 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Wed, 12 Jun 2019 22:10:40 +0200 Subject: [PATCH 0803/1036] fix typo --- htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php index b17403e93e7..a6d8aa19161 100644 --- a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php +++ b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php @@ -213,7 +213,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator if ($logo) $pdf->Image($logo, $_PosX+$xleft+$widthtouse-$logoWidth+1, $_PosY+$ytop, $logoWidth, $logoHeight); if ($code && !empty($encoding)) { - $this->writeBarcode($pdf, $code, $encoding, $is2d, $_Pos%X+$xleft, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); + $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); } else { $pdf->SetXY($_PosX+$xleft, $_PosY+$ytop); $pdf->MultiCell($widthtouse-$logoWidth-1, $this->_Line_Height, $outputlangs->convToOutputCharset($textleft), 0, 'L'); From 989cf823dd6858936e8fa33660c8c092fecd85f5 Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Wed, 12 Jun 2019 22:55:08 +0200 Subject: [PATCH 0804/1036] Fix scrutinizer --- htdocs/expedition/class/expedition.class.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index e1cabb72e31..e4f2ce31acd 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -446,7 +446,9 @@ class Expedition extends CommonObject */ public function create_line($entrepot_id, $origin_line_id, $qty, $array_options = 0) { - //phpcs:enable + //phpcs:enable + global $user; + $expeditionline = new ExpeditionLigne($this->db); $expeditionline->fk_expedition = $this->id; $expeditionline->entrepot_id = $entrepot_id; @@ -454,7 +456,7 @@ class Expedition extends CommonObject $expeditionline->qty = $qty; $expeditionline->array_options = $array_options; - if (($lineId = $expeditionline->insert()) < 0) + if (($lineId = $expeditionline->insert($user)) < 0) { $this->errors[]=$expeditionline->error; } @@ -2552,7 +2554,7 @@ class ExpeditionLigne extends CommonObjectLine * @param int $notrigger 1 = disable triggers * @return int <0 if KO, line id >0 if OK */ - public function insert($user = null, $notrigger = 0) + public function insert($user, $notrigger = 0) { global $langs, $conf; From 4cbfb67d63b10f6ac189c809ba6c95c1fbff62ae Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 09:59:10 +0200 Subject: [PATCH 0805/1036] Update html.formother.class.php --- htdocs/core/class/html.formother.class.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index b3d41d80ffb..6cf3c816a24 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -374,7 +374,6 @@ class FormOther */ function select_salesrepresentatives($selected, $htmlname, $user, $showstatus=0, $showempty=1, $morecss='') { - // phpcs:enable global $conf, $langs; $langs->load('users'); @@ -395,7 +394,7 @@ class FormOther if ($showempty) $out.=''; // Get list of users allowed to be viewed - $sql_usr = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.statut, u.login"; + $sql_usr = "SELECT u.rowid, u.lastname, u.firstname, u.statut, u.login"; $sql_usr.= " FROM ".MAIN_DB_PREFIX."user as u"; if (! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) @@ -403,10 +402,9 @@ class FormOther if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) { $sql_usr.= " WHERE u.entity IS NOT NULL"; // Show all users } else { - $sql_usr.= ",".MAIN_DB_PREFIX."usergroup_user as ug"; - $sql_usr.= " WHERE ((ug.fk_user = u.rowid"; - $sql_usr.= " AND ug.entity IN (".getEntity('user')."))"; - $sql_usr.= " OR u.entity = 0)"; // Show always superadmin + $sql_usr.= ", + $sql_usr.= " WHERE EXISTS (SELECT ug.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug WHERE u.rowid = ug.fk_user AND ug.entity IN (".getEntity('user')."))"; + $sql_usr.= " OR u.entity = 0"; // Show always superadmin } } else @@ -428,7 +426,7 @@ class FormOther if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) { $sql_usr.= " WHERE u2.entity IS NOT NULL"; // Show all users } else { - $sql_usr.= " WHERE EXISTS (SELECT ug2.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug2 WHERE u2.rowid = ug2.fk_user AND ug2.entity IN (".getEntity('user').") )"; + $sql_usr.= " WHERE EXISTS (SELECT ug2.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug2 WHERE u2.rowid = ug2.fk_user AND ug2.entity IN (".getEntity('user')."))"; } } else From 2bc821d9003d80ed7309375d910c55917be9fd1c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 10:08:35 +0200 Subject: [PATCH 0806/1036] Try to keep proportions of logo --- htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php index a6d8aa19161..4384bd49cf6 100644 --- a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php +++ b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php @@ -179,7 +179,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator $logoWidth = $widthtouse/2; if (($textleft == '%LOGO%' || $textleft == '%PHOTO%' || $textleft == '%BARCODE%') && !strstr($textright, '%') ) // left part logo/barcode right part text { - if ($textleft == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $logoWidth, $logoHeight); + if ($textleft == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $logoWidth, 0); elseif ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft, $_PosY+$ytop, $widthtouse/2, $heighttouse); @@ -189,7 +189,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif (($textright == '%LOGO%' || $textright == '%PHOTO%' || $textright == '%BARCODE%') && !strstr($textleft, '%')) // right part logo/barcode left part text { - if ($textright == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+($widthtouse/2), $_PosY+$ytop, $logoWidth, $logoHeight); + if ($textright == '%LOGO%' && $logo) $pdf->Image($logo, $_PosX+($widthtouse/2), $_PosY+$ytop, $logoWidth, 0); elseif ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+($widthtouse/2), $_PosY+$ytop, $widthtouse/2, $heighttouse); From ab9742f4df2ced56a1513289bd1d99829cc3114d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 10:09:20 +0200 Subject: [PATCH 0807/1036] Try to keep proportion of logo --- htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php index 4384bd49cf6..f6bb3bc46a7 100644 --- a/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php +++ b/htdocs/core/modules/printsheet/doc/pdf_tcpdflabel.class.php @@ -199,7 +199,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif ($textleft == '%LOGO%') // left part logo right part text/barcode { - if ($logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, $logoWidth, $logoHeight); + if ($logo) $pdf->Image($logo, $_PosX+$xleft, $_PosY+$ytop, 0, $logoHeight); if ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft+$logoWidth+1, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); @@ -210,7 +210,7 @@ class pdf_tcpdflabel extends CommonStickerGenerator } elseif ($textright == '%LOGO%') // right part logo left part text/barcode { - if ($logo) $pdf->Image($logo, $_PosX+$xleft+$widthtouse-$logoWidth+1, $_PosY+$ytop, $logoWidth, $logoHeight); + if ($logo) $pdf->Image($logo, $_PosX+$xleft+$widthtouse-$logoWidth+1, $_PosY+$ytop, 0, $logoHeight); if ($code && !empty($encoding)) { $this->writeBarcode($pdf, $code, $encoding, $is2d, $_PosX+$xleft, $_PosY+$ytop, $widthtouse-$logoWidth-1, $heighttouse); From 28218a00b384a3c3071c067500cdc4e877d7e2f9 Mon Sep 17 00:00:00 2001 From: gauthier Date: Thu, 13 Jun 2019 11:01:12 +0200 Subject: [PATCH 0808/1036] FIX : syntax error --- htdocs/core/class/html.formother.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index 6cf3c816a24..79aa4cc8c77 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -402,7 +402,6 @@ class FormOther if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) { $sql_usr.= " WHERE u.entity IS NOT NULL"; // Show all users } else { - $sql_usr.= ", $sql_usr.= " WHERE EXISTS (SELECT ug.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug WHERE u.rowid = ug.fk_user AND ug.entity IN (".getEntity('user')."))"; $sql_usr.= " OR u.entity = 0"; // Show always superadmin } From 04a085e4f7795a11440d13a3ab95f62296f8ebfb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 11:07:08 +0200 Subject: [PATCH 0809/1036] Update doc --- COPYRIGHT | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index 4ce5efff40b..ea0c6453486 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -14,15 +14,14 @@ Component Version License GPL Compatible PHP libraries: AdoDb-Date 0.36 Modified BSD License Yes Date convertion (not into rpm package) CKEditor 4.11.4 LGPL-2.1+ Yes Editor WYSIWYG -PHPDebugBar 1.15.0 MIT License Yes Used only by the module "debugbar" for developers EvalMath 1.0 BSD Yes Safe math expressions evaluation Escpos-php ? MIT License Yes Thermal receipt printer library, for use with ESC/POS compatible printers GeoIP 1.4 LGPL-2.1+ Yes Sample code to make geoip convert (not into deb package) Mobiledetect 2.8.83 MIT License Yes Detect mobile devices browsers NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package) PEAR Mail_MIME 1.8.9 BSD Yes NuSoap dependency -odtPHP 1.0.1 GPL-2+ Yes Library to build/edit ODT files ParseDown 1.6 MIT License Yes Markdown parser +PHPDebugBar 1.15.0 MIT License Yes Used only by the module "debugbar" for developers PHPExcel 1.8.1 LGPL-2.1+ Yes Read/Write XLS files, read ODS files PHPSpreadSheet ? LGPL-2.1+ Yes Read/Write XLS files, read ODS files php-iban 1.4.7 LGPL-3+ Yes Parse and validate IBAN (and IIBAN) bank account information in PHP From 4b26702516bec66953ae9187c48ad51e515473a1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 11:07:38 +0200 Subject: [PATCH 0810/1036] code comment --- htdocs/core/class/html.formfile.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index b729ad51fc5..419862229e1 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1040,9 +1040,9 @@ class FormFile * @param string $relativepath Relative path of docs (autodefined if not provided), relative to module dir, not to MAIN_DATA_ROOT. * @param int $permonobject Permission on object (so permission to delete or crop document) * @param int $useinecm Change output for use in ecm module: - * 0 or 6: Add a preview column. Show also a rename and crop button. + * 0 or 6: Add a preview column. Show also a rename button. Show also a crop button (if modulepart into a specific list) * 1: Add link to edit ECM entry - * 2: Add rename and crop file + * 2: Add rename and crop link * 4: Add a preview column * 5: Add link to edit ECM entry and Add a preview column * @param string $textifempty Text to show if filearray is empty ('NoFileFound' if not defined) From 319bc7ec8a1f23908063a80e50de989f6d392a72 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 12:12:20 +0200 Subject: [PATCH 0811/1036] Fix syntax error --- htdocs/core/class/html.formother.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index 6cf3c816a24..79aa4cc8c77 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -402,7 +402,6 @@ class FormOther if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) { $sql_usr.= " WHERE u.entity IS NOT NULL"; // Show all users } else { - $sql_usr.= ", $sql_usr.= " WHERE EXISTS (SELECT ug.fk_user FROM ".MAIN_DB_PREFIX."usergroup_user as ug WHERE u.rowid = ug.fk_user AND ug.entity IN (".getEntity('user')."))"; $sql_usr.= " OR u.entity = 0"; // Show always superadmin } From 357c5244f7daa8a3a7662676364221b604798280 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 13:26:35 +0200 Subject: [PATCH 0812/1036] Fix phpcs --- htdocs/core/actions_massactions.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 8192f85f44f..9017ece676e 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -281,7 +281,7 @@ if (! $error && $massaction == 'confirm_presend') // For supplier invoices, we use the file provided by supplier, not the one we generate if ($objectobj->element == 'invoice_supplier') { - $fileparams = dol_most_recent_file($uploaddir . '/' . get_exdir($objectobj->id,2,0,0,$objectobj,$objectobj->element).$objectobj->ref, preg_quote($objectobj->ref,'/').'([^\-])+'); + $fileparams = dol_most_recent_file($uploaddir.'/'.get_exdir($objectobj->id, 2, 0, 0, $objectobj, $objectobj->element).$objectobj->ref, preg_quote($objectobj->ref, '/').'([^\-])+'); $file = $fileparams['fullname']; } From 53be6492b84043f49ea39fc5e0cb5a2624f76728 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 14:20:13 +0200 Subject: [PATCH 0813/1036] Finish module BOM --- htdocs/bom/bom_card.php | 29 +++ htdocs/bom/class/bom.class.php | 10 +- htdocs/bom/tpl/objectline_create.tpl.php | 17 +- htdocs/bom/tpl/objectline_edit.tpl.php | 244 +++-------------------- 4 files changed, 70 insertions(+), 230 deletions(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index 15a7385f891..c2ed2ca6705 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -145,6 +145,35 @@ if (empty($reshook)) $action = ''; } } + + // Add line + if ($action == 'updateline' && $user->rights->bom->write) + { + $langs->load('errors'); + $error = 0; + + // Set if we used free entry or predefined product + $qty=GETPOST('qty', 'int'); + $efficiency=GETPOST('efficiency', 'int'); + + if ($qty == '') { + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Qty')), null, 'errors'); + $error++; + } + + $bomline = new BOMLine($db); + $bomline->fetch($lineid); + $bomline->qty = $qty; + $bomline->efficiency = $efficiency; + + $result = $bomline->update($user); + if ($result <= 0) + { + setEventMessages($bomline->error, $bomline->errors, 'errors'); + $action = ''; + } + } + } diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index e7083e767a2..731136fb7f4 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -203,6 +203,8 @@ class BOM extends CommonObject */ public function create(User $user, $notrigger = false) { + if ($this->efficiency < 0 || $this->efficiency > 1) $this->efficiency = 1; + return $this->createCommon($user, $notrigger); } @@ -411,6 +413,8 @@ class BOM extends CommonObject */ public function update(User $user, $notrigger = false) { + if ($this->efficiency < 0 || $this->efficiency > 1) $this->efficiency = 1; + return $this->updateCommon($user, $notrigger); } @@ -1100,6 +1104,8 @@ class BOMLine extends CommonObject */ public function create(User $user, $notrigger = false) { + if ($this->efficiency < 0 || $this->efficiency > 1) $this->efficiency = 1; + return $this->createCommon($user, $notrigger); } @@ -1201,6 +1207,8 @@ class BOMLine extends CommonObject */ public function update(User $user, $notrigger = false) { + if ($this->efficiency < 0 || $this->efficiency > 1) $this->efficiency = 1; + return $this->updateCommon($user, $notrigger); } @@ -1230,8 +1238,6 @@ class BOMLine extends CommonObject public function getNomUrl($withpicto = 0, $option = '', $notooltip = 0, $morecss = '', $save_lastsearch_value = -1) { global $db, $conf, $langs, $hookmanager; - global $dolibarr_main_authentication, $dolibarr_main_demo; - global $menumanager; if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips diff --git a/htdocs/bom/tpl/objectline_create.tpl.php b/htdocs/bom/tpl/objectline_create.tpl.php index 0101024df40..e266c142480 100644 --- a/htdocs/bom/tpl/objectline_create.tpl.php +++ b/htdocs/bom/tpl/objectline_create.tpl.php @@ -26,10 +26,7 @@ * $object (invoice, order, ...) * $conf * $langs - * $dateSelector * $forceall (0 by default, 1 for supplier invoices/orders) - * $senderissupplier (0 by default, 1 or 2 for supplier invoices/orders) - * $inputalsopricewithtax (0 by default, 1 to also show column with unit price including tax) */ // Protection to avoid direct call of template @@ -39,20 +36,13 @@ if (empty($object) || ! is_object($object)) { } -if (! isset($dateSelector)) global $dateSelector; // Take global var only if not already defined into function calling (for example formAddObjectLine) -global $forceall, $forcetoshowtitlelines, $senderissupplier, $inputalsopricewithtax; +global $forceall, $forcetoshowtitlelines; -if (! isset($dateSelector)) $dateSelector=1; // For backward compatibility -elseif (empty($dateSelector)) $dateSelector=0; if (empty($forceall)) $forceall=0; -if (empty($senderissupplier)) $senderissupplier=0; -if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; // Define colspan for the button 'Add' $colspan = 3; // Columns: total ht + col edit + col delete -if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) $colspan++;//Add column for Total (currency) if required -if (in_array($object->element, array('propal','commande','order','facture','facturerec','invoice','supplier_proposal','order_supplier','invoice_supplier'))) $colspan++; // With this, there is a column move button //print $object->element; // Lines for extrafield @@ -135,11 +125,6 @@ if ($nolinesbefore) { print $form->selectUnits($line->fk_unit, "units"); print ''; } - $remise_percent = $buyer->remise_percent; - if($object->element == 'supplier_proposal' || $object->element == 'order_supplier' || $object->element == 'invoice_supplier') - { - $remise_percent = $seller->remise_supplier_percent; - } $coldisplay++; ?> diff --git a/htdocs/bom/tpl/objectline_edit.tpl.php b/htdocs/bom/tpl/objectline_edit.tpl.php index 3763b771854..2c099ab89f8 100644 --- a/htdocs/bom/tpl/objectline_edit.tpl.php +++ b/htdocs/bom/tpl/objectline_edit.tpl.php @@ -39,18 +39,16 @@ if (empty($object) || ! is_object($object)) } -global $forceall, $senderissupplier, $inputalsopricewithtax; -if (empty($dateSelector)) $dateSelector=0; +global $forceall; + if (empty($forceall)) $forceall=0; -if (empty($senderissupplier)) $senderissupplier=0; -if (empty($inputalsopricewithtax)) $inputalsopricewithtax=0; // Define colspan for the button 'Add' -$colspan = 3; // Col total ht + col edit + col delete -if (! empty($inputalsopricewithtax)) $colspan++; // We add 1 if col total ttc -if (in_array($object->element, array('propal','supplier_proposal','facture','facturerec','invoice','commande','order','order_supplier','invoice_supplier'))) $colspan++; // With this, there is a column move button -if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) $colspan+=2; +$colspan = 3; // Columns: total ht + col edit + col delete + +// Lines for extrafield +$objectline = new BOMLine($this->db); ?> @@ -59,7 +57,9 @@ if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf- $coldisplay=0; ?> - global->MAIN_VIEW_LINE_NUMBER)) { ?> + global->MAIN_VIEW_LINE_NUMBER)) { ?> special_code; ?>"> - fk_product > 0) { ?> - - fk_parent_line > 0) echo img_picto('', 'rightarrow'); - ?> - - product_type==1) echo img_object($langs->trans('ShowService'), 'service'); - else print img_object($langs->trans('ShowProduct'), 'product'); - echo ' '.$line->ref; - ?> - - product_label); - ?> - -

- - - fk_product > 0) { + $tmpproduct = new Product($object->db); + $tmpproduct->fetch($line->fk_product); + print $tmpproduct->getNomUrl(1); + } + if (is_object($hookmanager)) { $fk_parent_line = (GETPOST('fk_parent_line') ? GETPOST('fk_parent_line') : $line->fk_parent_line); @@ -106,220 +93,53 @@ $coldisplay=0; element == 'supplier_proposal' || $object->element == 'order_supplier' || $object->element == 'invoice_supplier') // We must have same test in printObjectLines + /*if ($object->element == 'supplier_proposal' || $object->element == 'order_supplier' || $object->element == 'invoice_supplier') // We must have same test in printObjectLines { $coldisplay++; ?> fk_prev_id == null) { - print ''; - } else { - print ''; - } - - $coldisplay++; - print ''; - - if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) { - $coldisplay++; - print ''; - } - - if ($inputalsopricewithtax) - { - $coldisplay++; - print ''; - } ?> - global->PRODUCT_USE_UNITS) { $coldisplay++; - print ''; } + + $coldisplay++; ?> + + - info_bits & 2) != 2) { - print 'fk_prev_id != null ) print ' readonly'; - print '>%'; - } else { ?> -   - - - - - showOptionals($extrafieldsline, 'edit', array('style'=>$bc[$var],'colspan'=>$coldisplay), '', '', empty($conf->global->MAIN_EXTRAFIELDS_IN_ONE_TD)?0:1); +if (is_object($objectline)) { + print $objectline->showOptionals($extrafieldsline, 'edit', array('style'=>$bcnd[$var], 'colspan'=>$coldisplay), '', '', empty($conf->global->MAIN_EXTRAFIELDS_IN_ONE_TD)?0:1); } ?> -service->enabled) && $line->product_type == 1 && $dateSelector) { ?> - - global->MAIN_VIEW_LINE_NUMBER)) { ?> - - - - - - - - From 787e1319b9744ea9d5f8950827e3a7e699fe2ca3 Mon Sep 17 00:00:00 2001 From: "atm-florian.m" Date: Thu, 13 Jun 2019 16:21:07 +0200 Subject: [PATCH 0814/1036] FIX: in edit mode, dictionary inputs do not escape the string inside the 'value' attribute, causing errors if there are any double quotes --- htdocs/admin/dict.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index e1e0c0d419e..07b8a9d7119 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -1976,7 +1976,7 @@ function fieldList($fieldlist, $obj='', $tabname='', $context='') } if (! $transfound) { - print ''; + print ''; } print ''; } From b13b089c58b562a407ef93fec3b0e2192e675ac0 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 13 Jun 2019 20:52:52 +0200 Subject: [PATCH 0815/1036] Fix measuring_units_string display function --- htdocs/core/lib/product.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php index c8640f9928f..2bb75967727 100644 --- a/htdocs/core/lib/product.lib.php +++ b/htdocs/core/lib/product.lib.php @@ -494,7 +494,7 @@ function measuring_units_string($unit, $measuring_style = '') require_once DOL_DOCUMENT_ROOT.'/core/class/cunits.class.php'; $measuringUnits= new CUnits($db); $result = $measuringUnits->fetchAll('', '', 0, 0, array( - 't.code' => $unit, + 't.rowid => $unit, 't.unit_type' => $measuring_style, 't.active' => 1 )); From a30f029bbfef5c2c054e2c7513c35d860ec53cba Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 13 Jun 2019 20:53:24 +0200 Subject: [PATCH 0816/1036] Update product.lib.php --- htdocs/core/lib/product.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php index 2bb75967727..b6f8983f284 100644 --- a/htdocs/core/lib/product.lib.php +++ b/htdocs/core/lib/product.lib.php @@ -494,7 +494,7 @@ function measuring_units_string($unit, $measuring_style = '') require_once DOL_DOCUMENT_ROOT.'/core/class/cunits.class.php'; $measuringUnits= new CUnits($db); $result = $measuringUnits->fetchAll('', '', 0, 0, array( - 't.rowid => $unit, + 't.rowid' => $unit, 't.unit_type' => $measuring_style, 't.active' => 1 )); From 0ef9a8843a83ff8e4a8f2ed0d07208d9b0db6ddd Mon Sep 17 00:00:00 2001 From: ATM john Date: Thu, 13 Jun 2019 21:57:30 +0200 Subject: [PATCH 0817/1036] Fix empty test --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 19b39fd776d..d726c84e2ae 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -8123,7 +8123,7 @@ function dolGetButtonAction($label, $html = '', $actionType = 'default', $url = $attr['href'] = ''; } - if(empty($id)){ + if(!empty($id)){ $attr['id'] = $id; } From ff1adb39349c505ee5e692294d1eda2c0b21b0b5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 22:11:25 +0200 Subject: [PATCH 0818/1036] Fix dead code --- htdocs/fourn/class/fournisseur.facture.class.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 883fe383de7..f8e9dbcdbd1 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -205,7 +205,7 @@ class FactureFournisseur extends CommonInvoice public $multicurrency_total_ht; public $multicurrency_total_tva; public $multicurrency_total_ttc; - //! id of source invoice if replacement invoice or credit note + //! id of source var_dump($$this);invoice if replacement invoice or credit note /** * @var int ID */ @@ -312,7 +312,6 @@ class FactureFournisseur extends CommonInvoice $this->db->begin(); if (! $remise) $remise = 0 ; - $totalht = ($amount - $remise); $sql = "INSERT INTO ".MAIN_DB_PREFIX."facture_fourn ("; $sql.= "ref"; @@ -424,7 +423,7 @@ class FactureFournisseur extends CommonInvoice if (count($this->lines) && is_object($this->lines[0])) // If this->lines is array of InvoiceLines (preferred mode) { - dol_syslog("There is ".count($this->lines)." lines that are invoice lines objects"); + dol_syslog("There is ".count($this->lines)." lines that are invoice lines objects"); foreach ($this->lines as $i => $val) { $sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn, special_code)'; From e7d81a68f063b15df8e9f4e4104a6a9e566c3329 Mon Sep 17 00:00:00 2001 From: ATM john Date: Thu, 13 Jun 2019 22:11:47 +0200 Subject: [PATCH 0819/1036] Fix Override Attribute --- htdocs/core/lib/functions.lib.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index d726c84e2ae..31442cd7364 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -8130,7 +8130,15 @@ function dolGetButtonAction($label, $html = '', $actionType = 'default', $url = // Override attr if(!empty($params['attr']) && is_array($params['attr'])){ foreach($params['attr'] as $key => $value){ - $attr[$key] = $value; + if($key == 'class'){ + $attr['class'].= ' '.$value; + } + elseif($key == 'classOverride'){ + $attr['class'] = $value; + } + else{ + $attr[$key] = $value; + } } } @@ -8202,10 +8210,10 @@ function dolGetButtonTitle($label, $helpText = '', $iconClass = 'fa fa-file', $u $attr['href'] = ''; - if($status == -1){ // Not enough permissions + if($status == -1){ // disable $attr['title'] = dol_escape_htmltag($langs->transnoentitiesnoconv("FeatureDisabled")); } - elseif($status == 0){ // disable + elseif($status == 0){ // Not enough permissions $attr['title'] = dol_escape_htmltag($langs->transnoentitiesnoconv("NotEnoughPermissions")); } } From e8b139d1c64a647434f7dd6c7a6e39e820224b41 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 13 Jun 2019 22:48:31 +0200 Subject: [PATCH 0820/1036] Fix repeated logs and fetch --- htdocs/comm/action/class/actioncomm.class.php | 13 ++++--- htdocs/core/class/discount.class.php | 4 +- htdocs/core/class/html.formactions.class.php | 39 +++++++++++-------- .../modules/facture/mod_facture_terre.php | 4 +- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 905b562ab5d..6e4e3fb941b 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -120,7 +120,7 @@ class ActionComm extends CommonObject * Object user that create action * @var User * @deprecated - * @see authorid + * @see $authorid */ public $author; @@ -128,7 +128,7 @@ class ActionComm extends CommonObject * Object user that modified action * @var User * @deprecated - * @see usermodid + * @see $usermodid */ public $usermod; @@ -1010,7 +1010,7 @@ class ActionComm extends CommonObject /** * Load all objects with filters. - * WARNING: This make a fetch on all records instead of making one request with a join. + * @TODO WARNING: This make a fetch on all records instead of making one request with a join. * * @param DoliDb $db Database handler * @param int $socid Filter by thirdparty @@ -1020,7 +1020,7 @@ class ActionComm extends CommonObject * @param string $sortfield Sort on this field * @param string $sortorder ASC or DESC * @param string $limit Limit number of answers - * @return array or string Error string if KO, array with actions if OK + * @return array|string Error string if KO, array with actions if OK */ public static function getActions($db, $socid = 0, $fk_element = 0, $elementtype = '', $filter = '', $sortfield = 'a.datep', $sortorder = 'DESC', $limit = 0) { @@ -1028,6 +1028,8 @@ class ActionComm extends CommonObject $resarray=array(); + dol_syslog(get_class()."::getActions", LOG_DEBUG); + $sql = "SELECT a.id"; $sql.= " FROM ".MAIN_DB_PREFIX."actioncomm as a"; $sql.= " WHERE a.entity IN (".getEntity('agenda').")"; @@ -1041,7 +1043,6 @@ class ActionComm extends CommonObject if ($sortorder && $sortfield) $sql.=$db->order($sortfield, $sortorder); $sql.=$db->plimit($limit, 0); - dol_syslog(get_class()."::getActions", LOG_DEBUG); $resql=$db->query($sql); if ($resql) { @@ -1285,7 +1286,7 @@ class ActionComm extends CommonObject if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips - if ((!$user->rights->agenda->allactions->read && $this->author->id != $user->id) || (!$user->rights->agenda->myactions->read && $this->author->id == $user->id)) + if ((!$user->rights->agenda->allactions->read && $this->authorid != $user->id) || (!$user->rights->agenda->myactions->read && $this->authorid == $user->id)) $option = 'nolink'; $label = $this->label; diff --git a/htdocs/core/class/discount.class.php b/htdocs/core/class/discount.class.php index 93b51d0ddf8..8e66b29a3f8 100644 --- a/htdocs/core/class/discount.class.php +++ b/htdocs/core/class/discount.class.php @@ -497,8 +497,9 @@ class DiscountAbsolute { global $conf; + dol_syslog(get_class($this)."::getAvailableDiscounts discount_type=".$discount_type, LOG_DEBUG); + $sql = "SELECT SUM(rc.amount_ttc) as amount"; - //$sql = "SELECT rc.amount_ttc as amount"; $sql.= " FROM ".MAIN_DB_PREFIX."societe_remise_except as rc"; $sql.= " WHERE rc.entity = " . $conf->entity; $sql.= " AND rc.discount_type=".intval($discount_type); @@ -512,7 +513,6 @@ class DiscountAbsolute if ($filter) $sql.=' AND ('.$filter.')'; if ($maxvalue) $sql.=' AND rc.amount_ttc <= '.price2num($maxvalue); - dol_syslog(get_class($this)."::getAvailableDiscounts", LOG_DEBUG); $resql=$this->db->query($sql); if ($resql) { diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index 31353ea3d10..bb1cf5fbfe7 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -213,24 +213,22 @@ class FormActions $page=0; $param=''; - $total = 0; - print '
'; print '
' . $form->load_tva('tva_tx', $line->tva_tx.($line->vat_src_code?(' ('.$line->vat_src_code.')'):''), $seller, $buyer, 0, $line->info_bits, $line->product_type, false, 1) . '%fk_prev_id != null) print ' readonly'; - print '>fk_prev_id != null) print ' readonly'; - print '> + info_bits & 2) != 2) { // I comment this because it shows info even when not required // for example always visible on invoice but must be visible only if stock module on and stock decrease option is on invoice validation and status is not validated // must also not be output for most entities (proposal, intervention, ...) //if($line->qty > $line->stock) print img_picto($langs->trans("StockTooLow"),"warning", 'style="vertical-align: bottom;"')." "; - print 'fk_prev_id != null ) print ' readonly'; - print '>'; - } else { ?> -   - + print ''; + } + ?> '; + print ''; print $form->selectUnits($line->fk_unit, "units"); print ' + $coldisplay+=$colspan; + ?> + ">
">
trans('ServiceLimitedDuration').' '.$langs->trans('From').' '; ?> - global->MAIN_USE_HOURMIN_IN_DATE_RANGE)?$conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE:''); - print $form->selectDate($line->date_start, 'date_start', $hourmin, $hourmin, $line->date_start?0:1, "updateline", 1, 0); - print ' '.$langs->trans('to').' '; - print $form->selectDate($line->date_end, 'date_end', $hourmin, $hourmin, $line->date_end?0:1, "updateline", 1, 0); - print '' - ?> -
'; print ''; - print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); - print getTitleFieldOfList('By', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); - print getTitleFieldOfList('Type', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); + print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); + print getTitleFieldOfList('By', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); + print getTitleFieldOfList('Type', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1); - print getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', $page, $param, '', $sortfield, $sortorder, 'center ', 1); - print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, 'right ', 1); + print getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', $page, $param, '', $sortfield, $sortorder, 'center ', 1); + print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, 'right ', 1); print ''; print "\n"; - $userstatic = new User($this->db); - - if (count($listofactions)) + if (is_array($listofactions) && count($listofactions)) { + $cacheusers=array(); + $cursorevent = 0; foreach($listofactions as $action) { @@ -246,8 +244,20 @@ class FormActions print ''; // Type @@ -284,10 +294,7 @@ class FormActions } print ''; print ''; print ''; diff --git a/htdocs/core/modules/facture/mod_facture_terre.php b/htdocs/core/modules/facture/mod_facture_terre.php index c01fa9d2e09..a4cc1762766 100644 --- a/htdocs/core/modules/facture/mod_facture_terre.php +++ b/htdocs/core/modules/facture/mod_facture_terre.php @@ -184,6 +184,8 @@ class mod_facture_terre extends ModeleNumRefFactures { global $db; + dol_syslog(get_class($this)."::getNextValue mode=".$mode, LOG_DEBUG); + if ($invoice->type == 2) $prefix=$this->prefixcreditnote; elseif ($invoice->type == 3) $prefix=$this->prefixdeposit; else $prefix=$this->prefixinvoice; @@ -195,7 +197,6 @@ class mod_facture_terre extends ModeleNumRefFactures $sql.= " AND entity IN (".getEntity('invoicenumber', 1, $invoice).")"; $resql=$db->query($sql); - dol_syslog(get_class($this)."::getNextValue", LOG_DEBUG); if ($resql) { $obj = $db->fetch_object($resql); @@ -219,7 +220,6 @@ class mod_facture_terre extends ModeleNumRefFactures $sql.= " AND entity IN (".getEntity('invoicenumber', 1, $invoice).")"; $sql.= " ORDER BY ref DESC"; - dol_syslog(get_class($this)."::getNextValue", LOG_DEBUG); $resql=$db->query($sql); if ($resql) { From e6c28188db335b61a58efb454f1c5ec8f7349236 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 14 Jun 2019 13:38:52 +0200 Subject: [PATCH 0821/1036] Update product.lib.php --- htdocs/core/lib/product.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php index b6f8983f284..61f2fd05b00 100644 --- a/htdocs/core/lib/product.lib.php +++ b/htdocs/core/lib/product.lib.php @@ -494,7 +494,7 @@ function measuring_units_string($unit, $measuring_style = '') require_once DOL_DOCUMENT_ROOT.'/core/class/cunits.class.php'; $measuringUnits= new CUnits($db); $result = $measuringUnits->fetchAll('', '', 0, 0, array( - 't.rowid' => $unit, + 't.scale' => $unit, 't.unit_type' => $measuring_style, 't.active' => 1 )); From 1fa1b91916a1adeb06102f763e1ca5f0aac25a95 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 14 Jun 2019 13:46:59 +0200 Subject: [PATCH 0822/1036] Update product.lib.php --- htdocs/core/lib/product.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/product.lib.php b/htdocs/core/lib/product.lib.php index 61f2fd05b00..4d79d0d4db3 100644 --- a/htdocs/core/lib/product.lib.php +++ b/htdocs/core/lib/product.lib.php @@ -483,7 +483,7 @@ function show_stats_for_company($product, $socid) /** * Return translation label of a unit key * - * @param int $unit Unit key (-3,0,3,98,99...) + * @param int $unit ID of unit (rowid in llx_c_units table) * @param string $measuring_style Style of unit: weight, volume,... * @return string Unit string * @see formproduct->selectMeasuringUnits @@ -494,7 +494,7 @@ function measuring_units_string($unit, $measuring_style = '') require_once DOL_DOCUMENT_ROOT.'/core/class/cunits.class.php'; $measuringUnits= new CUnits($db); $result = $measuringUnits->fetchAll('', '', 0, 0, array( - 't.scale' => $unit, + 't.rowid' => $unit, 't.unit_type' => $measuring_style, 't.active' => 1 )); From bc8c7e0d4f68817095de0a1404f6b8f94ebdbfe7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 14 Jun 2019 15:03:37 +0200 Subject: [PATCH 0823/1036] Code comment --- htdocs/societe/paymentmodes.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index e37d7caf91f..3b1a2dd0459 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -48,7 +48,7 @@ if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'societe', '', ''); $id=GETPOST("id", "int"); -$source=GETPOST("source", "alpha"); +$source=GETPOST("source", "alpha"); // source can be a source or a paymentmode $ribid=GETPOST("ribid", "int"); $action=GETPOST("action", 'alpha', 3); $cancel=GETPOST('cancel', 'alpha'); @@ -419,6 +419,15 @@ if (empty($reshook)) $companypaymentmode = new CompanyPaymentMode($db); if ($companypaymentmode->fetch($ribid?$ribid:$id)) { + /*if ($companypaymentmode->stripe_card_ref && preg_match('/pm_/', $companypaymentmode->stripe_card_ref)) + { + $payment_method = \Stripe\PaymentMethod::retrieve($companypaymentmode->stripe_card_ref); + if ($payment_method) + { + $payment_method->detach(); + } + }*/ + $result = $companypaymentmode->delete($user); if ($result > 0) { @@ -586,7 +595,7 @@ if (empty($reshook)) $db->rollback(); } } - if ($action == 'setlocalassourcedefault') + if ($action == 'setlocalassourcedefault') // Set as default when payment mode defined locally (and may be also remotely) { try { $companypaymentmode->setAsDefault($id); @@ -601,11 +610,12 @@ if (empty($reshook)) setEventMessages($e->getMessage(), null, 'errors'); } } - elseif ($action == 'setassourcedefault') + elseif ($action == 'setassourcedefault') // Set as default when payment mode defined remotely only { try { $cu=$stripe->customerStripe($object, $stripeacc, $servicestatus); - $cu->default_source = (string) $source; + $cu->default_source = (string) $source; // Old + $cu->invoice_settings->default_payment_method = (string) $source; // New $result = $cu->save(); $url=DOL_URL_ROOT.'/societe/paymentmodes.php?socid='.$object->id; From baf95c3c86a9fa6f3c24a5253794c48c14f673d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Fri, 14 Jun 2019 16:47:53 +0200 Subject: [PATCH 0824/1036] Update agenda.lang --- htdocs/langs/en_US/agenda.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index 88f41d2c3c9..30c2a3d4038 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -38,6 +38,7 @@ ActionsEvents=Events for which Dolibarr will create an action in agenda automati EventRemindersByEmailNotEnabled=Event reminders by email was not enabled into %s module setup. ##### Agenda event labels ##### NewCompanyToDolibarr=Third party %s created +COMPANY_DELETEInDolibarr=Third party %s deleted ContractValidatedInDolibarr=Contract %s validated CONTRACT_DELETEInDolibarr=Contract %s deleted PropalClosedSignedInDolibarr=Proposal %s signed From 8afffc87627f1236d1355080c835a1dfc840dd76 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 14 Jun 2019 18:28:01 +0200 Subject: [PATCH 0825/1036] FIX: #11335 --- htdocs/fourn/facture/card.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 3956684d9b2..bca9cb8ad4e 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -4,7 +4,7 @@ * Copyright (C) 2004 Christophe Combelles * Copyright (C) 2005 Marc Barilley * Copyright (C) 2005-2013 Regis Houssin - * Copyright (C) 2010-2014 Juanjo Menent + * Copyright (C) 2010-2019 Juanjo Menent * Copyright (C) 2013-2015 Philippe Grand * Copyright (C) 2013 Florian Henry * Copyright (C) 2014-2016 Marcos García @@ -831,6 +831,8 @@ if (empty($reshook)) // Auto calculation of date due if not filled by user if(empty($object->date_echeance)) $object->date_echeance = $object->calculate_date_lim_reglement(); + $object->fetch_thirdparty(); + // If creation from another object of another module if (! $error && $_POST['origin'] && $_POST['originid']) { From cd5c2c324959eb12569c077788cfe8d5b2363733 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 14 Jun 2019 18:39:05 +0200 Subject: [PATCH 0826/1036] Update llx_bom_bom.sql --- htdocs/install/mysql/tables/llx_bom_bom.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_bom_bom.sql b/htdocs/install/mysql/tables/llx_bom_bom.sql index 4e559566817..9c6e014586d 100644 --- a/htdocs/install/mysql/tables/llx_bom_bom.sql +++ b/htdocs/install/mysql/tables/llx_bom_bom.sql @@ -26,7 +26,8 @@ CREATE TABLE llx_bom_bom( fk_product integer, qty double(24,8), efficiency double(8,4) DEFAULT 1, - date_creation datetime NOT NULL, + date_creation datetime NOT NULL, + date_valid datetime NOT NULL, tms timestamp, date_valid datetime, fk_user_creat integer NOT NULL, @@ -35,4 +36,4 @@ CREATE TABLE llx_bom_bom( import_key varchar(14), status integer NOT NULL -- END MODULEBUILDER FIELDS -) ENGINE=innodb; \ No newline at end of file +) ENGINE=innodb; From d838ced12e568acb58c23fc4b5b48d736832578b Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 14 Jun 2019 18:41:38 +0200 Subject: [PATCH 0827/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index e353f317b45..385b740a685 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -228,6 +228,7 @@ CREATE TABLE llx_bom_bom( ALTER TABLE llx_bom_bom ADD COLUMN efficiency double(8,4) DEFAULT 1; ALTER TABLE llx_bom_bom ADD COLUMN entity integer DEFAULT 1 NOT NULL; +ALTER TABLE llx_bom_bom ADD COLUMN date_valid datetime NOT NULL; create table llx_bom_bom_extrafields ( From a73ae49c4d623b3e9aabb31230187c4b5d264b04 Mon Sep 17 00:00:00 2001 From: Juanjo Menent Date: Fri, 14 Jun 2019 18:56:30 +0200 Subject: [PATCH 0828/1036] FIX: #11296 --- htdocs/projet/class/project.class.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 549865c63cd..5abf7e76d33 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -5,6 +5,7 @@ * Copyright (C) 2013 Florian Henry * Copyright (C) 2014-2017 Marcos García * Copyright (C) 2017 Ferran Marcet + * Copyright (C) 2019 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 @@ -695,6 +696,27 @@ class Project extends CommonObject $ret = $this->deleteTasks($user); if ($ret < 0) $error++; + + // Delete all child tables + if (! $error) { + $elements = array('categorie_project'); // elements to delete. TODO Make goodway to delete + foreach($elements as $table) + { + if (! $error) { + $sql = "DELETE FROM ".MAIN_DB_PREFIX.$table; + $sql.= " WHERE fk_project = ".$this->id; + + $result = $this->db->query($sql); + if (! $result) { + $error++; + $this->errors[] = $this->db->lasterror(); + } + } + } + } + + + // Delete project if (! $error) { From 651f4158ac6c4b122d544adb50df49fb90a00f97 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sun, 16 Jun 2019 14:18:26 +0200 Subject: [PATCH 0829/1036] Fix add / delete contact access --- htdocs/commande/class/api_orders.class.php | 34 +++++++++------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/htdocs/commande/class/api_orders.class.php b/htdocs/commande/class/api_orders.class.php index 27b55f9e57f..36df0c0eacb 100644 --- a/htdocs/commande/class/api_orders.class.php +++ b/htdocs/commande/class/api_orders.class.php @@ -415,21 +415,16 @@ class Orders extends DolibarrApi */ public function postContact($id, $contactid, $type) { - if(!DolibarrApiAccess::$user->rights->commande->creer) { - throw new RestException(401); - } - - $result = $this->commande->fetch($id); - - if(!$result) { - throw new RestException(404, 'Order not found'); + if (! DolibarrApiAccess::$user->rights->commande->creer) { + throw new RestException(401); } - if (!in_array($type, array('BILLING', 'SHIPPING', 'CUSTOMER'), true)) { - throw new RestException(500, 'Availables types: BILLING, SHIPPING OR CUSTOMER'); + $result = $this->commande->fetch($id); + if (! $result) { + throw new RestException(404, 'Order not found'); } - if(!DolibarrApi::_checkAccessToResource('order', $this->commande->id)) { + if (! DolibarrApi::_checkAccessToResource('commande', $this->commande->id)) { throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); } @@ -457,17 +452,16 @@ class Orders extends DolibarrApi */ public function deleteContact($id, $rowid) { - if(!DolibarrApiAccess::$user->rights->commande->creer) { - throw new RestException(401); - } - - $result = $this->commande->fetch($id); - - if(!$result) { - throw new RestException(404, 'Order not found'); + if (! DolibarrApiAccess::$user->rights->commande->creer) { + throw new RestException(401); } - if(!DolibarrApi::_checkAccessToResource('order', $this->commande->id)) { + $result = $this->commande->fetch($id); + if (! $result) { + throw new RestException(404, 'Order not found'); + } + + if (! DolibarrApi::_checkAccessToResource('commande', $this->commande->id)) { throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); } From 48b2cb83af29a9d54b333d224e6847faa3e6a969 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 16 Jun 2019 17:08:23 +0200 Subject: [PATCH 0830/1036] Close #11152 by a manual merge to keep only required things --- .../interface_80_modStripe_Stripe.class.php | 30 +++++-- htdocs/public/stripe/ipn.php | 89 ++++++++++++++++++- .../class/companypaymentmode.class.php | 20 ++--- htdocs/societe/class/societeaccount.class.php | 36 +++++++- htdocs/societe/paymentmodes.php | 3 +- htdocs/stripe/class/stripe.class.php | 64 +++++++++---- 6 files changed, 205 insertions(+), 37 deletions(-) diff --git a/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php b/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php index 8282a09a43d..f9d28a0b984 100644 --- a/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php +++ b/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php @@ -148,32 +148,50 @@ class InterfaceStripe { $namecleaned = $object->name ? $object->name : null; $vatcleaned = $object->tva_intra ? $object->tva_intra : null; - - $taxinfo = array('type'=>'vat'); + $desccleaned = $object->name_alias ? $object->name_alias : null; + $taxexemptcleaned = $object->tva_assuj ? 'none' : 'exempt'; + $langcleaned = $object->default_lang ? array(substr($object->default_lang, 0, 2)) : null; + /*$taxinfo = array('type'=>'vat'); if ($vatcleaned) { $taxinfo["tax_id"] = $vatcleaned; } // We force data to "null" if not defined as expected by Stripe - if (empty($vatcleaned)) $taxinfo=null; + if (empty($vatcleaned)) $taxinfo=null;*/ // Detect if we change a Stripe info (email, description, vat id) $changerequested = 0; if (! empty($object->email) && $object->email != $customer->email) $changerequested++; - if ($namecleaned != $customer->description) $changerequested++; + /* if ($namecleaned != $customer->description) $changerequested++; if (! isset($customer->tax_info['tax_id']) && ! is_null($vatcleaned)) $changerequested++; elseif (isset($customer->tax_info['tax_id']) && is_null($vatcleaned)) $changerequested++; elseif (isset($customer->tax_info['tax_id']) && ! is_null($vatcleaned)) { if ($vatcleaned != $customer->tax_info['tax_id']) $changerequested++; + } */ + if ($namecleaned != $customer->name) $changerequested++; + if ($desccleaned != $customer->description) $changerequested++; + if (($customer->tax_exempt == 'exempt' && ! $object->tva_assuj) || (! $customer->tax_exempt == 'exempt' && empty($object->tva_assuj))) $changerequested++; + if (! isset($customer->tax_ids['data']) && ! is_null($vatcleaned)) $changerequested++; + elseif (isset($customer->tax_ids['data']) && is_null($vatcleaned)) $changerequested++; + elseif (isset($customer->tax_ids['data']) && ! is_null($vatcleaned)) + { + $taxinfo = reset($customer->tax_ids['data']); + if (isset($taxinfo->value) && $vatcleaned != $taxinfo->value) $changerequested++; } if ($changerequested) { - if (! empty($object->email)) $customer->email = $object->email; + /*if (! empty($object->email)) $customer->email = $object->email; $customer->description = $namecleaned; if (empty($taxinfo)) $customer->tax_info = array('type'=>'vat', 'tax_id'=>null); - else $customer->tax_info = $taxinfo; + else $customer->tax_info = $taxinfo; */ + $customer->name = $namecleaned; + $customer->description = $desccleaned; + $customer->preferred_locales = $langcleaned; + $customer->tax_exempt = $taxexemptcleaned; + if (! empty($vatcleaned)) $customer->tax_ids = array('object'=>'list', 'data'=>array('value'=>$vatcleaned)); + else $customer->tax_ids = null; $customer->save(); } diff --git a/htdocs/public/stripe/ipn.php b/htdocs/public/stripe/ipn.php index 8795031592a..bfd1788e12f 100644 --- a/htdocs/public/stripe/ipn.php +++ b/htdocs/public/stripe/ipn.php @@ -293,7 +293,6 @@ elseif ($event->type == 'customer.source.delete') { elseif ($event->type == 'customer.deleted') { $db->begin(); $sql = "DELETE FROM ".MAIN_DB_PREFIX."societe_account WHERE key_account = '".$db->escape($event->data->object->id)."' and site='stripe'"; - dol_syslog(get_class($this) . "::delete sql=" . $sql, LOG_DEBUG); $db->query($sql); $db->commit(); } @@ -309,6 +308,94 @@ elseif ($event->type == 'checkout.session.completed') // Called when making pay // TODO: create fees // TODO: Redirect to paymentok.php } +elseif ($event->type == 'payment_method.attached') { + require_once DOL_DOCUMENT_ROOT.'/societe/class/companypaymentmode.class.php'; + require_once DOL_DOCUMENT_ROOT.'/societe/class/societeaccount.class.php'; + $societeaccount = new SocieteAccount($db); + + $companypaymentmode = new CompanyPaymentMode($db); + + $idthirdparty = $societeaccount->getThirdPartyID($db->escape($event->data->object->customer), 'stripe', $servicestatus); + if ($idthirdparty > 0) // If the payment mode is on an external customer that is known in societeaccount, we can create the payment mode + { + $companypaymentmode->stripe_card_ref = $db->escape($event->data->object->id); + $companypaymentmode->fk_soc = $idthirdparty; + $companypaymentmode->bank = null; + $companypaymentmode->label = null; + $companypaymentmode->number = $db->escape($event->data->object->id); + $companypaymentmode->last_four = $db->escape($event->data->object->card->last4); + $companypaymentmode->card_type = $db->escape($event->data->object->card->branding); + $companypaymentmode->proprio = $db->escape($event->data->object->billing_details->name); + $companypaymentmode->exp_date_month = $db->escape($event->data->object->card->exp_month); + $companypaymentmode->exp_date_year = $db->escape($event->data->object->card->exp_year); + $companypaymentmode->cvn = null; + $companypaymentmode->datec = $db->escape($event->data->object->created); + $companypaymentmode->default_rib = 0; + $companypaymentmode->type = $db->escape($event->data->object->type); + $companypaymentmode->country_code = $db->escape($event->data->object->card->country); + $companypaymentmode->status = $servicestatus; + + $db->begin(); + if (! $error) + { + $result = $companypaymentmode->create($user); + if ($result < 0) + { + $error++; + } + } + if (! $error) + { + $db->commit(); + } + else + { + $db->rollback(); + } + } +} +elseif ($event->type == 'payment_method.updated') { + require_once DOL_DOCUMENT_ROOT.'/societe/class/companypaymentmode.class.php'; + $companypaymentmode = new CompanyPaymentMode($db); + $companypaymentmode->fetch(0, '', 0, '', " AND stripe_card_ref = '".$db->escape($event->data->object->id)."'"); + $companypaymentmode->bank = null; + $companypaymentmode->label = null; + $companypaymentmode->number = $db->escape($event->data->object->id); + $companypaymentmode->last_four = $db->escape($event->data->object->card->last4); + $companypaymentmode->proprio = $db->escape($event->data->object->billing_details->name); + $companypaymentmode->exp_date_month = $db->escape($event->data->object->card->exp_month); + $companypaymentmode->exp_date_year = $db->escape($event->data->object->card->exp_year); + $companypaymentmode->cvn = null; + $companypaymentmode->datec = $db->escape($event->data->object->created); + $companypaymentmode->default_rib = 0; + $companypaymentmode->type = $db->escape($event->data->object->type); + $companypaymentmode->country_code = $db->escape($event->data->object->card->country); + $companypaymentmode->status = $servicestatus; + + $db->begin(); + if (! $error) + { + $result = $companypaymentmode->update($user); + if ($result < 0) + { + $error++; + } + } + if (! $error) + { + $db->commit(); + } + else + { + $db->rollback(); + } +} +elseif ($event->type == 'payment_method.detached') { + $db->begin(); + $sql = "DELETE FROM ".MAIN_DB_PREFIX."societe_rib WHERE ref = '".$db->escape($event->data->object->id)."' and status = ".$servicestatus; + $db->query($sql); + $db->commit(); +} elseif ($event->type == 'charge.succeeded') { // TODO: create fees // TODO: Redirect to paymentok.php diff --git a/htdocs/societe/class/companypaymentmode.class.php b/htdocs/societe/class/companypaymentmode.class.php index ae9f0a44b32..e3e86e2cf4a 100644 --- a/htdocs/societe/class/companypaymentmode.class.php +++ b/htdocs/societe/class/companypaymentmode.class.php @@ -169,21 +169,21 @@ class CompanyPaymentMode extends CommonObject public $starting_date; public $ending_date; - + /** * Date creation record (datec) * * @var integer */ public $datec; - + /** * Date modification record (tms) * * @var integer */ public $tms; - + public $import_key; // END MODULEBUILDER PROPERTIES @@ -297,15 +297,15 @@ class CompanyPaymentMode extends CommonObject /** * Load object in memory from the database * - * @param int $id Id object - * @param string $ref Ref - * @param int $socid Id of company to get first default payment mode - * @param string $type Filter on type ('ban', 'card', ...) - * @return int <0 if KO, 0 if not found, >0 if OK + * @param int $id Id object + * @param string $ref Ref + * @param int $socid Id of company to get first default payment mode + * @param string $type Filter on type ('ban', 'card', ...) + * @param string $morewhere More SQL filters (' AND ...') + * @return int <0 if KO, 0 if not found, >0 if OK */ - public function fetch($id, $ref = null, $socid = 0, $type = '') + public function fetch($id, $ref = null, $socid = 0, $type = '', $morewhere = '') { - $morewhere = ''; if ($socid) $morewhere.= " AND fk_soc = ".$this->db->escape($socid)." AND default_rib = 1"; if ($type) $morewhere.= " AND type = '".$this->db->escape($type)."'"; diff --git a/htdocs/societe/class/societeaccount.class.php b/htdocs/societe/class/societeaccount.class.php index 6f24471a295..3fc7b225c77 100644 --- a/htdocs/societe/class/societeaccount.class.php +++ b/htdocs/societe/class/societeaccount.class.php @@ -3,7 +3,6 @@ * Copyright (C) 2014-2016 Juanjo Menent * Copyright (C) 2015 Florian Henry * Copyright (C) 2015 Raphaël Doursenaud - * Copyright (C) ---Put here your own copyright and developer email--- * * 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 @@ -281,12 +280,13 @@ class SocieteAccount extends CommonObject } /** - * Try to find the external customer id of a thirdparty for an another site/system. + * Try to find the external customer id of a thirdparty for another site/system. * * @param int $id Id of third party * @param string $site Site (example: 'stripe', '...') * @param int $status Status (0=test, 1=live) * @return string Stripe customer ref 'cu_xxxxxxxxxxxxx' or '' + * @see getThirdPartyID() */ public function getCustomerAccount($id, $site, $status = 0) { @@ -314,6 +314,38 @@ class SocieteAccount extends CommonObject return $key; } + /** + * Try to find the thirdparty id for an another site/system external id. + * + * @param string $id Id of customer in external system (example: 'cu_xxxxxxxxxxxxx', ...) + * @param string $site Site (example: 'stripe', '...') + * @param int $status Status (0=test, 1=live) + * @return string Id of third party + * @see getCustomerAccount() + */ + public function getThirdPartyID($id, $site, $status = 0) + { + $socid = 0; + + $sql = "SELECT sa.fk_soc as fk_soc, sa.key_account, sa.entity"; + $sql.= " FROM " . MAIN_DB_PREFIX . "societe_account as sa"; + $sql.= " WHERE sa.key_account = '".$this->db->escape($id)."'"; + $sql.= " AND sa.entity IN (".getEntity('societe').")"; + $sql.= " AND sa.site = '".$this->db->escape($site)."' AND sa.status = ".((int) $status); + $sql.= " AND sa.fk_soc > 0"; + + dol_syslog(get_class($this) . "::getCustomerAccount Try to find the first thirdparty id for ".$site." for external id=".$id, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + if ($this->db->num_rows($result)) { + $obj = $this->db->fetch_object($result); + $socid = $obj->fk_soc; + } + } + + return $socid; + } + /** * Update object into database * diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 3b1a2dd0459..24329a48a33 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -1123,7 +1123,8 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' print ''; // Default print ''; // Progress declared From c0a30d1ff5484471a9bb9aa8ab4f6c1dad0472c4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 16 Jun 2019 22:17:04 +0200 Subject: [PATCH 0834/1036] FIX #11325 FIX #5249 Conflicts: htdocs/projet/tasks/time.php --- htdocs/projet/tasks/time.php | 61 +++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 48167edcc1d..e69f4fcd899 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -317,7 +317,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $object->project = clone $projectstatic; } - $userWrite = $projectstatic->restrictedProjectArea($user,'write'); + $userRead = $projectstatic->restrictedProjectArea($user, 'read'); + $linktocreatetime = ''; if ($projectstatic->id > 0) { @@ -427,33 +428,30 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print '
'; // Link to create time - //if ((empty($id) && empty($ref)) || ! empty($projectidforalltimes)) - //{ - if ($user->rights->projet->all->creer || $user->rights->projet->creer) - { - if ($projectstatic->public || $userWrite > 0) - { - if (! empty($projectidforalltimes)) // We are on tab 'Time Spent' of project - { - $backtourl = $_SERVER['PHP_SELF'].'?projectid='.$projectstatic->id.($withproject?'&withproject=1':''); - $linktocreatetime = ''.$langs->trans('AddTimeSpent').''; - } - else // We are on tab 'Time Spent' of task - { - $backtourl = $_SERVER['PHP_SELF'].'?id='.$object->id.($withproject?'&withproject=1':''); - $linktocreatetime = ''.$langs->trans('AddTimeSpent').''; - } - } - else - { - $linktocreatetime = ''.$langs->trans('AddTime').''; - } - } - else - { - $linktocreatetime = ''.$langs->trans('AddTime').''; - } - //} + if ($user->rights->projet->all->lire || $user->rights->projet->lire)) // To enter time, read permission is enough + { + if ($projectstatic->public || $userRead > 0) + { + if (! empty($projectidforalltimes)) // We are on tab 'Time Spent' of project + { + $backtourl = $_SERVER['PHP_SELF'].'?projectid='.$projectstatic->id.($withproject?'&withproject=1':''); + $linktocreatetime = ''.$langs->trans('AddTimeSpent').''; + } + else // We are on tab 'Time Spent' of task + { + $backtourl = $_SERVER['PHP_SELF'].'?id='.$object->id.($withproject?'&withproject=1':''); + $linktocreatetime = ''.$langs->trans('AddTimeSpent').''; + } + } + else + { + $linktocreatetime = ''.$langs->trans('AddTime').''; + } + } + else + { + $linktocreatetime = ''.$langs->trans('AddTime').''; + } } } @@ -803,7 +801,12 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) // Duration - Time spent print '
'; // Progress declared From 157526205d267c0d73aaefb525e97f45b4e0a9aa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 16 Jun 2019 23:00:40 +0200 Subject: [PATCH 0835/1036] Fix css --- htdocs/projet/tasks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index ccc8a0548c8..b05b27b5e90 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -667,7 +667,7 @@ elseif ($id > 0 || ! empty($ref)) print ''; $title=$langs->trans("ListOfTasks"); - $linktotasks = dolGetButtonTitle($langs->trans('GoToGanttView'), '', 'fa fa-calendar-minus-o', DOL_URL_ROOT.'/projet/ganttview.php?id='.$object->id.'&withproject=1'); + $linktotasks = dolGetButtonTitle($langs->trans('GoToGanttView'), '', 'fa fa-calendar-minus-o paddingleft', DOL_URL_ROOT.'/projet/ganttview.php?id='.$object->id.'&withproject=1'); //print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $totalnboflines, 'title_generic.png', 0, '', '', 0, 1); print load_fiche_titre($title, $linktotasks.'   '.$linktocreatetask, 'title_generic.png'); From 3afd4e15ad135b74b781a0170d79547fde4208da Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Mon, 17 Jun 2019 07:09:19 +0200 Subject: [PATCH 0836/1036] FIX try to remove ob_* functions --- htdocs/core/lib/pdf.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 1932fca31a2..56ca215e118 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -186,11 +186,11 @@ function pdf_getEncryption($pathoffile) $content = file_get_contents($pathoffile); - ob_start(); + //ob_start(); @($parser = new \TCPDF_PARSER(ltrim($content))); list($xref, $data) = $parser->getParsedData(); unset($parser); - ob_end_clean(); + //ob_end_clean(); if (isset($xref['trailer']['encrypt'])) { $isencrypted = true; // Secured pdf file are currently not supported From 8330078de18ddd00c322398e94c5bf560161f5b5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 12:33:09 +0200 Subject: [PATCH 0837/1036] Fix default value --- htdocs/core/class/html.formcompany.class.php | 4 ++-- htdocs/societe/card.php | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/html.formcompany.class.php b/htdocs/core/class/html.formcompany.class.php index d2fb93000a9..d1366cb8511 100644 --- a/htdocs/core/class/html.formcompany.class.php +++ b/htdocs/core/class/html.formcompany.class.php @@ -908,7 +908,7 @@ class FormCompany $out = ''; print ''; From a399e3f63de7b2c652789a069886decd3777c51f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 17 Jun 2019 13:33:44 +0200 Subject: [PATCH 0838/1036] Update companies.lang --- htdocs/langs/fr_FR/companies.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/fr_FR/companies.lang b/htdocs/langs/fr_FR/companies.lang index 7a423b0b007..dc2cf3b95b2 100644 --- a/htdocs/langs/fr_FR/companies.lang +++ b/htdocs/langs/fr_FR/companies.lang @@ -318,7 +318,7 @@ CompanyDeleted=La société "%s" a été supprimée de la base. ListOfContacts=Liste des contacts ListOfContactsAddresses=Liste des contacts/adresses ListOfThirdParties=Liste des tiers -ShowCompany=Affichier tiers +ShowCompany=Afficher tiers ShowContact=Afficher contact ContactsAllShort=Tous (pas de filtre) ContactType=Type de contact From 1a1f3493c90d5297509af0bf592a51b43bf8d6c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 17 Jun 2019 14:03:57 +0200 Subject: [PATCH 0839/1036] NEW can specify hour start end for selectDate and step for minutes --- htdocs/core/class/html.form.class.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 63246fb0287..29f2dd6ed6a 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5234,10 +5234,12 @@ class Form * @param int $fullday When a checkbox with this html name is on, hour and day are set with 00:00 or 23:59 * @param string $addplusone Add a link "+1 hour". Value must be name of another selectDate field. * @param datetime $adddateof Add a link "Date of invoice" using the following date. + * @param string $openinghours Specify hour strat and hour end for the select ex 8,20 + * @param int $stepminutes Specify step for minutes between 1 and 30 * @return string Html for selectDate * @see form_date(), select_month(), select_year(), select_dayofweek() */ - public function selectDate($set_time = '', $prefix = 're', $h = 0, $m = 0, $empty = 0, $form_name = "", $d = 1, $addnowlink = 0, $disabled = 0, $fullday = '', $addplusone = '', $adddateof = '') + public function selectDate($set_time = '', $prefix = 're', $h = 0, $m = 0, $empty = 0, $form_name = "", $d = 1, $addnowlink = 0, $disabled = 0, $fullday = '', $addplusone = '', $adddateof = '', $openinghours = '', $stepminutes = 1) { global $conf,$langs; @@ -5248,6 +5250,7 @@ class Form if ($m == '') $m=0; $emptydate=0; $emptyhours=0; + if ($stepminutes<=0 || $stepminutes>30) $stepminutes = 1; if ($empty == 1) { $emptydate=1; $emptyhours=1; } if ($empty == 2) { $emptydate=0; $emptyhours=1; } $orig_set_time=$set_time; @@ -5468,10 +5471,18 @@ class Form if ($h) { + $hourstart = 0; + $hourend = 24; + if ($openinghours != '') { + $openinghours = explode(',', $openinghours); + $hourstart = $openinghours[0]; + $hourend = $openinghours[1]; + if ($hourend<$hourstart) $hourend = $hourstart; + } // Show hour $retstring.=''; if ($emptyhours) $retstring.=''; - for ($hour = 0; $hour < 24; $hour++) + for ($hour = $hourstart; $hour < $hourend; $hour++) { if (strlen($hour) < 2) $hour = "0" . $hour; $retstring.=''; @@ -5485,7 +5496,7 @@ class Form // Show minutes $retstring.=''; if ($emptyhours) $retstring.=''; - for ($min = 0; $min < 60 ; $min++) + for ($min = 0; $min < 60 ; $min+=$stepminutes) { if (strlen($min) < 2) $min = "0" . $min; $retstring.=''; From cf825875040fbe5235d59ba32c9727e9471b6d6d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 15:02:44 +0200 Subject: [PATCH 0840/1036] Fix menu entry --- htdocs/core/menus/standard/eldy.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 3073ffe6032..3576f35642e 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1285,7 +1285,7 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM $newmenu->add("/accountancy/bookkeeping/balance.php?mainmenu=accountancy&leftmenu=accountancy_accountancy", $langs->trans("AccountBalance"), 1, $user->rights->accounting->mouvements->lire); // Files - if (! empty($conf->global->MAIN_FEATURES_LEVEL) && $conf->global->MAIN_FEATURES_LEVEL >= 2) + if (! empty($conf->global->MAIN_FEATURES_LEVEL) && $conf->global->MAIN_FEATURES_LEVEL >= 1) { $newmenu->add("/compta/compta-files.php?mainmenu=accountancy&leftmenu=accountancy_files", $langs->trans("AccountantFiles"), 1, $user->rights->accounting->mouvements->lire); } From aa92bfd1e0a42fea433c2668ebc44533b895d404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 17 Jun 2019 15:31:48 +0200 Subject: [PATCH 0841/1036] Update bom_card.php --- htdocs/bom/bom_card.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index c2ed2ca6705..d788be5354a 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -173,7 +173,6 @@ if (empty($reshook)) $action = ''; } } - } From a74eaaff4d1c9f84af74de2a4872fde45136c177 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 15:54:54 +0200 Subject: [PATCH 0842/1036] Fix sort of linked elements --- htdocs/comm/propal/tpl/linkedobjectblock.tpl.php | 2 ++ htdocs/commande/tpl/linkedobjectblock.tpl.php | 2 ++ htdocs/compta/facture/tpl/linkedobjectblock.tpl.php | 2 ++ htdocs/core/class/html.form.class.php | 7 +++---- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php b/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php index 1b78370048a..61d79e4abbb 100644 --- a/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php +++ b/htdocs/comm/propal/tpl/linkedobjectblock.tpl.php @@ -43,6 +43,8 @@ $linkedObjectBlock = $GLOBALS['linkedObjectBlock']; // Load translation files required by the page $langs->load("propal"); +$linkedObjectBlock = dol_sort_array($linkedObjectBlock, 'date', 'desc'); + $total=0; $ilink=0; foreach($linkedObjectBlock as $key => $objectlink) { diff --git a/htdocs/commande/tpl/linkedobjectblock.tpl.php b/htdocs/commande/tpl/linkedobjectblock.tpl.php index cce17b32695..1f8b440749f 100644 --- a/htdocs/commande/tpl/linkedobjectblock.tpl.php +++ b/htdocs/commande/tpl/linkedobjectblock.tpl.php @@ -39,6 +39,8 @@ $linkedObjectBlock = $GLOBALS['linkedObjectBlock']; // Load translation files required by the page $langs->load("orders"); +$linkedObjectBlock = dol_sort_array($linkedObjectBlock, 'date', 'desc'); + $total=0; $ilink=0; foreach($linkedObjectBlock as $key => $objectlink) { diff --git a/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php b/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php index 97f0b876abc..a9fbb5da2eb 100644 --- a/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php +++ b/htdocs/compta/facture/tpl/linkedobjectblock.tpl.php @@ -38,6 +38,8 @@ $linkedObjectBlock = $GLOBALS['linkedObjectBlock']; $langs->load("bills"); +$linkedObjectBlock = dol_sort_array($linkedObjectBlock, 'date', 'desc'); + $total=0; $ilink=0; foreach($linkedObjectBlock as $key => $objectlink) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 63246fb0287..c4aaab27a84 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -6480,7 +6480,7 @@ class Form public function showLinkedObjectBlock($object, $morehtmlright = '', $compatibleImportElementsList = false) { global $conf,$langs,$hookmanager; - global $bc; + global $bc, $action; $object->fetchObjectLinked(); @@ -6525,6 +6525,7 @@ class Form $showImportButton=true; } + $regs = array(); if ($objecttype != 'supplier_proposal' && preg_match('/^([^_]+)_([^_]+)/i', $objecttype, $regs)) { $element = $regs[1]; @@ -6628,7 +6629,7 @@ class Form public function showLinkToObjectBlock($object, $restrictlinksto = array(), $excludelinksto = array()) { global $conf, $langs, $hookmanager; - global $bc; + global $bc, $action; $linktoelem=''; $linktoelemlist=''; @@ -6663,8 +6664,6 @@ class Form ); } - global $action; - // Can complete the possiblelink array $hookmanager->initHooks(array('commonobject')); $parameters=array('listofidcompanytoscan' => $listofidcompanytoscan); From c62f37095909cc179b3c1b10fdf120b85e2fb395 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Mon, 17 Jun 2019 16:30:56 +0200 Subject: [PATCH 0843/1036] FIX: Wrong stock movement on supplier credit notes --- htdocs/fourn/class/fournisseur.facture.class.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 3a27690e7ac..f96caf89207 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -9,7 +9,7 @@ * Copyright (C) 2013 Florian Henry * Copyright (C) 2014-2016 Marcos García * Copyright (C) 2015 Bahfir Abbes - * Copyright (C) 2015 Ferran Marcet + * Copyright (C) 2015-2019 Ferran Marcet * Copyright (C) 2016 Alexandre Spangaro * Copyright (C) 2018 Nicolas ZABOURI * @@ -1318,7 +1318,8 @@ class FactureFournisseur extends CommonInvoice // We increase stock for product $up_ht_disc=$this->lines[$i]->pu_ht; if (! empty($this->lines[$i]->remise_percent) && empty($conf->global->STOCK_EXCLUDE_DISCOUNT_FOR_PMP)) $up_ht_disc=price2num($up_ht_disc * (100 - $this->lines[$i]->remise_percent) / 100, 'MU'); - $result=$mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans("InvoiceValidatedInDolibarr",$num)); + if ($this->type == FactureFournisseur::TYPE_CREDIT_NOTE) $result=$mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans("InvoiceValidatedInDolibarr",$num)); + else $result=$mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $up_ht_disc, $langs->trans("InvoiceValidatedInDolibarr",$num)); if ($result < 0) { $error++; } unset($this->line); } @@ -1441,7 +1442,8 @@ class FactureFournisseur extends CommonInvoice $mouvP = new MouvementStock($this->db); $mouvP->origin = &$this; // We increase stock for product - $result=$mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans("InvoiceBackToDraftInDolibarr", $this->ref)); + if ($this->type == FactureFournisseur::TYPE_CREDIT_NOTE) $result=$mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans("InvoiceBackToDraftInDolibarr", $this->ref)); + else $result=$mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans("InvoiceBackToDraftInDolibarr", $this->ref)); } } } From 2fab35c28715a96d2a41efda693fc428bc54a81a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 17:20:22 +0200 Subject: [PATCH 0844/1036] Debug page to export file --- htdocs/compta/compta-files.php | 87 ++++++++++--------------- htdocs/core/menus/init_menu_auguria.sql | 2 + 2 files changed, 37 insertions(+), 52 deletions(-) diff --git a/htdocs/compta/compta-files.php b/htdocs/compta/compta-files.php index 87efafd3405..656824298fe 100644 --- a/htdocs/compta/compta-files.php +++ b/htdocs/compta/compta-files.php @@ -106,7 +106,7 @@ if(($action=="searchfiles" || $action=="dl" ) && $date_start && $date_stop) { $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; $sql.=" AND fk_statut <> ".ExpenseReport::STATUS_DRAFT; $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref,paid,amount as total_ttc, '0' as fk_soc, datedon as date, 'Donation' as item FROM ".MAIN_DB_PREFIX."don"; + $sql.=" SELECT rowid as id, ref, paid, amount as total_ttc, '0' as fk_soc, datedon as date, 'Donation' as item FROM ".MAIN_DB_PREFIX."don"; $sql.=" WHERE datedon between ".$wheretail; $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; $sql.=" AND fk_statut <> ".Don::STATUS_DRAFT; @@ -143,56 +143,63 @@ if(($action=="searchfiles" || $action=="dl" ) && $date_start && $date_stop) { switch($objd->item) { case "Invoice": - $subdir=dol_sanitizeFileName($objd->ref); + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); $upload_dir = $conf->facture->dir_output.'/'.$subdir; $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; break; case "SupplierInvoice": - $tmpinvoicesupplier->fetch($objd->id); - $subdir=get_exdir($tmpinvoicesupplier->id, 2, 0, 0, $tmpinvoicesupplier, 'invoice_supplier').'/'.dol_sanitizeFileName($objd->ref); + $tmpinvoicesupplier->fetch($objd->id); + $subdir = get_exdir($tmpinvoicesupplier->id, 2, 0, 1, $tmpinvoicesupplier, 'invoice_supplier'); // TODO Use first file + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; break; case "ExpenseReport": - $subdir=dol_sanitizeFileName($objd->ref); + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; break; case "SalaryPayment": - $subdir=dol_sanitizeFileName($objd->id); + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); $upload_dir = $conf->salaries->dir_output.'/'.$subdir; $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; break; case "Donation": $tmpdonation->fetch($objp->id); - $subdir=get_exdir(0, 0, 0, 1, $tmpdonation, 'donation'). '/'. dol_sanitizeFileName($objd->id); + $subdir=get_exdir(0, 0, 0, 0, $tmpdonation, 'donation'); + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); $upload_dir = $conf->don->dir_output . '/' . $subdir; $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; break; case "SocialContributions": - $subdir=dol_sanitizeFileName($objd->id); + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); $upload_dir = $conf->tax->dir_output . '/' . $subdir; $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; break; default: - $subdir=''; - $upload_dir=''; - $link=''; + $subdir = ''; + $upload_dir = ''; + $link = ''; break; } if (!empty($upload_dir)) { $result=true; + $files=dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview\.png)$', '', SORT_ASC, 1); - //var_dump($upload_dir); + if (count($files) < 1) { $nofile['id']=$objd->id; $nofile['date']=$db->idate($objd->date); $nofile['paid']=$objd->paid; $nofile['amount']=$objd->total_ttc; - $nofile['ref']=$objd->ref; + $nofile['ref']=($objd->ref ? $objd->ref : $objd->id); $nofile['fk']=$objd->fk_soc; $nofile['item']=$objd->item; @@ -206,7 +213,7 @@ if(($action=="searchfiles" || $action=="dl" ) && $date_start && $date_stop) { $file['date']=$db->idate($objd->date); $file['paid']=$objd->paid; $file['amount']=$objd->total_ttc; - $file['ref']=$objd->ref; + $file['ref']=($objd->ref ? $objd->ref : $objd->id); $file['fk']=$objd->fk_soc; $file['item']=$objd->item; $file['link']=$link.$file['name']; @@ -300,42 +307,15 @@ print ''; print $langs->trans("ReportPeriod").': '.$form->selectDate($date_start, 'date_start', 0, 0, 0, "", 1, 1, 0); print ' - '.$form->selectDate($date_stop, 'date_stop', 0, 0, 0, "", 1, 1, 0)."\n"; -// Multicompany -/*if (! empty($conf->multicompany->enabled) && is_object($mc)) - { - print '
'; - // This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module - if (method_exists($mc, 'formObjectOptions')) - { - if (empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) && $conf->entity == 1 && $user->admin && ! $user->entity) // condition must be same for create and edit mode - { - print "
".''; - print "\n"; - } - else - { - print ''; - } - } - $object = new stdClass(); - // Other attributes - $parameters=array('objectsrc' => null, 'colspan' => ' colspan="3"'); - $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - if (empty($reshook)) - { - print $object->showOptionals($extrafields, 'edit'); - } - }*/ +// Export is for current company only ! if (! empty($conf->multicompany->enabled) && is_object($mc)) { - print '   -   '.$langs->trans("Entity").' : '; + print '('.$langs->trans("Entity").' : '; $mc->dao->getEntities(); $mc->dao->fetch($conf->entity); print $mc->dao->label; - print "
\n"; + print ")
\n"; } print ''."\n"; @@ -376,10 +356,10 @@ if (!empty($date_start) && !empty($date_stop)) print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print '
'; if (! empty($action->userownerid)) { - $userstatic->fetch($action->userownerid); // TODO Introduce a cache on users fetched - print $userstatic->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', ''); + if (is_object($cacheusers[$action->userownerid])) + { + $tmpuser = $cacheusers[$action->userownerid]; + } + else + { + $tmpuser = new User($this->db); + $tmpuser->fetch($action->userownerid); + $cacheusers[$action->userownerid] = $tmpuser; + } + if ($tmpuser->id > 0) + { + print $tmpuser->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', ''); + } } print ''; - if (! empty($action->author->id)) - { - print $action->getLibStatut(3); - } + print $action->getLibStatut(3); print '
'; - if (($customerstripe->default_source != $src->id)) + if ((empty($customerstripe->invoice_settings) && $customerstripe->default_source != $src->id) || + (! empty($customerstripe->invoice_settings) && $customerstripe->invoice_settings->default_payment_method != $src->id)) { print ''; print img_picto($langs->trans("Default"), 'off'); diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index de43c063922..dd66c7607e5 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -237,6 +237,33 @@ class Stripe extends CommonObject return $customer; } + /** + * Get the Stripe payment method Object from its ID + * + * @param string $paymentmethod Payment Method ID + * @param string $key ''=Use common API. If not '', it is the Stripe connect account 'acc_....' to use Stripe connect + * @param int $status Status (0=test, 1=live) + * @return \Stripe\PaymentMethod|null Stripe PaymentMethod or null if not found + */ + public function getPaymentMethodStripe($paymentmethod, $key = '', $status = 0) + { + try { + // Force to use the correct API key + global $stripearrayofkeysbyenv; + \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status]['secret_key']); + if (empty($key)) { // If the Stripe connect account not set, we use common API usage + $stripepaymentmethod = \Stripe\PaymentMethod::retrieve(''.$paymentmethod->id.''); + } else { + $stripepaymentmethod = \Stripe\PaymentMethod::retrieve(''.$paymentmethod->id.'', array("stripe_account" => $key)); + } + } + catch(Exception $e) + { + $this->error = $e->getMessage(); + } + return $stripepaymentmethod; + } + /** * Get the Stripe payment intent. Create it with confirm=false * Warning. If a payment was tried and failed, a payment intent was created. @@ -259,7 +286,7 @@ class Stripe extends CommonObject */ public function getPaymentIntent($amount, $currency_code, $tag, $description = '', $object = null, $customer = null, $key = null, $status = 0, $usethirdpartyemailforreceiptemail = 0, $mode = 'automatic', $confirmnow = false) { - global $conf, $user, $mysoc; + global $conf; dol_syslog("getPaymentIntent"); @@ -272,12 +299,14 @@ class Stripe extends CommonObject if (! in_array($currency_code, $arrayzerounitcurrency)) $stripeamount = $amount * 100; else $stripeamount = $amount; - $fee = round(($$stripeamount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE) * 100); - if ($fee >= ($conf->global->STRIPE_APPLICATION_FEE_MAXIMAL * 100) && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL>$conf->global->STRIPE_APPLICATION_FEE_MINIMAL) { - $fee = round($conf->global->STRIPE_APPLICATION_FEE_MAXIMAL * 100); - } elseif ($fee < ($conf->global->STRIPE_APPLICATION_FEE_MINIMAL * 100)) { - $fee = round($conf->global->STRIPE_APPLICATION_FEE_MINIMAL * 100); + $fee = round($amount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE); + if ($fee >= $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL > $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) { + $fee = round($conf->global->STRIPE_APPLICATION_FEE_MAXIMAL); + } elseif ($fee < $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) { + $fee = round($conf->global->STRIPE_APPLICATION_FEE_MINIMAL); } + if (! in_array($currency_code, $arrayzerounitcurrency)) $stripefee = $fee * 100; + else $stripefee = $fee; $paymentintent = null; @@ -352,9 +381,9 @@ class Stripe extends CommonObject // payment_method_types = array('card') //var_dump($dataforintent); - if ($conf->entity!=$conf->global->STRIPECONNECT_PRINCIPAL && $fee>0) + if ($conf->entity!=$conf->global->STRIPECONNECT_PRINCIPAL && $stripefee > 0) { - $dataforintent["application_fee"] = $fee; + $dataforintent["application_fee"] = $stripefee; } if ($usethirdpartyemailforreceiptemail && is_object($object) && $object->thirdparty->email) { @@ -461,8 +490,7 @@ class Stripe extends CommonObject $sql = "SELECT sa.stripe_card_ref, sa.proprio, sa.exp_date_month, sa.exp_date_year, sa.number, sa.cvn"; // stripe_card_ref is card_.... $sql.= " FROM " . MAIN_DB_PREFIX . "societe_rib as sa"; - $sql.= " WHERE sa.rowid = " . $object->id; - //$sql.= " AND sa.entity IN (".getEntity('societe').")"; + $sql.= " WHERE sa.rowid = " . $object->id; // We get record from ID, no need for filter on entity $sql.= " AND sa.type = 'card'"; dol_syslog(get_class($this) . "::fetch search stripe card id for paymentmode id=".$object->id.", stripeacc=".$stripeacc.", status=".$status.", createifnotlinkedtostripe=".$createifnotlinkedtostripe, LOG_DEBUG); @@ -660,13 +688,15 @@ class Stripe extends CommonObject $charge = \Stripe\Charge::create($paymentarray, array("idempotency_key" => "$description")); } } else { - $fee = round(($object->total_ttc * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE) * 100); - if ($fee >= ($conf->global->STRIPE_APPLICATION_FEE_MAXIMAL * 100) && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL>$conf->global->STRIPE_APPLICATION_FEE_MINIMAL) { - $fee = round($conf->global->STRIPE_APPLICATION_FEE_MAXIMAL * 100); + $fee = round($amount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE); + if ($fee >= $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL > $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) { + $fee = round($conf->global->STRIPE_APPLICATION_FEE_MAXIMAL); } - elseif ($fee < ($conf->global->STRIPE_APPLICATION_FEE_MINIMAL * 100)) { - $fee = round($conf->global->STRIPE_APPLICATION_FEE_MINIMAL * 100); + elseif ($fee < $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) { + $fee = round($conf->global->STRIPE_APPLICATION_FEE_MINIMAL); } + if (! in_array($currency, $arrayzerounitcurrency)) $stripefee = $fee * 100; + else $stripefee = $fee; $paymentarray = array( "amount" => "$stripeamount", @@ -678,9 +708,9 @@ class Stripe extends CommonObject "source" => "$source", "customer" => "$customer" ); - if ($conf->entity!=$conf->global->STRIPECONNECT_PRINCIPAL && $fee>0) + if ($conf->entity!=$conf->global->STRIPECONNECT_PRINCIPAL && $stripefee > 0) { - $paymentarray["application_fee"] = $fee; + $paymentarray["application_fee"] = $stripefee; } if ($societe->email && $usethirdpartyemailforreceiptemail) { From efb9a30ec16c800c527df927e97a1248710aeaae Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 16 Jun 2019 17:17:07 +0200 Subject: [PATCH 0831/1036] Fix compatibility with payment modes --- htdocs/societe/paymentmodes.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 24329a48a33..6a3596f6e24 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -614,8 +614,14 @@ if (empty($reshook)) { try { $cu=$stripe->customerStripe($object, $stripeacc, $servicestatus); - $cu->default_source = (string) $source; // Old - $cu->invoice_settings->default_payment_method = (string) $source; // New + if (preg_match('/pm_/', $source)) + { + $cu->invoice_settings->default_payment_method = (string) $source; // New + } + else + { + $cu->default_source = (string) $source; // Old + } $result = $cu->save(); $url=DOL_URL_ROOT.'/societe/paymentmodes.php?socid='.$object->id; From badfd47ee79122c46e6f5a3e4ef2f3570156051f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 16 Jun 2019 17:25:42 +0200 Subject: [PATCH 0832/1036] Fix migration --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index e353f317b45..40f7da3fa95 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -228,6 +228,7 @@ CREATE TABLE llx_bom_bom( ALTER TABLE llx_bom_bom ADD COLUMN efficiency double(8,4) DEFAULT 1; ALTER TABLE llx_bom_bom ADD COLUMN entity integer DEFAULT 1 NOT NULL; +ALTER TABLE llx_bom_bom ADD COLUMN date_valid datetime; create table llx_bom_bom_extrafields ( @@ -254,7 +255,6 @@ CREATE TABLE llx_bom_bomline( ALTER TABLE llx_bom_bomline ADD COLUMN efficiency double(8,4) DEFAULT 1; ALTER TABLE llx_bom_bomline ADD COLUMN fk_bom_child integer NULL; - create table llx_bom_bomline_extrafields ( rowid integer AUTO_INCREMENT PRIMARY KEY, From dd5e42e3253b22d69a0c465e101a97e6f0871dc7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 16 Jun 2019 22:17:04 +0200 Subject: [PATCH 0833/1036] FIX #11325 FIX #5249 --- htdocs/projet/tasks/time.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index f3da816fabd..766c2b38e2d 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -467,7 +467,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $object->project = clone $projectstatic; } - $userWrite = $projectstatic->restrictedProjectArea($user, 'write'); + $userRead = $projectstatic->restrictedProjectArea($user, 'read'); $linktocreatetime = ''; if ($projectstatic->id > 0) @@ -582,9 +582,9 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $linktocreatetimeBtnStatus = 0; $linktocreatetimeUrl = ''; $linktocreatetimeHelpText = ''; - if ($user->rights->projet->all->creer || $user->rights->projet->creer) + if ($user->rights->projet->all->lire || $user->rights->projet->lire) // To enter time, read permission is enough { - if ($projectstatic->public || $userWrite > 0) + if ($projectstatic->public || $userRead > 0) { $linktocreatetimeBtnStatus = 1; @@ -1017,7 +1017,12 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) // Duration - Time spent print ''; - print $form->select_duration('timespent_duration', ($_POST['timespent_duration']?$_POST['timespent_duration']:''), 0, 'text'); + $durationtouse = ($_POST['timespent_duration']?$_POST['timespent_duration']:''); + if (GETPOSTISSET('timespent_durationhour') || GETPOSTISSET('timespent_durationmin')) + { + $durationtouse = (GETPOST('timespent_durationhour') * 3600 + GETPOST('timespent_durationmin') * 60); + } + print $form->select_duration('timespent_duration', $durationtouse, 0, 'text'); print ''; - print $form->select_duration('timespent_duration', ($_POST['timespent_duration']?$_POST['timespent_duration']:''), 0, 'text'); + $durationtouse = ($_POST['timespent_duration']?$_POST['timespent_duration']:''); + if (GETPOSTISSET('timespent_durationhour') || GETPOSTISSET('timespent_durationmin')) + { + $durationtouse = (GETPOST('timespent_durationhour') * 3600 + GETPOST('timespent_durationmin') * 60); + } + print $form->select_duration('timespent_duration', $durationtouse, 0, 'text'); print '
'.$form->editfieldkey('ProspectCustomer', 'customerprospect', '', $object, 0, 'string', '', 1).''; - $selected=GETPOST('client', 'int')!=''?GETPOST('client', 'int'):$object->client; + $selected=(GETPOSTISSET('client', 'int')?GETPOST('client', 'int'):$object->client); print $formcompany->selectProspectCustomerType($selected); print '
'.$langs->trans("Entity").'".$mc->select_entities($entity); - print "
'; print ''; - print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder); + print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, 'class="nowrap"', $sortfield, $sortorder); print ''; print ''; - print ''; + print ''; print ''; print ''; print ''; @@ -402,12 +382,10 @@ if (!empty($date_start) && !empty($date_stop)) // Balance calculation $balance = 0; foreach($TData as &$data1) { - if ($data1['item']!='Invoice'&& $data1['item']!='Donation' ){ + if ($data1['item']!='Invoice' && $data1['item']!='Donation') + { $data1['amount']=-$data1['amount']; } - if ($data1['amount']>0){ - }else{ - } $balance += $data1['amount']; $data1['balance'] = $balance; } @@ -419,14 +397,19 @@ if (!empty($date_start) && !empty($date_stop)) //if (!empty($data['fk_facture'])) $html_class = 'facid-'.$data['fk_facture']; //elseif (!empty($data['fk_paiement'])) $html_class = 'payid-'.$data['fk_paiement']; print ''; - print "\n"; print ''; print ''; // File link - print '\n"; + print '\n"; print ''; print '\n"; diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 3a4ec85ec58..c7b2c8a69a7 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -281,6 +281,8 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2430__+MAX_llx_menu__, 'accountancy', 'bookkeeping', 2400__+MAX_llx_menu__, '/accountancy/bookkeeping/list.php?mainmenu=accountancy&leftmenu=accountancy_bookeeping', 'Bookkeeping', 1, 'accountancy', '$user->rights->accounting->mouvements->lire', '', 0, 15, __ENTITY__); -- Balance insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2435__+MAX_llx_menu__, 'accountancy', 'balance', 2400__+MAX_llx_menu__, '/accountancy/bookkeeping/balance.php?mainmenu=accountancy&leftmenu=accountancy_balance', 'AccountBalance', 1, 'accountancy', '$user->rights->accounting->mouvements->lire', '', 0, 16, __ENTITY__); + -- Export accounting documents + insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2436__+MAX_llx_menu__, 'accountancy', 'accountancy_files', 2400__+MAX_llx_menu__, '/compta/compta-files.php?mainmenu=accountancy&leftmenu=accountancy_files', 'AccountantFiles', 1, 'accountancy', '$user->rights->accounting->mouvements->lire', '', 0, 17, __ENTITY__); -- Reports insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled', __HANDLER__, 'left', 2440__+MAX_llx_menu__, 'accountancy', 'accountancy_report', 2400__+MAX_llx_menu__, '/compta/resultat/index.php?mainmenu=accountancy&leftmenu=accountancy_report', 'Reportings', 1, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 17, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->accounting->enabled && $leftmenu=="accountancy_report"', __HANDLER__, 'left', 2441__+MAX_llx_menu__, 'accountancy', 'accountancy_report', 2440__+MAX_llx_menu__, '/compta/resultat/index.php?mainmenu=accountancy&leftmenu=accountancy_report', 'MenuReportInOut', 2, 'main', '$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire', '', 0, 18, __ENTITY__); From 08d5ca4ddbc47fcbcddf94a471657dda1e81cb9e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 17:53:43 +0200 Subject: [PATCH 0845/1036] Debug page to export accounting documents --- htdocs/admin/delais.php | 1 - htdocs/admin/mails_emailing.php | 3 +- htdocs/admin/menus/edit.php | 1 - htdocs/admin/sms.php | 2 +- htdocs/cashdesk/css/style.css | 2 +- ...{compta-files.php => accounting-files.php} | 292 ++++++++++-------- htdocs/core/menus/standard/eldy.lib.php | 8 +- htdocs/expensereport/list.php | 2 +- htdocs/fourn/facture/card.php | 2 +- htdocs/holiday/card.php | 5 +- htdocs/holiday/list.php | 3 +- .../modulebuilder/template/myobject_card.php | 1 + htdocs/opensurvey/results.php | 2 +- htdocs/opensurvey/wizard/choix_date.php | 10 +- htdocs/opensurvey/wizard/create_survey.php | 2 +- htdocs/product/admin/product_tools.php | 3 +- htdocs/theme/eldy/btn.inc.php | 2 +- htdocs/theme/eldy/global.inc.php | 2 +- htdocs/theme/md/style.css.php | 4 +- 19 files changed, 188 insertions(+), 159 deletions(-) rename htdocs/compta/{compta-files.php => accounting-files.php} (60%) diff --git a/htdocs/admin/delais.php b/htdocs/admin/delais.php index 1d05d5e0afe..6b46468b916 100644 --- a/htdocs/admin/delais.php +++ b/htdocs/admin/delais.php @@ -418,7 +418,6 @@ if($action == 'edit') { print '
'; } else { - // Boutons d'action print '
'; } diff --git a/htdocs/admin/mails_emailing.php b/htdocs/admin/mails_emailing.php index 1e54fdea3dd..12076a00579 100644 --- a/htdocs/admin/mails_emailing.php +++ b/htdocs/admin/mails_emailing.php @@ -493,7 +493,8 @@ else } - // Boutons actions + // Buttons for actions + print '
'; print ''.$langs->trans("Modify").''; diff --git a/htdocs/admin/menus/edit.php b/htdocs/admin/menus/edit.php index b4f5fbd3355..cf42f294d03 100644 --- a/htdocs/admin/menus/edit.php +++ b/htdocs/admin/menus/edit.php @@ -415,7 +415,6 @@ if ($action == 'create') dol_fiche_end(); - // Boutons print '
'; print ''; print '     '; diff --git a/htdocs/admin/sms.php b/htdocs/admin/sms.php index 2fb1e5a8a29..d6f2ee170d8 100644 --- a/htdocs/admin/sms.php +++ b/htdocs/admin/sms.php @@ -243,7 +243,7 @@ else print '
'.$langs->trans("Type").''.$langs->trans("Ref").''.$langs->trans("Link").''.$langs->trans("Document").''.$langs->trans("Paid").''.$langs->trans("Debit").''.$langs->trans("Credit").'
"; + print ""; print dol_print_date($data['date'], 'day'); print "'.$langs->trans($data['item']).''.$data['ref'].'".$data['name']."'; + if ($data['link']) + { + print ''.($data['name'] ? $data['name'] : $data['ref']).''; + } + print "'.$data['paid'].''.(($data['amount'] > 0) ? price(abs($data['amount'])) : '')."
'; - // Boutons actions + // Buttons for actions print '
'; diff --git a/htdocs/cashdesk/css/style.css b/htdocs/cashdesk/css/style.css index dc579711aa3..9d9be27f3ce 100644 --- a/htdocs/cashdesk/css/style.css +++ b/htdocs/cashdesk/css/style.css @@ -320,7 +320,7 @@ p.titre { padding: 2px 2px; } -/* -------------- Boutons --------------------- */ +/* -------------- Buttons for SimplePOS --------------------- */ .bouton_ajout_article { margin-top: 10px; width: 60%; diff --git a/htdocs/compta/compta-files.php b/htdocs/compta/accounting-files.php similarity index 60% rename from htdocs/compta/compta-files.php rename to htdocs/compta/accounting-files.php index 656824298fe..5a3097f6aa8 100644 --- a/htdocs/compta/compta-files.php +++ b/htdocs/compta/accounting-files.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2018 Laurent Destailleur + * Copyright (C) 2004-2019 Laurent Destailleur * Copyright (C) 2017 Pierre-Henry Favre * * This program is free software; you can redistribute it and/or modify @@ -16,11 +16,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -/** - * \file htdocs/compta/compta-files.php + + /** + * \file htdocs/compta/accounting-files.php * \ingroup compta * \brief Page to show portoflio and files of a thirdparty and download it */ + require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; @@ -89,149 +91,165 @@ $entity = GETPOST('entity', 'int')?GETPOST('entity', 'int'):$conf->entity; $filesarray=array(); $result=false; -if(($action=="searchfiles" || $action=="dl" ) && $date_start && $date_stop) { - $wheretail=" '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'"; - $sql="SELECT rowid as id, ref as ref, paye as paid, total_ttc, fk_soc, datef as date, 'Invoice' as item FROM ".MAIN_DB_PREFIX."facture"; - $sql.=" WHERE datef between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".Facture::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paye as paid, total_ttc, fk_soc, datef as date, 'SupplierInvoice' as item FROM ".MAIN_DB_PREFIX."facture_fourn"; - $sql.=" WHERE datef between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".FactureFournisseur::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paid, total_ttc, fk_user_author as fk_soc, date_fin as date, 'ExpenseReport' as item FROM ".MAIN_DB_PREFIX."expensereport"; - $sql.=" WHERE date_fin between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".ExpenseReport::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paid, amount as total_ttc, '0' as fk_soc, datedon as date, 'Donation' as item FROM ".MAIN_DB_PREFIX."don"; - $sql.=" WHERE datedon between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".Don::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, label as ref, 1 as paid, amount as total_ttc, fk_user as fk_soc,datep as date, 'SalaryPayment' as item FROM ".MAIN_DB_PREFIX."payment_salary"; - $sql.=" WHERE datep between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - //$sql.=" AND fk_statut <> ".PaymentSalary::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, libelle as ref, paye as paid, amount as total_ttc, 0 as fk_soc, date_creation as date, 'SocialContributions' as item FROM ".MAIN_DB_PREFIX."chargesociales"; - $sql.=" WHERE date_creation between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - //$sql.=" AND fk_statut <> ".ChargeSociales::STATUS_DRAFT; - $sql.= $db->order($sortfield, $sortorder); +if (($action=="searchfiles" || $action=="dl" )) { - $resd = $db->query($sql); - $files=array(); - $link=''; + if (empty($date_start)) + { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateStart")), null, 'errors'); + $error++; + } + if (empty($date_stop)) + { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors'); + $error++; + } - if ($resd) - { - $numd = $db->num_rows($resd); + if (! $error) + { + $wheretail=" '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'"; - $tmpinvoice=new Facture($db); - $tmpinvoicesupplier=new FactureFournisseur($db); - $tmpdonation=new Don($db); + $sql="SELECT rowid as id, ref as ref, paye as paid, total_ttc, fk_soc, datef as date, 'Invoice' as item FROM ".MAIN_DB_PREFIX."facture"; + $sql.=" WHERE datef between ".$wheretail; + $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND fk_statut <> ".Facture::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT rowid as id, ref, paye as paid, total_ttc, fk_soc, datef as date, 'SupplierInvoice' as item FROM ".MAIN_DB_PREFIX."facture_fourn"; + $sql.=" WHERE datef between ".$wheretail; + $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND fk_statut <> ".FactureFournisseur::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT rowid as id, ref, paid, total_ttc, fk_user_author as fk_soc, date_fin as date, 'ExpenseReport' as item FROM ".MAIN_DB_PREFIX."expensereport"; + $sql.=" WHERE date_fin between ".$wheretail; + $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND fk_statut <> ".ExpenseReport::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT rowid as id, ref, paid, amount as total_ttc, '0' as fk_soc, datedon as date, 'Donation' as item FROM ".MAIN_DB_PREFIX."don"; + $sql.=" WHERE datedon between ".$wheretail; + $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND fk_statut <> ".Don::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT rowid as id, label as ref, 1 as paid, amount as total_ttc, fk_user as fk_soc,datep as date, 'SalaryPayment' as item FROM ".MAIN_DB_PREFIX."payment_salary"; + $sql.=" WHERE datep between ".$wheretail; + $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + //$sql.=" AND fk_statut <> ".PaymentSalary::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT rowid as id, libelle as ref, paye as paid, amount as total_ttc, 0 as fk_soc, date_creation as date, 'SocialContributions' as item FROM ".MAIN_DB_PREFIX."chargesociales"; + $sql.=" WHERE date_creation between ".$wheretail; + $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + //$sql.=" AND fk_statut <> ".ChargeSociales::STATUS_DRAFT; + $sql.= $db->order($sortfield, $sortorder); - $upload_dir =''; - $i=0; - while ($i < $numd) - { - $objd = $db->fetch_object($resd); + $resd = $db->query($sql); + $files=array(); + $link=''; - switch($objd->item) - { - case "Invoice": - $subdir = ''; - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->facture->dir_output.'/'.$subdir; - $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "SupplierInvoice": - $tmpinvoicesupplier->fetch($objd->id); - $subdir = get_exdir($tmpinvoicesupplier->id, 2, 0, 1, $tmpinvoicesupplier, 'invoice_supplier'); // TODO Use first file - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; - $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "ExpenseReport": - $subdir = ''; - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; - $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "SalaryPayment": - $subdir = ''; - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); - $upload_dir = $conf->salaries->dir_output.'/'.$subdir; - $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "Donation": - $tmpdonation->fetch($objp->id); - $subdir=get_exdir(0, 0, 0, 0, $tmpdonation, 'donation'); - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); - $upload_dir = $conf->don->dir_output . '/' . $subdir; - $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "SocialContributions": - $subdir = ''; - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); - $upload_dir = $conf->tax->dir_output . '/' . $subdir; - $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - default: - $subdir = ''; - $upload_dir = ''; - $link = ''; - break; - } + if ($resd) + { + $numd = $db->num_rows($resd); - if (!empty($upload_dir)) - { - $result=true; + $tmpinvoice=new Facture($db); + $tmpinvoicesupplier=new FactureFournisseur($db); + $tmpdonation=new Don($db); - $files=dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview\.png)$', '', SORT_ASC, 1); + $upload_dir =''; + $i=0; + while ($i < $numd) + { + $objd = $db->fetch_object($resd); - if (count($files) < 1) - { - $nofile['id']=$objd->id; - $nofile['date']=$db->idate($objd->date); - $nofile['paid']=$objd->paid; - $nofile['amount']=$objd->total_ttc; - $nofile['ref']=($objd->ref ? $objd->ref : $objd->id); - $nofile['fk']=$objd->fk_soc; - $nofile['item']=$objd->item; + switch($objd->item) + { + case "Invoice": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->facture->dir_output.'/'.$subdir; + $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "SupplierInvoice": + $tmpinvoicesupplier->fetch($objd->id); + $subdir = get_exdir($tmpinvoicesupplier->id, 2, 0, 1, $tmpinvoicesupplier, 'invoice_supplier'); // TODO Use first file + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; + $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "ExpenseReport": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; + $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "SalaryPayment": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->salaries->dir_output.'/'.$subdir; + $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "Donation": + $tmpdonation->fetch($objp->id); + $subdir=get_exdir(0, 0, 0, 0, $tmpdonation, 'donation'); + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->don->dir_output . '/' . $subdir; + $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "SocialContributions": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->tax->dir_output . '/' . $subdir; + $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + default: + $subdir = ''; + $upload_dir = ''; + $link = ''; + break; + } - $filesarray[]=$nofile; - } - else - { - foreach ($files as $key => $file) - { - $file['id']=$objd->id; - $file['date']=$db->idate($objd->date); - $file['paid']=$objd->paid; - $file['amount']=$objd->total_ttc; - $file['ref']=($objd->ref ? $objd->ref : $objd->id); - $file['fk']=$objd->fk_soc; - $file['item']=$objd->item; - $file['link']=$link.$file['name']; - $file['relpathnamelang'] = $langs->trans($file['item']).'/'.$file['name']; + if (!empty($upload_dir)) + { + $result=true; - $filesarray[]=$file; - } - } - } - $i++; - } - } - else - { - dol_print_error($db); - } + $files=dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview\.png)$', '', SORT_ASC, 1); - $db->free($resd); + if (count($files) < 1) + { + $nofile['id']=$objd->id; + $nofile['date']=$db->idate($objd->date); + $nofile['paid']=$objd->paid; + $nofile['amount']=$objd->total_ttc; + $nofile['ref']=($objd->ref ? $objd->ref : $objd->id); + $nofile['fk']=$objd->fk_soc; + $nofile['item']=$objd->item; + + $filesarray[]=$nofile; + } + else + { + foreach ($files as $key => $file) + { + $file['id']=$objd->id; + $file['date']=$db->idate($objd->date); + $file['paid']=$objd->paid; + $file['amount']=$objd->total_ttc; + $file['ref']=($objd->ref ? $objd->ref : $objd->id); + $file['fk']=$objd->fk_soc; + $file['item']=$objd->item; + $file['link']=$link.$file['name']; + $file['relpathnamelang'] = $langs->trans($file['item']).'/'.$file['name']; + + $filesarray[]=$file; + } + } + } + $i++; + } + } + else + { + dol_print_error($db); + } + + $db->free($resd); + } } /* @@ -318,7 +336,9 @@ if (! empty($conf->multicompany->enabled) && is_object($mc)) print ")\n"; } -print ''."\n"; +print ''; + +print ''."\n"; dol_fiche_end(); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 3576f35642e..7518093bf77 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1287,7 +1287,7 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM // Files if (! empty($conf->global->MAIN_FEATURES_LEVEL) && $conf->global->MAIN_FEATURES_LEVEL >= 1) { - $newmenu->add("/compta/compta-files.php?mainmenu=accountancy&leftmenu=accountancy_files", $langs->trans("AccountantFiles"), 1, $user->rights->accounting->mouvements->lire); + $newmenu->add("/compta/accounting-files.php?mainmenu=accountancy&leftmenu=accountancy_files", $langs->trans("AccountantFiles"), 1, $user->rights->accounting->mouvements->lire); } // Reports @@ -1329,6 +1329,12 @@ function print_left_eldy_menu($db, $menu_array_before, $menu_array_after, &$tabM // Accountancy (simple) if (! empty($conf->comptabilite->enabled)) { + // Files + if (! empty($conf->global->MAIN_FEATURES_LEVEL) && $conf->global->MAIN_FEATURES_LEVEL >= 1) + { + $newmenu->add("/compta/accounting-files.php?mainmenu=accountancy&leftmenu=accountancy_files", $langs->trans("AccountantFiles"), 0, $user->rights->compta->resultat->lire, '', $mainmenu, 'files'); + } + // Bilan, resultats $newmenu->add("/compta/resultat/index.php?leftmenu=report&mainmenu=accountancy", $langs->trans("Reportings"), 0, $user->rights->compta->resultat->lire, '', $mainmenu, 'ca'); diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 94033912a69..34cbdfe89bd 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -434,7 +434,7 @@ if ($resql) $canedit=((in_array($user_id, $childids) && $user->rights->expensereport->creer) || ($conf->global->MAIN_USE_ADVANCED_PERMS && $user->rights->expensereport->writeall_advance)); - // Boutons d'actions + // Buttons for actions if ($canedit) { print ''.$langs->trans("AddTrip").''; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 2cd27d6d688..1eb38cec66c 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -3021,7 +3021,7 @@ else if ($action != 'presend') { /* - * Boutons actions + * Buttons actions */ print '
'; diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 6c4cb05a17e..c67daf8f92b 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -1391,9 +1391,10 @@ else if (! $edit) { - print '
'; + // Buttons for actions + + print '
'; - // Boutons d'actions if ($cancreate && $object->statut == Holiday::STATUS_DRAFT) { print ''.$langs->trans("EditCP").''; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 84e7b36c239..ce038709fcf 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -319,11 +319,12 @@ if ($id > 0) // For user tab dol_fiche_end(); + // Buttons for actions + print '
'; $canedit=(($user->id == $user_id && $user->rights->holiday->write) || ($user->id != $user_id && $user->rights->holiday->write_all)); - // Boutons d'actions if ($canedit) { print ''.$langs->trans("AddCP").''; diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index da6f3c5a466..cc2eb5062cb 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -421,6 +421,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea // Buttons for actions + if ($action != 'presend' && $action != 'editline') { print '
'."\n"; $parameters=array(); diff --git a/htdocs/opensurvey/results.php b/htdocs/opensurvey/results.php index 076461043b8..c648b15664e 100644 --- a/htdocs/opensurvey/results.php +++ b/htdocs/opensurvey/results.php @@ -619,7 +619,7 @@ print ''."\n"; print ''."\n"; print ''."\n"; -//boucle pour l'affichage des boutons de suppression de colonne +// loop to show the delete link if ($user->rights->opensurvey->write) { for ($i = 0; isset($toutsujet[$i]); $i++) { diff --git a/htdocs/opensurvey/wizard/choix_date.php b/htdocs/opensurvey/wizard/choix_date.php index 8840da3f3e7..76f390c470b 100644 --- a/htdocs/opensurvey/wizard/choix_date.php +++ b/htdocs/opensurvey/wizard/choix_date.php @@ -471,7 +471,7 @@ for ($i = 0; $i < $nbrejourmois + $premierjourmois; $i++) { { $nbofchoice=count($_SESSION["totalchoixjour"]); for ($j = 0; $j < $nbofchoice; $j++) { - //affichage des boutons ROUGES + // show red buttons if (date("j", $_SESSION["totalchoixjour"][$j]) == $numerojour && date("n", $_SESSION["totalchoixjour"][$j]) == $_SESSION["mois"] && date("Y", $_SESSION["totalchoixjour"][$j]) == $_SESSION["annee"]) { print ''."\n"; $dejafait = $numerojour; @@ -479,13 +479,13 @@ for ($i = 0; $i < $nbrejourmois + $premierjourmois; $i++) { } } - //Si pas de bouton ROUGE alors on affiche un bouton VERT ou GRIS avec le numéro du jour dessus + // If no red button, we show green or grey button with number of day if (isset($dejafait) === false || $dejafait != $numerojour){ - //bouton vert + // green button if (($numerojour >= $jourAJ && $_SESSION["mois"] == $moisAJ && $_SESSION["annee"] == $anneeAJ) || ($_SESSION["mois"] > $moisAJ && $_SESSION["annee"] == $anneeAJ) || $_SESSION["annee"] > $anneeAJ) { print ''."\n"; } else { - //bouton gris + // grey button print ''.$numerojour.''."\n"; } } @@ -547,7 +547,7 @@ if (issetAndNoEmpty('totalchoixjour', $_SESSION) || $erreur) print ''."\n"; - //affichage des boutons de formulaire pour annuler, effacer les jours ou créer le sondage + // show buttons to cancel, delete days or create survey print ''."\n"; print ''."\n"; print ''."\n"; diff --git a/htdocs/opensurvey/wizard/create_survey.php b/htdocs/opensurvey/wizard/create_survey.php index 0c746fcf8b2..c2e6db1a709 100644 --- a/htdocs/opensurvey/wizard/create_survey.php +++ b/htdocs/opensurvey/wizard/create_survey.php @@ -194,7 +194,7 @@ if (GETPOST('choix_sondage')) } else { - // affichage des boutons pour choisir sondage date ou autre + // Show image to selecte between date survey or other survey print '
'."\n"; print ' '."\n"; print ''."\n"; diff --git a/htdocs/product/admin/product_tools.php b/htdocs/product/admin/product_tools.php index e76c6884b7f..cfbedbcb7f1 100644 --- a/htdocs/product/admin/product_tools.php +++ b/htdocs/product/admin/product_tools.php @@ -333,7 +333,8 @@ else print '
'; - // Boutons actions + // Buttons for actions + print '
'; print ''; print '
'; diff --git a/htdocs/theme/eldy/btn.inc.php b/htdocs/theme/eldy/btn.inc.php index c0cd029126d..1d00718401b 100644 --- a/htdocs/theme/eldy/btn.inc.php +++ b/htdocs/theme/eldy/btn.inc.php @@ -5,7 +5,7 @@ if (! defined('ISLOADEDBYSTEELSHEET')) die('Must be call by steelsheet'); ?> /* ============================================================================== */ -/* Boutons actions */ +/* Buttons for actions */ /* ============================================================================== */ div.divButAction { diff --git a/htdocs/theme/eldy/global.inc.php b/htdocs/theme/eldy/global.inc.php index e5e68e59c48..9061595dd1d 100644 --- a/htdocs/theme/eldy/global.inc.php +++ b/htdocs/theme/eldy/global.inc.php @@ -2362,7 +2362,7 @@ span.tabspan { } /* ============================================================================== */ -/* Boutons actions */ +/* Buttons for actions */ /* ============================================================================== */ diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 752f60541d1..8020a490181 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -2400,7 +2400,7 @@ div.tabBar table.tableforservicepart2:last-child { } /* ============================================================================== */ -/* Boutons actions */ +/* Buttons for actions */ /* ============================================================================== */ div.divButAction { @@ -2503,7 +2503,7 @@ span.tabspan { } /* ============================================================================== */ -/* Boutons actions */ +/* Buttons for actions */ /* ============================================================================== */ div.divButAction { From f6f66f2a77ed56e5dc2798fc92792d29d59c11b8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 18:11:38 +0200 Subject: [PATCH 0846/1036] Fix syntax error --- htdocs/projet/tasks/time.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index e69f4fcd899..f98c9c4ace5 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -428,7 +428,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print '
'; // Link to create time - if ($user->rights->projet->all->lire || $user->rights->projet->lire)) // To enter time, read permission is enough + if ($user->rights->projet->all->lire || $user->rights->projet->lire) // To enter time, read permission is enough { if ($projectstatic->public || $userRead > 0) { From f6f86927113f99e52343b10db1438a4f666cd3db Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 18:12:28 +0200 Subject: [PATCH 0847/1036] Fix phpcs --- htdocs/bom/bom_card.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/bom/bom_card.php b/htdocs/bom/bom_card.php index c2ed2ca6705..d788be5354a 100644 --- a/htdocs/bom/bom_card.php +++ b/htdocs/bom/bom_card.php @@ -173,7 +173,6 @@ if (empty($reshook)) $action = ''; } } - } From bde49e05e7aca32b0da06eff0ed0b0235720134e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 18:23:38 +0200 Subject: [PATCH 0848/1036] Fix doc --- htdocs/societe/class/societeaccount.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/class/societeaccount.class.php b/htdocs/societe/class/societeaccount.class.php index 3fc7b225c77..a82ad69091b 100644 --- a/htdocs/societe/class/societeaccount.class.php +++ b/htdocs/societe/class/societeaccount.class.php @@ -320,7 +320,7 @@ class SocieteAccount extends CommonObject * @param string $id Id of customer in external system (example: 'cu_xxxxxxxxxxxxx', ...) * @param string $site Site (example: 'stripe', '...') * @param int $status Status (0=test, 1=live) - * @return string Id of third party + * @return int Id of third party * @see getCustomerAccount() */ public function getThirdPartyID($id, $site, $status = 0) From a6d4475afff68f0ce1c0e808aec631a553d97f6a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 18:24:45 +0200 Subject: [PATCH 0849/1036] Fix scrutinizer --- htdocs/stripe/class/stripe.class.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index dd66c7607e5..d754b8d3962 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -247,6 +247,8 @@ class Stripe extends CommonObject */ public function getPaymentMethodStripe($paymentmethod, $key = '', $status = 0) { + $stripepaymentmethod = null; + try { // Force to use the correct API key global $stripearrayofkeysbyenv; @@ -261,6 +263,7 @@ class Stripe extends CommonObject { $this->error = $e->getMessage(); } + return $stripepaymentmethod; } From 80d4d8754d5e548902878c50fca8a7571349e2a2 Mon Sep 17 00:00:00 2001 From: Eric Seigne <1468823+rycks@users.noreply.github.com> Date: Mon, 17 Jun 2019 18:28:11 +0200 Subject: [PATCH 0850/1036] allow zero as accountancy code nomber (replace all empty tests by != '') --- .../accountancy/bookkeeping/listbyaccount.php | 2 +- htdocs/accountancy/class/lettering.class.php | 30 +++++++++--------- htdocs/accountancy/journal/bankjournal.php | 14 ++++----- .../journal/expensereportsjournal.php | 14 ++++----- .../accountancy/journal/purchasesjournal.php | 2 +- htdocs/accountancy/journal/sellsjournal.php | 14 ++++----- htdocs/compta/journal/purchasesjournal.php | 4 +-- htdocs/compta/journal/sellsjournal.php | 2 +- .../core/class/html.formaccounting.class.php | 2 +- htdocs/core/lib/accounting.lib.php | 31 ++++++++++++++----- .../societe/mod_codecompta_panicum.php | 4 +-- htdocs/societe/class/societe.class.php | 4 +-- 12 files changed, 70 insertions(+), 53 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index d1ef1377994..bacfdcb714a 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -348,7 +348,7 @@ while ($i < min($num, $limit)) $colspan = 9; print "
"; print ''; print ''; diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index a0c977a8d5a..2a89c6c1c96 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -67,11 +67,11 @@ class Lettering extends BookKeeping $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_bookkeeping as bk"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "bank_url as bu ON(bk.fk_doc = bu.fk_bank AND bu.type IN ('payment', 'payment_supplier') ) "; $sql .= " WHERE ( "; - if (! empty($object->code_compta)) + if ($object->code_compta != "") $sql .= " bk.subledger_account = '" . $object->code_compta . "' "; - if (! empty($object->code_compta) && ! empty($object->code_compta_fournisseur)) + if ($object->code_compta != "" && $object->code_compta_fournisseur != "") $sql .= " OR "; - if (! empty($object->code_compta_fournisseur)) + if ($object->code_compta_fournisseur != "") $sql .= " bk.subledger_account = '" . $object->code_compta_fournisseur . "' "; $sql .= " ) AND (bk.date_lettering ='' OR bk.date_lettering IS NULL) "; @@ -99,13 +99,13 @@ class Lettering extends BookKeeping $sql .= " AND facf.entity = ".$conf->entity; $sql .= " AND code_journal IN (SELECT code FROM " . MAIN_DB_PREFIX . "accounting_journal WHERE nature=4 AND entity=".$conf->entity.") "; $sql .= " AND ( "; - if (! empty($object->code_compta)) { + if ($object->code_compta != "") { $sql .= " bk.subledger_account = '" . $object->code_compta . "' "; } - if (! empty($object->code_compta) && ! empty($object->code_compta_fournisseur)) { + if ($object->code_compta != "" && $object->code_compta_fournisseur != "") { $sql .= " OR "; } - if (! empty($object->code_compta_fournisseur)) { + if ($object->code_compta_fournisseur != "") { $sql .= " bk.subledger_account = '" . $object->code_compta_fournisseur . "' "; } $sql .= " ) "; @@ -127,13 +127,13 @@ class Lettering extends BookKeeping $sql .= " WHERE bk.code_journal IN (SELECT code FROM " . MAIN_DB_PREFIX . "accounting_journal WHERE nature=3 AND entity=".$conf->entity.") "; $sql .= " AND facf.entity = ".$conf->entity; $sql .= " AND ( "; - if (! empty($object->code_compta)) { + if ($object->code_compta != "") { $sql .= " bk.subledger_account = '" . $object->code_compta . "' "; } - if (! empty($object->code_compta) && ! empty($object->code_compta_fournisseur)) { + if ($object->code_compta != "" && $object->code_compta_fournisseur != "") { $sql .= " OR "; } - if (! empty($object->code_compta_fournisseur)) { + if ($object->code_compta_fournisseur != "") { $sql .= " bk.subledger_account = '" . $object->code_compta_fournisseur . "' "; } $sql .= ") "; @@ -159,13 +159,13 @@ class Lettering extends BookKeeping $sql .= " AND bk.code_journal IN (SELECT code FROM " . MAIN_DB_PREFIX . "accounting_journal WHERE nature=4 AND entity=".$conf->entity.") "; $sql .= " AND fac.entity IN (".getEntity('invoice', 0).")";// We don't share object for accountancy $sql .= " AND ( "; - if (! empty($object->code_compta)) { + if ($object->code_compta != "") { $sql .= " bk.subledger_account = '" . $object->code_compta . "' "; } - if (! empty($object->code_compta) && ! empty($object->code_compta_fournisseur)) { + if ($object->code_compta != "" && $object->code_compta_fournisseur != "") { $sql .= " OR "; } - if (! empty($object->code_compta_fournisseur)) { + if ($object->code_compta_fournisseur != "") { $sql .= " bk.subledger_account = '" . $object->code_compta_fournisseur . "' "; } $sql .= " ) "; @@ -187,13 +187,13 @@ class Lettering extends BookKeeping $sql .= " WHERE code_journal IN (SELECT code FROM " . MAIN_DB_PREFIX . "accounting_journal WHERE nature=2 AND entity=".$conf->entity.") "; $sql .= " AND fac.entity IN (".getEntity('invoice', 0).")";// We don't share object for accountancy $sql .= " AND ( "; - if (! empty($object->code_compta)) { + if ($object->code_compta != "") { $sql .= " bk.subledger_account = '" . $object->code_compta . "' "; } - if (! empty($object->code_compta) && ! empty($object->code_compta_fournisseur)) { + if ($object->code_compta != "" && $object->code_compta_fournisseur != "") { $sql .= " OR "; } - if (! empty($object->code_compta_fournisseur)) { + if ($object->code_compta_fournisseur != "") { $sql .= " bk.subledger_account = '" . $object->code_compta_fournisseur . "' "; } $sql .= " ) "; diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index e4e07831b44..0f22789d630 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -171,8 +171,8 @@ if ($result) { //print $sql; // Variables - $account_supplier = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) ? $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER : 'NotDefined'); // NotDefined is a reserved word - $account_customer = (! empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : 'NotDefined'); // NotDefined is a reserved word + $account_supplier = (($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER != "") ? $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER : 'NotDefined'); // NotDefined is a reserved word + $account_customer = ($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER != "") ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : 'NotDefined'); // NotDefined is a reserved word $account_employee = (! empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) ? $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT : 'NotDefined'); // NotDefined is a reserved word $account_pay_vat = (! empty($conf->global->ACCOUNTING_VAT_PAY_ACCOUNT) ? $conf->global->ACCOUNTING_VAT_PAY_ACCOUNT : 'NotDefined'); // NotDefined is a reserved word $account_pay_donation = (! empty($conf->global->DONATION_ACCOUNTINGACCOUNT) ? $conf->global->DONATION_ACCOUNTINGACCOUNT : 'NotDefined'); // NotDefined is a reserved word @@ -218,7 +218,7 @@ if ($result) { // Set accountancy code for thirdparty $compta_soc = 'NotDefined'; if ($lineisapurchase > 0) - $compta_soc = (! empty($obj->code_compta_fournisseur) ? $obj->code_compta_fournisseur : $account_supplier); + $compta_soc = (($obj->code_compta_fournisseur != "") ? $obj->code_compta_fournisseur : $account_supplier); if ($lineisasale > 0) $compta_soc = (! empty($obj->code_compta) ? $obj->code_compta : $account_customer); @@ -938,8 +938,8 @@ if (empty($action) || $action == 'view') { // Button to write into Ledger - if (empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1' - || empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1' + if (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "") || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1' + || ($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "") || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1' || empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) || $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT == '-1') { print '
'.img_warning().' '.$langs->trans("SomeMandatoryStepsOfSetupWereNotDone"); print ' : '.$langs->trans("AccountancyAreaDescMisc", 4, ''.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("Setup")."-".$langs->transnoentitiesnoconv("MenuDefaultAccounts").''); @@ -950,8 +950,8 @@ if (empty($action) || $action == 'view') { if (! empty($conf->global->ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL)) print ''; - if (empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1' - || empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1') { + if (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "") || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1' + || ($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "") || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1') { print ''; } else { diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php index 4c50015a2ba..d82381533cf 100644 --- a/htdocs/accountancy/journal/expensereportsjournal.php +++ b/htdocs/accountancy/journal/expensereportsjournal.php @@ -444,10 +444,10 @@ if ($action == 'exportcsv') { // ISO and not UTF8 ! foreach ($taber as $key => $val) { $date = dol_print_date($val["date"], 'day'); - + $userstatic->id = $tabuser[$key]['id']; $userstatic->name = $tabuser[$key]['name']; - + // Fees foreach ($tabht[$key] as $k => $mt) { $accountingaccount = new AccountingAccount($db); @@ -474,7 +474,7 @@ if ($action == 'exportcsv') { // ISO and not UTF8 ! print "\n"; } } - + // Third party foreach ($tabttc[$key] as $k => $mt) { print '"' . $date . '"' . $sep; @@ -585,7 +585,7 @@ if (empty($action) || $action == 'view') { // Account print "
'. $langs->trans("CreateSurveyDate") .'
'; - if (! empty($line->numero_compte) && $line->numero_compte != '-1') print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte); + if ($line->numero_compte != "" && $line->numero_compte != '-1') print length_accountg($line->numero_compte) . ' : ' . $object->get_compte_desc($line->numero_compte); else print ''.$langs->trans("Unknown").''; print '
"; $accountoshow = length_accountg($k); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("FeeAccountNotDefined").''; } @@ -615,7 +615,7 @@ if (empty($action) || $action == 'view') { // Account print ""; $accountoshow = length_accounta($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("MainAccountForUsersNotDefined").''; } @@ -624,7 +624,7 @@ if (empty($action) || $action == 'view') { // Subledger account print ""; $accountoshow = length_accounta($k); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("UserAccountNotDefined").''; } @@ -652,7 +652,7 @@ if (empty($action) || $action == 'view') { // Account print ""; $accountoshow = length_accountg($k); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("VATAccountNotDefined").''; } diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index cab5069e1f8..cd82e9f2f27 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -749,7 +749,7 @@ if (empty($action) || $action == 'view') { } print '
'; if (! empty($conf->global->ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL)) print ''; - if (empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER) || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1') { + if (($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == "") || $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER == '-1') { print ''; } else { diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 8f82fd95afb..3b0607d34a7 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -146,7 +146,7 @@ if ($result) { $num = $db->num_rows($result); // Variables - $cptcli = (! empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER)) ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : 'NotDefined'; + $cptcli = (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER != "")) ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : 'NotDefined'; $cpttva = (! empty($conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT)) ? $conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT : 'NotDefined'; $i = 0; @@ -679,14 +679,14 @@ if (empty($action) || $action == 'view') { journalHead($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink); // Button to write into Ledger - if (empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1') { + if (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "") || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1') { print '
'; print img_warning().' '.$langs->trans("SomeMandatoryStepsOfSetupWereNotDone"); print ' : '.$langs->trans("AccountancyAreaDescMisc", 4, ''.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("MenuAccountancy").'-'.$langs->transnoentitiesnoconv("Setup")."-".$langs->transnoentitiesnoconv("MenuDefaultAccounts").''); } print '
'; if (! empty($conf->global->ACCOUNTING_ENABLE_EXPORT_DRAFT_JOURNAL)) print ''; - if (empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1') { + if (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == "") || $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER == '-1') { print ''; } else { @@ -813,7 +813,7 @@ if (empty($action) || $action == 'view') { // Account print "
"; $accountoshow = length_accounta($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("MainAccountForCustomersNotDefined").''; } @@ -822,7 +822,7 @@ if (empty($action) || $action == 'view') { // Subledger account print ""; $accountoshow = length_accounta($k); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("ThirdpartyAccountNotDefined").''; } @@ -849,7 +849,7 @@ if (empty($action) || $action == 'view') { // Account print ""; $accountoshow = length_accountg($k); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("ProductNotDefined").''; } @@ -884,7 +884,7 @@ if (empty($action) || $action == 'view') { // Account print ""; $accountoshow = length_accountg($k); - if (empty($accountoshow) || $accountoshow == 'NotDefined') + if (($accountoshow == "") || $accountoshow == 'NotDefined') { print ''.$langs->trans("VATAccountNotDefined").' ('.$langs->trans("Sale").')'.''; } diff --git a/htdocs/compta/journal/purchasesjournal.php b/htdocs/compta/journal/purchasesjournal.php index cd3bf06f43a..5b4e54fd807 100644 --- a/htdocs/compta/journal/purchasesjournal.php +++ b/htdocs/compta/journal/purchasesjournal.php @@ -123,7 +123,7 @@ if ($result) { $num = $db->num_rows($result); // les variables - $cptfour = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER)?$conf->global->ACCOUNTING_ACCOUNT_SUPPLIER:$langs->trans("CodeNotDef")); + $cptfour = (($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER != "")?$conf->global->ACCOUNTING_ACCOUNT_SUPPLIER:$langs->trans("CodeNotDef")); $cpttva = (! empty($conf->global->ACCOUNTING_VAT_BUY_ACCOUNT)?$conf->global->ACCOUNTING_VAT_BUY_ACCOUNT:$langs->trans("CodeNotDef")); $tabfac = array(); @@ -139,7 +139,7 @@ if ($result) { $obj = $db->fetch_object($result); // contrôles - $compta_soc = (! empty($obj->code_compta_fournisseur)?$obj->code_compta_fournisseur:$cptfour); + $compta_soc = (($obj->code_compta_fournisseur != "")?$obj->code_compta_fournisseur:$cptfour); $compta_prod = $obj->accountancy_code_buy; if (empty($compta_prod)) { diff --git a/htdocs/compta/journal/sellsjournal.php b/htdocs/compta/journal/sellsjournal.php index fe51665163e..123bb3c7770 100644 --- a/htdocs/compta/journal/sellsjournal.php +++ b/htdocs/compta/journal/sellsjournal.php @@ -146,7 +146,7 @@ if ($result) { $obj = $db->fetch_object($result); // les variables - $cptcli = (! empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER)?$conf->global->ACCOUNTING_ACCOUNT_CUSTOMER:$langs->trans("CodeNotDef")); + $cptcli = (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER != "")?$conf->global->ACCOUNTING_ACCOUNT_CUSTOMER:$langs->trans("CodeNotDef")); $compta_soc = (! empty($obj->code_compta)?$obj->code_compta:$cptcli); $compta_prod = $obj->accountancy_code_sell; if (empty($compta_prod)) diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 87b32902684..cf95e471ddd 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -392,7 +392,7 @@ class FormAccounting extends Form $resql = $this->db->query($sql); if ($resql) { while ($obj = $this->db->fetch_object($resql)) { - if (!empty($obj->code_compta_fournisseur)) { + if ($obj->code_compta_fournisseur != "") { $aux_account[$obj->code_compta_fournisseur] = $obj->code_compta_fournisseur.' ('.$obj->nom.')'; } } diff --git a/htdocs/core/lib/accounting.lib.php b/htdocs/core/lib/accounting.lib.php index 889d9da8a2c..4b5345da62b 100644 --- a/htdocs/core/lib/accounting.lib.php +++ b/htdocs/core/lib/accounting.lib.php @@ -2,6 +2,7 @@ /* Copyright (C) 2013-2014 Olivier Geffroy * Copyright (C) 2013-2017 Alexandre Spangaro * Copyright (C) 2014 Florian Henry + * Copyright (C) 2019 Eric Seigne * * 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 @@ -23,6 +24,22 @@ * \brief Library of accountancy functions */ + /** + * Check if a value is empty with some options + * + * @param allow_false : setting this to true will make the function consider a boolean value of false as NOT empty. This parameter is false by default. + * @param allow_ws : setting this to true will make the function consider a string with nothing but white space as NOT empty. This parameter is false by default. + * @return array Bool + * @author Michael - https://www.php.net/manual/fr/function.empty.php#90767 + */ + function is_empty($var, $allow_false = false, $allow_ws = false) { + if (!isset($var) || is_null($var) || ($allow_ws == false && trim($var) == "" && !is_bool($var)) || ($allow_false === false && is_bool($var) && $var === false) || (is_array($var) && empty($var))) { + return true; + } else { + return false; + } + } + /** * Prepare array with list of tabs * @@ -75,12 +92,12 @@ function length_accountg($account) { global $conf; - if ($account < 0 || empty($account)) return ''; + if ($account < 0 || is_empty($account)) return ''; - if (! empty($conf->global->ACCOUNTING_MANAGE_ZERO)) return $account; + if (! is_empty($conf->global->ACCOUNTING_MANAGE_ZERO)) return $account; $g = $conf->global->ACCOUNTING_LENGTH_GACCOUNT; - if (! empty($g)) { + if (! is_empty($g)) { // Clean parameters $i = strlen($account); @@ -110,12 +127,12 @@ function length_accounta($accounta) { global $conf; - if ($accounta < 0 || empty($accounta)) return ''; + if ($accounta < 0 || is_empty($accounta)) return ''; - if (! empty($conf->global->ACCOUNTING_MANAGE_ZERO)) return $accounta; + if (! is_empty($conf->global->ACCOUNTING_MANAGE_ZERO)) return $accounta; $a = $conf->global->ACCOUNTING_LENGTH_AACCOUNT; - if (! empty($a)) { + if (! is_empty($a)) { // Clean parameters $i = strlen($accounta); @@ -158,7 +175,7 @@ function journalHead($nom, $variante, $period, $periodlink, $description, $build print "\n\n\n"; - if(! empty($varlink)) $varlink = '?'.$varlink; + if(! is_empty($varlink)) $varlink = '?'.$varlink; $head=array(); $h=0; diff --git a/htdocs/core/modules/societe/mod_codecompta_panicum.php b/htdocs/core/modules/societe/mod_codecompta_panicum.php index 4c5ffcd66c5..f3106cef761 100644 --- a/htdocs/core/modules/societe/mod_codecompta_panicum.php +++ b/htdocs/core/modules/societe/mod_codecompta_panicum.php @@ -96,8 +96,8 @@ class mod_codecompta_panicum extends ModeleAccountancyCode $this->code=''; if (is_object($societe)) { - if ($type == 'supplier') $this->code = (! empty($societe->code_compta_fournisseur)?$societe->code_compta_fournisseur:''); - else $this->code = (! empty($societe->code_compta)?$societe->code_compta:''); + if ($type == 'supplier') $this->code = (($societe->code_compta_fournisseur != "")?$societe->code_compta_fournisseur:''); + else $this->code = (($societe->code_compta != "")?$societe->code_compta:''); } return 0; // return ok diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 84bda8abd54..ce7617f003d 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -928,7 +928,7 @@ class Societe extends CommonObject if (! empty($allowmodcodefournisseur) && ! empty($this->fournisseur)) { // Attention get_codecompta peut modifier le code suivant le module utilise - if (empty($this->code_compta_fournisseur)) + if ($this->code_compta_fournisseur == "") { $ret=$this->get_codecompta('supplier'); if ($ret < 0) return -1; @@ -1085,7 +1085,7 @@ class Societe extends CommonObject if ($supplier) { $sql .= ", code_fournisseur = ".(! empty($this->code_fournisseur)?"'".$this->db->escape($this->code_fournisseur)."'":"null"); - $sql .= ", code_compta_fournisseur = ".(! empty($this->code_compta_fournisseur)?"'".$this->db->escape($this->code_compta_fournisseur)."'":"null"); + $sql .= ", code_compta_fournisseur = ".(($this->code_compta_fournisseur != "")?"'".$this->db->escape($this->code_compta_fournisseur)."'":"null"); } $sql .= ", fk_user_modif = ".($user->id > 0 ? $user->id:"null"); $sql .= ", fk_multicurrency = ".(int) $this->fk_multicurrency; From 42e58d9ea59f6231dc08836f0e719fb7a83253bb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 18:38:14 +0200 Subject: [PATCH 0851/1036] Fix preview of interventions --- htdocs/core/lib/functions.lib.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4bbd030b1eb..7341bc0c2cb 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1330,10 +1330,10 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi $nophoto=''; $morehtmlleft.='
'; } - //elseif ($conf->browser->layout != 'phone') { // Show no photo link + else { // Show no photo link $nophoto='/public/theme/common/nophoto.png'; $morehtmlleft.='
No photo
'; - //} + } } } elseif ($object->element == 'ticket') @@ -1349,10 +1349,10 @@ function dol_banner_tab($object, $paramid, $morehtml = '', $shownav = 1, $fieldi $nophoto=''; $morehtmlleft.='
'; } - //elseif ($conf->browser->layout != 'phone') { // Show no photo link - $nophoto='/public/theme/common/nophoto.png'; - $morehtmlleft.='
No photo
'; - //} + else { // Show no photo link + $nophoto='/public/theme/common/nophoto.png'; + $morehtmlleft.='
No photo
'; + } } } else @@ -5260,7 +5260,7 @@ function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart) // Here, object->id, object->ref and modulepart are required. //var_dump($modulepart); if (in_array($modulepart, array('thirdparty','contact','member','propal','proposal','commande','order','facture','invoice', - 'supplier_order','supplier_proposal','shipment','contract','expensereport'))) + 'supplier_order','supplier_proposal','shipment','contract','expensereport','ficheinter'))) { $path=($object->ref?$object->ref:$object->id); } From 0123a18ff86c89272404e57ae6cb65ccfd3c4566 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 17 Jun 2019 18:44:08 +0200 Subject: [PATCH 0852/1036] Look and feel v10 --- htdocs/core/tpl/resource_view.tpl.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/tpl/resource_view.tpl.php b/htdocs/core/tpl/resource_view.tpl.php index d2e0441b60b..014560e0299 100644 --- a/htdocs/core/tpl/resource_view.tpl.php +++ b/htdocs/core/tpl/resource_view.tpl.php @@ -53,11 +53,11 @@ if( (array) $linked_resources && count($linked_resources) > 0) } else { - $style=''; + $class=''; if ($linked_resource['rowid'] == GETPOST('lineid')) - $style='style="background: orange;"'; + $class='highlight'; - print '
'; + print '
'; print '
'; print $object_resource->getNomUrl(1); @@ -81,7 +81,7 @@ if( (array) $linked_resources && count($linked_resources) > 0) print ''; print ' '; print ''; - print img_delete(); + print img_picto($langs->trans("Unlink"), 'unlink'); print ''; print '
'; From e4f5ca79f8d20ddff3c8b5d305c78d4bba9c9a96 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 17 Jun 2019 19:36:21 +0200 Subject: [PATCH 0853/1036] Fix access category API --- htdocs/categories/class/api_categories.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/categories/class/api_categories.class.php b/htdocs/categories/class/api_categories.class.php index c82d803f31c..c389e1b63d1 100644 --- a/htdocs/categories/class/api_categories.class.php +++ b/htdocs/categories/class/api_categories.class.php @@ -86,7 +86,7 @@ class Categories extends DolibarrApi throw new RestException(404, 'category not found'); } - if ( ! DolibarrApi::_checkAccessToResource('category', $this->category->id)) { + if ( ! DolibarrApi::_checkAccessToResource('categorie', $this->category->id)) { throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); } From 27c928d9d9f5685c2b6da463ae8ba652f649ad9a Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Mon, 17 Jun 2019 20:53:10 +0200 Subject: [PATCH 0854/1036] NEW list of measuring units API --- htdocs/api/class/api_setup.class.php | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/htdocs/api/class/api_setup.class.php b/htdocs/api/class/api_setup.class.php index 783ec6540e3..a38a7cd83c2 100644 --- a/htdocs/api/class/api_setup.class.php +++ b/htdocs/api/class/api_setup.class.php @@ -4,6 +4,7 @@ * Copyright (C) 2017 Regis Houssin * Copyright (C) 2017 Neil Orley * Copyright (C) 2018 Frédéric France + * Copyright (C) 2019 Thibault FOUCART * * * This program is free software; you can redistribute it and/or modify @@ -707,6 +708,66 @@ class Setup extends DolibarrApi return $list; } + /** + * Get the list of measuring units. + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Number of items per page + * @param int $page Page number (starting from zero) + * @param int $active Payment term is active or not {@min 0} {@max 1} + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)" + * @return List of events types + * + * @url GET dictionary/units + * + * @throws RestException + */ + public function getListOfMeasuringUnits($sortfield = "rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $active = 1, $sqlfilters = '') + { + $list = array(); + //TODO link with multicurrency module + $sql = "SELECT t.rowid, t.code, t.label,t.short_label, t.active, t.scale, t.unit_type"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_units as t"; + $sql.= " WHERE t.active = ".$active; + // Add sql filters + if ($sqlfilters) + { + if (! DolibarrApi::_checkFilters($sqlfilters)) + { + throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters); + } + $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; + $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + + $sql.= $this->db->order($sortfield, $sortorder); + + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit, $offset); + } + + $result = $this->db->query($sql); + + if ($result) { + $num = $this->db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { + $list[] = $this->db->fetch_object($result); + } + } else { + throw new RestException(503, 'Error when retrieving list of measuring units: '.$this->db->lasterror()); + } + + return $list; + } + /** * Get the list of tickets categories. * From f1d64ad164152252a9cb901a966493e6b82aeb1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 17 Jun 2019 23:02:54 +0200 Subject: [PATCH 0855/1036] Update peruser.php --- htdocs/comm/action/peruser.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/comm/action/peruser.php b/htdocs/comm/action/peruser.php index 754cb736bc9..d4020f4df92 100644 --- a/htdocs/comm/action/peruser.php +++ b/htdocs/comm/action/peruser.php @@ -1186,33 +1186,34 @@ function show_day_events2($username, $day, $month, $year, $monthshown, $style, & } } - $ids1='';$ids2=''; - if (count($cases1[$h]) && array_keys($cases1[$h])) $ids1=join(',', array_keys($cases1[$h])); - if (count($cases2[$h]) && array_keys($cases2[$h])) $ids2=join(',', array_keys($cases2[$h])); + $ids1=''; + $ids2=''; + if (is_array($cases1[$h]) && count($cases1[$h]) && array_keys($cases1[$h])) $ids1=join(',', array_keys($cases1[$h])); + if (is_array($cases2[$h]) && count($cases2[$h]) && array_keys($cases2[$h])) $ids2=join(',', array_keys($cases2[$h])); if ($h == $begin_h) echo '
'; else echo ''; - if (count($cases1[$h]) == 1) // only 1 event + if (is_array($cases1[$h]) && count($cases1[$h]) == 1) // only 1 event { $output = array_slice($cases1[$h], 0, 1); $title1=$langs->trans("Ref").' '.$ids1.($title1?' - '.$title1:''); if ($output[0]['string']) $title1.=($title1?' - ':'').$output[0]['string']; if ($output[0]['color']) $color1 = $output[0]['color']; } - elseif (count($cases1[$h]) > 1) + elseif (is_array($cases1[$h]) && count($cases1[$h]) > 1) { $title1=$langs->trans("Ref").' '.$ids1.($title1?' - '.$title1:''); $color1='222222'; } - if (count($cases2[$h]) == 1) // only 1 event + if (is_array($cases2[$h]) && count($cases2[$h]) == 1) // only 1 event { $output = array_slice($cases2[$h], 0, 1); $title2=$langs->trans("Ref").' '.$ids2.($title2?' - '.$title2:''); if ($output[0]['string']) $title2.=($title2?' - ':'').$output[0]['string']; if ($output[0]['color']) $color2 = $output[0]['color']; } - elseif (count($cases2[$h]) > 1) + elseif (is_array($cases2[$h]) && count($cases2[$h]) > 1) { $title2=$langs->trans("Ref").' '.$ids2.($title2?' - '.$title2:''); $color2='222222'; From fd263cb316b34100ec1c4bd0d76a858b0fb0f0fe Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Tue, 18 Jun 2019 07:15:59 +0200 Subject: [PATCH 0856/1036] FIX add v10 in virtualmin script --- build/perl/virtualmin/dolibarr.pl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/perl/virtualmin/dolibarr.pl b/build/perl/virtualmin/dolibarr.pl index a28fc430caa..343cebc6abe 100644 --- a/build/perl/virtualmin/dolibarr.pl +++ b/build/perl/virtualmin/dolibarr.pl @@ -1,7 +1,7 @@ #---------------------------------------------------------------------------- # \file dolibarr.pl # \brief Dolibarr script install for Virtualmin Pro -# \author (c)2009-2018 Regis Houssin +# \author (c)2009-2019 Regis Houssin #---------------------------------------------------------------------------- @@ -30,7 +30,7 @@ return "Regis Houssin"; # script_dolibarr_versions() sub script_dolibarr_versions { -return ( "9.0.0", "8.0.3", "7.0.4", "6.0.8", "5.0.7" ); +return ( "10.0.0", "9.0.3", "8.0.5", "7.0.5", "6.0.8" ); } sub script_dolibarr_release @@ -390,6 +390,7 @@ sub script_dolibarr_check_latest { local ($ver) = @_; local @vers = &osdn_package_versions("dolibarr", + $ver >= 10.0 ? "dolibarr\\-(10\\.0\\.[0-9\\.]+)\\.tgz" : $ver >= 9.0 ? "dolibarr\\-(9\\.0\\.[0-9\\.]+)\\.tgz" : $ver >= 8.0 ? "dolibarr\\-(8\\.0\\.[0-9\\.]+)\\.tgz" : $ver >= 7.0 ? "dolibarr\\-(7\\.0\\.[0-9\\.]+)\\.tgz" : From 96c699482791ebd62614a0209849057799cdb924 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Tue, 18 Jun 2019 10:55:16 +0200 Subject: [PATCH 0857/1036] =?UTF-8?q?FIX=202=20d=C3=A9clarations=20of=20da?= =?UTF-8?q?te=5Fvalid=20in=20SQL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/install/mysql/tables/llx_bom_bom.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_bom_bom.sql b/htdocs/install/mysql/tables/llx_bom_bom.sql index 9c6e014586d..11e1ce74ffd 100644 --- a/htdocs/install/mysql/tables/llx_bom_bom.sql +++ b/htdocs/install/mysql/tables/llx_bom_bom.sql @@ -27,10 +27,9 @@ CREATE TABLE llx_bom_bom( qty double(24,8), efficiency double(8,4) DEFAULT 1, date_creation datetime NOT NULL, - date_valid datetime NOT NULL, + date_valid datetime, tms timestamp, - date_valid datetime, - fk_user_creat integer NOT NULL, + fk_user_creat integer NOT NULL, fk_user_modif integer, fk_user_valid integer, import_key varchar(14), From 820c420ae5221f0d96a19624a72828c28e7cdd45 Mon Sep 17 00:00:00 2001 From: ICstage Date: Tue, 18 Jun 2019 14:07:52 +0200 Subject: [PATCH 0858/1036] FIX Missing hooks --- htdocs/adherents/index.php | 15 ++++++++++++--- htdocs/comm/index.php | 9 +++++++++ htdocs/comm/mailing/index.php | 9 +++++++++ htdocs/comm/propal/index.php | 9 +++++++++ htdocs/commande/index.php | 8 ++++++++ htdocs/compta/charges/index.php | 12 +++++++++++- htdocs/compta/index.php | 7 ++++++- htdocs/contrat/index.php | 8 ++++++++ htdocs/don/index.php | 8 ++++++++ htdocs/expedition/index.php | 9 +++++++++ htdocs/expensereport/index.php | 11 ++++++++++- htdocs/fichinter/index.php | 11 +++++++++-- htdocs/fourn/commande/index.php | 15 ++++++++++++--- htdocs/hrm/index.php | 8 ++++++++ htdocs/mrp/index.php | 15 ++++++++++++--- htdocs/opensurvey/index.php | 12 +++++++++++- htdocs/product/index.php | 4 ++++ htdocs/product/stock/index.php | 9 +++++++++ htdocs/projet/activity/index.php | 9 +++++++++ htdocs/projet/index.php | 9 +++++++++ htdocs/reception/index.php | 16 ++++++++++++---- htdocs/societe/index.php | 11 ++++++++++- htdocs/supplier_proposal/index.php | 9 +++++++++ htdocs/ticket/index.php | 11 ++++++++++- htdocs/user/home.php | 5 +++++ 25 files changed, 228 insertions(+), 21 deletions(-) diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php index 1d1232a9d58..481a8e8fffd 100644 --- a/htdocs/adherents/index.php +++ b/htdocs/adherents/index.php @@ -1,8 +1,9 @@ - * Copyright (C) 2003 Jean-Louis Bergamo - * Copyright (C) 2004-2017 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2017 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -29,6 +30,11 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('membersindex')); + // Load translation files required by the page $langs->loadLangs(array("companies","members")); @@ -435,6 +441,9 @@ print ""; print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardUsersGroups', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 651d2c54ec7..15e4e226587 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -3,6 +3,7 @@ * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -37,6 +38,11 @@ if (! empty($conf->fournisseur->enabled)) require_once DOL_DOCUMENT_ROOT.'/fourn if (! $user->rights->societe->lire) accessforbidden(); +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('commercialindex')); + // Load translation files required by the page $langs->loadLangs(array("commercial", "propal")); @@ -897,6 +903,9 @@ if (! empty($conf->commande->enabled) && $user->rights->commande->lire) print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardCommercials', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/comm/mailing/index.php b/htdocs/comm/mailing/index.php index c5d8bc47232..a835ca241a3 100644 --- a/htdocs/comm/mailing/index.php +++ b/htdocs/comm/mailing/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2005 Rodolphe Quiedeville * Copyright (C) 2005-2009 Laurent Destailleur * Copyright (C) 2010 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -27,6 +28,11 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT .'/comm/mailing/class/mailing.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('mailingindex')); + // Load translation files required by the page $langs->loadLangs(array('commercial', 'orders')); @@ -207,6 +213,9 @@ if ($langs->file_exists("html/spam.html", 0)) { print '
'; } +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardEmailings', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/comm/propal/index.php b/htdocs/comm/propal/index.php index e69dbbc8b6c..309712ae76b 100644 --- a/htdocs/comm/propal/index.php +++ b/htdocs/comm/propal/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2004 Rodolphe Quiedeville * Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -27,6 +28,11 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT .'/comm/propal/class/propal.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('proposalindex')); + // Load translation files required by the page $langs->loadLangs(array('propal', 'companies')); @@ -540,6 +546,9 @@ if (! empty($conf->propal->enabled)) //print '
'; print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardPropals', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/commande/index.php b/htdocs/commande/index.php index c0091b43af0..a0e87bf63a3 100644 --- a/htdocs/commande/index.php +++ b/htdocs/commande/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2004 Rodolphe Quiedeville * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -31,6 +32,11 @@ require_once DOL_DOCUMENT_ROOT .'/commande/class/commande.class.php'; if (!$user->rights->commande->lire) accessforbidden(); +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('ordersindex')); + // Load translation files required by the page $langs->loadLangs(array('orders', 'bills')); @@ -478,6 +484,8 @@ if (! empty($conf->commande->enabled)) print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardOrders', $parameters, $object); // Note that $action and $object may have been modified by hook // End of page llxFooter(); diff --git a/htdocs/compta/charges/index.php b/htdocs/compta/charges/index.php index 33a06e09136..4b62a98b80b 100644 --- a/htdocs/compta/charges/index.php +++ b/htdocs/compta/charges/index.php @@ -3,8 +3,9 @@ * Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2010 Regis Houssin * Copyright (C) 2011-2016 Alexandre Spangaro - * Copyright (C) 2011-2014 Juanjo Menent + * Copyright (C) 2011-2014 Juanjo Menent * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -34,6 +35,12 @@ require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; + +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('specialexpensesindex')); + // Load translation files required by the page $langs->loadLangs(array('compta', 'bills')); @@ -568,6 +575,9 @@ if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardSpecialBills', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index c57b073b487..932d9ed758c 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -2,10 +2,11 @@ /* Copyright (C) 2001-2005 Rodolphe Quiedeville * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2005-2015 Regis Houssin - * Copyright (C) 2015-2016 Juanjo Menent + * Copyright (C) 2015-2016 Juanjo Menent * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Marcos García + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -63,6 +64,7 @@ if ($user->societe_id > 0) $max=3; +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array $hookmanager->initHooks(array('invoiceindex')); /* @@ -1080,6 +1082,9 @@ if ($resql) print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardAccountancy', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index 10c2e2915b9..3bf047c87c8 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -3,6 +3,7 @@ * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -28,6 +29,11 @@ require "../main.inc.php"; require_once DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php"; require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php"; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('contractindex')); + // Load translation files required by the page $langs->loadLangs(array('products', 'companies', 'contracts')); @@ -609,6 +615,8 @@ else //print ''; print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardContracts', $parameters, $object); // Note that $action and $object may have been modified by hook llxFooter(); diff --git a/htdocs/don/index.php b/htdocs/don/index.php index d632f316a25..4af0f0d81b0 100644 --- a/htdocs/don/index.php +++ b/htdocs/don/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2001-2002 Rodolphe Quiedeville * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -26,6 +27,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('donationindex')); + $langs->load("donations"); // Security check @@ -238,6 +244,8 @@ else dol_print_error($db); print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardDonation', $parameters, $object); // Note that $action and $object may have been modified by hook llxFooter(); diff --git a/htdocs/expedition/index.php b/htdocs/expedition/index.php index bbb5ef58c36..61838cc321b 100644 --- a/htdocs/expedition/index.php +++ b/htdocs/expedition/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2005 Rodolphe Quiedeville * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -27,6 +28,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('sendingindex')); + // Load translation files required by the page $langs->loadLangs(array('orders', 'sendings')); @@ -291,6 +297,9 @@ else dol_print_error($db); print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardWarehouseSendings', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/expensereport/index.php b/htdocs/expensereport/index.php index f7d4e2a8405..461a7aec4fe 100644 --- a/htdocs/expensereport/index.php +++ b/htdocs/expensereport/index.php @@ -3,7 +3,8 @@ * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2005-2011 Regis Houssin - * Copyright (C) 2015 Alexandre Spangaro + * Copyright (C) 2015 Alexandre Spangaro + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -30,6 +31,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php'; require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('expensereportindex')); + // Load translation files required by the page $langs->loadLangs(array('companies', 'users', 'trips')); @@ -230,6 +236,9 @@ else dol_print_error($db); print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardExpenseReport', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/fichinter/index.php b/htdocs/fichinter/index.php index d240aadf42d..f97c99dc839 100644 --- a/htdocs/fichinter/index.php +++ b/htdocs/fichinter/index.php @@ -2,8 +2,8 @@ /* Copyright (C) 2003-2004 Rodolphe Quiedeville * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2015 Charlie Benke - + * Copyright (C) 2015 Charlie Benke + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -32,6 +32,11 @@ require_once DOL_DOCUMENT_ROOT .'/fichinter/class/fichinter.class.php'; if (!$user->rights->ficheinter->lire) accessforbidden(); +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('interventionindex')); + // Load translation files required by the page $langs->load("interventions"); @@ -356,6 +361,8 @@ if (! empty($conf->ficheinter->enabled)) print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardInterventions', $parameters, $object); // Note that $action and $object may have been modified by hook llxFooter(); diff --git a/htdocs/fourn/commande/index.php b/htdocs/fourn/commande/index.php index 6c2b66bc7f3..e66054dc750 100644 --- a/htdocs/fourn/commande/index.php +++ b/htdocs/fourn/commande/index.php @@ -1,8 +1,9 @@ - * Copyright (C) 2004-2012 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2012 Vinicius Nogueira + * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012 Vinicius Nogueira + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -34,6 +35,11 @@ $orderid = GETPOST('orderid'); if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'fournisseur', $orderid, '', 'commande'); +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('orderssuppliersindex')); + // Load translation files required by the page $langs->loadLangs(array("suppliers", "orders")); @@ -432,6 +438,9 @@ print "
"; print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardOrdersSuppliers', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/hrm/index.php b/htdocs/hrm/index.php index 066a21ebad0..0dad608a5a5 100644 --- a/htdocs/hrm/index.php +++ b/htdocs/hrm/index.php @@ -3,6 +3,7 @@ * Copyright (C) 2013-2015 Laurent Destailleur * Copyright (C) 2012-2014 Regis Houssin * Copyright (C) 2015-2016 Alexandre Spangaro + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -36,6 +37,9 @@ if ($conf->deplacement->enabled) require_once DOL_DOCUMENT_ROOT.'/compta/deplace if ($conf->expensereport->enabled) require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; require_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php'; +$hookmanager = new HookManager($db); +$hookmanager->initHooks('hrmindex'); + // Load translation files required by the page $langs->loadLangs(array('users', 'holidays', 'trips', 'boxes')); @@ -392,6 +396,10 @@ if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire print ''; +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardHRM', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/mrp/index.php b/htdocs/mrp/index.php index c30d75b1d40..a587706dbb7 100644 --- a/htdocs/mrp/index.php +++ b/htdocs/mrp/index.php @@ -1,8 +1,9 @@ - * Copyright (C) 2003 Jean-Louis Bergamo - * Copyright (C) 2004-2017 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2017 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -27,6 +28,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/bom/class/bom.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('mrpindex')); + // Load translation files required by the page $langs->loadLangs(array("companies","mrp")); @@ -122,6 +128,9 @@ else print ''; +$parameters = array('type' => $type, 'user' => $user); +$reshook = $hookmanager->executeHooks('dashboardBOM', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/opensurvey/index.php b/htdocs/opensurvey/index.php index 413572ca4f6..0a9e3483348 100644 --- a/htdocs/opensurvey/index.php +++ b/htdocs/opensurvey/index.php @@ -1,6 +1,7 @@ - * + * Copyright (C) 2019 Nicolas ZABOURI + * * 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 @@ -32,6 +33,12 @@ if (!$user->rights->opensurvey->read) accessforbidden(); * View */ + +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('opensurveyindex')); + // Load translation files required by the page $langs->load("opensurvey"); @@ -78,6 +85,9 @@ print ''; print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardOpenSurvey', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/product/index.php b/htdocs/product/index.php index 950f4d47b5f..fe93c4b5e6e 100644 --- a/htdocs/product/index.php +++ b/htdocs/product/index.php @@ -6,6 +6,7 @@ * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2019 Pierre Ardoin * Copyright (C) 2019 Frédéric France + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -397,6 +398,9 @@ if (! empty($conf->global->MAIN_SHOW_PRODUCT_ACTIVITY_TRIM)) print ''; +$parameters = array('type' => $type, 'user' => $user); +$reshook = $hookmanager->executeHooks('dashboardProductsServices', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/product/stock/index.php b/htdocs/product/stock/index.php index a19025b5dd6..a0b4895b669 100644 --- a/htdocs/product/stock/index.php +++ b/htdocs/product/stock/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2006 Rodolphe Quiedeville * Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -27,6 +28,11 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('stockindex')); + // Load translation files required by the page $langs->loadLangs(array('stocks', 'productbatch')); @@ -184,6 +190,9 @@ if ($resql) //print ''; print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardWarehouse', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/projet/activity/index.php b/htdocs/projet/activity/index.php index b3fb66116bf..2148ba576d8 100644 --- a/htdocs/projet/activity/index.php +++ b/htdocs/projet/activity/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2001-2005 Rodolphe Quiedeville * Copyright (C) 2006-2015 Laurent Destailleur * Copyright (C) 2010 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -39,6 +40,11 @@ if ($user->societe_id > 0) $socid=$user->societe_id; //$result = restrictedArea($user, 'projet', $projectid); if (!$user->rights->projet->lire) accessforbidden(); +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('activityindex')); + // Load translation files required by the page $langs->load("projects"); @@ -573,6 +579,9 @@ if (empty($conf->global->PROJECT_HIDE_TASKS) && ! empty($conf->global->PROJECT_S print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardActivities', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index fa77cb4b52c..da148c1eda6 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2001-2005 Rodolphe Quiedeville * Copyright (C) 2004-2016 Laurent Destailleur * Copyright (C) 2005-2010 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -30,6 +31,11 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('projectsindex')); + // Load translation files required by the page $langs->loadLangs(array('projects', 'companies')); @@ -319,6 +325,9 @@ if (! empty($conf->global->PROJECT_SHOW_PROJECT_LIST_ON_PROJECT_AREA)) print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardProjects', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/reception/index.php b/htdocs/reception/index.php index 3b0bb7a05e0..97e25ab39e5 100644 --- a/htdocs/reception/index.php +++ b/htdocs/reception/index.php @@ -1,8 +1,9 @@ - * Copyright (C) 2004-2011 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2018 Quentin Vial-Gouteyron +/* Copyright (C) 2003-2005 Rodolphe Quiedeville + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2018 Quentin Vial-Gouteyron + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -28,6 +29,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; require_once DOL_DOCUMENT_ROOT.'/reception/class/reception.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('receptionindex')); + $langs->load("orders"); $langs->load("receptions"); @@ -292,6 +298,8 @@ else dol_print_error($db); print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardWarehouseReceptions', $parameters, $object); // Note that $action and $object may have been modified by hook llxFooter(); $db->close(); diff --git a/htdocs/societe/index.php b/htdocs/societe/index.php index 2404c11861e..d6df59f4740 100644 --- a/htdocs/societe/index.php +++ b/htdocs/societe/index.php @@ -2,9 +2,10 @@ /* Copyright (C) 2001-2006 Rodolphe Quiedeville * Copyright (C) 2004-2018 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2014 Charles-Fr Benke + * Copyright (C) 2014 Charles-Fr Benke * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -29,6 +30,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('thirdpartiesindex')); + $langs->load("companies"); $socid = GETPOST('socid', 'int'); @@ -366,6 +372,9 @@ else //print ''; print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardThirdparties', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/supplier_proposal/index.php b/htdocs/supplier_proposal/index.php index 5a2e6df2f29..d75d0c1647c 100644 --- a/htdocs/supplier_proposal/index.php +++ b/htdocs/supplier_proposal/index.php @@ -2,6 +2,7 @@ /* Copyright (C) 2003-2004 Rodolphe Quiedeville * Copyright (C) 2004-2011 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -27,6 +28,11 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT .'/supplier_proposal/class/supplier_proposal.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('suppliersproposalsindex')); + // Load translation files required by the page $langs->loadLangs(array('supplier_proposal', 'companies')); @@ -375,6 +381,9 @@ if (! empty($conf->supplier_proposal->enabled) && $user->rights->supplier_propos print ''; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardSupplierProposal', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); diff --git a/htdocs/ticket/index.php b/htdocs/ticket/index.php index 824b1f1833e..09b8a208c3c 100644 --- a/htdocs/ticket/index.php +++ b/htdocs/ticket/index.php @@ -1,5 +1,6 @@ +/* Copyright (C) - 2013-2016 Jean-François FERRY + * Copyright (C) - 2019 Nicolas ZABOURI * * 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 @@ -25,6 +26,11 @@ require_once DOL_DOCUMENT_ROOT . '/ticket/class/actions_ticket.class.php'; require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticketstats.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/dolgraph.class.php'; +$hookmanager = new HookManager($db); + +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$hookmanager->initHooks(array('ticketsindex')); + // Load translation files required by the page $langs->loadLangs(array('companies', 'other', 'ticket')); @@ -371,6 +377,9 @@ if ($result) { print ''; print '
'; +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardTickets', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(''); $db->close(); diff --git a/htdocs/user/home.php b/htdocs/user/home.php index 9a7d0ab94fd..bc766f4dc4b 100644 --- a/htdocs/user/home.php +++ b/htdocs/user/home.php @@ -1,6 +1,7 @@ * Copyright (C) 2005-2018 Regis Houssin + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -286,6 +287,10 @@ if ($canreadperms) //print ''; print ''; +// Initialize technical object to manage hooks. Note that conf->hooks_modules contains array +$parameters = array('user' => $user); +$reshook = $hookmanager->executeHooks('dashboardUsersGroups', $parameters, $object); // Note that $action and $object may have been modified by hook + // End of page llxFooter(); $db->close(); From 8835b49f3fccc90cbe52d2a83c61d61323017f2e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 14:30:13 +0200 Subject: [PATCH 0859/1036] Debug the accounting-file tool --- htdocs/compta/accounting-files.php | 278 +++++++++++------- .../install/mysql/migration/9.0.0-10.0.0.sql | 2 + htdocs/install/mysql/migration/repair.sql | 1 + htdocs/user/param_ihm.php | 2 +- 4 files changed, 177 insertions(+), 106 deletions(-) diff --git a/htdocs/compta/accounting-files.php b/htdocs/compta/accounting-files.php index 5a3097f6aa8..c663a179d6d 100644 --- a/htdocs/compta/accounting-files.php +++ b/htdocs/compta/accounting-files.php @@ -16,13 +16,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - - /** +/** * \file htdocs/compta/accounting-files.php * \ingroup compta * \brief Page to show portoflio and files of a thirdparty and download it */ - require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; @@ -34,7 +32,7 @@ require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php'; require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; -$langs->loadLangs(array("accountancy", "bills", "companies")); +$langs->loadLangs(array("accountancy", "bills", "companies", "salaries")); $date_start =GETPOST('date_start', 'alpha'); $date_startDay= GETPOST('date_startday', 'int'); @@ -46,11 +44,11 @@ $date_stopDay= GETPOST('date_stopday', 'int'); $date_stopMonth= GETPOST('date_stopmonth', 'int'); $date_stopYear= GETPOST('date_stopyear', 'int'); //FIXME doldate -$date_stop=($date_stopDay)?dol_mktime(0, 0, 0, $date_stopMonth, $date_stopDay, $date_stopYear):strtotime($date_stop); +$date_stop=($date_stopDay)?dol_mktime(23, 59, 59, $date_stopMonth, $date_stopDay, $date_stopYear):strtotime($date_stop); $action =GETPOST('action', 'alpha'); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context -$hookmanager->initHooks(array('comptafileslist', 'globallist')); +$hookmanager->initHooks(array('comptafileslist','globallist')); // Load variable for pagination $limit = GETPOST('limit', 'int')?GETPOST('limit', 'int'):$conf->liste_limit; @@ -66,6 +64,7 @@ if (! $sortorder) $sortorder="DESC"; $arrayfields=array( + 'type'=>array('label'=>"Type", 'checked'=>1), 'date'=>array('label'=>"Date", 'checked'=>1), //... ); @@ -83,7 +82,7 @@ if ($user->societe_id > 0) * Actions */ -$entity = GETPOST('entity', 'int')?GETPOST('entity', 'int'):$conf->entity; +$entity = GETPOST('entity','int')?GETPOST('entity','int'):$conf->entity; //$parameters = array('socid' => $id); //$reshook = $hookmanager->executeHooks('doActions', $parameters, $object); // Note that $object may have been modified by some hooks @@ -106,38 +105,45 @@ if (($action=="searchfiles" || $action=="dl" )) { if (! $error) { - $wheretail=" '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'"; + $wheretail=" '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'"; - $sql="SELECT rowid as id, ref as ref, paye as paid, total_ttc, fk_soc, datef as date, 'Invoice' as item FROM ".MAIN_DB_PREFIX."facture"; + $sql="SELECT t.rowid as id, t.ref, t.paye as paid, total as total_ht, total_ttc, tva as total_vat, fk_soc, t.datef as date, 'Invoice' as item, s.nom as thirdparty_name, s.code_client as thirdparty_code, c.code as country_code, s.tva_intra as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."facture as t LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; $sql.=" WHERE datef between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".Facture::STATUS_DRAFT; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".Facture::STATUS_DRAFT; $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paye as paid, total_ttc, fk_soc, datef as date, 'SupplierInvoice' as item FROM ".MAIN_DB_PREFIX."facture_fourn"; + $sql.=" SELECT t.rowid as id, t.ref, paye as paid, total_ht, total_ttc, total_tva as total_vat, fk_soc, datef as date, 'SupplierInvoice' as item, s.nom as thirdparty_name, s.code_fournisseur as thirdparty_code, c.code as country_code, s.tva_intra as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."facture_fourn as t LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; $sql.=" WHERE datef between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".FactureFournisseur::STATUS_DRAFT; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".FactureFournisseur::STATUS_DRAFT; $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paid, total_ttc, fk_user_author as fk_soc, date_fin as date, 'ExpenseReport' as item FROM ".MAIN_DB_PREFIX."expensereport"; + $sql.=" SELECT t.rowid as id, t.ref, paid, total_ht, total_ttc, total_tva as total_vat, fk_user_author as fk_soc, date_fin as date, 'ExpenseReport' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."expensereport as t LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = t.fk_user_author LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = u.fk_country"; $sql.=" WHERE date_fin between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".ExpenseReport::STATUS_DRAFT; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".ExpenseReport::STATUS_DRAFT; $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paid, amount as total_ttc, '0' as fk_soc, datedon as date, 'Donation' as item FROM ".MAIN_DB_PREFIX."don"; + $sql.=" SELECT t.rowid as id, t.ref, paid, amount as total_ht, amount as total_ttc, 0 as total_vat, 0 as fk_soc, datedon as date, 'Donation' as item, t.societe as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."don as t LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = t.fk_country"; $sql.=" WHERE datedon between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".Don::STATUS_DRAFT; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".Don::STATUS_DRAFT; $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, label as ref, 1 as paid, amount as total_ttc, fk_user as fk_soc,datep as date, 'SalaryPayment' as item FROM ".MAIN_DB_PREFIX."payment_salary"; + $sql.=" SELECT t.rowid as id, t.label as ref, 1 as paid, amount as total_ht, amount as total_ttc, 0 as total_vat, t.fk_user as fk_soc, datep as date, 'SalaryPayment' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."payment_salary as t LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = t.fk_user LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = u.fk_country"; $sql.=" WHERE datep between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; //$sql.=" AND fk_statut <> ".PaymentSalary::STATUS_DRAFT; $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, libelle as ref, paye as paid, amount as total_ttc, 0 as fk_soc, date_creation as date, 'SocialContributions' as item FROM ".MAIN_DB_PREFIX."chargesociales"; + $sql.=" SELECT t.rowid as id, t.libelle as ref, paye as paid, amount as total_ht, amount as total_ttc, 0 as total_tva, 0 as fk_soc, date_creation as date, 'SocialContributions' as item, '' as thirdparty_name, '' as thirdparty_code, '' as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."chargesociales as t"; $sql.=" WHERE date_creation between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; //$sql.=" AND fk_statut <> ".ChargeSociales::STATUS_DRAFT; $sql.= $db->order($sortfield, $sortorder); + //print $sql; $resd = $db->query($sql); $files=array(); @@ -162,63 +168,68 @@ if (($action=="searchfiles" || $action=="dl" )) { case "Invoice": $subdir = ''; $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->facture->dir_output.'/'.$subdir; - $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; + $upload_dir = $conf->facture->dir_output.'/'.$subdir; + $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; case "SupplierInvoice": $tmpinvoicesupplier->fetch($objd->id); $subdir = get_exdir($tmpinvoicesupplier->id, 2, 0, 1, $tmpinvoicesupplier, 'invoice_supplier'); // TODO Use first file - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; - $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; + $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; case "ExpenseReport": $subdir = ''; $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; - $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; + $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; + $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; case "SalaryPayment": $subdir = ''; $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); - $upload_dir = $conf->salaries->dir_output.'/'.$subdir; - $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; + $upload_dir = $conf->salaries->dir_output.'/'.$subdir; + $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; case "Donation": - $tmpdonation->fetch($objp->id); - $subdir=get_exdir(0, 0, 0, 0, $tmpdonation, 'donation'); - $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); - $upload_dir = $conf->don->dir_output . '/' . $subdir; - $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; + $tmpdonation->fetch($objp->id); + $subdir=get_exdir(0, 0, 0, 0, $tmpdonation, 'donation'); + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->don->dir_output . '/' . $subdir; + $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; case "SocialContributions": $subdir = ''; $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); - $upload_dir = $conf->tax->dir_output . '/' . $subdir; - $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; + $upload_dir = $conf->tax->dir_output . '/' . $subdir; + $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; default: - $subdir = ''; - $upload_dir = ''; - $link = ''; + $subdir=''; + $upload_dir=''; + $link=''; break; } if (!empty($upload_dir)) { $result=true; - $files=dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview\.png)$', '', SORT_ASC, 1); - + //var_dump($upload_dir); if (count($files) < 1) { - $nofile['id']=$objd->id; - $nofile['date']=$db->idate($objd->date); + $nofile['id']=$objd->id; + $nofile['date']=$db->idate($objd->date); $nofile['paid']=$objd->paid; - $nofile['amount']=$objd->total_ttc; + $nofile['amount_ht']=$objd->total_ht; + $nofile['amount_ttc']=$objd->total_ttc; + $nofile['amount_vat']=$objd->total_vat; $nofile['ref']=($objd->ref ? $objd->ref : $objd->id); $nofile['fk']=$objd->fk_soc; $nofile['item']=$objd->item; + $nofile['thirdparty_name']=$objd->thirdparty_name; + $nofile['thirdparty_code']=$objd->thirdparty_code; + $nofile['country_code']=$objd->country_code; + $nofile['vatnum']=$objd->vatnum; $filesarray[]=$nofile; } @@ -226,13 +237,21 @@ if (($action=="searchfiles" || $action=="dl" )) { { foreach ($files as $key => $file) { - $file['id']=$objd->id; - $file['date']=$db->idate($objd->date); + $file['id']=$objd->id; + $file['date']=$db->idate($objd->date); $file['paid']=$objd->paid; - $file['amount']=$objd->total_ttc; + $file['amount_ht']=$objd->total_ht; + $file['amount_ttc']=$objd->total_ttc; + $file['amount_vat']=$objd->total_vat; $file['ref']=($objd->ref ? $objd->ref : $objd->id); $file['fk']=$objd->fk_soc; $file['item']=$objd->item; + + $file['thirdparty_name']=$objd->thirdparty_name; + $file['thirdparty_code']=$objd->thirdparty_code; + $file['country_code']=$objd->country_code; + $file['vatnum']=$objd->vatnum; + $file['link']=$link.$file['name']; $file['relpathnamelang'] = $langs->trans($file['item']).'/'.$file['name']; @@ -252,27 +271,30 @@ if (($action=="searchfiles" || $action=="dl" )) { } } -/* - * cleanup of old ZIP - */ -//FIXME + /* *ZIP creation */ -if ($result && $action == "dl") +$dirfortmpfile = ($conf->accounting->dir_temp ? $conf->accounting->dir_temp : $conf->comptabilite->dir_temp); +if (empty($dirfortmpfile)) { - if (! extension_loaded('zip')) - { - setEventMessages('PHPZIPExtentionNotLoaded', null, 'errors'); - exit; - } + setEventMessages($langs->trans("ErrorNoAccountingModuleEnabled"), null, 'errors'); + $error++; +} - $dirfortmpfile = ($conf->accounting->dir_temp ? $conf->accounting->dir_temp : $conf->compta->dir_temp); + +if ($result && $action == "dl" && ! $error) +{ + if (! extension_loaded('zip')) + { + setEventMessages('PHPZIPExtentionNotLoaded', null, 'errors'); + exit; + } dol_mkdir($dirfortmpfile); - $log='date,type,ref,total,paid,filename,item_id'."\n"; + $log=$langs->transnoentitiesnoconv("Type").','.$langs->transnoentitiesnoconv("Date").','.$langs->transnoentitiesnoconv("Ref").','.$langs->transnoentitiesnoconv("TotalHT").','.$langs->transnoentitiesnoconv("TotalTTC").','.$langs->transnoentitiesnoconv("TotalVAT").','.$langs->transnoentitiesnoconv("Paid").',filename,item_id,'.$langs->trans("ThirdParty").','.$langs->trans("Code").','.$langs->trans("Country").','.$langs->trans("VATIntra")."\n"; $zipname = $dirfortmpfile.'/'.dol_print_date($date_start, 'dayrfc')."-".dol_print_date($date_stop, 'dayrfc').'_export.zip'; dol_delete_file($zipname); @@ -281,10 +303,10 @@ if ($result && $action == "dl") $res = $zip->open($zipname, ZipArchive::OVERWRITE|ZipArchive::CREATE); if ($res) { - foreach ($filesarray as $key=> $file) + foreach ($filesarray as $key => $file) { if (file_exists($file["fullname"])) $zip->addFile($file["fullname"], $file["relpathnamelang"]); // - $log.=dol_print_date($file['date'], 'dayrfc').','.$file['item'].','.$file['ref'].','.$file['amount'].','.$file['paid'].','.$file["name"].','.$file['fk']."\n"; + $log.=$file['item'].','.dol_print_date($file['date'], 'dayrfc').','.$file['ref'].','.$file['amount_ht'].','.$file['amount_ttc'].','.$file['amount_vat'].','.$file['paid'].','.$file["name"].','.$file['fk'].','.$file['thirdparty_name'].','.$file['thirdparty_code'].','.$file['country_code'].',"'.$file['vatnum'].'"'."\n"; } $zip->addFromString('transactions.csv', $log); $zip->close(); @@ -299,6 +321,10 @@ if ($result && $action == "dl") exit(); } + else + { + setEventMessages($langs->trans("FailedToOpenFile", $zipname), null, 'errors'); + } } @@ -329,11 +355,11 @@ print ' - '.$form->selectDate($date_stop, 'date_stop', 0, 0, 0, "", 1, 1, 0)."\n // Export is for current company only ! if (! empty($conf->multicompany->enabled) && is_object($mc)) { - print '('.$langs->trans("Entity").' : '; - $mc->dao->getEntities(); - $mc->dao->fetch($conf->entity); - print $mc->dao->label; - print ")\n"; + print '('.$langs->trans("Entity").' : '; + $mc->dao->getEntities(); + $mc->dao->fetch($conf->entity); + print $mc->dao->label; + print ")\n"; } print ''; @@ -376,14 +402,18 @@ if (!empty($date_start) && !empty($date_stop)) print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print ''; print ''; - print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, 'class="nowrap"', $sortfield, $sortorder); - print ''; + print_liste_field_titre($arrayfields['type']['label'], $_SERVER["PHP_SELF"], "type", "", $param, '', $sortfield, $sortorder, 'nowrap '); + print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, '', $sortfield, $sortorder, 'center nowrap '); print ''; print ''; print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print ''; if ($result) { @@ -397,18 +427,11 @@ if (!empty($date_start) && !empty($date_stop)) { // Sort array by date ASC to calculate balance + $totalET = 0; + $totalIT = 0; + $totalVAT = 0; $totalDebit = 0; $totalCredit = 0; - // Balance calculation - $balance = 0; - foreach($TData as &$data1) { - if ($data1['item']!='Invoice' && $data1['item']!='Donation') - { - $data1['amount']=-$data1['amount']; - } - $balance += $data1['amount']; - $data1['balance'] = $balance; - } // Display array foreach($TData as $data) @@ -417,11 +440,17 @@ if (!empty($date_start) && !empty($date_stop)) //if (!empty($data['fk_facture'])) $html_class = 'facid-'.$data['fk_facture']; //elseif (!empty($data['fk_paiement'])) $html_class = 'payid-'.$data['fk_paiement']; print ''; - print "'; + + // Date + print '\n"; - print ''; - print ''; + + // Ref + print ''; // File link print '\n"; + print "\n"; + + // Paid + print ''; + + // Total ET + print '\n"; + // Total IT + print '\n"; + // Total VAT + print '\n"; + + print '\n"; + + print '\n"; + + print '\n"; + + print '\n"; + + // Debit + //print '\n"; + // Credit + //print '\n"; + + $totalET += $data['amount_ht']; + $totalIT += $data['amount_ttc']; + $totalVAT += $data['amount_vat']; + + $totalDebit += ($data['amount_ttc'] > 0) ? abs($data['amount_ttc']) : 0; + $totalCredit += ($data['amount_ttc'] > 0) ? 0 : abs($data['amount_ttc']); - print ''; - print '\n"; - $totalDebit += ($data['amount'] > 0) ? abs($data['amount']) : 0; - print '\n"; - $totalCredit += ($data['amount'] > 0) ? 0 : abs($data['amount']); // Balance - print '\n"; + //print '\n"; + print "\n"; } print ''; - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + /*print ''; + print ''; + print ''; + */ print "\n"; } } @@ -453,5 +520,6 @@ if (!empty($date_start) && !empty($date_stop)) print ''; } + llxFooter(); $db->close(); diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 40f7da3fa95..1270b8b279a 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -60,6 +60,8 @@ CREATE TABLE llx_pos_cash_fence( -- For 10.0 +UPDATE llx_chargesociales SET date_creation = tms WHERE date_creation IS NULL; + DROP TABLE llx_cotisation; ALTER TABLE llx_accounting_bookkeeping DROP COLUMN validated; ALTER TABLE llx_accounting_bookkeeping_tmp DROP COLUMN validated; diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index 387f8e159ec..37d3f984824 100755 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -400,6 +400,7 @@ ALTER TABLE llx_accounting_account ADD UNIQUE INDEX uk_accounting_account (accou -- p.tva_tx = 0 -- where price = 17.5 +UPDATE llx_chargesociales SET date_creation = tms WHERE date_creation IS NULL; -- VMYSQL4.1 SET sql_mode = 'ALLOW_INVALID_DATES'; -- VMYSQL4.1 update llx_accounting_account set tms = datec where DATE(STR_TO_DATE(tms, '%Y-%m-%d')) IS NULL; diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 2ded2013601..90228aa952e 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -173,7 +173,7 @@ if (! empty($conf->projet->enabled)) $tmparray['projet/index.php?mainmenu=projec if (! empty($conf->holiday->enabled) || ! empty($conf->expensereport->enabled)) $tmparray['hrm/index.php?mainmenu=hrm&leftmenu=']='HRMArea'; // TODO Complete list with first level of menus if (! empty($conf->product->enabled) || ! empty($conf->service->enabled)) $tmparray['product/index.php?mainmenu=products&leftmenu=']='ProductsAndServicesArea'; if (! empty($conf->propal->enabled) || ! empty($conf->commande->enabled) || ! empty($conf->ficheinter->enabled) || ! empty($conf->contrat->enabled)) $tmparray['comm/index.php?mainmenu=commercial&leftmenu=']='CommercialArea'; -if (! empty($conf->compta->enabled) || ! empty($conf->accounting->enabled)) $tmparray['compta/index.php?mainmenu=compta&leftmenu=']='AccountancyTreasuryArea'; +if (! empty($conf->comptabilite->enabled) || ! empty($conf->accounting->enabled)) $tmparray['compta/index.php?mainmenu=compta&leftmenu=']='AccountancyTreasuryArea'; if (! empty($conf->adherent->enabled)) $tmparray['adherents/index.php?mainmenu=members&leftmenu=']='MembersArea'; if (! empty($conf->agenda->enabled)) $tmparray['comm/action/index.php?mainmenu=agenda&leftmenu=']='Agenda'; From ad20a5158c2abe0a04efa3b4fa74a265b5071ead Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 14:32:28 +0200 Subject: [PATCH 0860/1036] Fix columns in csv --- htdocs/compta/accounting-files.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/accounting-files.php b/htdocs/compta/accounting-files.php index c663a179d6d..0954a194b73 100644 --- a/htdocs/compta/accounting-files.php +++ b/htdocs/compta/accounting-files.php @@ -294,7 +294,7 @@ if ($result && $action == "dl" && ! $error) dol_mkdir($dirfortmpfile); - $log=$langs->transnoentitiesnoconv("Type").','.$langs->transnoentitiesnoconv("Date").','.$langs->transnoentitiesnoconv("Ref").','.$langs->transnoentitiesnoconv("TotalHT").','.$langs->transnoentitiesnoconv("TotalTTC").','.$langs->transnoentitiesnoconv("TotalVAT").','.$langs->transnoentitiesnoconv("Paid").',filename,item_id,'.$langs->trans("ThirdParty").','.$langs->trans("Code").','.$langs->trans("Country").','.$langs->trans("VATIntra")."\n"; + $log=$langs->transnoentitiesnoconv("Type").','.$langs->transnoentitiesnoconv("Date").','.$langs->transnoentitiesnoconv("Ref").','.$langs->transnoentitiesnoconv("TotalHT").','.$langs->transnoentitiesnoconv("TotalTTC").','.$langs->transnoentitiesnoconv("TotalVAT").','.$langs->transnoentitiesnoconv("Paid").',filename,item_id,'.$langs->transnoentitiesnoconv("ThirdParty").','.$langs->transnoentitiesnoconv("Code").','.$langs->transnoentitiesnoconv("Country").','.$langs->transnoentitiesnoconv("VATIntra")."\n"; $zipname = $dirfortmpfile.'/'.dol_print_date($date_start, 'dayrfc')."-".dol_print_date($date_stop, 'dayrfc').'_export.zip'; dol_delete_file($zipname); From 27f52dd0bd73fdb2faa9c121ec95fb7fb512839c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 14:32:35 +0200 Subject: [PATCH 0861/1036] Fix columns in csv --- htdocs/compta/compta-files.php | 474 +++++++++++++++++++-------------- 1 file changed, 276 insertions(+), 198 deletions(-) diff --git a/htdocs/compta/compta-files.php b/htdocs/compta/compta-files.php index be08e264a02..e28df61e658 100644 --- a/htdocs/compta/compta-files.php +++ b/htdocs/compta/compta-files.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2018 Laurent Destailleur + * Copyright (C) 2004-2019 Laurent Destailleur * Copyright (C) 2017 Pierre-Henry Favre * * This program is free software; you can redistribute it and/or modify @@ -17,7 +17,7 @@ * along with this program. If not, see . */ /** - * \file htdocs/compta/compta-files.php + * \file htdocs/compta/accounting-files.php * \ingroup compta * \brief Page to show portoflio and files of a thirdparty and download it */ @@ -25,15 +25,14 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; -require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; -require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php'; +require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; -$langs->loadLangs(array("accountancy","bills")); +$langs->loadLangs(array("accountancy", "bills", "companies", "salaries")); $date_start =GETPOST('date_start', 'alpha'); $date_startDay= GETPOST('date_startday', 'int'); @@ -45,7 +44,7 @@ $date_stopDay= GETPOST('date_stopday', 'int'); $date_stopMonth= GETPOST('date_stopmonth', 'int'); $date_stopYear= GETPOST('date_stopyear', 'int'); //FIXME doldate -$date_stop=($date_stopDay)?dol_mktime(0, 0, 0, $date_stopMonth, $date_stopDay, $date_stopYear):strtotime($date_stop); +$date_stop=($date_stopDay)?dol_mktime(23, 59, 59, $date_stopMonth, $date_stopDay, $date_stopYear):strtotime($date_stop); $action =GETPOST('action', 'alpha'); // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context @@ -65,6 +64,7 @@ if (! $sortorder) $sortorder="DESC"; $arrayfields=array( + 'type'=>array('label'=>"Type", 'checked'=>1), 'date'=>array('label'=>"Date", 'checked'=>1), //... ); @@ -74,8 +74,9 @@ if (empty($conf->comptabilite->enabled) && empty($conf->accounting->enabled)) { accessforbidden(); } if ($user->societe_id > 0) +{ accessforbidden(); - +} /* @@ -90,157 +91,211 @@ $entity = GETPOST('entity','int')?GETPOST('entity','int'):$conf->entity; $filesarray=array(); $result=false; -if(($action=="searchfiles"||$action=="dl" ) && $date_start && $date_stop){ - $wheretail=" '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'"; - $sql="SELECT rowid as id, facnumber as ref,paye as paid, total_ttc, fk_soc, datef as date, 'Invoice' as item FROM ".MAIN_DB_PREFIX."facture"; - $sql.=" WHERE datef between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".Facture::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paye as paid, total_ttc, fk_soc, datef as date, 'SupplierInvoice' as item FROM ".MAIN_DB_PREFIX."facture_fourn"; - $sql.=" WHERE datef between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".FactureFournisseur::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref, paid, total_ttc, fk_user_author as fk_soc, date_fin as date,'ExpenseReport' as item FROM ".MAIN_DB_PREFIX."expensereport"; - $sql.=" WHERE date_fin between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".ExpenseReport::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, ref,paid,amount as total_ttc, '0' as fk_soc, datedon as date,'Donation' as item FROM ".MAIN_DB_PREFIX."don"; - $sql.=" WHERE datedon between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - $sql.=" AND fk_statut <> ".Don::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, label as ref, 1 as paid, amount as total_ttc, fk_user as fk_soc,datep as date,'SalaryPayment' as item FROM ".MAIN_DB_PREFIX."payment_salary"; - $sql.=" WHERE datep between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - //$sql.=" AND fk_statut <> ".PaymentSalary::STATUS_DRAFT; - $sql.=" UNION ALL"; - $sql.=" SELECT rowid as id, libelle as ref, paye as paid, amount as total_ttc, 0 as fk_soc, date_creation as date, 'SocialContributions' as item FROM ".MAIN_DB_PREFIX."chargesociales"; - $sql.=" WHERE date_creation between ".$wheretail; - $sql.=" AND entity IN (".($entity==1?'0,1':$entity).')'; - //$sql.=" AND fk_statut <> ".ChargeSociales::STATUS_DRAFT; - $sql.= $db->order($sortfield, $sortorder); +if (($action=="searchfiles" || $action=="dl" )) { - $resd = $db->query($sql); - $files=array(); - $link=''; - - if ($resd) + if (empty($date_start)) { - $numd = $db->num_rows($resd); + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateStart")), null, 'errors'); + $error++; + } + if (empty($date_stop)) + { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors'); + $error++; + } - $tmpinvoice=new Facture($db); - $tmpinvoicesupplier=new FactureFournisseur($db); - $tmpdonation=new Don($db); + if (! $error) + { + $wheretail=" '".$db->idate($date_start)."' AND '".$db->idate($date_stop)."'"; - $upload_dir =''; - $i=0; - while ($i < $numd) + $sql="SELECT t.rowid as id, t.facnumber as ref, t.paye as paid, total as total_ht, total_ttc, tva as total_vat, fk_soc, t.datef as date, 'Invoice' as item, s.nom as thirdparty_name, s.code_client as thirdparty_code, c.code as country_code, s.tva_intra as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."facture as t LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; + $sql.=" WHERE datef between ".$wheretail; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".Facture::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT t.rowid as id, t.ref, paye as paid, total_ht, total_ttc, total_tva as total_vat, fk_soc, datef as date, 'SupplierInvoice' as item, s.nom as thirdparty_name, s.code_fournisseur as thirdparty_code, c.code as country_code, s.tva_intra as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."facture_fourn as t LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = t.fk_soc LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = s.fk_pays"; + $sql.=" WHERE datef between ".$wheretail; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".FactureFournisseur::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT t.rowid as id, t.ref, paid, total_ht, total_ttc, total_tva as total_vat, fk_user_author as fk_soc, date_fin as date, 'ExpenseReport' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."expensereport as t LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = t.fk_user_author LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = u.fk_country"; + $sql.=" WHERE date_fin between ".$wheretail; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".ExpenseReport::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT t.rowid as id, t.ref, paid, amount as total_ht, amount as total_ttc, 0 as total_vat, 0 as fk_soc, datedon as date, 'Donation' as item, t.societe as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."don as t LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = t.fk_country"; + $sql.=" WHERE datedon between ".$wheretail; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + $sql.=" AND t.fk_statut <> ".Don::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT t.rowid as id, t.label as ref, 1 as paid, amount as total_ht, amount as total_ttc, 0 as total_vat, t.fk_user as fk_soc, datep as date, 'SalaryPayment' as item, CONCAT(CONCAT(u.lastname, ' '), u.firstname) as thirdparty_name, '' as thirdparty_code, c.code as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."payment_salary as t LEFT JOIN ".MAIN_DB_PREFIX."user as u ON u.rowid = t.fk_user LEFT JOIN ".MAIN_DB_PREFIX."c_country as c ON c.rowid = u.fk_country"; + $sql.=" WHERE datep between ".$wheretail; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + //$sql.=" AND fk_statut <> ".PaymentSalary::STATUS_DRAFT; + $sql.=" UNION ALL"; + $sql.=" SELECT t.rowid as id, t.libelle as ref, paye as paid, amount as total_ht, amount as total_ttc, 0 as total_tva, 0 as fk_soc, date_creation as date, 'SocialContributions' as item, '' as thirdparty_name, '' as thirdparty_code, '' as country_code, '' as vatnum"; + $sql.=" FROM ".MAIN_DB_PREFIX."chargesociales as t"; + $sql.=" WHERE date_creation between ".$wheretail; + $sql.=" AND t.entity IN (".($entity==1?'0,1':$entity).')'; + //$sql.=" AND fk_statut <> ".ChargeSociales::STATUS_DRAFT; + $sql.= $db->order($sortfield, $sortorder); + //print $sql; + + $resd = $db->query($sql); + $files=array(); + $link=''; + + if ($resd) { - $objd = $db->fetch_object($resd); + $numd = $db->num_rows($resd); - switch($objd->item) - { - case "Invoice": - $subdir=dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->facture->dir_output.'/'.$subdir; - $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "SupplierInvoice": - $tmpinvoicesupplier->fetch($objd->id); - $subdir=get_exdir($tmpinvoicesupplier->id, 2, 0, 0, $tmpinvoicesupplier, 'invoice_supplier').'/'.dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; - $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "ExpenseReport": - $subdir=dol_sanitizeFileName($objd->ref); - $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; - $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "SalaryPayment": - $subdir=dol_sanitizeFileName($objd->id); - $upload_dir = $conf->salaries->dir_output.'/'.$subdir; - $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "Donation": - $tmpdonation->fetch($objp->id); - $subdir=get_exdir(0, 0, 0, 1, $tmpdonation, 'donation'). '/'. dol_sanitizeFileName($objd->id); - $upload_dir = $conf->don->dir_output . '/' . $subdir; - $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - case "SocialContributions": - $subdir=dol_sanitizeFileName($objd->id); - $upload_dir = $conf->tax->dir_output . '/' . $subdir; - $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; - break; - default: - $subdir=''; - $upload_dir=''; - $link=''; - break; - } + $tmpinvoice=new Facture($db); + $tmpinvoicesupplier=new FactureFournisseur($db); + $tmpdonation=new Don($db); - if (!empty($upload_dir)) + $upload_dir =''; + $i=0; + while ($i < $numd) { - $result=true; - $files=dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview\.png)$', '', SORT_ASC, 1); - //var_dump($upload_dir); - if (count($files) < 1) + $objd = $db->fetch_object($resd); + + switch($objd->item) { - $nofile['date']=$db->idate($objd->date); - $nofile['paid']=$objd->paid; - $nofile['amount']=$objd->total_ttc; - $nofile['ref']=$objd->ref; - $nofile['fk']=$objd->fk_soc; - $nofile['item']=$objd->item; - - $filesarray[]=$nofile; + case "Invoice": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->facture->dir_output.'/'.$subdir; + $link="document.php?modulepart=facture&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "SupplierInvoice": + $tmpinvoicesupplier->fetch($objd->id); + $subdir = get_exdir($tmpinvoicesupplier->id, 2, 0, 1, $tmpinvoicesupplier, 'invoice_supplier'); // TODO Use first file + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->fournisseur->facture->dir_output.'/'.$subdir; + $link="document.php?modulepart=facture_fournisseur&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "ExpenseReport": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->ref); + $upload_dir = $conf->expensereport->dir_output.'/'.$subdir; + $link="document.php?modulepart=expensereport&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "SalaryPayment": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->salaries->dir_output.'/'.$subdir; + $link="document.php?modulepart=salaries&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "Donation": + $tmpdonation->fetch($objp->id); + $subdir=get_exdir(0, 0, 0, 0, $tmpdonation, 'donation'); + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->don->dir_output . '/' . $subdir; + $link="document.php?modulepart=don&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + case "SocialContributions": + $subdir = ''; + $subdir.=($subdir ? '/' : '').dol_sanitizeFileName($objd->id); + $upload_dir = $conf->tax->dir_output . '/' . $subdir; + $link="document.php?modulepart=tax&file=".str_replace('/', '%2F', $subdir).'%2F'; + break; + default: + $subdir=''; + $upload_dir=''; + $link=''; + break; } - else - { - foreach ($files as $key => $file) - { - $file['date']=$db->idate($objd->date); - $file['paid']=$objd->paid; - $file['amount']=$objd->total_ttc; - $file['ref']=$objd->ref; - $file['fk']=$objd->fk_soc; - $file['item']=$objd->item; - $file['link']=$link.$file['name']; - $file['relpathnamelang'] = $langs->trans($file['item']).'/'.$file['name']; - $filesarray[]=$file; + if (!empty($upload_dir)) + { + $result=true; + $files=dol_dir_list($upload_dir, "files", 0, '', '(\.meta|_preview\.png)$', '', SORT_ASC, 1); + //var_dump($upload_dir); + if (count($files) < 1) + { + $nofile['id']=$objd->id; + $nofile['date']=$db->idate($objd->date); + $nofile['paid']=$objd->paid; + $nofile['amount_ht']=$objd->total_ht; + $nofile['amount_ttc']=$objd->total_ttc; + $nofile['amount_vat']=$objd->total_vat; + $nofile['ref']=($objd->ref ? $objd->ref : $objd->id); + $nofile['fk']=$objd->fk_soc; + $nofile['item']=$objd->item; + $nofile['thirdparty_name']=$objd->thirdparty_name; + $nofile['thirdparty_code']=$objd->thirdparty_code; + $nofile['country_code']=$objd->country_code; + $nofile['vatnum']=$objd->vatnum; + + $filesarray[]=$nofile; + } + else + { + foreach ($files as $key => $file) + { + $file['id']=$objd->id; + $file['date']=$db->idate($objd->date); + $file['paid']=$objd->paid; + $file['amount_ht']=$objd->total_ht; + $file['amount_ttc']=$objd->total_ttc; + $file['amount_vat']=$objd->total_vat; + $file['ref']=($objd->ref ? $objd->ref : $objd->id); + $file['fk']=$objd->fk_soc; + $file['item']=$objd->item; + + $file['thirdparty_name']=$objd->thirdparty_name; + $file['thirdparty_code']=$objd->thirdparty_code; + $file['country_code']=$objd->country_code; + $file['vatnum']=$objd->vatnum; + + $file['link']=$link.$file['name']; + $file['relpathnamelang'] = $langs->trans($file['item']).'/'.$file['name']; + + $filesarray[]=$file; + } } } + $i++; } - $i++; } - } - else - { - dol_print_error($db); - } + else + { + dol_print_error($db); + } - $db->free($resd); + $db->free($resd); + } } -/* - * cleanup of old ZIP - */ -//FIXME + /* *ZIP creation */ -if ($result && $action == "dl") +$dirfortmpfile = ($conf->accounting->dir_temp ? $conf->accounting->dir_temp : $conf->comptabilite->dir_temp); +if (empty($dirfortmpfile)) { - $dirfortmpfile = ($conf->accounting->dir_temp ? $conf->accounting->dir_temp : $conf->compta->dir_temp); + setEventMessages($langs->trans("ErrorNoAccountingModuleEnabled"), null, 'errors'); + $error++; +} + + +if ($result && $action == "dl" && ! $error) +{ + if (! extension_loaded('zip')) + { + setEventMessages('PHPZIPExtentionNotLoaded', null, 'errors'); + exit; + } dol_mkdir($dirfortmpfile); - $log='date,type,ref,total,paid,filename,item_id'."\n"; + $log=$langs->transnoentitiesnoconv("Type").','.$langs->transnoentitiesnoconv("Date").','.$langs->transnoentitiesnoconv("Ref").','.$langs->transnoentitiesnoconv("TotalHT").','.$langs->transnoentitiesnoconv("TotalTTC").','.$langs->transnoentitiesnoconv("TotalVAT").','.$langs->transnoentitiesnoconv("Paid").',filename,item_id,'.$langs->transnoentitiesnoconv("ThirdParty").','.$langs->transnoentitiesnoconv("Code").','.$langs->transnoentitiesnoconv("Country").','.$langs->transnoentitiesnoconv("VATIntra")."\n"; $zipname = $dirfortmpfile.'/'.dol_print_date($date_start, 'dayrfc')."-".dol_print_date($date_stop, 'dayrfc').'_export.zip'; dol_delete_file($zipname); @@ -249,10 +304,10 @@ if ($result && $action == "dl") $res = $zip->open($zipname, ZipArchive::OVERWRITE|ZipArchive::CREATE); if ($res) { - foreach ($filesarray as $key=> $file) + foreach ($filesarray as $key => $file) { if (file_exists($file["fullname"])) $zip->addFile($file["fullname"], $file["relpathnamelang"]); // - $log.=dol_print_date($file['date'], 'dayrfc').','.$file['item'].','.$file['ref'].','.$file['amount'].','.$file['paid'].','.$file["name"].','.$file['fk']."\n"; + $log.=$file['item'].','.dol_print_date($file['date'], 'dayrfc').','.$file['ref'].','.$file['amount_ht'].','.$file['amount_ttc'].','.$file['amount_vat'].','.$file['paid'].','.$file["name"].','.$file['fk'].','.$file['thirdparty_name'].','.$file['thirdparty_code'].','.$file['country_code'].',"'.$file['vatnum'].'"'."\n"; } $zip->addFromString('transactions.csv', $log); $zip->close(); @@ -267,6 +322,10 @@ if ($result && $action == "dl") exit(); } + else + { + setEventMessages($langs->trans("FailedToOpenFile", $zipname), null, 'errors'); + } } @@ -283,7 +342,7 @@ llxHeader('', $title, $help_url); $h=0; $head[$h][0] = $_SERVER["PHP_SELF"].$varlink; -$head[$h][1] = $langs->trans("AccountancyFiles"); +$head[$h][1] = $langs->trans("AccountantFiles"); $head[$h][2] = 'AccountancyFiles'; dol_fiche_head($head, 'AccountancyFiles'); @@ -293,45 +352,20 @@ print '
'; print $langs->trans("ReportPeriod").': '.$form->selectDate($date_start, 'date_start', 0, 0, 0, "", 1, 1, 0); print ' - '.$form->selectDate($date_stop, 'date_stop', 0, 0, 0, "", 1, 1, 0)."\n"; -// Multicompany -/*if (! empty($conf->multicompany->enabled) && is_object($mc)) - { - print '
'; - // This is now done with hook formObjectOptions. Keep this code for backward compatibility with old multicompany module - if (method_exists($mc, 'formObjectOptions')) - { - if (empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE) && $conf->entity == 1 && $user->admin && ! $user->entity) // condition must be same for create and edit mode - { - print "
".''; - print "\n"; - } - else - { - print ''; - } - } - $object = new stdClass(); - // Other attributes - $parameters=array('objectsrc' => null, 'colspan' => ' colspan="3"'); - $reshook=$hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - if (empty($reshook)) - { - print $object->showOptionals($extrafields, 'edit'); - } - }*/ +// Export is for current company only ! if (! empty($conf->multicompany->enabled) && is_object($mc)) { - print '   -   '.$langs->trans("Entity").' : '; + print '('.$langs->trans("Entity").' : '; $mc->dao->getEntities(); $mc->dao->fetch($conf->entity); print $mc->dao->label; - print "
\n"; + print ")
\n"; } -print ''."\n"; +print ''; + +print ''."\n"; dol_fiche_end(); @@ -369,14 +403,18 @@ if (!empty($date_start) && !empty($date_stop)) print '
'; // You can use div-table-responsive-no-min if you dont need reserved height for your table print '
'.$langs->trans("Type").''.$langs->trans("Ref").''.$langs->trans("Document").''.$langs->trans("Paid").''.$langs->trans("Debit").''.$langs->trans("Credit").''.$langs->trans("Balance").''.$langs->trans("TotalHT").''.$langs->trans("TotalTTC").''.$langs->trans("TotalVAT").''.$langs->trans("ThirdParty").''.$langs->trans("Code").''.$langs->trans("Country").''.$langs->trans("VATIntra").'
"; + + // Type + print ''.$langs->trans($data['item']).''; print dol_print_date($data['date'], 'day'); print "'.$langs->trans($data['item']).''.$data['ref'].''.$data['ref'].''; @@ -429,23 +458,61 @@ if (!empty($date_start) && !empty($date_stop)) { print ''.($data['name'] ? $data['name'] : $data['ref']).''; } - print "'.$data['paid'].''.price($data['amount_ht'])."'.price($data['amount_ttc'])."'.price($data['amount_vat'])."'.$data['thirdparty_name']."'.$data['thirdparty_code']."'.$data['country_code']."'.$data['vatnum']."'.(($data['amount_ttc'] > 0) ? price(abs($data['amount_ttc'])) : '')."'.(($data['amount_ttc'] > 0) ? '' : price(abs($data['amount_ttc'])))."'.$data['paid'].''.(($data['amount'] > 0) ? price(abs($data['amount'])) : '')."'.(($data['amount'] > 0) ? '' : price(abs($data['amount'])))."'.price($data['balance'])."'.price($data['balance'])."
 '.price($totalDebit).''.price($totalCredit).''.price(price2num($totalDebit - $totalCredit, 'MT')).''.price($totalET).''.price($totalIT).''.price($totalVAT).''.price($totalDebit).''.price($totalCredit).''.price(price2num($totalDebit - $totalCredit, 'MT')).'
'.$langs->trans("Entity").'".$mc->select_entities($entity); - print "
'; print ''; - print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, 'align="center" class="nowrap"', $sortfield, $sortorder); - print ''; + print_liste_field_titre($arrayfields['type']['label'], $_SERVER["PHP_SELF"], "type", "", $param, '', $sortfield, $sortorder, 'nowrap '); + print_liste_field_titre($arrayfields['date']['label'], $_SERVER["PHP_SELF"], "date", "", $param, '', $sortfield, $sortorder, 'center nowrap '); print ''; - print ''; + print ''; print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print ''; if ($result) { @@ -390,20 +428,11 @@ if (!empty($date_start) && !empty($date_stop)) { // Sort array by date ASC to calculate balance + $totalET = 0; + $totalIT = 0; + $totalVAT = 0; $totalDebit = 0; $totalCredit = 0; - // Balance calculation - $balance = 0; - foreach($TData as &$data1) { - if ($data1['item']!='Invoice'&& $data1['item']!='Donation' ){ - $data1['amount']=-$data1['amount']; - } - if ($data1['amount']>0){ - }else{ - } - $balance += $data1['amount']; - $data1['balance'] = $balance; - } // Display array foreach($TData as $data) @@ -412,30 +441,79 @@ if (!empty($date_start) && !empty($date_stop)) //if (!empty($data['fk_facture'])) $html_class = 'facid-'.$data['fk_facture']; //elseif (!empty($data['fk_paiement'])) $html_class = 'payid-'.$data['fk_paiement']; print ''; - print "'; + + // Date + print '\n"; - print ''; + + // Ref print ''; // File link - print '\n"; + print '\n"; + // Paid print ''; - print '\n"; - $totalDebit += ($data['amount'] > 0) ? abs($data['amount']) : 0; - print '\n"; - $totalCredit += ($data['amount'] > 0) ? 0 : abs($data['amount']); + + // Total ET + print '\n"; + // Total IT + print '\n"; + // Total VAT + print '\n"; + + print '\n"; + + print '\n"; + + print '\n"; + + print '\n"; + + // Debit + //print '\n"; + // Credit + //print '\n"; + + $totalET += $data['amount_ht']; + $totalIT += $data['amount_ttc']; + $totalVAT += $data['amount_vat']; + + $totalDebit += ($data['amount_ttc'] > 0) ? abs($data['amount_ttc']) : 0; + $totalCredit += ($data['amount_ttc'] > 0) ? 0 : abs($data['amount_ttc']); + // Balance - print '\n"; + //print '\n"; + print "\n"; } print ''; - print ''; - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + /*print ''; + print ''; + print ''; + */ print "\n"; } } From 6bda130835a347b075ae79f4132a0969c418e426 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 14:51:57 +0200 Subject: [PATCH 0862/1036] Protect from dir scan --- htdocs/bom/admin/index.html | 0 htdocs/bom/class/index.html | 0 htdocs/bom/index.html | 0 htdocs/bom/lib/index.html | 0 htdocs/datapolicy/admin/index.html | 0 htdocs/datapolicy/class/index.html | 0 htdocs/datapolicy/index.html | 0 htdocs/datapolicy/lib/index.html | 0 htdocs/debugbar/index.html | 0 htdocs/website/class/index.html | 0 htdocs/website/lib/index.html | 0 11 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 htdocs/bom/admin/index.html create mode 100644 htdocs/bom/class/index.html create mode 100644 htdocs/bom/index.html create mode 100644 htdocs/bom/lib/index.html create mode 100644 htdocs/datapolicy/admin/index.html create mode 100644 htdocs/datapolicy/class/index.html create mode 100644 htdocs/datapolicy/index.html create mode 100644 htdocs/datapolicy/lib/index.html create mode 100644 htdocs/debugbar/index.html create mode 100644 htdocs/website/class/index.html create mode 100644 htdocs/website/lib/index.html diff --git a/htdocs/bom/admin/index.html b/htdocs/bom/admin/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/bom/class/index.html b/htdocs/bom/class/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/bom/index.html b/htdocs/bom/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/bom/lib/index.html b/htdocs/bom/lib/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/datapolicy/admin/index.html b/htdocs/datapolicy/admin/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/datapolicy/class/index.html b/htdocs/datapolicy/class/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/datapolicy/index.html b/htdocs/datapolicy/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/datapolicy/lib/index.html b/htdocs/datapolicy/lib/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/debugbar/index.html b/htdocs/debugbar/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/website/class/index.html b/htdocs/website/class/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/website/lib/index.html b/htdocs/website/lib/index.html new file mode 100644 index 00000000000..e69de29bb2d From 492c3b5625f28f2fe117ed6c8041d9415a0eaac8 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Tue, 18 Jun 2019 15:13:08 +0200 Subject: [PATCH 0863/1036] FIX hook --- htdocs/adherents/index.php | 2 +- htdocs/mrp/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/index.php b/htdocs/adherents/index.php index 481a8e8fffd..3e26ae1ce3a 100644 --- a/htdocs/adherents/index.php +++ b/htdocs/adherents/index.php @@ -442,7 +442,7 @@ print ""; print ''; $parameters = array('user' => $user); -$reshook = $hookmanager->executeHooks('dashboardUsersGroups', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('dashboardMembers', $parameters, $object); // Note that $action and $object may have been modified by hook // End of page llxFooter(); diff --git a/htdocs/mrp/index.php b/htdocs/mrp/index.php index a587706dbb7..325017c4fb7 100644 --- a/htdocs/mrp/index.php +++ b/htdocs/mrp/index.php @@ -129,7 +129,7 @@ else print ''; $parameters = array('type' => $type, 'user' => $user); -$reshook = $hookmanager->executeHooks('dashboardBOM', $parameters, $object); // Note that $action and $object may have been modified by hook +$reshook = $hookmanager->executeHooks('dashboardMRP', $parameters, $object); // Note that $action and $object may have been modified by hook // End of page llxFooter(); From 6afda6a47a8db60cf16e11d3475862c41c435016 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 15:57:22 +0200 Subject: [PATCH 0864/1036] FIX invalid link on user.fk_user --- htdocs/install/mysql/migration/repair.sql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/htdocs/install/mysql/migration/repair.sql b/htdocs/install/mysql/migration/repair.sql index 22409441eac..dc9fcc86df6 100755 --- a/htdocs/install/mysql/migration/repair.sql +++ b/htdocs/install/mysql/migration/repair.sql @@ -199,6 +199,15 @@ delete from llx_element_element where sourcetype='commande' and fk_source not in DELETE FROM llx_actioncomm_resources WHERE fk_actioncomm not in (select id from llx_actioncomm); +-- Fix link on parent that were removed +DROP table tmp_user; +CREATE TABLE tmp_user as (select * from llx_user); +UPDATE llx_user SET fk_user = NULL where fk_user NOT IN (select rowid from tmp_user); + + +update llx_user set fk_user = null where fk_user not in (select rowid from llx_user); + + UPDATE llx_product SET canvas = NULL where canvas = 'default@product'; UPDATE llx_product SET canvas = NULL where canvas = 'service@product'; From 6e9874b95ad50d6011fbd5677442cc9d69944804 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 16:01:24 +0200 Subject: [PATCH 0865/1036] FIX A user may read holiday and expense report without permissions --- htdocs/expensereport/list.php | 16 +++++++++++++++- htdocs/holiday/list.php | 12 ++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 3b153bcf843..8b5ef11f128 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -46,10 +46,25 @@ $confirm=GETPOST('confirm','alpha'); $toselect = GETPOST('toselect', 'array'); $contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'expensereportlist'; +$childids = $user->getAllChildIds(1); + // Security check $socid = GETPOST('socid','int'); if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'expensereport','',''); +$id = GETPOST('id', 'int'); +// If we are on the view of a specific user +if ($id > 0) +{ + $canread=0; + if ($id == $user->id) $canread=1; + if (! empty($user->rights->holiday->read_all)) $canread=1; + if (! empty($user->rights->holiday->read) && in_array($id, $childids)) $canread=1; + if (! $canread) + { + accessforbidden(); + } +} $diroutputmassaction=$conf->expensereport->dir_output . '/temp/massgeneration/'.$user->id; @@ -66,7 +81,6 @@ $pagenext = $page + 1; if (!$sortorder) $sortorder="DESC"; if (!$sortfield) $sortfield="d.date_debut"; -$id = GETPOST('id', 'int'); $sall = trim((GETPOST('search_all', 'alphanohtml')!='')?GETPOST('search_all', 'alphanohtml'):GETPOST('sall', 'alphanohtml')); $search_ref = GETPOST('search_ref', 'alpha'); diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 5df3fdb314b..d07ec98ca4c 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -60,6 +60,18 @@ if ($user->societe_id > 0) // Protection if external user } $result = restrictedArea($user, 'holiday', $id, ''); $id = GETPOST('id','int'); +// If we are on the view of a specific user +if ($id > 0) +{ + $canread=0; + if ($id == $user->id) $canread=1; + if (! empty($user->rights->holiday->read_all)) $canread=1; + if (! empty($user->rights->holiday->read) && in_array($id, $childids)) $canread=1; + if (! $canread) + { + accessforbidden(); + } +} // Load variable for pagination $limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; From 81bca34a08186b79909c41f87ea95c087530c219 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 16:04:25 +0200 Subject: [PATCH 0866/1036] FIX A user may read holiday and expense report without permissions --- htdocs/expensereport/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 8b5ef11f128..0014cb7999c 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -58,8 +58,8 @@ if ($id > 0) { $canread=0; if ($id == $user->id) $canread=1; - if (! empty($user->rights->holiday->read_all)) $canread=1; - if (! empty($user->rights->holiday->read) && in_array($id, $childids)) $canread=1; + if (! empty($user->rights->expensereport->readall)) $canread=1; + if (! empty($user->rights->expensereport->lire) && in_array($id, $childids)) $canread=1; if (! $canread) { accessforbidden(); From 13abfc3140298227cbaaa02aef53503efe2b0db3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 16:46:12 +0200 Subject: [PATCH 0867/1036] Code comment --- htdocs/install/mysql/tables/llx_societe.sql | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_societe.sql b/htdocs/install/mysql/tables/llx_societe.sql index ed4919c3fc5..e7a948d67c2 100644 --- a/htdocs/install/mysql/tables/llx_societe.sql +++ b/htdocs/install/mysql/tables/llx_societe.sql @@ -65,34 +65,34 @@ create table llx_societe fk_typent integer DEFAULT 0, -- fk_forme_juridique integer DEFAULT 0, -- juridical status fk_currency varchar(3), -- default currency - siren varchar(128), -- IDProf1: siren or RCS for france, ... - siret varchar(128), -- IDProf2: siret for france, ... - ape varchar(128), -- IDProf3: code ape for france, ... - idprof4 varchar(128), -- IDProf4: nu for france - idprof5 varchar(128), -- IDProf5: nu for france - idprof6 varchar(128), -- IDProf6: nu for france - tva_intra varchar(20), -- tva - capital double(24,8) DEFAULT NULL, -- capital de la societe - fk_stcomm integer DEFAULT 0 NOT NULL, -- commercial statut + siren varchar(128), -- IDProf1: depends on country (example: siren or RCS for france, ...) + siret varchar(128), -- IDProf2: depends on country (example: siret for france, ...) + ape varchar(128), -- IDProf3: depends on country (example: code ape for france, ...) + idprof4 varchar(128), -- IDProf4: depends on country (example: nu for france, ...) + idprof5 varchar(128), -- IDProf5: depends on country (example: nu for france, ...) + idprof6 varchar(128), -- IDProf6: depends on country (example: nu for france, ... + tva_intra varchar(20), -- vat numero + capital double(24,8) DEFAULT NULL, -- capital of company + fk_stcomm integer DEFAULT 0 NOT NULL, -- commercial status note_private text, -- note_public text, -- model_pdf varchar(255), - prefix_comm varchar(5), -- prefix commercial + prefix_comm varchar(5), -- prefix commercial (deprecated) client tinyint DEFAULT 0, -- client 0/1/2 fournisseur tinyint DEFAULT 0, -- fournisseur 0/1 - supplier_account varchar(32), -- compte client chez un fournisseur + supplier_account varchar(32), -- Id of our customer account known by the supplier fk_prospectlevel varchar(12), -- prospect level (in llx_c_prospectlevel) fk_incoterms integer, -- for incoterms location_incoterms varchar(255), -- for incoterms customer_bad tinyint DEFAULT 0, -- mauvais payeur 0/1 customer_rate real DEFAULT 0, -- taux fiabilite client (0 a 1) supplier_rate real DEFAULT 0, -- taux fiabilite fournisseur (0 a 1) - remise_client real DEFAULT 0, -- remise systematique pour le client - remise_supplier real DEFAULT 0, -- remise systematique auprès du fournisseur - mode_reglement tinyint, -- mode de reglement - cond_reglement tinyint, -- condition de reglement - mode_reglement_supplier tinyint, -- mode de reglement fournisseur - cond_reglement_supplier tinyint, -- condition de reglement fournisseur + remise_client real DEFAULT 0, -- discount by default granted to this customer + remise_supplier real DEFAULT 0, -- discount by default granted by this supplier + mode_reglement tinyint, -- payment mode customer + cond_reglement tinyint, -- payment term customer + mode_reglement_supplier tinyint, -- payment mode supplier + cond_reglement_supplier tinyint, -- payment term supplier fk_shipping_method integer, -- preferred shipping method id tva_assuj tinyint DEFAULT 1, -- assujeti ou non a la TVA localtax1_assuj tinyint DEFAULT 0, -- assujeti ou non a local tax 1 From 181375ff958955a0bd55684d8e4cd97592811672 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Tue, 18 Jun 2019 17:09:46 +0200 Subject: [PATCH 0868/1036] FIX travis space left --- htdocs/opensurvey/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/opensurvey/index.php b/htdocs/opensurvey/index.php index 0a9e3483348..6ed0f2148fa 100644 --- a/htdocs/opensurvey/index.php +++ b/htdocs/opensurvey/index.php @@ -1,7 +1,7 @@ * Copyright (C) 2019 Nicolas ZABOURI - * + * * 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 From c000d897d7f38096a9980fb1dd009712b8c8b3ec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 17:42:45 +0200 Subject: [PATCH 0869/1036] Fix rendering of amount --- htdocs/compta/facture/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index d12fc90fd77..b6beba5e12e 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -959,11 +959,11 @@ if ($resql) $totalcreditnotes = $facturestatic->getSumCreditNotesUsed(); $totaldeposits = $facturestatic->getSumDepositsUsed(); $totalpay = $paiement + $totalcreditnotes + $totaldeposits; - $remaintopay = $facturestatic->total_ttc - $totalpay; + $remaintopay = price2num($facturestatic->total_ttc - $totalpay); if ($facturestatic->type == Facture::TYPE_CREDIT_NOTE && $obj->paye == 1) { $remaincreditnote = $discount->getAvailableDiscounts($obj->fk_soc, '', 'rc.fk_facture_source='.$facturestatic->id); $remaintopay = -$remaincreditnote; - $totalpay = $facturestatic->total_ttc - $remaintopay; + $totalpay = price2num($facturestatic->total_ttc - $remaintopay); } print ' Date: Tue, 18 Jun 2019 17:42:45 +0200 Subject: [PATCH 0870/1036] Fix rendering of amount --- htdocs/compta/facture/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index d12fc90fd77..b6beba5e12e 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -959,11 +959,11 @@ if ($resql) $totalcreditnotes = $facturestatic->getSumCreditNotesUsed(); $totaldeposits = $facturestatic->getSumDepositsUsed(); $totalpay = $paiement + $totalcreditnotes + $totaldeposits; - $remaintopay = $facturestatic->total_ttc - $totalpay; + $remaintopay = price2num($facturestatic->total_ttc - $totalpay); if ($facturestatic->type == Facture::TYPE_CREDIT_NOTE && $obj->paye == 1) { $remaincreditnote = $discount->getAvailableDiscounts($obj->fk_soc, '', 'rc.fk_facture_source='.$facturestatic->id); $remaintopay = -$remaincreditnote; - $totalpay = $facturestatic->total_ttc - $remaintopay; + $totalpay = price2num($facturestatic->total_ttc - $remaintopay); } print ' Date: Tue, 18 Jun 2019 18:07:47 +0200 Subject: [PATCH 0871/1036] Fix phpcs --- htdocs/compta/accounting-files.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/accounting-files.php b/htdocs/compta/accounting-files.php index 0954a194b73..9069045c8b3 100644 --- a/htdocs/compta/accounting-files.php +++ b/htdocs/compta/accounting-files.php @@ -73,16 +73,17 @@ $arrayfields=array( if (empty($conf->comptabilite->enabled) && empty($conf->accounting->enabled)) { accessforbidden(); } -if ($user->societe_id > 0) +if ($user->societe_id > 0) { accessforbidden(); +} +$entity = GETPOST('entity', 'int')?GETPOST('entity', 'int'):$conf->entity; /* * Actions */ -$entity = GETPOST('entity','int')?GETPOST('entity','int'):$conf->entity; //$parameters = array('socid' => $id); //$reshook = $hookmanager->executeHooks('doActions', $parameters, $object); // Note that $object may have been modified by some hooks From 20e00ca2905f05474fb441d637c7eafb4029cdb2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 19:41:16 +0200 Subject: [PATCH 0872/1036] FIX if last char of customercode is accent making the truncate of first chars wrong. --- htdocs/core/lib/functions2.lib.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 649988e785b..5d0f25892c8 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -716,8 +716,8 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m global $conf,$user; if (! is_object($objsoc)) $valueforccc=$objsoc; - else if ($table == "commande_fournisseur" || $table == "facture_fourn" ) $valueforccc=$objsoc->code_fournisseur; - else $valueforccc=$objsoc->code_client; + else if ($table == "commande_fournisseur" || $table == "facture_fourn" ) $valueforccc=dol_string_unaccent($objsoc->code_fournisseur); + else $valueforccc=dol_string_unaccent($objsoc->code_client); $sharetable = $table; if ($table == 'facture' || $table == 'invoice') $sharetable = 'invoicenumber'; // for getEntity function @@ -965,6 +965,7 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m // Define $maskLike $maskLike = dol_string_nospecial($mask); $maskLike = str_replace("%","_",$maskLike); + // Replace protected special codes with matching number of _ as wild card caracter $maskLike = preg_replace('/\{yyyy\}/i','____',$maskLike); $maskLike = preg_replace('/\{yy\}/i','__',$maskLike); @@ -1140,7 +1141,7 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m // Now we replace the refclient if ($maskrefclient) { - //print "maskrefclient=".$maskrefclient." maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n
"; + //print "maskrefclient=".$maskrefclient." maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode." maskrefclient_clientcode=".$maskrefclient_clientcode."\n
";exit; $maskrefclient_maskbefore='{'.$maskrefclient.'}'; $maskrefclient_maskafter=$maskrefclient_clientcode.str_pad($maskrefclient_counter,dol_strlen($maskrefclient_maskcounter),"0",STR_PAD_LEFT); $numFinal = str_replace($maskrefclient_maskbefore,$maskrefclient_maskafter,$numFinal); From 525598f6aa925b0aeb8f7c02ebdd0edaeb065bde Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 20:01:28 +0200 Subject: [PATCH 0873/1036] Fix scrutinizer warnings --- htdocs/adherents/class/adherent.class.php | 8 ++++---- htdocs/contact/class/contact.class.php | 2 +- htdocs/user/class/user.class.php | 1 - htdocs/user/class/usergroup.class.php | 3 +-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 3119e044be0..1856de6182f 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -183,14 +183,14 @@ class Adherent extends CommonObject * @var integer */ public $datec; - + /** * Date modification record (tms) * * @var integer */ public $datem; - + public $datevalid; public $gender; @@ -1268,7 +1268,7 @@ class Adherent extends CommonObject $this->ref = $obj->rowid; $this->id = $obj->rowid; $this->ref_ext = $obj->ref_ext; - + $this->civility_id = $obj->civility_code; // Bad. Kept for backard compatibility $this->civility_code = $obj->civility_code; $this->civility = $obj->civility_code?($langs->trans("Civility".$obj->civility_code) != ("Civility".$obj->civility_code) ? $langs->trans("Civility".$obj->civility_code) : $obj->civility_code):''; @@ -2465,7 +2465,7 @@ class Adherent extends CommonObject * * @return array Tableau info des attributs */ - private function _load_ldap_info() + public function _load_ldap_info() { // phpcs:enable global $conf,$langs; diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index dfefb8060fe..5c4df6ab3f9 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -525,7 +525,7 @@ class Contact extends CommonObject * * @return array Tableau info des attributs */ - private function _load_ldap_info() + public function _load_ldap_info() { // phpcs:enable global $conf, $langs; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 34651304b95..c5ac20e8cc7 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2300,7 +2300,6 @@ class User extends CommonObject if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && $withpictoimg) $withpictoimg=0; $result=''; $label=''; - $link=''; $linkstart=''; $linkend=''; if (! empty($this->photo)) { diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index c3fe000292c..9fb6e600a3b 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -867,7 +867,6 @@ class UserGroup extends CommonObject if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && $withpicto) $withpicto=0; $result=''; $label=''; - $link=''; $linkstart=''; $linkend=''; $label.= '
'; $label.= '' . $langs->trans("Group") . '
'; @@ -957,7 +956,7 @@ class UserGroup extends CommonObject public function _load_ldap_info() { // phpcs:enable - global $conf,$langs; + global $conf; $info=array(); From 663998bab11a371b4162c89c2f5893a8075b352d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 20:15:04 +0200 Subject: [PATCH 0874/1036] Fix scrutinizer errors --- htdocs/includes/odtphp/odf.php | 2 +- htdocs/opensurvey/results.php | 4 ++-- htdocs/product/price.php | 2 +- htdocs/user/class/user.class.php | 12 ++++++------ htdocs/user/class/usergroup.class.php | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/htdocs/includes/odtphp/odf.php b/htdocs/includes/odtphp/odf.php index 6b3a6400bc3..21e9b56b4bb 100644 --- a/htdocs/includes/odtphp/odf.php +++ b/htdocs/includes/odtphp/odf.php @@ -745,7 +745,7 @@ IMG; private function _rrmdir($dir) { if ($handle = opendir($dir)) { - while (false !== ($file = readdir($handle))) { + while (($file = readdir($handle)) !== false) { if ($file != '.' && $file != '..') { if (is_dir($dir . '/' . $file)) { $this->_rrmdir($dir . '/' . $file); diff --git a/htdocs/opensurvey/results.php b/htdocs/opensurvey/results.php index c648b15664e..1b3034bb82c 100644 --- a/htdocs/opensurvey/results.php +++ b/htdocs/opensurvey/results.php @@ -249,8 +249,8 @@ if (isset($_POST["ajoutercolonne"]) && $object->format == "D") $dateinsertion = substr("$dateinsertion", 1); - //mise a jour avec les nouveaux sujets dans la base - if (isset($erreur_ajout_date) && !$erreur_ajout_date) + // update with new topics into database + if (isset($erreur_ajout_date) && empty($erreur_ajout_date)) { $sql = 'UPDATE '.MAIN_DB_PREFIX."opensurvey_sondage"; $sql.= " SET sujet = '".$db->escape($dateinsertion)."'"; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 5b5b9ad48fa..26970f1dd13 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -153,7 +153,7 @@ if (empty($reshook)) $db->begin(); $resql = $object->update($object->id, $user); - if (! $resql || $resql < 0) + if ($resql <= 0) { $error++; setEventMessages($object->error, $object->errors, 'errors'); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index c5ac20e8cc7..a151fdb5574 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -774,7 +774,7 @@ class User extends CommonObject dol_syslog(get_class($this)."::clearrights reset user->rights"); $this->rights=''; $this->nb_rights=0; - $this->all_permissions_are_loaded=false; + $this->all_permissions_are_loaded=0; $this->_tab_loaded=array(); } @@ -799,16 +799,16 @@ class User extends CommonObject return; } - if ($this->all_permissions_are_loaded) + if (! empty($this->all_permissions_are_loaded)) { // We already loaded all rights for this user, so we leave return; } } - // Recuperation des droits utilisateurs + recuperation des droits groupes + // Get permission of users + Get permissions of groups - // D'abord les droits utilisateurs + // First user permissions $sql = "SELECT DISTINCT r.module, r.perms, r.subperms"; $sql.= " FROM ".MAIN_DB_PREFIX."user_rights as ur"; $sql.= ", ".MAIN_DB_PREFIX."rights_def as r"; @@ -862,7 +862,7 @@ class User extends CommonObject $this->db->free($resql); } - // Maintenant les droits groupes + // Now permissions of groups $sql = "SELECT DISTINCT r.module, r.perms, r.subperms"; $sql.= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr,"; $sql.= " ".MAIN_DB_PREFIX."usergroup_user as gu,"; @@ -933,7 +933,7 @@ class User extends CommonObject } else { - // Si module defini, on le marque comme charge en cache + // If module defined, we flag it as loaded into cache $this->_tab_loaded[$moduletag]=1; } } diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 9fb6e600a3b..d51d82c8d13 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -552,13 +552,13 @@ class UserGroup extends CommonObject if ($moduletag && isset($this->_tab_loaded[$moduletag]) && $this->_tab_loaded[$moduletag]) { - // Le fichier de ce module est deja charge + // Rights for this module are already loaded, so we leave return; } if (! empty($this->all_permissions_are_loaded)) { - // Si les permissions ont deja ete chargees, on quitte + // We already loaded all rights for this group, so we leave return; } @@ -618,7 +618,7 @@ class UserGroup extends CommonObject } else { - // Si module defini, on le marque comme charge en cache + // If module defined, we flag it as loaded into cache $this->_tab_loaded[$moduletag]=1; } From 53923a8581e5a710a46f289b0df61769df1b4f56 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 18 Jun 2019 20:21:22 +0200 Subject: [PATCH 0875/1036] Fix scrutinizer warnings --- htdocs/core/db/sqlite3.class.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/htdocs/core/db/sqlite3.class.php b/htdocs/core/db/sqlite3.class.php index b7d06870ff5..360b72f80d9 100644 --- a/htdocs/core/db/sqlite3.class.php +++ b/htdocs/core/db/sqlite3.class.php @@ -403,9 +403,13 @@ class DoliDBSqlite3 extends DoliDB */ public function query($query, $usesavepoint = 0, $type = 'auto') { + global $conf; + $ret=null; + $query = trim($query); - $this->error = 0; + + $this->error = ''; // Convert MySQL syntax to SQLite syntax if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+CONSTRAINT\s+(.*)\s*FOREIGN\s+KEY\s*\(([\w,\s]+)\)\s*REFERENCES\s+(\w+)\s*\(([\w,\s]+)\)/i', $query, $reg)) { @@ -449,7 +453,8 @@ class DoliDBSqlite3 extends DoliDB } //print "After convertSQLFromMysql:\n".$query."
\n"; - dol_syslog('sql='.$query, LOG_DEBUG); + if (! in_array($query, array('BEGIN','COMMIT','ROLLBACK'))) dol_syslog('sql='.$query, LOG_DEBUG); + if (empty($query)) return false; // Return false = error if empty request // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) try { @@ -481,7 +486,8 @@ class DoliDBSqlite3 extends DoliDB $errormsg .= ' ('.$this->lasterrno.')'; } - dol_syslog($errormsg, LOG_ERR); + if ($conf->global->SYSLOG_LEVEL < LOG_DEBUG) dol_syslog(get_class($this)."::query SQL Error query: ".$query, LOG_ERR); // Log of request was not yet done previously + dol_syslog(get_class($this)."::query SQL Error message: ".$errormsg, LOG_ERR); } $this->lastquery=$query; $this->_results = $ret; From bcd5949bacffd3fdd722bc268e70d3556d5419e4 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 21:39:30 +0200 Subject: [PATCH 0876/1036] Responsive on project index --- htdocs/projet/index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index fa77cb4b52c..38ef7ee7cf2 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -179,6 +179,7 @@ $sql.= $db->plimit($max, 0); $resql=$db->query($sql); if ($resql) { + print '
'; print '
'.$langs->trans("Type").''.$langs->trans("Ref").''.$langs->trans("Link").''.$langs->trans("Document").''.$langs->trans("Paid").''.$langs->trans("Debit").''.$langs->trans("Credit").''.$langs->trans("Balance").''.$langs->trans("TotalHT").''.$langs->trans("TotalTTC").''.$langs->trans("TotalVAT").''.$langs->trans("ThirdParty").''.$langs->trans("Code").''.$langs->trans("Country").''.$langs->trans("VATIntra").'
"; + + // Type + print ''.$langs->trans($data['item']).''; print dol_print_date($data['date'], 'day'); print "'.$langs->trans($data['item']).''.$data['ref'].'".$data['name']."'; + if ($data['link']) + { + print ''.($data['name'] ? $data['name'] : $data['ref']).''; + } + print "'.$data['paid'].''.(($data['amount'] > 0) ? price(abs($data['amount'])) : '')."'.(($data['amount'] > 0) ? '' : price(abs($data['amount'])))."'.price($data['amount_ht'])."'.price($data['amount_ttc'])."'.price($data['amount_vat'])."'.$data['thirdparty_name']."'.$data['thirdparty_code']."'.$data['country_code']."'.$data['vatnum']."'.(($data['amount_ttc'] > 0) ? price(abs($data['amount_ttc'])) : '')."'.(($data['amount_ttc'] > 0) ? '' : price(abs($data['amount_ttc'])))."'.price($data['balance'])."'.price($data['balance'])."
 '.price($totalDebit).''.price($totalCredit).''.price(price2num($totalDebit - $totalCredit, 'MT')).''.price($totalET).''.price($totalIT).''.price($totalVAT).''.price($totalDebit).''.price($totalCredit).''.price(price2num($totalDebit - $totalCredit, 'MT')).'
'; print ''; print ''; @@ -242,7 +243,7 @@ if ($resql) $i++; } } - print "
'.$langs->trans("LatestModifiedProjects", $max).'

"; + print "

"; } else dol_print_error($db); From 30fb89ad5e55b520588327de1bea36f93c6a8d03 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 22:03:29 +0200 Subject: [PATCH 0877/1036] Responsive HRM index --- htdocs/hrm/index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/hrm/index.php b/htdocs/hrm/index.php index 066a21ebad0..54a0837e1fe 100644 --- a/htdocs/hrm/index.php +++ b/htdocs/hrm/index.php @@ -134,6 +134,7 @@ if (! empty($conf->holiday->enabled)) { $user_id = $user->id; + print '
'; print ''; print ''; print ""; @@ -152,7 +153,7 @@ if (! empty($conf->holiday->enabled)) print ''; print ''; - print '
'.$langs->trans("Holidays").'

'; + print '

'; } elseif (! is_numeric($conf->global->HOLIDAY_HIDE_BALANCE)) { From c59de4989455dfc1e438908c4c6d2bc49950e261 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 22:38:52 +0200 Subject: [PATCH 0878/1036] Translate rights --- htdocs/core/class/html.formaccounting.class.php | 2 +- htdocs/core/lib/accounting.lib.php | 2 +- htdocs/langs/en_US/admin.lang | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 87b32902684..7d9e778ac41 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -21,7 +21,7 @@ /** * \file htdocs/core/class/html.formaccounting.class.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief File of class with all html predefined components */ require_once DOL_DOCUMENT_ROOT .'/core/class/html.form.class.php'; diff --git a/htdocs/core/lib/accounting.lib.php b/htdocs/core/lib/accounting.lib.php index 889d9da8a2c..e55083c4822 100644 --- a/htdocs/core/lib/accounting.lib.php +++ b/htdocs/core/lib/accounting.lib.php @@ -19,7 +19,7 @@ /** * \file htdocs/core/lib/accounting.lib.php - * \ingroup Advanced accountancy + * \ingroup Accountancy (Double entries) * \brief Library of accountancy functions */ diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5fc1994247c..5f69be03dba 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -885,6 +885,12 @@ Permission2802=Use FTP client in write mode (delete or upload files) Permission50101=Use Point of Sale Permission50201=Read transactions Permission50202=Import transactions +Permission50401=Bind products and invoices with accounting accounts +Permission50411=Read operations in ledger +Permission50412=Write/Edit operations in ledger +Permission50420=Report and export reports (turnover, balance, journals, ledger) +Permission50430=Define and close a fiscal year +Permission50440=Manage chart of accounts, setup of accountancy Permission54001=Print Permission55001=Read polls Permission55002=Create/modify polls From ce375440884d31c60a60e80e422870a966c8b47d Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 22:41:18 +0200 Subject: [PATCH 0879/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5f69be03dba..f26088f747c 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -804,6 +804,7 @@ Permission401=Read discounts Permission402=Create/modify discounts Permission403=Validate discounts Permission404=Delete discounts +Permission430=Use Debug Bar Permission511=Read payments of salaries Permission512=Create/modify payments of salaries Permission514=Delete payments of salaries From 4de0a57f5cc435afb5c1192e55bac6cf5753dff1 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 22:44:43 +0200 Subject: [PATCH 0880/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index f26088f747c..56a8381021e 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -883,6 +883,10 @@ Permission2503=Submit or delete documents Permission2515=Setup documents directories Permission2801=Use FTP client in read mode (browse and download only) Permission2802=Use FTP client in write mode (delete or upload files) +Permission10001=Read website content +Permission10002=Create/modify website content (html and javascript content) +Permission10003=Create/modify website content (dynamic php code). Dangerous, must be reserved to restricted developers. +Permission10005=Delete website content Permission50101=Use Point of Sale Permission50201=Read transactions Permission50202=Import transactions From a0ae1e96a374e4e243b73f6b4f53757b49da3d5f Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 22:52:37 +0200 Subject: [PATCH 0881/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 56a8381021e..cfc244b0fe0 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -838,6 +838,12 @@ Permission1101=Read delivery orders Permission1102=Create/modify delivery orders Permission1104=Validate delivery orders Permission1109=Delete delivery orders +Permission1121=Read supplier proposals +Permission1122=Create/modify supplier proposals +Permission1123=Validate supplier proposals +Permission1124=Send supplier proposals +Permission1125=Delete supplier proposals +Permission1126=Close supplier price requests Permission1181=Read suppliers Permission1182=Read purchase orders Permission1183=Create/modify purchase orders From 42b03ec85893b0083161abcafa33b7082e118209 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Jun 2019 22:53:50 +0200 Subject: [PATCH 0882/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index cfc244b0fe0..60a80bb15bc 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -902,6 +902,10 @@ Permission50412=Write/Edit operations in ledger Permission50420=Report and export reports (turnover, balance, journals, ledger) Permission50430=Define and close a fiscal year Permission50440=Manage chart of accounts, setup of accountancy +Permission51001=Read assets +Permission51002=Create/Update assets +Permission51003=Delete assets +Permission51005=Setup types of asset Permission54001=Print Permission55001=Read polls Permission55002=Create/modify polls From e1c476e744da16429c72e99b80263e844b0818dc Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 05:48:04 +0200 Subject: [PATCH 0883/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 60a80bb15bc..0c4d7de3962 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -819,6 +819,9 @@ Permission532=Create/modify services Permission534=Delete services Permission536=See/manage hidden services Permission538=Export services +Permission650=Read bom of Bom +Permission651=Create/Update bom of Bom +Permission652=Delete bom of Bom Permission701=Read donations Permission702=Create/modify donations Permission703=Delete donations From 9234a5446872983f6cfa4bf01f46234c1b17a445 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 05:49:23 +0200 Subject: [PATCH 0884/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 0c4d7de3962..820fac9e2d4 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -892,6 +892,7 @@ Permission2503=Submit or delete documents Permission2515=Setup documents directories Permission2801=Use FTP client in read mode (browse and download only) Permission2802=Use FTP client in write mode (delete or upload files) +Permission3200=Read archived events and fingerprints Permission10001=Read website content Permission10002=Create/modify website content (html and javascript content) Permission10003=Create/modify website content (dynamic php code). Dangerous, must be reserved to restricted developers. From f91c40a45c2907c9cd927330b9e58b8f4f8466c3 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 06:00:11 +0200 Subject: [PATCH 0885/1036] Translate rights --- htdocs/langs/en_US/admin.lang | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 820fac9e2d4..c135fe86206 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -869,16 +869,6 @@ Permission1251=Run mass imports of external data into database (data load) Permission1321=Export customer invoices, attributes and payments Permission1322=Reopen a paid bill Permission1421=Export sales orders and attributes -Permission20001=Read leave requests (your leave and those of your subordinates) -Permission20002=Create/modify your leave requests (your leave and those of your subordinates) -Permission20003=Delete leave requests -Permission20004=Read all leave requests (even of user not subordinates) -Permission20005=Create/modify leave requests for everybody (even of user not subordinates) -Permission20006=Admin leave requests (setup and update balance) -Permission23001=Read Scheduled job -Permission23002=Create/update Scheduled job -Permission23003=Delete Scheduled job -Permission23004=Execute Scheduled job Permission2401=Read actions (events or tasks) linked to his account Permission2402=Create/modify actions (events or tasks) linked to his account Permission2403=Delete actions (events or tasks) linked to his account @@ -893,10 +883,24 @@ Permission2515=Setup documents directories Permission2801=Use FTP client in read mode (browse and download only) Permission2802=Use FTP client in write mode (delete or upload files) Permission3200=Read archived events and fingerprints +Permission4001=See employees +Permission4002=Create employees +Permission4003=Delete employees +Permission4004=Export employees Permission10001=Read website content Permission10002=Create/modify website content (html and javascript content) Permission10003=Create/modify website content (dynamic php code). Dangerous, must be reserved to restricted developers. Permission10005=Delete website content +Permission20001=Read leave requests (your leave and those of your subordinates) +Permission20002=Create/modify your leave requests (your leave and those of your subordinates) +Permission20003=Delete leave requests +Permission20004=Read all leave requests (even of user not subordinates) +Permission20005=Create/modify leave requests for everybody (even of user not subordinates) +Permission20006=Admin leave requests (setup and update balance) +Permission23001=Read Scheduled job +Permission23002=Create/update Scheduled job +Permission23003=Delete Scheduled job +Permission23004=Execute Scheduled job Permission50101=Use Point of Sale Permission50201=Read transactions Permission50202=Import transactions From 13836d3e219514d5aaf84c1287fd9835c65d0634 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 06:21:53 +0200 Subject: [PATCH 0886/1036] Missing language ley --- htdocs/core/modules/modSalaries.class.php | 2 +- htdocs/langs/en_US/salaries.lang | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/modules/modSalaries.class.php b/htdocs/core/modules/modSalaries.class.php index e111e81ef6b..ed3aec4a48b 100644 --- a/htdocs/core/modules/modSalaries.class.php +++ b/htdocs/core/modules/modSalaries.class.php @@ -144,7 +144,7 @@ class modSalaries extends DolibarrModules $r++; $this->export_code[$r]=$this->rights_class.'_'.$r; - $this->export_label[$r]='Salaries and payments'; + $this->export_label[$r]='SalariesAndPayments'; $this->export_permission[$r]=array(array("salaries","export")); $this->export_fields_array[$r]=array('u.firstname'=>"Firstname",'u.lastname'=>"Lastname",'u.login'=>"Login",'u.salary'=>'CurrentSalary','p.datep'=>'DatePayment','p.datesp'=>'DateStartPeriod','p.dateep'=>'DateEndPeriod','p.amount'=>'AmountPayment','p.num_payment'=>'Numero','p.label'=>'Label','p.note'=>'Note'); $this->export_TypeFields_array[$r]=array('u.firstname'=>"Text",'u.lastname'=>"Text",'u.login'=>'Text','u.salary'=>"Numeric",'p.datep'=>'Date','p.datesp'=>'Date','p.dateep'=>'Date','p.amount'=>'Numeric','p.num_payment'=>'Numeric','p.label'=>'Text'); diff --git a/htdocs/langs/en_US/salaries.lang b/htdocs/langs/en_US/salaries.lang index 1e3607ce7cc..7c3c08a65bd 100644 --- a/htdocs/langs/en_US/salaries.lang +++ b/htdocs/langs/en_US/salaries.lang @@ -17,3 +17,5 @@ TJMDescription=This value is currently for information only and is not used for LastSalaries=Latest %s salary payments AllSalaries=All salary payments SalariesStatistics=Salary statistics +# Export +SalariesAndPayments=Salaries and payments From ffbb14f40ef59410e0a01efcf7f51af2fbfbe1c6 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 06:28:22 +0200 Subject: [PATCH 0887/1036] Missing language key --- htdocs/langs/en_US/website.lang | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/website.lang b/htdocs/langs/en_US/website.lang index 43f82e9f1fb..2683c9a90eb 100644 --- a/htdocs/langs/en_US/website.lang +++ b/htdocs/langs/en_US/website.lang @@ -100,4 +100,6 @@ DynamicPHPCodeContainsAForbiddenInstruction=You add dynamic PHP code that contai NotAllowedToAddDynamicContent=You don't have permission to add or edit PHP dynamic content in websites. Ask permission or just keep code into php tags unmodified. ReplaceWebsiteContent=Replace website content DeleteAlsoJs=Delete also all javascript files specific to this website? -DeleteAlsoMedias=Delete also all medias files specific to this website? \ No newline at end of file +DeleteAlsoMedias=Delete also all medias files specific to this website? +# Export +MyWebsitePages=My website pages \ No newline at end of file From a849fbe42e812929ac43c6e90b40c506d03ac8bc Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 07:15:52 +0200 Subject: [PATCH 0888/1036] Nowrap on amount --- htdocs/compta/bank/treso.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/bank/treso.php b/htdocs/compta/bank/treso.php index 5a4374f47dd..1318dbd4e2d 100644 --- a/htdocs/compta/bank/treso.php +++ b/htdocs/compta/bank/treso.php @@ -293,9 +293,9 @@ if ($_REQUEST["account"] || $_REQUEST["ref"]) }else print ""; } print "".$refcomp.""; - if ($obj->total_ttc < 0) { print "".price(abs($total_ttc))." "; }; - if ($obj->total_ttc >= 0) { print " ".price($total_ttc).""; }; - print ''.price($solde).''; + if ($obj->total_ttc < 0) { print "".price(abs($total_ttc))." "; }; + if ($obj->total_ttc >= 0) { print " ".price($total_ttc).""; }; + print ''.price($solde).''; print ""; } From 9a32117b1d172f6a5e31cf086639be9e5c2cd286 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 08:43:57 +0200 Subject: [PATCH 0889/1036] Nowrap on amount --- htdocs/compta/resultat/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/resultat/index.php b/htdocs/compta/resultat/index.php index addc56a240b..70129e80403 100644 --- a/htdocs/compta/resultat/index.php +++ b/htdocs/compta/resultat/index.php @@ -943,7 +943,7 @@ for ($mois = 1+$nb_mois_decalage ; $mois <= 12+$nb_mois_decalage ; $mois++) } print ""; - print ' '; + print ' '; if ($modecompta == 'BOOKKEEPING') { if (isset($encaiss[$case])) @@ -978,8 +978,8 @@ print ''; for ($annee = $year_start ; $annee <= $year_end ; $annee++) { $nbcols+=2; - print ''.(isset($totsorties[$annee])?price(price2num($totsorties[$annee], 'MT')):' ').''; - print ''.(isset($totentrees[$annee])?price(price2num($totentrees[$annee], 'MT')):' ').''; + print ''.(isset($totsorties[$annee])?price(price2num($totsorties[$annee], 'MT')):' ').''; + print ''.(isset($totentrees[$annee])?price(price2num($totentrees[$annee], 'MT')):' ').''; } print "\n"; From b8311da26212e95c0a727e542dc2a7e60c8cbc5b Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 08:56:45 +0200 Subject: [PATCH 0890/1036] Nowrap on amount --- htdocs/accountancy/customer/index.php | 20 ++++++++++---------- htdocs/accountancy/customer/lines.php | 2 +- htdocs/accountancy/customer/list.php | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index 0131f51d515..f063f832f54 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -211,10 +211,10 @@ if ($resql) { else print $row[1]; print ''; for($i = 2; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; - print '' . price($row[14]) . ''; + print '' . price($row[13]) . ''; + print '' . price($row[14]) . ''; print ''; } $db->free($resql); @@ -289,10 +289,10 @@ if ($resql) { print ''; for($i = 2; $i <= 12; $i++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; - print '' . price($row[14]) . ''; + print '' . price($row[13]) . ''; + print '' . price($row[14]) . ''; print ''; } $db->free($resql); @@ -348,9 +348,9 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. while ($row = $db->fetch_row($resql)) { print '' . $row[0] . ''; for($i = 1; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; + print '' . price($row[13]) . ''; print ''; } $db->free($resql); @@ -401,9 +401,9 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. print '' . $row[0] . ''; for($i = 1; $i <= 12; $i ++) { - print '' . price(price2num($row[$i])) . ''; + print '' . price(price2num($row[$i])) . ''; } - print '' . price(price2num($row[13])) . ''; + print '' . price(price2num($row[13])) . ''; print ''; } $db->free($resql); diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 19e85cdb651..ea174638a2a 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -385,7 +385,7 @@ if ($result) { print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description); print ''; - print '' . price($objp->total_ht) . ''; + print '' . price($objp->total_ht) . ''; print '' . vatrate($objp->tva_tx.($objp->vat_src_code?' ('.$objp->vat_src_code.')':'')) . ''; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index ed1c40a6ad7..5314099db1f 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -503,7 +503,7 @@ if ($result) { print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description); print ''; - print ''; + print ''; print price($objp->total_ht); print ''; From ec7523d3d2906975fab9e1cf662ff3eae3c074ee Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 09:01:37 +0200 Subject: [PATCH 0891/1036] Nowrap on amount --- htdocs/accountancy/expensereport/index.php | 16 ++++++++-------- htdocs/accountancy/supplier/index.php | 16 ++++++++-------- htdocs/accountancy/supplier/lines.php | 2 +- htdocs/accountancy/supplier/list.php | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index a5026f920a0..4fe2ee3120b 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -203,10 +203,10 @@ if ($resql) { else print $row[1]; print ''; for($i = 2; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; - print '' . price($row[14]) . ''; + print '' . price($row[13]) . ''; + print '' . price($row[14]) . ''; print ''; } $db->free($resql); @@ -276,10 +276,10 @@ if ($resql) { else print $row[1]; print ''; for($i = 2; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; - print '' . price($row[14]) . ''; + print '' . price($row[13]) . ''; + print '' . price($row[14]) . ''; print ''; } $db->free($resql); @@ -331,9 +331,9 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. while ($row = $db->fetch_row($resql)) { print '' . $row[0] . ''; for($i = 1; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; + print '' . price($row[13]) . ''; print ''; } diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index ca60735fcf0..bc632118da7 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -203,10 +203,10 @@ if ($resql) { else print $row[1]; print ''; for($i = 2; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; - print '' . price($row[14]) . ''; + print '' . price($row[13]) . ''; + print '' . price($row[14]) . ''; print ''; } $db->free($resql); @@ -274,10 +274,10 @@ if ($resql) { else print $row[1]; print ''; for($i = 2; $i <= 12; $i++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; - print '' . price($row[14]) . ''; + print '' . price($row[13]) . ''; + print '' . price($row[14]) . ''; print ''; } $db->free($resql); @@ -329,9 +329,9 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) // This part of code looks strange. while ($row = $db->fetch_row($resql)) { print '' . $row[0] . ''; for($i = 1; $i <= 12; $i ++) { - print '' . price($row[$i]) . ''; + print '' . price($row[$i]) . ''; } - print '' . price($row[13]) . ''; + print '' . price($row[13]) . ''; print ''; } $db->free($resql); diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 352a73200fb..a67386f6fbd 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -396,7 +396,7 @@ if ($result) { print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description); print ''; - print '' . price($objp->total_ht) . ''; + print '' . price($objp->total_ht) . ''; print '' . vatrate($objp->tva_tx.($objp->vat_src_code?' ('.$objp->vat_src_code.')':'')) . ''; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index fc8cc10fec4..17284513650 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -491,7 +491,7 @@ if ($result) { print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->description); print ''; - print ''; + print ''; print price($objp->total_ht); print ''; From e44b9113b7410a71ca423c1830f05c4ca3208d98 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 09:01:57 +0200 Subject: [PATCH 0892/1036] Nowrap on amount --- htdocs/accountancy/expensereport/lines.php | 2 +- htdocs/accountancy/expensereport/list.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index 508dfb7136e..d15ef52ad39 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -319,7 +319,7 @@ if ($result) { print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->comments); print ''; - print '' . price($objp->total_ht) . ''; + print '' . price($objp->total_ht) . ''; print '' . vatrate($objp->tva_tx.($objp->vat_src_code?' ('.$objp->vat_src_code.')':'')) . ''; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 9f70d175d40..60b24638775 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -376,7 +376,7 @@ if ($result) { print $form->textwithtooltip(dol_trunc($text, $trunclength), $objp->comments); print ''; - print ''; + print ''; print price($objp->price); print ''; From b6bd4119d9a9f02b00d12b551b43fc600b893452 Mon Sep 17 00:00:00 2001 From: Nicolas ZABOURI Date: Wed, 19 Jun 2019 09:12:01 +0200 Subject: [PATCH 0893/1036] FIX travis Public underscore in load_ldap_info --- htdocs/adherents/class/adherent.class.php | 4 +++- htdocs/contact/class/contact.class.php | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 1856de6182f..cda3a461027 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -11,6 +11,7 @@ * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Juanjo Menent * Copyright (C) 2018-2019 Thibault FOUCART + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -2460,7 +2461,8 @@ class Adherent extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore + /** * Initialise tableau info (tableau des attributs LDAP) * * @return array Tableau info des attributs diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 5c4df6ab3f9..ca58882b224 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -9,6 +9,7 @@ * Copyright (C) 2013 Alexandre Spangaro * Copyright (C) 2013 Juanjo Menent * Copyright (C) 2015 Marcos García + * Copyright (C) 2019 Nicolas ZABOURI * * 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 @@ -520,6 +521,7 @@ class Contact extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Initialise tableau info (tableau des attributs LDAP) * From 9bde7c5229fc3584af4853e4f9707dd7751b238f Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 09:21:18 +0200 Subject: [PATCH 0894/1036] Nowrap on amount --- htdocs/core/boxes/box_activity.php | 2 +- htdocs/core/boxes/box_commandes.php | 2 +- htdocs/core/boxes/box_factures_fourn_imp.php | 2 +- htdocs/core/boxes/box_factures_imp.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/boxes/box_activity.php b/htdocs/core/boxes/box_activity.php index 300040639a8..995ba93fb64 100644 --- a/htdocs/core/boxes/box_activity.php +++ b/htdocs/core/boxes/box_activity.php @@ -422,7 +422,7 @@ class box_activity extends ModeleBoxes ); $totalnb += $data[$j]->nb; $this->info_box_contents[$line][3] = array( - 'td' => 'class="right"', + 'td' => 'class="nowrap right"', 'text' => price($data[$j]->Mnttot, 1, $langs, 0, 0, -1, $conf->currency), ); $this->info_box_contents[$line][4] = array( diff --git a/htdocs/core/boxes/box_commandes.php b/htdocs/core/boxes/box_commandes.php index 8575e739946..956e73b4acf 100644 --- a/htdocs/core/boxes/box_commandes.php +++ b/htdocs/core/boxes/box_commandes.php @@ -146,7 +146,7 @@ class box_commandes extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="right"', + 'td' => 'class="nowrap right"', 'text' => price($objp->total_ht, 0, $langs, 0, -1, -1, $conf->currency), ); diff --git a/htdocs/core/boxes/box_factures_fourn_imp.php b/htdocs/core/boxes/box_factures_fourn_imp.php index 09de3b874e3..74f8cbc6b64 100644 --- a/htdocs/core/boxes/box_factures_fourn_imp.php +++ b/htdocs/core/boxes/box_factures_fourn_imp.php @@ -151,7 +151,7 @@ class box_factures_fourn_imp extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="right"', + 'td' => 'class="nowrap right"', 'text' => price($objp->total_ht, 0, $langs, 0, -1, -1, $conf->currency), ); diff --git a/htdocs/core/boxes/box_factures_imp.php b/htdocs/core/boxes/box_factures_imp.php index fd85f136f96..a0692c791b2 100644 --- a/htdocs/core/boxes/box_factures_imp.php +++ b/htdocs/core/boxes/box_factures_imp.php @@ -161,7 +161,7 @@ class box_factures_imp extends ModeleBoxes ); $this->info_box_contents[$line][] = array( - 'td' => 'class="right"', + 'td' => 'class="nowrap right"', 'text' => price($objp->total_ht, 0, $langs, 0, -1, -1, $conf->currency), ); From 7331e43db8e12ac4ee3ae0f2602c39053a1eb696 Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 19 Jun 2019 10:19:33 +0200 Subject: [PATCH 0895/1036] FIX : we need to fetch fourn invoice with ref in current entity --- htdocs/fourn/class/fournisseur.facture.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 3a27690e7ac..d7ded8546f1 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -504,7 +504,7 @@ class FactureFournisseur extends CommonInvoice */ public function fetch($id='',$ref='') { - global $langs; + global $langs, $conf; $sql = "SELECT"; $sql.= " t.rowid,"; @@ -555,7 +555,7 @@ class FactureFournisseur extends CommonInvoice $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as p ON t.fk_mode_reglement = p.id"; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON t.fk_incoterms = i.rowid'; if ($id) $sql.= " WHERE t.rowid=".$id; - if ($ref) $sql.= " WHERE t.ref='".$this->db->escape($ref)."'"; + if ($ref) $sql.= " WHERE t.ref='".$this->db->escape($ref)."' AND t.entity = ".$conf->entity; dol_syslog(get_class($this)."::fetch", LOG_DEBUG); $resql=$this->db->query($sql); From 3ad13adf31d6925760587c685f79bd6e694e90fd Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 19 Jun 2019 10:43:42 +0200 Subject: [PATCH 0896/1036] FIX : better syntax --- htdocs/fourn/class/fournisseur.facture.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index d7ded8546f1..4f9cd93021f 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -504,7 +504,7 @@ class FactureFournisseur extends CommonInvoice */ public function fetch($id='',$ref='') { - global $langs, $conf; + global $langs; $sql = "SELECT"; $sql.= " t.rowid,"; @@ -555,7 +555,7 @@ class FactureFournisseur extends CommonInvoice $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as p ON t.fk_mode_reglement = p.id"; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON t.fk_incoterms = i.rowid'; if ($id) $sql.= " WHERE t.rowid=".$id; - if ($ref) $sql.= " WHERE t.ref='".$this->db->escape($ref)."' AND t.entity = ".$conf->entity; + if ($ref) $sql.= " WHERE t.ref='".$this->db->escape($ref)."' AND t.entity IN (".getEntity('supplier_invoice').")"; dol_syslog(get_class($this)."::fetch", LOG_DEBUG); $resql=$this->db->query($sql); From 7afcdb46eb9fe7e989b1cf884f157c5e6615f930 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 12:10:05 +0200 Subject: [PATCH 0897/1036] Debug module ticket --- htdocs/admin/ticket.php | 2 +- htdocs/public/ticket/index.php | 34 +++++++++++++++++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/htdocs/admin/ticket.php b/htdocs/admin/ticket.php index 331d7e992ba..8cb1e85afe4 100644 --- a/htdocs/admin/ticket.php +++ b/htdocs/admin/ticket.php @@ -190,7 +190,7 @@ $head = ticketAdminPrepareHead(); dol_fiche_head($head, 'settings', $langs->trans("Module56000Name"), -1, "ticket"); -print ''.$langs->trans("TicketSetupDictionaries") . ' : ' . dol_buildpath('/admin/dict.php', 2) . '
'; +print ''.$langs->trans("TicketSetupDictionaries") . ' : '.$langs->trans("ClickHereToGoTo", $langs->transnoentitiesnoconv("DictionarySetup")).'
'; dol_fiche_end(); diff --git a/htdocs/public/ticket/index.php b/htdocs/public/ticket/index.php index 05b992b3e40..a3e4d63a4bc 100644 --- a/htdocs/public/ticket/index.php +++ b/htdocs/public/ticket/index.php @@ -1,5 +1,6 @@ +/* Copyright (C) - 2013-2016 Jean-François FERRY + * Copyright (C) - 2019 Laurent Destailleur * * 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 @@ -18,7 +19,7 @@ /** * \file htdocs/public/ticket/index.php * \ingroup ticket - * \brief Public file to add and manage ticket + * \brief Public page to add and manage ticket */ if (!defined('NOCSRFCHECK')) define('NOCSRFCHECK', '1'); @@ -56,21 +57,24 @@ $formticket = new FormTicket($db); $arrayofjs = array(); $arrayofcss = array('/ticket/css/styles.css.php'); + +if (empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) +{ + print $langs->trans('TicketPublicInterfaceForbidden'); + exit; +} + llxHeaderTicket($langs->trans("Tickets"), "", 0, 0, $arrayofjs, $arrayofcss); -if (!$conf->global->TICKET_ENABLE_PUBLIC_INTERFACE) { - print '
' . $langs->trans('TicketPublicInterfaceForbidden') . '
'; -} else { - print '
'; - print '

' . ($conf->global->TICKET_PUBLIC_TEXT_HOME ? $conf->global->TICKET_PUBLIC_TEXT_HOME : $langs->trans("TicketPublicDesc")) . '

'; - print ''; - print '
'; -} +print '
'; +print '

' . ($conf->global->TICKET_PUBLIC_TEXT_HOME ? $conf->global->TICKET_PUBLIC_TEXT_HOME : $langs->trans("TicketPublicDesc")) . '

'; +print ''; +print '
'; // End of page htmlPrintOnlinePaymentFooter($mysoc, $langs, 1, $suffix, $object); From f9cc120d7569ae08e698d4e536e73eb8180c6b94 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 12:53:28 +0200 Subject: [PATCH 0898/1036] Debug module ticket --- htdocs/core/class/dolgraph.class.php | 2 +- htdocs/core/modules/modTicket.class.php | 1 + htdocs/langs/en_US/ticket.lang | 1 + htdocs/ticket/index.php | 71 +++++++++++++------------ 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index d70a63293c5..5cec0232603 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -229,7 +229,7 @@ class DolGraph /** * Set width * - * @param int $w Width + * @param int|string $w Width (Example: 320 or '100%') * @return boolean|null True */ public function SetWidth($w) diff --git a/htdocs/core/modules/modTicket.class.php b/htdocs/core/modules/modTicket.class.php index 9436bfa84e8..e16b6e87fd0 100644 --- a/htdocs/core/modules/modTicket.class.php +++ b/htdocs/core/modules/modTicket.class.php @@ -99,6 +99,7 @@ class modTicket extends DolibarrModules $this->conflictwith = array(); // List of module class names as string this module is in conflict with $this->phpmin = array(5,4); // Minimum version of PHP required by module $this->langfiles = array("ticket"); + // Constants // List of particular constants to add when module is enabled // (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) diff --git a/htdocs/langs/en_US/ticket.lang b/htdocs/langs/en_US/ticket.lang index 6a2d7e89cb7..70bd8220af0 100644 --- a/htdocs/langs/en_US/ticket.lang +++ b/htdocs/langs/en_US/ticket.lang @@ -133,6 +133,7 @@ TicketsIndex=Ticket - home TicketList=List of tickets TicketAssignedToMeInfos=This page display ticket list created by or assigned to current user NoTicketsFound=No ticket found +NoUnreadTicketsFound=No unread ticket found TicketViewAllTickets=View all tickets TicketViewNonClosedOnly=View only open tickets TicketStatByStatus=Tickets by status diff --git a/htdocs/ticket/index.php b/htdocs/ticket/index.php index 824b1f1833e..e7f7c6bff2f 100644 --- a/htdocs/ticket/index.php +++ b/htdocs/ticket/index.php @@ -24,6 +24,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/ticket/class/actions_ticket.class.php'; require_once DOL_DOCUMENT_ROOT . '/ticket/class/ticketstats.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/dolgraph.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; // Load translation files required by the page $langs->loadLangs(array('companies', 'other', 'ticket')); @@ -102,8 +103,8 @@ if (empty($endyear)) { } $startyear = $endyear - 1; -$WIDTH = (($shownb && $showtot) || !empty($conf->dol_optimize_smallscreen)) ? '256' : '320'; -$HEIGHT = '192'; +$WIDTH = (($shownb && $showtot) || !empty($conf->dol_optimize_smallscreen)) ? '100%' : '80%'; +$HEIGHT = '228'; print '
'; @@ -120,16 +121,14 @@ $tick = array( 'closed' => 0, 'deleted' => 0, ); -$total = 0; + $sql = "SELECT t.fk_statut, COUNT(t.fk_statut) as nb"; $sql .= " FROM " . MAIN_DB_PREFIX . "ticket as t"; if (!$user->rights->societe->client->voir && !$socid) { $sql .= ", " . MAIN_DB_PREFIX . "societe_commerciaux as sc"; } - -$sql .= ' WHERE t.entity IN (' . getEntity('ticket', 1) . ')'; -$sql .= " AND t.fk_statut IS NOT NULL"; -$sql .= " AND date_format(datec,'%Y') = '" . $endyear . "'"; +$sql .= ' WHERE t.entity IN (' . getEntity('ticket') . ')'; +$sql .= dolSqlDateFilter('datec', 0, 0, $endyear); if (!$user->rights->societe->client->voir && !$socid) { $sql .= " AND t.fk_soc = sc.fk_soc AND sc.fk_user = " . $user->id; } @@ -149,44 +148,41 @@ $result = $db->query($sql); if ($result) { while ($objp = $db->fetch_object($result)) { $found = 0; - if ($objp->fk_statut == 0) { + if ($objp->fk_statut == Ticket::STATUS_NOT_READ) { $tick['unread'] = $objp->nb; } - if ($objp->fk_statut == 1) { + if ($objp->fk_statut == Ticket::STATUS_READ) { $tick['read'] = $objp->nb; } - if ($objp->fk_statut == 3) { - $tick['answered'] = $objp->nb; + if ($objp->fk_statut == Ticket::STATUS_NEED_MORE_INFO) { + $tick['needmoreinfo'] = $objp->nb; } - if ($objp->fk_statut == 4) { + if ($objp->fk_statut == Ticket::STATUS_ASSIGNED) { $tick['assigned'] = $objp->nb; } - if ($objp->fk_statut == 5) { + if ($objp->fk_statut == Ticket::STATUS_IN_PROGRESS) { $tick['inprogress'] = $objp->nb; } - if ($objp->fk_statut == 6) { + if ($objp->fk_statut == Ticket::STATUS_WAITING) { $tick['waiting'] = $objp->nb; } - if ($objp->fk_statut == 8) { + if ($objp->fk_statut == Ticket::STATUS_CLOSED) { $tick['closed'] = $objp->nb; } - if ($objp->fk_statut == 9) { - $tick['deleted'] = $objp->nb; + if ($objp->fk_statut == Ticket::STATUS_CANCELED) { + $tick['canceled'] = $objp->nb; } } - if ((round($tick['unread']) ? 1 : 0) +(round($tick['read']) ? 1 : 0) +(round($tick['answered']) ? 1 : 0) +(round($tick['assigned']) ? 1 : 0) +(round($tick['inprogress']) ? 1 : 0) +(round($tick['waiting']) ? 1 : 0) +(round($tick['closed']) ? 1 : 0) +(round($tick['deleted']) ? 1 : 0) >= 2 - ) { - $dataseries = array(); - $dataseries[] = array('label' => $langs->trans("Unread"), 'data' => round($tick['unread'])); - $dataseries[] = array('label' => $langs->trans("Read"), 'data' => round($tick['read'])); - $dataseries[] = array('label' => $langs->trans("Answered"), 'data' => round($tick['answered'])); - $dataseries[] = array('label' => $langs->trans("Assigned"), 'data' => round($tick['assigned'])); - $dataseries[] = array('label' => $langs->trans("InProgress"), 'data' => round($tick['inprogress'])); - $dataseries[] = array('label' => $langs->trans("Waiting"), 'data' => round($tick['waiting'])); - $dataseries[] = array('label' => $langs->trans("Closed"), 'data' => round($tick['closed'])); - $dataseries[] = array('label' => $langs->trans("Deleted"), 'data' => round($tick['deleted'])); - } + $dataseries = array(); + $dataseries[] = array('label' => $langs->trans("Unread"), 'data' => round($tick['unread'])); + $dataseries[] = array('label' => $langs->trans("Read"), 'data' => round($tick['read'])); + $dataseries[] = array('label' => $langs->trans("NeedMoreInformation"), 'data' => round($tick['needmoreinfo'])); + $dataseries[] = array('label' => $langs->trans("Assigned"), 'data' => round($tick['assigned'])); + $dataseries[] = array('label' => $langs->trans("InProgress"), 'data' => round($tick['inprogress'])); + $dataseries[] = array('label' => $langs->trans("Waiting"), 'data' => round($tick['waiting'])); + $dataseries[] = array('label' => $langs->trans("Closed"), 'data' => round($tick['closed'])); + $dataseries[] = array('label' => $langs->trans("Canceled"), 'data' => round($tick['canceled'])); } else { dol_print_error($db); } @@ -210,11 +206,17 @@ $stringtoshow .= '
'; print ''; print ''; -print ''; print '
' . $langs->trans("Statistics") . ' ' . img_picto('', 'filter.png', 'id="idsubimgDOLUSERCOOKIE_ticket_by_status" class="linkobject"') . '
'; +print '
'; +print $stringtoshow; // don't display graph if no series if (! empty($dataseries) && count($dataseries) > 1) { - $data = array(); + $totalnb=0; + foreach ($dataseries as $key => $value) { + $totalnb += $value['data']; + } + + $data = array(); foreach ($dataseries as $key => $value) { $data[] = array($value['label'], $value['data']); } @@ -244,10 +246,9 @@ if (! empty($dataseries) && count($dataseries) > 1) { //$px1->SetTitle($langs->trans("TicketStatByStatus")); $px1->draw($filenamenb, $fileurlnb); - print $px1->show(); + print $px1->show($totalnb?0:1); } } -print $stringtoshow; print '
'; @@ -303,7 +304,7 @@ if ($result) { print '
'; print ''; print ''; - print ''; + print ''; print ''; if ($num > 0) { @@ -359,7 +360,7 @@ if ($result) { $db->free(); } else { - print ''; + print ''; } print "
' . $transRecordedType . ''.$langs->trans("FullList").''.$langs->trans("FullList").'
' . $langs->trans('NoTicketsFound') . '
' . $langs->trans('NoUnreadTicketsFound') . '
"; From df8fff843cb7fb6beece1a36b2e47a7eaf1ea045 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 13:16:46 +0200 Subject: [PATCH 0899/1036] Standardize code --- htdocs/includes/odtphp/odf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/includes/odtphp/odf.php b/htdocs/includes/odtphp/odf.php index 6b3a6400bc3..a5ce9e3ba68 100644 --- a/htdocs/includes/odtphp/odf.php +++ b/htdocs/includes/odtphp/odf.php @@ -745,7 +745,7 @@ IMG; private function _rrmdir($dir) { if ($handle = opendir($dir)) { - while (false !== ($file = readdir($handle))) { + while (($file = readdir($handle))!==false) { if ($file != '.' && $file != '..') { if (is_dir($dir . '/' . $file)) { $this->_rrmdir($dir . '/' . $file); From 8e8199cc0f963530735ada6a083c1470ec363889 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 13:17:02 +0200 Subject: [PATCH 0900/1036] Fix scrutinizer --- htdocs/ticket/class/ticket.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index 132cce1e52b..69708e06516 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -2374,7 +2374,7 @@ class Ticket extends CommonObject if (file_exists($dir_osencoded)) { $handle = opendir($dir_osencoded); if (is_resource($handle)) { - while (($file = readdir($handle)) != false) { + while (($file = readdir($handle)) !== false) { if (!utf8_check($file)) { $file = utf8_encode($file); } From a11c816a176da9b0fd930d3767208ad60aff4377 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 14:24:48 +0200 Subject: [PATCH 0901/1036] Fix tooltip --- htdocs/compta/facture/card.php | 3 ++- htdocs/fourn/facture/card.php | 3 ++- htdocs/langs/en_US/bills.lang | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 0f2669014a8..10de9581dfe 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3444,6 +3444,7 @@ elseif ($id > 0 || ! empty($ref)) elseif($object->type == Facture::TYPE_CREDIT_NOTE) $type_fac = 'CreditNote'; elseif($object->type == Facture::TYPE_DEPOSIT) $type_fac = 'Deposit'; $text = $langs->trans('ConfirmConvertToReduc', strtolower($langs->transnoentities($type_fac))); + $text.='
'.$langs->trans('ConfirmConvertToReduc2'); $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $langs->trans('ConvertToReduc'), $text, 'confirm_converttoreduc', '', "yes", 2); } @@ -4746,7 +4747,7 @@ elseif ($id > 0 || ! empty($ref)) } // For credit note if ($object->type == Facture::TYPE_CREDIT_NOTE && $object->statut == 1 && $object->paye == 0 && $usercancreate && $object->getSommePaiement() == 0) { - print ''; + print ''; } // For deposit invoice if ($object->type == Facture::TYPE_DEPOSIT && $usercancreate && $object->statut > 0 && empty($discount->id)) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 1eb38cec66c..c25b0afa15b 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -2221,6 +2221,7 @@ else elseif($object->type == FactureFournisseur::TYPE_CREDIT_NOTE) $type_fac = 'CreditNote'; elseif($object->type == FactureFournisseur::TYPE_DEPOSIT) $type_fac = 'Deposit'; $text = $langs->trans('ConfirmConvertToReducSupplier', strtolower($langs->transnoentities($type_fac))); + $text .= '
'.$langs->trans('ConfirmConvertToReducSupplier2'); $formconfirm = $form->formconfirm($_SERVER['PHP_SELF'] . '?facid=' . $object->id, $langs->trans('ConvertToReduc'), $text, 'confirm_converttoreduc', '', "yes", 2); } @@ -3107,7 +3108,7 @@ else } // For credit note if ($object->type == FactureFournisseur::TYPE_CREDIT_NOTE && $object->statut == 1 && $object->paye == 0 && $user->rights->fournisseur->facture->creer && $object->getSommePaiement() == 0) { - print ''; + print ''; } // For deposit invoice if ($object->type == FactureFournisseur::TYPE_DEPOSIT && $object->paye == 1 && $resteapayer == 0 && $user->rights->fournisseur->facture->creer && empty($discount->id)) diff --git a/htdocs/langs/en_US/bills.lang b/htdocs/langs/en_US/bills.lang index 17882b3b270..9a86e941035 100644 --- a/htdocs/langs/en_US/bills.lang +++ b/htdocs/langs/en_US/bills.lang @@ -66,8 +66,10 @@ paymentInInvoiceCurrency=in invoices currency PaidBack=Paid back DeletePayment=Delete payment ConfirmDeletePayment=Are you sure you want to delete this payment? -ConfirmConvertToReduc=Do you want to convert this %s into an absolute discount?
The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this customer. -ConfirmConvertToReducSupplier=Do you want to convert this %s into an absolute discount?
The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this vendor. +ConfirmConvertToReduc=Do you want to convert this %s into an absolute discount? +ConfirmConvertToReduc2=The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this customer. +ConfirmConvertToReducSupplier=Do you want to convert this %s into an absolute discount? +ConfirmConvertToReducSupplier2=The amount will be saved among all discounts and could be used as a discount for a current or a future invoice for this vendor. SupplierPayments=Vendor payments ReceivedPayments=Received payments ReceivedCustomersPayments=Payments received from customers From c109eebe383f240b4340732d5457e26a3f9e0384 Mon Sep 17 00:00:00 2001 From: Abbes Bahfir Date: Wed, 19 Jun 2019 14:42:56 +0100 Subject: [PATCH 0902/1036] New:Show c_country elements in modulebuilder --- htdocs/core/class/ccountry.class.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/ccountry.class.php b/htdocs/core/class/ccountry.class.php index a97d992bf89..5e744fbdb73 100644 --- a/htdocs/core/class/ccountry.class.php +++ b/htdocs/core/class/ccountry.class.php @@ -47,8 +47,8 @@ class Ccountry // extends CommonObject */ public $errors = array(); - //var $element='ccountry'; //!< Id that identify managed objects - //var $table_element='ccountry'; //!< Name of table without prefix where object is stored + var $element='ccountry'; //!< Id that identify managed objects + var $table_element='c_country'; //!< Name of table without prefix where object is stored /** * @var int ID @@ -65,7 +65,8 @@ class Ccountry // extends CommonObject public $active; - + public $fields=array( + 'label' => array('type'=>'varchar(250)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>15, 'notnull'=>-1, 'showoncombobox'=>'1',)); /** From 2034faf280528cdd444502dca25b4743c05d17f1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 15:48:04 +0200 Subject: [PATCH 0903/1036] Fix duplicate 'option_' in prefix --- htdocs/core/class/extrafields.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 8e0cf0946dc..eeb653aec8a 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -972,7 +972,10 @@ class ExtraFields $out=''; - $keyprefix = $keyprefix.'options_'; // Because we work on extrafields + if (! preg_match('/options_$/', $keyprefix)) // Because we work on extrafields, we add 'options_' to prefix if not already added + { + $keyprefix = $keyprefix.'options_'; + } if (! empty($extrafieldsobjectkey)) { From 04f2fb604f680575acfcacd0e0f179cdbfb5b97a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 15:48:04 +0200 Subject: [PATCH 0904/1036] Fix duplicate 'option_' in prefix --- htdocs/core/class/extrafields.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 8e0cf0946dc..eeb653aec8a 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -972,7 +972,10 @@ class ExtraFields $out=''; - $keyprefix = $keyprefix.'options_'; // Because we work on extrafields + if (! preg_match('/options_$/', $keyprefix)) // Because we work on extrafields, we add 'options_' to prefix if not already added + { + $keyprefix = $keyprefix.'options_'; + } if (! empty($extrafieldsobjectkey)) { From daa8b43732d43ec6f391e601855737c691079541 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 15:51:48 +0200 Subject: [PATCH 0905/1036] css --- htdocs/compta/facture/list.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index b6beba5e12e..6c325c865a9 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -1075,7 +1075,7 @@ if ($resql) // Town if (! empty($arrayfields['s.town']['checked'])) { - print ''; + print ''; print $obj->town; print ''; if (! $i) $totalarray['nbfield']++; @@ -1083,7 +1083,7 @@ if ($resql) // Zip if (! empty($arrayfields['s.zip']['checked'])) { - print ''; + print ''; print $obj->zip; print ''; if (! $i) $totalarray['nbfield']++; From c3b8582076b7144cf8d23bb07189a39cb1918263 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 15:55:18 +0200 Subject: [PATCH 0906/1036] Fix use of deprecated function --- htdocs/stripe/class/stripe.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index d754b8d3962..27346a15f5e 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -536,7 +536,7 @@ class Stripe extends CommonObject //$a = \Stripe\Stripe::getApiKey(); //var_dump($a);var_dump($stripeacc);exit; - dol_syslog("Try to create card dataforcard = ".dol_json_encode($dataforcard)); + dol_syslog("Try to create card dataforcard = ".json_encode($dataforcard)); try { if (empty($stripeacc)) { // If the Stripe connect account not set, we use common API usage $card = $cu->sources->create($dataforcard); From 5b5028254f8d33215d96c60fdb83a9c526de1f3f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 16:30:03 +0200 Subject: [PATCH 0907/1036] Fix label --- htdocs/langs/en_US/accountancy.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 449a30acbbb..91234f72aef 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -291,7 +291,7 @@ Modelcsv_cogilog=Export for Cogilog Modelcsv_agiris=Export for Agiris Modelcsv_openconcerto=Export for OpenConcerto (Test) Modelcsv_configurable=Export CSV Configurable -Modelcsv_FEC=Export FEC (Art. L47 A) +Modelcsv_FEC=Export FEC Modelcsv_Sage50_Swiss=Export for Sage 50 Switzerland ChartofaccountsId=Chart of accounts Id From 7c4cddf28d3aacf718d226078b3d23dfcb78fc07 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 16:34:01 +0200 Subject: [PATCH 0908/1036] Fix missing trad --- htdocs/langs/en_US/accountancy.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 91234f72aef..7797fdef7b1 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -336,7 +336,7 @@ UseMenuToSetBindindManualy=Lines not yet bound, use menu %s to ## Import ImportAccountingEntries=Accounting entries - +DateExport=Date export WarningReportNotReliable=Warning, this report is not based on the Ledger, so does not contains transaction modified manually in the Ledger. If your journalization is up to date, the bookkeeping view is more accurate. ExpenseReportJournal=Expense Report Journal InventoryJournal=Inventory Journal From 31a53b72aec1bcd2b6524e17bd922a8eda05f028 Mon Sep 17 00:00:00 2001 From: John Botella Date: Wed, 19 Jun 2019 16:55:45 +0200 Subject: [PATCH 0909/1036] FIX var name --- htdocs/core/actions_massactions.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 34ba465ebff..07766ac7fef 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -209,7 +209,7 @@ if (! $error && $massaction == 'confirm_presend') $resaction.='
'.$langs->trans('ErrorOnlyProposalNotDraftCanBeSentInMassAction',$objectobj->ref).'

'; continue; // Payment done or started or canceled } - if ($objectclass == 'Commande' && $objectoj->statut == Commande::STATUS_DRAFT) + if ($objectclass == 'Commande' && $objectobj->statut == Commande::STATUS_DRAFT) { $langs->load("errors"); $nbignored++; From 1079535894f73cedb822d4fea049efe4e571b50e Mon Sep 17 00:00:00 2001 From: Abbes Bahfir Date: Wed, 19 Jun 2019 17:49:31 +0100 Subject: [PATCH 0910/1036] Fix:modulebuilder output folder --- htdocs/modulebuilder/template/myobject_document.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/modulebuilder/template/myobject_document.php b/htdocs/modulebuilder/template/myobject_document.php index 0f4df0012f4..12da4769cf7 100644 --- a/htdocs/modulebuilder/template/myobject_document.php +++ b/htdocs/modulebuilder/template/myobject_document.php @@ -81,8 +81,8 @@ $extralabels = $extrafields->fetch_name_optionals_label('myobject'); // Load object include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals -//if ($id > 0 || ! empty($ref)) $upload_dir = $conf->mymodule->multidir_output[$object->entity?$object->entity:1] . "/myobject/" . dol_sanitizeFileName($object->id); -if ($id > 0 || ! empty($ref)) $upload_dir = $conf->mymodule->multidir_output[$object->entity?$object->entity:1] . "/myobject/" . dol_sanitizeFileName($object->ref); +//if ($id > 0 || ! empty($ref)) $upload_dir = $conf->sellyoursaas->multidir_output[$object->entity] . "/myobject/" . dol_sanitizeFileName($object->id); +if ($id > 0 || ! empty($ref)) $upload_dir = $conf->mymodule->multidir_output[$conf->entity] . "/myobject/" . dol_sanitizeFileName($object->ref); /* From 47c2f6fac4be2b9a56854d0df42e4182622f1647 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 19 Jun 2019 21:35:35 +0200 Subject: [PATCH 0911/1036] NEW Add column VAT rate in product list --- htdocs/product/list.php | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 7677e82e1b4..5e348c2fe70 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -56,6 +56,7 @@ $search_barcode=GETPOST("search_barcode", 'alpha'); $search_label=GETPOST("search_label", 'alpha'); $search_type = GETPOST("search_type", 'int'); $search_sale = GETPOST("search_sale", 'int'); +$search_vatrate=GETPOST("search_vatrate", 'alpha'); $search_categ = GETPOST("search_categ", 'int'); $search_tosell = GETPOST("search_tosell", 'int'); $search_tobuy = GETPOST("search_tobuy", 'int'); @@ -174,7 +175,8 @@ $arrayfields=array( 'p.sellprice'=>array('label'=>$langs->trans("SellingPrice"), 'checked'=>1, 'enabled'=>empty($conf->global->PRODUIT_MULTIPRICES)), 'p.minbuyprice'=>array('label'=>$langs->trans("BuyingPriceMinShort"), 'checked'=>1, 'enabled'=>(! empty($user->rights->fournisseur->lire))), 'p.numbuyprice'=>array('label'=>$langs->trans("BuyingPriceNumShort"), 'checked'=>0, 'enabled'=>(! empty($user->rights->fournisseur->lire))), - 'p.pmp'=>array('label'=>$langs->trans("PMPValueShort"), 'checked'=>0, 'enabled'=>(! empty($user->rights->fournisseur->lire))), + 'p.tva_tx'=>array('label'=>$langs->trans("VATRate"), 'checked'=>0, 'enabled'=>(! empty($user->rights->fournisseur->lire))), + 'p.pmp'=>array('label'=>$langs->trans("PMPValueShort"), 'checked'=>0, 'enabled'=>(! empty($user->rights->fournisseur->lire))), 'p.seuil_stock_alerte'=>array('label'=>$langs->trans("StockLimit"), 'checked'=>0, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')), 'p.desiredstock'=>array('label'=>$langs->trans("DesiredStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')), 'p.stock'=>array('label'=>$langs->trans("PhysicalStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')), @@ -229,6 +231,7 @@ if (empty($reshook)) $search_categ=0; $search_tosell=""; $search_tobuy=""; + $search_vatrate=""; $search_tobatch=''; //$search_type=''; // There is 2 types of list: a list of product and a list of services. No list with both. So when we clear search criteria, we must keep the filter on type. @@ -276,7 +279,7 @@ else $texte = $langs->trans("ProductsAndServices"); } -$sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; +$sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.tva_tx, p.price_ttc, p.price_base_type, p.entity,'; $sql.= ' p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,'; $sql.= ' p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy,'; $sql.= ' p.datec as date_creation, p.tms as date_update, p.pmp, p.stock,'; @@ -323,6 +326,7 @@ if ($search_label) $sql .= natural_search('p.label', $search_label); if ($search_barcode) $sql .= natural_search('p.barcode', $search_barcode); if (isset($search_tosell) && dol_strlen($search_tosell) > 0 && $search_tosell!=-1) $sql.= " AND p.tosell = ".$db->escape($search_tosell); if (isset($search_tobuy) && dol_strlen($search_tobuy) > 0 && $search_tobuy!=-1) $sql.= " AND p.tobuy = ".$db->escape($search_tobuy); +if ($search_vatrate) $sql .= natural_search('p.tva_tx', $search_vatrate); if (dol_strlen($canvas) > 0) $sql.= " AND p.canvas = '".$db->escape($canvas)."'"; if ($catid > 0) $sql.= " AND cp.fk_categorie = ".$catid; if ($catid == -2) $sql.= " AND cp.fk_categorie IS NULL"; @@ -341,7 +345,7 @@ include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListWhere', $parameters); // Note that $action and $object may have been modified by hook $sql.=$hookmanager->resPrint; -$sql.= " GROUP BY p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type,"; +$sql.= " GROUP BY p.rowid, p.ref, p.label, p.barcode, p.price, p.tva_tx, p.price_ttc, p.price_base_type,"; $sql.= " p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,"; $sql.= ' p.datec, p.tms, p.entity, p.tobatch, p.accountancy_code_sell, p.accountancy_code_sell_intra, p.accountancy_code_sell_export, p.accountancy_code_buy, p.pmp, p.stock,'; $sql.= ' p.weight, p.weight_units, p.length, p.length_units, p.surface, p.surface_units, p.volume, p.volume_units, p.width, p.width_units, p.height, p.height_units'; @@ -421,6 +425,7 @@ if ($resql) if ($search_label) $param.="&search_label=".urlencode($search_label); if ($search_tosell != '') $param.="&search_tosell=".urlencode($search_tosell); if ($search_tobuy != '') $param.="&search_tobuy=".urlencode($search_tobuy); + if ($search_vatrate) $sql .= natural_search('p.tva_tx', $search_vatrate); if ($fourn_id > 0) $param.=($fourn_id?"&fourn_id=".$fourn_id:""); if ($seach_categ) $param.=($search_categ?"&search_categ=".urlencode($search_categ):""); if ($show_childproducts) $param.=($show_childproducts?"&search_show_childproducts=".urlencode($show_childproducts):""); @@ -613,6 +618,13 @@ if ($resql) print ' '; print ''; } + // Sell price + if (! empty($arrayfields['p.tva_tx']['checked'])) + { + print ''; + print ''; + print ''; + } // WAP if (! empty($arrayfields['p.pmp']['checked'])) { @@ -715,6 +727,9 @@ if ($resql) if (! empty($arrayfields['p.numbuyprice']['checked'])) { print_liste_field_titre($arrayfields['p.numbuyprice']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right '); } + if (! empty($arrayfields['p.tva_tx']['checked'])) { + print_liste_field_titre($arrayfields['p.tva_tx']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right '); + } if (! empty($arrayfields['p.pmp']['checked'])) { print_liste_field_titre($arrayfields['p.pmp']['label'], $_SERVER["PHP_SELF"], "", "", $param, '', $sortfield, $sortorder, 'right '); } @@ -983,6 +998,15 @@ if ($resql) print ''; } + // Sell Tax Rate + if (! empty($arrayfields['p.tva_tx']['checked'])) + { + print ''; + print vatrate($obj->tva_tx,true); + print ''; + if (! $i) $totalarray['nbfield']++; + } + // WAP if (! empty($arrayfields['p.pmp']['checked'])) { From 68e9712f0c30e17b7c4a78bd593cb8a60ceaf33d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 22:05:38 +0200 Subject: [PATCH 0912/1036] Fix support domains with 3 levels --- htdocs/core/lib/geturl.lib.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/geturl.lib.php b/htdocs/core/lib/geturl.lib.php index 714bc26b7da..83e483b3e97 100644 --- a/htdocs/core/lib/geturl.lib.php +++ b/htdocs/core/lib/geturl.lib.php @@ -172,14 +172,21 @@ function getURLContent($url, $postorget = 'GET', $param = '', $followlocation = * For example: https://www.abc.mydomain.com/dir/page.html return 'mydomain' * * @param string $url Full URL. - * @param int $mode 0=return 'mydomain', 1=return 'mydomain.com' + * @param int $mode 0=return 'mydomain', 1=return 'mydomain.com', 2=return 'abc.mydomain.com' * @return string Returns domaine name */ function getDomainFromURL($url, $mode = 0) { $tmpdomain = preg_replace('/^https?:\/\//i', '', $url); // Remove http(s):// $tmpdomain = preg_replace('/\/.*$/i', '', $tmpdomain); // Remove part after domain - $tmpdomain = preg_replace('/^.*\.([^\.]+)\.([^\.]+)$/', '\1.\2', $tmpdomain); // Remove part www.abc before domain name + if ($mode == 2) + { + $tmpdomain = preg_replace('/^.*\.([^\.]+)\.([^\.]+)\.([^\.]+)$/', '\1.\2.\3', $tmpdomain); // Remove part 'www.' before 'abc.mydomain.com' + } + else + { + $tmpdomain = preg_replace('/^.*\.([^\.]+)\.([^\.]+)$/', '\1.\2', $tmpdomain); // Remove part 'www.abc.' before 'mydomain.com' + } if (empty($mode)) { $tmpdomain = preg_replace('/\.[^\.]+$/', '', $tmpdomain); // Remove first level domain (.com, .net, ...) From d6b6f77e74beeab3cb41cbdbbd59b255e4c0614c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 22:05:38 +0200 Subject: [PATCH 0913/1036] Fix support domains with 3 levels --- htdocs/core/lib/geturl.lib.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/geturl.lib.php b/htdocs/core/lib/geturl.lib.php index 714bc26b7da..83e483b3e97 100644 --- a/htdocs/core/lib/geturl.lib.php +++ b/htdocs/core/lib/geturl.lib.php @@ -172,14 +172,21 @@ function getURLContent($url, $postorget = 'GET', $param = '', $followlocation = * For example: https://www.abc.mydomain.com/dir/page.html return 'mydomain' * * @param string $url Full URL. - * @param int $mode 0=return 'mydomain', 1=return 'mydomain.com' + * @param int $mode 0=return 'mydomain', 1=return 'mydomain.com', 2=return 'abc.mydomain.com' * @return string Returns domaine name */ function getDomainFromURL($url, $mode = 0) { $tmpdomain = preg_replace('/^https?:\/\//i', '', $url); // Remove http(s):// $tmpdomain = preg_replace('/\/.*$/i', '', $tmpdomain); // Remove part after domain - $tmpdomain = preg_replace('/^.*\.([^\.]+)\.([^\.]+)$/', '\1.\2', $tmpdomain); // Remove part www.abc before domain name + if ($mode == 2) + { + $tmpdomain = preg_replace('/^.*\.([^\.]+)\.([^\.]+)\.([^\.]+)$/', '\1.\2.\3', $tmpdomain); // Remove part 'www.' before 'abc.mydomain.com' + } + else + { + $tmpdomain = preg_replace('/^.*\.([^\.]+)\.([^\.]+)$/', '\1.\2', $tmpdomain); // Remove part 'www.abc.' before 'mydomain.com' + } if (empty($mode)) { $tmpdomain = preg_replace('/\.[^\.]+$/', '', $tmpdomain); // Remove first level domain (.com, .net, ...) From bf71731fc945afdf66216daf3e37359813638d15 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 19 Jun 2019 22:28:33 +0200 Subject: [PATCH 0914/1036] Fix phpcs --- htdocs/adherents/class/adherent.class.php | 1 + htdocs/contact/class/contact.class.php | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 1856de6182f..c1bb04d90fc 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -2460,6 +2460,7 @@ class Adherent extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Initialise tableau info (tableau des attributs LDAP) * diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 5c4df6ab3f9..de9494fca8b 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -520,6 +520,7 @@ class Contact extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.PublicUnderscore /** * Initialise tableau info (tableau des attributs LDAP) * From b4e47d289b5bb183fcb845b236aa6615a62cc8ff Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 02:43:56 +0200 Subject: [PATCH 0915/1036] Code comment --- htdocs/user/class/user.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index a151fdb5574..8e52ba3028b 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -520,8 +520,8 @@ class User extends CommonObject * Add a right to the user * * @param int $rid Id of permission to add or 0 to add several permissions - * @param string $allmodule Add all permissions of module $allmodule - * @param string $allperms Add all permissions of module $allmodule, subperms $allperms only + * @param string $allmodule Add all permissions of module $allmodule or 'allmodules' to include all modules. + * @param string $allperms Add all permissions of module $allmodule, subperms $allperms only or '' to include all permissions. * @param int $entity Entity to use * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers * @return int > 0 if OK, < 0 if KO From e060af5c977b9a37cf6c054e77f483d617f583c5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 02:50:23 +0200 Subject: [PATCH 0916/1036] Update treso.php --- htdocs/compta/bank/treso.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/treso.php b/htdocs/compta/bank/treso.php index 1318dbd4e2d..f17e622210e 100644 --- a/htdocs/compta/bank/treso.php +++ b/htdocs/compta/bank/treso.php @@ -293,8 +293,8 @@ if ($_REQUEST["account"] || $_REQUEST["ref"]) }else print ""; } print "".$refcomp.""; - if ($obj->total_ttc < 0) { print "".price(abs($total_ttc))." "; }; - if ($obj->total_ttc >= 0) { print " ".price($total_ttc).""; }; + if ($obj->total_ttc < 0) { print ''.price(abs($total_ttc))." "; }; + if ($obj->total_ttc >= 0) { print ' '.price($total_ttc).""; }; print ''.price($solde).''; print ""; } From 6d38f5ec9cb1fe927106243ab6463c3a39e6d630 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 02:56:44 +0200 Subject: [PATCH 0917/1036] FIX #11369 --- htdocs/bom/class/bom.class.php | 16 ++++++++-------- .../class/emailcollector.class.php | 6 +++--- .../class/emailcollectoraction.class.php | 8 ++++---- .../class/emailcollectorfilter.class.php | 8 ++++---- .../template/class/myobject.class.php | 6 +++--- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php index 731136fb7f4..99331de8c62 100644 --- a/htdocs/bom/class/bom.class.php +++ b/htdocs/bom/class/bom.class.php @@ -165,7 +165,7 @@ class BOM extends CommonObject */ public function __construct(DoliDB $db) { - global $conf, $langs, $user; + global $conf, $langs; $this->db = $db; @@ -184,11 +184,11 @@ class BOM extends CommonObject // Translate some data of arrayofkeyval foreach($this->fields as $key => $val) { - if (is_array($this->fields['status']['arrayofkeyval'])) + if (is_array($this->fields[$key]['arrayofkeyval'])) { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + foreach($this->fields[$key]['arrayofkeyval'] as $key2 => $val2) { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2); } } } @@ -1066,7 +1066,7 @@ class BOMLine extends CommonObject */ public function __construct(DoliDB $db) { - global $conf, $langs, $user; + global $conf, $langs; $this->db = $db; @@ -1085,11 +1085,11 @@ class BOMLine extends CommonObject // Translate some data of arrayofkeyval foreach($this->fields as $key => $val) { - if (is_array($this->fields['status']['arrayofkeyval'])) + if (is_array($this->fields[$key]['arrayofkeyval'])) { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + foreach($this->fields[$key]['arrayofkeyval'] as $key2 => $val2) { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2); } } } diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index f60051df970..ff4be06fcab 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -205,11 +205,11 @@ class EmailCollector extends CommonObject // Translate some data of arrayofkeyval foreach($this->fields as $key => $val) { - if (is_array($this->fields['status']['arrayofkeyval'])) + if (is_array($this->fields[$key]['arrayofkeyval'])) { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + foreach($this->fields[$key]['arrayofkeyval'] as $key2 => $val2) { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2); } } } diff --git a/htdocs/emailcollector/class/emailcollectoraction.class.php b/htdocs/emailcollector/class/emailcollectoraction.class.php index 11ccfbc858e..ca710f99216 100644 --- a/htdocs/emailcollector/class/emailcollectoraction.class.php +++ b/htdocs/emailcollector/class/emailcollectoraction.class.php @@ -145,7 +145,7 @@ class EmailCollectorAction extends CommonObject */ public function __construct(DoliDB $db) { - global $conf, $langs, $user; + global $conf, $langs; $this->db = $db; @@ -164,11 +164,11 @@ class EmailCollectorAction extends CommonObject // Translate some data of arrayofkeyval foreach($this->fields as $key => $val) { - if (is_array($this->fields['status']['arrayofkeyval'])) + if (is_array($this->fields[$key]['arrayofkeyval'])) { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + foreach($this->fields[$key]['arrayofkeyval'] as $key2 => $val2) { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2); } } } diff --git a/htdocs/emailcollector/class/emailcollectorfilter.class.php b/htdocs/emailcollector/class/emailcollectorfilter.class.php index f93ac51f673..5c7c7184ffc 100644 --- a/htdocs/emailcollector/class/emailcollectorfilter.class.php +++ b/htdocs/emailcollector/class/emailcollectorfilter.class.php @@ -114,7 +114,7 @@ class EmailCollectorFilter extends CommonObject */ public function __construct(DoliDB $db) { - global $conf, $langs, $user; + global $conf, $langs; $this->db = $db; @@ -133,11 +133,11 @@ class EmailCollectorFilter extends CommonObject // Translate some data of arrayofkeyval foreach($this->fields as $key => $val) { - if (is_array($this->fields['status']['arrayofkeyval'])) + if (is_array($this->fields[$key]['arrayofkeyval'])) { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + foreach($this->fields[$key]['arrayofkeyval'] as $key2 => $val2) { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2); } } } diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 266b8d1925f..1b4d1c7b52d 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -227,11 +227,11 @@ class MyObject extends CommonObject // Translate some data of arrayofkeyval foreach($this->fields as $key => $val) { - if (is_array($this->fields['status']['arrayofkeyval'])) + if (is_array($this->fields[$key]['arrayofkeyval'])) { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + foreach($this->fields[$key]['arrayofkeyval'] as $key2 => $val2) { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + $this->fields[$key]['arrayofkeyval'][$key2]=$langs->trans($val2); } } } From 2b0b7b0dab0603a99d9a379a0dcef814976a0ebe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 03:32:28 +0200 Subject: [PATCH 0918/1036] Update ccountry.class.php --- htdocs/core/class/ccountry.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/ccountry.class.php b/htdocs/core/class/ccountry.class.php index 5e744fbdb73..ef89fbcd9b6 100644 --- a/htdocs/core/class/ccountry.class.php +++ b/htdocs/core/class/ccountry.class.php @@ -66,7 +66,8 @@ class Ccountry // extends CommonObject public $active; public $fields=array( - 'label' => array('type'=>'varchar(250)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>15, 'notnull'=>-1, 'showoncombobox'=>'1',)); + 'label' => array('type'=>'varchar(250)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>15, 'notnull'=>-1, 'showoncombobox'=>'1') + ); /** From d8c2007d920200b0ac057c03b1eb0c522f3ea263 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 03:53:33 +0200 Subject: [PATCH 0919/1036] Prepare v11 alpha --- htdocs/install/check.php | 3 +- .../install/mysql/migration/10.0.0-11.0.0.sql | 31 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/htdocs/install/check.php b/htdocs/install/check.php index 55331634aff..6075ad14702 100644 --- a/htdocs/install/check.php +++ b/htdocs/install/check.php @@ -451,7 +451,8 @@ else array('from'=>'6.0.0', 'to'=>'7.0.0'), array('from'=>'7.0.0', 'to'=>'8.0.0'), array('from'=>'8.0.0', 'to'=>'9.0.0'), - array('from'=>'9.0.0', 'to'=>'10.0.0') + array('from'=>'9.0.0', 'to'=>'10.0.0'), + array('from'=>'10.0.0', 'to'=>'11.0.0') ); $count=0; diff --git a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql index 9f758b6bc40..520007e453c 100644 --- a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql +++ b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql @@ -2,6 +2,30 @@ -- Be carefull to requests order. -- This file must be loaded by calling /install/index.php page -- when current version is 11.0.0 or higher. +-- +-- To restrict request to Mysql version x.y minimum use -- VMYSQLx.y +-- To restrict request to Pgsql version x.y minimum use -- VPGSQLx.y +-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new; +-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol; +-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60); +-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname; +-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60); +-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; +-- To create a unique index ALTER TABLE llx_table ADD UNIQUE INDEX uk_table_field (field); +-- To drop an index: -- VMYSQL4.1 DROP INDEX nomindex on llx_table +-- To drop an index: -- VPGSQL8.2 DROP INDEX nomindex +-- To make pk to be auto increment (mysql): -- VMYSQL4.3 ALTER TABLE llx_table CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; +-- To make pk to be auto increment (postgres): +-- -- VPGSQL8.2 CREATE SEQUENCE llx_table_rowid_seq OWNED BY llx_table.rowid; +-- -- VPGSQL8.2 ALTER TABLE llx_table ADD PRIMARY KEY (rowid); +-- -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN rowid SET DEFAULT nextval('llx_table_rowid_seq'); +-- -- VPGSQL8.2 SELECT setval('llx_table_rowid_seq', MAX(rowid)) FROM llx_table; +-- To set a field as NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NULL; +-- To set a field as NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL; +-- To set a field as NOT NULL: -- VMYSQL4.3 ALTER TABLE llx_table MODIFY COLUMN name varchar(60) NOT NULL; +-- To set a field as NOT NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET NOT NULL; +-- To set a field as default NULL: -- VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL; +-- Note: fields with type BLOB/TEXT can't have default value. create table llx_entrepot_extrafields @@ -12,4 +36,9 @@ create table llx_entrepot_extrafields import_key varchar(14) -- import key ) ENGINE=innodb; -ALTER TABLE llx_entrepot_extrafields ADD INDEX idx_entrepot_extrafields (fk_object); \ No newline at end of file +ALTER TABLE llx_entrepot_extrafields ADD INDEX idx_entrepot_extrafields (fk_object); + + +ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer DEFAULT 1; +ALTER TABLE llx_c_shipment_mode DROP INDEX uk_c_shipment_mode; +ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (code, entity); From 5f32b5e23e79664156f01c02500a97c30df6acd4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 03:54:11 +0200 Subject: [PATCH 0920/1036] Prepare v11 alpha --- htdocs/filefunc.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 6f1a773b7c1..d3aafe94f26 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE', 'Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION', '10.0.0'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION', '11.0.0-alpha'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO', chr(128)); From 5fe91afdc29e0aed5e87a7456e4aef69c94f390b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 03:54:50 +0200 Subject: [PATCH 0921/1036] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 4 ---- 1 file changed, 4 deletions(-) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 43e12c6c05f..e5b925b0d83 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -107,10 +107,6 @@ ALTER TABLE llx_prelevement_facture_demande ADD COLUMN sourcetype varchar(32); ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_id varchar(128) NULL; ALTER TABLE llx_prelevement_facture_demande ADD COLUMN ext_payment_site varchar(128) NULL; -ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer DEFAULT 1; -ALTER TABLE llx_c_shipment_mode DROP INDEX uk_c_shipment_mode; -ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (code, entity); - -- Fix if table exists ALTER TABLE llx_c_units DROP INDEX uk_c_units_code; ALTER TABLE llx_c_units ADD COLUMN scale integer; From 77a45b878b94d2b6223effe83da164a29d37e89a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 03:56:42 +0200 Subject: [PATCH 0922/1036] Fix migration --- htdocs/install/mysql/migration/10.0.0-11.0.0.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql index 520007e453c..5f0d04040de 100644 --- a/htdocs/install/mysql/migration/10.0.0-11.0.0.sql +++ b/htdocs/install/mysql/migration/10.0.0-11.0.0.sql @@ -39,6 +39,7 @@ create table llx_entrepot_extrafields ALTER TABLE llx_entrepot_extrafields ADD INDEX idx_entrepot_extrafields (fk_object); -ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer DEFAULT 1; +ALTER TABLE llx_c_shipment_mode ADD COLUMN entity integer DEFAULT 1 NOT NULL; + ALTER TABLE llx_c_shipment_mode DROP INDEX uk_c_shipment_mode; ALTER TABLE llx_c_shipment_mode ADD UNIQUE INDEX uk_c_shipment_mode (code, entity); From d15a300f02e0feec85e411e83a882de42cdec564 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 04:10:58 +0200 Subject: [PATCH 0923/1036] Removed not used var --- htdocs/compta/facture/card.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 10de9581dfe..44be21898f8 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -1295,7 +1295,6 @@ if (empty($reshook)) $TTotalByTva[$line->tva_tx] += $line->total_ttc ; } - $amount_to_diff = 0; foreach ($TTotalByTva as $tva => &$total) { $coef = $total / $srcobject->total_ttc; // Calc coef From e60020140d01d3a17b4ca467641c083c410854fa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 04:11:10 +0200 Subject: [PATCH 0924/1036] Update societe.class.php --- htdocs/societe/class/societe.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 6419eb11420..44b38856b90 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3455,7 +3455,7 @@ class Societe extends CommonObject } else // For backward compatibility { - dol_syslog("Your country setup use an old syntax. Reedit it using setup area.", LOG_ERR); + dol_syslog("Your country setup use an old syntax. Reedit it using setup area.", LOG_WARNING); include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; $country_code=getCountry($country_id, 2, $this->db); // This need a SQL request, but it's the old feature that should not be used anymore $country_label=getCountry($country_id, 0, $this->db); // This need a SQL request, but it's the old feature that should not be used anymore From 7c29fb614c34119ed919b3eb5fa86ba53eb4665f Mon Sep 17 00:00:00 2001 From: John Botella Date: Thu, 20 Jun 2019 09:21:35 +0200 Subject: [PATCH 0925/1036] Fix replacement and vars names --- htdocs/core/actions_massactions.inc.php | 77 ++++++++++++++++++------- 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 00ffe03c7ed..c40bd73eff5 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -93,7 +93,7 @@ if (! $error && $massaction == 'confirm_presend') } // Check mandatory parameters - if (empty($user->email)) + if (GETPOST('fromtype','alpha') === 'user' && empty($user->email)) { $error++; setEventMessages($langs->trans("NoSenderEmailDefined"), null, 'warnings'); @@ -208,7 +208,7 @@ if (! $error && $massaction == 'confirm_presend') $resaction.='
'.$langs->trans('ErrorOnlyProposalNotDraftCanBeSentInMassAction',$objectobj->ref).'

'; continue; // Payment done or started or canceled } - if ($objectclass == 'Commande' && $objectoj->statut == Commande::STATUS_DRAFT) + if ($objectclass == 'Commande' && $objectobj->statut == Commande::STATUS_DRAFT) { $langs->load("errors"); $nbignored++; @@ -333,12 +333,16 @@ if (! $error && $massaction == 'confirm_presend') if ($objectclass == 'CommandeFournisseur') $sendtobcc .= (empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO) ? '' : (($sendtobcc?", ":"").$conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO)); if ($objectclass == 'FactureFournisseur') $sendtobcc .= (empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO) ? '' : (($sendtobcc?", ":"").$conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO)); - // $listofqualifiedobj is array with key = object id of qualified objects for the current thirdparty + // $listofqualifiedobj is array with key = object id and value is instance of qualified objects, for the current thirdparty (but thirdparty property is not loaded yet) $oneemailperrecipient=(GETPOST('oneemailperrecipient')=='on'?1:0); $looparray=array(); if (! $oneemailperrecipient) { $looparray = $listofqualifiedobj; + foreach ($looparray as $key => $objecttmp) + { + $looparray[$key]->thirdparty = $thirdparty; + } } else { @@ -347,8 +351,9 @@ if (! $error && $massaction == 'confirm_presend') $looparray[0]=$objectforloop; } //var_dump($looparray);exit; - - foreach ($looparray as $objecttmp) // $objecttmp is a real object or an empty if we choose to send one email per thirdparty instead of per record + dol_syslog("We have set an array of ".count($looparray)." emails to send. oneemailperrecipient=".$oneemailperrecipient); + //var_dump($oneemailperrecipient); var_dump($listofqualifiedobj); var_dump($listofqualifiedref); + foreach ($looparray as $objectid => $objecttmp) // $objecttmp is a real object or an empty object if we choose to send one email per thirdparty instead of one per object { // Make substitution in email content $substitutionarray=getCommonSubstitutionArray($langs, 0, null, $objecttmp); @@ -358,10 +363,18 @@ if (! $error && $massaction == 'confirm_presend') $substitutionarray['__CHECK_READ__'] = ''; $parameters=array('mode'=>'formemail'); + + if ( ! empty( $listofobjectthirdparties ) ) { + $parameters['listofobjectthirdparties'] = $listofobjectthirdparties; + } + if ( ! empty( $listofobjectref ) ) { + $parameters['listofobjectref'] = $listofobjectref; + } + complete_substitutions_array($substitutionarray, $langs, $objecttmp, $parameters); - $subject=make_substitutions($subject, $substitutionarray); - $message=make_substitutions($message, $substitutionarray); + $subjectreplaced=make_substitutions($subject, $substitutionarray); + $messagereplaced=make_substitutions($message, $substitutionarray); $filepath = $attachedfiles['paths']; $filename = $attachedfiles['names']; @@ -370,8 +383,8 @@ if (! $error && $massaction == 'confirm_presend') //var_dump($filepath); // Send mail (substitutionarray must be done just before this) - require_once(DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'); - $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,$sendtobcc,$deliveryreceipt,-1); + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($subjectreplaced, $sendto, $from, $messagereplaced, $filepath, $mimetype, $filename, $sendtocc, $sendtobcc, $deliveryreceipt, -1); if ($mailfile->error) { $resaction.='
'.$mailfile->error.'
'; @@ -386,8 +399,12 @@ if (! $error && $massaction == 'confirm_presend') $error=0; // Insert logs into agenda - foreach($listofqualifiedobj as $objid => $objectobj) + foreach($listofqualifiedobj as $objid2 => $objectobj2) { + if ((! $oneemailperrecipient) && $objid2 != $objectid) continue; // We discard this pass to avoid duplicate with other pass in looparray at higher level + + dol_syslog("Try to insert email event into agenda for objid=".$objid2." => objectobj=".get_class($objectobj2)); + /*if ($objectclass == 'Propale') $actiontypecode='AC_PROP'; if ($objectclass == 'Commande') $actiontypecode='AC_COM'; if ($objectclass == 'Facture') $actiontypecode='AC_FAC'; @@ -399,18 +416,18 @@ if (! $error && $massaction == 'confirm_presend') if ($message) { if ($sendtocc) $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('Bcc') . ": " . $sendtocc); - $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subject); + $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('MailTopic') . ": " . $subjectreplaced); $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); - $actionmsg = dol_concatdesc($actionmsg, $message); + $actionmsg = dol_concatdesc($actionmsg, $messagereplaced); } $actionmsg2=''; // Initialisation donnees - $objectobj->sendtoid = 0; - $objectobj->actionmsg = $actionmsg; // Long text - $objectobj->actionmsg2 = $actionmsg2; // Short text - $objectobj->fk_element = $objid; - $objectobj->elementtype = $objectobj->element; + $objectobj2->sendtoid = 0; + $objectobj2->actionmsg = $actionmsg; // Long text + $objectobj2->actionmsg2 = $actionmsg2; // Short text + $objectobj2->fk_element = $objid2; + $objectobj2->elementtype = $objectobj2->element; $triggername = strtoupper(get_class($objectobj)) .'_SENTBYMAIL'; if ($triggername == 'SOCIETE_SENTBYMAIL') $triggername = 'COMPANY_SENTBYEMAIL'; @@ -425,9 +442,9 @@ if (! $error && $massaction == 'confirm_presend') if (! empty($triggername)) { // Appel des triggers - include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); + include_once DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"; $interface=new Interfaces($db); - $result=$interface->run_triggers($triggername, $objectobj, $user, $langs, $conf); + $result=$interface->run_triggers($triggername, $objectobj2, $user, $langs, $conf); if ($result < 0) { $error++; $errors=$interface->errors; } // Fin appel triggers @@ -437,9 +454,9 @@ if (! $error && $massaction == 'confirm_presend') dol_syslog("Error in trigger ".$triggername.' '.$db->lasterror(), LOG_ERR); } } - - $nbsent++; } + + $nbsent++; // Nb of email sent (may be lower than number of record selected if we group thirdparties) } else { @@ -504,6 +521,8 @@ if ($massaction == 'confirm_createbills') $objecttmp = new Facture($db); if (!empty($createbills_onebythird) && !empty($TFactThird[$cmd->socid])) $objecttmp = $TFactThird[$cmd->socid]; // If option "one bill per third" is set, we use already created order. else { + // Load extrafields of order + $cmd->fetch_optionals(); $objecttmp->socid = $cmd->socid; $objecttmp->type = Facture::TYPE_STANDARD; @@ -521,6 +540,8 @@ if ($massaction == 'confirm_createbills') $objecttmp->origin = 'commande'; $objecttmp->origin_id = $id_order; + $objecttmp->array_options = $cmd->array_options; // Copy extrafields + $res = $objecttmp->create($user); if($res > 0) $nb_bills_created++; @@ -560,6 +581,12 @@ if ($massaction == 'confirm_createbills') for ($i=0;$i<$num;$i++) { $desc=($lines[$i]->desc?$lines[$i]->desc:$lines[$i]->libelle); + // If we build one invoice for several order, we must put the invoice of order on the line + if (! empty($createbills_onebythird)) + { + $desc=dol_concatdesc($desc, $langs->trans("Order").' '.$cmd->ref.' - '.dol_print_date($cmd->date, 'day', $langs)); + } + if ($lines[$i]->subprice < 0) { // Negative line, we create a discount line @@ -670,6 +697,7 @@ if ($massaction == 'confirm_createbills') if (! $error && $validate_invoices) { $massaction = $action = 'builddoc'; + foreach($TAllFact as &$objecttmp) { $result = $objecttmp->validate($user); @@ -687,7 +715,12 @@ if ($massaction == 'confirm_createbills') $donotredirect = 1; $upload_dir = $conf->facture->dir_output; $permissioncreate=$user->rights->facture->creer; + + // Call action to build doc + $savobject = $object; + $object = $objecttmp; include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; + $object = $savobject; } $massaction = $action = 'confirm_createbills'; @@ -696,7 +729,7 @@ if ($massaction == 'confirm_createbills') if (! $error) { $db->commit(); - setEventMessage($langs->trans('BillCreated', $nb_bills_created)); + setEventMessages($langs->trans('BillCreated', $nb_bills_created), null, 'mesgs'); // Make a redirect to avoid to bill twice if we make a refresh or back $param=''; From 252bd6d9ba7122447790e6d48c83e4dd64474762 Mon Sep 17 00:00:00 2001 From: John Botella Date: Thu, 20 Jun 2019 09:48:08 +0200 Subject: [PATCH 0926/1036] FIX condition --- htdocs/core/tpl/massactions_pre.tpl.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 48989b2daec..0a273072e29 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -36,11 +36,12 @@ if ($massaction == 'presend') { $langs->load("mails"); + $listofselectedid = array(); + $listofselectedthirdparties = array(); + $listofselectedref = array(); + if (! GETPOST('cancel', 'alpha')) { - $listofselectedid = array(); - $listofselectedthirdparties = array(); - $listofselectedref = array(); foreach ($arrayofselected as $toselectid) { $result = $objecttmp->fetch($toselectid); @@ -106,7 +107,7 @@ if ($massaction == 'presend') $formmail->withtoreadonly = 1; } - $formmail->withoptiononeemailperrecipient = empty($liste)?0:((GETPOST('oneemailperrecipient')=='on')?1:-1); + $formmail->withoptiononeemailperrecipient = (count($listofselectedref) == 1 || empty($liste))? 0 : ((GETPOST('oneemailperrecipient')=='on')?1:-1); $formmail->withto = empty($liste)?(GETPOST('sendto','alpha')?GETPOST('sendto','alpha'):array()):$liste; $formmail->withtofree = empty($liste)?1:0; $formmail->withtocc = 1; From 9305403bea79f07eef481067718110e03172dab5 Mon Sep 17 00:00:00 2001 From: John Botella Date: Thu, 20 Jun 2019 10:32:32 +0200 Subject: [PATCH 0927/1036] Fix duplicate pdf in mass sendmail --- htdocs/core/actions_massactions.inc.php | 40 ++++++++++++++++++++----- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index c40bd73eff5..1d3d4b2adea 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -69,6 +69,8 @@ if (! $error && $massaction == 'confirm_presend') $listofobjectid=array(); $listofobjectthirdparties=array(); $listofobjectref=array(); + $attachedfilesThirdpartyObj=array(); + $oneemailperrecipient=(GETPOST('oneemailperrecipient')=='on'?1:0); if (! $error) { @@ -193,7 +195,6 @@ if (! $error && $massaction == 'confirm_presend') $sendtocc=implode(',',$tmparray); //var_dump($listofobjectref);exit; - $attachedfiles=array('paths'=>array(), 'names'=>array(), 'mimes'=>array()); $listofqualifiedobj=array(); $listofqualifiedref=array(); $thirdpartywithoutemail=array(); @@ -263,12 +264,12 @@ if (! $error && $massaction == 'confirm_presend') if (dol_is_file($file)) { - // Create form object - $attachedfiles=array( - 'paths'=>array_merge($attachedfiles['paths'],array($file)), - 'names'=>array_merge($attachedfiles['names'],array($filename)), - 'mimes'=>array_merge($attachedfiles['mimes'],array($mime)) - ); + // Create form object + $attachedfilesThirdpartyObj[$thirdpartyid][$objectid]=array( + 'paths'=>array($file), + 'names'=>array($filename), + 'mimes'=>array($mime) + ); } else { @@ -334,7 +335,7 @@ if (! $error && $massaction == 'confirm_presend') if ($objectclass == 'FactureFournisseur') $sendtobcc .= (empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO) ? '' : (($sendtobcc?", ":"").$conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO)); // $listofqualifiedobj is array with key = object id and value is instance of qualified objects, for the current thirdparty (but thirdparty property is not loaded yet) - $oneemailperrecipient=(GETPOST('oneemailperrecipient')=='on'?1:0); + $looparray=array(); if (! $oneemailperrecipient) { @@ -376,10 +377,33 @@ if (! $error && $massaction == 'confirm_presend') $subjectreplaced=make_substitutions($subject, $substitutionarray); $messagereplaced=make_substitutions($message, $substitutionarray); + $attachedfiles=array('paths'=>array(), 'names'=>array(), 'mimes'=>array()); + if($oneemailperrecipient) + { + if(is_array($attachedfilesThirdpartyObj[$thirdparty->id]) && count($attachedfilesThirdpartyObj[$thirdparty->id])) + { + foreach ($attachedfilesThirdpartyObj[$thirdparty->id] as $keyObjId => $objAttachedFiles){ + // Create form object + $attachedfiles=array( + 'paths'=>array_merge($attachedfiles['paths'], $objAttachedFiles['paths']), + 'names'=>array_merge($attachedfiles['names'], $objAttachedFiles['names']), + 'mimes'=>array_merge($attachedfiles['mimes'], $objAttachedFiles['mimes']) + ); + } + } + } + elseif(!empty($attachedfilesThirdpartyObj[$thirdparty->id][$objectid])){ + // Create form object + $attachedfiles=$attachedfilesThirdpartyObj[$thirdparty->id][$objectid]; + } + $filepath = $attachedfiles['paths']; $filename = $attachedfiles['names']; $mimetype = $attachedfiles['mimes']; + + + //var_dump($filepath); // Send mail (substitutionarray must be done just before this) From 6a68c8cd996318c4d5997de97035157bddfbd87e Mon Sep 17 00:00:00 2001 From: John Botella Date: Thu, 20 Jun 2019 11:09:37 +0200 Subject: [PATCH 0928/1036] Fix display option email per participient --- htdocs/core/actions_massactions.inc.php | 3 +++ htdocs/core/tpl/massactions_pre.tpl.php | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 1d3d4b2adea..300c06216f7 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -377,9 +377,11 @@ if (! $error && $massaction == 'confirm_presend') $subjectreplaced=make_substitutions($subject, $substitutionarray); $messagereplaced=make_substitutions($message, $substitutionarray); + $attachedfiles=array('paths'=>array(), 'names'=>array(), 'mimes'=>array()); if($oneemailperrecipient) { + // if "one email per recipient" isn't check we must collate $attachedfiles by thirdparty if(is_array($attachedfilesThirdpartyObj[$thirdparty->id]) && count($attachedfilesThirdpartyObj[$thirdparty->id])) { foreach ($attachedfilesThirdpartyObj[$thirdparty->id] as $keyObjId => $objAttachedFiles){ @@ -394,6 +396,7 @@ if (! $error && $massaction == 'confirm_presend') } elseif(!empty($attachedfilesThirdpartyObj[$thirdparty->id][$objectid])){ // Create form object + // if "one email per recipient" isn't check we must separate $attachedfiles by object $attachedfiles=$attachedfilesThirdpartyObj[$thirdparty->id][$objectid]; } diff --git a/htdocs/core/tpl/massactions_pre.tpl.php b/htdocs/core/tpl/massactions_pre.tpl.php index 0a273072e29..e525bd739a3 100644 --- a/htdocs/core/tpl/massactions_pre.tpl.php +++ b/htdocs/core/tpl/massactions_pre.tpl.php @@ -107,7 +107,8 @@ if ($massaction == 'presend') $formmail->withtoreadonly = 1; } - $formmail->withoptiononeemailperrecipient = (count($listofselectedref) == 1 || empty($liste))? 0 : ((GETPOST('oneemailperrecipient')=='on')?1:-1); + $formmail->withoptiononeemailperrecipient = ((count($listofselectedref) == 1 && count(reset($listofselectedref)) == 1) || empty($liste)) ? 0 : ((GETPOST('oneemailperrecipient')=='on')?1:-1); + $formmail->withto = empty($liste)?(GETPOST('sendto','alpha')?GETPOST('sendto','alpha'):array()):$liste; $formmail->withtofree = empty($liste)?1:0; $formmail->withtocc = 1; @@ -126,6 +127,7 @@ if ($massaction == 'presend') // Make substitution in email content $substitutionarray = getCommonSubstitutionArray($langs, 0, null, $object); + $substitutionarray['__EMAIL__'] = $sendto; $substitutionarray['__CHECK_READ__'] = (is_object($object) && is_object($object->thirdparty)) ? '' : ''; $substitutionarray['__PERSONALIZED__'] = ''; // deprecated From b21006614c874e9a59c7f25d2a711a0795474a11 Mon Sep 17 00:00:00 2001 From: John Botella Date: Thu, 20 Jun 2019 12:00:44 +0200 Subject: [PATCH 0929/1036] Fix substitutions null --- htdocs/core/class/html.formmail.class.php | 1 - htdocs/core/lib/functions.lib.php | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 9b9bb32865e..38987b36185 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -908,7 +908,6 @@ class FormMail extends Form $defaultmessage=preg_replace("/^(
)+/","",$defaultmessage); $defaultmessage=preg_replace("/^\n+/","",$defaultmessage); } - $out.= ''; $out.= ''.$langs->trans("MailText").''; $out.= ''; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 7a70608f303..05024437a63 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5733,6 +5733,8 @@ function make_substitutions($text, $substitutionarray, $outputlangs=null) // Make substitition for array $substitutionarray foreach ($substitutionarray as $key => $value) { + if (! isset($value)) continue; // If value is null, it same than not having substitution key at all into array, we do not replace. + if ($key == '__SIGNATURE__' && (! empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))) $value=''; // Protection if ($key == '__USER_SIGNATURE__' && (! empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))) $value=''; // Protection From 0865bdb60f77460b969b730f9bd175bfd90a660b Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Thu, 20 Jun 2019 12:16:48 +0200 Subject: [PATCH 0930/1036] fix depending extrafeilds list --- htdocs/core/class/commonobject.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 78729519775..006c80428f7 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -6446,7 +6446,7 @@ abstract class CommonObject jQuery(document).ready(function() { function showOptions(child_list, parent_list) { - var val = $("select[name=\"options_"+parent_list+"\"]").val(); + var val = $("select[name=\""+parent_list+"\"]").val(); var parentVal = parent_list + ":" + val; if(val > 0) { $("select[name=\""+child_list+"\"] option[parent]").hide(); From 1a6dc83d4c886cb69c5c845dd6339fc9f71e3522 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 12:25:58 +0200 Subject: [PATCH 0931/1036] Fix: default accounting account for eec and export sales were not used. --- htdocs/accountancy/customer/list.php | 66 +++++++++++++------ htdocs/accountancy/supplier/list.php | 44 ++++++++----- .../fourn/class/fournisseur.product.class.php | 6 +- htdocs/langs/en_US/accountancy.lang | 3 + htdocs/product/class/product.class.php | 14 ++-- 5 files changed, 90 insertions(+), 43 deletions(-) diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 5314099db1f..192585ccedd 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -92,9 +92,6 @@ if (! $user->rights->accounting->bind->write) $hookmanager->initHooks(array('accountancycustomerlist')); $formaccounting = new FormAccounting($db); -$accounting = new AccountingAccount($db); -$aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT, 1); -$aarowid_p = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT, 1); $chartaccountcode = dol_getIdFromCode($db, $conf->global->CHARTOFACCOUNTS, 'accounting_system', 'rowid', 'pcg_version'); @@ -384,11 +381,11 @@ if ($result) { print ''; print ''; //print ''; - print ''; + print ''; print ''; print ''; print ''; - print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth200', 'code2', 1, 0, 1); + print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth150', 'code2', 1, 0, 1); //print ''; print ''; print ''; @@ -444,29 +441,50 @@ if ($result) { $isBuyerInEEC = isInEEC($objp); + $suggestedaccountingaccountbydefaultfor = ''; if ($objp->type_l == 1) { - $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : ''); - if ($objp->aarowid == '') { - $objp->aarowid_suggest = $aarowid_s; - } + if ($objp->country_code == $mysoc->country_code || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country) + $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : ''); + $suggestedaccountingaccountbydefaultfor = ''; + } else { + if ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale + $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_INTRA_ACCOUNT : ''); + $suggestedaccountingaccountbydefaultfor = 'eec'; + } else { // Foreign sale + $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_SERVICE_SOLD_EXPORT_ACCOUNT : ''); + $suggestedaccountingaccountbydefaultfor = 'export'; + } + } } elseif ($objp->type_l == 0) { - $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : ''); - if ($objp->aarowid == '') { - $objp->aarowid_suggest = $aarowid_p; + if ($objp->country_code == $mysoc->country_code || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country) + $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT : ''); + $suggestedaccountingaccountbydefaultfor = ''; + } else { + if ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale + $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_INTRA_ACCOUNT : ''); + $suggestedaccountingaccountbydefaultfor = 'eec'; + } else { + $objp->code_sell_l = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT) ? $conf->global->ACCOUNTING_PRODUCT_SOLD_EXPORT_ACCOUNT : ''); + $suggestedaccountingaccountbydefaultfor = 'export'; + } } } if ($objp->code_sell_l == -1) $objp->code_sell_l=''; + $suggestedaccountingaccountfor = ''; if ($objp->country_code == $mysoc->country_code || empty($objp->country_code)) { // If buyer in same country than seller (if not defined, we assume it is same country) $objp->code_sell_p = $objp->code_sell; $objp->aarowid_suggest = $objp->aarowid; + $suggestedaccountingaccountfor = ''; } else { if ($isSellerInEEC && $isBuyerInEEC) { // European intravat sale $objp->code_sell_p = $objp->code_sell_intra; $objp->aarowid_suggest = $objp->aarowid_intra; + $suggestedaccountingaccountfor = 'eec'; } else { // Foreign sale $objp->code_sell_p = $objp->code_sell_export; $objp->aarowid_suggest = $objp->aarowid_export; + $suggestedaccountingaccountfor = 'export'; } } @@ -477,8 +495,8 @@ if ($result) { } if (empty($objp->code_sell_l) && empty($objp->code_sell_p)) $code_sell_p_notset = 'color:red'; - // $objp->code_sell_p is now code of product/service // $objp->code_sell_l is now default code of product/service + // $objp->code_sell_p is now code of product/service print ''; @@ -492,7 +510,7 @@ if ($result) { // Ref Product print ''; - if ($product_static->id) + if ($product_static->id > 0) print $product_static->getNomUrl(1); if ($objp->product_label) print '
'.$objp->product_label; print ''; @@ -514,7 +532,7 @@ if ($result) { print vatrate($objp->tva_tx_line.($objp->vat_src_code?' ('.$objp->vat_src_code.')':'')); print ''; - print ''; + print ''; $labelcountry=($objp->country_code && ($langs->trans("Country".$objp->country_code)!="Country".$objp->country_code))?$langs->trans("Country".$objp->country_code):$objp->country_label; print $labelcountry; print ''; @@ -523,17 +541,27 @@ if ($result) { // Current account print ''; - print (($objp->type_l == 1)?$langs->trans("DefaultForService"):$langs->trans("DefaultForProduct")) . ' = ' . ($objp->code_sell_l > 0 ? length_accountg($objp->code_sell_l) : $langs->trans("Unknown")); - if ($objp->product_id > 0) + $s = (($objp->type_l == 1)?$langs->trans("DefaultForService"):$langs->trans("DefaultForProduct")).': '; + $shelp = ''; + if ($suggestedaccountingaccountbydefaultfor == 'eec') $shelp.= $langs->trans("SaleEEC"); + elseif ($suggestedaccountingaccountbydefaultfor == 'export') $shelp.= $langs->trans("SaleExport"); + $s.= ($objp->code_sell_l > 0 ? length_accountg($objp->code_sell_l) : $langs->trans("NotDefined")); + print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1); + if ($objp->product_id > 0) { print '
'; - print (($objp->type_l == 1)?$langs->trans("ThisService"):$langs->trans("ThisProduct")) . ' = ' . (empty($objp->code_sell_p) ? $langs->trans("Unknown") : length_accountg($objp->code_sell_p)); + $s = (($objp->type_l == 1)?$langs->trans("ThisService"):$langs->trans("ThisProduct")).': '; + $shelp = ''; + if ($suggestedaccountingaccountfor == 'eec') $shelp = $langs->trans("SaleEEC"); + elseif ($suggestedaccountingaccountfor == 'export') $shelp = $langs->trans("SaleExport"); + $s.= (empty($objp->code_sell_p) ? $langs->trans("NotDefined") : length_accountg($objp->code_sell_p)); + print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1); } print ''; // Suggested accounting account print ''; - print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); + print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'); print ''; // Column with checkbox diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 17284513650..b3a426bbf5e 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -332,8 +332,8 @@ if ($result) { if ($search_desc) $param.='&search_desc='.urlencode($search_desc); if ($search_amount) $param.='&search_amount='.urlencode($search_amount); if ($search_vat) $param.='&search_vat='.urlencode($search_vat); - if ($search_country) $param .= "&search_country=" . urlencode($search_country); - if ($search_tvaintra) $param .= "&search_tvaintra=" . urlencode($search_tvaintra); + if ($search_country) $param.="&search_country=".urlencode($search_country); + if ($search_tvaintra) $param.="&search_tvaintra=".urlencode($search_tvaintra); $arrayofmassactions = array( 'ventil'=>$langs->trans("Ventilate") @@ -382,11 +382,11 @@ if ($result) { print ''; print ''; //print ''; - print ''; + print ''; print ''; print ''; print ''; - print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth200', 'code2', 1, 0, 1); + print $form->select_country($search_country, 'search_country', '', 0, 'maxwidth150', 'code2', 1, 0, 1); //print ''; print ''; print ''; @@ -418,7 +418,7 @@ if ($result) { print "\n"; $facturefourn_static = new FactureFournisseur($db); - $productfourn_static = new ProductFournisseur($db); + $product_static = new Product($db); while ($i < min($num_lines, $limit)) { $objp = $db->fetch_object($result); @@ -430,10 +430,10 @@ if ($result) { $objp->code_buy_p = ''; $objp->aarowid_suggest = ''; - $productfourn_static->ref = $objp->product_ref; - $productfourn_static->id = $objp->product_id; - $productfourn_static->type = $objp->type; - $productfourn_static->label = $objp->product_label; + $product_static->ref = $objp->product_ref; + $product_static->id = $objp->product_id; + $product_static->type = $objp->type; + $product_static->label = $objp->product_label; $facturefourn_static->ref = $objp->ref; $facturefourn_static->id = $objp->facid; @@ -479,8 +479,8 @@ if ($result) { // Ref product print ''; - if ($productfourn_static->id) - print $productfourn_static->getNomUrl(1); + if ($product_static->id > 0) + print $product_static->getNomUrl(1); if ($objp->product_label) print '
'.$objp->product_label; print ''; @@ -502,26 +502,38 @@ if ($result) { print vatrate($objp->tva_tx_line.($objp->vat_src_code?' ('.$objp->vat_src_code.')':'')); print ''; - print ''; + // Country + print ''; $labelcountry=($objp->country_code && ($langs->trans("Country".$objp->country_code)!="Country".$objp->country_code))?$langs->trans("Country".$objp->country_code):$objp->country_label; print $labelcountry; print ''; + // VAT Num print '' . $objp->tva_intra . ''; // Current account print ''; - print (($objp->type_l == 1)?$langs->trans("DefaultForService"):$langs->trans("DefaultForProduct")) . ' = ' . ($objp->code_buy_l > 0 ? length_accountg($objp->code_buy_l) : $langs->trans("Unknown")); + $s = (($objp->type_l == 1)?$langs->trans("DefaultForService"):$langs->trans("DefaultForProduct")).': '; + $shelp = ''; + if ($suggestedaccountingaccountbydefaultfor == 'eec') $shelp.= $langs->trans("SaleEEC"); + elseif ($suggestedaccountingaccountbydefaultfor == 'export') $shelp.= $langs->trans("SaleExport"); + $s.= ($objp->code_buy_l > 0 ? length_accountg($objp->code_buy_l) : $langs->trans("NotDefined")); + print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1); if ($objp->product_id > 0) { - print '
'; - print (($objp->type_l == 1)?$langs->trans("ThisService"):$langs->trans("ThisProduct")) . ' = ' . (empty($objp->code_buy_p) ? $langs->trans("Unknown") : length_accountg($objp->code_buy_p)); + print '
'; + $s = (($objp->type_l == 1)?$langs->trans("ThisService"):$langs->trans("ThisProduct")).': '; + $shelp = ''; + if ($suggestedaccountingaccountfor == 'eec') $shelp = $langs->trans("SaleEEC"); + elseif ($suggestedaccountingaccountfor == 'export') $shelp = $langs->trans("SaleExport"); + $s.= (empty($objp->code_buy_p) ? $langs->trans("NotDefined") : length_accountg($objp->code_buy_p)); + print $form->textwithpicto($s, $shelp, 1, 'help', '', 0, 2, '', 1); } print ''; // Suggested accounting account print ''; - print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); + print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'codeventil maxwidth200 maxwidthonsmartphone', 'cachewithshowemptyone'); print ''; // Column with checkbox diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index f2384b13cf2..fc74890f150 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -1009,7 +1009,8 @@ class ProductFournisseur extends Product /** - * Return a link to the object card (with optionaly the picto) + * Return a link to the object card (with optionaly the picto). + * Used getNomUrl of ProductFournisseur if a specific supplier ref is loaded. Otherwise use Product->getNomUrl(). * * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto) * @param string $option On what the link point to ('nolink', ...) @@ -1025,11 +1026,10 @@ class ProductFournisseur extends Product if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips $result = ''; - $companylink = ''; $label = '' . $langs->trans("SupplierRef") . ''; $label.= '
'; - $label.= '' . $langs->trans('Ref') . ': ' . $this->fourn_ref; + $label.= '' . $langs->trans('Ref') . ': ' . $this->ref_supplier; $logPrices = $this->listProductFournisseurPriceLog($this->product_fourn_price_id, 'pfpl.datec', 'DESC'); // set sort order here if (is_array($logPrices) && count($logPrices) > 0) { diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 7797fdef7b1..3a08e422600 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -316,6 +316,9 @@ WithoutValidAccount=Without valid dedicated account WithValidAccount=With valid dedicated account ValueNotIntoChartOfAccount=This value of accounting account does not exist into chart of account AccountRemovedFromGroup=Account removed from group +SaleLocal=Local sale +SaleExport=Export sale +SaleEEC=Sale in EEC ## Dictionary Range=Range of accounting account diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index de0d28cee83..a5491045c16 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -4059,16 +4059,18 @@ class Product extends CommonObject } } - $linkstart = ''; $linkend=''; $result.=$linkstart; if ($withpicto) { - if ($this->type == Product::TYPE_PRODUCT) { $result.=(img_object(($notooltip?'':$label), 'product', ($notooltip?'class="paddingright"':'class="paddingright classfortooltip"'), 0, 0, $notooltip?0:1)); + if ($this->type == Product::TYPE_PRODUCT) { + $result.=(img_object(($notooltip?'':$label), 'product', ($notooltip?'class="paddingright"':'class="paddingright classfortooltip"'), 0, 0, $notooltip?0:1)); } - if ($this->type == Product::TYPE_SERVICE) { $result.=(img_object(($notooltip?'':$label), 'service', ($notooltip?'class="paddinright"':'class="paddingright classfortooltip"'), 0, 0, $notooltip?0:1)); + if ($this->type == Product::TYPE_SERVICE) { + $result.=(img_object(($notooltip?'':$label), 'service', ($notooltip?'class="paddinright"':'class="paddingright classfortooltip"'), 0, 0, $notooltip?0:1)); } } $result.= $newref; @@ -4078,8 +4080,10 @@ class Product extends CommonObject $hookmanager->initHooks(array('productdao')); $parameters=array('id'=>$this->id, 'getnomurl'=>$result); $reshook=$hookmanager->executeHooks('getNomUrl', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks - if ($reshook > 0) { $result = $hookmanager->resPrint; - } else { $result .= $hookmanager->resPrint; + if ($reshook > 0) { + $result = $hookmanager->resPrint; + } else { + $result .= $hookmanager->resPrint; } return $result; From cb057e9c6db20b120fbebb0b11239cfb554904d1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 12:32:14 +0200 Subject: [PATCH 0932/1036] NEW Add hidden option to be ready for BREXIT --- htdocs/core/lib/company.lib.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index c3b9bcec2cf..1e27cb112d3 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -649,6 +649,8 @@ function getFormeJuridiqueLabel($code) */ function getCountriesInEEC() { + global $conf; + // List of all country codes that are in europe for european vat rules // List found on http://ec.europa.eu/taxation_customs/common/faq/faq_1179_en.htm#9 $country_code_in_EEC=array( @@ -687,6 +689,12 @@ function getCountriesInEEC() //'CH', // Switzerland - No. Swizerland in not in EEC ); + if (! empty($conf->global->MAIN_COUNTRIES_IN_EEC)) + { + // For example MAIN_COUNTRIES_IN_EEC = 'AT,BE,BG,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,NL,HU,IE,IM,IT,LT,LU,LV,MC,MT,PL,PT,RO,SE,SK,SI,UK' + $country_code_in_EEC = explode(',', $conf->global->MAIN_COUNTRIES_IN_EEC); + } + return $country_code_in_EEC; } From 6e069385bc054a2bd2c0032f32f500cfc755b3eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 12:32:38 +0200 Subject: [PATCH 0933/1036] Update doc --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index e0f4159c49e..9b91afd128f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -114,6 +114,7 @@ NEW: Option in workflow module to set a reception billed on validate supplier bi NEW: Autocompletion on lists should be available on mobile applications. NEW: Add mass action to close several members. NEW: Add hidden option ADD_UNSPLASH_LOGIN_BACKGROUND for random background +NEW: Add hidden option to be ready for BREXIT For Developers: NEW: Module "DebugBar" is available as a stable module. From bff6260983d0a47f49d04f4e6b1629023b1e013a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 12:34:29 +0200 Subject: [PATCH 0934/1036] Fix syntax error --- htdocs/accountancy/journal/bankjournal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 0f22789d630..a9009e725b8 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -172,7 +172,7 @@ if ($result) { // Variables $account_supplier = (($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER != "") ? $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER : 'NotDefined'); // NotDefined is a reserved word - $account_customer = ($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER != "") ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : 'NotDefined'); // NotDefined is a reserved word + $account_customer = (($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER != "") ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : 'NotDefined'); // NotDefined is a reserved word $account_employee = (! empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) ? $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT : 'NotDefined'); // NotDefined is a reserved word $account_pay_vat = (! empty($conf->global->ACCOUNTING_VAT_PAY_ACCOUNT) ? $conf->global->ACCOUNTING_VAT_PAY_ACCOUNT : 'NotDefined'); // NotDefined is a reserved word $account_pay_donation = (! empty($conf->global->DONATION_ACCOUNTINGACCOUNT) ? $conf->global->DONATION_ACCOUNTINGACCOUNT : 'NotDefined'); // NotDefined is a reserved word From afb63623178365f31be9b37658f805ead993c4b5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 20 Jun 2019 13:37:06 +0200 Subject: [PATCH 0935/1036] Fix look and feel v10 Fix link to direct debit payment order --- htdocs/accountancy/admin/accountmodel.php | 4 +- htdocs/accountancy/admin/categories_list.php | 2 +- htdocs/accountancy/admin/closure.php | 5 +- htdocs/accountancy/admin/defaultaccounts.php | 3 +- htdocs/accountancy/admin/export.php | 5 +- htdocs/accountancy/admin/productaccount.php | 2 +- .../class/accountancyexport.class.php | 78 +++++++++---------- htdocs/accountancy/journal/bankjournal.php | 4 +- .../journal/expensereportsjournal.php | 2 +- .../accountancy/journal/purchasesjournal.php | 2 +- htdocs/accountancy/journal/sellsjournal.php | 2 +- htdocs/admin/dict.php | 3 +- htdocs/compta/bank/bankentries_list.php | 12 ++- .../class/bonprelevement.class.php | 70 +++++++++++++---- htdocs/langs/en_US/banks.lang | 2 +- htdocs/langs/en_US/withdrawals.lang | 4 +- 16 files changed, 121 insertions(+), 79 deletions(-) diff --git a/htdocs/accountancy/admin/accountmodel.php b/htdocs/accountancy/admin/accountmodel.php index f44ff0071d2..102d268e218 100644 --- a/htdocs/accountancy/admin/accountmodel.php +++ b/htdocs/accountancy/admin/accountmodel.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2015 Laurent Destailleur + * Copyright (C) 2004-2019 Laurent Destailleur * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2010-2016 Juanjo Menent @@ -462,8 +462,6 @@ $linkback=''; print load_fiche_titre($titre, $linkback, 'title_accountancy'); -print "
\n"; - // Confirmation de la suppression de la ligne if ($action == 'delete') diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 3a55e092d94..e7cdc800aee 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -412,7 +412,7 @@ $titlepicto='title_setup'; print load_fiche_titre($titre, $linkback, $titlepicto); -print $langs->trans("AccountingAccountGroupsDesc", $langs->transnoentitiesnoconv("ByPersonalizedAccountGroups")).'

'; +print ''.$langs->trans("AccountingAccountGroupsDesc", $langs->transnoentitiesnoconv("ByPersonalizedAccountGroups")).'

'; // Confirmation de la suppression de la ligne if ($action == 'delete') diff --git a/htdocs/accountancy/admin/closure.php b/htdocs/accountancy/admin/closure.php index a638d598ac9..479dd410f33 100644 --- a/htdocs/accountancy/admin/closure.php +++ b/htdocs/accountancy/admin/closure.php @@ -21,9 +21,8 @@ * \ingroup Accountancy (Double entries) * \brief Setup page to configure accounting expert module */ -require '../../main.inc.php'; -// Class +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; @@ -89,7 +88,7 @@ llxHeader(); $linkback = ''; print load_fiche_titre($langs->trans('MenuClosureAccounts'), $linkback, 'title_accountancy'); -print $langs->trans("DefaultClosureDesc").'
'; +print ''.$langs->trans("DefaultClosureDesc").'
'; print '
'; print '
'; diff --git a/htdocs/accountancy/admin/defaultaccounts.php b/htdocs/accountancy/admin/defaultaccounts.php index cba9ac92f3b..079e3585341 100644 --- a/htdocs/accountancy/admin/defaultaccounts.php +++ b/htdocs/accountancy/admin/defaultaccounts.php @@ -78,7 +78,6 @@ $list_account = array ( $accounting_mode = empty($conf->global->ACCOUNTING_MODE) ? 'RECETTES-DEPENSES' : $conf->global->ACCOUNTING_MODE; - if (GETPOST('change_chart', 'alpha')) { $chartofaccounts = GETPOST('chartofaccounts', 'int'); @@ -132,7 +131,7 @@ llxHeader(); $linkback = ''; print load_fiche_titre($langs->trans('MenuDefaultAccounts'), $linkback, 'title_accountancy'); -print $langs->trans("DefaultBindingDesc").'
'; +print ''.$langs->trans("DefaultBindingDesc").'
'; print '
'; print ''; diff --git a/htdocs/accountancy/admin/export.php b/htdocs/accountancy/admin/export.php index 74090e54120..81dc83b2ae5 100644 --- a/htdocs/accountancy/admin/export.php +++ b/htdocs/accountancy/admin/export.php @@ -76,6 +76,7 @@ $model_option = array ( ), ); + /* * Actions */ @@ -138,6 +139,7 @@ $form = new Form($db); // $linkback = '' . $langs->trans("BackToModuleList") . ''; print load_fiche_titre($langs->trans('ConfigAccountingExpert'), $linkback, 'title_setup'); + print "\n".'