ver. 0.292: ShopProduct + ShopPaymentMethod + ShopPromotion + ShopStatuses + ShopTransport frontend migration to Domain

Full migration of front\factory\ — entire directory removed (all 20 classes migrated).
ProductRepository +20 frontend methods, PromotionRepository +5 applyType methods,
TransportRepository +4 cached methods, PaymentMethodRepository +cached frontend methods.
Fix: broken transports_list() in ajax.php replaced with forPaymentMethod().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 21:55:16 +01:00
parent 827b903e1e
commit 89d9e61bec
48 changed files with 1780 additions and 975 deletions

View File

@@ -419,4 +419,217 @@ class PromotionRepository
// Cache invalidation should not block save/delete.
}
}
// =========================================================================
// Frontend: basket promotion logic (migrated from front\factory\ShopPromotion)
// =========================================================================
/**
* Promocja na cały koszyk (condition_type=4)
*/
public function applyTypeWholeBasket(array $basket, $promotion): array
{
$productRepo = new \Domain\Product\ProductRepository( $this->db );
foreach ( $basket as $key => $val )
{
$product_promotion = \shop\Product::is_product_on_promotion( $val['product-id'] );
if ( !$product_promotion or $product_promotion and $promotion->include_product_promo )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
$basket[$key]['discount_type'] = $promotion->discount_type;
$basket[$key]['discount_amount'] = $promotion->amount;
$basket[$key]['discount_include_coupon'] = $promotion->include_coupon;
$basket[$key]['include_product_promo'] = $promotion->include_product_promo;
}
}
}
return $basket;
}
/**
* Promocja na najtańszy produkt z kategorii 1 lub 2 (condition_type=3)
*/
public function applyTypeCheapestProduct(array $basket, $promotion): array
{
$productRepo = new \Domain\Product\ProductRepository( $this->db );
$condition_1 = false;
$categories = json_decode( $promotion->categories );
if ( is_array( $categories ) and is_array( $categories ) )
{
foreach ( $basket as $key => $val )
{
$product_promotion = \shop\Product::is_product_on_promotion( $val['product-id'] );
if ( !$product_promotion or $product_promotion and $promotion->include_product_promo )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( !$condition_1[$key] and in_array( $category_tmp['category_id'], $categories ) )
$condition_1[$key] = true;
}
}
}
}
if ( count( $condition_1 ) >= $promotion->min_product_count )
{
$cheapest_position = false;
foreach ( $basket as $key => $val )
{
$price = \shop\Product::get_product_price( $val['product-id'] );
if ( !$cheapest_position or $cheapest_position['price'] > $price )
{
$cheapest_position['price'] = $price;
$cheapest_position['key'] = $key;
}
}
$basket[$cheapest_position['key']]['quantity'] = 1;
$basket[$cheapest_position['key']]['discount_type'] = 3;
$basket[$cheapest_position['key']]['discount_amount'] = $promotion->price_cheapest_product;
$basket[$cheapest_position['key']]['discount_include_coupon'] = $promotion->include_coupon;
$basket[$cheapest_position['key']]['include_product_promo'] = $promotion->include_product_promo;
}
return $basket;
}
/**
* Promocja na wszystkie produkty z kategorii 1 lub 2 (condition_type=5)
*/
public function applyTypeCategoriesOr(array $basket, $promotion): array
{
$productRepo = new \Domain\Product\ProductRepository( $this->db );
$categories = json_decode( $promotion->categories );
$condition_categories = json_decode( $promotion->condition_categories );
foreach ( $basket as $key => $val )
{
$product_promotion = \shop\Product::is_product_on_promotion( $val['product-id'] );
if ( !$product_promotion or $product_promotion and $promotion->include_product_promo )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( in_array( $category_tmp['category_id'], $condition_categories ) or in_array( $category_tmp['category_id'], $categories ) )
{
$basket[$key]['discount_type'] = $promotion->discount_type;
$basket[$key]['discount_amount'] = $promotion->amount;
$basket[$key]['discount_include_coupon'] = $promotion->include_coupon;
$basket[$key]['include_product_promo'] = $promotion->include_product_promo;
}
}
}
}
return $basket;
}
/**
* Promocja na produkty z kategorii 1 i 2 (condition_type=2)
*/
public function applyTypeCategoriesAnd(array $basket, $promotion): array
{
$productRepo = new \Domain\Product\ProductRepository( $this->db );
$condition_1 = false;
$condition_2 = false;
$categories = json_decode( $promotion->categories );
$condition_categories = json_decode( $promotion->condition_categories );
if ( is_array( $condition_categories ) and is_array( $categories ) )
{
foreach ( $basket as $key => $val )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( !$condition_1 and in_array( $category_tmp['category_id'], $condition_categories ) )
{
$condition_1 = true;
}
}
}
foreach ( $basket as $key => $val )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( !$condition_2 and in_array( $category_tmp['category_id'], $categories ) )
$condition_2 = true;
}
}
}
if ( $condition_1 and $condition_2 )
{
foreach ( $basket as $key => $val )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( in_array( $category_tmp['category_id'], $categories ) or in_array( $category_tmp['category_id'], $condition_categories ) )
{
$basket[$key]['discount_type'] = $promotion->discount_type;
$basket[$key]['discount_amount'] = $promotion->amount;
$basket[$key]['discount_include_coupon'] = $promotion->include_coupon;
$basket[$key]['include_product_promo'] = $promotion->include_product_promo;
}
}
}
}
return $basket;
}
/**
* Rabat procentowy na produkty z kategorii I jeżeli w koszyku jest produkt z kategorii II (condition_type=1)
*/
public function applyTypeCategoryCondition(array $basket, $promotion): array
{
$productRepo = new \Domain\Product\ProductRepository( $this->db );
$condition = false;
$categories = json_decode( $promotion->categories );
$condition_categories = json_decode( $promotion->condition_categories );
if ( is_array( $condition_categories ) and is_array( $categories ) )
{
foreach ( $basket as $key => $val )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( in_array( $category_tmp['category_id'], $condition_categories ) )
{
$condition = true;
}
}
}
}
if ( $condition )
{
foreach ( $basket as $key => $val )
{
$product_categories = $productRepo->productCategoriesFront( (int) $val['product-id'] );
foreach ( $product_categories as $category_tmp )
{
if ( in_array( $category_tmp['category_id'], $categories ) )
{
$basket[$key]['discount_type'] = $promotion->discount_type;
$basket[$key]['discount_amount'] = $promotion->amount;
$basket[$key]['discount_include_coupon'] = $promotion->include_coupon;
$basket[$key]['include_product_promo'] = $promotion->include_product_promo;
}
}
}
}
return $basket;
}
}