FEAT: Mejorar el manejo de ventas y asignación de paquetes en el controlador de SIM, evitar duplicados

This commit is contained in:
Juan Felipe Zapata Moreno 2025-11-25 12:24:39 -06:00
parent 304a7c3958
commit 01cd737b29

View File

@ -110,6 +110,7 @@ public function destroy(SimCard $simCard)
private $columnMap = [];
private $stats = [
'created' => 0,
'updated' => 0,
'assigned' => 0,
'packages_created' => 0,
'clients_created' => 0,
@ -213,12 +214,22 @@ private function processRow(array $row, int $rowNumber = 0)
]);
$this->stats['created']++;
} else {
// Ya existe, actualizar (msisdn en caso de cambio)
$sim->update([
'msisdn' => $row['msisdn'],
]);
if (!isset($this->stats['updated'])) {
$this->stats['updated'] = 0;
}
$this->stats['updated']++;
}
// Determinar si es una venta (tiene usuario Y paquete)
$hasUsuario = !empty($row['usuario']) &&
strtolower(trim($row['usuario'])) !== 'si' &&
strtolower(trim($row['usuario'])) !== 'no';
strtolower(trim($row['usuario'])) !== 'si' &&
strtolower(trim($row['usuario'])) !== 'no';
$hasPaquete = !empty($row['paquetes']);
if ($hasUsuario && $hasPaquete) {
@ -314,16 +325,52 @@ private function processSale(SimCard $sim, array $row)
]);
}
// Asignar paquete a la SIM
$sim->packages()->attach($package->id, [
'activated_at' => $saleDate,
'is_active' => true,
]);
// Verificar si ya existe una venta para esta SIM con este paquete
// (para evitar duplicados en reimportaciones)
$existingSale = Sale::whereHas('saleItems', function ($query) use ($sim, $package) {
$query->where('sim_card_id', $sim->id)
->where('package_id', $package->id);
})->where('client_id', $client->id)
->where('sale_date', $saleDate)
->exists();
if (!$existingSale) {
// Crear la venta
$sale = Sale::create([
'client_id' => $client->id,
'cash_close_id' => null, // Importaciones no tienen corte de caja
'total_amount' => $package->price,
'payment_method' => $paymentMethod,
'sale_date' => $saleDate,
]);
// Crear el item de venta
SaleItem::create([
'sale_id' => $sale->id,
'sim_card_id' => $sim->id,
'package_id' => $package->id,
]);
$this->stats['sales_created']++;
}
// Asignar paquete a la SIM (usando syncWithoutDetaching para evitar duplicados)
// Primero verificamos si ya existe la relación activa
$hasActivePackage = $sim->packages()
->wherePivot('package_id', $package->id)
->wherePivot('is_active', true)
->exists();
if (!$hasActivePackage) {
$sim->packages()->attach($package->id, [
'activated_at' => $saleDate,
'is_active' => true,
]);
}
// Actualizar status de la SIM
$sim->update(['status' => SimCardStatus::ASSIGNED]);
$this->stats['sales_created']++;
$this->stats['assigned']++;
}
@ -401,10 +448,17 @@ private function processPackageFromText(SimCard $sim, array $row)
$packageInfo['price']
);
$sim->packages()->attach($package->id, [
'activated_at' => now(),
'is_active' => true,
]);
$hasActivePackage = $sim->packages()
->wherePivot('package_id', $package->id)
->wherePivot('is_active', true)
->exists();
if (!$hasActivePackage) {
$sim->packages()->attach($package->id, [
'activated_at' => now(),
'is_active' => true,
]);
}
}
private function parsePackageText(string $text): ?array