]> gitweb.erp-flowers.ru Git - yii-erp24/.git/commitdiff
add shipment/fields-data2 during pure php movement to yii
authorAlexander Smirnov <fredeom@mail.ru>
Mon, 18 Dec 2023 20:23:48 +0000 (23:23 +0300)
committerAlexander Smirnov <fredeom@mail.ru>
Mon, 18 Dec 2023 20:23:48 +0000 (23:23 +0300)
49 files changed:
erp24/actions/shipment/AjaxUpdateFieldsDataAction.php [new file with mode: 0644]
erp24/actions/shipment/AjaxUpdateStepAction.php [new file with mode: 0644]
erp24/actions/shipment/FieldsData2Action.php [new file with mode: 0644]
erp24/commands/AuthController.php [new file with mode: 0644]
erp24/config/console.php [changed mode: 0644->0755]
erp24/config/dev.console.config.php [new file with mode: 0755]
erp24/config/prod.console.config.php [new file with mode: 0755]
erp24/config/web.php
erp24/controllers/ShipmentController.php
erp24/inc/functionsFiedlsData.php
erp24/models/LoginForm.php
erp24/rbac/AdminGroupIdRule.php [new file with mode: 0644]
erp24/rbac/AdminSelfRule.php [new file with mode: 0644]
erp24/scripts/cli.php [new file with mode: 0755]
erp24/scripts/dashboard_sales _3.php [new file with mode: 0755]
erp24/scripts/dashboard_sales.php [new file with mode: 0755]
erp24/scripts/scheduler.php [new file with mode: 0755]
erp24/scripts/tasks/task_01.php [new file with mode: 0755]
erp24/scripts/tasks/task_02_calculate_rating.php [new file with mode: 0755]
erp24/scripts/tasks/task_03_save_change_group.php [new file with mode: 0755]
erp24/scripts/tasks/task_04_dashboard_sales.php [new file with mode: 0755]
erp24/scripts/tasks/task_05_set_retail_price_write_off.php [new file with mode: 0755]
erp24/scripts/tasks/task_06_set_payroll_by_day.php [new file with mode: 0755]
erp24/scripts/tasks/task_07_test.php [new file with mode: 0644]
erp24/scripts/tasks/task_08_messager_user_subscription_check.php [new file with mode: 0644]
erp24/scripts/tasks/task_09_contest001_update.php [new file with mode: 0644]
erp24/scripts/tasks/task_10_bonus_add.php [new file with mode: 0644]
erp24/scripts/tasks/task_11_bonus_dell.php [new file with mode: 0644]
erp24/scripts/tasks/task_12_api_logs_older_month_dell.php [new file with mode: 0644]
erp24/scripts/tasks/task_13_study_module_notify_obligatory_time_tomorrow.php [new file with mode: 0644]
erp24/scripts/tasks/task_14_clear_log.php [new file with mode: 0755]
erp24/scripts/tasks/task_15_bonus_dell_promo.php [new file with mode: 0644]
erp24/scripts/tasks/task_16_1c_request_checks_for_week.php [new file with mode: 0644]
erp24/scripts/tasks/task_17_set_payroll_info_by_month.php [new file with mode: 0755]
erp24/scripts/tasks/task_18_newsletters_for_non_tg_users.php [new file with mode: 0644]
erp24/scripts/tasks/task_19_set_sales_history.php [new file with mode: 0755]
erp24/scripts/tasks/task_20_give_500_to_referral_program_participants.php [new file with mode: 0644]
erp24/scripts/tasks/task_21_calculation_company_data_for_chart.php [new file with mode: 0644]
erp24/scripts/tasks/task_22_create_employee_for_1c_with_admins_with_empty_guid.php [new file with mode: 0644]
erp24/scripts/tasks/task_23_calculation_company_data_for_chart_users_bonus.php [new file with mode: 0644]
erp24/scripts/tasks/task_24_calculation_company_data_matrix_for_chart.php [new file with mode: 0644]
erp24/scripts/tasks/task_25_delivery_bonus_add_after_half_day.php [new file with mode: 0644]
erp24/scripts/tasks/task_26_delivery_bonus_add_after_weak.php [new file with mode: 0644]
erp24/traits/HistoryModelTrait.php [new file with mode: 0644]
erp24/views/shipment/ajax-edit-field-value.php
erp24/views/shipment/ajax-update-fields-data.php [new file with mode: 0644]
erp24/views/shipment/ajax-update-step.php [new file with mode: 0644]
erp24/views/shipment/fields-data2.php [new file with mode: 0644]
erp24/views/shipment/index.php

diff --git a/erp24/actions/shipment/AjaxUpdateFieldsDataAction.php b/erp24/actions/shipment/AjaxUpdateFieldsDataAction.php
new file mode 100644 (file)
index 0000000..bf3e2f1
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+namespace yii_app\actions\shipment;
+
+use yii\base\Action;
+
+class AjaxUpdateFieldsDataAction extends Action
+{
+    public function run() {
+        return $this->controller->renderPartial('ajax-update-fields-data');
+    }
+}
\ No newline at end of file
diff --git a/erp24/actions/shipment/AjaxUpdateStepAction.php b/erp24/actions/shipment/AjaxUpdateStepAction.php
new file mode 100644 (file)
index 0000000..05dda7a
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+namespace yii_app\actions\shipment;
+
+use yii\base\Action;
+
+class AjaxUpdateStepAction extends Action
+{
+    public function run() {
+        return $this->controller->renderPartial('ajax-update-step');
+    }
+}
\ No newline at end of file
diff --git a/erp24/actions/shipment/FieldsData2Action.php b/erp24/actions/shipment/FieldsData2Action.php
new file mode 100644 (file)
index 0000000..b3afc22
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+namespace yii_app\actions\shipment;
+
+use yii\base\Action;
+
+class FieldsData2Action extends Action
+{
+    public function run() {
+        return $this->controller->render('fields-data2');
+    }
+}
\ No newline at end of file
diff --git a/erp24/commands/AuthController.php b/erp24/commands/AuthController.php
new file mode 100644 (file)
index 0000000..5dda9e0
--- /dev/null
@@ -0,0 +1,156 @@
+<?php
+
+namespace yii_app\commands;
+
+use Yii;
+use yii\base\Exception;
+use yii\console\Controller;
+use yii_app\rbac\AdminGroupIdRule;
+use yii_app\rbac\AdminSelfRule;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroupRbacConfig;
+use yii\helpers\Console;
+use yii_app\records\CrmMenu;
+
+class AuthController extends Controller
+{
+    /**
+     * @throws Exception
+     * @throws \Exception
+     */
+    public function actionInit() {
+        if (Yii::$app->cache->get("dirtyAuthSettings") ?? true) {
+            Yii::$app->cache->set("dirtyAuthSettings", false);
+            echo "В настройках разрешений есть изменения. Продолжаю выполнение...\n";
+        } else {
+            echo "Нет изменений в настройках разрешений\n";
+            return 'ok';
+        }
+
+        $auth = Yii::$app->authManager;
+        $auth->removeAll();
+
+        $seeAdminSettings = $auth->createPermission('seeAdminSettings');
+        $seeAdminSettings->description = 'Видеть настройки пользователя';
+        $auth->add($seeAdminSettings);
+
+        $updateAdminSettings = $auth->createPermission('updateAdminSettings');
+        $updateAdminSettings->description = 'Редактировать настройки пользователя';
+        $auth->add($updateAdminSettings);
+
+        $author = $auth->createRole('author');
+        $auth->add($author);
+        $auth->addChild($author, $seeAdminSettings);
+
+        $updateAdminSettingsOnlyByHrAndAdministrator = $auth->createPermission('updateAdminSettingsOnlyByHrAndAdministrator');
+        $updateAdminSettingsOnlyByHrAndAdministrator->description = 'Редактировать настройки пользователя только HR-ом либо Администратором';
+        $auth->add($updateAdminSettingsOnlyByHrAndAdministrator);
+
+        $ruleAdminGroupId = new AdminGroupIdRule;
+        $auth->add($ruleAdminGroupId);
+
+        $updateAdminSettingsGroupId = $auth->createPermission('updateAdminSettingsGroupId');
+        $updateAdminSettingsGroupId->description = 'Редактировать должность пользователя';
+        $updateAdminSettingsGroupId->ruleName = $ruleAdminGroupId->name;
+        $auth->add($updateAdminSettingsGroupId);
+
+        $hr = $auth->createRole('hr');
+        $auth->add($hr);
+
+        $auth->addChild($hr, $updateAdminSettingsGroupId);
+        $auth->addChild($hr, $updateAdminSettingsOnlyByHrAndAdministrator);
+        $auth->addChild($hr, $updateAdminSettings);
+        $auth->addChild($hr, $author);
+
+        $manageAuthority = $auth->createPermission('manageAuthority');
+        $manageAuthority->description = 'Доступ к auth контрллеру';
+        $auth->add($manageAuthority);
+
+        $administrator = $auth->createRole('administrator');
+        $auth->add($administrator);
+        $auth->addChild($administrator, $hr);
+        $auth->addChild($administrator, $manageAuthority);
+
+        $rule = new AdminSelfRule;
+        $auth->add($rule);
+
+        $updateOwnSettings = $auth->createPermission('updateOwnSettings');
+        $updateOwnSettings->description = 'Редактировать собственные настройки';
+        $updateOwnSettings->ruleName = $rule->name;
+        $auth->add($updateOwnSettings);
+        $auth->addChild($updateOwnSettings, $updateAdminSettings);
+        $auth->addChild($author, $updateOwnSettings);
+
+        $managePassword = $auth->createPermission('managePassword');
+        $managePassword->description = 'Видеть и редактировать пароль';
+        $auth->add($managePassword);
+        $auth->addChild($updateOwnSettings, $managePassword);
+        $auth->addChild($hr, $managePassword);
+
+        $manageAvatarka = $auth->createPermission('manageAvatarka');
+        $manageAvatarka->description = 'Видеть и редактировать avatarka';
+        $auth->add($manageAvatarka);
+        $auth->addChild($updateOwnSettings, $manageAvatarka);
+        $auth->addChild($hr, $manageAvatarka);
+
+        $permissionList = [];
+        $adminGroupRbacConfigs = AdminGroupRbacConfig::find()->all();
+        $adminGroupRbacConfigsCount = count($adminGroupRbacConfigs);
+        Console::startProgress(0, $adminGroupRbacConfigsCount);
+        foreach ($adminGroupRbacConfigs as $ind => $adminGroupRbacConfig) {
+            Console::updateProgress($ind,$adminGroupRbacConfigsCount);
+            foreach (explode(',', $adminGroupRbacConfig->config) as $permissionName) {
+                if ($permissionName != "") {
+                    $roleOrPermission = $auth->getRole($permissionName) ?? $auth->getPermission($permissionName);
+                    if (!in_array($permissionName, $permissionList) && !$roleOrPermission) {
+                        $permission = $auth->createPermission($permissionName);
+                        $auth->add($permission);
+                        $auth->addChild($administrator, $permission);
+                    } else {
+                        $permission = $auth->getPermission($permissionName);
+                    }
+                    foreach (Admin::find()->where(['group_id' => $adminGroupRbacConfig->admin_group_id])->all() as $admin) {
+                        if ($roleOrPermission) {
+                            $auth->assign($roleOrPermission, $admin->id);
+                        } else {
+                            $auth->assign($permission, $admin->id);
+                        }
+                    }
+                }
+            }
+        }
+        Console::endProgress("end" . PHP_EOL);
+
+        return 'ok';
+    }
+
+    public function actionImportMenuPermissions() {
+        foreach (CrmMenu::find()->all() as $menu) {
+            foreach (explode(',', $menu->dostup_group) as $group_id) {
+                if ($group_id != '') {
+                    $adminGroupRbacConfig = AdminGroupRbacConfig::find()->where(['admin_group_id' => $group_id])->one();
+                    if (!$adminGroupRbacConfig) {
+                        $adminGroupRbacConfig = new AdminGroupRbacConfig;
+                        $adminGroupRbacConfig->admin_group_id = intval($group_id);
+                        $rbac_config = [];
+                    } else {
+                        $rbac_config = explode(',', $adminGroupRbacConfig->config);
+                        if ($rbac_config[0] == '') {
+                            unset($rbac_config[0]);
+                        }
+                    }
+                    $permission = 'menu' . $menu->url;
+                    if (!in_array($permission, $rbac_config)) {
+                        $rbac_config [] = $permission;
+                    }
+                    $adminGroupRbacConfig->config = implode(',', $rbac_config);
+                    $adminGroupRbacConfig->save();
+                }
+            }
+        }
+
+        echo "Используйте /auth/init чтобы применить импортированные разрешения";
+
+        return 'ok';
+    }
+}
old mode 100644 (file)
new mode 100755 (executable)
index ca429af..93dbd34
@@ -1,19 +1,29 @@
 <?php
 
-$params = require __DIR__ . '/params.php';
-$db = require __DIR__ . '/db.php';
+Yii::setAlias('@yii_app/commands', 'commands');
+Yii::setAlias('@yii_app', dirname(__DIR__));
 
 $config = [
     'id' => 'basic-console',
     'basePath' => dirname(__DIR__),
-    'bootstrap' => ['log'],
-    'controllerNamespace' => 'app\commands',
+    'bootstrap' => ['log', 'queue'],
+    'controllerNamespace' => 'yii_app\commands',
     'aliases' => [
         '@bower' => '@vendor/bower-asset',
         '@npm'   => '@vendor/npm-asset',
         '@tests' => '@app/tests',
     ],
     'components' => [
+        'authManager' => [
+            'class' => 'yii\rbac\DbManager',
+        ],
+        'queue' => [
+            'class' => \yii\queue\db\Queue::class,
+            'db' => 'db',
+            'tableName' => '{{%queue}}',
+            'channel' => 'default',
+            'mutex' => \yii\mutex\MysqlMutex::class,
+        ],
         'cache' => [
             'class' => 'yii\caching\FileCache',
         ],
@@ -25,16 +35,9 @@ $config = [
                 ],
             ],
         ],
-        'db' => $db,
-    ],
-    'params' => $params,
-    /*
-    'controllerMap' => [
-        'fixture' => [ // Fixture generation command line.
-            'class' => 'yii\faker\FixtureController',
-        ],
+        'db' => require dirname(__DIR__) . '/config/db.php',
+        'db2' => require dirname(__DIR__) . '/config/db2.php',
     ],
-    */
 ];
 
 if (YII_ENV_DEV) {
diff --git a/erp24/config/dev.console.config.php b/erp24/config/dev.console.config.php
new file mode 100755 (executable)
index 0000000..0cd89ea
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+
+return [
+    'language' => 'ru',
+    'id' => 'app',
+    'basePath' => dirname(__DIR__),
+    'bootstrap' => ['log'],
+    'modules' => [
+        'crud' => [
+            'class' => \yii\base\Module::class,
+            'viewPath' => '@yii_app/views/crud',
+            'controllerNamespace' => 'yii_app\controllers\crud',
+        ]
+    ],
+    'components' => [
+        'assetManager' => [
+            'appendTimestamp' => true,
+            'basePath' => '@webroot/cache/assets',
+            'baseUrl' => '@web/cache/assets',
+        ],
+        'formatter' => [    // fallback if no ext-intl php extension
+            'timeZone' => 'Europe/Moscow',
+            'defaultTimeZone' => 'Europe/Moscow',
+            'dateFormat' => 'php:d.m.Y',
+            'datetimeFormat' => 'php:d.m.Y H:i:s',
+            'timeFormat' => 'php:H:i',
+            'decimalSeparator' => ',',
+            'thousandSeparator' => ',',
+        ],
+        'urlManager' => [
+            'enablePrettyUrl' => true,
+            'showScriptName' => false,
+        ],
+        'db' => require dirname(__DIR__) . '/config/db.php',
+        'db2' => require dirname(__DIR__) . '/config/db2.php',
+        'log' => [
+            'traceLevel' => YII_DEBUG ? 3 : 0,
+            'targets' => [
+                [
+                    'class' => 'yii\log\DbTarget',
+                    'levels' => ['error', 'warning'],
+                    'logTable' => '{{%error_log}}',
+                    'except' => [
+                        'yii\web\Session:*', // Excludes all session messages
+                        // or
+                        'yii\web\Session::init', // Exclude only session init
+                    ],
+                ],
+            ],
+        ],
+        'cache' => [
+            'class' => \yii\caching\FileCache::class,
+        ],
+    ],
+    'aliases' => [
+        '@bower' => '@vendor/bower-asset',
+        '@npm' => '@vendor/npm-asset',
+        '@dist' => '@app/dist',
+    ],
+];
\ No newline at end of file
diff --git a/erp24/config/prod.console.config.php b/erp24/config/prod.console.config.php
new file mode 100755 (executable)
index 0000000..0f0ec67
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+global $_CONFIG_SITE;
+return [
+    'language' => 'ru',
+    'layoutPath' => dirname(__DIR__) . '/layouts',
+    'viewPath' => dirname(__DIR__) . '/views',
+    'controllerMap' => require __DIR__ . '/controller_map.php',
+    'id' => 'app',
+    'basePath' => dirname(dirname(__DIR__)),
+    'bootstrap' => ['log'],
+    'modules' => [
+        'crud' => [
+            'class' => \yii\base\Module::class,
+            'viewPath' => '@yii_app/views/crud',
+            'controllerNamespace' => 'yii_app\controllers\crud',
+        ]
+    ],
+    'components' => [
+        'assetManager' => [
+            'appendTimestamp' => true,
+            'basePath' => '@webroot/cache/assets',
+            'baseUrl' => '@web/cache/assets',
+        ],
+        'formatter' => [    // fallback if no ext-intl php extension
+            'timeZone' => 'Europe/Moscow',
+            'defaultTimeZone' => 'Europe/Moscow',
+            'dateFormat' => 'php:d.m.Y',
+            'datetimeFormat' => 'php:d.m.Y H:i:s',
+            'timeFormat' => 'php:H:i',
+            'decimalSeparator' => ',',
+            'thousandSeparator' => ',',
+        ],
+        'urlManager' => [
+            'enablePrettyUrl' => true,
+            'showScriptName' => false,
+        ],
+        'db' => [
+            'class' => yii\db\Connection::class,
+            'dsn' => strtr('mysql:host={host};dbname={dbname}', [
+                '{host}' => getenv('DB_HOST') ?: $_CONFIG_SITE["mysql_host"],
+                '{dbname}' => getenv('DB_SCHEMA') ?: $_CONFIG_SITE["mysql_db"],
+            ]),
+            'username' => getenv('DB_USER') ?: $_CONFIG_SITE["mysql_user"],
+            'password' => getenv('DB_PASSWORD') ?: $_CONFIG_SITE["mysql_pass"],
+            'charset' => 'utf8',
+            'enableSchemaCache' => true,
+            'schemaCacheDuration' => 300,
+        ],
+        'db2' => require dirname(__DIR__) . '/config/db2.php',
+        'log' => [
+            'traceLevel' => YII_DEBUG ? 3 : 0,
+            'targets' => [
+                [
+                    'class' => 'yii\log\DbTarget',
+                    'levels' => ['error', 'warning'],
+                    'logTable' => '{{%error_log}}',
+                ],
+            ],
+        ],
+        'cache' => [
+            'class' => \yii\caching\FileCache::class,
+        ],
+    ],
+    'aliases' => [
+        '@bower' => '@vendor/bower-asset',
+        '@npm' => '@vendor/npm-asset',
+        '@dist' => '@app/dist',
+    ],
+];
\ No newline at end of file
index 32396d0f410b3a87b616977feabbf76bef60b585..a75924cb6b6bbfd39b862204ea9ebf787d27b084 100644 (file)
@@ -19,6 +19,9 @@ $config = [
         ]
     ],
     'components' => [
+        'authManager' => [
+            'class' => 'yii\rbac\DbManager',
+        ],
         'request' => [
             'scriptUrl' => '/',
             // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
index 4f66abb2f6b37de6b8db27e4c942430c6c6cd9c1..b15e990681b53a6331a9fea4100c836f8712e506 100755 (executable)
@@ -15,6 +15,10 @@ class ShipmentController extends \yii\web\Controller
             'division' => \yii_app\actions\shipment\DivisionAction::class,
             'ajax-division' => \yii_app\actions\shipment\AjaxDivisionAction::class,
             'ajax-admin-online' => \yii_app\actions\shipment\AjaxAdminOnlineAction::class,
+            'fields-data2' => \yii_app\actions\shipment\FieldsData2Action::class,
+            'ajax-update-fields-data' => \yii_app\actions\shipment\AjaxUpdateFieldsDataAction::class,
+            'ajax-update-step' => \yii_app\actions\shipment\AjaxUpdateStepAction::class,
+            'ajax-edit-field-value' => \yii_app\actions\shipment\AjaxEditFieldValueAction::class,
             'fields-data' => \yii_app\actions\shipment\FieldsDataAction::class,
             'ajax-update-fields-data-test' => \yii_app\actions\shipment\AjaxUpdateFieldsDataTestAction::class,
             'division-print-edit' => \yii_app\actions\shipment\DivisionPrintEditAction::class,
@@ -22,7 +26,6 @@ class ShipmentController extends \yii\web\Controller
             'store-products-fact' => \yii_app\actions\shipment\StoreProductsFactAction::class,
             'polnogramm' => \yii_app\actions\shipment\PolnogrammAction::class,
             'store-planogram-logi' => \yii_app\actions\shipment\StorePlanogramLogiAction::class,
-            'ajaxEditFieldValue' => \yii_app\actions\shipment\AjaxEditFieldValueAction::class,
         ];
     }
 
index ede248e120f9410ab9ceb2918064b8a58fb3196b..14cde170590541c813bda3a481ed4c3c129727f2 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+error_reporting(E_ALL ^ E_NOTICE);
+
 global $products, $fieldsRows, $ProductsOptions, $FiledsDataArray, $fieldsPropertyArray,$date_start_sale, $date_start_division, $order_date_add,
 $whereInProductsId, $DataFieldStats, $FiledsData, $productsColorsArray, $storesArrayAll;
  
@@ -153,7 +155,7 @@ if (empty($OrderData["parent_id"])) { //если это материнская -
     }
 }
 
-
+$time = time();
 if (!empty($date_start)) {
     $time = strtotime($date_start);
 }
@@ -161,6 +163,7 @@ $date2=date('Y-m-d 23:59:59', $time-86400);
 $date1=date('Y-m-d 00:00:00', $time-86400*8);
 //echo"Дата старта $date_start Считаем продажи и списания от даты $date1  до $date2";
 
