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
createdCuttings() // → HasMany Cutting, 'created_by_id'
submittedCuttings() // → HasMany Cutting, 'submitted_by_id'
```
### Eloquent Select & Eager Loading — Selalu Select yang Dibutuhkan

View File

@ -12,7 +12,7 @@ ### `users` → User
- Implements: HasMedia (Spatie Media Library)
- Media Collections: photos (single photo, with thumb conversion)
- 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)
### `user_profiles` → UserProfile
@ -187,10 +187,10 @@ ### `rejections` → Rejection
## Production
### `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`
- Casts: status(CuttingStatus), total_material_cost(int), cost_per_unit(int), sewing_cost(int), other_cost(int)
`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)
- 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
`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\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'])]
class Cutting extends Model implements HasMedia
{
@ -30,8 +30,6 @@ protected function casts(): array
'status' => CuttingStatus::class,
'total_material_cost' => '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
{
return Attribute::make(
@ -114,12 +98,7 @@ public function cuttingResults(): HasMany
{
return $this->hasMany(CuttingResult::class);
}
public function submittedBy(): BelongsTo
{
return $this->belongsTo(User::class, 'submitted_by_id');
}
public function registerMediaCollections(): void
{
$this->addMediaCollection('photos');

View File

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

View File

@ -13,7 +13,7 @@ public function migrate(): array
{
$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_materials'] = $this->migrateTable('cutting_materials', function ($row) {
if (isset($row['material_usage']) && is_string($row['material_usage'])) {

View File

@ -13,14 +13,11 @@ public function up(): void
$table->id();
$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->string('description', 100)->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->timestamp('created_at')->useCurrent();