diff --git a/.ai/CONVENTIONS.md b/.ai/CONVENTIONS.md index d8c3a1f..820d153 100644 --- a/.ai/CONVENTIONS.md +++ b/.ai/CONVENTIONS.md @@ -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 diff --git a/.ai/REFERENCE.md b/.ai/REFERENCE.md index bdcefcf..8be9e31 100644 --- a/.ai/REFERENCE.md +++ b/.ai/REFERENCE.md @@ -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` diff --git a/app/Models/Cutting.php b/app/Models/Cutting.php index f8b727f..255bd6d 100644 --- a/app/Models/Cutting.php +++ b/app/Models/Cutting.php @@ -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'); diff --git a/app/Models/User.php b/app/Models/User.php index 6e59298..b796cba 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -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); diff --git a/app/OldDataMigrations/CuttingMigration.php b/app/OldDataMigrations/CuttingMigration.php index de56366..6c0c344 100644 --- a/app/OldDataMigrations/CuttingMigration.php +++ b/app/OldDataMigrations/CuttingMigration.php @@ -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'])) { diff --git a/database/migrations/2026_06_12_110001_create_cuttings_table.php b/database/migrations/2026_06_12_110001_create_cuttings_table.php index 3397b56..5cd0cce 100644 --- a/database/migrations/2026_06_12_110001_create_cuttings_table.php +++ b/database/migrations/2026_06_12_110001_create_cuttings_table.php @@ -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();