+$group_id = $_SESSION['group_id'];
 
 foreach($statuses_dostup[$status_order_id][$group_id] as $fieldid => $arrs) {
     $dostup_fields[$fieldid]=$arrs["dostup"];
@@ -810,6 +813,8 @@ table.zak tr.zg th b,table.zak tr.zg td b {
 
 </style>
 <script>
+const param5x = $(\'meta[name=csrf-param]\').attr(\'content\');
+const token5x = $(\'meta[name=csrf-token]\').attr(\'content\');
 
 function changef(id,typeint)
 { 
@@ -823,10 +828,10 @@ $(\'#\'+id+\'\').val(\'\'+uname+\'\');
 function ajaxEditFieldValue(name_eng,product_id,color)
 { 
 $.ajax({
-       url: \'/shipment/ajaxEditFieldValue/\',
+       url: \'/shipment/ajax-edit-field-value/\',
        method: \'post\',       
        dataType: \'html\',        
-       data: { id: '.$orderId.',  name_eng: \'\'+name_eng+\'\', store_id:\'\'+$(\'#store_id_id\').val()+\'\', product_id:\'\'+product_id+\'\', color: \'\'+color+\'\', value:\'\'+$(\'#\'+name_eng+\'\'+product_id+\'\').val()+\'\' },  
+       data: { id: '.$orderId.',  name_eng: \'\'+name_eng+\'\', store_id:\'\'+$(\'#store_id_id\').val()+\'\', product_id:\'\'+product_id+\'\', color: \'\'+color+\'\', value:\'\'+$(\'#\'+name_eng+\'\'+product_id+\'\').val()+\'\', [param5x] : token5x },  
        success: function(data){  
     $(\'#edit_div\').html(data);
        }}); 
@@ -864,11 +869,11 @@ $finish = '?';
 function showOrderStoresPanel() {
     global $db, $status_order_id, $status_edit_dostup, $store_orders_status_description, $storesArray, $store_id, $store_orders_statuses, $statuses_stores_show,$whereGuid,$act,$orderId,$group_id;
 
-
-    echo'<form method=post action="/shipment/'.$act.'/?id='.$orderId.'">
+//action="/shipment/'.$act.'/?id='.$orderId.'"
+    echo'<form method=post >
         <table><td>Статус:</td><td><span class="tag">'. $store_orders_statuses[$status_order_id] .' </span> </td>';
+    echo \yii\helpers\Html::input('hidden', Yii::$app->request->csrfParam,Yii::$app->request->csrfToken);
+
     if (!empty($status_edit_dostup[$status_order_id][$group_id])) {
         echo'<td>можно изменять на</td><td> <select class="form-control" name=status_new>';
         foreach($status_edit_dostup[$status_order_id][$group_id] as $v) {
@@ -884,7 +889,7 @@ function showOrderStoresPanel() {
     echo'</form>';
 
     //показываем магазины если статус закупки подразумевает разбивку данных по магазинам
-    if ($statuses_stores_show[$status_order_id])  {
+    if (true) {//if ($statuses_stores_show[$status_order_id])  {
 
         $stores_arr=$db::mapping("SELECT name,id FROM products_1c WHERE tip='city_store' AND view='1' order by name ASC");
         $stores_cnt=count($stores_arr);
@@ -912,9 +917,9 @@ function showOrderStoresPanel() {
         foreach($storesArray as $strid=>$namestore) {
             echo"<a href=\"/shipment/$act/?store_id=$strid&id=$orderId\" class=\"btn btn-";
 
-            if ($store_order_status_value[$strid]) {
-                echo 'outline-';
-            }
+//            if ($store_order_status_value[$strid]) {
+//                echo 'outline-';
+//            }
             if ($store_id==$strid) {
                 echo"success";
             } else {
@@ -1023,9 +1028,9 @@ global $FiledsData,$db, $orderId, $DataFieldStats, $FiledsDataSumm;
 
 function function_auto_purchase_formula($param,$print=0) {
 global $db;    
-$goods_in_transit=$param["goods_in_transit"];
-$sale_7day=$param["sale_7day"];
-$quantity_fact=$param["quantity_fact"];
+$goods_in_transit=(float)$param["goods_in_transit"];
+$sale_7day=(float)$param["sale_7day"];
+$quantity_fact=(float)$param["quantity_fact"];
 $quantity=$param["quantity"];
 $min_lot=$param["min_lot"];
 $min_order=$param["min_order"];
@@ -1040,10 +1045,10 @@ $fact_sale=$sale_7day;// если факт продаж будет больше
 
 if (($fact-$fact_sale)>0) {
 $saleweek1=$fact-$fact_sale ; 
-$zakaz= $sale_7day + $sale_2day +  $quantity - $saleweek1;       
+$zakaz= (float)$sale_7day + (float)$sale_2day +  (float)$quantity - (float)$saleweek1;
 }
 else { 
-$zakaz= $sale_7day + $sale_2day +  $quantity ;    
+$zakaz= (float)$sale_7day + (float)$sale_2day +  (float)$quantity ;
 }
 // считаем по такой же формуле но за две недели средняя - и если расхождение более 30% подсвевиваем красным
 
@@ -1055,7 +1060,7 @@ $ceil=ceilCoefficient($zakaz,$min_lot);
 
 //if (!empty($min_order) and $ceil<$min_order) $ceil=$min_order;
 
-$ttl="".$param["color"]."
+$ttl="".($param["color"] ?? '')."
 Товар в пути goods_in_transit =$goods_in_transit
 Продажи sale_7day=  $sale_7day
 Страховой запас sale_2day= $sale_2day
@@ -1083,9 +1088,9 @@ function roundCoefficientQuantity($number, $rate = 1)
 // функция для формулы автоделения
 function deivisionFormula($param,$print=0) {
 $goods_in_transit=$param["goods_in_transit"];
-$sale_7day=$param["sale_7day"];
-$quantity_fact=$param["quantity_fact"];
-$quantity=$param["quantity"];
+$sale_7day=(float)$param["sale_7day"];
+$quantity_fact=(float)$param["quantity_fact"];
+$quantity=(float)$param["quantity"];
 $min_lot=$param["min_lot"];
 $min_order=$param["min_order"];
 $quantity_purchase_summ=$param["quantity_purchase_summ"];
@@ -1183,7 +1188,7 @@ if ($ceil>=$zakazDivision) $zakaz=$zakazDivision;
 //Заказано кустовыми $quantity_purchase_summ шт.
 //Заказано на магазин $quantity_purchase шт.
 
-$ttl="$txt формула = продажи_7_дней + запас_на_3дня + полнограмма - продажи_7дней
+$ttl=" формула = продажи_7_дней + запас_на_3дня + полнограмма - продажи_7дней
 Мин. лот деления $min_lot!
 Куплено по факту $quantity_warehouseman_fact шт
 Продажи 7 дней=".$sale_7day."шт
@@ -1191,7 +1196,7 @@ $ttl="$txt формула = продажи_7_дней + запас_на_3дня
 Полнограмма ".$quantity."шт
 факт ".$quantity_fact."шт
 Заказ ".$zakaz."шт
-Округляем -> $ceilшт";
+Округляем -> $ceil шт";
 
 $array_r["value"]=$ceil;
 $array_r["title"]=$ttl;
@@ -1259,7 +1264,7 @@ return $array_r;
 function return_quantity_zakup_fact_week_formula($productId, $color){
 global $FiledsData;
 
-$value=$FiledsData["quantity_zakup_fact_week_formula"][$productId]["NULL"][$color];
+$value=$FiledsData["quantity_zakup_fact_week_formula"][$productId]["NULL"][$color] ?? '';
 //$value=rand(1,999);
 return $value;
 }
@@ -1276,31 +1281,31 @@ $func_content_arr=explode(";",$formula);
 $avg_arr=explode(",",$func_content_arr[0]);
 
 $field[0]=$avg_arr[0];
-$field[1]=$avg_arr[1];
+$field[1]=$avg_arr[1] ?? '';
 
 
-$field_type1=$fieldsRows[$field[0]]["field_type"];
-$field_type2=$fieldsRows[$field[1]]["field_type"];
+$field_type1=$fieldsRows[$field[0]]["field_type"] ?? '';
+$field_type2=$fieldsRows[$field[1]]["field_type"] ?? '';
 
 $storeId1=$storeId;
-$store_save=$fieldsRows[$field[0]]["store_save"]
+$store_save=$fieldsRows[$field[0]]["store_save"] ?? '';
 if ($store_save==0 or $field_type1=="global" or $field[0]=="division_ratio"  or $field_type1=="global_hand"  or $field_type2=="stats_summ") // если это поле глобальное и его нельзя суммировать и считать по магазину - то  or $field[0]=="division_auto_need"
 {
     
 $storeId1="NULL";    
 }
-$avg1=$FiledsData[$field[0]][$productId][$storeId1][$color];
+$avg1=$FiledsData[$field[0]][$productId][$storeId1][$color] ?? 0;
 
 
 $storeId2=$storeId;
-$store_save=$fieldsRows[$field[1]]["store_save"];
+$store_save=$fieldsRows[$field[1]]["store_save"] ?? '';
 if ($store_save==0 or $field[1]=="division_ratio" or  $field_type2=="global" or $field_type2=="global_hand"  or $field_type2=="stats_summ") // если это поле глобальное и его нельзя суммировать и считать по магазину - то   or $field[1]=="division_auto_need"
 {
     
 $storeId2="NULL";    
 }
 
-$avg2=$FiledsData[$field[1]][$productId][$storeId2][$color];
+$avg2=$FiledsData[$field[1]][$productId][$storeId2][$color] ?? 0;
   
  
        
@@ -1353,8 +1358,8 @@ insert_store_orders_fields($data_uper,$field_name,"", false);
 
 // суммирование
 elseif ($type=="addition") {
-$avg1=$FiledsData[$field[0]][$productId][$storeId][$color];
-$avg2=$FiledsData[$field[1]][$productId][$storeId][$color];
+$avg1=$FiledsData[$field[0]][$productId][$storeId][$color] ?? 0;
+$avg2=$FiledsData[$field[1]][$productId][$storeId][$color] ?? 0;
 
 $value=$avg1+$avg2;
 $value_title="$avg1(".$field[0].")  + $avg2(".$field[1].") ";  
@@ -1395,21 +1400,21 @@ if ($type=="division"  || $type=="division_auto_need"    || $type=="auto_purchas
                if ($storeId!="NULL" and $color=="NULL") $formula=true;
           $value_arr=[];       
           $param=array();  
-            $param["sale_7day"]=$FiledsData["sales_cnt"][$productId][$storeId][$color];
-            $param["sales_7day_division"]=$FiledsData["sales_7day_division"][$productId][$storeId][$color];
-            $param["quantity"]=$FiledsData["quantity"][$productId][$storeId][$color];
-            $param["quantity_fact"]=$FiledsData["quantity_fact"][$productId][$storeId][$color];         
-            $param["goods_in_transit"]=$FiledsData["quantity_zakup_fact_week"][$productId][$storeId][$color];
+            $param["sale_7day"]=$FiledsData["sales_cnt"][$productId][$storeId][$color] ?? '';
+            $param["sales_7day_division"]=$FiledsData["sales_7day_division"][$productId][$storeId][$color] ?? '';
+            $param["quantity"]=$FiledsData["quantity"][$productId][$storeId][$color] ?? '';
+            $param["quantity_fact"]=$FiledsData["quantity_fact"][$productId][$storeId][$color] ?? '';
+            $param["goods_in_transit"]=$FiledsData["quantity_zakup_fact_week"][$productId][$storeId][$color] ?? '';
             
             
-            if (empty($param["goods_in_transit"])) $param["goods_in_transit"]=$FiledsData["goods_in_transit"][$productId][$storeId][$color];
+            if (empty($param["goods_in_transit"])) $param["goods_in_transit"]=$FiledsData["goods_in_transit"][$productId][$storeId][$color] ?? 0;
             
             $param["min_lot"]=$FiledsData["min_lot"][$productId];  
             if (empty($store_id))  $param["min_order"]=$FiledsData["min_order"][$productId];
             
-            $param["quantity_purchase_summ"]=$FiledsData["quantity_purchase_summ"][$productId]["NULL"][$color];  
-            $param["quantity_warehouseman_fact"]=$FiledsData["quantity_warehouseman_fact"][$productId]["NULL"][$color];  
-            $param["quantity_purchase"]=$FiledsData["quantity_purchase"][$productId][$storeId][$color];  
+            $param["quantity_purchase_summ"]=$FiledsData["quantity_purchase_summ"][$productId]["NULL"][$color] ?? '';
+            $param["quantity_warehouseman_fact"]=$FiledsData["quantity_warehouseman_fact"][$productId]["NULL"][$color] ?? '';
+            $param["quantity_purchase"]=$FiledsData["quantity_purchase"][$productId][$storeId][$color] ?? '';
 
 
 // считаем авто деление
@@ -1470,9 +1475,9 @@ insert_store_orders_fields($data_uper,"division_auto");
             if ($color=="NULL" and !empty($storesAll[$storeId])) {
                 $param["goods_in_transit"]=$FiledsData["goods_in_transit"][$productId]["NULL"]["NULL"];
 
-                $itog=$FiledsData["auto_purchase_formula_all"]["NULL"]["NULL"]-$param["goods_in_transit"];
+                $itog=($FiledsData["auto_purchase_formula_all"]["NULL"]["NULL"] ?? 0) - ($param["goods_in_transit"] ?? 0);
 
-                $FiledsData["auto_purchase_formula_all"]["NULL"]["NULL"] +=$value;
+                $FiledsData["auto_purchase_formula_all"]["NULL"]["NULL"] = ($FiledsData["auto_purchase_formula_all"]["NULL"]["NULL"] ?? 0) + $value;
                 echo"<br><font color=blue>".$products[$productId]." ".$storesAll[$storeId]." = $value  all= ".$FiledsData["auto_purchase_formula_all"]["NULL"]["NULL"]." transit=".$param["goods_in_transit"]." itog=$itog</font>";
             }
             
@@ -1493,7 +1498,7 @@ insert_store_orders_fields($data_uper,"division_auto");
          }   
          
           if ($type=="quantity_purchase_last_week") {
-             $value=$FiledsData["quantity_purchase_last_week"][$productId][$storeId][$color];
+             $value=$FiledsData["quantity_purchase_last_week"][$productId][$storeId][$color] ?? '';
 
          }          
 
@@ -1517,7 +1522,7 @@ insert_store_orders_fields($data_uper,"division_auto");
       */     
            
            
-    $array=["value"=>$value,"title"=>$value_title];
+    $array=["value"=>$value ?? 0,"title"=>$value_title ?? ''];
 
     return $array;
 }    
@@ -1654,9 +1659,17 @@ function getValueFieldTrue($field_name,$productId,$storeId="NULL",$color="NULL")
     }
 
   //TODO TUT
-    $roo = $FiledsData[$field_name][$productId];
-    $roo2 = $FiledsData[$field_name][$productId][$storeId];
-    $value=$FiledsData[$field_name][$productId][$storeId][$color];
+    $roo = $FiledsData[$field_name][$productId] ?? '';
+    try {
+        $roo2 = $FiledsData[$field_name][$productId][$storeId] ?? '';
+    } catch (\Exception $e) {
+        $roo2 = '';
+    }
+    try {
+        $value=$FiledsData[$field_name][$productId][$storeId][$color] ?? '';
+    } catch (\Exception $e) {
+        $value = '';
+    }
     $tip=$fieldsRows[$field_name]["tip"];
 
     if ($field_name=="min_lot") {
@@ -1680,14 +1693,14 @@ function getValueFieldTrue($field_name,$productId,$storeId="NULL",$color="NULL")
 
     }
   
-    $value_title = $FiledsData["title__".$field_name][$productId][$storeId][$color];
+    $value_title = $FiledsData["title__".$field_name][$productId][$storeId][$color] ?? '';
 
     if (empty($value_title)) {
-        $value_title = $FiledsData["title__" . $field_name][$productId][$storeId]["NULL"];
+        $value_title = $FiledsData["title__" . $field_name][$productId][$storeId]["NULL"] ?? '';
     }
 
     if (empty($value_title)) {
-        $value_title = $FiledsData["title__" . $field_name][$productId]["NULL"]["NULL"];
+        $value_title = $FiledsData["title__" . $field_name][$productId]["NULL"]["NULL"] ?? '';
     }
 
 
@@ -1742,7 +1755,7 @@ function printFieldType($valueArray,$fieldName,$productId,$storeId,$color=""){
     } else {
           $nameInput=''.$fieldName.'['.$productId.']';  
           $idInput=''.$fieldName.''.$productId.'';
-          $onchange='ajaxEditFieldValue(\''.$fieldName.'\',\''.$productId.'\',\'NULL\')';   
+          $onchange='ajaxEditFieldValue(\''.$fieldName.'\',\''.$productId.'\',\'NULL\')';
          
      }  
         
@@ -1820,16 +1833,16 @@ function printFieldTd($fieldName,$productId,$storeId,$color="") {
 
         if (empty($color)) {
             if ($fieldsRows[$fieldName]["row_type_sum"]=="sum") {
-                $rowArraySum[$fieldId] += $value;
+                $rowArraySum[$fieldId] = ($rowArraySum[$fieldId] ?? 0) + $value;
             }
 
             if ($fieldsRows[$fieldName]["row_type_sum"]=="avg") {
-                $rowArraySum[$fieldId] +=$value;
-                $rowArraySum["cnt__".$fieldId]++;
+                $rowArraySum[$fieldId] = ($rowArraySum[$fieldId] ?? 0) + $value;
+                $rowArraySum["cnt__".$fieldId] = ($rowArraySum["cnt__".$fieldId] ?? 0) + 1;
             }
 
             if ($fieldsRows[$fieldName]["row_type_sum"]=="amount") {
-                $rowArraySum[$fieldId] +=$value;
+                $rowArraySum[$fieldId] = ($rowArraySum[$fieldId] ?? 0) + $value;
             }
         }
 
@@ -1877,7 +1890,7 @@ function insert_store_orders_fields($massivSQL,$field_name,$massivTitle=[], $pri
     $field_id=$fieldsRows[$field_name]["id"];
     $type=$fieldsRows[$field_name]["type"];
 
-    foreach($massivSQL as $productId =>$array) {
+    foreach($massivSQL ?? [] as $productId =>$array) {
         foreach($array as $storeId =>$valueArr) {
             foreach($valueArr as $color =>$value) {
                 if (empty($color) or $storeId=="NULL") {
@@ -1983,7 +1996,7 @@ function insert_store_orders_fields($massivSQL,$field_name,$massivTitle=[], $pri
 
                 } catch (Exception $e)
                 {
-                echo 'Ошибка вставки данных field_name='.$field_name.' '.print_r($param).' error='. $e->getMessage();
+                echo 'Ошибка вставки данных field_name='.$field_name.' '.print_r($param ?? '').' error='. $e->getMessage();
                 }
             }
         }
@@ -2693,13 +2706,13 @@ function updatefieldsRows() {
 
     }
 
-    foreach($fieldsArr as $fieldName) {
-//echo"<br> $fieldName";
-        $data_up=getArrayByFiledName($fieldName,$date1,$date2);
-        insert_store_orders_fields($data_up,$fieldName);
-        $FiledsData[$fieldName]=$data_up;
-
-    }
+//    foreach($fieldsArr as $fieldName) {
+////echo"<br> $fieldName";
+//        $data_up=getArrayByFiledName($fieldName,$date1,$date2);
+//        insert_store_orders_fields($data_up,$fieldName);
+//        $FiledsData[$fieldName]=$data_up;
+//
+//    }
 
 
     foreach($fieldsStatsSum as $fieldName) {
@@ -2809,7 +2822,7 @@ FROM store_orders_fields WHERE 1 order by position ASC, id ASC");
    ".$row["field_type"]."</td><td>";
 
 
-        if (is_array($FiledsData[$row["field_name"]])) {
+        if (is_array($FiledsData[$row["field_name"]] ?? '')) {
             $html .="<font color=green>++</font>";
         }
         //<td>".$row["sql_table_values"]."</td>
@@ -3122,7 +3135,7 @@ FROM store_orders_fields WHERE 1 order by position ASC, id ASC");
           </tr> ";
 
 
-            foreach($store_planogram_colors[$productId][$storeId] as $color => $quantity) {
+            foreach($store_planogram_colors[$productId][$storeId] ?? [] as $color => $quantity) {
                 $percent_color=$FiledsData["color_percent"][$productId][$storeId][$color];
                 if ( (!empty($quantity) and !empty($percent_color) ) or !empty($FiledsData["division_hand"][$productId][$storeId]["NULL"]) ) {
 
index e86786f675fdb7a852590ed87afd2a561ba72696..c9b6d7be5c9ca7a5562f036001bf3a3d130acc96 100644 (file)
@@ -103,6 +103,7 @@ class LoginForm extends Model
         $_SESSION['dostup_area'] = [];
         $group = AdminGroup::findOne($user->group_id);
         $_SESSION['admin_group_name'] = $group->name ?? "Какая-то...";
+        $_SESSION['name_group_admin'] = $group->name ?? "Какая-то...";
         $_SESSION['status_dostup_arr'] = [];
         $_SESSION['admin_group_add_arr'] = [];
 
@@ -123,7 +124,7 @@ class LoginForm extends Model
         $_SESSION['manager_id'] = $user->manager_id ?? null;
         $_SESSION['content_dostup'] = $user->content_dostup ?? null;
 
-        $_SESSION['name_group_admin'] = "Пользователь";
+//        $_SESSION['name_group_admin'] = "Пользователь";
     }
 
     /**
diff --git a/erp24/rbac/AdminGroupIdRule.php b/erp24/rbac/AdminGroupIdRule.php
new file mode 100644 (file)
index 0000000..2429719
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+namespace yii_app\rbac;
+
+use yii\rbac\Rule;
+use yii_app\records\Admin;
+
+class AdminGroupIdRule extends Rule
+{
+    public $name = 'canChangeAdminGroupId';
+
+    public function execute($user, $item, $params)
+    {
+        return (Admin::findOne($user)->group_id == 1) || (isset($params['group_id']) && ($params['group_id'] != "1"));
+    }
+}
\ No newline at end of file
diff --git a/erp24/rbac/AdminSelfRule.php b/erp24/rbac/AdminSelfRule.php
new file mode 100644 (file)
index 0000000..1204266
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+namespace yii_app\rbac;
+
+use yii\rbac\Rule;
+
+class AdminSelfRule extends Rule
+{
+    public $name = 'isAdminSelf';
+
+    public function execute($user, $item, $params)
+    {
+        return isset($params['id']) && $params['id'] == $user;
+    }
+}
\ No newline at end of file
diff --git a/erp24/scripts/cli.php b/erp24/scripts/cli.php
new file mode 100755 (executable)
index 0000000..3b52dc3
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+try {
+    unset($argv[0]);
+
+    // Регистрируем функцию автозагрузки
+    spl_autoload_register(function (string $className) {
+//        require_once __DIR__ . '/../../../' . $className . '.php';
+//        require_once __DIR__ . '/../../yii_app/Cli/Rate.php';
+        require_once __DIR__ . '/../../' . $className . '.php';
+    });
+
+    // Составляем полное имя класса, добавив нэймспейс
+//    $className = '\\yii_app\\Cli\\' . array_shift($argv);
+    $className = '//yii_app//Cli//' . array_shift($argv);
+    var_dump($className);
+    if (!class_exists($className)) {
+        throw new \yii_app\Cli\CliException('Class "' . $className . '" not found');
+    }
+
+    // Подготавливаем список аргументов
+    $params = [];
+    foreach ($argv as $argument) {
+        preg_match('/^-(.+)=(.+)$/', $argument, $matches);
+        if (!empty($matches)) {
+            $paramName = $matches[1];
+            $paramValue = $matches[2];
+
+            $params[$paramName] = $paramValue;
+        }
+    }
+
+    // Создаём экземпляр класса, передав параметры и вызываем метод execute()
+    $class = new $className($params);
+    $class->execute();
+} catch (\yii_app\Cli\CliException $e) {
+    echo 'Error: ' . $e->getMessage();
+}
\ No newline at end of file
diff --git a/erp24/scripts/dashboard_sales _3.php b/erp24/scripts/dashboard_sales _3.php
new file mode 100755 (executable)
index 0000000..8292abe
--- /dev/null
@@ -0,0 +1,842 @@
+<?
+if ($_REQUEST["token"] != "1CjgpXfgkh1pXV3KR2H57G3VtHCffrp154up1t36") exit();
+$abs_path = "/var/www/www-root/data/www/erp.bazacvetov24.ru/";
+include_once $abs_path . "startup.php";
+include_once($abs_path . "inc/db.php");
+// https://api.bazacvetov24.ru/cron/dashboard_sales.php?tip=0&token=1CjgpXfgkh1pXV3KR2H57G3VtHCffrp154up1t36&date1=2022-08-01&date2=2022-08-10
+//https://api.bazacvetov24.ru/cron/dashboard_sales.php?tip=0&token=1CjgpXfgkh1pXV3KR2H57G3VtHCffrp154up1t36&minus_days=7
+
+
+$data = $db::getRows("
+    SELECT 
+        entity_id, 
+        export_val 
+    FROM 
+        export_import_table 
+    WHERE 
+        entity='city_store' 
+    AND 
+        export_id='1'
+        
+    ");
+
+foreach ($data as $row) {
+    $export[$row["entity_id"]] = $row["export_val"];
+    $export_revers[$row["export_val"]] = $row["entity_id"];
+}
+
+
+$date1 = date("Y-m-d", time());
+$date2 = date("Y-m-d", time());
+if (!empty($_GET["date1"])) $date1 = htmlentities($_GET["date1"]);
+if (!empty($_GET["date2"])) $date2 = htmlentities($_GET["date2"]);
+
+
+if (!empty($_GET["minus_days"])) {
+    $minus_days = intval($_GET["minus_days"]);
+    $date1 = date("Y-m-d", time() - 86400 * $minus_days);
+    $date2 = date("Y-m-d", time());
+
+}
+
+
+// массив с полями дашборда
+$fialds_arr = $db::mapping("
+    SELECT 
+        id, 
+        name 
+    FROM 
+        dashboard_fields 
+    WHERE  
+        name!='sales_summ' 
+    ");
+
+$fialdsArrFlipped = array_flip($fialds_arr);
+
+
+// вычисляем продажи по магазинам до всех полей так эти данные будут использоваться в расчете процентов
+$dataArray = return_sales_stores($date1, $date2);
+foreach ($dataArray as $filed_name => $arrayF) {
+    echo "<hr><h2>!!$filed_name</h2>";
+    print_r($arrayF);
+}
+
+
+foreach ($fialds_arr as $field_id => $filed_name) {
+    $arr = [];
+// вычисляем и группируем по принадлежности к классу суммируем товары по классам    
+    if (in_array($filed_name, ["wrap", "services", "potted"])) {
+
+
+        $arrayData = return_sale_products_class($date1, $date2, $filed_name, $field_id, "");
+
+// если есть поле услуг с процентом то запускаем сбор даных по процентам 
+        if (in_array($filed_name . "_percent", $fialds_arr)) {
+            $massivSQL = [];
+            foreach ($arrayData as $date => $array) {
+                foreach ($array as $storeId => $value) {
+                    $percent = round(($value / $dataArray["sales_summ"][$date][$storeId]) * 100);
+                    echo "<br> есть поле " . $filed_name . "_percent $date storeId=$storeId  == $value продажи " . $dataArray["sales_summ"][$date][$storeId] . "  percent= $percent% ";
+                    $massivSQL[$date][$storeId] = $percent;
+                }
+            }
+
+
+            $field_id = $fialdsArrFlipped["" . $filed_name . "_percent"];
+            insert_data_in_dashboard_sales($massivSQL, "" . $filed_name . "_percent", $field_id);
+        }
+
+
+    }
+    if ($filed_name == "incoming_traffic") $dataArray["incoming_traffic"] = return_incoming_traffic_stores($date1, $date2, "incoming_traffic", "7");
+//if($filed_name=="avg_position_check") $arr=return_avg_position_check_stores($date1,$date2,"return_avg_position_check_stores","16");
+
+
+    echo "<hr><h2>$filed_name</h2>";
+    print_r($arrayData);
+
+
+    /*
+    $filename ='sales_dashboard.txt';
+    file_put_contents($filename, $tip);
+    */
+}
+
+echo "<hr><h2>Конверсия в КОнверсия трафика в чек</h2>";
+$massivSQL = [];
+foreach ($dataArray["checks_counter"] as $date => $array) {
+    foreach ($array as $storeId => $value) {
+        $percent = round(($value / $dataArray["incoming_traffic"][$date][$storeId]) * 100);
+        echo "<br>conversion_traffic $date storeId=$storeId= $value входящий " . $dataArray["incoming_traffic"][$date][$storeId] . "  percent= $percent% ";
+        $massivSQL[$date][$storeId] = $percent;
+    }
+}
+$dataArray["conversion_traffic"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "conversion_traffic", 8);
+
+
+echo "<hr><h2>Конверсия в бонусную</h2>";
+$massivSQL = [];
+foreach ($dataArray["bonus_clients"] as $date => $array) {
+    foreach ($array as $storeId => $value) {
+        $percent = round(($value / $dataArray["checks_counter"][$date][$storeId]) * 100);
+        echo "<br>сonversion_bonus_clients $date storeId=$storeId= $value  клиентов " . $dataArray["checks_counter"][$date][$storeId] . "  percent= $percent% ";
+        $massivSQL[$date][$storeId] = $percent;
+    }
+}
+$dataArray["сonversion_bonus_clients"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "сonversion_bonus_clients", 11);
+
+// считаем новых клиентов в бонусной
+$massivSQL = [];
+$data2 = $db::getRows("
+    SELECT  
+        count(*) as cnt, 
+        created_store_id, 
+        DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+    FROM  
+        users 
+    WHERE  
+        date>='$date1 00:00:00' 
+    AND 
+        date<='$date2 23:59:59' 
+    AND 
+        sale_price>0 
+    GROUP BY 
+        date_t, 
+        created_store_id  
+    ORDER BY 
+        cnt DESC
+        ");
+foreach ($data2 as $row2) {
+    $massivSQL[$row2["date_t"]][$row2["created_store_id"]] = $row2["cnt"];
+    $dataArray["new_bonus_clients"][] = $massivSQL;
+    echo "<br>new_bonus_clients " . $row2["date_t"] . " storeId=" . $row2["created_store_id"] . "= " . $row2["cnt"];
+    $percent = round(($value / $dataArray["checks_counter"][$date][$storeId]) * 100);
+}
+$dataArray["new_bonus_clients"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "new_bonus_clients", 10);
+
+
+// считаем % новых клиентов в бонусной
+$massivSQL = [];
+foreach ($dataArray["bonus_clients"] as $date => $array) {
+    foreach ($array as $storeId => $value) {
+        $percent = round(($dataArray["new_bonus_clients"][$date][$storeId] / $value) * 100);
+        echo "<br>new_bonus_clients_percent $date storeId=$storeId= $value new_bonus_clients " . $dataArray["new_bonus_clients"][$date][$storeId] . "  percent= $percent% ";
+        $massivSQL[$date][$storeId] = $percent;
+    }
+}
+$dataArray["new_bonus_clients_percent"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "new_bonus_clients_percent", 12);
+
+
+//считаем позиции в чеке
+
+echo "<h3>avg_position_check - позиций в чеке</h3>";
+$massivSQL = [];
+$data = $db::getRows("
+    SELECT 
+        DATE_FORMAT(sales.date,'%d.%m.%Y') as dt,  
+        sales.store_id, 
+        count(*) as cnt 
+    FROM 
+        sales 
+    RIGHT JOIN 
+            sales_items 
+            ON 
+                (sales_items.check_id=sales.id)
+    WHERE 
+        sales.operation='Продажа'  
+    AND 
+        sales.date >= '$date1 00:00:00' 
+    AND 
+        sales.date <= '$date2 23:59:59' 
+    group by 
+        dt,
+        sales.store_id 
+    order by 
+        dt ASC
+        ");
+foreach ($data as $row) {
+    $dataArray["avg_position_check"][$row["dt"]][$row["store_id"]] = round($row["cnt"] / $dataArray["checks_counter"][$row["dt"]][$row["store_id"]], 2);
+    echo "<br>avg_position_check " . $row["dt"] . " storeId=" . $row["store_id"] . "=" . $dataArray["avg_position_check"][$row["dt"]][$row["store_id"]];
+    $massivSQL[$date][$storeId] = $percent;
+
+}
+$dataArray["avg_position_check"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "avg_position_check", 16);
+// end позиций в чеке
+
+echo "<br>=====clients_ltv================";
+// повторные клиенты clients_ltv
+$massivSQL = [];
+foreach ($dataArray["bonus_clients"] as $date => $array) {
+    foreach ($array as $storeId => $value) {
+        // количество по бонусной - новые клиенты по бонусной
+        $value_new = $value - $dataArray["new_bonus_clients"][$date][$storeId];
+        echo "<br>clients_ltv $date storeId=$storeId= $value_new new_bonus_clients " . $dataArray["new_bonus_clients"][$date][$storeId] . "";
+        $massivSQL[$date][$storeId] = $value_new;
+
+    }
+}
+$dataArray["clients_ltv"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "clients_ltv", 19);
+
+
+echo "<br>=====clients_ltv_percent================";
+// clients_ltv_percent Количество повторных клиентов деленное на количество чеков %
+$massivSQL = [];
+foreach ($dataArray["clients_ltv"] as $date => $array) {
+    foreach ($array as $storeId => $value) {
+        if (!empty($dataArray["checks_counter"][$date][$storeId])) $value_new = round(($value / $dataArray["checks_counter"][$date][$storeId]) * 100); else $value_new = 0;
+        echo "<br>clients_ltv_percent $date storeId=$storeId= $value_new checks_counter " . $dataArray["checks_counter"][$date][$storeId] . "";
+        $massivSQL[$date][$storeId] = $value_new;
+
+    }
+}
+$dataArray["clients_ltv_percent"] = $massivSQL;
+insert_data_in_dashboard_sales($massivSQL, "clients_ltv_percent", 20);
+
+
+$d = explode("-", $date1);
+$month1 = $d[1];
+$year1 = $d[0];
+$d2 = explode("-", $date2);
+$month2 = $d2[1];
+$year2 = $d2[0];
+
+
+echo "<br><h4>Продажи группировка по месяцу</h4>";
+
+for ($i = (int)$month1; $i <= (int)$month2; $i++) {
+
+    $number_day_month1 = cal_days_in_month(CAL_GREGORIAN, (int)$i, $year1);
+
+    if (strlen($i) == 1) $i2 = "0$i"; else $i2 = $i;
+    echo " <br> 01-$i2-$year1 $number_day_month1-$i2-$year1 ";
+    $data = $db::getRows("
+        SELECT  
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_p, 
+            DATE_FORMAT(date,'%m.%Y') as monthdate    
+        FROM 
+            sales 
+        WHERE 
+            operation='Продажа' 
+        AND 
+            date>='$year1-$i2-01 00:00:00'  
+        AND  
+            date<='$year1-$i2-$number_day_month1 23:59:59' 
+        AND 
+            (order_id='' or order_id='0') 
+        group BY 
+            date_p,
+            store_id 
+        order by 
+            date ASC");
+
+    foreach ($data as $row) {
+
+        $dataArraySalesDay[$row["date_p"]][$row["store_id"]] = $row["summ"];  // sales_summ
+//$dataArraySales[$row["monthdate"]][$row["store_id"]] +=$row["summ"]; // суммируем продажи по месяц по кажому магазину
+        $dataArraySalesAll[$row["date_p"]][0] += $row["summ"]; // суммируем продажи по дате все магазины
+        $SalesMStores[$row["monthdate"]][$row["store_id"]] += $row["summ"]; // суммируем продажи по месяцу по кажому магазину
+        $SalesM[$row["monthdate"]][0] += $row["summ"]; // суммируем продажи по месяцу
+
+        $dataSaleCumulative[$row["date_p"]][$row["store_id"]] = $SalesMStores[$row["monthdate"]][$row["store_id"]];
+        $dataSaleCumulativeTotal[$row["date_p"]][0] = $SalesM[$row["monthdate"]][0];
+
+        echo "<br>" . $row["date_p"] . "   summ=" . $row["summ"] . "  store_id= " . $row["store_id"] . "  
+    Нарастающий итог по магазину " . $SalesMStores[$row["monthdate"]][$row["store_id"]] . " 
+    Нарастающий итог " . $SalesM[$row["monthdate"]][0] . "   ";
+    }
+
+
+    $dataArray["cumulative_sum_store"] = $dataSaleCumulative;
+    $dataArray["cumulative_total_stores"] = $dataSaleCumulativeTotal;
+
+
+    insert_data_in_dashboard_sales($dataSaleCumulative, "cumulative_sum_store", 29);
+    insert_data_in_dashboard_sales($dataSaleCumulativeTotal, "cumulative_total_stores", 30);
+
+
+}
+
+
+echo "<h3>Процент списания нарастающим</h3>";
+for ($i = (int)$month1; $i <= (int)$month2; $i++) {
+
+    $number_day_month1 = cal_days_in_month(CAL_GREGORIAN, (int)$i, $year1);
+    if (strlen($i) == 1) $i2 = "0$i"; else $i2 = $i;
+
+    $z = "
+        SELECT  
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_p, 
+            DATE_FORMAT(date,'%m.%Y') as date_m   
+        FROM 
+            write_offs 
+        WHERE 
+            type='Брак' 
+        AND  
+            date>='$year1-$i2-01 00:00:00'  
+        AND  
+            date<='$year1-$i2-$number_day_month1 23:59:59' 
+        GROUP BY 
+            date_p,
+            store_id 
+        ORDER BY 
+            date ASC
+            ";
+
+    echo $z;
+    $data = $db::getRows($z);
+
+    foreach ($data as $row) {
+        $storeId = $export_revers[$row["store_id"]];
+        $sale = $dataSaleCumulative[$row["date_p"]][$storeId];
+        $write_offs[$row["date_m"]][$storeId] += $row["summ"];
+        $write_offs_date[$row["date_p"]][$storeId] = $row["summ"];
+
+
+        $write_offsAll[$row["date_m"]][0] += $row["summ"];
+        $salesAll = $dataSaleCumulativeTotal[$row["date_p"]][0];
+        if (!empty($sale)) $percent_loss = round(100 * $write_offs[$row["date_m"]][$storeId] / $sale, 1); else $percent_loss = 0;
+//$planPercent=round(100*$sales[$row["store_id"]]/$plan[$row["store_id"]],1); 
+
+        echo "<br>" . $row["date_p"] . " =$percent_loss%  summ=" . $row["summ"] . "  store_id=$storeId ";
+
+    }
+    $dataArray["write_offs"] = $write_offs_date;
+    insert_data_in_dashboard_sales($write_offs_date, "write_offs", 31);
+
+//if(!empty($sale)) $percent_loss=round(100*$write_offs[$row["date_m"]][$row["store_id"]]/$sale,1); else $percent_loss=0;
+
+
+}
+
+
+//bonus_minus списание бонусов по магазинам и начисление бонусов по магазинам
+
+$data = $db::getRows("
+    SELECT  
+        sum(if(tip='minus' AND tip_sale='sale',bonus,0))  as summ, 
+        sum(if(tip='plus' AND tip_sale='sale',bonus,0))  as summ_plus, 
+        store_id, 
+        DATE_FORMAT(date,'%d.%m.%Y') as date_p   
+    FROM 
+        users_bonus  
+    WHERE 
+        (
+            (tip='minus' 
+                 AND 
+             tip_sale='sale'
+            ) 
+            OR  
+            (tip='plus' 
+                 AND 
+             tip_sale='sale'
+            ) 
+        ) 
+    AND 
+        date>='$date1 00:00:00'  
+    AND  
+        date<='$date2 23:59:59' 
+    GROUP BY 
+        date_p,
+        tip,
+        store_id 
+    ORDER BY 
+        date ASC
+        ");
+
+foreach ($data as $row) {
+    $storeId = $row["store_id"];
+    $bonus_minus[$row["date_p"]][$storeId] = $row["summ"];
+    $bonus_plus[$row["date_p"]][$storeId] = $row["summ_plus"];
+    $bonus_minus[$row["date_p"]][0] += $row["summ"];
+    $bonus_plus[$row["date_p"]][0] += $row["summ_plus"];
+
+    echo "<br>" . $row["date_p"] . "   summ=" . $row["summ"] . "  store_id=$storeId  Итого списано " . $bonus_minus[$row["date_p"]][0] . "";
+
+
+}
+$dataArray["bonus_minus"] = $bonus_minus;
+$dataArray["summ_plus"] = $bonus_plus;
+insert_data_in_dashboard_sales($bonus_plus, "bonus_plus", 28);
+insert_data_in_dashboard_sales($bonus_minus, "bonus_minus", 27);
+
+
+//функция подсчета суммы продаж по классу товара
+function return_sale_products_class($date1, $date2, $field_name, $field_id, $store_id = "")
+{
+    global $db;   // массив с продажами глобальный
+
+    /*
+    if(!isset($_SESSION["return_sale_$field_name"][$date1][$date2])) {
+    $_SESSION["return_sale_$field_name"][$date1][$date2]=$result;
+    } else $result=$_SESSION["return_sale_$field_name"][$date1][$date2];
+    */
+
+
+    if (empty($_SESSION["1where_tip_$field_name"])) {
+    } else $WHERE = $_SESSION["1where_tip_$field_name"];
+    $data = $db::getRows("
+        SELECT 
+            products_1c.id 
+        FROM 
+            products_1c  
+        RIGHT JOIN 
+            products_class 
+                ON 
+                    products_1c.parent_id=products_class.category_id 
+                AND 
+                    products_class.tip='$field_name' 
+        WHERE 1
+        ");
+
+    $arrId = [];
+    foreach ($data as $row) {
+        if (!empty($row["id"])) $arrId[] = $row["id"];
+    }
+    $WHERE = " AND sales_items.id_1c in ('" . implode("','", $arrId) . "')";
+
+
+//$_SESSION["1where_tip_$field_name"]=$WHERE;
+//echo"<br><br>Упаковки товаров $i";
+
+
+    if ($store_id != "") $_WHERE2 = " AND sales.store_id='$store_id'";
+
+
+        $z = "
+            SELECT  
+                DATE_FORMAT(sales.date,'%d.%m.%Y') as date_p,   
+                sales.store_id,   
+                sum(sales_items.summa) as summa 
+            FROM 
+                sales 
+            RIGHT JOIN 
+                sales_items 
+                    ON (
+                            sales_items.check_id=sales.id  
+                        $WHERE  
+                    )
+            WHERE 
+                sales.operation = 'Возврат'  
+            AND 
+                sales.date>='$date1 00:00:00' 
+            AND 
+                sales.date<='$date2 23:59:59' 
+                
+                $_WHERE2 
+            group by 
+                date_p, 
+                sales.store_id
+        ";
+    $data = $db::getRows($z);
+    foreach ($data as $row) {
+        $store_sale_vozvrat[$row["date_p"]][$row["store_id"]] += $row["summa"];
+    }
+
+
+// sales_items.id_1c, sales_items.kol,
+    $data = $db::getRows("
+        SELECT  
+            DATE_FORMAT(sales.date,'%d.%m.%Y') as date_p,  
+            sales.store_id,
+            sum(sales_items.summa) as summa 
+        FROM 
+            sales 
+        RIGHT JOIN 
+            sales_items 
+                ON (sales_items.check_id=sales.id  $WHERE  )
+        WHERE 
+            sales.operation='Продажа'  
+        AND 
+            sales.date>='$date1 00:00:00' 
+        AND 
+            sales.date<='$date2 23:59:59' 
+        $_WHERE2  
+        GROUP BY 
+            date_p, 
+            sales.store_id
+            ");
+    foreach ($data as $row) {
+        $store_sale[$row["date_p"]][$row["store_id"]] += $row["summa"];
+    }
+
+    foreach ($store_sale as $date_d => $array) {
+        foreach ($array as $storeId => $summa) {
+            $result[$date_d][$storeId] = $summa - $store_sale_vozvrat[$date_d][$storeId];
+            $a = explode(".", $date_d);
+            $date = "" . $a[2] . "-" . $a[1] . "-" . $a[0] . "";
+
+            $db::sql("INSERT INTO dashboard_sales (date, store_id, field_name, field_id, summ, last_modified) VALUES (?, ?, ?, ?, ?, NOW()) 
+ON DUPLICATE KEY UPDATE summ=?, last_modified=NOW()", [$date, $storeId, $field_name, $field_id, $summa, $summa]);
+
+
+        }
+    }
+
+
+    return $result;
+}
+
+//трафик посетителей
+function return_incoming_traffic_stores($date1, $date2, $field_name, $field_id)
+{
+    global $db;
+//собираем данные в массив группируем по дате и магазину
+    $data = $db::getRows("
+        SELECT 
+            sum(counter) as counter,
+            store_id,
+            date,
+            DATE_FORMAT(date,'%d.%m.%Y')  as dt 
+        FROM 
+            store_visitors 
+        WHERE 
+            date>='$date1' 
+        AND 
+            date<='$date2' 
+        group BY 
+            date,
+            store_id
+        ");
+    foreach ($data as $row) {
+        $massivSQL[$row["dt"]][$row["store_id"]] = $store_traffik[$row["dt"]][$row["store_id"]] + $row["counter"];
+    }
+//вставляем данные в таблицу дашборда
+    insert_data_in_dashboard_sales($massivSQL, $field_name, $field_id);
+    return $massivSQL;
+}
+
+
+//считаем позиции в чеке
+function return_avg_position_check_stores($date1, $date2, $field_name, $field_id)
+{
+    global $db;
+    $data = $db::getRows("
+        SELECT 
+            DATE_FORMAT(sales.date,'%d.%m.%Y')  as dt,  
+            sales.store_id, 
+            count(*) as cnt  
+        FROM 
+            sales 
+        WHERE 
+            sales.operation='Продажа' 
+        AND 
+            (order_id='' or order_id='0')  
+        AND 
+            sales.date>='$date1 00:00:00' 
+        AND 
+            sales.date<='$date2 23:59:59' 
+        GROUP BY 
+            dt,
+            sales.store_id
+        ");
+    foreach ($data as $row) $massivSQL[$row["dt"]][$row["store_id"]] = $row["cnt"];
+//вставляем данные в таблицу дашборда
+    insert_data_in_dashboard_sales($massivSQL, $field_name, $field_id);
+    return $massivSQL;
+}
+
+
+//считаем сумму продаж
+function return_sales_stores($date1, $date2)
+{
+    global $db;
+
+// считаем возвраты
+    $data = $db::getRows("
+        SELECT 
+            count(*) as cnt,  
+            sum(if(matrix>=15,summ,0)) as matrix, 
+            sum(if(phone!='NULL',1,0)) as bonus_clients, 
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+        FROM 
+            sales 
+        WHERE  
+            date>='$date1 00:00:00' 
+        AND 
+            date<='$date2 23:59:59' 
+        AND 
+            operation='Возврат' 
+        AND 
+            (order_id='' or order_id='0')
+        group by 
+            date_t, 
+            store_id  
+        order by 
+            date_t desc, 
+            cnt DESC
+    
+    ");
+    foreach ($data as $row) {
+        $vozvrat_summ[$row["date_t"]][$row["store_id"]] = $row["summ"];
+        $voz_sales_store[$row["date_t"]][$row["store_id"]] = $row["cnt"];
+        $vozvrat_matrix_summ[$row["date_t"]][$row["store_id"]] = $row["matrix"];
+    }
+
+// считаем продажи средний чек количество чеков
+    $data = $db::getRows("
+        SELECT 
+            count(*) as cnt,  
+            sum(if(matrix>=15,summ,0)) as matrix,  
+            sum(if(phone!='NULL',1,0)) as bonus_clients,
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+        FROM 
+            sales 
+        WHERE  
+            date>='$date1 00:00:00' 
+        AND 
+            date<='$date2 23:59:59' 
+        AND 
+            operation='Продажа' 
+        AND 
+            (order_id='' or order_id='0')
+        group by 
+            date_t, 
+            store_id  
+        order by 
+            date_t desc, 
+            cnt DESC
+            
+    ");
+    foreach ($data as $row) {
+        $checks_counter[$row["date_t"]][$row["store_id"]] = $row["cnt"] - $voz_sales_store[$row["date_t"]][$row["store_id"]];
+        $sales_avg_check[$row["date_t"]][$row["store_id"]] = round(($row["summ"] - $vozvrat_summ[$row["date_t"]][$row["store_id"]]) / ($row["cnt"] - $voz_sales_store[$row["date_t"]][$row["store_id"]]));
+        $sales_summ[$row["date_t"]][$row["store_id"]] = $row["summ"] - $vozvrat_summ[$row["date_t"]][$row["store_id"]];
+        $bonus_clients[$row["date_t"]][$row["store_id"]] = $row["bonus_clients"];
+        $matrix[$row["date_t"]][$row["store_id"]] = $row["matrix"] - $vozvrat_matrix_summ[$row["date_t"]][$row["store_id"]];
+    }
+
+
+// считаем возвраты интернет магазина
+    $data = $db::getRows("
+        SELECT 
+            count(*) as cnt,  
+            sum(if(matrix>=15,summ,0)) as matrix, 
+            sum(if(phone!='NULL',1,0)) as bonus_clients,
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+        FROM 
+            sales 
+        WHERE  
+            date>='$date1 00:00:00' 
+        AND 
+            date<='$date2 23:59:59' 
+        AND 
+            operation='Возврат' 
+        AND 
+            order_id>0
+        GROUP BY 
+            date_t
+        ORDER BY 
+            date_t DESC, 
+            cnt DESC
+            ");
+    foreach ($data as $row) {
+        $row["store_id"] = 0;
+        $vozvrat_delivery_summ[$row["date_t"]][$row["store_id"]] = $row["summ"];
+        $voz_delivery_store[$row["date_t"]][$row["store_id"]] = $row["cnt"];
+        $vozvrat_delivery_matrix_summ[$row["date_t"]][$row["store_id"]] = $row["matrix"];
+    }
+
+// считаем продажи средний чек количество чеков с доставок
+    $data = $db::getRows("
+        SELECT 
+            count(*) as cnt,  
+            sum(if(matrix>=15,summ,0)) as matrix,  
+            sum(if(phone!='NULL',1,0)) as bonus_clients, 
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+        FROM 
+            sales 
+        WHERE  
+            date>='$date1 00:00:00' 
+        AND 
+            date<='$date2 23:59:59' 
+        AND 
+            operation='Продажа' 
+        AND 
+            order_id>0
+        GROUP BY 
+            date_t 
+        ORDER BY 
+            date_t DESC, 
+            cnt DESC
+        ");
+    foreach ($data as $row) {
+        $row["store_id"] = 0;
+        $delivery_checks_counter[$row["date_t"]][$row["store_id"]] = $row["cnt"] - $voz_delivery_store[$row["date_t"]][$row["store_id"]];
+        $delivery_sales_avg_check[$row["date_t"]][$row["store_id"]] = round(($row["summ"] - $vozvrat_delivery_summ[$row["date_t"]][$row["store_id"]]) / ($row["cnt"] - $voz_delivery_store[$row["date_t"]][$row["store_id"]]));
+        $delivery_sales_summ[$row["date_t"]][$row["store_id"]] = $row["summ"] - $vozvrat_delivery_summ[$row["date_t"]][$row["store_id"]];
+        $delivery_bonus_clients[$row["date_t"]][$row["store_id"]] = $row["bonus_clients"];
+        $delivery_matrix[$row["date_t"]][$row["store_id"]] = $row["matrix"] - $vozvrat_delivery_matrix_summ[$row["date_t"]][$row["store_id"]];
+    }
+
+
+// считаем возвраты интернет магазина Самовывозы
+    $data = $db::getRows("
+        SELECT 
+            count(*) as cnt,  
+            sum(if(matrix>=15,summ,0)) as matrix, 
+            sum(if(phone!='NULL',1,0)) as bonus_clients, 
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+        FROM 
+            sales 
+        WHERE  
+            date>='$date1 00:00:00' 
+        AND 
+            date<='$date2 23:59:59' 
+        AND 
+            operation='Возврат' 
+        AND 
+            order_id>0 
+        AND 
+            store_id!='4'
+        GROUP BY 
+            date_t, 
+            store_id  
+        ORDER BY 
+            date_t DESC, 
+            cnt DESC
+    ");
+    foreach ($data as $row) {
+        $vozvrat_smovivoz_summ[$row["date_t"]][$row["store_id"]] = $row["summ"];
+        $voz_smovivoz_store[$row["date_t"]][$row["store_id"]] = $row["cnt"];
+        $vozvrat_smovivoz_matrix_summ[$row["date_t"]][$row["store_id"]] = $row["matrix"];
+    }
+// считаем продажи средний чек количество чеков с доставок  Самовывозы
+    $data = $db::getRows("
+        SELECT 
+            count(*) as cnt,  
+            sum(if(matrix>=15,summ,0)) as matrix,  
+            sum(if(phone!='NULL',1,0)) as bonus_clients, 
+            sum(summ) as summ, 
+            store_id, 
+            DATE_FORMAT(date,'%d.%m.%Y') as date_t  
+        FROM 
+            sales 
+        WHERE  
+            date>='$date1 00:00:00' 
+        AND 
+            date<='$date2 23:59:59' 
+        AND 
+            operation='Продажа' 
+        AND 
+            order_id>0 
+        AND 
+            store_id!='4'
+        GROUP BY 
+            date_t, 
+            store_id 
+        ORDER BY 
+            date_t DESC, 
+            cnt DESC
+        ");
+    foreach ($data as $row) {
+        $cnt = $row["cnt"] - $voz_smovivoz_store[$row["date_t"]][$row["store_id"]];
+        $smovivoz_checks_counter[$row["date_t"]][$row["store_id"]] = $cnt;
+        $delivery_pickup_all[$row["date_t"]][0] += $cnt;
+
+
+        $smovivoz_sales_avg_check[$row["date_t"]][$row["store_id"]] = round(($row["summ"] - $vozvrat_smovivoz_summ[$row["date_t"]][$row["store_id"]]) / $cnt);
+        $smovivoz_sales_summ[$row["date_t"]][$row["store_id"]] = $row["summ"] - $vozvrat_smovivoz_summ[$row["date_t"]][$row["store_id"]];
+        $smovivoz_bonus_clients[$row["date_t"]][$row["store_id"]] = $row["bonus_clients"];
+        $smovivoz_matrix[$row["date_t"]][$row["store_id"]] = $row["matrix"] - $vozvrat_smovivoz_matrix_summ[$row["date_t"]][$row["store_id"]];
+    }
+
+
+//delivery_pickup_all - самовывозы с магазинов - количество delivery_pickup_summ -  сумма
+    insert_data_in_dashboard_sales($delivery_pickup_all, "delivery_pickup_all", 25);
+    insert_data_in_dashboard_sales($smovivoz_checks_counter, "delivery_pickup_counter", 26);
+
+    insert_data_in_dashboard_sales($delivery_sales_summ, "delivery_sale_summ", 22);
+    insert_data_in_dashboard_sales($delivery_checks_counter, "delivery_sale_counter", 23);
+    insert_data_in_dashboard_sales($delivery_sales_avg_check, "delivery_sale_check_avg", 24);
+
+
+    insert_data_in_dashboard_sales($checks_counter, "checks_counter", 21);
+    insert_data_in_dashboard_sales($sales_summ, "sales_summ", 14);
+    insert_data_in_dashboard_sales($sales_avg_check, "sales_avg_check", 13);
+    insert_data_in_dashboard_sales($bonus_clients, "bonus_clients", 9);
+    insert_data_in_dashboard_sales($matrix, "matrix_summ", 15);
+
+
+    $array = [];
+    $array["sales_summ"] = $sales_summ;
+    $array["checks_counter"] = $checks_counter;
+    $array["sales_avg_check"] = $sales_avg_check;
+    $array["bonus_clients"] = $bonus_clients;
+    $array["matrix_summ"] = $matrix;
+
+    return $array;
+
+}
+//вставляем данные в таблицу дашборда
+function insert_data_in_dashboard_sales($massivSQL, $field_name, $field_id)
+{
+    global $db;
+    foreach ($massivSQL as $date_d => $array) {
+        foreach ($array as $storeId => $value) {
+            $a = explode(".", $date_d);
+            $date = "" . $a[2] . "-" . $a[1] . "-" . $a[0] . "";
+            $db::sql("INSERT INTO dashboard_sales (date,  store_id, field_name, field_id, summ, last_modified) VALUES (?, ?, ?, ?, ?, NOW()) 
+    ON DUPLICATE KEY UPDATE summ=?, field_id=?, last_modified=NOW()", [$date, $storeId, $field_name, $field_id, $value, $value, $field_id]);
+        }
+    }
+}
\ No newline at end of file
diff --git a/erp24/scripts/dashboard_sales.php b/erp24/scripts/dashboard_sales.php
new file mode 100755 (executable)
index 0000000..a01700b
--- /dev/null
@@ -0,0 +1,13 @@
+<?
+if ($_REQUEST["token"] != "1CjgpXfgkh1pXV3KR2H57G3VtHCffrp154up1t36")
+    exit();
+
+include_once __DIR__ . '/../../startup.php';
+include_once __DIR__ . '/../../inc/db.php';
+
+// https://api.bazacvetov24.ru/cron/dashboard_sales.php?tip=0&token=1CjgpXfgkh1pXV3KR2H57G3VtHCffrp154up1t36&date1=2022-08-01&date2=2022-08-10
+//https://api.bazacvetov24.ru/cron/dashboard_sales.php?tip=0&token=1CjgpXfgkh1pXV3KR2H57G3VtHCffrp154up1t36&minus_days=7
+
+
+
+     
diff --git a/erp24/scripts/scheduler.php b/erp24/scripts/scheduler.php
new file mode 100755 (executable)
index 0000000..f638c5e
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+global $erp_yii_dir, $_APP_ENV;
+
+global $link;
+
+
+$erp_yii_dir = realpath(__DIR__ . "/../../");
+echo "Working root path=" . $erp_yii_dir . "\n";//exit;
+chdir($erp_yii_dir);//меняем текущую рабочую директорию на $erp_yii_dir
+
+$php_exe_path = PHP_BINARY;
+
+
+require_once __DIR__ . '/../config.inc.php';
+
+if (getenv('MODE') != '' && getenv('MODE') === 'dev') {
+    define('YII_DEBUG', true);
+    $config = require_once __DIR__ . '/../config/dev.console.config.php';
+} else {
+    define('YII_DEBUG', false);
+    $config = require_once __DIR__ . '/../config/prod.console.config.php';
+}
+
+require(__DIR__ . '/../vendor/autoload.php');
+require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
+
+Yii::setAlias('@yii_app', dirname(__DIR__));
+
+$application = new \yii\console\Application($config);
+
+$time = time();
+set_time_limit(3600);//1 час
+
+
+echo "argc=$argc;\n";
+if ($argc == 1) {
+    foreach (glob(__DIR__ . "/tasks/*.php") as $file) {
+        echo "Starting task {$file}\n";
+        $run = $php_exe_path . " " . __FILE__ . " " . $file;
+        //echo $run;
+        $output = [];
+        //Запускам в новом процессе, чтобы не останавливаться при ошибках в файле.
+        echo $php_exe_path . " " . __FILE__ . ' ' . $time . ' "' . $file . '"' . "\n";
+        exec($php_exe_path . " " . __FILE__ . ' ' . $time . ' "' . $file . '"', $output);
+
+        print_r($output);
+        if (count($output) == 1) {
+            //Если это не просто SKIP TASK , то пишем в логи результат.
+            if (substr($output[0], -5, 5) == 'skip;') {//задача не выполнялась. ничего не пишем в лог.
+                $output = [];
+            }
+        }
+        if (count($output) > 0) {
+            $logInfo = implode("\n", $output);
+            $toLog = "log scheduler_".date('Y.m.d')."_.log ". date('d.m.Y H:i:s ') . "  ".$php_exe_path . " " . __FILE__ . ' ' . $time . ' "' . $file . '"'."\n" . iconv('utf-8', 'cp1251', $logInfo) . "\n";
+            echo $toLog;
+        }
+
+    }
+} else {
+    if (isset($argv[2])) {
+        //получаем общее время начала цикла выполнения задач. Важно, т.к. предыдущее задание могло выполняться слишком долго, и минуты съехали.
+        $time = intval($argv[1]);
+        if (file_exists($argv[2])) {
+            echo "RUNNING task {$argv[2]}\n";
+            include_once($argv[2]);
+        } else {
+            echo "Doesnt exists {$argv[2]}\n";
+        }
+    } else {
+        echo "bad argv!";
+    }
+}
+
+//echo "\n 1finish \n";
+//die();
diff --git a/erp24/scripts/tasks/task_01.php b/erp24/scripts/tasks/task_01.php
new file mode 100755 (executable)
index 0000000..267c8a9
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\Admin;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+
+try {
+
+    $dateTask = date('Y-m-d H:i:s');
+    $dateTaskStart = null;
+    $dateTaskStop = null;
+    $log = '';
+    $error = '';
+    $result = 0;
+
+    $description = ' test task ';
+
+
+    echo "time1_" . $time . "_time1 ";
+//    echo date('i', $time);
+
+    $enable = true;
+    $start = false;
+    $force = false;
+
+    $dateTimeMinuet = null;
+    $dateTimeHour = null;
+    $dateTimeMinuet = 20;
+
+    $schedulerTask = SchedulerTask::find()
+        ->andWhere(['task_num' => 1])
+        ->andWhere(['access_from_db' => 1])
+        ->limit(1)
+        ->one();
+
+    if (!empty($schedulerTask)) {
+        $force = $schedulerTask->getForceTask();
+        $enable = $schedulerTask->getActive();
+        $dateTimeMinuet = $schedulerTask->getFrequencyMinuet();
+        $dateTimeHour = $schedulerTask->getFrequencyHour();
+        $dateStart = $schedulerTask->getDateStart();
+        $dateStop = $schedulerTask->getDateStop();
+
+    }
+
+    $minuetTimeInTask = date('i', $time);
+    $fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+
+    if (!empty($dateStart) && !empty($dateStop)) {
+        if($dateStart <= $dateTask && $dateStop >= $dateTask) {
+            $start = (
+                    //Task start conditions:
+                    // date('Gi', $time) == '2300'
+                    date('Gi', $time) == $dateTimeHour
+                    ||
+                    date('i', $time) == $dateTimeMinuet
+                    ||
+                    $force
+                )
+                && $enable;
+        }
+    } else {
+        $start = (
+                //Task start conditions:
+                // date('Gi', $time) == '2300'
+                date('Gi', $time) == $dateTimeHour
+                ||
+                date('i', $time) == $dateTimeMinuet
+                ||
+                $force
+            )
+            && $enable;
+    }
+
+    if ($start) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 01 start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $result = Admin::find()->select(['name'])->count();
+        var_dump($result);
+        $sleepTest = random_int(3, 7);
+        sleep($sleepTest);
+        $info = ' ================ test Task 01 stop ================';
+        echo $info;
+        $log .= $info;
+
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 01 skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = $e->getMessage();
+}
+
+$schedulerTaskLog = new SchedulerTaskLog();
+$schedulerTaskLog->setTaskNum(1)
+    ->setName('Task 01')
+    ->setDateStart($dateTaskStart)
+    ->setDateStop($dateTaskStop)
+    ->setResultNumber($result)
+    ->setDescription($description)
+    ->setDate($dateTask)
+    ->setError($error)
+    ->setLog($log)
+;
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_02_calculate_rating.php b/erp24/scripts/tasks/task_02_calculate_rating.php
new file mode 100755 (executable)
index 0000000..f84cfea
--- /dev/null
@@ -0,0 +1,252 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\ArrayHelper;
+use yii_app\helpers\HtmlHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\AdminRating;
+use yii_app\records\CityStore;
+use yii_app\records\EmployeePosition;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\CabinetService;
+use yii_app\services\ExportImportService;
+use yii_app\services\RatingService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+$taskNum = 2;
+echo "time_" . $taskNum . "_" . $time . "_time_" . $taskNum . " ";
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = false;
+$start = false;
+$force = false;
+
+$enableUpdateRatingLastMonth = false;
+$minuetStartLastMonth = '15';
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+               date('i', $time) == '50'
+            || date('i', $time) == $minuetStartLastMonth
+            || $force
+        )
+        && $enable
+    ) {
+
+        $cabinetService = new CabinetService();
+        $ratingService = $cabinetService->ratingService;
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 02 start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+        // все флористы и администраторы
+
+        $dateFrom = date("Y-m-d", time());
+        $dateTo = date("Y-m-d", time());
+
+        if (date('i', $time) == $minuetStartLastMonth && $enableUpdateRatingLastMonth) {
+            $firstDayOfLastMonth = new DateTime("first day of last month");
+            $dateFrom = $firstDayOfLastMonth->format('Y-m-d');
+            $dateTo = date("Y-m-t", strtotime($dateFrom));
+        }
+
+        $yearSelect = date("Y", strtotime($dateFrom));
+        $monthSelect = date("n", strtotime($dateFrom));
+        $monthWithZeroSelect = date("m", strtotime($dateFrom));
+        $dateFromBeginMonth = date("Y-m-01", strtotime($dateFrom));
+        $dateToEndMonth = date("Y-m-t", strtotime($dateFrom));
+
+        $dateFrom = $dateFromBeginMonth;
+
+        $description = 'Пересчет рейтинга флористов c ' . $dateFrom . ' по ' . $dateTo;
+
+        $ratingCalculateCondition = RatingService::getAllowedCalculateRating($dateFrom);
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task 0' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        $groupIds = Admin::ADMIN_CABINET_GROUP_IDS;
+
+        // пропускать недавно обновлённые, за последние 5 минут
+        $dateCheckReset = date("Y-m-d H:i:s", time() - 600);
+        $dateCheckResetHour = date("Y-m-d H:i:s", time() - 600);
+
+        $ratingList = AdminRating::find()
+            ->andWhere(['date' => $yearSelect . '-' . $monthWithZeroSelect])
+            ->andWhere(['>', 'date_time', $dateCheckReset])
+            ->asArray()
+            ->all();
+
+        $ratingListAdminIds = ArrayHelper::getColumn($ratingList, 'admin_id');
+        $ratingListAdminIdsKeys = array_flip($ratingListAdminIds);
+
+        $notInStoreIds = Admin::NOT_IN_STORE_IDS;
+
+
+        $idsTimeTableArray = (new CabinetService())->getTimetableDataList($dateFrom, $dateTo);
+        $idsTimeTable = ArrayHelper::getColumn($idsTimeTableArray, 'admin_id');
+        $ids = $idsTimeTable;
+
+
+        $admins = Admin::getAdmins($ids, $groupIds, 'ASC', null, $ratingListAdminIds, $notInStoreIds);
+
+
+        $winStoreIdDayChallenge = $cabinetService->getStoreIdDayChallenge($dateFrom, $dateTo);
+
+        $entityCityStore = ExportImportService::getEntityByType('city_store');
+
+        $exportCityStore = ArrayHelper::map($entityCityStore, 'entity_id', 'export_val');
+
+        $entityAdmin = ExportImportService::getEntityByType('admin');
+
+        $exportAdmin = ArrayHelper::map($entityAdmin, 'entity_id', 'export_val');
+
+        $employeePosition = EmployeePosition::getAllIdName();
+        $employeeAdminGroup = AdminGroup::getNames();
+
+        $monthNameSelect = HtmlHelper::getMonthName($monthWithZeroSelect);
+        $cityStoreNames = CityStore::getNames();
+
+        $calculateValue = true;
+
+        $errors = [];
+        $controller = null;
+
+        if ($calculateValue) {
+            foreach ($admins as $employeeSelect) {
+                $employeeId = $employeeSelect['id'];
+                if (array_key_exists($employeeId, $ratingListAdminIdsKeys)) {
+                    continue;
+                }
+                $calculateAdminRow = RatingService::getAllowedCalculateAdminRating($dateFrom, $dateTo, $employeeId);
+                if (!$calculateAdminRow) {
+                    continue;
+                }
+
+                $employeeGroupId = $employeeSelect['group_id'];
+
+                $isAdministrator = Admin::isAdministrator($employeeGroupId);
+                $ratingId = RatingService::getRatingId($employeeGroupId);
+
+                $adminSumGameBonusArray = $cabinetService->getData(
+                    $employeeId,
+                    $employeeSelect,
+                    $employeeGroupId,
+                    $isAdministrator,
+                    $ratingId,
+                    $dateFrom,
+                    $dateTo,
+                    $controller,
+                    $winStoreIdDayChallenge,
+                    $exportCityStore,
+                    $exportAdmin,
+                    $yearSelect,
+                    $monthSelect,
+                    $monthWithZeroSelect,
+                    $monthNameSelect,
+                    $dateFromBeginMonth,
+                    $dateToEndMonth,
+                    $employeePosition,
+                    $employeeAdminGroup,
+                    $cityStoreNames,
+                    false
+                );
+
+                if (is_array($adminSumGameBonusArray) && array_key_exists('errorText', $adminSumGameBonusArray)) {
+                    $errors[] = $adminSumGameBonusArray['errorText'];
+                } else {
+                    $cabinetService->ratingService->setRatingValue($employeeId, $adminSumGameBonusArray, $ratingId, $yearSelect, $monthSelect, $monthWithZeroSelect);
+
+                    echo "\n setRatingValue " . $employeeId . " \n";
+                }
+            }
+        }
+
+        $cabinetService->ratingService->calculateRating($yearSelect, $monthWithZeroSelect);
+
+        $countAdminRating = AdminRating::find()
+            ->andWhere(['date' => $yearSelect . '-' . $monthWithZeroSelect])
+            ->andWhere(['<', 'date_time', $dateCheckResetHour])
+            ->asArray()
+            ->all();
+
+        if (!empty($errors)) {
+            $infoError .= 'errors count ' . count($errors);
+            $error .= $infoError;
+            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+            $error .= $valueErrors;
+        }
+
+        if (!empty($countAdminRating)) {
+            $infoText .= ($countAdminRating > 0) ? ' found user with old rating ' . count($countAdminRating) : 'ok!';
+        }
+
+        $info = ' ================ test Task 02 stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 02 skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage();
+}
+
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task 0' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_03_save_change_group.php b/erp24/scripts/tasks/task_03_save_change_group.php
new file mode 100755 (executable)
index 0000000..c8d7315
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\actions\cabinet\SyncAction;
+use yii_app\records\Admin;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\HistoryService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+
+echo "time3_" . $time . "_time3 ";
+
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$resultString = '';
+$result = 0;
+$resultArray = [];
+
+$description = ' test task 03';
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+echo date('i', $time);
+try {
+
+    $dateTimeMinuet = null;
+    $dateTimeHour = null;
+    $dateTimeMinuet = 40;
+
+    $schedulerTask = SchedulerTask::find()
+        ->andWhere(['task_num' => 3])
+        ->andWhere(['access_from_db' => 1])
+        ->limit(1)
+        ->one();
+
+    if (!empty($schedulerTask)) {
+        $force = $schedulerTask->getForceTask();
+        $enable = $schedulerTask->getActive();
+        $dateTimeMinuet = $schedulerTask->getFrequencyMinuet();
+        $dateTimeHour = $schedulerTask->getFrequencyHour();
+        $dateStart = $schedulerTask->getDateStart();
+        $dateStop = $schedulerTask->getDateStop();
+    }
+
+    if (!empty($dateStart) && !empty($dateStop)) {
+        if($dateStart <= $dateTask && $dateStop >= $dateTask) {
+            $start = (
+                    //Task start conditions:
+                    // date('Gi', $time) == '2300'
+                    date('Gi', $time) == $dateTimeHour
+                    ||
+                    date('i', $time) == $dateTimeMinuet
+                    ||
+                    $force
+                )
+                && $enable;
+        }
+    } else {
+        $start = (
+                //Task start conditions:
+                 date('Gi', $time) == '2300'
+//                date('Gi', $time) == $dateTimeHour
+//                ||
+//                date('i', $time) == $dateTimeMinuet
+                ||
+                $force
+            )
+            && $enable;
+    }
+
+    if ($start) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 03 start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $admins = Admin::find()->all();
+
+        foreach ($admins as $admin) {
+//            $resultArray[] = SyncAction::changeGroup($admin->id, $admin->group_id);
+            HistoryService::setHistoryUserInfo($admin);
+
+        }
+        $info = ' ================ test Task 03 stop ================';
+        echo $info;
+        $log .= $info;
+
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 03 skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = $e->getMessage();
+}
+
+if (!empty($resultArray)) {
+    $resultString = json_encode($resultArray,JSON_UNESCAPED_UNICODE);
+}
+
+$schedulerTaskLog = new SchedulerTaskLog();
+$schedulerTaskLog->setTaskNum(3)
+    ->setName('Task 03')
+    ->setDateStart($dateTaskStart)
+    ->setDateStop($dateTaskStop)
+    ->setResultNumber($result)
+    ->setResult($resultString)
+    ->setDescription($description)
+    ->setDate($dateTask)
+    ->setError($error)
+    ->setLog($log)
+;
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_04_dashboard_sales.php b/erp24/scripts/tasks/task_04_dashboard_sales.php
new file mode 100755 (executable)
index 0000000..9aab158
--- /dev/null
@@ -0,0 +1,155 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\actions\cabinet\SyncAction;
+use yii_app\records\Admin;
+use yii_app\records\DashboardFields;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\DashboardService;
+use yii_app\services\ExportImportService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+
+echo "time4_" . $time . "_time4 ";
+
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$resultString = '';
+$result = 0;
+$resultArray = [];
+
+$timeGi = date('Gi', $time);
+
+$description = ' test task 04';
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+echo date('i', $time);
+try {
+
+    $dateTimeMinuet = null;
+    $dateTimeHour = null;
+    $dateTimeMinuet = 15;
+
+    $schedulerTask = SchedulerTask::find()
+        ->andWhere(['task_num' => 4])
+        ->andWhere(['access_from_db' => 1])
+        ->limit(1)
+        ->one();
+
+    if (!empty($schedulerTask)) {
+        $force = $schedulerTask->getForceTask();
+        $enable = $schedulerTask->getActive();
+        $dateTimeMinuet = $schedulerTask->getFrequencyMinuet();
+        $dateTimeHour = $schedulerTask->getFrequencyHour();
+        $dateStart = $schedulerTask->getDateStart();
+        $dateStop = $schedulerTask->getDateStop();
+    }
+
+
+        $start = (
+            (
+                //Task start conditions:
+                // date('Gi', $time) == '2300'
+//                date('Gi', $time) == $dateTimeHour
+//                ||
+                date('i', $time) == $dateTimeMinuet
+                ||
+                $force
+            )
+            && $enable ) ;
+
+
+    if ($start) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 04 start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $paramDateFrom = null;
+        $paramDateTo = null;
+        $paramMinusDays = null;
+        $dayMonthNum = date("j", time());
+
+//        if ('22' . $dateTimeMinuet == $timeGi) {
+//            $paramDateFrom = date("Y-m-01", time());
+//        }
+
+//        if ('07' . $dateTimeMinuet == $timeGi && $dayMonthNum > 7) {
+//            $paramMinusDays = 7;
+//        }
+
+        if ('09' . $dateTimeMinuet == $timeGi && $dayMonthNum > 3) {
+            $paramMinusDays = 3;
+        }
+
+        if ('10' . $dateTimeMinuet == $timeGi) {
+            $paramMinusDays = 1;
+        }
+
+        if ('11' . $dateTimeMinuet == $timeGi) {
+            $paramMinusDays = 1;
+        }
+
+        $log .= ' paramDateFrom ' . $paramDateFrom;
+        $log .= ' paramDateTo ' . $paramDateTo;
+        $log .= ' paramMinusDays ' . $paramMinusDays;
+
+        run($paramDateFrom, $paramDateTo, $paramMinusDays);
+
+        $info = ' ================ test Task 04 stop ================';
+        echo $info;
+        $log .= $info;
+
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 04 skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = $e->getMessage();
+    $error .= ' file:' . $e->getFile();
+    $error .= ' line:' . $e->getLine();
+    $error .= ' Trace:' . $e->getTraceAsString();
+}
+
+if (!empty($resultArray)) {
+    $resultString = json_encode($resultArray,JSON_UNESCAPED_UNICODE);
+}
+
+$schedulerTaskLog = new SchedulerTaskLog();
+$schedulerTaskLog->setTaskNum(4)
+    ->setName('Task 04')
+    ->setDateStart($dateTaskStart)
+    ->setDateStop($dateTaskStop)
+    ->setResultNumber($result)
+    ->setResult($resultString)
+    ->setDescription($description)
+    ->setDate($dateTask)
+    ->setError($error)
+    ->setLog($log)
+;
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
+
+function run($paramDateFrom, $paramDateTo, $paramMinusDays) {
+
+
+    DashboardService::setData($paramDateFrom, $paramDateTo, $paramMinusDays);
+
+}
diff --git a/erp24/scripts/tasks/task_05_set_retail_price_write_off.php b/erp24/scripts/tasks/task_05_set_retail_price_write_off.php
new file mode 100755 (executable)
index 0000000..caa2e9b
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\Admin;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\records\WriteOffs;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+
+try {
+
+    $dateTask = date('Y-m-d H:i:s');
+    $dateTaskStart = null;
+    $dateTaskStop = null;
+    $log = '';
+    $error = '';
+    $result = 0;
+
+    $description = ' test task ';
+    $resultText = '';
+
+    echo "time5_" . $time . "_time5 ";
+//    echo date('i', $time);
+
+    $enable = true;
+    $start = false;
+    $force = true;
+
+    $dateTimeMinuet = null;
+    $dateTimeHour = null;
+    $dateTimeMinuet = 35;
+
+    $schedulerTask = SchedulerTask::find()
+        ->andWhere(['task_num' => 5])
+        ->andWhere(['access_from_db' => 1])
+        ->limit(1)
+        ->one();
+
+    if (!empty($schedulerTask)) {
+        $force = $schedulerTask->getForceTask();
+        $enable = $schedulerTask->getActive();
+        $dateTimeMinuet = $schedulerTask->getFrequencyMinuet();
+        $dateTimeHour = $schedulerTask->getFrequencyHour();
+        $dateStart = $schedulerTask->getDateStart();
+        $dateStop = $schedulerTask->getDateStop();
+
+    }
+
+    $minuetTimeInTask = date('i', $time);
+    $fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+
+    if (!empty($dateStart) && !empty($dateStop)) {
+        if($dateStart <= $dateTask && $dateStop >= $dateTask) {
+            $start = (
+                    //Task start conditions:
+                    // date('Gi', $time) == '2300'
+                    date('Gi', $time) == $dateTimeHour
+                    ||
+                    date('i', $time) == $dateTimeMinuet
+                    ||
+                    $force
+                )
+                && $enable;
+        }
+    } else {
+        $start = (
+                //Task start conditions:
+                // date('Gi', $time) == '2300'
+                date('Gi', $time) == $dateTimeHour
+                ||
+                date('i', $time) == $dateTimeMinuet
+                ||
+                $force
+            )
+            && $enable;
+    }
+
+    if ($start) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 05 start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+        $log .= ' ' . $dateTaskStart;
+
+        $resultArray = WriteOffs::setRetailPriceWriteOff();
+
+        $resultText = json_encode($resultArray,JSON_UNESCAPED_UNICODE);
+
+        $info = ' ================ test Task 05 stop ================';
+        echo $info;
+        $log .= $info;
+
+        $dateTaskStop = date('Y-m-d H:i:s');
+        $log .= $dateTaskStop;
+    } else {
+        $info = '   Task 05 skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = $e->getMessage();
+}
+
+$schedulerTaskLog = new SchedulerTaskLog();
+$schedulerTaskLog->setTaskNum(5)
+    ->setName('Task 05')
+    ->setDateStart($dateTaskStart)
+    ->setDateStop($dateTaskStop)
+    ->setResult($resultText)
+    ->setDescription($description)
+    ->setDate($dateTask)
+    ->setError($error)
+    ->setLog($log)
+;
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_06_set_payroll_by_day.php b/erp24/scripts/tasks/task_06_set_payroll_by_day.php
new file mode 100755 (executable)
index 0000000..2f6993a
--- /dev/null
@@ -0,0 +1,171 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\ArrayHelper;
+use yii_app\forms\payroll\YearMonthSearchForm;
+use yii_app\helpers\DateHelper;
+use yii_app\helpers\HtmlHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\AdminRating;
+use yii_app\records\AdminPayrollDays;
+use yii_app\records\CityStore;
+use yii_app\records\EmployeePosition;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\AdminPayrollDaysService;
+use yii_app\services\CabinetService;
+use yii_app\services\ExportImportService;
+use yii_app\services\PayrollService;
+use yii_app\services\RatingService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 6;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$nmDayStopCalculateLastMonth = 7;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+$condition2 = (date('Gi', $time) == '1030' && date("d") < $nmDayStopCalculateLastMonth);
+
+
+
+try {
+    if (
+        (
+                date('Gi', $time) == '1550'
+            ||
+                $condition2
+            ||
+                $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 0' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+
+
+//
+//        $dateFrom = date("Y-m-01");
+//        $dateTo = date("Y-m-d", strtotime('-1 day'));
+
+        if ($condition2) {
+            $dateFrom = date("Y-m-01", strtotime('-1 month'));
+            $dateTo = date("Y-m-t", strtotime('-1 month'));
+        }  else {
+            $dateFrom = date("Y-m-01");
+            $dateTo = date("Y-m-d");
+        }
+
+//        $dateFrom = "2023-04-01";
+//        $dateTo = "2023-06-01";
+//        $dateTo = date("Y-m-t", strtotime($dateFrom));
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task 0' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+
+
+        $allowedUpdate = true;
+
+        if (false === $allowedUpdate) {
+            echo 'сейчас ' . date("Y-m-d H:i:s");
+            echo '<br>';
+            echo 'выбрана дата начала обновления ведомости ' . $dateFrom;
+            echo '<br>';
+            die('info: обновление запрещено !');
+        }
+
+
+
+
+        $result = AdminPayrollDaysService::setAdminPayrollDays($dateFrom, $dateTo);
+
+        $errorsCount = $result['errorsCount'];
+        $errors = $result['errors'];
+
+        if (!empty($errorsCount)) {
+            $infoError .= 'errors count ' . $errorsCount;
+            $error .= $infoError;
+            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+            $error .= $valueErrors;
+        }
+
+
+        $infoText .= ' dateFrom = ' . $dateFrom . ' dateTo ' . $dateTo . 'errors count ' . $errorsCount;
+
+
+        $info = ' ================ test Task 0' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 0' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task 0' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_07_test.php b/erp24/scripts/tasks/task_07_test.php
new file mode 100644 (file)
index 0000000..5545d48
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\ArrayHelper;
+use yii_app\forms\payroll\YearMonthSearchForm;
+use yii_app\helpers\DateHelper;
+use yii_app\helpers\HtmlHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\AdminRating;
+use yii_app\records\AdminPayrollDays;
+use yii_app\records\CityStore;
+use yii_app\records\EmployeePosition;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\CabinetService;
+use yii_app\services\ExportImportService;
+use yii_app\services\PayrollService;
+use yii_app\services\RatingService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 7;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+                date('Gi', $time) == '0710'
+//            ||
+//        date('i', $time) == '30'
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 0' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+        // все флористы и администраторы
+
+            $infoText .= ' test ';
+
+
+        $info = ' ================ test Task 0' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 0' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task 0' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_08_messager_user_subscription_check.php b/erp24/scripts/tasks/task_08_messager_user_subscription_check.php
new file mode 100644 (file)
index 0000000..9dd79ed
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+
+/* @var $time integer */
+
+use GuzzleHttp\Client;
+use yii_app\helpers\ClientHelper;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\LogService;
+use yii_app\records\MessagerUser;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 8;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = false;
+$start = false;
+$force = true;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            date('Gi', $time) == '0710'
+//            ||
+//        date('i', $time) == '30'
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 0' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+        // все флористы и администраторы
+
+        $infoText .= ' test ';
+
+//////////////////////////////////////////////
+        $client = new Client;
+        $diff_time = 24 * 60 * 60; // 1 day
+        $current_time = time();
+        $date_from = $current_time - $diff_time;
+        $date_to   = $current_time;
+        $body = $client->request('GET', 'https://chatter.salebot.pro/api/325aa5519d0e65ea8c4759a3e6143584/subscribers?date_to=' . $date_to . '&date_from=' . $date_from)->getBody();
+        $result = '';
+        while (!$body->eof()) {
+            $result .= $body->read(10000);
+        }
+        $json = json_decode($result, true);
+        foreach ($json as $data) {
+            $client_id = $data['id'];
+            $client_type = $data['client_type'];
+
+            $phone = ClientHelper::phoneClear($data['variables']['phone'] ?? '');
+            $is_subscribed = ($data['variables']['notSubscribed'] ?? '0') != '1';
+
+            $messagerUser = MessagerUser::find()->where(['client_id' => $client_id])->one();
+            if (!$messagerUser) {
+                $messagerUser = new MessagerUser();
+                $messagerUser->client_id = $client_id;
+            }
+            $messagerUser->phone = empty($phone) ? '' : $phone;
+
+            if ($client_type == 1) {
+                $messagerUser->client_type = 1;
+                $messagerUser->is_subscribed = $is_subscribed ? 1 : 0;
+
+                $body2 = $client->request('GET', 'https://chatter.salebot.pro/api/325aa5519d0e65ea8c4759a3e6143584/get_variables?client_id=' . $client_id)->getBody();
+                $result2 = '';
+                while (!$body2->eof()) {
+                   $result2 .= $body2->read(10000);
+                }
+                $json2 = json_decode($result2, true);
+                if (isset($json2['platform_id'])) {
+                    $messagerUser->platform_id = $json2['platform_id'];
+                }
+
+                $messagerUser->save();
+                if ($messagerUser->getErrors()) {
+                    LogService::apiErrorLog(json_encode(["error_id" => 1, "error" => $messagerUser->getErrors()], JSON_UNESCAPED_UNICODE));
+                }
+            }
+        }
+//////////////////////////////////////////////
+
+
+        $info = ' ================ test Task 0' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 0' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task 0' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_09_contest001_update.php b/erp24/scripts/tasks/task_09_contest001_update.php
new file mode 100644 (file)
index 0000000..b0324f8
--- /dev/null
@@ -0,0 +1,166 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\Contest001;
+use yii_app\records\Sales;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\records\Users;
+use yii_app\records\UsersBonus;
+use yii_app\services\LogService;
+use yii_app\records\MessagerUser;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 9;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = true;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            ((int)date('i', $time) % 5) == 0
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task 0' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+        // все флористы и администраторы
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        $sales = Sales::find()->where(['>', 'date', '2023-10-23 00:00:00'])->andWhere(['<=', 'date', '2024-01-07 23:59:59'])
+            ->andWhere(['operation' => 'Продажа'])->andWhere(['>=', 'summ', '2500'])->orderBy(['date' => SORT_ASC])->all();
+        $returns = Sales::find()->where(['>', 'date', '2023-10-23 00:00:00'])->andWhere(['<=', 'date', '2024-01-07 23:59:59'])
+            ->andWhere(['operation' => 'Возврат'])->all();
+
+        $returnCheckIds = [];
+        foreach ($returns as $return) {
+            $returnCheckIds[] = $return->id;
+        }
+
+        $max_number = 0;
+
+        $contests = [];
+        foreach (Contest001::find()->all() as $contest) {
+            $max_number = max($contest->number, $max_number);
+            $check_json = json_decode($contest->checks_json, true);
+            if (isset($check_json['check_id'])) {
+                $contests[$check_json['check_id']] = $contest;
+            }
+        }
+
+        foreach ($sales as $sale) {
+            if (isset($contests[$sale->id])) {
+                if (in_array($sale->id, $returnCheckIds)) {
+                    $contests[$sale->id]->delete();
+                    unset($contests[$sale->id]);
+                }
+            } else {
+                if (!in_array($sale->id, $returnCheckIds)) {
+                    $contentNew = new Contest001;
+                    $userBonus = UsersBonus::find()->where(['check_id' => $sale->id])->one();
+                    if ($userBonus) {
+                        $contentNew->phone = $userBonus->phone;
+
+                        $messagerUser = MessagerUser::find()->where(['phone' => $userBonus->phone])->one();
+
+                        $contentNew->client_id = $messagerUser ? $messagerUser->client_id : 0;
+
+                        $user = Users::find()->where(['phone' => $userBonus->phone])->one();
+
+                        $contentNew->name = !empty($user->name_name) ?
+                            $user->name_name :
+                            (\yii_app\services\NameUtils::getShortNameAdmin($user->name ?? '') ?? '');
+
+                        $contentNew->number = $max_number + 1;
+                        $max_number++;
+
+                        $contentNew->checks_json = json_encode([
+                            'check_id' => $sale->id,
+                            'summ' => $sale->summ,
+                            'sale_date' => $sale->date,
+                            'online' => !empty($sale->order_id),
+                            'store_id_1c' => $sale->store_id_1c
+                        ], JSON_UNESCAPED_UNICODE);
+
+                        $contentNew->save();
+                        if ($contentNew->getErrors()) {
+                            LogService::apiErrorLog(json_encode(["error_id" => 3, "error" => $contentNew->getErrors()], JSON_UNESCAPED_UNICODE));
+                        } else {
+                            $contests[$sale->id] = $contentNew;
+                        }
+                    }
+                }
+            }
+        }
+
+        //////////////////////////////////////////////
+
+
+        $info = ' ================ test Task 0' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task 0' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task 0' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_10_bonus_add.php b/erp24/scripts/tasks/task_10_bonus_add.php
new file mode 100644 (file)
index 0000000..5d375ff
--- /dev/null
@@ -0,0 +1,182 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\SchedulerTaskLog;
+use yii_app\records\UsersBonus;
+use yii_app\records\UsersEvents;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 10;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = true;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+const DAYS_BEFORE = 2;
+const DAYS_AFTER = 1;
+
+try {
+    if (
+        (
+            ((int)date('i', $time) % 2) == 0
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        $date_day_now = (int)date("d", time());   // Сегодняшний день
+        $date_month_now = (int)date("m", time()); // Сегодняшний месяц
+
+        $userEventsQuery = UsersEvents::find()->select(['phone', 'date', 'date_add', 'date_day', 'date_month'])
+            ->where(['and', ['date_day' => $date_day_now], ['date_month' => $date_month_now]]);
+
+        for ($ind = 1; $ind <= DAYS_BEFORE; $ind++) {
+            $t = 86400 * $ind;
+            $date_day = (int)date("d",time() + $t);   // день за DAYS_BEFORE и меньше дней до памятной даты
+            $date_month = (int)date("m",time() + $t); // месяц тоже самое
+            echo "\nИщем события на дату $date_day.$date_month";
+
+            $userEventsQuery = $userEventsQuery->orWhere(['and', ['date_day' => $date_day], ['date_month' => $date_month]]);
+        }
+
+        $userEvents = $userEventsQuery->all();
+
+        foreach ($userEvents as $event) {
+            echo "\n  " . $event->phone . " " . $event->date . "  " . $event->date_add . "  ";
+
+            $date_end = date("Y-m-d 23:59:59",
+                strtotime(date("Y", time() + DAYS_AFTER * 86400)
+                    . "-" . $event->date_month . "-" . $event->date_day) + 86400 * DAYS_AFTER);
+            $date_start = date("Y-m-d", time());
+
+            $tip = "plus";
+            $bonus = 200;
+            $ip = "tst";
+            $tip_sale = "date";
+            echo "\n date_start=$date_start date_end=$date_end";
+
+            $userBonus = UsersBonus::find()->select(['date'])->where(['phone' => $event->phone])->andWhere(['tip' => $tip])
+                ->andWhere(['tip_sale' => $tip_sale])->andWhere(['date_end' => $date_end])->one();
+
+            $do = false;
+
+            $name = "Автоматическое начисление бонусов на дату " . date("Y", time() + DAYS_AFTER * 86400)
+                . "-" . $event->date_month . "-" . $event->date_day . " на " . (DAYS_BEFORE + DAYS_AFTER + 1) . " дня";
+            // если дата еще не вносилась
+            if (!$userBonus) {
+                $do = true;
+            }
+            // проверяем были ли начислены бонусы на сегодняшнюю дату от вчера до DAYS_BEFORE до этого
+            $userBonus2Query = UsersBonus::find()->select(['date', 'date_end', 'date_start'])->where(['phone' => $event->phone])->andWhere(['tip' => $tip])
+                ->andWhere(['tip_sale' => $tip_sale]);
+
+            for ($ind = 1; $ind <= DAYS_BEFORE; $ind++) {
+                $date_start_old = date("Y-m-d",time() - 86400 * $ind);
+                $userBonus2Query = $userBonus2Query->andWhere(['date_start' => $date_start_old]);
+            }
+
+            $userBonus2 = $userBonus2Query->one();
+            if ($userBonus2) {
+                // если от вчера до DAYS_BEFORE было начисление, то сегодня не начисляем
+                $do = false;
+                $info = "есть ли cтарая дата ???  date_start=" . $userBonus2->date_start . "   date=" . $userBonus2->date
+                    . "  date_end=" . $userBonus2->date_end . "===";
+                echo $info;
+                $log .= $info;
+            }
+
+            if ($do) {
+                $userBonus4 = new UsersBonus;
+                $userBonus4->phone = '' . $event->phone;
+                $userBonus4->name = $name;
+                $userBonus4->tip = $tip;
+                $userBonus4->tip_sale = $tip_sale;
+                $userBonus4->bonus = $bonus;
+                $userBonus4->date = date('Y-m-d H:i:s');
+                $userBonus4->date_start = $date_start;
+                $userBonus4->date_end = $date_end;
+                $userBonus4->ip = $ip;
+                $userBonus4->save();
+                if ($userBonus4->getErrors()) {
+                    $info = '\n' . json_encode($userBonus4->getErrors(), JSON_UNESCAPED_UNICODE);
+                    echo $info;
+                    $log .= $info;
+                }
+            } else {
+                $info = "\n" . $event->phone . " уже начисляли бонусы на эту дату ";
+                echo $info;
+                //$log .= $info;
+            }
+        }
+        //////////////////////////////////////////////
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_11_bonus_dell.php b/erp24/scripts/tasks/task_11_bonus_dell.php
new file mode 100644 (file)
index 0000000..171aa56
--- /dev/null
@@ -0,0 +1,159 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\SchedulerTaskLog;
+use yii_app\records\UsersBonus;
+use yii_app\records\UsersEvents;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 11;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+const DAYS_BEFORE = 2;
+const DAYS_AFTER = 1;
+
+try {
+    if (
+        (
+            (
+                ((int)date('i', $time) % 30) == 0
+                && (int)date('H', $time) >= 1
+                && (int)date('H', $time) <= 18
+            )
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        // собираем записи  "миносов" - "сгорания" дат по ключу   tip='plus' AND tip_sale='date'  date_start
+        $userBonuses = UsersBonus::find()->select(['phone', 'date_start', 'bonus'])->where(['>', 'bonus', '0'])->andWhere(['tip' => 'minus'])
+            ->andWhere(['tip_sale' => 'date'])
+            ->andWhere(['>=', 'date_start', date('Y-m-d H:i:s', time() - (DAYS_BEFORE + DAYS_AFTER + 1) * 86400)])
+            ->andWhere(['<=', 'date_start', date('Y-m-d H:i:s', time())])
+            ->all();
+        $minusYes = [];
+        foreach ($userBonuses as $userBonus) {
+            $minusYes[$userBonus->phone][$userBonus->date_start] = $userBonus->bonus;
+        }
+        //пробегаемся оп записям начилений для дат "плюс" у которых вышло время начисленных бонусов.
+        $userBonus1 = UsersBonus::find()->select(['id', 'phone', 'date_start', 'date_end', 'bonus', 'dell'])
+            ->where(['tip' => 'plus'])->andWhere(['tip_sale' => 'date'])
+            ->andWhere(['<=', 'date_end', date('Y-m-d H:i:s', time())])
+            ->andWhere(['>=', 'date_end', date('Y-m-d H:i:s', time() - (DAYS_AFTER + 1) * 86400)])
+            ->all();
+        foreach ($userBonus1 as $userBonus) {
+            // если по этой записи на дату старта мы уже вносили запись то выдаем сообщение
+            if (isset($minusYes[$userBonus->phone][$userBonus->date_start]) || $userBonus->dell > 0) {
+                echo "\n" . $userBonus->date_start . " " . $userBonus->phone . " минуc есть";
+            } elseif ($userBonus->bonus > 0) {
+                $sale = UsersBonus::find()->select(['SUM(bonus) as sum', 'phone'])->where(['tip' => 'minus'])
+                    ->andWhere(['tip_sale' => 'sale'])
+                    ->andWhere(['phone' => $userBonus->phone])
+                    ->andWhere(['>=', 'date', $userBonus->date_start])
+                    ->andWhere(['<=', 'date', $userBonus->date_end])
+                    ->groupBy(['phone'])
+                    ->one();
+                // если не вносили формируем запрос на внесение сгорания
+                $name = "Автоматическое сгорание бонусов на дату " . $userBonus->date_start . "";
+                $userBonus2 = new UsersBonus;
+                $userBonus2->phone = $userBonus->phone;
+                $userBonus2->name = $name;
+                $userBonus2->tip_sale = 'date';
+                $userBonus2->tip = 'minus';
+                $userBonus2->bonus = isset($sale) ? max(0, $userBonus->bonus - $sale->sum) : $userBonus->bonus;
+                $userBonus2->date = date('Y-m-d H:i:s');
+                $userBonus2->date_start = $userBonus->date_start;
+                $userBonus2->date_end = $userBonus->date_end;
+                $userBonus2->ip = 'tst2';
+                $userBonus2->save();
+                if ($userBonus2->getErrors()) {
+                    $info = '\n 1: ' . json_encode($userBonus2->getErrors(), JSON_UNESCAPED_UNICODE);
+                    echo $info;
+                    $log .= $info;
+                }
+                $userBonus->dell = '1';
+                $userBonus->date_dell = date('Y-m-d H:i:s');
+                $userBonus->save();
+                if ($userBonus->getErrors()) {
+                    $info = '\n 2: ' . json_encode($userBonus->getErrors(), JSON_UNESCAPED_UNICODE);
+                    echo $info;
+                    $log .= $info;
+                }
+                echo "\n" . $userBonus2->phone . " " . $name;
+            }
+        }
+        //////////////////////////////////////////////
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_12_api_logs_older_month_dell.php b/erp24/scripts/tasks/task_12_api_logs_older_month_dell.php
new file mode 100644 (file)
index 0000000..c1d4689
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\SchedulerTaskLog;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 12;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+const DAYS_BEFORE = 2;
+const DAYS_AFTER = 1;
+
+try {
+    if (
+        (
+            (
+                ((int)date('i', $time) % 30) == 0
+                && (int)date('H', $time) == 1
+            )
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        \yii_app\records\ApiLogs::deleteAll(['<=', 'date', date('Y-m-d 00:00:00', strtotime("-31 day", time()))]);
+        //////////////////////////////////////////////
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task 0' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_13_study_module_notify_obligatory_time_tomorrow.php b/erp24/scripts/tasks/task_13_study_module_notify_obligatory_time_tomorrow.php
new file mode 100644 (file)
index 0000000..a4db7b5
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\Url;
+use yii_app\records\Admin;
+use yii_app\records\Notification;
+use yii_app\records\LessonsGroup;
+use yii_app\records\LessonsPassed;
+use yii_app\services\NotificationService;
+
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 13;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            (
+                ((int)date('i', $time) % 30) == 0
+                && (int)date('H', $time) == 1
+            )
+            || $force
+        )
+        && $enable
+    ) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        $lessonGroupMap = [];
+        foreach (LessonsGroup::find()->where(['status' => LessonsGroup::STATUS_ACTIVE])->all() as $lessonGroup) {
+            $lessonGroupMap[$lessonGroup->id] = $lessonGroup;
+        };
+        $lessonGroupPassed = LessonsPassed::find()->where(['and', ['entity' => 'lesson_group'], ['not in', 'status', [LessonsPassed::STATUS_PASS_SUCCESS]]])->all();
+        $listOfGroups = [];
+        foreach ($lessonGroupPassed as $lgp) {
+            if (date('Y-m-d', strtotime('+1 day', time())) ==
+                date('Y-m-d', strtotime('+'. $lessonGroupMap[$lgp->entity_id]->obligatory_time . ' day', strtotime($lgp->created_at)))) {
+                $listOfGroups[$lgp->admin_id][] = $lgp->entity_id;
+            }
+        }
+        foreach ($listOfGroups as $admin_id => $group_ids) {
+            $addNotificationModel = new Notification(['scenario' => Notification::SCENARIO_ADD]);
+            $addNotificationModel->type = 'news';
+            $addNotificationModel->name = 'Осталось меньше суток до срока прохождения обучения';
+            $addNotificationModel->description = "Информация об обучении";
+            $addNotificationModel->content = 'По группам уроков ниже осталось меньше суток для прохождения:';
+            $lessonGroupNames = '';
+            foreach ($group_ids as $group_id) {
+                $lessonGroupNames .= '<br>«' . $lessonGroupMap[$group_id]->name . '»';
+            }
+            $addNotificationModel->content .= $lessonGroupNames;
+            $addNotificationModel->created_by = 1;
+            $addNotificationModel->created_at = date('Y-m-d H:i:s');
+            $addNotificationModel->send_at = $addNotificationModel->created_at;
+            $addNotificationModel->recipients = [$admin_id];
+            $addNotificationModel->save();
+            NotificationService::initNotification($addNotificationModel);
+
+            $addNotificationModel = new Notification(['scenario' => Notification::SCENARIO_ADD]);
+            $addNotificationModel->type = 'info';
+            $admin = Admin::findOne($admin_id);
+            $addNotificationModel->name = 'У вашего сотрудника «' . $admin->name . '» Осталось меньше суток до срока прохождения обучения';
+            $addNotificationModel->description = "Информация об обучении";
+            $addNotificationModel->content = 'У вашего сотрудника «' . $admin->name . '» осталось меньше суток на прохождение следующих групп уроков:';
+            $addNotificationModel->content .= $lessonGroupNames;
+            $addNotificationModel->created_by = 1;
+            $addNotificationModel->created_at = date('Y-m-d H:i:s');
+            $addNotificationModel->send_at = $addNotificationModel->created_at;
+            $addNotificationModel->recipients = [$admin->parent_admin_id];
+            $addNotificationModel->save();
+            NotificationService::initNotification($addNotificationModel);
+        }
+        //////////////////////////////////////////////
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_14_clear_log.php b/erp24/scripts/tasks/task_14_clear_log.php
new file mode 100755 (executable)
index 0000000..4ec80b2
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\ArrayHelper;
+use yii_app\forms\payroll\YearMonthSearchForm;
+use yii_app\helpers\DateHelper;
+use yii_app\helpers\HtmlHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\AdminRating;
+use yii_app\records\AdminPayrollDays;
+use yii_app\records\CityStore;
+use yii_app\records\EmployeePosition;
+use yii_app\records\ErrorInfoErp;
+use yii_app\records\ErrorLog;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\AdminPayrollDaysService;
+use yii_app\services\CabinetService;
+use yii_app\services\ExportImportService;
+use yii_app\services\PayrollService;
+use yii_app\services\RatingService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 14;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+                date('Gi', $time) == '0200'
+//            ||
+//        date('i', $time) == '30'
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+
+
+
+        $datePast10Days = date("Y-m-d", strtotime('-10 day'));
+        $datePast15Days = date("Y-m-d", strtotime('-15 day'));
+        $datePast1Month = date("Y-m-d", strtotime('-1 month'));
+        $datePast2Month = date("Y-m-d", strtotime('-2 month'));
+        $datePast3Month = date("Y-m-d", strtotime('-3 month'));
+
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+
+
+        //DELETE FROM `scheduler_task_log` WHERE `date` < '2023-05-10 06:55:26'
+        SchedulerTaskLog::deleteAll(['<','date', $datePast1Month]);
+        ErrorInfoErp::deleteAll(['<','date', $datePast1Month]);
+        ErrorLog::deleteAll(['<','log_time', strtotime($datePast1Month)]);
+
+        $errorsCount = null;
+
+        if (!empty($errorsCount)) {
+            $infoError .= 'errors count ' . $errorsCount;
+            $error .= $infoError;
+//            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+//            $error .= $valueErrors;
+        }
+
+
+        $infoText .= 'Clear SchedulerTaskLog before date = ' . $datePast15Days . ' ';
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_15_bonus_dell_promo.php b/erp24/scripts/tasks/task_15_bonus_dell_promo.php
new file mode 100644 (file)
index 0000000..d671628
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\SchedulerTaskLog;
+use yii_app\records\UsersBonus;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 15;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            (
+                ((int)date('i', $time) % 35) == 0
+                && (int)date('H', $time) == 1
+            )
+            || $force
+        )
+        && $enable
+    ) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        $userBonus1 = UsersBonus::find()->select(['id', 'phone', 'date_start', 'date_end', 'bonus', 'dell', 'tip', 'tip_sale'])
+            ->where(['tip' => 'plus'])->andWhere(['not in', 'tip_sale', ['date', 'off']])
+            ->andWhere(['>=', 'date_end', date('Y-m-d 00:00:00', time())])
+            ->andWhere(['<=', 'date_end', date('Y-m-d 23:59:59', time())])
+            ->all();
+        foreach ($userBonus1 as $userBonus) {
+            if ($userBonus->dell > 0) {
+                echo "\n" . $userBonus->date_start . " " . $userBonus->phone . " минуc есть";
+            } else {
+                $sale = UsersBonus::find()->select(['SUM(bonus) as sum', 'phone'])->where(['tip' => 'minus'])
+                    ->andWhere(['tip_sale' => 'sale'])
+                    ->andWhere(['phone' => $userBonus->phone])
+                    ->andWhere(['>=', 'date', $userBonus->date_start])
+                    ->andWhere(['<=', 'date', $userBonus->date_end])
+                    ->groupBy(['phone'])
+                    ->one();
+                $name = "Автоматическое сгорание бонусов на дату " . $userBonus->date_start . "";
+                $userBonus2 = new UsersBonus;
+                $userBonus2->phone = $userBonus->phone;
+                $userBonus2->name = $name;
+                $userBonus2->tip_sale = $userBonus->tip_sale;
+                $userBonus2->tip = 'minus';
+                $userBonus2->bonus = isset($sale) ? max(0, $userBonus->bonus - $sale->sum) : $userBonus->bonus;
+                $userBonus2->date = date('Y-m-d H:i:s');
+                $userBonus2->date_start = $userBonus->date_start;
+                $userBonus2->date_end = $userBonus->date_end;
+                $userBonus2->ip = 'tst2';
+                $userBonus2->save();
+                if ($userBonus2->getErrors()) {
+                    $info = '\n 1: ' . json_encode($userBonus2->getErrors(), JSON_UNESCAPED_UNICODE);
+                    echo $info;
+                    $log .= $info;
+                }
+                $userBonus->dell = '1';
+                $userBonus->date_dell = date('Y-m-d H:i:s');
+                $userBonus->save();
+                if ($userBonus->getErrors()) {
+                    $info = '\n 2: ' . json_encode($userBonus->getErrors(), JSON_UNESCAPED_UNICODE);
+                    echo $info;
+                    $log .= $info;
+                }
+                $info = "\n" . $userBonus2->phone . " " . $name;
+                echo $info;
+                $log .= $info;
+            }
+        }
+        //////////////////////////////////////////////
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_16_1c_request_checks_for_week.php b/erp24/scripts/tasks/task_16_1c_request_checks_for_week.php
new file mode 100644 (file)
index 0000000..f8002f5
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+/* @var $time integer */
+
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 16;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            (
+                ((int)date('i', $time)) == 0
+                && ((int)date('H', $time) % 6) == 1
+            )
+            || $force
+        )
+        && $enable
+    ) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+
+        $json_post = '{"request_id": "' . time() . '", "checks": {"start_time": "' . date("Y-m-d",time() - 86400*7).' 00:00:00", "end_time": "' . date("Y-m-d", time()) . ' 00:00:00"}}';
+
+        $apiCron = new \yii_app\records\ApiCron;
+        $apiCron->date = date('Y-m-d H:i:s');
+        $apiCron->status = 0;
+        $apiCron->json_post = $json_post;
+        $apiCron->save();
+
+        //////////////////////////////////////////////
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_17_set_payroll_info_by_month.php b/erp24/scripts/tasks/task_17_set_payroll_info_by_month.php
new file mode 100755 (executable)
index 0000000..151dc4d
--- /dev/null
@@ -0,0 +1,160 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\ArrayHelper;
+use yii_app\forms\payroll\YearMonthSearchForm;
+use yii_app\helpers\DateHelper;
+use yii_app\helpers\HtmlHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\AdminRating;
+use yii_app\records\AdminPayrollDays;
+use yii_app\records\CityStore;
+use yii_app\records\EmployeePosition;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\AdminPayrollDaysService;
+use yii_app\services\AdminPayrollMonthInfoService;
+use yii_app\services\CabinetService;
+use yii_app\services\ExportImportService;
+use yii_app\services\PayrollService;
+use yii_app\services\RatingService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 17;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+                date('Gi', $time) == '1215'
+//            ||
+//        date('i', $time) == '30'
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+
+
+//
+//        $dateFrom = date("Y-m-01");
+//        $dateTo = date("Y-m-d", strtotime('-1 day'));
+
+        $dateFrom = date("Y-m-01", strtotime('-1 month'));
+        $dateTo = date("Y-m-t", strtotime('-1 month'));
+
+//        $dateFrom = "2023-04-01";
+//        $dateTo = "2023-06-01";
+//        $dateTo = date("Y-m-t", strtotime($dateFrom));
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+
+
+        $allowedUpdate = true;
+
+        if (false === $allowedUpdate) {
+            echo 'сейчас ' . date("Y-m-d H:i:s");
+            echo '<br>';
+            echo 'выбрана дата начала обновления ведомости ' . $dateFrom;
+            echo '<br>';
+            die('info: обновление запрещено !');
+        }
+
+
+
+
+        $result = AdminPayrollMonthInfoService::setAdminPayrollMonth($dateFrom, $dateTo);
+
+        $errorsCount = $result['errorsCount'];
+        $errors = $result['errors'];
+
+        if (!empty($errorsCount)) {
+            $infoError .= 'errors count ' . $errorsCount;
+            $error .= $infoError;
+            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+            $error .= $valueErrors;
+        }
+
+
+        $infoText .= ' dateFrom = ' . $dateFrom . ' dateTo ' . $dateTo . 'errors count ' . $errorsCount;
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_18_newsletters_for_non_tg_users.php b/erp24/scripts/tasks/task_18_newsletters_for_non_tg_users.php
new file mode 100644 (file)
index 0000000..763418e
--- /dev/null
@@ -0,0 +1,200 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\Json;
+use yii_app\records\NewsLetterDeliveryStatus;
+use yii_app\records\Sales;
+use yii_app\records\SchedulerTaskLog;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 18;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = true;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            ((int)date('i', $time) % 5) == 0
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        $sales = Sales::find()->joinWith(['users'])->where(['source' => '0'])->andWhere(['!=', 'sales.phone', ''])
+            ->andWhere(['>=', 'sales.date', date('Y-m-d H:i:s', strtotime('-15 minute', time()))])
+            ->all();
+
+        /* отправка на телеграм, вайбер, смс */
+        $client = new \GuzzleHttp\Client([
+            'base_url' => 'https://msg.messaggio.com',
+            'headers' => [
+                'Content-type' => 'application/json',
+                'Messaggio-Login' => 'cj8eebdipr1s73fbj470'
+            ]
+        ]);
+
+        $newsLetterDeliveryStatuses = [];
+        foreach (NewsLetterDeliveryStatus::find()->all() as $newsStatus) {
+            $newsLetterDeliveryStatuses[$newsStatus->phone] = $newsStatus;
+        }
+
+        foreach ($sales as $sale) {
+            /* @var $sale Sales */
+
+            if (isset($newsLetterDeliveryStatuses[$sale->phone]) && $newsLetterDeliveryStatuses[$sale->phone]->status > 0) {
+                continue;
+            }
+
+            $name = $sale->users->name ?? 'дорогой клиент';
+
+            $x = [
+                "recipients" => [
+                    [
+                        "phone" => "" . $sale->phone
+                    ]
+                ],
+                "channels" => [
+                    "viber",
+                    "vk",
+                    "sms",
+                ],
+                "viber" => [
+                    "from" => "cjmt88fvg2cc739hqj30",
+                    "label" => "promotion",
+                    "content" => [
+                        [
+                            "type" => "text",
+                            "text" => "Привет, " . $name . "! Покупаете цветы, но не списываете бонусы? Переходите в чат-бот, "
+                                . "чтобы узнать свой бонусный баланс и получить скидку до 20% на следующие покупки в Базе Цветов 24.ру.",
+                        ],
+                        [
+                            "type" => "button",
+                            "button" => [
+                                "caption" => "Дарим 1000 рублей на цветы!",
+                                "callback" => "https://bc24.su/chat_bot_rass"
+                            ]
+                        ],
+                        [
+                            "type" => "image",
+                            "image" => [
+                                "url" => "https://example.com/cat.jpg"
+                            ]
+                        ]
+                    ]
+                ],
+                "vk" => [
+                    "from" => "bazacvetov24",
+                    "content" => [
+                        [
+                            "type" => "text",
+                            "text" => "Привет, " . $name . "! Покупаете цветы, но не списываете бонусы? Переходите в чат-бот, "
+                                . "чтобы узнать свой бонусный баланс и получить скидку до 20% на следующие покупки в Базе Цветов 24.ру."
+                                . "Дарим 1000 рублей на цветы! https://bc24.su/chat_bot_rass",
+                        ]
+                    ]
+                ],
+                "sms" => [
+                    "from" => "cjmsbfbdkjhc73bmeuag",
+                    "content" => [
+                        [
+                            "type" => "text",
+                            "text" => "Привет, " . $name . "! Покупаете цветы, но не списываете бонусы? Переходите в чат-бот, "
+                                . "чтобы узнать свой бонусный баланс и получить скидку до 20% на следующие покупки в Базе Цветов 24.ру."
+                                . "Дарим 1000 рублей на цветы! https://bc24.su/chat_bot_rass",
+                        ]
+                    ]
+                ]
+            ];
+
+            $responseJsonText = $client->request('POST', "https://msg.messaggio.com/api/v1/send", [
+                'body' => Json::encode($x)
+            ])->getBody()->getContents();
+            $responseJson = Json::decode($responseJsonText);
+            foreach ($responseJson['messages'] as $message) {
+                $isDelivered = isset($message['message_id']);
+                $newLetterDeliveryStatus = new NewsLetterDeliveryStatus;
+                $newLetterDeliveryStatus->phone = $message['recipient']['phone'];
+                $newLetterDeliveryStatus->sent_at = date("Y-m-d H:i:s");
+                $newLetterDeliveryStatus->check_guid = $sale->id;
+
+                /*  $isDelivered ? запись результатов попытки в news_letter_delivery_status:status =  1 */
+                /* !$isDelivered ? запись результатов попытки в news_letter_delivery_status:status = -1 */
+                $newLetterDeliveryStatus->status = $isDelivered ? 1 : -1 ;
+
+                $newLetterDeliveryStatus->save();
+            }
+        }
+        //////////////////////////////////////////////
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum . ' ' . basename(__FILE__))
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_19_set_sales_history.php b/erp24/scripts/tasks/task_19_set_sales_history.php
new file mode 100755 (executable)
index 0000000..2e6d52f
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\ArrayHelper;
+use yii_app\forms\payroll\YearMonthSearchForm;
+use yii_app\helpers\DateHelper;
+use yii_app\helpers\HtmlHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\AdminRating;
+use yii_app\records\AdminPayrollDays;
+use yii_app\records\CityStore;
+use yii_app\records\EmployeePosition;
+use yii_app\records\SalesHistory;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\services\AdminPayrollDaysService;
+use yii_app\services\CabinetService;
+use yii_app\services\ExportImportService;
+use yii_app\services\InfoLogService;
+use yii_app\services\PayrollService;
+use yii_app\services\RatingService;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 19;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = false;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+//            date('Gi', $time) == '0850'
+//            ||
+        date('i', $time) == '30'
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+
+
+
+        $datePast1Day = date("Y-m-d 00:00:00", strtotime('-1 day'));
+        $datePast10Days = date("Y-m-d 00:00:00", strtotime('-10 day'));
+        $datePast15Days = date("Y-m-d 00:00:00", strtotime('-15 day'));
+        $datePast2Month = date("Y-m-d 00:00:00", strtotime('-2 month'));
+        $datePast3Month = date("Y-m-d 00:00:00", strtotime('-3 month'));
+
+        $dateFromPast1Month = date("Y-m-01 00:00:00", strtotime('-1 month'));
+        $dateToPast1Month = date("Y-m-t 00:00:00", strtotime('-1 month'));
+
+        InfoLogService::setInfoLog(__FILE__, __LINE__, 'task 19 start' , 'info task start sales history');
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            InfoLogService::setInfoLog(__FILE__, __LINE__, 'task 19 first save' , 'info task start sales history');
+            $schedulerTaskLog->save();
+        } else {
+            InfoLogService::setInfoLog(__FILE__, __LINE__, $schedulerTaskLog->errors , 'task 19 first false info task start sales history');
+        }
+
+        $result = SalesHistory::setSaleHistory($dateFromPast1Month, $dateToPast1Month);
+
+        if (!empty($result['infoError'])) {
+            $error .= $result['infoError'];
+        }
+
+        if (!empty($result['infoTextFull'])) {
+            $description .= $result['infoTextFull'];
+        }
+
+        $infoText .= $result['infoText'] . ' seh sales history date = ' . $dateFromPast1Month . '  ' . $dateToPast1Month . ' ';
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage();
+}
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_20_give_500_to_referral_program_participants.php b/erp24/scripts/tasks/task_20_give_500_to_referral_program_participants.php
new file mode 100644 (file)
index 0000000..53b0299
--- /dev/null
@@ -0,0 +1,165 @@
+<?php
+
+/* @var $time integer */
+
+use yii\helpers\Json;
+use yii\helpers\ArrayHelper;
+use yii_app\records\ReferralStatus;
+use yii_app\records\Sales;
+use yii_app\records\SchedulerTaskLog;
+use yii_app\records\UsersBonus;
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time_" . $time . "_time ";
+$taskNum = 20;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = false;
+$start = false;
+$force = true;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            ((int)date('i', $time) % 5) == 0
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        //////////////////////////////////////////////
+        $date_start = date("Y-m-d 00:00:00", strtotime('-3 day', time()));
+        $date_end   = date("Y-m-d 23:59:59", strtotime('-3 day', time()));
+        $sales = Sales::find()->select([
+            'sale_id' => 'sales.id',
+            'user_id' => 'users.id',
+            'referral_id' => 'users.referral_id',
+            'user_phone' => 'users.phone',
+            'referral_phone' => 'referral.phone'
+        ])
+            ->innerJoin('users', 'users.phone = sales.phone')
+            ->innerJoin('users referral', 'referral.id = users.referral_id')
+            ->where(['between', 'sales.date', $date_start, $date_end])
+            ->andWhere(['>=', 'summ', 2000])
+            ->andWhere(['operation' => 'Продажа'])
+            ->asArray()
+            ->all();
+        $sale_user_ids = ArrayHelper::getColumn($sales, 'user_id');
+        $returns = Sales::find()->select(['sales_check'])
+            ->where(['>=', 'date', $date_start])
+            ->andWhere(['operation' => 'Возврат'])
+            ->all();
+        $return_ids = ArrayHelper::getColumn($returns, 'sales_check');
+        $usersWithBonusIds = ArrayHelper::getColumn(ReferralStatus::find()->select(['user_id'])->where(['in', 'user_id', $sale_user_ids])->all(),'user_id');
+        foreach ($sales as $sale) {
+            if (!in_array($sale->sale_id, $return_ids) && !in_array($sale->user_id, $usersWithBonusIds)) {
+                $referralStatus = new ReferralStatus;
+                $referralStatus->user_id = $sale->user_id;
+                $referralStatus->referral_id = $sale->referral_id;
+                $referralStatus->check_id = $sale->sale_id;
+                $referralStatus->save();
+                if ($referralStatus->getErrors()) {
+                    $log .= Json::encode($referralStatus->getErrors());
+                }
+                $usersWithBonusIds []= $referralStatus->user_id;
+
+                $userBonus = new UsersBonus;
+                $userBonus->phone = "" . $sale->user_phone;
+                $userBonus->name = "500 бонусов другу за участие в реферальной программе";
+                $userBonus->date = date('Y-m-d H:i:s');
+                $userBonus->site_id = 1;
+                $userBonus->setka_id = 1;
+                $userBonus->tip = 'plus';
+                $userBonus->tip_sale = 'referral';
+                $userBonus->bonus = 500;
+                $userBonus->date_start = $userBonus->date;
+                $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+366 day', strtotime($userBonus->date)));
+                $userBonus->save();
+                if ($userBonus->getErrors()) {
+                    $log .= Json::encode($userBonus->getErrors());
+                }
+
+                $userBonus = new UsersBonus;
+                $userBonus->phone = "" . $sale->referral_phone;
+                $userBonus->name = "500 бонусов за участие в реферальной программе";
+                $userBonus->date = date('Y-m-d H:i:s');
+                $userBonus->site_id = 1;
+                $userBonus->setka_id = 1;
+                $userBonus->tip = 'plus';
+                $userBonus->tip_sale = 'referral';
+                $userBonus->bonus = 500;
+                $userBonus->date_start = $userBonus->date;
+                $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+366 day', strtotime($userBonus->date)));
+                $userBonus->save();
+                if ($userBonus->getErrors()) {
+                    $log .= Json::encode($userBonus->getErrors());
+                }
+            }
+        }
+        //////////////////////////////////////////////
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' >>> ' . $e->getLine();
+}
+
+
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum . ' ' . basename(__FILE__))
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
diff --git a/erp24/scripts/tasks/task_21_calculation_company_data_for_chart.php b/erp24/scripts/tasks/task_21_calculation_company_data_for_chart.php
new file mode 100644 (file)
index 0000000..a30de8a
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * @var $time integer
+ */
+
+use yii_app\records\ChartDataSearch;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 21;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+$time_start = '0300';
+try {
+    if (
+        (
+            date('Gi', $time) == $time_start
+            || $force
+        )
+        && $enable
+    ) {
+
+
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        if (date('Y-m-02') == date('Y-m-d', strtotime('today'))) {
+            $dateStart = date('Y-m-d', strtotime('first day of previous month'));
+            $dateEnd = date('Y-m-01');
+        } else {
+            $dateStart = date('Y-m-d', strtotime('yesterday -1 day'));
+            $dateEnd = date('Y-m-d', strtotime('yesterday'));
+        }
+
+        $log .= ChartDataSearch::CalculationCompanyDataForCharts($dateStart, $dateEnd);
+
+        $errorsCount = null;
+
+        if (!empty($errorsCount)) {
+            $infoError .= 'errors count ' . $errorsCount;
+            $error .= $infoError;
+//            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+//            $error .= $valueErrors;
+        }
+
+
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage();
+}
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
\ No newline at end of file
diff --git a/erp24/scripts/tasks/task_22_create_employee_for_1c_with_admins_with_empty_guid.php b/erp24/scripts/tasks/task_22_create_employee_for_1c_with_admins_with_empty_guid.php
new file mode 100644 (file)
index 0000000..701d0f0
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+
+/**
+ * @var $time integer
+ */
+
+use yii_app\helpers\DataHelper;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\EmployeeOnShift;
+use yii_app\records\ExportImportTable;
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 22;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            ((int)date('i', $time) % 5) == 0
+            || $force
+        )
+        && $enable
+    ) {
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $infoText .= ' test ';
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        //////////////////////////////////////////////
+
+        $admins = Admin::find()
+            ->select(['id', 'guid', 'name', 'mobile as phone'])
+            ->where(['and', ['guid' => ''], ['!=', 'mobile', '']])
+            ->andWhere(['in', 'group_id', AdminGroup::getGroupsForEmployeeOnCashbox()])
+            ->andWhere(['>=', 'date_add', date('Y-m-d H:i:s', strtotime("-2 hour", time()))])
+            ->all();
+
+        foreach ($admins as $admin) {
+            $model = new EmployeeOnShift([
+                'first_name' => $admin->name, 'last_name' => '', 'phone' => $admin->phone,
+                'shift_date' => date('Y-m-d H:i:s'), 'shift_type' => 1,
+                'datetime_start' => date('Y-m-d H:i:s'),
+                'datetime_end' => date('Y-m-d H:i:s'),
+                'created_by' => 1,
+                'store_id' => '-',
+                'price' => 0,
+            ]);
+            $model->guid = DataHelper::createGuidMy("06");
+            $model->created_at = date("Y-m-d H:i:s");
+            $model->status = EmployeeOnShift::STATUS_ACCEPT;
+            $model->status_source = EmployeeOnShift::STATUS_SOURCE_NOT_CREATED_IN_1C;
+            $model->save();
+
+            $admin->guid = $model->guid;
+            $admin->save(false);
+
+            $exportImportTable = new ExportImportTable;
+            $exportImportTable->entity = 'admin';
+            $exportImportTable->entity_id = $admin->id;
+            $exportImportTable->export_id = 1;
+            $exportImportTable->export_val = $model->guid;
+            $exportImportTable->save();
+        }
+
+        //////////////////////////////////////////////
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine();
+}
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
\ No newline at end of file
diff --git a/erp24/scripts/tasks/task_23_calculation_company_data_for_chart_users_bonus.php b/erp24/scripts/tasks/task_23_calculation_company_data_for_chart_users_bonus.php
new file mode 100644 (file)
index 0000000..83fda6c
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * @var $time integer
+ */
+
+use yii_app\records\ChartDataSearch;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 23;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+$time_start = '0400';
+try {
+    if (
+        (
+            date('Gi', $time) == $time_start
+            || $force
+
+        )
+        && $enable
+    ) {
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        if (date('Y-m-02') == date('Y-m-d', strtotime('today'))) {
+            $dateStart = date('Y-m-d', strtotime('first day of previous month'));
+            $dateEnd = date('Y-m-01');
+        } else {
+            $dateStart = date('Y-m-d', strtotime('yesterday -1 day'));
+            $dateEnd = date('Y-m-d', strtotime('yesterday'));
+        }
+
+        $log .= ChartDataSearch::CalculationCompanyDataUsersBonusForCharts($dateStart, $dateEnd);
+
+        $errorsCount = null;
+
+        if (!empty($errorsCount)) {
+            $infoError .= 'errors count ' . $errorsCount;
+            $error .= $infoError;
+//            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+//            $error .= $valueErrors;
+        }
+
+
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage();
+}
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
\ No newline at end of file
diff --git a/erp24/scripts/tasks/task_24_calculation_company_data_matrix_for_chart.php b/erp24/scripts/tasks/task_24_calculation_company_data_matrix_for_chart.php
new file mode 100644 (file)
index 0000000..16a5fb1
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * @var $time integer
+ */
+
+use yii_app\records\ChartDataSearch;
+use yii_app\records\SchedulerTask;
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 24;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+$time_start = '0330';
+try {
+    if (
+        (
+            date('Gi', $time) == $time_start
+            || $force
+        )
+        && $enable
+    ) {
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        if (date('Y-m-02') == date('Y-m-d', strtotime('today'))) {
+            $dateStart = date('Y-m-d', strtotime('first day of previous month'));
+            $dateEnd = date('Y-m-01');
+        } else {
+            $dateStart = date('Y-m-d', strtotime('yesterday -1 day'));
+            $dateEnd = date('Y-m-d', strtotime('yesterday'));
+        }
+
+        $log .= ChartDataSearch::CalculationCompanyDataMatrixSalesForCharts($dateStart, $dateEnd);
+
+        $errorsCount = null;
+
+        if (!empty($errorsCount)) {
+            $infoError .= 'errors count ' . $errorsCount;
+            $error .= $infoError;
+//            $valueErrors = json_encode($errors,JSON_UNESCAPED_UNICODE);
+//            $error .= $valueErrors;
+        }
+
+
+
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine();
+}
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
\ No newline at end of file
diff --git a/erp24/scripts/tasks/task_25_delivery_bonus_add_after_half_day.php b/erp24/scripts/tasks/task_25_delivery_bonus_add_after_half_day.php
new file mode 100644 (file)
index 0000000..ec15d5f
--- /dev/null
@@ -0,0 +1,167 @@
+<?php
+
+/**
+ * @var $time integer
+ */
+
+use yii\helpers\ArrayHelper;
+
+use yii_app\records\Users;
+use yii_app\records\UsersBonus;
+use yii_app\api3\modules\v1\models\orders\OrdersAmo;
+use yii_app\records\Sales;
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 25;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            ((int)date('i', $time) % 5) == 0
+            || $force
+        )
+        && $enable
+    ) {
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        $sales = Sales::find()
+            ->where(['operation' => Sales::OPERATION_SALE])
+            ->andWhere(['!=', 'order_id', ''])
+            ->andWhere(['>=', 'date', date("Y-m-d H:i:s", strtotime("-6 hours", time()))])
+            ->all();
+
+        $saleReturns = Sales::find()
+            ->where(['operation' => Sales::OPERATION_RETURN])
+            ->andWhere(['!=', 'order_id', ''])
+            ->andWhere(['>=', 'date', date("Y-m-d H:i:s", strtotime("-6 hours", time()))])
+            ->all();
+
+        $saleReturnIds = ArrayHelper::getColumn($saleReturns, 'id');
+
+        foreach ($sales as $sale) {
+            /** @var $sale Sales */
+            if (in_array($sale->id, $saleReturnIds)) {
+                UsersBonus::deleteAll(['check_id' => $sale->id]);
+                continue;
+            }
+            $userBonus = UsersBonus::find()->where(['check_id' => $sale->id, 'tip' => 'plus', 'tip_sale' => 'sale'])->one();
+            if (!$userBonus) {
+                $orderAmo = OrdersAmo::findOne(['amo_id' => $sale->order_id]);
+                $phone = $orderAmo->phone; // ???
+
+                $cnt = intval(Sales::find()->where(['phone' => $phone, 'operation' => Sales::OPERATION_SALE])->count());
+
+                $userFound = Users::find()->where(['phone' => $phone])->one();
+                /** @var $userFound Users */
+                $credit_procent = $cnt == 0
+                    && $userFound && $userFound->source > 0
+                    && in_array($sale->store_id_1c, [
+                        '0a575763-8871-11ee-84e2-ac1f6b1b7573', // 31 Энтузиастов 22/18 (Москва)
+                        'e7fc2ba3-8870-11ee-84e2-ac1f6b1b7573'  // 30 Леонова 18 (Москва)
+                    ])
+                    && date('Y-m-d H:i:s') <= '2023-12-25 23:59:59' ? 0.3 : 0.1;
+                $back = round($sale->summ * $credit_procent);
+                $nm = "Возврат с покупки " . (100 * $credit_procent) . "% " . $sale->number . " сумма чека " . $sale->summ;
+
+                $userBonus = new UsersBonus;
+                $userBonus->tip = 'plus';
+                $userBonus->tip_sale = 'sale';
+                $userBonus->date = $sale->date;
+                $userBonus->date_start = date('Y-m-d H:i:s', strtotime('+1 day', strtotime($userBonus->date)));
+                $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+' . 366 . ' day', strtotime($userBonus->date)));
+                $userBonus->phone = $phone;
+                $userBonus->name = $nm;
+                $userBonus->check_id = $sale->id;
+                $userBonus->store_id =
+                $userBonus->bonus = $back;
+                $userBonus->site_id = 0;
+                $userBonus->referal_id = 0;
+                $userBonus->admin_id = $sale->admin_id;
+                $userBonus->price = $sale->summ;
+                $userBonus->store_id_1c = $sale->store_id_1c;
+                $userBonus->seller_id_1c = $sale->seller_id;
+                $userBonus->lid_id = $sale->order_id;
+                $userBonus->save();
+                if ($userBonus->getErrors()) {
+                    $log .= json_encode($userBonus->getErrors(), JSON_UNESCAPED_UNICODE);
+                }
+            }
+        }
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine();
+}
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
\ No newline at end of file
diff --git a/erp24/scripts/tasks/task_26_delivery_bonus_add_after_weak.php b/erp24/scripts/tasks/task_26_delivery_bonus_add_after_weak.php
new file mode 100644 (file)
index 0000000..35c34f0
--- /dev/null
@@ -0,0 +1,170 @@
+<?php
+
+/**
+ * @var $time integer
+ */
+
+use yii\helpers\ArrayHelper;
+
+use yii_app\records\Users;
+use yii_app\records\UsersBonus;
+use yii_app\api3\modules\v1\models\orders\OrdersAmo;
+use yii_app\records\Sales;
+use yii_app\records\SchedulerTaskLog;
+
+
+ini_set('max_execution_time', (string)(60 * 60 * 1)); // 1 час
+ini_set('display_errors', 'on');
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+
+echo "time2_" . $time . "_time2 ";
+$taskNum = 26;
+$dateTask = date('Y-m-d H:i:s');
+$dateTaskStart = null;
+$dateTaskStop = null;
+$log = '';
+$error = '';
+$infoError = '';
+$infoText = '';
+$description = '';
+$result = 0;
+
+$enable = true;
+$start = false;
+$force = false;
+
+$minuetTimeInTask = date('i', $time);
+$fullTimeInTask = date('Y-m-d H:i:s', $time);
+
+try {
+    if (
+        (
+            (
+                date('H:i', $time) == "03:00" ||
+                date('H:i', $time) == "03:30"
+            )
+            || $force
+        )
+        && $enable
+    ) {
+
+        $dateTaskStart = date('Y-m-d H:i:s');
+        $info = ' ================ test Task ' . $taskNum . ' start ================';
+        echo $info;
+        $log .= $info;
+        $log .= $time;
+
+        $schedulerTaskLog = new SchedulerTaskLog();
+        $schedulerTaskLog->setTaskNum($taskNum)
+            ->setName('Task ' . $taskNum)
+            ->setDate($dateTask)
+            ->setDateStart($dateTaskStart)
+        ;
+        $validate = $schedulerTaskLog->validate();
+        if ($validate) {
+            $schedulerTaskLog->save();
+        }
+
+        $sales = Sales::find()
+            ->where(['operation' => Sales::OPERATION_SALE])
+            ->andWhere(['!=', 'order_id', ''])
+            ->andWhere(['>=', 'date', date("Y-m-d H:i:s", strtotime("-1 week", time()))])
+            ->all();
+
+        $saleReturns = Sales::find()
+            ->where(['operation' => Sales::OPERATION_RETURN])
+            ->andWhere(['!=', 'order_id', ''])
+            ->andWhere(['>=', 'date', date("Y-m-d H:i:s", strtotime("-1 week", time()))])
+            ->all();
+
+        $saleReturnIds = ArrayHelper::getColumn($saleReturns, 'id');
+
+        foreach ($sales as $sale) {
+            /** @var $sale Sales */
+            if (in_array($sale->id, $saleReturnIds)) {
+                UsersBonus::deleteAll(['check_id' => $sale->id]);
+                continue;
+            }
+            $userBonus = UsersBonus::find()->where(['check_id' => $sale->id, 'tip' => 'plus', 'tip_sale' => 'sale'])->one();
+            if (!$userBonus) {
+                $orderAmo = OrdersAmo::findOne(['amo_id' => $sale->order_id]);
+                $phone = $orderAmo->phone; // ???
+
+                $cnt = intval(Sales::find()->where(['phone' => $phone, 'operation' => Sales::OPERATION_SALE])->count());
+
+                $userFound = Users::find()->where(['phone' => $phone])->one();
+                /** @var $userFound Users */
+                $credit_procent = $cnt == 0
+                    && $userFound && $userFound->source > 0
+                    && in_array($sale->store_id_1c, [
+                        '0a575763-8871-11ee-84e2-ac1f6b1b7573', // 31 Энтузиастов 22/18 (Москва)
+                        'e7fc2ba3-8870-11ee-84e2-ac1f6b1b7573'  // 30 Леонова 18 (Москва)
+                    ])
+                    && date('Y-m-d H:i:s') <= '2023-12-25 23:59:59' ? 0.3 : 0.1;
+                $back = round($sale->summ * $credit_procent);
+                $nm = "Возврат с покупки " . (100 * $credit_procent) . "% " . $sale->number . " сумма чека " . $sale->summ;
+
+                $userBonus = new UsersBonus;
+                $userBonus->tip = 'plus';
+                $userBonus->tip_sale = 'sale';
+                $userBonus->date = $sale->date;
+                $userBonus->date_start = date('Y-m-d H:i:s', strtotime('+1 day', strtotime($userBonus->date)));
+                $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+' . 366 . ' day', strtotime($userBonus->date)));
+                $userBonus->phone = $phone;
+                $userBonus->name = $nm;
+                $userBonus->check_id = $sale->id;
+                $userBonus->store_id =
+                $userBonus->bonus = $back;
+                $userBonus->site_id = 0;
+                $userBonus->referal_id = 0;
+                $userBonus->admin_id = $sale->admin_id;
+                $userBonus->price = $sale->summ;
+                $userBonus->store_id_1c = $sale->store_id_1c;
+                $userBonus->seller_id_1c = $sale->seller_id;
+                $userBonus->lid_id = $sale->order_id;
+                $userBonus->save();
+                if ($userBonus->getErrors()) {
+                    $log .= json_encode($userBonus->getErrors(), JSON_UNESCAPED_UNICODE);
+                }
+            }
+        }
+
+        $info = ' ================ test Task ' . $taskNum . ' stop ================';
+        echo $info;
+        $log .= $info;
+        $dateTaskStop = date('Y-m-d H:i:s');
+    } else {
+        $info = '   Task ' . $taskNum . ' skip   ';
+        echo $info;
+        $log .= $info;
+    }
+} catch (Exception $e) {
+    $error = 'Exception: ' . $e->getMessage() . ' ' . $e->getFile() . ' >>> ' . $e->getLine();
+}
+
+if (empty($schedulerTaskLog)) {
+    $schedulerTaskLog = new SchedulerTaskLog();
+    $schedulerTaskLog->setTaskNum($taskNum)
+        ->setName('Task ' . $taskNum)
+        ->setDate($dateTask)
+        ->setDateStart($dateTaskStart)
+        ->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+} else {
+    $schedulerTaskLog->setDateStop($dateTaskStop)
+        ->setDescription($description)
+        ->setError($error)
+        ->setInfo($infoText)
+        ->setLog($log)
+    ;
+}
+$validate = $schedulerTaskLog->validate();
+if ($validate) {
+    $schedulerTaskLog->save();
+}
\ No newline at end of file
diff --git a/erp24/traits/HistoryModelTrait.php b/erp24/traits/HistoryModelTrait.php
new file mode 100644 (file)
index 0000000..7a5db4c
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+namespace yii_app\traits;
+
+trait HistoryModelTrait
+{
+
+    public function getValueType(): string
+    {
+        return $this->value_type;
+    }
+
+    public function setValueType(string $value_type): object
+    {
+        $this->value_type = $value_type;
+        return $this;
+    }
+
+    public function getValueInt(): ?int
+    {
+        return $this->value_int;
+    }
+
+    public function initActiveRecord() : object
+    {
+        $this->date_from = date("Y-m-d");
+        $this->date_to = "2100-01-01";
+        $this->created_at = date("Y-m-d H:i:s");
+        $this->active = 1;
+        return $this;
+    }
+
+    public function disableRecord() : object
+    {
+        $this->date_to = date("Y-m-d");
+        $this->updated_at = date("Y-m-d H:i:s");
+        $this->active = 0;
+        return $this;
+    }
+
+    public function getValue()
+    {
+        $valueField = 'value_' . $this->value_type;
+        return $this->$valueField;
+    }
+
+    public function setValue($value, $type) : object
+    {
+        $valueField = 'value_' . $type;
+        $this->$valueField = $value;
+        $this->value_type = $type;
+
+        return $this;
+    }
+
+    public function setValueInt(?int $value_int): void
+    {
+        $this->value_int = $value_int;
+    }
+
+    public function getValueString(): ?string
+    {
+        return $this->value_string;
+    }
+
+    public function setValueString(?string $value_string): void
+    {
+        $this->value_string = $value_string;
+    }
+
+    public function getDateFrom(): string
+    {
+        return $this->date_from;
+    }
+
+    public function setDateFrom(string $date_from): object
+    {
+        $this->date_from = $date_from;
+        return $this;
+    }
+
+    public function getDateTo(): ?string
+    {
+        return $this->date_to;
+    }
+
+    public function setDateTo(?string $date_to): object
+    {
+        $this->date_to = $date_to;
+        return $this;
+    }
+
+    public function getActive(): int
+    {
+        return $this->active;
+    }
+
+    public function setActive(): object
+    {
+        $this->active = 1;
+        return $this;
+    }
+
+
+}
index c5e0043f41547c4426cfb5972ceb072801f2da55..f5c75e20de59ad7eb97f0d4600fea8b7dd867510 100644 (file)
@@ -3,8 +3,7 @@
 include_once(dirname(__DIR__, 2) . "/startup.php");
 include_once(dirname(__DIR__, 2) . "/inc/db.php");
 
-echo "<h1>I W H</h1>";
-die;
+error_reporting(E_ALL ^ E_NOTICE);
 
 $id=(int)$_REQUEST["id"];
 $product_id=htmlentities($_REQUEST["product_id"]);
diff --git a/erp24/views/shipment/ajax-update-fields-data.php b/erp24/views/shipment/ajax-update-fields-data.php
new file mode 100644 (file)
index 0000000..9ef2a70
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+include_once(dirname(__DIR__, 2) . "/startup.php");
+include_once(dirname(__DIR__, 2) . "/inc/db.php");
+include_once(dirname(__DIR__, 2) . "/inc/base_new.php");
+include_once(dirname(__DIR__, 2) . "/inc/design_new.php");
+include_once(dirname(__DIR__, 2) . "/inc/shipment.php");
+
+
+global $products, // массив с товарами производителя прикрепленного к этой закупке
+       $orderId, // id- заказа
+       $store_id, // GUID магазина
+       $storesArray, // массив с магазинами
+       $group_id, // ID группы авторизованного сотрудника
+       $fieldsRows, // массив с данными по полями - ключ name_eng
+       $date_start_sale, // дата старта продаж от которой считаемстатистику
+       $whereInProductsId, // условие sql запроса по вхождение только определнных продуктов по ID. in ('1',...,'12')
+       $FiledsData, // массив со всеми данными по всем магазинам работаем с ним - в нем все перменные
+       $FiledsDataSumm, // массив с суммой данных по столбцам по всем магазинам - по каждому товару
+       $FiledsDataSummStats,  // массив с суммами по всем магазинам и цветам
+       $status_order_id, // ID текущего статуса закупаки
+       $store_orders_statuses, // массим со статсами закупок
+       $statuses_stores_show,  // массив со статусами на которых необходимо выводить список магазинов
+       $status_edit_dostup,  //массив с доступами к полям - просомтр или редактирование
+       $store_orders_status_description, // - массив с описанием стутса
+       $dostup_fields,
+       $bg_fields,
+       $ProductsOptions;
+
+
+if(!empty($_REQUEST["id"])) { $orderId=(int)$_REQUEST["id"]; } else exit("Укажите ID закупки");
+
+include_once(dirname(__DIR__, 2) . "/inc/functionsFiedlsData.php");
+
+
+
+
+
diff --git a/erp24/views/shipment/ajax-update-step.php b/erp24/views/shipment/ajax-update-step.php
new file mode 100644 (file)
index 0000000..ae0b289
--- /dev/null
@@ -0,0 +1,634 @@
+<?php
+
+include_once(dirname(__DIR__, 2) . "/startup.php");
+include_once(dirname(__DIR__, 2) . "/inc/db.php");
+include_once(dirname(__DIR__, 2) . "/inc/base_new.php");
+include_once(dirname(__DIR__, 2) . "/inc/design_new.php");
+
+global $products, // массив с товарами производителя прикрепленного к этой закупке
+       $orderId, // id- заказа
+       $store_id, // GUID магазина
+       $storesArray, // массив с магазинами
+       $group_id, // ID группы авторизованного сотрудника
+       $fieldsRows, // массив с данными по полями - ключ name_eng
+       $date_start_sale, // дата старта продаж от которой считаемстатистику
+       $order_date_add,
+       $whereInProductsId, // условие sql запроса по вхождение только определнных продуктов по ID. in ('1',...,'12')
+       $FiledsData, // массив со всеми данными по всем магазинам работаем с ним - в нем все перменные
+       $FiledsDataSumm, // массив с суммой данных по столбцам по всем магазинам - по каждому товару
+       $FiledsDataSummStats,  // массив с суммами по всем магазинам и цветам
+       $status_order_id, // ID текущего статуса закупаки
+       $store_orders_statuses, // массим со статсами закупок
+       $statuses_stores_show,  // массив со статусами на которых необходимо выводить список магазинов
+       $status_edit_dostup,  //массив с доступами к полям - просомтр или редактирование
+       $store_orders_status_description, // - массив с описанием стутса
+       $dostup_fields,
+       $bg_fields,
+       $ProductsOptions;
+
+error_reporting(E_ALL ^ E_NOTICE);
+
+if(!empty($_REQUEST["id"])) { $orderId=(int)$_REQUEST["id"]; } else exit("Укажите ID закупки");
+
+$whereDeleteData="";
+// параметр указывает на то что осток после деления распределяем автоматически в ячейки для ручной добавки к делению
+$foreachSalesHand=false;
+if($_REQUEST["foreachSalesHand"]==1) { $foreachSalesHand=true; $whereDeleteData .=",'division_hand'"; }
+
+
+if($_REQUEST["deleteAll"]==1) {
+    $db::sql("DELETE FROM store_orders_fields_data WHERE order_id='$orderId'");
+
+    mess("Данные удалены");
+
+    exit();
+}
+
+
+
+
+//$db::sql("DELETE FROM store_orders_fields_data WHERE (field_name='division_ratio' or field_name='division_auto' or field_name='storehouse_balance') AND order_id='$orderId'");
+$db::sql("DELETE FROM store_orders_fields_data WHERE  field_name in ('division_hand_summ','division_summ','storehouse_balance', 'purchase_fact_difference','division_auto_all','delta_zakup','division_summ_all','delta_rejection' $whereDeleteData) AND order_id='$orderId'");
+
+include_once(dirname(__DIR__, 2) . "/inc/shipment.php");
+include_once(dirname(__DIR__, 2) . "/inc/functionsFiedlsData.php");
+
+/*
+
+if(empty($providers)) $providers=$db::mapping("SELECT id,name FROM shipment_providers ");
+$storesArrayAll=$db::mapping("SELECT id,name FROM products_1c WHERE tip='city_store' AND view='1'");
+
+
+// создаем массив со свойствами подсветки ячеек store_orders_fields_property
+$data=$db::getRows("SELECT * FROM store_orders_fields_property WHERE 1 order by id ASC");
+foreach($data as $row) {
+    $fieldsPropertyArray[$row["field_id"]][]=$row;
+ }
+
+ // достаем поля в массив
+$data=$db::getRows("SELECT * FROM store_orders_fields WHERE 1 order by position ASC");
+foreach($data as $row) {
+    $fieldsRows[$row["name_eng"]]=$row;
+    $fieldsRows[$row["name_eng"]]["property"]=$fieldsPropertyArray[$row["id"]];
+    $fieldsArrayDepended[$row["id"]]=explode(",",$row["dependent_fields"]);     //считаем поля и зависимые поля рекурсивно
+    if($row["colors_save"]==1) $fields_colors[$row["name_eng"]]=$row["id"];
+ }
+
+
+// данные по закупке - достаем параметры закупки - дата старта продаж - от нее считаем продажи списания и закупки прошлой недели
+$OrderData=$db::getRow("SELECT name,id,providers_arr, status, DATE_FORMAT(date_start, '%Y-%m-%d') as date_start,
+DATE_FORMAT(division_date, '%Y-%m-%d') as division_date, UNIX_TIMESTAMP(date_update) as date_update, parent_id FROM store_orders WHERE id=?",[$orderId]);
+$providersIdInThisOrder=explode(",",$OrderData["providers_arr"]);
+$status_order_id=$OrderData["status"];
+$date_start_sale=$OrderData["date_start"];
+$date_update=$OrderData["date_update"];
+$date_start_division=$OrderData["division_date"];
+
+
+$whereProvidersId="";
+$k=0;
+foreach($providersIdInThisOrder as $pid) { if($k!=0) $whereProvidersId .=","; $whereProvidersId .="'$pid'"; $k++; }
+
+
+$whereInProductsId=" in (";
+$z="SELECT p.id, p.name, o.provider_id, o.price_zakup FROM products_1c_options as o, products_1c as p WHERE o.provider_id in($whereProvidersId) AND p.id=o.id order by o.provider_id ASC, p.name ASC";
+$data2=$db::getRows($z);
+$k=0;
+ foreach($data2 as $row) {
+  if($k!=0) $whereInProductsId .=","; $whereInProductsId .="'".$row["id"]."'";
+   $products[$row["id"]]=$row["name"];
+   $prov[$row["id"]]=$row["provider_id"];
+   $ProductsOptions[$row["id"]]["price_zakup"]=$row["price_zakup"];
+
+   $k++;
+ }
+$whereInProductsId .=")";
+
+
+*/
+
+// вычисляем массив по цветам привязанным к товару
+$colorsProduct=[];
+$data4=$db::getRows("SELECT id,colors FROM products_1c_options WHERE provider_id>0 AND colors!='' AND id $whereInProductsId group by id order by id");
+foreach($data4 as $row) {
+    $colors=explode(";",$row["colors"]);
+    foreach($colors as $color) {
+        $color=trim($color);
+        $colorsProduct[$row["id"]][$color]=$color;
+    }
+}
+
+
+
+
+
+$data=$db::getRows("SELECT sum(p.quantity) as squantity,s.store_id_1c, p.product_id 
+FROM sales as s, sales_products as p 
+WHERE s.id=p.check_id AND s.operation='Продажа' AND p.product_id $whereInProductsId  AND s.date>=? - INTERVAL 14 day  group BY p.product_id, s.store_id_1c order by 
+squantity DESC",[$date_start_division]);
+foreach($data as $row){
+    $productsArrayStores[$row["product_id"]][$row["store_id_1c"]]=$row["squantity"];
+
+}
+
+
+
+// товар в пути  date_start<='$date_start_sale 00:00:00' AND date_start>='$date_start_sale' -interval 7 day
+
+$data=$db::getRows("SELECT  id,name,providers_arr FROM store_orders WHERE  date_add>='$order_date_add' - interval 7 day  AND date_add<='$order_date_add' ");
+
+
+$j=0;
+$orders_where="";
+foreach($data as $row) {
+
+    $store_orders[$row["id"]]=$row["name"];
+    $providersIdInThisOrder2=explode(",",$row["providers_arr"]);
+    $whereProvidersId2="";
+    $k=0;
+    foreach($providersIdInThisOrder2 as $pid) { if($k!=0) $whereProvidersId2 .=","; $whereProvidersId2 .="'$pid'"; $k++; }
+
+    if($j>0) $orders_where .=",";
+
+    $orders_where .="'".$row["id"]."' ";
+    $j++;
+
+
+
+
+// формируем массив с товарами и часть условия для запросов $whereInProductsId - вхождение ID продуктов
+    $whereInProductsId_is=" in (";
+    $z="SELECT p.id, p.name, o.provider_id, o.price_zakup, p.parent_id FROM products_1c_options as o, products_1c as p 
+WHERE o.provider_id in($whereProvidersId2) AND p.id=o.id order by o.provider_id ASC, p.name ASC";
+    $data2=$db::getRows($z);
+    $k=0;
+    foreach($data2 as $row3) {   if($k!=0) $whereInProductsId_is .=","; $whereInProductsId_is .="'".$row3["id"]."'";$k++;}
+    $whereInProductsId_is .=")";
+
+
+    echo" ".$row["id"].") ".$row["name"]."  убираем информацию по остальным товарам<br>";
+    if(!empty($whereInProductsId_is) and $k>0) $db::sql("DELETE FROM store_orders_fields_data WHERE product_id NOT $whereInProductsId_is  AND order_id='".$row["id"]."'");
+}
+$data_up=[];
+$db::sql("DELETE FROM store_orders_fields_data WHERE  field_name='goods_in_transit' AND order_id='$orderId'");
+
+
+if(!empty($orders_where))
+{
+
+
+    $orders_where=" AND order_id in($orders_where) AND order_id!='$orderId'";
+    $data=$db::getRows("SELECT order_id,product_id,value,color FROM store_orders_fields_data WHERE field_name='quantity_zakup_fact' AND value>0
+  $orders_where group by order_id, product_id,value,color");
+    foreach($data as $row) {
+        if(empty($row["color"])) $color="NULL"; else $color=$row["color"];
+        $data_up[$row["product_id"]]["NULL"][$color] +=(int)$row["value"];
+
+        $titleArr[$row["product_id"]]["NULL"][$color] .="
+       id=".$row["order_id"]." ".$store_orders[$row["order_id"]]."=".(int)$row["value"]." шт.";
+
+
+    }
+    insert_store_orders_fields($data_up,"goods_in_transit",$titleArr);
+}
+
+
+
+
+$data_up2=[];
+foreach($products as $productId =>$nameProduct) {
+
+    echo"<br><b>$nameProduct</b>";
+
+    $data_up=[];
+    $massivTitle=[];
+    foreach($storesArrayAll as $storeId => $nameStore) {
+
+//echo"<br>$nameStore ";
+
+        $colorsProductsArray[$productId]["NULL"]="NULL";
+
+        foreach($colorsProductsArray[$productId] as $color) {
+
+            $arrs2=returnFormula("division_auto_need",  $productId, $storeId, $color);
+// echo "$color=".$arrs2["value"]." "; // title=".$arrs2["title"]."
+
+            $FiledsData["division_auto_need"][$productId][$storeId][$color]=$arrs2["value"];
+            if($color=="NULL")   {
+                $data_up[$productId][$storeId][$color]=$arrs2["value"];
+                $division_auto_need_all[$productId] +=$arrs2["value"];
+                $massivTitle[$productId][$storeId][$color] =$arrs2["title"];
+
+            }
+
+        }
+    }
+
+
+    insert_store_orders_fields($data_up,"division_auto_need",$massivTitle);
+
+
+
+    echo"<br>Итого division_auto_need_all=".$division_auto_need_all[$productId]." 
+
+старый коэфф=".$FiledsData["division_ratio"][$productId]["NULL"]["NULL"]."
+
+куплено по факту=".$FiledsData["quantity_zakup_fact"][$productId]["NULL"]["NULL"]."";
+
+    $FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"]=$division_auto_need_all[$productId];
+    $data_up2[$productId]["NULL"]["NULL"]=$division_auto_need_all[$productId];
+}
+
+
+
+
+insert_store_orders_fields($data_up2,"division_auto_need_all");
+
+
+
+
+$rowFactName="quantity_warehouseman_fact"; // old quantity_warehouseman_fact   quantity_zakup_fact
+$data_up=[];
+foreach($products as $productId => $nameProduct) {
+    $massivSQL=array();
+    $FiledsData["division_theory_all"][$productId]["NULL"]["NULL"]=$FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"];
+//+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]
+
+    if($FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]>=$FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"]) {
+        $FiledsData["division_ratio"][$productId]["NULL"]["NULL"]=1;
+    }
+    else $FiledsData["division_ratio"][$productId]["NULL"]["NULL"]=round($FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]/$FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"],3);
+    echo"<br>$nameProduct = division_ratio  ".$FiledsData["division_ratio"][$productId]["NULL"]["NULL"]." ";
+
+    $data_up[$productId]["NULL"]["NULL"]=$FiledsData["division_ratio"][$productId]["NULL"]["NULL"];
+}
+
+insert_store_orders_fields($data_up,"division_ratio");
+
+
+
+
+$data_up=[]; $datau=[]; $data_hand=[];
+foreach($products as $productId =>$nameProduct) {
+    $division_auto_all2=[];
+    echo"<br><b>$nameProduct - division_auto  $rowFactName=".$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]."</b>";
+    foreach($storesArrayAll as $storeId => $nameStore) {
+        echo"<br>$nameStore ";
+
+        $colorsProductsArray[$productId]["NULL"]="NULL";
+        foreach($colorsProductsArray[$productId] as $color) {
+            $division_auto=$FiledsData["division_auto_need"][$productId][$storeId][$color] * $FiledsData["division_ratio"][$productId]["NULL"]["NULL"];
+
+            if(empty($FiledsData["min_lot"][$productId]))  $min_lot=1; else $min_lot=$FiledsData["min_lot"][$productId];
+            $division_auto_ceil=ceilCoefficient($division_auto,$min_lot);
+
+
+            $title=" ".$FiledsData["division_auto_need"][$productId][$storeId][$color]." *  ".$FiledsData["division_ratio"][$productId]["NULL"]["NULL"]." = $division_auto ->$division_auto_ceil  ";
+
+
+            echo $title;
+
+
+            if($color=="NULL" and $storeId!="NULL")   $storehouse_balance1=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-($division_auto_all2[$productId]+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]);
+
+
+
+
+            $storehouse_balance0=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-($division_auto_all[$productId]+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]);
+            if($division_auto_ceil<=$storehouse_balance0 and $storehouse_balance1<0) { $storehouse_balance1=1;
+                if($color=="NULL" and $storeId!="NULL")   $division_auto_all2[$productId] +=$division_auto_ceil;
+                echo"!!!!вносим все равно $storehouse_balance0";
+
+            }
+
+
+            if($storehouse_balance1<0) {
+
+                $storehouse_balance=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-($division_auto_all[$productId]+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]);
+
+                echo" !баланс! $storehouse_balance ";
+
+                echo"<span class=\"btn btn-danger\">не вносим</span>";
+
+            }
+            else {
+                if($color=="NULL" and $storeId!="NULL")  {
+                    $division_auto_all[$productId] +=$division_auto_ceil;
+                    $division_auto_all2[$productId] +=$division_auto_ceil;
+
+                }
+
+                $storehouse_balance=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-($division_auto_all[$productId]+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]);
+
+                echo" баланс $storehouse_balance ";
+                $value=$division_auto_ceil;
+                $field_name="division_auto";
+                $field_id=$fieldsRows[$field_name]["id"];
+
+                if($storehouse_balance>=0) {
+                    if($color=="NULL") {
+                        $color="";
+                        try {
+                            $db::sql("INSERT IGNORE INTO store_orders_fields_data (product_id, order_id, store_id, field_name, field_id, value, value_text, color,hand,date_update,title)       
+          VALUES (?,?,?,?,?,?,?,?,'-1',NOW(),?)  ON DUPLICATE KEY UPDATE value=?, hand=0, value_text=?, date_update=NOW(), title=?",
+                                [$productId, $orderId, $storeId, $field_name, $field_id, $value, "",  $color, $title, $value, "",$title]);
+                        }
+                        catch (Exception $e)
+                        {
+                            echo 'Ошибка вставки данных field_name='.$field_name.' '.print_r($param).' error='. $e->getMessage();
+                        }
+
+
+                        $hand=$FiledsData["division_hand"][$productId][$storeId][$color];
+                        if(empty($hand)) $hand=0;
+
+                        $data_up[$productId][$storeId][$color]=$value+$hand;
+                        $datau[$productId][$storeId][$color]="$value+".$hand;
+                    }
+                }  else {
+
+                    echo"--не вносим--";
+                }
+
+
+
+            }
+
+
+            echo "all=".$division_auto_all2[$productId]." ";
+
+
+        }
+
+
+
+
+
+    }
+
+
+    $product_counter++;
+    insert_store_orders_fields($data_up,"division_summ",$datau);
+
+
+
+    $min_lot=$FiledsData["min_lot"][$productId];
+    $division_hand_summ=$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"];
+    $storehouse_balance=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-($division_auto_all[$productId]+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]);
+
+    // $data_up3=[];
+    // $data_up3[$productId]["NULL"]["NULL"]=$storehouse_balance;
+    // insert_store_orders_fields($data_up3,"storehouse_balance");
+
+    $field_name="storehouse_balance";
+    $field_id=$fieldsRows[$field_name]["id"];
+    $storeId="";
+    $color="";
+    $value=$storehouse_balance;
+
+
+    try {
+        $s="INSERT IGNORE INTO store_orders_fields_data (product_id, order_id, store_id, field_name, field_id, value, value_text, color,hand,date_update)       
+          VALUES (?,?,?,?,?,?,?,?,'-1',NOW())  ON DUPLICATE KEY UPDATE value=?, hand=0, value_text=?, date_update=NOW()";
+        $db::sql($s,            [$productId, $orderId, $storeId, $field_name, $field_id, $value, $value_text,  $color, $value, $value_text]);
+
+    }
+    catch (Exception $e)
+    {
+        echo 'Ошибка вставки данных  error='. $e->getMessage();
+    }
+
+
+    echo"<br>Итого division_auto_all=".$division_auto_all[$productId]." division_hand_summ=$division_hand_summ storehouse_balance=<b>$storehouse_balance</b> min_lot=$min_lot ";
+    $FiledsData["division_auto_all"][$productId]["NULL"]["NULL"]=$division_auto_need_all[$productId];
+
+
+// добавляем деление ручное по магазину по циклу - по рейтингу магазина
+
+    if($foreachSalesHand==true and $min_lot <=$storehouse_balance and $storehouse_balance>0){
+
+        echo"<br><b>Запускаем цикл начисления согласно продажам</b>";
+
+        $j=1;
+        $new_balance=0;
+        $nb=0;
+        do {
+            foreach($productsArrayStores[$productId] as $storeId =>$quantity) {
+                $new_balance=$storehouse_balance-$min_lot;
+
+                if( $new_balance>=0) {
+                    $nb = $FiledsData["division_hand"][$productId][$storeId]["NULL"] + $min_lot;
+                    $storehouse_balance=$storehouse_balance-$min_lot;
+
+                    echo"<br><font color=blue> ".$storesArrayAll[$storeId]." =>$quantity</font> $storehouse_balance-$min_lot new_balance=$new_balance 
+ + hand=$min_lot
+  hand_old=".$FiledsData["division_hand"][$productId][$storeId]["NULL"]." 
+  hand_new=".$nb." ";
+
+                    $FiledsData["division_hand"][$productId][$storeId]["NULL"] += $min_lot;
+                    $data_hand[$productId][$storeId]["NULL"] +=$min_lot;
+                }
+
+                if( $new_balance<=0)  break;
+
+
+            }
+            $j++;
+        } while($new_balance>0);
+
+
+
+        foreach($data_hand[$productId] as $storeId => $arr) {
+            echo"<br>data_up=".$storesArrayAll[$storeId]."= ".$arr["NULL"]."  ";
+        }
+
+    }
+
+
+
+    if($product_counter>1) { echo"<font color=red>Выход из цикла!!!!</font>"; break;}
+
+
+}
+
+
+
+
+if($foreachSalesHand==true) {
+    insert_store_orders_fields($data_hand,"division_hand");
+    insert_store_orders_fields($data_hand,"division_auto_hand");
+
+
+}
+
+
+
+
+
+
+
+// деление по магазину
+$datau=[];
+$FiledsData["division_auto_all"]=[];
+$FiledsData["auto_purchase_formula_all"]=[];
+foreach($products as $productId =>$nameProduct) {
+    foreach($storesArrayAll as $storeId => $nameStore) {
+        // деление ручное сумма по магазину
+        $FiledsData["auto_purchase_formula_all"][$productId]["NULL"]["NULL"] += $FiledsData["auto_purchase_formula"][$productId][$storeId]["NULL"];
+        $FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"] += $FiledsData["division_hand"][$productId][$storeId]["NULL"];
+        $FiledsData["division_auto_all"][$productId]["NULL"]["NULL"] += $FiledsData["division_auto"][$productId][$storeId]["NULL"];
+        $datau["division_summ"][$productId][$storeId]["NULL"]=$FiledsData["division_auto"][$productId][$storeId]["NULL"]."+". $FiledsData["division_hand"][$productId][$storeId]["NULL"];
+        $FiledsData["division_summ"][$productId][$storeId]["NULL"]=$FiledsData["division_auto"][$productId][$storeId]["NULL"] + $FiledsData["division_hand"][$productId][$storeId]["NULL"];
+        $FiledsData["division_delta"][$productId][$storeId]["NULL"]=round(100*($FiledsData["division_hand"][$productId][$storeId]["NULL"]/($FiledsData["division_auto"][$productId][$storeId]["NULL"] + 0.0001)));
+        $FiledsData["division_summ"][$productId]["NULL"]["NULL"] +=$FiledsData["division_summ"][$productId][$storeId]["NULL"];
+        $FiledsData["division_summ_all"][$productId]["NULL"]["NULL"] +=$FiledsData["division_summ"][$productId][$storeId]["NULL"];
+        $FiledsData["purchase_fact_difference"][$productId]["NULL"]["NULL"]=$FiledsData["quantity_warehouseman_fact"][$productId]["NULL"]["NULL"] - $FiledsData["quantity_zakup_fact"][$productId]["NULL"]["NULL"];
+        $FiledsData["delta_zakup"][$productId]["NULL"]["NULL"]=round(100*$FiledsData["purchase_fact_difference"][$productId]["NULL"]["NULL"]/($FiledsData["quantity_warehouseman_fact"][$productId]["NULL"]["NULL"] + 0.0001),0);
+        $FiledsData["delta_rejection"][$productId]["NULL"]["NULL"]=round(100*$FiledsData["quantity_warehouseman_defective"][$productId]["NULL"]["NULL"]/($FiledsData["quantity_warehouseman_fact"][$productId]["NULL"]["NULL"] + $FiledsData["quantity_warehouseman_defective"][$productId]["NULL"]["NULL"] + 0.0001 ),0);
+
+
+
+    }
+}
+
+
+foreach($products as $productId =>$nameProduct) {
+    $FiledsData["auto_purchase_formula"][$productId]["NULL"]["NULL"] = $FiledsData["auto_purchase_formula_all"][$productId]["NULL"]["NULL"]-$FiledsData["goods_in_transit"][$productId]["NULL"]["NULL"] ;
+
+
+    $FiledsData["auto_purchase_formula_all"][$productId]["NULL"]["NULL"] = $FiledsData["auto_purchase_formula"][$productId]["NULL"]["NULL"];
+
+}
+
+
+
+
+
+insert_store_orders_fields($FiledsData["division_hand_summ"],"division_hand_summ");
+insert_store_orders_fields($FiledsData["division_auto_all"],"division_auto_all");
+insert_store_orders_fields($FiledsData["division_summ"],"division_summ",$datau["division_summ"], false);
+insert_store_orders_fields($FiledsData["division_summ_all"],"division_summ_all");
+insert_store_orders_fields($FiledsData["division_delta"],"division_delta");
+insert_store_orders_fields($FiledsData["purchase_fact_difference"],"purchase_fact_difference","", false);
+insert_store_orders_fields($FiledsData["delta_zakup"],"delta_zakup","", false);
+insert_store_orders_fields($FiledsData["delta_rejection"],"delta_rejection","", false);
+insert_store_orders_fields($FiledsData["auto_purchase_formula_all"],"auto_purchase_formula_all","", false);
+insert_store_orders_fields($FiledsData["auto_purchase_formula"],"auto_purchase_formula","", false);
+
+
+
+foreach($products as $productId =>$nameProduct) {
+    foreach($storesArrayAll as $storeId => $nameStore) {
+        foreach($colorsProduct[$productId] as $color) {
+            // echo"<br>  $color ";
+            $summ=$FiledsData["division_auto"][$productId][$storeId][$color] + $FiledsData["division_hand"][$productId][$storeId][$color];
+            if(!empty($summ)) $FiledsData["division_summ"][$productId][$storeId][$color]=$summ;
+        }
+
+    }
+}
+insert_store_orders_fields($FiledsData["division_summ"],"division_summ","", false);
+
+
+//////////// остаток склада вновь считаем
+/*
+$datau=[];
+$data_storehouse_balance=[];
+foreach($products as $productId =>$nameProduct) {
+    $storehouse_balance=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-($division_auto_all[$productId]+$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]);
+    $datau[$productId]["NULL"]["NULL"]="факт $rowFactName ".$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]." - ( ".$division_auto_all[$productId]."+".$FiledsData["division_hand_summ"][$productId]["NULL"]["NULL"]." ) ";
+    echo"<br> storehouse_balance $nameProduct = $storehouse_balance ".$datau[$productId]["NULL"]["NULL"]."  ";
+    $FiledsData["storehouse_balance"][$productId]["NULL"]["NULL"]=$storehouse_balance;
+    $data_storehouse_balance[$productId]["NULL"]["NULL"]=$storehouse_balance;
+}
+insert_store_orders_fields($data_storehouse_balance,"storehouse_balance",$datau, false);
+*/
+////////////
+
+$FiledsData["storehouse_balance"]=[];
+$datau=[];
+$data_storehouse_balance=[];
+$FiledsData["division_summ_all"][$productId]["NULL"]["NULL"]=0;
+foreach($products as $productId =>$nameProduct) {
+    echo"<br><h4>$nameProduct</h4>";
+    $alld=0;
+    foreach($storesArrayAll as $storeId => $nameStore) {
+        // деление ручное сумма по магазину
+        $alld+=($FiledsData["division_auto"][$productId][$storeId]["NULL"] + $FiledsData["division_hand"][$productId][$storeId]["NULL"]);
+
+        echo"<br> $nameStore divauto=".$FiledsData["division_auto"][$productId][$storeId]["NULL"]." ".$FiledsData["division_hand"][$productId][$storeId]["NULL"]." =$alld ";
+
+
+    }
+
+    $storehouse_balance=$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]-$alld;
+    echo" <br> $nameProduct fact ".$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]." - ".$alld."   = ".$storehouse_balance." ";
+    $datau[$productId]["NULL"]["NULL"]="факт $rowFactName ".$FiledsData["$rowFactName"][$productId]["NULL"]["NULL"]." -  $alld ";
+    echo"<br> storehouse_balance $nameProduct = $storehouse_balance ".$datau[$productId]["NULL"]["NULL"]."  ";
+    $FiledsData["storehouse_balance"][$productId]["NULL"]["NULL"]=$storehouse_balance;
+    $data_storehouse_balance[$productId]["NULL"]["NULL"]=$storehouse_balance;
+
+}
+insert_store_orders_fields($data_storehouse_balance,"storehouse_balance",$datau, false);
+
+
+// автоформула
+foreach($products as $productId =>$nameProduct) {
+    $param["sale_7day"]=0;     $param["quantity"]=0;     $param["quantity_fact"]=0;
+    foreach($storesArrayAll as $storeId => $nameStore) {
+        $param["sale_7day"] +=$FiledsData["sales_cnt"][$productId][$storeId]["NULL"];
+        $param["quantity"] +=$FiledsData["quantity"][$productId][$storeId]["NULL"];
+        $param["quantity_fact"] +=$FiledsData["quantity_fact"][$productId][$storeId]["NULL"];
+    }
+
+    echo"<br>Считаем автозаказ Продажи 7 дней ".$param["sale_7day"]." или ( ".$FiledsData["sales_cnt"][$productId]["NULL"]["NULL"].") 
+
+quantity=".$param["quantity"]." или (".$FiledsData["quantity"][$productId]["NULL"]["NULL"].")  
+
+quantity_fact=".$param["quantity_fact"]."  или (".$FiledsData["quantity_fact"][$productId]["NULL"]["NULL"].")   ";
+
+
+
+// считаем запас на 3 дня
+    $FiledsData["auto_purchase_formula"]=[];
+    $sale_2day=ceil(3*($param["sale_7day"]/7));
+    $goods_in_transit=(int)$FiledsData["goods_in_transit"][$productId]["NULL"]["NULL"];
+    $quantity_fact=$FiledsData["quantity_fact"][$productId]["NULL"]["NULL"];
+    $quantity=$FiledsData["quantity"][$productId]["NULL"]["NULL"];
+    $fact=$quantity_fact +  $goods_in_transit;
+    $fact_sale=$param["sale_7day"];// если факт продаж будет больше чем факт - перприсваеиваем
+
+    if(($fact-$fact_sale)>0) {
+        $saleweek1=$fact-$fact_sale ;
+        $zakaz= $param["sale_7day"] + $sale_2day +  $quantity - $saleweek1;
+
+        echo 'sale_7day + sale_2day +  quantity - $saleweek1 ';
+    }
+    else {
+        $zakaz= $param["sale_7day"] + $sale_2day +  $quantity ;
+
+        echo" если";
+    }
+// считаем по такой же формуле но за две недели средняя - и если расхождение более 30% подсвевиваем красным
+
+    if($zakaz<0) $zakaz=0;
+//округлить до минимального лота деления
+    $ceil=ceilCoefficient($zakaz,$FiledsData["min_lot"][$productId]);
+    echo"<br><b>++Авто-заказ = $ceil (товар в пути $goods_in_transit)</b>";
+    $FiledsData["auto_purchase_formula"][$productId]["NULL"]["NULL"]=$ceil;
+}
+
+insert_store_orders_fields($FiledsData["auto_purchase_formula"],"auto_purchase_formula","", false);
+
+
+
+
+$data2=$db::getRows("SELECT product_id, sum(quantity) as quantity FROM balances WHERE quantity>0 AND store_id!=''  AND   product_id $whereInProductsId GROUP BY product_id");
+foreach($data2 as $row2) {
+    $FiledsData["quantity_storage"][$row2["product_id"]]["NULL"]["NULL"]=$row2["quantity"];
+}
+
+insert_store_orders_fields($FiledsData["quantity_storage"],"quantity_storage","", false);
+
+
diff --git a/erp24/views/shipment/fields-data2.php b/erp24/views/shipment/fields-data2.php
new file mode 100644 (file)
index 0000000..2a467ef
--- /dev/null
@@ -0,0 +1,519 @@
+<?php
+
+include_once(dirname(__DIR__, 2) . "/startup.php");
+include_once(dirname(__DIR__, 2) . "/inc/db.php");
+include_once(dirname(__DIR__, 2) . "/inc/base_new.php");
+include_once(dirname(__DIR__, 2) . "/inc/design_new.php");
+//include_once(dirname(__DIR__, 2) . "/inc/shipment.php");
+
+//include"templates/top.php";
+
+//if($_SESSION["group_id"]>2) exit("У вас нет дступа");
+global $products, // массив с товарами производителя прикрепленного к этой закупке
+       $orderId, // id- заказа
+       $store_id, // GUID магазина
+       $storesArray, // массив с магазинами
+       $group_id, // ID группы авторизованного сотрудника
+       $fieldsRows, // массив с данными по полями - ключ name_eng
+       $date_start_sale, // дата старта продаж от которой считаемстатистику
+       $whereInProductsId, // условие sql запроса по вхождение только определнных продуктов по ID. in ('1',...,'12')
+       $FiledsData, // массив со всеми данными по всем магазинам работаем с ним - в нем все перменные
+       $FiledsDataSumm, // массив с суммой данных по столбцам по всем магазинам - по каждому товару
+       $FiledsDataSummStats,  // массив с суммами по всем магазинам и цветам
+       $status_order_id, // ID текущего статуса закупаки
+       $store_orders_statuses, // массим со статсами закупок
+       $statuses_stores_show,  // массив со статусами на которых необходимо выводить список магазинов
+       $status_edit_dostup,  //массив с доступами к полям - просомтр или редактирование
+       $store_orders_status_description, // - массив с описанием стутса
+       $dostup_fields,
+       $bg_fields,
+       $ProductsOptions;
+
+$act='fields-data2'; // часть url action
+
+$group_id=$_SESSION["group_id"]; // ID группы сотрудника
+if(!empty($_SESSION["group_id_init"])) $group_id=$_SESSION["group_id_init"];
+
+
+
+
+if(!empty($_REQUEST["group_id"])) {
+    $group_id=(int)$_REQUEST["group_id"];
+    $_SESSION["group_id_init"]=$group_id;
+}
+
+
+
+$time = strtotime('this week monday, 00:00');  // текущий понедельник  в формате unixtimestamp
+$date2=date('Y-m-d 23:59:59', $time);  // текущий понедельник
+$date1=date('Y-m-d 00:00:00', $time-86400*7); // текущий понедельник минус сеть дней
+
+
+if(!empty($_REQUEST["store_id"])) $store_id=htmlentities($_REQUEST["store_id"]);
+if(!empty($_REQUEST["id"])) { $orderId=(int)$_REQUEST["id"]; } else exit("Укажите ID закупки");
+
+
+// измененеи статуса заказа
+if(!empty($_POST["edit_status"]) and !empty($_REQUEST["id"])) {
+    $db::sql("UPDATE store_orders SET status=? WHERE id=?",[(int)$_POST["status_new"],$orderId]);
+    $db::sql("INSERT IGNORE INTO  store_order_status_log (status, order_id, date, admin_id) VALUES (?,?,NOW(),?)",[(int)$_POST["status_new"],$orderId, $_SESSION["admin_id"]]);
+
+    mess("Статус изменен");
+}
+
+
+
+include_once(dirname(__DIR__, 2) . "/inc/functionsFiedlsData.php");
+
+$data=$db::mapping("SELECT id,name FROM admin_group WHERE id in ('1','10','7','51','9','17','70')");
+
+
+
+echo'<div class="alert alert-warning" role="alert"><a href="/shipment/" class="btn me-2 btn-info">❮ назад в закупки</a>
+
+
+
+<a href="https://youtu.be/Ol0mWDFYKsw" class="btn me-2 btn-danger" target=new>видео-инструкция новый интерфейс 2</a>
+<a href="https://youtu.be/4sGW2MqDMgM" class="btn me-2 btn-danger" target=new>видео2</a>
+
+
+Описание статуса: '.$store_orders_status_description[$status_order_id].'
+
+';
+
+echo"Под кем будем просматривать ";
+foreach($data as $gid => $nameGroup) {
+
+    echo"<a href=\"/shipment/$act/?id=$orderId&group_id=$gid\" class=\"m-1 btn btn-sm btn-";
+
+    if($gid==$group_id) echo"success"; else echo"outline-info";
+
+    echo"\">$nameGroup</a>";
+
+}
+echo'
+<br>
+
+Дата старта продаж (от этой даты считаем продажи при авто-заказе) '.$OrderData["date_start"].'
+Дата деления (от этой даты считаем продажи при делении)'.$OrderData["division_date"].'
+
+
+
+
+
+
+<!--<a href="/shipment/'.$act.'/?id='.$orderId.'&insert=1" class="btn btn-danger me-2">1) подгрузить данные из старого интерфейса</a>-->
+<span onclick="ajaxUpdateFieldsData();" class="btn btn-info me-2">1) поссчитать статистические данные данные</span>
+<span onclick="ajaxUpdateStep();" class="btn btn-indigo me-2">2) обновить остаток склада</span>
+<span onclick="foreachSalesHand();" class="btn btn-warning me-2"> 3) обновить с распределене остатков склада по ячейкам добавка вручную</span>
+<span onclick="ajaxUploadAutoPurchase();" class="btn btn-warning me-2">автозаказ общий обновить</span>
+
+
+
+
+<span onclick="deleteAll();" class="btn btn-danger me-2">!!!очистить все данные из нового интерфейса!!</span>
+
+
+
+</div>';
+
+//<a href="/shipment/'.$act.'/?id='.$orderId.'&update=1" class="btn btn-info me-2">обновить данные в таблице</a>
+
+
+echo'<h1 class="page-title mb-0 text-primary">Заказ товара '.$OrderData["name"].' id='.$orderId.'
+<span class="btn btn-lime">'.$store_orders_statuses[$status_order_id] .'</span>  ваша роль <b>'.$users_group[$_SESSION["group_id"]].'</b></h1>';
+
+global $act;
+$act = 'fields-data2';
+// панель с магазинами
+showOrderStoresPanel();
+
+//если статус новый то вносим цены по товарам в нужые столбцы - розничная цена
+if($status_order_id==1) {
+
+
+    echo"<a href=\"/shipment/$act/?id=$orderId&group_id=$gid&load=purchase_price\" class=\"btn btn-danger me-2\">загрузить розничные цены</a>";
+
+
+    if(!empty($_REQUEST["load"])) {
+        $data=$db::getRows("SELECT product_id, price FROM `prices` WHERE product_id $whereInProductsId");
+        foreach($data as $row) $productsPrices[$row["product_id"]]=$row["price"];
+        $data_uper=[];
+        foreach($products as $productId => $nameProduct) {
+            echo"<br>$nameProduct Роз. цена=".$productsPrices[$productId]."  закуп ".$ProductsOptions[$productId]["price_zakup"]." ";
+            $price=$productsPrices[$productId];
+            $data_uper[$productId]["NULL"]["NULL"]=$price;
+
+
+            $db::sql("UPDATE `store_orders_prices` SET purchase_price='$price'
+WHERE product_id='$productId' AND order_id='$orderId' AND provider_id=1 AND purchase_price!='0.00'");
+
+        }
+
+//розничная цена
+        insert_store_orders_fields($data_uper,"purchase_price");
+
+
+        $data_uper=[];
+        foreach($products as $productId => $nameProduct) {
+            $price=$ProductsOptions[$productId]["price_zakup"];
+            $data_uper[$productId]["NULL"]["NULL"]=$ProductsOptions[$productId]["price_zakup"];
+            $db::sql("UPDATE `store_orders_prices` SET purchase_price_zakup='$price'
+WHERE product_id='$productId' AND order_id='$orderId' AND provider_id=1 AND purchase_price_zakup!='0.00'");
+        }
+        insert_store_orders_fields($data_uper,"purchase_price_zakup");
+
+//header("Location: /shipment/$act/?id=$orderId&group_id=$gid");
+    }
+
+
+}
+
+
+$products_varieties=[];
+$data=$db::getRows("SELECT id,product_id,color,name FROM `products_varieties`");
+foreach($data as $row) $products_varieties[$row["product_id"]][$row["color"]][$row["id"]]=$row["name"];
+
+
+
+//если выбран магазин то
+if(!empty($store_id)) echo'<input type=hidden name=store_id_id value='.$store_id.' id=store_id_id>';
+
+echo'<div id=edit_div></div><div class="table-responsive mt-3"><table class="zak">';
+$html='<thead><tr class="zg"><th class="text-right">наименование <span onclick="$(\'.trcolors\').toggle();" class="btn btn-sm btn-warning">раскрыть цвета</span>
+
+<span onclick="$(\'.sorts_flowers\').toggle();" class="btn btn-sm btn-warning">показать сорта</span>
+
+
+<a href="/shipment/statusFieldsSort/?status_id='.$status_order_id.'" target=new class="btn btn-sm btn-secondary">сортировка столбцов</a>
+
+<a href="/shipment/config/?status_id='.$status_order_id.'" target=new class="btn btn-sm btn-grey">настройка столбцов</a>
+
+
+</th>';
+$thead=$html; // формируем thead
+$head_td=$html;
+
+
+global $rowArraySum;
+$rowArraySum=[];
+
+if(!empty($group_id)) {
+//извлекаем сортировку полей в зависимости от группы сотрудника
+//$sort=$db::getValue("SELECT fields_sort FROM store_orders_fields_sort WHERE group_id=?",[$group_id]);
+
+    $sort=$db::getValue("SELECT fields_sort FROM store_orders_statuses WHERE id=?",[$status_order_id]);
+    if(!empty($sort)) $sort="ORDER BY  FIELD(`id`, $sort) ";
+
+    $data=$db::getRows("SELECT * FROM store_orders_fields  $sort");
+}
+foreach($data as $row) {
+    $dostup=$dostup_fields[$row["id"]];
+    $bg=$bg_fields[$row["id"]];
+    if($dostup=="edit" or $dostup=="show") {
+
+
+
+        $html ='<th class="text-center" data-bs-placement="top" data-bs-toggle="tooltip" data-bs-original-title="'.$row["name_full"].' '.$row["name_eng"].'"  onclick="ajaxFieldInfo('.$row["id"].');" style="max-width:90px;">
+<b>'.$row["name"].'</b></th>';
+        $thead .=$html;
+        $head_td .=$html;
+    }
+
+}
+$thead .='</tr></thead>';
+$head_td .='</tr>';
+echo ''.$thead.'<tbody>';
+
+
+
+//$FiledsData=getDataFiledsData();
+
+
+// полнограммы по всем магазинам
+if(!empty($store_id)) {
+    $data3=$db::getRows("SELECT store_id,product_id,quantity FROM store_planogram WHERE color='' 
+AND store_id!='' AND quantity>0 AND store_id=?",[$store_id]);
+    foreach($data3 as $row2) $store_planogramAllStores[$row2["store_id"]][$row2["product_id"]]=$row2["quantity"];
+}
+
+$data3=$db::getRows("SELECT * FROM products_class WHERE tip in ('potted','wrap')");
+foreach($data3 as $row2) $products_class[$row2["category_id"]]=$row2["tip"];
+
+
+
+
+
+$trCount=0;
+foreach($products as $pid =>$name) {
+    if($trCount==20) {
+        $trCount=0;
+        echo  $head_td;
+    }
+    $trCount++;
+
+    echo'<tr';
+
+
+    if(empty($store_planogramAllStores[$store_id][$pid]) and !empty($store_id)) echo' class="bg-danger"';
+
+
+    if(empty($FiledsData["quantity_warehouseman_fact"][$pid]["NULL"]["NULL"]) and $status_order_id >= 6) { echo' class="bg-danger"';
+
+        echo' style="opacity:0.5"';
+    }
+
+
+
+    echo'><td class="text-right">';
+//если статус общий то группируем по магазинам
+    if(empty($statuses_stores_show[$status_order_id]))  {      echo'<span onclick="$(\'.trstores_'.$pid.'\').toggle();" class="btn btn-default btn-sm">+</span>';   }
+    echo''.$name.'';
+
+
+
+//узнаем категорибю товара
+    $categoryId=$ProductsOptions[$pid]["parent_id"];
+// по категории узнаем тип товара горшечка или упаковка
+    $tip=$products_class[$categoryId] ?? '';
+
+
+    if(count($productsColorsArray[$pid])>0) echo'<span onclick="$(\'.trcolors_'.$pid.'\').toggle();" class="btn btn-sm btn-success">+ цвета</span>';
+    echo'<input type=hidden name=provider_id['.$pid.'] value="'.$prov[$pid].'">';
+    echo'</td>';
+
+    foreach($data as $row)   printFieldTd($row["name_eng"],$pid,$store_id);
+
+    echo'</tr>';
+
+
+//begin colors
+    foreach($productsColorsArray[$pid] as $color) {
+        $color=trim($color);
+        if(!empty($color))  {
+            echo'<tr class="trcolors trcolors_'.$pid.' bg-gray-300" style="display:none;"><td class="text-right">'.$name.' + <span class="btn btn-sm btn-warning me-1">'.$color.'</span>';
+
+            if(!empty($products_varieties[$pid][$color])) {
+                echo'<div class="sorts_flowers" style="display:none;"><br>сорта ';
+                foreach($products_varieties[$pid][$color] as $k => $var) {
+                    echo"<span class=\"btn btn-sm btn-outline-info me-1\">$var</span>";
+                }
+                echo'</div>';
+            }
+
+            foreach($data as $row) {
+                printFieldTd($row["name_eng"],$pid,$store_id,$color);
+
+            }
+            echo"</tr>";
+        }
+
+    }
+//end colors
+
+
+}
+
+
+echo'<tr class="bg-success zg"><td class="text-right"></td>';
+foreach($data as $row) {
+    $dostup=$dostup_fields[$row["id"]];
+    $bg=$bg_fields[$row["id"]];
+    if($dostup=="edit" or $dostup=="show") {
+        echo'<td class="text-center" title="'.$row["name_full"].' '.$row["name_eng"].'"><b>'.$row["name"].' ('.$fieldsRows[$row["name_eng"]]["row_type_sum"].')</b></td>';
+    }
+}
+echo'</tr>
+<tr class="bg-success"><td class="text-right">итого</td>';
+foreach($data as $row) {
+    $dostup=$dostup_fields[$row["id"]];
+    if($dostup=="edit" or $dostup=="show") {
+        $s="";
+        if($fieldsRows[$row["name_eng"]]["row_type_sum"]=="amount")   $s=$rowArraySum[$row["id"]];
+        if($fieldsRows[$row["name_eng"]]["row_type_sum"]=="avg")   $s=round($rowArraySum[$row["id"]]/$rowArraySum["cnt__".$row["id"]]);
+
+        echo'<td class="text-center '.$bg.'"><b>'.$s.'</b></td>';
+    }
+}
+echo'</tr></tbody>';
+echo'</table>
+
+<style>table tr td.bg-lime{background:lime;color:#fff;}</style>';
+/*
+$db::sql("DELETE FROM  store_orders_fields_data WHERE  field_name='division_auto_need_all' AND order_id='$orderId'");
+
+// суммируем деление и заносим данные в таблицу хранения данных по полям
+foreach($products as $productId => $name) {
+//echo"<br>$name ";
+  $all=0;
+  $division_auto_need_all=0;
+  foreach($storesArrayAll as $storeId => $nameStore) {
+  //  echo"<br> <b>$nameStore</b>division_auto_need= ".$FiledsData["division_auto_need"][$productId][$storeId]["NULL"]." ";
+   // $summ=$FiledsData["division_auto_need"][$productId][$storeId]["NULL"] + $FiledsData["division_hand"][$productId][$storeId]["NULL"];
+    $all =$all+$summ;
+    $division_auto_need_all += $FiledsData["division_auto_need"][$productId][$storeId]["NULL"];
+  //  if(!empty($summ)) { $data_uper=[];$data_uper[$productId][$storeId]["NULL"]=$summ;insert_store_orders_fields($data_uper,"division_summ");}
+
+
+  }
+
+$field_name="division_auto_need_all";
+//echo" Итого деления потребность + $division_auto_need_all = ".$FiledsData[$field_name][$productId]["NULL"]["NULL"]." division_auto_need_all=$division_auto_need_all ";
+if(!empty($division_auto_need_all)) {
+   $FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"]=$division_auto_need_all;
+    $data_uper=[];$data_uper[$productId]["NULL"]["NULL"]=$division_auto_need_all;insert_store_orders_fields($data_uper,"division_auto_need_all");}
+
+
+}
+
+//пробегаемся по всем продуктам
+foreach($products as $productId => $name) {
+
+
+$division_auto_need_all=$FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"];
+$quantity_warehouseman_fact=$FiledsData["quantity_warehouseman_fact"][$productId]["NULL"]["NULL"];
+
+
+echo"<br><b>$name</b>  division_auto_need_all=".$FiledsData["division_auto_need_all"][$productId]["NULL"]["NULL"]."
+Сумма потребности =".$division_auto_need_all."
+Сумма получаено по факту  ".$quantity_warehouseman_fact."";
+
+$division_ratio=1;
+if($division_auto_need_all > $quantity_warehouseman_fact) {
+$division_ratio=round($quantity_warehouseman_fact/$division_auto_need_all,2);
+
+echo"<font color=red>-меньше!</font>";
+
+echo" применяем коэффициент $division_ratio = ".$FiledsData["division_ratio"][$productId]["NULL"]["NULL"]." ";
+
+}
+
+$data_uper=[];$data_uper[$productId]["NULL"]["NULL"]=$division_ratio;
+insert_store_orders_fields($data_uper,"division_ratio");
+
+
+}
+
+*/
+
+
+
+
+$_CONFIG["jscss"] .="<script>
+    const param4x = $('meta[name=csrf-param]').attr('content');
+const token4x = $('meta[name=csrf-token]').attr('content');
+
+function ajaxFieldInfo(id){
+ $('#modal-7 .modal-body').html('Загружаем....');
+jQuery('#modal-7').modal('show', {backdrop: 'static'}); $('#modal-7 .modal-title').text('');  
+ $.ajax({
+       url: '/shipment/ajaxFieldInfo/',
+       method: 'post',       
+       dataType: 'html',        
+       data: {id: id},  
+       success: function(data){  
+    $('#modal-7 .modal-body').html(data);
+       }}); 
+}
+
+function ajaxUpdateFieldsData(){
+ $('#modal-7 .modal-body').html('Считаем данные');
+jQuery('#modal-7').modal('show', {backdrop: 'static'}); $('#modal-7 .modal-title').text('Обновляем данные');
+ $.ajax({
+       url: '/shipment/ajax-update-fields-data/',
+       method: 'post',       
+       dataType: 'html',        
+       data: { id: $orderId, update:'1', [param4x] : token4x},  
+       success: function(data){  
+    $('#modal-7 .modal-body').html(data);
+       }}); 
+}
+
+
+function ajaxUpdateStep(){
+ $('#modal-7 .modal-body').html('Считаем данные');
+jQuery('#modal-7').modal('show', {backdrop: 'static'}); $('#modal-7 .modal-title').text('Обновляем данные');  
+ $.ajax({
+       url: '/shipment/ajax-update-step/',
+       method: 'post',       
+       dataType: 'html',        
+       data: { id: $orderId, update_step:'1', [param4x] : token4x},  
+       success: function(data){  
+    $('#modal-7 .modal-body').html(data);
+       }}); 
+}
+
+
+function ajaxUploadAutoPurchase(){
+ $('#modal-7 .modal-body').html('Считаем данные');
+jQuery('#modal-7').modal('show', {backdrop: 'static'}); $('#modal-7 .modal-title').text('Обновляем данные');  
+ $.ajax({
+       url: '/shipment/ajaxUploadAutoPurchase/',
+       method: 'post',       
+       dataType: 'html',        
+       data: { id: $orderId, update_step:'1'},  
+       success: function(data){  
+    $('#modal-7 .modal-body').html(data);
+       }}); 
+}
+
+function foreachSalesHand(){
+ $('#modal-7 .modal-body').html('Считаем данные');
+jQuery('#modal-7').modal('show', {backdrop: 'static'}); $('#modal-7 .modal-title').text('Обновляем данные');  
+ $.ajax({
+       url: '/shipment/ajax-update-step/',
+       method: 'post',       
+       dataType: 'html',        
+       data: { id: $orderId, update_step:'1', foreachSalesHand:'1', [param4x] : token4x},  
+       success: function(data){  
+    $('#modal-7 .modal-body').html(data);
+       }}); 
+}
+
+
+function deleteAll(){
+ const result = confirm('Удаляем данные?');
+    
+    if (result) {
+
+ $('#modal-7 .modal-body').html('Удаляем данные');
+jQuery('#modal-7').modal('show', {backdrop: 'static'}); $('#modal-7 .modal-title').text('Удаляем данные');  
+ $.ajax({
+       url: '/shipment/ajax-update-step/',
+       method: 'post',       
+       dataType: 'html',        
+       data: { id: $orderId, deleteAll:'1', [param4x] : token4x},  
+       success: function(data){  
+    $('#modal-7 .modal-body').html(data);
+       }}); 
+}
+}
+
+
+</script>";
+
+$_CONFIG["jscss"] .='<!-- MODAL -->
+               <div class="modal fade" id="modal-7">
+                       <div class="modal-dialog  modal-lg modal-dialog-centered text-center" role="document">
+                               <div class="modal-content">
+                                       <div class="modal-header">
+                                               <h6 class="modal-title">Описание поля</h6><button aria-label="Close" class="btn-close" data-bs-dismiss="modal" type="button"><span aria-hidden="true">&times;</span></button>
+                                       </div>
+                                       <div class="modal-body p-0">
+                               
+                                       </div>
+                       
+                               </div>
+</div>
+</div>';
+
+
+
+
+
+include_once dirname(__DIR__, 2) . '/templates/bottom_light.php';
+
+
+
+
+
index ffa5b3e477f7f3a698ee9a2df22a0ae8464b8d4d..eb1a9c77e772a45e7a8275a5b0d9e0cb9fcc7f86 100755 (executable)
@@ -54,7 +54,7 @@ foreach($storeOrders as $row) {
                     <a class="dropdown-item" href="/shipment/add/?id=<?php echo $row["id"]?>">правка</a>
                     <a class="dropdown-item" href=/<?php echo $modul?>/view/?id=<?php echo $row["id"]?>>старый интерфейс</a>
                     <a class="dropdown-item" href=/<?php echo $modul?>/view2/?id=<?php echo $row["id"]?>>новый интерфейс</a>
-                    <a class="dropdown-item" href=/<?php echo $modul?>/fields-data/?id=<?php echo $row["id"]?> >новый интерфейс2</a>
+                    <a class="dropdown-item" href=/shipment/fields-data2/?id=<?php echo $row["id"]?> >новый интерфейс2</a>
                     <a class="dropdown-item" href=/shipment/division/?id=<?php echo $row["id"]?>>деление</a>
                     <a class="dropdown-item" href=/<?php echo $modul?>/purchase/?id=<?php echo $row["id"]?>>цвета для кустовых при заказе</a>
 
@@ -90,8 +90,8 @@ foreach($storeOrders as $row) {
                                         <a class="dropdown-item" href="/shipment/add/?id=<?php echo $rows["id"]?>">правка</a>
                                         <a class="dropdown-item" href=/<?php echo $modul?>/view/?id=<?php echo $rows["id"]?>>старый интерфейс</a>
                                         <a class="dropdown-item" href=/<?php echo $modul?>/view2/?id=<?php echo $rows["id"]?>>новый интерфейс</a>
-                                        <a class="dropdown-item" href=/<?php echo $modul?>/fields-data/?id=<?php echo $rows["id"]?> >новый интерфейс2</a>
-                                        <a class="dropdown-item" href=/<?php echo $modul?>/division/?id=<?php echo $rows["id"]?>>деление</a>
+                                        <a class="dropdown-item" href=/shipment/fields-data2/?id=<?php echo $rows["id"]?> >новый интерфейс2</a>
+                                        <a class="dropdown-item" href=/shipment/division/?id=<?php echo $rows["id"]?>>деление</a>
                                         <a class="dropdown-item" href=/<?php echo $modul?>/purchase/?id=<?php echo $rows["id"]?>>цвета для кустовых при заказе</a>
                                         <a class="dropdown-item" href=/<?php echo $modul?>/divisionPrint/?id=<?php echo $rows["id"]?>>деление - печать на складе</a>
                                         <a class="dropdown-item" href=/<?php echo $modul?>/divisionPrintEdit/?id=<?php echo $rows["id"]?>>деление - по цветам</a>