feat: enhance stock formatting methods in Product and RawMaterial models to handle unloaded relations gracefully
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Waiting to run
tests / ci (8.4) (push) Waiting to run
tests / ci (8.5) (push) Waiting to run

This commit is contained in:
Yoga Pangestu 2026-07-08 13:11:19 +07:00
parent a37b47a660
commit 1c4f82529c
3 changed files with 25 additions and 17 deletions

View File

@ -58,21 +58,27 @@ protected function inactive(Builder $query): void
public function totalRejectStockFormatted(): Attribute
{
return Attribute::make(
get: fn () => number_format($this->variants->sum('reject_stock'), 0, ',', '.'),
get: fn () => $this->relationLoaded('variants')
? number_format($this->variants->sum('reject_stock'), 0, ',', '.')
: '-',
);
}
public function totalRetailStockFormatted(): Attribute
{
return Attribute::make(
get: fn () => number_format($this->variants->sum('retail_stock'), 0, ',', '.'),
get: fn () => $this->relationLoaded('variants')
? number_format($this->variants->sum('retail_stock'), 0, ',', '.')
: '-',
);
}
public function totalStockFormatted(): Attribute
{
return Attribute::make(
get: fn () => number_format($this->variants->sum('stock'), 0, ',', '.'),
get: fn () => $this->relationLoaded('variants')
? number_format($this->variants->sum('stock'), 0, ',', '.')
: '-',
);
}

View File

@ -66,12 +66,14 @@ public function unitLabel(): Attribute
public function totalInventoryValueFormatted(): Attribute
{
return Attribute::make(
get: fn () => 'Rp '.number_format(
$this->prices->sum(fn (RawMaterialPrice $price) => (float) $price->stock * (int) $price->price),
0,
',',
'.',
),
get: fn () => $this->relationLoaded('prices')
? 'Rp '.number_format(
$this->prices->sum(fn (RawMaterialPrice $price) => (float) $price->stock * (int) $price->price),
0,
',',
'.',
)
: '-',
);
}
@ -79,6 +81,9 @@ public function totalStockFormatted(): Attribute
{
return Attribute::make(
get: function () {
if (! $this->relationLoaded('prices')) {
return '-';
}
$total = $this->prices->sum(fn (RawMaterialPrice $price) => (float) $price->stock);
$formatted = rtrim(rtrim(number_format($total, 4, ',', '.'), '0'), ',');

View File

@ -38,17 +38,14 @@ public function paginateForIndex(array $tableQuery, string $isActive, string $ca
'pendingOwnerVerificationRequest.submittedBy.profile',
'variants' => fn ($query) => $query
->with(['media', 'prices' => fn ($query) => $query->orderBy('type')])
->orderBy('created_at'),
->orderBy('created_at')
->when($tableQuery['search'] !== '', function ($query) use ($tableQuery): void {
$query->where('name', 'like', "%{$tableQuery['search']}%");
}),
])
->when($tableQuery['search'] !== '', function (Builder $query) use ($tableQuery): void {
$search = $tableQuery['search'];
$query->where(function (Builder $query) use ($search): void {
$query->where('name', 'like', "%{$search}%")
->orWhere('slug', 'like', "%{$search}%")
->orWhere('description', 'like', "%{$search}%")
->orWhereHas('categories', fn (Builder $query) => $query->where('name', 'like', "%{$search}%"))
->orWhereHas('variants', fn (Builder $query) => $query->where('name', 'like', "%{$search}%"));
});
$query->whereHas('variants', fn (Builder $query) => $query->where('name', 'like', "%{$search}%"));
})
->when($isActive !== '', fn (Builder $query) => $query->where('is_active', $isActive === '1'))
->when($categoryId !== '', function (Builder $query) use ($categoryId): void {