diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 5012ffaf8..c4f873ff5 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -13,7 +13,6 @@ class Kernel extends ConsoleKernel * @var array */ protected $commands = [ - Commands\PMTranslationsPlugins::class ]; /** @@ -34,6 +33,6 @@ class Kernel extends ConsoleKernel */ protected function commands() { - + $this->load(__DIR__ . '/Commands'); } } diff --git a/app/Logging/CustomizeFormatter.php b/app/Logging/CustomizeFormatter.php new file mode 100644 index 000000000..f9846ac5f --- /dev/null +++ b/app/Logging/CustomizeFormatter.php @@ -0,0 +1,22 @@ +getHandlers() as $handler) { + $handler->setFormatter(new LineFormatter(null, null, true, true)); + } + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index a5e730432..e1cbf9613 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -50,17 +50,6 @@ $app->singleton( Handler::class ); -$app->configureMonologUsing(function ($monolog) use ($app) { - $monolog->pushHandler( - (new RotatingFileHandler( - // Set the log path - $app->storagePath() . '/logs/processmaker.log', - // Set the number of daily files you want to keep - $app->make('config')->get('app.log_max_files', 5) - ))->setFormatter(new LineFormatter(null, null, true, true)) - ); -}); - /* |-------------------------------------------------------------------------- | Return The Application diff --git a/bootstrap/classaliasmap.php b/bootstrap/classaliasmap.php index 62e24f3f0..734997540 100644 --- a/bootstrap/classaliasmap.php +++ b/bootstrap/classaliasmap.php @@ -80,7 +80,6 @@ return array( 'ToolBar' => ToolBar::class, 'Tree' => PmTree::class, 'triggerLibrary' => TriggerLibrary::class, - 'Upgrade' => Upgrade::class, 'workspaceTools' => WorkspaceTools::class, 'wsBase' => WsBase::class, 'wsResponse' => WsResponse::class, diff --git a/composer.json b/composer.json index 144aaa1ba..aea8e56d0 100644 --- a/composer.json +++ b/composer.json @@ -27,8 +27,8 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "php": ">=5.6", - "laravel/framework": "5.4.*", + "php": ">=7.1", + "laravel/framework": "5.7.*", "luracast/restler": "^3.0", "bshaffer/oauth2-server-php": "v1.0", "colosa/pmUI": "release/3.3.1-dev", @@ -43,19 +43,21 @@ "phpmailer/phpmailer": "5.2.27", "pear/archive_tar": "1.4.*", "pear/console_getopt": "1.4.*", - "TYPO3/class-alias-loader": "^1.0", + "typo3/class-alias-loader": "^1.0", "ralouphie/getallheaders": "^2.0", "smarty/smarty": "2.6.30", "pdepend/pdepend": "@stable", "chumper/zipper": "^1.0", + "php-imap/php-imap": "^3.0", "nikic/php-parser": "3.1.5", "laravel/tinker": "^1.0" + }, "require-dev": { "fzaninotto/faker": "^1.7", "guzzlehttp/guzzle": "^6.3", "phpunit/phpunit": "~5.7", - "lmc/steward": "^2.2", + "filp/whoops": "~2.0", "behat/behat": "^3.3", "behat/mink-selenium2-driver": "^1.3", "squizlabs/php_codesniffer": "^2.2 || ^3.0.2", @@ -101,7 +103,11 @@ }, "scripts": { "post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility", - "post-update-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility" + "post-update-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility", + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover" + ] }, "extra": { "typo3/class-alias-loader": { diff --git a/composer.lock b/composer.lock index c56712f71..3e87b567a 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "a9ba65f7fb68be7c36dd45b62216b2c6", + "content-hash": "f548a9edab2774eff09bb261eb05c6d0", "packages": [ { "name": "bshaffer/oauth2-server-php", @@ -115,7 +115,7 @@ "source": { "type": "git", "url": "git@bitbucket.org:colosa/michelangelofe.git", - "reference": "4ac7ac3ebd1863c258c3f0e048fd3fff668f0184" + "reference": "0b4c4cd6cea4f3eaa10452423d293ed6aac0d5ab" }, "require": { "colosa/pmui": "release/3.3.1-dev" @@ -126,7 +126,7 @@ "keywords": [ "js app ProcessMaker" ], - "time": "2018-11-29T15:23:08+00:00" + "time": "2018-12-18T17:10:59+00:00" }, { "name": "colosa/pmDynaform", @@ -134,7 +134,7 @@ "source": { "type": "git", "url": "git@bitbucket.org:colosa/pmdynaform.git", - "reference": "e4176c9772842904552997702e549035b6ba641d" + "reference": "42281f63761d18a6dcaf63ff5c612eeb0c6dfa1b" }, "type": "library", "description": "JS Library to render ProcessMaker Dynaforms", @@ -142,7 +142,7 @@ "keywords": [ "js lib ProcessMaker Dynaforms" ], - "time": "2018-11-28T17:54:53+00:00" + "time": "2018-12-10T15:33:17+00:00" }, { "name": "colosa/pmUI", @@ -150,7 +150,7 @@ "source": { "type": "git", "url": "git@bitbucket.org:colosa/pmui.git", - "reference": "711b9796c7b5ad4363b9177d0969ec4abecc8d2e" + "reference": "4449e02225bc1d351907ceee79b2411b428df517" }, "type": "library", "description": "JS UI Library", @@ -158,7 +158,7 @@ "keywords": [ "js lib ProcessMaker UI" ], - "time": "2018-11-16T14:26:15+00:00" + "time": "2018-12-18T17:11:02+00:00" }, { "name": "dapphp/securimage", @@ -244,33 +244,33 @@ }, { "name": "doctrine/inflector", - "version": "v1.1.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" + "reference": "5527a48b7313d15261292c149e55e26eae771b0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -307,20 +307,191 @@ "singularize", "string" ], - "time": "2015-11-06T14:35:42+00:00" + "time": "2018-01-09T20:05:19+00:00" }, { - "name": "erusev/parsedown", - "version": "1.7.1", + "name": "doctrine/lexer", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" + "url": "https://github.com/doctrine/lexer.git", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", - "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "^4.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-06-08T11:03:04+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2019-03-31T00:38:28+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.9", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "128cc721d771ec2c46ce59698f4ca42b73f71b25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/128cc721d771ec2c46ce59698f4ca42b73f71b25", + "reference": "128cc721d771ec2c46ce59698f4ca42b73f71b25", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.35||^5.7||^6.0", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2019-06-23T10:14:27+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/6d893938171a817f4e9bc9e86f2da1e370b7bcd7", + "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7", "shasum": "" }, "require": { @@ -353,7 +524,7 @@ "markdown", "parser" ], - "time": "2018-03-08T01:11:30+00:00" + "time": "2019-03-17T18:48:37+00:00" }, { "name": "geshi/geshi", @@ -427,7 +598,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -438,6 +609,189 @@ ], "time": "2015-10-16T22:11:08+00:00" }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "9f83dded91781a01c63574e387eaa769be769115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2018-12-04T20:46:45+00:00" + }, { "name": "jakub-onderka/php-console-color", "version": "v0.2", @@ -527,42 +881,94 @@ "time": "2018-09-29T18:48:56+00:00" }, { - "name": "laravel/framework", - "version": "v5.4.36", + "name": "kylekatarnls/update-helper", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9" + "url": "https://github.com/kylekatarnls/update-helper.git", + "reference": "b34a46d7f5ec1795b4a15ac9d46b884377262df9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/1062a22232071c3e8636487c86ec1ae75681bbf9", - "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9", + "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/b34a46d7f5ec1795b4a15ac9d46b884377262df9", + "reference": "b34a46d7f5ec1795b4a15ac9d46b884377262df9", "shasum": "" }, "require": { - "doctrine/inflector": "~1.1", - "erusev/parsedown": "~1.6", + "composer-plugin-api": "^1.1.0", + "php": ">=5.3.0" + }, + "require-dev": { + "codeclimate/php-test-reporter": "dev-master", + "composer/composer": "^2.0.x-dev", + "phpunit/phpunit": ">=4.8.35 <6.0" + }, + "type": "composer-plugin", + "extra": { + "class": "UpdateHelper\\ComposerPlugin" + }, + "autoload": { + "psr-0": { + "UpdateHelper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Update helper", + "time": "2019-06-05T08:34:23+00:00" + }, + { + "name": "laravel/framework", + "version": "v5.7.28", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "8e69728f1c80a024588adbd24c65c4fcf9aa9192" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/8e69728f1c80a024588adbd24c65c4fcf9aa9192", + "reference": "8e69728f1c80a024588adbd24c65c4fcf9aa9192", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.1", + "dragonmantank/cron-expression": "^2.0", + "erusev/parsedown": "^1.7", "ext-mbstring": "*", "ext-openssl": "*", - "league/flysystem": "~1.0", - "monolog/monolog": "~1.11", - "mtdowling/cron-expression": "~1.0", - "nesbot/carbon": "~1.20", - "paragonie/random_compat": "~1.4|~2.0", - "php": ">=5.6.4", - "ramsey/uuid": "~3.0", - "swiftmailer/swiftmailer": "~5.4", - "symfony/console": "~3.2", - "symfony/debug": "~3.2", - "symfony/finder": "~3.2", - "symfony/http-foundation": "~3.2", - "symfony/http-kernel": "~3.2", - "symfony/process": "~3.2", - "symfony/routing": "~3.2", - "symfony/var-dumper": "~3.2", - "tijsverkoyen/css-to-inline-styles": "~2.2", - "vlucas/phpdotenv": "~2.2" + "laravel/nexmo-notification-channel": "^1.0", + "laravel/slack-notification-channel": "^1.0", + "league/flysystem": "^1.0.8", + "monolog/monolog": "^1.12", + "nesbot/carbon": "^1.26.3", + "opis/closure": "^3.1", + "php": "^7.1.3", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^3.7", + "swiftmailer/swiftmailer": "^6.0", + "symfony/console": "^4.1", + "symfony/debug": "^4.1", + "symfony/finder": "^4.1", + "symfony/http-foundation": "^4.1", + "symfony/http-kernel": "^4.1", + "symfony/process": "^4.1", + "symfony/routing": "^4.1", + "symfony/var-dumper": "^4.1", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", + "vlucas/phpdotenv": "^2.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" }, "replace": { "illuminate/auth": "self.version", @@ -577,7 +983,6 @@ "illuminate/database": "self.version", "illuminate/encryption": "self.version", "illuminate/events": "self.version", - "illuminate/exception": "self.version", "illuminate/filesystem": "self.version", "illuminate/hashing": "self.version", "illuminate/http": "self.version", @@ -593,39 +998,50 @@ "illuminate/support": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "tightenco/collect": "self.version" + "illuminate/view": "self.version" }, "require-dev": { - "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.5", - "mockery/mockery": "~0.9.4", - "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~5.7", - "predis/predis": "~1.0", - "symfony/css-selector": "~3.2", - "symfony/dom-crawler": "~3.2" + "aws/aws-sdk-php": "^3.0", + "doctrine/dbal": "^2.6", + "filp/whoops": "^2.1.4", + "guzzlehttp/guzzle": "^6.3", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.0", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.7.*", + "pda/pheanstalk": "^3.0|^4.0", + "phpunit/phpunit": "^7.5", + "predis/predis": "^1.1.1", + "symfony/css-selector": "^4.1", + "symfony/dom-crawler": "^4.1", + "true/punycode": "^2.1" }, "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", - "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", - "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", - "laravel/tinker": "Required to use the tinker console command (~1.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", - "nexmo/client": "Required to use the Nexmo transport (~1.0).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", - "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.2).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.2).", - "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)." + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (^3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "filp/whoops": "Required for friendly error pages in development (^2.1.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (^6.0).", + "laravel/tinker": "Required to use the tinker console command (^1.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "nexmo/client": "Required to use the Nexmo transport (^1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^3.0|^4.0).", + "predis/predis": "Required to use the redis cache and queue drivers (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^3.0).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (^4.1).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (^4.1).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (^1.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.7-dev" } }, "autoload": { @@ -653,7 +1069,121 @@ "framework", "laravel" ], - "time": "2017-08-30T09:26:16+00:00" + "time": "2019-02-26T15:41:34+00:00" + }, + { + "name": "laravel/nexmo-notification-channel", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/nexmo-notification-channel.git", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/nexmo-notification-channel/zipball/03edd42a55b306ff980c9950899d5a2b03260d48", + "reference": "03edd42a55b306ff980c9950899d5a2b03260d48", + "shasum": "" + }, + "require": { + "nexmo/client": "^1.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\NexmoChannelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Nexmo Notification Channel for laravel.", + "keywords": [ + "laravel", + "nexmo", + "notifications" + ], + "time": "2018-12-04T12:57:08+00:00" + }, + { + "name": "laravel/slack-notification-channel", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/slack-notification-channel.git", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/slack-notification-channel/zipball/6e164293b754a95f246faf50ab2bbea3e4923cc9", + "reference": "6e164293b754a95f246faf50ab2bbea3e4923cc9", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1.3" + }, + "require-dev": { + "illuminate/notifications": "~5.7", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + }, + "laravel": { + "providers": [ + "Illuminate\\Notifications\\SlackChannelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Notifications\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Slack Notification Channel for laravel.", + "keywords": [ + "laravel", + "notifications", + "slack" + ], + "time": "2018-12-12T13:12:06+00:00" }, { "name": "laravel/tinker", @@ -719,17 +1249,72 @@ "time": "2018-10-12T19:39:35+00:00" }, { - "name": "league/flysystem", - "version": "1.0.49", + "name": "lcobucci/jwt", + "version": "3.3.1", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd" + "url": "https://github.com/lcobucci/jwt.git", + "reference": "a11ec5f4b4d75d1fcd04e133dede4c317aac9e18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a63cc83d8a931b271be45148fa39ba7156782ffd", - "reference": "a63cc83d8a931b271be45148fa39ba7156782ffd", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a11ec5f4b4d75d1fcd04e133dede4c317aac9e18", + "reference": "a11ec5f4b4d75d1fcd04e133dede4c317aac9e18", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-openssl": "*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "^5.7 || ^7.3", + "squizlabs/php_codesniffer": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Otávio Cobucci Oblonczyk", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "time": "2019-05-24T18:30:49+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.53", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "08e12b7628f035600634a5e76d95b5eb66cea674" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/08e12b7628f035600634a5e76d95b5eb66cea674", + "reference": "08e12b7628f035600634a5e76d95b5eb66cea674", "shasum": "" }, "require": { @@ -800,7 +1385,7 @@ "sftp", "storage" ], - "time": "2018-11-23T23:41:29+00:00" + "time": "2019-06-18T20:09:29+00:00" }, { "name": "libchart/libchart", @@ -828,7 +1413,7 @@ ], "authors": [ { - "name": "Jean-Marc Trémeaux", + "name": "Jean-Marc Tr??meaux", "homepage": "http://naku.dohcrew.com/", "role": "Developer" }, @@ -854,12 +1439,12 @@ "source": { "type": "git", "url": "https://github.com/Luracast/Restler.git", - "reference": "188968f6a15796077350f1be9c461f8d02c559a8" + "reference": "87197eb53b2e429288e9a94d1f0ca9a03d5fbd6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Luracast/Restler/zipball/188968f6a15796077350f1be9c461f8d02c559a8", - "reference": "188968f6a15796077350f1be9c461f8d02c559a8", + "url": "https://api.github.com/repos/Luracast/Restler/zipball/87197eb53b2e429288e9a94d1f0ca9a03d5fbd6c", + "reference": "87197eb53b2e429288e9a94d1f0ca9a03d5fbd6c", "shasum": "" }, "require": { @@ -1005,77 +1590,36 @@ ], "time": "2016-04-12T18:29:35+00:00" }, - { - "name": "mtdowling/cron-expression", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "time": "2017-01-23T04:29:33+00:00" - }, { "name": "nesbot/carbon", - "version": "1.36.1", + "version": "1.39.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983" + "reference": "dd62a58af4e0775a45ea5f99d0363d81b7d9a1e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/63da8cdf89d7a5efe43aabc794365f6e7b7b8983", - "reference": "63da8cdf89d7a5efe43aabc794365f6e7b7b8983", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/dd62a58af4e0775a45ea5f99d0363d81b7d9a1e0", + "reference": "dd62a58af4e0775a45ea5f99d0363d81b7d9a1e0", "shasum": "" }, "require": { + "kylekatarnls/update-helper": "^1.1", "php": ">=5.3.9", "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { + "composer/composer": "^1.2", + "friendsofphp/php-cs-fixer": "~2", "phpunit/phpunit": "^4.8.35 || ^5.7" }, - "suggest": { - "friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.", - "phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors." - }, + "bin": [ + "bin/upgrade-carbon" + ], "type": "library", "extra": { + "update-helper": "Carbon\\Upgrade", "laravel": { "providers": [ "Carbon\\Laravel\\ServiceProvider" @@ -1105,7 +1649,55 @@ "datetime", "time" ], - "time": "2018-11-22T18:23:02+00:00" + "time": "2019-06-11T09:07:59+00:00" + }, + { + "name": "nexmo/client", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/Nexmo/nexmo-php.git", + "reference": "182d41a02ebd3e4be147baea45458ccfe2f528c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nexmo/nexmo-php/zipball/182d41a02ebd3e4be147baea45458ccfe2f528c4", + "reference": "182d41a02ebd3e4be147baea45458ccfe2f528c4", + "shasum": "" + }, + "require": { + "lcobucci/jwt": "^3.2", + "php": ">=5.6", + "php-http/client-implementation": "^1.0", + "php-http/guzzle6-adapter": "^1.0", + "zendframework/zend-diactoros": "^1.8.4 || ^2.0" + }, + "require-dev": { + "estahn/phpunit-json-assertions": "^1.0.0", + "php-http/mock-client": "^0.3.0", + "phpunit/phpunit": "^5.7", + "squizlabs/php_codesniffer": "^3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Nexmo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tim Lytle", + "email": "tim@nexmo.com", + "homepage": "http://twitter.com/tjlytle", + "role": "Developer" + } + ], + "description": "PHP Client for using Nexmo's API.", + "time": "2019-05-13T20:27:43+00:00" }, { "name": "nikic/php-parser", @@ -1159,34 +1751,91 @@ "time": "2018-02-28T20:30:58+00:00" }, { - "name": "paragonie/random_compat", - "version": "v2.0.17", + "name": "opis/closure", + "version": "3.3.0", "source": { "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" + "url": "https://github.com/opis/closure.git", + "reference": "f846725591203098246276b2e7b9e8b7814c4965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", + "url": "https://api.github.com/repos/opis/closure/zipball/f846725591203098246276b2e7b9e8b7814c4965", + "reference": "f846725591203098246276b2e7b9e8b7814c4965", "shasum": "" }, "require": { - "php": ">=5.2.0" + "php": "^5.4 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "time": "2019-05-31T20:04:32+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -1205,7 +1854,7 @@ "pseudorandom", "random" ], - "time": "2018-07-04T16:31:37+00:00" + "time": "2018-07-02T15:55:56+00:00" }, { "name": "pdepend/pdepend", @@ -1249,16 +1898,16 @@ }, { "name": "pear/archive_tar", - "version": "1.4.3", + "version": "1.4.7", "source": { "type": "git", "url": "https://github.com/pear/Archive_Tar.git", - "reference": "43455c960da70e655c6bdf8ea2bc8cc1a6034afb" + "reference": "7e48add6f8edc3027dd98ad15964b1a28fd0c845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/43455c960da70e655c6bdf8ea2bc8cc1a6034afb", - "reference": "43455c960da70e655c6bdf8ea2bc8cc1a6034afb", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/7e48add6f8edc3027dd98ad15964b1a28fd0c845", + "reference": "7e48add6f8edc3027dd98ad15964b1a28fd0c845", "shasum": "" }, "require": { @@ -1269,8 +1918,8 @@ "phpunit/phpunit": "*" }, "suggest": { - "ext-bz2": "bz2 compression support.", - "ext-xz": "lzma2 compression support.", + "ext-bz2": "Bz2 compression support.", + "ext-xz": "Lzma2 compression support.", "ext-zlib": "Gzip compression support." }, "type": "library", @@ -1305,26 +1954,26 @@ "email": "mrook@php.net" } ], - "description": "Tar file management class", + "description": "Tar file management class with compression support (gzip, bzip2, lzma2)", "homepage": "https://github.com/pear/Archive_Tar", "keywords": [ "archive", "tar" ], - "time": "2017-06-11T17:28:11+00:00" + "time": "2019-04-08T13:15:55+00:00" }, { "name": "pear/console_getopt", - "version": "v1.4.1", + "version": "v1.4.2", "source": { "type": "git", "url": "https://github.com/pear/Console_Getopt.git", - "reference": "82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f" + "reference": "6c77aeb625b32bd752e89ee17972d103588b90c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f", - "reference": "82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f", + "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/6c77aeb625b32bd752e89ee17972d103588b90c0", + "reference": "6c77aeb625b32bd752e89ee17972d103588b90c0", "shasum": "" }, "type": "library", @@ -1358,24 +2007,24 @@ } ], "description": "More info available on: http://pear.php.net/package/Console_Getopt", - "time": "2015-07-20T20:28:12+00:00" + "time": "2019-02-06T16:52:33+00:00" }, { "name": "pear/pear-core-minimal", - "version": "v1.10.6", + "version": "v1.10.9", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "052868b244d31f822796e7e9981f62557eb256d4" + "reference": "742be8dd68c746a01e4b0a422258e9c9cae1c37f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/052868b244d31f822796e7e9981f62557eb256d4", - "reference": "052868b244d31f822796e7e9981f62557eb256d4", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/742be8dd68c746a01e4b0a422258e9c9cae1c37f", + "reference": "742be8dd68c746a01e4b0a422258e9c9cae1c37f", "shasum": "" }, "require": { - "pear/console_getopt": "~1.3", + "pear/console_getopt": "~1.4", "pear/pear_exception": "~1.0" }, "replace": { @@ -1402,7 +2051,7 @@ } ], "description": "Minimal set of PEAR core files to be used as composer dependency", - "time": "2018-08-22T19:28:09+00:00" + "time": "2019-03-13T18:15:44+00:00" }, { "name": "pear/pear_exception", @@ -1459,6 +2108,224 @@ ], "time": "2015-02-10T20:07:52+00:00" }, + { + "name": "php-http/guzzle6-adapter", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": ">=5.5.0", + "php-http/httplug": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/adapter-integration-tests": "^0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2016-05-10T06:13:32+00:00" + }, + { + "name": "php-http/httplug", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/promise": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "time": "2016-08-31T08:30:17+00:00" + }, + { + "name": "php-http/promise", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", + "shasum": "" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "time": "2016-01-26T13:27:02+00:00" + }, + { + "name": "php-imap/php-imap", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/barbushin/php-imap.git", + "reference": "d4f8ef4504dfb555857241aa7d1e414a1c229079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barbushin/php-imap/zipball/d4f8ef4504dfb555857241aa7d1e414a1c229079", + "reference": "d4f8ef4504dfb555857241aa7d1e414a1c229079", + "shasum": "" + }, + "require": { + "ext-imap": "*", + "php": ">=5.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpImap\\": "src/PhpImap" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sergey Barbushin", + "email": "barbushin@gmail.com", + "homepage": "http://linkedin.com/in/barbushin" + } + ], + "description": "Manage mailboxes, filter/get/delete emails in PHP (supports IMAP/POP3/NNTP)", + "homepage": "https://github.com/barbushin/php-imap", + "keywords": [ + "imap", + "mail", + "mailbox", + "php", + "pop3", + "receive emails" + ], + "time": "2017-12-22T12:53:34+00:00" + }, { "name": "phpmailer/phpmailer", "version": "v5.2.27", @@ -1478,27 +2345,27 @@ "php": ">=5.0.0" }, "require-dev": { - "doctrine/annotations": "1.2.*", - "jms/serializer": "0.16.*", - "phpdocumentor/phpdocumentor": "2.*", - "phpunit/phpunit": "4.8.*", - "symfony/debug": "2.8.*", - "symfony/filesystem": "2.8.*", - "symfony/translation": "2.8.*", - "symfony/yaml": "2.8.*", - "zendframework/zend-cache": "2.5.1", - "zendframework/zend-config": "2.5.1", - "zendframework/zend-eventmanager": "2.5.1", - "zendframework/zend-filter": "2.5.1", - "zendframework/zend-i18n": "2.5.1", - "zendframework/zend-json": "2.5.1", - "zendframework/zend-math": "2.5.1", - "zendframework/zend-serializer": "2.5.*", - "zendframework/zend-servicemanager": "2.5.*", - "zendframework/zend-stdlib": "2.5.1" + "doctrine/annotations": "1.2.*", + "jms/serializer": "0.16.*", + "phpdocumentor/phpdocumentor": "2.*", + "phpunit/phpunit": "4.8.*", + "symfony/debug": "2.8.*", + "symfony/filesystem": "2.8.*", + "symfony/translation": "2.8.*", + "symfony/yaml": "2.8.*", + "zendframework/zend-cache": "2.5.1", + "zendframework/zend-config": "2.5.1", + "zendframework/zend-eventmanager": "2.5.1", + "zendframework/zend-filter": "2.5.1", + "zendframework/zend-i18n": "2.5.1", + "zendframework/zend-json": "2.5.1", + "zendframework/zend-math": "2.5.1", + "zendframework/zend-serializer": "2.5.*", + "zendframework/zend-servicemanager": "2.5.*", + "zendframework/zend-stdlib": "2.5.1" }, "suggest": { - "league/oauth2-google": "Needed for Google XOAUTH2 authentication" + "league/oauth2-google": "Needed for Google XOAUTH2 authentication" }, "type": "library", "autoload": { @@ -1534,7 +2401,7 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2017-11-04T09:26:05+00:00" + "time": "2018-11-15T22:32:31+00:00" }, { "name": "psr/container", @@ -1585,6 +2452,108 @@ ], "time": "2017-02-14T16:28:37+00:00" }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.0.0", @@ -1623,6 +2592,54 @@ ], "time": "2012-12-21T11:40:51+00:00" }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, { "name": "psy/psysh", "version": "v0.9.9", @@ -1872,29 +2889,37 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v5.4.12", + "version": "v6.2.1", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" + "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", - "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", + "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", "shasum": "" }, "require": { - "php": ">=5.3.3" + "egulias/email-validator": "~2.0", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.2" + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "6.2-dev" } }, "autoload": { @@ -1922,36 +2947,36 @@ "mail", "mailer" ], - "time": "2018-07-31T09:26:32+00:00" + "time": "2019-04-21T09:21:45+00:00" }, { "name": "symfony/config", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8a660daeb65dedbe0b099529f65e61866c055081" + "reference": "9198eea354be75794a7b1064de00d9ae9ae5090f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8a660daeb65dedbe0b099529f65e61866c055081", - "reference": "8a660daeb65dedbe0b099529f65e61866c055081", + "url": "https://api.github.com/repos/symfony/config/zipball/9198eea354be75794a7b1064de00d9ae9ae5090f", + "reference": "9198eea354be75794a7b1064de00d9ae9ae5090f", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0|~4.0", + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/finder": "<3.3" + "symfony/finder": "<3.4" }, "require-dev": { - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/event-dispatcher": "~3.3|~4.0", - "symfony/finder": "~3.3|~4.0", - "symfony/yaml": "~3.0|~4.0" + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/messenger": "~4.1", + "symfony/yaml": "~3.4|~4.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -1959,7 +2984,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -1986,41 +3011,47 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-11-26T10:17:44+00:00" + "time": "2019-06-08T06:33:08+00:00" }, { "name": "symfony/console", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8f80fc39bbc3b7c47ee54ba7aa2653521ace94bb" + "reference": "b592b26a24265a35172d8a2094d8b10f22b7cc39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8f80fc39bbc3b7c47ee54ba7aa2653521ace94bb", - "reference": "8f80fc39bbc3b7c47ee54ba7aa2653521ace94bb", + "url": "https://api.github.com/repos/symfony/console/zipball/b592b26a24265a35172d8a2094d8b10f22b7cc39", + "reference": "b592b26a24265a35172d8a2094d8b10f22b7cc39", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/service-contracts": "^1.1" }, "conflict": { "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3", "symfony/process": "<3.3" }, + "provide": { + "psr/log-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "^4.3", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0", + "symfony/var-dumper": "^4.3" }, "suggest": { - "psr/log-implementation": "For using the console logger", + "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" @@ -2028,7 +3059,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2055,20 +3086,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-11-26T12:48:07+00:00" + "time": "2019-06-13T11:03:18+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.19", + "version": "v3.4.29", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "345b9a48595d1ab9630db791dbc3e721bf0233e8" + "reference": "8ca29297c29b64fb3a1a135e71cb25f67f9fdccf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/345b9a48595d1ab9630db791dbc3e721bf0233e8", - "reference": "345b9a48595d1ab9630db791dbc3e721bf0233e8", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/8ca29297c29b64fb3a1a135e71cb25f67f9fdccf", + "reference": "8ca29297c29b64fb3a1a135e71cb25f67f9fdccf", "shasum": "" }, "require": { @@ -2108,36 +3139,36 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" + "time": "2019-01-16T09:39:14+00:00" }, { "name": "symfony/debug", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "2016b3eec2e49c127dd02d0ef44a35c53181560d" + "reference": "d8f4fb38152e0eb6a433705e5f661d25b32c5fcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/2016b3eec2e49c127dd02d0ef44a35c53181560d", - "reference": "2016b3eec2e49c127dd02d0ef44a35c53181560d", + "url": "https://api.github.com/repos/symfony/debug/zipball/d8f4fb38152e0eb6a433705e5f661d25b32c5fcd", + "reference": "d8f4fb38152e0eb6a433705e5f661d25b32c5fcd", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0" }, "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "symfony/http-kernel": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2164,38 +3195,40 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" + "time": "2019-06-19T15:27:09+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "622b330ced1bdf29d240bd1c364c038f647eb0f5" + "reference": "b851928be349c065197fdc0832f78d85139e3903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/622b330ced1bdf29d240bd1c364c038f647eb0f5", - "reference": "622b330ced1bdf29d240bd1c364c038f647eb0f5", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b851928be349c065197fdc0832f78d85139e3903", + "reference": "b851928be349c065197fdc0832f78d85139e3903", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/container": "^1.0" + "php": "^7.1.3", + "psr/container": "^1.0", + "symfony/service-contracts": "^1.1.2" }, "conflict": { - "symfony/config": "<3.3.7", - "symfony/finder": "<3.3", + "symfony/config": "<4.3", + "symfony/finder": "<3.4", "symfony/proxy-manager-bridge": "<3.4", "symfony/yaml": "<3.4" }, "provide": { - "psr/container-implementation": "1.0" + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/config": "^4.3", + "symfony/expression-language": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -2208,7 +3241,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2235,34 +3268,41 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2018-11-20T16:14:23+00:00" + "time": "2019-06-15T04:08:07+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d365fc4416ec4980825873962ea5d1b1bca46f1a" + "reference": "d257021c1ab28d48d24a16de79dfab445ce93398" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d365fc4416ec4980825873962ea5d1b1bca46f1a", - "reference": "d365fc4416ec4980825873962ea5d1b1bca46f1a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d257021c1ab28d48d24a16de79dfab445ce93398", + "reference": "d257021c1ab28d48d24a16de79dfab445ce93398", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" }, "conflict": { - "symfony/dependency-injection": "<3.3" + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "^3.4|^4.0", + "symfony/service-contracts": "^1.1", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", @@ -2271,7 +3311,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2298,30 +3338,88 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-11-26T10:17:44+00:00" + "time": "2019-06-13T11:03:18+00:00" }, { - "name": "symfony/filesystem", - "version": "v3.4.19", + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b49b1ca166bd109900e6a1683d9bb1115727ef2d" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c61766f4440ca687de1084a5c00b08e167a2575c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b49b1ca166bd109900e6a1683d9bb1115727ef2d", - "reference": "b49b1ca166bd109900e6a1683d9bb1115727ef2d", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c61766f4440ca687de1084a5c00b08e167a2575c", + "reference": "c61766f4440ca687de1084a5c00b08e167a2575c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-06-20T06:46:26+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b9896d034463ad6fd2bf17e2bf9418caecd6313d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b9896d034463ad6fd2bf17e2bf9418caecd6313d", + "reference": "b9896d034463ad6fd2bf17e2bf9418caecd6313d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2348,29 +3446,29 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" + "time": "2019-06-23T08:51:25+00:00" }, { "name": "symfony/finder", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "6cf2be5cbd0e87aa35c01f80ae0bf40b6798e442" + "reference": "33c21f7d5d3dc8a140c282854a7e13aeb5d0f91a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6cf2be5cbd0e87aa35c01f80ae0bf40b6798e442", - "reference": "6cf2be5cbd0e87aa35c01f80ae0bf40b6798e442", + "url": "https://api.github.com/repos/symfony/finder/zipball/33c21f7d5d3dc8a140c282854a7e13aeb5d0f91a", + "reference": "33c21f7d5d3dc8a140c282854a7e13aeb5d0f91a", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2397,34 +3495,35 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" + "time": "2019-06-13T11:03:18+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ea61dd57c4399b0b2a4162e1820cd9d0783acd38" + "reference": "e1b507fcfa4e87d192281774b5ecd4265370180d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ea61dd57c4399b0b2a4162e1820cd9d0783acd38", - "reference": "ea61dd57c4399b0b2a4162e1820cd9d0783acd38", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e1b507fcfa4e87d192281774b5ecd4265370180d", + "reference": "e1b507fcfa4e87d192281774b5ecd4265370180d", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "php": "^7.1.3", + "symfony/mime": "^4.3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "predis/predis": "~1.0", + "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2451,34 +3550,37 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-11-26T10:17:44+00:00" + "time": "2019-06-26T09:25:00+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "78528325d90e5ad54a6e9eca750fe176932bc4fa" + "reference": "4150f71e27ed37a74700561b77e3dbd754cbb44d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/78528325d90e5ad54a6e9eca750fe176932bc4fa", - "reference": "78528325d90e5ad54a6e9eca750fe176932bc4fa", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4150f71e27ed37a74700561b77e3dbd754cbb44d", + "reference": "4150f71e27ed37a74700561b77e3dbd754cbb44d", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", - "symfony/polyfill-ctype": "~1.8" + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "^4.3", + "symfony/http-foundation": "^4.1.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php73": "^1.9" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", - "symfony/var-dumper": "<3.3", + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -2486,34 +3588,34 @@ }, "require-dev": { "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.10|^4.0.10", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", + "symfony/browser-kit": "^4.3", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "^4.3", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/translation-contracts": "^1.1", + "symfony/var-dumper": "^4.1.1", + "twig/twig": "^1.34|^2.4" }, "suggest": { "symfony/browser-kit": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", - "symfony/finder": "", "symfony/var-dumper": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2540,20 +3642,79 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-11-26T14:04:48+00:00" + "time": "2019-06-26T14:26:16+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "name": "symfony/mime", + "version": "v4.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "url": "https://github.com/symfony/mime.git", + "reference": "ec2c5565de60e03f33d4296a655e3273f0ad1f8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/mime/zipball/ec2c5565de60e03f33d4296a655e3273f0ad1f8b", + "reference": "ec2c5565de60e03f33d4296a655e3273f0ad1f8b", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "egulias/email-validator": "^2.0", + "symfony/dependency-injection": "~3.4|^4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2019-06-04T09:22:54+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "82ebae02209c21113908c229e9883c419720738a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", + "reference": "82ebae02209c21113908c229e9883c419720738a", "shasum": "" }, "require": { @@ -2565,7 +3726,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -2598,20 +3759,141 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.10.0", + "name": "symfony/polyfill-iconv", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", + "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-03-04T13:44:35+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", "shasum": "" }, "require": { @@ -2623,7 +3905,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -2657,35 +3939,89 @@ "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { - "name": "symfony/polyfill-php70", - "version": "v1.10.0", + "name": "symfony/polyfill-php72", + "version": "v1.11.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224", - "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", + "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" }, "files": [ "bootstrap.php" @@ -2708,7 +4044,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -2716,29 +4052,29 @@ "portable", "shim" ], - "time": "2018-09-21T06:26:08+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/process", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "abb46b909dd6ba0b50e10d4c10ffe6ee96dd70f2" + "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/abb46b909dd6ba0b50e10d4c10ffe6ee96dd70f2", - "reference": "abb46b909dd6ba0b50e10d4c10ffe6ee96dd70f2", + "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c", + "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2765,43 +4101,42 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-11-20T16:10:26+00:00" + "time": "2019-05-30T16:10:05+00:00" }, { "name": "symfony/routing", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "86eb1a581279b5e40ca280a4f63a15e37d51d16c" + "reference": "2ef809021d72071c611b218c47a3bf3b17b7325e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/86eb1a581279b5e40ca280a4f63a15e37d51d16c", - "reference": "86eb1a581279b5e40ca280a4f63a15e37d51d16c", + "url": "https://api.github.com/repos/symfony/routing/zipball/2ef809021d72071c611b218c47a3bf3b17b7325e", + "reference": "2ef809021d72071c611b218c47a3bf3b17b7325e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/config": "<3.3.1", - "symfony/dependency-injection": "<3.3", + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { - "doctrine/annotations": "~1.0", + "doctrine/annotations": "~1.2", "psr/log": "~1.0", - "symfony/config": "^3.3.1|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/config": "~4.2", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", - "symfony/dependency-injection": "For loading routes from a service", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", "symfony/yaml": "For using the YAML loader" @@ -2809,7 +4144,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2842,37 +4177,103 @@ "uri", "url" ], - "time": "2018-11-26T08:40:22+00:00" + "time": "2019-06-26T13:54:39+00:00" }, { - "name": "symfony/translation", - "version": "v3.4.19", + "name": "symfony/service-contracts", + "version": "v1.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "bdbe940ed3ef4179f86032086c32d3a858becc0f" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bdbe940ed3ef4179f86032086c32d3a858becc0f", - "reference": "bdbe940ed3ef4179f86032086c32d3a858becc0f", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", + "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-06-13T11:15:36+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/934ab1d18545149e012aa898cf02e9f23790f7a0", + "reference": "934ab1d18545149e012aa898cf02e9f23790f7a0", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^1.1.2" }, "conflict": { - "symfony/config": "<2.8", + "symfony/config": "<3.4", "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, + "provide": { + "symfony/translation-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/intl": "^2.8.18|^3.2.5|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/intl": "~3.4|~4.0", + "symfony/service-contracts": "^1.1.2", + "symfony/var-dumper": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -2883,7 +4284,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2910,42 +4311,106 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-11-26T10:17:44+00:00" + "time": "2019-06-13T11:03:18+00:00" }, { - "name": "symfony/var-dumper", - "version": "v3.4.19", + "name": "symfony/translation-contracts", + "version": "v1.1.5", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "6867713afe6c50ade2f34ed6435563b065a52145" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6867713afe6c50ade2f34ed6435563b065a52145", - "reference": "6867713afe6c50ade2f34ed6435563b065a52145", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/cb4b18ad7b92a26e83b65dde940fab78339e6f3c", + "reference": "cb4b18ad7b92a26e83b65dde940fab78339e6f3c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-06-13T11:15:36+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "45d6ef73671995aca565a1aa3d9a432a3ea63f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/45d6ef73671995aca565a1aa3d9a432a3ea63f91", + "reference": "45d6ef73671995aca565a1aa3d9a432a3ea63f91", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" }, "require-dev": { "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -2979,7 +4444,7 @@ "debug", "dump" ], - "time": "2018-11-20T16:10:26+00:00" + "time": "2019-06-17T17:37:00+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -3088,20 +4553,21 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.5.1", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e" + "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", - "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2a7dcf7e3e02dc5e701004e51a6f304b713107d5", + "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.9", + "symfony/polyfill-ctype": "^1.9" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.0" @@ -3109,7 +4575,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -3134,65 +4600,76 @@ "env", "environment" ], - "time": "2018-07-29T20:33:41+00:00" - } - ], - "packages-dev": [ + "time": "2019-01-29T11:11:52+00:00" + }, { - "name": "beberlei/assert", - "version": "v2.9.6", + "name": "zendframework/zend-diactoros", + "version": "2.1.2", "source": { "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "ec9e4cf0b63890edce844ee3922e2b95a526e936" + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "37bf68b428850ee26ed7c3be6c26236dd95a95f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/ec9e4cf0b63890edce844ee3922e2b95a526e936", - "reference": "ec9e4cf0b63890edce844ee3922e2b95a526e936", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/37bf68b428850ee26ed7c3be6c26236dd95a95f1", + "reference": "37bf68b428850ee26ed7c3be6c26236dd95a95f1", "shasum": "" }, "require": { - "ext-mbstring": "*", - "php": ">=5.3" + "php": "^7.1", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.1.1", - "phpunit/phpunit": "^4.8.35|^5.7" + "ext-dom": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^0.5.0", + "php-http/psr7-integration-tests": "dev-master", + "phpunit/phpunit": "^7.0.2", + "zendframework/zend-coding-standard": "~1.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev", + "dev-develop": "2.2.x-dev", + "dev-release-1.8": "1.8.x-dev" + } + }, "autoload": { - "psr-4": { - "Assert\\": "lib/Assert" - }, "files": [ - "lib/Assert/functions.php" - ] + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/marshal_uri_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Zend\\Diactoros\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-2-Clause" + "BSD-3-Clause" ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", + "description": "PSR HTTP Message implementations", "keywords": [ - "assert", - "assertion", - "validation" + "http", + "psr", + "psr-7" ], - "time": "2018-06-11T17:15:25+00:00" - }, + "time": "2019-04-29T21:11:00+00:00" + } + ], + "packages-dev": [ { "name": "behat/behat", "version": "v3.5.0", @@ -3273,16 +4750,16 @@ }, { "name": "behat/gherkin", - "version": "v4.5.1", + "version": "v4.6.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a" + "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a", - "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/ab0a02ea14893860bca00f225f5621d351a3ad07", + "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07", "shasum": "" }, "require": { @@ -3290,8 +4767,8 @@ }, "require-dev": { "phpunit/phpunit": "~4.5|~5", - "symfony/phpunit-bridge": "~2.7|~3", - "symfony/yaml": "~2.3|~3" + "symfony/phpunit-bridge": "~2.7|~3|~4", + "symfony/yaml": "~2.3|~3|~4" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -3328,7 +4805,7 @@ "gherkin", "parser" ], - "time": "2017-08-30T11:04:43+00:00" + "time": "2019-01-16T14:22:17+00:00" }, { "name": "behat/mink", @@ -3493,51 +4970,6 @@ ], "time": "2017-04-04T11:38:05+00:00" }, - { - "name": "clue/graph", - "version": "v0.9.0", - "source": { - "type": "git", - "url": "https://github.com/clue/graph.git", - "reference": "0336a4d5229fa61a20ccceaeab25e52ac9542700" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/graph/zipball/0336a4d5229fa61a20ccceaeab25e52ac9542700", - "reference": "0336a4d5229fa61a20ccceaeab25e52ac9542700", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "graphp/algorithms": "Common graph algorithms, such as Dijkstra and Moore-Bellman-Ford (shortest path), minimum spanning tree (MST), Kruskal, Prim and many more..", - "graphp/graphviz": "GraphViz graph drawing / DOT output" - }, - "type": "library", - "autoload": { - "psr-4": { - "Fhaculty\\Graph\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A mathematical graph/network library written in PHP", - "homepage": "https://github.com/clue/graph", - "keywords": [ - "edge", - "graph", - "mathematical", - "network", - "vertex" - ], - "time": "2015-03-07T18:11:31+00:00" - }, { "name": "container-interop/container-interop", "version": "1.2.0", @@ -3571,32 +5003,34 @@ }, { "name": "doctrine/instantiator", - "version": "1.0.5", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "reference": "a2c590166b2133a4633738648b6b064edae0814a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", + "reference": "a2c590166b2133a4633738648b6b064edae0814a", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "php": "^7.1" }, "require-dev": { - "athletic/athletic": "~0.1.8", + "doctrine/coding-standard": "^6.0", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -3616,212 +5050,72 @@ } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], - "time": "2015-06-14T21:17:01+00:00" + "time": "2019-03-17T17:37:11+00:00" }, { - "name": "facebook/webdriver", - "version": "1.6.0", + "name": "filp/whoops", + "version": "2.1.6", "source": { "type": "git", - "url": "https://github.com/facebook/php-webdriver.git", - "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e" + "url": "https://github.com/filp/whoops.git", + "reference": "92bdc6800ac6e233c9e161a1768e082389a73530" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/bd8c740097eb9f2fc3735250fc1912bc811a954e", - "reference": "bd8c740097eb9f2fc3735250fc1912bc811a954e", + "url": "https://api.github.com/repos/filp/whoops/zipball/92bdc6800ac6e233c9e161a1768e082389a73530", + "reference": "92bdc6800ac6e233c9e161a1768e082389a73530", "shasum": "" }, "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-zip": "*", - "php": "^5.6 || ~7.0", - "symfony/process": "^2.8 || ^3.1 || ^4.0" + "php": "^5.5.9 || ^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "jakub-onderka/php-parallel-lint": "^0.9.2", - "php-coveralls/php-coveralls": "^2.0", - "php-mock/php-mock-phpunit": "^1.1", - "phpunit/phpunit": "^5.7", - "sebastian/environment": "^1.3.4 || ^2.0 || ^3.0", - "squizlabs/php_codesniffer": "^2.6", - "symfony/var-dumper": "^3.3 || ^4.0" + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "^4.8 || ^5.0", + "symfony/var-dumper": "^2.6 || ^3.0" }, "suggest": { - "ext-SimpleXML": "For Firefox profile creation" + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" }, "type": "library", "extra": { "branch-alias": { - "dev-community": "1.5-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { - "Facebook\\WebDriver\\": "lib/" + "Whoops\\": "src/Whoops/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache-2.0" - ], - "description": "A PHP client for Selenium WebDriver", - "homepage": "https://github.com/facebook/php-webdriver", - "keywords": [ - "facebook", - "php", - "selenium", - "webdriver" - ], - "time": "2018-05-16T17:37:13+00:00" - }, - { - "name": "florianwolters/component-core-stringutils", - "version": "v0.3.1", - "source": { - "type": "git", - "url": "https://github.com/FlorianWolters/PHP-Component-Core-StringUtils.git", - "reference": "51978fa9a4d30104192036f0b1f11fc1c3bc4667" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FlorianWolters/PHP-Component-Core-StringUtils/zipball/51978fa9a4d30104192036f0b1f11fc1c3bc4667", - "reference": "51978fa9a4d30104192036f0b1f11fc1c3bc4667", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "autoload": { - "psr-0": { - "FlorianWolters": "src/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0+" + "MIT" ], "authors": [ { - "name": "Florian Wolters", - "email": "wolters.fl@gmail.com", - "homepage": "http://blog.florianwolters.de", + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", "role": "Developer" } ], - "description": "Offers operations on the data type string as a PHP component.", - "homepage": "http://github.com/FlorianWolters/PHP-Component-Core-StringUtils", + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", "keywords": [ - "helper", - "language", - "string", - "wrapper" + "error", + "exception", + "handling", + "library", + "whoops", + "zf2" ], - "time": "2013-07-01T10:24:07+00:00" - }, - { - "name": "florianwolters/component-util-reflection", - "version": "v0.2.0", - "source": { - "type": "git", - "url": "https://github.com/FlorianWolters/PHP-Component-Util-Reflection.git", - "reference": "ffc94b62e2834d7d0306374d952eda7a5abd1844" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FlorianWolters/PHP-Component-Util-Reflection/zipball/ffc94b62e2834d7d0306374d952eda7a5abd1844", - "reference": "ffc94b62e2834d7d0306374d952eda7a5abd1844", - "shasum": "" - }, - "require": { - "florianwolters/component-core-stringutils": ">=0.2-beta", - "php": ">=5.4" - }, - "type": "library", - "autoload": { - "psr-0": { - "FlorianWolters": "src/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0+" - ], - "authors": [ - { - "name": "Florian Wolters", - "email": "wolters.fl@gmail.com", - "homepage": "http://blog.florianwolters.de", - "role": "Developer" - } - ], - "description": "Provides operations for the PHP Reflection API as a PHP component.", - "homepage": "http://github.com/FlorianWolters/PHP-Component-Util-Reflection", - "keywords": [ - "reflection", - "utility" - ], - "time": "2013-03-19T16:42:41+00:00" - }, - { - "name": "florianwolters/component-util-singleton", - "version": "v0.3.2", - "source": { - "type": "git", - "url": "https://github.com/FlorianWolters/PHP-Component-Util-Singleton.git", - "reference": "ab39ba531a38c3b76b4babb0035ce840cde7f443" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FlorianWolters/PHP-Component-Util-Singleton/zipball/ab39ba531a38c3b76b4babb0035ce840cde7f443", - "reference": "ab39ba531a38c3b76b4babb0035ce840cde7f443", - "shasum": "" - }, - "require": { - "florianwolters/component-core-stringutils": "0.3.*", - "florianwolters/component-util-reflection": "0.2.*", - "php": ">=5.4" - }, - "type": "library", - "autoload": { - "psr-0": { - "FlorianWolters": [ - "src/php", - "src/tests/unit-tests/php", - "src/tests/mocks/php" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0+" - ], - "authors": [ - { - "name": "Florian Wolters", - "email": "wolters.fl@gmail.com", - "homepage": "http://blog.florianwolters.de", - "role": "Developer" - } - ], - "description": "The Singleton (and Registry of Singletons a.k.a. Multiton) design pattern as a PHP component.", - "homepage": "http://github.com/FlorianWolters/PHP-Component-Util-Singleton", - "keywords": [ - "creation", - "pattern", - "singleton", - "utility" - ], - "time": "2013-06-29T12:35:22+00:00" + "time": "2017-02-18T14:22:27+00:00" }, { "name": "fzaninotto/faker", @@ -3873,237 +5167,6 @@ ], "time": "2018-07-12T10:23:15+00:00" }, - { - "name": "graphp/algorithms", - "version": "v0.8.1", - "source": { - "type": "git", - "url": "https://github.com/graphp/algorithms.git", - "reference": "81db4049c35730767ec8f97fb5c4844234b86cef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/graphp/algorithms/zipball/81db4049c35730767ec8f97fb5c4844234b86cef", - "reference": "81db4049c35730767ec8f97fb5c4844234b86cef", - "shasum": "" - }, - "require": { - "clue/graph": "~0.9.0|~0.8.0", - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Graphp\\Algorithms\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@lueck.tv" - } - ], - "description": "Common mathematical graph algorithms", - "homepage": "https://github.com/graphp/algorithms", - "keywords": [ - "Graph algorithms", - "dijkstra", - "kruskal", - "minimum spanning tree", - "moore-bellman-ford", - "prim", - "shortest path" - ], - "time": "2015-03-08T10:12:01+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.3.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.3-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2018-04-22T15:46:56+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2017-03-20T17:10:46+00:00" - }, { "name": "instaclick/php-webdriver", "version": "1.4.5", @@ -4163,108 +5226,30 @@ ], "time": "2017-06-30T04:02:48+00:00" }, - { - "name": "lmc/steward", - "version": "2.3.4", - "source": { - "type": "git", - "url": "https://github.com/lmc-eu/steward.git", - "reference": "a4738179a6f3ccee72fa20957c8546c4c53c9ab9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lmc-eu/steward/zipball/a4738179a6f3ccee72fa20957c8546c4c53c9ab9", - "reference": "a4738179a6f3ccee72fa20957c8546c4c53c9ab9", - "shasum": "" - }, - "require": { - "beberlei/assert": "^2.7", - "clue/graph": "~0.9.0", - "doctrine/inflector": "~1.0", - "ext-curl": "*", - "ext-zip": "*", - "facebook/webdriver": "^1.4.0", - "florianwolters/component-util-singleton": "0.3.2", - "graphp/algorithms": "^0.8.1", - "nette/reflection": "^2.4.2", - "ondram/ci-detector": "^2.1", - "php": "^5.6 || ~7.0", - "phpunit/phpunit": "^5.7.11", - "symfony/console": "^3.3.0", - "symfony/event-dispatcher": "~3.0", - "symfony/filesystem": "~3.0", - "symfony/finder": "~3.0", - "symfony/options-resolver": "^3.2", - "symfony/process": "^3.2.0", - "symfony/stopwatch": "^3.0", - "symfony/yaml": "^3.2" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "php-coveralls/php-coveralls": "^1.0.2", - "php-mock/php-mock-phpunit": "~1.0", - "squizlabs/php_codesniffer": "^2.4.1", - "symfony/var-dumper": "^3.2" - }, - "suggest": { - "ext-posix": "For colored output", - "ext-xdebug": "For remote tests debugging" - }, - "bin": [ - "bin/steward", - "bin/steward.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "Lmc\\Steward\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "LMC s.r.o.", - "homepage": "https://github.com/lmc-eu" - } - ], - "description": "Steward - makes Selenium WebDriver + PHPUnit testing easy and robust", - "keywords": [ - "phpunit", - "selenium", - "testing", - "webdriver" - ], - "time": "2018-07-26T22:03:36+00:00" - }, { "name": "myclabs/deep-copy", - "version": "1.7.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" + "phpunit/phpunit": "^7.1" }, "type": "library", "autoload": { @@ -4287,337 +5272,7 @@ "object", "object graph" ], - "time": "2017-10-19T19:58:43+00:00" - }, - { - "name": "nette/caching", - "version": "v2.5.8", - "source": { - "type": "git", - "url": "https://github.com/nette/caching.git", - "reference": "7fba7c7ab2585fafb7b31152f2595e1551120555" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/caching/zipball/7fba7c7ab2585fafb7b31152f2595e1551120555", - "reference": "7fba7c7ab2585fafb7b31152f2595e1551120555", - "shasum": "" - }, - "require": { - "nette/finder": "^2.2 || ~3.0.0", - "nette/utils": "^2.4 || ~3.0.0", - "php": ">=5.6.0" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "latte/latte": "^2.4", - "nette/di": "^2.4 || ~3.0.0", - "nette/tester": "^2.0", - "tracy/tracy": "^2.4" - }, - "suggest": { - "ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "? Nette Caching: library with easy-to-use API and many cache backends.", - "homepage": "https://nette.org", - "keywords": [ - "cache", - "journal", - "memcached", - "nette", - "sqlite" - ], - "time": "2018-03-21T11:04:32+00:00" - }, - { - "name": "nette/finder", - "version": "v2.4.2", - "source": { - "type": "git", - "url": "https://github.com/nette/finder.git", - "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/finder/zipball/ee951a656cb8ac622e5dd33474a01fd2470505a0", - "reference": "ee951a656cb8ac622e5dd33474a01fd2470505a0", - "shasum": "" - }, - "require": { - "nette/utils": "~2.4", - "php": ">=5.6.0" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~2.0", - "tracy/tracy": "^2.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🔍 Nette Finder: find files and directories with an intuitive API.", - "homepage": "https://nette.org", - "keywords": [ - "filesystem", - "glob", - "iterator", - "nette" - ], - "time": "2018-06-28T11:49:23+00:00" - }, - { - "name": "nette/reflection", - "version": "v2.4.2", - "source": { - "type": "git", - "url": "https://github.com/nette/reflection.git", - "reference": "b12327e98ead74e87a1315e0d48182a702adf901" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/reflection/zipball/b12327e98ead74e87a1315e0d48182a702adf901", - "reference": "b12327e98ead74e87a1315e0d48182a702adf901", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "nette/caching": "^2.2 || ^3.0", - "nette/utils": "^2.4 || ^3.0", - "php": ">=5.6.0" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/di": "^2.4 || ^3.0", - "nette/tester": "^2.0", - "tracy/tracy": "^2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "Nette Reflection: docblock annotations parser and common reflection classes", - "homepage": "https://nette.org", - "keywords": [ - "annotation", - "nette", - "reflection" - ], - "time": "2017-07-11T19:28:57+00:00" - }, - { - "name": "nette/utils", - "version": "v2.5.3", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "17b9f76f2abd0c943adfb556e56f2165460b15ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/17b9f76f2abd0c943adfb556e56f2165460b15ce", - "reference": "17b9f76f2abd0c943adfb556e56f2165460b15ce", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "conflict": { - "nette/nette": "<2.2" - }, - "require-dev": { - "nette/tester": "~2.0", - "tracy/tracy": "^2.3" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize() and toAscii()", - "ext-intl": "for script transliteration in Strings::webalize() and toAscii()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ], - "files": [ - "src/loader.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], - "time": "2018-09-18T10:22:16+00:00" - }, - { - "name": "ondram/ci-detector", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/OndraM/ci-detector.git", - "reference": "be3410cb14443796122ca051f4224b5eae06aa76" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/be3410cb14443796122ca051f4224b5eae06aa76", - "reference": "be3410cb14443796122ca051f4224b5eae06aa76", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.12", - "phpunit/phpunit": "^5.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "OndraM\\CiDetector\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "OndÅ™ej Machulda", - "email": "ondrej.machulda@gmail.com" - } - ], - "description": "Detect current continuous integration server and provide unified access to properties of current build", - "keywords": [ - "CircleCI", - "Codeship", - "adapter", - "appveyor", - "bamboo", - "continuous integration", - "gitlab", - "interface", - "jenkins", - "teamcity", - "travis" - ], - "time": "2017-05-26T16:39:57+00:00" + "time": "2019-04-07T13:18:21+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -4675,29 +5330,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.3.2", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", + "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0", + "php": "^7.0", "phpdocumentor/reflection-common": "^1.0.0", "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ @@ -4716,7 +5377,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-10T14:09:06+00:00" + "time": "2019-04-30T17:48:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -4767,16 +5428,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76", + "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76", "shasum": "" }, "require": { @@ -4797,8 +5458,8 @@ } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" + "psr-4": { + "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", @@ -4826,7 +5487,7 @@ "spy", "stub" ], - "time": "2018-08-05T17:53:17+00:00" + "time": "2019-06-13T12:50:23+00:00" }, { "name": "phpunit/php-code-coverage", @@ -5030,29 +5691,29 @@ }, { "name": "phpunit/php-token-stream", - "version": "1.4.12", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" + "reference": "791198a2c6254db10131eecfe8c06670700904db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", - "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^6.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -5075,7 +5736,7 @@ "keywords": [ "tokenizer" ], - "time": "2017-12-04T08:55:13+00:00" + "time": "2017-11-27T05:48:46+00:00" }, { "name": "phpunit/phpunit", @@ -5219,56 +5880,6 @@ "abandoned": true, "time": "2017-06-30T09:13:00+00:00" }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, { "name": "sebastian/code-unit-reverse-lookup", "version": "1.0.1", @@ -5784,16 +6395,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.3.2", + "version": "3.4.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "6ad28354c04b364c3c71a34e4a18b629cc3b231e" + "reference": "b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6ad28354c04b364c3c71a34e4a18b629cc3b231e", - "reference": "6ad28354c04b364c3c71a34e4a18b629cc3b231e", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8", + "reference": "b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8", "shasum": "" }, "require": { @@ -5826,25 +6437,25 @@ } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "http://www.squizlabs.com/php-codesniffer", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ "phpcs", "standards" ], - "time": "2018-09-23T23:08:17+00:00" + "time": "2019-04-10T23:49:02+00:00" }, { "name": "symfony/class-loader", - "version": "v3.4.19", + "version": "v3.4.29", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "420458095cf60025eb0841276717e0da7f75e50e" + "reference": "4459eef5298dedfb69f771186a580062b8516497" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/420458095cf60025eb0841276717e0da7f75e50e", - "reference": "420458095cf60025eb0841276717e0da7f75e50e", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/4459eef5298dedfb69f771186a580062b8516497", + "reference": "4459eef5298dedfb69f771186a580062b8516497", "shasum": "" }, "require": { @@ -5887,127 +6498,24 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v3.4.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "2cf5aa084338c1f67166013aebe87e2026bbe953" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2cf5aa084338c1f67166013aebe87e2026bbe953", - "reference": "2cf5aa084338c1f67166013aebe87e2026bbe953", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony OptionsResolver Component", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "time": "2018-11-11T19:48:54+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v3.4.19", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "0f43969ab2718de55c1c1158dce046668079788d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f43969ab2718de55c1c1158dce046668079788d", - "reference": "0f43969ab2718de55c1c1158dce046668079788d", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" + "time": "2019-01-16T09:39:14+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.19", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "291e13d808bec481eab83f301f7bff3e699ef603" + "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/291e13d808bec481eab83f301f7bff3e699ef603", - "reference": "291e13d808bec481eab83f301f7bff3e699ef603", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c60ecf5ba842324433b46f58dc7afc4487dbab99", + "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -6022,7 +6530,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -6049,24 +6557,25 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-11-11T19:48:54+00:00" + "time": "2019-04-06T14:04:46+00:00" }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "phpunit/phpunit": "^4.6", @@ -6099,20 +6608,20 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2018-12-25T11:19:39+00:00" }, { "name": "wimg/php-compatibility", - "version": "9.0.0", + "version": "9.1.1", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", - "reference": "e9f4047e5edf53c88f36f1dafc0d49454ce13e25" + "reference": "2b63c5d284ab8857f7b1d5c240ddb507a6b2293c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/e9f4047e5edf53c88f36f1dafc0d49454ce13e25", - "reference": "e9f4047e5edf53c88f36f1dafc0d49454ce13e25", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/2b63c5d284ab8857f7b1d5c240ddb507a6b2293c", + "reference": "2b63c5d284ab8857f7b1d5c240ddb507a6b2293c", "shasum": "" }, "require": { @@ -6158,7 +6667,7 @@ "standards" ], "abandoned": "phpcompatibility/php-compatibility", - "time": "2018-10-07T17:38:02+00:00" + "time": "2018-12-30T23:16:27+00:00" } ], "aliases": [], @@ -6173,7 +6682,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=5.6" + "php": ">=7.1" }, "platform-dev": [] } diff --git a/config/app.php b/config/app.php index 651ebfc6a..02c5a1b72 100644 --- a/config/app.php +++ b/config/app.php @@ -9,9 +9,9 @@ return [ 'url' => env('APP_URL', 'http://localhost'), 'env' => env('APP_ENV', 'production'), 'debug' => env('APP_DEBUG', false), - 'log' => env('APP_LOG', 'single'), - 'log_level' => env('APP_LOG_LEVEL', 'debug'), 'cache_lifetime' => env('APP_CACHE_LIFETIME', 60), + 'key' => env('APP_KEY', 'base64:rU28h/tElUn/eiLY0qC24jJq1rakvAFRoRl1DWxj/kM='), + 'cipher' => 'AES-256-CBC', 'timezone' => 'UTC', 'providers' => [ FilesystemServiceProvider::class, @@ -21,10 +21,13 @@ return [ Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, Illuminate\Queue\QueueServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, Laravel\Tinker\TinkerServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, ], 'aliases' => [ + 'Crypt' => Illuminate\Support\Facades\Crypt::class ], ]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 000000000..e8863a3f8 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,85 @@ + env('APP_LOG', env('LOG_CHANNEL', 'daily')), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/processmaker.log'), + 'level' => 'debug', + ], + + 'daily' => [ + 'driver' => 'daily', + 'tap' => [ + App\Logging\CustomizeFormatter::class + ], + 'path' => storage_path('logs/processmaker.log'), + 'level' => env('APP_LOG_LEVEL', 'debug'), + 'days' => $app->make('config')->get('app.log_max_files', 5), + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => 'critical', + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => 'debug', + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => 'debug', + ], + + ], + +]; \ No newline at end of file diff --git a/database/factories/ProcessVariablesFactory.php b/database/factories/ProcessVariablesFactory.php new file mode 100644 index 000000000..6892de0b9 --- /dev/null +++ b/database/factories/ProcessVariablesFactory.php @@ -0,0 +1,21 @@ +define(ProcessVariables::class, function (Faker $faker) { + return [ + 'VAR_UID' => G::generateUniqueID(), + 'PRJ_UID' => G::generateUniqueID(), + 'VAR_NAME' => $faker->word, + 'VAR_FIELD_TYPE' => G::generateUniqueID(), + 'VAR_FIELD_SIZE' => 10, + 'VAR_LABEL' => 'string', + 'VAR_DBCONNECTION' => 'workflow', + 'VAR_SQL' => '', + 'VAR_NULL' => 0, + 'VAR_DEFAULT' => '', + 'VAR_ACCEPTED_VALUES' => '', + 'INP_DOC_UID' => '' + ]; +}); \ No newline at end of file diff --git a/database/factories/TriggerFactory.php b/database/factories/TriggerFactory.php new file mode 100644 index 000000000..e0b9adfe6 --- /dev/null +++ b/database/factories/TriggerFactory.php @@ -0,0 +1,16 @@ +define(Triggers::class, function (Faker $faker) { + return [ + 'TRI_UID' => G::generateUniqueID(), + 'TRI_TITLE' => $faker->sentence(5), + 'TRI_DESCRIPTION' => $faker->text, + 'PRO_UID' => G::generateUniqueID(), + 'TRI_TYPE' => 'SCRIPT', + 'TRI_WEBBOT' => $faker->text, + 'TRI_PARAM' => '', + ]; +}); \ No newline at end of file diff --git a/gulliver/system/class.database_mysql.php b/gulliver/system/class.database_mysql.php index 8191f51db..53888a4ae 100644 --- a/gulliver/system/class.database_mysql.php +++ b/gulliver/system/class.database_mysql.php @@ -519,13 +519,15 @@ class database extends database_base } /** - * execute a sql query + * Execute a sql query * * @param string $query + * @param bool $throwError + * * @return array * @throws Exception */ - public function executeQuery($query) + public function executeQuery($query, $throwError = false) { $this->logQuery($query); @@ -545,7 +547,11 @@ class database extends database_base return $result; } catch (Exception $exception) { $this->logQuery($exception->getMessage()); - return []; + if ($throwError) { + throw $exception; + } else { + return []; + } } } @@ -1012,4 +1018,87 @@ class database extends database_base } return $flag; } + + /** + * Generate drop trigger SQL + * + * @param string $triggerName + * + * @return string + */ + public function getDropTrigger($triggerName) + { + return "DROP TRIGGER IF EXISTS `{$triggerName}`;"; + } + + /** + * Generate alter table with or without adding the indexes + * + * @param string $tableName + * @param array $columns + * @param array $indexes + * + * @return string + */ + public function generateAddColumnsSql($tableName, $columns, $indexes = []) + { + $indexesAlreadyAdded = []; + $sql = 'ALTER TABLE ' . $this->sQuoteCharacter . $tableName . $this->sQuoteCharacter . ' '; + foreach ($columns as $columnName => $parameters) { + if (isset($parameters['Type']) && isset($parameters['Null'])) { + $sql .= 'ADD COLUMN ' . $this->sQuoteCharacter . $columnName . $this->sQuoteCharacter . ' ' . $parameters['Type']; + if ($parameters['Null'] == 'YES') { + $sql .= ' NULL'; + } else { + $sql .= ' NOT NULL'; + } + } + if (isset($parameters['AutoIncrement']) && $parameters['AutoIncrement']) { + $sql .= ' AUTO_INCREMENT'; + } + if (isset($parameters['PrimaryKey']) && $parameters['PrimaryKey']) { + $sql .= ' PRIMARY KEY'; + $indexesAlreadyAdded[] = $columnName; + } + if (isset($parameters['Unique']) && $parameters['Unique']) { + $sql .= ' UNIQUE'; + } + + // We need to check the property AI + if (isset($parameters['AI'])) { + if ($parameters['AI'] == 1) { + $sql .= ' AUTO_INCREMENT'; + } else { + if ($parameters['Default'] != '') { + $sql .= " DEFAULT '" . $parameters['Default'] . "'"; + } + } + } else { + if (isset($parameters['Default'])) { + $sql .= " DEFAULT '" . $parameters['Default'] . "'"; + } + } + $sql .= ', '; + } + foreach ($indexes as $indexName => $indexColumns) { + $indexType = 'INDEX'; + if ($indexName === 'primaryKey' || $indexName === 'PRIMARY') { + $indexType = 'PRIMARY'; + $indexName = 'KEY'; + // If is primary key is not needed add a new index, the column already was added like primary key + if (count($indexColumns) == 1 && $indexesAlreadyAdded == $indexColumns) { + continue; + } + } + $sql .= 'ADD ' . $indexType . ' ' . $indexName . ' ('; + foreach ($indexColumns as $column) { + $sql .= $this->sQuoteCharacter . $column . $this->sQuoteCharacter . ', '; + } + $sql = substr($sql, 0, -2); + $sql .= '), '; + } + $sql = rtrim($sql, ', '); + + return $sql; + } } diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index 7df1fd296..0aceb2881 100644 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -5060,11 +5060,308 @@ class G public static function reservedWordsSql() { //Reserved words SQL - $reservedWordsSql = array("ACCESSIBLE","ACTION","ADD","ALL","ALTER","ANALYZE","AND","ANY","AS","ASC","ASENSITIVE","AUTHORIZATION","BACKUP","BEFORE","BEGIN","BETWEEN","BIGINT","BINARY","BIT","BLOB","BOTH","BREAK","BROWSE","BULK","BY","CALL","CASCADE","CASE","CHANGE","CHAR","CHARACTER","CHECK","CHECKPOINT","CLOSE","CLUSTERED","COALESCE","COLLATE","COLUMN","COMMIT","COMPUTE","CONDITION","CONSTRAINT","CONTAINS","CONTAINSTABLE","CONTINUE","CONVERT","CREATE","CROSS","CURRENT","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURSOR","DATABASE","DATABASES","DATE","DAY_HOUR","DAY_MICROSECOND","DAY_MINUTE","DAY_SECOND","DBCC","DEALLOCATE","DEC","DECIMAL","DECLARE","DEFAULT","DELAYED","DELETE","DENY","DESC","DESCRIBE","DETERMINISTIC","DISK","DISTINCT","DISTINCTROW", - "DISTRIBUTED","DIV","DOUBLE","DROP","DUAL","DUMMY","DUMP","EACH","ELSE","ELSEIF","ENCLOSED","END","ENUM","ERRLVL","ESCAPE","ESCAPED","EXCEPT","EXEC","EXECUTE","EXISTS","EXIT","EXPLAIN","FALSE","FETCH","FILE","FILLFACTOR","FLOAT","FLOAT4","FLOAT8","FOR","FORCE","FOREIGN","FREETEXT","FREETEXTTABLE","FROM","FULL","FULLTEXT","FUNCTION","GENERAL","GOTO","GRANT","GROUP","HAVING","HIGH_PRIORITY","HOLDLOCK","HOUR_MICROSECOND","HOUR_MINUTE","HOUR_SECOND","IDENTITY","IDENTITYCOL","IDENTITY_INSERT","IF","IGNORE","IGNORE_SERVER_IDS","IN","INDEX","INFILE","INNER","INOUT","INSENSITIVE","INSERT","INT","INT1","INT2","INT3","INT4","INT8","INTEGER","INTERSECT","INTERVAL","INTO","IS","ITERATE","JOIN","KEY","KEYS","KILL","LEADING","LEAVE","LEFT","LIKE","LIMIT","LINEAR","LINENO","LINES", - "LOAD","LOCALTIME","LOCALTIMESTAMP","LOCK","LONG","LONGBLOB","LONGTEXT","LOOP","LOW_PRIORITY","MASTER_HEARTBEAT_PERIOD","MASTER_SSL_VERIFY_SERVER_CERT","MATCH","MAXVALUE","MEDIUMBLOB","MEDIUMINT","MEDIUMTEXT","MIDDLEINT","MINUTE_MICROSECOND","MINUTE_SECOND","MOD","MODIFIES","NATIONAL","NATURAL","NO","NOCHECK","NONCLUSTERED","NOT","NO_WRITE_TO_BINLOG","NULL","NULLIF","NUMERIC","OF","OFF","OFFSETS","ON","OPEN","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","OPTIMIZE","OPTION","OPTIONALLY","OR","ORDER","OUT","OUTER","OUTFILE","OVER","PERCENT","PLAN","PRECISION","PRIMARY","PRINT","PROC","PROCEDURE","PUBLIC","PURGE","RAISERROR","RANGE","READ","READS","READTEXT","READ_WRITE","REAL","RECONFIGURE","REFERENCES","REGEXP","RELEASE","RENAME","REPEAT","REPLACE", - "REPLICATION","REQUIRE","RESIGNAL","RESTORE","RESTRICT","RETURN","REVOKE","RIGHT","RLIKE","ROLLBACK","ROWCOUNT","ROWGUIDCOL","RULE","SAVE","SCHEMA","SCHEMAS","SECOND_MICROSECOND","SELECT","SENSITIVE","SEPARATOR","SESSION_USER","SET","SETUSER","SHOW","SHUTDOWN","SIGNAL","SLOW","SMALLINT","SOME","SPATIAL","SPECIFIC","SQL","SQLEXCEPTION","SQLSTATE","SQLWARNING","SQL_BIG_RESULT","SQL_CALC_FOUND_ROWS","SQL_SMALL_RESULT","SSL","STARTING","STATISTICS","STRAIGHT_JOIN","SYSTEM_USER","TABLE","TERMINATED","TEXT","TEXTSIZE","THEN","TIME","TIMESTAMP","TINYBLOB","TINYINT","TINYTEXT","TO","TOP","TRAILING","TRAN","TRANSACTION","TRIGGER","TRUE","TRUNCATE","TSEQUAL","UNDO","UNION","UNIQUE","UNLOCK","UNSIGNED","UPDATE","UPDATETEXT","USAGE","USE","USER","USING","UTC_DATE","UTC_TIME", - "UTC_TIMESTAMP","VALUES","VARBINARY","VARCHAR","VARCHARACTER","VARYING","VIEW","WAITFOR","WHEN","WHERE","WHILE","WITH","WRITE","WRITETEXT","XOR","YEAR_MONTH","ZEROFILL"); + $reservedWordsSql = [ + "ACCESSIBLE", + "ADD", + "ALL", + "ALTER", + "ANALYZE", + "AND", + "AS", + "ASC", + "ASENSITIVE", + "AUTHORIZATION", + "BEFORE", + "BETWEEN", + "BIGINT", + "BINARY", + "BLOB", + "BOTH", + "BREAK", + "BROWSE", + "BULK", + "BY", + "CALL", + "CASCADE", + "CASE", + "CHANGE", + "CHAR", + "CHARACTER", + "CHECK", + "CHECKPOINT", + "CLUSTERED", + "COLLATE", + "COLUMN", + "COMPUTE", + "CONDITION", + "CONSTRAINT", + "CONTAINSTABLE", + "CONTINUE", + "CONVERT", + "CREATE", + "CROSS", + "CURRENT_DATE", + "CURRENT_TIME", + "CURRENT_TIMESTAMP", + "CURRENT_USER", + "CURSOR", + "DATABASE", + "DATABASES", + "DAY_HOUR", + "DAY_MICROSECOND", + "DAY_MINUTE", + "DAY_SECOND", + "DBCC", + "DEC", + "DECIMAL", + "DECLARE", + "DEFAULT", + "DELAYED", + "DELETE", + "DENY", + "DESC", + "DESCRIBE", + "DETERMINISTIC", + "DISTINCT", + "DISTINCTROW", + "DISTRIBUTED", + "DIV", + "DOUBLE", + "DROP", + "DUAL", + "DUMMY", + "DUMP", + "EACH", + "ELSE", + "ELSEIF", + "ENCLOSED", + "ERRLVL", + "ESCAPED", + "EXCEPT", + "EXEC", + "EXISTS", + "EXIT", + "EXPLAIN", + "FALSE", + "FETCH", + "FILLFACTOR", + "FLOAT", + "FLOAT4", + "FLOAT8", + "FOR", + "FORCE", + "FOREIGN", + "FREETEXT", + "FREETEXTTABLE", + "FROM", + "FULLTEXT", + "GENERATED", + "GET", + "GOTO", + "GRANT", + "GROUP", + "HAVING", + "HIGH_PRIORITY", + "HOLDLOCK", + "HOUR_MICROSECOND", + "HOUR_MINUTE", + "HOUR_SECOND", + "IDENTITY", + "IDENTITYCOL", + "IDENTITY_INSERT", + "IF", + "IGNORE", + "IN", + "INDEX", + "INFILE", + "INNER", + "INOUT", + "INSENSITIVE", + "INSERT", + "INT", + "INT1", + "INT2", + "INT3", + "INT4", + "INT8", + "INTEGER", + "INTERSECT", + "INTERVAL", + "INTO", + "IO_AFTER_GTIDS", + "IO_BEFORE_GTIDS", + "IS", + "ITERATE", + "JOIN", + "KEY", + "KEYS", + "KILL", + "LEADING", + "LEAVE", + "LEFT", + "LIKE", + "LIMIT", + "LINEAR", + "LINENO", + "LINES", + "LOAD", + "LOCALTIME", + "LOCALTIMESTAMP", + "LOCK", + "LONG", + "LONGBLOB", + "LONGTEXT", + "LOOP", + "LOW_PRIORITY", + "MASTER_BIND", + "MASTER_SSL_VERIFY_SERVER_CERT", + "MATCH", + "MAXVALUE", + "MEDIUMBLOB", + "MEDIUMINT", + "MEDIUMTEXT", + "MIDDLEINT", + "MINUTE_MICROSECOND", + "MINUTE_SECOND", + "MOD", + "MODIFIES", + "NATURAL", + "NOCHECK", + "NONCLUSTERED", + "NOT", + "NO_WRITE_TO_BINLOG", + "NULL", + "NULLIF", + "NUMERIC", + "OF", + "OFF", + "OFFSETS", + "ON", + "OPENDATASOURCE", + "OPENQUERY", + "OPENROWSET", + "OPENXML", + "OPTIMIZE", + "OPTIMIZER_COSTS", + "OPTION", + "OPTIONALLY", + "OR", + "ORDER", + "OUT", + "OUTER", + "OUTFILE", + "OVER", + "PARTITION", + "PARSE_GCOL_EXPR", + "PERCENT", + "PLAN", + "PRECISION", + "PRIMARY", + "PRINT", + "PROC", + "PROCEDURE", + "PUBLIC", + "PURGE", + "RAISERROR", + "RANGE", + "READ", + "READS", + "READTEXT", + "READ_WRITE", + "REAL", + "RECONFIGURE", + "REFERENCES", + "REGEXP", + "RELEASE", + "RENAME", + "REPEAT", + "REPLACE", + "REQUIRE", + "RESIGNAL", + "RESTRICT", + "RETURN", + "REVOKE", + "RIGHT", + "RLIKE", + "ROWCOUNT", + "ROWGUIDCOL", + "RULE", + "SAVE", + "SCHEMA", + "SCHEMAS", + "SECOND_MICROSECOND", + "SELECT", + "SENSITIVE", + "SEPARATOR", + "SESSION_USER", + "SET", + "SETUSER", + "SHOW", + "SIGNAL", + "SMALLINT", + "SPATIAL", + "SPECIFIC", + "SQL", + "SQLEXCEPTION", + "SQLSTATE", + "SQLWARNING", + "SQL_AFTER_GTIDS", + "SQL_BEFORE_GTIDS", + "SQL_BIG_RESULT", + "SQL_CALC_FOUND_ROWS", + "SQL_SMALL_RESULT", + "SSL", + "STARTING", + "STATISTICS", + "STORED", + "STRAIGHT_JOIN", + "SYSTEM_USER", + "TABLE", + "TERMINATED", + "TEXTSIZE", + "THEN", + "TINYBLOB", + "TINYINT", + "TINYTEXT", + "TO", + "TOP", + "TRAILING", + "TRAN", + "TRIGGER", + "TRUE", + "TSEQUAL", + "UNDO", + "UNION", + "UNIQUE", + "UNLOCK", + "UNSIGNED", + "UPDATE", + "UPDATETEXT", + "USAGE", + "USE", + "USING", + "UTC_DATE", + "UTC_TIME", + "UTC_TIMESTAMP", + "VALUES", + "VARBINARY", + "VARCHAR", + "VARCHARACTER", + "VARYING", + "VIRTUAL", + "WAITFOR", + "WHEN", + "WHERE", + "WHILE", + "WITH", + "WRITE", + "WRITETEXT", + "XOR", + "YEAR_MONTH", + "ZEROFILL", + "_FILENAME" + ]; + return $reservedWordsSql; } diff --git a/phpunit.xml b/phpunit.xml index 5ec9092ee..a5a5f121f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,7 +15,7 @@ ./tests/workflow/engine/src/ - ./tests/Unit + ./tests/unit ./tests/Performance/ diff --git a/tests/Feature/DBQueryTest.php b/tests/Feature/DBQueryTest.php index f851feafb..1af3c613d 100644 --- a/tests/Feature/DBQueryTest.php +++ b/tests/Feature/DBQueryTest.php @@ -1,43 +1,56 @@ assertCount(1, $results); // Note, we check index 1 because results from executeQuery are 1 indexed, not 0 indexed. - $this->assertArraySubset([ + $expected = [ 'USR_UID' => '00000000000000000000000000000001', 'USR_USERNAME' => 'admin' - ], $results[1]); + ]; + $this->assertArraySubset($expected, $results[1]); } + /** + * Verify the existence of the admin user. + * @test + */ public function testDBFacadeQuery() { - $record = DB::table('USERS')->where([ - 'USR_UID' => '00000000000000000000000000000001' - ])->first(); + $record = DB::table('USERS')->where('USR_UID', '=', '00000000000000000000000000000001')->first(); $this->assertEquals('admin', $record->USR_USERNAME); } + /** + * Verify the execution of a SQL statement common to an MySQL external database. + * @test + */ public function testStandardExecuteQueryWithExternalMySQLDatabase() { // Our test external database is created in our tests/bootstrap.php file @@ -45,12 +58,12 @@ class DBQueryTest extends TestCase $process = factory(Process::class)->create(); // Let's create an external DB to ourselves $externalDB = factory(DbSource::class)->create([ - 'DBS_SERVER' => 'localhost', + 'DBS_SERVER' => config('database.connections.testexternal.host'), 'DBS_PORT' => '3306', - 'DBS_USERNAME' => env('DB_USERNAME'), + 'DBS_USERNAME' => config('database.connections.testexternal.username'), // Remember, we have to do some encryption here @see DbSourceFactory.php - 'DBS_PASSWORD' => \G::encrypt( env('DB_PASSWORD'), 'testexternal') . "_2NnV3ujj3w", - 'DBS_DATABASE_NAME' => 'testexternal', + 'DBS_PASSWORD' => \G::encrypt(env('DB_PASSWORD'), config('database.connections.testexternal.database')) . "_2NnV3ujj3w", + 'DBS_DATABASE_NAME' => config('database.connections.testexternal.database'), 'PRO_UID' => $process->PRO_UID ]); @@ -65,9 +78,13 @@ class DBQueryTest extends TestCase $this->assertEquals('testvalue', $results[1]['value']); } + /** + * Verify the execution of a SQL statement common to an MSSQL external database. + * @test + */ public function testStandardExecuteQueryWithExternalMSSqlDatabase() { - if(!env('RUN_MSSQL_TESTS')) { + if (!env('RUN_MSSQL_TESTS')) { $this->markTestSkipped('MSSQL Related Test Skipped'); } // Our test external database is created in our tests/bootstrap.php file @@ -80,8 +97,8 @@ class DBQueryTest extends TestCase 'DBS_TYPE' => 'mssql', 'DBS_USERNAME' => env('MSSQL_USERNAME'), // Remember, we have to do some encryption here @see DbSourceFactory.php - 'DBS_PASSWORD' => \G::encrypt( env('MSSQL_PASSWORD'), 'testexternal') . "_2NnV3ujj3w", - 'DBS_DATABASE_NAME' => 'testexternal', + 'DBS_PASSWORD' => \G::encrypt(env('MSSQL_PASSWORD'), env('MSSQL_DATABASE')) . "_2NnV3ujj3w", + 'DBS_DATABASE_NAME' => env('MSSQL_DATABASE'), 'PRO_UID' => $process->PRO_UID ]); // Now set our process ID @@ -94,4 +111,4 @@ class DBQueryTest extends TestCase $this->assertCount(1, $results); $this->assertEquals('testvalue', $results[1]['value']); } -} \ No newline at end of file +} diff --git a/tests/WorkflowTestCase.php b/tests/WorkflowTestCase.php index 6e7969149..a2b90118d 100644 --- a/tests/WorkflowTestCase.php +++ b/tests/WorkflowTestCase.php @@ -1,26 +1,37 @@ host = env("DB_HOST"); + $this->user = env("DB_USERNAME"); + $this->password = env("DB_PASSWORD"); + $this->database = env("DB_DATABASE"); //Install Database - $pdo0 = new PDO("mysql:host=".DB_HOST, DB_USER, DB_PASS); - $pdo0->query('DROP DATABASE IF EXISTS '.DB_NAME); - $pdo0->query('CREATE DATABASE '.DB_NAME); - $pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, - DB_PASS); + $pdo0 = new PDO("mysql:host=".$this->host, $this->user, $this->password); + $pdo0->query('DROP DATABASE IF EXISTS '.$this->database); + $pdo0->query('CREATE DATABASE '.$this->database); + $pdo = new PDO("mysql:host=".$this->host.";dbname=".$this->database, $this->user, + $this->password); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); $pdo->exec(file_get_contents(PATH_CORE.'data/mysql/schema.sql')); $pdo->exec(file_get_contents(PATH_RBAC_CORE.'data/mysql/schema.sql')); @@ -39,8 +50,8 @@ class WorkflowTestCase extends TestCase protected function dropDB() { //Install Database - $pdo0 = new PDO("mysql:host=".DB_HOST, DB_USER, DB_PASS); - $pdo0->query('DROP DATABASE IF EXISTS '.DB_NAME); + $pdo0 = new PDO("mysql:host=".$this->host, $this->user, $this->password); + $pdo0->query('DROP DATABASE IF EXISTS '.$this->database); } /** diff --git a/tests/bootstrap.php b/tests/bootstrap.php old mode 100644 new mode 100755 index f45a6b907..ecb0a9f07 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -39,6 +39,11 @@ define('PM_NEW_PROCESS_SAVE', 1006); define('PATH_DATA_SITE', PATH_DATA . 'sites/' . SYS_SYS . '/'); define("PATH_DATA_MAILTEMPLATES", PATH_DATA_SITE . "mailTemplates/"); define('PATH_DATA_PUBLIC', PATH_DATA_SITE . 'public/'); +define('DB_ADAPTER', 'mysql'); +define('PATH_RBAC_HOME', PATH_TRUNK . '/rbac/'); +define('PATH_RBAC', PATH_RBAC_HOME . 'engine/classes/'); +define("PATH_CUSTOM_SKINS", PATH_DATA . "skins/"); +define("PATH_TPL", PATH_CORE . "templates/"); //timezone $_SESSION['__SYSTEM_UTC_TIME_ZONE__'] = (int) (env('MAIN_SYSTEM_UTC_TIME_ZONE', 'workflow')) == 1; @@ -57,11 +62,22 @@ ini_set('date.timezone', TIME_ZONE); //Set Time Zone date_default_timezone_set(TIME_ZONE); config(['app.timezone' => TIME_ZONE]); +//configuration values +config([ + "system.workspace" => SYS_SYS +]); +define("PATH_DATA_SITE", PATH_DATA . "sites/" . config("system.workspace") . "/"); +define("PATH_DYNAFORM", PATH_DATA_SITE . "xmlForms/"); +define("PATH_DATA_MAILTEMPLATES", PATH_DATA_SITE . "mailTemplates/"); +define("PATH_DATA_PUBLIC", PATH_DATA_SITE . "public/"); + +G::defineConstants(); + // Setup our testexternal database config(['database.connections.testexternal' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), - 'database' => env('DB_DATABASE', 'testexternal'), + 'database' => 'testexternal', 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'password'), 'unix_socket' => env('DB_SOCKET', ''), @@ -72,11 +88,6 @@ config(['database.connections.testexternal' => [ 'engine' => null ]]); -//configuration values -config([ - "system.workspace" => SYS_SYS -]); - // Now, drop all test tables and repopulate with schema Schema::connection('testexternal')->dropIfExists('test'); diff --git a/tests/unit/app/CustomizeFormatterTest.php b/tests/unit/app/CustomizeFormatterTest.php new file mode 100644 index 000000000..8a742e750 --- /dev/null +++ b/tests/unit/app/CustomizeFormatterTest.php @@ -0,0 +1,72 @@ +cleanDirectory(self::$directory); + } + + /** + * This is done after the last test. + */ + public static function tearDownAfterClass() + { + $file = new Filesystem(); + $file->cleanDirectory(self::$directory); + } + + /** + * Return all of the log levels defined in the RFC 5424 specification. + * @return array + */ + public function levelProviders() + { + return [ + ['emergency', 'production.EMERGENCY'], + ['alert', 'production.ALERT'], + ['critical', 'production.CRITICAL'], + ['error', 'production.ERROR'], + ['warning', 'production.WARNING'], + ['notice', 'production.NOTICE'], + ['info', 'production.INFO'], + ['debug', 'production.DEBUG'], + ]; + } + + /** + * This check the creation of a record with the emergency level. + * @test + * @dataProvider levelProviders + */ + public function it_should_create_log_file_levels($level, $message) + { + Log::{$level}($level); + $files = File::allFiles(self::$directory); + $this->assertCount(1, $files); + + $string = File::get($files[0]); + $this->assertRegExp("/{$message}/", $string); + } +} diff --git a/tests/unit/gulliver/system/gTest.php b/tests/unit/gulliver/system/gTest.php new file mode 100755 index 000000000..eec38b7e3 --- /dev/null +++ b/tests/unit/gulliver/system/gTest.php @@ -0,0 +1,353 @@ +assertContains($word, $res); + } + } + + /** + * It tests that all the reserved words in MySQL 5.6 and MySQL 5.7 are present + * + * @test + */ + public function it_should_match_all_reserved_words_in_mysql_57() + { + $res = G::reservedWordsSql(); + $words = [ + "ACCESSIBLE", + "ADD", + "ALL", + "ALTER", + "ANALYZE", + "AND", + "AS", + "ASC", + "ASENSITIVE", + "AUTHORIZATION", + "BEFORE", + "BETWEEN", + "BIGINT", + "BINARY", + "BLOB", + "BOTH", + "BREAK", + "BROWSE", + "BULK", + "BY", + "CALL", + "CASCADE", + "CASE", + "CHANGE", + "CHAR", + "CHARACTER", + "CHECK", + "CHECKPOINT", + "CLUSTERED", + "COLLATE", + "COLUMN", + "COMPUTE", + "CONDITION", + "CONSTRAINT", + "CONTAINSTABLE", + "CONTINUE", + "CONVERT", + "CREATE", + "CROSS", + "CURRENT_DATE", + "CURRENT_TIME", + "CURRENT_TIMESTAMP", + "CURRENT_USER", + "CURSOR", + "DATABASE", + "DATABASES", + "DAY_HOUR", + "DAY_MICROSECOND", + "DAY_MINUTE", + "DAY_SECOND", + "DBCC", + "DEC", + "DECIMAL", + "DECLARE", + "DEFAULT", + "DELAYED", + "DELETE", + "DENY", + "DESC", + "DESCRIBE", + "DETERMINISTIC", + "DISTINCT", + "DISTINCTROW", + "DISTRIBUTED", + "DIV", + "DOUBLE", + "DROP", + "DUAL", + "DUMMY", + "DUMP", + "EACH", + "ELSE", + "ELSEIF", + "ENCLOSED", + "ERRLVL", + "ESCAPED", + "EXCEPT", + "EXEC", + "EXISTS", + "EXIT", + "EXPLAIN", + "FALSE", + "FETCH", + "FILLFACTOR", + "FLOAT", + "FLOAT4", + "FLOAT8", + "FOR", + "FORCE", + "FOREIGN", + "FREETEXT", + "FREETEXTTABLE", + "FROM", + "FULLTEXT", + "GENERATED", + "GET", + "GOTO", + "GRANT", + "GROUP", + "HAVING", + "HIGH_PRIORITY", + "HOLDLOCK", + "HOUR_MICROSECOND", + "HOUR_MINUTE", + "HOUR_SECOND", + "IDENTITY", + "IDENTITYCOL", + "IDENTITY_INSERT", + "IF", + "IGNORE", + "IN", + "INDEX", + "INFILE", + "INNER", + "INOUT", + "INSENSITIVE", + "INSERT", + "INT", + "INT1", + "INT2", + "INT3", + "INT4", + "INT8", + "INTEGER", + "INTERSECT", + "INTERVAL", + "INTO", + "IO_AFTER_GTIDS", + "IO_BEFORE_GTIDS", + "IS", + "ITERATE", + "JOIN", + "KEY", + "KEYS", + "KILL", + "LEADING", + "LEAVE", + "LEFT", + "LIKE", + "LIMIT", + "LINEAR", + "LINENO", + "LINES", + "LOAD", + "LOCALTIME", + "LOCALTIMESTAMP", + "LOCK", + "LONG", + "LONGBLOB", + "LONGTEXT", + "LOOP", + "LOW_PRIORITY", + "MASTER_BIND", + "MASTER_SSL_VERIFY_SERVER_CERT", + "MATCH", + "MAXVALUE", + "MEDIUMBLOB", + "MEDIUMINT", + "MEDIUMTEXT", + "MIDDLEINT", + "MINUTE_MICROSECOND", + "MINUTE_SECOND", + "MOD", + "MODIFIES", + "NATURAL", + "NOCHECK", + "NONCLUSTERED", + "NOT", + "NO_WRITE_TO_BINLOG", + "NULL", + "NULLIF", + "NUMERIC", + "OF", + "OFF", + "OFFSETS", + "ON", + "OPENDATASOURCE", + "OPENQUERY", + "OPENROWSET", + "OPENXML", + "OPTIMIZE", + "OPTIMIZER_COSTS", + "OPTION", + "OPTIONALLY", + "OR", + "ORDER", + "OUT", + "OUTER", + "OUTFILE", + "OVER", + "PARTITION", + "PARSE_GCOL_EXPR", + "PERCENT", + "PLAN", + "PRECISION", + "PRIMARY", + "PRINT", + "PROC", + "PROCEDURE", + "PUBLIC", + "PURGE", + "RAISERROR", + "RANGE", + "READ", + "READS", + "READTEXT", + "READ_WRITE", + "REAL", + "RECONFIGURE", + "REFERENCES", + "REGEXP", + "RELEASE", + "RENAME", + "REPEAT", + "REPLACE", + "REQUIRE", + "RESIGNAL", + "RESTRICT", + "RETURN", + "REVOKE", + "RIGHT", + "RLIKE", + "ROWCOUNT", + "ROWGUIDCOL", + "RULE", + "SAVE", + "SCHEMA", + "SCHEMAS", + "SECOND_MICROSECOND", + "SELECT", + "SENSITIVE", + "SEPARATOR", + "SESSION_USER", + "SET", + "SETUSER", + "SHOW", + "SIGNAL", + "SMALLINT", + "SPATIAL", + "SPECIFIC", + "SQL", + "SQLEXCEPTION", + "SQLSTATE", + "SQLWARNING", + "SQL_AFTER_GTIDS", + "SQL_BEFORE_GTIDS", + "SQL_BIG_RESULT", + "SQL_CALC_FOUND_ROWS", + "SQL_SMALL_RESULT", + "SSL", + "STARTING", + "STATISTICS", + "STORED", + "STRAIGHT_JOIN", + "SYSTEM_USER", + "TABLE", + "TERMINATED", + "TEXTSIZE", + "THEN", + "TINYBLOB", + "TINYINT", + "TINYTEXT", + "TO", + "TOP", + "TRAILING", + "TRAN", + "TRIGGER", + "TRUE", + "TSEQUAL", + "UNDO", + "UNION", + "UNIQUE", + "UNLOCK", + "UNSIGNED", + "UPDATE", + "UPDATETEXT", + "USAGE", + "USE", + "USING", + "UTC_DATE", + "UTC_TIME", + "UTC_TIMESTAMP", + "VALUES", + "VARBINARY", + "VARCHAR", + "VARCHARACTER", + "VARYING", + "VIRTUAL", + "WAITFOR", + "WHEN", + "WHERE", + "WHILE", + "WITH", + "WRITE", + "WRITETEXT", + "XOR", + "YEAR_MONTH", + "ZEROFILL", + "_FILENAME" + ]; + foreach ($words as $word) { + //This assert the array contains all the reserved words in MySQL 5.6 and MySQL 5.7 + $this->assertContains($word, $res); + } + } +} \ No newline at end of file diff --git a/tests/unit/workflow/engine/bin/tasks/CliWorkspacesTest.php b/tests/unit/workflow/engine/bin/tasks/CliWorkspacesTest.php index 061f78549..cedb86d6c 100644 --- a/tests/unit/workflow/engine/bin/tasks/CliWorkspacesTest.php +++ b/tests/unit/workflow/engine/bin/tasks/CliWorkspacesTest.php @@ -2,10 +2,17 @@ namespace Tests\unit\workflow\engine\bin\tasks; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use ProcessMaker\Model\Dynaform; +use ProcessMaker\Model\Process; +use ProcessMaker\Model\ProcessVariables; +use ProcessMaker\Model\Triggers; use Tests\TestCase; class CliWorkspacesTest extends TestCase { + use DatabaseTransactions; + /** * Test that the deprecated files are removed successfully * @@ -134,4 +141,134 @@ class CliWorkspacesTest extends TestCase return $permissions; } + + /** + * Test the queries incompatibilities in dynaforms + * @test + */ + public function it_should_test_the_incompatibilities_in_the_dynaforms_queries() + { + config(["system.workspace" => 'workflow']); + + $process = factory(Process::class, 2)->create(); + + factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[0]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"2","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6170264265d1b544bebdbd5098250194","name":"2","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"title","id":"title0000000001","label":"title_1","colSpan":12}],[{"type":"text","variable":"textVar002","var_uid":"9778460595d1b545088dd69091601043","dataType":"string","protectedValue":false,"id":"textVar002","name":"textVar002","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"","var_name":"textVar002","colSpan":12}],[{"type":"textarea","variable":"textareaVar001","var_uid":"2934510045d1b5453f21373072798412","dataType":"string","protectedValue":false,"id":"textareaVar001","name":"textareaVar001","label":"textarea_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","validate":"","validateMessage":"","mode":"parent","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"","rows":"5","var_name":"textareaVar001","colSpan":12}],[{"type":"datetime","variable":"datetimeVar001","var_uid":"9780823375d1b5455e9c3a2064729484","dataType":"datetime","protectedValue":false,"id":"datetimeVar001","name":"datetimeVar001","label":"datetime_1","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","mode":"parent","format":"YYYY-MM-DD","dayViewHeaderFormat":"MMMM YYYY","extraFormats":false,"stepping":1,"minDate":"","maxDate":"","useCurrent":"false","collapse":true,"locale":"","defaultDate":"","disabledDates":false,"enabledDates":false,"icons":{"time":"glyphicon glyphicon-time","date":"glyphicon glyphicon-calendar","up":"glyphicon glyphicon-chevron-up","down":"glyphicon glyphicon-chevron-down","previous":"glyphicon glyphicon-chevron-left","next":"glyphicon glyphicon-chevron-right","today":"glyphicon glyphicon-screenshot","clear":"glyphicon glyphicon-trash"},"useStrict":false,"sideBySide":false,"daysOfWeekDisabled":false,"calendarWeeks":false,"viewMode":"days","toolbarPlacement":"default","showTodayButton":false,"showClear":"false","widgetPositioning":{"horizontal":"auto","vertical":"auto"},"widgetParent":null,"keepOpen":false,"var_name":"datetimeVar001","colSpan":12}],[{"type":"submit","id":"submit0000000001","name":"submit0000000001","label":"submit_1","colSpan":12}]],"variables":[{"var_uid":"9778460595d1b545088dd69091601043","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar002","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""},{"var_uid":"2934510045d1b5453f21373072798412","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textareaVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""},{"var_uid":"9780823375d1b5455e9c3a2064729484","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"datetimeVar001","var_field_type":"datetime","var_field_size":10,"var_label":"datetime","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + $dynaform = factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[1]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"1","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6817532755d16225629cb05061521548","name":"1","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"text","variable":"textVar001","var_uid":"4746221155d1622658943d1014840579","dataType":"string","protectedValue":false,"id":"textVar001","name":"textVar001","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"SELECT * FROM USERS WHERE \nUSR_UID=\'$UID\' UNION SELECT * from PROCESS","var_name":"textVar001","colSpan":12}]],"variables":[{"var_uid":"4746221155d1622658943d1014840579","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + check_queries_incompatibilities('workflow'); + + $result = ob_get_contents(); + + // This assert that the message contains the second process name + $this->assertRegExp('/'.$process[1]['PRO_TITLE'].'/',$result); + + // This assert that the message contains the second dynaform with the UNION query + $this->assertRegExp('/'.$dynaform['DYN_TITLE'].'/',$result); + } + + /** + * Test the queries incompatibilities in variables + * @test + */ + public function it_should_test_the_incompatibilities_in_the_variables_queries() + { + config(["system.workspace" => 'workflow']); + + $process = factory(Process::class, 2)->create(); + + $variables = factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[0]['PRO_UID'], + 'VAR_SQL' => 'SELECT * FROM USERS WHERE USR_UID="213" UNION SELECT * from PROCESS' + ] + ); + + factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[1]['PRO_UID'], + 'VAR_SQL' => '' + ] + ); + + check_queries_incompatibilities('workflow'); + + $result = ob_get_contents(); + + // This assert that the message contains the first process name + $this->assertRegExp('/'.$process[0]['PRO_TITLE'].'/',$result); + + // This assert that the message contains the first dynaform with the UNION query + $this->assertRegExp('/'.$variables['VAR_TITLE'].'/',$result); + } + + /** + * Test the queries incompatibilities in triggers + * @test + */ + public function it_should_test_the_incompatibilities_in_the_triggers_queries() + { + config(["system.workspace" => 'workflow']); + + $process = factory(Process::class, 3)->create(); + $trigger = factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[0]['PRO_UID'], + 'TRI_WEBBOT' => '$text=222; + $var1= executeQuery("SELECT * + FROM USERS WHERE + USR_UID=\'$UID\' UNION SELECT * from PROCESS"); + + $var1= executeQuery("SELECT * + FROM USERS WHERE + USR_UID=\'$UID\' UNION SELECT * from PROCESS"); + + $query = "SELECT * FROM USERS UNION + + SELECT * FROM TASKS"; + + $QUERY2 = "select * from USERS union SELECT * from GROUPS"; + + $s1 = "select * from USER"; + $s2 = "select * from TASK"; + + $query3 = $s1. " UNION " . $s2; + + executeQuery($query3);' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[1]['PRO_UID'], + 'TRI_WEBBOT' => 'die();' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[2]['PRO_UID'], + 'TRI_WEBBOT' => 'executeQuery("select * from USERS");' + ] + ); + + check_queries_incompatibilities('workflow'); + $result = ob_get_contents(); + + // This assert that the message contains the first process name + $this->assertRegExp('/'.$process[0]['PRO_TITLE'].'/',$result); + + // This assert that the message contains the first trigger with the UNION query + $this->assertRegExp('/'.$trigger['TRI_TITLE'].'/',$result); + } } \ No newline at end of file diff --git a/tests/unit/workflow/engine/classes/PmDynaformTest.php b/tests/unit/workflow/engine/classes/PmDynaformTest.php index d6c033209..8e1e07be4 100644 --- a/tests/unit/workflow/engine/classes/PmDynaformTest.php +++ b/tests/unit/workflow/engine/classes/PmDynaformTest.php @@ -532,4 +532,271 @@ class PmDynaformTest extends TestCase ] ]; } + + /** + * It tests that the json file is getting the defined values when the grid has one undefined control + * + * @test + */ + public function it_should_add_the_correct_fields_with_a_single_undefined_control() + { + //Creates the PmDynaform object + $pmDynaform = new PmDynaform(); + + //A json that contains the text control data and columns + $jsonData = (object)( + [ + "data" => (object)([ + "1" => [ + ["value" => "textControl1", "label" => "textControl1"], + ["value" => "textControl2", "label" => "textControl2"], + ["value" => "", "label" => ""] + ] + ]), + + "columns" => (object)([ + 0 => (object)([ + "id" => "text0000000001", + "name" => "text0000000001", + ]), + 1 => (object)([ + "id" => "textarea0000000001", + "name" => "textarea0000000001", + ]), + 2 => (object)([ + "id" => "text0000000002", + "name" => "text0000000002", + ]) + ]) + ] + ); + + // An array that contains the variables stored on the App Data + $appData = [ + "1" => [ + "text0000000001" => "", + "text0000000001_label" => "", + "textarea0000000001" => "", + "textarea0000000001_label" => "" + ] + ]; + + //Calls the setDataSchema method + $resultText = $pmDynaform->setDataSchema($jsonData, $appData); + + //This assert the result is null + $this->assertNull($resultText); + + //Assert the 'dataSchema' field was added + $this->assertObjectHasAttribute('dataSchema', $jsonData); + + //It asserts the first control is defined + $this->assertTrue($jsonData->dataSchema['1'][0]['defined']); + + //It asserts the second control is defined + $this->assertTrue($jsonData->dataSchema['1'][1]['defined']); + + //It asserts the second control is undefined + $this->assertFalse($jsonData->dataSchema['1'][2]['defined']); + } + + /** + * It tests that the json file is getting the defined values when the grid has more than one undefined control + * + * @test + */ + public function it_should_add_the_correct_fields_with_more_than_one_undefined_control() + { + //Creates the PmDynaform object + $pmDynaform = new PmDynaform(); + + //A json that contains the text control data and columns + $jsonData = (object)( + [ + "data" => (object)([ + "1" => [ + ["value" => "textControl1", "label" => "textControl1"], + ["value" => "textAreaControl2", "label" => "textAreaControl2"], + ["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"], + ["value" => "", "label" => ""], + ["value" => "", "label" => ""] + ] + ]), + "columns" => (object)([ + 0 => (object)([ + "id" => "text0000000001", + "name" => "text0000000001", + ]), + 1 => (object)([ + "id" => "textarea0000000001", + "name" => "textarea0000000001", + ]), + 2 => (object)([ + "id" => "dropdown0000000001", + "name" => "dropdown0000000001", + ]), + 3 => (object)([ + "id" => "text0000000002", + "name" => "text0000000002", + ]), + 4 => (object)([ + "id" => "text0000000003", + "name" => "text0000000003", + ]) + ]) + ] + ); + + // An array that contains the variables stored on the App Data + $appData = [ + "1" => [ + "text0000000001" => "", + "text0000000001_label" => "", + "textarea0000000001" => "", + "textarea0000000001_label" => "", + "dropdown0000000001" => "", + "dropdown0000000001_label" => "" + ] + ]; + + //Calls the setDataSchema method + $resultText = $pmDynaform->setDataSchema($jsonData, $appData); + + //This assert the result is null + $this->assertNull($resultText); + + //Assert the 'dataSchema' field was added + $this->assertObjectHasAttribute('dataSchema', $jsonData); + + //It asserts the first control is defined + $this->assertTrue($jsonData->dataSchema['1'][0]['defined']); + + //It asserts the second control is defined + $this->assertTrue($jsonData->dataSchema['1'][1]['defined']); + + //It asserts the third control is defined + $this->assertTrue($jsonData->dataSchema['1'][2]['defined']); + + //It asserts the fourth control is undefined + $this->assertFalse($jsonData->dataSchema['1'][3]['defined']); + + //It asserts the fifth control is undefined + $this->assertFalse($jsonData->dataSchema['1'][4]['defined']); + } + + /** + * It tests that the json file is getting the defined and undefined values when the grid has more than one row + * + * @test + */ + public function it_should_add_the_correct_fields_with_more_than_one_rows() + { + //Creates the PmDynaform object + $pmDynaform = new PmDynaform(); + + //A json that contains the text control data and columns + $jsonData = (object)( + [ + "data" => (object)([ + "1" => [ + ["value" => "textControl1", "label" => "textControl1"], + ["value" => "textAreaControl2", "label" => "textAreaControl2"], + ["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"], + ["value" => "", "label" => ""], + ["value" => "", "label" => ""] + ], + "2" => [ + ["value" => "textControl1", "label" => "textControl1"], + ["value" => "textAreaControl2", "label" => "textAreaControl2"], + ["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"], + ["value" => "", "label" => ""], + ["value" => "", "label" => ""] + ], + "3" => [ + ["value" => "textControl1", "label" => "textControl1"], + ["value" => "textAreaControl2", "label" => "textAreaControl2"], + ["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"], + ["value" => "", "label" => ""], + ["value" => "", "label" => ""] + ] + ]), + "columns" => (object)([ + 0 => (object)([ + "id" => "text0000000001", + "name" => "text0000000001", + ]), + 1 => (object)([ + "id" => "textarea0000000001", + "name" => "textarea0000000001", + ]), + 2 => (object)([ + "id" => "dropdown0000000001", + "name" => "dropdown0000000001", + ]), + 3 => (object)([ + "id" => "text0000000002", + "name" => "text0000000002", + ]), + 4 => (object)([ + "id" => "text0000000003", + "name" => "text0000000003", + ]) + ]) + ] + ); + + // An array that contains the variables stored on the App Data + $appData = [ + "1" => [ + "text0000000001" => "", + "text0000000001_label" => "", + "textarea0000000001" => "", + "textarea0000000001_label" => "", + "dropdown0000000001" => "", + "dropdown0000000001_label" => "" + ], + "2" => [ + "text0000000001" => "", + "text0000000001_label" => "", + "textarea0000000001" => "", + "textarea0000000001_label" => "", + "dropdown0000000001" => "", + "dropdown0000000001_label" => "" + ], + "3" => [ + "text0000000001" => "", + "text0000000001_label" => "", + "textarea0000000001" => "", + "textarea0000000001_label" => "", + "dropdown0000000001" => "", + "dropdown0000000001_label" => "" + ] + ]; + + //Calls the setDataSchema method + $resultText = $pmDynaform->setDataSchema($jsonData, $appData); + + //This assert the result is null + $this->assertNull($resultText); + + //Assert the 'dataSchema' field was added + $this->assertObjectHasAttribute('dataSchema', $jsonData); + + foreach ($jsonData->dataSchema as $key => $value) { + //It asserts the first control is defined + $this->assertTrue($jsonData->dataSchema[$key][0]['defined']); + + //It asserts the second control is defined + $this->assertTrue($jsonData->dataSchema[$key][1]['defined']); + + //It asserts the third control is defined + $this->assertTrue($jsonData->dataSchema[$key][2]['defined']); + + //It asserts the fourth control is undefined + $this->assertFalse($jsonData->dataSchema[$key][3]['defined']); + + //It asserts the fifth control is undefined + $this->assertFalse($jsonData->dataSchema[$key][4]['defined']); + } + } } diff --git a/tests/unit/workflow/engine/classes/ReportTablesTest.php b/tests/unit/workflow/engine/classes/ReportTablesTest.php index c48ed8191..2dc0b4f3d 100644 --- a/tests/unit/workflow/engine/classes/ReportTablesTest.php +++ b/tests/unit/workflow/engine/classes/ReportTablesTest.php @@ -9,13 +9,13 @@ use ProcessMaker\Model\Task; use ProcessMaker\Model\User; use Tests\TestCase; -class PmDynaformTest extends TestCase +class ReportTablesTest extends TestCase { use DatabaseTransactions; /** - * Constructor of the class. + * Sets up the unit tests. */ protected function setUp() { diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/GroupTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/GroupTest.php index d502ce5a1..38311b826 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/GroupTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/GroupTest.php @@ -37,13 +37,6 @@ class GroupTest extends TestCase */ protected function setUp() { - parent::setUp(); - - //Move section - global $RBAC; - $RBAC->initRBAC(); - $RBAC->loadUserRolePermission($RBAC->sSystem, '00000000000000000000000000000001'); - $this->setInstanceGroup(new Group()); } diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LanguageTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LanguageTest.php index 625a06a72..6d2bf9bd8 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LanguageTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LanguageTest.php @@ -1,11 +1,15 @@ setupDB(); + $this->getBaseUri(); $this->object = new Language; - $this->translationEnv = PATH_DATA."META-INF".PATH_SEP."translations.env"; + $this->translationEnv = PATH_DATA . "META-INF" . PATH_SEP . "translations.env"; file_exists($this->translationEnv) ? unlink($this->translationEnv) : false; } /** - * Tears down the unit tests. + * Get base uri for rest applications. + * @return string */ - protected function tearDown() + private function getBaseUri() { - $this->dropDB(); + $_SERVER = $this->getServerInformation(); + $baseUri = System::getServerProtocolHost(); + + return $baseUri; + } + + /** + * Get server information. + * @return object + */ + private function getServerInformation() + { + $pathData = PATH_DATA . "sites" . PATH_SEP . config("system.workspace") . PATH_SEP . ".server_info"; + $content = file_get_contents($pathData); + $serverInfo = unserialize($content); + + return $serverInfo; } /** @@ -41,9 +62,11 @@ class LanguageTest extends \WorkflowTestCase public function testGetLanguageList() { $list = $this->object->getLanguageList(); - $this->assertCount(1, $list); - $this->assertEquals('en', $list[0]['LANG_ID']); - $this->assertEquals('English', $list[0]['LANG_NAME']); + $expected = [ + 'LANG_ID' => 'en', + 'LANG_NAME' => 'English', + ]; + $this->assertContains($expected, $list); } /** @@ -54,16 +77,23 @@ class LanguageTest extends \WorkflowTestCase */ public function testGetLanguageListInstalled() { - $this->installLanguage('es', __DIR__.'/processmaker.es.po'); + $this->installLanguage('es', __DIR__ . '/processmaker.es.po'); $list = $this->object->getLanguageList(); - $this->assertCount(2, $list); - $this->assertEquals('en', $list[0]['LANG_ID']); - $this->assertEquals('English', $list[0]['LANG_NAME']); - $this->assertEquals('es-ES', $list[1]['LANG_ID']); - $this->assertEquals('Spanish (Spain)', $list[1]['LANG_NAME']); - $this->uninstallLanguage('es', __DIR__.'/processmaker.es.po'); + $english = [ + 'LANG_ID' => 'en', + 'LANG_NAME' => 'English', + ]; + $this->assertContains($english, $list); + + $spanish = [ + 'LANG_ID' => 'es-ES', + 'LANG_NAME' => 'Spanish (Spain)', + ]; + $this->assertContains($spanish, $list); + + $this->uninstallLanguage('es', __DIR__ . '/processmaker.es.po'); $list2 = $this->object->getLanguageList(); - $this->assertCount(1, $list2); + $this->assertContains($english, $list2); } /** @@ -74,7 +104,7 @@ class LanguageTest extends \WorkflowTestCase */ private function installLanguage($lanId, $filename) { - copy($filename, PATH_CORE.'content/translations/'.basename($filename)); + copy($filename, PATH_CORE . 'content/translations/' . basename($filename)); $language = \LanguagePeer::retrieveByPK($lanId); $language->setLanEnabled(1); $language->save(); @@ -89,7 +119,7 @@ class LanguageTest extends \WorkflowTestCase */ private function uninstallLanguage($lanId, $filename) { - unlink(PATH_CORE.'content/translations/'.basename($filename)); + unlink(PATH_CORE . 'content/translations/' . basename($filename)); $language = \LanguagePeer::retrieveByPK($lanId); $language->setLanEnabled(0); $language->save(); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/SkinsTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/SkinsTest.php index 2e95aa342..d4fb18758 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/SkinsTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/SkinsTest.php @@ -2,10 +2,13 @@ namespace ProcessMaker\BusinessModel; +use G; +use Tests\TestCase; + /** * Skins Tests */ -class SkinsTest extends \WorkflowTestCase +class SkinsTest extends TestCase { /** * @var Skins @@ -17,9 +20,7 @@ class SkinsTest extends \WorkflowTestCase */ protected function setUp() { - $this->cleanShared(); - $this->setupDB(); - $this->object = new Skins; + $this->object = new Skins(); } /** @@ -27,8 +28,8 @@ class SkinsTest extends \WorkflowTestCase */ protected function tearDown() { - $this->cleanShared(); - $this->dropDB(); + G::rm_dir(PATH_DATA . 'skins'); + mkdir(PATH_DATA . 'skins'); } /** @@ -61,12 +62,7 @@ class SkinsTest extends \WorkflowTestCase { $this->object->createSkin('test', 'test'); $this->object->createSkin( - 'test2', - 'test2', - 'Second skin', - 'ProcessMaker Team', - 'current', - 'neoclassic' + 'test2', 'test2', 'Second skin', 'ProcessMaker Team', 'current', 'neoclassic' ); $skins = $this->object->getSkins(); $this->assertCount(4, $skins); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEventTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEventTest.php index a4f025cad..6d1e55623 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEventTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/WebEntryEventTest.php @@ -1,13 +1,17 @@ markTestIncomplete(); + + $this->getBaseUri(); $this->setupDB(); - $this->processUid = $this->import(__DIR__.'/WebEntryEventTest.pmx'); - $this->processUid2 = $this->import(__DIR__.'/WebEntryEventTest2.pmx'); - $this->object = new WebEntryEvent; - $this->setTranslation('ID_INVALID_VALUE_CAN_NOT_BE_EMPTY', - 'ID_INVALID_VALUE_CAN_NOT_BE_EMPTY({0})'); - $this->setTranslation('ID_UNDEFINED_VALUE_IS_REQUIRED', - 'ID_UNDEFINED_VALUE_IS_REQUIRED({0})'); - $this->setTranslation('ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST', - 'ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST({0})'); - $this->setTranslation('ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES', - 'ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES({0},{1})'); - $this->setTranslation('ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY', - 'ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY({0},{1})'); + $this->processUid = $this->import(__DIR__ . '/WebEntryEventTest.pmx'); + $this->processUid2 = $this->import(__DIR__ . '/WebEntryEventTest2.pmx'); + $this->object = new WebEntryEvent(); + $this->setTranslation('ID_INVALID_VALUE_CAN_NOT_BE_EMPTY', 'ID_INVALID_VALUE_CAN_NOT_BE_EMPTY({0})'); + $this->setTranslation('ID_UNDEFINED_VALUE_IS_REQUIRED', 'ID_UNDEFINED_VALUE_IS_REQUIRED({0})'); + $this->setTranslation('ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST', 'ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST({0})'); + $this->setTranslation('ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES', 'ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES({0},{1})'); + $this->setTranslation('ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY', 'ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY({0},{1})'); } /** @@ -47,10 +50,34 @@ class WebEntryEventTest extends \WorkflowTestCase */ protected function tearDown() { - $this->dropDB(); $this->clearTranslations(); } + /** + * Get base uri for rest applications. + * @return string + */ + private function getBaseUri() + { + $_SERVER = $this->getServerInformation(); + $baseUri = System::getServerProtocolHost(); + + return $baseUri; + } + + /** + * Get server information. + * @return object + */ + private function getServerInformation() + { + $pathData = PATH_DATA . "sites" . PATH_SEP . config("system.workspace") . PATH_SEP . ".server_info"; + $content = file_get_contents($pathData); + $serverInfo = unserialize($content); + + return $serverInfo; + } + /** * @covers ProcessMaker\BusinessModel\WebEntryEvent::getWebEntryEvents * @category HOR-3207:5 diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php new file mode 100644 index 000000000..e27d5b9dc --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php @@ -0,0 +1,38 @@ +initLaravel(); + + // Assert that the configurations were set successfully + $this->assertEquals(DB_HOST, config('database.connections.workflow.host')); + $this->assertEquals(DB_NAME, config('database.connections.workflow.database')); + $this->assertEquals(DB_USER, config('database.connections.workflow.username')); + $this->assertEquals(DB_PASS, config('database.connections.workflow.password')); + } +} \ No newline at end of file diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php index 3f56c0379..d2e21d8a6 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/DelegationTest.php @@ -220,10 +220,10 @@ class DelegationTest extends TestCase // Create a new delegation, but for this specific user factory(Delegation::class)->create([ 'USR_UID' => $user->USR_UID, - 'USR_ID' => $user->id + 'USR_ID' => $user->USR_ID ]); // Now fetch results, and assume delegation count is 1 and the user points to our user - $results = Delegation::search($user->id); + $results = Delegation::search($user->USR_ID); $this->assertCount(1, $results['data']); $this->assertEquals('testcaseuser', $results['data'][0]['USRCR_USR_USERNAME']); } @@ -644,7 +644,7 @@ class DelegationTest extends TestCase // Create a new delegation, but for this specific user factory(Delegation::class)->create([ 'USR_UID' => $user->USR_UID, - 'USR_ID' => $user->id + 'USR_ID' => $user->USR_ID ]); $user = factory(User::class)->create([ 'USR_USERNAME' => 'paul', @@ -654,7 +654,7 @@ class DelegationTest extends TestCase // Create a new delegation, but for this specific user factory(Delegation::class)->create([ 'USR_UID' => $user->USR_UID, - 'USR_ID' => $user->id + 'USR_ID' => $user->USR_ID ]); // Now fetch results, and assume delegation count is 2 and the ordering ascending return Gary $results = Delegation::search(null, 0, 25, null, null, null, 'ASC', 'APP_CURRENT_USER'); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/DynaformTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/DynaformTest.php new file mode 100644 index 000000000..154ff9b96 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/DynaformTest.php @@ -0,0 +1,50 @@ +create(); + + factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[0]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"2","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6170264265d1b544bebdbd5098250194","name":"2","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"title","id":"title0000000001","label":"title_1","colSpan":12}],[{"type":"text","variable":"textVar002","var_uid":"9778460595d1b545088dd69091601043","dataType":"string","protectedValue":false,"id":"textVar002","name":"textVar002","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"","var_name":"textVar002","colSpan":12}],[{"type":"textarea","variable":"textareaVar001","var_uid":"2934510045d1b5453f21373072798412","dataType":"string","protectedValue":false,"id":"textareaVar001","name":"textareaVar001","label":"textarea_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","validate":"","validateMessage":"","mode":"parent","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"","rows":"5","var_name":"textareaVar001","colSpan":12}],[{"type":"datetime","variable":"datetimeVar001","var_uid":"9780823375d1b5455e9c3a2064729484","dataType":"datetime","protectedValue":false,"id":"datetimeVar001","name":"datetimeVar001","label":"datetime_1","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","mode":"parent","format":"YYYY-MM-DD","dayViewHeaderFormat":"MMMM YYYY","extraFormats":false,"stepping":1,"minDate":"","maxDate":"","useCurrent":"false","collapse":true,"locale":"","defaultDate":"","disabledDates":false,"enabledDates":false,"icons":{"time":"glyphicon glyphicon-time","date":"glyphicon glyphicon-calendar","up":"glyphicon glyphicon-chevron-up","down":"glyphicon glyphicon-chevron-down","previous":"glyphicon glyphicon-chevron-left","next":"glyphicon glyphicon-chevron-right","today":"glyphicon glyphicon-screenshot","clear":"glyphicon glyphicon-trash"},"useStrict":false,"sideBySide":false,"daysOfWeekDisabled":false,"calendarWeeks":false,"viewMode":"days","toolbarPlacement":"default","showTodayButton":false,"showClear":"false","widgetPositioning":{"horizontal":"auto","vertical":"auto"},"widgetParent":null,"keepOpen":false,"var_name":"datetimeVar001","colSpan":12}],[{"type":"submit","id":"submit0000000001","name":"submit0000000001","label":"submit_1","colSpan":12}]],"variables":[{"var_uid":"9778460595d1b545088dd69091601043","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar002","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""},{"var_uid":"2934510045d1b5453f21373072798412","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textareaVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""},{"var_uid":"9780823375d1b5455e9c3a2064729484","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"datetimeVar001","var_field_type":"datetime","var_field_size":10,"var_label":"datetime","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[1]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"1","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6817532755d16225629cb05061521548","name":"1","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"text","variable":"textVar001","var_uid":"4746221155d1622658943d1014840579","dataType":"string","protectedValue":false,"id":"textVar001","name":"textVar001","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"SELECT * FROM USERS WHERE \nUSR_UID=\'$UID\' UNION SELECT * from PROCESS","var_name":"textVar001","colSpan":12}]],"variables":[{"var_uid":"4746221155d1622658943d1014840579","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[2]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"1","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6817532755d16225629cb05061521548","name":"1","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"text","variable":"textVar001","var_uid":"4746221155d1622658943d1014840579","dataType":"string","protectedValue":false,"id":"textVar001","name":"textVar001","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"SELECT * FROM USERS WHERE \nUSR_UID=\'$UID\' UNION SELECT * from PROCESS","var_name":"textVar001","colSpan":12}]],"variables":[{"var_uid":"4746221155d1622658943d1014840579","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + $dynaformQuery = Dynaform::query()->select(); + $dynaformQuery->process($process[0]['PRO_UID']); + $result = $dynaformQuery->get()->values()->toArray(); + + // Assert there is a dynaform for the specific process + $this->assertCount(1, $result); + + // Assert that the result has the correct filtered process + $this->assertEquals($process[0]['PRO_UID'], $result[0]['PRO_UID']); + } +} \ No newline at end of file diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/ProcessVariablesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/ProcessVariablesTest.php new file mode 100644 index 000000000..b5da806a9 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/ProcessVariablesTest.php @@ -0,0 +1,51 @@ +create(); + + factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[0]['PRO_UID'], + 'VAR_SQL' => 'SELECT * FROM USERS WHERE USR_UID="213" UNION SELECT * from PROCESS' + ] + ); + + factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[1]['PRO_UID'], + 'VAR_SQL' => '' + ] + ); + + factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[0]['PRO_UID'], + 'VAR_SQL' => '' + ] + ); + + $variablesQuery = ProcessVariables::query()->select(); + $variablesQuery->process($process[0]['PRO_UID']); + $result = $variablesQuery->get()->values()->toArray(); + + // Assert there are two process variables for the specific process + $this->assertCount(2, $result); + + // Assert that the result has the correct filtered process + $this->assertEquals($process[0]['PRO_UID'], $result[0]['PRJ_UID']); + $this->assertEquals($process[0]['PRO_UID'], $result[1]['PRJ_UID']); + } +} \ No newline at end of file diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/TriggersTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/TriggersTest.php new file mode 100644 index 000000000..36b4239d9 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/TriggersTest.php @@ -0,0 +1,77 @@ +create(); + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[0]['PRO_UID'], + 'TRI_WEBBOT' => '$text=222; + $var1= executeQuery("SELECT * + FROM USERS WHERE + USR_UID=\'$UID\' UNION SELECT * from PROCESS"); + + $var1= executeQuery("SELECT * + FROM USERS WHERE + USR_UID=\'$UID\' UNION SELECT * from PROCESS"); + + $query = "SELECT * FROM USERS UNION + + SELECT * FROM TASKS"; + + $QUERY2 = "select * from USERS union SELECT * from GROUPS"; + + $s1 = "select * from USER"; + $s2 = "select * from TASK"; + + $query3 = $s1. " UNION " . $s2; + + executeQuery($query3);' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[1]['PRO_UID'], + 'TRI_WEBBOT' => 'die();' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[2]['PRO_UID'], + 'TRI_WEBBOT' => 'executeQuery("select * from USERS");' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[2]['PRO_UID'], + 'TRI_WEBBOT' => 'executeQuery();' + ] + ); + + $triggerQuery = Triggers::query()->select(); + $triggerQuery->process($process[2]['PRO_UID']); + $result = $triggerQuery->get()->values()->toArray(); + + // Assert there are two triggers for the specific process + $this->assertCount(2, $result); + + // Assert that the result has the correct filtered process + $this->assertEquals($process[2]['PRO_UID'], $result[0]['PRO_UID']); + $this->assertEquals($process[2]['PRO_UID'], $result[1]['PRO_UID']); + } +} \ No newline at end of file diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Services/Api/LightTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Services/Api/LightTest.php index c24d476cc..b3c343a9b 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/Services/Api/LightTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/Services/Api/LightTest.php @@ -16,6 +16,12 @@ use ProcessMaker\Model\User; use ProcessMaker\Util\DateTime; use Tests\TestCase; +/** + * To do: This only works if the test database is the same where ProcessMaker is + * installed, improvements must be made so that the method "Installer::create_site()" + * can create the connection file (/processmaker/shared/sites/{workspace}/db.php) + * to different instances of MySql. + */ class LightTest extends TestCase { private $http; diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Validation/MySQL57Test.php b/tests/unit/workflow/engine/src/ProcessMaker/Validation/MySQL57Test.php new file mode 100644 index 000000000..cd0a35877 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Validation/MySQL57Test.php @@ -0,0 +1,219 @@ +create(); + + factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[0]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"2","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6170264265d1b544bebdbd5098250194","name":"2","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"title","id":"title0000000001","label":"title_1","colSpan":12}],[{"type":"text","variable":"textVar002","var_uid":"9778460595d1b545088dd69091601043","dataType":"string","protectedValue":false,"id":"textVar002","name":"textVar002","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"","var_name":"textVar002","colSpan":12}],[{"type":"textarea","variable":"textareaVar001","var_uid":"2934510045d1b5453f21373072798412","dataType":"string","protectedValue":false,"id":"textareaVar001","name":"textareaVar001","label":"textarea_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","validate":"","validateMessage":"","mode":"parent","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"","rows":"5","var_name":"textareaVar001","colSpan":12}],[{"type":"datetime","variable":"datetimeVar001","var_uid":"9780823375d1b5455e9c3a2064729484","dataType":"datetime","protectedValue":false,"id":"datetimeVar001","name":"datetimeVar001","label":"datetime_1","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","mode":"parent","format":"YYYY-MM-DD","dayViewHeaderFormat":"MMMM YYYY","extraFormats":false,"stepping":1,"minDate":"","maxDate":"","useCurrent":"false","collapse":true,"locale":"","defaultDate":"","disabledDates":false,"enabledDates":false,"icons":{"time":"glyphicon glyphicon-time","date":"glyphicon glyphicon-calendar","up":"glyphicon glyphicon-chevron-up","down":"glyphicon glyphicon-chevron-down","previous":"glyphicon glyphicon-chevron-left","next":"glyphicon glyphicon-chevron-right","today":"glyphicon glyphicon-screenshot","clear":"glyphicon glyphicon-trash"},"useStrict":false,"sideBySide":false,"daysOfWeekDisabled":false,"calendarWeeks":false,"viewMode":"days","toolbarPlacement":"default","showTodayButton":false,"showClear":"false","widgetPositioning":{"horizontal":"auto","vertical":"auto"},"widgetParent":null,"keepOpen":false,"var_name":"datetimeVar001","colSpan":12}],[{"type":"submit","id":"submit0000000001","name":"submit0000000001","label":"submit_1","colSpan":12}]],"variables":[{"var_uid":"9778460595d1b545088dd69091601043","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar002","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""},{"var_uid":"2934510045d1b5453f21373072798412","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textareaVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""},{"var_uid":"9780823375d1b5455e9c3a2064729484","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"datetimeVar001","var_field_type":"datetime","var_field_size":10,"var_label":"datetime","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + factory(Dynaform::class)->create( + [ + 'PRO_UID' => $process[1]['PRO_UID'], + 'DYN_CONTENT' => '{"name":"1","description":"","items":[{"type":"form","variable":"","var_uid":"","dataType":"","id":"6817532755d16225629cb05061521548","name":"1","description":"","mode":"edit","script":"","language":"en","externalLibs":"","printable":false,"items":[[{"type":"text","variable":"textVar001","var_uid":"4746221155d1622658943d1014840579","dataType":"string","protectedValue":false,"id":"textVar001","name":"textVar001","label":"text_1","defaultValue":"","placeholder":"","hint":"","required":false,"requiredFieldErrorMessage":"","textTransform":"none","validate":"","validateMessage":"","maxLength":1000,"formula":"","mode":"parent","operation":"","dbConnection":"workflow","dbConnectionLabel":"PM Database","sql":"SELECT * FROM USERS WHERE \nUSR_UID=\'$UID\' UNION SELECT * from PROCESS","var_name":"textVar001","colSpan":12}]],"variables":[{"var_uid":"4746221155d1622658943d1014840579","prj_uid":"5139642915ccb3fca429a36061714972","var_name":"textVar001","var_field_type":"string","var_field_size":10,"var_label":"string","var_dbconnection":"workflow","var_dbconnection_label":"PM Database","var_sql":"","var_null":0,"var_default":"","var_accepted_values":"[]","inp_doc_uid":""}]}]}' + ] + ); + + $processes = [ + [ + "PRO_UID" => $process[0]['PRO_UID'], + "PRO_TITLE" => $process[0]['PRO_TITLE'] + ], + [ + "PRO_UID" => $process[1]['PRO_UID'], + "PRO_TITLE" => $process[1]['PRO_TITLE'] + ] + ]; + + $object = new MySQL57(); + $result = $object->checkIncompatibilityDynaforms($processes); + + // This asserts that there is a result + $this->assertNotEmpty($result); + + // This asserts that there is a process that contains an UNION query inside a dynaform + $this->assertCount(1, $result); + + // This asserts that the process containing the UNION queries inside a dynaform, is the first one + $this->assertEquals($result[0]['PRO_UID'], $process[1]['PRO_UID']); + } + + /** + * Test the MySQL 5.7 incompatibilities in variables + * + * @test + */ + public function it_should_test_incompatibilities_with_variables() + { + $process = factory(Process::class, 2)->create(); + + factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[0]['PRO_UID'], + 'VAR_SQL' => 'SELECT * FROM USERS WHERE USR_UID="213" UNION SELECT * from PROCESS', + ] + ); + + $variables = factory(ProcessVariables::class)->create( + [ + 'PRJ_UID' => $process[1]['PRO_UID'], + 'VAR_SQL' => '', + ] + ); + + + $processes = [ + [ + "PRO_UID" => $process[0]['PRO_UID'], + "PRO_TITLE" => $process[0]['PRO_TITLE'] + ], + [ + "PRO_UID" => $process[1]['PRO_UID'], + "PRO_TITLE" => $process[1]['PRO_TITLE'] + ] + ]; + + $object = new MySQL57(); + $result = $object->checkIncompatibilityVariables($processes); + + // This asserts that there is a result + $this->assertNotEmpty($result); + + // This asserts that there is a process that contains an UNION query in a variable + $this->assertCount(1, $result); + + // This asserts that the process containing the UNION query in a variable, is the first one + $this->assertEquals($result[0]['PRO_UID'], $process[0]['PRO_UID']); + + // This asserts that the result does not contain a variable that does not have a UNION query + $this->assertNotEquals($result[0]['VAR_UID'], $variables['VAR_UID']); + } + + /** + * Test the MySQL 5.7 incompatibilities in triggers + * + * @test + */ + public function it_should_test_incompatibilities_with_triggers() + { + $process = factory(Process::class, 3)->create(); + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[0]['PRO_UID'], + 'TRI_WEBBOT' => '$text=222; + $var1= executeQuery("SELECT * + FROM USERS WHERE + USR_UID=\'$UID\' UNION SELECT * from PROCESS"); + + $var1= executeQuery("SELECT * + FROM USERS WHERE + USR_UID=\'$UID\' UNION SELECT * from PROCESS"); + + $query = "SELECT * FROM USERS UNION + + SELECT * FROM TASKS"; + + $QUERY2 = "select * from USERS union SELECT * from GROUPS"; + + $s1 = "select * from USER"; + $s2 = "select * from TASK"; + + $query3 = $s1. " UNION " . $s2; + + executeQuery($query3);' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[1]['PRO_UID'], + 'TRI_WEBBOT' => 'die();' + ] + ); + + factory(Triggers::class)->create( + [ + 'PRO_UID' => $process[2]['PRO_UID'], + 'TRI_WEBBOT' => 'executeQuery("select * from USERS");' + ] + ); + + $processes = [ + [ + "PRO_UID" => $process[0]['PRO_UID'], + "PRO_TITLE" => $process[0]['PRO_TITLE'] + ], + [ + "PRO_UID" => $process[1]['PRO_UID'], + "PRO_TITLE" => $process[1]['PRO_TITLE'] + ], + [ + "PRO_UID" => $process[2]['PRO_UID'], + "PRO_TITLE" => $process[2]['PRO_TITLE'] + ] + ]; + + $object = new MySQL57(); + $result = $object->checkIncompatibilityTriggers($processes); + + // This asserts that there is a result + $this->assertNotEmpty($result); + + // This asserts that there is a process that contains an UNION query + $this->assertCount(1, $result); + + // This asserts that the process containing the UNION queries is the first one + $this->assertEquals($result[0]['PRO_UID'], $process[0]['PRO_UID']); + } + + /** + * Test the query analyzer method + * + * @test + */ + public function it_should_test_the_query_analyzer() + { + $query = ""; + + $object = new MySQL57(); + $result = $object->analyzeQuery($query); + + // This asserts that there is not a UNION query + $this->assertFalse($result); + + $query = "select * from USERS UNION select '1241412515'"; + $result = $object->analyzeQuery($query); + + // This asserts that there is a UNION query + $this->assertTrue($result); + + $query = "select * from USERS LEFT JOIN TASKS ON 'USERS.USR_UID = TASKS.USR_UID '"; + $result = $object->analyzeQuery($query); + + // This asserts that there is not a UNION query + $this->assertFalse($result); + } +} \ No newline at end of file diff --git a/thirdparty/pake/pakeYaml.class.php b/thirdparty/pake/pakeYaml.class.php index 55c4fa30b..3c50bfddf 100644 --- a/thirdparty/pake/pakeYaml.class.php +++ b/thirdparty/pake/pakeYaml.class.php @@ -80,7 +80,7 @@ * @access public * @return void */ - public function pakeYAMLNode() { + public function __construct() { $this->id = uniqid(''); } } diff --git a/workflow/engine/bin/actionsByEmailEmailResponse.php b/workflow/engine/bin/actionsByEmailEmailResponse.php new file mode 100644 index 000000000..e22f1ad68 --- /dev/null +++ b/workflow/engine/bin/actionsByEmailEmailResponse.php @@ -0,0 +1,2 @@ +actionsByEmailEmailResponse(); + break; + /*----------------------------------********---------------------------------*/ } } catch (Exception $e) { $token = strtotime("now"); diff --git a/workflow/engine/bin/tasks/cliUpgrade.php b/workflow/engine/bin/tasks/cliUpgrade.php index a1d181dcf..36aa2e37d 100644 --- a/workflow/engine/bin/tasks/cliUpgrade.php +++ b/workflow/engine/bin/tasks/cliUpgrade.php @@ -5,14 +5,16 @@ use ProcessMaker\Core\System; CLI::taskName('upgrade'); CLI::taskDescription("Upgrade workspaces.\n\n This command should be run after upgrading ProcessMaker to a new version so that all workspaces are also upgraded to the\n new version."); - +CLI::taskOpt('child', "Used by the main upgrade thread", 'child', 'child'); CLI::taskOpt('buildACV', 'If this option is enabled, the Cache View is built.', 'ACV', 'buildACV'); CLI::taskOpt('noxml', 'If this option is enabled, the XML files translation is not built.', 'NoXml', 'no-xml'); +CLI::taskOpt('nomafe', 'If this option is enabled, the MAFE files translation is not built.', 'nomafe', 'no-mafe'); /*----------------------------------********---------------------------------*/ CLI::taskOpt('keep_dyn_content', "Include the DYN_CONTENT_HISTORY value. Ex: --keep_dyn_content", 'i', 'keep_dyn_content'); /*----------------------------------********---------------------------------*/ CLI::taskRun("run_upgrade"); /*----------------------------------********---------------------------------*/ + CLI::taskName('unify-database'); CLI::taskDescription( << $workspace) { - $oneWorkspace = $workspace->name; + // Initializing variables + $globalStartTime = microtime(true); + $numberOfWorkspaces = count($workspaces); + $countWorkspace = 1; + + if ($printHF) { + // Set upgrade flag + if (count($workspaces) === 1) { + // For the specific workspace send in the command + G::isPMUnderUpdating(1, $workspaces[0]->name); + } else { + // For all workspaces + G::isPMUnderUpdating(1); } + + // Print information when start the upgrade process + CLI::logging('UPGRADE LOG INITIALIZED', PROCESSMAKER_PATH . 'upgrade.log'); + CLI::logging("UPGRADE STARTED\n"); } - $flag = G::isPMUnderUpdating(1, $oneWorkspace); - //start to upgrade - $checksum = System::verifyChecksum(); - if ($checksum === false) { - CLI::logging(CLI::error("checksum.txt not found, integrity check is not possible") . "\n"); - if (!CLI::question("Integrity check failed, do you want to continue the upgrade?")) { - CLI::logging("Upgrade failed\n"); - $flag = G::isPMUnderUpdating(0); - die(); - } - } else { - if (!empty($checksum['missing'])) { - CLI::logging(CLI::error("The following files were not found in the installation:")."\n"); - foreach ($checksum['missing'] as $missing) { - CLI::logging(" $missing\n"); + + foreach ($workspaces as $workspace) { + if ($mainThread) { + CLI::logging("FOLDERS AND FILES OF THE SYSTEM\n"); + // Upgrade actions for global files + CLI::logging("* Start cleaning compiled folder...\n"); + $start = microtime(true); + if (defined('PATH_C')) { + G::rm_dir(PATH_C); + G::mk_dir(PATH_C, 0777); } - } - if (!empty($checksum['diff'])) { - CLI::logging(CLI::error("The following files have modifications:")."\n"); - foreach ($checksum['diff'] as $diff) { - CLI::logging(" $diff\n"); + CLI::logging("* End cleaning compiled folder...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start to remove deprecated files...\n"); + $start = microtime(true); + $workspace->removeDeprecatedFiles(); + CLI::logging("* End to remove deprecated files...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start checking Enterprise folder/files...\n"); + $start = microtime(true); + $workspace->verifyFilesOldEnterprise(); + CLI::logging("* End checking Enterprise folder/files...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start checking framework paths...\n"); + $start = microtime(true); + $workspace->checkFrameworkPaths(); + CLI::logging("* End checking framework paths...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start fixing serialized instance in serverConf.singleton file...\n"); + $start = microtime(true); + $serverConf = ServerConf::getSingleton(); + $serverConf->updateClassNameInFile(); + CLI::logging("* End fixing serialized instance in serverConf.singleton file...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start the safe upgrade for javascript files cached by the browser (Maborak, ExtJs)...\n"); + $start = microtime(true); + G::browserCacheFilesSetUid(); + CLI::logging("* End the safe upgrade for javascript files cached by the browser (Maborak, ExtJs)...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start to backup patch files...\n"); + $arrayPatch = glob(PATH_TRUNK . 'patch-*'); + if ($arrayPatch) { + foreach ($arrayPatch as $value) { + if (file_exists($value)) { + // Copy patch content + $names = pathinfo($value); + $nameFile = $names['basename']; + + $contentFile = file_get_contents($value); + $contentFile = preg_replace("[\n|\r|\n\r]", '', $contentFile); + CLI::logging($contentFile . ' installed (' . $nameFile . ')', PATH_DATA . 'log/upgrades.log'); + + // Move patch file + $newFile = PATH_DATA . $nameFile; + G::rm_dir($newFile); + copy($value, $newFile); + G::rm_dir($value); + } + } } - } - if (!(empty($checksum['missing']) || empty($checksum['diff']))) { - if (!CLI::question("Integrity check failed, do you want to continue the upgrade?")) { - CLI::logging("Upgrade failed\n"); - $flag = G::isPMUnderUpdating(0); - die(); - } - } - } - CLI::logging("Clearing cache...\n"); - if (defined('PATH_C')) { - G::rm_dir(PATH_C); - G::mk_dir(PATH_C, 0777); - } + CLI::logging("* End to backup patch files...(Completed on " . (microtime(true) - $start) . " seconds)\n"); - $count = count($workspaces); - $first = true; - $errors = false; - $countWorkspace = 0; - $buildCacheView = array_key_exists('buildACV', $args); - $flagUpdateXml = !array_key_exists('noxml', $args); - $optionMigrateHistoryData = [ - /*----------------------------------********---------------------------------*/ - 'keepDynContent' => array_key_exists('keep_dyn_content', $args) - /*----------------------------------********---------------------------------*/ - ]; + CLI::logging("* Start to backup log files...\n"); + $start = microtime(true); + $workspace->backupLogFiles(); + CLI::logging("* End to backup log files... (Completed on " . (microtime(true) - $start) . " seconds)\n"); - foreach ($workspaces as $index => $workspace) { - if (empty(config("system.workspace"))) { - define("SYS_SYS", $workspace->name); - config(["system.workspace" => $workspace->name]); + // The previous actions should be executed only the first time + $mainThread = false; } + if ($numberOfWorkspaces === 1) { + // Displaying information of the current workspace to upgrade + CLI::logging("UPGRADING DATABASE AND FILES OF WORKSPACE '{$workspace->name}' ($countWorkspace/$numberOfWorkspaces)\n"); - if (!defined("PATH_DATA_SITE")) { - define("PATH_DATA_SITE", PATH_DATA . "sites" . PATH_SEP . config("system.workspace") . PATH_SEP); - } + // Build parameters + $arrayOptTranslation = [ + 'updateXml' => $updateXmlForms, + 'updateMafe' => $updateMafe + ]; + $optionMigrateHistoryData = [ + 'keepDynContent' => $keepDynContent + ]; - if (!defined('DB_ADAPTER')) { - define('DB_ADAPTER', 'mysql'); - } - - try { - $countWorkspace++; - CLI::logging("Upgrading workspaces ($countWorkspace/$count): " . CLI::info($workspace->name) . "\n"); - $workspace->upgrade($buildCacheView, $workspace->name, false, 'en', ['updateXml' => $flagUpdateXml, 'updateMafe' => $first], $optionMigrateHistoryData); + // Upgrade database and files from a specific workspace + $workspace->upgrade($workspace->name, SYS_LANG, $arrayOptTranslation, $optionMigrateHistoryData); $workspace->close(); - $first = false; - $flagUpdateXml = false; - } catch (Exception $e) { - CLI::logging("Errors upgrading workspace " . CLI::info($workspace->name) . ": " . CLI::error($e->getMessage()) . "\n"); - $errors = true; + } else { + // Build arguments + $args = '--child'; + $args .= $updateXmlForms ? '' : ' --no-xml'; + $args .= $updateMafe ? '' : ' --no-mafe'; + $args .= $keepDynContent ? ' --keep_dyn_content' : ''; + + // Build and execute command in another thread + $command = PHP_BINARY . ' processmaker upgrade ' . $args . ' ' . $workspace->name; + passthru($command); } + + // After the first execution is required set this values to false + $updateXmlForms = false; + $updateMafe = false; + + // Increment workspaces counter + $countWorkspace++; } - //Verify the information of the singleton ServConf by changing the name of the class if is required. - CLI::logging("\nCheck/Fix serialized instance in serverConf.singleton file\n\n"); - $serverConf = ServerConf::getSingleton(); - $serverConf->updateClassNameInFile(); + if ($printHF) { + // Print information when finish the upgrade process + CLI::logging('UPGRADE FINISHED (Completed on ' . (microtime(true) - $globalStartTime) . + ' seconds), ProcessMaker ' . System::getVersion() . ' installed)' . "\n\n"); - // SAVE Upgrades/Patches - $arrayPatch = glob(PATH_TRUNK . 'patch-*'); - - if ($arrayPatch) { - foreach ($arrayPatch as $value) { - if (file_exists($value)) { - // copy content the patch - $names = pathinfo($value); - $nameFile = $names['basename']; - - $contentFile = file_get_contents($value); - $contentFile = preg_replace("[\n|\r|\n\r]", '', $contentFile); - CLI::logging($contentFile . ' installed (' . $nameFile . ')', PATH_DATA . 'log/upgrades.log'); - - // move file of patch - $newFile = PATH_DATA . $nameFile; - G::rm_dir($newFile); - copy($value, $newFile); - G::rm_dir($value); - } - } - } else { - CLI::logging('ProcessMaker ' . System::getVersion(). ' installed', PATH_DATA . 'log/upgrades.log'); + // Delete upgrade flag + G::isPMUnderUpdating(0); } - - //Safe upgrade for JavaScript files - CLI::logging("\nSafe upgrade for files cached by the browser\n\n"); - - G::browserCacheFilesSetUid(); - - //Status - if ($errors) { - CLI::logging("Upgrade finished but there were errors upgrading workspaces.\n"); - CLI::logging(CLI::error("Please check the log above to correct any issues.") . "\n"); - } else { - CLI::logging("Upgrade successful\n"); - } - - //setting flag to false - $flag = G::isPMUnderUpdating(0); } -function listFiles($dir) -{ - $files = array(); - $lista = glob($dir.'/*'); - foreach ($lista as $valor) { - if (is_dir($valor)) { - $inner_files = listFiles($valor); - if (is_array($inner_files)) { - $files = array_merge($files, $inner_files); - } - } - if (is_file($valor)) { - array_push($files, $valor); - } - } - return $files; -} /*----------------------------------********---------------------------------*/ function run_unify_database($args) { @@ -314,3 +301,25 @@ function run_unify_database($args) $flag = G::isPMUnderUpdating(0); } /*----------------------------------********---------------------------------*/ + +/** + * Execute a query, used internally for upgrade process + * + * @param array $options + */ +function runUpgradeQuery($options) +{ + // Initializing variables + $workspaceName = $options[0]; + $query = base64_decode($options[1]); + $isRbac = (bool)$options[2]; + + // Creating a new instance of the extended class + $workspace = new WorkspaceTools($workspaceName); + + // Execute the query + $workspace->upgradeQuery($query, $isRbac); + + // Terminate without error + exit('success'); +} diff --git a/workflow/engine/bin/tasks/cliWorkspaces.php b/workflow/engine/bin/tasks/cliWorkspaces.php index 7455ee574..c45935522 100644 --- a/workflow/engine/bin/tasks/cliWorkspaces.php +++ b/workflow/engine/bin/tasks/cliWorkspaces.php @@ -1,5 +1,8 @@ name); - } - } -} - -/** - * This function is executed only by one workspace, for the command workspace-upgrade - * - * @param array $args, workspace name for to apply the upgrade - * @param array $opts, specify additional arguments for language, flag for buildACV, flag for noxml - * - * @return void - */ -function workspace_upgrade($args, $opts) { - $first = true; - $workspaces = get_workspaces_from_args($args); - $lang = array_key_exists("lang", $opts) ? $opts['lang'] : 'en'; - $buildCacheView = array_key_exists('buildACV', $opts); - $flagUpdateXml = !array_key_exists('noxml', $opts); - - $wsName = $workspaces[key($workspaces)]->name; - Bootstrap::setConstantsRelatedWs($wsName); - //Loop, read all the attributes related to the one workspace - foreach ($workspaces as $workspace) { - try { - $workspace->upgrade( - $buildCacheView, - $workspace->name, - false, - $lang, - ['updateXml' => $flagUpdateXml, 'updateMafe' => $first] - ); - $first = false; - $flagUpdateXml = false; - } catch (Exception $e) { - G::outRes("Errors upgrading workspace " . CLI::info($workspace->name) . ": " . CLI::error($e->getMessage()) . "\n"); - } - } -} - /** * We will upgrade the CONTENT table * If we apply the command for all workspaces, we will need to execute one by one by redefining the constants @@ -477,6 +412,7 @@ function run_upgrade_content($args, $opts) } } } + /** * This function will upgrade the CONTENT table for a workspace * This function is executed only for one workspace @@ -1102,7 +1038,7 @@ function migrate_new_cases_lists($command, $args, $opts) foreach ($workspaces as $workspace) { print_r("Upgrading database in " . pakeColor::colorize($workspace->name, "INFO") . "\n"); try { - $workspace->migrateList($workspace->name, true, $lang); + $workspace->migrateList(true, $lang); echo "> List tables are done\n"; } catch (Exception $e) { G::outRes("> Error: " . CLI::error($e->getMessage()) . "\n"); @@ -1127,17 +1063,15 @@ function migrate_counters($command, $args) } } -function migrate_list_unassigned($command, $args, $opts) +function migrate_list_unassigned($command, $args) { $filter = new InputFilter(); - $opts = $filter->xssFilterHard($opts); $args = $filter->xssFilterHard($args); - $lang = array_key_exists("lang", $opts) ? $opts['lang'] : 'en'; $workspaces = get_workspaces_from_args($args); foreach ($workspaces as $workspace) { print_r("Upgrading Unassigned List in" . pakeColor::colorize($workspace->name, "INFO") . "\n"); try { - $workspace->regenerateListUnassigned(); + $workspace->runRegenerateListUnassigned(); echo "> Unassigned List is done\n"; } catch (Exception $e) { G::outRes("> Error: " . CLI::error($e->getMessage()) . "\n"); @@ -1191,7 +1125,7 @@ function migrate_content($args, $opts) foreach ($workspaces as $workspace) { print_r('Regenerating content in: ' . pakeColor::colorize($workspace->name, 'INFO') . "\n"); CLI::logging("-> Regenerating content \n"); - $workspace->migrateContentRun($workspace->name, $lang); + $workspace->migrateContentRun($lang); } $stop = microtime(true); CLI::logging("<*> Optimizing content data Process took " . ($stop - $start) . " seconds.\n"); @@ -1373,3 +1307,74 @@ function remove_deprecated_files() $workspaceTools->removeDeprecatedFiles(); CLI::logging("<*> The deprecated files has been removed. \n"); } + +/** + * This function review the queries for each workspace or for an specific workspace + * + * @param array $args + * + * @return void + */ +function run_check_queries_incompatibilities($args) +{ + try { + $workspaces = get_workspaces_from_args($args); + if (count($args) === 1) { + CLI::logging("> Workspace: " . $workspaces[0]->name . PHP_EOL); + check_queries_incompatibilities($workspaces[0]->name); + } else { + foreach ($workspaces as $workspace) { + passthru(PHP_BINARY . " processmaker check-queries-incompatibilities " . $workspace->name); + } + } + echo "Done!\n\n"; + } catch (Exception $e) { + G::outRes(CLI::error($e->getMessage()) . "\n"); + } +} + +/** + * Check for the incompatibilities in the queries for the specific workspace + * + * @param string $wsName + */ +function check_queries_incompatibilities($wsName) +{ + Bootstrap::setConstantsRelatedWs($wsName); + require_once(PATH_DB . $wsName . '/db.php'); + System::initLaravel(); + + $query = Process::query()->select('PRO_UID', 'PRO_TITLE'); + $processesToCheck = $query->get()->values()->toArray(); + + $obj = new MySQL57(); + $resTriggers = $obj->checkIncompatibilityTriggers($processesToCheck); + + if (!empty($resTriggers)) { + foreach ($resTriggers as $trigger) { + echo ">> The \"" . $trigger['PRO_TITLE'] . "\" process has a trigger called: \"" . $trigger['TRI_TITLE'] . "\" that contains UNION queries. Review the code to discard incompatibilities with MySQL5.7." . PHP_EOL; + } + } else { + echo ">> No MySQL 5.7 incompatibilities in triggers found for this workspace." . PHP_EOL; + } + + $resDynaforms = $obj->checkIncompatibilityDynaforms($processesToCheck); + + if (!empty($resDynaforms)) { + foreach ($resDynaforms as $dynaform) { + echo ">> The \"" . $dynaform['PRO_TITLE'] . "\" process has a dynaform called: \"" . $dynaform['DYN_TITLE'] . "\" that contains UNION queries. Review the code to discard incompatibilities with MySQL5.7." . PHP_EOL; + } + } else { + echo ">> No MySQL 5.7 incompatibilities in dynaforms found for this workspace." . PHP_EOL; + } + + $resVariables = $obj->checkIncompatibilityVariables($processesToCheck); + + if (!empty($resVariables)) { + foreach ($resVariables as $variable) { + echo ">> The \"" . $variable['PRO_TITLE'] . "\" process has a variable called: \"" . $variable['VAR_NAME'] . "\" that contains UNION queries. Review the code to discard incompatibilities with MySQL5.7." . PHP_EOL; + } + } else { + echo ">> No MySQL 5.7 incompatibilities in variables found for this workspace." . PHP_EOL; + } +} diff --git a/workflow/engine/classes/ActionsByEmailCoreClass.php b/workflow/engine/classes/ActionsByEmailCoreClass.php index f013b02f9..e69d6cd22 100644 --- a/workflow/engine/classes/ActionsByEmailCoreClass.php +++ b/workflow/engine/classes/ActionsByEmailCoreClass.php @@ -1,324 +1,999 @@ defineWorkspace(); + $this->defineServicePath(); } - public function setup() + /** + * Set the action by email request + * + * @param array $v + */ + public function setAbeRequest($v) { + $this->abeRequest = $v; + } + + /** + * Get the action by email request + * + * @return array + */ + public function getAbeRequest() + { + return $this->abeRequest; + } + + /** + * Set the specific task property + * + * @param array $item + * + * @return void + */ + public function addItemAbeRequest(array $item) + { + $this->abeRequest = array_merge($this->abeRequest, $item); + } + + /** + * Get the specific task property + * + * @param string $key + * + * @return string + */ + public function getItemAbeRequest($key) + { + if (array_key_exists($key, $this->getAbeRequest())) { + return $this->abeRequest[$key]; + } else { + return []; + } + } + + /** + * Set the application uid + * + * @param string $v + */ + public function setAppUid($v) + { + $this->appUid = $v; + } + + /** + * Get the application uid + * + * @return string + */ + public function getAppUid() + { + return $this->appUid; + } + + /** + * Set the case number + * + * @param integer $v + */ + public function setAppNumber($v) + { + $this->appNumber = $v; + } + + /** + * Get the case number + * + * @return integer + */ + public function getAppNumber() + { + return $this->appNumber; + } + + /** + * Set the case properties + * + * @param array $v + */ + public function setCaseProperties(array $v) + { + $this->caseProperties = $v; + } + + /** + * Get the case properties + * + * @return array + */ + public function getCaseProperties() + { + return $this->caseProperties; + } + + /** + * Get the specific case property + * + * @param string $key + * + * @return array + */ + public function getCasePropertiesKey($key) + { + if (array_key_exists($key, $this->getCaseProperties())) { + return $this->caseProperties[$key]; + } else { + return []; + } + } + + /** + * Set the email from + * + * @param string $v + */ + public function setEmailFrom($v) + { + $this->emailFrom = $v; + } + + /** + * Get the email from + * + * @return string + */ + public function getEmailFrom() + { + return $this->emailFrom; + } + + /** + * Set the email to + * + * @param string $v + */ + public function setEmailTo($v) + { + $this->emailTo = $v; } - public function getFieldsForPageSetup() + /** + * Get the email to + * + * @return string + */ + public function getEmailTo() { - return array(); + return $this->emailTo; } - public function updateFieldsForPageSetup() + /** + * Set the index + * + * @param integer $v + */ + public function setIndex($v) { + $this->index = $v; + } + + /** + * Get the index + * + * @return integer + */ + public function getIndex() + { + return $this->index; + } + + /** + * Set prefix + * + * @param array $v + */ + public function setPrefix(array $v) + { + $this->prefix = $v; + } + + /** + * Get prefix + * + * @return array + */ + public function getPrefix() + { + return $this->prefix; + } + + /** + * Set the previous user + * + * @param string $v + */ + public function setPreviousUser($v) + { + $this->previousUser = $v; + } + + /** + * Get the previous user + * + * @return string + */ + public function getPreviousUser() + { + return $this->previousUser; + } + + /** + * Set the reply to + * + * @param string $v + */ + public function setReplyTo($v) + { + $this->replyTo = $v; + } + + /** + * Get the reply to + * + * @return string + */ + public function getReplyTo() + { + return $this->replyTo; + } + + /** + * Set the task + * + * @param string $v + */ + public function setTask($v) + { + $this->task = $v; + } + + /** + * Get the task + * + * @return string + */ + public function getTask() + { + return $this->task; + } + + /** + * Set in the task the action by email properties + * + * @param array $v + */ + public function setTaskAbeProperties(array $v) + { + $this->taskAbeProperties = $v; + } + + /** + * Get the task the action by email properties + * + * @return array + */ + public function getTaskAbeProperties() + { + return $this->taskAbeProperties; + } + + /** + * Add a item in the action by email properties + * + * @param array $item + * + * @return void + */ + public function addItemAbeProperties(array $item) + { + $this->taskAbeProperties = array_merge($this->taskAbeProperties, $item); + } + + /** + * Get the specific task property + * + * @param string $key + * + * @return array + */ + public function getItemAbeProperties($key) + { + if (array_key_exists($key, $this->getTaskAbeProperties())) { + return $this->taskAbeProperties[$key]; + } else { + return []; + } + } + + /** + * Set the link + */ + public function defineServicePath() + { + $this->servicePath = System::getServerMainPath() . '/services/ActionsByEmail'; + } + + /** + * Get the link + * + * @return string + */ + public function getServicePath() + { + return $this->servicePath; + } + + /** + * Set the user uid + * + * @param string $v + */ + public function setUser($v) + { + $this->user = $v; + } + + /** + * Get the user uid + * + * @return string + */ + public function getUser() + { + return $this->user; + } + + /** + * Set the subject + * + * @param string $v + */ + public function setSubject($v) + { + $this->subject = $v; + } + + /** + * Get the subject + * + * @return string + */ + public function getSubject() + { + return $this->subject; + } + + /** + * Set the workspace name + */ + public function defineWorkspace() + { + $this->workspace = config("system.workspace"); + } + + /** + * Get the workspace name + * + * @return string + */ + public function getWorkspace() + { + return $this->workspace; + } + + /** + * Get the email server definition + * + * @param string $emailServerKey + * + * @return object + */ + private function getEmailServer($emailServerKey) + { + $emailServer = new EmailServer(); + $emailSetup = (!is_null(EmailServerPeer::retrieveByPK($emailServerKey))) ? + $emailServer->getEmailServer($emailServerKey, true) : + $emailServer->getEmailServerDefault(); + + return $emailSetup; + } + + /** + * Define the properties in the task related the action by email configuration + * + * @return void + */ + private function defineTaskAbeProperties() + { + $actionEmailTable = new AbeConfiguration(); + $properties = $actionEmailTable->getTaskConfiguration($this->getCasePropertiesKey('PRO_UID'), $this->getTask()); + $this->setTaskAbeProperties($properties); + } + + /** + * Define the email from + * + * @param array $emailServerSetup + * + * @return void + */ + private function defineEmailFrom(array $emailServerSetup) + { + $from = ''; + if (!$this->getItemAbeProperties('ABE_MAILSERVER_OR_MAILCURRENT') && !empty($this->getItemAbeProperties('ABE_TYPE'))) { + if (!empty($this->getPreviousUser())) { + $user = new Users(); + $userDetails = $user->loadDetails($this->getPreviousUser()); + $from = ($userDetails["USR_FULLNAME"] . ' <' . $userDetails["USR_EMAIL"] . '>'); + } else { + global $RBAC; + + if ($RBAC != null && is_array($RBAC->aUserInfo['USER_INFO'])) { + $currentUser = $RBAC->aUserInfo['USER_INFO']; + $from = ($currentUser["USR_FIRSTNAME"] . ' ' . $currentUser["USR_LASTNAME"] . ' <' . $currentUser["USR_EMAIL"] . '>'); + } else { + $usersPeer = UsersPeer::retrieveByPK($this->getUser()); + if (!empty($usersPeer)) { + $from = ($usersPeer->getUsrFirstname() . ' ' . $usersPeer->getUsrLastname() . ' <' . $usersPeer->getUsrEmail() . '>'); + } + } + } + } + //Define the email from + $emailFrom = G::buildFrom($emailServerSetup, $from); + $this->setEmailFrom($emailFrom); + } + + /** + * Define the email to + * + * @param string $emailField + * @param array $caseData + * + * @return void + */ + private function defineEmailTo($emailField, array $caseData) + { + $emailField = str_replace($this->getPrefix(), '', $emailField); + if ($emailField != '' && isset($caseData[$emailField])) { + $emailTo = trim($caseData[$emailField]); + } else { + $userInstance = new Users(); + $emailTo = $userInstance->getAllInformation($this->getUser())['mail']; + } + + $this->setEmailTo($emailTo); + } + + /** + * Define the reply to + * + * @param string $receiverUid + * + * @return void + */ + private function defineReplyTo($receiverUid) + { + $emailServer = $this->getEmailServer($receiverUid); + $replyTo = $emailServer["MESS_ACCOUNT"]; + + $this->setReplyTo($replyTo); + } + + /** + * Define the subject + * + * @param string $subjectField + * @param array $caseData + * + * @return void + */ + private function defineSubject($subjectField, array $caseData) + { + $subject = G::replaceDataField($subjectField, $caseData, 'mysql', false); + if (empty($subject)) { + $subject = $this->getCasePropertiesKey('APP_TITLE'); + } + + $this->setSubject($subject); + } + + /** + * Validate and set the fields that we need for the action by email + * + * @param object $data + */ + private function validateAndSetValues($data) + { + try { + if (!is_object($data)) { + throw new Exception('The parameter $data is null.'); + } + // Validate the tas_uid + if (empty($data->TAS_UID)) { + throw new Exception('The parameter $data->TAS_UID is null or empty.'); + } else { + $this->setTask($data->TAS_UID); + } + // Validate the app_uid + if (empty($data->APP_UID)) { + throw new Exception('The parameter $data->APP_UID is null or empty.'); + } else { + $this->setAppUid($data->APP_UID); + } + // Validate the del_index + if (empty($data->DEL_INDEX)) { + throw new Exception('The parameter $data->DEL_INDEX is null or empty.'); + } elseif ($data->DEL_INDEX === 1) { + // Processmaker log + $context = Bootstrap::getDefaultContextLog(); + $context['delIndex'] = $data->DEL_INDEX; + Bootstrap::registerMonolog('ActionByEmail', 250, 'Actions by email does not work in the initial task', $context); + + return; + } else { + $this->setIndex($data->DEL_INDEX); + } + // Validate the usr_uid + if (empty($data->USR_UID)) { + throw new Exception('The parameter $data->USR_UID is null or empty.'); + } else { + $this->setUser($data->USR_UID); + } + // Define the previous user + if (!empty($data->PREVIOUS_USR_UID)) { + $this->setPreviousUser($data->PREVIOUS_USR_UID); + } + } catch (Exception $e) { + $token = strtotime("now"); + PMException::registerErrorLog($e, $token); + G::outRes(G::LoadTranslation("ID_EXCEPTION_LOG_INTERFAZ", [$token])); + die; + } } /** * Send Actions By Email. - * + * * @global object $RBAC * @param object $data * @param array $dataAbe * @return type * @throws Exception - * + * * @see AppDelegation->createAppDelegation() * @link https://wiki.processmaker.com/3.3/Actions_by_Email */ - public function sendActionsByEmail($data, $dataAbe) + public function sendActionsByEmail($data, array $dataAbe) { try { // Validations - try { - if (!is_object($data)) { - throw new Exception('The parameter $data is null.'); - } - if (!isset($data->TAS_UID)) { - throw new Exception('The parameter $data->TAS_UID is null.'); - } + self::validateAndSetValues($data); - if (!isset($data->APP_UID)) { - throw new Exception('The parameter $data->APP_UID is null.'); - } - - if (!isset($data->DEL_INDEX)) { - throw new Exception('The parameter $data->DEL_INDEX is null.'); - } - - if (!isset($data->USR_UID)) { - throw new Exception('The parameter $data->USR_UID is null.'); - } - - if ($data->TAS_UID === '') { - throw new Exception('The parameter $data->TAS_UID is empty.'); - } - - if ($data->APP_UID === '') { - throw new Exception('The parameter $data->APP_UID is empty.'); - } - - if ($data->DEL_INDEX === '') { - throw new Exception('The parameter $data->DEL_INDEX is empty.'); - } - - if ($data->DEL_INDEX === 1) { - error_log('The parameter $data->DEL_INDEX is 1, you can not use ActionsByEmail in the initial task', 0); - return; - } - - if ($data->USR_UID === '') { - error_log('The parameter $data->USR_UID is empty, the routed task may be a self-service type, actions by email does not work with self-service task types.', 0); - } - } catch(Exception $e) { - $token = strtotime("now"); - PMException::registerErrorLog($e, $token); - G::outRes( G::LoadTranslation("ID_EXCEPTION_LOG_INTERFAZ", array($token)) ); - die; - } - - $emailServer = new \ProcessMaker\BusinessModel\EmailServer(); - - $emailSetup = (!is_null(\EmailServerPeer::retrieveByPK($dataAbe['ABE_EMAIL_SERVER_UID']))) ? - $emailServer->getEmailServer($dataAbe['ABE_EMAIL_SERVER_UID'], true) : - $emailServer->getEmailServerDefault(); - - if (!empty($emailSetup)) { + $emailServerSetup = $this->getEmailServer($dataAbe['ABE_EMAIL_SERVER_UID']); + if (!empty($emailServerSetup)) { $cases = new Cases(); - $caseFields = $cases->loadCase($data->APP_UID, $data->DEL_INDEX); - $actionEmailTable = new AbeConfiguration(); - $configuration = $actionEmailTable->getTaskConfiguration($caseFields['PRO_UID'], $data->TAS_UID); - $caseFields['APP_DATA']['PRO_ID'] = $configuration['PRO_ID']; - $caseFields['APP_DATA']['TAS_ID'] = $configuration['TAS_ID']; + $caseFields = $cases->loadCase($this->getAppUid(), $this->getIndex()); + $this->setCaseProperties($caseFields); + $this->defineTaskAbeProperties(); + $caseFields['APP_DATA']['PRO_ID'] = $this->getItemAbeProperties('PRO_ID'); + $caseFields['APP_DATA']['TAS_ID'] = $this->getItemAbeProperties('TAS_ID'); + if (!empty($this->getTaskAbeProperties())) { + $this->defineEmailTo($this->getItemAbeProperties('ABE_EMAIL_FIELD'), $caseFields['APP_DATA']); - if (!empty($configuration)) { - $configuration['ABE_EMAIL_FIELD'] = str_replace('@@', '', $configuration['ABE_EMAIL_FIELD']); - if ($configuration['ABE_EMAIL_FIELD'] != '' && isset($caseFields['APP_DATA'][$configuration['ABE_EMAIL_FIELD']])) { - $email = trim($caseFields['APP_DATA'][$configuration['ABE_EMAIL_FIELD']]); - } else { - $userInstance = new Users(); - $userInfo = $userInstance->getAllInformation($data->USR_UID); - $email = $userInfo['mail']; - } + if (!empty($this->getEmailTo())) { + $this->defineSubject($this->getItemAbeProperties('ABE_SUBJECT_FIELD'), $caseFields['APP_DATA']); - if ($email != '') { - $subject = G::replaceDataField( $configuration['ABE_SUBJECT_FIELD'], $caseFields['APP_DATA'], 'mysql', false ); - if($subject == ''){ - $subject = $caseFields['APP_TITLE']; - } + $request = [ + 'ABE_REQ_UID' => '', + 'ABE_UID' => $this->getItemAbeProperties('ABE_UID'), + 'APP_UID' => $this->getAppUid(), + 'DEL_INDEX' => $this->getIndex(), + 'ABE_REQ_SENT_TO' => $this->getEmailTo(), + 'ABE_REQ_SUBJECT' => $this->getSubject(), + 'ABE_REQ_BODY' => '', + 'ABE_REQ_ANSWERED' => 0, + 'ABE_REQ_STATUS' => 'PENDING' + ]; + $this->setAbeRequest($request); + $this->registerRequest(); - $abeRequest = array(); - $abeRequest['ABE_REQ_UID'] = ''; - $abeRequest['ABE_UID'] = $configuration['ABE_UID']; - $abeRequest['APP_UID'] = $data->APP_UID; - $abeRequest['DEL_INDEX'] = $data->DEL_INDEX; - $abeRequest['ABE_REQ_SENT_TO'] = $email; - $abeRequest['ABE_REQ_SUBJECT'] = $subject; - $abeRequest['ABE_REQ_BODY'] = ''; - $abeRequest['ABE_REQ_ANSWERED'] = 0; - $abeRequest['ABE_REQ_STATUS'] = 'PENDING'; - - try { - $abeRequestsInstance = new AbeRequests(); - $abeRequest['ABE_REQ_UID'] = $abeRequestsInstance->createOrUpdate($abeRequest); - } catch (Exception $error) { - throw $error; - } - - if ($configuration['ABE_TYPE'] != '') { + if (!empty($this->getItemAbeProperties('ABE_TYPE'))) { // Email - $_SESSION['CURRENT_DYN_UID'] = $configuration['DYN_UID']; - + $_SESSION['CURRENT_DYN_UID'] = $this->getItemAbeProperties('DYN_UID'); $__ABE__ = ''; - - $link = System::getServerMainPath() . '/services/ActionsByEmail'; - switch ($configuration['ABE_TYPE']) { + switch ($this->getItemAbeProperties('ABE_TYPE')) { case 'CUSTOM': - $customGrid = unserialize($configuration['ABE_CUSTOM_GRID']); - $variableService = new \ProcessMaker\Services\Api\Project\Variable(); - $variables = $variableService->doGetVariables($caseFields['PRO_UID']); - $field = new stdClass(); - $field->label = ''; - $actionField = str_replace(array('@@', '@#', '@=', '@%', '@?', '@$'), '', $configuration['ABE_ACTION_FIELD']); - - $obj = new PmDynaform($configuration['DYN_UID']); - $configuration['CURRENT_DYNAFORM'] = $configuration['DYN_UID']; - $file = $obj->printPmDynaformAbe($configuration); - $__ABE__ .= $file; - $__ABE__ .= '
' . $field->label . ''; - $index = 1; - $__ABE__ .= '
'; - foreach ($customGrid as $key => $value) { - $__ABE__ .= '' . (($index % 5 == 0) ? '' : ' '); - $index++; - } - $__ABE__ .= '
' . $value['abe_custom_label']; - $__ABE__ .= '
'; + $__ABE__ .= $this->getCustomTemplate(); + break; + case 'RESPONSE': + $this->defineReplyTo($dataAbe['ABE_EMAIL_SERVER_RECEIVER_UID']); + $__ABE__ .= $this->getResponseTemplate(); break; case 'LINK': - $__ABE__ .= 'Please complete this form'; + $__ABE__ .= $this->getServicePathTemplate(); break; - // coment case 'FIELD': - $variableService = new \ProcessMaker\Services\Api\Project\Variable(); - $variables = $variableService->doGetVariables($caseFields['PRO_UID']); - $field = new stdClass(); - $field->label = 'Test'; - $field->type = 'dropdown'; - $field->options = array(); - $field->value = ''; - $actionField = str_replace(array('@@','@#','@=','@%','@?','@$'), '', $configuration['ABE_ACTION_FIELD']); - $dynaform = $configuration['DYN_UID']; - $variables = G::json_decode($configuration['DYN_CONTENT'], true); - if(isset($variables['items'][0]['items'])){ - $fields = $variables['items'][0]['items']; - foreach ($fields as $key => $value) { - foreach($value as $var){ - if(isset($var['variable'])){ - if ($var['variable'] == $actionField) { - $field->label = $var['label']; - $field->type = $var['type']; - $values = $var['options']; - foreach ($values as $val){ - $field->options[$val['value']] = $val['value']; - } - } - } - } - } - } - - $obj = new PmDynaform($configuration['DYN_UID']); - $configuration['CURRENT_DYNAFORM'] = $configuration['DYN_UID']; - $file = $obj->printPmDynaformAbe($configuration); - $__ABE__ .= $file; - $__ABE__ .= '' . $field->label . '
'; - switch ($field->type) { - case 'dropdown': - case 'radio': - case 'radiogroup': - $index = 1; - $__ABE__.='
'; - break; - case 'yesno': - $__ABE__ .= ''; - $__ABE__ .= ''; - break; - case 'checkbox': - $__ABE__ .= ''; - $__ABE__ .= ''; - break; - } - $__ABE__ .= '
'; - foreach ($field->options as $optValue => $optName) { - $__ABE__ .= '' . (($index % 5 == 0) ? '' : ' '); - $index++; - } - - $__ABE__.='
' . $optName; - $__ABE__ .= '
' . G::LoadTranslation('ID_YES_VALUE') . '' . G::LoadTranslation('ID_NO_VALUE') . 'CheckUncheck
'; + $__ABE__ .= $this->getFieldTemplate(); break; } - - $__ABE__ = preg_replace('/\/', '' , $__ABE__); - $__ABE__ = preg_replace('/\]*\/>/', '' , $__ABE__); + $__ABE__ = preg_replace('/\/', '', $__ABE__); + $__ABE__ = preg_replace('/\]*\/>/', '', $__ABE__); $__ABE__ = preg_replace('/]*>(.*?)<\/select>/is', "", $__ABE__); - $__ABE__ = preg_replace('/align=\"center\"/', '' , $__ABE__); - $__ABE__ = preg_replace('/class="tableGrid_view" /', 'class="tableGrid_view" width="100%" ', $__ABE__); + $__ABE__ = preg_replace('/align=\"center\"/', '', $__ABE__); + $__ABE__ = preg_replace('/class="tableGrid_view" /', 'class="tableGrid_view" width="100%" ', + $__ABE__); $caseFields['APP_DATA']['__ABE__'] = $__ABE__; - $user = new Users(); - - $emailFrom = ''; - if (!$configuration['ABE_MAILSERVER_OR_MAILCURRENT'] && $configuration['ABE_TYPE'] !== '') { - if ($data->PREVIOUS_USR_UID !== '') { - $userDetails = $user->loadDetails($data->PREVIOUS_USR_UID); - $emailFrom = ($userDetails["USR_FULLNAME"] . ' <' . $userDetails["USR_EMAIL"] . '>'); - } else { - global $RBAC; - if ($RBAC != null && is_array($RBAC->aUserInfo['USER_INFO'])) { - $currentUser = $RBAC->aUserInfo['USER_INFO']; - $emailFrom = ($currentUser["USR_FIRSTNAME"] . ' ' . $currentUser["USR_LASTNAME"] . ' <' . $currentUser["USR_EMAIL"] . '>'); - } else { - $usersPeer = UsersPeer::retrieveByPK($data->USR_UID); - if (!empty($usersPeer)) { - $emailFrom = ($usersPeer->getUsrFirstname() . ' ' . $usersPeer->getUsrLastname() . ' <' . $usersPeer->getUsrEmail() . '>'); - } - } - } - } else { - if (isset($emailSetup["MESS_FROM_NAME"]) && isset($emailSetup["MESS_FROM_MAIL"])) { - $emailFrom = ($emailSetup["MESS_FROM_NAME"] . ' <' . $emailSetup["MESS_FROM_MAIL"] . '>'); - } else { - $emailFrom = ((isset($emailSetup["MESS_FROM_NAME"])) ? $emailSetup["MESS_FROM_NAME"] : $emailSetup["MESS_FROM_MAIL"]); - } - } - - $wsBaseInstance = new WsBase(); - $result = $wsBaseInstance->sendMessage( - $data->APP_UID, - $emailFrom, - $email, - '', - '', - $subject, - $configuration['ABE_TEMPLATE'], + $this->defineEmailFrom($emailServerSetup); + $result = $this->abeSendMessage( + $this->getItemAbeProperties('ABE_TEMPLATE'), $caseFields['APP_DATA'], - null, - true, - $data->DEL_INDEX, - $emailSetup, - 0, - WsBase::MESSAGE_TYPE_ACTIONS_BY_EMAIL + $emailServerSetup ); - $abeRequest['ABE_REQ_STATUS'] = ($result->status_code == 0 ? 'SENT' : 'ERROR'); + $request = []; + $request['ABE_REQ_STATUS'] = ($result->status_code == 0 ? 'SENT' : 'ERROR'); - $body = ''; - $messageSent = executeQuery('SELECT `APP_MSG_BODY` FROM `APP_MESSAGE` ORDER BY `APP_MSG_SEND_DATE` DESC LIMIT 1'); - - if (!empty($messageSent) && is_array($messageSent)) { - $body = $messageSent[1]['APP_MSG_BODY']; - } - - $abeRequest['ABE_REQ_BODY'] = $body; - - // Update - try { - $abeRequestsInstance = new AbeRequests(); - $abeRequestsInstance->createOrUpdate($abeRequest); - } catch (Exception $error) { - throw $error; - } + $request['ABE_REQ_BODY'] = empty($result->getAppMessUid()) ? '' : AppMessage::getAppMsgBodyByKey($result->getAppMessUid()); + $this->addItemAbeRequest($request); + $this->registerRequest(); } } + } else { + throw new Exception('Task does not have an action by email configuration.'); } } } catch (Exception $error) { throw $error; } } + + /** + * Get the html template for email response + * + * @return string + */ + private function getResponseTemplate() + { + $noReply = $this->getReplyTo(); + $customGrid = unserialize($this->getItemAbeProperties('ABE_CUSTOM_GRID')); + $field = new stdClass(); + $field->label = ''; + $html = '
' . $field->label . ''; + $html .= '
'; + $index = 1; + foreach ($customGrid as $key => $value) { + // Get the subject + $emailSubject = $this->getSubjectByResponse($value['abe_custom_label']); + $emailBody = $this->getBodyByResponse($value['abe_custom_value']); + // Define the html for the actions + $html .= '' . (($index % 5 == 0) ? '' : ' '); + $index++; + } + $html .= '
'; + $html .= $value['abe_custom_label']; + $html .= '
'; + + return $html; + } + + /** + * Get the subject for response the action by email + * + * @param string $fieldLabel + * + * @return string + */ + private function getSubjectByResponse($fieldLabel) + { + $subject = G::LoadTranslation('ID_CASE') . ' ' . $this->getCasePropertiesKey('APP_TITLE'); + $subject .= $this->delimiter . ' ' . $fieldLabel; + + return urlencode($subject); + } + + /** + * Get the body for response the action by email + * + * @param string $fieldValue + * + * @return string + */ + private function getBodyByResponse($fieldValue) + { + $abeRequest = $this->getAbeRequest(); + $bodyToCrypt = [ + 'workspace' => $this->getWorkspace(), + 'appUid' => $this->getAppUid(), + 'delIndex' => $this->getIndex(), + 'fieldValue' => $fieldValue, + 'ABE_REQ_UID' => $abeRequest['ABE_REQ_UID'] + ]; + $bodyToCrypt = G::json_encode($bodyToCrypt); + + $body = str_repeat(self::BODY_REPLY_LF, 4); + $body .= '/' . str_repeat("=", 24) . self::BODY_REPLY_LF; + $body .= G::LoadTranslation('ID_ABE_EMAIL_RESPONSE_BODY_NOTE') . self::BODY_REPLY_LF; + $body .= '{' . Crypt::encryptString($bodyToCrypt) . '}' . self::BODY_REPLY_LF; + $body .= str_repeat("=", 24) . '/'; + return $body; + } + + /** + * Get the html template for custom actions + * @todo we need to revise this function + * + * @return string + */ + private function getCustomTemplate() + { + $abeRequest = $this->getAbeRequest(); + $customGrid = unserialize($this->getItemAbeProperties('ABE_CUSTOM_GRID')); + $variableService = new Variable(); + $variables = $variableService->doGetVariables($this->getCasePropertiesKey('PRO_UID')); + $field = new stdClass(); + $field->label = ''; + $actionField = str_replace( + $this->getPrefix(), + '', + $this->getItemAbeProperties('ABE_ACTION_FIELD') + ); + + $itemDynUid = $this->getItemAbeProperties('DYN_UID'); + $obj = new PmDynaform($itemDynUid); + $this->addItemAbeProperties(['CURRENT_DYNAFORM' => $itemDynUid]); + $file = $obj->printPmDynaformAbe($this->getTaskAbeProperties()); + $html = $file; + $html .= '
' . $field->label . ''; + $index = 1; + $html .= '
'; + foreach ($customGrid as $key => $value) { + $html .= '' . (($index % 5 == 0) ? '' : ' '); + $index++; + } + $html .= '
getServicePath())) . '?ACTION=' . G::encrypt('processABE', + URL_KEY, true) . '&APP_UID='; + $html .= G::encrypt($this->getAppUid(), URL_KEY, + true) . '&DEL_INDEX=' . G::encrypt($this->getindex(), URL_KEY); + $html .= '&FIELD=' . G::encrypt($actionField, URL_KEY, + true) . '&VALUE=' . G::encrypt($value['abe_custom_value'], URL_KEY, + true); + $html .= '&ABER=' . G::encrypt($abeRequest['ABE_REQ_UID'], URL_KEY, + true) . '" target="_blank" >' . $value['abe_custom_label']; + $html .= '
'; + + return $html; + } + + /** + * Get the html template for link to fill a form + * @todo we need to revise this function + * + * @return string + */ + private function getServicePathTemplate() + { + $abeRequest = $this->getAbeRequest(); + $html = 'Please complete this form'; + + return $html; + } + + /** + * Get the html template for use a field to generate actions links + * @todo we need to revise this function + * + * @return string + */ + private function getFieldTemplate() + { + $abeRequest = $this->getAbeRequest(); + $variableService = new Variable(); + $variables = $variableService->doGetVariables($this->getCasePropertiesKey('PRO_UID')); + $field = new stdClass(); + $field->label = 'Test'; + $field->type = 'dropdown'; + $field->options = []; + $field->value = ''; + $actionField = str_replace( + $this->getPrefix(), + '', + $this->getItemAbeProperties('ABE_ACTION_FIELD') + ); + $dynUid = $this->getItemAbeProperties('DYN_UID'); + $variables = G::json_decode($this->getItemAbeProperties('DYN_CONTENT'), true); + if (isset($variables['items'][0]['items'])) { + $fields = $variables['items'][0]['items']; + foreach ($fields as $key => $value) { + foreach ($value as $var) { + if (isset($var['variable'])) { + if ($var['variable'] == $actionField) { + $field->label = $var['label']; + $field->type = $var['type']; + $values = $var['options']; + foreach ($values as $val) { + $field->options[$val['value']] = $val['value']; + } + } + } + } + } + } + + $obj = new PmDynaform($dynUid); + $this->addItemAbeProperties(['CURRENT_DYNAFORM' => $dynUid]); + $file = $obj->printPmDynaformAbe($this->getTaskAbeProperties()); + $html = $file; + $html .= '' . $field->label . '
'; + switch ($field->type) { + case 'dropdown': + case 'radio': + case 'radiogroup': + $index = 1; + $html .= '
'; + break; + case 'yesno': + $html .= ''; + $html .= ''; + break; + case 'checkbox': + $html .= ''; + $html .= ''; + break; + } + $html .= '
'; + foreach ($field->options as $optValue => $optName) { + $html .= '' . (($index % 5 == 0) ? '' : ' '); + $index++; + } + + $html .= '
' . $optName; + $html .= '
' . G::LoadTranslation('ID_YES_VALUE') . '' . G::LoadTranslation('ID_NO_VALUE') . 'CheckUncheck
'; + + return $html; + } + + /** + * Register the request in the table ABE_REQUEST + * + * @return void + * @throws Exception + */ + private function registerRequest() + { + try { + $requestInstance = new AbeRequests(); + $abeRequest['ABE_REQ_UID'] = $requestInstance->createOrUpdate($this->getAbeRequest()); + $this->setAbeRequest($abeRequest); + } catch (Exception $error) { + throw $error; + } + } + + /** + * Send the message + * + * @param string $template + * @param array $caseData + * @param array $configEmail + * + * @return object + * @throws Exception + */ + private function abeSendMessage($template, array $caseData, array $configEmail) + { + try { + $wsBaseInstance = new WsBase(); + $result = $wsBaseInstance->sendMessage( + $this->getAppUid(), + $this->getEmailFrom(), + $this->getEmailTo(), + '', + '', + $this->getSubject(), + $template, + $caseData, + null, + true, + $this->getIndex(), + $configEmail, + 0, + WsBase::MESSAGE_TYPE_ACTIONS_BY_EMAIL + ); + + return $result; + } catch (Exception $error) { + throw $error; + } + } } diff --git a/workflow/engine/classes/MultipleFilesBackup.php b/workflow/engine/classes/MultipleFilesBackup.php index 8e06e5852..a3ee55cba 100644 --- a/workflow/engine/classes/MultipleFilesBackup.php +++ b/workflow/engine/classes/MultipleFilesBackup.php @@ -94,11 +94,21 @@ class MultipleFilesBackup } } - /* Restore from file(s) commpressed by letsBackup function, into a temporary directory - * @ filename got the name and path of the compressed file(s), if there are many files with file extention as a numerical series, the extention should be discriminated. - * @ srcWorkspace contains the workspace to be restored. - * @ dstWorkspace contains the workspace to be overwriting. - * @ overwrite got the option true if the workspace will be overwrite. + /** + * Restore from file(s) compressed by letsBackup function, into a temporary directory + * + * @param string $filename Got the name and path of the compressed file(s), if there are many files with file extention as a numerical series, the extention should be discriminated. + * @param string $srcWorkspace Contains the workspace to be restored. + * @param bool $dstWorkspace Contains the workspace to be overwriting. + * @param bool $overwrite Got the option true if the workspace will be overwrite. + * + * @throws Exception + * + * @see workflow/engine/bin/tasks/cliWorkspaces.php::run_workspace_restore() + * + * @link https://wiki.processmaker.com/3.0/Backing_up_and_Restoring_ProcessMaker#RestoringWorkspaces + * + * @deprecated Method outdated, only run the upgrade of APP_CACHE_VIEW table */ public static function letsRestore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true) { diff --git a/workflow/engine/classes/PmDynaform.php b/workflow/engine/classes/PmDynaform.php old mode 100644 new mode 100755 index a0e52da02..c8946e72f --- a/workflow/engine/classes/PmDynaform.php +++ b/workflow/engine/classes/PmDynaform.php @@ -15,27 +15,65 @@ class PmDynaform { use SuggestTrait; - public static $instance = null; - public $fields = null; - public $record = null; - public $records = null; + private $cache = []; + private $context = []; + private $databaseProviders = null; + private $dataSources = null; + private $lastQueryError = null; + private $propertiesToExclude = []; + private $sysSys = null; public $credentials = null; + public $displayMode = null; + public $fields = null; + public $isRTL = false; public $lang = SYS_LANG; public $langs = null; - public $displayMode = null; public $onPropertyRead = "onPropertyReadFormInstance"; - public $isRTL = false; public $pathRTLCss = ''; + public $record = null; + public $records = null; public $serverConf = null; - private $cache = array(); - private $sysSys = null; - private $context = array(); - private $dataSources = null; - private $databaseProviders = null; - private $propertiesToExclude = array(); - public static $prefixs = array("@@", "@#", "@%", "@?", "@$", "@="); + public static $instance = null; + public static $prefixs = ["@@", "@#", "@%", "@?", "@$", "@="]; - public function __construct($fields = array()) + /** + * Constructor + * + * @param array $fields + * @see workflow/engine/classes/class.pmFunctions.php PMFDynaFormFields() + * @see workflow/engine/classes/class.pmFunctions.php PMFgetLabelOption() + * @see \ConsolidatedCases->processConsolidated() + * @see \WorkspaceTools->syncFormsWithInputDocumentInfo() + * @see workflow/engine/methods/cases/ajaxListener.php Ajax->dynaformViewFromHistory() + * @see workflow/engine/methods/cases/caseConsolidated.php + * @see workflow/engine/methods/cases/cases_SaveData.php + * @see workflow/engine/methods/cases/cases_Step.php + * @see workflow/engine/methods/cases/cases_StepToRevise.php + * @see workflow/engine/methods/cases/casesHistoryDynaformPage_Ajax.php + * @see workflow/engine/methods/cases/pmDynaform.php + * @see workflow/engine/methods/cases/summary.php + * @see workflow/engine/methods/services/ActionsByEmailDataForm.php + * @see workflow/engine/plugins/EnterpriseSearch/display_dynaform.php + * @see workflow/engine/plugins/EnterpriseSearch/dynaform_view1.php + * @see \ProcessMaker\BusinessModel\ActionsByEmail->viewFormBpmn() + * @see \ProcessMaker\BusinessModel\Cases->getCaseVariables() + * @see \ProcessMaker\BusinessModel\Consolidated->getDataGenerate() + * @see \ProcessMaker\BusinessModel\InputDocument->update() + * @see \ProcessMaker\BusinessModel\Light\Tracker->showObjects() + * @see \ProcessMaker\BusinessModel\Variable->delete() + * @see \ProcessMaker\BusinessModel\Variable->executeSqlControl() + * @see \ProcessMaker\BusinessModel\Variable->update() + * @see \ProcessMaker\Core\System\ActionsByEmailCoreClass->sendActionsByEmail() + * @see \ProcessMaker\Services\Api\Light->doGetDynaForm() + * @see \ProcessMaker\Services\Api\Light->doGetDynaformProcessed() + * @see \ProcessMaker\Services\Api\Light->doGetDynaForms() + * @see \ProcessMaker\Services\Api\Light->doGetDynaFormsId() + * @see \ProcessMaker\Services\Api\Project\DynaForm->doDeleteDynaFormLanguage() + * @see \ProcessMaker\Services\Api\Project\DynaForm->doGetDynaFormLanguage() + * @see \ProcessMaker\Services\Api\Project\DynaForm->doGetListDynaFormLanguage() + * @see \ProcessMaker\Services\Api\Project\DynaForm->doPostDynaFormLanguage() + */ + public function __construct($fields = []) { $this->sysSys = (!empty(config("system.workspace"))) ? config("system.workspace") : "Undefined"; $this->context = \Bootstrap::getDefaultContextLog(); @@ -280,16 +318,7 @@ class PmDynaform } } if ($value === "suggest" && isset($json->queryField) && $json->queryField == true) { - $json->queryOutputData = array(); - foreach ($json->optionsSql as $option) { - if ($json->queryFilter !== '') { - if (stripos($option->label, $json->queryFilter) !== false) { - $json->queryOutputData[] = $option; - } - } else { - $json->queryOutputData[] = $option; - } - } + $this->searchResultInDataSource($json); } } } @@ -642,6 +671,8 @@ class PmDynaform } $json->rows = count($rows); $json->data = $rows; + + $this->setDataSchema($json, $this->fields["APP_DATA"][$json->name]); } } //languages @@ -685,6 +716,59 @@ class PmDynaform } } + /** + * This function will be search in the dataSource and will be add the new row in the queryOutputData property + * + * @param object $json + * + * @return void + */ + private function searchResultInDataSource($json) + { + $json->queryOutputData = []; + foreach ($json->optionsSql as $option) { + //We will to check the limit parameter + if (count($json->queryOutputData) < $json->queryLimit) { + //Searching by filter parameter + if ($json->queryFilter !== '') { + if (stripos($option->label, $json->queryFilter) !== false) { + $json->queryOutputData[] = $option; + } + } elseif (isset($json->querySearch) && is_array($json->querySearch) && !empty($json->querySearch)) { + //Searching by query parameter + $dataSearch = $json->querySearch; + $valueAdded = false; + //The match has priority + //We will to search match in the dataSource + if (isset($dataSearch['match'])) { + $value = isset($dataSearch['match']['value']) ? $dataSearch['match']['value'] : ''; + $label = isset($dataSearch['match']['text']) ? $dataSearch['match']['text'] : ''; + if (!empty($value) && $option->value === $value) { + $valueAdded = true; + $json->queryOutputData[] = $option; + } + if (!empty($label) && $option->label === $label && !$valueAdded) { + $json->queryOutputData[] = $option; + } + } elseif (isset($dataSearch['term'])) { + //We will to search term in the dataSource + $value = isset($dataSearch['term']['value']) ? $dataSearch['term']['value'] : ''; + $label = isset($dataSearch['term']['text']) ? $dataSearch['term']['text'] : ''; + if (!empty($value) && stripos($option->value, $value) !== false) { + $valueAdded = true; + $json->queryOutputData[] = $option; + } + if (!empty($label) && stripos($option->label, $label) !== false && !$valueAdded) { + $json->queryOutputData[] = $option; + } + } + } else { + $json->queryOutputData[] = $option; + } + } + } + } + private function getValuesDependentFields($json) { if (!isset($this->record["DYN_CONTENT"])) { @@ -736,6 +820,17 @@ class PmDynaform return $data; } + /** + * Get data from cache query. + * + * @param string $connection + * @param string $sql + * @param string $type + * @param boolean $clearCache + * @return array + * @see \PmDynaform->jsonr() + * @see \PmDynaform->getValuesDependentFields() + */ private function getCacheQueryData($connection, $sql, $type = "", $clearCache = false) { $data = []; @@ -764,6 +859,7 @@ class PmDynaform } catch (Exception $e) { $this->context["action"] = "execute-sql" . $type; $this->context["exception"] = (array) $e; + $this->lastQueryError = $e; \Bootstrap::registerMonolog("sqlExecution", 400, "Sql Execution", @@ -2215,6 +2311,27 @@ class PmDynaform $googleMaps->signature = $config['google_map_signature']; $result = 'var googleMaps = ' . G::json_encode($googleMaps) . ';'; return $result; + } + + /** + * Get last query error. + * + * @return object + * @see ProcessMaker\BusinessModel\Variable->executeSqlControl() + */ + public function getLastQueryError() + { + return $this->lastQueryError; + } + + /** + * Clear last query error. + * + * @see ProcessMaker\BusinessModel\Variable->executeSqlControl() + */ + public function clearLastQueryError() + { + $this->lastQueryError = null; } /** @@ -2265,4 +2382,32 @@ class PmDynaform } return $message; } + + /** + * This adds a new definition on the json dynaform + * @param json $json + * + * @link https://wiki.processmaker.com/3.0/Grid_Control + * @see workflow/engine/classes/PmDynaform->jsonr + */ + public function setDataSchema($json, $appDataVariables) + { + foreach ($json->data as $key => $value) { + $columnsData = []; + foreach ($json->columns as $keyData => $valueData) { + foreach ($appDataVariables as $keyAppData => $valueAppData) { + if (array_key_exists($valueData->id, $valueAppData) || array_key_exists($valueData->id . "_label", + $valueAppData) || array_key_exists($valueData->name, + $valueAppData) || array_key_exists($valueData->name . "_label", $valueAppData)) { + array_push($columnsData, ["defined" => true]); + break; + } else { + array_push($columnsData, ["defined" => false]); + break; + } + } + } + $json->dataSchema[$key] = $columnsData; + } + } } diff --git a/workflow/engine/classes/SpoolRun.php b/workflow/engine/classes/SpoolRun.php index 1b5ac211c..f5b1054fa 100644 --- a/workflow/engine/classes/SpoolRun.php +++ b/workflow/engine/classes/SpoolRun.php @@ -91,6 +91,26 @@ class SpoolRun $this->appMsgUid = $v; } + /** + * Set the $spoolId + * + * @param string + */ + public function setSpoolId($v) + { + $this->spoolId = $v; + } + + /** + * Get the $spoolId + * + * @return string + */ + public function getSpoolId() + { + return $this->spoolId; + } + /** * Get the fileData property * @@ -489,11 +509,13 @@ class SpoolRun switch ($this->config['MESS_ENGINE']) { case 'MAIL': case 'PHPMAILER': + case 'IMAP': switch ($this->config['MESS_ENGINE']) { case 'MAIL': $phpMailer = new PHPMailer(); $phpMailer->Mailer = 'mail'; break; + case 'IMAP': case 'PHPMAILER': $phpMailer = new PHPMailer(true); $phpMailer->Mailer = 'smtp'; @@ -505,6 +527,7 @@ class SpoolRun switch ($this->config['MESS_ENGINE']) { case 'MAIL': break; + case 'IMAP': case 'PHPMAILER': //Posible Options for SMTPSecure are: "", "ssl" or "tls" if (isset($this->config['SMTPSecure']) && preg_match('/^(ssl|tls)$/', $this->config['SMTPSecure'])) { diff --git a/workflow/engine/classes/Upgrade.php b/workflow/engine/classes/Upgrade.php deleted file mode 100644 index 67fa51dcf..000000000 --- a/workflow/engine/classes/Upgrade.php +++ /dev/null @@ -1,128 +0,0 @@ -addon = $addon; - } - - public function install() - { - - $filter = new InputFilter(); - $start = microtime(1); - $filename = $this->addon->getDownloadFilename(); - $time = microtime(1); - - $archive = new Archive_Tar ($filename); - $time = microtime(1); - $extractDir = dirname($this->addon->getDownloadFilename()) . "/extract"; - $extractDir = $filter->xssFilterHard($extractDir); - $backupDir = dirname($this->addon->getDownloadFilename()) . "/backup"; - $backupDir = $filter->xssFilterHard($backupDir); - if (file_exists($extractDir)) { - G::rm_dir($extractDir); - } - if (file_exists($backupDir)) { - G::rm_dir($backupDir); - } - if (!is_dir($backupDir)) { - mkdir($backupDir); - } - - $time = microtime(1); - echo "Extracting files...\n"; - $archive->extractModify($extractDir, 'processmaker'); - $checksumFile = file_get_contents("$extractDir/checksum.txt"); - $time = microtime(1); - $checksums = array(); - foreach (explode("\n", $checksumFile) as $line) { - $checksums[trim(substr($line, 33))] = substr($line, 0, 32); - } - - $checksum = array(); - $changedFiles = array(); - $time = microtime(1); - $files = $this->ls_dir($extractDir); - - echo "Updating ProcessMaker files...\n"; - $time = microtime(1); - $checksumTime = 0; - foreach ($checksums as $filename => $checksum) { - if (is_dir("$extractDir/$filename")) { - $filename = $filter->xssFilterHard($filename); - print $filename; - continue; - } - $installedFile = PATH_TRUNK . "/$filename"; - if (!file_exists($installedFile)) { - $installedMD5 = ""; - } else { - $time = microtime(1); - $installedMD5 = G::encryptFileOld($installedFile); - $checksumTime += microtime(1) - $time; - } - $archiveMD5 = $checksum; - if (strcasecmp($archiveMD5, $installedMD5) != 0) { - $changedFiles[] = $filename; - if (!is_dir(dirname($backupDir.'/'.$filename))) { - mkdir(dirname($backupDir.'/'.$filename), 0777, true); - } - if (file_exists($installedFile) && is_file($installedFile)) { - copy($installedFile, $backupDir.'/'.$filename); - } - if (!is_dir(dirname($installedFile))) { - mkdir(dirname($installedFile), 0777, true); - } - if (!copy("$extractDir/$filename", $installedFile)) { - throw new Exception("Could not overwrite '$filename'"); - } - } - } - - printf("Updated %d files\n", count($changedFiles)); - printf("Clearing cache...\n"); - if (defined('PATH_C')) { - G::rm_dir(PATH_C); - mkdir(PATH_C, 0777, true); - } - $workspaces = System::listWorkspaces(); - $count = count($workspaces); - $first = true; - $num = 0; - foreach ($workspaces as $index => $workspace) { - try { - $num += 1; - printf("Upgrading workspaces ($num/$count): {$workspace->name}\n"); - $workspace->upgrade(false, config("system.workspace"), false, 'en', ['updateXml' => $first, 'updateMafe' => $first]); - $workspace->close(); - $first = false; - } catch (Exception $e) { - printf("Errors upgrading workspace {$workspace->name}: {$e->getMessage()}\n"); - } - } - } - - private function ls_dir($dir, $basename = null) - { - $files = array(); - if ($basename == null) { - $basename = $dir; - } - foreach (glob("$dir/*") as $filename) { - if (is_dir($filename)) { - $files = array_merge($files, $this->ls_dir($filename, $basename)); - } else { - $files[] = substr($filename, strlen($basename) + 1); - } - } - return $files; - } - -} diff --git a/workflow/engine/classes/WorkspaceTools.php b/workflow/engine/classes/WorkspaceTools.php index 2f37b70d2..f4badbba6 100644 --- a/workflow/engine/classes/WorkspaceTools.php +++ b/workflow/engine/classes/WorkspaceTools.php @@ -7,9 +7,11 @@ use ProcessMaker\BusinessModel\Process as BmProcess; use ProcessMaker\ChangeLog\ChangeLog; /*----------------------------------********---------------------------------*/ use ProcessMaker\Core\Installer; +use ProcessMaker\Core\ProcessesManager; use ProcessMaker\Core\System; use ProcessMaker\Plugins\Adapters\PluginAdapter; use ProcessMaker\Project\Adapter\BpmnWorkflow; +use ProcessMaker\Upgrade\RunProcessUpgradeQuery; use ProcessMaker\Util\FixReferencePath; /** @@ -64,6 +66,23 @@ class WorkspaceTools 'UPDATE LIST_UNASSIGNED_GROUP SET USR_ID=(SELECT USR_ID FROM USERS WHERE USERS.USR_UID=LIST_UNASSIGNED_GROUP.USR_UID)', ); + public static $triggers = [ + 'APP_DELEGATION_UPDATE', + 'APPLICATION_UPDATE', + 'CONTENT_UPDATE' + ]; + public static $bigTables = [ + 'APPLICATION', + 'APP_ASSIGN_SELF_SERVICE_VALUE_GROUP', + 'APP_CACHE_VIEW', + 'APP_DELEGATION', + 'APP_DELAY', + 'APP_DOCUMENT', + 'APP_HISTORY', + 'APP_MESSAGE', + 'GROUP_USER', + 'LOGIN_LOG' + ]; private $lastContentMigrateTable = false; private $listContentMigrateTable = []; @@ -218,160 +237,130 @@ class WorkspaceTools /** * Upgrade this workspace to the latest system version * - * @param bool $buildCacheView - * @param string $workSpace - * @param bool $onedb + * @param string $workspace * @param string $lang * @param array $arrayOptTranslation + * @param array $optionMigrateHistoryData * * @return void */ - public function upgrade($buildCacheView = false, $workSpace = null, $onedb = false, $lang = 'en', array $arrayOptTranslation = null, $optionMigrateHistoryData = []) + public function upgrade($workspace, $lang = 'en', array $arrayOptTranslation = null, $optionMigrateHistoryData = []) { - if ($workSpace === null) { - $workSpace = config("system.workspace"); - } if (is_null($arrayOptTranslation)) { $arrayOptTranslation = ['updateXml' => true, 'updateMafe' => true]; } + CLI::logging("* Start updating database schema...\n"); $start = microtime(true); - CLI::logging("> Remove deprecated files...\n"); - $this->removeDeprecatedFiles(); - $stop = microtime(true); - CLI::logging("<*> Remove deprecated files took " . ($stop - $start) . " seconds.\n"); + $this->upgradeDatabase(); + CLI::logging("* End updating database schema...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start updating translations...\n"); $start = microtime(true); - CLI::logging("> Updating database...\n"); - $this->upgradeDatabase($onedb); - $stop = microtime(true); - CLI::logging("<*> Database Upgrade Process took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Check Intermediate Email Event...\n"); - $this->checkIntermediateEmailEvent(); - $stop = microtime(true); - CLI::logging("<*> Database Upgrade Process took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Verify enterprise old...\n"); - $this->verifyFilesOldEnterprise($workSpace); - $stop = microtime(true); - CLI::logging("<*> Verify took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Updating translations...\n"); $this->upgradeTranslation($arrayOptTranslation['updateXml'], $arrayOptTranslation['updateMafe']); - $stop = microtime(true); - $final = $stop - $start; - CLI::logging("<*> Updating Translations Process took $final seconds.\n"); + CLI::logging("* End updating translations...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start checking MAFE requirements...\n"); $start = microtime(true); - CLI::logging("> Updating Content...\n"); - $this->upgradeContent($workSpace); - $stop = microtime(true); - $final = $stop - $start; - CLI::logging("<*> Updating Content Process took $final seconds.\n"); + $this->checkMafeRequirements($workspace, $lang); + CLI::logging("* End checking MAFE requirements...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start deleting MySQL triggers: " . implode(', ', self::$triggers) . "...\n"); $start = microtime(true); - CLI::logging("> Check Mafe Requirements...\n"); - $this->checkMafeRequirements($workSpace, $lang); - $stop = microtime(true); - $final = $stop - $start; - CLI::logging("<*> Check Mafe Requirements Process took $final seconds.\n"); + $this->deleteTriggersMySQL(self::$triggers); + CLI::logging("* End deleting MySQL triggers: " . implode(', ', self::$triggers) . "... (Completed on " . + (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start deleting indexes from big tables: " . implode(', ', self::$bigTables) . "...\n"); $start = microtime(true); - CLI::logging("> Updating Triggers...\n"); - $this->updateTriggers(true, $lang); - $stop = microtime(true); - $final = $stop - $start; - CLI::logging("<*> Updating Triggers Process took $final seconds.\n"); + $this->deleteIndexes(self::$bigTables); + CLI::logging("* End deleting indexes from big tables: " . implode(', ', self::$bigTables) . "... (Completed on " . + (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start to update CONTENT table...\n"); $start = microtime(true); - CLI::logging("> Backup log files...\n"); - $this->backupLogFiles(); - $stop = microtime(true); - $final = $stop - $start; - CLI::logging("<*> Backup log files Process took $final seconds.\n"); + $this->upgradeContent($workspace); + CLI::logging("* End to update CONTENT table... (Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start to migrate texts/values from 'CONTENT' table to the corresponding object tables...\n"); $start = microtime(true); - CLI::logging("> Optimizing content data...\n"); - $this->migrateContent($workSpace, $lang); - $stop = microtime(true); - CLI::logging("<*> Optimizing content data took " . ($stop - $start) . " seconds.\n"); + $this->migrateContent($lang); + CLI::logging("* End to migrate texts/values from 'CONTENT' table to the corresponding object tables... (Completed on " . + (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start updating rows in Web Entry table for classic processes...\n"); $start = microtime(true); - CLI::logging("> Migrating and populating indexing for avoiding the use of table APP_CACHE_VIEW...\n"); - $this->migratePopulateIndexingACV($workSpace); - $stop = microtime(true); - CLI::logging("<*> Migrating an populating indexing for avoiding the use of table APP_CACHE_VIEW process took " . ($stop - $start) . " seconds.\n"); + $this->updatingWebEntryClassicModel(true); + CLI::logging("* End updating rows in Web Entry table for classic processes...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); - /*----------------------------------********---------------------------------*/ + CLI::logging("* Start to update Files Manager...\n"); $start = microtime(true); - CLI::logging("> Migrate new lists...\n"); - $this->migrateList($workSpace, false, $lang); - $stop = microtime(true); - $final = $stop - $start; - CLI::logging("<*> Migrate new lists Process took $final seconds.\n"); - /*----------------------------------********---------------------------------*/ + $this->processFilesUpgrade($workspace); + CLI::logging("* End to update Files Manager... (Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start migrating and populating plugin singleton data...\n"); $start = microtime(true); - CLI::logging("> Updating Files Manager...\n"); - $this->processFilesUpgrade(); - $stop = microtime(true); - CLI::logging("<*> Updating Files Manager took " . ($stop - $start) . " seconds.\n"); + $this->migrateSingleton($workspace); + CLI::logging("* End migrating and populating plugin singleton data...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start cleaning expired tokens...\n"); $start = microtime(true); - CLI::logging("> Clean access and refresh tokens...\n"); - $this->cleanTokens($workSpace); - $stop = microtime(true); - CLI::logging("<*> Clean access and refresh tokens took " . ($stop - $start) . " seconds.\n"); + $this->cleanTokens(); + CLI::logging("* End cleaning expired tokens...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start to check Intermediate Email Event...\n"); $start = microtime(true); - CLI::logging("> Optimizing Self-Service data...\n"); - $this->migrateSelfServiceRecordsRun($workSpace); - $stop = microtime(true); - CLI::logging("<*> Migrating Self-Service records Process took " . ($stop - $start) . " seconds.\n"); + $this->checkIntermediateEmailEvent(); + CLI::logging("* End to check Intermediate Email Event... (Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start cleaning DYN_CONTENT in APP_HISTORY...\n"); $start = microtime(true); - CLI::logging("> Updating rows in Web Entry table for classic processes...\n"); - $this->updatingWebEntryClassicModel($workSpace); - $stop = microtime(true); - CLI::logging("<*> Updating rows in Web Entry table for classic processes took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Update framework paths...\n"); - $this->updateFrameworkPaths($workSpace); - $stop = microtime(true); - CLI::logging("<*> Update framework paths took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Migrating and populating plugin singleton data...\n"); - $this->migrateSingleton($workSpace); - $stop = microtime(true); - CLI::logging("<*> Migrating and populating plugin singleton data took " . ($stop - $start) . " seconds.\n"); - $keepDynContent = isset($optionMigrateHistoryData['keepDynContent']) && $optionMigrateHistoryData['keepDynContent'] === true; - //Review if we need to remove the 'History of use' from APP_HISTORY - $start = microtime(true); - CLI::logging("> Clearing History of Use from APP_HISTORY table...\n"); $this->clearDynContentHistoryData(false, $keepDynContent); - $stop = microtime(true); - CLI::logging("<*> Clearing History of Use from APP_HISTORY table took " . ($stop - $start) . " seconds.\n"); + CLI::logging("* End cleaning DYN_CONTENT in APP_HISTORY...(Completed on " . (microtime(true) - $start) . " seconds)\n"); /*----------------------------------********---------------------------------*/ + CLI::logging("* Start migrating history data...\n"); $start = microtime(true); - CLI::logging("> Migrating history data...\n"); - $this->migrateAppHistoryToAppDataChangeLog(false); - $stop = microtime(true); - CLI::logging("<*> Migrating history data took " . ($stop - $start) . " seconds.\n"); + $this->migrateAppHistoryToAppDataChangeLog(true); + CLI::logging("* End migrating history data...(Completed on " . (microtime(true) - $start) . " seconds)\n"); /*----------------------------------********---------------------------------*/ + CLI::logging("* Start migrating and populating indexing for avoiding the use of table APP_CACHE_VIEW...\n"); + $start = microtime(true); + $this->migratePopulateIndexingACV(); + CLI::logging("* End migrating and populating indexing for avoiding the use of table APP_CACHE_VIEW...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP....\n"); + $start = microtime(true); + $this->migrateSelfServiceRecordsRun(); + CLI::logging("* End optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP....(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start adding new fields and populating values in tables related to feature self service by value...\n"); $start = microtime(true); - CLI::logging("> Optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP....\n"); $this->upgradeSelfServiceData(); - $stop = microtime(true); - CLI::logging("<*> Optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP took " . ($stop - $start) . " seconds.\n"); + CLI::logging("* End adding new fields and populating values in tables related to feature self service by value...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start adding/replenishing all indexes...\n"); + $start = microtime(true); + $systemSchema = System::getSystemSchema($this->dbAdapter); + $this->upgradeSchema($systemSchema); + CLI::logging("* End adding/replenishing all indexes...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start migrating to new list tables...\n"); + $start = microtime(true); + $this->migrateList(true, $lang); + CLI::logging("* End migrating to new list tables...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start updating MySQL triggers...\n"); + $start = microtime(true); + $this->updateTriggers(true, $lang); + CLI::logging("* End updating MySQL triggers...(" . (microtime(true) - $start) . " seconds)\n"); } /** @@ -391,6 +380,9 @@ class WorkspaceTools CLI::logging("<*> Database Upgrade Structure Process took $final seconds.\n"); } + /** + * Update the email events with the current email server + */ public function checkIntermediateEmailEvent() { $oEmailEvent = new \ProcessMaker\BusinessModel\EmailEvent(); @@ -629,9 +621,11 @@ class WorkspaceTools } /** - * Upgrade this workspace Content. + * Upgrade this workspace Content + * * @param string $workspace * @param boolean $executeRegenerateContent + * * @return void */ public function upgradeContent($workspace = null, $executeRegenerateContent = false) @@ -683,7 +677,7 @@ class WorkspaceTools } /** - * Upgrade this workspace translations from all avaliable languages. + * Upgrade the workspace translations from all available languages * * @param bool $flagXml Update XML * @param bool $flagMafe Update MAFE @@ -1055,26 +1049,22 @@ class WorkspaceTools } /** - * Upgrade this workspace database to the latest system schema - * - * @param bool $checkOnly only check if the upgrade is needed if true - * @return array bool upgradeSchema for more information + * Upgrade the workspace database to the latest system schema */ - public function upgradeDatabase($onedb = false, $checkOnly = false) + public function upgradeDatabase() { $this->initPropel(true); P11835::$dbAdapter = $this->dbAdapter; P11835::isApplicable(); $systemSchema = System::getSystemSchema($this->dbAdapter); - $systemSchemaRbac = System::getSystemSchemaRbac($this->dbAdapter);// get the Rbac Schema + $systemSchemaRbac = System::getSystemSchemaRbac($this->dbAdapter);// Get the RBAC Schema $this->registerSystemTables(array_merge($systemSchema, $systemSchemaRbac)); - $this->upgradeSchema($systemSchema); - $this->upgradeSchema($systemSchemaRbac, false, true, $onedb); // perform Upgrade to Rbac + $this->upgradeSchema($systemSchema, false, false, false); // Without add indexes + $this->upgradeSchema($systemSchemaRbac, false, true); // Perform upgrade to RBAC $this->upgradeData(); $this->checkRbacPermissions();//check or add new permissions $this->checkSequenceNumber(); $this->migrateIteeToDummytask($this->name); - $this->upgradeConfiguration(); /*----------------------------------********---------------------------------*/ $this->upgradeAuditLog($this->name); /*----------------------------------********---------------------------------*/ @@ -1137,10 +1127,7 @@ class WorkspaceTools $arrayData = $emailSever->create2($arrayData); } } - P11835::execute(); - - return true; } private function setFormatRows() @@ -1161,14 +1148,18 @@ class WorkspaceTools } /** - * Upgrade this workspace database from a schema + * Upgrade the workspace database according to the schema * - * @param array $schema the schema information, such as returned from getSystemSchema - * @param bool $checkOnly only check if the upgrade is needed if true - * @return array bool the changes if checkOnly is true, else return - * true on success + * @param array $schema The schema information, such as returned from getSystemSchema + * @param bool $checkOnly Only return the diff between current database and the schema + * @param bool $rbac Is RBAC database? + * @param bool $includeIndexes Include or no indexes in new tables + * + * @return bool|array + * + * @throws Exception */ - public function upgradeSchema($schema, $checkOnly = false, $rbac = false, $onedb = false) + public function upgradeSchema($schema, $checkOnly = false, $rbac = false, $includeIndexes = true) { $dbInfo = $this->getDBInfo(); @@ -1223,11 +1214,11 @@ class WorkspaceTools CLI::logging("-> " . count($changes['tablesToAdd']) . " tables to add\n"); } - foreach ($changes['tablesToAdd'] as $sTable => $aColumns) { - $database->executeQuery($database->generateCreateTableSQL($sTable, $aColumns)); - if (isset($changes['tablesToAdd'][$sTable]['INDEXES'])) { - foreach ($changes['tablesToAdd'][$sTable]['INDEXES'] as $indexName => $aIndex) { - $database->executeQuery($database->generateAddKeysSQL($sTable, $indexName, $aIndex)); + foreach ($changes['tablesToAdd'] as $tableName => $columns) { + $database->executeQuery($database->generateCreateTableSQL($tableName, $columns)); + if (isset($changes['tablesToAdd'][$tableName]['INDEXES']) && $includeIndexes) { + foreach ($changes['tablesToAdd'][$tableName]['INDEXES'] as $indexName => $keys) { + $database->executeQuery($database->generateAddKeysSQL($tableName, $indexName, $keys)); } } } @@ -1236,46 +1227,93 @@ class WorkspaceTools CLI::logging("-> " . count($changes['tablesToAlter']) . " tables to alter\n"); } - foreach ($changes['tablesToAlter'] as $sTable => $aActions) { - foreach ($aActions as $sAction => $aAction) { - foreach ($aAction as $sColumn => $vData) { - switch ($sAction) { - case 'DROP': - $database->executeQuery($database->generateDropColumnSQL($sTable, $vData)); - break; - case 'ADD': - if ($database->checkPatchHor1787($sTable, $sColumn, $vData)) { - $database->executeQuery($database->generateCheckAddColumnSQL($sTable, $sColumn, $vData)); - $database->executeQuery($database->deleteAllIndexesIntable($sTable, $sColumn, $vData)); - } - $database->executeQuery($database->generateAddColumnSQL($sTable, $sColumn, $vData)); - break; - case 'CHANGE': - $database->executeQuery($database->generateChangeColumnSQL($sTable, $sColumn, $vData)); - break; + $tablesToAddColumns = []; + + foreach ($changes['tablesToAlter'] as $tableName => $actions) { + foreach ($actions as $action => $actionData) { + if ($action == 'ADD') { + $tablesToAddColumns[$tableName] = $actionData; + + // In a very old schema the primary key for table "LOGIN_LOG" was changed and we need to delete the + // primary index to avoid errors in the database upgrade + // TO DO: The change of a Primary Key in a table should be generic + if ($tableName == 'LOGIN_LOG' && array_key_exists('LOG_ID', $actionData)) { + $database->executeQuery('DROP INDEX `PRIMARY` ON LOGIN_LOG;'); + } + } else { + foreach ($actionData as $columnName => $meta) { + switch ($action) { + case 'DROP': + $database->executeQuery($database->generateDropColumnSQL($tableName, $meta)); + break; + case 'CHANGE': + $database->executeQuery($database->generateChangeColumnSQL($tableName, $columnName, $meta)); + break; + } } } } } - if (!empty($changes['tablesWithNewIndex'])) { - CLI::logging("-> " . count($changes['tablesWithNewIndex']) . " indexes to add\n"); - } - foreach ($changes['tablesWithNewIndex'] as $sTable => $aIndexes) { - foreach ($aIndexes as $sIndexName => $aIndexFields) { - $database->executeQuery($database->generateAddKeysSQL($sTable, $sIndexName, $aIndexFields)); + if (!empty($tablesToAddColumns)) { + $upgradeQueries = []; + foreach ($tablesToAddColumns as $tableName => $tableColumn) { + $indexes = []; + if (!empty($changes['tablesWithNewIndex'][$tableName]) && $includeIndexes) { + $indexes = $changes['tablesWithNewIndex'][$tableName]; + unset($changes['tablesWithNewIndex'][$tableName]); + } + + // Instantiate the class to execute the query in background + $upgradeQueries[] = new RunProcessUpgradeQuery($this->name, $database->generateAddColumnsSql($tableName, $tableColumn, $indexes), $rbac); + } + + // Run queries in multiple threads + $processesManager = new ProcessesManager($upgradeQueries); + $processesManager->run(); + + // If exists an error throw an exception + if (!empty($processesManager->getErrors())) { + $errorMessage = ''; + foreach ($processesManager->getErrors() as $error) { + $errorMessage .= $error['rawAnswer'] . PHP_EOL; + } + throw new Exception($errorMessage); } } - if (!empty($changes['tablesToAlterIndex'])) { - CLI::logging("-> " . count($changes['tablesToAlterIndex']) . " indexes to alter\n"); - } - foreach ($changes['tablesToAlterIndex'] as $sTable => $aIndexes) { - foreach ($aIndexes as $sIndexName => $aIndexFields) { - $database->executeQuery($database->generateDropKeySQL($sTable, $sIndexName)); - $database->executeQuery($database->generateAddKeysSQL($sTable, $sIndexName, $aIndexFields)); + if (!empty($changes['tablesWithNewIndex']) && $includeIndexes) { + CLI::logging("-> " . count($changes['tablesWithNewIndex']) . " tables with indexes to add\n"); + $upgradeQueries = []; + foreach ($changes['tablesWithNewIndex'] as $tableName => $indexes) { + // Instantiate the class to execute the query in background + $upgradeQueries[] = new RunProcessUpgradeQuery($this->name, $database->generateAddColumnsSql($tableName, [], $indexes), $rbac); + } + + // Run queries in multiple threads + $processesManager = new ProcessesManager($upgradeQueries); + $processesManager->run(); + + // If exists an error throw an exception + if (!empty($processesManager->getErrors())) { + $errorMessage = ''; + foreach ($processesManager->getErrors() as $error) { + $errorMessage .= $error['rawAnswer'] . PHP_EOL; + } + throw new Exception($errorMessage); } } + + if (!empty($changes['tablesToAlterIndex']) && $includeIndexes) { + CLI::logging("-> " . count($changes['tablesToAlterIndex']) . " tables with indexes to alter\n"); + foreach ($changes['tablesToAlterIndex'] as $tableName => $indexes) { + foreach ($indexes as $indexName => $indexFields) { + $database->executeQuery($database->generateDropKeySQL($tableName, $indexName)); + $database->executeQuery($database->generateAddKeysSQL($tableName, $indexName, $indexFields)); + } + } + } + $this->closeDatabase(); return true; } @@ -1828,7 +1866,7 @@ class WorkspaceTools } /** - * restore an archive into a workspace + * Restore a workspace * * Restores any database and files included in the backup, either as a new * workspace, or overwriting a previous one @@ -1839,8 +1877,13 @@ class WorkspaceTools * @param boolean $overwrite if you need overwrite the database * @param string $lang for define the language * @param string $port of database if is empty take 3306 + * @param array $optionMigrateHistoryData * * @throws Exception + * + * @see workflow/engine/bin/tasks/cliWorkspaces.php::run_workspace_restore() + * + * @link https://wiki.processmaker.com/3.0/Backing_up_and_Restoring_ProcessMaker#RestoringWorkspaces */ public static function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '', $optionMigrateHistoryData = []) { @@ -2008,115 +2051,122 @@ class WorkspaceTools } } - $start = microtime(true); - CLI::logging("> Remove deprecated files...\n"); - $workspace->removeDeprecatedFiles(); - $stop = microtime(true); - CLI::logging("<*> Remove deprecated files took " . ($stop - $start) . " seconds.\n"); - - if (($pmVersionWorkspaceToRestore != '') && (version_compare( - $pmVersionWorkspaceToRestore . "", - $pmVersion . "", - "<" - ) || $pmVersion == "") - ) { - $start = microtime(true); - CLI::logging("> Updating database...\n"); - $workspace->upgradeDatabase($onedb); - $stop = microtime(true); - CLI::logging("<*> Database Upgrade Process took " . ($stop - $start) . " seconds.\n"); - } - - $start = microtime(true); - CLI::logging("> Verify files enterprise old...\n"); - $workspace->verifyFilesOldEnterprise($workspaceName); - $stop = microtime(true); - CLI::logging("<*> Verify took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Verify License Enterprise...\n"); - $workspace->verifyLicenseEnterprise($workspaceName); - $stop = microtime(true); - CLI::logging("<*> Verify took " . ($stop - $start) . " seconds.\n"); - - $start = microtime(true); - CLI::logging("> Check Mafe Requirements...\n"); - $workspace->checkMafeRequirements($workspaceName, $lang); - $stop = microtime(true); - CLI::logging("<*> Check Mafe Requirements Process took " . ($stop - $start) . " seconds.\n"); - - if (($pmVersionWorkspaceToRestore != '') && (version_compare( - $pmVersionWorkspaceToRestore . "", - $pmVersion . "", - "<" - ) || $pmVersion == "") - ) { - $start = microtime(true); - CLI::logging("> Updating cache view...\n"); - $workspace->upgradeCacheView(true, true, $lang); - $stop = microtime(true); - CLI::logging("<*> Updating cache view Process took " . ($stop - $start) . " seconds.\n"); - } else { - $workspace->upgradeTriggersOfTables(true, $lang); - } - - if ($pmVersion == '' && strpos(strtoupper($version), 'BRANCH')) { + if (empty($pmVersion) && strpos(strtoupper($version), 'BRANCH')) { $pmVersion = 'dev-version-backup'; } - //Move the labels of content to the corresponding table - $start = microtime(true); - CLI::logging("> Optimizing content data...\n"); - $workspace->migrateContent($workspace->name, $lang); - $stop = microtime(true); - CLI::logging("<*> Optimizing content data took " . ($stop - $start) . " seconds.\n"); + if (!empty($pmVersionWorkspaceToRestore) && (version_compare( + $pmVersionWorkspaceToRestore . "", + $pmVersion . "", + "<" + ) || empty($pmVersion)) || $pmVersion == "dev-version-backup" + ) { + // Upgrade the database schema and data + CLI::logging("* Start updating database schema...\n"); + $start = microtime(true); + $workspace->upgradeDatabase(); + CLI::logging("* End updating database schema...(Completed on " . (microtime(true) - $start) . " seconds)\n"); - //Populate the new fields for replace string UID to Interger ID - $start = microtime(true); - CLI::logging("> Migrating and populating indexing for APP_CACHE_VIEW...\n"); - $workspace->migratePopulateIndexingACV($workspace->name); - $stop = microtime(true); - CLI::logging("<*> Migrating an populating indexing for APP_CACHE_VIEW process took " . ($stop - $start) . " seconds.\n"); + CLI::logging("* Start checking MAFE requirements...\n"); + $start = microtime(true); + $workspace->checkMafeRequirements($workspaceName, $lang); + CLI::logging("* End checking MAFE requirements...(Completed on " . (microtime(true) - $start) . " seconds)\n"); - //Move the data of cases to the corresponding List - /*----------------------------------********---------------------------------*/ - $start = microtime(true); - CLI::logging("> Updating List tables...\n"); - $workspace->migrateList($workspace->name, false, $lang); - $stop = microtime(true); - CLI::logging("<*> Updating List Process took " . ($stop - $start) . " seconds.\n"); - /*----------------------------------********---------------------------------*/ + CLI::logging("* Start deleting MySQL triggers: " . implode(', ', self::$triggers) . "...\n"); + $start = microtime(true); + $workspace->deleteTriggersMySQL(self::$triggers); + CLI::logging("* End deleting MySQL triggers: " . implode(', ', self::$triggers) . "... (Completed on " . + (microtime(true) - $start) . " seconds)\n"); - $start = microtime(true); - CLI::logging("> Updating Files Manager...\n"); - $workspace->processFilesUpgrade(); - $stop = microtime(true); - CLI::logging("<*> Updating Files Manager took " . ($stop - $start) . " seconds.\n"); + CLI::logging("* Start deleting indexes from big tables: " . implode(', ', self::$bigTables) . "...\n"); + $start = microtime(true); + $workspace->deleteIndexes(self::$bigTables); + CLI::logging("* End deleting indexes from big tables: " . implode(', ', self::$bigTables) . "... (Completed on " . + (microtime(true) - $start) . " seconds)\n"); - //Updating generated class files for PM Tables - passthru(PHP_BINARY . ' processmaker regenerate-pmtable-classes ' . $workspace->name); + CLI::logging("* Start to migrate texts/values from 'CONTENT' table to the corresponding object tables...\n"); + $start = microtime(true); + $workspace->migrateContent($lang); + CLI::logging("* End to migrate texts/values from 'CONTENT' table to the corresponding object tables... (Completed on " . + (microtime(true) - $start) . " seconds)\n"); - $keepDynContent = isset($optionMigrateHistoryData['keepDynContent']) && $optionMigrateHistoryData['keepDynContent'] === true; - //Review if we need to remove the 'History of use' from APP_HISTORY - $start = microtime(true); - CLI::logging("> Clearing History of Use from APP_HISTORY table...\n"); - $workspace->clearDynContentHistoryData(false, $keepDynContent); - $stop = microtime(true); - CLI::logging("<*> Clearing History of Use from APP_HISTORY table took " . ($stop - $start) . " seconds.\n"); + CLI::logging("* Start updating rows in Web Entry table for classic processes...\n"); + $start = microtime(true); + $workspace->updatingWebEntryClassicModel(true); + CLI::logging("* End updating rows in Web Entry table for classic processes...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); - /*----------------------------------********---------------------------------*/ - $start = microtime(true); - CLI::logging("> Migrating history data...\n"); - $workspace->migrateAppHistoryToAppDataChangeLog(false); - $stop = microtime(true); - CLI::logging("<*> Migrating history data took " . ($stop - $start) . " seconds.\n"); - /*----------------------------------********---------------------------------*/ + CLI::logging("* Start to update Files Manager...\n"); + $start = microtime(true); + $workspace->processFilesUpgrade($workspaceName); + CLI::logging("* End to update Files Manager... (Completed on " . (microtime(true) - $start) . " seconds)\n"); + CLI::logging("* Start migrating and populating plugin singleton data...\n"); + $start = microtime(true); + $workspace->migrateSingleton($workspaceName); + CLI::logging("* End migrating and populating plugin singleton data...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start to check Intermediate Email Event...\n"); + $start = microtime(true); + $workspace->checkIntermediateEmailEvent(); + CLI::logging("* End to check Intermediate Email Event... (Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start cleaning DYN_CONTENT in APP_HISTORY...\n"); + $start = microtime(true); + $keepDynContent = isset($optionMigrateHistoryData['keepDynContent']) && $optionMigrateHistoryData['keepDynContent'] === true; + $workspace->clearDynContentHistoryData(false, $keepDynContent); + CLI::logging("* End cleaning DYN_CONTENT in APP_HISTORY...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + /*----------------------------------********---------------------------------*/ + CLI::logging("* Start migrating history data...\n"); + $start = microtime(true); + $workspace->migrateAppHistoryToAppDataChangeLog(false); + CLI::logging("* End migrating history data...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + /*----------------------------------********---------------------------------*/ + + CLI::logging("* Start migrating and populating indexing for avoiding the use of table APP_CACHE_VIEW...\n"); + $start = microtime(true); + $workspace->migratePopulateIndexingACV(); + CLI::logging("* End migrating and populating indexing for avoiding the use of table APP_CACHE_VIEW...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP....\n"); + $start = microtime(true); + $workspace->migrateSelfServiceRecordsRun(); + CLI::logging("* End optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP....(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start adding new fields and populating values in tables related to feature self service by value...\n"); + $start = microtime(true); + $workspace->upgradeSelfServiceData(); + CLI::logging("* End adding new fields and populating values in tables related to feature self service by value...(Completed on " . + (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start adding/replenishing all indexes...\n"); + $start = microtime(true); + $systemSchema = System::getSystemSchema($workspace->dbAdapter); + $workspace->upgradeSchema($systemSchema); + CLI::logging("* End adding/replenishing all indexes...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start migrating to new list tables...\n"); + $start = microtime(true); + $workspace->migrateList(true, $lang); + CLI::logging("* End migrating to new list tables...(Completed on " . (microtime(true) - $start) . " seconds)\n"); + + CLI::logging("* Start updating MySQL triggers...\n"); + $start = microtime(true); + $workspace->updateTriggers(true, $lang); + CLI::logging("* End updating MySQL triggers...(" . (microtime(true) - $start) . " seconds)\n"); + } + + CLI::logging("> Start To Verify License Enterprise...\n"); $start = microtime(true); - CLI::logging("> Optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP....\n"); - $workspace->upgradeSelfServiceData(); - $stop = microtime(true); - CLI::logging("<*> Optimizing Self-Service data in table APP_ASSIGN_SELF_SERVICE_VALUE_GROUP took " . ($stop - $start) . " seconds.\n"); + $workspace->verifyLicenseEnterprise($workspaceName); + CLI::logging("* End To Verify License Enterprise...(" . (microtime(true) - $start) . " seconds)\n"); + + // Updating generated class files for PM Tables + passthru(PHP_BINARY . ' processmaker regenerate-pmtable-classes ' . $workspaceName); } CLI::logging("Removing temporary files\n"); @@ -2174,6 +2224,9 @@ class WorkspaceTools return $result; } + /** + * Backup the log files + */ public function backupLogFiles() { $config = System::getSystemConfiguration(); @@ -2190,6 +2243,12 @@ class WorkspaceTools } } + /** + * Check if the workspace have the clients used by MAFE registered + * + * @param string $workspace + * @param string $lang + */ public function checkMafeRequirements($workspace, $lang) { $this->initPropel(true); @@ -2266,9 +2325,8 @@ class WorkspaceTools return true; } - public function verifyFilesOldEnterprise($workspace) + public function verifyFilesOldEnterprise() { - $this->initPropel(true); $pathBackup = PATH_DATA . 'backups'; if (!file_exists($pathBackup)) { G::mk_dir($pathBackup, 0777); @@ -2284,7 +2342,7 @@ class WorkspaceTools CLI::logging(" Migrating Enterprise Core version...\n"); if (!file_exists($pathNewFile)) { CLI::logging(" Creating folder in $pathNewFile\n"); - G::mk_dir($newDiretory, 0777); + G::mk_dir($pathNewFile, 0777); } $shared_stat = stat(PATH_DATA); if (file_exists($pathDirectoryEnterprise)) { @@ -2382,12 +2440,19 @@ class WorkspaceTools /** * Migrate all cases to New list * - * @param string $workSpace Workspace * @param bool $flagReinsert Flag that specifies the re-insertion + * @param string $lang * * @return void + * + * @throws Exception + * + * @see \WorkspaceTools->upgrade + * @see \WorkspaceTools->restore + * @see workflow/engine/bin/tasks/cliWorkspaces.php:migrate_new_cases_lists() + * @link https://wiki.processmaker.com/3.3/processmaker_command#migrate-new-cases-lists */ - public function migrateList($workSpace, $flagReinsert = false, $lang = 'en') + public function migrateList($flagReinsert = false, $lang = 'en') { $this->initPropel(true); @@ -2398,8 +2463,8 @@ class WorkspaceTools return; } - $arrayTable1 = ['ListInbox', 'ListMyInbox', 'ListCanceled', 'ListParticipatedLast', 'ListParticipatedHistory', 'ListPaused']; - $arrayTable2 = ['ListUnassigned', 'ListUnassignedGroup']; + $arrayTable1 = ['ListCanceled', 'ListInbox', 'ListParticipatedLast', 'ListPaused']; + $arrayTable2 = ['ListUnassigned']; $arrayTable = array_merge($arrayTable1, $arrayTable2); if ($flagReinsert) { @@ -2423,26 +2488,89 @@ class WorkspaceTools } } + // Initialize queries array + $listQueries = []; + if ($flagReinsert || !$flagListAll) { - $this->regenerateListCanceled($lang); - $this->regenerateListMyInbox(); //This list require no translation - $this->regenerateListInbox(); //This list require no translation - $this->regenerateListParticipatedHistory(); //This list require no translation - $this->regenerateListParticipatedLast(); //This list require no translation - $this->regenerateListPaused(); //This list require no translation + // Regenerate lists + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->regenerateListCanceled($lang)); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->regenerateListInbox()); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->regenerateListParticipatedLast()); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->regenerateListPaused()); } if ($flagReinsert || !$flagListUnassigned) { - $this->regenerateListUnassigned(); //This list require no translation + // This list always is truncated + $con = Propel::getConnection("workflow"); + $stmt = $con->createStatement(); + $stmt->executeQuery('TRUNCATE ' . $this->dbName . '.LIST_UNASSIGNED'); + + // Regenerate list + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->regenerateListUnassigned()); + } + + // Run queries in multiple threads for populate the list tables + $processesManager = new ProcessesManager($listQueries); + $processesManager->run(); + + // If exists an error throw an exception + if (!empty($processesManager->getErrors())) { + $errorMessage = ''; + foreach ($processesManager->getErrors() as $error) { + $errorMessage .= $error['rawAnswer'] . PHP_EOL; + } + throw new Exception($errorMessage); + } + + // Clean the queries array + $listQueries = []; + // Canceled List + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListProId('LIST_CANCELED')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListUsrId('LIST_CANCELED')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListTasId('LIST_CANCELED')); + // Inbox List + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListProId('LIST_INBOX')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListUsrId('LIST_INBOX')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListTasId('LIST_INBOX')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListAppStatusId('LIST_INBOX')); + // Participated List + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListProId('LIST_PARTICIPATED_LAST')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListUsrId('LIST_PARTICIPATED_LAST')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListTasId('LIST_PARTICIPATED_LAST')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListAppStatusId('LIST_PARTICIPATED_LAST')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListParticipatedLastCurrentUser()); + // Unassigned List + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListProId('LIST_UNASSIGNED')); + $listQueries[] = new RunProcessUpgradeQuery($this->name, $this->updateListTasId('LIST_UNASSIGNED')); + + // Run queries in multiple threads for update the list tables + $processesManager = new ProcessesManager($listQueries); + $processesManager->run(); + + // If exists an error throw an exception + if (!empty($processesManager->getErrors())) { + $errorMessage = ''; + foreach ($processesManager->getErrors() as $error) { + $errorMessage .= $error['rawAnswer'] . PHP_EOL; + } + throw new Exception($errorMessage); } $this->listFirstExecution('insert'); $this->listFirstExecution('insert', 'unassigned'); } + /** + * Return query to populate canceled list + * + * @param string $lang + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ public function regenerateListCanceled($lang = 'en') { - $this->initPropel(true); $query = 'INSERT INTO ' . $this->dbName . '.LIST_CANCELED (APP_UID, USR_UID, @@ -2502,85 +2630,19 @@ class WorkspaceTools WHERE ACV.APP_STATUS = \'CANCELLED\' AND ACV.DEL_LAST_INDEX = 1'; - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_CANCELED\n"); - } - - public function regenerateListMyInbox() - { - $this->initPropel(true); - $query = 'INSERT INTO ' . $this->dbName . '.LIST_MY_INBOX - (APP_UID, - USR_UID, - TAS_UID, - PRO_UID, - APP_NUMBER, - APP_TITLE, - APP_PRO_TITLE, - APP_TAS_TITLE, - APP_CREATE_DATE, - APP_UPDATE_DATE, - APP_FINISH_DATE, - APP_STATUS, - DEL_INDEX, - DEL_PREVIOUS_USR_UID, - DEL_PREVIOUS_USR_USERNAME, - DEL_PREVIOUS_USR_FIRSTNAME, - DEL_PREVIOUS_USR_LASTNAME, - DEL_CURRENT_USR_UID, - DEL_CURRENT_USR_USERNAME, - DEL_CURRENT_USR_FIRSTNAME, - DEL_CURRENT_USR_LASTNAME, - DEL_DELEGATE_DATE, - DEL_INIT_DATE, - DEL_DUE_DATE, - DEL_PRIORITY) - - SELECT - ACV.APP_UID, - ACV.USR_UID, - ACV.TAS_UID, - ACV.PRO_UID, - ACV.APP_NUMBER, - ACV.APP_TITLE, - ACV.APP_PRO_TITLE, - ACV.APP_TAS_TITLE, - ACV.APP_CREATE_DATE, - ACV.APP_UPDATE_DATE, - ACV.APP_FINISH_DATE, - ACV.APP_STATUS, - ACV.DEL_INDEX, - ACV.PREVIOUS_USR_UID AS DEL_PREVIOUS_USR_UID, - PRE_USR.USR_USERNAME AS DEL_PREVIOUS_USR_USERNAME, - PRE_USR.USR_FIRSTNAME AS DEL_PREVIOUS_USR_FIRSTNAME, - PRE_USR.USR_LASTNAME AS DEL_PREVIOUS_USR_LASTNAME, - ACV.USR_UID AS DEL_CURRENT_USR_UID, - CUR_USR.USR_USERNAME AS DEL_CURRENT_USR_USERNAME, - CUR_USR.USR_FIRSTNAME AS DEL_CURRENT_USR_FIRSTNAME, - CUR_USR.USR_LASTNAME AS DEL_CURRENT_USR_LASTNAME, - ACV.DEL_DELEGATE_DATE AS DEL_DELEGATE_DATE, - ACV.DEL_INIT_DATE AS DEL_INIT_DATE, - ACV.DEL_TASK_DUE_DATE AS DEL_DUE_DATE, - ACV.DEL_PRIORITY - FROM - ' . $this->dbName . '.APP_CACHE_VIEW ACV - LEFT JOIN - ' . $this->dbName . '.USERS CUR_USR ON ACV.USR_UID = CUR_USR.USR_UID - LEFT JOIN - ' . $this->dbName . '.USERS PRE_USR ON ACV.PREVIOUS_USR_UID = PRE_USR.USR_UID - WHERE ACV.DEL_INDEX=1'; - - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_MY_INBOX\n"); + + return $query; } + /** + * Return query to populate inbox list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ public function regenerateListInbox() { - $this->initPropel(true); $query = 'INSERT INTO ' . $this->dbName . '.LIST_INBOX (APP_UID, DEL_INDEX, @@ -2630,190 +2692,19 @@ class WorkspaceTools ' . $this->dbName . '.USERS USR ON ACV.PREVIOUS_USR_UID = USR.USR_UID WHERE ACV.DEL_THREAD_STATUS = \'OPEN\''; - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_INBOX\n"); - } - public function regenerateListParticipatedHistory() - { - $this->initPropel(true); - $query = 'INSERT INTO ' . $this->dbName . '.LIST_PARTICIPATED_HISTORY - (APP_UID, - DEL_INDEX, - USR_UID, - TAS_UID, - PRO_UID, - APP_NUMBER, - APP_TITLE, - APP_PRO_TITLE, - APP_TAS_TITLE, - DEL_PREVIOUS_USR_UID, - DEL_PREVIOUS_USR_USERNAME, - DEL_PREVIOUS_USR_FIRSTNAME, - DEL_PREVIOUS_USR_LASTNAME, - DEL_CURRENT_USR_USERNAME, - DEL_CURRENT_USR_FIRSTNAME, - DEL_CURRENT_USR_LASTNAME, - DEL_DELEGATE_DATE, - DEL_INIT_DATE, - DEL_DUE_DATE, - DEL_PRIORITY) - - SELECT - ACV.APP_UID, - ACV.DEL_INDEX, - ACV.USR_UID, - ACV.TAS_UID, - ACV.PRO_UID, - ACV.APP_NUMBER, - ACV.APP_TITLE, - ACV.APP_PRO_TITLE, - ACV.APP_TAS_TITLE, - ACV.PREVIOUS_USR_UID AS DEL_PREVIOUS_USR_UID, - PRE_USR.USR_USERNAME AS DEL_PREVIOUS_USR_USERNAME, - PRE_USR.USR_FIRSTNAME AS DEL_PREVIOUS_USR_FIRSTNAME, - PRE_USR.USR_LASTNAME AS DEL_PREVIOUS_USR_LASTNAME, - CUR_USR.USR_USERNAME AS DEL_CURRENT_USR_USERNAME, - CUR_USR.USR_FIRSTNAME AS DEL_CURRENT_USR_FIRSTNAME, - CUR_USR.USR_LASTNAME AS DEL_CURRENT_USR_LASTNAME, - ACV.DEL_DELEGATE_DATE AS DEL_DELEGATE_DATE, - ACV.DEL_INIT_DATE AS DEL_INIT_DATE, - ACV.DEL_TASK_DUE_DATE AS DEL_DUE_DATE, - ACV.DEL_PRIORITY - FROM - ' . $this->dbName . '.APP_CACHE_VIEW ACV - LEFT JOIN - ' . $this->dbName . '.USERS CUR_USR ON ACV.USR_UID = CUR_USR.USR_UID - LEFT JOIN - ' . $this->dbName . '.USERS PRE_USR ON ACV.PREVIOUS_USR_UID = PRE_USR.USR_UID'; - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_PARTICIPATED_HISTORY\n"); - } - - public function regenerateListParticipatedLast() - { - $this->initPropel(true); - $query = 'INSERT INTO ' . $this->dbName . '.LIST_PARTICIPATED_LAST - ( - APP_UID, - USR_UID, - DEL_INDEX, - TAS_UID, - PRO_UID, - APP_NUMBER, - APP_TITLE, - APP_PRO_TITLE, - APP_TAS_TITLE, - APP_STATUS, - DEL_PREVIOUS_USR_UID, - DEL_PREVIOUS_USR_USERNAME, - DEL_PREVIOUS_USR_FIRSTNAME, - DEL_PREVIOUS_USR_LASTNAME, - DEL_CURRENT_USR_USERNAME, - DEL_CURRENT_USR_FIRSTNAME, - DEL_CURRENT_USR_LASTNAME, - DEL_DELEGATE_DATE, - DEL_INIT_DATE, - DEL_DUE_DATE, - DEL_CURRENT_TAS_TITLE, - DEL_PRIORITY, - DEL_THREAD_STATUS) - - SELECT - ACV.APP_UID, - IF(ACV.USR_UID=\'\', \'SELF_SERVICES\', ACV.USR_UID), - ACV.DEL_INDEX, - ACV.TAS_UID, - ACV.PRO_UID, - ACV.APP_NUMBER, - ACV.APP_TITLE, - ACV.APP_PRO_TITLE, - ACV.APP_TAS_TITLE, - ACV.APP_STATUS, - DEL_PREVIOUS_USR_UID, - IFNULL(PRE_USR.USR_USERNAME, CUR_USR.USR_USERNAME) AS DEL_PREVIOUS_USR_USERNAME, - IFNULL(PRE_USR.USR_FIRSTNAME, CUR_USR.USR_FIRSTNAME) AS DEL_PREVIOUS_USR_USERNAME, - IFNULL(PRE_USR.USR_LASTNAME, CUR_USR.USR_LASTNAME) AS DEL_PREVIOUS_USR_USERNAME, - CUR_USR.USR_USERNAME AS DEL_CURRENT_USR_USERNAME, - CUR_USR.USR_FIRSTNAME AS DEL_CURRENT_USR_FIRSTNAME, - CUR_USR.USR_LASTNAME AS DEL_CURRENT_USR_LASTNAME, - ACV.DEL_DELEGATE_DATE AS DEL_DELEGATE_DATE, - ACV.DEL_INIT_DATE AS DEL_INIT_DATE, - ACV.DEL_TASK_DUE_DATE AS DEL_DUE_DATE, - ACV.APP_TAS_TITLE AS DEL_CURRENT_TAS_TITLE, - ACV.DEL_PRIORITY, - ACV.DEL_THREAD_STATUS - FROM - ( - SELECT - CASE WHEN ACV1.PREVIOUS_USR_UID = \'\' AND ACV1.DEL_INDEX = 1 - THEN ACV1.USR_UID - ELSE ACV1.PREVIOUS_USR_UID END AS DEL_PREVIOUS_USR_UID, - ACV1.* - FROM ' . $this->dbName . '.APP_CACHE_VIEW ACV1 - JOIN - (SELECT - ACV_INT.APP_UID, - MAX(ACV_INT.DEL_INDEX) MAX_DEL_INDEX - FROM - ' . $this->dbName . '.APP_CACHE_VIEW ACV_INT - GROUP BY - ACV_INT.USR_UID, - ACV_INT.APP_UID - ) ACV2 - ON ACV2.APP_UID = ACV1.APP_UID AND ACV2.MAX_DEL_INDEX = ACV1.DEL_INDEX - ) ACV - LEFT JOIN ' . $this->dbName . '.USERS PRE_USR ON ACV.PREVIOUS_USR_UID = PRE_USR.USR_UID - LEFT JOIN ' . $this->dbName . '.USERS CUR_USR ON ACV.USR_UID = CUR_USR.USR_UID'; - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - $stmt->executeQuery($query); - CLI::logging("> Inserted data into table LIST_PARTICIPATED_LAST\n"); - $query = 'UPDATE ' . $this->dbName . '.LIST_PARTICIPATED_LAST LPL, ( - SELECT - TASK.TAS_TITLE, - CUR_USER.APP_UID, - USERS.USR_UID, - USERS.USR_USERNAME, - USERS.USR_FIRSTNAME, - USERS.USR_LASTNAME - FROM ( - SELECT - APP_UID, - TAS_UID, - DEL_INDEX, - USR_UID - FROM ' . $this->dbName . '.APP_DELEGATION - WHERE DEL_LAST_INDEX = 1 - ) CUR_USER - LEFT JOIN ' . $this->dbName . '.USERS ON CUR_USER.USR_UID = USERS.USR_UID - LEFT JOIN ' . $this->dbName . '.TASK ON CUR_USER.TAS_UID = TASK.TAS_UID) USERS_VALUES - SET - LPL.DEL_CURRENT_USR_USERNAME = IFNULL(USERS_VALUES.USR_USERNAME, \'\'), - LPL.DEL_CURRENT_USR_FIRSTNAME = IFNULL(USERS_VALUES.USR_FIRSTNAME, \'\'), - LPL.DEL_CURRENT_USR_LASTNAME = IFNULL(USERS_VALUES.USR_LASTNAME, \'\'), - LPL.DEL_CURRENT_TAS_TITLE = IFNULL(USERS_VALUES.TAS_TITLE, \'\') - WHERE LPL.APP_UID = USERS_VALUES.APP_UID'; - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - CLI::logging("> Updating the current users data on table LIST_PARTICIPATED_LAST\n"); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_PARTICIPATED_LAST\n"); + return $query; } /** - * This function overwrite the table LIST_PAUSED - * Get the principal information in the tables appDelay, appDelegation - * For the labels we use the tables user, process, task and application - * @return void + * Return query to populate paused list + * + * @return string + * + * @see \WorkspaceTools->migrateList() */ public function regenerateListPaused() { - $this->initPropel(true); $query = 'INSERT INTO ' . $this->dbName . '.LIST_PAUSED ( APP_UID, @@ -2888,18 +2779,104 @@ class WorkspaceTools APP_DELAY.APP_DISABLE_ACTION_USER = "0" AND APP_DELAY.APP_TYPE = "PAUSE" '; - $con = Propel::getConnection("workflow"); - $stmt = $con->createStatement(); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_PAUSED\n"); + + return $query; } - /*----------------------------------********---------------------------------*/ + /** + * Return query to populate participated last list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ + public function regenerateListParticipatedLast() + { + $query = 'INSERT INTO ' . $this->dbName . '.LIST_PARTICIPATED_LAST + ( + APP_UID, + USR_UID, + DEL_INDEX, + TAS_UID, + PRO_UID, + APP_NUMBER, + APP_TITLE, + APP_PRO_TITLE, + APP_TAS_TITLE, + APP_STATUS, + DEL_PREVIOUS_USR_UID, + DEL_PREVIOUS_USR_USERNAME, + DEL_PREVIOUS_USR_FIRSTNAME, + DEL_PREVIOUS_USR_LASTNAME, + DEL_CURRENT_USR_USERNAME, + DEL_CURRENT_USR_FIRSTNAME, + DEL_CURRENT_USR_LASTNAME, + DEL_DELEGATE_DATE, + DEL_INIT_DATE, + DEL_DUE_DATE, + DEL_CURRENT_TAS_TITLE, + DEL_PRIORITY, + DEL_THREAD_STATUS) + + SELECT + ACV.APP_UID, + IF(ACV.USR_UID=\'\', \'SELF_SERVICES\', ACV.USR_UID), + ACV.DEL_INDEX, + ACV.TAS_UID, + ACV.PRO_UID, + ACV.APP_NUMBER, + ACV.APP_TITLE, + ACV.APP_PRO_TITLE, + ACV.APP_TAS_TITLE, + ACV.APP_STATUS, + DEL_PREVIOUS_USR_UID, + IFNULL(PRE_USR.USR_USERNAME, CUR_USR.USR_USERNAME) AS DEL_PREVIOUS_USR_USERNAME, + IFNULL(PRE_USR.USR_FIRSTNAME, CUR_USR.USR_FIRSTNAME) AS DEL_PREVIOUS_USR_USERNAME, + IFNULL(PRE_USR.USR_LASTNAME, CUR_USR.USR_LASTNAME) AS DEL_PREVIOUS_USR_USERNAME, + CUR_USR.USR_USERNAME AS DEL_CURRENT_USR_USERNAME, + CUR_USR.USR_FIRSTNAME AS DEL_CURRENT_USR_FIRSTNAME, + CUR_USR.USR_LASTNAME AS DEL_CURRENT_USR_LASTNAME, + ACV.DEL_DELEGATE_DATE AS DEL_DELEGATE_DATE, + ACV.DEL_INIT_DATE AS DEL_INIT_DATE, + ACV.DEL_TASK_DUE_DATE AS DEL_DUE_DATE, + ACV.APP_TAS_TITLE AS DEL_CURRENT_TAS_TITLE, + ACV.DEL_PRIORITY, + ACV.DEL_THREAD_STATUS + FROM + ( + SELECT + CASE WHEN ACV1.PREVIOUS_USR_UID = \'\' AND ACV1.DEL_INDEX = 1 + THEN ACV1.USR_UID + ELSE ACV1.PREVIOUS_USR_UID END AS DEL_PREVIOUS_USR_UID, + ACV1.* + FROM ' . $this->dbName . '.APP_CACHE_VIEW ACV1 + JOIN + (SELECT + ACV_INT.APP_UID, + MAX(ACV_INT.DEL_INDEX) MAX_DEL_INDEX + FROM + ' . $this->dbName . '.APP_CACHE_VIEW ACV_INT + GROUP BY + ACV_INT.USR_UID, + ACV_INT.APP_UID + ) ACV2 + ON ACV2.APP_UID = ACV1.APP_UID AND ACV2.MAX_DEL_INDEX = ACV1.DEL_INDEX + ) ACV + LEFT JOIN ' . $this->dbName . '.USERS PRE_USR ON ACV.PREVIOUS_USR_UID = PRE_USR.USR_UID + LEFT JOIN ' . $this->dbName . '.USERS CUR_USR ON ACV.USR_UID = CUR_USR.USR_UID'; + + return $query; + } + + /** + * Return query to populate unassigned list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ public function regenerateListUnassigned() { - $this->initPropel(true); - $truncate = 'TRUNCATE ' . $this->dbName . '.LIST_UNASSIGNED'; - //This executeQuery is very fast than Propel $query = 'INSERT INTO ' . $this->dbName . '.LIST_UNASSIGNED (APP_UID, DEL_INDEX, @@ -2942,13 +2919,154 @@ class WorkspaceTools WHERE ACV.DEL_THREAD_STATUS = \'OPEN\' AND ACV.USR_UID = \'\' '; + + return $query; + } + + /** + * Re-populate only the unassigned list + */ + public function runRegenerateListUnassigned() + { + // Init Propel + $this->initPropel(true); + + // Initialize Propel objects $con = Propel::getConnection("workflow"); $stmt = $con->createStatement(); - $stmt->executeQuery($truncate); - $stmt->executeQuery($query); - CLI::logging("> Completed table LIST_UNASSIGNED\n"); + + // Clean table + $stmt->executeQuery('TRUNCATE ' . $this->dbName . '.LIST_UNASSIGNED;'); + + // Populate table + $stmt->executeQuery($this->regenerateListUnassigned()); + + // Update some fields + $stmt->executeQuery($this->updateListProId('LIST_UNASSIGNED')); + $stmt->executeQuery($this->updateListTasId('LIST_UNASSIGNED')); + } + + /** + * Return query to update PRO_ID in list table + * + * @param string $list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ + public function updateListProId($list) { + $query = 'UPDATE ' . $list . ' AS LT + INNER JOIN ( + SELECT PROCESS.PRO_UID, PROCESS.PRO_ID + FROM PROCESS + ) AS PRO + ON (LT.PRO_UID = PRO.PRO_UID) + SET LT.PRO_ID = PRO.PRO_ID + WHERE LT.PRO_ID = 0'; + return $query; + } + + /** + * Return query to update USR_ID in list table + * + * @param string $list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ + public function updateListUsrId($list) { + $query = 'UPDATE ' . $list . ' AS LT + INNER JOIN ( + SELECT USERS.USR_UID, USERS.USR_ID + FROM USERS + ) AS USR + ON (LT.USR_UID = USR.USR_UID) + SET LT.USR_ID = USR.USR_ID + WHERE LT.USR_ID = 0'; + return $query; + } + + /** + * Return query to update TAS_ID in list table + * + * @param string $list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ + public function updateListTasId($list) { + $query = 'UPDATE ' . $list . ' AS LT + INNER JOIN ( + SELECT TASK.TAS_UID, TASK.TAS_ID + FROM TASK + ) AS TAS + ON (LT.TAS_UID = TAS.TAS_UID) + SET LT.TAS_ID = TAS.TAS_ID + WHERE LT.TAS_ID = 0'; + return $query; + } + + /** + * Return query to update APP_STATUS_ID in list table + * + * @para string $list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ + public function updateListAppStatusId($list) { + $query = "UPDATE " . $list . " + SET APP_STATUS_ID = (case + when APP_STATUS = 'DRAFT' then 1 + when APP_STATUS = 'TO_DO' then 2 + when APP_STATUS = 'COMPLETED' then 3 + when APP_STATUS = 'CANCELLED' then 4 + end) + WHERE APP_STATUS in ('DRAFT', 'TO_DO', 'COMPLETED', 'CANCELLED') AND APP_STATUS_ID = 0"; + return $query; + } + + /** + * Return query to update participated last list + * + * @return string + * + * @see \WorkspaceTools->migrateList() + */ + public function updateListParticipatedLastCurrentUser() + { + $query = 'UPDATE ' . $this->dbName . '.LIST_PARTICIPATED_LAST LPL, ( + SELECT + TASK.TAS_TITLE, + CUR_USER.APP_UID, + USERS.USR_UID, + USERS.USR_USERNAME, + USERS.USR_FIRSTNAME, + USERS.USR_LASTNAME + FROM ( + SELECT + APP_UID, + TAS_UID, + DEL_INDEX, + USR_UID + FROM ' . $this->dbName . '.APP_DELEGATION + WHERE DEL_LAST_INDEX = 1 + ) CUR_USER + LEFT JOIN ' . $this->dbName . '.USERS ON CUR_USER.USR_UID = USERS.USR_UID + LEFT JOIN ' . $this->dbName . '.TASK ON CUR_USER.TAS_UID = TASK.TAS_UID) USERS_VALUES + SET + LPL.DEL_CURRENT_USR_USERNAME = IFNULL(USERS_VALUES.USR_USERNAME, \'\'), + LPL.DEL_CURRENT_USR_FIRSTNAME = IFNULL(USERS_VALUES.USR_FIRSTNAME, \'\'), + LPL.DEL_CURRENT_USR_LASTNAME = IFNULL(USERS_VALUES.USR_LASTNAME, \'\'), + LPL.DEL_CURRENT_TAS_TITLE = IFNULL(USERS_VALUES.TAS_TITLE, \'\') + WHERE LPL.APP_UID = USERS_VALUES.APP_UID'; + + return $query; } - /*----------------------------------********---------------------------------*/ /** * This function checks if List tables are going to migrated @@ -3035,19 +3153,21 @@ class WorkspaceTools } /** - * Process-Files upgrade + * Process files upgrade, store the information in the DB + * + * @param string $workspace * * return void */ - public function processFilesUpgrade() + public function processFilesUpgrade($workspace) { try { if (!defined("PATH_DATA_MAILTEMPLATES")) { - define("PATH_DATA_MAILTEMPLATES", PATH_DATA_SITE . "mailTemplates" . PATH_SEP); + define("PATH_DATA_MAILTEMPLATES", PATH_DATA . 'sites' . PATH_SEP . $workspace . PATH_SEP . "mailTemplates" . PATH_SEP); } if (!defined("PATH_DATA_PUBLIC")) { - define("PATH_DATA_PUBLIC", PATH_DATA_SITE . "public" . PATH_SEP); + define("PATH_DATA_PUBLIC", PATH_DATA . 'sites' . PATH_SEP . $workspace . PATH_SEP . "public" . PATH_SEP); } $this->initPropel(true); @@ -3560,8 +3680,12 @@ class WorkspaceTools return $response; } - - public function migrateContent($workspace, $lang = SYS_LANG) + /** + * Migrate texts/values from "CONTENT" table to the corresponding object tables + * + * @param string $lang + */ + public function migrateContent($lang = SYS_LANG) { if ((!class_exists('Memcache') || !class_exists('Memcached')) && !defined('MEMCACHED_ENABLED')) { define('MEMCACHED_ENABLED', false); @@ -3574,7 +3698,7 @@ class WorkspaceTools $blackList = $oConfig['CFG_VALUE'] == 'true' ? array('Groupwf', 'Process', 'Department', 'Task', 'InputDocument', 'Application') : unserialize($oConfig['CFG_VALUE']); } - $blackList = $this->migrateContentRun($workspace, $lang, $blackList); + $blackList = $this->migrateContentRun($lang, $blackList); $data["CFG_UID"] = 'MIGRATED_CONTENT'; $data["OBJ_UID"] = 'content'; $data["CFG_VALUE"] = serialize($blackList); @@ -3585,85 +3709,95 @@ class WorkspaceTools } /** - * Migrate this workspace table Content. + * Generate update rows from Content sentence * - * @param $className - * @param $fields - * @param mixed|string $lang - * @throws Exception + * @param string $tableName + * @param array $fields + * @param string $lang + * + * @return string */ - public function migrateContentWorkspace($className, $fields, $lang = SYS_LANG) + public function generateUpdateFromContent($tableName, array $fields, $lang = SYS_LANG) { - try { - $this->initPropel(true); - $fieldUidName = $fields['uid']; - $oCriteria = new Criteria(); - $oCriteria->clearSelectColumns(); - $oCriteria->addAsColumn($fieldUidName, ContentPeer::CON_ID); - $oCriteria->addSelectColumn(ContentPeer::CON_PARENT); - $oCriteria->addSelectColumn(ContentPeer::CON_CATEGORY); - $oCriteria->addSelectColumn(ContentPeer::CON_VALUE); - $oCriteria->add(ContentPeer::CON_CATEGORY, $fields['fields'], Criteria::IN); - $oCriteria->add(ContentPeer::CON_LANG, $lang); - $oDataset = ContentPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); - $methods = $fields['methods']; - while ($oDataset->next()) { - $row = $oDataset->getRow(); - $fieldName = $row['CON_CATEGORY']; - $fieldName = isset($fields['alias']) && isset($fields['alias'][$fieldName]) ? $fields['alias'][$fieldName] : $fieldName; - unset($row['CON_CATEGORY']); - $row[$fieldName] = $row['CON_VALUE']; - unset($row['CON_VALUE']); - $oTable = new $className(); - $that = array($oTable, $methods['exists']); - $params = array($row[$fieldUidName]); - if (isset($row['CON_PARENT']) && $row['CON_PARENT'] != '') { - array_push($params, $row['CON_PARENT']); - $fieldName = isset($fields['alias']) && isset($fields['alias']['CON_PARENT']) ? $fields['alias']['CON_PARENT'] : 'CON_PARENT'; - $row[$fieldName] = $row['CON_PARENT']; - } - unset($row['CON_PARENT']); - if (call_user_func_array($that, $params)) { - if (isset($methods['update'])) { - $fn = $methods['update']; - $fn($row); - } else { - $oTable->update($row); - } - } - } - $classNamePeer = class_exists($className . 'Peer') ? $className . 'Peer' : $fields['peer']; - CLI::logging("|--> Add content data in table " . $classNamePeer::TABLE_NAME . "\n"); - } catch (Exception $e) { - throw ($e); + $sql = "UPDATE " . $tableName . " AS T"; + $i = 0; + foreach ($fields['fields'] as $field) { + $i++; + $tableAlias = "C" . $i; + $sql .= " LEFT JOIN CONTENT " . $tableAlias . " ON ("; + $sql .= $tableAlias . ".CON_CATEGORY = '" . $field . "' AND "; + $sql .= $tableAlias . ".CON_ID = T." . $fields['uid'] . " AND "; + $sql .= $tableAlias . ".CON_LANG = '" . $lang . "')"; } + $sql .= ' SET '; + $i = 0; + foreach ($fields['fields'] as $field) { + $i++; + $tableAlias = "C" . $i; + $fieldName = !empty($fields['alias'][$field]) ? $fields['alias'][$field] : $field; + $sql .= $fieldName . " = " . $tableAlias . ".CON_VALUE, "; + } + $sql = rtrim($sql, ', '); + return $sql; } /** - * Migration + * Migrate from "CONTENT" table to the corresponding object tables + * + * @param string $lang + * @param array $blackList * - * @param $workspace - * @param mixed|string $lang * @return array + * + * @throws Exception */ - public function migrateContentRun($workspace, $lang = SYS_LANG, $blackList = array()) + public function migrateContentRun($lang = SYS_LANG, $blackList = []) { if ((!class_exists('Memcache') || !class_exists('Memcached')) && !defined('MEMCACHED_ENABLED')) { define('MEMCACHED_ENABLED', false); } $content = $this->getListContentMigrateTable(); + $contentQueries = []; foreach ($content as $className => $fields) { if (!in_array($className, $blackList)) { - $this->migrateContentWorkspace($className, $fields, $lang); + // Build class peer name + if (class_exists($className . 'Peer')) { + $classNamePeer = $className . 'Peer'; + } else { + $classNamePeer = $fields['peer']; + } + + // Build the query + $query = $this->generateUpdateFromContent($classNamePeer::TABLE_NAME, $fields, $lang); + + // Instantiate the class to execute the query in background + $contentQueries[] = new RunProcessUpgradeQuery($this->name, $query); + + // Add class to the control array $blackList[] = $className; } } + // Run queries in multiple threads + $processesManager = new ProcessesManager($contentQueries); + $processesManager->run(); + + // If exists an error throw an exception + if (!empty($processesManager->getErrors())) { + $errorMessage = ''; + foreach ($processesManager->getErrors() as $error) { + $errorMessage .= $error['rawAnswer'] . PHP_EOL; + } + throw new Exception($errorMessage); + } + return $blackList; } - public function cleanTokens($workspace, $lang = SYS_LANG) + /** + * Clean the expired access and refresh tokens + */ + public function cleanTokens() { $this->initPropel(true); $oCriteria = new Criteria(); @@ -3739,13 +3873,6 @@ class WorkspaceTools CLI::logging($message); } - public function upgradeConfiguration() - { - $conf = new Configurations(); - $conf->aConfig = 'neoclassic'; - $conf->saveConfig('SKIN_CRON', ''); - } - public function upgradeAuditLog($workspace) { $conf = new Configurations(); @@ -3758,7 +3885,10 @@ class WorkspaceTools } } - public function migrateSelfServiceRecordsRun($workspace) + /** + * Migrate the concatenated strings with UIDs from groups to the table "APP_ASSIGN_SELF_SERVICE_VALUE_GROUP" + */ + public function migrateSelfServiceRecordsRun() { // Initializing $this->initPropel(true); @@ -3805,7 +3935,10 @@ class WorkspaceTools CLI::logging(" Migrating Self-Service by Value Cases Done \n"); } - public function migratePopulateIndexingACV($workspace) + /** + * Populate new fields used for avoiding the use of the "APP_CACHE_VIEW" table + */ + public function migratePopulateIndexingACV() { // Migrating and populating new indexes CLI::logging("-> Migrating an populating indexing for avoiding the use of table APP_CACHE_VIEW Start \n"); @@ -4070,9 +4203,10 @@ class WorkspaceTools * It populates the WEB_ENTRY table for the classic processes, this procedure * is done to verify the execution of php files generated when the WebEntry * is configured. - * @param type $workSpace + * + * @param bool $force */ - public function updatingWebEntryClassicModel($workSpace, $force = false) + public function updatingWebEntryClassicModel($force = false) { //We obtain from the configuration the list of proUids obtained so that //we do not go through again. @@ -4168,8 +4302,9 @@ class WorkspaceTools /** * Updating triggers - * @param $flagRecreate - * @param $lang + * + * @param bool $flagRecreate + * @param string $lang */ public function updateTriggers($flagRecreate, $lang) { @@ -4178,6 +4313,8 @@ class WorkspaceTools } /** + * Migrate the data of the "plugin.singleton" file to the "PLUGIN_REGISTRY" table + * * @param $workspace */ public function migrateSingleton($workspace) @@ -4223,14 +4360,11 @@ class WorkspaceTools } /** - * Updating framework directory structure + * Check/Create framework's directories * */ - private function updateFrameworkPaths($workSpace = null) + public function checkFrameworkPaths() { - if ($workSpace === null) { - $workSpace = config("system.workspace"); - } $paths = [ PATH_DATA . 'framework' => 0770, PATH_DATA . 'framework' . DIRECTORY_SEPARATOR . 'cache' => 0770, @@ -4565,4 +4699,63 @@ class WorkspaceTools } } } + + /** + * Delete the triggers MySQL that causes performance issues in the upgrade process + */ + public function deleteTriggersMySql($triggersToDelete) + { + // Initialize Propel + $this->initPropel(true); + $con = Propel::getConnection('workflow'); + + // Get statement instance + $stmt = $con->createStatement(); + + // Get MySQL DB instance class + $dbInstance = $this->getDatabase(); + + // Remove triggers MySQL + foreach ($triggersToDelete as $triggerName) { + $stmt->executeQuery($dbInstance->getDropTrigger($triggerName)); + } + } + + /** + * Delete indexes of specific tables + * + * @param array $tables + */ + public function deleteIndexes($tables) + { + // Get MySQL DB instance class + $database = $this->getDatabase(); + + foreach ($tables as $table) { + // Get all indexes of the table + $indexes = $database->executeQuery($database->generateTableIndexSQL($table)); + $indexesDeleted = []; + foreach ($indexes as $index) { + if ($index['Key_name'] != 'PRIMARY') { + if (!in_array($index['Key_name'], $indexesDeleted)) { + // Remove index + $database->executeQuery($database->generateDropKeySQL($table, $index['Key_name'])); + $indexesDeleted[] = $index['Key_name']; + } + } + } + } + } + + /** + * Execute a query, used internally for the upgrade process + * + * @param string $query + * @param bool $rbac + */ + public function upgradeQuery($query, $rbac) + { + $database = $this->getDatabase($rbac); + $database->executeQuery($query, true); + } } diff --git a/workflow/engine/classes/WsBase.php b/workflow/engine/classes/WsBase.php index afedb88ec..072b684b8 100644 --- a/workflow/engine/classes/WsBase.php +++ b/workflow/engine/classes/WsBase.php @@ -5,6 +5,7 @@ use ProcessMaker\BusinessModel\EmailServer; use ProcessMaker\ChangeLog\ChangeLog; /*----------------------------------********---------------------------------*/ use ProcessMaker\Core\System; +use ProcessMaker\Util\WsMessageResponse; class WsBase { @@ -1010,7 +1011,8 @@ class WsBase $spool->sendMail(); if ($spool->status == 'sent') { - $result = new WsResponse(0, G::loadTranslation('ID_MESSAGE_SENT') . ": " . $to); + $result = new WsMessageResponse(0, G::loadTranslation('ID_MESSAGE_SENT') . ": " . $to); + $result->setAppMessUid($spool->getSpoolId()); } else { $result = new WsResponse(29, $spool->status . ' ' . $spool->error . print_r($setup, 1)); } diff --git a/workflow/engine/classes/model/AbeConfiguration.php b/workflow/engine/classes/model/AbeConfiguration.php index 66b6cf0d0..90679a92e 100644 --- a/workflow/engine/classes/model/AbeConfiguration.php +++ b/workflow/engine/classes/model/AbeConfiguration.php @@ -26,6 +26,7 @@ class AbeConfiguration extends BaseAbeConfiguration 'DYN_UID', 'ABE_EMAIL_FIELD', 'ABE_ACTION_FIELD', + 'ABE_ACTION_BODY_FIELD', 'ABE_CASE_NOTE_IN_RESPONSE', 'ABE_FORCE_LOGIN', 'ABE_CREATE_DATE', @@ -33,7 +34,8 @@ class AbeConfiguration extends BaseAbeConfiguration 'ABE_SUBJECT_FIELD', 'ABE_MAILSERVER_OR_MAILCURRENT', 'ABE_CUSTOM_GRID', - 'ABE_EMAIL_SERVER_UID' + 'ABE_EMAIL_SERVER_UID', + 'ABE_EMAIL_SERVER_RECEIVER_UID' ]; public function load($abeUid) @@ -152,6 +154,7 @@ class AbeConfiguration extends BaseAbeConfiguration $criteria->addSelectColumn(AbeConfigurationPeer::DYN_UID); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_EMAIL_FIELD); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_FIELD); + $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_BODY_FIELD); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_SUBJECT_FIELD); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_MAILSERVER_OR_MAILCURRENT); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_CUSTOM_GRID); diff --git a/workflow/engine/classes/model/AddonsManager.php b/workflow/engine/classes/model/AddonsManager.php index 06d16fedb..10691d3ac 100644 --- a/workflow/engine/classes/model/AddonsManager.php +++ b/workflow/engine/classes/model/AddonsManager.php @@ -385,13 +385,7 @@ class AddonsManager extends BaseAddonsManager $this->setState(); } else { - if ($this->getAddonType() == "core") { - $upgrade = new Upgrade($this); - - $upgrade->install(); - } else { - throw new Exception("Addon type {$this->getAddonType()} not supported."); - } + throw new Exception("Addon type {$this->getAddonType()} not supported."); } } diff --git a/workflow/engine/classes/model/AppCacheView.php b/workflow/engine/classes/model/AppCacheView.php index 45a669b02..32b3ab3d7 100644 --- a/workflow/engine/classes/model/AppCacheView.php +++ b/workflow/engine/classes/model/AppCacheView.php @@ -288,7 +288,10 @@ class AppCacheView extends BaseAppCacheView $c->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); $c->add(ProcessPeer::PRO_STATUS, 'ACTIVE'); $c->add(TaskPeer::TAS_ASSIGN_TYPE, 'SELF_SERVICE'); - $c->add(TaskPeer::TAS_GROUP_VARIABLE, ''); + $c->add( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, '')->addOr( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, null, Criteria::ISNULL)) + ); $c->add(TaskUserPeer::USR_UID, $userUid); $rs = TaskPeer::doSelectRS($c); @@ -314,7 +317,10 @@ class AppCacheView extends BaseAppCacheView $c->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); $c->add(ProcessPeer::PRO_STATUS, 'ACTIVE'); $c->add(TaskPeer::TAS_ASSIGN_TYPE, 'SELF_SERVICE'); - $c->add(TaskPeer::TAS_GROUP_VARIABLE, ''); + $c->add( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, '')->addOr( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, null, Criteria::ISNULL)) + ); $c->add(TaskUserPeer::USR_UID, $aGroups, Criteria::IN); $rs = TaskPeer::doSelectRS($c); diff --git a/workflow/engine/classes/model/AppDelay.php b/workflow/engine/classes/model/AppDelay.php index 06d9d269c..6157d6907 100644 --- a/workflow/engine/classes/model/AppDelay.php +++ b/workflow/engine/classes/model/AppDelay.php @@ -199,6 +199,8 @@ class AppDelay extends BaseAppDelay if (empty($usrUid)) { global $RBAC; $usrUid = $RBAC->aUserInfo['USER_INFO']['USR_UID']; + } + if (empty($usrId)) { $u = new Users(); $usrId = $u->load($usrUid)['USR_ID']; } diff --git a/workflow/engine/classes/model/AppMessage.php b/workflow/engine/classes/model/AppMessage.php index 8758937b3..4b2659c56 100644 --- a/workflow/engine/classes/model/AppMessage.php +++ b/workflow/engine/classes/model/AppMessage.php @@ -300,5 +300,24 @@ class AppMessage extends BaseAppMessage return $messages; } + + /** + * Get the APP_MSG_BODY related to the key + * + * @param string $key + * + * @return string + * @throws Exception + */ + public static function getAppMsgBodyByKey($key) + { + try { + $appMessage = AppMessagePeer::retrieveByPk($key); + + return $appMessage->getAppMsgBody(); + } catch (Exception $error) { + throw $error; + } + } } diff --git a/workflow/engine/classes/model/ListUnassigned.php b/workflow/engine/classes/model/ListUnassigned.php index a073a8c7b..4cafc2681 100644 --- a/workflow/engine/classes/model/ListUnassigned.php +++ b/workflow/engine/classes/model/ListUnassigned.php @@ -398,7 +398,10 @@ class ListUnassigned extends BaseListUnassigned implements ListInterface $c->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); $c->add(ProcessPeer::PRO_STATUS, 'ACTIVE'); $c->add(TaskPeer::TAS_ASSIGN_TYPE, 'SELF_SERVICE'); - $c->add(TaskPeer::TAS_GROUP_VARIABLE, ''); + $c->add( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, '')->addOr( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, null, Criteria::ISNULL)) + ); $c->add(TaskUserPeer::USR_UID, $userUid); //TU_TYPE = 2 is a AdHoc task if (!$adHocUsers) { @@ -430,7 +433,10 @@ class ListUnassigned extends BaseListUnassigned implements ListInterface $c->addJoin(TaskPeer::TAS_UID, TaskUserPeer::TAS_UID, Criteria::LEFT_JOIN); $c->add(ProcessPeer::PRO_STATUS, 'ACTIVE'); $c->add(TaskPeer::TAS_ASSIGN_TYPE, 'SELF_SERVICE'); - $c->add(TaskPeer::TAS_GROUP_VARIABLE, ''); + $c->add( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, '')->addOr( + $c->getNewCriterion(TaskPeer::TAS_GROUP_VARIABLE, null, Criteria::ISNULL)) + ); $c->add(TaskUserPeer::USR_UID, $groupsList, Criteria::IN); //TU_TYPE = 2 is a AdHoc task if (!$adHocUsers) { diff --git a/workflow/engine/classes/model/Process.php b/workflow/engine/classes/model/Process.php index 69c59feec..5c97dc6a8 100644 --- a/workflow/engine/classes/model/Process.php +++ b/workflow/engine/classes/model/Process.php @@ -746,7 +746,13 @@ class Process extends BaseProcess return $aProcesses; } - public function getCasesCountForProcess($pro_uid) + /** + * This returns the number of cases for the process. + * @param string $pro_uid + * @return integer + * @see ProcessMaker\Project\Bpmn::canRemove() + */ + public static function getCasesCountForProcess($pro_uid) { $oCriteria = new Criteria('workflow'); $oCriteria->addSelectColumn('COUNT(*) AS TOTAL_CASES'); diff --git a/workflow/engine/classes/model/map/AbeConfigurationMapBuilder.php b/workflow/engine/classes/model/map/AbeConfigurationMapBuilder.php index 8652ef90a..c74d98fa0 100644 --- a/workflow/engine/classes/model/map/AbeConfigurationMapBuilder.php +++ b/workflow/engine/classes/model/map/AbeConfigurationMapBuilder.php @@ -83,6 +83,8 @@ class AbeConfigurationMapBuilder $tMap->addColumn('ABE_ACTION_FIELD', 'AbeActionField', 'string', CreoleTypes::VARCHAR, false, 255); + $tMap->addColumn('ABE_ACTION_BODY_FIELD', 'AbeActionBodyField', 'string', CreoleTypes::VARCHAR, false, 255); + $tMap->addColumn('ABE_CASE_NOTE_IN_RESPONSE', 'AbeCaseNoteInResponse', 'int', CreoleTypes::INTEGER, false, null); $tMap->addColumn('ABE_FORCE_LOGIN', 'AbeForceLogin', 'int', CreoleTypes::INTEGER, false, null); @@ -99,6 +101,8 @@ class AbeConfigurationMapBuilder $tMap->addColumn('ABE_EMAIL_SERVER_UID', 'AbeEmailServerUid', 'string', CreoleTypes::VARCHAR, false, 32); + $tMap->addColumn('ABE_EMAIL_SERVER_RECEIVER_UID', 'AbeEmailServerReceiverUid', 'string', CreoleTypes::VARCHAR, false, 32); + } // doBuild() } // AbeConfigurationMapBuilder diff --git a/workflow/engine/classes/model/map/EmailServerMapBuilder.php b/workflow/engine/classes/model/map/EmailServerMapBuilder.php index ab8fd959a..b9e5729a0 100644 --- a/workflow/engine/classes/model/map/EmailServerMapBuilder.php +++ b/workflow/engine/classes/model/map/EmailServerMapBuilder.php @@ -73,6 +73,10 @@ class EmailServerMapBuilder $tMap->addColumn('MESS_PORT', 'MessPort', 'int', CreoleTypes::INTEGER, true, null); + $tMap->addColumn('MESS_INCOMING_SERVER', 'MessIncomingServer', 'string', CreoleTypes::VARCHAR, true, 256); + + $tMap->addColumn('MESS_INCOMING_PORT', 'MessIncomingPort', 'int', CreoleTypes::INTEGER, true, null); + $tMap->addColumn('MESS_RAUTH', 'MessRauth', 'int', CreoleTypes::INTEGER, true, null); $tMap->addColumn('MESS_ACCOUNT', 'MessAccount', 'string', CreoleTypes::VARCHAR, true, 256); diff --git a/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php b/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php index 90743a86a..d391036bc 100644 --- a/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php +++ b/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php @@ -75,6 +75,8 @@ class UsersPropertiesMapBuilder $tMap->addColumn('USR_SETTING_DESIGNER', 'UsrSettingDesigner', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addColumn('PMDYNAFORM_FIRST_TIME', 'PmdynaformFirstTime', 'string', CreoleTypes::CHAR, false, 1); + } // doBuild() } // UsersPropertiesMapBuilder diff --git a/workflow/engine/classes/model/om/BaseAbeConfiguration.php b/workflow/engine/classes/model/om/BaseAbeConfiguration.php index 7de6b6b1a..a83b0448d 100644 --- a/workflow/engine/classes/model/om/BaseAbeConfiguration.php +++ b/workflow/engine/classes/model/om/BaseAbeConfiguration.php @@ -81,6 +81,12 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent */ protected $abe_action_field = ''; + /** + * The value for the abe_action_body_field field. + * @var string + */ + protected $abe_action_body_field = ''; + /** * The value for the abe_case_note_in_response field. * @var int @@ -129,6 +135,12 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent */ protected $abe_email_server_uid = ''; + /** + * The value for the abe_email_server_receiver_uid field. + * @var string + */ + protected $abe_email_server_receiver_uid = ''; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -242,6 +254,17 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent return $this->abe_action_field; } + /** + * Get the [abe_action_body_field] column value. + * + * @return string + */ + public function getAbeActionBodyField() + { + + return $this->abe_action_body_field; + } + /** * Get the [abe_case_note_in_response] column value. * @@ -372,6 +395,17 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent return $this->abe_email_server_uid; } + /** + * Get the [abe_email_server_receiver_uid] column value. + * + * @return string + */ + public function getAbeEmailServerReceiverUid() + { + + return $this->abe_email_server_receiver_uid; + } + /** * Set the value of [abe_uid] column. * @@ -570,6 +604,28 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent } // setAbeActionField() + /** + * Set the value of [abe_action_body_field] column. + * + * @param string $v new value + * @return void + */ + public function setAbeActionBodyField($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->abe_action_body_field !== $v || $v === '') { + $this->abe_action_body_field = $v; + $this->modifiedColumns[] = AbeConfigurationPeer::ABE_ACTION_BODY_FIELD; + } + + } // setAbeActionBodyField() + /** * Set the value of [abe_case_note_in_response] column. * @@ -760,6 +816,28 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent } // setAbeEmailServerUid() + /** + * Set the value of [abe_email_server_receiver_uid] column. + * + * @param string $v new value + * @return void + */ + public function setAbeEmailServerReceiverUid($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->abe_email_server_receiver_uid !== $v || $v === '') { + $this->abe_email_server_receiver_uid = $v; + $this->modifiedColumns[] = AbeConfigurationPeer::ABE_EMAIL_SERVER_RECEIVER_UID; + } + + } // setAbeEmailServerReceiverUid() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -795,28 +873,32 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $this->abe_action_field = $rs->getString($startcol + 8); - $this->abe_case_note_in_response = $rs->getInt($startcol + 9); + $this->abe_action_body_field = $rs->getString($startcol + 9); - $this->abe_force_login = $rs->getInt($startcol + 10); + $this->abe_case_note_in_response = $rs->getInt($startcol + 10); - $this->abe_create_date = $rs->getTimestamp($startcol + 11, null); + $this->abe_force_login = $rs->getInt($startcol + 11); - $this->abe_update_date = $rs->getTimestamp($startcol + 12, null); + $this->abe_create_date = $rs->getTimestamp($startcol + 12, null); - $this->abe_subject_field = $rs->getString($startcol + 13); + $this->abe_update_date = $rs->getTimestamp($startcol + 13, null); - $this->abe_mailserver_or_mailcurrent = $rs->getInt($startcol + 14); + $this->abe_subject_field = $rs->getString($startcol + 14); - $this->abe_custom_grid = $rs->getString($startcol + 15); + $this->abe_mailserver_or_mailcurrent = $rs->getInt($startcol + 15); - $this->abe_email_server_uid = $rs->getString($startcol + 16); + $this->abe_custom_grid = $rs->getString($startcol + 16); + + $this->abe_email_server_uid = $rs->getString($startcol + 17); + + $this->abe_email_server_receiver_uid = $rs->getString($startcol + 18); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 17; // 17 = AbeConfigurationPeer::NUM_COLUMNS - AbeConfigurationPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 19; // 19 = AbeConfigurationPeer::NUM_COLUMNS - AbeConfigurationPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating AbeConfiguration object", $e); @@ -1048,29 +1130,35 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent return $this->getAbeActionField(); break; case 9: - return $this->getAbeCaseNoteInResponse(); + return $this->getAbeActionBodyField(); break; case 10: - return $this->getAbeForceLogin(); + return $this->getAbeCaseNoteInResponse(); break; case 11: - return $this->getAbeCreateDate(); + return $this->getAbeForceLogin(); break; case 12: - return $this->getAbeUpdateDate(); + return $this->getAbeCreateDate(); break; case 13: - return $this->getAbeSubjectField(); + return $this->getAbeUpdateDate(); break; case 14: - return $this->getAbeMailserverOrMailcurrent(); + return $this->getAbeSubjectField(); break; case 15: - return $this->getAbeCustomGrid(); + return $this->getAbeMailserverOrMailcurrent(); break; case 16: + return $this->getAbeCustomGrid(); + break; + case 17: return $this->getAbeEmailServerUid(); break; + case 18: + return $this->getAbeEmailServerReceiverUid(); + break; default: return null; break; @@ -1100,14 +1188,16 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $keys[6] => $this->getDynUid(), $keys[7] => $this->getAbeEmailField(), $keys[8] => $this->getAbeActionField(), - $keys[9] => $this->getAbeCaseNoteInResponse(), - $keys[10] => $this->getAbeForceLogin(), - $keys[11] => $this->getAbeCreateDate(), - $keys[12] => $this->getAbeUpdateDate(), - $keys[13] => $this->getAbeSubjectField(), - $keys[14] => $this->getAbeMailserverOrMailcurrent(), - $keys[15] => $this->getAbeCustomGrid(), - $keys[16] => $this->getAbeEmailServerUid(), + $keys[9] => $this->getAbeActionBodyField(), + $keys[10] => $this->getAbeCaseNoteInResponse(), + $keys[11] => $this->getAbeForceLogin(), + $keys[12] => $this->getAbeCreateDate(), + $keys[13] => $this->getAbeUpdateDate(), + $keys[14] => $this->getAbeSubjectField(), + $keys[15] => $this->getAbeMailserverOrMailcurrent(), + $keys[16] => $this->getAbeCustomGrid(), + $keys[17] => $this->getAbeEmailServerUid(), + $keys[18] => $this->getAbeEmailServerReceiverUid(), ); return $result; } @@ -1167,29 +1257,35 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $this->setAbeActionField($value); break; case 9: - $this->setAbeCaseNoteInResponse($value); + $this->setAbeActionBodyField($value); break; case 10: - $this->setAbeForceLogin($value); + $this->setAbeCaseNoteInResponse($value); break; case 11: - $this->setAbeCreateDate($value); + $this->setAbeForceLogin($value); break; case 12: - $this->setAbeUpdateDate($value); + $this->setAbeCreateDate($value); break; case 13: - $this->setAbeSubjectField($value); + $this->setAbeUpdateDate($value); break; case 14: - $this->setAbeMailserverOrMailcurrent($value); + $this->setAbeSubjectField($value); break; case 15: - $this->setAbeCustomGrid($value); + $this->setAbeMailserverOrMailcurrent($value); break; case 16: + $this->setAbeCustomGrid($value); + break; + case 17: $this->setAbeEmailServerUid($value); break; + case 18: + $this->setAbeEmailServerReceiverUid($value); + break; } // switch() } @@ -1250,35 +1346,43 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent } if (array_key_exists($keys[9], $arr)) { - $this->setAbeCaseNoteInResponse($arr[$keys[9]]); + $this->setAbeActionBodyField($arr[$keys[9]]); } if (array_key_exists($keys[10], $arr)) { - $this->setAbeForceLogin($arr[$keys[10]]); + $this->setAbeCaseNoteInResponse($arr[$keys[10]]); } if (array_key_exists($keys[11], $arr)) { - $this->setAbeCreateDate($arr[$keys[11]]); + $this->setAbeForceLogin($arr[$keys[11]]); } if (array_key_exists($keys[12], $arr)) { - $this->setAbeUpdateDate($arr[$keys[12]]); + $this->setAbeCreateDate($arr[$keys[12]]); } if (array_key_exists($keys[13], $arr)) { - $this->setAbeSubjectField($arr[$keys[13]]); + $this->setAbeUpdateDate($arr[$keys[13]]); } if (array_key_exists($keys[14], $arr)) { - $this->setAbeMailserverOrMailcurrent($arr[$keys[14]]); + $this->setAbeSubjectField($arr[$keys[14]]); } if (array_key_exists($keys[15], $arr)) { - $this->setAbeCustomGrid($arr[$keys[15]]); + $this->setAbeMailserverOrMailcurrent($arr[$keys[15]]); } if (array_key_exists($keys[16], $arr)) { - $this->setAbeEmailServerUid($arr[$keys[16]]); + $this->setAbeCustomGrid($arr[$keys[16]]); + } + + if (array_key_exists($keys[17], $arr)) { + $this->setAbeEmailServerUid($arr[$keys[17]]); + } + + if (array_key_exists($keys[18], $arr)) { + $this->setAbeEmailServerReceiverUid($arr[$keys[18]]); } } @@ -1328,6 +1432,10 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $criteria->add(AbeConfigurationPeer::ABE_ACTION_FIELD, $this->abe_action_field); } + if ($this->isColumnModified(AbeConfigurationPeer::ABE_ACTION_BODY_FIELD)) { + $criteria->add(AbeConfigurationPeer::ABE_ACTION_BODY_FIELD, $this->abe_action_body_field); + } + if ($this->isColumnModified(AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE)) { $criteria->add(AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE, $this->abe_case_note_in_response); } @@ -1360,6 +1468,10 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $criteria->add(AbeConfigurationPeer::ABE_EMAIL_SERVER_UID, $this->abe_email_server_uid); } + if ($this->isColumnModified(AbeConfigurationPeer::ABE_EMAIL_SERVER_RECEIVER_UID)) { + $criteria->add(AbeConfigurationPeer::ABE_EMAIL_SERVER_RECEIVER_UID, $this->abe_email_server_receiver_uid); + } + return $criteria; } @@ -1430,6 +1542,8 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $copyObj->setAbeActionField($this->abe_action_field); + $copyObj->setAbeActionBodyField($this->abe_action_body_field); + $copyObj->setAbeCaseNoteInResponse($this->abe_case_note_in_response); $copyObj->setAbeForceLogin($this->abe_force_login); @@ -1446,6 +1560,8 @@ abstract class BaseAbeConfiguration extends BaseObject implements Persistent $copyObj->setAbeEmailServerUid($this->abe_email_server_uid); + $copyObj->setAbeEmailServerReceiverUid($this->abe_email_server_receiver_uid); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseAbeConfigurationPeer.php b/workflow/engine/classes/model/om/BaseAbeConfigurationPeer.php index 213759db2..07f5b2bf0 100644 --- a/workflow/engine/classes/model/om/BaseAbeConfigurationPeer.php +++ b/workflow/engine/classes/model/om/BaseAbeConfigurationPeer.php @@ -25,7 +25,7 @@ abstract class BaseAbeConfigurationPeer const CLASS_DEFAULT = 'classes.model.AbeConfiguration'; /** The total number of columns. */ - const NUM_COLUMNS = 17; + const NUM_COLUMNS = 19; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -58,6 +58,9 @@ abstract class BaseAbeConfigurationPeer /** the column name for the ABE_ACTION_FIELD field */ const ABE_ACTION_FIELD = 'ABE_CONFIGURATION.ABE_ACTION_FIELD'; + /** the column name for the ABE_ACTION_BODY_FIELD field */ + const ABE_ACTION_BODY_FIELD = 'ABE_CONFIGURATION.ABE_ACTION_BODY_FIELD'; + /** the column name for the ABE_CASE_NOTE_IN_RESPONSE field */ const ABE_CASE_NOTE_IN_RESPONSE = 'ABE_CONFIGURATION.ABE_CASE_NOTE_IN_RESPONSE'; @@ -82,6 +85,9 @@ abstract class BaseAbeConfigurationPeer /** the column name for the ABE_EMAIL_SERVER_UID field */ const ABE_EMAIL_SERVER_UID = 'ABE_CONFIGURATION.ABE_EMAIL_SERVER_UID'; + /** the column name for the ABE_EMAIL_SERVER_RECEIVER_UID field */ + const ABE_EMAIL_SERVER_RECEIVER_UID = 'ABE_CONFIGURATION.ABE_EMAIL_SERVER_RECEIVER_UID'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -93,10 +99,10 @@ abstract class BaseAbeConfigurationPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('AbeUid', 'ProUid', 'TasUid', 'AbeType', 'AbeTemplate', 'AbeDynType', 'DynUid', 'AbeEmailField', 'AbeActionField', 'AbeCaseNoteInResponse', 'AbeForceLogin', 'AbeCreateDate', 'AbeUpdateDate', 'AbeSubjectField', 'AbeMailserverOrMailcurrent', 'AbeCustomGrid', 'AbeEmailServerUid', ), - BasePeer::TYPE_COLNAME => array (AbeConfigurationPeer::ABE_UID, AbeConfigurationPeer::PRO_UID, AbeConfigurationPeer::TAS_UID, AbeConfigurationPeer::ABE_TYPE, AbeConfigurationPeer::ABE_TEMPLATE, AbeConfigurationPeer::ABE_DYN_TYPE, AbeConfigurationPeer::DYN_UID, AbeConfigurationPeer::ABE_EMAIL_FIELD, AbeConfigurationPeer::ABE_ACTION_FIELD, AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE, AbeConfigurationPeer::ABE_FORCE_LOGIN, AbeConfigurationPeer::ABE_CREATE_DATE, AbeConfigurationPeer::ABE_UPDATE_DATE, AbeConfigurationPeer::ABE_SUBJECT_FIELD, AbeConfigurationPeer::ABE_MAILSERVER_OR_MAILCURRENT, AbeConfigurationPeer::ABE_CUSTOM_GRID, AbeConfigurationPeer::ABE_EMAIL_SERVER_UID, ), - BasePeer::TYPE_FIELDNAME => array ('ABE_UID', 'PRO_UID', 'TAS_UID', 'ABE_TYPE', 'ABE_TEMPLATE', 'ABE_DYN_TYPE', 'DYN_UID', 'ABE_EMAIL_FIELD', 'ABE_ACTION_FIELD', 'ABE_CASE_NOTE_IN_RESPONSE', 'ABE_FORCE_LOGIN', 'ABE_CREATE_DATE', 'ABE_UPDATE_DATE', 'ABE_SUBJECT_FIELD', 'ABE_MAILSERVER_OR_MAILCURRENT', 'ABE_CUSTOM_GRID', 'ABE_EMAIL_SERVER_UID', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ) + BasePeer::TYPE_PHPNAME => array ('AbeUid', 'ProUid', 'TasUid', 'AbeType', 'AbeTemplate', 'AbeDynType', 'DynUid', 'AbeEmailField', 'AbeActionField', 'AbeActionBodyField', 'AbeCaseNoteInResponse', 'AbeForceLogin', 'AbeCreateDate', 'AbeUpdateDate', 'AbeSubjectField', 'AbeMailserverOrMailcurrent', 'AbeCustomGrid', 'AbeEmailServerUid', 'AbeEmailServerReceiverUid', ), + BasePeer::TYPE_COLNAME => array (AbeConfigurationPeer::ABE_UID, AbeConfigurationPeer::PRO_UID, AbeConfigurationPeer::TAS_UID, AbeConfigurationPeer::ABE_TYPE, AbeConfigurationPeer::ABE_TEMPLATE, AbeConfigurationPeer::ABE_DYN_TYPE, AbeConfigurationPeer::DYN_UID, AbeConfigurationPeer::ABE_EMAIL_FIELD, AbeConfigurationPeer::ABE_ACTION_FIELD, AbeConfigurationPeer::ABE_ACTION_BODY_FIELD, AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE, AbeConfigurationPeer::ABE_FORCE_LOGIN, AbeConfigurationPeer::ABE_CREATE_DATE, AbeConfigurationPeer::ABE_UPDATE_DATE, AbeConfigurationPeer::ABE_SUBJECT_FIELD, AbeConfigurationPeer::ABE_MAILSERVER_OR_MAILCURRENT, AbeConfigurationPeer::ABE_CUSTOM_GRID, AbeConfigurationPeer::ABE_EMAIL_SERVER_UID, AbeConfigurationPeer::ABE_EMAIL_SERVER_RECEIVER_UID, ), + BasePeer::TYPE_FIELDNAME => array ('ABE_UID', 'PRO_UID', 'TAS_UID', 'ABE_TYPE', 'ABE_TEMPLATE', 'ABE_DYN_TYPE', 'DYN_UID', 'ABE_EMAIL_FIELD', 'ABE_ACTION_FIELD', 'ABE_ACTION_BODY_FIELD', 'ABE_CASE_NOTE_IN_RESPONSE', 'ABE_FORCE_LOGIN', 'ABE_CREATE_DATE', 'ABE_UPDATE_DATE', 'ABE_SUBJECT_FIELD', 'ABE_MAILSERVER_OR_MAILCURRENT', 'ABE_CUSTOM_GRID', 'ABE_EMAIL_SERVER_UID', 'ABE_EMAIL_SERVER_RECEIVER_UID', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ) ); /** @@ -106,10 +112,10 @@ abstract class BaseAbeConfigurationPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('AbeUid' => 0, 'ProUid' => 1, 'TasUid' => 2, 'AbeType' => 3, 'AbeTemplate' => 4, 'AbeDynType' => 5, 'DynUid' => 6, 'AbeEmailField' => 7, 'AbeActionField' => 8, 'AbeCaseNoteInResponse' => 9, 'AbeForceLogin' => 10, 'AbeCreateDate' => 11, 'AbeUpdateDate' => 12, 'AbeSubjectField' => 13, 'AbeMailserverOrMailcurrent' => 14, 'AbeCustomGrid' => 15, 'AbeEmailServerUid' => 16, ), - BasePeer::TYPE_COLNAME => array (AbeConfigurationPeer::ABE_UID => 0, AbeConfigurationPeer::PRO_UID => 1, AbeConfigurationPeer::TAS_UID => 2, AbeConfigurationPeer::ABE_TYPE => 3, AbeConfigurationPeer::ABE_TEMPLATE => 4, AbeConfigurationPeer::ABE_DYN_TYPE => 5, AbeConfigurationPeer::DYN_UID => 6, AbeConfigurationPeer::ABE_EMAIL_FIELD => 7, AbeConfigurationPeer::ABE_ACTION_FIELD => 8, AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE => 9, AbeConfigurationPeer::ABE_FORCE_LOGIN => 10, AbeConfigurationPeer::ABE_CREATE_DATE => 11, AbeConfigurationPeer::ABE_UPDATE_DATE => 12, AbeConfigurationPeer::ABE_SUBJECT_FIELD => 13, AbeConfigurationPeer::ABE_MAILSERVER_OR_MAILCURRENT => 14, AbeConfigurationPeer::ABE_CUSTOM_GRID => 15, AbeConfigurationPeer::ABE_EMAIL_SERVER_UID => 16, ), - BasePeer::TYPE_FIELDNAME => array ('ABE_UID' => 0, 'PRO_UID' => 1, 'TAS_UID' => 2, 'ABE_TYPE' => 3, 'ABE_TEMPLATE' => 4, 'ABE_DYN_TYPE' => 5, 'DYN_UID' => 6, 'ABE_EMAIL_FIELD' => 7, 'ABE_ACTION_FIELD' => 8, 'ABE_CASE_NOTE_IN_RESPONSE' => 9, 'ABE_FORCE_LOGIN' => 10, 'ABE_CREATE_DATE' => 11, 'ABE_UPDATE_DATE' => 12, 'ABE_SUBJECT_FIELD' => 13, 'ABE_MAILSERVER_OR_MAILCURRENT' => 14, 'ABE_CUSTOM_GRID' => 15, 'ABE_EMAIL_SERVER_UID' => 16, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ) + BasePeer::TYPE_PHPNAME => array ('AbeUid' => 0, 'ProUid' => 1, 'TasUid' => 2, 'AbeType' => 3, 'AbeTemplate' => 4, 'AbeDynType' => 5, 'DynUid' => 6, 'AbeEmailField' => 7, 'AbeActionField' => 8, 'AbeActionBodyField' => 9, 'AbeCaseNoteInResponse' => 10, 'AbeForceLogin' => 11, 'AbeCreateDate' => 12, 'AbeUpdateDate' => 13, 'AbeSubjectField' => 14, 'AbeMailserverOrMailcurrent' => 15, 'AbeCustomGrid' => 16, 'AbeEmailServerUid' => 17, 'AbeEmailServerReceiverUid' => 18, ), + BasePeer::TYPE_COLNAME => array (AbeConfigurationPeer::ABE_UID => 0, AbeConfigurationPeer::PRO_UID => 1, AbeConfigurationPeer::TAS_UID => 2, AbeConfigurationPeer::ABE_TYPE => 3, AbeConfigurationPeer::ABE_TEMPLATE => 4, AbeConfigurationPeer::ABE_DYN_TYPE => 5, AbeConfigurationPeer::DYN_UID => 6, AbeConfigurationPeer::ABE_EMAIL_FIELD => 7, AbeConfigurationPeer::ABE_ACTION_FIELD => 8, AbeConfigurationPeer::ABE_ACTION_BODY_FIELD => 9, AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE => 10, AbeConfigurationPeer::ABE_FORCE_LOGIN => 11, AbeConfigurationPeer::ABE_CREATE_DATE => 12, AbeConfigurationPeer::ABE_UPDATE_DATE => 13, AbeConfigurationPeer::ABE_SUBJECT_FIELD => 14, AbeConfigurationPeer::ABE_MAILSERVER_OR_MAILCURRENT => 15, AbeConfigurationPeer::ABE_CUSTOM_GRID => 16, AbeConfigurationPeer::ABE_EMAIL_SERVER_UID => 17, AbeConfigurationPeer::ABE_EMAIL_SERVER_RECEIVER_UID => 18, ), + BasePeer::TYPE_FIELDNAME => array ('ABE_UID' => 0, 'PRO_UID' => 1, 'TAS_UID' => 2, 'ABE_TYPE' => 3, 'ABE_TEMPLATE' => 4, 'ABE_DYN_TYPE' => 5, 'DYN_UID' => 6, 'ABE_EMAIL_FIELD' => 7, 'ABE_ACTION_FIELD' => 8, 'ABE_ACTION_BODY_FIELD' => 9, 'ABE_CASE_NOTE_IN_RESPONSE' => 10, 'ABE_FORCE_LOGIN' => 11, 'ABE_CREATE_DATE' => 12, 'ABE_UPDATE_DATE' => 13, 'ABE_SUBJECT_FIELD' => 14, 'ABE_MAILSERVER_OR_MAILCURRENT' => 15, 'ABE_CUSTOM_GRID' => 16, 'ABE_EMAIL_SERVER_UID' => 17, 'ABE_EMAIL_SERVER_RECEIVER_UID' => 18, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ) ); /** @@ -228,6 +234,8 @@ abstract class BaseAbeConfigurationPeer $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_FIELD); + $criteria->addSelectColumn(AbeConfigurationPeer::ABE_ACTION_BODY_FIELD); + $criteria->addSelectColumn(AbeConfigurationPeer::ABE_CASE_NOTE_IN_RESPONSE); $criteria->addSelectColumn(AbeConfigurationPeer::ABE_FORCE_LOGIN); @@ -244,6 +252,8 @@ abstract class BaseAbeConfigurationPeer $criteria->addSelectColumn(AbeConfigurationPeer::ABE_EMAIL_SERVER_UID); + $criteria->addSelectColumn(AbeConfigurationPeer::ABE_EMAIL_SERVER_RECEIVER_UID); + } const COUNT = 'COUNT(ABE_CONFIGURATION.ABE_UID)'; diff --git a/workflow/engine/classes/model/om/BaseEmailServer.php b/workflow/engine/classes/model/om/BaseEmailServer.php index 111488080..82716bab4 100644 --- a/workflow/engine/classes/model/om/BaseEmailServer.php +++ b/workflow/engine/classes/model/om/BaseEmailServer.php @@ -51,6 +51,18 @@ abstract class BaseEmailServer extends BaseObject implements Persistent */ protected $mess_port = 0; + /** + * The value for the mess_incoming_server field. + * @var string + */ + protected $mess_incoming_server = ''; + + /** + * The value for the mess_incoming_port field. + * @var int + */ + protected $mess_incoming_port = 0; + /** * The value for the mess_rauth field. * @var int @@ -163,6 +175,28 @@ abstract class BaseEmailServer extends BaseObject implements Persistent return $this->mess_port; } + /** + * Get the [mess_incoming_server] column value. + * + * @return string + */ + public function getMessIncomingServer() + { + + return $this->mess_incoming_server; + } + + /** + * Get the [mess_incoming_port] column value. + * + * @return int + */ + public function getMessIncomingPort() + { + + return $this->mess_incoming_port; + } + /** * Get the [mess_rauth] column value. * @@ -350,6 +384,50 @@ abstract class BaseEmailServer extends BaseObject implements Persistent } // setMessPort() + /** + * Set the value of [mess_incoming_server] column. + * + * @param string $v new value + * @return void + */ + public function setMessIncomingServer($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->mess_incoming_server !== $v || $v === '') { + $this->mess_incoming_server = $v; + $this->modifiedColumns[] = EmailServerPeer::MESS_INCOMING_SERVER; + } + + } // setMessIncomingServer() + + /** + * Set the value of [mess_incoming_port] column. + * + * @param int $v new value + * @return void + */ + public function setMessIncomingPort($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->mess_incoming_port !== $v || $v === 0) { + $this->mess_incoming_port = $v; + $this->modifiedColumns[] = EmailServerPeer::MESS_INCOMING_PORT; + } + + } // setMessIncomingPort() + /** * Set the value of [mess_rauth] column. * @@ -573,30 +651,34 @@ abstract class BaseEmailServer extends BaseObject implements Persistent $this->mess_port = $rs->getInt($startcol + 3); - $this->mess_rauth = $rs->getInt($startcol + 4); + $this->mess_incoming_server = $rs->getString($startcol + 4); - $this->mess_account = $rs->getString($startcol + 5); + $this->mess_incoming_port = $rs->getInt($startcol + 5); - $this->mess_password = $rs->getString($startcol + 6); + $this->mess_rauth = $rs->getInt($startcol + 6); - $this->mess_from_mail = $rs->getString($startcol + 7); + $this->mess_account = $rs->getString($startcol + 7); - $this->mess_from_name = $rs->getString($startcol + 8); + $this->mess_password = $rs->getString($startcol + 8); - $this->smtpsecure = $rs->getString($startcol + 9); + $this->mess_from_mail = $rs->getString($startcol + 9); - $this->mess_try_send_inmediatly = $rs->getInt($startcol + 10); + $this->mess_from_name = $rs->getString($startcol + 10); - $this->mail_to = $rs->getString($startcol + 11); + $this->smtpsecure = $rs->getString($startcol + 11); - $this->mess_default = $rs->getInt($startcol + 12); + $this->mess_try_send_inmediatly = $rs->getInt($startcol + 12); + + $this->mail_to = $rs->getString($startcol + 13); + + $this->mess_default = $rs->getInt($startcol + 14); $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 13; // 13 = EmailServerPeer::NUM_COLUMNS - EmailServerPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 15; // 15 = EmailServerPeer::NUM_COLUMNS - EmailServerPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating EmailServer object", $e); @@ -813,30 +895,36 @@ abstract class BaseEmailServer extends BaseObject implements Persistent return $this->getMessPort(); break; case 4: - return $this->getMessRauth(); + return $this->getMessIncomingServer(); break; case 5: - return $this->getMessAccount(); + return $this->getMessIncomingPort(); break; case 6: - return $this->getMessPassword(); + return $this->getMessRauth(); break; case 7: - return $this->getMessFromMail(); + return $this->getMessAccount(); break; case 8: - return $this->getMessFromName(); + return $this->getMessPassword(); break; case 9: - return $this->getSmtpsecure(); + return $this->getMessFromMail(); break; case 10: - return $this->getMessTrySendInmediatly(); + return $this->getMessFromName(); break; case 11: - return $this->getMailTo(); + return $this->getSmtpsecure(); break; case 12: + return $this->getMessTrySendInmediatly(); + break; + case 13: + return $this->getMailTo(); + break; + case 14: return $this->getMessDefault(); break; default: @@ -863,15 +951,17 @@ abstract class BaseEmailServer extends BaseObject implements Persistent $keys[1] => $this->getMessEngine(), $keys[2] => $this->getMessServer(), $keys[3] => $this->getMessPort(), - $keys[4] => $this->getMessRauth(), - $keys[5] => $this->getMessAccount(), - $keys[6] => $this->getMessPassword(), - $keys[7] => $this->getMessFromMail(), - $keys[8] => $this->getMessFromName(), - $keys[9] => $this->getSmtpsecure(), - $keys[10] => $this->getMessTrySendInmediatly(), - $keys[11] => $this->getMailTo(), - $keys[12] => $this->getMessDefault(), + $keys[4] => $this->getMessIncomingServer(), + $keys[5] => $this->getMessIncomingPort(), + $keys[6] => $this->getMessRauth(), + $keys[7] => $this->getMessAccount(), + $keys[8] => $this->getMessPassword(), + $keys[9] => $this->getMessFromMail(), + $keys[10] => $this->getMessFromName(), + $keys[11] => $this->getSmtpsecure(), + $keys[12] => $this->getMessTrySendInmediatly(), + $keys[13] => $this->getMailTo(), + $keys[14] => $this->getMessDefault(), ); return $result; } @@ -916,30 +1006,36 @@ abstract class BaseEmailServer extends BaseObject implements Persistent $this->setMessPort($value); break; case 4: - $this->setMessRauth($value); + $this->setMessIncomingServer($value); break; case 5: - $this->setMessAccount($value); + $this->setMessIncomingPort($value); break; case 6: - $this->setMessPassword($value); + $this->setMessRauth($value); break; case 7: - $this->setMessFromMail($value); + $this->setMessAccount($value); break; case 8: - $this->setMessFromName($value); + $this->setMessPassword($value); break; case 9: - $this->setSmtpsecure($value); + $this->setMessFromMail($value); break; case 10: - $this->setMessTrySendInmediatly($value); + $this->setMessFromName($value); break; case 11: - $this->setMailTo($value); + $this->setSmtpsecure($value); break; case 12: + $this->setMessTrySendInmediatly($value); + break; + case 13: + $this->setMailTo($value); + break; + case 14: $this->setMessDefault($value); break; } // switch() @@ -982,39 +1078,47 @@ abstract class BaseEmailServer extends BaseObject implements Persistent } if (array_key_exists($keys[4], $arr)) { - $this->setMessRauth($arr[$keys[4]]); + $this->setMessIncomingServer($arr[$keys[4]]); } if (array_key_exists($keys[5], $arr)) { - $this->setMessAccount($arr[$keys[5]]); + $this->setMessIncomingPort($arr[$keys[5]]); } if (array_key_exists($keys[6], $arr)) { - $this->setMessPassword($arr[$keys[6]]); + $this->setMessRauth($arr[$keys[6]]); } if (array_key_exists($keys[7], $arr)) { - $this->setMessFromMail($arr[$keys[7]]); + $this->setMessAccount($arr[$keys[7]]); } if (array_key_exists($keys[8], $arr)) { - $this->setMessFromName($arr[$keys[8]]); + $this->setMessPassword($arr[$keys[8]]); } if (array_key_exists($keys[9], $arr)) { - $this->setSmtpsecure($arr[$keys[9]]); + $this->setMessFromMail($arr[$keys[9]]); } if (array_key_exists($keys[10], $arr)) { - $this->setMessTrySendInmediatly($arr[$keys[10]]); + $this->setMessFromName($arr[$keys[10]]); } if (array_key_exists($keys[11], $arr)) { - $this->setMailTo($arr[$keys[11]]); + $this->setSmtpsecure($arr[$keys[11]]); } if (array_key_exists($keys[12], $arr)) { - $this->setMessDefault($arr[$keys[12]]); + $this->setMessTrySendInmediatly($arr[$keys[12]]); + } + + if (array_key_exists($keys[13], $arr)) { + $this->setMailTo($arr[$keys[13]]); + } + + if (array_key_exists($keys[14], $arr)) { + $this->setMessDefault($arr[$keys[14]]); } } @@ -1044,6 +1148,14 @@ abstract class BaseEmailServer extends BaseObject implements Persistent $criteria->add(EmailServerPeer::MESS_PORT, $this->mess_port); } + if ($this->isColumnModified(EmailServerPeer::MESS_INCOMING_SERVER)) { + $criteria->add(EmailServerPeer::MESS_INCOMING_SERVER, $this->mess_incoming_server); + } + + if ($this->isColumnModified(EmailServerPeer::MESS_INCOMING_PORT)) { + $criteria->add(EmailServerPeer::MESS_INCOMING_PORT, $this->mess_incoming_port); + } + if ($this->isColumnModified(EmailServerPeer::MESS_RAUTH)) { $criteria->add(EmailServerPeer::MESS_RAUTH, $this->mess_rauth); } @@ -1140,6 +1252,10 @@ abstract class BaseEmailServer extends BaseObject implements Persistent $copyObj->setMessPort($this->mess_port); + $copyObj->setMessIncomingServer($this->mess_incoming_server); + + $copyObj->setMessIncomingPort($this->mess_incoming_port); + $copyObj->setMessRauth($this->mess_rauth); $copyObj->setMessAccount($this->mess_account); diff --git a/workflow/engine/classes/model/om/BaseEmailServerPeer.php b/workflow/engine/classes/model/om/BaseEmailServerPeer.php index c78d96808..a020a0763 100644 --- a/workflow/engine/classes/model/om/BaseEmailServerPeer.php +++ b/workflow/engine/classes/model/om/BaseEmailServerPeer.php @@ -25,7 +25,7 @@ abstract class BaseEmailServerPeer const CLASS_DEFAULT = 'classes.model.EmailServer'; /** The total number of columns. */ - const NUM_COLUMNS = 13; + const NUM_COLUMNS = 15; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -43,6 +43,12 @@ abstract class BaseEmailServerPeer /** the column name for the MESS_PORT field */ const MESS_PORT = 'EMAIL_SERVER.MESS_PORT'; + /** the column name for the MESS_INCOMING_SERVER field */ + const MESS_INCOMING_SERVER = 'EMAIL_SERVER.MESS_INCOMING_SERVER'; + + /** the column name for the MESS_INCOMING_PORT field */ + const MESS_INCOMING_PORT = 'EMAIL_SERVER.MESS_INCOMING_PORT'; + /** the column name for the MESS_RAUTH field */ const MESS_RAUTH = 'EMAIL_SERVER.MESS_RAUTH'; @@ -81,10 +87,10 @@ abstract class BaseEmailServerPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('MessUid', 'MessEngine', 'MessServer', 'MessPort', 'MessRauth', 'MessAccount', 'MessPassword', 'MessFromMail', 'MessFromName', 'Smtpsecure', 'MessTrySendInmediatly', 'MailTo', 'MessDefault', ), - BasePeer::TYPE_COLNAME => array (EmailServerPeer::MESS_UID, EmailServerPeer::MESS_ENGINE, EmailServerPeer::MESS_SERVER, EmailServerPeer::MESS_PORT, EmailServerPeer::MESS_RAUTH, EmailServerPeer::MESS_ACCOUNT, EmailServerPeer::MESS_PASSWORD, EmailServerPeer::MESS_FROM_MAIL, EmailServerPeer::MESS_FROM_NAME, EmailServerPeer::SMTPSECURE, EmailServerPeer::MESS_TRY_SEND_INMEDIATLY, EmailServerPeer::MAIL_TO, EmailServerPeer::MESS_DEFAULT, ), - BasePeer::TYPE_FIELDNAME => array ('MESS_UID', 'MESS_ENGINE', 'MESS_SERVER', 'MESS_PORT', 'MESS_RAUTH', 'MESS_ACCOUNT', 'MESS_PASSWORD', 'MESS_FROM_MAIL', 'MESS_FROM_NAME', 'SMTPSECURE', 'MESS_TRY_SEND_INMEDIATLY', 'MAIL_TO', 'MESS_DEFAULT', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + BasePeer::TYPE_PHPNAME => array ('MessUid', 'MessEngine', 'MessServer', 'MessPort', 'MessIncomingServer', 'MessIncomingPort', 'MessRauth', 'MessAccount', 'MessPassword', 'MessFromMail', 'MessFromName', 'Smtpsecure', 'MessTrySendInmediatly', 'MailTo', 'MessDefault', ), + BasePeer::TYPE_COLNAME => array (EmailServerPeer::MESS_UID, EmailServerPeer::MESS_ENGINE, EmailServerPeer::MESS_SERVER, EmailServerPeer::MESS_PORT, EmailServerPeer::MESS_INCOMING_SERVER, EmailServerPeer::MESS_INCOMING_PORT, EmailServerPeer::MESS_RAUTH, EmailServerPeer::MESS_ACCOUNT, EmailServerPeer::MESS_PASSWORD, EmailServerPeer::MESS_FROM_MAIL, EmailServerPeer::MESS_FROM_NAME, EmailServerPeer::SMTPSECURE, EmailServerPeer::MESS_TRY_SEND_INMEDIATLY, EmailServerPeer::MAIL_TO, EmailServerPeer::MESS_DEFAULT, ), + BasePeer::TYPE_FIELDNAME => array ('MESS_UID', 'MESS_ENGINE', 'MESS_SERVER', 'MESS_PORT', 'MESS_INCOMING_SERVER', 'MESS_INCOMING_PORT', 'MESS_RAUTH', 'MESS_ACCOUNT', 'MESS_PASSWORD', 'MESS_FROM_MAIL', 'MESS_FROM_NAME', 'SMTPSECURE', 'MESS_TRY_SEND_INMEDIATLY', 'MAIL_TO', 'MESS_DEFAULT', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) ); /** @@ -94,10 +100,10 @@ abstract class BaseEmailServerPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('MessUid' => 0, 'MessEngine' => 1, 'MessServer' => 2, 'MessPort' => 3, 'MessRauth' => 4, 'MessAccount' => 5, 'MessPassword' => 6, 'MessFromMail' => 7, 'MessFromName' => 8, 'Smtpsecure' => 9, 'MessTrySendInmediatly' => 10, 'MailTo' => 11, 'MessDefault' => 12, ), - BasePeer::TYPE_COLNAME => array (EmailServerPeer::MESS_UID => 0, EmailServerPeer::MESS_ENGINE => 1, EmailServerPeer::MESS_SERVER => 2, EmailServerPeer::MESS_PORT => 3, EmailServerPeer::MESS_RAUTH => 4, EmailServerPeer::MESS_ACCOUNT => 5, EmailServerPeer::MESS_PASSWORD => 6, EmailServerPeer::MESS_FROM_MAIL => 7, EmailServerPeer::MESS_FROM_NAME => 8, EmailServerPeer::SMTPSECURE => 9, EmailServerPeer::MESS_TRY_SEND_INMEDIATLY => 10, EmailServerPeer::MAIL_TO => 11, EmailServerPeer::MESS_DEFAULT => 12, ), - BasePeer::TYPE_FIELDNAME => array ('MESS_UID' => 0, 'MESS_ENGINE' => 1, 'MESS_SERVER' => 2, 'MESS_PORT' => 3, 'MESS_RAUTH' => 4, 'MESS_ACCOUNT' => 5, 'MESS_PASSWORD' => 6, 'MESS_FROM_MAIL' => 7, 'MESS_FROM_NAME' => 8, 'SMTPSECURE' => 9, 'MESS_TRY_SEND_INMEDIATLY' => 10, 'MAIL_TO' => 11, 'MESS_DEFAULT' => 12, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ) + BasePeer::TYPE_PHPNAME => array ('MessUid' => 0, 'MessEngine' => 1, 'MessServer' => 2, 'MessPort' => 3, 'MessIncomingServer' => 4, 'MessIncomingPort' => 5, 'MessRauth' => 6, 'MessAccount' => 7, 'MessPassword' => 8, 'MessFromMail' => 9, 'MessFromName' => 10, 'Smtpsecure' => 11, 'MessTrySendInmediatly' => 12, 'MailTo' => 13, 'MessDefault' => 14, ), + BasePeer::TYPE_COLNAME => array (EmailServerPeer::MESS_UID => 0, EmailServerPeer::MESS_ENGINE => 1, EmailServerPeer::MESS_SERVER => 2, EmailServerPeer::MESS_PORT => 3, EmailServerPeer::MESS_INCOMING_SERVER => 4, EmailServerPeer::MESS_INCOMING_PORT => 5, EmailServerPeer::MESS_RAUTH => 6, EmailServerPeer::MESS_ACCOUNT => 7, EmailServerPeer::MESS_PASSWORD => 8, EmailServerPeer::MESS_FROM_MAIL => 9, EmailServerPeer::MESS_FROM_NAME => 10, EmailServerPeer::SMTPSECURE => 11, EmailServerPeer::MESS_TRY_SEND_INMEDIATLY => 12, EmailServerPeer::MAIL_TO => 13, EmailServerPeer::MESS_DEFAULT => 14, ), + BasePeer::TYPE_FIELDNAME => array ('MESS_UID' => 0, 'MESS_ENGINE' => 1, 'MESS_SERVER' => 2, 'MESS_PORT' => 3, 'MESS_INCOMING_SERVER' => 4, 'MESS_INCOMING_PORT' => 5, 'MESS_RAUTH' => 6, 'MESS_ACCOUNT' => 7, 'MESS_PASSWORD' => 8, 'MESS_FROM_MAIL' => 9, 'MESS_FROM_NAME' => 10, 'SMTPSECURE' => 11, 'MESS_TRY_SEND_INMEDIATLY' => 12, 'MAIL_TO' => 13, 'MESS_DEFAULT' => 14, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) ); /** @@ -206,6 +212,10 @@ abstract class BaseEmailServerPeer $criteria->addSelectColumn(EmailServerPeer::MESS_PORT); + $criteria->addSelectColumn(EmailServerPeer::MESS_INCOMING_SERVER); + + $criteria->addSelectColumn(EmailServerPeer::MESS_INCOMING_PORT); + $criteria->addSelectColumn(EmailServerPeer::MESS_RAUTH); $criteria->addSelectColumn(EmailServerPeer::MESS_ACCOUNT); diff --git a/workflow/engine/classes/model/om/BaseUsersProperties.php b/workflow/engine/classes/model/om/BaseUsersProperties.php index d7da23a8b..eb160481c 100644 --- a/workflow/engine/classes/model/om/BaseUsersProperties.php +++ b/workflow/engine/classes/model/om/BaseUsersProperties.php @@ -57,6 +57,12 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent */ protected $usr_setting_designer; + /** + * The value for the pmdynaform_first_time field. + * @var string + */ + protected $pmdynaform_first_time = '0'; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -147,6 +153,17 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent return $this->usr_setting_designer; } + /** + * Get the [pmdynaform_first_time] column value. + * + * @return string + */ + public function getPmdynaformFirstTime() + { + + return $this->pmdynaform_first_time; + } + /** * Set the value of [usr_uid] column. * @@ -264,6 +281,28 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent } // setUsrSettingDesigner() + /** + * Set the value of [pmdynaform_first_time] column. + * + * @param string $v new value + * @return void + */ + public function setPmdynaformFirstTime($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->pmdynaform_first_time !== $v || $v === '0') { + $this->pmdynaform_first_time = $v; + $this->modifiedColumns[] = UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME; + } + + } // setPmdynaformFirstTime() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -291,12 +330,14 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $this->usr_setting_designer = $rs->getString($startcol + 4); + $this->pmdynaform_first_time = $rs->getString($startcol + 5); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 5; // 5 = UsersPropertiesPeer::NUM_COLUMNS - UsersPropertiesPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 6; // 6 = UsersPropertiesPeer::NUM_COLUMNS - UsersPropertiesPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating UsersProperties object", $e); @@ -515,6 +556,9 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent case 4: return $this->getUsrSettingDesigner(); break; + case 5: + return $this->getPmdynaformFirstTime(); + break; default: return null; break; @@ -540,6 +584,7 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $keys[2] => $this->getUsrLoggedNextTime(), $keys[3] => $this->getUsrPasswordHistory(), $keys[4] => $this->getUsrSettingDesigner(), + $keys[5] => $this->getPmdynaformFirstTime(), ); return $result; } @@ -586,6 +631,9 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent case 4: $this->setUsrSettingDesigner($value); break; + case 5: + $this->setPmdynaformFirstTime($value); + break; } // switch() } @@ -629,6 +677,10 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $this->setUsrSettingDesigner($arr[$keys[4]]); } + if (array_key_exists($keys[5], $arr)) { + $this->setPmdynaformFirstTime($arr[$keys[5]]); + } + } /** @@ -660,6 +712,10 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $criteria->add(UsersPropertiesPeer::USR_SETTING_DESIGNER, $this->usr_setting_designer); } + if ($this->isColumnModified(UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME)) { + $criteria->add(UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME, $this->pmdynaform_first_time); + } + return $criteria; } @@ -722,6 +778,8 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $copyObj->setUsrSettingDesigner($this->usr_setting_designer); + $copyObj->setPmdynaformFirstTime($this->pmdynaform_first_time); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php b/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php index 2636ff64a..ffac1caf2 100644 --- a/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php +++ b/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php @@ -25,7 +25,7 @@ abstract class BaseUsersPropertiesPeer const CLASS_DEFAULT = 'classes.model.UsersProperties'; /** The total number of columns. */ - const NUM_COLUMNS = 5; + const NUM_COLUMNS = 6; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -46,6 +46,9 @@ abstract class BaseUsersPropertiesPeer /** the column name for the USR_SETTING_DESIGNER field */ const USR_SETTING_DESIGNER = 'USERS_PROPERTIES.USR_SETTING_DESIGNER'; + /** the column name for the PMDYNAFORM_FIRST_TIME field */ + const PMDYNAFORM_FIRST_TIME = 'USERS_PROPERTIES.PMDYNAFORM_FIRST_TIME'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -57,10 +60,10 @@ abstract class BaseUsersPropertiesPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrLastUpdateDate', 'UsrLoggedNextTime', 'UsrPasswordHistory', 'UsrSettingDesigner', ), - BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID, UsersPropertiesPeer::USR_LAST_UPDATE_DATE, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME, UsersPropertiesPeer::USR_PASSWORD_HISTORY, UsersPropertiesPeer::USR_SETTING_DESIGNER, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_LAST_UPDATE_DATE', 'USR_LOGGED_NEXT_TIME', 'USR_PASSWORD_HISTORY', 'USR_SETTING_DESIGNER', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrLastUpdateDate', 'UsrLoggedNextTime', 'UsrPasswordHistory', 'UsrSettingDesigner', 'PmdynaformFirstTime', ), + BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID, UsersPropertiesPeer::USR_LAST_UPDATE_DATE, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME, UsersPropertiesPeer::USR_PASSWORD_HISTORY, UsersPropertiesPeer::USR_SETTING_DESIGNER, UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_LAST_UPDATE_DATE', 'USR_LOGGED_NEXT_TIME', 'USR_PASSWORD_HISTORY', 'USR_SETTING_DESIGNER', 'PMDYNAFORM_FIRST_TIME', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) ); /** @@ -70,10 +73,10 @@ abstract class BaseUsersPropertiesPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrLastUpdateDate' => 1, 'UsrLoggedNextTime' => 2, 'UsrPasswordHistory' => 3, 'UsrSettingDesigner' => 4, ), - BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID => 0, UsersPropertiesPeer::USR_LAST_UPDATE_DATE => 1, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME => 2, UsersPropertiesPeer::USR_PASSWORD_HISTORY => 3, UsersPropertiesPeer::USR_SETTING_DESIGNER => 4, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_LAST_UPDATE_DATE' => 1, 'USR_LOGGED_NEXT_TIME' => 2, 'USR_PASSWORD_HISTORY' => 3, 'USR_SETTING_DESIGNER' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrLastUpdateDate' => 1, 'UsrLoggedNextTime' => 2, 'UsrPasswordHistory' => 3, 'UsrSettingDesigner' => 4, 'PmdynaformFirstTime' => 5, ), + BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID => 0, UsersPropertiesPeer::USR_LAST_UPDATE_DATE => 1, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME => 2, UsersPropertiesPeer::USR_PASSWORD_HISTORY => 3, UsersPropertiesPeer::USR_SETTING_DESIGNER => 4, UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME => 5, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_LAST_UPDATE_DATE' => 1, 'USR_LOGGED_NEXT_TIME' => 2, 'USR_PASSWORD_HISTORY' => 3, 'USR_SETTING_DESIGNER' => 4, 'PMDYNAFORM_FIRST_TIME' => 5, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) ); /** @@ -184,6 +187,8 @@ abstract class BaseUsersPropertiesPeer $criteria->addSelectColumn(UsersPropertiesPeer::USR_SETTING_DESIGNER); + $criteria->addSelectColumn(UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME); + } const COUNT = 'COUNT(USERS_PROPERTIES.USR_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 2419ba032..fc5497564 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -2399,6 +2399,7 @@ +
@@ -4866,6 +4867,8 @@ + + @@ -5094,6 +5097,16 @@ + + + + + + + + + + @@ -5141,6 +5154,7 @@ + @@ -5769,7 +5783,7 @@
- + diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 8564fb1fe..05cf5e71a 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -1699,6 +1699,30 @@ msgstr "3 days at least" msgid "The answer has been submitted. Thank you." msgstr "The answer has been submitted. Thank you." +# TRANSLATION +# LABEL/ID_ABE_EMAIL_RESPONSE_BODY_NOTE +#: LABEL/ID_ABE_EMAIL_RESPONSE_BODY_NOTE +msgid "Please add your comments above this section. Don't modify or delete this section." +msgstr "Please add your comments above this section. Don't modify or delete this section." + +# TRANSLATION +# LABEL/ID_ABE_CASE_NOTE_ANSWER +#: LABEL/ID_ABE_CASE_NOTE_ANSWER +msgid "Answer: {optionLabel}" +msgstr "Answer: {optionLabel}" + +# TRANSLATION +# LABEL/ID_ABE_CASE_NOTE_COMMENT +#: LABEL/ID_ABE_CASE_NOTE_COMMENT +msgid "Comment: {emailBody}" +msgstr "Comment: {emailBody}" + +# TRANSLATION +# LABEL/ID_ABE_CASE_NOTE_HEADER +#: LABEL/ID_ABE_CASE_NOTE_HEADER +msgid "{emailAccount} has completed a task from Actions by Email." +msgstr "{emailAccount} has completed a task from Actions by Email." + # TRANSLATION # LABEL/ID_ABE_FORM_ALREADY_FILLED #: LABEL/ID_ABE_FORM_ALREADY_FILLED @@ -1711,6 +1735,54 @@ msgstr "The form has already been filled and sent." msgid "The information was submitted. Thank you." msgstr "The information was submitted. Thank you." +# TRANSLATION +# LABEL/ID_ABE_LOG_ALREADY_ROUTED +#: LABEL/ID_ABE_LOG_ALREADY_ROUTED +msgid "The case was identified correctly but it was already routed." +msgstr "The case was identified correctly but it was already routed." + +# TRANSLATION +# LABEL/ID_ABE_LOG_CANNOT_BE_IDENTIFIED +#: LABEL/ID_ABE_LOG_CANNOT_BE_IDENTIFIED +msgid "The case cannot be identified." +msgstr "The case cannot be identified." + +# TRANSLATION +# LABEL/ID_ABE_LOG_CANNOT_READ +#: LABEL/ID_ABE_LOG_CANNOT_READ +msgid "The application cannot read the email receiver account." +msgstr "The application cannot read the email receiver account." + +# TRANSLATION +# LABEL/ID_ABE_LOG_PROCESSED_OK +#: LABEL/ID_ABE_LOG_PROCESSED_OK +msgid "The answer was processed correctly." +msgstr "The answer was processed correctly." + +# TRANSLATION +# LABEL/ID_ABE_LOG_ROUTING_FAILED +#: LABEL/ID_ABE_LOG_ROUTING_FAILED +msgid "The case was identified correctly but the routing process has failed." +msgstr "The case was identified correctly but the routing process has failed." + +# TRANSLATION +# LABEL/ID_ABE_RESPONSE_ALREADY_ROUTED +#: LABEL/ID_ABE_RESPONSE_ALREADY_ROUTED +msgid "Your answer cannot be processed because the case was already routed or is no longer assigned to you." +msgstr "Your answer cannot be processed because the case was already routed or is no longer assigned to you." + +# TRANSLATION +# LABEL/ID_ABE_RESPONSE_CANNOT_BE_IDENTIFIED +#: LABEL/ID_ABE_RESPONSE_CANNOT_BE_IDENTIFIED +msgid "Your answer cannot be processed, please try again and make sure to keep the subject code untouched." +msgstr "Your answer cannot be processed, please try again and make sure to keep the subject code untouched." + +# TRANSLATION +# LABEL/ID_ABE_RESPONSE_ROUTING_FAILED +#: LABEL/ID_ABE_RESPONSE_ROUTING_FAILED +msgid "Your answer cannot be processed because there is an error in the flow definition, please notify to this issue to the system administrator." +msgstr "Your answer cannot be processed because there is an error in the flow definition, please notify to this issue to the system administrator." + # TRANSLATION # LABEL/ID_ABE_RESPONSE_SENT #: LABEL/ID_ABE_RESPONSE_SENT @@ -4247,6 +4319,12 @@ msgstr "Close Editor" msgid "[LABEL/ID_CODE] Code" msgstr "Code" +# TRANSLATION +# LABEL/ID_CODE_CRYPT +#: LABEL/ID_CODE_CRYPT +msgid "Code:" +msgstr "Code:" + # TRANSLATION # LABEL/ID_COLLAPSE_ALL #: LABEL/ID_COLLAPSE_ALL @@ -7475,6 +7553,12 @@ msgstr "There was a problem installing this add-on." msgid "Error in server" msgstr "Error in server" +# TRANSLATION +# LABEL/ID_ERROR_IN_THE_QUERY +#: LABEL/ID_ERROR_IN_THE_QUERY +msgid "Error in the query" +msgstr "Error in the query" + # TRANSLATION # LABEL/ID_ERROR_JS_NOT_AVAILABLE #: LABEL/ID_ERROR_JS_NOT_AVAILABLE @@ -13625,6 +13709,12 @@ msgstr "Execute a trigger when a case is deleted" msgid "Please press the \"Generate Link\" button." msgstr "Please press the \"Generate Link\" button." +# TRANSLATION +# LABEL/ID_MAFE_660cfca112471f69246e9942f5e8afd1 +#: LABEL/ID_MAFE_660cfca112471f69246e9942f5e8afd1 +msgid "Store email body in" +msgstr "Store email body in" + # TRANSLATION # LABEL/ID_MAFE_66285b36f894a5439af5a98e3e1a36d2 #: LABEL/ID_MAFE_66285b36f894a5439af5a98e3e1a36d2 @@ -14555,6 +14645,12 @@ msgstr "January" msgid "[LABEL/ID_MAFE_86fd9a7abc9f357e7fa206b2d42ec5ba] Destination Path" msgstr "Destination Path" +# TRANSLATION +# LABEL/ID_MAFE_8738321e65db027ee6476c0ab12d8cd5 +#: LABEL/ID_MAFE_8738321e65db027ee6476c0ab12d8cd5 +msgid "Store option in" +msgstr "Store option in" + # TRANSLATION # LABEL/ID_MAFE_87557f11575c0ad78e4e28abedc13b6e #: LABEL/ID_MAFE_87557f11575c0ad78e4e28abedc13b6e @@ -15371,6 +15467,12 @@ msgstr "Properties" msgid "[LABEL/ID_MAFE_9fced129522f128b2445a41fb0b6ef9f] checkbox" msgstr "checkbox" +# TRANSLATION +# LABEL/ID_MAFE_a036226d97d1d0d725d494a1431f322c +#: LABEL/ID_MAFE_a036226d97d1d0d725d494a1431f322c +msgid "Receiver account" +msgstr "Receiver account" + # TRANSLATION # LABEL/ID_MAFE_a05ac4341235111bd2cba5c3c105ba81 #: LABEL/ID_MAFE_a05ac4341235111bd2cba5c3c105ba81 @@ -17945,6 +18047,12 @@ msgstr "Users" msgid "validate" msgstr "validate" +# TRANSLATION +# LABEL/ID_MAFE_fa2b5b7c9bccd35e42cb74042690a091 +#: LABEL/ID_MAFE_fa2b5b7c9bccd35e42cb74042690a091 +msgid "Email response" +msgstr "Email response" + # TRANSLATION # LABEL/ID_MAFE_fa3c608c8fc755543f0d37afd6a42651 #: LABEL/ID_MAFE_fa3c608c8fc755543f0d37afd6a42651 @@ -23549,6 +23657,18 @@ msgstr "Sent By" msgid "[LABEL/ID_SERVER] Server" msgstr "Server" +# TRANSLATION +# LABEL/ID_OUTGOING_SERVER +#: LABEL/ID_OUTGOING_SERVER +msgid "Outgoing Server" +msgstr "Outgoing Server" + +# TRANSLATION +# LABEL/ID_INCOMING_SERVER +#: LABEL/ID_INCOMING_SERVER +msgid "Incoming Server" +msgstr "Incoming Server" + # TRANSLATION # LABEL/ID_SERVER_ADDRESS #: LABEL/ID_SERVER_ADDRESS @@ -26033,18 +26153,6 @@ msgstr "The uploaded file exceeds the upload_max_filesize directive in php.ini" msgid "The file has not been attached because the extension is not allowed or because the content doesn't correspond." msgstr "The file has not been attached because the extension is not allowed or because the content doesn't correspond." -# TRANSLATION -# LABEL/ID_UPLOAD_INVALID_DOC_MAX_FILESIZE -#: LABEL/ID_UPLOAD_INVALID_DOC_MAX_FILESIZE -msgid "File size exceeds the allowable limit of {0}" -msgstr "File size exceeds the allowable limit of {0}" - -# TRANSLATION -# LABEL/ID_UPLOAD_INVALID_DOC_TYPE_FILE -#: LABEL/ID_UPLOAD_INVALID_DOC_TYPE_FILE -msgid "Invalid file format, please upload a file with one of the following formats {0}" -msgstr "Invalid file format, please upload a file with one of the following formats {0}" - # TRANSLATION # LABEL/ID_UPLOAD_ERR_NO_FILE #: LABEL/ID_UPLOAD_ERR_NO_FILE @@ -26093,6 +26201,18 @@ msgstr "Upload from file" msgid "Upload image" msgstr "Upload image" +# TRANSLATION +# LABEL/ID_UPLOAD_INVALID_DOC_MAX_FILESIZE +#: LABEL/ID_UPLOAD_INVALID_DOC_MAX_FILESIZE +msgid "File size exceeds the allowable limit of {0}" +msgstr "File size exceeds the allowable limit of {0}" + +# TRANSLATION +# LABEL/ID_UPLOAD_INVALID_DOC_TYPE_FILE +#: LABEL/ID_UPLOAD_INVALID_DOC_TYPE_FILE +msgid "Invalid file format, please upload a file with one of the following formats {0}" +msgstr "Invalid file format, please upload a file with one of the following formats {0}" + # TRANSLATION # LABEL/ID_UPLOAD_LANGUAGE #: LABEL/ID_UPLOAD_LANGUAGE @@ -28013,6 +28133,18 @@ msgstr "Photo gallery" msgid "Port (default 25)" msgstr "Port (default 25)" +# TRANSLATION +# LABEL/INCOMING_PORT_DEFAULT +#: LABEL/INCOMING_PORT_DEFAULT +msgid "Incoming Port (default 143)" +msgstr "Incoming Port (default 143)" + +# TRANSLATION +# LABEL/OUTGOING_PORT_DEFAULT +#: LABEL/OUTGOING_PORT_DEFAULT +msgid "Outgoing Port (default 25)" +msgstr "Outgoing Port (default 25)" + # TRANSLATION # LABEL/REQUIRE_AUTHENTICATION #: LABEL/REQUIRE_AUTHENTICATION diff --git a/workflow/engine/controllers/designer.php b/workflow/engine/controllers/designer.php index 8f5efd29f..ee76774c3 100644 --- a/workflow/engine/controllers/designer.php +++ b/workflow/engine/controllers/designer.php @@ -33,6 +33,7 @@ class Designer extends Controller */ public function index($httpData) { + global $RBAC; $proUid = isset($httpData->prj_uid) ? $httpData->prj_uid : ''; $appUid = isset($httpData->app_uid) ? $httpData->app_uid : ''; $proReadOnly = isset($httpData->prj_readonly) ? $httpData->prj_readonly : 'false'; @@ -44,6 +45,9 @@ class Designer extends Controller $enterprise = 0; $distribution = 0; + $usrUid = $RBAC->userObj->getUsrUid(); + $userProperties = UsersPropertiesPeer::retrieveByPk($usrUid); + /*----------------------------------********---------------------------------*/ $licensedFeatures = PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7TTeDBQeWRoZTZKYjh4eFpYUlRDUUEyVERPU3FxellWank=')) { @@ -68,6 +72,7 @@ class Designer extends Controller $this->setVar("SYS_LANG", SYS_LANG); $this->setVar("SYS_SKIN", SYS_SKIN); $this->setVar('HTTP_SERVER_HOSTNAME', System::getHttpServerHostnameRequestsFrontEnd()); + $this->setVar('PMDYNAFORM_FIRST_TIME', $userProperties->getPmdynaformFirstTime()); $inpuDocument = new InputDocument(); $this->setVar('maxFileSizeInformation', G::json_encode($inpuDocument->getMaxFileSize())); diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index c0b36405b..8cbe9feaa 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -57081,9 +57081,21 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','HTML_FILES','en','You can open only files with the .html extension','2014-01-15') , ( 'LABEL','ID_3DAYSMINIMUM','en','3 days at least','2014-01-15') , ( 'LABEL','ID_ABE_ANSWER_SUBMITTED','en','The answer has been submitted. Thank you.','2017-06-19') , +( 'LABEL','ID_ABE_EMAIL_RESPONSE_BODY_NOTE','en','Please add your comments above this section. Don''t modify or delete this section.','2018-11-16') , ( 'LABEL','ID_ABE_FORM_ALREADY_FILLED','en','The form has already been filled and sent.','2017-06-09') , ( 'LABEL','ID_ABE_INFORMATION_SUBMITTED','en','The information was submitted. Thank you.','2017-06-19') , ( 'LABEL','ID_ABE_RESPONSE_SENT','en','The response has already been sent.','2017-06-19') , +( 'LABEL','ID_ABE_RESPONSE_CANNOT_BE_IDENTIFIED','en','Your answer cannot be processed, please try again and make sure to keep the subject code untouched.','2018-11-20') , +( 'LABEL','ID_ABE_RESPONSE_ALREADY_ROUTED','en','Your answer cannot be processed because the case was already routed or is no longer assigned to you.','2018-11-20') , +( 'LABEL','ID_ABE_RESPONSE_ROUTING_FAILED','en','Your answer cannot be processed because there is an error in the flow definition, please notify to this issue to the system administrator.','2018-11-20') , +( 'LABEL','ID_ABE_CASE_NOTE_ANSWER','en','Answer: {optionLabel}','2018-11-20') , +( 'LABEL','ID_ABE_CASE_NOTE_COMMENT','en','Comment: {emailBody}','2018-11-20') , +( 'LABEL','ID_ABE_CASE_NOTE_HEADER','en','{emailAccount} has completed a task from Actions by Email.','2018-11-20') , +( 'LABEL','ID_ABE_LOG_CANNOT_READ','en','The application cannot read the email receiver account.','2018-11-20') , +( 'LABEL','ID_ABE_LOG_PROCESSED_OK','en','The answer was processed correctly.','2018-11-20') , +( 'LABEL','ID_ABE_LOG_CANNOT_BE_IDENTIFIED','en','The case cannot be identified.','2018-11-20') , +( 'LABEL','ID_ABE_LOG_ALREADY_ROUTED','en','The case was identified correctly but it was already routed.','2018-11-20') , +( 'LABEL','ID_ABE_LOG_ROUTING_FAILED','en','The case was identified correctly but the routing process has failed.','2018-11-20') , ( 'LABEL','ID_ACCEPT','en','Accept','2014-01-15') , ( 'LABEL','ID_ACCESS_DENIED','en','Access Denied!','2015-12-03') , ( 'LABEL','ID_ACCOUNT','en','Account','2014-01-15') , @@ -57515,6 +57527,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_CLOSE','en','Close','2014-01-15') , ( 'LABEL','ID_CLOSE_EDITOR','en','Close Editor','2014-01-15') , ( 'LABEL','ID_CODE','en','Code','2014-01-15') , +( 'LABEL','ID_CODE_CRYPT','en','Code:','2018-11-16') , ( 'LABEL','ID_COLLAPSE_ALL','en','Collapse All','2014-01-15') , ( 'LABEL','ID_COLOSA_AND_CERTIFIED_PARTNERS','en','Supplied free of charge with no support, certification, warranty, maintenance nor indemnity by Colosa and its Certified Partners.','2014-10-21') , ( 'LABEL','ID_COLUMNS','en','columns','2014-01-15') , @@ -58067,6 +58080,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_ERROR_INSERT_LINE','en','Error trying to insert the line','2014-01-15') , ( 'LABEL','ID_ERROR_INSTALLING_ADDON','en','There was a problem installing this add-on.','2014-10-21') , ( 'LABEL','ID_ERROR_IN_SERVER','en','Error in server','2015-09-15') , +( 'LABEL','ID_ERROR_IN_THE_QUERY','en','Error in the query','2019-03-12') , ( 'LABEL','ID_ERROR_JS_NOT_AVAILABLE','en','Your browser doesn''t support JavaScript or it may be disabled. Please use a different browser or enable JavaScript. Dynaforms won''t entirely work because JavaScript is required.','2014-10-21') , ( 'LABEL','ID_ERROR_MESSAGE','en','Error Message','2017-02-22') , ( 'LABEL','ID_ERROR_OBJECT_NOT_EXISTS','en','Error: Object does not exist.','2014-01-15') , @@ -58425,6 +58439,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_INACTIVE','en','Inactive','2014-01-15') , ( 'LABEL','ID_INBOX','en','Inbox','2014-01-15') , ( 'LABEL','ID_INBOX_EMPTY','en','Your Inbox is empty...','2015-05-06') , +( 'LABEL','ID_INCOMING_SERVER','en','Incoming Server','2018-11-23') , ( 'LABEL','ID_INCORRECT_EMAIL','en','Your E-mail address is not valid.','2014-01-15') , ( 'LABEL','ID_INCORRECT_USERNAME_PASSWORD','en','Incorrect username or password','2014-01-15') , ( 'LABEL','ID_INCORRECT_VALUE_ACTION','en','The value for $action is incorrect.','2014-05-29') , @@ -60206,6 +60221,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_ORIGIN_TASK','en','Origin Task','2014-01-15') , ( 'LABEL','ID_OTHER','en','Other','2014-01-15') , ( 'LABEL','ID_OUTBOX','en','Outbox','2014-01-15') , +( 'LABEL','ID_OUTGOING_SERVER','en','Outgoing Server','2018-11-23') , ( 'LABEL','ID_OUTPUT_DB','en','Output','2014-10-08') , ( 'LABEL','ID_OUTPUT_DOCUMENT','en','Output Document','2014-01-15') , ( 'LABEL','ID_OUTPUT_DOCUMENTS','en','Output Documents','2014-01-15') , @@ -61476,6 +61492,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','IMPORT_PROCESS_DISABLE','en','Disable the current process and create a new version of the process','2014-01-15') , ( 'LABEL','IMPORT_PROCESS_NEW','en','Create a completely new process without changing the current process','2014-01-15') , ( 'LABEL','IMPORT_PROCESS_OVERWRITING','en','Update the current process, overwriting all tasks and steps','2014-01-15') , +( 'LABEL','INCOMING_PORT_DEFAULT','en','Incoming Port (default 143)','2018-11-23') , ( 'LABEL','INVALID_FILE','en','Invalid file!','2014-01-15') , ( 'LABEL','IS_USER_NAME_DISPLAY_FORMAT','en','User Name Display Format','2014-01-15') , ( 'LABEL','LOGIN','en','Login','2014-01-15') , @@ -61543,6 +61560,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','NEW_SITE_SUCCESS_CONFIRM','en','Do you want open the new site?','2014-01-15') , ( 'LABEL','NEW_SITE_SUCCESS_CONFIRMNOTE','en','Note.- If you open the new site your current session will be closed.','2014-01-15') , ( 'LABEL','OPEN_NEW_WS','en','Open new site','2014-01-15') , +( 'LABEL','OUTGOING_PORT_DEFAULT','en','Outgoing Port (default 25)','2018-11-26') , ( 'LABEL','OUTPUT_CREATE','en','Output document has been created successfully','2014-01-15') , ( 'LABEL','PASSWORD_HISTORY','en','Password history','2014-01-15') , ( 'LABEL','PAUSED','en','Pause','2014-01-15') , @@ -61616,8 +61634,7 @@ INSERT INTO CONFIGURATION (CFG_UID,OBJ_UID,CFG_VALUE,PRO_UID,USR_UID,APP_UID) VA ('MIGRATED_APP_HISTORY', 'history', 'a:1:{s:7:\"updated\";b:1;}', '', '', ''), ('MIGRATED_CONTENT','content','a:12:{i:0;s:7:"Groupwf";i:1;s:7:"Process";i:2;s:10:"Department";i:3;s:4:"Task";i:4;s:13:"InputDocument";i:5;s:11:"Application";i:6;s:11:"AppDocument";i:7;s:8:"Dynaform";i:8;s:14:"OutputDocument";i:9;s:11:"ReportTable";i:10;s:8:"Triggers";i:11;s:41:"\\ProcessMaker\\BusinessModel\\WebEntryEvent";}','','',''), ('MIGRATED_LIST','list','true','list','list','list'), -('MIGRATED_LIST_UNASSIGNED','list','true','list','list','list'), -('SKIN_CRON','','s:10:\"neoclassic\";','','',''); +('MIGRATED_LIST_UNASSIGNED','list','true','list','list','list'); INSERT INTO CATALOG (CAT_UID,CAT_LABEL_ID,CAT_TYPE,CAT_FLAG,CAT_OBSERVATION,CAT_CREATE_DATE,CAT_UPDATE_DATE) VALUES ('10','ID_BARS','GRAPHIC','','','2015-03-04 00:00:00','2015-03-04 00:00:00'), diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index f78a95cd0..44f18b54b 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -1115,6 +1115,7 @@ CREATE TABLE `USERS_PROPERTIES` `USR_LOGGED_NEXT_TIME` INTEGER default 0, `USR_PASSWORD_HISTORY` MEDIUMTEXT, `USR_SETTING_DESIGNER` MEDIUMTEXT, + `PMDYNAFORM_FIRST_TIME` CHAR(1) default '0', PRIMARY KEY (`USR_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8'; #----------------------------------------------------------------------------- @@ -2744,6 +2745,8 @@ CREATE TABLE `EMAIL_SERVER` `MESS_ENGINE` VARCHAR(256) default '' NOT NULL, `MESS_SERVER` VARCHAR(256) default '' NOT NULL, `MESS_PORT` INTEGER default 0 NOT NULL, + `MESS_INCOMING_SERVER` VARCHAR(256) default '' NOT NULL, + `MESS_INCOMING_PORT` INTEGER default 0 NOT NULL, `MESS_RAUTH` INTEGER default 0 NOT NULL, `MESS_ACCOUNT` VARCHAR(256) default '' NOT NULL, `MESS_PASSWORD` VARCHAR(256) default '' NOT NULL, @@ -2865,6 +2868,7 @@ CREATE TABLE `ABE_CONFIGURATION` `DYN_UID` VARCHAR(32) default '' NOT NULL, `ABE_EMAIL_FIELD` VARCHAR(255) default '' NOT NULL, `ABE_ACTION_FIELD` VARCHAR(255) default '', + `ABE_ACTION_BODY_FIELD` VARCHAR(255) default '', `ABE_CASE_NOTE_IN_RESPONSE` INTEGER default 0, `ABE_FORCE_LOGIN` INTEGER default 0, `ABE_CREATE_DATE` DATETIME NOT NULL, @@ -2873,6 +2877,7 @@ CREATE TABLE `ABE_CONFIGURATION` `ABE_MAILSERVER_OR_MAILCURRENT` INTEGER default 0, `ABE_CUSTOM_GRID` MEDIUMTEXT, `ABE_EMAIL_SERVER_UID` VARCHAR(32) default '', + `ABE_EMAIL_SERVER_RECEIVER_UID` VARCHAR(32) default '', PRIMARY KEY (`ABE_UID`), KEY `indexAbeProcess`(`PRO_UID`), KEY `indexAbeProcessTask`(`PRO_UID`, `TAS_UID`) diff --git a/workflow/engine/methods/emailServer/emailServerAjax.php b/workflow/engine/methods/emailServer/emailServerAjax.php index 6f3c246e3..59a454f52 100644 --- a/workflow/engine/methods/emailServer/emailServerAjax.php +++ b/workflow/engine/methods/emailServer/emailServerAjax.php @@ -9,6 +9,8 @@ switch ($option) { $server = ""; $port = ""; + $incomingServer = ""; + $incomingPort = ""; $reqAuthentication = 0; $password = ""; $smtpSecure = ""; @@ -27,6 +29,14 @@ switch ($option) { $reqAuthentication = (int)($_POST["reqAuthentication"]); $password = ($reqAuthentication == 1)? $_POST["password"] : ""; $smtpSecure = $_POST["smtpSecure"]; + } elseif ($cboEmailEngine == "IMAP") { + $server = $_POST["server"]; + $port = (int)($_POST["port"]); + $incomingServer = $_POST["incomingServer"]; + $incomingPort = (int)($_POST["incomingPort"]); + $reqAuthentication = (int)($_POST["reqAuthentication"]); + $password = ($reqAuthentication == 1)? $_POST["password"] : ""; + $smtpSecure = $_POST["smtpSecure"]; } try { @@ -34,6 +44,8 @@ switch ($option) { "MESS_ENGINE" => $cboEmailEngine, "MESS_SERVER" => $server, "MESS_PORT" => $port, + "MESS_INCOMING_SERVER" => $incomingServer, + "MESS_INCOMING_PORT" => $incomingPort, "MESS_RAUTH" => $reqAuthentication, "MESS_ACCOUNT" => $accountFrom, "MESS_PASSWORD" => $password, @@ -63,6 +75,8 @@ switch ($option) { $server = ""; $port = ""; + $incomingServer = ""; + $incomingPort = ""; $reqAuthentication = 0; $password = ""; $smtpSecure = ""; @@ -81,6 +95,14 @@ switch ($option) { $reqAuthentication = (int)($_POST["reqAuthentication"]); $password = ($reqAuthentication == 1)? $_POST["password"] : ""; $smtpSecure = $_POST["smtpSecure"]; + } elseif ($cboEmailEngine == "IMAP") { + $server = $_POST["server"]; + $port = (int)($_POST["port"]); + $incomingServer = $_POST["incomingServer"]; + $incomingPort = (int)($_POST["incomingPort"]); + $reqAuthentication = (int)($_POST["reqAuthentication"]); + $password = ($reqAuthentication == 1)? $_POST["password"] : ""; + $smtpSecure = $_POST["smtpSecure"]; } try { @@ -88,6 +110,8 @@ switch ($option) { "MESS_ENGINE" => $cboEmailEngine, "MESS_SERVER" => $server, "MESS_PORT" => $port, + "MESS_INCOMING_SERVER" => $incomingServer, + "MESS_INCOMING_PORT" => $incomingPort, "MESS_RAUTH" => $reqAuthentication, "MESS_ACCOUNT" => $accountFrom, "MESS_PASSWORD" => $password, @@ -153,6 +177,8 @@ switch ($option) { $server = ""; $port = ""; + $incomingServer = ""; + $incomingPort = ""; $reqAuthentication = 0; $password = ""; $smtpSecure = ""; @@ -165,7 +191,7 @@ switch ($option) { $mailTo = ($sendTestMail == 1)? $_POST["mailTo"] : ""; $emailServerDefault = (int)($_POST["emailServerDefault"]); - if ($cboEmailEngine == "PHPMAILER") { + if ($cboEmailEngine == "PHPMAILER" || $cboEmailEngine == "IMAP") { $server = $_POST["server"]; $port = (int)($_POST["port"]); $reqAuthentication = (int)($_POST["reqAuthentication"]); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail/ResponseReader.php b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail/ResponseReader.php new file mode 100644 index 000000000..c0fe78ccb --- /dev/null +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ActionsByEmail/ResponseReader.php @@ -0,0 +1,355 @@ +messageResponseError; + } + + /** + * @param string $messageResponseError + */ + public function setMessageResponseError($messageResponseError) + { + $this->messageResponseError = $messageResponseError; + } + + /** + * Read the Action by Email listener inbox looking for new messages + */ + public function actionsByEmailEmailResponse() + { + try { + if (!extension_loaded('imap')) { + G::outRes(G::LoadTranslation("ID_EXCEPTION_LOG_INTERFAZ", ['php_imap']) . "\n"); + exit; + } + if (PMLicensedFeatures + ::getSingleton() + ->verifyfeature('zLhSk5TeEQrNFI2RXFEVktyUGpnczV1WEJNWVp6cjYxbTU3R29mVXVZNWhZQT0=')) { + $criteriaAbe = new Criteria(); + $criteriaAbe->add(AbeConfigurationPeer::ABE_TYPE, "RESPONSE"); + $resultAbe = AbeConfigurationPeer::doSelectRS($criteriaAbe); + $resultAbe->setFetchmode(ResultSet::FETCHMODE_ASSOC); + while ($resultAbe->next()) { + $dataAbe = $resultAbe->getRow(); + $this->getAllEmails($dataAbe); + } + } + } catch (Exception $e) { + Bootstrap::registerMonolog( + $this->channel, + $e->getCode() != 0 ? $e->getCode() : 300, + $e->getMessage(), + $this->case, + config("system.workspace"), + 'processmaker.log' + ); + } + } + + /** + * Decrypt password of Email Server + * @param array $emailSetup + * @return mixed|string + */ + private function decryptPassword(array $emailSetup) + { + $pass = isset($emailSetup['MESS_PASSWORD']) ? $emailSetup['MESS_PASSWORD'] : ''; + $passDec = G::decrypt($pass, 'EMAILENCRYPT'); + $auxPass = explode('hash:', $passDec); + if (count($auxPass) > 1) { + if (count($auxPass) == 2) { + $pass = $auxPass[1]; + } else { + array_shift($auxPass); + $pass = implode('', $auxPass); + } + } + return $pass; + } + + /** + * Get all Email of server listener + * @param array $dataAbe + */ + public function getAllEmails(array $dataAbe) + { + try { + $emailServer = new EmailServer(); + $emailSetup = (!is_null(EmailServerPeer::retrieveByPK($dataAbe['ABE_EMAIL_SERVER_RECEIVER_UID']))) ? + $emailServer->getEmailServer($dataAbe['ABE_EMAIL_SERVER_RECEIVER_UID'], true) : + $emailServer->getEmailServerDefault(); + if (empty($emailSetup) || (empty($emailSetup['MESS_INCOMING_SERVER']) && $emailSetup['MESS_INCOMING_PORT'] == 0)) { + throw (new Exception(G::LoadTranslation('ID_ABE_LOG_CANNOT_READ'), 500)); + } + $mailbox = new Mailbox( + '{'. $emailSetup['MESS_INCOMING_SERVER'] . ':' . $emailSetup['MESS_INCOMING_PORT'] . '/imap/ssl/novalidate-cert}INBOX', + $emailSetup['MESS_ACCOUNT'], + $this->decryptPassword($emailSetup) + ); + + // Read all messages into an array + $mailsIds = $mailbox->searchMailbox('UNSEEN'); + if ($mailsIds) { + // Get the first message and save its attachment(s) to disk: + foreach ($mailsIds as $key => $mailId) { + /** @var IncomingMail $mail */ + $mail = $mailbox->getMail($mailId, false); + if (!empty($mail->textPlain)) { + preg_match("/{(.*)}/", $mail->textPlain, $matches); + if ($matches) { + $dataEmail = G::json_decode(Crypt::decryptString($matches[1]), true); + $dataAbeReq = loadAbeRequest($dataEmail['ABE_REQ_UID']); + if (config("system.workspace") === $dataEmail['workspace'] + && (array_key_exists('ABE_UID', $dataAbeReq) && $dataAbeReq['ABE_UID'] == $dataAbe['ABE_UID'])) { + $this->case = $dataEmail; + try { + $appDelegate = new AppDelegation(); + $alreadyRouted = $appDelegate->alreadyRouted($this->case["appUid"], $this->case["delIndex"]); + //Verify if the current case is already routed. + if ($alreadyRouted) { + $this->setMessageResponseError(G::LoadTranslation('ID_ABE_RESPONSE_ALREADY_ROUTED')); + throw (new Exception(G::LoadTranslation('ID_CASE_DELEGATION_ALREADY_CLOSED'), 400)); + } + $this->processABE($this->case, $mail, $dataAbe); + $mailbox->markMailAsRead($mailId); + Bootstrap::registerMonolog( + $this->channel, + 100, // DEBUG + G::LoadTranslation('ID_ABE_LOG_PROCESSED_OK'), + $this->case, + config("system.workspace"), + 'processmaker.log' + ); + } catch (Exception $e) { + $this->sendMessageError( + $this->getMessageResponseError() ? $this->getMessageResponseError() : $e->getMessage(), + $this->case, + $mail, + $emailSetup + ); + Bootstrap::registerMonolog( + $this->channel, + $e->getCode() != 0 ? $e->getCode() : 400, + $e->getMessage(), + $this->case, + config("system.workspace"), + 'processmaker.log' + ); + } + } + } + } + } + } + } catch (Exception $e) { + Bootstrap::registerMonolog( + $this->channel, + $e->getCode() != 0 ? $e->getCode() : 500, + $e->getMessage(), + $this->case, + config("system.workspace"), + 'processmaker.log' + ); + } + } + + /** + * Derivation of the case with the mail information + * @param array $caseInfo + * @param IncomingMail $mail + * @param array $dataAbe + * @throws Exception + */ + public function processABE(array $caseInfo, IncomingMail $mail, array $dataAbe = []) + { + try { + $actionsByEmail = new ActionsByEmail(); + $actionsByEmail->verifyLogin($caseInfo['appUid'], $caseInfo['delIndex']); + + $case = new Cases(); + $caseFieldsABE = $case->loadCase($caseInfo['appUid'], $caseInfo['delIndex']); + + $actionsByEmailCore = new ActionsByEmailCoreClass(); + $actionField = str_replace( + $actionsByEmailCore->getPrefix(), + '', + $dataAbe['ABE_ACTION_FIELD'] + ); + $dataField = []; + $dataField[$actionField] = $caseInfo['fieldValue']; + $actionBodyField = str_replace( + $actionsByEmailCore->getPrefix(), + '', + $dataAbe['ABE_ACTION_BODY_FIELD'] + ); + $textPlain = $mail->textPlain; + $textPlain = substr($textPlain, 0, strpos($textPlain, "/=")); + $dataField[$actionBodyField] = $textPlain; + $caseFieldsABE['APP_DATA'] = array_merge($caseFieldsABE['APP_DATA'], $dataField); + + $dataResponses = []; + $dataResponses['ABE_REQ_UID'] = $caseInfo['ABE_REQ_UID']; + $dataResponses['ABE_RES_CLIENT_IP'] = 'localhost'; + $dataResponses['ABE_RES_DATA'] = serialize($dataField); + $dataResponses['ABE_RES_STATUS'] = 'PENDING'; + $dataResponses['ABE_RES_MESSAGE'] = ''; + + try { + $abeAbeResponsesInstance = new AbeResponses(); + $dataResponses['ABE_RES_UID'] = $abeAbeResponsesInstance->createOrUpdate($dataResponses); + } catch (Exception $e) { + Bootstrap::registerMonolog( + $this->channel, + 300, + $e->getMessage(), + $this->case, + config("system.workspace"), + 'processmaker.log' + ); + } + + ChangeLog::getChangeLog() + ->getUsrIdByUsrUid($caseFieldsABE['CURRENT_USER_UID'], true) + ->setSourceId(ChangeLog::FromABE); + + $caseFieldsABE['CURRENT_DYNAFORM'] = ''; + $caseFieldsABE['USER_UID'] = $caseFieldsABE['CURRENT_USER_UID']; + $caseFieldsABE['OBJECT_TYPE'] = ''; + + $case->updateCase($caseInfo['appUid'], $caseFieldsABE); + + try { + $ws = new WsBase(); + $result = $ws->derivateCase( + $caseFieldsABE['CURRENT_USER_UID'], + $caseInfo['appUid'], + $caseInfo['delIndex'], + true + ); + $code = (is_array($result)) ? $result['status_code'] : $result->status_code; + if ($code != 0) { + throw new Exception( + "An error occurred while the application was being processed\n" . + "Error code: " . $result->status_code . "\nError message: " . $result->message + ); + } + } catch (Exception $e) { + $this->setMessageResponseError(G::LoadTranslation('ID_ABE_RESPONSE_ROUTING_FAILED')); + throw (new Exception(G::LoadTranslation('ID_ABE_LOG_ROUTING_FAILED'), 400)); + } + + //Update AbeResponses + $dataResponses['ABE_RES_STATUS'] = ($code == 0)? 'SENT' : 'ERROR'; + $dataResponses['ABE_RES_MESSAGE'] = ($code == 0)? '-' : $result->message; + + try { + $abeAbeResponsesInstance = new AbeResponses(); + $abeAbeResponsesInstance->createOrUpdate($dataResponses); + } catch (Exception $e) { + Bootstrap::registerMonolog( + $this->channel, + 300, + $e->getMessage(), + $this->case, + config("system.workspace"), + 'processmaker.log' + ); + } + $dataAbeRequests = loadAbeRequest($caseInfo['ABE_REQ_UID']); + //Save Cases Notes + if ($dataAbe['ABE_CASE_NOTE_IN_RESPONSE'] == 1) { + $customGrid = unserialize($dataAbe['ABE_CUSTOM_GRID']); + $fieldLabel = null; + foreach ($customGrid as $key => $value) { + if ($value['abe_custom_value'] == $caseInfo['fieldValue']) { + $fieldLabel = $value['abe_custom_label']; + break; + } + } + $appNotes = new AppNotes(); + $noteText = G::LoadTranslation('ID_ABE_CASE_NOTE_HEADER', ['emailAccount' => $mail->toString]) . "\n\n"; + $noteText .= G::LoadTranslation('ID_ABE_CASE_NOTE_ANSWER', ['optionLabel' => $fieldLabel ? $fieldLabel : $caseInfo['fieldValue']]) . "\n\n"; + $noteText .= G::LoadTranslation('ID_ABE_CASE_NOTE_COMMENT', ['emailBody' => $textPlain]); + $noteContent = addslashes($noteText); + $appNotes->postNewNote($caseInfo['appUid'], $caseFieldsABE['APP_DATA']['USER_LOGGED'], $noteContent, false); + } + $dataAbeRequests['ABE_REQ_ANSWERED'] = 1; + $code == 0 ? uploadAbeRequest($dataAbeRequests) : ''; + } catch (Exception $e) { + if ($e->getCode() == 400) { + throw (new Exception($e->getMessage(), $e->getCode())); + } else { + $this->setMessageResponseError(G::LoadTranslation('ID_ABE_RESPONSE_CANNOT_BE_IDENTIFIED')); + throw (new Exception(G::LoadTranslation('ID_ABE_LOG_CANNOT_BE_IDENTIFIED'), 300)); + } + } + } + + /** + * Send an error message to the sender + * @param string $msgError + * @param array $caseInf + * @param IncomingMail $mail + * @param array $emailSetup + * @return \ProcessMaker\Util\Response|string|\WsResponse + */ + public function sendMessageError($msgError, array $caseInf, IncomingMail $mail, array $emailSetup) + { + $wsBase = new WsBase(); + $result = $wsBase->sendMessage( + $caseInf['appUid'], + $mail->toString, + $mail->fromAddress, + '', + '', + $mail->subject, + 'actionsByEmailErrorReply.html', + ['ACTIONS_BY_EMAIL_ERROR_MESSAGE' => $msgError], + null, + true, + $caseInf['delIndex'], + $emailSetup, + 0 + ); + return $result; + } + /*----------------------------------********---------------------------------*/ +} diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm/SuggestTrait.php b/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm/SuggestTrait.php index 0fca7fb69..bce94ea09 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm/SuggestTrait.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/DynaForm/SuggestTrait.php @@ -54,13 +54,71 @@ trait SuggestTrait $where = $isWhere ? "WHERE " . $col . "='" . $dv . "'" : $where . " AND " . $col . "='" . $dv . "'"; } } - if (isset($json->queryField) && isset($dt[0]["base_expr"])) { - $col = isset($dt[1]["base_expr"]) ? $dt[1]["base_expr"] : $dt[0]["base_expr"]; - $qf = str_replace("'", "''", $json->queryFilter); - $where = $isWhere ? "WHERE " . $col . " LIKE '%" . $qf . "%'" : $where . " AND " . $col . " LIKE '%" . $qf . "%'"; + if (isset($json->querySearch) && is_array($json->querySearch) && !empty($json->querySearch)) { + $dataSearch = $json->querySearch; + $sqlWildcard = ""; + //We will to search term in the query + if (isset($dataSearch['term'])) { + $value = isset($dataSearch['term']['value']) ? $dataSearch['term']['value'] : ''; + $label = isset($dataSearch['term']['text']) ? $dataSearch['term']['text'] : ''; + $sqlWildcard = "%"; + } + //The match has priority + //We will to search match in the query + if (isset($dataSearch['match'])) { + $value = isset($dataSearch['match']['value']) ? $dataSearch['match']['value'] : ''; + $label = isset($dataSearch['match']['text']) ? $dataSearch['match']['text'] : ''; + $sqlWildcard = ""; + } + if (!empty($value) && !empty($label)){ + //We need to search in the firstColumn and secondColumn + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL1 LIKE 'querySearch' OR COL2 LIKE 'querySearch' + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL1 LIKE '%querySearch%' OR COL2 LIKE '%querySearch%' + $col1 = $dt[0]["base_expr"]; + $col2 = isset($dt[1]["base_expr"]) ? $dt[1]["base_expr"] : $dt[0]["base_expr"]; + $qfValue = str_replace("'", "''", $value); + $qfLabel = str_replace("'", "''", $label); + $search = $col1 . " LIKE '" . $sqlWildcard . $qfValue . $sqlWildcard . "' OR " . $col2 . " LIKE '" . $sqlWildcard . $qfLabel . $sqlWildcard . "'"; + $where = $isWhere ? "WHERE " . $search : $where . " AND (" . $search . ")"; + } else { + $valueOrLabel = ''; + $column = $dt[0]["base_expr"]; + if (!empty($value)) { + //We need to search in the firstColumn + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL1 LIKE 'querySearch' + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL1 LIKE '%querySearch%' + $valueOrLabel = $value; + } + if (!empty($label)) { + //We need to search in the secondColumn + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL2 LIKE 'querySearch' + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL2 LIKE '%querySearch%' + $column = isset($dt[1]["base_expr"]) ? $dt[1]["base_expr"] : $column; + $valueOrLabel = $label; + } + $where = $this->buildWhere( + $column, + $valueOrLabel, + $sqlWildcard, + $isWhere, + $where + ); + } + } else { + //If the property querySearch does not exist we need to search in the secondColumn + //Ex: SELECT COL1, COL2 FROM TABLE WHERE COL2 LIKE '%queryFilter%' + if (isset($json->queryField) && isset($dt[0]["base_expr"])) { + $where = $this->buildWhere( + isset($dt[1]["base_expr"]) ? $dt[1]["base_expr"] : $dt[0]["base_expr"], + $json->queryFilter, + "%", + $isWhere, + $where + ); + } } - if ($optionsLimit > 0) { + if ($optionsLimit >= 0) { $this->addSuggestLimit($json, $select, $limit, $where); } else { $this->addSuggestWhere($json, $parsed, $select, $where, $having); @@ -69,6 +127,26 @@ trait SuggestTrait ); } + /** + * This function will be define the WHERE clause + * + * @param string $col, name of column + * @param string $value, value to search in the column + * @param string $sqlWildcard, if we to search term or correct match + * @param boolean $isWhere, if the we need to concat other condition + * @param string $where, initial where to add the concat + * + * @return string + * + */ + private function buildWhere($col, $value, $sqlWildcard = "", $isWhere = false, $where = "") + { + $qf = str_replace("'", "''", $value); + $searchValue = $col . " LIKE '" . $sqlWildcard . $qf . $sqlWildcard; + $where = ($isWhere) ? "WHERE " . $searchValue . "'" : $where . " AND " . $searchValue . "'"; + return $where; + } + /** * Add the limit sentence to the suggest query. * diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/EmailServer.php b/workflow/engine/src/ProcessMaker/BusinessModel/EmailServer.php index 0f6dfaf45..b278810f8 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/EmailServer.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/EmailServer.php @@ -14,9 +14,11 @@ class EmailServer { private $arrayFieldDefinition = array( "MESS_UID" => array("type" => "string", "required" => false, "empty" => false, "defaultValues" => array(), "fieldNameAux" => "emailServerUid"), - "MESS_ENGINE" => array("type" => "string", "required" => true, "empty" => false, "defaultValues" => array("PHPMAILER", "MAIL"), "fieldNameAux" => "emailServerEngine"), + "MESS_ENGINE" => array("type" => "string", "required" => true, "empty" => false, "defaultValues" => array("PHPMAILER", "MAIL", "IMAP"), "fieldNameAux" => "emailServerEngine"), "MESS_SERVER" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "emailServerServer"), "MESS_PORT" => array("type" => "int", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "emailServerPort"), + "MESS_INCOMING_SERVER" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "emailServerIncomingServer"), + "MESS_INCOMING_PORT" => array("type" => "int", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "emailServerIncomingPort"), "MESS_RAUTH" => array("type" => "int", "required" => false, "empty" => false, "defaultValues" => array(0, 1), "fieldNameAux" => "emailServerRauth"), "MESS_ACCOUNT" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "emailServerUserName"), "MESS_PASSWORD" => array("type" => "string", "required" => false, "empty" => true, "defaultValues" => array(), "fieldNameAux" => "emailServerPassword"), @@ -52,10 +54,10 @@ class EmailServer throw $e; } } - + /** * Get the default information from the context. - * + * * @global type $RBAC * @return void */ @@ -527,6 +529,7 @@ class EmailServer } break; case "PHPMAILER": + case "IMAP": $numSteps = ($arrayData['MAIL_TO'] != '') ? count($arrayPhpMailerTestName) : count($arrayPhpMailerTestName) - 1; for ($step = 1; $step <= $numSteps; $step++) { @@ -831,6 +834,8 @@ class EmailServer 'engine'=> $arrayData["MESS_ENGINE"], 'server' => $arrayData["MESS_SERVER"], 'port' => $arrayData["MESS_PORT"], + 'incomingServer' => $arrayData["MESS_INCOMING_SERVER"], + 'incomingPort' => $arrayData["MESS_INCOMING_PORT"], 'requireAuthentication' => $arrayData["MESS_RAUTH"], 'account' => $arrayData["MESS_ACCOUNT"], 'senderEmail' => $arrayData["MESS_FROM_MAIL"], @@ -1002,6 +1007,8 @@ class EmailServer 'engine' => $arrayData["MESS_ENGINE"], 'server' => $arrayData["MESS_SERVER"], 'port' => $arrayData["MESS_PORT"], + 'incomingServer' => $arrayData["MESS_INCOMING_SERVER"], + 'incomingPort' => $arrayData["MESS_INCOMING_PORT"], 'requireAuthentication' => $arrayData["MESS_RAUTH"], 'account' => $arrayData["MESS_ACCOUNT"], 'senderEmail' => $arrayData["MESS_FROM_MAIL"], @@ -1088,6 +1095,8 @@ class EmailServer $criteria->addSelectColumn(\EmailServerPeer::MESS_ENGINE); $criteria->addSelectColumn(\EmailServerPeer::MESS_SERVER); $criteria->addSelectColumn(\EmailServerPeer::MESS_PORT); + $criteria->addSelectColumn(\EmailServerPeer::MESS_INCOMING_SERVER); + $criteria->addSelectColumn(\EmailServerPeer::MESS_INCOMING_PORT); $criteria->addSelectColumn(\EmailServerPeer::MESS_RAUTH); $criteria->addSelectColumn(\EmailServerPeer::MESS_ACCOUNT); $criteria->addSelectColumn(\EmailServerPeer::MESS_PASSWORD); @@ -1120,6 +1129,8 @@ class EmailServer $this->getFieldNameByFormatFieldName("MESS_ENGINE") => $record["MESS_ENGINE"], $this->getFieldNameByFormatFieldName("MESS_SERVER") => $record["MESS_SERVER"], $this->getFieldNameByFormatFieldName("MESS_PORT") => $record["MESS_PORT"], + $this->getFieldNameByFormatFieldName("MESS_INCOMING_SERVER") => $record["MESS_INCOMING_SERVER"], + $this->getFieldNameByFormatFieldName("MESS_INCOMING_PORT") => $record["MESS_INCOMING_PORT"], $this->getFieldNameByFormatFieldName("MESS_RAUTH") => $record["MESS_RAUTH"], $this->getFieldNameByFormatFieldName("MESS_ACCOUNT") => $record["MESS_ACCOUNT"], $this->getFieldNameByFormatFieldName("MESS_PASSWORD") => $record["MESS_PASSWORD"], @@ -1165,6 +1176,8 @@ class EmailServer $arrayData["MESS_ENGINE"] = $row["MESS_ENGINE"]; $arrayData["MESS_SERVER"] = $row["MESS_SERVER"]; $arrayData["MESS_PORT"] = (int)($row["MESS_PORT"]); + $arrayData["MESS_INCOMING_SERVER"] = $row["MESS_INCOMING_SERVER"]; + $arrayData["MESS_INCOMING_PORT"] = (int)($row["MESS_INCOMING_PORT"]); $arrayData["MESS_RAUTH"] = (int)($row["MESS_RAUTH"]); $arrayData["MESS_ACCOUNT"] = $row["MESS_ACCOUNT"]; $arrayData["MESS_PASSWORD"] = $row["MESS_PASSWORD"]; @@ -1221,6 +1234,7 @@ class EmailServer $criteria->add( $criteria->getNewCriterion(\EmailServerPeer::MESS_ENGINE, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE)->addOr( $criteria->getNewCriterion(\EmailServerPeer::MESS_SERVER, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE))->addOr( + $criteria->getNewCriterion(\EmailServerPeer::MESS_INCOMING_SERVER,"%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE))->addOr( $criteria->getNewCriterion(\EmailServerPeer::MESS_ACCOUNT, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE))->addOr( $criteria->getNewCriterion(\EmailServerPeer::MESS_FROM_NAME, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE))->addOr( $criteria->getNewCriterion(\EmailServerPeer::SMTPSECURE, "%" . $arrayFilterData["filter"] . "%", \Criteria::LIKE)) @@ -1245,7 +1259,7 @@ class EmailServer if (!is_null($sortField) && trim($sortField) != "") { $sortField = strtoupper($sortField); - if (in_array($sortField, array("MESS_ENGINE", "MESS_SERVER", "MESS_ACCOUNT", "MESS_FROM_NAME", "SMTPSECURE"))) { + if (in_array($sortField, array("MESS_ENGINE", "MESS_SERVER", "MESS_INCOMING_SERVER", "MESS_ACCOUNT", "MESS_FROM_NAME", "SMTPSECURE"))) { $sortField = \EmailServerPeer::TABLE_NAME . "." . $sortField; } else { $sortField = \EmailServerPeer::MESS_ENGINE; @@ -1318,6 +1332,7 @@ class EmailServer $row = $rsCriteria->getRow(); $row["MESS_PORT"] = (int)($row["MESS_PORT"]); + $row["MESS_INCOMING_PORT"] = (int)($row["MESS_INCOMING_PORT"]); $row["MESS_RAUTH"] = (int)($row["MESS_RAUTH"]); $row["MESS_TRY_SEND_INMEDIATLY"] = (int)($row["MESS_TRY_SEND_INMEDIATLY"]); $row["MESS_DEFAULT"] = (int)($row["MESS_DEFAULT"]); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Process.php b/workflow/engine/src/ProcessMaker/BusinessModel/Process.php index 90dc0a288..e7f82eba5 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Process.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Process.php @@ -8,6 +8,7 @@ use G; use PMmemcached; use ProcessPeer; use ResultSet; +use UsersPropertiesPeer; class Process { @@ -2160,4 +2161,21 @@ class Process return $processes; } + + /** + * Set for the first time the user opened the dynaform editor. + * + * @param string $usrUid + * @param string $seen + */ + public function setIfFirstTimeConsumed($usrUid, $seen) + { + if ($seen === '1') { + $userProperties = UsersPropertiesPeer::retrieveByPk($usrUid); + if ($userProperties) { + $userProperties->setPmDynaformFirstTime('1'); + $userProperties->save(); + } + } + } } diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php index 4ebb70939..086451bf3 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Variable.php @@ -749,6 +749,8 @@ class Variable * * @return array * @throws Exception + * @see ProcessMaker\BusinessModel\Variable->executeSql() + * @see ProcessMaker\BusinessModel\Variable->executeSqlSuggest() */ public function executeSqlControl($proUid, array $params = []) { @@ -758,6 +760,7 @@ class Variable $dynUid = $params["dyn_uid"]; $fieldId = $params["field_id"]; $filter = isset($params["filter"]) ? $params["filter"] : ""; + $query = isset($params["query"]) ? $params["query"] : []; $start = isset($params["start"]) ? $params["start"] : 0; $limit = isset($params["limit"]) ? $params["limit"] : 10; $appUid = empty($params["app_uid"]) ? null : $params["app_uid"]; @@ -767,6 +770,7 @@ class Variable unset($params["app_uid"]); unset($params["del_index"]); unset($params["filter"]); + unset($params["query"]); unset($params["start"]); unset($params["limit"]); @@ -797,6 +801,7 @@ class Variable $field->queryField = true; $field->queryInputData = $params; $field->queryFilter = $filter; + $field->querySearch = $query; $field->queryStart = $start; $field->queryLimit = $limit; //Grids only access the global variables of 'ProcessMaker', other variables are removed. @@ -809,7 +814,12 @@ class Variable } //Populate control data + $pmDynaform->clearLastQueryError(); $pmDynaform->jsonr($field); + $error = $pmDynaform->getLastQueryError(); + if (!empty($error) && is_object($error)) { + throw new Exception(G::LoadTranslation("ID_ERROR_IN_THE_QUERY")); + } $result = []; if (isset($field->queryOutputData) && is_array($field->queryOutputData)) { foreach ($field->queryOutputData as $item) { diff --git a/workflow/engine/src/ProcessMaker/Core/ProcessesManager.php b/workflow/engine/src/ProcessMaker/Core/ProcessesManager.php new file mode 100644 index 000000000..bff0c5d96 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Core/ProcessesManager.php @@ -0,0 +1,98 @@ +processes = $processes; + } + + /** + * Get the list of terminated processes + * + * @return array + */ + public function getTerminated() + { + return $this->terminated; + } + + /** + * Get the list of processes with errors + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Set the sleep time after each statuses revision + * + * @param int $sleepTime + */ + public function setSleepTime($sleepTime) + { + $this->sleepTime = $sleepTime; + } + + /** + * Run the processes + */ + public function run() + { + // Start all processes + foreach ($this->processes as $process) { + $process->run(); + } + + // Manage the processes + $this->manage(); + } + + /** + * Manage all started processes + */ + private function manage() + { + do { + // Check all remaining processes + foreach ($this->processes as $index => $process) { + // If the process has finished, save the info and destroy it + if ($process->getStatus() === RunProcess::TERMINATED || $process->getStatus() === RunProcess::ERROR) { + $processInfo = ['command' => $process->getCommand(), 'rawAnswer' => $process->getRawAnswer()]; + if ($process->getStatus() === RunProcess::TERMINATED) { + // Processes completed successfully + $this->terminated[] = $processInfo; + } else { + // Processes completed with errors + $this->errors[] = $processInfo; + } + + // Destroy the process + unset($this->processes[$index]); + } + } + + // Waiting... + sleep($this->sleepTime); + } while (!empty($this->processes)); + } +} diff --git a/workflow/engine/src/ProcessMaker/Core/RunProcess.php b/workflow/engine/src/ProcessMaker/Core/RunProcess.php new file mode 100644 index 000000000..8f2a0287f --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Core/RunProcess.php @@ -0,0 +1,146 @@ +command = $command; + } + + /** + * Class destructor, the resource created should be closed + */ + public function __destruct() + { + if (is_resource($this->resource)) { + proc_close($this->resource); + } + } + + /** + * Get the command + * + * @return string + */ + public function getCommand() + { + return $this->command; + } + + /** + * Get the raw response + * + * @return string|null + */ + public function getRawAnswer() + { + return $this->rawAnswer; + } + + /** + * Get the status + * + * @return string + */ + public function getStatus() + { + // If already exist a status return this value + if ($this->status !== null) { + return $this->status; + } + + // If doesn't exists a resource the process is not running + if (!is_resource($this->resource)) { + return self::NOT_RUNNING; + } + + // If the process is running return this value + if ($this->isRunning()) { + return self::RUNNING; + } + + // If the process is not running, parse the response to determine the status + $this->rawAnswer = stream_get_contents($this->pipes[1]); + $this->status = $this->parseAnswer(); + + return $this->status; + } + + /** + * Get the exit code + * + * @return string|null + */ + public function getExitCode() + { + return $this->exitCode; + } + + /** + * Run the command + */ + public function run() + { + $this->resource = proc_open($this->command, $this->descriptors, $this->pipes); + } + + /** + * Process is running? + * + * @return bool + */ + public function isRunning() + { + // Get the process status + $status = proc_get_status($this->resource); + + // If process is not running get the exit code + if ($status['running'] === false) { + $this->exitCode = $status['exitcode']; + } + + return $status['running']; + } + + /** + * Process the raw response and compare with the expected answer in order to determine the status + * + * @return string + */ + public function parseAnswer() + { + return $this->rawAnswer === self::EXPECTED_ANSWER ? self::TERMINATED : self::ERROR; + } +} diff --git a/workflow/engine/src/ProcessMaker/Core/System.php b/workflow/engine/src/ProcessMaker/Core/System.php index e0e469a32..15e957e7d 100644 --- a/workflow/engine/src/ProcessMaker/Core/System.php +++ b/workflow/engine/src/ProcessMaker/Core/System.php @@ -9,6 +9,7 @@ use Faker; use G; use GzipFile; use Illuminate\Database\QueryException; +use Illuminate\Foundation\Http\Kernel; use Illuminate\Support\Facades\DB; use InputFilter; use InstallerModule; @@ -242,39 +243,6 @@ class System return $items; } - /** - * Review the checksum.txt - * - * @return array $result - */ - public static function verifyChecksum() - { - if (!file_exists(PATH_TRUNK . "checksum.txt")) { - return false; - } - $lines = explode("\n", file_get_contents(PATH_TRUNK . "checksum.txt")); - $result = array("diff" => array(), "missing" => array() - ); - foreach ($lines as $line) { - if (empty($line)) { - continue; - } - list ($checksum, $empty, $filename) = explode(" ", $line); - //Skip xmlform because these files always change. - if (strpos($filename, "/xmlform/") !== false) { - continue; - } - if (file_exists(realpath($filename))) { - if (strcmp($checksum, G::encryptFileOld(realpath($filename))) != 0) { - $result['diff'][] = $filename; - } - } else { - $result['missing'][] = $filename; - } - } - return $result; - } - /** * This function checks files to do updated to pm * @@ -1629,5 +1597,21 @@ class System { return !empty(self::getServerHostname()) ? self::getServerHostname() : 'processmaker.com'; } + + /** + * Initialize laravel database configuration + * @see workflow/engine/bin/tasks/cliWorkspaces.php->check_queries_incompatibilities() + */ + public static function initLaravel() + { + config(['database.connections.workflow.host' => DB_HOST]); + config(['database.connections.workflow.database' => DB_NAME]); + config(['database.connections.workflow.username' => DB_USER]); + config(['database.connections.workflow.password' => DB_PASS]); + + app()->useStoragePath(realpath(PATH_DATA)); + app()->make(Kernel::class)->bootstrap(); + restore_error_handler(); + } } // end System class diff --git a/workflow/engine/src/ProcessMaker/Model/Dynaform.php b/workflow/engine/src/ProcessMaker/Model/Dynaform.php index 550d3c2e5..e7b40a950 100644 --- a/workflow/engine/src/ProcessMaker/Model/Dynaform.php +++ b/workflow/engine/src/ProcessMaker/Model/Dynaform.php @@ -66,4 +66,16 @@ class Dynaform extends Model ->where('DYNAFORM.DYN_UID', '!=', $dynUid) ->get(); } + + /** + * Scope a query to filter an specific process + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $columns + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeProcess($query, string $proUID) + { + return $query->where('PRO_UID', $proUID); + } } diff --git a/workflow/engine/src/ProcessMaker/Model/ProcessVariables.php b/workflow/engine/src/ProcessMaker/Model/ProcessVariables.php new file mode 100644 index 000000000..9170390a7 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Model/ProcessVariables.php @@ -0,0 +1,27 @@ +where('PRJ_UID', $proUID); + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Model/Triggers.php b/workflow/engine/src/ProcessMaker/Model/Triggers.php new file mode 100644 index 000000000..88947dee8 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Model/Triggers.php @@ -0,0 +1,27 @@ +where('PRO_UID', $proUID); + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php b/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php index 339b5bb27..63045f2ec 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/ActionsByEmail.php @@ -154,6 +154,13 @@ class ActionsByEmail extends Api $arrayData = $filesManager->addProcessFilesManager($proId, $userUid, $data); @copy(PATH_TPL . 'actionsByEmail' . PATH_SEP . 'actionsByEmail.html', $path . 'actionsByEmail.html'); } + /*----------------------------------********---------------------------------*/ + if (!file_exists($path . 'actionsByEmailErrorReply.html')) { + $data = array('prf_content' => '', 'prf_filename' => 'actionsByEmailErrorReply.html', 'prf_path' => 'templates'); + $arrayData = $filesManager->addProcessFilesManager($proId, $userUid, $data); + @copy(PATH_TPL . 'actionsByEmail' . PATH_SEP . 'actionsByEmailErrorReply.html', $path . 'actionsByEmailErrorReply.html'); + } + /*----------------------------------********---------------------------------*/ } $directory = dir($path); diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project.php b/workflow/engine/src/ProcessMaker/Services/Api/Project.php index ce382e49a..65c3938da 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project.php @@ -366,8 +366,9 @@ class Project extends Api * * @url GET /:prj_uid/dynaforms * @param string $prj_uid {@min 32}{@max 32} + * @param string $seen */ - public function doGetDynaForms($prj_uid) + public function doGetDynaForms($prj_uid, $seen = '0') { try { $process = new \ProcessMaker\BusinessModel\Process(); @@ -375,7 +376,7 @@ class Project extends Api $process->setArrayFieldNameForException(array("processUid" => "prj_uid")); $response = $process->getDynaForms($prj_uid); - + $process->setIfFirstTimeConsumed($this->getUserId(), $seen); return DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); diff --git a/workflow/engine/src/ProcessMaker/Upgrade/RunProcessUpgradeQuery.php b/workflow/engine/src/ProcessMaker/Upgrade/RunProcessUpgradeQuery.php new file mode 100644 index 000000000..e1295c0e4 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Upgrade/RunProcessUpgradeQuery.php @@ -0,0 +1,61 @@ +workspace = $workspace; + $this->sql = $sql; + $this->isRbac = $isRbac; + + // Build the command and send to the parent class + parent::__construct($this->buildCommand()); + } + + /** + * Override the parent method in order to compare the raw response with the SUCCESS value + * + * @return string + */ + public function parseAnswer() + { + return $this->getRawAnswer() === self::SUCCESS ? parent::TERMINATED : parent::ERROR; + } + + /** + * Build the command to execute a query for the upgrade process + * + * @return string + */ + private function buildCommand() + { + return sprintf(self::CMD, $this->workspace, base64_encode($this->sql), + ($this->isRbac ? self::RBAC : self::NO_RBAC)); + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Util/WsMessageResponse.php b/workflow/engine/src/ProcessMaker/Util/WsMessageResponse.php new file mode 100644 index 000000000..ec6a1f92c --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Util/WsMessageResponse.php @@ -0,0 +1,32 @@ +appMessUid; + } + + /** + * Set the appMessUid + * + * @param string $v + * @return void + */ + public function setAppMessUid($v) + { + $this->appMessUid = $v; + } +} + diff --git a/workflow/engine/src/ProcessMaker/Validation/MySQL57.php b/workflow/engine/src/ProcessMaker/Validation/MySQL57.php new file mode 100644 index 000000000..a6a2f3be0 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Validation/MySQL57.php @@ -0,0 +1,110 @@ +check_queries_incompatibilities() + * @param array $processes + * @return array + */ + public function checkIncompatibilityTriggers($processes) + { + $result = []; + + foreach ($processes as $process) { + $triggerQuery = Triggers::query()->select(); + //Call the scope method to filter by process + $triggerQuery->process($process['PRO_UID']); + $triggers = $triggerQuery->get()->values()->toArray(); + foreach ($triggers as $trigger) { + $resultIncompatibility = $this->analyzeQuery($trigger['TRI_WEBBOT']); + if ($resultIncompatibility) { + $aux = array_merge($process, $trigger); + array_push($result, $aux); + } + } + } + + return $result; + } + + /** + * Checks the queries inside dynaforms that could have possible incompatibilities with MySQL 5.7 + * + * @see workflow/engine/bin/tasks/cliWorkspaces.php->check_queries_incompatibilities() + * @param array $processes + * @return array + */ + public function checkIncompatibilityDynaforms($processes) + { + $result = []; + + foreach ($processes as $process) { + $dynaformQuery = Dynaform::query()->select(); + //Call the scope method to filter by process + $dynaformQuery->process($process['PRO_UID']); + $dynaforms = $dynaformQuery->get()->values()->toArray(); + foreach ($dynaforms as $dynaform) { + $resultIncompatibility = $this->analyzeQuery($dynaform['DYN_CONTENT']); + if ($resultIncompatibility) { + $aux = array_merge($process, $dynaform); + array_push($result, $aux); + } + } + } + + return $result; + } + + /** + * Checks the queries inside variables that could have possible incompatibilities with MySQL 5.7 + * + * @see workflow/engine/bin/tasks/cliWorkspaces.php->check_queries_incompatibilities() + * @param array $processes + * @return array + */ + public function checkIncompatibilityVariables($processes) + { + $result = []; + + foreach ($processes as $process) { + $variablesQuery = ProcessVariables::query()->select(); + //Call the scope method to filter by process + $variablesQuery->process($process['PRO_UID']); + $variables = $variablesQuery->get()->values()->toArray(); + foreach ($variables as $variable) { + $resultIncompatibility = $this->analyzeQuery($variable['VAR_SQL']); + if ($resultIncompatibility) { + $aux = array_merge($process, $variable); + array_push($result, $aux); + } + } + } + + return $result; + } + + /** + * Analyze the query using the regular expression + * + * @param string $query + * @return bool + */ + public function analyzeQuery($query) + { + preg_match_all($this::REGEX, $query, $matches, PREG_SET_ORDER, 0); + + return !empty($matches); + } +} \ No newline at end of file diff --git a/workflow/engine/templates/actionsByEmail/actionsByEmailErrorReply.html b/workflow/engine/templates/actionsByEmail/actionsByEmailErrorReply.html new file mode 100644 index 000000000..c8584c420 --- /dev/null +++ b/workflow/engine/templates/actionsByEmail/actionsByEmailErrorReply.html @@ -0,0 +1,20 @@ +
+ + + + + + +
ACTIONS BY EMAIL
+
+
+ @#ACTIONS_BY_EMAIL_ERROR_MESSAGE +
+
+
+ This is an automated email, please do not replay to it. +
+ www.processmaker.com +
+
\ No newline at end of file diff --git a/workflow/engine/templates/cases/pmdynaform.html b/workflow/engine/templates/cases/pmdynaform.html index fd91d6578..03f7151c5 100644 --- a/workflow/engine/templates/cases/pmdynaform.html +++ b/workflow/engine/templates/cases/pmdynaform.html @@ -11,16 +11,21 @@ + + + + + diff --git a/workflow/engine/templates/designer/index.html b/workflow/engine/templates/designer/index.html index da5100749..8c899c42c 100644 --- a/workflow/engine/templates/designer/index.html +++ b/workflow/engine/templates/designer/index.html @@ -1,5 +1,6 @@ + @@ -29,6 +30,7 @@ var SYS_LANG = "{$SYS_LANG}"; var SYS_SKIN = "{$SYS_SKIN}"; var HTTP_SERVER_HOSTNAME = "{$HTTP_SERVER_HOSTNAME}"; + var PMDYNAFORM_FIRST_TIME = "{$PMDYNAFORM_FIRST_TIME}" === "1"; var maxFileSizeInformation = {$maxFileSizeInformation}; @@ -87,6 +89,7 @@ var SYS_LANG = "{$SYS_LANG}"; var SYS_SKIN = "{$SYS_SKIN}"; var HTTP_SERVER_HOSTNAME = "{$HTTP_SERVER_HOSTNAME}"; + var PMDYNAFORM_FIRST_TIME = "{$PMDYNAFORM_FIRST_TIME}" === "1"; var maxFileSizeInformation = {$maxFileSizeInformation}; @@ -96,7 +99,6 @@ {/if} - diff --git a/workflow/engine/templates/emailServer/emailServer.js b/workflow/engine/templates/emailServer/emailServer.js index 91bed9ee9..dc72cd436 100644 --- a/workflow/engine/templates/emailServer/emailServer.js +++ b/workflow/engine/templates/emailServer/emailServer.js @@ -48,83 +48,69 @@ emailServer.application = { } /*----------------------------------********---------------------------------*/ + var typeEmailEngine = Ext.getCmp("cboEmailEngine").getValue(); + + if (typeEmailEngine === "PHPMAILER") { + var rdoGrpOption = Ext.getCmp("rdoGrpSmtpSecure").getValue(); + var smtpSecure = rdoGrpOption.getGroupValue(); + + p = { + option: option, + + cboEmailEngine: typeEmailEngine, + server: Ext.getCmp("txtServer").getValue(), + port: Ext.getCmp("txtPort").getValue(), + reqAuthentication: (Ext.getCmp("chkReqAuthentication").checked) ? 1 : 0, + accountFrom: Ext.getCmp("txtAccountFrom").getValue(), + password: Ext.getCmp("txtPassword").getValue(), + fromMail: Ext.getCmp("txtFromMail").getValue(), + fromName: Ext.getCmp("txtFromName").getValue(), + smtpSecure: smtpSecure, + sendTestMail: (Ext.getCmp("chkSendTestMail").checked) ? 1 : 0, + mailTo: Ext.getCmp("txtMailTo").getValue(), + emailServerDefault: emailDefault + }; + } else if (typeEmailEngine === "IMAP") { + /*----------------------------------********---------------------------------*/ + var rdoGrpOption = Ext.getCmp("rdoGrpSmtpSecure").getValue(); + var smtpSecure = rdoGrpOption.getGroupValue(); + + p = { + option: option, + + cboEmailEngine: typeEmailEngine, + server: Ext.getCmp("txtServer").getValue(), + port: Ext.getCmp("txtPort").getValue(), + incomingServer: Ext.getCmp("txtIncomingServer").getValue(), + incomingPort: Ext.getCmp("txtIncomingPort").getValue(), + reqAuthentication: (Ext.getCmp("chkReqAuthentication").checked) ? 1 : 0, + accountFrom: Ext.getCmp("txtAccountFrom").getValue(), + password: Ext.getCmp("txtPassword").getValue(), + fromMail: Ext.getCmp("txtFromMail").getValue(), + fromName: Ext.getCmp("txtFromName").getValue(), + smtpSecure: smtpSecure, + sendTestMail: (Ext.getCmp("chkSendTestMail").checked) ? 1 : 0, + mailTo: Ext.getCmp("txtMailTo").getValue(), + emailServerDefault: emailDefault + }; + /*----------------------------------********---------------------------------*/ + } else { + //MAIL + p = { + option: option, + + cboEmailEngine: typeEmailEngine, + fromMail: Ext.getCmp("txtFromMail").getValue(), + fromName: Ext.getCmp("txtFromName").getValue(), + sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, + mailTo: Ext.getCmp("txtMailTo").getValue(), + emailServerDefault: emailDefault + }; + } + switch (option) { - case "INS": - var typeEmailEngine = Ext.getCmp("cboEmailEngine").getValue(); - - - if (typeEmailEngine == "PHPMAILER") { - var rdoGrpOption = Ext.getCmp("rdoGrpSmtpSecure").getValue(); - var smtpSecure = rdoGrpOption.getGroupValue(); - - p = { - option: option, - - cboEmailEngine: typeEmailEngine, - server: Ext.getCmp("txtServer").getValue(), - port: Ext.getCmp("txtPort").getValue(), - reqAuthentication: (Ext.getCmp("chkReqAuthentication").checked)? 1 : 0, - accountFrom: Ext.getCmp("txtAccountFrom").getValue(), - password: Ext.getCmp("txtPassword").getValue(), - fromMail: Ext.getCmp("txtFromMail").getValue(), - fromName: Ext.getCmp("txtFromName").getValue(), - smtpSecure: smtpSecure, - sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, - mailTo: Ext.getCmp("txtMailTo").getValue(), - emailServerDefault: emailDefault - }; - } else { - //MAIL - p = { - option: option, - - cboEmailEngine: typeEmailEngine, - fromMail: Ext.getCmp("txtFromMail").getValue(), - fromName: Ext.getCmp("txtFromName").getValue(), - sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, - mailTo: Ext.getCmp("txtMailTo").getValue(), - emailServerDefault: emailDefault - }; - } - break; case "UPD": - var typeEmailEngine = Ext.getCmp("cboEmailEngine").getValue(); - - if (typeEmailEngine == "PHPMAILER") { - var rdoGrpOption = Ext.getCmp("rdoGrpSmtpSecure").getValue(); - var smtpSecure = rdoGrpOption.getGroupValue(); - - p = { - option: option, - emailServerUid: emailServerUid, - - cboEmailEngine: typeEmailEngine, - server: Ext.getCmp("txtServer").getValue(), - port: Ext.getCmp("txtPort").getValue(), - reqAuthentication: (Ext.getCmp("chkReqAuthentication").checked)? 1 : 0, - accountFrom: Ext.getCmp("txtAccountFrom").getValue(), - password: Ext.getCmp("txtPassword").getValue(), - fromMail: Ext.getCmp("txtFromMail").getValue(), - fromName: Ext.getCmp("txtFromName").getValue(), - smtpSecure: smtpSecure, - sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, - mailTo: Ext.getCmp("txtMailTo").getValue(), - emailServerDefault: emailDefault - }; - } else { - //MAIL - p = { - option: option, - emailServerUid: emailServerUid, - - cboEmailEngine: typeEmailEngine, - fromMail: Ext.getCmp("txtFromMail").getValue(), - fromName: Ext.getCmp("txtFromName").getValue(), - sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, - mailTo: Ext.getCmp("txtMailTo").getValue(), - emailServerDefault: emailDefault - }; - } + p.emailServerUid = emailServerUid; break; case "DEL": p = { @@ -132,45 +118,6 @@ emailServer.application = { emailServerUid: emailServerUid }; break; - //case "LST": - // break; - case "TEST": - var typeEmailEngine = Ext.getCmp("cboEmailEngine").getValue(); - - if (typeEmailEngine == "PHPMAILER") { - var rdoGrpOption = Ext.getCmp("rdoGrpSmtpSecure").getValue(); - var smtpSecure = rdoGrpOption.getGroupValue(); - - p = { - option: option, - - cboEmailEngine: typeEmailEngine, - server: Ext.getCmp("txtServer").getValue(), - port: Ext.getCmp("txtPort").getValue(), - reqAuthentication: (Ext.getCmp("chkReqAuthentication").checked)? 1 : 0, - accountFrom: Ext.getCmp("txtAccountFrom").getValue(), - password: Ext.getCmp("txtPassword").getValue(), - fromMail: Ext.getCmp("txtFromMail").getValue(), - fromName: Ext.getCmp("txtFromName").getValue(), - smtpSecure: smtpSecure, - sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, - mailTo: Ext.getCmp("txtMailTo").getValue(), - emailServerDefault: emailDefault - }; - } else { - //MAIL - p = { - option: option, - - cboEmailEngine: typeEmailEngine, - fromMail: Ext.getCmp("txtFromMail").getValue(), - fromName: Ext.getCmp("txtFromName").getValue(), - sendTestMail: (Ext.getCmp("chkSendTestMail").checked)? 1 : 0, - mailTo: Ext.getCmp("txtMailTo").getValue(), - emailServerDefault: emailDefault - }; - } - break; } Ext.Ajax.request({ @@ -240,11 +187,16 @@ emailServer.application = { Ext.getCmp("txtServer").allowBlank = true; Ext.getCmp("txtPort").allowBlank = true; + Ext.getCmp("txtIncomingServer").allowBlank = true; + Ext.getCmp("txtIncomingPort").allowBlank = true; Ext.getCmp("txtAccountFrom").allowBlank = true; Ext.getCmp("txtServer").setValue(""); Ext.getCmp("txtPort").setValue(""); + Ext.getCmp("txtIncomingServer").setValue(""); + Ext.getCmp("txtIncomingPort").setValue(""); + Ext.getCmp("chkReqAuthentication").setValue(false); emailServerSetPassword(Ext.getCmp("chkReqAuthentication").checked); @@ -286,6 +238,9 @@ emailServer.application = { Ext.getCmp("txtServer").setValue(record.get("MESS_SERVER")); Ext.getCmp("txtPort").setValue((record.get("MESS_PORT") != 0)? record.get("MESS_PORT") : ""); + Ext.getCmp("txtIncomingServer").setValue(record.get("MESS_INCOMING_SERVER")); + Ext.getCmp("txtIncomingPort").setValue((record.get("MESS_INCOMING_PORT") !== 0)? record.get("MESS_INCOMING_PORT") : ""); + Ext.getCmp("chkReqAuthentication").setValue((parseInt(record.get("MESS_RAUTH")) == 1)? true : false); emailServerSetPassword(Ext.getCmp("chkReqAuthentication").checked); @@ -323,10 +278,21 @@ emailServer.application = { { Ext.getCmp("frmEmailServer").getForm().clearInvalid(); - if (cboEmailEngine == "PHPMAILER") { + if (cboEmailEngine === "PHPMAILER") { Ext.getCmp("txtServer").setVisible(true); Ext.getCmp("txtPort").setVisible(true); + try { + Ext.getCmp("txtServer").label.update(_("ID_SERVER")); + Ext.getCmp("txtPort").label.update(_("PORT_DEFAULT")); + } catch (err) { + Ext.getCmp("txtServer").fieldLabel = _("ID_SERVER"); + Ext.getCmp("txtPort").fieldLabel = _("PORT_DEFAULT"); + } + + Ext.getCmp("txtIncomingServer").setVisible(false); + Ext.getCmp("txtIncomingPort").setVisible(false); + Ext.getCmp("chkReqAuthentication").setVisible(true); emailServerSetPassword(Ext.getCmp("chkReqAuthentication").checked); @@ -336,12 +302,46 @@ emailServer.application = { Ext.getCmp("txtServer").allowBlank = false; Ext.getCmp("txtPort").allowBlank = false; + Ext.getCmp("txtIncomingServer").allowBlank = true; + Ext.getCmp("txtIncomingPort").allowBlank = true; Ext.getCmp("txtAccountFrom").allowBlank = false; + } else if (cboEmailEngine === "IMAP") { + /*----------------------------------********---------------------------------*/ + Ext.getCmp("txtServer").setVisible(true); + Ext.getCmp("txtPort").setVisible(true); + + try { + Ext.getCmp("txtServer").label.update(_("ID_OUTGOING_SERVER")); + Ext.getCmp("txtPort").label.update(_("OUTGOING_PORT_DEFAULT")); + } catch (err) { + Ext.getCmp("txtServer").fieldLabel = _("ID_OUTGOING_SERVER"); + Ext.getCmp("txtPort").fieldLabel = _("OUTGOING_PORT_DEFAULT"); + } + + Ext.getCmp("txtIncomingServer").setVisible(true); + Ext.getCmp("txtIncomingPort").setVisible(true); + + Ext.getCmp("chkReqAuthentication").setVisible(true); + + emailServerSetPassword(Ext.getCmp("chkReqAuthentication").checked); + + Ext.getCmp("txtAccountFrom").setVisible(true); + Ext.getCmp("rdoGrpSmtpSecure").setVisible(true); + + Ext.getCmp("txtServer").allowBlank = false; + Ext.getCmp("txtPort").allowBlank = false; + Ext.getCmp("txtIncomingServer").allowBlank = false; + Ext.getCmp("txtIncomingPort").allowBlank = false; + Ext.getCmp("txtAccountFrom").allowBlank = false; + /*----------------------------------********---------------------------------*/ } else { //MAIL Ext.getCmp("txtServer").setVisible(false); Ext.getCmp("txtPort").setVisible(false); + Ext.getCmp("txtIncomingServer").setVisible(false); + Ext.getCmp("txtIncomingPort").setVisible(false); + Ext.getCmp("chkReqAuthentication").setVisible(false); emailServerSetPassword(false); @@ -351,6 +351,8 @@ emailServer.application = { Ext.getCmp("txtServer").allowBlank = true; Ext.getCmp("txtPort").allowBlank = true; + Ext.getCmp("txtIncomingServer").allowBlank = true; + Ext.getCmp("txtIncomingPort").allowBlank = true; Ext.getCmp("txtAccountFrom").allowBlank = true; Ext.getCmp("txtPassword").allowBlank = true; } @@ -384,7 +386,7 @@ emailServer.application = { FLAGTEST = 1; - if (option == "PHPMAILER") { + if (option === "PHPMAILER" || option === "IMAP") { if (typeof(testData.resolving_name) != "undefined") { if (testData.resolving_name.result) { msg = msg + "" + testData.resolving_name.title + "
"; @@ -492,6 +494,8 @@ emailServer.application = { {name: "MESS_ENGINE", type: "string"}, {name: "MESS_SERVER", type: "string"}, {name: "MESS_PORT", type: "int"}, + {name: "MESS_INCOMING_SERVER", type: "string"}, + {name: "MESS_INCOMING_PORT", type: "int"}, {name: "MESS_RAUTH", type: "int"}, {name: "MESS_ACCOUNT", type: "string"}, {name: "MESS_PASSWORD", type: "string"}, @@ -548,6 +552,9 @@ emailServer.application = { data: [ ["PHPMAILER", "SMTP (PHPMailer)"], + /*----------------------------------********---------------------------------*/ + ["IMAP", "SMTP - IMAP (PHPMailer)"], + /*----------------------------------********---------------------------------*/ ["MAIL", "Mail (PHP)"] ] }); @@ -597,6 +604,24 @@ emailServer.application = { emptyText: null }); + var txtIncomingServer = new Ext.form.TextField({ + id: "txtIncomingServer", + name: "txtIncomingServer", + + fieldLabel: _("ID_INCOMING_SERVER") //Server + }); + + var txtIncomingPort = new Ext.form.NumberField({ + id: "txtIncomingPort", + name: "txtIncomingPort", + + fieldLabel: _("INCOMING_PORT_DEFAULT"), //Port (default 993) + + anchor: "36%", + maxLength: 3, + emptyText: null + }); + var chkReqAuthentication = new Ext.form.Checkbox({ id: "chkReqAuthentication", name: "chkReqAuthentication", @@ -745,7 +770,7 @@ emailServer.application = { var winData = new Ext.Window({ layout: "fit", width: 550, - height: 388, + height: 450, //title: "", modal: true, resizable: false, @@ -772,6 +797,8 @@ emailServer.application = { cboEmailEngine, txtServer, txtPort, + txtIncomingServer, + txtIncomingPort, chkReqAuthentication, txtAccountFrom, txtPassword, @@ -997,6 +1024,16 @@ emailServer.application = { return (value != 0)? value : "-"; }; + var rendererMessIncomingServer = function (value) + { + return (value !== "")? value : "-"; + }; + + var rendererMessIncomingPort = function (value) + { + return (value !== 0)? value : "-"; + }; + var rendererMessSmtpSecure = function (value) { return (value != "")? value : "-"; @@ -1017,6 +1054,8 @@ emailServer.application = { {id: "MESS_ENGINE", dataIndex: "MESS_ENGINE", hidden: false, header: _("EMAIL_ENGINE"), width: 80, hideable: true, align: "left"}, {id: "MESS_SERVER", dataIndex: "MESS_SERVER", hidden: false, header: _("ID_SERVER"), width: 150, hideable: true, align: "center", renderer: rendererMessServer}, {id: "MESS_PORT", dataIndex: "MESS_PORT", hidden: false, header: _("ID_EMAIL_SERVER_PORT"), width: 50, hideable: true, align: "center", renderer: rendererMessPort}, + {id: "MESS_INCOMING_SERVER", dataIndex: "MESS_INCOMING_SERVER", hidden: true, header: _("ID_INCOMING_SERVER"), width: 150, hideable: true, align: "center", renderer: rendererMessIncomingServer}, + {id: "MESS_INCOMING_PORT", dataIndex: "MESS_INCOMING_PORT", hidden: true, header: _("ID_EMAIL_SERVER_PORT"), width: 50, hideable: true, align: "center", renderer: rendererMessIncomingPort}, {id: "MESS_RAUTH", dataIndex: "MESS_RAUTH", hidden: true, header: _("REQUIRE_AUTHENTICATION"), width: 50, hideable: false, align: "left"}, {id: "MESS_ACCOUNT", dataIndex: "MESS_ACCOUNT", hidden: false, header: _("ID_EMAIL_SERVER_ACCOUNT_FROM"), width: 130, hideable: true, align: "left"}, {id: "MESS_PASSWORD", dataIndex: "MESS_PASSWORD", hidden: true, header: _("ID_PASSWORD"), width: 130, hideable: false, align: "left"},