154 lines
4.7 KiB
PHP
Executable File
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']);
|
|
}
|
|
} |