]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-259 Доработка второго шага передачи смен
authormarina <m.zozirova@gmail.com>
Fri, 6 Dec 2024 16:55:48 +0000 (19:55 +0300)
committermarina <m.zozirova@gmail.com>
Fri, 6 Dec 2024 16:55:48 +0000 (19:55 +0300)
erp24/records/EqualizationRemains.php

index 7f109b2103f838aa0d2e540bb9360e1ea6ef75bf..f9c4a807c23e7fe42fc4aded3f2a564ed5482fbd 100644 (file)
@@ -134,21 +134,27 @@ class EqualizationRemains extends \yii\db\ActiveRecord
         EqualizationRemains::deleteAll(['shift_id' => $shiftTransfer->id]);
 
         $plus = ShiftRemains::find()
-            ->andWhere(['shift_transfer_id' => $shiftTransfer->id])
+            ->where(['shift_transfer_id' => $shiftTransfer->id])
             ->andWhere(['!=', 'fact_and_1c_diff', 0])
             ->andWhere(['>', 'fact_and_1c_diff', 0])
             ->orderBy('retail_price')
             ->all();
 
-        $minus = ArrayHelper::map(ShiftRemains::find()
-            ->andWhere(['shift_transfer_id' => $shiftTransfer->id])
-            ->andWhere(['!=', 'fact_and_1c_diff', 0])
-            ->andWhere(['<', 'fact_and_1c_diff', 0])
-            ->select(['product_guid', 'fact_and_1c_diff', 'retail_price', 'self_cost'])
-            ->asArray()
-            ->all(), 'product_guid', function ($item) {
-            return ['fact_and_1c_diff' => $item['fact_and_1c_diff'], 'retail_price' => $item['retail_price'], 'self_cost' => $item['self_cost']];
-        });
+        $minus = ArrayHelper::map(
+            ShiftRemains::find()
+                ->where(['shift_transfer_id' => $shiftTransfer->id])
+                ->andWhere(['!=', 'fact_and_1c_diff', 0])
+                ->andWhere(['<', 'fact_and_1c_diff', 0])
+                ->select(['product_guid', 'fact_and_1c_diff', 'retail_price', 'self_cost'])
+                ->asArray()
+                ->all(),
+            'product_guid',
+            fn($item) => [
+                'fact_and_1c_diff' => $item['fact_and_1c_diff'],
+                'retail_price' => $item['retail_price'],
+                'self_cost' => $item['self_cost']
+            ]
+        );
 
         foreach ($plus as $p) {
             $replacement = Product1cReplacement::find()
@@ -158,17 +164,30 @@ class EqualizationRemains extends \yii\db\ActiveRecord
 
             $quanity = $p->fact_and_1c_diff;
 
-            foreach ($minus as $key => $item) {
+            $intersect = array_intersect_key($minus, array_flip($replacement));
 
-                $count = $count ?? $item['fact_and_1c_diff'];
+            if (empty($intersect)) {
+                continue;
+            }
 
-                if (self::find()
-                    ->select(['shift_id', 'product_replacement_id'])
-                    ->andWhere(['shift_id' => $shiftTransfer->id])
-                    ->andWhere(['product_replacement_id' => $key])
+            foreach ($intersect as $key => $item) {
+                $eqRemains = self::find()
+                    ->select(['SUM(product_count)'])
+                    ->where(['shift_id' => $shiftTransfer->id, 'product_id' => $key])
                     ->groupBy(['shift_id', 'product_replacement_id'])
-                    ->having(['SUM(product_replacement_count)' => abs($item['fact_and_1c_diff'])])
-                    ->exists()) {
+                    ->scalar();
+
+                $diff = $eqRemains
+                    ? min($quanity, abs($item['fact_and_1c_diff']) - $eqRemains)
+                    : min($quanity, abs($item['fact_and_1c_diff']));
+
+                if (self::find()
+                        ->select(['SUM(product_count)'])
+                        ->where(['shift_id' => $shiftTransfer->id])
+                        ->andWhere(['product_id' => $key])
+                        ->groupBy(['shift_id', 'product_id'])
+                        ->having(['SUM(product_count)' => abs($item['fact_and_1c_diff'])])
+                        ->scalar() == abs($item['fact_and_1c_diff'])) {
                     break;
                 }
 
@@ -179,30 +198,26 @@ class EqualizationRemains extends \yii\db\ActiveRecord
                 $model = new EqualizationRemains();
                 $model->setAttributes([
                     'shift_id' => $shiftTransfer->id,
-                    'product_id' => $p->product_guid,
-                    'product_count' => min($quanity, abs($item['fact_and_1c_diff'])),
-                    'product_price' => $p->retail_price,
-                    'product_self_cost' => $p->self_cost,
-                    'product_replacement_id' => $key,
-                    'product_replacement_count' => min($quanity, abs($item['fact_and_1c_diff'])),
-                    'product_replacement_price' => $item['retail_price'],
-                    'product_replacement_self_cost' => $item['self_cost'],
-                    'balance' => min($quanity, abs($item['fact_and_1c_diff'])) * ($p->retail_price - $item['retail_price']),
-                    'balance_self_cost' => min($quanity, abs($item['fact_and_1c_diff'])) * ($p->self_cost - $item['self_cost'])
+                    'product_id' => $key,
+                    'product_count' => $diff,
+                    'product_price' => $item['retail_price'],
+                    'product_self_cost' => $item['self_cost'],
+                    'product_replacement_id' => $p->product_guid,
+                    'product_replacement_count' => $diff,
+                    'product_replacement_price' => $p->retail_price,
+                    'product_replacement_self_cost' => $p->self_cost,
+                    'balance' => $diff * ($p->retail_price - $item['retail_price']),
+                    'balance_self_cost' => $diff * ($p->self_cost - $item['self_cost'])
                 ]);
 
                 if ($model->validate()) {
                     $model->save();
+                    $quanity -= $diff;
 
-                    $quanity = $quanity - min($quanity, abs($item['fact_and_1c_diff']));
-                    $count += min($quanity, abs($item['fact_and_1c_diff']));
-//
-                    if ($count == 0) {
-                        unset($minus[$key]);
-                        unset($count);
+                    if ($quanity <= 0) {
                         break;
                     }
-                } elseif ($model->getErrors()) {
+                } else {
                     var_dump($model->errors);
                     die();
                 }