ver. 0.274 - ShopProduct mass_edit + tree UI cleanup

This commit is contained in:
2026-02-15 11:41:04 +01:00
parent 3bac7616e7
commit eb8e8fed36
22 changed files with 905 additions and 251 deletions

View File

@@ -244,4 +244,157 @@ class ProductRepository
return true;
}
/**
* Pobiera listę wszystkich produktów głównych (id => name) do masowej edycji.
* Zwraca tylko produkty bez parent_id (bez kombinacji).
*
* @return array<int, string> Mapa id => nazwa produktu
*/
public function allProductsForMassEdit(): array
{
$defaultLang = $this->db->get( 'pp_langs', 'id', [ 'start' => 1 ] );
if ( !$defaultLang ) {
$defaultLang = 'pl';
}
$results = $this->db->select( 'pp_shop_products', 'id', [ 'parent_id' => null ] );
$products = [];
if ( is_array( $results ) ) {
foreach ( $results as $id ) {
$name = $this->db->get( 'pp_shop_products_langs', 'name', [
'AND' => [ 'product_id' => $id, 'lang_id' => $defaultLang ]
] );
$products[ (int) $id ] = $name ?: '';
}
}
return $products;
}
/**
* Pobiera listę ID produktów przypisanych do danej kategorii.
*
* @param int $categoryId ID kategorii
* @return int[] Lista ID produktów
*/
public function getProductsByCategory(int $categoryId): array
{
$results = $this->db->select(
'pp_shop_products_categories',
'product_id',
[ 'category_id' => $categoryId ]
);
return is_array( $results ) ? $results : [];
}
/**
* Aplikuje rabat procentowy na produkt (cena promocyjna = cena - X%).
* Aktualizuje również ceny kombinacji produktu.
*
* @param int $productId ID produktu
* @param float $discountPercent Procent rabatu
* @return array|null Tablica z price_brutto i price_brutto_promo lub null przy błędzie
*/
public function applyDiscountPercent(int $productId, float $discountPercent): ?array
{
$product = $this->db->get( 'pp_shop_products', [
'vat', 'price_brutto', 'price_netto'
], [ 'id' => $productId ] );
if ( !$product ) {
return null;
}
$vat = $product['vat'];
$priceBrutto = (float) $product['price_brutto'];
$priceNetto = (float) $product['price_netto'];
$priceBruttoPromo = $priceBrutto - ( $priceBrutto * ( $discountPercent / 100 ) );
$priceNettoPromo = $priceNetto - ( $priceNetto * ( $discountPercent / 100 ) );
if ( $priceBrutto == $priceBruttoPromo ) {
$priceBruttoPromo = null;
}
if ( $priceNetto == $priceNettoPromo ) {
$priceNettoPromo = null;
}
$this->db->update( 'pp_shop_products', [
'price_brutto_promo' => $priceBruttoPromo,
'price_netto_promo' => $priceNettoPromo
], [ 'id' => $productId ] );
$this->updateCombinationPrices( $productId, $priceNetto, $vat, $priceNettoPromo );
return [
'price_brutto' => $priceBrutto,
'price_brutto_promo' => $priceBruttoPromo
];
}
/**
* Aktualizuje ceny kombinacji produktu uwzględniając wpływ na cenę (impact_on_the_price).
*
* @param int $productId ID produktu nadrzędnego
* @param float $priceNetto Cena netto bazowa
* @param float $vat Stawka VAT
* @param float|null $priceNettoPromo Cena promo netto bazowa (null = brak)
*/
private function updateCombinationPrices(int $productId, float $priceNetto, float $vat, ?float $priceNettoPromo): void
{
$priceBrutto = \S::normalize_decimal( $priceNetto * ( 100 + $vat ) / 100, 2 );
$priceBruttoPromo = $priceNettoPromo !== null
? \S::normalize_decimal( $priceNettoPromo * ( 100 + $vat ) / 100, 2 )
: null;
$combinations = $this->db->query(
'SELECT psp.id '
. 'FROM pp_shop_products AS psp '
. 'INNER JOIN pp_shop_products_attributes AS pspa ON psp.id = pspa.product_id '
. 'INNER JOIN pp_shop_attributes_values AS psav ON pspa.value_id = psav.id '
. 'WHERE psav.impact_on_the_price > 0 AND psp.parent_id = :product_id',
[ ':product_id' => $productId ]
);
if ( !$combinations ) {
return;
}
$rows = $combinations->fetchAll( \PDO::FETCH_ASSOC );
foreach ( $rows as $row ) {
$combBrutto = $priceBrutto;
$combBruttoPromo = $priceBruttoPromo;
$values = $this->db->query(
'SELECT impact_on_the_price FROM pp_shop_attributes_values AS psav '
. 'INNER JOIN pp_shop_products_attributes AS pspa ON pspa.value_id = psav.id '
. 'WHERE impact_on_the_price IS NOT NULL AND product_id = :product_id',
[ ':product_id' => $row['id'] ]
);
if ( $values ) {
foreach ( $values->fetchAll( \PDO::FETCH_ASSOC ) as $value ) {
$combBrutto += $value['impact_on_the_price'];
if ( $combBruttoPromo !== null ) {
$combBruttoPromo += $value['impact_on_the_price'];
}
}
}
$combNetto = \S::normalize_decimal( $combBrutto / ( 100 + $vat ) * 100, 2 );
$combNettoPromo = $combBruttoPromo !== null
? \S::normalize_decimal( $combBruttoPromo / ( 100 + $vat ) * 100, 2 )
: null;
$this->db->update( 'pp_shop_products', [
'price_netto' => $combNetto,
'price_brutto' => $combBrutto,
'price_netto_promo' => $combNettoPromo,
'price_brutto_promo' => $combBruttoPromo
], [ 'id' => $row['id'] ] );
}
}
}