feat: add labels and formatting attributes to various models and enums

- Added labels for leave request statuses in LeaveRequestStatus enum.
- Introduced label methods for PayrollAdjustmentType, PayrollPeriodStatus, PayrollStatus, RawMaterialUnit, and StokOpnameStatus enums.
- Implemented formatted attributes for Attendance, CashAccount, CashTransaction, Category, Customer, Cutting, Employee, EmployeeAdvance, Expense, LeaveRequest, Order, OrderItem, Payroll, PayrollAdjustment, PayrollPeriod, Product, ProductPrice, ProductVariant, Purchase, PurchaseItem, RawMaterial, RawMaterialPrice, Restock, RestockItem, StokOpname, StokOpnameItem, Supplier, User, and UserProfile models.
- Enhanced phone number formatting for Customer and Supplier models.
- Added date formatting for various models to improve readability.
This commit is contained in:
Yoga Pangestu 2026-08-04 15:31:41 +07:00
parent 3cb5b46aab
commit 5961a60585
40 changed files with 718 additions and 22 deletions

View File

@ -9,7 +9,17 @@ enum CashTransactionType: string
use HasValues; use HasValues;
case DEPOSIT = 'deposit'; case DEPOSIT = 'deposit';
case WITHDRAWAL = 'withdrawal';
case EXPENSE = 'expense'; case EXPENSE = 'expense';
case TRANSFER = 'transfer'; case TRANSFER = 'transfer';
case WITHDRAWAL = 'withdrawal';
public function label(): string
{
return match ($this) {
self::DEPOSIT => 'Setoran',
self::EXPENSE => 'Pengeluaran',
self::TRANSFER => 'Transfer',
self::WITHDRAWAL => 'Penarikan',
};
}
} }

View File

@ -8,7 +8,16 @@ enum CuttingStatus: string
{ {
use HasValues; use HasValues;
case IN_PROGRESS = 'in_progress';
case COMPLETED = 'completed';
case CANCELLED = 'cancelled'; case CANCELLED = 'cancelled';
case COMPLETED = 'completed';
case IN_PROGRESS = 'in_progress';
public function label(): string
{
return match ($this) {
self::CANCELLED => 'Dibatalkan',
self::COMPLETED => 'Selesai',
self::IN_PROGRESS => 'Dalam Proses',
};
}
} }

View File

@ -8,9 +8,20 @@ enum EmployeeAdvanceStatus: string
{ {
use HasValues; use HasValues;
case PENDING = 'pending';
case APPROVED = 'approved'; case APPROVED = 'approved';
case PAID = 'paid';
case REJECTED = 'rejected';
case CANCELLED = 'cancelled'; case CANCELLED = 'cancelled';
case PAID = 'paid';
case PENDING = 'pending';
case REJECTED = 'rejected';
public function label(): string
{
return match ($this) {
self::APPROVED => 'Disetujui',
self::CANCELLED => 'Dibatalkan',
self::PAID => 'Dibayar',
self::PENDING => 'Menunggu',
self::REJECTED => 'Ditolak',
};
}
} }

View File

@ -8,9 +8,20 @@ enum EmploymentStatus: string
{ {
use HasValues; use HasValues;
case FULL_TIME = 'full_time';
case PART_TIME = 'part_time';
case CONTRACT = 'contract'; case CONTRACT = 'contract';
case FULL_TIME = 'full_time';
case INTERNSHIP = 'internship'; case INTERNSHIP = 'internship';
case PART_TIME = 'part_time';
case RESIGNED = 'resigned'; case RESIGNED = 'resigned';
public function label(): string
{
return match ($this) {
self::CONTRACT => 'Kontrak',
self::FULL_TIME => 'Penuh Waktu',
self::INTERNSHIP => 'Magang',
self::PART_TIME => 'Paruh Waktu',
self::RESIGNED => 'Keluar',
};
}
} }

View File

@ -8,6 +8,14 @@ enum Gender: string
{ {
use HasValues; use HasValues;
case MALE = 'male';
case FEMALE = 'female'; case FEMALE = 'female';
case MALE = 'male';
public function label(): string
{
return match ($this) {
self::FEMALE => 'Perempuan',
self::MALE => 'Laki-laki',
};
}
} }

