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

2825 lines
84 KiB
Transact-SQL

SET NOCOUNT ON;
GO
UPDATE dbo.ProductosServicios
SET CveObjetoImpuesto = 2,
IVA = NULL
WHERE CvePS = 9;
GO
IF COL_LENGTH(N'dbo.Tra_CostosTramite', N'CveObjetoImpuesto') IS NULL
BEGIN
EXEC sys.sp_executesql N'
ALTER TABLE dbo.Tra_CostosTramite
ADD CveObjetoImpuesto tinyint NULL;';
END;
GO
UPDATE CT
SET CveObjetoImpuesto = ISNULL(PS.CveObjetoImpuesto, 1)
FROM dbo.Tra_CostosTramite AS CT
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = CT.CvePS
WHERE CT.CveObjetoImpuesto IS NULL;
GO
IF EXISTS
(
SELECT 1
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.Tra_CostosTramite')
AND name = N'CveObjetoImpuesto'
AND is_nullable = 1
)
BEGIN
UPDATE dbo.Tra_CostosTramite
SET CveObjetoImpuesto = 1
WHERE CveObjetoImpuesto IS NULL;
ALTER TABLE dbo.Tra_CostosTramite
ALTER COLUMN CveObjetoImpuesto tinyint NOT NULL;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.Tra_CostosTramite')
AND name = N'DF_Tra_CostosTramite_CveObjetoImpuesto'
)
BEGIN
ALTER TABLE dbo.Tra_CostosTramite
ADD CONSTRAINT DF_Tra_CostosTramite_CveObjetoImpuesto
DEFAULT (1) FOR CveObjetoImpuesto;
END;
GO
IF OBJECT_ID(N'dbo.Tra_CostosTramiteImpuestos', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Tra_CostosTramiteImpuestos
(
CveCostoTramiteImpuesto int IDENTITY(1, 1) NOT NULL,
CveCostoTramite int NOT NULL,
EsRetencion bit CONSTRAINT DF_Tra_CostosTramiteImpuestos_EsRetencion
DEFAULT (0) NOT NULL,
Impuesto varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoFactor varchar(6) COLLATE Modern_Spanish_CS_AS NOT NULL,
TasaOCuota decimal(19, 6) NULL,
FechaAlta datetime CONSTRAINT DF_Tra_CostosTramiteImpuestos_FechaAlta
DEFAULT (GETDATE()) NOT NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_Tra_CostosTramiteImpuestos
PRIMARY KEY CLUSTERED (CveCostoTramiteImpuesto),
CONSTRAINT FK_Tra_CostosTramiteImpuestos_Costo
FOREIGN KEY (CveCostoTramite)
REFERENCES dbo.Tra_CostosTramite (CveCostoTramite),
CONSTRAINT FK_Tra_CostosTramiteImpuestos_Usuario
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario),
CONSTRAINT CK_Tra_CostosTramiteImpuestos_TipoFactor
CHECK (TipoFactor IN ('Tasa', 'Cuota', 'Exento')),
CONSTRAINT CK_Tra_CostosTramiteImpuestos_Tasa
CHECK
(
(TipoFactor = 'Exento' AND TasaOCuota IS NULL)
OR
(TipoFactor <> 'Exento' AND TasaOCuota >= 0)
)
);
CREATE UNIQUE NONCLUSTERED INDEX
UX_Tra_CostosTramiteImpuestos_Configuracion
ON dbo.Tra_CostosTramiteImpuestos
(
CveCostoTramite,
EsRetencion,
Impuesto,
TipoFactor,
TasaOCuota
);
END;
GO
IF COL_LENGTH(N'dbo.VentasDetalle', N'CveObjetoImpuesto') IS NULL
BEGIN
EXEC sys.sp_executesql N'
ALTER TABLE dbo.VentasDetalle
ADD CveObjetoImpuesto tinyint NULL;';
END;
GO
UPDATE VD
SET CveObjetoImpuesto = COALESCE(
CT.CveObjetoImpuesto,
PS.CveObjetoImpuesto,
1)
FROM dbo.VentasDetalle AS VD
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = VD.CvePS
LEFT JOIN dbo.Tra_CostosTramite AS CT
ON CT.CveCostoTramite = VD.CveCostoTramite
WHERE VD.CveObjetoImpuesto IS NULL;
GO
IF EXISTS
(
SELECT 1
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.VentasDetalle')
AND name = N'CveObjetoImpuesto'
AND is_nullable = 1
)
BEGIN
UPDATE dbo.VentasDetalle
SET CveObjetoImpuesto = 1
WHERE CveObjetoImpuesto IS NULL;
ALTER TABLE dbo.VentasDetalle
ALTER COLUMN CveObjetoImpuesto tinyint NOT NULL;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.VentasDetalle')
AND name = N'DF_VentasDetalle_CveObjetoImpuesto'
)
BEGIN
ALTER TABLE dbo.VentasDetalle
ADD CONSTRAINT DF_VentasDetalle_CveObjetoImpuesto
DEFAULT (1) FOR CveObjetoImpuesto;
END;
GO
IF OBJECT_ID(N'dbo.VentasDetalleImpuestos', N'U') IS NULL
BEGIN
CREATE TABLE dbo.VentasDetalleImpuestos
(
CveVentaDetalleImpuesto int IDENTITY(1, 1) NOT NULL,
CveVentaDetalle int NOT NULL,
EsRetencion bit CONSTRAINT DF_VentasDetalleImpuestos_EsRetencion
DEFAULT (0) NOT NULL,
Base decimal(19, 6) NOT NULL,
Impuesto varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoFactor varchar(6) COLLATE Modern_Spanish_CS_AS NOT NULL,
TasaOCuota decimal(19, 6) NULL,
Importe decimal(18, 2) CONSTRAINT DF_VentasDetalleImpuestos_Importe
DEFAULT (0) NOT NULL,
FechaAlta datetime CONSTRAINT DF_VentasDetalleImpuestos_FechaAlta
DEFAULT (GETDATE()) NOT NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_VentasDetalleImpuestos
PRIMARY KEY CLUSTERED (CveVentaDetalleImpuesto),
CONSTRAINT FK_VentasDetalleImpuestos_VentaDetalle
FOREIGN KEY (CveVentaDetalle)
REFERENCES dbo.VentasDetalle (CveVentaDetalle),
CONSTRAINT FK_VentasDetalleImpuestos_Usuario
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario),
CONSTRAINT CK_VentasDetalleImpuestos_Importes
CHECK (Base >= 0 AND Importe >= 0),
CONSTRAINT CK_VentasDetalleImpuestos_TipoFactor
CHECK (TipoFactor IN ('Tasa', 'Cuota', 'Exento')),
CONSTRAINT CK_VentasDetalleImpuestos_Tasa
CHECK
(
(TipoFactor = 'Exento' AND TasaOCuota IS NULL)
OR
(TipoFactor <> 'Exento' AND TasaOCuota >= 0)
)
);
CREATE UNIQUE NONCLUSTERED INDEX
UX_VentasDetalleImpuestos_Configuracion
ON dbo.VentasDetalleImpuestos
(
CveVentaDetalle,
EsRetencion,
Impuesto,
TipoFactor,
TasaOCuota
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ProductoServicioList
@Texto varchar(200) = NULL,
@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
SET @Texto = NULLIF(LTRIM(RTRIM(@Texto)), '');
SELECT
PS.CvePS,
PS.CveUnidadMedida,
UM.UnidadMedida,
UM.Abreviatura,
PS.Codigo,
PS.PS,
CONVERT(decimal(18, 2), PS.Precio) AS Precio,
PS.CveObjetoImpuesto,
OI.CodigoObjetoImpuesto,
CONVERT(
decimal(9, 6),
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,
PS.Estado AS EsActivo
FROM dbo.ProductosServicios AS PS
LEFT JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE (@IncluirInactivos = 1 OR PS.Estado = 1)
AND
(
@Texto IS NULL
OR PS.Codigo LIKE '%' + @Texto + '%'
OR PS.PS LIKE '%' + @Texto + '%'
)
ORDER BY PS.PS, PS.Codigo;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar productos y servicios; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Tra_ProductoServicioList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Tra_ProductoServicioGet
@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
SELECT
PS.CvePS,
PS.CveUnidadMedida,
UM.UnidadMedida,
UM.Abreviatura,
PS.Codigo,
PS.PS,
CONVERT(decimal(18, 2), PS.Precio) AS Precio,
PS.CveObjetoImpuesto,
OI.CodigoObjetoImpuesto,
CONVERT(
decimal(9, 6),
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,
PS.Estado AS EsActivo
FROM dbo.ProductosServicios AS PS
LEFT JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE PS.CvePS = @CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el producto o servicio; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Tra_ProductoServicioGet'),
'; 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,
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,
CONVERT(
decimal(18, 2),
ROUND(
D.Cantidad
* COALESCE(Costo.Importe, PS.Precio),
2)
+ ROUND(
D.Cantidad
* COALESCE(Costo.Importe, PS.Precio)
* COALESCE(ImpuestoIVA.TasaOCuota, 0),
2)) AS Total
FROM dbo.Tra_PagosDetalle AS D
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = D.CveTramitePago
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = D.CvePS
LEFT 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 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
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,
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,
CONVERT(
decimal(18, 2),
ROUND(D.Cantidad * COALESCE(Costo.Importe, PS.Precio), 2)
+ ROUND(
D.Cantidad
* COALESCE(Costo.Importe, PS.Precio)
* COALESCE(ImpuestoIVA.TasaOCuota, 0),
2)) AS Total
FROM dbo.Tra_PagosDetalle AS D
INNER JOIN dbo.Tra_Pagos AS P
ON P.CveTramitePago = D.CveTramitePago
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = D.CvePS
LEFT 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 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
/*
Configuración fiscal versionada para costos de trámites y fotografía de
impuestos por concepto de venta.
Este script no administra transacciones. La transacción de las operaciones
de la aplicación permanece en los servicios C#.
*/
UPDATE dbo.ProductosServicios
SET CveObjetoImpuesto = 2,
IVA = NULL
WHERE CvePS = 9;
GO
IF COL_LENGTH(N'dbo.Tra_CostosTramite', N'CveObjetoImpuesto') IS NULL
BEGIN
ALTER TABLE dbo.Tra_CostosTramite
ADD CveObjetoImpuesto tinyint NULL;
UPDATE CT
SET CveObjetoImpuesto = ISNULL(PS.CveObjetoImpuesto, 1)
FROM dbo.Tra_CostosTramite AS CT
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = CT.CvePS;
UPDATE dbo.Tra_CostosTramite
SET CveObjetoImpuesto = 1
WHERE CveObjetoImpuesto IS NULL;
ALTER TABLE dbo.Tra_CostosTramite
ALTER COLUMN CveObjetoImpuesto tinyint NOT NULL;
ALTER TABLE dbo.Tra_CostosTramite
ADD CONSTRAINT DF_Tra_CostosTramite_CveObjetoImpuesto
DEFAULT (1) FOR CveObjetoImpuesto;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys
WHERE parent_object_id = OBJECT_ID(N'dbo.Tra_CostosTramite')
AND name = N'FK_Tra_CostosTramite_Gral_ObjetoImpuesto'
)
BEGIN
ALTER TABLE dbo.Tra_CostosTramite WITH CHECK
ADD CONSTRAINT FK_Tra_CostosTramite_Gral_ObjetoImpuesto
FOREIGN KEY (CveObjetoImpuesto)
REFERENCES dbo.Gral_SAT_ObjetoImpuesto (CveObjetoImpuesto);
END;
GO
IF OBJECT_ID(N'dbo.Tra_CostosTramiteImpuestos', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Tra_CostosTramiteImpuestos
(
CveCostoTramiteImpuesto int IDENTITY(1, 1) NOT NULL,
CveCostoTramite int NOT NULL,
EsRetencion bit CONSTRAINT DF_Tra_CostosTramiteImpuestos_EsRetencion
DEFAULT (0) NOT NULL,
Impuesto varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoFactor varchar(6) COLLATE Modern_Spanish_CS_AS NOT NULL,
TasaOCuota decimal(19, 6) NULL,
FechaAlta datetime CONSTRAINT DF_Tra_CostosTramiteImpuestos_FechaAlta
DEFAULT (GETDATE()) NOT NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_Tra_CostosTramiteImpuestos
PRIMARY KEY CLUSTERED (CveCostoTramiteImpuesto),
CONSTRAINT FK_Tra_CostosTramiteImpuestos_Costo
FOREIGN KEY (CveCostoTramite)
REFERENCES dbo.Tra_CostosTramite (CveCostoTramite),
CONSTRAINT FK_Tra_CostosTramiteImpuestos_Usuario
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario),
CONSTRAINT CK_Tra_CostosTramiteImpuestos_TipoFactor
CHECK (TipoFactor IN ('Tasa', 'Cuota', 'Exento')),
CONSTRAINT CK_Tra_CostosTramiteImpuestos_Tasa
CHECK
(
(TipoFactor = 'Exento' AND TasaOCuota IS NULL)
OR
(TipoFactor <> 'Exento' AND TasaOCuota >= 0)
)
);
CREATE UNIQUE NONCLUSTERED INDEX
UX_Tra_CostosTramiteImpuestos_Configuracion
ON dbo.Tra_CostosTramiteImpuestos
(
CveCostoTramite,
EsRetencion,
Impuesto,
TipoFactor,
TasaOCuota
);
END;
GO
IF COL_LENGTH(N'dbo.VentasDetalle', N'CveObjetoImpuesto') IS NULL
BEGIN
ALTER TABLE dbo.VentasDetalle
ADD CveObjetoImpuesto tinyint NULL;
UPDATE VD
SET CveObjetoImpuesto = COALESCE(
CT.CveObjetoImpuesto,
PS.CveObjetoImpuesto,
1)
FROM dbo.VentasDetalle AS VD
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = VD.CvePS
LEFT JOIN dbo.Tra_CostosTramite AS CT
ON CT.CveCostoTramite = VD.CveCostoTramite;
UPDATE dbo.VentasDetalle
SET CveObjetoImpuesto = 1
WHERE CveObjetoImpuesto IS NULL;
ALTER TABLE dbo.VentasDetalle
ALTER COLUMN CveObjetoImpuesto tinyint NOT NULL;
ALTER TABLE dbo.VentasDetalle
ADD CONSTRAINT DF_VentasDetalle_CveObjetoImpuesto
DEFAULT (1) FOR CveObjetoImpuesto;
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys
WHERE parent_object_id = OBJECT_ID(N'dbo.VentasDetalle')
AND name = N'FK_VentasDetalle_Gral_ObjetoImpuesto'
)
BEGIN
ALTER TABLE dbo.VentasDetalle WITH CHECK
ADD CONSTRAINT FK_VentasDetalle_Gral_ObjetoImpuesto
FOREIGN KEY (CveObjetoImpuesto)
REFERENCES dbo.Gral_SAT_ObjetoImpuesto (CveObjetoImpuesto);
END;
GO
IF OBJECT_ID(N'dbo.VentasDetalleImpuestos', N'U') IS NULL
BEGIN
CREATE TABLE dbo.VentasDetalleImpuestos
(
CveVentaDetalleImpuesto int IDENTITY(1, 1) NOT NULL,
CveVentaDetalle int NOT NULL,
EsRetencion bit CONSTRAINT DF_VentasDetalleImpuestos_EsRetencion
DEFAULT (0) NOT NULL,
Base decimal(19, 6) NOT NULL,
Impuesto varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoFactor varchar(6) COLLATE Modern_Spanish_CS_AS NOT NULL,
TasaOCuota decimal(19, 6) NULL,
Importe decimal(18, 2) CONSTRAINT DF_VentasDetalleImpuestos_Importe
DEFAULT (0) NOT NULL,
FechaAlta datetime CONSTRAINT DF_VentasDetalleImpuestos_FechaAlta
DEFAULT (GETDATE()) NOT NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_VentasDetalleImpuestos
PRIMARY KEY CLUSTERED (CveVentaDetalleImpuesto),
CONSTRAINT FK_VentasDetalleImpuestos_VentaDetalle
FOREIGN KEY (CveVentaDetalle)
REFERENCES dbo.VentasDetalle (CveVentaDetalle),
CONSTRAINT FK_VentasDetalleImpuestos_Usuario
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario),
CONSTRAINT CK_VentasDetalleImpuestos_Importes
CHECK (Base >= 0 AND Importe >= 0),
CONSTRAINT CK_VentasDetalleImpuestos_TipoFactor
CHECK (TipoFactor IN ('Tasa', 'Cuota', 'Exento')),
CONSTRAINT CK_VentasDetalleImpuestos_Tasa
CHECK
(
(TipoFactor = 'Exento' AND TasaOCuota IS NULL)
OR
(TipoFactor <> 'Exento' AND TasaOCuota >= 0)
)
);
CREATE UNIQUE NONCLUSTERED INDEX
UX_VentasDetalleImpuestos_Configuracion
ON dbo.VentasDetalleImpuestos
(
CveVentaDetalle,
EsRetencion,
Impuesto,
TipoFactor,
TasaOCuota
);
END;
GO
UPDATE CT
SET CveObjetoImpuesto = 2
FROM dbo.Tra_CostosTramite AS CT
WHERE CT.CveCostoTramite = 11;
GO
INSERT dbo.Tra_CostosTramiteImpuestos
(
CveCostoTramite,
EsRetencion,
Impuesto,
TipoFactor,
TasaOCuota,
FechaAlta,
CveUsuario
)
SELECT
CT.CveCostoTramite,
0,
'002',
'Tasa',
CONVERT(
decimal(19, 6),
CASE
WHEN PS.IVA IS NULL OR PS.IVA = -1 THEN 0.16
ELSE PS.IVA
END),
GETDATE(),
CT.CveUsuario
FROM dbo.Tra_CostosTramite AS CT
INNER JOIN dbo.ProductosServicios AS PS
ON PS.CvePS = CT.CvePS
WHERE CT.CveObjetoImpuesto <> 1
AND CASE
WHEN PS.IVA IS NULL OR PS.IVA = -1 THEN 0.16
ELSE PS.IVA
END > 0
AND NOT EXISTS
(
SELECT 1
FROM dbo.Tra_CostosTramiteImpuestos AS CTI
WHERE CTI.CveCostoTramite = CT.CveCostoTramite
AND CTI.EsRetencion = 0
AND CTI.Impuesto = '002'
);
GO
DELETE dbo.VentasDetalleImpuestos
WHERE CveVentaDetalle = 6;
GO
UPDATE dbo.VentasDetalle
SET CveObjetoImpuesto = 2,
IVA = 320.00
WHERE CveVentaDetalle = 6
AND CveVenta = 1019;
GO
INSERT dbo.VentasDetalleImpuestos
(
CveVentaDetalle,
EsRetencion,
Base,
Impuesto,
TipoFactor,
TasaOCuota,
Importe,
FechaAlta,
CveUsuario
)
SELECT
VD.CveVentaDetalle,
0,
CONVERT(decimal(19, 6), VD.Importe - VD.Descuento),
'002',
'Tasa',
CONVERT(
decimal(19, 6),
CASE
WHEN VD.Importe - VD.Descuento = 0 THEN 0
ELSE VD.IVA / (VD.Importe - VD.Descuento)
END),
VD.IVA,
GETDATE(),
VD.CveUsuario
FROM dbo.VentasDetalle AS VD
WHERE VD.CveVentaDetalle = 6
AND VD.CveVenta = 1019;
GO
UPDATE dbo.Ventas
SET SubTotal = 2000.00,
Descuento = 0.00,
IVA = 320.00,
Total = 2320.00
WHERE CveVenta = 1019
AND EXISTS
(
SELECT 1
FROM dbo.VentasDetalle
WHERE CveVentaDetalle = 6
AND CveVenta = 1019
);
GO
DECLARE @CveTablaProductoServicio int;
SELECT @CveTablaProductoServicio = CveTabla
FROM dbo.Bit_Tablas
WHERE NombreTablaSQL = 'ProductosServicios'
COLLATE Modern_Spanish_CS_AS;
IF @CveTablaProductoServicio IS NOT NULL
BEGIN
DECLARE @CamposFiscalesProducto TABLE
(
NombreCampoSQL varchar(128) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreMostrar varchar(150) COLLATE Modern_Spanish_CS_AS NOT NULL
);
INSERT @CamposFiscalesProducto
(
NombreCampoSQL,
NombreMostrar
)
VALUES
('CveObjetoImpuesto', 'Objeto de impuesto'),
('IVA', 'Tratamiento de IVA');
UPDATE BC
SET NombreMostrar = C.NombreMostrar,
MostrarEnBitacora = 1,
TipoDatoSQL = TY.name COLLATE Modern_Spanish_CS_AS,
Activo = 1,
FechaMod = GETDATE()
FROM dbo.Bit_Campos AS BC
INNER JOIN @CamposFiscalesProducto AS C
ON C.NombreCampoSQL = BC.NombreCampoSQL
INNER JOIN sys.columns AS SC
ON SC.object_id = OBJECT_ID(N'dbo.ProductosServicios')
AND SC.name COLLATE Modern_Spanish_CS_AS = C.NombreCampoSQL
INNER JOIN sys.types AS TY
ON TY.user_type_id = SC.user_type_id
WHERE BC.CveTabla = @CveTablaProductoServicio;
INSERT dbo.Bit_Campos
(
CveTabla,
NombreCampoSQL,
NombreMostrar,
MostrarEnBitacora,
TipoDatoSQL,
Activo
)
SELECT
@CveTablaProductoServicio,
C.NombreCampoSQL,
C.NombreMostrar,
1,
TY.name COLLATE Modern_Spanish_CS_AS,
1
FROM @CamposFiscalesProducto AS C
INNER JOIN sys.columns AS SC
ON SC.object_id = OBJECT_ID(N'dbo.ProductosServicios')
AND SC.name COLLATE Modern_Spanish_CS_AS = C.NombreCampoSQL
INNER JOIN sys.types AS TY
ON TY.user_type_id = SC.user_type_id
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Bit_Campos AS BC
WHERE BC.CveTabla = @CveTablaProductoServicio
AND BC.NombreCampoSQL = C.NombreCampoSQL
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioList
@Texto varchar(200) = NULL,
@IncluirInactivos 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
SET @Texto = NULLIF(LTRIM(RTRIM(@Texto)), '');
SELECT
PS.CvePS,
PS.Codigo,
PS.PS,
PS.CveTipoPS,
CASE PS.CveTipoPS
WHEN 2 THEN 'Producto'
ELSE 'Servicio'
END AS TipoPS,
PS.CveClasificacion,
C.Clasificacion,
PS.CveUnidadMedida,
UM.UnidadMedida,
CONVERT(decimal(18, 2), PS.Precio) AS Precio,
PS.CveObjetoImpuesto,
OI.ObjetoImpuesto,
OI.CodigoObjetoImpuesto,
CONVERT(decimal(9, 6), PS.IVA) AS IVA,
CASE
WHEN PS.CveObjetoImpuesto = 1 THEN 'Sin IVA'
WHEN PS.IVA = 0 THEN 'Sin IVA'
ELSE 'IVA general'
END AS TratamientoIVA,
PS.Estado AS EsActivo
FROM dbo.ProductosServicios AS PS
INNER JOIN dbo.Clasificaciones AS C
ON C.CveClasificacion = PS.CveClasificacion
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE (@IncluirInactivos = 1 OR PS.Estado = 1)
AND
(
@Texto IS NULL
OR PS.Codigo LIKE '%' + @Texto + '%'
OR PS.PS LIKE '%' + @Texto + '%'
OR C.Clasificacion LIKE '%' + @Texto + '%'
OR UM.UnidadMedida LIKE '%' + @Texto + '%'
)
ORDER BY PS.PS, PS.CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los productos y servicios; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioGet
@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
SELECT
PS.CvePS,
PS.Codigo,
PS.PS,
PS.CveTipoPS,
CASE PS.CveTipoPS
WHEN 2 THEN 'Producto'
ELSE 'Servicio'
END AS TipoPS,
PS.CveClasificacion,
C.Clasificacion,
PS.CveUnidadMedida,
UM.UnidadMedida,
CONVERT(decimal(18, 2), PS.Precio) AS Precio,
PS.CveObjetoImpuesto,
OI.ObjetoImpuesto,
OI.CodigoObjetoImpuesto,
CONVERT(decimal(9, 6), PS.IVA) AS IVA,
CASE
WHEN PS.CveObjetoImpuesto = 1 THEN 'Sin IVA'
WHEN PS.IVA = 0 THEN 'Sin IVA'
ELSE 'IVA general'
END AS TratamientoIVA,
PS.Estado AS EsActivo
FROM dbo.ProductosServicios AS PS
INNER JOIN dbo.Clasificaciones AS C
ON C.CveClasificacion = PS.CveClasificacion
INNER JOIN dbo.UnidadesMedida AS UM
ON UM.CveUnidadMedida = PS.CveUnidadMedida
INNER JOIN dbo.Gral_SAT_ObjetoImpuesto AS OI
ON OI.CveObjetoImpuesto = PS.CveObjetoImpuesto
WHERE PS.CvePS = @CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el producto o servicio; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioOpcionesList
@CveClasificacionActual int = NULL,
@CveUnidadMedidaActual 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
SELECT
CveClasificacion,
CASE
WHEN NULLIF(LTRIM(RTRIM(Codigo)), '') IS NULL
THEN Clasificacion COLLATE Modern_Spanish_CS_AS
ELSE Codigo COLLATE Modern_Spanish_CS_AS
+ ' - '
+ Clasificacion COLLATE Modern_Spanish_CS_AS
END AS Clasificacion
FROM dbo.Clasificaciones
WHERE (Estado = 1 AND Afectable = 1)
OR CveClasificacion = @CveClasificacionActual
ORDER BY Clasificacion, Codigo, CveClasificacion;
SELECT
CveUnidadMedida,
CASE
WHEN NULLIF(LTRIM(RTRIM(Abreviatura)), '') IS NULL
THEN UnidadMedida COLLATE Modern_Spanish_CS_AS
ELSE UnidadMedida COLLATE Modern_Spanish_CS_AS
+ ' ('
+ Abreviatura COLLATE Modern_Spanish_CS_AS
+ ')'
END AS UnidadMedida
FROM dbo.UnidadesMedida
WHERE Estado = 1
OR CveUnidadMedida = @CveUnidadMedidaActual
ORDER BY UnidadMedida, CveUnidadMedida;
SELECT
CveObjetoImpuesto,
CodigoObjetoImpuesto COLLATE Modern_Spanish_CS_AS + ' - ' + ObjetoImpuesto AS ObjetoImpuesto
FROM dbo.Gral_SAT_ObjetoImpuesto
ORDER BY CodigoObjetoImpuesto;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar las opciones del catálogo; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioOpcionesList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Gral_ProductoServicioSave
@CvePS int = NULL,
@Codigo varchar(50) = NULL,
@PS varchar(846),
@CveTipoPS int,
@CveClasificacion int,
@CveUnidadMedida int,
@Precio decimal(18, 2),
@CveObjetoImpuesto tinyint,
@IVA decimal(9, 6) = NULL,
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
@CvePS = NULLIF(@CvePS, 0),
@Codigo = NULLIF(LTRIM(RTRIM(@Codigo)), ''),
@PS = LTRIM(RTRIM(@PS));
IF NULLIF(@PS, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture la descripción del producto o servicio.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveTipoPS NOT IN (1, 2)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione si el registro es producto o servicio.',
@ErrorTipo = 2;
RETURN;
END;
IF @Precio < 0
BEGIN
SELECT
@ErrorMostrar = 'El precio no puede ser negativo.',
@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 @IVA NOT IN (-1, 0) AND @IVA IS NOT NULL
BEGIN
SELECT
@ErrorMostrar = 'Seleccione IVA general o sin IVA.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveObjetoImpuesto = 1
SET @IVA = 0;
IF NOT EXISTS
(
SELECT 1
FROM dbo.Clasificaciones
WHERE CveClasificacion = @CveClasificacion
AND
(
Estado = 1
OR CveClasificacion =
(
SELECT CveClasificacion
FROM dbo.ProductosServicios
WHERE CvePS = @CvePS
)
)
)
OR NOT EXISTS
(
SELECT 1
FROM dbo.UnidadesMedida
WHERE CveUnidadMedida = @CveUnidadMedida
AND
(
Estado = 1
OR CveUnidadMedida =
(
SELECT CveUnidadMedida
FROM dbo.ProductosServicios
WHERE CvePS = @CvePS
)
)
)
BEGIN
SELECT
@ErrorMostrar = 'Seleccione una clasificación y una unidad de medida vigentes.',
@ErrorTipo = 2;
RETURN;
END;
IF @Codigo IS NOT NULL
AND EXISTS
(
SELECT 1
FROM dbo.ProductosServicios
WHERE Codigo = @Codigo
AND CvePS <> ISNULL(@CvePS, 0)
)
BEGIN
SELECT
@ErrorMostrar = 'El código ya está asignado a otro producto o servicio.',
@ErrorTipo = 2;
RETURN;
END;
IF @CvePS IS NULL
BEGIN
INSERT dbo.ProductosServicios
(
CveClasificacion,
CveUnidadMedida,
Codigo,
PS,
Precio,
Estado,
Fecha,
CveTipoPS,
CveObjetoImpuesto,
IVA,
CveUsuario,
CveUsuarioModifico,
FechaUltimaModificacion
)
VALUES
(
@CveClasificacion,
@CveUnidadMedida,
@Codigo,
@PS,
CONVERT(float, @Precio),
@EsActivo,
GETDATE(),
@CveTipoPS,
@CveObjetoImpuesto,
@IVA,
@CveUsuarioEjecuta,
@CveUsuarioEjecuta,
GETDATE()
);
SET @CvePS = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
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;
UPDATE dbo.ProductosServicios
SET CveClasificacion = @CveClasificacion,
CveUnidadMedida = @CveUnidadMedida,
Codigo = @Codigo,
PS = @PS,
Precio = CONVERT(float, @Precio),
Estado = @EsActivo,
CveTipoPS = @CveTipoPS,
CveObjetoImpuesto = @CveObjetoImpuesto,
IVA = @IVA,
CveUsuarioModifico = @CveUsuarioEjecuta,
FechaUltimaModificacion = GETDATE()
WHERE CvePS = @CvePS;
END;
SELECT @CvePS AS CvePS;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el producto o servicio; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) = CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Gral_ProductoServicioSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
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,
@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
@CveTipoTramite int,
@CveMoneda int,
@Descripcion varchar(300),
@PrecioProducto decimal(18, 2),
@CveCostoVigente int,
@CveCostoObjetivo int,
@FechaInicioVigente date,
@ImporteVigente decimal(18, 2),
@CveObjetoImpuestoVigente tinyint,
@PorcentajeIVAVigente decimal(9, 6);
SELECT
@CveTipoTramite = P.CveTipoTramite
FROM dbo.Tra_Pagos 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_PagosDetalle
(
CveTramitePago,
CvePS,
CveUM,
Cantidad,
FechaAlta,
CveUsuario
)
VALUES
(
@CveTramitePago,
@CvePS,
@CveUM,
@Cantidad,
GETDATE(),
@CveUsuarioEjecuta
);
SET @CveTramitePagoDetalle = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.Tra_PagosDetalle
WHERE CveTramitePagoDetalle = @CveTramitePagoDetalle
AND CveTramitePago = @CveTramitePago
)
BEGIN
SELECT
@ErrorMostrar = 'El concepto de pago seleccionado no existe.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Tra_PagosDetalle
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;
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 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_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),
@Descuento decimal(18, 2),
@IVA decimal(18, 2),
@IEPS decimal(18, 2),
@RetIVA decimal(18, 2),
@RetISR decimal(18, 2),
@Traslados decimal(18, 2),
@Retenciones decimal(18, 2),
@Total decimal(18, 2);
SELECT
@SubTotal = ISNULL(SUM(VD.Importe), 0),
@Descuento = ISNULL(SUM(VD.Descuento), 0)
FROM dbo.VentasDetalle AS VD
WHERE VD.CveVenta = @CveVenta;
SELECT
@IVA = ISNULL(SUM(
CASE
WHEN VDI.EsRetencion = 0 AND VDI.Impuesto = '002'
THEN VDI.Importe
ELSE 0
END), 0),
@IEPS = ISNULL(SUM(
CASE
WHEN VDI.EsRetencion = 0 AND VDI.Impuesto = '003'
THEN VDI.Importe
ELSE 0
END), 0),
@RetIVA = ISNULL(SUM(
CASE
WHEN VDI.EsRetencion = 1 AND VDI.Impuesto = '002'
THEN VDI.Importe
ELSE 0
END), 0),
@RetISR = ISNULL(SUM(
CASE
WHEN VDI.EsRetencion = 1 AND VDI.Impuesto = '001'
THEN VDI.Importe
ELSE 0
END), 0),
@Traslados = ISNULL(SUM(
CASE
WHEN VDI.EsRetencion = 0 THEN VDI.Importe
ELSE 0
END), 0),
@Retenciones = ISNULL(SUM(
CASE
WHEN VDI.EsRetencion = 1 THEN VDI.Importe
ELSE 0
END), 0)
FROM dbo.VentasDetalle AS VD
INNER JOIN dbo.VentasDetalleImpuestos AS VDI
ON VDI.CveVentaDetalle = VD.CveVentaDetalle
WHERE VD.CveVenta = @CveVenta;
SET @Total = ROUND(
@SubTotal
- @Descuento
+ @Traslados
- @Retenciones,
2);
UPDATE dbo.Ventas
SET SubTotal = @SubTotal,
Descuento = @Descuento,
IVA = @IVA,
IEPS = @IEPS,
RetIVA = @RetIVA,
RetISR = @RetISR,
Total = @Total,
CveUsuarioModifico = @CveUsuarioEjecuta
WHERE CveVenta = @CveVenta;
IF @@ROWCOUNT = 0
BEGIN
SELECT
@ErrorMostrar = 'La venta seleccionada no existe.',
@ErrorTipo = 2;
RETURN;
END;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al recalcular 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_TramiteVentaSave
@CveSolicitud int,
@CveTramitePago int,
@Observaciones varchar(2000) = NULL,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE
@CveVendedor int = 1,
@CveCliente int,
@CveTipoTramite int,
@CveSubProyecto int,
@CveEstatusFactura int,
@CveVenta int,
@Folio int,
@Fecha 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_Pagos 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_PagosDetalle
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_PagosDetalle 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_PagosDetalle 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_SolicitudesPagos WITH (UPDLOCK, HOLDLOCK)
WHERE CveSolicitud = @CveSolicitud
AND CveTramitePago = @CveTramitePago
)
BEGIN
SELECT
@ErrorMostrar = 'El pago seleccionado ya fue realizado.',
@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_PagosDetalle 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;
EXEC dbo.PA_Vta_TramiteVentaTotalesUpdate
@CveVenta = @CveVenta,
@CveUsuarioEjecuta = @CveUsuarioEjecuta,
@ErrorMostrar = @ErrorMostrar OUTPUT,
@ErrorTipo = @ErrorTipo OUTPUT,
@Return = @Return OUTPUT;
IF @Return = 0
RETURN;
INSERT dbo.Tra_SolicitudesPagos
(
CveSolicitud,
CveTramitePago,
CveVenta,
FechaAlta,
CveUsuario
)
VALUES
(
@CveSolicitud,
@CveTramitePago,
@CveVenta,
@Fecha,
@CveUsuarioEjecuta
);
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 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_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
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;
DELETE dbo.VentasDetalleImpuestos
WHERE CveVentaDetalle = @CveVentaDetalle;
DELETE dbo.VentasDetalle
WHERE CveVentaDetalle = @CveVentaDetalle
AND CveVenta = @CveVenta;
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_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,
@CveTipoTramite int,
@CveCostoTramite int,
@CveObjetoImpuesto tinyint,
@Descuento decimal(18, 2) = 0,
@IVA decimal(18, 2),
@Importe decimal(18, 2),
@Fecha datetime = GETDATE();
SELECT
@CveVenta = V.CveVenta,
@CveTipoTramite = S.CveTipoTramite
FROM dbo.Tra_SolicitudesPagos 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;
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
CREATE OR ALTER PROCEDURE dbo.PA_Vta_TramiteVentaDatosCfdiGet
@CveSolicitud int,
@CveTramitePago int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
DECLARE @CveVenta int;
SELECT @CveVenta = V.CveVenta
FROM dbo.Tra_SolicitudesPagos AS SP
INNER JOIN dbo.Ventas AS V
ON V.CveVenta = SP.CveVenta
WHERE SP.CveSolicitud = @CveSolicitud
AND SP.CveTramitePago = @CveTramitePago;
IF @CveVenta IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Primero debe generar la venta del trámite.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Ventas AS V
WHERE V.CveVenta = @CveVenta
AND
(
V.SeTimbro = 1
OR EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos AS D
WHERE D.TipoOrigen = 'VENTA'
AND D.CveOrigen = V.CveVenta
AND D.Estado = 'TIMBRADO'
AND D.CveCfdiTimbradoVigente IS NOT NULL
)
)
)
BEGIN
SELECT
@ErrorMostrar = 'La venta ya se encuentra timbrada.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE TipoOrigen = 'VENTA'
AND CveOrigen = @CveVenta
AND Estado = 'REVISAR'
)
BEGIN
SELECT
@ErrorMostrar = 'Existe un intento de timbrado con resultado indeterminado; debe revisarse antes de volver a timbrar.',
@ErrorTipo = 2;
RETURN;
END;
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 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
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 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
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 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