Files
xstore/inc/Hura8/Components/Product/Model/ProductVariantModel.php
2025-10-04 11:46:59 +07:00

182 lines
5.4 KiB
PHP

<?php
namespace Hura8\Components\Product\Model;
use Hura8\Components\Product\Controller\ProductController;
use Hura8\Interfaces\AppResponse;
use Hura8\System\Model\aEntityBaseModel;
use Hura8\System\Security\DataClean;
use Hura8\System\Security\DataType;
class ProductVariantModel extends aEntityBaseModel
{
protected $product_id = 0;
protected $tb_product = "tb_product";
protected $tb_variant_option_sample = "tb_product_variant_option_sample";
public function __construct($product_id) {
parent::__construct('product_variant');
$this->product_id = $product_id;
}
protected function extendedFilterOptions() : array
{
return [
// empty for now
];
}
public function getProductVariantOption($product_id){
$query = $this->db->runQuery("SELECT `variant_option` FROM `".$this->tb_product."` WHERE `id` = ? LIMIT 1", ['d'], [ $product_id ]) ;
if($rs = $this->db->fetchAssoc($query)) {
return ($rs['variant_option']) ? \json_decode($rs['variant_option'], true) : null;
}
return null;
}
//use a product's variant-option to create a sample, so next product can select without recreate from beginning
public function createVariantOptionSample($use_from_pro_id, $sample_title) {
if( !$use_from_pro_id || strlen($sample_title) < 3 ) return false;
$pro_variant_option = $this->getProductVariantOption($use_from_pro_id);
if(!$pro_variant_option) {
return false;
}
$pro_variant_option_index = md5(\json_encode($pro_variant_option));
$check_duplicate = $this->db->runQuery(
"SELECT `id` FROM ".$this->tb_variant_option_sample." WHERE `variant_option_index` = ? LIMIT 1 ",
['s'], [ $pro_variant_option_index ]
);
if($this->db->fetchAssoc($check_duplicate)) {
return false;
}
// ok to save
$this->db->insert(
$this->tb_variant_option_sample,
[
"title" => $sample_title,
"variant_option" => \json_encode($pro_variant_option),
"variant_option_index" => $pro_variant_option_index,
"create_time" => CURRENT_TIME,
]
);
return true;
}
public function getVariantOptionSample() {
$query = $this->db->runQuery("SELECT * FROM ".$this->tb_variant_option_sample." ORDER BY `id` DESC LIMIT 500 ");
return $this->db->fetchAll($query);
}
public function getProductVariantPriceRange(){
$result = [
"sale_price" => [
"min" => 0,
"max" => 0,
],
"market_price" => [
"min" => 0,
"max" => 0,
],
];
$query = $this->db->runQuery(
" SELECT `sale_price`, `market_price`, `extend` FROM `".$this->tb_entity."` WHERE `product_id` = ? ",
['d'], [$this->product_id]
);
foreach ( $this->db->fetchAll($query) as $info) {
// find min
if($info["sale_price"] > 0 && ( $info["sale_price"] < $result["sale_price"]["min"] || $result["sale_price"]["min"] == 0 ) ) {
$result["sale_price"]["min"] = $info["sale_price"];
}
// find max
if($info["sale_price"] > 0 && $info["sale_price"] > $result["sale_price"]["max"] ) {
$result["sale_price"]["max"] = $info["sale_price"];
}
// market_price
$market_price = $info["market_price"];
if($info['extend']) {
$extend = unserialize($info['extend']);
if(isset($extend['market_price'])) $market_price = clean_price($extend['market_price'], "vnd");
}
if($market_price > 0 && ( $market_price < $result["market_price"]["min"] || $result["market_price"]["min"] == 0 ) ) {
$result["market_price"]["min"] = $market_price;
}
if($market_price > 0 && $market_price > $result["market_price"]["max"] ) {
$result["market_price"]["max"] = $market_price;
}
}
return $result;
}
protected function _buildQueryConditionExtend(array $filter_condition) : ?array
{
$where_condition = " AND `product_id` = ? ";
$bind_types = ["d"];
$bind_values = [$this->product_id];
return [
$where_condition,
$bind_types,
$bind_values
];
}
protected function _buildQueryOrderBy($sort_by = "new")
{
return " `ordering` DESC, `id` DESC ";
}
protected function formatItemInList(array $item_info): array
{
$info = $item_info;
if($item_info['attribute']) $info['attribute'] = \json_decode($item_info['attribute'], true);
return $info;
}
protected function updateProductVariantCount() {
$this->db->runQuery(
"UPDATE ".$this->tb_product." SET
`config_count` = ( SELECT COUNT(*) AS total FROM `".$this->tb_entity."` WHERE `product_id` = ? AND `status` = 1 )
WHERE `id` = ? ",
['d', 'd'], [ $this->product_id, $this->product_id]
) ;
}
protected function formatItemInfo(array $item_info) : ?array
{
$info = $item_info;
if($info['attribute']) $info['attribute'] = \json_decode($info['attribute'], true);
return $info;
}
}