])
->select('p1n.id');
+ $storeId = Yii::$app->request->get('store', 4);
+
$products = Products1c::find()
->alias('p1n')
->leftJoin('prices p', 'p.product_id = p1n.id')
->leftJoin('matrix_erp_property_dynamic mep', 'mep.product_id = p1n.id AND mep.active = 1')
+ ->leftJoin('marketplace_priority mp', 'mp.guid::text = mep.product_id')
->leftJoin(['mp_check' => new \yii\db\Expression("
- LATERAL (
- SELECT
- bool_or(mp.minimal_quantity > (j.value::numeric)) AS has_insufficient_quantity,
- string_agg(
- format(
- 'Недостаточно \"%s\" (нужно ≥ %s, указано %s)',
- j.guid,
- mp.minimal_quantity,
- j.value
- ),
- E'\n'
- ) FILTER (WHERE mp.minimal_quantity > (j.value::numeric)) AS insuff_reason
- FROM jsonb_each_text(mep.value::jsonb) AS j(guid, value)
- JOIN marketplace_priority mp ON mp.id::text = j.guid
- )
-")], 'true')
-
+ LATERAL (
+ SELECT
+ bool_or(COALESCE(b.quantity, 0) < (j.value::numeric * mp.reminder_koef)) AS has_insufficient_quantity,
+ string_agg(
+ format(
+ 'Недостаточно товара %s (нужно ≥ %s, на складе %s)',
+ prod.name,
+ (j.value::numeric * mp.reminder_koef),
+ COALESCE(b.quantity::text, '0')
+ ),
+ E'\n'
+ ) FILTER (WHERE COALESCE(b.quantity, 0) < (j.value::numeric * mp.reminder_koef)) AS insuff_reason
+ FROM jsonb_each(
+ replace(trim(both '\"' from mep.value), '\"\"', '\"')::jsonb
+ ) AS j(key, value)
+ LEFT JOIN balances b ON b.product_id::text = j.key AND b.store_id = '{$storeId}'
+ LEFT JOIN products_1c prod ON prod.id::text = j.key
+ )
+ ")], 'true')
->select([
'p1n.id',
'p1n.name',
'p1n.articule',
new \yii\db\Expression("
- CASE
- WHEN mep.id IS NULL AND p.price IS NULL THEN
- 'Не имеет состава букета в MatrixErpProperty и нет цены'
- WHEN mep.id IS NULL THEN
- 'Не имеет состава букета в MatrixErpProperty'
- WHEN p.price IS NULL THEN
- 'Нет цены'
- WHEN mp_check.has_insufficient_quantity THEN
- mp_check.insuff_reason
- ELSE NULL
- END AS reason
- "),
+ (
+ 'Коэффициент: ' || COALESCE(mp.reminder_koef::text, 'N/A') || E'\n' ||
+ COALESCE(
+ concat_ws(
+ E'\n',
+ CASE WHEN mep.id IS NULL THEN 'Не имеет состава букета' ELSE NULL END,
+ CASE WHEN p.price IS NULL THEN 'Нет имеет цены' ELSE NULL END
+ ),
+ ''
+ )
+ ||
+ CASE WHEN mp_check.has_insufficient_quantity THEN
+ E'\n' || mp_check.insuff_reason
+ ELSE ''
+ END
+ ) AS reason
+")
+
+ ,
new \yii\db\Expression("
CASE
WHEN mep.id IS NULL OR p.price IS NULL OR mp_check.has_insufficient_quantity THEN FALSE
ELSE TRUE
END AS is_valid
- ")
+ "),
])
->where(['in', 'parent_id', $subQuery])
+ ->orderBy(['is_valid' => SORT_ASC])
->asArray()
->all();
+
$dataProvider = new ArrayDataProvider([
'allModels' => $products,
'pagination' => ['pageSize' => 20],