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(), ]); } } }