public function enviarComprobante(Venta $venta): array
{
$venta->load(['empresa', 'tipoDocumento']);
$empresa = $venta->empresa;
$ruc = $this->getRuc($empresa);
// Buscar XML generado
$xmlPath = storage_path("app/{$venta->xml_url}");
if (!file_exists($xmlPath)) {
return ['success' => false, 'message' => 'XML no encontrado. Genere el XML primero.'];
}
$xmlContent = file_get_contents($xmlPath);
$nombreArchivo = pathinfo($xmlPath, PATHINFO_FILENAME);
// Enviar vía SOAP
$see = $this->getSee($empresa);
$result = $see->sendXml(Invoice::class, $nombreArchivo, $xmlContent);
if ($result->isSuccess()) {
$cdr = $result->getCdrResponse();
$cdrZip = $result->getCdrZip();
// Guardar CDR
$cdrDir = storage_path("app/sunat/cdr/{$ruc}");
if (!is_dir($cdrDir)) {
mkdir($cdrDir, 0755, true);
}
file_put_contents("{$cdrDir}/R-{$nombreArchivo}.zip", $cdrZip);
// Actualizar venta
$venta->update([
'estado_sunat' => '1', // Aceptado
'cdr_url' => "sunat/cdr/{$ruc}/R-{$nombreArchivo}.zip",
'codigo_sunat' => $cdr->getCode(),
'mensaje_sunat' => $cdr->getDescription(),
]);
return [
'success' => true,
'codigo' => $cdr->getCode(),
'mensaje' => $cdr->getDescription(),
'cdr_url' => "sunat/cdr/{$ruc}/R-{$nombreArchivo}.zip",
];
}
// Error
$error = $result->getError();
$venta->update([
'estado_sunat' => '2', // Rechazado
'codigo_sunat' => $error->getCode(),
'mensaje_sunat' => $error->getMessage(),
'intentos' => ($venta->intentos ?? 0) + 1,
]);
return [
'success' => false,
'codigo' => $error->getCode(),
'message' => $error->getMessage(),
];
}