5267 lines
261 KiB
Transact-SQL
5267 lines
261 KiB
Transact-SQL
/*
|
|
Pagos y Convenios - procedimientos y dependencias.
|
|
NO EJECUTADO. Preparado sobre la BD y los procedimientos consultados el 22/09/2026.
|
|
Incluye 25 PAs nuevos, 24 PAs adaptados y la vista existente Vta_SaldosFavor.
|
|
|
|
INSTALACIÓN COORDINADA PENDIENTE:
|
|
1. Estructura_20260922.sql.
|
|
2. Este archivo.
|
|
3. Configuracion_20260922.sql.
|
|
El instalador debe usar la MISMA conexión y transacción para todos los lotes,
|
|
detenerse ante cualquier error y confirmar sólo con la aplicación compatible.
|
|
GO separa lotes; no ejecutar con un cliente que continúe después de errores.
|
|
El SQL no inicia, confirma ni revierte transacciones.
|
|
|
|
CONTRATO CON LOS SERVICIOS (pendientes de adaptar en la siguiente entrega):
|
|
- TransactionLogic para todas las mutaciones, incluidas bitácora y
|
|
PA_Tra_SolicitudProcesoActualizar para las solicitudes afectadas.
|
|
- Si cualquier PA devuelve Return=0, abandonar y revertir toda la operación.
|
|
- Validar permisos y acceso cliente en el servicio; nunca confiar en un
|
|
CveCliente o PermitirDisminucion enviado por el navegador.
|
|
- Pagos.RegistrarAbono: registro/aplicación/cancelación de abonos.
|
|
Pagos.CambiarRequerido: excepción con observación obligatoria.
|
|
Pagos.AdministrarDocumentosFiscales: carga/validación/vinculación fiscal.
|
|
Convenios.Crear/Modificar/Cancelar y Convenios.DisminuirImporte.
|
|
Permisos particulares: sólo SuperUsuario en catálogo de usuarios.
|
|
- Guardar/aplicar/cancelar abono y convenio obtiene un bloqueo transaccional
|
|
común para impedir sobregiros concurrentes. No hay saldos persistidos.
|
|
- GenerarPorSolicitud exige vencimiento explícito; no decide el plazo.
|
|
- Importes de obligación/plantilla son finales. Los parámetros de captura
|
|
anterior de precio NETO conservan su cálculo fiscal en PagoDetalleSave.
|
|
La captura nueva usa PrecioUnitarioFinal y no cambia el catálogo de costos.
|
|
- Abonos son recibidos/confirmados; valores y equivalencias no se actualizan.
|
|
ImporteAplicado está en la unidad de la obligación. ImportePagoConsumido,
|
|
en la unidad del abono. AplicacionesJson identifica producto y parcialidad.
|
|
- Un traslado a convenio no cuenta como dinero pagado. La UI debe usar
|
|
SaldoPendiente, ImporteAbonado e ImporteConvenido, no sólo TienePago.
|
|
- Edición de convenio sin movimientos: capturar antes/después en bitácora;
|
|
con aplicaciones o traslados posteriores se conserva su detalle histórico.
|
|
- CFDI externo: captura manual, no parser, ZIP, asociación automática ni PAC.
|
|
Servicio almacena XML/PDF y resuelve rutas con protección de documentos.
|
|
Documento fiscal no crea pagos. El listado pendiente requiere XML, PDF,
|
|
timbrado y validación del importe; conserva visible documentación parcial.
|
|
- Ventas y condiciones fiscales siguen independientes de las obligaciones.
|
|
Modificar una venta no reescribe los importes históricos de la deuda.
|
|
La generación anterior de venta se conserva sólo para MXN y total coincidente.
|
|
- Catálogo ProductosServicios y Conta_Cuentas se reutilizan; no se inventa
|
|
cuenta ni producto genérico Convenio, usuario o equivalencia.
|
|
|
|
PENDIENTE DE PRUEBA DE INTEGRACIÓN: instalación en base de pruebas y conexión
|
|
de repositorios/servicios/pantallas. No publicar esta migración aisladamente.
|
|
*/
|
|
SET NOCOUNT ON;
|
|
|
|
SET ANSI_NULLS ON;
|
|
|
|
SET QUOTED_IDENTIFIER ON;
|
|
|
|
IF DB_NAME() <> N'SIG_PlataformaDesarolladores'
|
|
THROW 51390, N'La base seleccionada no corresponde a la revisada.', 1;
|
|
|
|
IF @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51391, N'Se requiere una transacción activa del instalador.', 1;
|
|
|
|
IF OBJECT_ID(N'dbo.Tra_TiposTramitePagos', N'U') IS NULL
|
|
OR COL_LENGTH(N'dbo.Tra_Pagos', N'ValorConversion') IS NULL
|
|
THROW 51392, N'Instale primero la estructura de Pagos y Convenios.', 1;
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoListar
|
|
@CveSolicitudPago INT=NULL,
|
|
@CveCliente INT=NULL,
|
|
@CveFraccionamiento INT=NULL,
|
|
@CveSolicitud INT=NULL,
|
|
@CveTipoTramite INT=NULL,
|
|
@CveTipoSolicitudPago INT=NULL,
|
|
@EstadoAdministrativo VARCHAR (20)=NULL,
|
|
@SoloPendientes BIT=NULL,
|
|
@SoloVencidos BIT=0,
|
|
@Desde DATE=NULL,
|
|
@Hasta DATE=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 @Hoy AS DATE = CONVERT (DATE, GETDATE());
|
|
DECLARE @Vencimientos TABLE (
|
|
CveSolicitudPago INT PRIMARY KEY,
|
|
PrimerVencimiento DATE,
|
|
ImporteVencido DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoParcialidad,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoParcialidad),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoParcialidadOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoParcialidadOrigen),
|
|
SaldosParcialidades
|
|
AS (SELECT D.*,
|
|
COALESCE (D.FechaProrroga, D.FechaVencimiento) AS VencimientoEfectivo,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoParcialidades AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidad
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoParcialidadOrigen = D.CveSolicitudPagoParcialidad)
|
|
INSERT INTO @Vencimientos
|
|
SELECT CveSolicitudPago,
|
|
MIN(CASE WHEN SaldoPendiente > 0 THEN VencimientoEfectivo END),
|
|
SUM(CASE WHEN SaldoPendiente > 0
|
|
AND VencimientoEfectivo < @Hoy THEN SaldoPendiente ELSE 0 END)
|
|
FROM SaldosParcialidades
|
|
GROUP BY CveSolicitudPago;
|
|
WITH Aplicaciones
|
|
AS (SELECT A.CveSolicitudPago,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPago),
|
|
Traslados
|
|
AS (SELECT O.CveSolicitudPagoOrigen,
|
|
SUM(O.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY O.CveSolicitudPagoOrigen),
|
|
Saldos
|
|
AS (SELECT S.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
S.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
LEFT OUTER JOIN Aplicaciones AS A ON A.CveSolicitudPago = S.CveSolicitudPago
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoOrigen = S.CveSolicitudPago)
|
|
SELECT S.*,
|
|
C.Nombre AS Cliente,
|
|
F.Fraccionamiento,
|
|
E.Etapa,
|
|
T.TipoTramite,
|
|
U.Codigo AS UnidadCobro,
|
|
TS.TipoSolicitudPago,
|
|
V.PrimerVencimiento,
|
|
ISNULL(V.ImporteVencido, 0) AS ImporteVencido,
|
|
CONVERT (BIT, CASE WHEN ISNULL(V.ImporteVencido, 0) > 0
|
|
AND S.EstadoAdministrativo = 'ACTIVO' THEN 1 ELSE 0 END) AS EstaVencido,
|
|
CASE WHEN S.ImporteAbonado >= S.Importe THEN 'Pagado' WHEN S.ImporteAbonado > 0 THEN 'Parcialmente pagado' ELSE 'Pendiente' END AS EstatusFinanciero
|
|
FROM Saldos AS S
|
|
INNER JOIN dbo.Clientes AS C ON C.CveCliente = S.CveCliente
|
|
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = S.CveFraccionamiento
|
|
LEFT OUTER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
|
LEFT OUTER JOIN dbo.Tra_TiposTramite AS T ON T.CveTipoTramite = S.CveTipoTramite
|
|
INNER JOIN dbo.Tra_TiposSolicitudPago AS TS ON TS.CveTipoSolicitudPago = S.CveTipoSolicitudPago
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = S.CveUnidadCobro
|
|
LEFT OUTER JOIN @Vencimientos AS V ON V.CveSolicitudPago = S.CveSolicitudPago
|
|
WHERE (@CveSolicitudPago IS NULL
|
|
OR S.CveSolicitudPago = @CveSolicitudPago)
|
|
AND (@CveCliente IS NULL
|
|
OR S.CveCliente = @CveCliente)
|
|
AND (@CveFraccionamiento IS NULL
|
|
OR S.CveFraccionamiento = @CveFraccionamiento)
|
|
AND (@CveTipoTramite IS NULL
|
|
OR S.CveTipoTramite = @CveTipoTramite)
|
|
AND (@CveTipoSolicitudPago IS NULL
|
|
OR S.CveTipoSolicitudPago = @CveTipoSolicitudPago)
|
|
AND (@EstadoAdministrativo IS NULL
|
|
OR S.EstadoAdministrativo = @EstadoAdministrativo)
|
|
AND (@Desde IS NULL
|
|
OR S.FechaGeneracion >= @Desde)
|
|
AND (@Hasta IS NULL
|
|
OR CONVERT (DATE, S.FechaGeneracion) <= @Hasta)
|
|
AND (@SoloPendientes IS NULL
|
|
OR (@SoloPendientes = 1
|
|
AND S.SaldoPendiente > 0)
|
|
OR (@SoloPendientes = 0
|
|
AND S.SaldoPendiente = 0))
|
|
AND (@SoloVencidos = 0
|
|
OR (V.ImporteVencido > 0
|
|
AND S.EstadoAdministrativo = 'ACTIVO'))
|
|
AND (@CveSolicitud IS NULL
|
|
OR S.CveSolicitud = @CveSolicitud
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS A ON A.CveSolicitudPago = O.CveSolicitudPagoOrigen
|
|
WHERE O.CveSolicitudPagoConvenio = S.CveSolicitudPago
|
|
AND A.CveSolicitud = @CveSolicitud))
|
|
ORDER BY CASE WHEN V.ImporteVencido > 0
|
|
AND S.EstadoAdministrativo = 'ACTIVO' THEN 0 ELSE 1 END, V.PrimerVencimiento, S.CveSolicitudPago DESC;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoObtener
|
|
@CveSolicitudPago 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.Tra_SolicitudesPago
|
|
WHERE CveSolicitudPago = @CveSolicitudPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La obligación no existe.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoListar @CveSolicitudPago = @CveSolicitudPago, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoDetalle,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoDetalle),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoDetalleOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoDetalleOrigen)
|
|
SELECT D.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoDetalle = D.CveSolicitudPagoDetalle
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoDetalleOrigen = D.CveSolicitudPagoDetalle
|
|
WHERE D.CveSolicitudPago = @CveSolicitudPago
|
|
ORDER BY D.CveSolicitudPagoDetalle;
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoParcialidad,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoParcialidad),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoParcialidadOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoParcialidadOrigen),
|
|
SaldosParcialidades
|
|
AS (SELECT D.*,
|
|
COALESCE (D.FechaProrroga, D.FechaVencimiento) AS VencimientoEfectivo,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoParcialidades AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidad
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoParcialidadOrigen = D.CveSolicitudPagoParcialidad)
|
|
SELECT *,
|
|
CONVERT (BIT, CASE WHEN SaldoPendiente > 0
|
|
AND VencimientoEfectivo < CONVERT (DATE, GETDATE()) THEN 1 ELSE 0 END) AS EstaVencida
|
|
FROM SaldosParcialidades
|
|
WHERE CveSolicitudPago = @CveSolicitudPago
|
|
ORDER BY NumeroParcialidad;
|
|
SELECT A.*,
|
|
P.FechaPago,
|
|
P.Referencia,
|
|
P.EsActivo,
|
|
P.Autorizado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE A.CveSolicitudPago = @CveSolicitudPago
|
|
ORDER BY P.FechaPago DESC, A.CvePagoAplicacion DESC;
|
|
SELECT *
|
|
FROM dbo.Tra_SolicitudesPagoConvenio
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
SELECT *
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen
|
|
WHERE CveSolicitudPagoConvenio = @CveSolicitudPago
|
|
OR CveSolicitudPagoOrigen = @CveSolicitudPago;
|
|
SELECT *
|
|
FROM dbo.Tra_SolicitudesPagoRequeridoBitacora
|
|
WHERE CveSolicitudPago = @CveSolicitudPago
|
|
ORDER BY CveSolicitudPagoRequeridoBitacora DESC;
|
|
SELECT D.CveConvenioOrigenDetalle,
|
|
D.CveConvenioOrigen,
|
|
D.CveSolicitudPagoOrigen,
|
|
D.CveSolicitudPagoDetalleOrigen,
|
|
D.CveSolicitudPagoParcialidadOrigen,
|
|
D.ImporteSaldoOriginal,
|
|
D.ImporteTomadoConvenio,
|
|
P.Descripcion AS Producto,
|
|
V.NumeroParcialidad AS Parcialidad,
|
|
COALESCE(V.FechaProrroga, V.FechaVencimiento) AS Vencimiento
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPagoDetalle AS P ON P.CveSolicitudPagoDetalle = D.CveSolicitudPagoDetalleOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPagoParcialidades AS V ON V.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidadOrigen
|
|
WHERE O.CveSolicitudPagoConvenio = @CveSolicitudPago
|
|
ORDER BY D.CveSolicitudPagoOrigen, D.CveSolicitudPagoDetalleOrigen, V.NumeroParcialidad;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoObtener'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioListar
|
|
@CveCliente INT=NULL,
|
|
@SoloPendientes BIT=1,
|
|
@SoloVencidos BIT=0,
|
|
@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 @Tipo AS INT = (SELECT CveTipoSolicitudPago
|
|
FROM dbo.Tra_TiposSolicitudPago
|
|
WHERE Codigo = 'CONVENIO');
|
|
IF @Tipo IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encontró el tipo de solicitud Convenio.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoListar @CveCliente = @CveCliente, @CveTipoSolicitudPago = @Tipo, @EstadoAdministrativo = 'ACTIVO', @SoloPendientes = @SoloPendientes, @SoloVencidos = @SoloVencidos, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_ConvenioListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioOrigenListar
|
|
@CveCliente INT,
|
|
@CveSolicitudPago INT=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
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoListar @CveCliente = @CveCliente, @CveSolicitudPago = @CveSolicitudPago, @SoloPendientes = 1, @EstadoAdministrativo = 'ACTIVO', @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
IF @CveSolicitudPago IS NOT NULL
|
|
BEGIN
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoDetalle,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoDetalle),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoDetalleOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoDetalleOrigen)
|
|
SELECT D.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoDetalle = D.CveSolicitudPagoDetalle
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoDetalleOrigen = D.CveSolicitudPagoDetalle
|
|
WHERE D.CveSolicitudPago = @CveSolicitudPago
|
|
AND D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) > 0
|
|
AND EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
WHERE S.CveSolicitudPago = D.CveSolicitudPago
|
|
AND S.CveCliente = @CveCliente)
|
|
ORDER BY D.CveSolicitudPagoDetalle;
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoParcialidad,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoParcialidad),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoParcialidadOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoParcialidadOrigen),
|
|
SaldosParcialidades
|
|
AS (SELECT D.*,
|
|
COALESCE (D.FechaProrroga, D.FechaVencimiento) AS VencimientoEfectivo,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoParcialidades AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidad
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoParcialidadOrigen = D.CveSolicitudPagoParcialidad)
|
|
SELECT *
|
|
FROM SaldosParcialidades
|
|
WHERE CveSolicitudPago = @CveSolicitudPago
|
|
AND SaldoPendiente > 0
|
|
AND EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
WHERE S.CveSolicitudPago = @CveSolicitudPago
|
|
AND S.CveCliente = @CveCliente)
|
|
ORDER BY VencimientoEfectivo, NumeroParcialidad;
|
|
END
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_ConvenioOrigenListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoGuardar
|
|
@CveSolicitudPago INT=NULL OUTPUT,
|
|
@CveTipoSolicitudPago INT,
|
|
@CveCliente INT,
|
|
@CveFraccionamiento INT,
|
|
@CveFraccionamientoEtapa INT=NULL,
|
|
@CveSolicitud INT=NULL,
|
|
@CveTipoTramite INT=NULL,
|
|
@CveTramitePago INT=NULL,
|
|
@Descripcion VARCHAR (1000),
|
|
@Importe DECIMAL (19, 6),
|
|
@CveUnidadCobro INT,
|
|
@EsRequerido BIT,
|
|
@FechaGeneracion DATETIME2 (0),
|
|
@DetalleJson NVARCHAR (MAX),
|
|
@ParcialidadesJson NVARCHAR (MAX),
|
|
@DevolverResultado BIT=1,
|
|
@EsOperacionConvenio BIT=0,
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @Importe IS NULL
|
|
OR @Importe < 0
|
|
OR @FechaGeneracion IS NULL
|
|
OR NULLIF (LTRIM(RTRIM(@Descripcion)), '') IS NULL
|
|
OR @EsRequerido IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture descripción, importe y fecha de generación.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF ISNULL(ISJSON(@DetalleJson), 0) <> 1
|
|
OR ISNULL(ISJSON(@ParcialidadesJson), 0) <> 1
|
|
OR LEFT(LTRIM(@DetalleJson), 1) <> '['
|
|
OR LEFT(LTRIM(@ParcialidadesJson), 1) <> '['
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El detalle y las parcialidades no tienen un formato válido.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Detalle TABLE (
|
|
CvePS INT,
|
|
Descripcion VARCHAR (1000),
|
|
Cantidad DECIMAL (18, 4),
|
|
PrecioUnitario DECIMAL (19, 6),
|
|
Importe DECIMAL (19, 6));
|
|
INSERT INTO @Detalle
|
|
SELECT CvePS,
|
|
Descripcion,
|
|
Cantidad,
|
|
PrecioUnitario,
|
|
Importe
|
|
FROM OPENJSON (@DetalleJson) WITH (CvePS INT, Descripcion VARCHAR (1000), Cantidad DECIMAL (18, 4), PrecioUnitario DECIMAL (19, 6), Importe DECIMAL (19, 6));
|
|
DECLARE @Parcialidades TABLE (
|
|
NumeroParcialidad INT,
|
|
FechaVencimiento DATE,
|
|
Importe DECIMAL (19, 6),
|
|
FechaProrroga DATE);
|
|
INSERT INTO @Parcialidades
|
|
SELECT NumeroParcialidad,
|
|
FechaVencimiento,
|
|
Importe,
|
|
FechaProrroga
|
|
FROM OPENJSON (@ParcialidadesJson) WITH (NumeroParcialidad INT, FechaVencimiento DATE, Importe DECIMAL (19, 6), FechaProrroga DATE);
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM @Detalle)
|
|
OR NOT EXISTS (SELECT 1
|
|
FROM @Parcialidades)
|
|
OR EXISTS (SELECT 1
|
|
FROM @Detalle
|
|
WHERE CvePS IS NULL
|
|
OR Cantidad IS NULL
|
|
OR Cantidad <= 0
|
|
OR PrecioUnitario IS NULL
|
|
OR PrecioUnitario < 0
|
|
OR Importe IS NULL
|
|
OR Importe < 0
|
|
OR NULLIF (LTRIM(RTRIM(Descripcion)), '') IS NULL
|
|
OR ABS(ROUND(Cantidad * PrecioUnitario, 6) - Importe) > (Cantidad * 0.0000005 + 0.000001))
|
|
OR EXISTS (SELECT 1
|
|
FROM @Parcialidades
|
|
WHERE NumeroParcialidad IS NULL
|
|
OR NumeroParcialidad <= 0
|
|
OR FechaVencimiento IS NULL
|
|
OR Importe IS NULL
|
|
OR Importe < 0
|
|
OR FechaProrroga < FechaVencimiento)
|
|
OR EXISTS (SELECT NumeroParcialidad
|
|
FROM @Parcialidades
|
|
GROUP BY NumeroParcialidad
|
|
HAVING COUNT(*) > 1)
|
|
OR (SELECT SUM(Importe)
|
|
FROM @Detalle) <> @Importe
|
|
OR (SELECT SUM(Importe)
|
|
FROM @Parcialidades) <> @Importe
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Los productos y las parcialidades deben ser válidos y sumar exactamente el importe de la obligación.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Fraccionamientos
|
|
WHERE CveFraccionamiento = @CveFraccionamiento
|
|
AND CveCliente = @CveCliente)
|
|
OR (@CveFraccionamientoEtapa IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.FraccionamientosEtapas
|
|
WHERE CveFraccionamientoEtapa = @CveFraccionamientoEtapa
|
|
AND CveFraccionamiento = @CveFraccionamiento))
|
|
OR (@CveSolicitud IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_Solicitudes
|
|
WHERE CveSolicitud = @CveSolicitud
|
|
AND CveCliente = @CveCliente
|
|
AND CveFraccionamiento = @CveFraccionamiento
|
|
AND (@CveFraccionamientoEtapa IS NULL
|
|
OR CveFraccionamientoEtapa = @CveFraccionamientoEtapa)))
|
|
OR (@CveTramitePago IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTramitePago = @CveTramitePago
|
|
AND CveTipoTramite = @CveTipoTramite
|
|
AND CveUnidadCobro = @CveUnidadCobro))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El cliente, fraccionamiento, etapa o trámite no corresponden a la obligación.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND Activo = 1)
|
|
OR NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposSolicitudPago
|
|
WHERE CveTipoSolicitudPago = @CveTipoSolicitudPago
|
|
AND Activo = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione un tipo y unidad de cobro disponibles.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @EsOperacionConvenio = 0
|
|
AND EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposSolicitudPago
|
|
WHERE CveTipoSolicitudPago = @CveTipoSolicitudPago
|
|
AND Codigo = 'CONVENIO')
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Guarde el convenio desde su operación completa, incluyendo los adeudos de origen.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @CveSolicitudPago = NULLIF (@CveSolicitudPago, 0);
|
|
IF @CveSolicitudPago IS NOT NULL
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitudPago = @CveSolicitudPago
|
|
AND EstadoAdministrativo = 'ACTIVO'
|
|
AND CveCliente = @CveCliente
|
|
AND CveTipoSolicitudPago = @CveTipoSolicitudPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La obligación no está disponible para modificar.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_PagosAplicaciones
|
|
WHERE CveSolicitudPago = @CveSolicitudPago)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen
|
|
WHERE CveSolicitudPagoOrigen = @CveSolicitudPago)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoDetalle
|
|
WHERE CveSolicitudPago = @CveSolicitudPago
|
|
AND CveVentaDetalleOrigen IS NOT NULL)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La obligación tiene historia financiera. Sus importes y productos deben conservarse.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitudPago = @CveSolicitudPago
|
|
AND EsRequerido <> @EsRequerido)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Cambie requerido desde la operación que solicita observación.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DELETE dbo.Tra_SolicitudesPagoDetalle
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
DELETE dbo.Tra_SolicitudesPagoParcialidades
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
UPDATE dbo.Tra_SolicitudesPago
|
|
SET CveFraccionamiento = @CveFraccionamiento,
|
|
CveFraccionamientoEtapa = @CveFraccionamientoEtapa,
|
|
CveSolicitud = @CveSolicitud,
|
|
CveTipoTramite = @CveTipoTramite,
|
|
CveTramitePago = @CveTramitePago,
|
|
Descripcion = @Descripcion,
|
|
Importe = @Importe,
|
|
CveUnidadCobro = @CveUnidadCobro,
|
|
FechaGeneracion = @FechaGeneracion,
|
|
CveUsuarioModificacion = @CveUsuarioEjecuta,
|
|
FechaModificacion = SYSDATETIME()
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
INSERT INTO dbo.Tra_SolicitudesPago (CveTipoSolicitudPago, CveCliente, CveFraccionamiento, CveFraccionamientoEtapa, CveSolicitud, CveTipoTramite, CveTramitePago, Descripcion, Importe, CveUnidadCobro, EsRequerido, FechaGeneracion, FechaAlta, CveUsuario)
|
|
VALUES (@CveTipoSolicitudPago, @CveCliente, @CveFraccionamiento, @CveFraccionamientoEtapa, @CveSolicitud, @CveTipoTramite, @CveTramitePago, @Descripcion, @Importe, @CveUnidadCobro, @EsRequerido, @FechaGeneracion, SYSDATETIME(), @CveUsuarioEjecuta);
|
|
SET @CveSolicitudPago = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
INSERT INTO dbo.Tra_SolicitudesPagoDetalle (CveSolicitudPago, CvePS, Descripcion, Cantidad, PrecioUnitario, CveUnidadCobro, Importe)
|
|
SELECT @CveSolicitudPago,
|
|
CvePS,
|
|
Descripcion,
|
|
Cantidad,
|
|
PrecioUnitario,
|
|
@CveUnidadCobro,
|
|
Importe
|
|
FROM @Detalle;
|
|
INSERT INTO dbo.Tra_SolicitudesPagoParcialidades (CveSolicitudPago, NumeroParcialidad, FechaVencimiento, Importe, CveUnidadCobro, FechaProrroga)
|
|
SELECT @CveSolicitudPago,
|
|
NumeroParcialidad,
|
|
FechaVencimiento,
|
|
Importe,
|
|
@CveUnidadCobro,
|
|
FechaProrroga
|
|
FROM @Parcialidades;
|
|
IF @DevolverResultado = 1
|
|
SELECT @CveSolicitudPago AS CveSolicitudPago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoGuardar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoGenerarPorSolicitud
|
|
@CveSolicitud INT,
|
|
@FechaVencimiento DATE,
|
|
@CveTramitePago INT=NULL,
|
|
@DevolverResultado BIT=1,
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @FechaVencimiento IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Indique la fecha de vencimiento; no se asigna una fecha implícita.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Cliente AS INT, @Fraccionamiento AS INT, @Etapa AS INT, @TipoTramite AS INT, @Tipo AS INT;
|
|
SELECT @Cliente = CveCliente,
|
|
@Fraccionamiento = CveFraccionamiento,
|
|
@Etapa = CveFraccionamientoEtapa,
|
|
@TipoTramite = CveTipoTramite
|
|
FROM dbo.Tra_Solicitudes
|
|
WHERE CveSolicitud = @CveSolicitud;
|
|
SET @Tipo = (SELECT CveTipoSolicitudPago
|
|
FROM dbo.Tra_TiposSolicitudPago
|
|
WHERE Codigo = 'NORMAL');
|
|
IF @Cliente IS NULL
|
|
OR @Tipo IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La solicitud o el tipo Normal no están disponibles.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Pendientes TABLE (
|
|
CveTramitePago INT PRIMARY KEY);
|
|
INSERT INTO @Pendientes
|
|
SELECT CveTramitePago
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTipoTramite = @TipoTramite
|
|
AND EsActivo = 1
|
|
AND (@CveTramitePago IS NULL
|
|
OR CveTramitePago = @CveTramitePago);
|
|
DECLARE @Generadas TABLE (
|
|
CveSolicitudPago INT);
|
|
WHILE EXISTS (SELECT 1
|
|
FROM @Pendientes)
|
|
BEGIN
|
|
DECLARE @Plantilla AS INT = (SELECT MIN(CveTramitePago)
|
|
FROM @Pendientes);
|
|
DECLARE @Clave AS INT = (SELECT CveSolicitudPago
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitud = @CveSolicitud
|
|
AND CveTramitePago = @Plantilla);
|
|
IF @Clave IS NULL
|
|
BEGIN
|
|
DECLARE @Descripcion AS VARCHAR (1000), @Importe AS DECIMAL (19, 6), @Unidad AS INT, @Requerido AS BIT, @Detalle AS NVARCHAR (MAX), @Parcialidades AS NVARCHAR (MAX);
|
|
DECLARE @Fecha AS DATETIME2 (0) = SYSDATETIME();
|
|
SELECT @Descripcion = Nombre,
|
|
@Importe = Importe,
|
|
@Unidad = CveUnidadCobro,
|
|
@Requerido = EsRequerido
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTramitePago = @Plantilla;
|
|
SET @Detalle = (SELECT CvePS,
|
|
Descripcion,
|
|
Cantidad,
|
|
PrecioUnitario,
|
|
Importe
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @Plantilla
|
|
ORDER BY CveTramitePagoDetalle
|
|
FOR JSON PATH);
|
|
SET @Parcialidades = (SELECT 1 AS NumeroParcialidad,
|
|
@FechaVencimiento AS FechaVencimiento,
|
|
@Importe AS Importe
|
|
FOR JSON PATH);
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoGuardar @CveSolicitudPago = @Clave OUTPUT, @CveTipoSolicitudPago = @Tipo, @CveCliente = @Cliente, @CveFraccionamiento = @Fraccionamiento, @CveFraccionamientoEtapa = @Etapa, @CveSolicitud = @CveSolicitud, @CveTipoTramite = @TipoTramite, @CveTramitePago = @Plantilla, @Descripcion = @Descripcion, @Importe = @Importe, @CveUnidadCobro = @Unidad, @EsRequerido = @Requerido, @FechaGeneracion = @Fecha, @DetalleJson = @Detalle, @ParcialidadesJson = @Parcialidades, @DevolverResultado = 0, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
END
|
|
INSERT INTO @Generadas
|
|
VALUES (@Clave);
|
|
DELETE @Pendientes
|
|
WHERE CveTramitePago = @Plantilla;
|
|
END
|
|
IF @DevolverResultado = 1
|
|
SELECT CveSolicitudPago
|
|
FROM @Generadas;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoGenerarPorSolicitud'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoCambiarRequerido
|
|
@CveSolicitudPago INT,
|
|
@EsRequerido BIT,
|
|
@Observacion VARCHAR (2000),
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @EsRequerido IS NULL
|
|
OR NULLIF (LTRIM(RTRIM(@Observacion)), '') IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture una observación para cambiar requerido.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Anterior AS BIT;
|
|
SELECT @Anterior = EsRequerido
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
IF @Anterior IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La obligación no existe.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @Anterior <> @EsRequerido
|
|
BEGIN
|
|
UPDATE dbo.Tra_SolicitudesPago
|
|
SET EsRequerido = @EsRequerido,
|
|
CveUsuarioModificacion = @CveUsuarioEjecuta,
|
|
FechaModificacion = SYSDATETIME()
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
INSERT INTO dbo.Tra_SolicitudesPagoRequeridoBitacora (CveSolicitudPago, ValorAnterior, ValorNuevo, Observacion, CveUsuarioRegistro)
|
|
VALUES (@CveSolicitudPago, @Anterior, @EsRequerido, @Observacion, @CveUsuarioEjecuta);
|
|
END
|
|
SELECT CONVERT (BIT, 1) AS Guardado;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoCambiarRequerido'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoCancelar
|
|
@CveSolicitudPago 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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitudPago = @CveSolicitudPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La obligación no existe.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE A.CveSolicitudPago = @CveSolicitudPago
|
|
AND P.EsActivo = 1)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE O.CveSolicitudPagoOrigen = @CveSolicitudPago
|
|
AND C.EstadoAdministrativo <> 'CANCELADO')
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La obligación tiene abonos o saldo trasladado a un convenio vigente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Tra_SolicitudesPago
|
|
SET EstadoAdministrativo = 'CANCELADO',
|
|
CveUsuarioModificacion = @CveUsuarioEjecuta,
|
|
FechaModificacion = SYSDATETIME()
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
SELECT CONVERT (BIT, 1) AS Cancelado;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoCancelar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioCancelar
|
|
@CveSolicitudPago 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.Tra_SolicitudesPagoConvenio
|
|
WHERE CveSolicitudPago = @CveSolicitudPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El convenio no existe.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoCancelar @CveSolicitudPago = @CveSolicitudPago, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_ConvenioCancelar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoRegistrar
|
|
@CvePago INT=NULL OUTPUT,
|
|
@CveCliente INT,
|
|
@FechaPago DATETIME,
|
|
@Importe DECIMAL (19, 6),
|
|
@CveUnidadCobro INT,
|
|
@CveFormaPago TINYINT,
|
|
@CveBancoCuenta INT=NULL,
|
|
@Referencia VARCHAR (200)=NULL,
|
|
@Observaciones VARCHAR (300)=NULL,
|
|
@DevolverResultado BIT=1,
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @CvePago IS NOT NULL
|
|
AND @CvePago <> 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Un abono registrado conserva su importe y conversión; no puede sobrescribirse.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @Importe IS NULL
|
|
OR @Importe <= 0
|
|
OR @FechaPago IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture un importe positivo y la fecha del pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveMoneda AS INT, @RequiereConversion AS BIT, @ValorConversion AS DECIMAL (19, 8), @CveUnidadCobroValor AS INT, @ImporteMXN AS DECIMAL (19, 6);
|
|
SELECT @CveMoneda = CveMoneda,
|
|
@RequiereConversion = RequiereConversion
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND Activo = 1;
|
|
IF @RequiereConversion IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione una unidad de cobro disponible.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @RequiereConversion = 0
|
|
SET @ValorConversion = 1;
|
|
ELSE
|
|
SELECT TOP (1) @CveUnidadCobroValor = CveUnidadCobroValor,
|
|
@ValorConversion = ValorMXN
|
|
FROM dbo.Gral_UnidadesCobroValores
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND FechaVigencia <= CONVERT (DATE, @FechaPago)
|
|
ORDER BY FechaVigencia DESC;
|
|
IF @ValorConversion IS NULL
|
|
OR @ValorConversion <= 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Falta registrar la equivalencia vigente en la fecha del pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @ImporteMXN = CONVERT (DECIMAL (19, 6), ROUND(@Importe * @ValorConversion, 6));
|
|
IF @ImporteMXN <= 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El importe convertido debe ser mayor a cero.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
INSERT INTO dbo.Tra_Pagos (CveCliente, CveFormaPago, CveMoneda, FechaPago, Importe, Referencia, EsSaldoFavor, EsActivo, FechaAlta, CveUsuario, CveBancoCuenta, Observaciones, Autorizado, FechaAutorizacion, CveUsuarioAutoriza, CveUnidadCobro, CveUnidadCobroValor, ValorConversion, ImporteMXN)
|
|
VALUES (@CveCliente, @CveFormaPago, @CveMoneda, @FechaPago, @Importe, @Referencia, 0, 1, SYSDATETIME(), @CveUsuarioEjecuta, @CveBancoCuenta, @Observaciones, 1, SYSDATETIME(), @CveUsuarioEjecuta, @CveUnidadCobro, @CveUnidadCobroValor, @ValorConversion, @ImporteMXN);
|
|
SET @CvePago = CONVERT (INT, SCOPE_IDENTITY());
|
|
IF @DevolverResultado = 1
|
|
SELECT @CvePago AS CvePago,
|
|
@ValorConversion AS ValorConversion,
|
|
@ImporteMXN AS ImporteMXN;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoRegistrar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoListar
|
|
@CvePago INT=NULL,
|
|
@CveCliente INT=NULL,
|
|
@CveFraccionamiento INT=NULL,
|
|
@CveSolicitud INT=NULL,
|
|
@Desde DATE=NULL,
|
|
@Hasta DATE=NULL,
|
|
@EsActivo BIT=NULL,
|
|
@SoloPendientesFacturar BIT=0,
|
|
@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
|
|
WITH Aplicado
|
|
AS (SELECT CvePago,
|
|
SUM(ImportePagoConsumido) AS ImporteAplicado,
|
|
SUM(ImporteAplicadoMXN) AS ImporteAplicadoMXN
|
|
FROM dbo.Tra_PagosAplicaciones
|
|
GROUP BY CvePago),
|
|
Documentado
|
|
AS (SELECT V.CvePago,
|
|
SUM(V.ImporteVinculadoMXN) AS ImporteDocumentadoMXN
|
|
FROM dbo.Tra_PagosCfdi AS V
|
|
INNER JOIN dbo.Fac_CfdiDocumentos AS D ON D.CveCfdiDocumento = V.CveCfdiDocumento
|
|
LEFT OUTER JOIN dbo.Fac_CfdiTimbrados AS T ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
|
|
WHERE D.Estado = 'TIMBRADO'
|
|
AND D.ImporteValidado = 1
|
|
AND D.RutaPdf IS NOT NULL
|
|
AND ((D.OrigenRegistro = 'EXTERNO'
|
|
AND D.RutaXmlExterno IS NOT NULL
|
|
AND D.UuidExterno IS NOT NULL)
|
|
OR (D.OrigenRegistro = 'INTERNO'
|
|
AND T.Exitoso = 1
|
|
AND T.XmlTimbrado IS NOT NULL))
|
|
GROUP BY V.CvePago)
|
|
SELECT P.CvePago,
|
|
P.CveCliente,
|
|
C.Nombre AS Cliente,
|
|
P.FechaPago,
|
|
P.Importe,
|
|
P.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro,
|
|
P.ValorConversion,
|
|
P.ImporteMXN,
|
|
P.Referencia,
|
|
P.Observaciones,
|
|
P.CveFormaPago,
|
|
P.CveBancoCuenta,
|
|
P.EsActivo,
|
|
P.Autorizado,
|
|
P.CveUsuario,
|
|
P.FechaAlta,
|
|
ISNULL(A.ImporteAplicado, 0) AS ImporteAplicado,
|
|
P.Importe - ISNULL(A.ImporteAplicado, 0) AS ImporteSinAplicar,
|
|
P.ImporteMXN - ISNULL(A.ImporteAplicadoMXN, 0) AS ImporteSinAplicarMXN,
|
|
ISNULL(D.ImporteDocumentadoMXN, 0) AS ImporteDocumentadoMXN,
|
|
P.ImporteMXN - ISNULL(D.ImporteDocumentadoMXN, 0) AS ImportePendienteFacturarMXN
|
|
FROM dbo.Tra_Pagos AS P
|
|
INNER JOIN dbo.Clientes AS C ON C.CveCliente = P.CveCliente
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = P.CveUnidadCobro
|
|
LEFT OUTER JOIN Aplicado AS A ON A.CvePago = P.CvePago
|
|
LEFT OUTER JOIN Documentado AS D ON D.CvePago = P.CvePago
|
|
WHERE (@CvePago IS NULL
|
|
OR P.CvePago = @CvePago)
|
|
AND (@CveCliente IS NULL
|
|
OR P.CveCliente = @CveCliente)
|
|
AND (@Desde IS NULL
|
|
OR P.FechaPago >= @Desde)
|
|
AND (@Hasta IS NULL
|
|
OR CONVERT (DATE, P.FechaPago) <= @Hasta)
|
|
AND (@EsActivo IS NULL
|
|
OR P.EsActivo = @EsActivo)
|
|
AND (@SoloPendientesFacturar = 0
|
|
OR (P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
AND P.ImporteMXN > ISNULL(D.ImporteDocumentadoMXN, 0)))
|
|
AND ((@CveFraccionamiento IS NULL
|
|
AND @CveSolicitud IS NULL)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_PagosAplicaciones AS X
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = X.CveSolicitudPago
|
|
WHERE X.CvePago = P.CvePago
|
|
AND (@CveFraccionamiento IS NULL
|
|
OR S.CveFraccionamiento = @CveFraccionamiento)
|
|
AND (@CveSolicitud IS NULL
|
|
OR S.CveSolicitud = @CveSolicitud)))
|
|
ORDER BY P.FechaPago DESC, P.CvePago DESC;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoObtener
|
|
@CvePago 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.Tra_Pagos
|
|
WHERE CvePago = @CvePago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encontró el pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
EXECUTE dbo.PA_Tra_PagoListar @CvePago = @CvePago, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SELECT A.*,
|
|
S.Descripcion,
|
|
P.NumeroParcialidad,
|
|
D.Descripcion AS Producto
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = A.CveSolicitudPago
|
|
INNER JOIN dbo.Tra_SolicitudesPagoParcialidades AS P ON P.CveSolicitudPagoParcialidad = A.CveSolicitudPagoParcialidad
|
|
INNER JOIN dbo.Tra_SolicitudesPagoDetalle AS D ON D.CveSolicitudPagoDetalle = A.CveSolicitudPagoDetalle
|
|
WHERE A.CvePago = @CvePago
|
|
ORDER BY A.CvePagoAplicacion;
|
|
SELECT V.CvePagoCfdi,
|
|
V.CveCfdiDocumento,
|
|
V.ImporteVinculadoMXN,
|
|
D.Serie,
|
|
D.Folio,
|
|
D.Total,
|
|
D.Moneda,
|
|
D.Estado,
|
|
D.ImporteValidado,
|
|
COALESCE (CONVERT (VARCHAR (36), D.UuidExterno), T.Uuid) AS Uuid,
|
|
CONVERT (BIT, CASE WHEN D.RutaPdf IS NOT NULL THEN 1 ELSE 0 END) AS TienePdf,
|
|
CONVERT (BIT, CASE WHEN D.RutaXmlExterno IS NOT NULL
|
|
OR T.XmlTimbrado IS NOT NULL THEN 1 ELSE 0 END) AS TieneXml
|
|
FROM dbo.Tra_PagosCfdi AS V
|
|
INNER JOIN dbo.Fac_CfdiDocumentos AS D ON D.CveCfdiDocumento = V.CveCfdiDocumento
|
|
LEFT OUTER JOIN dbo.Fac_CfdiTimbrados AS T ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
|
|
WHERE V.CvePago = @CvePago
|
|
ORDER BY V.CvePagoCfdi;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoObtener'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoPendienteFacturarListar
|
|
@CveCliente INT=NULL,
|
|
@Desde DATE=NULL,
|
|
@Hasta DATE=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
|
|
EXECUTE dbo.PA_Tra_PagoListar @CveCliente = @CveCliente, @Desde = @Desde, @Hasta = @Hasta, @SoloPendientesFacturar = 1, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoPendienteFacturarListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- Conservar aplicaciones y documentos como historia; las consultas de saldo excluyen abonos cancelados.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoCancelar
|
|
@CvePago 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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_Pagos
|
|
WHERE CvePago = @CvePago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encontró el pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Tra_Pagos
|
|
SET EsActivo = 0
|
|
WHERE CvePago = @CvePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoCancelar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoAplicar
|
|
@CvePago INT,
|
|
@AplicacionesJson NVARCHAR (MAX),
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF ISNULL(ISJSON(@AplicacionesJson), 0) <> 1
|
|
OR LEFT(LTRIM(@AplicacionesJson), 1) <> '['
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Las aplicaciones no tienen un formato válido.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveCliente AS INT, @UnidadPago AS INT, @FechaPago AS DATE, @FactorPago AS DECIMAL (19, 8), @Disponible AS DECIMAL (19, 6), @DisponibleMXN AS DECIMAL (19, 6);
|
|
SELECT @CveCliente = P.CveCliente,
|
|
@UnidadPago = P.CveUnidadCobro,
|
|
@FechaPago = CONVERT (DATE, P.FechaPago),
|
|
@FactorPago = P.ValorConversion,
|
|
@Disponible = P.Importe - ISNULL((SELECT SUM(ImportePagoConsumido)
|
|
FROM dbo.Tra_PagosAplicaciones
|
|
WHERE CvePago = P.CvePago), 0),
|
|
@DisponibleMXN = P.ImporteMXN - ISNULL((SELECT SUM(ImporteAplicadoMXN)
|
|
FROM dbo.Tra_PagosAplicaciones
|
|
WHERE CvePago = P.CvePago), 0)
|
|
FROM dbo.Tra_Pagos AS P
|
|
WHERE P.CvePago = @CvePago
|
|
AND P.EsActivo = 1
|
|
AND P.Autorizado = 1;
|
|
IF @CveCliente IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione un abono recibido y vigente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Aplicaciones TABLE (
|
|
CveSolicitudPagoDetalle INT,
|
|
CveSolicitudPagoParcialidad INT,
|
|
ImporteAplicado DECIMAL (19, 6),
|
|
CveSolicitudPago INT,
|
|
CveUnidadCobro INT,
|
|
Factor DECIMAL (19, 8),
|
|
ImporteMXN DECIMAL (19, 6),
|
|
ImporteConsumido DECIMAL (19, 6));
|
|
INSERT INTO @Aplicaciones (CveSolicitudPagoDetalle, CveSolicitudPagoParcialidad, ImporteAplicado)
|
|
SELECT CveSolicitudPagoDetalle,
|
|
CveSolicitudPagoParcialidad,
|
|
ImporteAplicado
|
|
FROM OPENJSON (@AplicacionesJson) WITH (CveSolicitudPagoDetalle INT, CveSolicitudPagoParcialidad INT, ImporteAplicado DECIMAL (19, 6));
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM @Aplicaciones)
|
|
OR EXISTS (SELECT 1
|
|
FROM @Aplicaciones
|
|
WHERE CveSolicitudPagoDetalle IS NULL
|
|
OR CveSolicitudPagoParcialidad IS NULL
|
|
OR ImporteAplicado IS NULL
|
|
OR ImporteAplicado <= 0)
|
|
OR EXISTS (SELECT CveSolicitudPagoDetalle,
|
|
CveSolicitudPagoParcialidad
|
|
FROM @Aplicaciones
|
|
GROUP BY CveSolicitudPagoDetalle, CveSolicitudPagoParcialidad
|
|
HAVING COUNT(*) > 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione aplicaciones positivas, sin destinos repetidos.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE A
|
|
SET CveSolicitudPago = S.CveSolicitudPago,
|
|
CveUnidadCobro = S.CveUnidadCobro
|
|
FROM @Aplicaciones AS A
|
|
INNER JOIN dbo.Tra_SolicitudesPagoDetalle AS D ON D.CveSolicitudPagoDetalle = A.CveSolicitudPagoDetalle
|
|
INNER JOIN dbo.Tra_SolicitudesPagoParcialidades AS P ON P.CveSolicitudPagoParcialidad = A.CveSolicitudPagoParcialidad
|
|
AND P.CveSolicitudPago = D.CveSolicitudPago
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = D.CveSolicitudPago
|
|
WHERE S.CveCliente = @CveCliente
|
|
AND S.EstadoAdministrativo = 'ACTIVO';
|
|
IF EXISTS (SELECT 1
|
|
FROM @Aplicaciones
|
|
WHERE CveSolicitudPago IS NULL)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Las parcialidades y productos deben pertenecer a obligaciones vigentes del cliente del pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM @Aplicaciones AS A
|
|
INNER JOIN dbo.Tra_PagosAplicaciones AS X ON X.CvePago = @CvePago
|
|
AND X.CveSolicitudPagoDetalle = A.CveSolicitudPagoDetalle
|
|
AND X.CveSolicitudPagoParcialidad = A.CveSolicitudPagoParcialidad)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Este pago ya tiene una aplicación a ese destino; conserve el movimiento registrado.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE A
|
|
SET Factor = CASE WHEN A.CveUnidadCobro = @UnidadPago THEN @FactorPago WHEN U.RequiereConversion = 0 THEN 1 ELSE (SELECT TOP (1) V.ValorMXN
|
|
FROM dbo.Gral_UnidadesCobroValores AS V
|
|
WHERE V.CveUnidadCobro = A.CveUnidadCobro
|
|
AND V.FechaVigencia <= @FechaPago
|
|
ORDER BY V.FechaVigencia DESC) END
|
|
FROM @Aplicaciones AS A
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = A.CveUnidadCobro;
|
|
IF EXISTS (SELECT 1
|
|
FROM @Aplicaciones
|
|
WHERE Factor IS NULL
|
|
OR Factor <= 0)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Falta la equivalencia de una obligación en la fecha del pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE @Aplicaciones
|
|
SET ImporteMXN = CONVERT (DECIMAL (19, 6), ROUND(ImporteAplicado * Factor, 6)),
|
|
ImporteConsumido = CASE WHEN CveUnidadCobro = @UnidadPago THEN ImporteAplicado ELSE CONVERT (DECIMAL (19, 6), ROUND(ImporteAplicado * Factor / @FactorPago, 6)) END;
|
|
IF EXISTS (SELECT 1
|
|
FROM @Aplicaciones
|
|
WHERE ImporteMXN <= 0
|
|
OR ImporteConsumido <= 0)
|
|
OR (SELECT SUM(ImporteConsumido)
|
|
FROM @Aplicaciones) > @Disponible
|
|
OR (SELECT SUM(ImporteMXN)
|
|
FROM @Aplicaciones) > @DisponibleMXN
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Las aplicaciones exceden el saldo disponible del abono o requieren ajustar el redondeo.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @SaldosDetalle TABLE (
|
|
CveSolicitudPagoDetalle INT PRIMARY KEY,
|
|
CveSolicitudPago INT,
|
|
SaldoPendiente DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoDetalle,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoDetalle),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoDetalleOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoDetalleOrigen)
|
|
INSERT INTO @SaldosDetalle
|
|
SELECT D.CveSolicitudPagoDetalle,
|
|
D.CveSolicitudPago,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0)
|
|
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoDetalle = D.CveSolicitudPagoDetalle
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoDetalleOrigen = D.CveSolicitudPagoDetalle;
|
|
DECLARE @SaldosParcialidades TABLE (
|
|
CveSolicitudPagoParcialidad INT PRIMARY KEY,
|
|
CveSolicitudPago INT,
|
|
SaldoPendiente DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoParcialidad,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoParcialidad),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoParcialidadOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoParcialidadOrigen),
|
|
SaldosParcialidades
|
|
AS (SELECT D.*,
|
|
COALESCE (D.FechaProrroga, D.FechaVencimiento) AS VencimientoEfectivo,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoParcialidades AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidad
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoParcialidadOrigen = D.CveSolicitudPagoParcialidad)
|
|
INSERT INTO @SaldosParcialidades
|
|
SELECT CveSolicitudPagoParcialidad,
|
|
CveSolicitudPago,
|
|
SaldoPendiente
|
|
FROM SaldosParcialidades;
|
|
IF EXISTS (SELECT A.CveSolicitudPagoDetalle
|
|
FROM @Aplicaciones AS A
|
|
INNER JOIN @SaldosDetalle AS D ON D.CveSolicitudPagoDetalle = A.CveSolicitudPagoDetalle
|
|
GROUP BY A.CveSolicitudPagoDetalle, D.SaldoPendiente
|
|
HAVING SUM(A.ImporteAplicado) > D.SaldoPendiente)
|
|
OR EXISTS (SELECT A.CveSolicitudPagoParcialidad
|
|
FROM @Aplicaciones AS A
|
|
INNER JOIN @SaldosParcialidades AS P ON P.CveSolicitudPagoParcialidad = A.CveSolicitudPagoParcialidad
|
|
GROUP BY A.CveSolicitudPagoParcialidad, P.SaldoPendiente
|
|
HAVING SUM(A.ImporteAplicado) > P.SaldoPendiente)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Las aplicaciones exceden el saldo de un producto o parcialidad.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
INSERT INTO dbo.Tra_PagosAplicaciones (CvePago, CveSolicitudPago, CveSolicitudPagoParcialidad, CveSolicitudPagoDetalle, CveUnidadCobro, ImporteAplicado, ValorConversionObligacion, ImporteAplicadoMXN, ImportePagoConsumido, CveUsuarioRegistro, FechaRegistro)
|
|
SELECT @CvePago,
|
|
CveSolicitudPago,
|
|
CveSolicitudPagoParcialidad,
|
|
CveSolicitudPagoDetalle,
|
|
CveUnidadCobro,
|
|
ImporteAplicado,
|
|
Factor,
|
|
ImporteMXN,
|
|
ImporteConsumido,
|
|
@CveUsuarioEjecuta,
|
|
SYSDATETIME()
|
|
FROM @Aplicaciones;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoAplicar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- El servicio obtiene PermitirDisminucion del permiso Convenios.DisminuirImporte.
|
|
-- Nunca tomar ese valor directamente de un campo enviado por el navegador.
|
|
-- Al editar se excluye el traslado propio, sin alterar el historial antes de validar.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ConvenioGuardar
|
|
@CveSolicitudPago INT=NULL OUTPUT,
|
|
@CveCliente INT,
|
|
@CveFraccionamiento INT,
|
|
@CveFraccionamientoEtapa INT=NULL,
|
|
@Descripcion VARCHAR (1000),
|
|
@Importe DECIMAL (19, 6),
|
|
@CveUnidadCobro INT,
|
|
@EsRequerido BIT,
|
|
@FechaGeneracion DATETIME2 (0),
|
|
@Observaciones VARCHAR (2000)=NULL,
|
|
@DetalleJson NVARCHAR (MAX),
|
|
@ParcialidadesJson NVARCHAR (MAX),
|
|
@OrigenesJson NVARCHAR (MAX),
|
|
@PermitirDisminucion BIT=0,
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @CveSolicitudPago = NULLIF (@CveSolicitudPago, 0);
|
|
IF ISNULL(ISJSON(@OrigenesJson), 0) <> 1
|
|
OR LEFT(LTRIM(@OrigenesJson), 1) <> '['
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Los adeudos de origen no tienen un formato válido.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @CveSolicitudPago IS NOT NULL
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenio
|
|
WHERE CveSolicitudPago = @CveSolicitudPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encontró el convenio que desea modificar.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Origenes TABLE (
|
|
CveSolicitudPagoOrigen INT,
|
|
CveSolicitudPagoDetalleOrigen INT,
|
|
CveSolicitudPagoParcialidadOrigen INT,
|
|
ImporteTomadoConvenio DECIMAL (19, 6));
|
|
INSERT INTO @Origenes
|
|
SELECT CveSolicitudPagoOrigen,
|
|
CveSolicitudPagoDetalleOrigen,
|
|
CveSolicitudPagoParcialidadOrigen,
|
|
ImporteTomadoConvenio
|
|
FROM OPENJSON (@OrigenesJson) WITH (CveSolicitudPagoOrigen INT, CveSolicitudPagoDetalleOrigen INT, CveSolicitudPagoParcialidadOrigen INT, ImporteTomadoConvenio DECIMAL (19, 6));
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM @Origenes)
|
|
OR EXISTS (SELECT 1
|
|
FROM @Origenes
|
|
WHERE CveSolicitudPagoOrigen IS NULL
|
|
OR CveSolicitudPagoDetalleOrigen IS NULL
|
|
OR CveSolicitudPagoParcialidadOrigen IS NULL
|
|
OR ImporteTomadoConvenio IS NULL
|
|
OR ImporteTomadoConvenio <= 0
|
|
OR CveSolicitudPagoOrigen = @CveSolicitudPago)
|
|
OR EXISTS (SELECT CveSolicitudPagoDetalleOrigen,
|
|
CveSolicitudPagoParcialidadOrigen
|
|
FROM @Origenes
|
|
GROUP BY CveSolicitudPagoDetalleOrigen, CveSolicitudPagoParcialidadOrigen
|
|
HAVING COUNT(*) > 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione saldos positivos sin repetir productos y parcialidades de origen.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM @Origenes AS O
|
|
LEFT OUTER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = O.CveSolicitudPagoOrigen
|
|
LEFT OUTER JOIN dbo.Tra_SolicitudesPagoDetalle AS D ON D.CveSolicitudPagoDetalle = O.CveSolicitudPagoDetalleOrigen
|
|
AND D.CveSolicitudPago = S.CveSolicitudPago
|
|
LEFT OUTER JOIN dbo.Tra_SolicitudesPagoParcialidades AS P ON P.CveSolicitudPagoParcialidad = O.CveSolicitudPagoParcialidadOrigen
|
|
AND P.CveSolicitudPago = S.CveSolicitudPago
|
|
WHERE S.CveSolicitudPago IS NULL
|
|
OR D.CveSolicitudPagoDetalle IS NULL
|
|
OR P.CveSolicitudPagoParcialidad IS NULL
|
|
OR S.EstadoAdministrativo <> 'ACTIVO'
|
|
OR S.CveCliente <> @CveCliente
|
|
OR S.CveFraccionamiento <> @CveFraccionamiento
|
|
OR S.CveUnidadCobro <> @CveUnidadCobro)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Los adeudos deben corresponder al cliente, fraccionamiento y unidad del convenio.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @SaldosDetalle TABLE (
|
|
CveSolicitudPagoDetalle INT PRIMARY KEY,
|
|
CveSolicitudPago INT,
|
|
SaldoPendiente DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoDetalle,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoDetalle),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoDetalleOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
AND (@CveSolicitudPago IS NULL
|
|
OR C.CveSolicitudPago <> @CveSolicitudPago)
|
|
GROUP BY D.CveSolicitudPagoDetalleOrigen)
|
|
INSERT INTO @SaldosDetalle
|
|
SELECT D.CveSolicitudPagoDetalle,
|
|
D.CveSolicitudPago,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0)
|
|
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoDetalle = D.CveSolicitudPagoDetalle
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoDetalleOrigen = D.CveSolicitudPagoDetalle;
|
|
DECLARE @SaldosParcialidades TABLE (
|
|
CveSolicitudPagoParcialidad INT PRIMARY KEY,
|
|
CveSolicitudPago INT,
|
|
SaldoPendiente DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoParcialidad,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoParcialidad),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoParcialidadOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
AND (@CveSolicitudPago IS NULL
|
|
OR C.CveSolicitudPago <> @CveSolicitudPago)
|
|
GROUP BY D.CveSolicitudPagoParcialidadOrigen),
|
|
SaldosParcialidades
|
|
AS (SELECT D.*,
|
|
COALESCE (D.FechaProrroga, D.FechaVencimiento) AS VencimientoEfectivo,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoParcialidades AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidad
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoParcialidadOrigen = D.CveSolicitudPagoParcialidad)
|
|
INSERT INTO @SaldosParcialidades
|
|
SELECT CveSolicitudPagoParcialidad,
|
|
CveSolicitudPago,
|
|
SaldoPendiente
|
|
FROM SaldosParcialidades;
|
|
IF EXISTS (SELECT O.CveSolicitudPagoDetalleOrigen
|
|
FROM @Origenes AS O
|
|
INNER JOIN @SaldosDetalle AS D ON D.CveSolicitudPagoDetalle = O.CveSolicitudPagoDetalleOrigen
|
|
GROUP BY O.CveSolicitudPagoDetalleOrigen, D.SaldoPendiente
|
|
HAVING SUM(O.ImporteTomadoConvenio) > D.SaldoPendiente)
|
|
OR EXISTS (SELECT O.CveSolicitudPagoParcialidadOrigen
|
|
FROM @Origenes AS O
|
|
INNER JOIN @SaldosParcialidades AS P ON P.CveSolicitudPagoParcialidad = O.CveSolicitudPagoParcialidadOrigen
|
|
GROUP BY O.CveSolicitudPagoParcialidadOrigen, P.SaldoPendiente
|
|
HAVING SUM(O.ImporteTomadoConvenio) > P.SaldoPendiente)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El saldo seleccionado excede el disponible en un producto o parcialidad.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @SaldoConvenido AS DECIMAL (19, 6) = (SELECT SUM(ImporteTomadoConvenio)
|
|
FROM @Origenes), @CveTipoSolicitudPago AS INT;
|
|
IF ISNULL(@PermitirDisminucion, 0) = 0
|
|
AND @Importe < @SaldoConvenido
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El importe del convenio no puede ser menor al saldo seleccionado.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SELECT @CveTipoSolicitudPago = CveTipoSolicitudPago
|
|
FROM dbo.Tra_TiposSolicitudPago
|
|
WHERE Codigo = 'CONVENIO';
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoGuardar @CveSolicitudPago = @CveSolicitudPago OUTPUT, @CveTipoSolicitudPago = @CveTipoSolicitudPago, @CveCliente = @CveCliente, @CveFraccionamiento = @CveFraccionamiento, @CveFraccionamientoEtapa = @CveFraccionamientoEtapa, @Descripcion = @Descripcion, @Importe = @Importe, @CveUnidadCobro = @CveUnidadCobro, @EsRequerido = @EsRequerido, @FechaGeneracion = @FechaGeneracion, @DetalleJson = @DetalleJson, @ParcialidadesJson = @ParcialidadesJson, @DevolverResultado = 0, @EsOperacionConvenio = 1, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenio
|
|
WHERE CveSolicitudPago = @CveSolicitudPago)
|
|
UPDATE dbo.Tra_SolicitudesPagoConvenio
|
|
SET ImporteSaldoConvenido = @SaldoConvenido,
|
|
Observaciones = @Observaciones
|
|
WHERE CveSolicitudPago = @CveSolicitudPago;
|
|
ELSE
|
|
INSERT INTO dbo.Tra_SolicitudesPagoConvenio (CveSolicitudPago, ImporteSaldoConvenido, Observaciones, CveUsuarioRegistro, FechaRegistro)
|
|
VALUES (@CveSolicitudPago, @SaldoConvenido, @Observaciones, @CveUsuarioEjecuta, SYSDATETIME());
|
|
DELETE D
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
WHERE O.CveSolicitudPagoConvenio = @CveSolicitudPago;
|
|
DELETE dbo.Tra_SolicitudesPagoConvenioOrigen
|
|
WHERE CveSolicitudPagoConvenio = @CveSolicitudPago;
|
|
INSERT INTO dbo.Tra_SolicitudesPagoConvenioOrigen (CveSolicitudPagoConvenio, CveSolicitudPagoOrigen, ImporteSaldoOriginal, ImporteTomadoConvenio, CveUnidadCobro)
|
|
SELECT @CveSolicitudPago,
|
|
O.CveSolicitudPagoOrigen,
|
|
(SELECT SUM(D.SaldoPendiente)
|
|
FROM @SaldosDetalle AS D
|
|
WHERE D.CveSolicitudPago = O.CveSolicitudPagoOrigen),
|
|
SUM(O.ImporteTomadoConvenio),
|
|
@CveUnidadCobro
|
|
FROM @Origenes AS O
|
|
GROUP BY O.CveSolicitudPagoOrigen;
|
|
INSERT INTO dbo.Tra_SolicitudesPagoConvenioOrigenDetalle (CveConvenioOrigen, CveSolicitudPagoOrigen, CveSolicitudPagoDetalleOrigen, CveSolicitudPagoParcialidadOrigen, ImporteSaldoOriginal, ImporteTomadoConvenio)
|
|
SELECT C.CveConvenioOrigen,
|
|
O.CveSolicitudPagoOrigen,
|
|
O.CveSolicitudPagoDetalleOrigen,
|
|
O.CveSolicitudPagoParcialidadOrigen,
|
|
CASE WHEN D.SaldoPendiente < P.SaldoPendiente THEN D.SaldoPendiente ELSE P.SaldoPendiente END,
|
|
O.ImporteTomadoConvenio
|
|
FROM @Origenes AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS C ON C.CveSolicitudPagoConvenio = @CveSolicitudPago
|
|
AND C.CveSolicitudPagoOrigen = O.CveSolicitudPagoOrigen
|
|
INNER JOIN @SaldosDetalle AS D ON D.CveSolicitudPagoDetalle = O.CveSolicitudPagoDetalleOrigen
|
|
INNER JOIN @SaldosParcialidades AS P ON P.CveSolicitudPagoParcialidad = O.CveSolicitudPagoParcialidadOrigen;
|
|
SELECT @CveSolicitudPago AS CveSolicitudPago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_ConvenioGuardar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadCobroListar
|
|
@SoloActivas BIT=1,
|
|
@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 CveUnidadCobro,
|
|
Codigo,
|
|
Nombre,
|
|
EsMoneda,
|
|
RequiereConversion,
|
|
CveMoneda,
|
|
Activo
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE @SoloActivas = 0
|
|
OR Activo = 1
|
|
ORDER BY Nombre;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Gral_UnidadCobroListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadCobroGuardar
|
|
@CveUnidadCobro INT=NULL OUTPUT,
|
|
@Codigo VARCHAR (10),
|
|
@Nombre VARCHAR (100),
|
|
@EsMoneda BIT,
|
|
@RequiereConversion BIT,
|
|
@CveMoneda INT=NULL,
|
|
@Activo 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
|
|
IF @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @CveUnidadCobro = NULLIF (@CveUnidadCobro, 0);
|
|
SET @Codigo = UPPER(LTRIM(RTRIM(@Codigo)));
|
|
IF NULLIF (@Codigo, '') IS NULL
|
|
OR NULLIF (LTRIM(RTRIM(@Nombre)), '') IS NULL
|
|
OR @EsMoneda IS NULL
|
|
OR @RequiereConversion IS NULL
|
|
OR @Activo IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture código, nombre y características de la unidad.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF (@EsMoneda = 1
|
|
AND @CveMoneda IS NULL)
|
|
OR (@EsMoneda = 0
|
|
AND @CveMoneda IS NOT NULL)
|
|
OR (@Codigo = 'MXN'
|
|
AND (@EsMoneda <> 1
|
|
OR @RequiereConversion <> 0))
|
|
OR (@Codigo <> 'MXN'
|
|
AND @RequiereConversion = 0)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La unidad base MXN no requiere conversión; las demás unidades sí. Relacione las monedas con el catálogo existente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE Codigo = @Codigo
|
|
AND (@CveUnidadCobro IS NULL
|
|
OR CveUnidadCobro <> @CveUnidadCobro))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Ya existe una unidad con ese código.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @CveUnidadCobro IS NULL
|
|
BEGIN
|
|
INSERT INTO dbo.Gral_UnidadesCobro (Codigo, Nombre, EsMoneda, RequiereConversion, CveMoneda, Activo)
|
|
VALUES (@Codigo, @Nombre, @EsMoneda, @RequiereConversion, @CveMoneda, @Activo);
|
|
SET @CveUnidadCobro = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @CveUnidadCobro)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encontró la unidad.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND (Codigo <> @Codigo
|
|
OR EsMoneda <> @EsMoneda
|
|
OR RequiereConversion <> @RequiereConversion
|
|
OR ISNULL(CveMoneda, 0) <> ISNULL(@CveMoneda, 0)))
|
|
AND (EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobroValores
|
|
WHERE CveUnidadCobro = @CveUnidadCobro)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveUnidadCobro = @CveUnidadCobro)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveUnidadCobro = @CveUnidadCobro)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_Pagos
|
|
WHERE CveUnidadCobro = @CveUnidadCobro))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La unidad tiene registros relacionados; conserve su código y características de conversión.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Gral_UnidadesCobro
|
|
SET Codigo = @Codigo,
|
|
Nombre = @Nombre,
|
|
EsMoneda = @EsMoneda,
|
|
RequiereConversion = @RequiereConversion,
|
|
CveMoneda = @CveMoneda,
|
|
Activo = @Activo
|
|
WHERE CveUnidadCobro = @CveUnidadCobro;
|
|
END
|
|
SELECT @CveUnidadCobro AS CveUnidadCobro;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Gral_UnidadCobroGuardar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadCobroValoresListar
|
|
@CveUnidadCobro INT,
|
|
@FechaHasta DATE=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
|
|
SELECT V.CveUnidadCobroValor,
|
|
V.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro,
|
|
V.FechaVigencia,
|
|
V.ValorMXN,
|
|
V.Fuente,
|
|
V.FechaRegistro,
|
|
V.CveUsuarioRegistro
|
|
FROM dbo.Gral_UnidadesCobroValores AS V
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = V.CveUnidadCobro
|
|
WHERE V.CveUnidadCobro = @CveUnidadCobro
|
|
AND (@FechaHasta IS NULL
|
|
OR V.FechaVigencia <= @FechaHasta)
|
|
ORDER BY V.FechaVigencia DESC;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Gral_UnidadCobroValoresListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadCobroValorAgregar
|
|
@CveUnidadCobro INT,
|
|
@FechaVigencia DATE,
|
|
@ValorMXN DECIMAL (19, 8),
|
|
@Fuente VARCHAR (500),
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @FechaVigencia IS NULL
|
|
OR @ValorMXN IS NULL
|
|
OR @ValorMXN <= 0
|
|
OR NULLIF (LTRIM(RTRIM(@Fuente)), '') IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture vigencia, valor positivo y fuente de la equivalencia.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND RequiereConversion = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La unidad seleccionada no requiere equivalencias.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobroValores
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND FechaVigencia = @FechaVigencia)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Ya existe un valor para esa vigencia; el histórico no se sobrescribe.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
INSERT INTO dbo.Gral_UnidadesCobroValores (CveUnidadCobro, FechaVigencia, ValorMXN, Fuente, CveUsuarioRegistro, FechaRegistro)
|
|
VALUES (@CveUnidadCobro, @FechaVigencia, @ValorMXN, @Fuente, @CveUsuarioEjecuta, SYSDATETIME());
|
|
SELECT CONVERT (INT, SCOPE_IDENTITY()) AS CveUnidadCobroValor;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Gral_UnidadCobroValorAgregar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- Acceso a esta operación: servicio del catálogo de usuarios, sólo SuperUsuario.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Sis_UsuarioPermisosListar
|
|
@CveUsuario 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
|
|
SELECT P.CvePermiso,
|
|
P.CodigoPermiso,
|
|
P.NombrePermiso,
|
|
P.Descripcion,
|
|
U.Permitido AS PermisoUsuario,
|
|
R.Permitido AS PermisoRol,
|
|
CONVERT (BIT, COALESCE (U.Permitido, R.Permitido, 0)) AS PermitidoEfectivo
|
|
FROM dbo.Sis_Permisos AS P
|
|
INNER JOIN dbo.Sis_Usuarios AS S ON S.CveUsuario = @CveUsuario
|
|
LEFT OUTER JOIN dbo.Sis_UsuariosPermisos AS U ON U.CveUsuario = S.CveUsuario
|
|
AND U.CvePermiso = P.CvePermiso
|
|
LEFT OUTER JOIN dbo.Sis_RolesPermisos AS R ON R.CveRol = S.CveRol
|
|
AND R.CvePermiso = P.CvePermiso
|
|
WHERE P.Activo = 1
|
|
ORDER BY P.NombrePermiso;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Sis_UsuarioPermisosListar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- El servicio verifica SuperUsuario. NULL restaura herencia, 0 deniega y 1 permite.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Sis_UsuarioPermisosGuardar
|
|
@CveUsuario INT,
|
|
@CvePermiso INT,
|
|
@Permitido BIT=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @Permitido IS NULL
|
|
DELETE dbo.Sis_UsuariosPermisos
|
|
WHERE CveUsuario = @CveUsuario
|
|
AND CvePermiso = @CvePermiso;
|
|
ELSE
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Sis_UsuariosPermisos
|
|
WHERE CveUsuario = @CveUsuario
|
|
AND CvePermiso = @CvePermiso)
|
|
UPDATE dbo.Sis_UsuariosPermisos
|
|
SET Permitido = @Permitido
|
|
WHERE CveUsuario = @CveUsuario
|
|
AND CvePermiso = @CvePermiso;
|
|
ELSE
|
|
INSERT INTO dbo.Sis_UsuariosPermisos (CveUsuario, CvePermiso, Permitido, FechaCreacion)
|
|
VALUES (@CveUsuario, @CvePermiso, @Permitido, SYSDATETIME());
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Sis_UsuarioPermisosGuardar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- Los metadatos son captura manual. El servicio guarda archivos en almacenamiento protegido.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiExternoGuardar
|
|
@CveCfdiDocumento BIGINT=NULL OUTPUT,
|
|
@CveCliente INT,
|
|
@VersionCfdi VARCHAR (5),
|
|
@Moneda VARCHAR (3),
|
|
@Total DECIMAL (19, 6),
|
|
@TipoCambio DECIMAL (19, 6)=NULL,
|
|
@Uuid UNIQUEIDENTIFIER=NULL,
|
|
@Serie VARCHAR (25)=NULL,
|
|
@Folio VARCHAR (40)=NULL,
|
|
@FechaEmision DATETIME2 (0)=NULL,
|
|
@FechaTimbrado DATETIME2 (0)=NULL,
|
|
@RutaXml VARCHAR (500)=NULL,
|
|
@HashXml BINARY (32)=NULL,
|
|
@RutaPdf VARCHAR (500)=NULL,
|
|
@HashPdf BINARY (32)=NULL,
|
|
@ImporteValidado BIT=0,
|
|
@MarcarTimbrado BIT=0,
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @CveCfdiDocumento = NULLIF (@CveCfdiDocumento, 0);
|
|
SET @Moneda = UPPER(LTRIM(RTRIM(@Moneda)));
|
|
IF @Total IS NULL
|
|
OR @Total <= 0
|
|
OR NULLIF (LTRIM(RTRIM(@VersionCfdi)), '') IS NULL
|
|
OR NULLIF (@Moneda, '') IS NULL
|
|
OR (@Moneda <> 'MXN'
|
|
AND ISNULL(@TipoCambio, 0) <= 0)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture importe, versión, moneda y equivalencia del documento cuando corresponda.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF (@RutaXml IS NULL
|
|
AND @HashXml IS NOT NULL)
|
|
OR (@RutaXml IS NOT NULL
|
|
AND @HashXml IS NULL)
|
|
OR (@RutaPdf IS NULL
|
|
AND @HashPdf IS NOT NULL)
|
|
OR (@RutaPdf IS NOT NULL
|
|
AND @HashPdf IS NULL)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Los archivos deben incluir su huella de integridad.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @MarcarTimbrado = 1
|
|
AND (@Uuid IS NULL
|
|
OR @RutaXml IS NULL
|
|
OR @RutaPdf IS NULL
|
|
OR ISNULL(@ImporteValidado, 0) = 0
|
|
OR @FechaTimbrado IS NULL)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Para marcar timbrado capture UUID, fecha, XML, PDF y valide el importe.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @Uuid IS NOT NULL
|
|
AND (EXISTS (SELECT 1
|
|
FROM dbo.Fac_CfdiDocumentos
|
|
WHERE UuidExterno = @Uuid
|
|
AND (@CveCfdiDocumento IS NULL
|
|
OR CveCfdiDocumento <> @CveCfdiDocumento))
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Fac_CfdiTimbrados
|
|
WHERE TRY_CONVERT (UNIQUEIDENTIFIER, Uuid) = @Uuid))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El UUID ya está registrado. Utilice el documento existente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @CveCfdiDocumento IS NOT NULL
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Fac_CfdiDocumentos
|
|
WHERE CveCfdiDocumento = @CveCfdiDocumento
|
|
AND OrigenRegistro = 'EXTERNO')
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El documento no corresponde a una carga externa.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_PagosCfdi
|
|
WHERE CveCfdiDocumento = @CveCfdiDocumento)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El documento está vinculado a pagos. Sus metadatos validados deben conservarse.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Fac_CfdiDocumentos
|
|
SET CveCliente = @CveCliente,
|
|
VersionCfdi = @VersionCfdi,
|
|
Moneda = @Moneda,
|
|
Total = @Total,
|
|
TipoCambio = CASE WHEN @Moneda = 'MXN' THEN 1 ELSE @TipoCambio END,
|
|
UuidExterno = @Uuid,
|
|
Serie = @Serie,
|
|
Folio = @Folio,
|
|
FechaEmision = @FechaEmision,
|
|
FechaTimbradoExterno = @FechaTimbrado,
|
|
RutaXmlExterno = @RutaXml,
|
|
HashXmlExterno = @HashXml,
|
|
RutaPdf = @RutaPdf,
|
|
HashPdf = @HashPdf,
|
|
ImporteValidado = @ImporteValidado,
|
|
CveUsuarioValida = CASE WHEN @ImporteValidado = 1 THEN @CveUsuarioEjecuta END,
|
|
FechaValidacion = CASE WHEN @ImporteValidado = 1 THEN SYSDATETIME() END,
|
|
Estado = CASE WHEN @MarcarTimbrado = 1 THEN 'TIMBRADO' ELSE 'BORRADOR' END,
|
|
FechaModificacion = SYSDATETIME()
|
|
WHERE CveCfdiDocumento = @CveCfdiDocumento;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
INSERT INTO dbo.Fac_CfdiDocumentos (CveEmpresa, TipoComprobante, Exportacion, LugarExpedicion, Subtotal, Descuento, TotalImpuestosTrasladados, TotalImpuestosRetenidos, RfcEmisor, NombreEmisor, RegimenFiscalEmisor, RfcReceptor, NombreReceptor, DomicilioFiscalReceptor, RegimenFiscalReceptor, UsoCfdi, XmlSinTimbrar, HashXmlSinTimbrar, IdentificadorDocumento, CveCliente, VersionCfdi, Moneda, Total, TipoCambio, UuidExterno, Serie, Folio, FechaEmision, FechaTimbradoExterno, RutaXmlExterno, HashXmlExterno, RutaPdf, HashPdf, ImporteValidado, CveUsuarioValida, FechaValidacion, Estado, OrigenRegistro, FechaAlta, CveUsuario)
|
|
VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NEWID(), @CveCliente, @VersionCfdi, @Moneda, @Total, CASE WHEN @Moneda = 'MXN' THEN 1 ELSE @TipoCambio END, @Uuid, @Serie, @Folio, @FechaEmision, @FechaTimbrado, @RutaXml, @HashXml, @RutaPdf, @HashPdf, @ImporteValidado, CASE WHEN @ImporteValidado = 1 THEN @CveUsuarioEjecuta END, CASE WHEN @ImporteValidado = 1 THEN SYSDATETIME() END, CASE WHEN @MarcarTimbrado = 1 THEN 'TIMBRADO' ELSE 'BORRADOR' END, 'EXTERNO', SYSDATETIME(), @CveUsuarioEjecuta);
|
|
SET @CveCfdiDocumento = CONVERT (BIGINT, SCOPE_IDENTITY());
|
|
END
|
|
SELECT @CveCfdiDocumento AS CveCfdiDocumento;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Fac_CfdiExternoGuardar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoCfdiVincular
|
|
@CvePago INT,
|
|
@CveCfdiDocumento BIGINT,
|
|
@ImporteVinculadoMXN DECIMAL (19, 6),
|
|
@ImporteDocumentoValidado DECIMAL (19, 6),
|
|
@RutaPdf VARCHAR (500)=NULL,
|
|
@HashPdf BINARY (32)=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @ClientePago AS INT, @ClienteDocumento AS INT, @ImportePago AS DECIMAL (19, 6), @TotalDocumento AS DECIMAL (19, 6), @TotalDocumentoMXN AS DECIMAL (19, 6);
|
|
SELECT @ClientePago = CveCliente,
|
|
@ImportePago = ImporteMXN
|
|
FROM dbo.Tra_Pagos
|
|
WHERE CvePago = @CvePago
|
|
AND EsActivo = 1
|
|
AND Autorizado = 1;
|
|
SELECT @ClienteDocumento = D.CveCliente,
|
|
@TotalDocumento = D.Total,
|
|
@TotalDocumentoMXN = CONVERT (DECIMAL (19, 6), ROUND(D.Total * CASE WHEN D.Moneda = 'MXN' THEN 1 ELSE D.TipoCambio END, 6))
|
|
FROM dbo.Fac_CfdiDocumentos AS D
|
|
WHERE D.CveCfdiDocumento = @CveCfdiDocumento
|
|
AND D.Estado = 'TIMBRADO';
|
|
IF @ClientePago IS NULL
|
|
OR @ClienteDocumento IS NULL
|
|
OR @ClientePago <> @ClienteDocumento
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione un pago recibido y un documento timbrado del mismo cliente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @ImporteDocumentoValidado IS NULL
|
|
OR @ImporteDocumentoValidado <> @TotalDocumento
|
|
OR @TotalDocumentoMXN IS NULL
|
|
OR @TotalDocumentoMXN <= 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El importe capturado no coincide con el documento o falta su equivalencia a MXN.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF ISNULL(@ImporteVinculadoMXN, 0) <= 0
|
|
OR @ImporteVinculadoMXN + ISNULL((SELECT SUM(ImporteVinculadoMXN)
|
|
FROM dbo.Tra_PagosCfdi
|
|
WHERE CvePago = @CvePago), 0) > @ImportePago
|
|
OR @ImporteVinculadoMXN + ISNULL((SELECT SUM(ImporteVinculadoMXN)
|
|
FROM dbo.Tra_PagosCfdi
|
|
WHERE CveCfdiDocumento = @CveCfdiDocumento), 0) > @TotalDocumentoMXN
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El importe a vincular excede el disponible en el pago o documento.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_PagosCfdi
|
|
WHERE CvePago = @CvePago
|
|
AND CveCfdiDocumento = @CveCfdiDocumento)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El documento ya está vinculado a este pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF (@RutaPdf IS NULL
|
|
AND @HashPdf IS NOT NULL)
|
|
OR (@RutaPdf IS NOT NULL
|
|
AND @HashPdf IS NULL)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El archivo PDF debe incluir su huella de integridad.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Fac_CfdiDocumentos
|
|
SET ImporteValidado = 1,
|
|
CveUsuarioValida = @CveUsuarioEjecuta,
|
|
FechaValidacion = SYSDATETIME(),
|
|
RutaPdf = COALESCE (@RutaPdf, RutaPdf),
|
|
HashPdf = COALESCE (@HashPdf, HashPdf),
|
|
FechaModificacion = SYSDATETIME()
|
|
WHERE CveCfdiDocumento = @CveCfdiDocumento;
|
|
INSERT INTO dbo.Tra_PagosCfdi (CvePago, CveCfdiDocumento, ImporteVinculadoMXN, CveUsuarioRegistro, FechaRegistro)
|
|
VALUES (@CvePago, @CveCfdiDocumento, @ImporteVinculadoMXN, @CveUsuarioEjecuta, SYSDATETIME());
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoCfdiVincular'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- El servicio valida el acceso del cliente y resuelve rutas dentro del almacén protegido.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiArchivoObtener
|
|
@CveCfdiDocumento BIGINT,
|
|
@TipoArchivo VARCHAR (3),
|
|
@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 @TipoArchivo IS NULL
|
|
OR UPPER(@TipoArchivo) NOT IN ('XML', 'PDF')
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione XML o PDF.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SELECT D.CveCfdiDocumento,
|
|
D.CveCliente,
|
|
D.OrigenRegistro,
|
|
CASE WHEN UPPER(@TipoArchivo) = 'PDF' THEN D.RutaPdf ELSE D.RutaXmlExterno END AS RutaProtegida,
|
|
CASE WHEN UPPER(@TipoArchivo) = 'XML'
|
|
AND D.OrigenRegistro = 'INTERNO' THEN T.XmlTimbrado END AS Contenido,
|
|
CASE WHEN UPPER(@TipoArchivo) = 'PDF' THEN D.HashPdf WHEN D.OrigenRegistro = 'EXTERNO' THEN D.HashXmlExterno ELSE T.HashXmlTimbrado END AS HuellaArchivo,
|
|
CASE WHEN UPPER(@TipoArchivo) = 'PDF' THEN 'application/pdf' ELSE 'application/xml' END AS TipoContenido
|
|
FROM dbo.Fac_CfdiDocumentos AS D
|
|
LEFT OUTER JOIN dbo.Fac_CfdiTimbrados AS T ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
|
|
AND T.Exitoso = 1
|
|
WHERE D.CveCfdiDocumento = @CveCfdiDocumento;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Fac_CfdiArchivoObtener'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- Adaptación de objetos existentes; conservar sus nombres para los repositorios.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoDelete
|
|
@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
|
|
IF @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @CveTramitePago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El pago tiene conceptos registrados. Elimine primero sus conceptos.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
DELETE dbo.Tra_TiposTramitePagos
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al eliminar el pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoDetalleDelete
|
|
@CveTramitePagoDetalle 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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveTramitePago AS INT;
|
|
SELECT @CveTramitePago = CveTramitePago
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
DELETE dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
UPDATE dbo.Tra_TiposTramitePagos
|
|
SET Importe = ISNULL((SELECT SUM(Importe)
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @CveTramitePago), 0),
|
|
FechaModificacion = SYSDATETIME(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoDetalleDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoDetalleGet
|
|
@CveTramitePagoDetalle 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
|
|
SELECT D.CveTramitePagoDetalle,
|
|
D.CveTramitePago,
|
|
P.Nombre AS Pago,
|
|
D.CvePS,
|
|
PS.Codigo,
|
|
PS.PS,
|
|
D.CveUM,
|
|
UM.UnidadMedida,
|
|
UM.Abreviatura,
|
|
D.Cantidad,
|
|
D.CveUnidadCobro,
|
|
D.Descripcion,
|
|
D.PrecioUnitario,
|
|
D.Importe AS ImporteFinal,
|
|
CONVERT (DECIMAL (18, 2), PS.Precio) AS PrecioProducto,
|
|
CONVERT (DECIMAL (18, 2), COALESCE (Costo.Importe, PS.Precio)) AS Importe,
|
|
COALESCE (Costo.CveObjetoImpuesto, PS.CveObjetoImpuesto) AS CveObjetoImpuesto,
|
|
OI.CodigoObjetoImpuesto,
|
|
OI.CodigoObjetoImpuesto COLLATE Modern_Spanish_CS_AS + ' - ' + OI.ObjetoImpuesto AS ObjetoImpuesto,
|
|
CONVERT (DECIMAL (9, 6), COALESCE (ImpuestoIVA.TasaOCuota, CASE WHEN PS.CveObjetoImpuesto = 1 THEN 0 WHEN PS.IVA IS NULL
|
|
OR PS.IVA = -1 THEN 0.16 ELSE PS.IVA END)) AS PorcentajeIVA,
|
|
Costo.FechaInicioVigencia,
|
|
Costo.FechaFinVigencia,
|
|
CONVERT (DECIMAL (18, 2), ROUND(D.Cantidad * COALESCE (Costo.Importe, PS.Precio) * COALESCE (ImpuestoIVA.TasaOCuota, 0), 2)) AS ImporteIVA,
|
|
D.Importe AS Total
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
|
INNER JOIN dbo.Tra_TiposTramitePagos AS P ON P.CveTramitePago = D.CveTramitePago
|
|
INNER JOIN dbo.ProductosServicios AS PS ON PS.CvePS = D.CvePS
|
|
LEFT OUTER JOIN dbo.UnidadesMedida AS UM ON UM.CveUnidadMedida = D.CveUM OUTER APPLY (SELECT TOP (1) CT.CveCostoTramite,
|
|
CT.Importe,
|
|
CT.CveObjetoImpuesto,
|
|
CT.FechaInicioVigencia,
|
|
CT.FechaFinVigencia
|
|
FROM dbo.Tra_CostosTramite AS CT
|
|
WHERE CT.CveTipoTramite = P.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 OUTER APPLY (SELECT TOP (1) CTI.TasaOCuota
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
|
|
WHERE CTI.CveCostoTramite = Costo.CveCostoTramite
|
|
AND CTI.EsRetencion = 0
|
|
AND CTI.Impuesto = '002'
|
|
AND CTI.TipoFactor = 'Tasa') AS ImpuestoIVA
|
|
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI ON OI.CveObjetoImpuesto = COALESCE (Costo.CveObjetoImpuesto, PS.CveObjetoImpuesto)
|
|
WHERE D.CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al consultar el concepto del pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoDetalleGet'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoDetalleList
|
|
@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
|
|
SELECT D.CveTramitePagoDetalle,
|
|
D.CveTramitePago,
|
|
P.Nombre AS Pago,
|
|
D.CvePS,
|
|
PS.Codigo,
|
|
PS.PS,
|
|
D.CveUM,
|
|
UM.UnidadMedida,
|
|
UM.Abreviatura,
|
|
D.Cantidad,
|
|
D.CveUnidadCobro,
|
|
D.Descripcion,
|
|
D.PrecioUnitario,
|
|
D.Importe AS ImporteFinal,
|
|
CONVERT (DECIMAL (18, 2), PS.Precio) AS PrecioProducto,
|
|
CONVERT (DECIMAL (18, 2), COALESCE (Costo.Importe, PS.Precio)) AS Importe,
|
|
COALESCE (Costo.CveObjetoImpuesto, PS.CveObjetoImpuesto) AS CveObjetoImpuesto,
|
|
OI.CodigoObjetoImpuesto,
|
|
OI.CodigoObjetoImpuesto COLLATE Modern_Spanish_CS_AS + ' - ' + OI.ObjetoImpuesto AS ObjetoImpuesto,
|
|
CONVERT (DECIMAL (9, 6), COALESCE (ImpuestoIVA.TasaOCuota, CASE WHEN PS.CveObjetoImpuesto = 1 THEN 0 WHEN PS.IVA IS NULL
|
|
OR PS.IVA = -1 THEN 0.16 ELSE PS.IVA END)) AS PorcentajeIVA,
|
|
Costo.FechaInicioVigencia,
|
|
Costo.FechaFinVigencia,
|
|
CONVERT (DECIMAL (18, 2), ROUND(D.Cantidad * COALESCE (Costo.Importe, PS.Precio) * COALESCE (ImpuestoIVA.TasaOCuota, 0), 2)) AS ImporteIVA,
|
|
D.Importe AS Total
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
|
INNER JOIN dbo.Tra_TiposTramitePagos AS P ON P.CveTramitePago = D.CveTramitePago
|
|
INNER JOIN dbo.ProductosServicios AS PS ON PS.CvePS = D.CvePS
|
|
LEFT OUTER JOIN dbo.UnidadesMedida AS UM ON UM.CveUnidadMedida = D.CveUM OUTER APPLY (SELECT TOP (1) CT.CveCostoTramite,
|
|
CT.Importe,
|
|
CT.CveObjetoImpuesto,
|
|
CT.FechaInicioVigencia,
|
|
CT.FechaFinVigencia
|
|
FROM dbo.Tra_CostosTramite AS CT
|
|
WHERE CT.CveTipoTramite = P.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 OUTER APPLY (SELECT TOP (1) CTI.TasaOCuota
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
|
|
WHERE CTI.CveCostoTramite = Costo.CveCostoTramite
|
|
AND CTI.EsRetencion = 0
|
|
AND CTI.Impuesto = '002'
|
|
AND CTI.TipoFactor = 'Tasa') AS ImpuestoIVA
|
|
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI ON OI.CveObjetoImpuesto = COALESCE (Costo.CveObjetoImpuesto, PS.CveObjetoImpuesto)
|
|
WHERE D.CveTramitePago = @CveTramitePago
|
|
ORDER BY D.CveTramitePagoDetalle;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al consultar los conceptos del pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoDetalleList'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- Compatibilidad con captura anterior de precio neto e impuestos.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoDetalleSave
|
|
@CveTramitePagoDetalle INT=NULL,
|
|
@CveTramitePago INT,
|
|
@CvePS INT,
|
|
@CveUM INT,
|
|
@Cantidad DECIMAL (18, 4),
|
|
@Importe DECIMAL (18, 2)=NULL,
|
|
@CveObjetoImpuesto TINYINT,
|
|
@PorcentajeIVA DECIMAL (9, 6),
|
|
@FechaInicioVigencia DATE=NULL,
|
|
@PrecioUnitarioFinal DECIMAL (19, 6)=NULL,
|
|
@DescripcionFinal VARCHAR (1000)=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @UnidadPlantilla AS INT;
|
|
SELECT @UnidadPlantilla = CveUnidadCobro
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
IF @PrecioUnitarioFinal IS NOT NULL
|
|
BEGIN
|
|
IF @Cantidad IS NULL
|
|
OR @Cantidad <= 0
|
|
OR @PrecioUnitarioFinal < 0
|
|
OR @UnidadPlantilla IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture cantidad, precio final y plantilla válidos.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @DescripcionFinal = COALESCE (NULLIF (LTRIM(RTRIM(@DescripcionFinal)), ''), (SELECT PS
|
|
FROM dbo.ProductosServicios
|
|
WHERE CvePS = @CvePS));
|
|
SET @CveTramitePagoDetalle = NULLIF (@CveTramitePagoDetalle, 0);
|
|
IF @CveTramitePagoDetalle IS NULL
|
|
BEGIN
|
|
INSERT INTO dbo.Tra_TiposTramitePagosDetalle (CveTramitePago, CvePS, CveUM, Cantidad, FechaAlta, CveUsuario, Descripcion, PrecioUnitario, CveUnidadCobro, Importe)
|
|
VALUES (@CveTramitePago, @CvePS, @CveUM, @Cantidad, SYSDATETIME(), @CveUsuarioEjecuta, @DescripcionFinal, @PrecioUnitarioFinal, @UnidadPlantilla, ROUND(@Cantidad * @PrecioUnitarioFinal, 6));
|
|
SET @CveTramitePagoDetalle = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle
|
|
AND CveTramitePago = @CveTramitePago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encontró el concepto en la plantilla.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Tra_TiposTramitePagosDetalle
|
|
SET CvePS = @CvePS,
|
|
CveUM = @CveUM,
|
|
Cantidad = @Cantidad,
|
|
Descripcion = @DescripcionFinal,
|
|
PrecioUnitario = @PrecioUnitarioFinal,
|
|
Importe = ROUND(@Cantidad * @PrecioUnitarioFinal, 6),
|
|
FechaModificacion = SYSDATETIME(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
END
|
|
UPDATE dbo.Tra_TiposTramitePagos
|
|
SET Importe = (SELECT SUM(Importe)
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @CveTramitePago),
|
|
FechaModificacion = SYSDATETIME(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
SELECT @CveTramitePagoDetalle AS CveTramitePagoDetalle;
|
|
SET @Return = 1;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @UnidadPlantilla
|
|
AND Codigo = 'MXN')
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Para esta unidad capture el precio final de la plantilla.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveTipoTramite AS INT, @CveMoneda AS INT, @Descripcion AS VARCHAR (300), @PrecioProducto AS DECIMAL (18, 2), @CveCostoVigente AS INT, @CveCostoObjetivo AS INT, @FechaInicioVigente AS DATE, @ImporteVigente AS DECIMAL (18, 2), @CveObjetoImpuestoVigente AS TINYINT, @PorcentajeIVAVigente AS DECIMAL (9, 6);
|
|
SELECT @CveTipoTramite = P.CveTipoTramite
|
|
FROM dbo.Tra_TiposTramitePagos AS P
|
|
WHERE P.CveTramitePago = @CveTramitePago;
|
|
SELECT @PrecioProducto = CONVERT (DECIMAL (18, 2), PS.Precio),
|
|
@Descripcion = LEFT(PS.PS, 300)
|
|
FROM dbo.ProductosServicios AS PS
|
|
WHERE PS.CvePS = @CvePS
|
|
AND PS.Estado = 1;
|
|
SELECT TOP (1) @CveMoneda = M.CveMoneda
|
|
FROM dbo.Gral_Monedas AS M
|
|
WHERE M.AbreviaturaSAT = 'MXN'
|
|
ORDER BY M.CveMoneda;
|
|
SET @Importe = ISNULL(@Importe, @PrecioProducto);
|
|
SET @FechaInicioVigencia = ISNULL(@FechaInicioVigencia, CONVERT (DATE, GETDATE()));
|
|
IF @CveTipoTramite IS NULL
|
|
OR @PrecioProducto IS NULL
|
|
OR @CveMoneda IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El pago, producto o moneda seleccionados no están disponibles.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.UnidadesMedida
|
|
WHERE CveUnidadMedida = @CveUM
|
|
AND Estado = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione una unidad de medida vigente.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Gral_SAT_ObjetoImpuesto
|
|
WHERE CveObjetoImpuesto = @CveObjetoImpuesto)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione un objeto de impuesto válido.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF @Cantidad <= 0
|
|
OR @Importe < 0
|
|
OR @PorcentajeIVA < 0
|
|
OR @PorcentajeIVA > 1
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture cantidad, importe y porcentaje de IVA válidos.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF @CveObjetoImpuesto = 1
|
|
SET @PorcentajeIVA = 0;
|
|
SET @CveTramitePagoDetalle = NULLIF (@CveTramitePagoDetalle, 0);
|
|
IF @CveTramitePagoDetalle IS NULL
|
|
BEGIN
|
|
INSERT dbo.Tra_TiposTramitePagosDetalle (CveTramitePago, CvePS, CveUM, Cantidad, FechaAlta, CveUsuario, Descripcion, PrecioUnitario, CveUnidadCobro, Importe)
|
|
VALUES (@CveTramitePago, @CvePS, @CveUM, @Cantidad, GETDATE(), @CveUsuarioEjecuta, @Descripcion, @Importe, @UnidadPlantilla, ROUND(@Cantidad * @Importe, 6));
|
|
SET @CveTramitePagoDetalle = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle
|
|
AND CveTramitePago = @CveTramitePago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El concepto de pago seleccionado no existe.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Tra_TiposTramitePagosDetalle
|
|
SET CvePS = @CvePS,
|
|
CveUM = @CveUM,
|
|
Cantidad = @Cantidad,
|
|
FechaModificacion = GETDATE(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
END
|
|
SELECT TOP (1) @CveCostoVigente = CT.CveCostoTramite,
|
|
@FechaInicioVigente = CT.FechaInicioVigencia,
|
|
@ImporteVigente = CT.Importe,
|
|
@CveObjetoImpuestoVigente = CT.CveObjetoImpuesto,
|
|
@PorcentajeIVAVigente = IVA.TasaOCuota
|
|
FROM dbo.Tra_CostosTramite AS CT OUTER APPLY (SELECT TOP (1) CTI.TasaOCuota
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
|
|
WHERE CTI.CveCostoTramite = CT.CveCostoTramite
|
|
AND CTI.EsRetencion = 0
|
|
AND CTI.Impuesto = '002'
|
|
AND CTI.TipoFactor = 'Tasa') AS IVA
|
|
WHERE CT.CveTipoTramite = @CveTipoTramite
|
|
AND CT.CvePS = @CvePS
|
|
AND CT.EsActivo = 1
|
|
AND CT.FechaFinVigencia IS NULL
|
|
ORDER BY ISNULL(CT.FechaInicioVigencia, CONVERT (DATE, '19000101')) DESC, CT.CveCostoTramite DESC;
|
|
IF @CveCostoVigente IS NULL
|
|
BEGIN
|
|
INSERT dbo.Tra_CostosTramite (CveTipoTramite, CvePS, CveMoneda, Descripcion, Importe, CveObjetoImpuesto, FechaInicioVigencia, FechaFinVigencia, EsActivo, CveUsuario)
|
|
VALUES (@CveTipoTramite, @CvePS, @CveMoneda, @Descripcion, @Importe, @CveObjetoImpuesto, @FechaInicioVigencia, NULL, 1, @CveUsuarioEjecuta);
|
|
SET @CveCostoObjetivo = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
ELSE
|
|
IF @FechaInicioVigente IS NOT NULL
|
|
AND @FechaInicioVigencia < @FechaInicioVigente
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La nueva vigencia no puede iniciar antes de la vigencia actual.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
ELSE
|
|
IF @FechaInicioVigente = @FechaInicioVigencia
|
|
BEGIN
|
|
UPDATE dbo.Tra_CostosTramite
|
|
SET CveMoneda = @CveMoneda,
|
|
Descripcion = @Descripcion,
|
|
Importe = @Importe,
|
|
CveObjetoImpuesto = @CveObjetoImpuesto,
|
|
FechaInicioVigencia = @FechaInicioVigencia,
|
|
FechaModificacion = GETDATE(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveCostoTramite = @CveCostoVigente;
|
|
SET @CveCostoObjetivo = @CveCostoVigente;
|
|
END
|
|
ELSE
|
|
IF @ImporteVigente <> @Importe
|
|
OR @CveObjetoImpuestoVigente <> @CveObjetoImpuesto
|
|
OR ISNULL(@PorcentajeIVAVigente, 0) <> @PorcentajeIVA
|
|
BEGIN
|
|
UPDATE dbo.Tra_CostosTramite
|
|
SET FechaFinVigencia = DATEADD(day, -1, @FechaInicioVigencia),
|
|
FechaModificacion = GETDATE(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveCostoTramite = @CveCostoVigente;
|
|
INSERT dbo.Tra_CostosTramite (CveTipoTramite, CvePS, CveMoneda, Descripcion, Importe, CveObjetoImpuesto, FechaInicioVigencia, FechaFinVigencia, EsActivo, CveUsuario)
|
|
VALUES (@CveTipoTramite, @CvePS, @CveMoneda, @Descripcion, @Importe, @CveObjetoImpuesto, @FechaInicioVigencia, NULL, 1, @CveUsuarioEjecuta);
|
|
SET @CveCostoObjetivo = CONVERT (INT, SCOPE_IDENTITY());
|
|
INSERT dbo.Tra_CostosTramiteImpuestos (CveCostoTramite, EsRetencion, Impuesto, TipoFactor, TasaOCuota, FechaAlta, CveUsuario)
|
|
SELECT @CveCostoObjetivo,
|
|
CTI.EsRetencion,
|
|
CTI.Impuesto,
|
|
CTI.TipoFactor,
|
|
CTI.TasaOCuota,
|
|
GETDATE(),
|
|
@CveUsuarioEjecuta
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
|
|
WHERE CTI.CveCostoTramite = @CveCostoVigente
|
|
AND NOT (CTI.EsRetencion = 0
|
|
AND CTI.Impuesto = '002');
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SET @CveCostoObjetivo = @CveCostoVigente;
|
|
END
|
|
DELETE dbo.Tra_CostosTramiteImpuestos
|
|
WHERE CveCostoTramite = @CveCostoObjetivo
|
|
AND EsRetencion = 0
|
|
AND Impuesto = '002';
|
|
IF @CveObjetoImpuesto <> 1
|
|
AND @PorcentajeIVA > 0
|
|
BEGIN
|
|
INSERT dbo.Tra_CostosTramiteImpuestos (CveCostoTramite, EsRetencion, Impuesto, TipoFactor, TasaOCuota, FechaAlta, CveUsuario)
|
|
VALUES (@CveCostoObjetivo, 0, '002', 'Tasa', @PorcentajeIVA, GETDATE(), @CveUsuarioEjecuta);
|
|
END
|
|
UPDATE D
|
|
SET Descripcion = @Descripcion,
|
|
Importe = ROUND(@Cantidad * @Importe, 2) + ISNULL((SELECT SUM(CASE WHEN I.EsRetencion = 1 THEN -1 ELSE 1 END * CASE WHEN I.TipoFactor = 'Exento' THEN 0 WHEN I.TipoFactor = 'Cuota' THEN ROUND(@Cantidad * I.TasaOCuota, 2) ELSE ROUND(@Cantidad * @Importe * I.TasaOCuota, 2) END)
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS I
|
|
WHERE I.CveCostoTramite = @CveCostoObjetivo), 0),
|
|
CveUnidadCobro = @UnidadPlantilla
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
|
WHERE D.CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
UPDATE dbo.Tra_TiposTramitePagosDetalle
|
|
SET PrecioUnitario = ROUND(Importe / Cantidad, 6)
|
|
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle;
|
|
UPDATE dbo.Tra_TiposTramitePagos
|
|
SET Importe = (SELECT SUM(Importe)
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @CveTramitePago),
|
|
FechaModificacion = SYSDATETIME(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
SELECT @CveTramitePagoDetalle AS CveTramitePagoDetalle;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al guardar el concepto del pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoDetalleSave'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoGet
|
|
@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
|
|
SELECT P.CveTramitePago,
|
|
P.CveTipoTramite,
|
|
T.TipoTramite,
|
|
P.Nombre,
|
|
P.Notas,
|
|
P.EsRequerido,
|
|
P.Orden,
|
|
P.EsActivo,
|
|
P.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro,
|
|
P.Importe AS Total,
|
|
(SELECT COUNT(*)
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
|
WHERE D.CveTramitePago = P.CveTramitePago) AS NumeroConceptos
|
|
FROM dbo.Tra_TiposTramitePagos AS P
|
|
INNER JOIN dbo.Tra_TiposTramite AS T ON T.CveTipoTramite = P.CveTipoTramite
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = P.CveUnidadCobro
|
|
WHERE P.CveTramitePago = @CveTramitePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoGet'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoList
|
|
@CveTipoTramite INT,
|
|
@IncluirInactivos BIT=1,
|
|
@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 P.CveTramitePago,
|
|
P.CveTipoTramite,
|
|
T.TipoTramite,
|
|
P.Nombre,
|
|
P.Notas,
|
|
P.EsRequerido,
|
|
P.Orden,
|
|
P.EsActivo,
|
|
P.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro,
|
|
P.Importe AS Total,
|
|
(SELECT COUNT(*)
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
|
WHERE D.CveTramitePago = P.CveTramitePago) AS NumeroConceptos
|
|
FROM dbo.Tra_TiposTramitePagos AS P
|
|
INNER JOIN dbo.Tra_TiposTramite AS T ON T.CveTipoTramite = P.CveTipoTramite
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = P.CveUnidadCobro
|
|
WHERE P.CveTipoTramite = @CveTipoTramite
|
|
AND (@IncluirInactivos = 1
|
|
OR P.EsActivo = 1)
|
|
ORDER BY P.Orden, P.CveTramitePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoList'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_PagoSave
|
|
@CveTramitePago INT=NULL,
|
|
@CveTipoTramite INT,
|
|
@Nombre VARCHAR (200),
|
|
@Notas VARCHAR (1000)=NULL,
|
|
@EsRequerido BIT,
|
|
@EsActivo BIT,
|
|
@CveUnidadCobro INT=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SET @CveTramitePago = NULLIF (@CveTramitePago, 0);
|
|
IF @CveUnidadCobro IS NULL
|
|
AND @CveTramitePago IS NOT NULL
|
|
SELECT @CveUnidadCobro = CveUnidadCobro
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
IF @CveUnidadCobro IS NULL
|
|
SELECT @CveUnidadCobro = CveUnidadCobro
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE Codigo = 'MXN';
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Gral_UnidadesCobro
|
|
WHERE CveUnidadCobro = @CveUnidadCobro
|
|
AND Activo = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione una unidad de cobro disponible.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @CveTramitePago
|
|
AND CveUnidadCobro <> @CveUnidadCobro)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La plantilla tiene productos; conserve su unidad de cobro.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SELECT @Nombre = LTRIM(RTRIM(@Nombre)),
|
|
@Notas = NULLIF (LTRIM(RTRIM(@Notas)), '');
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramite
|
|
WHERE CveTipoTramite = @CveTipoTramite)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione un tipo de trámite válido.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NULLIF (@Nombre, '') IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture el nombre del pago.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF @CveTramitePago IS NULL
|
|
BEGIN
|
|
DECLARE @Orden AS INT = ISNULL((SELECT MAX(Orden)
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTipoTramite = @CveTipoTramite), 0) + 1;
|
|
INSERT dbo.Tra_TiposTramitePagos (CveTipoTramite, Nombre, Notas, EsRequerido, Orden, EsActivo, CveUsuario, CveUnidadCobro, Importe)
|
|
VALUES (@CveTipoTramite, @Nombre, @Notas, @EsRequerido, @Orden, @EsActivo, @CveUsuarioEjecuta, @CveUnidadCobro, 0);
|
|
SET @CveTramitePago = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagos
|
|
WHERE CveTramitePago = @CveTramitePago
|
|
AND CveTipoTramite = @CveTipoTramite)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El pago seleccionado no pertenece al tipo de trámite.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Tra_TiposTramitePagos
|
|
SET Nombre = @Nombre,
|
|
CveUnidadCobro = @CveUnidadCobro,
|
|
Notas = @Notas,
|
|
EsRequerido = @EsRequerido,
|
|
EsActivo = @EsActivo,
|
|
FechaModificacion = GETDATE(),
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveTramitePago = @CveTramitePago;
|
|
END
|
|
SELECT @CveTramitePago AS CveTramitePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al guardar el pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_PagoSave'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
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
|
|
WITH Aplicaciones
|
|
AS (SELECT A.CveSolicitudPago,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPago),
|
|
Traslados
|
|
AS (SELECT O.CveSolicitudPagoOrigen,
|
|
SUM(O.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY O.CveSolicitudPagoOrigen),
|
|
Saldos
|
|
AS (SELECT S.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
S.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
LEFT OUTER JOIN Aplicaciones AS A ON A.CveSolicitudPago = S.CveSolicitudPago
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoOrigen = S.CveSolicitudPago)
|
|
SELECT S.CveSolicitudPago,
|
|
S.CveSolicitud,
|
|
S.CveTramitePago,
|
|
S.CveVenta,
|
|
CONVERT (BIT, CASE WHEN S.CveVenta IS NOT NULL THEN 1 ELSE 0 END) AS VentaGenerada,
|
|
T.Folio AS FolioSolicitud,
|
|
E.Etapa,
|
|
TT.TipoTramite,
|
|
S.Descripcion AS NombrePago,
|
|
(SELECT COUNT(*)
|
|
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
|
WHERE D.CveSolicitudPago = S.CveSolicitudPago) AS NumeroConceptos,
|
|
CONVERT (DECIMAL (19, 6), V.SubTotal) AS SubTotal,
|
|
CONVERT (DECIMAL (19, 6), V.IVA) AS IVA,
|
|
S.Importe AS Total,
|
|
S.ImporteAbonado,
|
|
S.ImporteConvenido,
|
|
S.SaldoPendiente,
|
|
S.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro
|
|
FROM Saldos AS S
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = S.CveUnidadCobro
|
|
LEFT OUTER JOIN dbo.Tra_Solicitudes AS T ON T.CveSolicitud = S.CveSolicitud
|
|
LEFT OUTER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
|
LEFT OUTER JOIN dbo.Tra_TiposTramite AS TT ON TT.CveTipoTramite = S.CveTipoTramite
|
|
LEFT OUTER JOIN dbo.Ventas AS V ON V.CveVenta = S.CveVenta
|
|
WHERE S.CveFraccionamiento = @CveFraccionamiento
|
|
AND S.EstadoAdministrativo = 'ACTIVO'
|
|
AND S.SaldoPendiente > 0
|
|
ORDER BY E.Orden, S.CveSolicitudPago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS 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
|
|
WITH Aplicaciones
|
|
AS (SELECT CvePago,
|
|
CveSolicitudPago,
|
|
SUM(ImporteAplicado) AS ImporteAplicado,
|
|
SUM(ImporteAplicadoMXN) AS ImporteAplicadoMXN
|
|
FROM dbo.Tra_PagosAplicaciones
|
|
GROUP BY CvePago, CveSolicitudPago)
|
|
SELECT S.CveSolicitudPago,
|
|
S.CveSolicitud,
|
|
S.CveTramitePago,
|
|
S.CveVenta,
|
|
P.CvePago,
|
|
V.SerieFolio,
|
|
V.Fecha,
|
|
P.FechaPago,
|
|
P.Referencia,
|
|
T.Folio AS FolioSolicitud,
|
|
E.Etapa,
|
|
TT.TipoTramite,
|
|
S.Descripcion AS NombrePago,
|
|
CONVERT (DECIMAL (19, 6), NULL) AS SubTotal,
|
|
CONVERT (DECIMAL (19, 6), NULL) AS IVA,
|
|
A.ImporteAplicado AS Total,
|
|
A.ImporteAplicadoMXN,
|
|
S.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro
|
|
FROM Aplicaciones AS A
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS S ON S.CveSolicitudPago = A.CveSolicitudPago
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = S.CveUnidadCobro
|
|
LEFT OUTER JOIN dbo.Tra_Solicitudes AS T ON T.CveSolicitud = S.CveSolicitud
|
|
LEFT OUTER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = S.CveFraccionamientoEtapa
|
|
LEFT OUTER JOIN dbo.Tra_TiposTramite AS TT ON TT.CveTipoTramite = S.CveTipoTramite
|
|
LEFT OUTER JOIN dbo.Ventas AS V ON V.CveVenta = S.CveVenta
|
|
WHERE S.CveFraccionamiento = @CveFraccionamiento
|
|
AND P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
ORDER BY P.FechaPago DESC, P.CvePago DESC, S.CveSolicitudPago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS 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_TramiteConceptoDelete
|
|
@CveSolicitud INT,
|
|
@CveTramitePago INT,
|
|
@CveVentaDetalle 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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveVenta AS INT;
|
|
SELECT @CveVenta = V.CveVenta
|
|
FROM dbo.Tra_SolicitudesPago 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
|
|
WHERE CveVenta = @CveVenta
|
|
AND SeTimbro = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se pueden modificar los conceptos de una venta timbrada.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.VentasDetalle
|
|
WHERE CveVentaDetalle = @CveVentaDetalle
|
|
AND CveVenta = @CveVenta)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El concepto seleccionado no pertenece a la venta.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF (SELECT COUNT(*)
|
|
FROM dbo.VentasDetalle
|
|
WHERE CveVenta = @CveVenta) <= 1
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La venta debe conservar al menos un concepto.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoDetalle
|
|
WHERE CveVentaDetalleOrigen = @CveVentaDetalle)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El concepto forma parte del origen histórico de una obligación y debe conservarse.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DELETE dbo.VentasDetalleImpuestos
|
|
WHERE CveVentaDetalle = @CveVentaDetalle;
|
|
DELETE dbo.VentasDetalle
|
|
WHERE CveVentaDetalle = @CveVentaDetalle
|
|
AND CveVenta = @CveVenta;
|
|
EXECUTE dbo.PA_Vta_TramiteVentaTotalesUpdate @CveVenta = @CveVenta, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al eliminar el concepto de la venta; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Vta_TramiteConceptoDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteConceptoList
|
|
@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 AS INT;
|
|
DECLARE @PorcentajeIVA AS DECIMAL (9, 6) = 0.16;
|
|
SELECT @CveVenta = SP.CveVenta
|
|
FROM dbo.Tra_SolicitudesPago AS SP
|
|
INNER JOIN dbo.Ventas AS V ON V.CveVenta = SP.CveVenta
|
|
WHERE SP.CveSolicitud = @CveSolicitud
|
|
AND SP.CveTramitePago = @CveTramitePago;
|
|
IF @CveVenta IS NOT NULL
|
|
BEGIN
|
|
SELECT VD.CveVentaDetalle,
|
|
CONVERT (INT, 0) AS CveTramitePagoDetalle,
|
|
VD.CvePS,
|
|
UM.CveUnidadMedida AS CveUM,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(UM.Abreviatura)), '') IS NULL THEN UM.UnidadMedida COLLATE DATABASE_DEFAULT ELSE UM.UnidadMedida COLLATE DATABASE_DEFAULT + ' (' + UM.Abreviatura COLLATE DATABASE_DEFAULT + ')' END AS UnidadMedida,
|
|
C.CveClasificacion,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(C.Codigo)), '') IS NULL THEN C.Clasificacion COLLATE DATABASE_DEFAULT ELSE C.Codigo COLLATE DATABASE_DEFAULT + ' - ' + C.Clasificacion COLLATE DATABASE_DEFAULT END AS Clasificacion,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(PS.Codigo)), '') IS NULL THEN PS.PS COLLATE DATABASE_DEFAULT ELSE PS.Codigo COLLATE DATABASE_DEFAULT + ' - ' + PS.PS COLLATE DATABASE_DEFAULT END AS ProductoServicio,
|
|
VD.Cantidad,
|
|
VD.PrecioUnitario,
|
|
VD.Descuento,
|
|
VD.IVA,
|
|
VD.Importe
|
|
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
|
|
INNER JOIN dbo.Clasificaciones AS C ON C.CveClasificacion = PS.CveClasificacion
|
|
WHERE VD.CveVenta = @CveVenta
|
|
ORDER BY VD.CveVentaDetalle;
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
SELECT CONVERT (INT, 0) AS CveVentaDetalle,
|
|
D.CveTramitePagoDetalle,
|
|
D.CvePS,
|
|
D.CveUM,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(UM.Abreviatura)), '') IS NULL THEN UM.UnidadMedida COLLATE DATABASE_DEFAULT ELSE UM.UnidadMedida COLLATE DATABASE_DEFAULT + ' (' + UM.Abreviatura COLLATE DATABASE_DEFAULT + ')' END AS UnidadMedida,
|
|
C.CveClasificacion,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(C.Codigo)), '') IS NULL THEN C.Clasificacion COLLATE DATABASE_DEFAULT ELSE C.Codigo COLLATE DATABASE_DEFAULT + ' - ' + C.Clasificacion COLLATE DATABASE_DEFAULT END AS Clasificacion,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(PS.Codigo)), '') IS NULL THEN PS.PS COLLATE DATABASE_DEFAULT ELSE PS.Codigo COLLATE DATABASE_DEFAULT + ' - ' + PS.PS COLLATE DATABASE_DEFAULT END AS ProductoServicio,
|
|
CONVERT (DECIMAL (18, 4), 1) AS Cantidad,
|
|
CONVERT (DECIMAL (18, 2), Costo.Importe) AS PrecioUnitario,
|
|
CONVERT (DECIMAL (18, 2), 0) AS Descuento,
|
|
CONVERT (DECIMAL (18, 2), ROUND(Costo.Importe * @PorcentajeIVA, 2)) AS IVA,
|
|
CONVERT (DECIMAL (18, 2), ROUND(Costo.Importe, 2)) AS Importe
|
|
FROM dbo.Tra_Solicitudes AS S
|
|
INNER JOIN dbo.Tra_TiposTramitePagos AS P ON P.CveTramitePago = @CveTramitePago
|
|
AND P.CveTipoTramite = S.CveTipoTramite
|
|
AND P.EsActivo = 1
|
|
INNER JOIN dbo.Tra_TiposTramitePagosDetalle AS D ON D.CveTramitePago = P.CveTramitePago
|
|
INNER JOIN dbo.ProductosServicios AS PS ON PS.CvePS = D.CvePS CROSS 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
|
|
INNER JOIN dbo.UnidadesMedida AS UM ON UM.CveUnidadMedida = D.CveUM
|
|
INNER JOIN dbo.Clasificaciones AS C ON C.CveClasificacion = PS.CveClasificacion
|
|
WHERE S.CveSolicitud = @CveSolicitud
|
|
ORDER BY D.CveTramitePagoDetalle;
|
|
END
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al consultar los conceptos de la venta; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Vta_TramiteConceptoList'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteConceptoSave
|
|
@CveSolicitud INT,
|
|
@CveTramitePago INT,
|
|
@CveVentaDetalle INT=NULL,
|
|
@CvePS INT,
|
|
@Cantidad DECIMAL (18, 4),
|
|
@PrecioUnitario DECIMAL (18, 2),
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveVenta AS INT, @CveTipoTramite AS INT, @CveCostoTramite AS INT, @CveObjetoImpuesto AS TINYINT, @Descuento AS DECIMAL (18, 2) = 0, @IVA AS DECIMAL (18, 2), @Importe AS DECIMAL (18, 2), @Fecha AS DATETIME = GETDATE();
|
|
SELECT @CveVenta = V.CveVenta,
|
|
@CveTipoTramite = S.CveTipoTramite
|
|
FROM dbo.Tra_SolicitudesPago AS SP
|
|
INNER JOIN dbo.Ventas AS V ON V.CveVenta = SP.CveVenta
|
|
INNER JOIN dbo.Tra_Solicitudes AS S ON S.CveSolicitud = SP.CveSolicitud
|
|
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
|
|
WHERE CveVenta = @CveVenta
|
|
AND SeTimbro = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se pueden modificar los conceptos de una venta timbrada.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.ProductosServicios
|
|
WHERE CvePS = @CvePS
|
|
AND Estado = 1)
|
|
OR @Cantidad <= 0
|
|
OR @PrecioUnitario < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture un producto activo, cantidad y precio unitario válidos.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
SELECT TOP (1) @CveCostoTramite = CT.CveCostoTramite,
|
|
@CveObjetoImpuesto = CT.CveObjetoImpuesto
|
|
FROM dbo.Tra_CostosTramite AS CT
|
|
WHERE CT.CveTipoTramite = @CveTipoTramite
|
|
AND CT.CvePS = @CvePS
|
|
AND CT.EsActivo = 1
|
|
AND (CT.FechaInicioVigencia IS NULL
|
|
OR CT.FechaInicioVigencia <= CONVERT (DATE, @Fecha))
|
|
AND (CT.FechaFinVigencia IS NULL
|
|
OR CT.FechaFinVigencia >= CONVERT (DATE, @Fecha))
|
|
ORDER BY ISNULL(CT.FechaInicioVigencia, CONVERT (DATE, '19000101')) DESC, CT.CveCostoTramite DESC;
|
|
IF @CveCostoTramite IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El producto seleccionado no tiene un costo vigente para este trámite.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Gral_SAT_ObjetoImpuesto
|
|
WHERE CveObjetoImpuesto = @CveObjetoImpuesto
|
|
AND CodigoObjetoImpuesto = '02')
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_CostosTramiteImpuestos
|
|
WHERE CveCostoTramite = @CveCostoTramite)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El costo es objeto de impuesto y no tiene impuestos configurados.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF @CveVentaDetalle IS NOT NULL
|
|
BEGIN
|
|
SELECT @Descuento = Descuento
|
|
FROM dbo.VentasDetalle
|
|
WHERE CveVentaDetalle = @CveVentaDetalle
|
|
AND CveVenta = @CveVenta;
|
|
END
|
|
SET @Importe = CONVERT (DECIMAL (18, 2), ROUND(@Cantidad * @PrecioUnitario, 2));
|
|
IF @Descuento > @Importe
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El descuento del concepto no puede ser mayor que su importe.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF @CveVentaDetalle IS NULL
|
|
BEGIN
|
|
INSERT dbo.VentasDetalle (CveVenta, CvePS, CveSolicitud, CveCostoTramite, Cantidad, PrecioUnitario, Descuento, IVA, Importe, CveObjetoImpuesto, EsFondoInicial, FechaAlta, CveUsuario)
|
|
VALUES (@CveVenta, @CvePS, @CveSolicitud, @CveCostoTramite, @Cantidad, @PrecioUnitario, 0, 0, @Importe, @CveObjetoImpuesto, 0, @Fecha, @CveUsuarioEjecuta);
|
|
SET @CveVentaDetalle = CONVERT (INT, SCOPE_IDENTITY());
|
|
END
|
|
ELSE
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.VentasDetalle
|
|
WHERE CveVentaDetalle = @CveVentaDetalle
|
|
AND CveVenta = @CveVenta)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El concepto seleccionado no pertenece a la venta.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
DELETE dbo.VentasDetalleImpuestos
|
|
WHERE CveVentaDetalle = @CveVentaDetalle;
|
|
UPDATE dbo.VentasDetalle
|
|
SET CvePS = @CvePS,
|
|
CveCostoTramite = @CveCostoTramite,
|
|
Cantidad = @Cantidad,
|
|
PrecioUnitario = @PrecioUnitario,
|
|
IVA = 0,
|
|
Importe = @Importe,
|
|
CveObjetoImpuesto = @CveObjetoImpuesto,
|
|
CveUsuario = @CveUsuarioEjecuta
|
|
WHERE CveVentaDetalle = @CveVentaDetalle;
|
|
END
|
|
INSERT dbo.VentasDetalleImpuestos (CveVentaDetalle, EsRetencion, Base, Impuesto, TipoFactor, TasaOCuota, Importe, FechaAlta, CveUsuario)
|
|
SELECT @CveVentaDetalle,
|
|
CTI.EsRetencion,
|
|
CONVERT (DECIMAL (19, 6), @Importe - @Descuento),
|
|
CTI.Impuesto,
|
|
CTI.TipoFactor,
|
|
CTI.TasaOCuota,
|
|
CONVERT (DECIMAL (18, 2), CASE WHEN CTI.TipoFactor = 'Exento' THEN 0 WHEN CTI.TipoFactor = 'Cuota' THEN ROUND(@Cantidad * CTI.TasaOCuota, 2) ELSE ROUND((@Importe - @Descuento) * CTI.TasaOCuota, 2) END),
|
|
@Fecha,
|
|
@CveUsuarioEjecuta
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
|
|
WHERE CTI.CveCostoTramite = @CveCostoTramite;
|
|
SELECT @IVA = ISNULL(SUM(VDI.Importe), 0)
|
|
FROM dbo.VentasDetalleImpuestos AS VDI
|
|
WHERE VDI.CveVentaDetalle = @CveVentaDetalle
|
|
AND VDI.EsRetencion = 0
|
|
AND VDI.Impuesto = '002';
|
|
UPDATE dbo.VentasDetalle
|
|
SET IVA = @IVA
|
|
WHERE CveVentaDetalle = @CveVentaDetalle;
|
|
EXECUTE dbo.PA_Vta_TramiteVentaTotalesUpdate @CveVenta = @CveVenta, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SELECT @CveVentaDetalle AS CveVentaDetalle;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al guardar el concepto de la venta; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Vta_TramiteConceptoSave'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteCondicionesPagoSave
|
|
@CveSolicitud INT,
|
|
@CveTramitePago INT,
|
|
@CveMetodoPago INT,
|
|
@CveFormaPago TINYINT,
|
|
@FechaVencimiento DATE,
|
|
@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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveVenta AS INT;
|
|
SELECT @CveVenta = V.CveVenta
|
|
FROM dbo.Tra_SolicitudesPago 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
|
|
WHERE CveVenta = @CveVenta
|
|
AND SeTimbro = 1)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Las condiciones de una venta timbrada no se pueden modificar.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Vta_MetodoPago
|
|
WHERE CveMetodoPago = @CveMetodoPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione un método de pago válido.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Vta_FormaPago
|
|
WHERE CveFormaPago = @CveFormaPago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Seleccione una forma de pago válida.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF @FechaVencimiento IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture una fecha de vencimiento válida.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Ventas
|
|
SET CveMetodoPago = @CveMetodoPago,
|
|
CveMetodoPago33 = @CveMetodoPago,
|
|
FormaPago = @CveFormaPago,
|
|
CveFormaPago33 = @CveFormaPago,
|
|
FechaVencimiento2 = @FechaVencimiento,
|
|
CveUsuarioModifico = @CveUsuarioEjecuta
|
|
WHERE CveVenta = @CveVenta;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al actualizar las condiciones de pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Vta_TramiteCondicionesPagoSave'), '; 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 AS 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_TiposTramitePagos AS P ON P.CveTramitePago = @CveTramitePago
|
|
AND P.CveTipoTramite = S.CveTipoTramite
|
|
AND P.EsActivo = 1
|
|
INNER JOIN dbo.Tra_TiposTramitePagosDetalle 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 SP.CveSolicitudPago IS NOT NULL
|
|
AND ISNULL(VP.ImportePagado, 0) >= SP.Importe THEN 1 ELSE 0 END) AS VentaPagada,
|
|
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
|
|
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_TiposTramitePagos AS P ON P.CveTramitePago = @CveTramitePago
|
|
AND P.CveTipoTramite = S.CveTipoTramite
|
|
INNER JOIN dbo.Clientes AS C ON C.CveCliente = F.CveCliente
|
|
LEFT OUTER JOIN dbo.Tra_SolicitudesPago AS SP ON SP.CveSolicitud = S.CveSolicitud
|
|
AND SP.CveTramitePago = P.CveTramitePago
|
|
LEFT OUTER JOIN dbo.Ventas AS V ON V.CveVenta = SP.CveVenta OUTER APPLY (SELECT MAX(Pago.CvePago) AS CvePago,
|
|
SUM(A.ImporteAplicado) AS ImportePagado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS Pago ON Pago.CvePago = A.CvePago
|
|
WHERE A.CveSolicitudPago = SP.CveSolicitudPago
|
|
AND Pago.EsActivo = 1
|
|
AND Pago.Autorizado = 1) AS VP OUTER APPLY (SELECT TOP (1) D.CveCfdiDocumento,
|
|
D.Estado,
|
|
T.Uuid
|
|
FROM dbo.Fac_CfdiDocumentos AS D
|
|
LEFT OUTER 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 AS 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_TramitePagoOpcionesList
|
|
@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 AS INT;
|
|
SELECT @CveVenta = V.CveVenta
|
|
FROM dbo.Tra_SolicitudesPago 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
|
|
SELECT @CveVenta AS CveVenta,
|
|
CONCAT('TRA-', RIGHT(REPLICATE('0', 10) + CONVERT (VARCHAR (10), @CveVenta), 10)) AS ReferenciaPago;
|
|
SELECT FP.CveFormaPago,
|
|
FP.ClaveFormaPagoSAT,
|
|
CASE WHEN NULLIF (LTRIM(RTRIM(FP.ClaveFormaPagoSAT)), '') IS NULL THEN FP.FormaPago ELSE FP.ClaveFormaPagoSAT COLLATE Modern_Spanish_CS_AS + ' - ' + FP.FormaPago COLLATE Modern_Spanish_CS_AS END AS FormaPago,
|
|
CONVERT (BIT, CASE WHEN FP.ClaveFormaPagoSAT = '04' THEN 0 ELSE 1 END) AS Disponible
|
|
FROM dbo.Vta_FormaPago AS FP
|
|
WHERE FP.ClaveFormaPagoSAT IN ('01', '03', '04')
|
|
ORDER BY FP.ClaveFormaPagoSAT COLLATE Modern_Spanish_CS_AS, FP.FormaPago COLLATE Modern_Spanish_CS_AS, FP.CveFormaPago;
|
|
SELECT BC.CveBancoCuenta,
|
|
B.Banco,
|
|
BC.NumCuenta AS NumeroCuenta,
|
|
BC.CLABE,
|
|
B.Banco COLLATE Modern_Spanish_CS_AS + ' - ' + BC.NumCuenta COLLATE Modern_Spanish_CS_AS + CASE WHEN NULLIF (LTRIM(RTRIM(BC.CLABE)), '') IS NULL THEN '' ELSE ' (CLABE ' + BC.CLABE COLLATE Modern_Spanish_CS_AS + ')' END AS CuentaBancaria
|
|
FROM dbo.Banc_BancosCuentas AS BC
|
|
INNER JOIN dbo.Banc_Bancos AS B ON B.CveBanco = BC.CveBanco
|
|
WHERE BC.Estatus = 1
|
|
AND B.Estatus = 1
|
|
AND NULLIF (LTRIM(RTRIM(BC.CLABE)), '') IS NOT NULL
|
|
ORDER BY B.Banco COLLATE Modern_Spanish_CS_AS, BC.NumCuenta COLLATE Modern_Spanish_CS_AS, BC.CveBancoCuenta;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al consultar las opciones de pago; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Vta_TramitePagoOpcionesList'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- Compatibilidad: reparto proporcional por productos pendientes, vencimientos más antiguos primero.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramitePagoSave
|
|
@CveSolicitud INT,
|
|
@CveTramitePago INT,
|
|
@Referencia VARCHAR (200)=NULL,
|
|
@Importe DECIMAL (19, 6)=NULL,
|
|
@FechaPago DATETIME=NULL,
|
|
@CveFormaPago TINYINT=NULL,
|
|
@CveBancoCuenta INT=NULL,
|
|
@Observaciones VARCHAR (300)=NULL,
|
|
@AplicacionesJson NVARCHAR (MAX)=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @Importe IS NULL
|
|
OR @Importe <= 0
|
|
OR @FechaPago IS NULL
|
|
OR @CveFormaPago IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Capture importe recibido, fecha y forma de pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Obligacion AS INT, @Cliente AS INT, @Unidad AS INT, @Pago AS INT, @Pendiente AS DECIMAL (19, 6);
|
|
WITH Aplicaciones
|
|
AS (SELECT A.CveSolicitudPago,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPago),
|
|
Traslados
|
|
AS (SELECT O.CveSolicitudPagoOrigen,
|
|
SUM(O.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY O.CveSolicitudPagoOrigen),
|
|
Saldos
|
|
AS (SELECT S.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
S.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
LEFT OUTER JOIN Aplicaciones AS A ON A.CveSolicitudPago = S.CveSolicitudPago
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoOrigen = S.CveSolicitudPago)
|
|
SELECT @Obligacion = CveSolicitudPago,
|
|
@Cliente = CveCliente,
|
|
@Unidad = CveUnidadCobro,
|
|
@Pendiente = SaldoPendiente
|
|
FROM Saldos
|
|
WHERE CveSolicitud = @CveSolicitud
|
|
AND CveTramitePago = @CveTramitePago
|
|
AND EstadoAdministrativo = 'ACTIVO';
|
|
IF @Obligacion IS NULL
|
|
OR @Importe > @Pendiente
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Genere la obligación y capture un abono que no exceda su saldo pendiente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF @AplicacionesJson IS NULL
|
|
BEGIN
|
|
DECLARE @SaldosDetalle TABLE (
|
|
CveSolicitudPagoDetalle INT PRIMARY KEY,
|
|
CveSolicitudPago INT,
|
|
SaldoPendiente DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoDetalle,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoDetalle),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoDetalleOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoDetalleOrigen)
|
|
INSERT INTO @SaldosDetalle
|
|
SELECT D.CveSolicitudPagoDetalle,
|
|
D.CveSolicitudPago,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0)
|
|
FROM dbo.Tra_SolicitudesPagoDetalle AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoDetalle = D.CveSolicitudPagoDetalle
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoDetalleOrigen = D.CveSolicitudPagoDetalle;
|
|
DECLARE @SaldosParcialidades TABLE (
|
|
CveSolicitudPagoParcialidad INT PRIMARY KEY,
|
|
CveSolicitudPago INT,
|
|
SaldoPendiente DECIMAL (19, 6));
|
|
WITH Abonos
|
|
AS (SELECT A.CveSolicitudPagoParcialidad,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPagoParcialidad),
|
|
Traslados
|
|
AS (SELECT D.CveSolicitudPagoParcialidadOrigen,
|
|
SUM(D.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigenDetalle AS D
|
|
INNER JOIN dbo.Tra_SolicitudesPagoConvenioOrigen AS O ON O.CveConvenioOrigen = D.CveConvenioOrigen
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY D.CveSolicitudPagoParcialidadOrigen),
|
|
SaldosParcialidades
|
|
AS (SELECT D.*,
|
|
COALESCE (D.FechaProrroga, D.FechaVencimiento) AS VencimientoEfectivo,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
D.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPagoParcialidades AS D
|
|
LEFT OUTER JOIN Abonos AS A ON A.CveSolicitudPagoParcialidad = D.CveSolicitudPagoParcialidad
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoParcialidadOrigen = D.CveSolicitudPagoParcialidad)
|
|
INSERT INTO @SaldosParcialidades
|
|
SELECT CveSolicitudPagoParcialidad,
|
|
CveSolicitudPago,
|
|
SaldoPendiente
|
|
FROM SaldosParcialidades;
|
|
DECLARE @Distribucion TABLE (
|
|
CveSolicitudPagoDetalle INT,
|
|
CveSolicitudPagoParcialidad INT,
|
|
ImporteAplicado DECIMAL (19, 6));
|
|
DECLARE @Productos TABLE (
|
|
CveSolicitudPagoDetalle INT PRIMARY KEY,
|
|
Importe DECIMAL (19, 6));
|
|
INSERT INTO @Productos
|
|
SELECT CveSolicitudPagoDetalle,
|
|
CONVERT (DECIMAL (19, 6), ROUND(@Importe * SaldoPendiente / @Pendiente, 6, 1))
|
|
FROM @SaldosDetalle
|
|
WHERE CveSolicitudPago = @Obligacion
|
|
AND SaldoPendiente > 0;
|
|
DECLARE @Resto AS DECIMAL (19, 6) = @Importe - (SELECT SUM(Importe)
|
|
FROM @Productos);
|
|
WHILE @Resto > 0
|
|
BEGIN
|
|
DECLARE @ProductoAjuste AS INT, @Ajuste AS DECIMAL (19, 6);
|
|
SELECT TOP (1) @ProductoAjuste = P.CveSolicitudPagoDetalle,
|
|
@Ajuste = CASE WHEN D.SaldoPendiente - P.Importe < @Resto THEN D.SaldoPendiente - P.Importe ELSE @Resto END
|
|
FROM @Productos AS P
|
|
INNER JOIN @SaldosDetalle AS D ON D.CveSolicitudPagoDetalle = P.CveSolicitudPagoDetalle
|
|
WHERE D.SaldoPendiente > P.Importe
|
|
ORDER BY P.CveSolicitudPagoDetalle;
|
|
UPDATE @Productos
|
|
SET Importe = Importe + @Ajuste
|
|
WHERE CveSolicitudPagoDetalle = @ProductoAjuste;
|
|
SET @Resto = @Resto - @Ajuste;
|
|
END
|
|
WHILE EXISTS (SELECT 1
|
|
FROM @Productos
|
|
WHERE Importe > 0)
|
|
BEGIN
|
|
DECLARE @Detalle AS INT, @Parcialidad AS INT, @MontoProducto AS DECIMAL (19, 6), @MontoParcialidad AS DECIMAL (19, 6), @Monto AS DECIMAL (19, 6);
|
|
SELECT TOP (1) @Detalle = CveSolicitudPagoDetalle,
|
|
@MontoProducto = Importe
|
|
FROM @Productos
|
|
WHERE Importe > 0
|
|
ORDER BY CveSolicitudPagoDetalle;
|
|
SELECT TOP (1) @Parcialidad = P.CveSolicitudPagoParcialidad,
|
|
@MontoParcialidad = P.SaldoPendiente
|
|
FROM @SaldosParcialidades AS P
|
|
INNER JOIN dbo.Tra_SolicitudesPagoParcialidades AS D ON D.CveSolicitudPagoParcialidad = P.CveSolicitudPagoParcialidad
|
|
WHERE P.CveSolicitudPago = @Obligacion
|
|
AND P.SaldoPendiente > 0
|
|
ORDER BY COALESCE (D.FechaProrroga, D.FechaVencimiento), D.NumeroParcialidad;
|
|
SET @Monto = CASE WHEN @MontoProducto < @MontoParcialidad THEN @MontoProducto ELSE @MontoParcialidad END;
|
|
INSERT INTO @Distribucion
|
|
VALUES (@Detalle, @Parcialidad, @Monto);
|
|
UPDATE @Productos
|
|
SET Importe = Importe - @Monto
|
|
WHERE CveSolicitudPagoDetalle = @Detalle;
|
|
UPDATE @SaldosParcialidades
|
|
SET SaldoPendiente = SaldoPendiente - @Monto
|
|
WHERE CveSolicitudPagoParcialidad = @Parcialidad;
|
|
END
|
|
SET @AplicacionesJson = (SELECT *
|
|
FROM @Distribucion
|
|
FOR JSON PATH);
|
|
END
|
|
EXECUTE dbo.PA_Tra_PagoRegistrar @CvePago = @Pago OUTPUT, @CveCliente = @Cliente, @FechaPago = @FechaPago, @Importe = @Importe, @CveUnidadCobro = @Unidad, @CveFormaPago = @CveFormaPago, @CveBancoCuenta = @CveBancoCuenta, @Referencia = @Referencia, @Observaciones = @Observaciones, @DevolverResultado = 0, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
EXECUTE dbo.PA_Tra_PagoAplicar @CvePago = @Pago, @AplicacionesJson = @AplicacionesJson, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SELECT @Pago AS CvePago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS 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_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 AS INT;
|
|
SELECT @CveVenta = V.CveVenta
|
|
FROM dbo.Tra_SolicitudesPago 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
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.VentasDetalle AS VD
|
|
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI ON OI.CveObjetoImpuesto = VD.CveObjetoImpuesto
|
|
WHERE VD.CveVenta = @CveVenta
|
|
AND OI.CodigoObjetoImpuesto = '02'
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.VentasDetalleImpuestos AS VDI
|
|
WHERE VDI.CveVentaDetalle = VD.CveVentaDetalle))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Uno o más conceptos son objeto de impuesto y no tienen impuestos registrados.',
|
|
@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 OUTER JOIN dbo.Vta_FormaPago AS FP ON FP.CveFormaPago = V.FormaPago
|
|
LEFT OUTER 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 VD.CveVentaDetalle,
|
|
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
|
|
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 OUTER JOIN dbo.Gral_SAT_ProductosServicios AS SATPS ON SATPS.CveSATPS = PS.CveSATPS
|
|
LEFT OUTER JOIN dbo.Gral_SAT_UnidadesMedida AS SATUM ON SATUM.CveSATUnidadMedida = UM.CveSATUnidadMedida
|
|
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI ON OI.CveObjetoImpuesto = VD.CveObjetoImpuesto
|
|
WHERE VD.CveVenta = @CveVenta
|
|
ORDER BY VD.CveVentaDetalle;
|
|
SELECT VDI.CveVentaDetalle,
|
|
VDI.EsRetencion,
|
|
VDI.Base,
|
|
VDI.Impuesto,
|
|
VDI.TipoFactor,
|
|
VDI.TasaOCuota,
|
|
VDI.Importe
|
|
FROM dbo.VentasDetalleImpuestos AS VDI
|
|
INNER JOIN dbo.VentasDetalle AS VD ON VD.CveVentaDetalle = VDI.CveVentaDetalle
|
|
WHERE VD.CveVenta = @CveVenta
|
|
ORDER BY VDI.CveVentaDetalle, VDI.EsRetencion, VDI.Impuesto, VDI.CveVentaDetalleImpuesto;
|
|
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 AS 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_Vta_TramiteVentaGenerar
|
|
@CveSolicitud INT,
|
|
@CveTramitePago INT,
|
|
@Observaciones VARCHAR (2000)=NULL,
|
|
@FechaVencimiento DATE=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago 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
|
|
EXECUTE dbo.PA_Vta_TramiteVentaSave @CveSolicitud = @CveSolicitud, @CveTramitePago = @CveTramitePago, @Observaciones = @Observaciones, @FechaVencimiento = @FechaVencimiento, @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 AS 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
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaSave
|
|
@CveSolicitud INT,
|
|
@CveTramitePago INT,
|
|
@Observaciones VARCHAR (2000)=NULL,
|
|
@FechaVencimiento DATE=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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @Obligacion AS INT;
|
|
SELECT @Obligacion = CveSolicitudPago
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitud = @CveSolicitud
|
|
AND CveTramitePago = @CveTramitePago;
|
|
IF @Obligacion IS NULL
|
|
BEGIN
|
|
EXECUTE dbo.PA_Tra_SolicitudPagoGenerarPorSolicitud @CveSolicitud = @CveSolicitud, @FechaVencimiento = @FechaVencimiento, @CveTramitePago = @CveTramitePago, @DevolverResultado = 0, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
SELECT @Obligacion = CveSolicitudPago
|
|
FROM dbo.Tra_SolicitudesPago
|
|
WHERE CveSolicitud = @CveSolicitud
|
|
AND CveTramitePago = @CveTramitePago;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = S.CveUnidadCobro
|
|
WHERE S.CveSolicitudPago = @Obligacion
|
|
AND S.EstadoAdministrativo = 'ACTIVO'
|
|
AND U.Codigo = 'MXN')
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La venta anterior requiere una obligación vigente en MXN. Para otras unidades utilice los documentos del pago.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
DECLARE @CveVendedor AS INT = 1, @CveCliente AS INT, @CveTipoTramite AS INT, @CveSubProyecto AS INT, @CveEstatusFactura AS INT, @CveVenta AS INT, @Folio AS INT, @Fecha AS DATETIME = GETDATE();
|
|
SELECT @CveCliente = F.CveCliente,
|
|
@CveTipoTramite = S.CveTipoTramite
|
|
FROM dbo.Tra_Solicitudes AS S
|
|
INNER JOIN dbo.Fraccionamientos AS F ON F.CveFraccionamiento = S.CveFraccionamiento
|
|
INNER JOIN dbo.Tra_TiposTramitePagos AS P ON P.CveTramitePago = @CveTramitePago
|
|
AND P.CveTipoTramite = S.CveTipoTramite
|
|
AND P.EsActivo = 1
|
|
WHERE S.CveSolicitud = @CveSolicitud;
|
|
IF @CveCliente IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El pago seleccionado no corresponde al trámite.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Vta_Vendedores
|
|
WHERE CveVendedor = @CveVendedor)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'No se encuentra configurado el vendedor predeterminado 1.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveTramitePago = @CveTramitePago)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El pago seleccionado no tiene conceptos para vender.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D
|
|
WHERE D.CveTramitePago = @CveTramitePago
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_CostosTramite AS CT
|
|
WHERE CT.CveTipoTramite = @CveTipoTramite
|
|
AND CT.CvePS = D.CvePS
|
|
AND CT.EsActivo = 1
|
|
AND (CT.FechaInicioVigencia IS NULL
|
|
OR CT.FechaInicioVigencia <= CONVERT (DATE, @Fecha))
|
|
AND (CT.FechaFinVigencia IS NULL
|
|
OR CT.FechaFinVigencia >= CONVERT (DATE, @Fecha))))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Uno o más conceptos no tienen un costo vigente configurado.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D CROSS APPLY (SELECT TOP (1) CT.CveCostoTramite,
|
|
CT.CveObjetoImpuesto
|
|
FROM dbo.Tra_CostosTramite AS CT
|
|
WHERE CT.CveTipoTramite = @CveTipoTramite
|
|
AND CT.CvePS = D.CvePS
|
|
AND CT.EsActivo = 1
|
|
AND (CT.FechaInicioVigencia IS NULL
|
|
OR CT.FechaInicioVigencia <= CONVERT (DATE, @Fecha))
|
|
AND (CT.FechaFinVigencia IS NULL
|
|
OR CT.FechaFinVigencia >= CONVERT (DATE, @Fecha))
|
|
ORDER BY ISNULL(CT.FechaInicioVigencia, CONVERT (DATE, '19000101')) DESC, CT.CveCostoTramite DESC) AS Costo
|
|
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI ON OI.CveObjetoImpuesto = Costo.CveObjetoImpuesto
|
|
WHERE D.CveTramitePago = @CveTramitePago
|
|
AND OI.CodigoObjetoImpuesto = '02'
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
|
|
WHERE CTI.CveCostoTramite = Costo.CveCostoTramite))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Uno o más costos son objeto de impuesto y no tienen impuestos configurados.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago WITH (UPDLOCK, HOLDLOCK)
|
|
WHERE CveSolicitud = @CveSolicitud
|
|
AND CveTramitePago = @CveTramitePago
|
|
AND CveVenta IS NOT NULL)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La venta de la obligación ya fue generada.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
SELECT TOP (1) @CveSubProyecto = CveSubProyecto
|
|
FROM dbo.SubProyectos
|
|
WHERE Estatus = 1
|
|
ORDER BY CASE WHEN Serie = 'TRA' THEN 0 ELSE 1 END, CveSubProyecto;
|
|
SELECT TOP (1) @CveEstatusFactura = CveEstatusFactura
|
|
FROM dbo.EstatusFactura
|
|
WHERE TipoDocto = 'Rem'
|
|
AND Estado = 1
|
|
ORDER BY CveEstatusFactura;
|
|
IF @CveSubProyecto IS NULL
|
|
OR @CveEstatusFactura IS NULL
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La configuración mínima de ventas no está disponible; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
SELECT @Folio = ISNULL(MAX(Folio), 0) + 1
|
|
FROM dbo.Ventas WITH (UPDLOCK, HOLDLOCK)
|
|
WHERE CveSubProyecto = @CveSubProyecto
|
|
AND TipoDocto = 'Rem'
|
|
AND Serie = 'TRA';
|
|
INSERT dbo.Ventas (TipoDocto, Serie, Folio, Fecha, CveCliente, CveVendedor, CveMetodoPago, CondicionesPago, FormaPago, SubTotal, Descuento, IVA, IEPS, RetIVA, RetISR, Total, Observaciones, CveEstatusFactura, FechaEjecucion, CveSubProyecto, CveUsuario, CveFormaPago33, CveMetodoPago33, FechaIng, FechaVencimiento2, Ref, DescripcionVenta, FechaParaSurtir)
|
|
VALUES ('Rem', 'TRA', @Folio, @Fecha, @CveCliente, @CveVendedor, 2, 0, 99, 0, 0, 0, 0, 0, 0, 0, ISNULL(@Observaciones, ''), @CveEstatusFactura, @Fecha, @CveSubProyecto, @CveUsuarioEjecuta, 99, 2, @Fecha, CONVERT (DATE, @Fecha), CONVERT (VARCHAR (50), @CveSolicitud), 'Pago de trámite', @Fecha);
|
|
SET @CveVenta = CONVERT (INT, SCOPE_IDENTITY());
|
|
INSERT dbo.VentasDetalle (CveVenta, CvePS, CveSolicitud, CveCostoTramite, Cantidad, PrecioUnitario, Descuento, IVA, Importe, CveObjetoImpuesto, EsFondoInicial, FechaAlta, CveUsuario)
|
|
SELECT @CveVenta,
|
|
D.CvePS,
|
|
@CveSolicitud,
|
|
Costo.CveCostoTramite,
|
|
D.Cantidad,
|
|
CONVERT (DECIMAL (18, 2), Costo.Importe),
|
|
CONVERT (DECIMAL (18, 2), 0),
|
|
CONVERT (DECIMAL (18, 2), 0),
|
|
CONVERT (DECIMAL (18, 2), ROUND(D.Cantidad * Costo.Importe, 2)),
|
|
Costo.CveObjetoImpuesto,
|
|
0,
|
|
@Fecha,
|
|
@CveUsuarioEjecuta
|
|
FROM dbo.Tra_TiposTramitePagosDetalle AS D CROSS APPLY (SELECT TOP (1) CT.CveCostoTramite,
|
|
CT.Importe,
|
|
CT.CveObjetoImpuesto
|
|
FROM dbo.Tra_CostosTramite AS CT
|
|
WHERE CT.CveTipoTramite = @CveTipoTramite
|
|
AND CT.CvePS = D.CvePS
|
|
AND CT.EsActivo = 1
|
|
AND (CT.FechaInicioVigencia IS NULL
|
|
OR CT.FechaInicioVigencia <= CONVERT (DATE, @Fecha))
|
|
AND (CT.FechaFinVigencia IS NULL
|
|
OR CT.FechaFinVigencia >= CONVERT (DATE, @Fecha))
|
|
ORDER BY ISNULL(CT.FechaInicioVigencia, CONVERT (DATE, '19000101')) DESC, CT.CveCostoTramite DESC) AS Costo
|
|
WHERE D.CveTramitePago = @CveTramitePago;
|
|
INSERT dbo.VentasDetalleImpuestos (CveVentaDetalle, EsRetencion, Base, Impuesto, TipoFactor, TasaOCuota, Importe, FechaAlta, CveUsuario)
|
|
SELECT VD.CveVentaDetalle,
|
|
CTI.EsRetencion,
|
|
CONVERT (DECIMAL (19, 6), VD.Importe - VD.Descuento),
|
|
CTI.Impuesto,
|
|
CTI.TipoFactor,
|
|
CTI.TasaOCuota,
|
|
CONVERT (DECIMAL (18, 2), CASE WHEN CTI.TipoFactor = 'Exento' THEN 0 WHEN CTI.TipoFactor = 'Cuota' THEN ROUND(VD.Cantidad * CTI.TasaOCuota, 2) ELSE ROUND((VD.Importe - VD.Descuento) * CTI.TasaOCuota, 2) END),
|
|
@Fecha,
|
|
@CveUsuarioEjecuta
|
|
FROM dbo.VentasDetalle AS VD
|
|
INNER JOIN dbo.Tra_CostosTramiteImpuestos AS CTI ON CTI.CveCostoTramite = VD.CveCostoTramite
|
|
WHERE VD.CveVenta = @CveVenta;
|
|
UPDATE VD
|
|
SET IVA = ISNULL(ImpuestoIVA.Importe, 0)
|
|
FROM dbo.VentasDetalle AS VD OUTER APPLY (SELECT SUM(VDI.Importe) AS Importe
|
|
FROM dbo.VentasDetalleImpuestos AS VDI
|
|
WHERE VDI.CveVentaDetalle = VD.CveVentaDetalle
|
|
AND VDI.EsRetencion = 0
|
|
AND VDI.Impuesto = '002') AS ImpuestoIVA
|
|
WHERE VD.CveVenta = @CveVenta;
|
|
EXECUTE dbo.PA_Vta_TramiteVentaTotalesUpdate @CveVenta = @CveVenta, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @ErrorMostrar OUTPUT, @ErrorTipo = @ErrorTipo OUTPUT, @Return = @Return OUTPUT;
|
|
IF @Return = 0
|
|
RETURN;
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
INNER JOIN dbo.Ventas AS V ON V.CveVenta = @CveVenta
|
|
WHERE S.CveSolicitudPago = @Obligacion
|
|
AND S.Importe <> V.Total)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El total de venta no coincide con la obligación. Revise los conceptos e impuestos antes de vincularla.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
UPDATE dbo.Tra_SolicitudesPago
|
|
SET CveVenta = @CveVenta,
|
|
CveUsuarioModificacion = @CveUsuarioEjecuta,
|
|
FechaModificacion = SYSDATETIME()
|
|
WHERE CveSolicitudPago = @Obligacion;
|
|
SELECT @CveVenta AS CveVenta;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al registrar la venta del trámite; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaSave'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioDelete
|
|
@CvePS 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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.ProductosServicios
|
|
WHERE CvePS = @CvePS)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El producto o servicio seleccionado no existe.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.Tra_CostosTramite
|
|
WHERE CvePS = @CvePS)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CvePS = @CvePS)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.VentasDetalle
|
|
WHERE CvePS = @CvePS)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.ProductosServicios
|
|
WHERE CvePS <> @CvePS
|
|
AND (CvePSAdicional = @CvePS
|
|
OR CveCompuesto = @CvePS))
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El producto o servicio tiene trámites, pagos, ventas o productos relacionados y no puede eliminarse.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
DELETE dbo.ProductosServicios
|
|
WHERE CvePS = @CvePS;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
IF ERROR_NUMBER() = 547
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'El producto o servicio tiene información relacionada y no puede eliminarse.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al eliminar el producto o servicio; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Gral_UnidadMedidaDelete
|
|
@CveUnidadMedida 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 @@TRANCOUNT = 0
|
|
OR XACT_STATE() <> 1
|
|
THROW 51300, 'La operación requiere la transacción del servicio.', 1;
|
|
DECLARE @ResultadoBloqueo AS INT;
|
|
EXECUTE @ResultadoBloqueo = sys.sp_getapplock @Resource = N'PagosConvenios', @LockMode = 'Exclusive', @LockOwner = 'Transaction', @LockTimeout = 5000;
|
|
IF @ResultadoBloqueo < 0
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'Hay otra operación de pagos en curso. Intente nuevamente.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
IF NOT EXISTS (SELECT 1
|
|
FROM dbo.UnidadesMedida
|
|
WHERE CveUnidadMedida = @CveUnidadMedida)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La unidad de medida seleccionada no existe.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
IF EXISTS (SELECT 1
|
|
FROM dbo.ProductosServicios
|
|
WHERE CveUnidadMedida = @CveUnidadMedida)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_TiposTramitePagosDetalle
|
|
WHERE CveUM = @CveUnidadMedida)
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La unidad de medida tiene productos, servicios o pagos relacionados y no puede eliminarse.',
|
|
@ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
DELETE dbo.UnidadesMedida
|
|
WHERE CveUnidadMedida = @CveUnidadMedida;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
IF ERROR_NUMBER() = 547
|
|
BEGIN
|
|
SELECT @ErrorMostrar = 'La unidad de medida tiene información relacionada y no puede eliminarse.',
|
|
@ErrorTipo = 2,
|
|
@Return = 0;
|
|
RETURN;
|
|
END
|
|
SELECT @ErrorMostrar = 'Ocurrió un error al eliminar la unidad de medida; favor de contactar a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Gral_UnidadMedidaDelete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudPagoList
|
|
@CveSolicitud 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
|
|
WITH Aplicaciones
|
|
AS (SELECT A.CveSolicitudPago,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPago),
|
|
Traslados
|
|
AS (SELECT O.CveSolicitudPagoOrigen,
|
|
SUM(O.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY O.CveSolicitudPagoOrigen),
|
|
Saldos
|
|
AS (SELECT S.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
S.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
LEFT OUTER JOIN Aplicaciones AS A ON A.CveSolicitudPago = S.CveSolicitudPago
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoOrigen = S.CveSolicitudPago)
|
|
SELECT @CveSolicitud AS CveSolicitud,
|
|
S.CveSolicitudPago,
|
|
S.CveTramitePago,
|
|
S.Descripcion AS NombrePago,
|
|
S.EsRequerido,
|
|
CONVERT (BIT, CASE WHEN S.EstadoAdministrativo = 'ACTIVO' THEN 1 ELSE 0 END) AS EsActivo,
|
|
CONVERT (BIT, CASE WHEN S.ImporteAbonado >= S.Importe THEN 1 ELSE 0 END) AS TienePago,
|
|
S.Importe AS Total,
|
|
S.ImporteAbonado AS ImportePagado,
|
|
S.ImporteConvenido,
|
|
S.SaldoPendiente,
|
|
S.CveUnidadCobro,
|
|
U.Codigo AS UnidadCobro
|
|
FROM Saldos AS S
|
|
INNER JOIN dbo.Gral_UnidadesCobro AS U ON U.CveUnidadCobro = S.CveUnidadCobro
|
|
WHERE (S.CveSolicitud = @CveSolicitud
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS R ON R.CveSolicitudPago = O.CveSolicitudPagoOrigen
|
|
WHERE O.CveSolicitudPagoConvenio = S.CveSolicitudPago
|
|
AND R.CveSolicitud = @CveSolicitud))
|
|
ORDER BY S.FechaGeneracion, S.CveSolicitudPago;
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible completar la operación. Contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudPagoList'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
-- La configuración particular sustituye completamente la general.
|
|
-- Sólo obligaciones generadas, requeridas y con saldo cobrable.
|
|
-- Consulta las condiciones al PA existente, sin duplicar sus reglas.
|
|
-- El estatus Autorizado tiene prioridad; el rechazo precede a faltantes/vencidos.
|
|
-- Autorizados/cancelados no presentan tareas por atender en el panel.
|
|
CREATE OR ALTER PROCEDURE dbo.PA_Tra_SolicitudProcesoActualizar
|
|
@CveSolicitud INT=NULL,
|
|
@CveFraccionamientoEtapa INT=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 @CveSolicitud IS NULL
|
|
AND @CveFraccionamientoEtapa IS NULL
|
|
BEGIN
|
|
SET @ErrorMostrar = 'Seleccione una solicitud o etapa para actualizar.';
|
|
SET @ErrorTipo = 2;
|
|
RETURN;
|
|
END
|
|
DECLARE @Hoy AS DATE = CONVERT (DATE, SYSDATETIMEOFFSET() AT TIME ZONE 'US Mountain Standard Time');
|
|
SELECT S.CveSolicitud,
|
|
S.CveTipoTramite,
|
|
S.CveFraccionamientoEtapa,
|
|
ES.Codigo AS CodigoEstatus
|
|
INTO #Solicitudes
|
|
FROM dbo.Tra_Solicitudes AS S
|
|
INNER JOIN dbo.Tra_EstatusSolicitud AS ES ON ES.CveEstatusSolicitud = S.CveEstatusSolicitud
|
|
WHERE (@CveSolicitud IS NULL
|
|
OR S.CveSolicitud = @CveSolicitud)
|
|
AND (@CveFraccionamientoEtapa IS NULL
|
|
OR S.CveFraccionamientoEtapa = @CveFraccionamientoEtapa);
|
|
CREATE UNIQUE CLUSTERED INDEX IX_Solicitudes
|
|
ON #Solicitudes(CveSolicitud);
|
|
SELECT S.CveSolicitud,
|
|
G.CveTipoDocumento,
|
|
G.EsRequerido,
|
|
G.EsCliente,
|
|
G.TieneVigencia,
|
|
G.EsActivo
|
|
INTO #Configuracion
|
|
FROM #Solicitudes AS S
|
|
INNER JOIN dbo.Tra_TiposTramiteDocumento AS G ON G.CveTipoTramite = S.CveTipoTramite
|
|
WHERE NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS P
|
|
WHERE P.CveSolicitud = S.CveSolicitud
|
|
AND P.CveTipoDocumento = G.CveTipoDocumento)
|
|
UNION ALL
|
|
SELECT P.CveSolicitud,
|
|
P.CveTipoDocumento,
|
|
P.EsRequerido,
|
|
P.EsCliente,
|
|
P.TieneVigencia,
|
|
P.EsActivo
|
|
FROM dbo.Tra_SolicitudDocumentoConfiguracion AS P
|
|
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = P.CveSolicitud;
|
|
CREATE TABLE #Acciones (
|
|
CveSolicitud INT NOT NULL,
|
|
TipoAccion VARCHAR (30) COLLATE Modern_Spanish_CI_AS NOT NULL,
|
|
CveReferencia INT NOT NULL,
|
|
Descripcion NVARCHAR (1000) COLLATE Modern_Spanish_CS_AS NOT NULL,
|
|
VisibleCliente BIT NOT NULL,
|
|
Orden INT NOT NULL,
|
|
PRIMARY KEY (CveSolicitud, TipoAccion, CveReferencia)
|
|
);
|
|
INSERT INTO #Acciones (CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
|
|
SELECT C.CveSolicitud,
|
|
'DocumentoFaltante',
|
|
C.CveTipoDocumento,
|
|
CONCAT(N'Cargar documento: ', COALESCE (NULLIF (T.Descripcion, ''), T.TipoDocumento)),
|
|
C.EsCliente,
|
|
10
|
|
FROM #Configuracion AS C
|
|
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = C.CveTipoDocumento
|
|
WHERE C.EsActivo = 1
|
|
AND C.EsRequerido = 1
|
|
AND T.EsActivo = 1
|
|
AND NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_DocumentosSolicitud AS D
|
|
WHERE D.CveSolicitud = C.CveSolicitud
|
|
AND D.CveTipoDocumento = C.CveTipoDocumento
|
|
AND D.EsActivo = 1
|
|
AND NULLIF (LTRIM(RTRIM(D.NombreArchivo)), '') IS NOT NULL
|
|
AND NULLIF (LTRIM(RTRIM(D.RutaArchivo)), '') IS NOT NULL);
|
|
INSERT INTO #Acciones (CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
|
|
SELECT D.CveSolicitud,
|
|
'DocumentoRechazado',
|
|
D.CveDocumentoSolicitud,
|
|
CONCAT(N'Corregir documento no autorizado: ', COALESCE (NULLIF (T.Descripcion, ''), T.TipoDocumento)),
|
|
ISNULL(C.EsCliente, 0),
|
|
20
|
|
FROM dbo.Tra_DocumentosSolicitud AS D
|
|
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
|
|
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = D.CveTipoDocumento
|
|
LEFT OUTER JOIN #Configuracion AS C ON C.CveSolicitud = D.CveSolicitud
|
|
AND C.CveTipoDocumento = D.CveTipoDocumento
|
|
WHERE D.EsActivo = 1
|
|
AND D.EsAprobado = 0;
|
|
INSERT INTO #Acciones (CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
|
|
SELECT D.CveSolicitud,
|
|
'DocumentoVencido',
|
|
D.CveDocumentoSolicitud,
|
|
CONCAT(N'Renovar documento vencido: ', COALESCE (NULLIF (T.Descripcion, ''), T.TipoDocumento), N' (', CONVERT (CHAR (10), D.FechaVencimiento, 103), N')'),
|
|
ISNULL(C.EsCliente, 0),
|
|
30
|
|
FROM dbo.Tra_DocumentosSolicitud AS D
|
|
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = D.CveSolicitud
|
|
INNER JOIN dbo.Tra_TiposDocumento AS T ON T.CveTipoDocumento = D.CveTipoDocumento
|
|
LEFT OUTER JOIN #Configuracion AS C ON C.CveSolicitud = D.CveSolicitud
|
|
AND C.CveTipoDocumento = D.CveTipoDocumento
|
|
WHERE D.EsActivo = 1
|
|
AND D.FechaVencimiento < @Hoy
|
|
AND ISNULL(C.TieneVigencia, 1) = 1;
|
|
WITH Aplicaciones
|
|
AS (SELECT A.CveSolicitudPago,
|
|
SUM(A.ImporteAplicado) AS Abonado
|
|
FROM dbo.Tra_PagosAplicaciones AS A
|
|
INNER JOIN dbo.Tra_Pagos AS P ON P.CvePago = A.CvePago
|
|
WHERE P.EsActivo = 1
|
|
AND P.Autorizado = 1
|
|
GROUP BY A.CveSolicitudPago),
|
|
Traslados
|
|
AS (SELECT O.CveSolicitudPagoOrigen,
|
|
SUM(O.ImporteTomadoConvenio) AS Convenido
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS C ON C.CveSolicitudPago = O.CveSolicitudPagoConvenio
|
|
WHERE C.EstadoAdministrativo <> 'CANCELADO'
|
|
GROUP BY O.CveSolicitudPagoOrigen),
|
|
Saldos
|
|
AS (SELECT S.*,
|
|
ISNULL(A.Abonado, 0) AS ImporteAbonado,
|
|
ISNULL(T.Convenido, 0) AS ImporteConvenido,
|
|
S.Importe - ISNULL(A.Abonado, 0) - ISNULL(T.Convenido, 0) AS SaldoPendiente
|
|
FROM dbo.Tra_SolicitudesPago AS S
|
|
LEFT OUTER JOIN Aplicaciones AS A ON A.CveSolicitudPago = S.CveSolicitudPago
|
|
LEFT OUTER JOIN Traslados AS T ON T.CveSolicitudPagoOrigen = S.CveSolicitudPago)
|
|
INSERT INTO #Acciones (CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
|
|
SELECT DISTINCT R.CveSolicitud,
|
|
'PagoPendiente',
|
|
S.CveSolicitudPago,
|
|
CONCAT(N'Pagar saldo: ', S.Descripcion),
|
|
1,
|
|
40
|
|
FROM Saldos AS S
|
|
INNER JOIN #Solicitudes AS R ON R.CveSolicitud = S.CveSolicitud
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesPagoConvenioOrigen AS O
|
|
INNER JOIN dbo.Tra_SolicitudesPago AS P ON P.CveSolicitudPago = O.CveSolicitudPagoOrigen
|
|
WHERE O.CveSolicitudPagoConvenio = S.CveSolicitudPago
|
|
AND P.CveSolicitud = R.CveSolicitud)
|
|
WHERE S.EstadoAdministrativo = 'ACTIVO'
|
|
AND S.EsRequerido = 1
|
|
AND S.SaldoPendiente > 0;
|
|
DECLARE @SolicitudCondicion AS INT;
|
|
DECLARE @TipoTramite AS INT;
|
|
DECLARE @Etapa AS INT;
|
|
DECLARE @Condiciones TABLE (
|
|
CveCondicionMostrar INT,
|
|
CondicionMostrar VARCHAR (100));
|
|
DECLARE @Correcto AS BIT;
|
|
DECLARE @TipoError AS INT;
|
|
DECLARE @Mensaje AS VARCHAR (MAX);
|
|
DECLARE condiciones CURSOR LOCAL FAST_FORWARD
|
|
FOR SELECT CveSolicitud,
|
|
CveTipoTramite,
|
|
CveFraccionamientoEtapa
|
|
FROM #Solicitudes
|
|
ORDER BY CveSolicitud;
|
|
OPEN condiciones;
|
|
FETCH NEXT FROM condiciones INTO @SolicitudCondicion, @TipoTramite, @Etapa;
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
DELETE @Condiciones;
|
|
INSERT INTO @Condiciones
|
|
EXECUTE dbo.PA_Tra_MostrarCondicionesporTramite @CveTipoTramite = @TipoTramite, @CveFraccionamientoEtapa = @Etapa, @CveUsuarioEjecuta = @CveUsuarioEjecuta, @ErrorMostrar = @Mensaje OUTPUT, @ErrorTipo = @TipoError OUTPUT, @Return = @Correcto OUTPUT;
|
|
IF ISNULL(@Correcto, 0) = 0
|
|
BEGIN
|
|
SET @ErrorMostrar = @Mensaje;
|
|
SET @ErrorTipo = ISNULL(NULLIF (@TipoError, 0), 1);
|
|
CLOSE condiciones;
|
|
DEALLOCATE condiciones;
|
|
RETURN;
|
|
END
|
|
INSERT INTO #Acciones (CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
|
|
SELECT @SolicitudCondicion,
|
|
'CondicionPendiente',
|
|
C.CveCondicionMostrar,
|
|
CONCAT(N'Capturar condición: ', C.CondicionMostrar),
|
|
0,
|
|
50
|
|
FROM @Condiciones AS C
|
|
INNER JOIN dbo.FraccionamientosEtapas AS E ON E.CveFraccionamientoEtapa = @Etapa
|
|
WHERE CASE C.CveCondicionMostrar WHEN 1 THEN E.Aprobado_Prefactibilidad WHEN 2 THEN E.RequiereObrasExternas WHEN 3 THEN E.TipoDeObra WHEN 4 THEN E.LiberacionMacromedidor WHEN 5 THEN E.Relotificacion WHEN 6 THEN E.LiberacionDeLotes WHEN 7 THEN E.LiberacionDePagosDeDerechos END IS NULL;
|
|
FETCH NEXT FROM condiciones INTO @SolicitudCondicion, @TipoTramite, @Etapa;
|
|
END
|
|
CLOSE condiciones;
|
|
DEALLOCATE condiciones;
|
|
UPDATE S
|
|
SET EstatusProceso = CASE WHEN B.CodigoEstatus = 'Autorizado' THEN 4 WHEN EXISTS (SELECT 1
|
|
FROM #Acciones AS A
|
|
WHERE A.CveSolicitud = S.CveSolicitud
|
|
AND A.TipoAccion = 'DocumentoRechazado') THEN 2 WHEN EXISTS (SELECT 1
|
|
FROM #Acciones AS A
|
|
WHERE A.CveSolicitud = S.CveSolicitud
|
|
AND A.TipoAccion IN ('DocumentoFaltante', 'DocumentoVencido')) THEN 1 WHEN B.CodigoEstatus = 'Revisando' THEN 3 WHEN B.CodigoEstatus <> 'Sin Procesar'
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_DocumentosSolicitud AS D
|
|
WHERE D.CveSolicitud = S.CveSolicitud
|
|
AND D.EsActivo = 1)
|
|
OR EXISTS (SELECT 1
|
|
FROM dbo.Tra_ComentariosSolicitud AS C
|
|
WHERE C.CveSolicitud = S.CveSolicitud) THEN 1 ELSE 0 END
|
|
FROM dbo.Tra_Solicitudes AS S
|
|
INNER JOIN #Solicitudes AS B ON B.CveSolicitud = S.CveSolicitud;
|
|
DELETE A
|
|
FROM #Acciones AS A
|
|
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = A.CveSolicitud
|
|
WHERE S.CodigoEstatus IN ('Autorizado', 'Cancelado');
|
|
DELETE A
|
|
FROM dbo.Tra_SolicitudesAccionesPendientes AS A
|
|
INNER JOIN #Solicitudes AS S ON S.CveSolicitud = A.CveSolicitud
|
|
WHERE NOT EXISTS (SELECT 1
|
|
FROM #Acciones AS N
|
|
WHERE N.CveSolicitud = A.CveSolicitud
|
|
AND N.TipoAccion = A.TipoAccion
|
|
AND N.CveReferencia = A.CveReferencia);
|
|
UPDATE A
|
|
SET Descripcion = N.Descripcion,
|
|
VisibleCliente = N.VisibleCliente,
|
|
Orden = N.Orden
|
|
FROM dbo.Tra_SolicitudesAccionesPendientes AS A
|
|
INNER JOIN #Acciones AS N ON N.CveSolicitud = A.CveSolicitud
|
|
AND N.TipoAccion = A.TipoAccion
|
|
AND N.CveReferencia = A.CveReferencia;
|
|
INSERT INTO dbo.Tra_SolicitudesAccionesPendientes (CveSolicitud, TipoAccion, CveReferencia, Descripcion, VisibleCliente, Orden)
|
|
SELECT N.CveSolicitud,
|
|
N.TipoAccion,
|
|
N.CveReferencia,
|
|
N.Descripcion,
|
|
N.VisibleCliente,
|
|
N.Orden
|
|
FROM #Acciones AS N
|
|
WHERE NOT EXISTS (SELECT 1
|
|
FROM dbo.Tra_SolicitudesAccionesPendientes AS A
|
|
WHERE A.CveSolicitud = N.CveSolicitud
|
|
AND A.TipoAccion = N.TipoAccion
|
|
AND A.CveReferencia = N.CveReferencia);
|
|
SET @Return = 1;
|
|
END TRY
|
|
BEGIN CATCH
|
|
SELECT @ErrorMostrar = 'No fue posible actualizar o consultar el seguimiento de solicitudes; contacte a Sistemas.',
|
|
@ErrorTipo = 1,
|
|
@Return = 0;
|
|
DECLARE @ErrorTecnico AS NVARCHAR (2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE (ERROR_PROCEDURE(), 'PA_Tra_SolicitudProcesoActualizar'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
|
|
RAISERROR (N'%s', 10, 1, @ErrorTecnico);
|
|
END CATCH
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER VIEW [dbo].[Vta_SaldosFavor]
|
|
AS
|
|
SELECT P.[CvePago],
|
|
P.[CveCliente],
|
|
P.[CveVenta],
|
|
P.[CveMoneda],
|
|
P.[Importe] AS [ImporteRecibido],
|
|
ISNULL(SUM(CASE WHEN A.[EsActivo] = (1) THEN A.[Importe] ELSE (0) END), (0)) AS [ImporteAplicado],
|
|
P.[Importe] - ISNULL(SUM(CASE WHEN A.[EsActivo] = (1) THEN A.[Importe] ELSE (0) END), (0)) AS [SaldoDisponible]
|
|
FROM [dbo].[Tra_Pagos] AS P
|
|
LEFT OUTER JOIN [dbo].[Vta_AplicacionesSaldoFavor] AS A ON A.[CvePagoOrigen] = P.[CvePago]
|
|
WHERE P.[EsSaldoFavor] = (1)
|
|
AND P.[EsActivo] = (1)
|
|
GROUP BY P.[CvePago], P.[CveCliente], P.[CveVenta], P.[CveMoneda], P.[Importe];
|
|
GO
|
|
|