From 29b31bd7abb03899ee590aabe2cee2e89114d87b Mon Sep 17 00:00:00 2001 From: ATM john Date: Thu, 11 Apr 2019 00:38:44 +0200 Subject: [PATCH 001/139] 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 @@ + +/* - - - - - - - -
-

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 036/139] 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 037/139] 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 038/139] 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 039/139] 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 040/139] 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 041/139] 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 79a347ab115052a7b1c723e87cf2c92b8c5a273c Mon Sep 17 00:00:00 2001 From: Francis Appels Date: Mon, 13 May 2019 22:49:43 +0200 Subject: [PATCH 042/139] 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 60d00e2f5c6e6878c5ced7e6a3ef0fa449f5d62b Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 14 May 2019 06:46:06 +0200 Subject: [PATCH 043/139] 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 044/139] 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 045/139] 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 046/139] 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 047/139] 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 048/139] 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 049/139] 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 050/139] __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 051/139] 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 052/139] 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 053/139] 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 054/139] 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 055/139] 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 056/139] 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 057/139] 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 058/139] 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 059/139] 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 060/139] 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 061/139] 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 062/139] 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 063/139] 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 064/139] 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 065/139] 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 066/139] 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 067/139] 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 068/139] 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 069/139] 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 070/139] 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 071/139] 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 072/139] 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 073/139] 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 074/139] 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 075/139] 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 076/139] 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 077/139] 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 078/139] 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 079/139] 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 080/139] 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 081/139] 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 082/139] 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 083/139] 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 084/139] 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 085/139] 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 086/139] 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 087/139] 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 088/139] 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 089/139] 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 090/139] 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 091/139] 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 092/139] 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 093/139] 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 094/139] 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 095/139] 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 096/139] 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 097/139] 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 098/139] 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 099/139] 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 100/139] 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 101/139] 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 102/139] 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 103/139] 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 104/139] 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 105/139] 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 106/139] 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 107/139] 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 108/139] 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 109/139] 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 110/139] 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 4517d84e3a769e91691f7ee4c1f70a2386e2f52c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 18 May 2019 19:22:17 +0200 Subject: [PATCH 111/139] 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 112/139] 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 113/139] 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 114/139] 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 115/139] 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 116/139] 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 117/139] 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 118/139] 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 119/139] 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 120/139] 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 121/139] 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 122/139] 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 123/139] 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 124/139] 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 125/139] 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 d86fc28aba46f06221fc0877e673b2d2a1d24eba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 19 May 2019 13:01:11 +0200 Subject: [PATCH 126/139] 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 127/139] 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 128/139] 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 129/139] 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 130/139] 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 131/139] 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 3c1b860da475bf3311bae1e81bd515026b80631f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 20 May 2019 12:16:39 +0200 Subject: [PATCH 132/139] 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 133/139] 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 134/139] 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 135/139] 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 136/139] 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 137/139] 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 138/139] 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 139/139] 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 '
';