122 lines
4.0 KiB
PHP
122 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Netbien;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\CashClose;
|
|
use App\Models\Sale;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
class CashCloseController extends Controller
|
|
{
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$query = CashClose::with('user:id,name')->withCount('sales');
|
|
|
|
if ($request->has('status')) {
|
|
$query->where('status', $request->status);
|
|
}
|
|
|
|
if ($request->has('date')) {
|
|
$query->whereDate('close_date', $request->date);
|
|
}
|
|
|
|
$cashCloses = $query->orderBy('id', 'asc')
|
|
->paginate(config('app.pagination'));
|
|
|
|
return ApiResponse::OK->response([
|
|
'cash_closes' => $cashCloses,
|
|
]);
|
|
}
|
|
|
|
public function CloseCashClose($id)
|
|
{
|
|
$today = now()->format('Y-m-d');
|
|
|
|
$cashClose = CashClose::findOrFail($id);
|
|
|
|
$totalSales = Sale::where('cash_close_id', $id)->sum('total_amount');
|
|
$paymentMethods = Sale::where('cash_close_id', $id)
|
|
->select('payment_method', DB::raw('SUM(total_amount) as total'))
|
|
->groupBy('payment_method')
|
|
->get();
|
|
|
|
$cashClose->update([
|
|
'income' => $totalSales,
|
|
'balance' => $totalSales - $cashClose->exit,
|
|
'payment_methods' => $paymentMethods,
|
|
'status' => 'closed',
|
|
'close_date' => $today,
|
|
]);
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => 'Corte de caja cerrado exitosamente.',
|
|
'data' => $cashClose,
|
|
]);
|
|
}
|
|
|
|
public function report($id)
|
|
{
|
|
// Información del corte de caja
|
|
$cashClose = CashClose::with('user:id,name')
|
|
->withCount('sales')
|
|
->findOrFail($id);
|
|
|
|
// Estadísticas por paquete (Total de Paquetes Vendidos por Tipo)
|
|
$packageStats = DB::table('sale_items')
|
|
->join('sales', 'sale_items.sale_id', '=', 'sales.id')
|
|
->join('packages', 'sale_items.package_id', '=', 'packages.id')
|
|
->where('sales.cash_close_id', $id)
|
|
->select(
|
|
'packages.name as paquete',
|
|
DB::raw('COUNT(*) as total_vendidos')
|
|
)
|
|
->groupBy('packages.id', 'packages.name')
|
|
->get();
|
|
|
|
// Estadísticas por duración (Total de Ventas por Duración)
|
|
$durationStats = DB::table('sale_items')
|
|
->join('sales', 'sale_items.sale_id', '=', 'sales.id')
|
|
->join('packages', 'sale_items.package_id', '=', 'packages.id')
|
|
->where('sales.cash_close_id', $id)
|
|
->select(
|
|
'packages.period as duracion_dias',
|
|
DB::raw('COUNT(DISTINCT sales.id) as total_ventas')
|
|
)
|
|
->groupBy('packages.period')
|
|
->orderBy('packages.period', 'asc')
|
|
->get();
|
|
|
|
// Reporte detallado de ventas
|
|
$detailedSales = DB::table('sales')
|
|
->join('clients', 'sales.client_id', '=', 'clients.id')
|
|
->join('sale_items', 'sales.id', '=', 'sale_items.sale_id')
|
|
->join('packages', 'sale_items.package_id', '=', 'packages.id')
|
|
->join('sim_cards', 'sale_items.sim_card_id', '=', 'sim_cards.id')
|
|
->where('sales.cash_close_id', $id)
|
|
->select(
|
|
DB::raw("CONCAT(clients.name, ' ', clients.paternal, ' ', clients.maternal) as nombre_comprador"),
|
|
'sim_cards.iccid as id_sim',
|
|
'sim_cards.msisdn as numero_asignado',
|
|
'packages.name as paquete',
|
|
'packages.price as costo',
|
|
'sales.payment_method as medio_pago'
|
|
)
|
|
->orderBy('sales.id', 'desc')
|
|
->get();
|
|
|
|
return ApiResponse::OK->response([
|
|
'cash_close' => $cashClose,
|
|
'ventas por paquete' => $packageStats,
|
|
'ventas por duracion' => $durationStats,
|
|
'ventas detalladas' => $detailedSales,
|
|
]);
|
|
}
|
|
}
|