View File

@ -8,8 +8,18 @@ enum LeaveRequestStatus: string
{ {
use HasValues; use HasValues;
case PENDING = 'pending';
case APPROVED = 'approved'; case APPROVED = 'approved';
case REJECTED = 'rejected';
case CANCELLED = 'cancelled'; case CANCELLED = 'cancelled';
case PENDING = 'pending';
case REJECTED = 'rejected';
public function label(): string
{
return match ($this) {
self::APPROVED => 'Disetujui',
self::CANCELLED => 'Dibatalkan',
self::PENDING => 'Menunggu',
self::REJECTED => 'Ditolak',
};
}
} }

View File

@ -10,4 +10,12 @@ enum PayrollAdjustmentType: string
case BONUS = 'bonus'; case BONUS = 'bonus';
case DEDUCTION = 'deduction'; case DEDUCTION = 'deduction';
public function label(): string
{
return match ($this) {
self::BONUS => 'Bonus',
self::DEDUCTION => 'Potongan',
};
}
} }

View File

@ -8,6 +8,14 @@ enum PayrollPeriodStatus: string
{ {
use HasValues; use HasValues;
case OPEN = 'open';
case CLOSED = 'closed'; case CLOSED = 'closed';
case OPEN = 'open';
public function label(): string
{
return match ($this) {
self::CLOSED => 'Tutup',
self::OPEN => 'Buka',
};
}
} }

View File

@ -8,7 +8,16 @@ enum PayrollStatus: string
{ {
use HasValues; use HasValues;
case UNPAID = 'unpaid';
case PAID = 'paid';
case CANCELLED = 'cancelled'; case CANCELLED = 'cancelled';
case PAID = 'paid';
case UNPAID = 'unpaid';
public function label(): string
{
return match ($this) {
self::CANCELLED => 'Dibatalkan',
self::PAID => 'Dibayar',
self::UNPAID => 'Belum Dibayar',
};
}
} }

View File

@ -11,4 +11,13 @@ enum RawMaterialUnit: string
case KG = 'kg'; case KG = 'kg';
case METER = 'meter'; case METER = 'meter';
case YARD = 'yard'; case YARD = 'yard';
public function label(): string
{
return match ($this) {
self::KG => 'Kg',
self::METER => 'Meter',
self::YARD => 'Yard',
};
}
} }

View File

