192 lines
5.7 KiB
PHP
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(),
|
|
]);
|
|
}
|
|
}
|
|
}
|