Prechádzať zdrojové kódy

feat: add scheduling fields to ClassPackage and ClassPackageUnit models, requests, resources, and migration

ebagabee 1 týždeň pred
rodič
commit
f0bdf3c070

+ 5 - 0
app/Http/Requests/ClassPackageRequest.php

@@ -16,6 +16,11 @@ public function rules(): array
             'contract_value'          => "$required|numeric|min:0",
             'contract_register_value' => "$required|numeric|min:0",
             'contrat_discount_value'  => 'nullable|numeric|min:0',
+            'class_duration_minutes'  => "$required|integer|min:1|max:1440",
+            'weekday'                 => 'nullable|integer|min:0|max:6|required_with:start_time',
+            'start_time'              => 'nullable|date_format:H:i|required_with:weekday',
+            'second_weekday'          => 'nullable|integer|min:0|max:6|different:weekday|required_with:second_start_time',
+            'second_start_time'       => 'nullable|date_format:H:i|required_with:second_weekday',
 
             'materials'                => 'nullable|array',
             'materials.*.product_id'   => 'required_with:materials|integer|exists:products,id',

+ 5 - 0
app/Http/Requests/ClassPackageUnitRequest.php

@@ -17,6 +17,11 @@ public function rules(): array
             'contract_register_value' => "$required|numeric|min:0",
             'contrat_discount_value'  => 'nullable|numeric|min:0',
             'visible'                 => 'sometimes|boolean',
+            'class_duration_minutes'  => "$required|integer|min:1|max:1440",
+            'weekday'                 => 'nullable|integer|min:0|max:6|required_with:start_time',
+            'start_time'              => 'nullable|date_format:H:i|required_with:weekday',
+            'second_weekday'          => 'nullable|integer|min:0|max:6|different:weekday|required_with:second_start_time',
+            'second_start_time'       => 'nullable|date_format:H:i|required_with:second_weekday',
 
             'materials'              => 'nullable|array',
             'materials.*.product_id' => 'required_with:materials|integer|exists:products,id',

+ 5 - 0
app/Http/Resources/ClassPackageResource.php

@@ -20,6 +20,11 @@ public function toArray(Request $request): array
             'contract_material_value' => $this->contract_material_value,
             'contract_register_value' => $this->contract_register_value,
             'contrat_discount_value'  => $this->contrat_discount_value,
+            'class_duration_minutes'  => $this->class_duration_minutes,
+            'weekday'                 => $this->weekday,
+            'start_time'              => $this->start_time,
+            'second_weekday'          => $this->second_weekday,
+            'second_start_time'       => $this->second_start_time,
             'created_at'              => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at'              => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
 

+ 5 - 0
app/Http/Resources/ClassPackageUnitResource.php

@@ -21,6 +21,11 @@ public function toArray(Request $request): array
             'contract_register_value' => $this->contract_register_value,
             'contrat_discount_value'  => $this->contrat_discount_value,
             'visible'                 => $this->visible,
+            'class_duration_minutes'  => $this->class_duration_minutes,
+            'weekday'                 => $this->weekday,
+            'start_time'              => $this->start_time,
+            'second_weekday'          => $this->second_weekday,
+            'second_start_time'       => $this->second_start_time,
             'created_at'              => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at'              => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
 

+ 5 - 0
app/Http/Resources/Select/PackageSelectResource.php

@@ -15,6 +15,11 @@ public function toArray(Request $request): array
             'quantity_classes' => $this->quantity_classes,
             'contract_value' => $this->contract_value,
             'contract_register_value' => $this->contract_register_value,
+            'class_duration_minutes' => $this->class_duration_minutes,
+            'weekday' => $this->weekday,
+            'start_time' => $this->start_time,
+            'second_weekday' => $this->second_weekday,
+            'second_start_time' => $this->second_start_time,
         ];
     }
 }

+ 3 - 0
app/Models/ClassPackage.php

@@ -56,6 +56,9 @@ class ClassPackage extends Model
         'contract_material_value' => 'float',
         'contract_register_value' => 'float',
         'contrat_discount_value'  => 'float',
+        'class_duration_minutes'  => 'integer',
+        'weekday'                 => 'integer',
+        'second_weekday'          => 'integer',
         'created_at'              => 'datetime',
         'updated_at'              => 'datetime',
     ];

+ 3 - 0
app/Models/ClassPackageUnit.php

@@ -62,6 +62,9 @@ class ClassPackageUnit extends Model
         'contract_register_value' => 'float',
         'contrat_discount_value'  => 'float',
         'visible'                 => 'boolean',
+        'class_duration_minutes'  => 'integer',
+        'weekday'                 => 'integer',
+        'second_weekday'          => 'integer',
         'created_at'              => 'datetime',
         'updated_at'              => 'datetime',
     ];

+ 11 - 0
app/Services/ClassPackageService.php

@@ -67,6 +67,17 @@ public function update(int $id, array $data): ?ClassPackage
 
         $package->update($data);
 
+        $scheduleFields = array_intersect_key($data, array_flip([
+            'class_duration_minutes',
+            'weekday',
+            'start_time',
+            'second_weekday',
+            'second_start_time',
+        ]));
+        if (!empty($scheduleFields)) {
+            ClassPackageUnit::where('class_package_id', $package->id)->update($scheduleFields);
+        }
+
         if ($materials !== null) {
             $this->syncMaterials($package, $materials);
             // Propagate material changes to unit packages

+ 5 - 0
app/Services/ClassPackageUnitService.php

@@ -110,6 +110,11 @@ public function replicateFromBasePackage(int $unitId, \App\Models\ClassPackage $
             'contract_material_value' => $basePackage->contract_material_value,
             'contract_register_value' => $basePackage->contract_register_value,
             'contrat_discount_value'  => $basePackage->contrat_discount_value,
+            'class_duration_minutes'  => $basePackage->class_duration_minutes,
+            'weekday'                 => $basePackage->weekday,
+            'start_time'              => $basePackage->start_time,
+            'second_weekday'          => $basePackage->second_weekday,
+            'second_start_time'       => $basePackage->second_start_time,
             'visible'                 => true,
         ]);
 

+ 36 - 0
database/migrations/2026_07_20_000001_add_schedule_defaults_to_class_packages.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        foreach (['class_packages', 'class_package_units'] as $tableName) {
+            Schema::table($tableName, function (Blueprint $table) {
+                $table->unsignedSmallInteger('class_duration_minutes')->default(120);
+                $table->unsignedTinyInteger('weekday')->nullable();
+                $table->time('start_time')->nullable();
+                $table->unsignedTinyInteger('second_weekday')->nullable();
+                $table->time('second_start_time')->nullable();
+            });
+        }
+    }
+
+    public function down(): void
+    {
+        foreach (['class_packages', 'class_package_units'] as $tableName) {
+            Schema::table($tableName, function (Blueprint $table) {
+                $table->dropColumn([
+                    'class_duration_minutes',
+                    'weekday',
+                    'start_time',
+                    'second_weekday',
+                    'second_start_time',
+                ]);
+            });
+        }
+    }
+};