diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php new file mode 100644 index 0000000..fcf5db8 --- /dev/null +++ b/app/Http/Controllers/ClientController.php @@ -0,0 +1,64 @@ +', 0)->get(); - - return view('sales.create', compact('products')); + + $clients = \App\Models\Client::orderBy('nombre')->get(); + + return view('sales.create', compact('products', 'clients')); } public function store(Request $request) { $request->validate([ 'payment_method' => 'required|string', + 'client_id' => 'nullable|exists:clients,id', 'items' => 'required|array', 'items.*.product_id' => 'required|exists:products,id', 'items.*.quantity' => 'required|integer|min:1', @@ -30,32 +35,36 @@ class SaleController extends Controller try { DB::transaction(function () use ($request) { $totalVenta = 0; + foreach ($request->items as $item) { - $producto = Product::find($item['product_id']); - $totalVenta += $producto->price * $item['quantity']; + $product = Product::find($item['product_id']); + $totalVenta += $product->precio * $item['quantity']; - if ($producto->stock < $item['quantity']) { - throw new \Exception("No hay suficiente stock de " . $producto->name); + if ($product->stock < $item['quantity']) { + throw new \Exception("No hay suficiente stock de " . $product->nombre); } } - // raro arreglar + //cabecera $sale = Sale::create([ - 'user_id' => auth()->id(), // El empleado logueado + //'user_id' => auth()->id(), //empleado logueado + 'client_id' => $request->client_id, 'total' => $totalVenta, 'payment_method' => $request->payment_method, ]); foreach ($request->items as $item) { - $producto = Product::find($item['product_id']); + $product = Product::find($item['product_id']); SaleDetail::create([ 'sale_id' => $sale->id, - 'product_id' => $producto->id, - 'quantity' => $item['quantity'], - 'price' => $producto->price, + 'product_id' => $product->id, + 'cantidad' => $item['quantity'], + 'precio' => $product->precio, ]); - $producto->decrement('stock', $item['quantity']); + $nuevoStock = $product->stock - $item['quantity']; + $product->stock = $nuevoStock; + $product->save(); } }); diff --git a/app/Models/Product.php b/app/Models/Product.php index a4e3f49..9165684 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -8,16 +8,7 @@ use Illuminate\Database\Eloquent\Model; class Product extends Model { use HasFactory; - protected $fillable = [ - 'codigo', - 'nombre', - 'costo', - 'precio', - 'stock', - 'min_stock', - 'categoria', - 'descripcion' - ]; + protected $guarded = []; public function supplier() { return $this->belongsTo(Suppliers::class); diff --git a/app/Models/Sale.php b/app/Models/Sale.php index c9c88ad..aeeca90 100644 --- a/app/Models/Sale.php +++ b/app/Models/Sale.php @@ -3,13 +3,10 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; - +use Illuminate\Database\Eloquent\Factories\HasFactory; class Sale extends Model { - use HasFactory; - protected $fillable = [ - 'metodo_pago' - ]; + //use HasFactory; // Permitimos asignación masiva para poder guardar rápido protected $guarded = []; diff --git a/app/Models/SaleDetail.php b/app/Models/SaleDetail.php index bbe36e6..597eff4 100644 --- a/app/Models/SaleDetail.php +++ b/app/Models/SaleDetail.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model; class SaleDetail extends Model { - use HasFactory; + //use HasFactory; protected $guarded = []; // este detalle pertenece a una Venta específica diff --git a/database/migrations/2025_12_06_193913_create_sales_table.php b/database/migrations/2025_12_06_193913_create_sales_table.php index b0bfc22..2125264 100644 --- a/database/migrations/2025_12_06_193913_create_sales_table.php +++ b/database/migrations/2025_12_06_193913_create_sales_table.php @@ -13,13 +13,11 @@ return new class extends Migration { Schema::create('sales', function (Blueprint $table) { $table->id(); - // 1. Cliente que compra - $table->foreignId('user_id')->constrained()->onDelete('cascade'); - // 2. Datos generales de la venta - $table->decimal('total', 10, 2); // Total final del ticket - $table->string('metodo_pago'); // Ej: "Efectivo", "Tarjeta", "MercadoPago" - //capaz van mas datos ni idea - // 3. Fecha y Hora (created_at servirá como fecha de venta) + //$table->foreignId('user_id')->constrained(); + // nullable para que no sea obligatrio + $table->foreignId('client_id')->nullable()->constrained(); + $table->decimal('total', 10, 2); + $table->string('payment_method'); $table->timestamps(); }); } diff --git a/resources/views/clients/create.blade.php b/resources/views/clients/create.blade.php new file mode 100644 index 0000000..6265ad0 --- /dev/null +++ b/resources/views/clients/create.blade.php @@ -0,0 +1,5 @@ +@extends('layouts.app') +@section('main') +