Files
Plataforma-de-desarrolladores/Facturacion_Timbrado_Venta_20260828.sql
Jorge Luis caudillo esparza c4f958e688 --
2026-09-02 01:08:02 -07:00

591 lines
20 KiB
Transact-SQL

CREATE OR ALTER PROCEDURE dbo.PA_Fac_EmisorFiscalGet
@CveEmpresa int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa no tiene configurado un emisor fiscal activo.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
CveEmisorFiscal,
CveEmpresa,
Rfc,
NombreFiscal,
RegimenFiscal,
CodigoPostal,
ProveedorPac,
AmbienteProduccion,
ReferenciaCredencialPac,
ReferenciaContratoPac,
ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd,
NumeroCertificado,
VigenciaCertificadoDesde,
VigenciaCertificadoHasta,
HuellaCertificado,
EsActivo
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el emisor fiscal; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_EmisorFiscalGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaDatosCfdiGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas AS V
WHERE V.CveVenta = @CveVenta
AND
(
V.SeTimbro = 1
OR EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado = 'TIMBRADO'
AND D.CveCfdiTimbradoVigente IS NOT NULL
)
)
)
BEGIN
SELECT
@ErrorMostrar = 'La venta ya se encuentra timbrada.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE TipoOrigen = 'VENTA'
AND CveOrigen = @CveVenta
AND Estado = 'REVISAR'
)
BEGIN
SELECT
@ErrorMostrar = 'Existe un intento de timbrado con resultado indeterminado; debe revisarse antes de volver a timbrar.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
V.CveVenta,
Borrador.CveCfdiDocumento,
V.CveCliente,
V.Serie,
V.Folio,
V.Fecha,
FP.ClaveFormaPagoSAT AS FormaPago,
MP.ClaveMetodoPagoSAT AS MetodoPago,
M.AbreviaturaSAT AS Moneda,
CONVERT(decimal(19, 6), V.TipoCambio) AS TipoCambio
FROM dbo.Ventas AS V
LEFT JOIN dbo.Vta_FormaPago AS FP
ON FP.CveFormaPago = V.FormaPago
LEFT JOIN dbo.Vta_MetodoPago AS MP
ON MP.CveMetodoPago = V.CveMetodoPago
INNER JOIN dbo.Gral_Monedas AS M
ON M.CveMoneda = V.CveMoneda
OUTER APPLY
(
SELECT TOP (1) D.CveCfdiDocumento
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.CveCfdiTimbradoVigente IS NULL
AND D.Estado IN ('BORRADOR', 'LISTO', 'ERROR')
ORDER BY D.CveCfdiDocumento DESC
) AS Borrador
WHERE V.CveVenta = @CveVenta;
SELECT
SATPS.SATClavePS AS ClaveProductoServicio,
PS.Codigo AS NumeroIdentificacion,
VD.Cantidad,
SATUM.SATClaveUnidadMedida AS ClaveUnidad,
UM.UnidadMedida AS Unidad,
PS.PS AS Descripcion,
VD.PrecioUnitario AS ValorUnitario,
VD.PrecioUnitario AS PU,
VD.Importe AS Total,
VD.Descuento,
OI.CodigoObjetoImpuesto AS ObjetoImpuesto,
CONVERT(
decimal(19, 6),
VD.Importe - VD.Descuento
) AS BaseIVA,
CONVERT(decimal(19, 6), 0.16) AS TasaIVA,
CONVERT(decimal(19, 6), VD.IVA) AS ImporteIVA,
CONVERT(decimal(19, 6), 0.16) AS PorcentajeIVA
FROM dbo.VentasDetalle AS VD
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = VD.CvePS
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
LEFT JOIN dbo.Gral_SAT_ProductosServicios AS SATPS
ON SATPS.CveSATPS = PS.CveSATPS
LEFT JOIN dbo.Gral_SAT_UnidadesMedida AS SATUM
ON SATUM.CveSATUnidadMedida = UM.CveSATUnidadMedida
LEFT JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE VD.CveVenta = @CveVenta
ORDER BY VD.CveVentaDetalle;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al preparar los datos fiscales de la venta; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaDatosCfdiGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_EmisorFiscalSave
@CveEmisorFiscal int = NULL,
@CveEmpresa int,
@Rfc varchar(13),
@NombreFiscal varchar(300),
@RegimenFiscal varchar(3),
@CodigoPostal varchar(5),
@ProveedorPac varchar(50),
@AmbienteProduccion bit,
@ReferenciaCredencialPac varchar(100),
@ReferenciaContratoPac varchar(100) = NULL,
@ReferenciaCertificadoCsd varchar(500) = NULL,
@ReferenciaLlavePrivadaCsd varchar(500) = NULL,
@NumeroCertificado varchar(20) = NULL,
@VigenciaCertificadoDesde datetime2(0) = NULL,
@VigenciaCertificadoHasta datetime2(0) = NULL,
@HuellaCertificado varchar(128) = NULL,
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
@Rfc = UPPER(REPLACE(LTRIM(RTRIM(@Rfc)), ' ', '')),
@NombreFiscal = LTRIM(RTRIM(@NombreFiscal)),
@RegimenFiscal = LTRIM(RTRIM(@RegimenFiscal)),
@CodigoPostal = LTRIM(RTRIM(@CodigoPostal)),
@ProveedorPac = UPPER(LTRIM(RTRIM(@ProveedorPac))),
@ReferenciaCredencialPac = LTRIM(RTRIM(@ReferenciaCredencialPac)),
@ReferenciaContratoPac = NULLIF(LTRIM(RTRIM(@ReferenciaContratoPac)), ''),
@ReferenciaCertificadoCsd = NULLIF(LTRIM(RTRIM(@ReferenciaCertificadoCsd)), ''),
@ReferenciaLlavePrivadaCsd = NULLIF(LTRIM(RTRIM(@ReferenciaLlavePrivadaCsd)), ''),
@NumeroCertificado = NULLIF(LTRIM(RTRIM(@NumeroCertificado)), ''),
@HuellaCertificado = NULLIF(LTRIM(RTRIM(@HuellaCertificado)), '');
IF LEN(@Rfc) NOT IN (12, 13)
OR NULLIF(@NombreFiscal, '') IS NULL
OR LEN(@RegimenFiscal) <> 3
OR LEN(@CodigoPostal) <> 5
OR NULLIF(@ProveedorPac, '') IS NULL
OR NULLIF(@ReferenciaCredencialPac, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture RFC, nombre fiscal, régimen, código postal, PAC y referencia de credencial válidos.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveEmisorFiscal IS NULL
BEGIN
IF EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa ya cuenta con una configuración fiscal.',
@ErrorTipo = 2;
RETURN;
END;
INSERT dbo.Fac_EmisoresFiscales
(
CveEmpresa,
Rfc,
NombreFiscal,
RegimenFiscal,
CodigoPostal,
ProveedorPac,
AmbienteProduccion,
ReferenciaCredencialPac,
ReferenciaContratoPac,
ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd,
NumeroCertificado,
VigenciaCertificadoDesde,
VigenciaCertificadoHasta,
HuellaCertificado,
EsActivo,
CveUsuario
)
VALUES
(
@CveEmpresa,
@Rfc,
@NombreFiscal,
@RegimenFiscal,
@CodigoPostal,
@ProveedorPac,
@AmbienteProduccion,
@ReferenciaCredencialPac,
@ReferenciaContratoPac,
@ReferenciaCertificadoCsd,
@ReferenciaLlavePrivadaCsd,
@NumeroCertificado,
@VigenciaCertificadoDesde,
@VigenciaCertificadoHasta,
@HuellaCertificado,
@EsActivo,
@CveUsuarioEjecuta
);
SET @CveEmisorFiscal = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmisorFiscal = @CveEmisorFiscal
AND CveEmpresa = @CveEmpresa
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró la configuración fiscal seleccionada.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Fac_EmisoresFiscales
SET Rfc = @Rfc,
NombreFiscal = @NombreFiscal,
RegimenFiscal = @RegimenFiscal,
CodigoPostal = @CodigoPostal,
ProveedorPac = @ProveedorPac,
AmbienteProduccion = @AmbienteProduccion,
ReferenciaCredencialPac = @ReferenciaCredencialPac,
ReferenciaContratoPac = @ReferenciaContratoPac,
ReferenciaCertificadoCsd = @ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd = @ReferenciaLlavePrivadaCsd,
NumeroCertificado = @NumeroCertificado,
VigenciaCertificadoDesde = @VigenciaCertificadoDesde,
VigenciaCertificadoHasta = @VigenciaCertificadoHasta,
HuellaCertificado = @HuellaCertificado,
EsActivo = @EsActivo,
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveEmisorFiscal = @CveEmisorFiscal;
END;
SELECT @CveEmisorFiscal AS CveEmisorFiscal;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el emisor fiscal; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_EmisorFiscalSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteContextoGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveSubProyecto int =
(
SELECT TOP (1) CveSubProyecto
FROM dbo.SubProyectos
WHERE Estatus = 1
ORDER BY
CASE WHEN Serie = 'TRA' THEN 0 ELSE 1 END,
CveSubProyecto
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
WHERE S.CveSolicitud = @CveSolicitud
)
BEGIN
SELECT
@ErrorMostrar = 'El pago seleccionado no corresponde al trámite o no tiene conceptos activos.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
VP.CvePago,
CONVERT(
bit,
CASE
WHEN SP.CveSolicitudPago IS NOT NULL
AND V.CveVenta IS NOT NULL
THEN 1
ELSE 0
END
) AS VentaGenerada,
CONVERT(
bit,
CASE WHEN VP.Autorizado = 1 THEN 1 ELSE 0 END
) AS VentaPagada,
CONVERT(
bit,
CASE
WHEN VP.CvePago IS NOT NULL
AND VP.Autorizado = 0
THEN 1
ELSE 0
END
) AS PagoPendienteAutorizacion,
VP.Referencia AS ReferenciaPago,
Documento.CveCfdiDocumento,
CONVERT(
bit,
CASE
WHEN V.SeTimbro = 1
OR Documento.Estado = 'TIMBRADO'
THEN 1
ELSE 0
END
) AS VentaTimbrada,
CONVERT(
bit,
CASE WHEN Documento.Estado = 'CANCELADO' THEN 1 ELSE 0 END
) AS TimbreCancelado,
Documento.Uuid AS UuidTimbre,
S.CveFraccionamiento,
F.Fraccionamiento,
F.CveCliente,
C.Nombre AS Cliente,
C.RFC,
CONCAT(
C.Direccion,
CASE
WHEN NULLIF(LTRIM(RTRIM(C.NoExt)), '') IS NULL
THEN ''
ELSE CONCAT(' ', C.NoExt)
END,
CASE
WHEN NULLIF(LTRIM(RTRIM(C.NoInt)), '') IS NULL
THEN ''
ELSE CONCAT(' Int. ', C.NoInt)
END
) AS Direccion,
C.Colonia,
CONCAT(C.Ciudad, ', ', C.Estado) AS CiudadEstado,
C.CP,
C.Telefono,
C.Mail,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
N'Remisión' AS TipoDocumento,
ISNULL(V.Serie, 'TRA') AS Serie,
ISNULL(
V.Folio,
ISNULL(
(
SELECT MAX(Venta.Folio) + 1
FROM dbo.Ventas AS Venta
WHERE Venta.TipoDocto = 'Rem'
AND Venta.Serie = 'TRA'
AND Venta.CveSubProyecto = @CveSubProyecto
),
1
)
) AS Folio,
ISNULL(V.Fecha, GETDATE()) AS Fecha,
ISNULL(V.CveMetodoPago33, ISNULL(V.CveMetodoPago, 2))
AS CveMetodoPago,
ISNULL(V.CveFormaPago33, ISNULL(V.FormaPago, 99))
AS CveFormaPago,
V.FechaVencimiento2 AS FechaVencimiento
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Fraccionamientos AS F
ON F.CveFraccionamiento = S.CveFraccionamiento
INNER JOIN dbo.FraccionamientosEtapas AS E
ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
INNER JOIN dbo.Tra_TiposTramite AS TT
ON TT.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = F.CveCliente
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
LEFT JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
OUTER APPLY
(
SELECT TOP (1)
Pago.CvePago,
Pago.Autorizado,
Pago.Referencia
FROM dbo.Vta_Pagos AS Pago
WHERE Pago.CveVenta = V.CveVenta
AND Pago.CveSolicitud = S.CveSolicitud
AND Pago.CveTramitePago = P.CveTramitePago
AND Pago.EsActivo = 1
ORDER BY Pago.CvePago DESC
) AS VP
OUTER APPLY
(
SELECT TOP (1)
D.CveCfdiDocumento,
D.Estado,
T.Uuid
FROM dbo.Fac_CfdiDocumentos AS D
LEFT JOIN dbo.Fac_CfdiTimbrados AS T
ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado IN ('TIMBRADO', 'CANCELADO')
ORDER BY D.CveCfdiDocumento DESC
) AS Documento
WHERE S.CveSolicitud = @CveSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar la venta del trámite; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteContextoGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO