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

154 lines
4.7 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;
use Illuminate\Support\Facades\Log;
class CalendarController extends Controller
{
/**
* Mostrar calendario interactivo
*/
public function index(Request $request)
{
$user = Auth::user();
$year = $request->get('year', now()->year);
$monthName = $request->get('month');
// Obtener meses del usuario
$months = $user->months()
->where('year', $year)
->get()
->keyBy('name');
// Si se especifica mes, mostrar ese mes
if ($monthName) {
$currentMonth = $months->get($monthName);
} else {
// Si no, buscar mes abierto o el último del año
$currentMonth = $user->months()
->where('year', $year)
->orderByRaw("FIELD(name, 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre')")
->first();
}
// Obtener ventas diarias del mes actual
$dailySales = [];
if ($currentMonth) {
$sales = $currentMonth->dailySales()->get()->keyBy('date');
foreach ($sales as $sale) {
$dailySales[$sale->date->format('Y-m-d')] = $sale;
}
}
// Obtener gastos del mes
$expenses = [];
if ($currentMonth) {
$expenseList = $currentMonth->expenses()->get();
foreach ($expenseList as $expense) {
$expenses[$expense->date->format('Y-m-d')] = $expense;
}
}
return view('calendar.index', compact('year', 'months', 'currentMonth', 'dailySales', 'expenses'));
}
/**
* Obtener datos de un día específico (para AJAX)
*/
public function day(Request $request)
{
$user = Auth::user();
$date = $request->get('date');
if (!$date) {
return response()->json(['error' => 'Fecha requerida'], 400);
}
// Buscar venta del día
$sale = DailySale::whereHas('month', function ($query) use ($user) {
$query->where('user_id', $user->id);
})
->where('date', $date)
->first();
// Buscar gastos del día
$expenses = $user->expenses()
->where('date', $date)
->get();
return response()->json([
'date' => $date,
'sale' => $sale,
'expenses' => $expenses,
]);
}
/**
* Guardar venta y gasto del día (para AJAX)
*/
public function storeDay(Request $request)
{
$user = Auth::user();
$data = $request->all();
$monthId = $request->input('month_id');
$date = $request->input('date');
$userSales = floatval($request->input('user_sales', 0));
$systemSales = floatval($request->input('system_sales', 0));
$expenseAmount = floatval($request->input('expense_amount', 0));
if (!$monthId || !$date) {
return response()->json(['success' => false, 'message' => 'Faltan datos requeridos']);
}
$month = Month::where('id', $monthId)
->where('user_id', $user->id)
->first();
if (!$month) {
return response()->json(['success' => false, 'message' => 'Mes no encontrado']);
}
// Guardar o actualizar venta solo si hay datos
if ($userSales > 0) {
DailySale::updateOrCreate(
[
'month_id' => $month->id,
'date' => $date,
],
[
'user_id' => $user->id,
'user_sales' => $userSales,
'system_sales' => $systemSales,
]
);
}
// Guardar o actualizar gasto si hay monto
$expenseType = $request->input('expense_type', 'q1');
if ($expenseAmount > 0) {
\App\Models\Expense::updateOrCreate(
[
'month_id' => $month->id,
'date' => $date,
],
[
'user_id' => $user->id,
'description' => $request->input('expense_description', 'Gasto del día'),
'amount' => $expenseAmount,
'expense_type' => $expenseType,
]
);
}
return response()->json(['success' => true, 'message' => 'Datos guardados correctamente']);
}
}