@ -8,9 +8,20 @@ enum StokOpnameStatus: string
{ {
use HasValues; use HasValues;
case CANCELLED = 'cancelled';
case COMPLETED = 'completed';
case DRAFT = 'draft'; case DRAFT = 'draft';
case IN_PROGRESS = 'in_progress'; case IN_PROGRESS = 'in_progress';
case COMPLETED = 'completed';
case VERIFIED = 'verified'; case VERIFIED = 'verified';
case CANCELLED = 'cancelled';
public function label(): string
{
return match ($this) {
self::CANCELLED => 'Dibatalkan',
self::COMPLETED => 'Selesai',
self::DRAFT => 'Draft',
self::IN_PROGRESS => 'Dalam Proses',
self::VERIFIED => 'Terverifikasi',
};
}
} }

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -29,6 +30,13 @@ protected function casts(): array
]; ];
} }
protected function attendanceDate(): Attribute
{
return Attribute::make(
get: fn ($value) => $value?->translatedFormat('l, d F Y'),
);
}
public function employee(): BelongsTo public function employee(): BelongsTo
{ {
return $this->belongsTo(Employee::class); return $this->belongsTo(Employee::class);

View File

@ -2,13 +2,16 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_balance', 'formatted_name'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class CashAccount extends Model class CashAccount extends Model
{ {
@ -21,6 +24,20 @@ protected function casts(): array
]; ];
} }
protected function formattedBalance(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->balance, 0, ',', '.'),
);
}
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
public function cashTransactions(): HasMany public function cashTransactions(): HasMany
{ {
return $this->hasMany(CashTransaction::class); return $this->hasMany(CashTransaction::class);

View File

@ -3,9 +3,11 @@
namespace App\Models; namespace App\Models;
use App\Enums\CashTransactionType; use App\Enums\CashTransactionType;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -16,6 +18,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['formatted_amount', 'type_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class CashTransaction extends Model implements HasMedia class CashTransaction extends Model implements HasMedia
{ {
@ -30,6 +33,20 @@ protected function casts(): array
]; ];
} }
protected function formattedAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->amount, 0, ',', '.'),
);
}
protected function typeLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->type->label(),
);
}
#[Scope] #[Scope]
protected function deposit(Builder $query): void protected function deposit(Builder $query): void
{ {

View File

@ -2,19 +2,29 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Sluggable\Attributes\Sluggable; use Spatie\Sluggable\Attributes\Sluggable;
#[Appends(['formatted_name'])]
#[Guarded(['id'])] #[Guarded(['id'])]
#[Sluggable(from: 'name', to: 'slug')] #[Sluggable(from: 'name', to: 'slug')]
class Category extends Model class Category extends Model
{ {
use HasFactory, SoftDeletes; use HasFactory, SoftDeletes;
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
public function products(): BelongsToMany public function products(): BelongsToMany
{ {
return $this->belongsToMany(Product::class, 'product_categories') return $this->belongsToMany(Product::class, 'product_categories')

View File

@ -2,17 +2,37 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_name', 'formatted_phone_number'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Customer extends Model class Customer extends Model
{ {
use HasFactory, SoftDeletes; use HasFactory, SoftDeletes;
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
protected function formattedPhoneNumber(): Attribute
{
return Attribute::make(
get: fn () => $this->phone_number
? substr($this->phone_number, 0, 4) . ' ' . substr($this->phone_number, 4, 4) . ' ' . substr($this->phone_number, 8)
: null,
set: fn (?string $value) => $value ? preg_replace('/\s/', '', $value) : null,
);
}
public function orders(): HasMany public function orders(): HasMany
{ {
return $this->hasMany(Order::class); return $this->hasMany(Order::class);

View File

@ -3,9 +3,11 @@
namespace App\Models; namespace App\Models;
use App\Enums\CuttingStatus; use App\Enums\CuttingStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -14,6 +16,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['formatted_cost_per_unit', 'formatted_other_cost', 'formatted_sewing_cost', 'status_label', 'formatted_total_material_cost'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Cutting extends Model implements HasMedia class Cutting extends Model implements HasMedia
{ {
@ -30,6 +33,41 @@ protected function casts(): array
]; ];
} }
protected function formattedCostPerUnit(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->cost_per_unit, 0, ',', '.'),
);
}
protected function formattedOtherCost(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->other_cost, 0, ',', '.'),
);
}
protected function formattedSewingCost(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->sewing_cost, 0, ',', '.'),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
protected function formattedTotalMaterialCost(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->total_material_cost, 0, ',', '.'),
);
}
#[Scope] #[Scope]
protected function cancelled(Builder $query): void protected function cancelled(Builder $query): void
{ {

View File

@ -3,15 +3,18 @@
namespace App\Models; namespace App\Models;
use App\Enums\EmploymentStatus; use App\Enums\EmploymentStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_base_salary', 'employment_status_label', 'formatted_join_date', 'formatted_resign_date'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Employee extends Model class Employee extends Model
{ {
@ -27,6 +30,34 @@ protected function casts(): array
]; ];
} }
protected function formattedBaseSalary(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->base_salary, 0, ',', '.'),
);
}
protected function employmentStatusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->employment_status->label(),
);
}
protected function formattedJoinDate(): Attribute
{
return Attribute::make(
get: fn () => $this->join_date?->translatedFormat('l, d F Y'),
);
}
protected function formattedResignDate(): Attribute
{
return Attribute::make(
get: fn () => $this->resign_date?->translatedFormat('l, d F Y'),
);
}
#[Scope] #[Scope]
protected function contract(Builder $query): void protected function contract(Builder $query): void
{ {

View File

@ -3,14 +3,17 @@
namespace App\Models; namespace App\Models;
use App\Enums\EmployeeAdvanceStatus; use App\Enums\EmployeeAdvanceStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_amount', 'formatted_due_date', 'formatted_paid_amount', 'status_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class EmployeeAdvance extends Model class EmployeeAdvance extends Model
{ {
@ -28,6 +31,34 @@ protected function casts(): array
]; ];
} }
protected function formattedAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->amount, 0, ',', '.'),
);
}
protected function formattedDueDate(): Attribute
{
return Attribute::make(
get: fn () => $this->due_date?->translatedFormat('l, d F Y'),
);
}
protected function formattedPaidAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->paid_amount, 0, ',', '.'),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
#[Scope] #[Scope]
protected function approved(Builder $query): void protected function approved(Builder $query): void
{ {

View File

@ -2,7 +2,9 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -10,6 +12,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['formatted_amount', 'formatted_date'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Expense extends Model implements HasMedia class Expense extends Model implements HasMedia
{ {
@ -19,9 +22,24 @@ protected function casts(): array
{ {
return [ return [
'amount' => 'integer', 'amount' => 'integer',
'date' => 'date:Y-m-d',
]; ];
} }
protected function formattedAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->amount, 0, ',', '.'),
);
}
protected function formattedDate(): Attribute
{
return Attribute::make(
get: fn () => $this->date?->translatedFormat('l, d F Y'),
);
}
public function cashTransaction(): BelongsTo public function cashTransaction(): BelongsTo
{ {
return $this->belongsTo(CashTransaction::class); return $this->belongsTo(CashTransaction::class);

View File

@ -3,14 +3,17 @@
namespace App\Models; namespace App\Models;
use App\Enums\LeaveRequestStatus; use App\Enums\LeaveRequestStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_end_date', 'formatted_start_date', 'status_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class LeaveRequest extends Model class LeaveRequest extends Model
{ {
@ -27,6 +30,27 @@ protected function casts(): array
]; ];
} }
protected function formattedEndDate(): Attribute
{
return Attribute::make(
get: fn () => $this->end_date?->translatedFormat('l, d F Y'),
);
}
protected function formattedStartDate(): Attribute
{
return Attribute::make(
get: fn () => $this->start_date?->translatedFormat('l, d F Y'),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
#[Scope] #[Scope]
protected function approved(Builder $query): void protected function approved(Builder $query): void
{ {

View File

@ -6,9 +6,11 @@
use App\Enums\OrderStatus; use App\Enums\OrderStatus;
use App\Enums\PaymentType; use App\Enums\PaymentType;
use App\Enums\PriceType; use App\Enums\PriceType;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -17,6 +19,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['channel_label', 'formatted_cogs', 'formatted_discount', 'formatted_nego_price', 'payment_type_label', 'status_label', 'formatted_subtotal', 'formatted_total_amount'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Order extends Model implements HasMedia class Order extends Model implements HasMedia
{ {
@ -39,6 +42,62 @@ protected function casts(): array
]; ];
} }
protected function channelLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->channel->label(),
);
}
protected function formattedCogs(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->cogs, 0, ',', '.'),
);
}
protected function formattedDiscount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->discount, 0, ',', '.'),
);
}
protected function formattedNegoPrice(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->nego_price, 0, ',', '.'),
);
}
protected function paymentTypeLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->payment_type->label(),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
protected function formattedSubtotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->subtotal, 0, ',', '.'),
);
}
protected function formattedTotalAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->total_amount, 0, ',', '.'),
);
}
#[Scope] #[Scope]
protected function cancelled(Builder $query): void protected function cancelled(Builder $query): void
{ {

View File

@ -3,14 +3,17 @@
namespace App\Models; namespace App\Models;
use App\Enums\ProductStockQuality; use App\Enums\ProductStockQuality;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['stock_quality_label', 'formatted_subtotal', 'formatted_unit_price'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class OrderItem extends Model class OrderItem extends Model
{ {
@ -26,6 +29,27 @@ protected function casts(): array
]; ];
} }
protected function stockQualityLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->stock_quality->label(),
);
}
protected function formattedSubtotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->subtotal, 0, ',', '.'),
);
}
protected function formattedUnitPrice(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->unit_price, 0, ',', '.'),
);
}
#[Scope] #[Scope]
protected function good(Builder $query): void protected function good(Builder $query): void
{ {

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Enums\PayrollStatus; use App\Enums\PayrollStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
@ -13,6 +14,7 @@
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_base_salary', 'formatted_bonus_amount', 'formatted_deduction_amount', 'status_label', 'formatted_total_amount'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Payroll extends Model class Payroll extends Model
{ {
@ -30,10 +32,45 @@ protected function casts(): array
]; ];
} }
protected function formattedBaseSalary(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->base_salary, 0, ',', '.'),
);
}
protected function formattedBonusAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->bonus_amount, 0, ',', '.'),
);
}
protected function formattedDeductionAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->deduction_amount, 0, ',', '.'),
);
}
protected function formattedAmount(): Attribute protected function formattedAmount(): Attribute
{ {
return Attribute::make( return Attribute::make(
get: fn () => 'Rp '.number_format($this->total_amount, 0, ',', '.'), get: fn () => 'Rp ' . number_format($this->attributes['total_amount'] ?? 0, 0, ',', '.'),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
protected function formattedTotalAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->total_amount, 0, ',', '.'),
); );
} }

