Juan Felipe Zapata Moreno db49b127db ADD: Corte de caja creado
2025-11-05 16:24:22 -06:00

192 lines
5.7 KiB
PHP

<?php namespace App\Http\Controllers\Netbien;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Sale;
use App\Models\SaleItem;
use App\Models\Client;
use App\Models\Packages;
use App\Models\SimCard;
use App\Models\ClientSim;
use App\Enums\SimCardStatus;
use App\Http\Requests\Netbien\SaleStoreRequest;
use App\Http\Requests\Netbien\SaleUpdateRequest;
use App\Services\CashCloseService;
use Illuminate\Support\Facades\DB;
use Notsoweb\ApiResponse\Enums\ApiResponse;
/**
*/
class SaleController extends Controller
{
public function index(Request $request)
{
$query = Sale::with([
'client:id,name,paternal,maternal,email',
'saleItems.simCard:id,iccid,msisdn',
'saleItems.package:id,name,price'
]);
// Filtro por fecha
if ($request->has('date')) {
$query->whereDate('sale_date', $request->date);
}
// Filtro por cliente
if ($request->has('client_id')) {
$query->where('client_id', $request->client_id);
}
// Filtro por método de pago
if ($request->has('payment_method')) {
$query->where('payment_method', $request->payment_method);
}
$sales = $query->orderBy('id', 'asc')
->paginate(config('app.pagination'));
return ApiResponse::OK->response([
'Sale' => $sales,
]);
}
public function store(SaleStoreRequest $request)
{
try {
DB::beginTransaction();
if ($request->has('client_id')) {
$client = Client::findOrFail($request->client_id);
} else {
$client = Client::create($request->client);
}
$total = 0;
foreach ($request->saleItems as $item) {
$package = Packages::findOrFail($item['package_id']);
$total += $package->price;
}
$cashClose = CashCloseService::getOrCreateOpenCashClose();
$sale = Sale::create([
'client_id' => $client->id,
'cash_close_id' => $cashClose->id,
'total_amount' => $total,
'payment_method' => $request->payment_method,
'sale_date' => now(),
]);
foreach ($request->saleItems as $item) {
$sim = SimCard::findOrFail($item['sim_card_id']);
$package = Packages::findOrFail($item['package_id']);
if ($sim->status !== SimCardStatus::AVAILABLE) {
throw new \Exception("La SIM {$sim->msisdn} no está disponible");
}
SaleItem::create([
'sale_id' => $sale->id,
'sim_card_id' => $sim->id,
'package_id' => $package->id,
]);
ClientSim::create([
'client_id' => $client->id,
'sim_card_id' => $sim->id,
'assigned_at' => now(),
'is_active' => true,
]);
$sim->packages()->attach($package->id, [
'activated_at' => now(),
'is_active' => true,
]);
$sim->update(['status' => SimCardStatus::ASSIGNED]);
}
DB::commit();
$sale->load([
'client',
'saleItems.simCard',
'saleItems.package'
]);
return ApiResponse::CREATED->response([
'Sale' => $sale,
'message' => 'Venta registrada exitosamente',
]);
} catch (\Exception $e) {
DB::rollBack();
return ApiResponse::INTERNAL_ERROR->response([
'message' => 'Error al registrar la venta',
'error' => $e->getMessage(),
]);
}
}
public function update(SaleUpdateRequest $request, Sale $sale)
{
$sale->update($request->only(['payment_method']));
return ApiResponse::OK->response([
'data' => $sale,
'message' => 'Venta actualizada exitosamente',
]);
}
public function destroy(Sale $sale)
{
try {
DB::beginTransaction();
// Obtener todos los items de la venta
$items = $sale->items;
foreach ($items as $item) {
$sim = $item->simCard;
// Desactivar el paquete de la SIM
$sim->packages()
->wherePivot('package_id', $item->package_id)
->wherePivot('is_active', true)
->update([
'is_active' => false,
'deactivated_at' => now()
]);
//Liberar la SIM del cliente
ClientSim::where('client_id', $sale->client_id)
->where('sim_card_id', $sim->id)
->where('is_active', true)
->update([
'is_active' => false,
'released_at' => now()
]);
//Cambiar status de la SIM a disponible
$sim->update(['status' => SimCardStatus::AVAILABLE]);
}
//Eliminar la venta (cascade)
$sale->delete();
DB::commit();
return ApiResponse::NO_CONTENT->response();
} catch (\Exception $e) {
DB::rollBack();
return ApiResponse::INTERNAL_ERROR->response([
'message' => 'Error al cancelar la venta',
'error' => $e->getMessage(),
]);
}
}
}