]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Merge branch 'develop' into feature_smirnov_erp-130_write_offs_for_motivation_NEW
authorAlexander Smirnov <fredeom@mail.ru>
Thu, 8 Aug 2024 09:08:31 +0000 (12:08 +0300)
committerAlexander Smirnov <fredeom@mail.ru>
Thu, 8 Aug 2024 09:08:31 +0000 (12:08 +0300)
# Conflicts:
# erp24/actions/motivation/IndexAction.php
# erp24/services/MotivationService.php

1  2 
erp24/actions/motivation/IndexAction.php
erp24/services/MotivationService.php

index 9a6c2e1475f1ba350d7b982a878e82a4a91c7eb5,188213c225973ef14a2b9f91566b46db365cc3f7..5d800c6e97fa3f2cf0282e0f77c15d75e9bca58e
@@@ -84,9 -89,9 +84,12 @@@ class IndexAction extends Actio
              $model->month = intval($model->month);
          }
  
 +        // Подсчитываем стоимость брака
 +        MotivationService::calculateDefectCost($model->store_id, $model->year, $model->month);
 +
+         // Подсчитываем стоимость услуг по сборке и по доставке. Позже метод будет перенесён в шедулер
+         MotivationService::calculateServiceAssemblyAndDeliveryCost($model->store_id, $model->year, $model->month);
          $showTable = false;
          $motivationData = [];
          $daysInMonth = null;
index a259fec87c67d96c05085f04e288de08988c405b,4510c792ac7ada26b1b07028ac3ff9a232220e4f..157a8de8a2eb853fa56f439e16fda286be97edf3
@@@ -3,14 -3,16 +3,19 @@@
  namespace yii_app\services;
  
  use PhpOffice\PhpSpreadsheet\IOFactory;
 +use yii\helpers\Json;
 +use yii_app\records\ExportImportTable;
+ use yii\helpers\ArrayHelper;
  use yii_app\records\Motivation;
  use yii_app\records\MotivationValue;
  use yii_app\records\MotivationValueGroup;
  use yii_app\records\CityStore;
  use yii_app\records\MotivationCostsItem;
 +use yii_app\records\WriteOffs;
+ use yii_app\records\Products1c;
+ use yii_app\records\ProductsClass;
+ use yii_app\records\Sales;
+ use yii_app\records\SalesProducts;
  
  
  class MotivationService
          return compact('errors');
      }
  
 +    public static function calculateDefectCost($store_id, $year, $month) {
 +        $monthStart = date("Y-m-d 00:00:00", strtotime($year . '-' . $month . '-1'));
 +        $monthEnd = date("Y-m-t 23:59:59", strtotime($year . '-' . $month . '-1'));
 +
 +        $motivation = Motivation::find()->where(['store_id' => $store_id, 'year' => $year, 'month' => $month])->one();
 +        $exportImportTable = ExportImportTable::find()->select(['export_val'])->where(['entity' => 'city_store', 'entity_id' => $store_id, 'export_id' => 1])->one();
 +        /** @var $exportImportTable ExportImportTable */
 +
 +        foreach (range(1, 5) as $ind) {
 +            $weekStart = date("Y-m-d 00:00:00", strtotime("+" . (($ind - 1) * 7) . ' days', strtotime($monthStart)));
 +            $weekEnd = date("Y-m-d 23:50:50", strtotime("+" . ($ind * 7 - 1) . ' days', strtotime($monthStart)));
 +            if ($weekEnd > $monthEnd) {
 +                $weekEnd = $monthEnd;
 +            }
 +            if ($weekStart > $monthEnd) {
 +                continue;
 +            }
 +
 +            $motivationValueGroup = MotivationValueGroup::find()->where(['alias' => 'week' . $ind])->one();
 +
 +            if ($exportImportTable) {
 +                $writeOffs = WriteOffs::find()->select(['sum(summ) as total', 'type'])
 +                    ->where(['between', 'date', $weekStart, $weekEnd])
 +                    ->andWhere(['store_id' => $exportImportTable->export_val])
 +                    ->groupBy(['type'])
 +                    ->indexBy('type')
 +                    ->asArray()->all();
 +
 +                foreach ($writeOffs as $key => $data) {
 +                    $motivationItemType = MotivationCostsItem::writeOffsToMotivationItemMap($key);
 +                    if (empty($motivationItemType)) {
 +                        continue;
 +                    }
 +                    $motivationCostsItem = MotivationCostsItem::find()->where(['name' => $motivationItemType])->one();
 +                    /** @var $motivationCostsItem MotivationCostsItem */
 +                    if ($motivation) {
 +                        $motivationValue = MotivationValue::find()->where(['motivation_id' => $motivation->id,
 +                            'motivation_group_id' => $motivationValueGroup->id, 'value_id' => $motivationCostsItem->code])->one();
 +                        if (!$motivationValue) {
 +                            $motivationValue = new MotivationValue;
 +                            $motivationValue->motivation_id = $motivation->id;
 +                            $motivationValue->motivation_group_id = $motivationValueGroup->id;
 +                            $motivationValue->value_id = $motivationCostsItem->code;
 +                            $motivationValue->value_type = $motivationCostsItem->data_type;
 +                        }
 +                        $motivationValue->value_float = $data['total'];
 +                        $motivationValue->save();
 +                        if ($motivationValue->getErrors()) {
 +                            throw new \Exception(Json::encode($motivationValue->getErrors()));
 +                        }
 +                    }
 +                }
 +            }
 +        }
 +
 +        $motivation->save();
 +        if ($motivation->getErrors()) {
 +            throw new \Exception(Json::encode($motivation->getErrors()));
 +        }
 +    }
