--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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';
+ }
+}
<?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',
],
],
],
],
- '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) {
--- /dev/null
+<?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
--- /dev/null
+<?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
]
],
'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
'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,
'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,
];
}
<?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;
}
}
-
+$time = time();
if (!empty($date_start)) {
$time = strtotime($date_start);
}
$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"];
</style>
<script>
+const param5x = $(\'meta[name=csrf-param]\').attr(\'content\');
+const token5x = $(\'meta[name=csrf-token]\').attr(\'content\');
function changef(id,typeint)
{
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);
}});
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) {
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);
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 {
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"];
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% подсвевиваем красным
//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
// функция для формулы автоделения
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"];
//Заказано кустовыми $quantity_purchase_summ шт.
//Заказано на магазин $quantity_purchase шт.
-$ttl="$txt формула = продажи_7_дней + запас_на_3дня + полнограмма - продажи_7дней
+$ttl=" формула = продажи_7_дней + запас_на_3дня + полнограмма - продажи_7дней
Мин. лот деления $min_lot!
Куплено по факту $quantity_warehouseman_fact шт
Продажи 7 дней=".$sale_7day."шт
Полнограмма ".$quantity."шт
факт ".$quantity_fact."шт
Заказ ".$zakaz."шт
-Округляем -> $ceilшт";
+Округляем -> $ceil шт";
$array_r["value"]=$ceil;
$array_r["title"]=$ttl;
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;
}
$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;
// суммирование
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].") ";
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] ?? '';
// считаем авто деление
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>";
}
}
if ($type=="quantity_purchase_last_week") {
- $value=$FiledsData["quantity_purchase_last_week"][$productId][$storeId][$color];
+ $value=$FiledsData["quantity_purchase_last_week"][$productId][$storeId][$color] ?? '';
}
*/
- $array=["value"=>$value,"title"=>$value_title];
+ $array=["value"=>$value ?? 0,"title"=>$value_title ?? ''];
return $array;
}
}
//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") {
}
- $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"] ?? '';
}
} else {
$nameInput=''.$fieldName.'['.$productId.']';
$idInput=''.$fieldName.''.$productId.'';
- $onchange='ajaxEditFieldValue(\''.$fieldName.'\',\''.$productId.'\',\'NULL\')';
+ $onchange='ajaxEditFieldValue(\''.$fieldName.'\',\''.$productId.'\',\'NULL\')';
}
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;
}
}
$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") {
} 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();
}
}
}
}
- 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) {
".$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>
</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"]) ) {
$_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'] = [];
$_SESSION['manager_id'] = $user->manager_id ?? null;
$_SESSION['content_dostup'] = $user->content_dostup ?? null;
- $_SESSION['name_group_admin'] = "Пользователь";
+// $_SESSION['name_group_admin'] = "Пользователь";
}
/**
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?
+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
--- /dev/null
+<?
+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
+
+
+
+
--- /dev/null
+<?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();
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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);
+
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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();
+}
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+<?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;
+ }
+
+
+}
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"]);
--- /dev/null
+<?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");
+
+
+
+
+
--- /dev/null
+<?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);
+
+
--- /dev/null
+<?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">×</span></button>
+ </div>
+ <div class="modal-body p-0">
+
+ </div>
+
+ </div>
+</div>
+</div>';
+
+
+
+
+
+include_once dirname(__DIR__, 2) . '/templates/bottom_light.php';
+
+
+
+
+
<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>
<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>