From: Alexander Smirnov Date: Thu, 8 Aug 2024 09:08:31 +0000 (+0300) Subject: Merge branch 'develop' into feature_smirnov_erp-130_write_offs_for_motivation_NEW X-Git-Tag: 1.4~43^2~1 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=9c54751809169848583c4d370bdf2b98a95983a6;p=erp24_rep%2Fyii-erp24%2F.git Merge branch 'develop' into feature_smirnov_erp-130_write_offs_for_motivation_NEW # Conflicts: # erp24/actions/motivation/IndexAction.php # erp24/services/MotivationService.php --- 9c54751809169848583c4d370bdf2b98a95983a6 diff --cc erp24/actions/motivation/IndexAction.php index 9a6c2e14,188213c2..5d800c6e --- a/erp24/actions/motivation/IndexAction.php +++ b/erp24/actions/motivation/IndexAction.php @@@ -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; diff --cc erp24/services/MotivationService.php index a259fec8,4510c792..157a8de8 --- a/erp24/services/MotivationService.php +++ b/erp24/services/MotivationService.php @@@ -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 @@@ -330,64 -332,127 +335,188 @@@ 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; + } + } + } + } }