View File

@ -3,14 +3,17 @@
namespace App\Models; namespace App\Models;
use App\Enums\PayrollAdjustmentType; use App\Enums\PayrollAdjustmentType;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_amount', 'type_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class PayrollAdjustment extends Model class PayrollAdjustment extends Model
{ {
@ -24,6 +27,20 @@ protected function casts(): array
]; ];
} }
protected function formattedAmount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->amount, 0, ',', '.'),
);
}
protected function typeLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->type->label(),
);
}
#[Scope] #[Scope]
protected function bonus(Builder $query): void protected function bonus(Builder $query): void
{ {

View File

@ -3,15 +3,18 @@
namespace App\Models; namespace App\Models;
use App\Enums\PayrollPeriodStatus; use App\Enums\PayrollPeriodStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['status_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class PayrollPeriod extends Model class PayrollPeriod extends Model
{ {
@ -27,6 +30,13 @@ protected function casts(): array
]; ];
} }
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
#[Scope] #[Scope]
protected function closed(Builder $query): void protected function closed(Builder $query): void
{ {

View File

@ -3,9 +3,11 @@
namespace App\Models; namespace App\Models;
use App\Enums\ProductStatus; use App\Enums\ProductStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\BelongsToMany;
@ -13,6 +15,7 @@
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Sluggable\Attributes\Sluggable; use Spatie\Sluggable\Attributes\Sluggable;
#[Appends(['formatted_name', 'status_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
#[Sluggable(from: 'name', to: 'slug')] #[Sluggable(from: 'name', to: 'slug')]
class Product extends Model class Product extends Model
@ -26,6 +29,20 @@ protected function casts(): array
]; ];
} }
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
#[Scope] #[Scope]
protected function active(Builder $query): void protected function active(Builder $query): void
{ {

View File

@ -12,8 +12,8 @@
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
#[Appends(['formatted_price', 'type_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
#[Appends(['type_label'])]
class ProductPrice extends Model class ProductPrice extends Model
{ {
use HasFactory; use HasFactory;
@ -26,6 +26,13 @@ protected function casts(): array
]; ];
} }
protected function formattedPrice(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->price, 0, ',', '.'),
);
}
#[Scope] #[Scope]
protected function retail(Builder $query): void protected function retail(Builder $query): void
{ {

View File

@ -2,7 +2,9 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -11,6 +13,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['formatted_name'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class ProductVariant extends Model implements HasMedia class ProductVariant extends Model implements HasMedia
{ {
@ -25,6 +28,13 @@ protected function casts(): array
]; ];
} }
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
public function orderItems(): HasMany public function orderItems(): HasMany
{ {
return $this->hasMany(OrderItem::class); return $this->hasMany(OrderItem::class);

View File

@ -2,7 +2,9 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -11,6 +13,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['formatted_discount', 'formatted_shipping_cost', 'formatted_subtotal', 'formatted_total'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Purchase extends Model implements HasMedia class Purchase extends Model implements HasMedia
{ {
@ -26,6 +29,34 @@ protected function casts(): array
]; ];
} }
protected function formattedDiscount(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->discount, 0, ',', '.'),
);
}
protected function formattedShippingCost(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->shipping_cost, 0, ',', '.'),
);
}
protected function formattedSubtotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->subtotal, 0, ',', '.'),
);
}
protected function formattedTotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->total, 0, ',', '.'),
);
}
public function createdBy(): BelongsTo public function createdBy(): BelongsTo
{ {
return $this->belongsTo(User::class, 'created_by_id'); return $this->belongsTo(User::class, 'created_by_id');

View File

@ -2,12 +2,15 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_subtotal', 'formatted_unit_price'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class PurchaseItem extends Model class PurchaseItem extends Model
{ {
@ -22,6 +25,20 @@ protected function casts(): array
]; ];
} }
protected function formattedSubtotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->subtotal, 0, ',', '.'),
);
}
protected function formattedUnitPrice(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->unit_price, 0, ',', '.'),
);
}
public function purchase(): BelongsTo public function purchase(): BelongsTo
{ {
return $this->belongsTo(Purchase::class); return $this->belongsTo(Purchase::class);

View File

@ -3,14 +3,17 @@
namespace App\Models; namespace App\Models;
use App\Enums\RawMaterialUnit; use App\Enums\RawMaterialUnit;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_name', 'unit_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class RawMaterial extends Model class RawMaterial extends Model
{ {
@ -24,6 +27,20 @@ protected function casts(): array
]; ];
} }
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
protected function unitLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->unit->label(),
);
}
#[Scope] #[Scope]
protected function kg(Builder $query): void protected function kg(Builder $query): void
{ {

View File

@ -3,7 +3,9 @@
namespace App\Models; namespace App\Models;
use App\Services\S3PresignedService; use App\Services\S3PresignedService;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -12,6 +14,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['formatted_price'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class RawMaterialPrice extends Model implements HasMedia class RawMaterialPrice extends Model implements HasMedia
{ {
@ -25,6 +28,13 @@ protected function casts(): array
]; ];
} }
protected function formattedPrice(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->price, 0, ',', '.'),
);
}
public function cuttingMaterials(): HasMany public function cuttingMaterials(): HasMany
{ {
return $this->hasMany(CuttingMaterial::class); return $this->hasMany(CuttingMaterial::class);

View File

@ -3,9 +3,11 @@
namespace App\Models; namespace App\Models;
use App\Enums\ProductStockQuality; use App\Enums\ProductStockQuality;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -14,6 +16,7 @@
use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
#[Appends(['stock_type_label', 'formatted_subtotal', 'formatted_total'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Restock extends Model implements HasMedia class Restock extends Model implements HasMedia
{ {
@ -28,6 +31,27 @@ protected function casts(): array
]; ];
} }
protected function stockTypeLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->stock_type->label(),
);
}
protected function formattedSubtotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->subtotal, 0, ',', '.'),
);
}
protected function formattedTotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->total, 0, ',', '.'),
);
}
#[Scope] #[Scope]
protected function good(Builder $query): void protected function good(Builder $query): void
{ {

View File

@ -2,12 +2,15 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_subtotal', 'formatted_unit_price'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class RestockItem extends Model class RestockItem extends Model
{ {
@ -22,6 +25,20 @@ protected function casts(): array
]; ];
} }
protected function formattedSubtotal(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->subtotal, 0, ',', '.'),
);
}
protected function formattedUnitPrice(): Attribute
{
return Attribute::make(
get: fn () => 'Rp ' . number_format($this->unit_price, 0, ',', '.'),
);
}
public function productVariant(): BelongsTo public function productVariant(): BelongsTo
{ {
return $this->belongsTo(ProductVariant::class); return $this->belongsTo(ProductVariant::class);

View File

@ -3,15 +3,18 @@
namespace App\Models; namespace App\Models;
use App\Enums\StokOpnameStatus; use App\Enums\StokOpnameStatus;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_opname_date', 'status_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class StokOpname extends Model class StokOpname extends Model
{ {
@ -25,6 +28,20 @@ protected function casts(): array
]; ];
} }
protected function formattedOpnameDate(): Attribute
{
return Attribute::make(
get: fn () => $this->opname_date?->translatedFormat('l, d F Y'),
);
}
protected function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label(),
);
}
#[Scope] #[Scope]
protected function cancelled(Builder $query): void protected function cancelled(Builder $query): void
{ {

View File

@ -3,13 +3,16 @@
namespace App\Models; namespace App\Models;
use App\Enums\ProductStockQuality; use App\Enums\ProductStockQuality;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
#[Appends(['stock_quality_label'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class StokOpnameItem extends Model class StokOpnameItem extends Model
{ {
@ -25,6 +28,13 @@ protected function casts(): array
]; ];
} }
protected function stockQualityLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->stock_quality->label(),
);
}
#[Scope] #[Scope]
protected function good(Builder $query): void protected function good(Builder $query): void
{ {

View File

@ -2,17 +2,37 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_name', 'formatted_phone_number'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Supplier extends Model class Supplier extends Model
{ {
use HasFactory, SoftDeletes; use HasFactory, SoftDeletes;
protected function formattedName(): Attribute
{
return Attribute::make(
get: fn () => ucfirst($this->name),
);
}
protected function formattedPhoneNumber(): Attribute
{
return Attribute::make(
get: fn () => $this->phone_number
? substr($this->phone_number, 0, 4) . ' ' . substr($this->phone_number, 4, 4) . ' ' . substr($this->phone_number, 8)
: null,
set: fn (?string $value) => $value ? preg_replace('/\s/', '', $value) : null,
);
}
public function purchases(): HasMany public function purchases(): HasMany
{ {
return $this->hasMany(Purchase::class); return $this->hasMany(Purchase::class);

View File

@ -17,8 +17,8 @@
use NotificationChannels\WebPush\HasPushSubscriptions; use NotificationChannels\WebPush\HasPushSubscriptions;
use Spatie\Permission\Traits\HasRoles; use Spatie\Permission\Traits\HasRoles;
#[Appends(['full_name', 'name'])]
#[Guarded(['id'])] #[Guarded(['id'])]
#[Appends(['full_name'])]
class User extends Authenticatable class User extends Authenticatable
{ {
use HasFactory, HasPushSubscriptions, HasRoles, Notifiable, SoftDeletes, TwoFactorAuthenticatable; use HasFactory, HasPushSubscriptions, HasRoles, Notifiable, SoftDeletes, TwoFactorAuthenticatable;
@ -34,10 +34,11 @@ protected function casts(): array
]; ];
} }
#[Scope] protected function email(): Attribute
protected function active(Builder $query): void
{ {
$query->where('is_active', true); return Attribute::make(
set: fn (string $value) => strtolower($value),
);
} }
protected function name(): Attribute protected function name(): Attribute
@ -54,6 +55,12 @@ protected function fullName(): Attribute
); );
} }
#[Scope]
protected function active(Builder $query): void
{
$query->where('is_active', true);
}
public function attendances(): HasMany public function attendances(): HasMany
{ {
return $this->hasMany(Attendance::class); return $this->hasMany(Attendance::class);

View File

@ -3,14 +3,17 @@
namespace App\Models; namespace App\Models;
use App\Enums\Gender; use App\Enums\Gender;
use Illuminate\Database\Eloquent\Attributes\Appends;
use Illuminate\Database\Eloquent\Attributes\Guarded; use Illuminate\Database\Eloquent\Attributes\Guarded;
use Illuminate\Database\Eloquent\Attributes\Scope; use Illuminate\Database\Eloquent\Attributes\Scope;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
#[Appends(['formatted_birth_date', 'gender_label', 'formatted_phone_number'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class UserProfile extends Model class UserProfile extends Model
{ {
@ -24,6 +27,30 @@ protected function casts(): array
]; ];
} }
protected function formattedBirthDate(): Attribute
{
return Attribute::make(
get: fn () => $this->birth_date?->translatedFormat('l, d F Y'),
);
}
protected function genderLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->gender->label(),
);
}
protected function formattedPhoneNumber(): Attribute
{
return Attribute::make(
get: fn () => $this->phone_number
? substr($this->phone_number, 0, 4) . ' ' . substr($this->phone_number, 4, 4) . ' ' . substr($this->phone_number, 8)
: null,
set: fn (?string $value) => $value ? preg_replace('/\s/', '', $value) : null,
);
}
#[Scope] #[Scope]
protected function female(Builder $query): void protected function female(Builder $query): void
{ {