price variant

This commit is contained in:
Bayu Lukman Yusuf 2026-01-05 10:52:01 +07:00
parent 7173d2c117
commit 695494a2d9
10 changed files with 48 additions and 86 deletions

View File

@ -20,12 +20,12 @@ LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug LOG_LEVEL=debug
DB_CONNECTION=sqlite DB_CONNECTION=pgsql
# DB_HOST=127.0.0.1 DB_HOST=127.0.0.1
# DB_PORT=3306 DB_PORT=5432
# DB_DATABASE=laravel DB_DATABASE=asiagolf
# DB_USERNAME=root DB_USERNAME=postgres
# DB_PASSWORD= DB_PASSWORD=12345678
SESSION_DRIVER=file SESSION_DRIVER=file
SESSION_LIFETIME=120 SESSION_LIFETIME=120
@ -37,7 +37,7 @@ BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local FILESYSTEM_DISK=local
QUEUE_CONNECTION=database QUEUE_CONNECTION=database
CACHE_STORE=database CACHE_STORE=file
# CACHE_PREFIX= # CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1 MEMCACHED_HOST=127.0.0.1

View File

@ -13,11 +13,13 @@ class ProductController extends Controller
$product = Items::where('slug', $slug)->first(); $product = Items::where('slug', $slug)->first();
if ($product == null) { if ($product == null) {
abort(404); abort(404);
} }
$complete_look_products_data = $productRepository->getList([ $complete_look_products_data = $productRepository->getList([
'category_id' => $product->category1_id, 'category_id' => $product->category1_id,
'limit' => 4, 'limit' => 4,

View File

@ -72,50 +72,7 @@ class ItemVariant extends Model
return $this->belongsTo(Items::class, 'item_id'); return $this->belongsTo(Items::class, 'item_id');
} }
public function conversion_value()
{
$item = $this->item;
$convertion = 1;
if (($item->display_unit != $item->unit) and ($item->display_unit)){
$convertions = DB::select("select to_qty / from_qty as conv
from item_convertions where from_unit = ? and to_unit = ?",
[$item->display_unit, $item->unit] );
$convertion = max((float) @$convertions[0]->conv,1);
}
return $convertion;
}
public function getDisplayPriceAttribute()
{
try {
$convertion = $this->conversion_value();
$price = $this->reference->price->price ?? null;
$price = $price ? $price : $this->item->net_price;
return (float) $price * $convertion;
} catch (\Exception $e) {
Log::info($e);
return 0;
}
}
public function getDisplayDiscountPriceAttribute()
{
try {
$convertion = $this->conversion_value();
$discountPrice = @$this->discount->price ?? 0;
return (float) $discountPrice * $convertion;
} catch (\Exception $e) {
return 0;
}
}
} }

View File

