- Created `Articles` class for rendering article views including full articles, miniature lists, and news sections. - Added `Banners` class for handling banner displays. - Introduced `Languages` class for rendering language options. - Implemented `Menu` class for rendering page and menu structures. - Developed `Newsletter` class for newsletter rendering. - Created `Scontainers` class for rendering specific containers. - Added `ShopCategory` class for managing shop category views and pagination. - Implemented `ShopClient` class for client-related views including address management and login forms. - Created `ShopPaymentMethod` class for displaying payment methods in the basket. - Added `ShopProduct` class for generating product URLs. - Introduced `ShopSearch` class for rendering a simple search form. - Added `.htaccess` file in the plugins directory to enhance security by restricting access to sensitive files and directories.
239 lines
10 KiB
PHP
239 lines
10 KiB
PHP
<?php
|
|
namespace Domain\Basket;
|
|
|
|
class BasketCalculator
|
|
{
|
|
public static function summaryWp($basket)
|
|
{
|
|
$wp = 0;
|
|
if (is_array($basket)) {
|
|
foreach ($basket as $product) {
|
|
$wp += $product['wp'] * $product['quantity'];
|
|
}
|
|
}
|
|
return $wp;
|
|
}
|
|
|
|
public static function countProductsText($count)
|
|
{
|
|
$count = (int)$count;
|
|
if ($count === 1) {
|
|
return $count . ' produkt';
|
|
}
|
|
if ($count >= 2 && $count <= 4) {
|
|
return $count . ' produkty';
|
|
}
|
|
return $count . ' produktów';
|
|
}
|
|
|
|
/**
|
|
* @param string|null $langId Language ID (falls back to global $lang_id if null)
|
|
* @param \Domain\Product\ProductRepository|null $productRepo (falls back to $GLOBALS['mdb'] if null)
|
|
*/
|
|
public static function summaryPrice($basket, $coupon = null, $langId = null, $productRepo = null)
|
|
{
|
|
if ($langId === null) {
|
|
global $lang_id;
|
|
$langId = $lang_id;
|
|
}
|
|
if ($productRepo === null) {
|
|
$productRepo = new \Domain\Product\ProductRepository($GLOBALS['mdb']);
|
|
}
|
|
|
|
$summary = 0;
|
|
|
|
if (is_array($basket)) {
|
|
foreach ($basket as $position) {
|
|
$product = $productRepo->findCached((int)$position['product-id'], $langId);
|
|
|
|
$product_price_tmp = self::calculateBasketProductPrice(
|
|
(float)($product['price_brutto_promo'] ?? 0),
|
|
(float)($product['price_brutto'] ?? 0),
|
|
$coupon,
|
|
$position,
|
|
$productRepo
|
|
);
|
|
$summary += $product_price_tmp['price_new'] * $position['quantity'];
|
|
}
|
|
}
|
|
|
|
return \Shared\Helpers\Helpers::normalize_decimal($summary);
|
|
}
|
|
|
|
public static function countProducts($basket)
|
|
{
|
|
$count = 0;
|
|
if (is_array($basket)) {
|
|
foreach ($basket as $product) {
|
|
$count += $product['quantity'];
|
|
}
|
|
}
|
|
return $count;
|
|
}
|
|
|
|
public static function validateBasket($basket)
|
|
{
|
|
if ( !is_array( $basket ) )
|
|
return array();
|
|
|
|
return $basket;
|
|
}
|
|
|
|
public static function checkProductQuantityInStock($basket, bool $message = false)
|
|
{
|
|
if ( !is_array( $basket ) || empty( $basket ) )
|
|
return false;
|
|
|
|
$result = false;
|
|
$productRepo = new \Domain\Product\ProductRepository($GLOBALS['mdb']);
|
|
|
|
foreach ( $basket as $key => $val )
|
|
{
|
|
$permutation = null;
|
|
|
|
if ( isset( $val['parent_id'] ) and (int)$val['parent_id'] and isset( $val['product-id'] ) )
|
|
$permutation = $productRepo->getProductPermutationHash( (int)$val['product-id'] );
|
|
|
|
if ( !$permutation and isset( $val['attributes'] ) and is_array( $val['attributes'] ) and count( $val['attributes'] ) )
|
|
$permutation = implode( '|', $val['attributes'] );
|
|
|
|
$quantity_options = $productRepo->getProductPermutationQuantityOptions(
|
|
$val['parent_id'] ? $val['parent_id'] : $val['product-id'],
|
|
$permutation
|
|
);
|
|
|
|
if (
|
|
(int)$basket[ $key ][ 'quantity' ] < 1
|
|
and ( (int)$quantity_options['quantity'] > 0 or (int)$quantity_options['stock_0_buy'] === 1 )
|
|
)
|
|
{
|
|
$basket[ $key ][ 'quantity' ] = 1;
|
|
$result = true;
|
|
}
|
|
|
|
if ( ( $val[ 'quantity' ] > $quantity_options['quantity'] ) and !$quantity_options['stock_0_buy'] )
|
|
{
|
|
$basket[ $key ][ 'quantity' ] = $quantity_options['quantity'];
|
|
if ( $message )
|
|
\Shared\Helpers\Helpers::error( 'Ilość jednego lub więcej produktów została zmniejszona z powodu niestarczających stanów magazynowych. Sprawdź proszę koszyk.' );
|
|
$result = true;
|
|
}
|
|
}
|
|
\Shared\Helpers\Helpers::set_session( 'basket', $basket );
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Calculate product price in basket (with coupon + promotion discounts).
|
|
* Migrated from \shop\Product::calculate_basket_product_price()
|
|
*/
|
|
/**
|
|
* @param \Domain\Product\ProductRepository|null $productRepo (falls back to $GLOBALS['mdb'] if null)
|
|
*/
|
|
public static function calculateBasketProductPrice( float $price_brutto_promo, float $price_brutto, $coupon, $basket_position, $productRepo = null )
|
|
{
|
|
if ($productRepo === null) {
|
|
$productRepo = new \Domain\Product\ProductRepository($GLOBALS['mdb']);
|
|
}
|
|
|
|
// Produkty przecenione
|
|
if ( $price_brutto_promo )
|
|
{
|
|
$price['price'] = $price_brutto;
|
|
$price['price_new'] = $price_brutto_promo;
|
|
|
|
$coupon_type = is_array($coupon) ? ($coupon['type'] ?? null) : (is_object($coupon) ? $coupon->type : null);
|
|
$coupon_include_discounted = is_array($coupon) ? ($coupon['include_discounted_product'] ?? null) : (is_object($coupon) ? $coupon->include_discounted_product : null);
|
|
$coupon_categories = is_array($coupon) ? ($coupon['categories'] ?? null) : (is_object($coupon) ? $coupon->categories : null);
|
|
$coupon_amount = is_array($coupon) ? ($coupon['amount'] ?? 0) : (is_object($coupon) ? $coupon->amount : 0);
|
|
|
|
if ( $coupon_type && $coupon_include_discounted )
|
|
{
|
|
if ( $coupon_categories != null )
|
|
{
|
|
$cats = is_string($coupon_categories) ? json_decode($coupon_categories) : $coupon_categories;
|
|
$product_categories = $productRepo->productCategories( (int)$basket_position['parent_id'] ? (int)$basket_position['parent_id'] : (int)$basket_position['product-id'] );
|
|
if ( is_array( $cats ) ) foreach ( $cats as $category_tmp )
|
|
{
|
|
if ( in_array( $category_tmp, $product_categories ) )
|
|
{
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $price['price_new'] - $price['price_new'] * $coupon_amount / 100 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $price['price_new'] - $price['price_new'] * $coupon_amount / 100 );
|
|
|
|
if ( $basket_position['discount_amount'] && $basket_position['discount_include_coupon'] && $basket_position['include_product_promo'] )
|
|
{
|
|
if ( $basket_position['discount_type'] == 3 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $basket_position['discount_amount'] );
|
|
if ( $basket_position['discount_type'] == 1 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal($price['price_new'] - $price['price_new'] * $basket_position['discount_amount'] / 100 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( $basket_position['discount_amount'] && $basket_position['include_product_promo'] )
|
|
{
|
|
if ( $basket_position['discount_type'] == 3 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $basket_position['discount_amount'] );
|
|
if ( $basket_position['discount_type'] == 1 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal($price['price_new'] - $price['price_new'] * $basket_position['discount_amount'] / 100 );
|
|
}
|
|
}
|
|
}
|
|
// Produkt nieprzeceniony
|
|
else
|
|
{
|
|
$price['price'] = $price_brutto;
|
|
$price['price_new'] = $price_brutto;
|
|
|
|
$coupon_type = is_array($coupon) ? ($coupon['type'] ?? null) : (is_object($coupon) ? $coupon->type : null);
|
|
$coupon_categories = is_array($coupon) ? ($coupon['categories'] ?? null) : (is_object($coupon) ? $coupon->categories : null);
|
|
$coupon_amount = is_array($coupon) ? ($coupon['amount'] ?? 0) : (is_object($coupon) ? $coupon->amount : 0);
|
|
|
|
if ( $coupon_type )
|
|
{
|
|
if ( $coupon_categories != null )
|
|
{
|
|
$cats = is_string($coupon_categories) ? json_decode($coupon_categories) : $coupon_categories;
|
|
$product_categories = $productRepo->productCategories( $basket_position['parent_id'] ? $basket_position['parent_id'] : $basket_position['product-id'] );
|
|
if ( is_array( $cats ) ) foreach ( $cats as $category_tmp )
|
|
{
|
|
if ( in_array( $category_tmp, $product_categories ) )
|
|
{
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $price['price_new'] - $price['price_new'] * $coupon_amount / 100 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal($price['price'] - $price['price'] * $coupon_amount / 100 );
|
|
|
|
if ( $basket_position['discount_amount'] && $basket_position['discount_include_coupon'] && $basket_position['include_product_promo'] )
|
|
{
|
|
if ( $basket_position['discount_type'] == 3 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $basket_position['discount_amount'] );
|
|
if ( $basket_position['discount_type'] == 1 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal($price['price'] - $price['price'] * $basket_position['discount_amount'] / 100 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( $basket_position['discount_amount'] )
|
|
{
|
|
if ( $basket_position['discount_type'] == 3 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal( $basket_position['discount_amount'] );
|
|
if ( $basket_position['discount_type'] == 1 )
|
|
$price['price_new'] = \Shared\Helpers\Helpers::normalize_decimal($price['price'] - $price['price'] * $basket_position['discount_amount'] / 100 );
|
|
}
|
|
}
|
|
}
|
|
|
|
return $price;
|
|
}
|
|
}
|