From cababe1a4332ccbfe32645f2f0af8003f1a0eb4e Mon Sep 17 00:00:00 2001 From: ncoronel Date: Tue, 14 Jul 2026 15:19:53 -0300 Subject: [PATCH] feat: add ticket fields to Product and ProductVariant models, requests, and resources --- app/Domains/Catalog/Models/ProductVariant.php | 6 +++ .../Requests/StoreProductVariantRequest.php | 3 ++ .../Requests/UpdateProductVariantRequest.php | 3 ++ .../Catalog/Resources/ProductResource.php | 1 + .../Resources/ProductVariantResource.php | 3 ++ ...1_add_ticket_fields_to_productos_table.php | 30 ++++++++++++++ ..._move_ticket_fields_to_variantes_table.php | 40 +++++++++++++++++++ routes/api.php | 2 +- 8 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2026_07_14_180621_add_ticket_fields_to_productos_table.php create mode 100644 database/migrations/2026_07_14_181346_move_ticket_fields_to_variantes_table.php diff --git a/app/Domains/Catalog/Models/ProductVariant.php b/app/Domains/Catalog/Models/ProductVariant.php index 1ff640a..066e7f1 100644 --- a/app/Domains/Catalog/Models/ProductVariant.php +++ b/app/Domains/Catalog/Models/ProductVariant.php @@ -18,6 +18,9 @@ use Illuminate\Database\Eloquent\Casts\Attribute; 'stock_reservado', 'stock', 'is_placeholder', + 'has_tickets', + 'minimum_use_date', + 'maximum_use_date', ])] class ProductVariant extends Model { @@ -126,6 +129,9 @@ class ProductVariant extends Model 'stock_real' => 'integer', 'stock_reservado' => 'integer', 'is_placeholder' => 'boolean', + 'has_tickets' => 'boolean', + 'minimum_use_date' => 'datetime', + 'maximum_use_date' => 'datetime', ]; } diff --git a/app/Domains/Catalog/Requests/StoreProductVariantRequest.php b/app/Domains/Catalog/Requests/StoreProductVariantRequest.php index c2882c6..3561ec1 100644 --- a/app/Domains/Catalog/Requests/StoreProductVariantRequest.php +++ b/app/Domains/Catalog/Requests/StoreProductVariantRequest.php @@ -32,6 +32,9 @@ class StoreProductVariantRequest extends FormRequest 'definitions.*.value' => ['nullable', 'string'], 'images' => ['sometimes', 'nullable', 'array'], 'images.*' => ['required', new ImageOrBase64Rule()], + 'has_tickets' => ['boolean'], + 'minimum_use_date' => ['nullable', 'date'], + 'maximum_use_date' => ['nullable', 'date', 'after_or_equal:minimum_use_date'], ]; } } diff --git a/app/Domains/Catalog/Requests/UpdateProductVariantRequest.php b/app/Domains/Catalog/Requests/UpdateProductVariantRequest.php index 78bfb2f..d8dc26b 100644 --- a/app/Domains/Catalog/Requests/UpdateProductVariantRequest.php +++ b/app/Domains/Catalog/Requests/UpdateProductVariantRequest.php @@ -32,6 +32,9 @@ class UpdateProductVariantRequest extends FormRequest 'definitions.*.value' => ['nullable', 'string'], 'images' => ['sometimes', 'nullable', 'array'], 'images.*' => ['required', new ImageOrBase64Rule()], + 'has_tickets' => ['boolean'], + 'minimum_use_date' => ['nullable', 'date'], + 'maximum_use_date' => ['nullable', 'date', 'after_or_equal:minimum_use_date'], ]; } } diff --git a/app/Domains/Catalog/Resources/ProductResource.php b/app/Domains/Catalog/Resources/ProductResource.php index dc8f222..1aafa61 100644 --- a/app/Domains/Catalog/Resources/ProductResource.php +++ b/app/Domains/Catalog/Resources/ProductResource.php @@ -26,6 +26,7 @@ class ProductResource extends JsonResource 'precio' => $this->precio, 'category' => $this->whenLoaded('category', fn () => $this->category?->nombre), 'brand' => $this->whenLoaded('brand', fn () => $this->brand?->nombre), + 'images' => $this->whenLoaded('attachments', fn () => $this->attachments ->map(fn ($attachment) => $attachment->getTemporaryUrl(1440)) ->values() diff --git a/app/Domains/Catalog/Resources/ProductVariantResource.php b/app/Domains/Catalog/Resources/ProductVariantResource.php index 7ff817a..08baa85 100644 --- a/app/Domains/Catalog/Resources/ProductVariantResource.php +++ b/app/Domains/Catalog/Resources/ProductVariantResource.php @@ -19,6 +19,9 @@ class ProductVariantResource extends JsonResource return [ 'id' => $this->id, 'cantidad_maxima' => $this->stock_tecnico, + 'has_tickets' => $this->has_tickets, + 'minimum_use_date' => $this->minimum_use_date, + 'maximum_use_date' => $this->maximum_use_date, 'product' => ProductResource::make($this->whenLoaded('product')), 'definitions' => $this->whenLoaded( 'definitions', diff --git a/database/migrations/2026_07_14_180621_add_ticket_fields_to_productos_table.php b/database/migrations/2026_07_14_180621_add_ticket_fields_to_productos_table.php new file mode 100644 index 0000000..eda37f5 --- /dev/null +++ b/database/migrations/2026_07_14_180621_add_ticket_fields_to_productos_table.php @@ -0,0 +1,30 @@ +boolean('has_tickets')->default(false); + $table->dateTime('minimum_use_date')->nullable(); + $table->dateTime('maximum_use_date')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('productos', function (Blueprint $table) { + $table->dropColumn(['has_tickets', 'minimum_use_date', 'maximum_use_date']); + }); + } +}; diff --git a/database/migrations/2026_07_14_181346_move_ticket_fields_to_variantes_table.php b/database/migrations/2026_07_14_181346_move_ticket_fields_to_variantes_table.php new file mode 100644 index 0000000..3407cba --- /dev/null +++ b/database/migrations/2026_07_14_181346_move_ticket_fields_to_variantes_table.php @@ -0,0 +1,40 @@ +dropColumn(['has_tickets', 'minimum_use_date', 'maximum_use_date']); + }); + + Schema::table('productos_variantes', function (Blueprint $table) { + $table->boolean('has_tickets')->default(false); + $table->dateTime('minimum_use_date')->nullable(); + $table->dateTime('maximum_use_date')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('productos', function (Blueprint $table) { + $table->boolean('has_tickets')->default(false); + $table->dateTime('minimum_use_date')->nullable(); + $table->dateTime('maximum_use_date')->nullable(); + }); + + Schema::table('productos_variantes', function (Blueprint $table) { + $table->dropColumn(['has_tickets', 'minimum_use_date', 'maximum_use_date']); + }); + } +}; diff --git a/routes/api.php b/routes/api.php index 085f616..5ce1f7f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -11,4 +11,4 @@ require __DIR__.'/../app/Domains/Purchase/routes/api.php'; require __DIR__.'/../app/Domains/Tenant/routes/api.php'; require __DIR__.'/../app/Domains/Integration/routes/api.php'; require __DIR__.'/../app/Domains/Menu/routes/api.php'; -require __DIR__.'/../app/Domains/Product/routes/api.php'; +