feat: remove submittedCuttings relation and related attributes from Cutting and User models; update cuttings migration to remove submitted_by_id

This commit is contained in:
Yoga Pangestu 2026-08-13 10:49:06 +07:00
parent a778e2f499
commit 71a7863244
6 changed files with 7 additions and 37 deletions

View File

@ -439,7 +439,6 @@ ### Relationship Naming
// Custom FK → pastikan ada parameter // Custom FK → pastikan ada parameter
createdCuttings() // → HasMany Cutting, 'created_by_id' createdCuttings() // → HasMany Cutting, 'created_by_id'
submittedCuttings() // → HasMany Cutting, 'submitted_by_id'
``` ```
### Eloquent Select & Eager Loading — Selalu Select yang Dibutuhkan ### Eloquent Select & Eager Loading — Selalu Select yang Dibutuhkan

View File

@ -12,7 +12,7 @@ ### `users` → User
- Implements: HasMedia (Spatie Media Library) - Implements: HasMedia (Spatie Media Library)
- Media Collections: photos (single photo, with thumb conversion) - Media Collections: photos (single photo, with thumb conversion)
- Scopes: active() - Scopes: active()
- Relations: userProfile(HasOne→UserProfile), employee(HasOne→Employee), attendances(HasMany→Attendance), cashAccounts(HasMany→CashAccount,created_by_id), cashTransactions(HasMany→CashTransaction,created_by_id), createdCuttings(HasMany→Cutting,created_by_id), submittedCuttings(HasMany→Cutting,submitted_by_id), createdExpenses(HasMany→Expense,created_by_id), createdOrders(HasMany→Order,created_by_id), marketingOrders(HasMany→Order,marketing_id), orderItems(HasMany→OrderItem), createdPurchases(HasMany→Purchase,created_by_id), createdRestocks(HasMany→Restock,created_by_id), stokOpnamesCreated(HasMany→StokOpname,created_by_id), stokOpnamesVerified(HasMany→StokOpname,verified_by_id), employeeAdvancesPaid(HasMany→EmployeeAdvance,paid_by_id), employeeAdvancesVerified(HasMany→EmployeeAdvance,verified_by_id), paidPayrolls(HasMany→Payroll,paid_by_id), payrollPeriodsClosed(HasMany→PayrollPeriod,closed_by_id), notifications(HasMany→AppNotification), rejections(HasMany→Rejection,rejected_by_id), pushSubscriptions(HasMany→PushSubscription,morph) - Relations: userProfile(HasOne→UserProfile), employee(HasOne→Employee), attendances(HasMany→Attendance), cashAccounts(HasMany→CashAccount,created_by_id), cashTransactions(HasMany→CashTransaction,created_by_id), createdCuttings(HasMany→Cutting,created_by_id), createdExpenses(HasMany→Expense,created_by_id), createdOrders(HasMany→Order,created_by_id), marketingOrders(HasMany→Order,marketing_id), orderItems(HasMany→OrderItem), createdPurchases(HasMany→Purchase,created_by_id), createdRestocks(HasMany→Restock,created_by_id), stokOpnamesCreated(HasMany→StokOpname,created_by_id), stokOpnamesVerified(HasMany→StokOpname,verified_by_id), employeeAdvancesPaid(HasMany→EmployeeAdvance,paid_by_id), employeeAdvancesVerified(HasMany→EmployeeAdvance,verified_by_id), paidPayrolls(HasMany→Payroll,paid_by_id), payrollPeriodsClosed(HasMany→PayrollPeriod,closed_by_id), notifications(HasMany→AppNotification), rejections(HasMany→Rejection,rejected_by_id), pushSubscriptions(HasMany→PushSubscription,morph)
- Accessor: avatar → temporary S3 URL dari media 'photos' (atau null) - Accessor: avatar → temporary S3 URL dari media 'photos' (atau null)
### `user_profiles` → UserProfile ### `user_profiles` → UserProfile
@ -187,10 +187,10 @@ ### `rejections` → Rejection
## Production ## Production
### `cuttings` → Cutting ### `cuttings` → Cutting
`id` `created_by_id`(FK→users) `submitted_by_id`(FK→users,null) `status`(enum,default:in_progress) `description`(100,null) `total_material_cost`(ubig,null) `sewing_cost`(ubig,default:0) `other_cost`(ubig,default:0) `cost_per_unit`(ubig,null) `created_at` `updated_at` `deleted_at` `id` `created_by_id`(FK→users) `status`(enum,default:in_progress) `description`(100,null) `total_material_cost`(ubig,null) `cost_per_unit`(ubig,null) `created_at` `updated_at` `deleted_at`
- Casts: status(CuttingStatus), total_material_cost(int), cost_per_unit(int), sewing_cost(int), other_cost(int) - Casts: status(CuttingStatus), total_material_cost(int), cost_per_unit(int)
- Scopes: cancelled(), completed(), inProgress() - Scopes: cancelled(), completed(), inProgress()
- Relations: createdBy(BelongsTo→User), submittedBy(BelongsTo→User), cuttingMaterialCombinations(HasMany→CuttingMaterialCombination), cuttingMaterials(HasMany→CuttingMaterial), cuttingResults(HasMany→CuttingResult) - Relations: createdBy(BelongsTo→User), cuttingMaterialCombinations(HasMany→CuttingMaterialCombination), cuttingMaterials(HasMany→CuttingMaterial), cuttingResults(HasMany→CuttingResult)
### `cutting_material_combinations` → CuttingMaterialCombination ### `cutting_material_combinations` → CuttingMaterialCombination
`id` `user_id`(FK→users,null) `cutting_id`(FK→cuttings,null) `material_result`(int,null) `created_at` `updated_at` `deleted_at` `id` `user_id`(FK→users,null) `cutting_id`(FK→cuttings,null) `material_result`(int,null) `created_at` `updated_at` `deleted_at`

