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

743 lines
21 KiB
Transact-SQL

SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
SET NOCOUNT ON;
GO
UPDATE dbo.Vta_TipoDocumentos
SET TipoDocumento = N'Remisión'
WHERE CveTipoDocumento = 'Rem'
AND TipoDocumento <> N'Remisión';
GO
DECLARE @CveUsuarioSistema int =
(
SELECT TOP (1)
CveUsuario
FROM dbo.Sis_Usuarios
WHERE Activo = 1
ORDER BY CveUsuario
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE CveFormaPago = 99
)
BEGIN
INSERT INTO dbo.Vta_FormaPago
(
CveFormaPago,
FormaPago,
ClaveFormaPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
99,
'Por definir',
'99',
@CveUsuarioSistema,
CONVERT(date, GETDATE())
);
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_MetodoPago
WHERE CveMetodoPago = 2
)
BEGIN
INSERT INTO dbo.Vta_MetodoPago
(
CveMetodoPago,
MetodoPago,
ClaveMetodoPagoSAT,
CveUsuario,
FechaIng
)
VALUES
(
2,
'Pago en parcialidades o diferido',
'PPD',
@CveUsuarioSistema,
CONVERT(date, GETDATE())
);
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.Vta_Pagos')
AND name = 'UX_Vta_Pagos_SolicitudTramitePagoActivo'
)
BEGIN
CREATE UNIQUE NONCLUSTERED INDEX UX_Vta_Pagos_SolicitudTramitePagoActivo
ON dbo.Vta_Pagos
(
CveSolicitud,
CveTramitePago
)
WHERE EsActivo = 1
AND CveSolicitud IS NOT NULL;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_FraccionamientoPagoPendienteList
@CveFraccionamiento 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 @PorcentajeIVA decimal(9, 6) = 0.16;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SELECT
@ErrorMostrar = 'El fraccionamiento solicitado no existe.',
@ErrorTipo = 2;
RETURN;
END;
;WITH Conceptos AS
(
SELECT
S.CveSolicitud,
P.CveTramitePago,
COUNT_BIG(*) AS NumeroConceptos,
SUM(
ROUND(
CONVERT(decimal(18, 4), Costo.Importe),
2
)
) AS SubTotal,
SUM(
ROUND(
CONVERT(decimal(18, 4), Costo.Importe) *
@PorcentajeIVA,
2
)
) AS IVA
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = D.CvePS
OUTER APPLY
(
SELECT TOP (1)
CT.Importe
FROM dbo.Tra_CostosTramite AS CT
WHERE CT.CveTipoTramite = S.CveTipoTramite
AND CT.CvePS = D.CvePS
AND CT.EsActivo = 1
AND
(
CT.FechaInicioVigencia IS NULL
OR CT.FechaInicioVigencia <= CONVERT(date, GETDATE())
)
AND
(
CT.FechaFinVigencia IS NULL
OR CT.FechaFinVigencia >= CONVERT(date, GETDATE())
)
ORDER BY
ISNULL(
CT.FechaInicioVigencia,
CONVERT(date, '19000101')) DESC,
CT.CveCostoTramite DESC
) AS Costo
WHERE S.CveFraccionamiento = @CveFraccionamiento
GROUP BY
S.CveSolicitud,
P.CveTramitePago
)
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
CONVERT(
bit,
CASE
WHEN SP.CveSolicitudPago IS NOT NULL
AND V.CveVenta IS NOT NULL THEN 1
ELSE 0
END
) AS VentaGenerada,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
CONVERT(int, C.NumeroConceptos) AS NumeroConceptos,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.SubTotal
ELSE V.SubTotal
END
) AS SubTotal,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.IVA
ELSE V.IVA
END
) AS IVA,
CONVERT(
decimal(18, 2),
CASE
WHEN V.CveVenta IS NULL THEN C.SubTotal + C.IVA
ELSE V.Total
END
) AS Total
FROM Conceptos AS C
INNER JOIN dbo.Tra_Solicitudes AS S
ON S.CveSolicitud = C.CveSolicitud
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 = C.CveTramitePago
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
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Vta_Pagos AS VP
WHERE VP.CveSolicitud = S.CveSolicitud
AND VP.CveTramitePago = P.CveTramitePago
AND VP.CveVenta = SP.CveVenta
AND VP.EsActivo = 1
)
ORDER BY
E.Orden,
S.CveSolicitud,
P.Orden,
P.CveTramitePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los pagos pendientes; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_FraccionamientoPagoPendienteList'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_FraccionamientoPagoRealizadoList
@CveFraccionamiento 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.Fraccionamientos
WHERE CveFraccionamiento = @CveFraccionamiento
)
BEGIN
SELECT
@ErrorMostrar = 'El fraccionamiento solicitado no existe.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
SP.CveSolicitudPago,
SP.CveSolicitud,
SP.CveTramitePago,
V.CveVenta,
VP.CvePago,
V.SerieFolio,
V.Fecha,
VP.FechaPago,
VP.Referencia,
S.Folio AS FolioSolicitud,
E.Etapa,
TT.TipoTramite,
P.Nombre AS NombrePago,
CONVERT(decimal(18, 2), V.SubTotal) AS SubTotal,
CONVERT(decimal(18, 2), V.IVA) AS IVA,
CONVERT(decimal(18, 2), VP.Importe) AS Total
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Tra_Solicitudes AS S
ON S.CveSolicitud = SP.CveSolicitud
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 = SP.CveTramitePago
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
INNER JOIN dbo.Vta_Pagos AS VP
ON VP.CveVenta = V.CveVenta
AND VP.CveSolicitud = SP.CveSolicitud
AND VP.CveTramitePago = SP.CveTramitePago
AND VP.EsActivo = 1
WHERE S.CveFraccionamiento = @CveFraccionamiento
ORDER BY
VP.FechaPago DESC,
VP.CvePago DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los pagos realizados; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(
ERROR_PROCEDURE(),
'PA_Vta_FraccionamientoPagoRealizadoList'
),
'; 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,
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
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
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramitePagoSave
@CveSolicitud int,
@CveTramitePago int,
@Referencia varchar(200) = NULL,
@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,
@CveCliente int,
@Importe decimal(18, 2),
@CvePago int,
@FechaPago datetime = GETDATE();
SELECT
@CveVenta = V.CveVenta,
@CveCliente = V.CveCliente,
@Importe = CONVERT(decimal(18, 2), V.Total)
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.Vta_Pagos WITH (UPDLOCK, HOLDLOCK)
WHERE CveSolicitud = @CveSolicitud
AND CveTramitePago = @CveTramitePago
AND CveVenta = @CveVenta
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'La venta del trámite ya se encuentra pagada.',
@ErrorTipo = 2;
RETURN;
END;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Vta_FormaPago
WHERE CveFormaPago = 99
)
BEGIN
SELECT
@ErrorMostrar = 'La forma de pago por definir no está configurada; favor de contactar a Sistemas.',
@ErrorTipo = 2;
RETURN;
END;
INSERT INTO dbo.Vta_Pagos
(
CveCliente,
CveVenta,
CveSolicitud,
CveFormaPago,
CveMoneda,
CvePrePoliza,
FechaPago,
Importe,
Referencia,
EsSaldoFavor,
EsActivo,
FechaAlta,
CveUsuario,
CveTramitePago
)
VALUES
(
@CveCliente,
@CveVenta,
@CveSolicitud,
99,
1,
NULL,
@FechaPago,
@Importe,
NULLIF(LTRIM(RTRIM(@Referencia)), ''),
0,
1,
@FechaPago,
@CveUsuarioEjecuta,
@CveTramitePago
);
SET @CvePago = CONVERT(int, SCOPE_IDENTITY());
UPDATE dbo.Ventas
SET
CveMetodoPago = 2,
FormaPago = 99,
CveFormaPago33 = 99,
CveMetodoPago33 = 2,
FechaCobranza = @FechaPago,
CveUsuarioCobranza = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
SELECT @CvePago AS CvePago;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al registrar el pago 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_TramitePagoSave'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaGenerar
@CveSolicitud int,
@CveTramitePago int,
@Observaciones varchar(2000) = NULL,
@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 EXISTS
(
SELECT 1
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
)
BEGIN
SELECT
@ErrorMostrar = 'La venta del trámite ya fue generada.',
@ErrorTipo = 2;
RETURN;
END;
EXEC dbo.PA_Vta_TramiteVentaSave
@CveSolicitud = @CveSolicitud,
@CveTramitePago = @CveTramitePago,
@Observaciones = @Observaciones,
@CveUsuarioEjecuta = @CveUsuarioEjecuta,
@ErrorMostrar = @ErrorMostrar OUTPUT,
@ErrorTipo = @ErrorTipo OUTPUT,
@Return = @Return OUTPUT;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al generar 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_TramiteVentaGenerar'
),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE()
);
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO