2025-05-17 11:36:26 -04:00

125 lines
3.8 KiB
Go

// service/cuis_service.go
package services
import (
"context"
"daemonService/internal/models/obtencionCodigos"
"daemonService/internal/models/obtencionCodigos/request"
"daemonService/internal/utils"
"database/sql"
"fmt"
"log"
"strconv"
)
type CuisService struct {
Model obtencionCodigos.CuisServiceModel
Logger *log.Logger
}
// En services/cuis_service.go
func NewCuisService(
model obtencionCodigos.CuisServiceModel, logger *log.Logger,
) *CuisService {
return &CuisService{Model: model, Logger: logger}
}
// GetName retorna el nombre del servicio
func (s *CuisService) GetName() string {
return s.Model.Name
}
// logMessage registra un mensaje con el prefijo del servicio
func (s *CuisService) LogMessage(format string, v ...interface{}) {
if s.Logger != nil {
s.Logger.Printf(format, v...)
}
}
// registra un error y devuelve el mismo error
func (s *CuisService) LogError(format string, err error, v ...interface{}) error {
args := append([]interface{}{err}, v...)
if s.Logger != nil {
s.Logger.Printf(format, args...)
}
return fmt.Errorf(format, args...)
}
// crea una solicitud CUIS a partir de datos de empresa
func (s *CuisService) BuildCuisRequestFromEmpresa(ec obtencionCodigos.EmpresaConCuis) request.SolicitudCuisCufd {
return request.SolicitudCuisCufd{
CodigoAmbiente: strconv.Itoa(ec.CodigoAmbiente),
CodigoModalidad: strconv.Itoa(ec.CodigoModalidad),
CodigoPuntoVenta: strconv.Itoa(ec.CodigoPuntoVenta),
CodigoSistema: ec.CodigoSistema,
CodigoSucursal: strconv.Itoa(ec.CodigoSucursal),
Nit: ec.Nit,
KeyToken: ec.TokenKey,
ValueToken: ec.TokenValue,
NombreArchivoClavePrivada: ec.NombreArchivoClavePrivada,
NombreArchivoCertificado: ec.NombreArchivoCertificado,
}
}
// actualiza un registro existente de empresa y CUIS
func (s *CuisService) actualizarRegistro(ctx context.Context, empresaID int, cuisID int64, req request.SolicitudCuisCufd, respRaw interface{}) error {
currentBolivia, err := utils.GetCurrentBoliviaTime()
if err != nil {
return err
}
// 1. Iniciar tx
tx, err := s.Model.DB.BeginTx(ctx, nil)
if err != nil {
return fmt.Errorf("iniciar transacción: %w", err)
}
defer tx.Rollback()
// 2. Parsear respuesta
nuevoCuis, fechaVigencia, _, err := utils.ParseSoapCuisResponse(respRaw)
if err != nil {
return err
}
// 3. Actualizar empresa
_, err = tx.ExecContext(ctx, `
UPDATE registroEmpresa
SET codigo_ambiente=$1, codigo_modalidad=$2, codigo_punto_venta=$3,
codigo_sistema=$4, codigo_sucursal=$5, nit=$6, fecha_actualizacion=$7
WHERE id=$8
`,
req.CodigoAmbiente, req.CodigoModalidad, req.CodigoPuntoVenta,
req.CodigoSistema, req.CodigoSucursal, req.Nit, currentBolivia, empresaID,
)
if err != nil {
return fmt.Errorf("actualizar registroEmpresa: %w", err)
}
// 4. Comprobar si hay un CUIS existente
var existingCuis string
err = tx.QueryRowContext(ctx, `SELECT cuis FROM cuis WHERE id=$1 AND registro_empresa_id=$2`, cuisID, empresaID).Scan(&existingCuis)
if err != nil && err != sql.ErrNoRows {
return fmt.Errorf("consultar cuis existente: %w", err)
}
// 5. Insertar o actualizar
if err == sql.ErrNoRows {
_, err = tx.ExecContext(ctx, `INSERT INTO cuis (registro_empresa_id, cuis) VALUES ($1, $2)`, empresaID, nuevoCuis)
if err != nil {
return fmt.Errorf("insertar nuevo cuis: %w", err)
}
} else if existingCuis != nuevoCuis {
_, err = tx.ExecContext(ctx, `UPDATE cuis SET cuis=$1, fecha_vigencia=$2, fecha_actualizacion=$3 WHERE id=$4`,
nuevoCuis, fechaVigencia, currentBolivia, cuisID)
if err != nil {
return fmt.Errorf("actualizar cuis existente: %w", err)
}
}
// 6. Confirmar tx
if err := tx.Commit(); err != nil {
return fmt.Errorf("confirmar transacción: %w", err)
}
return nil
}