@ -3,20 +3,18 @@
namespace App\Repositories\Catalog; namespace App\Repositories\Catalog;
use App\Models\Brand; use App\Models\Brand;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Image; use Illuminate\Support\Facades\DB;
use Storage;
class BrandRepository class BrandRepository
{ {
public function getList($params)
{
return Cache::remember('catalog_brand_'.json_encode($params), 60, function () use ($params) {
public function getList($params){ $category_id = @$params['category_id'];
return Cache::remember("catalog_brand_".json_encode($params),60, function() use ($params) { if ($category_id) {
$ids = DB::select('select distinct brand from store_category_map a
$category_id = @$params["category_id"];
if ($category_id){
$ids = DB::select("select distinct brand from store_category_map a
left join item_dimension b left join item_dimension b
left join items on b.no = items.number left join items on b.no = items.number
on a.category1 = b.category1 on a.category1 = b.category1
@ -24,17 +22,19 @@ class BrandRepository
and (a.category3 = b.category3 or a.category3 is null) and (a.category3 = b.category3 or a.category3 is null)
and (a.category4 = b.category4 or a.category4 is null) and (a.category4 = b.category4 or a.category4 is null)
where store_category_id = ? where store_category_id = ?
and items.is_publish = true ",[$category_id]); and items.is_publish = true ', [$category_id]);
$ids = collect($ids)->pluck("brand"); $ids = collect($ids)->pluck('brand');
return Brand::whereIn("name",$ids)->orderBy('priority', 'desc')
->where("priority",">",0)
->orderBy('name', 'asc')->get();
}
return Brand::orderBy('priority', 'desc')->orderBy('name', 'asc')
->where("priority",">",0)
->get();
}); return Brand::whereIn('name', $ids)->orderBy('priority', 'desc')
->where('priority', '>', 0)
->orderBy('name', 'asc')->get();
}
return Brand::orderBy('priority', 'desc')->orderBy('name', 'asc')
->where('priority', '>', 0)
->get();
});
} }
} }

View File

@ -8,7 +8,7 @@ use Illuminate\View\View;
class LocationSelector extends Component class LocationSelector extends Component
{ {
public Location $selected; public ?Location $selected;
public $locations; public $locations;

View File

@ -8,7 +8,7 @@ use Illuminate\View\View;
class LocationSelectorSidebar extends Component class LocationSelectorSidebar extends Component
{ {
public Location $selected; public ?Location $selected;
public $locations; public $locations;

View File

@ -94,7 +94,7 @@ return [
'prefix' => '', 'prefix' => '',
'prefix_indexes' => true, 'prefix_indexes' => true,
'search_path' => 'public', 'search_path' => 'public',
'sslmode' => 'prefer', 'sslmode' => 'disable',
], ],
'sqlsrv' => [ 'sqlsrv' => [

View File

@ -11,7 +11,7 @@
aria-label="Add to Wishlist"> aria-label="Add to Wishlist">
<i class="ci-heart animate-target"></i> <i class="ci-heart animate-target"></i>
</button> </button>
<a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('product.detail', $product->slug) }}"> <a class="d-flex bg-body-tertiary rounded p-3" href="{{ route('product.detail', $product->slug ?? '0') }}">
<div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)"> <div class="ratio" style="--cz-aspect-ratio: calc(308 / 274 * 100%)">
<img src="{{ $product->image_url }}" loading="lazy" class="w-100 h-100 object-cover"> <img src="{{ $product->image_url }}" loading="lazy" class="w-100 h-100 object-cover">
</div> </div>
@ -33,7 +33,7 @@
</div> </div>
<div class="nav mb-2"> <div class="nav mb-2">
<a class="nav-link animate-target min-w-0 text-dark-emphasis p-0" <a class="nav-link animate-target min-w-0 text-dark-emphasis p-0"
href="{{ route('product.detail', $product->slug) }}"> href="{{ route('product.detail', $product->slug ?? '0') }}">
<span class="text-truncate">{{ $product->name ?? '' }}</span> <span class="text-truncate">{{ $product->name ?? '' }}</span>
</a> </a>
</div> </div>

View File

@ -203,6 +203,7 @@
<!-- LOcation selector visible on screens > 768px wide (md breakpoint) --> <!-- LOcation selector visible on screens > 768px wide (md breakpoint) -->
<x-location-selector /> <x-location-selector />
</div> </div>
<!-- Navbar brand (Logo) --> <!-- Navbar brand (Logo) -->

View File

@ -1809,21 +1809,23 @@
@endif @endif
<div class="h4 d-flex align-items-center my-4"> <div class="h4 d-flex align-items-center my-4">
<span class="display_price">Rp {{ number_format($product->display_price, 0, ',', '.') }}</span> <span class="display_price">Rp {{ number_format($product->display_price, 0, ',', '.') }}</span>
<del class="display_discount_price fs-sm fw-normal text-body-tertiary ms-2" style="display: {{ $product->discount_display_price ? 'inline' : 'none' }};">{{ $product->discount_display_price ? ' Rp ' . number_format($product->discount_display_price, 0, ',', '.') : '' }}</del> <del class="display_discount_price fs-sm fw-normal text-body-tertiary ms-2" style="display: {{ $product->display_discount_price ? 'inline' : 'none' }};">{{ $product->display_discount_price ? ' Rp ' . number_format($product->display_discount_price, 0, ',', '.') : '' }}</del>
</div> </div>
<!-- Color options --> <!-- Color options -->
<div class="mb-4"> <div class="mb-4">
<label class="form-label fw-semibold pb-1 mb-2">Varian: <span class="text-body fw-normal" <label class="form-label fw-semibold pb-1 mb-2">Varian: <span class="text-body fw-normal"
id="colorOption">{{ $product->variants->first()->description ?? '' }}</span></label> id="variantOption">{{ $product->variants->first()->description ?? '' }}</span></label>
<div class="d-flex flex-wrap gap-2" data-binded-label="#colorOption"> <div class="d-flex flex-wrap gap-2" data-binded-label="#variantOption">
@foreach ($product->variants as $key => $variant) @foreach ($product->variants as $key => $variant)
<input type="radio" class="btn-check" name="colors" id="variant-id-{{ $variant->id }}" {{ $key == 0 ? 'checked' : '' }}> <input type="radio" class="btn-check" name="colors" id="variant-id-{{ $variant->id }}" {{ $key == 0 ? 'checked' : '' }}>
<label for="variant-id-{{ $variant->id }}" class="btn btn-image p-0" data-label="{{ $variant->description }}" <label for="variant-id-{{ $variant->id }}" class="btn btn-image p-0" data-label="{{ $variant->description }}"
data-price="Rp {{ number_format($variant->display_price, 0, ",",".") }}" data-price="Rp {{ number_format($product->display_price, 0, ",",".") }}"
data-discount-price="{{ $variant->discount_display_price ? 'Rp ' . number_format($variant->discount_display_price, 0, ',', '.') : '' }}" data-discount-price="{{ $product->display_discount_price ? 'Rp ' . number_format($product->display_discount_price, 0, ',', '.') : '' }}"
data-image="{{ $variant->image_url ?? $product->image_url }}" data-image="{{ $variant->image_url ?? $product->image_url }}"
> >
<img src="{{ $variant->image_url ?? $product->image_url }}" width="56" <img src="{{ $variant->image_url ?? $product->image_url }}" width="56"
@ -1921,17 +1923,17 @@
<div class="navbar container flex-nowrap align-items-center bg-body pt-4 pt-lg-5 mt-lg-n2"> <div class="navbar container flex-nowrap align-items-center bg-body pt-4 pt-lg-5 mt-lg-n2">
<div class="d-flex align-items-center min-w-0 ms-lg-2 me-3"> <div class="d-flex align-items-center min-w-0 ms-lg-2 me-3">
<div class="ratio ratio-1x1 flex-shrink-0" style="width: 50px"> <div class="ratio ratio-1x1 flex-shrink-0" style="width: 50px">
<img src="/img/shop/fashion/product/thumb.png" alt="Image"> <img src="{{ $product->image_url ?? '' }}" class="product-main-image" alt="Image">
</div> </div>
<h4 class="h6 fw-medium d-none d-lg-block ps-3 mb-0">Denim midi skirt with pockets</h4> <h4 class="h6 fw-medium d-none d-lg-block ps-3 mb-0 variantOption">{{ $product->name }}</h4>
<div class="w-100 min-w-0 d-lg-none ps-2"> <div class="w-100 min-w-0 d-lg-none ps-2">
<h4 class="fs-sm fw-medium text-truncate mb-1">Denim midi skirt with pockets</h4> <h4 class="fs-sm fw-medium text-truncate mb-1 variantOption">{{ $product->name }}</h4>
<div class="h6 mb-0">$126.50 <del class="fs-xs fw-normal text-body-tertiary">$156.00</del> <div class="h6 mb-0">$126.50 <del class="fs-xs fw-normal text-body-tertiary">$156.00</del>
</div> </div>
</div> </div>
</div> </div>
<div class="h4 d-none d-lg-block mb-0 ms-auto me-4">$126.50 <del <div class="h4 d-none d-lg-block mb-0 ms-auto me-4 display_price">Rp {{ number_format($product->display_price,0,",",".") }} <del
class="fs-sm fw-normal text-body-tertiary">$156.00</del></div> class="fs-sm fw-normal text-body-tertiary display_discount_price" style="display: {{ $product->display_discount_price ? 'inline' : 'none' }};">Rp {{ number_format($product->display_discount_price,0,",",".") }}</del></div>
<div class="d-flex gap-2"> <div class="d-flex gap-2">
<button type="button" class="btn btn-icon btn-secondary animate-pulse" <button type="button" class="btn btn-icon btn-secondary animate-pulse"
aria-label="Add to Wishlist"> aria-label="Add to Wishlist">
@ -3024,7 +3026,7 @@ document.addEventListener('DOMContentLoaded', function() {
discountSpan.style.display = 'none'; discountSpan.style.display = 'none';
} }
document.querySelector('.product-main-image').src = image; document.querySelector('.product-main-image').src = image;
document.querySelector('#colorOption').textContent = labelText; document.querySelector('.variantOption').textContent = labelText;
}); });
}); });
// Trigger change for the initially checked radio // Trigger change for the initially checked radio