From d71f33b0ed216b3ec93c54ef26ce0914623d6bc9 Mon Sep 17 00:00:00 2001 From: gianella Date: Tue, 9 Dec 2025 17:28:51 -0300 Subject: [PATCH] intento --- app/Http/Controllers/ClientController.php | 64 ++++++ app/Http/Controllers/SaleController.php | 35 +-- app/Models/Product.php | 11 +- app/Models/Sale.php | 7 +- app/Models/SaleDetail.php | 2 +- .../2025_12_06_193913_create_sales_table.php | 12 +- resources/views/clients/create.blade.php | 5 + resources/views/layouts/app.blade.php | 23 +- resources/views/sales/create.blade.php | 215 +++++++++++++++--- routes/web.php | 3 +- 10 files changed, 305 insertions(+), 72 deletions(-) create mode 100644 app/Http/Controllers/ClientController.php create mode 100644 resources/views/clients/create.blade.php 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') +

formulario de crear cliente

+ +@endsection \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 67c46ad..4b2d15f 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -3,15 +3,28 @@ - - @yield('title','Lauck - Home') + + + + @yield('title','Lauck - Home') -
Cabeza
+
+

Lauck Bicicletería

+
- @yield('main') +
+ @yield('main') +
- + + + + + + @stack('scripts') \ No newline at end of file diff --git a/resources/views/sales/create.blade.php b/resources/views/sales/create.blade.php index 8af8f72..fd20768 100644 --- a/resources/views/sales/create.blade.php +++ b/resources/views/sales/create.blade.php @@ -7,44 +7,102 @@
-

Nueva Venta en Mostrador

+
+

Nueva Venta en Mostrador

+
@if (session('success')) - + +@push('scripts') + +@endpush @endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index b10cec5..4308583 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,12 +3,12 @@ use App\Http\Controllers\AuthController; use App\Http\Controllers\CatalogoController; use App\Http\Controllers\SaleController; +use App\Http\Controllers\ClientController; use Illuminate\Support\Facades\Route; use App\Http\Controllers\HomeController; use App\Http\Controllers\LoginController; use App\Http\Controllers\ProductosController; use App\Http\Controllers\RegisterController; -use App\Http\Controllers\SaleController; use App\Models\Product; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; @@ -50,6 +50,7 @@ Route::middleware(['auth'])->group(function () { Route::get('/sales', [SaleController::class, 'index'])->name('sales.index'); Route::get('/sales/create', [SaleController::class, 'create'])->name('sales.create'); + Route::resource('clients', ClientController::class); }); Route::middleware(['auth'])->group(function () {