++
+     public static function calculateServiceAssemblyAndDeliveryCost($store_id, $year, $month) {
+         $monthStart = date("Y-m-d 00:00:00", strtotime($year . '-' . $month . '-1'));
+         $monthEnd = date("Y-m-t 23:59:59", strtotime($year . '-' . $month . '-1'));
+         // Ищем каталог-гуиды категории services
+         $productsClass = ProductsClass::find()->select(['category_id', 'tip'])
+             ->where(['tip' => 'services'])
+             ->indexBy('category_id')
+             ->asArray()->all();
+         // Ищем продуктовые гуиды по каталог-гуидам категории service
+         $products1c = Products1c::find()->select(['id', 'parent_id', 'name'])
+             ->where(['parent_id' => array_keys($productsClass), 'tip' => 'products'])
+             ->indexBy(['id'])
+             ->asArray()->all();
+         // Ищем каталог-гуиды категории services_delivery
+         $productsClassDelivery = ProductsClass::find()->select(['category_id', 'tip'])
+             ->where(['tip' => 'services_delivery'])
+             ->indexBy('category_id')
+             ->asArray()->all();
+         // Ищем продуктовые гуиды по каталог-гуидам категории service_delivery
+         $products1cDelivery = Products1c::find()->select(['id', 'parent_id', 'name'])
+             ->where(['parent_id' => array_keys($productsClassDelivery), 'tip' => 'products'])
+             ->indexBy(['id'])
+             ->asArray()->all();
+         foreach (range(1, 5) as $ind) {
+             $weekStart = date("Y-m-d 00:00:00", strtotime("+" . (($ind - 1) * 7) . ' days', strtotime($monthStart)));
+             $weekEnd = date("Y-m-d 23:59:59", strtotime("+" . ($ind * 7 - 1) . ' days', strtotime($monthStart)));
+             if ($weekEnd > $monthEnd) {
+                 $weekEnd = $monthEnd;
+             }
+             // Ищем продажи по продуктовым гуидам по каталог-гуидам категории service
+             $sales = Sales::find()->alias('s')
+                 ->leftJoin('sales_products p', 'p.check_id = s.id')
+                 ->where(['between', 's.date', $weekStart, $weekEnd])
+                 ->andWhere(['p.product_id' => array_keys($products1c)])
+                 ->andWhere(['s.store_id' => $store_id])
+                 ->andWhere(['s.operation' => Sales::OPERATION_SALE])
+                 ->asArray()->all();
+             $salesIds = ArrayHelper::getColumn($sales, 'id');
+             // Ищем чеки-возврат на текущие чеки
+             $returnSales = Sales::find()->where(['operation' => Sales::OPERATION_RETURN, 'sales_check' => $salesIds])->all();
+             $returnSalesIds = ArrayHelper::getColumn($returnSales, 'sales_check');
+             // Ищем продукты из категории services
+             $salesProduct = SalesProducts::find()
+                 ->select(['SUM(summ) as total'])
+                 ->where(['check_id' => $salesIds])
+                 ->andWhere(['NOT IN', 'check_id', $returnSalesIds])
+                 ->andWhere(['product_id' => array_keys($products1c)])
+                 ->asArray()->one();
+             $motivationValueGroup = MotivationValueGroup::find()->where(['alias' => 'week' . $ind])->one();
+             $motivationCostsItem = MotivationCostsItem::find()->where(['name' => 'Услуги по сборке'])->one();
+             /** @var $motivationCostsItem MotivationCostsItem */
+             $motivation = Motivation::find()->where(['store_id' => $store_id, 'year' => $year, 'month' => $month])->one();
+             if ($motivation) {
+                 $motivationValue = MotivationValue::find()->where(['motivation_id' => $motivation->id,
+                     'motivation_group_id' => $motivationValueGroup->id, 'value_id' => $motivationCostsItem->code])->one();
+                 if (!$motivationValue) {
+                     $motivationValue = new MotivationValue;
+                     $motivationValue->motivation_id = $motivation->id;
+                     $motivationValue->motivation_group_id = $motivationValueGroup->id;
+                     $motivationValue->value_id = $motivationCostsItem->code;
+                     $motivationValue->value_type = $motivationCostsItem->data_type;
+                 }
+                 $motivationValue->value_float = $salesProduct['total'];
+                 $motivationValue->save();
+                 //var_dump($motivationValue); die;
+                 if ($motivationValue->getErrors()) {
+                     var_dump($motivationValue->getErrors());
+                     die;
+                 }
+             }
+             // Ищем продажи по продуктовым гуидам по каталог-гуидам категории service_delivery
+             $sales = Sales::find()->alias('s')
+                 ->leftJoin('sales_products p', 'p.check_id = s.id')
+                 ->where(['between', 's.date', $weekStart, $weekEnd])
+                 ->andWhere(['p.product_id' => array_keys($products1cDelivery)])
+                 ->andWhere(['s.store_id' => $store_id])
+                 ->andWhere(['s.operation' => Sales::OPERATION_SALE])
+                 ->asArray()->all();
+             $salesIds = ArrayHelper::getColumn($sales, 'id');
+             // Ищем чеки-возврат на текущие чеки
+             $returnSales = Sales::find()->where(['operation' => Sales::OPERATION_RETURN, 'sales_check' => $salesIds])->all();
+             $returnSalesIds = ArrayHelper::getColumn($returnSales, 'sales_check');
+             // Ищем продукты из категории services_delivery
+             $salesProduct = SalesProducts::find()
+                 ->select(['SUM(summ) as total'])
+                 ->where(['check_id' => $salesIds])
+                 ->andWhere(['NOT IN', 'check_id', $returnSalesIds])
+                 ->andWhere(['product_id' => array_keys($products1c)])
+                 ->asArray()->one();
+             $motivationCostsItem = MotivationCostsItem::find()->where(['name' => 'Услуги по доставке'])->one();
+             /** @var $motivationCostsItem MotivationCostsItem */
+             if ($motivation) {
+                 $motivationValue = MotivationValue::find()->where(['motivation_id' => $motivation->id,
+                     'motivation_group_id' => $motivationValueGroup->id, 'value_id' => $motivationCostsItem->code])->one();
+                 if (!$motivationValue) {
+                     $motivationValue = new MotivationValue;
+                     $motivationValue->motivation_id = $motivation->id;
+                     $motivationValue->motivation_group_id = $motivationValueGroup->id;
+                     $motivationValue->value_id = $motivationCostsItem->code;
+                     $motivationValue->value_type = $motivationCostsItem->data_type;
+                 }
+                 $motivationValue->value_float = $salesProduct['total'];
+                 $motivationValue->save();
+                 if ($motivationValue->getErrors()) {
+                     var_dump($motivationValue->getErrors());
+                     die;
+                 }
+             }
+         }
+     }
  }