FEAT: Mejorar el manejo de ventas y asignación de paquetes en el controlador de SIM, evitar duplicados
This commit is contained in:
parent
304a7c3958
commit
01cd737b29
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user