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

1171 lines
40 KiB
Transact-SQL

SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
GO
DECLARE @Permisos TABLE
(
CodigoPermiso varchar(100) COLLATE Modern_Spanish_CI_AS NOT NULL,
NombrePermiso varchar(150) NOT NULL,
Descripcion varchar(300) NOT NULL
);
INSERT INTO @Permisos
(CodigoPermiso, NombrePermiso, Descripcion)
VALUES
('Ventas.Tramites.AgregarConceptos', 'Agregar conceptos a ventas de trámites', 'Permite agregar productos o servicios a una venta de trámite antes de timbrarla.'),
('Ventas.Tramites.ModificarConceptos', 'Modificar conceptos de ventas de trámites', 'Permite modificar la cantidad y el precio unitario de los conceptos antes de timbrar la venta.'),
('Ventas.Tramites.EliminarConceptos', 'Eliminar conceptos de ventas de trámites', 'Permite quitar productos o servicios de una venta de trámite antes de timbrarla.'),
('Ventas.Tramites.Timbrar', 'Timbrar ventas de trámites', 'Permite timbrar una venta de trámite pagada.'),
('Ventas.Tramites.CancelarTimbre', 'Cancelar timbres de ventas de trámites', 'Permite solicitar al PAC la cancelación del timbre vigente de una venta de trámite.');
INSERT INTO dbo.Sis_Permisos
(
CodigoPermiso,
NombrePermiso,
Descripcion,
Activo,
FechaCreacion
)
SELECT
P.CodigoPermiso,
P.NombrePermiso,
P.Descripcion,
1,
GETDATE()
FROM @Permisos AS P
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Sis_Permisos AS Existente
WHERE Existente.CodigoPermiso = P.CodigoPermiso
);
UPDATE Existente
SET
NombrePermiso = P.NombrePermiso,
Descripcion = P.Descripcion,
Activo = 1,
FechaActualizacion = GETDATE()
FROM dbo.Sis_Permisos AS Existente
INNER JOIN @Permisos AS P
ON P.CodigoPermiso = Existente.CodigoPermiso;
INSERT INTO dbo.Sis_RolesPermisos
(
CveRol,
CvePermiso,
Permitido,
FechaCreacion
)
SELECT
R.CveRol,
P.CvePermiso,
1,
GETDATE()
FROM dbo.Sis_Roles AS R
CROSS JOIN dbo.Sis_Permisos AS P
WHERE R.CveRol IN (1, 2)
AND P.CodigoPermiso IN
(
'Ventas.Tramites.ModificarConceptos',
'Ventas.Tramites.AgregarConceptos',
'Ventas.Tramites.EliminarConceptos',
'Ventas.Tramites.Timbrar',
'Ventas.Tramites.CancelarTimbre'
)
AND NOT EXISTS
(
SELECT 1
FROM dbo.Sis_RolesPermisos AS RP
WHERE RP.CveRol = R.CveRol
AND RP.CvePermiso = P.CvePermiso
);
GO
IF OBJECT_ID(N'dbo.Fac_CfdiCancelaciones', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Fac_CfdiCancelaciones
(
CveCfdiCancelacion bigint IDENTITY(1, 1) NOT NULL,
CveCfdiDocumento bigint NOT NULL,
CveCfdiTimbrado bigint NOT NULL,
IdSolicitud uniqueidentifier NOT NULL,
ProveedorPac varchar(50) NOT NULL,
Ambiente varchar(20) NOT NULL,
Motivo varchar(2) NOT NULL,
UuidSustitucion varchar(36) NULL,
Estado varchar(20) NOT NULL,
Exitoso bit NOT NULL,
CodigoRespuesta varchar(100) NULL,
MensajeRespuesta varchar(2000) NULL,
TipoExcepcion varchar(300) NULL,
FechaSolicitud datetime2(0) NOT NULL,
FechaRespuesta datetime2(0) NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_Fac_CfdiCancelaciones
PRIMARY KEY CLUSTERED (CveCfdiCancelacion),
CONSTRAINT UQ_Fac_CfdiCancelaciones_IdSolicitud
UNIQUE NONCLUSTERED (IdSolicitud),
CONSTRAINT FK_Fac_CfdiCancelaciones_Documentos
FOREIGN KEY (CveCfdiDocumento)
REFERENCES dbo.Fac_CfdiDocumentos (CveCfdiDocumento),
CONSTRAINT FK_Fac_CfdiCancelaciones_Timbrados
FOREIGN KEY (CveCfdiTimbrado)
REFERENCES dbo.Fac_CfdiTimbrados (CveCfdiTimbrado),
CONSTRAINT FK_Fac_CfdiCancelaciones_Usuarios
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario),
CONSTRAINT CK_Fac_CfdiCancelaciones_Motivo
CHECK (Motivo IN ('01', '02', '03', '04'))
);
CREATE NONCLUSTERED INDEX IX_Fac_CfdiCancelaciones_Documento_Fecha
ON dbo.Fac_CfdiCancelaciones
(
CveCfdiDocumento,
FechaSolicitud DESC,
CveCfdiCancelacion DESC
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiCancelacionAttemptStart
@CveCfdiDocumento bigint,
@IdSolicitud uniqueidentifier,
@ProveedorPac varchar(50),
@Ambiente varchar(20),
@Motivo varchar(2),
@UuidSustitucion varchar(36) = 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 @CveCfdiTimbrado bigint;
DECLARE @RfcEmisor varchar(13);
DECLARE @Uuid varchar(36);
DECLARE @CveCfdiCancelacion bigint;
IF @Motivo NOT IN ('01', '02', '03', '04')
BEGIN
SELECT @ErrorMostrar = 'Seleccione un motivo de cancelación válido.', @ErrorTipo = 2;
RETURN;
END;
IF @Motivo = '01' AND NULLIF(LTRIM(RTRIM(@UuidSustitucion)), '') IS NULL
BEGIN
SELECT @ErrorMostrar = 'Capture el UUID que sustituirá al timbre cancelado.', @ErrorTipo = 2;
RETURN;
END;
SELECT
@CveCfdiTimbrado = D.CveCfdiTimbradoVigente,
@RfcEmisor = D.RfcEmisor,
@Uuid = T.Uuid
FROM dbo.Fac_CfdiDocumentos AS D WITH (UPDLOCK, HOLDLOCK)
INNER JOIN dbo.Fac_CfdiTimbrados AS T
ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
WHERE D.CveCfdiDocumento = @CveCfdiDocumento
AND D.Estado = 'TIMBRADO'
AND T.Exitoso = 1;
IF @CveCfdiTimbrado IS NULL OR NULLIF(@Uuid, '') IS NULL
BEGIN
SELECT @ErrorMostrar = 'El CFDI no tiene un timbre vigente para cancelar.', @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiCancelaciones
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND Exitoso = 1
)
BEGIN
SELECT @ErrorMostrar = 'El timbre ya fue cancelado.', @ErrorTipo = 2;
RETURN;
END;
SELECT @CveCfdiCancelacion = CveCfdiCancelacion
FROM dbo.Fac_CfdiCancelaciones
WHERE IdSolicitud = @IdSolicitud;
IF @CveCfdiCancelacion IS NULL
BEGIN
INSERT INTO dbo.Fac_CfdiCancelaciones
(
CveCfdiDocumento,
CveCfdiTimbrado,
IdSolicitud,
ProveedorPac,
Ambiente,
Motivo,
UuidSustitucion,
Estado,
Exitoso,
FechaSolicitud,
CveUsuario
)
VALUES
(
@CveCfdiDocumento,
@CveCfdiTimbrado,
@IdSolicitud,
@ProveedorPac,
@Ambiente,
@Motivo,
NULLIF(LTRIM(RTRIM(@UuidSustitucion)), ''),
'PENDIENTE',
0,
SYSDATETIME(),
@CveUsuarioEjecuta
);
SET @CveCfdiCancelacion = CONVERT(bigint, SCOPE_IDENTITY());
END;
SELECT
@CveCfdiCancelacion AS CveCfdiCancelacion,
@CveCfdiDocumento AS CveCfdiDocumento,
@CveCfdiTimbrado AS CveCfdiTimbrado,
@IdSolicitud AS IdSolicitud,
@RfcEmisor AS RfcEmisor,
@Uuid AS Uuid,
@Motivo AS Motivo,
NULLIF(LTRIM(RTRIM(@UuidSustitucion)), '') AS UuidSustitucion,
CONVERT(bit, 1) AS PuedeEnviar;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'Ocurrió un error al iniciar la cancelación del CFDI; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_CfdiCancelacionAttemptStart'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiCancelacionAttemptComplete
@CveCfdiCancelacion bigint,
@Exitoso bit,
@ResultadoIndeterminado bit,
@CodigoRespuesta varchar(100) = NULL,
@MensajeRespuesta varchar(2000) = NULL,
@TipoExcepcion varchar(300) = 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 @CveCfdiDocumento bigint;
DECLARE @Estado varchar(20) =
CASE
WHEN @Exitoso = 1 THEN 'EXITOSO'
WHEN @ResultadoIndeterminado = 1 THEN 'INDETERMINADO'
ELSE 'FALLIDO'
END;
SELECT @CveCfdiDocumento = CveCfdiDocumento
FROM dbo.Fac_CfdiCancelaciones WITH (UPDLOCK, HOLDLOCK)
WHERE CveCfdiCancelacion = @CveCfdiCancelacion
AND Estado = 'PENDIENTE';
IF @CveCfdiDocumento IS NULL
BEGIN
SELECT @ErrorMostrar = 'El intento de cancelación no existe o ya fue finalizado.', @ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Fac_CfdiCancelaciones
SET
Estado = @Estado,
Exitoso = @Exitoso,
CodigoRespuesta = NULLIF(LTRIM(RTRIM(@CodigoRespuesta)), ''),
MensajeRespuesta = NULLIF(LTRIM(RTRIM(@MensajeRespuesta)), ''),
TipoExcepcion = NULLIF(LTRIM(RTRIM(@TipoExcepcion)), ''),
FechaRespuesta = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiCancelacion = @CveCfdiCancelacion;
IF @Exitoso = 1
BEGIN
UPDATE dbo.Fac_CfdiDocumentos
SET
Estado = 'CANCELADO',
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiDocumento = @CveCfdiDocumento;
END;
SELECT
@CveCfdiDocumento AS CveCfdiDocumento,
@CveCfdiCancelacion AS CveCfdiCancelacion,
@Exitoso AS CancelacionExitosa,
@Estado AS Estado,
@CodigoRespuesta AS CodigoRespuesta,
@MensajeRespuesta AS Mensaje;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'El PAC respondió, pero no fue posible guardar la cancelación; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_CfdiCancelacionAttemptComplete'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaTimbreCanceladoUpdate
@CveVenta int,
@CveCfdiDocumento bigint,
@Motivo varchar(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 NOT EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND TipoOrigen = 'VENTA'
AND CveOrigen = @CveVenta
AND Estado = 'CANCELADO'
)
BEGIN
SELECT @ErrorMostrar = 'La cancelación del CFDI no corresponde a la venta.', @ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Ventas
SET
SeTimbro = 0,
MotivoCancelacion = @Motivo,
FechaCancelacion = GETDATE(),
EstadoCancelacion = 'CANCELADO',
CveUsuarioModifico = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'El timbre fue cancelado, pero no fue posible actualizar la venta; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaTimbreCanceladoUpdate'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteContextoGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveSubProyecto int =
(
SELECT TOP (1) CveSubProyecto
FROM dbo.SubProyectos
WHERE Estatus = 1
ORDER BY CASE WHEN Serie = 'TRA' THEN 0 ELSE 1 END, CveSubProyecto
);
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_Solicitudes AS S
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
WHERE S.CveSolicitud = @CveSolicitud
)
BEGIN
SELECT @ErrorMostrar = 'El pago seleccionado no corresponde al trámite o no tiene conceptos activos.', @ErrorTipo = 2;
RETURN;
END;
SELECT
S.CveSolicitud,
P.CveTramitePago,
SP.CveVenta,
VP.CvePago,
CONVERT(bit, CASE WHEN SP.CveSolicitudPago IS NOT NULL AND V.CveVenta IS NOT NULL THEN 1 ELSE 0 END) AS VentaGenerada,
CONVERT(bit, CASE WHEN VP.CvePago IS NOT NULL 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_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
INNER JOIN dbo.Clientes AS C
ON C.CveCliente = F.CveCliente
LEFT JOIN dbo.Tra_SolicitudesPagos AS SP
ON SP.CveSolicitud = S.CveSolicitud
AND SP.CveTramitePago = P.CveTramitePago
LEFT JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
OUTER APPLY
(
SELECT TOP (1) Pago.CvePago
FROM dbo.Vta_Pagos AS Pago
WHERE Pago.CveVenta = V.CveVenta
AND Pago.CveSolicitud = S.CveSolicitud
AND Pago.CveTramitePago = P.CveTramitePago
AND Pago.EsActivo = 1
ORDER BY Pago.CvePago DESC
) AS VP
OUTER APPLY
(
SELECT TOP (1)
D.CveCfdiDocumento,
D.Estado,
T.Uuid
FROM dbo.Fac_CfdiDocumentos AS D
LEFT JOIN dbo.Fac_CfdiTimbrados AS T
ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado IN ('TIMBRADO', 'CANCELADO')
ORDER BY D.CveCfdiDocumento DESC
) AS Documento
WHERE S.CveSolicitud = @CveSolicitud;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'Ocurrió un error al consultar la venta del trámite; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteContextoGet'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaTimbradaUpdate
@CveVenta int,
@CveCfdiDocumento bigint,
@Uuid varchar(36),
@FechaTimbrado datetime = 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 NOT EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND TipoOrigen = 'VENTA'
AND CveOrigen = @CveVenta
AND Estado = 'TIMBRADO'
AND CveCfdiTimbradoVigente IS NOT NULL
)
BEGIN
SELECT @ErrorMostrar = 'El CFDI timbrado no corresponde a la venta.', @ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Ventas
SET
SeTimbro = 1,
FolioFiscal = @Uuid,
FechaTimbrado = ISNULL(@FechaTimbrado, GETDATE()),
MotivoCancelacion = NULL,
FechaCancelacion = NULL,
EstadoCancelacion = NULL,
CveUsuarioModifico = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'El timbre fue emitido, pero no fue posible actualizar la venta; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaTimbradaUpdate'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaTotalesUpdate
@CveVenta 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 @SubTotal decimal(18, 2);
DECLARE @Descuento decimal(18, 2);
DECLARE @IVA decimal(18, 2);
DECLARE @Total decimal(18, 2);
SELECT
@SubTotal = CONVERT(decimal(18, 2), SUM(Importe)),
@Descuento = CONVERT(decimal(18, 2), SUM(Descuento)),
@IVA = CONVERT(decimal(18, 2), SUM(IVA))
FROM dbo.VentasDetalle
WHERE CveVenta = @CveVenta;
IF @SubTotal IS NULL
BEGIN
SELECT @ErrorMostrar = 'La venta debe conservar al menos un concepto.', @ErrorTipo = 2;
RETURN;
END;
SET @Descuento = ISNULL(@Descuento, 0);
SET @IVA = ISNULL(@IVA, 0);
SET @Total = CONVERT(
decimal(18, 2),
ROUND(@SubTotal - @Descuento + @IVA, 2));
UPDATE dbo.Ventas
SET
SubTotal = @SubTotal,
Descuento = @Descuento,
IVA = @IVA,
Total = @Total,
CveUsuarioModifico = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
UPDATE dbo.Vta_Pagos
SET Importe = @Total
WHERE CveVenta = @CveVenta
AND EsActivo = 1;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'Ocurrió un error al actualizar los totales de la venta; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaTotalesUpdate'), '; 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
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT @ErrorMostrar = 'Primero debe generar la venta del trámite.', @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas AS V
WHERE V.CveVenta = @CveVenta
AND
(
V.SeTimbro = 1
OR EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado = 'TIMBRADO'
AND D.CveCfdiTimbradoVigente IS NOT NULL
)
)
)
BEGIN
SELECT @ErrorMostrar = 'No se pueden eliminar 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;
DELETE FROM dbo.VentasDetalle
WHERE CveVentaDetalle = @CveVentaDetalle;
EXEC 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 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_TramiteVentaDatosCfdiGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT @ErrorMostrar = 'Primero debe generar la venta del trámite.', @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas
WHERE CveVenta = @CveVenta
AND SeTimbro = 1
)
BEGIN
SELECT @ErrorMostrar = 'La venta ya se encuentra timbrada.', @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE TipoOrigen = 'VENTA'
AND CveOrigen = @CveVenta
AND Estado = 'REVISAR'
)
BEGIN
SELECT
@ErrorMostrar = 'Existe un intento de timbrado con resultado indeterminado; debe revisarse antes de volver a timbrar.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
V.CveVenta,
Borrador.CveCfdiDocumento,
V.CveCliente,
V.Serie,
V.Folio,
V.Fecha,
FP.ClaveFormaPagoSAT AS FormaPago,
MP.ClaveMetodoPagoSAT AS MetodoPago,
M.AbreviaturaSAT AS Moneda,
CONVERT(decimal(19, 6), V.TipoCambio) AS TipoCambio
FROM dbo.Ventas AS V
LEFT JOIN dbo.Vta_FormaPago AS FP
ON FP.CveFormaPago = V.FormaPago
LEFT JOIN dbo.Vta_MetodoPago AS MP
ON MP.CveMetodoPago = V.CveMetodoPago
INNER JOIN dbo.Gral_Monedas AS M
ON M.CveMoneda = V.CveMoneda
OUTER APPLY
(
SELECT TOP (1) D.CveCfdiDocumento
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.CveCfdiTimbradoVigente IS NULL
AND D.Estado IN ('BORRADOR', 'LISTO', 'ERROR')
ORDER BY D.CveCfdiDocumento DESC
) AS Borrador
WHERE V.CveVenta = @CveVenta;
SELECT
SATPS.SATClavePS AS ClaveProductoServicio,
PS.Codigo AS NumeroIdentificacion,
VD.Cantidad,
SATUM.SATClaveUnidadMedida AS ClaveUnidad,
UM.UnidadMedida AS Unidad,
PS.PS AS Descripcion,
VD.PrecioUnitario AS ValorUnitario,
VD.PrecioUnitario AS PU,
VD.Importe AS Total,
VD.Descuento,
OI.CodigoObjetoImpuesto AS ObjetoImpuesto,
CONVERT(
decimal(19, 6),
VD.Importe - VD.Descuento
) AS BaseIVA,
CONVERT(decimal(19, 6), 0.16) AS TasaIVA,
CONVERT(decimal(19, 6), VD.IVA) AS ImporteIVA,
CONVERT(decimal(19, 6), 0.16) AS PorcentajeIVA
FROM dbo.VentasDetalle AS VD
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = VD.CvePS
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
LEFT JOIN dbo.Gral_SAT_ProductosServicios AS SATPS
ON SATPS.CveSATPS = PS.CveSATPS
LEFT JOIN dbo.Gral_SAT_UnidadesMedida AS SATUM
ON SATUM.CveSATUnidadMedida = UM.CveSATUnidadMedida
LEFT JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE VD.CveVenta = @CveVenta
ORDER BY VD.CveVentaDetalle;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT @ErrorMostrar = 'Ocurrió un error al preparar los datos fiscales de la venta; favor de contactar a Sistemas.', @ErrorTipo = 1, @Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT('Número: ', ERROR_NUMBER(), '; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Vta_TramiteVentaDatosCfdiGet'), '; Línea: ', ERROR_LINE(), '; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_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 int;
DECLARE @PorcentajeIVA decimal(9, 6) = 0.16;
SELECT @CveVenta = SP.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS 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_Pagos AS P
ON P.CveTramitePago = @CveTramitePago
AND P.CveTipoTramite = S.CveTipoTramite
AND P.EsActivo = 1
INNER JOIN dbo.Tra_PagosDetalle AS D
ON D.CveTramitePago = P.CveTramitePago
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 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
DECLARE @CveVenta int;
DECLARE @PorcentajeIVA decimal(9, 6) = 0.16;
DECLARE @Descuento decimal(18, 2) = 0;
DECLARE @IVA decimal(18, 2);
DECLARE @Importe decimal(18, 2);
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT @ErrorMostrar = 'Primero debe generar la venta del trámite.', @ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas AS V
WHERE V.CveVenta = @CveVenta
AND V.SeTimbro = 1
)
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;
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;
SET @IVA = CONVERT(
decimal(18, 2),
ROUND((@Importe - @Descuento) * @PorcentajeIVA, 2));
IF @CveVentaDetalle IS NULL
BEGIN
INSERT INTO dbo.VentasDetalle
(
CveVenta,
CvePS,
CveSolicitud,
CveCostoTramite,
Cantidad,
PrecioUnitario,
Descuento,
IVA,
Importe,
EsFondoInicial,
FechaAlta,
CveUsuario
)
VALUES
(
@CveVenta,
@CvePS,
@CveSolicitud,
NULL,
@Cantidad,
@PrecioUnitario,
0,
@IVA,
@Importe,
0,
GETDATE(),
@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;
UPDATE dbo.VentasDetalle
SET
CvePS = @CvePS,
Cantidad = @Cantidad,
PrecioUnitario = @PrecioUnitario,
IVA = @IVA,
Importe = @Importe,
CveUsuario = @CveUsuarioEjecuta
WHERE CveVentaDetalle = @CveVentaDetalle;
END;
EXEC 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 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