From 70f51ac86392117852cb215952fc52270bcb8680 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Thu, 25 Jun 2026 10:34:33 -0300 Subject: [PATCH] feat(purchase): add Purchase and PurchaseItem models with migrations for compras and compra_items tables --- app/Domains/Purchase/Models/Purchase.php | 56 +++++++++++++++++++ app/Domains/Purchase/Models/PurchaseItem.php | 54 ++++++++++++++++++ ...2026_06_25_000420_create_compras_table.php | 38 +++++++++++++ ...06_25_000430_create_compra_items_table.php | 40 +++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 app/Domains/Purchase/Models/Purchase.php create mode 100644 app/Domains/Purchase/Models/PurchaseItem.php create mode 100644 database/migrations/2026_06_25_000420_create_compras_table.php create mode 100644 database/migrations/2026_06_25_000430_create_compra_items_table.php diff --git a/app/Domains/Purchase/Models/Purchase.php b/app/Domains/Purchase/Models/Purchase.php new file mode 100644 index 0000000..b69fb0d --- /dev/null +++ b/app/Domains/Purchase/Models/Purchase.php @@ -0,0 +1,56 @@ + 'integer', + ]; + } + + /** + * @return BelongsTo + */ + public function tenant(): BelongsTo + { + return $this->belongsTo(Tenant::class, 'tenant_codigo', 'codigo'); + } + + /** + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } + + /** + * @return HasMany + */ + public function items(): HasMany + { + return $this->hasMany(PurchaseItem::class, 'compra_id'); + } +} diff --git a/app/Domains/Purchase/Models/PurchaseItem.php b/app/Domains/Purchase/Models/PurchaseItem.php new file mode 100644 index 0000000..c06f665 --- /dev/null +++ b/app/Domains/Purchase/Models/PurchaseItem.php @@ -0,0 +1,54 @@ + 'integer', + 'producto_variante_id' => 'integer', + 'cantidad' => 'integer', + 'precio_unitario' => 'decimal:2', + 'discount_total' => 'decimal:2', + 'tax_total' => 'decimal:2', + 'total' => 'decimal:2', + ]; + } + + /** + * @return BelongsTo + */ + public function purchase(): BelongsTo + { + return $this->belongsTo(Purchase::class, 'compra_id'); + } + + /** + * @return BelongsTo + */ + public function variant(): BelongsTo + { + return $this->belongsTo(ProductVariant::class, 'producto_variante_id'); + } +} diff --git a/database/migrations/2026_06_25_000420_create_compras_table.php b/database/migrations/2026_06_25_000420_create_compras_table.php new file mode 100644 index 0000000..5b6e634 --- /dev/null +++ b/database/migrations/2026_06_25_000420_create_compras_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('tenant_codigo'); + $table->foreignId('user_id')->nullable()->constrained('users')->cascadeOnUpdate()->nullOnDelete(); + $table->enum('status', ['pending', 'paid', 'cancelled'])->default('pending'); + $table->enum('payment_status', ['pending', 'approved', 'rejected'])->default('pending'); + $table->string('payment_method')->nullable(); + $table->timestamps(); + + $table->foreign('tenant_codigo') + ->references('codigo') + ->on('tenants') + ->cascadeOnUpdate() + ->restrictOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('compras'); + } +}; diff --git a/database/migrations/2026_06_25_000430_create_compra_items_table.php b/database/migrations/2026_06_25_000430_create_compra_items_table.php new file mode 100644 index 0000000..3e3b21f --- /dev/null +++ b/database/migrations/2026_06_25_000430_create_compra_items_table.php @@ -0,0 +1,40 @@ +id(); + $table->foreignId('compra_id')->constrained('compras')->cascadeOnUpdate()->cascadeOnDelete(); + $table->unsignedBigInteger('producto_variante_id'); + $table->unsignedInteger('cantidad'); + $table->decimal('precio_unitario', 10, 2); + $table->decimal('discount_total', 10, 2)->nullable(); + $table->decimal('tax_total', 10, 2)->nullable(); + $table->decimal('total', 10, 2); + $table->timestamps(); + + $table->foreign('producto_variante_id') + ->references('id') + ->on('productos_variantes') + ->cascadeOnUpdate() + ->restrictOnDelete(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('compra_items'); + } +};