View File

@ -18,7 +18,7 @@
use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\InteractsWithMedia;
use Spatie\MediaLibrary\MediaCollections\Models\Media; use Spatie\MediaLibrary\MediaCollections\Models\Media;
#[Appends(['formatted_cost_per_unit', 'formatted_other_cost', 'formatted_sewing_cost', 'status_label', 'formatted_total_material_cost', 'formatted_created_at'])] #[Appends(['formatted_cost_per_unit', 'status_label', 'formatted_total_material_cost', 'formatted_created_at'])]
#[Guarded(['id'])] #[Guarded(['id'])]
class Cutting extends Model implements HasMedia class Cutting extends Model implements HasMedia
{ {
@ -30,8 +30,6 @@ protected function casts(): array
'status' => CuttingStatus::class, 'status' => CuttingStatus::class,
'total_material_cost' => 'integer', 'total_material_cost' => 'integer',
'cost_per_unit' => 'integer', 'cost_per_unit' => 'integer',
'sewing_cost' => 'integer',
'other_cost' => 'integer',
]; ];
} }
@ -42,20 +40,6 @@ protected function formattedCostPerUnit(): Attribute
); );
} }
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 protected function statusLabel(): Attribute
{ {
return Attribute::make( return Attribute::make(
@ -115,11 +99,6 @@ public function cuttingResults(): HasMany
return $this->hasMany(CuttingResult::class); return $this->hasMany(CuttingResult::class);
} }
public function submittedBy(): BelongsTo
{
return $this->belongsTo(User::class, 'submitted_by_id');
}
public function registerMediaCollections(): void public function registerMediaCollections(): void
{ {
$this->addMediaCollection('photos'); $this->addMediaCollection('photos');

View File

@ -215,11 +215,6 @@ public function stokOpnamesVerified(): HasMany
return $this->hasMany(StokOpname::class, 'verified_by_id'); return $this->hasMany(StokOpname::class, 'verified_by_id');
} }
public function submittedCuttings(): HasMany
{
return $this->hasMany(Cutting::class, 'submitted_by_id');
}
public function userProfile(): HasOne public function userProfile(): HasOne
{ {
return $this->hasOne(UserProfile::class); return $this->hasOne(UserProfile::class);

View File

@ -13,7 +13,7 @@ public function migrate(): array
{ {
$results = []; $results = [];
$results['cuttings'] = $this->migrateTable('cuttings'); $results['cuttings'] = $this->migrateTableWithoutColumns('cuttings', ['other_cost', 'sewing_cost', 'submitted_by_id']);
$results['cutting_material_combinations'] = $this->migrateTable('cutting_material_combinations'); $results['cutting_material_combinations'] = $this->migrateTable('cutting_material_combinations');
$results['cutting_materials'] = $this->migrateTable('cutting_materials', function ($row) { $results['cutting_materials'] = $this->migrateTable('cutting_materials', function ($row) {
if (isset($row['material_usage']) && is_string($row['material_usage'])) { if (isset($row['material_usage']) && is_string($row['material_usage'])) {

View File

@ -13,14 +13,11 @@ public function up(): void
$table->id(); $table->id();
$table->foreignId('created_by_id')->constrained('users')->restrictOnDelete(); $table->foreignId('created_by_id')->constrained('users')->restrictOnDelete();
$table->foreignId('submitted_by_id')->nullable()->constrained('users')->nullOnDelete();
$table->enum('status', CuttingStatus::values())->default(CuttingStatus::IN_PROGRESS->value); $table->enum('status', CuttingStatus::values())->default(CuttingStatus::IN_PROGRESS->value);
$table->string('description', 100)->nullable(); $table->string('description', 100)->nullable();
$table->unsignedBigInteger('total_material_cost')->nullable(); $table->unsignedBigInteger('total_material_cost')->nullable();
$table->unsignedBigInteger('sewing_cost')->default(0);
$table->unsignedBigInteger('other_cost')->default(0);
$table->unsignedBigInteger('cost_per_unit')->nullable(); $table->unsignedBigInteger('cost_per_unit')->nullable();
$table->timestamp('created_at')->useCurrent(); $table->timestamp('created_at')->useCurrent();