diff --git a/app/Http/Controllers/Netbien/SimCardController.php b/app/Http/Controllers/Netbien/SimCardController.php index aaa3c5c..bc7179b 100644 --- a/app/Http/Controllers/Netbien/SimCardController.php +++ b/app/Http/Controllers/Netbien/SimCardController.php @@ -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