Files
nomina_ventas/app/Http/Controllers/SaleController.php

172 lines
4.8 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Models\DailySale;
use App\Models\Month;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class SaleController extends Controller
{
/**
* Listar todas las ventas del mes actual
*/
public function index(Request $request)
{
$user = Auth::user();
// Obtener mes seleccionado
$monthId = $request->get('month_id');
if ($monthId) {
$month = $user->months()->findOrFail($monthId);
} else {
$month = $user->getCurrentMonth();
if (!$month) {
$month = $user->months()->latest()->first();
}
}
if (!$month) {
return redirect()->route('months.create')->with('info', 'Primero debes crear un mes de trabajo.');
}
$sales = $month->dailySales()
->orderBy('date', 'desc')
->paginate(31);
$months = $user->months()
->orderBy('year', 'desc')
->orderByRaw("FIELD(name, 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre') DESC")
->get();
return view('sales.index', compact('sales', 'month', 'months'));
}
/**
* Mostrar formulario para crear venta
*/
public function create(Request $request)
{
$user = Auth::user();
$monthId = $request->get('month_id');
if ($monthId) {
$month = $user->months()->findOrFail($monthId);
} else {
$month = $user->getCurrentMonth();
if (!$month) {
$month = $user->months()->latest()->first();
}
}
if (!$month) {
return redirect()->route('months.index')->with('info', 'Necesitas un mes de trabajo primero.');
}
return view('sales.create', compact('month'));
}
/**
* Guardar nueva venta
*/
public function store(Request $request)
{
$user = Auth::user();
$validated = $request->validate([
'month_id' => ['required', 'exists:months,id'],
'date' => ['required', 'date'],
'user_sales' => ['required', 'numeric', 'min:0'],
'system_sales' => ['nullable', 'numeric', 'min:0'],
]);
// Verificar que el mes pertenece al usuario
$month = $user->months()->findOrFail($validated['month_id']);
// Verificar si ya existe una venta para esa fecha
$existingSale = $month->dailySales()->where('date', $validated['date'])->first();
if ($existingSale) {
// Actualizar venta existente
$existingSale->update([
'user_sales' => $validated['user_sales'],
'system_sales' => $validated['system_sales'] ?? $existingSale->system_sales,
]);
return redirect()->route('sales.index', ['month_id' => $month->id])
->with('success', 'Venta actualizada correctamente.');
}
// Crear nueva venta
$month->dailySales()->create([
'user_id' => $user->id,
'date' => $validated['date'],
'user_sales' => $validated['user_sales'],
'system_sales' => $validated['system_sales'] ?? 0,
]);
return redirect()->route('sales.index', ['month_id' => $month->id])
->with('success', 'Venta registrada correctamente.');
}
/**
* Mostrar formulario de edición
*/
public function edit(DailySale $sale)
{
$user = Auth::user();
// Verificar que la venta pertenece al usuario
if ($sale->user_id !== $user->id) {
abort(403);
}
return view('sales.edit', compact('sale'));
}
/**
* Actualizar venta
*/
public function update(Request $request, DailySale $sale)
{
$user = Auth::user();
if ($sale->user_id !== $user->id) {
abort(403);
}
$validated = $request->validate([
'date' => ['required', 'date'],
'user_sales' => ['required', 'numeric', 'min:0'],
'system_sales' => ['nullable', 'numeric', 'min:0'],
]);
$sale->update($validated);
return redirect()->route('sales.index', ['month_id' => $sale->month_id])
->with('success', 'Venta actualizada correctamente.');
}
/**
* Eliminar venta
*/
public function destroy(DailySale $sale)
{
$user = Auth::user();
if ($sale->user_id !== $user->id) {
abort(403);
}
$monthId = $sale->month_id;
$sale->delete();
return redirect()->route('sales.index', ['month_id' => $monthId])
->with('success', 'Venta eliminada correctamente.');
}
}