134 lines
3.8 KiB
PHP
134 lines
3.8 KiB
PHP
<?php
|
|
namespace Domain\Product;
|
|
|
|
/**
|
|
* Repository odpowiedzialny za dostęp do danych produktów
|
|
*
|
|
* Zgodnie z wzorcem Repository Pattern, ta klasa enkapsuluje
|
|
* logikę dostępu do bazy danych dla produktów.
|
|
*/
|
|
class ProductRepository
|
|
{
|
|
/**
|
|
* @var \medoo Instancja Medoo ORM
|
|
*/
|
|
private $db;
|
|
|
|
/**
|
|
* Konstruktor - przyjmuje instancję bazy danych
|
|
*
|
|
* @param \medoo $db Instancja Medoo ORM
|
|
*/
|
|
public function __construct($db)
|
|
{
|
|
$this->db = $db;
|
|
}
|
|
|
|
/**
|
|
* Pobiera stan magazynowy produktu
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @return int|null Ilość produktu lub null jeśli nie znaleziono
|
|
*/
|
|
public function getQuantity(int $productId): ?int
|
|
{
|
|
$quantity = $this->db->get('pp_shop_products', 'quantity', ['id' => $productId]);
|
|
|
|
// Medoo zwraca false jeśli nie znaleziono
|
|
return $quantity !== false ? (int)$quantity : null;
|
|
}
|
|
|
|
/**
|
|
* Pobiera produkt po ID
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @return array|null Dane produktu lub null
|
|
*/
|
|
public function find(int $productId): ?array
|
|
{
|
|
$product = $this->db->get('pp_shop_products', '*', ['id' => $productId]);
|
|
return $product ?: null;
|
|
}
|
|
|
|
/**
|
|
* Pobiera cenę produktu (promocyjną jeśli jest niższa, w przeciwnym razie regularną)
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @return float|null Cena brutto lub null jeśli nie znaleziono
|
|
*/
|
|
public function getPrice(int $productId): ?float
|
|
{
|
|
$prices = $this->db->get('pp_shop_products', ['price_brutto', 'price_brutto_promo'], ['id' => $productId]);
|
|
|
|
if (!$prices) {
|
|
return null;
|
|
}
|
|
|
|
if ($prices['price_brutto_promo'] != '' && $prices['price_brutto_promo'] < $prices['price_brutto']) {
|
|
return (float)$prices['price_brutto_promo'];
|
|
}
|
|
|
|
return (float)$prices['price_brutto'];
|
|
}
|
|
|
|
/**
|
|
* Pobiera nazwę produktu w danym języku
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @param string $langId ID języka
|
|
* @return string|null Nazwa produktu lub null jeśli nie znaleziono
|
|
*/
|
|
public function getName(int $productId, string $langId): ?string
|
|
{
|
|
$name = $this->db->get('pp_shop_products_langs', 'name', ['AND' => ['product_id' => $productId, 'lang_id' => $langId]]);
|
|
|
|
return $name ?: null;
|
|
}
|
|
|
|
/**
|
|
* Aktualizuje ilość produktu
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @param int $quantity Nowa ilość
|
|
* @return bool Czy aktualizacja się powiodła
|
|
*/
|
|
public function updateQuantity(int $productId, int $quantity): bool
|
|
{
|
|
$result = $this->db->update(
|
|
'pp_shop_products',
|
|
['quantity' => $quantity],
|
|
['id' => $productId]
|
|
);
|
|
|
|
return $result !== false;
|
|
}
|
|
|
|
/**
|
|
* Przywraca produkt z archiwum (wraz z kombinacjami)
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @return bool Czy operacja się powiodła
|
|
*/
|
|
public function unarchive(int $productId): bool
|
|
{
|
|
$this->db->update( 'pp_shop_products', [ 'status' => 1, 'archive' => 0 ], [ 'id' => $productId ] );
|
|
$this->db->update( 'pp_shop_products', [ 'status' => 1, 'archive' => 0 ], [ 'parent_id' => $productId ] );
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Przenosi produkt do archiwum (wraz z kombinacjami)
|
|
*
|
|
* @param int $productId ID produktu
|
|
* @return bool Czy operacja się powiodła
|
|
*/
|
|
public function archive(int $productId): bool
|
|
{
|
|
$this->db->update( 'pp_shop_products', [ 'status' => 0, 'archive' => 1 ], [ 'id' => $productId ] );
|
|
$this->db->update( 'pp_shop_products', [ 'status' => 0, 'archive' => 1 ], [ 'parent_id' => $productId ] );
|
|
|
|
return true;
|
|
}
|
|
}
|