Files
Plataforma-de-desarrolladores/Facturacion_Cfdi_Timbrado.sql
Jorge Luis caudillo esparza 547ec5d45a timbrado OK
2026-09-02 01:00:23 -07:00

1450 lines
49 KiB
Transact-SQL

SET NOCOUNT ON;
GO
/*
Infraestructura de CFDI 4.0.
- Fac_EmisoresFiscales contiene datos fiscales y referencias de configuración.
Nunca almacena contraseñas de CSD, tokens ni credenciales del PAC.
- Fac_CfdiDocumentos conserva el XML previo al timbrado y una fotografía de
los datos fiscales usados al emitir.
- Fac_CfdiTimbrados conserva todos los intentos y respuestas. No existe una
restricción única sobre UUID porque la tabla debe evidenciar un doble timbrado.
- CveCfdiTimbradoVigente identifica el timbre adoptado por el documento padre.
- Los XML se guardan como varbinary(max) para conservar bytes recuperables.
*/
IF OBJECT_ID(N'dbo.Fac_EmisoresFiscales', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Fac_EmisoresFiscales
(
CveEmisorFiscal int IDENTITY(1, 1) NOT NULL,
CveEmpresa int NOT NULL,
Rfc varchar(13) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreFiscal varchar(300) COLLATE Modern_Spanish_CS_AS NOT NULL,
RegimenFiscal varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
CodigoPostal varchar(5) COLLATE Modern_Spanish_CI_AS NOT NULL,
ProveedorPac varchar(50) COLLATE Modern_Spanish_CS_AS NOT NULL,
AmbienteProduccion bit CONSTRAINT DF_Fac_EmisoresFiscales_Ambiente DEFAULT (0) NOT NULL,
ReferenciaCredencialPac varchar(100) COLLATE Modern_Spanish_CS_AS NOT NULL,
ReferenciaContratoPac varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
ReferenciaCertificadoCsd varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
ReferenciaLlavePrivadaCsd varchar(500) COLLATE Modern_Spanish_CS_AS NULL,
NumeroCertificado varchar(20) COLLATE Modern_Spanish_CS_AS NULL,
VigenciaCertificadoDesde datetime2(0) NULL,
VigenciaCertificadoHasta datetime2(0) NULL,
HuellaCertificado varchar(128) COLLATE Modern_Spanish_CS_AS NULL,
EsActivo bit CONSTRAINT DF_Fac_EmisoresFiscales_EsActivo DEFAULT (1) NOT NULL,
FechaAlta datetime2(0) CONSTRAINT DF_Fac_EmisoresFiscales_FechaAlta DEFAULT (SYSDATETIME()) NOT NULL,
FechaModificacion datetime2(0) NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_Fac_EmisoresFiscales
PRIMARY KEY CLUSTERED (CveEmisorFiscal),
CONSTRAINT UQ_Fac_EmisoresFiscales_Empresa
UNIQUE NONCLUSTERED (CveEmpresa),
CONSTRAINT CK_Fac_EmisoresFiscales_DatosFiscales
CHECK
(
LEN(Rfc) IN (12, 13)
AND LEN(RegimenFiscal) = 3
AND LEN(CodigoPostal) = 5
),
CONSTRAINT FK_Fac_EmisoresFiscales_Usuarios
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario)
);
END;
GO
IF EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.Fac_EmisoresFiscales')
AND name = N'CK_Fac_EmisoresFiscales_Rfc'
)
ALTER TABLE dbo.Fac_EmisoresFiscales DROP CONSTRAINT CK_Fac_EmisoresFiscales_Rfc;
GO
IF EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.Fac_EmisoresFiscales')
AND name = N'CK_Fac_EmisoresFiscales_Regimen'
)
ALTER TABLE dbo.Fac_EmisoresFiscales DROP CONSTRAINT CK_Fac_EmisoresFiscales_Regimen;
GO
IF EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.Fac_EmisoresFiscales')
AND name = N'CK_Fac_EmisoresFiscales_CodigoPostal'
)
ALTER TABLE dbo.Fac_EmisoresFiscales DROP CONSTRAINT CK_Fac_EmisoresFiscales_CodigoPostal;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.Fac_EmisoresFiscales')
AND name = N'CK_Fac_EmisoresFiscales_DatosFiscales'
)
BEGIN
ALTER TABLE dbo.Fac_EmisoresFiscales WITH CHECK
ADD CONSTRAINT CK_Fac_EmisoresFiscales_DatosFiscales
CHECK
(
LEN(Rfc) IN (12, 13)
AND LEN(RegimenFiscal) = 3
AND LEN(CodigoPostal) = 5
);
ALTER TABLE dbo.Fac_EmisoresFiscales
CHECK CONSTRAINT CK_Fac_EmisoresFiscales_DatosFiscales;
END;
GO
IF OBJECT_ID(N'dbo.Fac_CfdiDocumentos', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Fac_CfdiDocumentos
(
CveCfdiDocumento bigint IDENTITY(1, 1) NOT NULL,
IdentificadorDocumento uniqueidentifier CONSTRAINT DF_Fac_CfdiDocumentos_Identificador DEFAULT (NEWID()) NOT NULL,
CveEmpresa int NOT NULL,
CveCliente int NOT NULL,
TipoOrigen varchar(50) COLLATE Modern_Spanish_CS_AS NULL,
CveOrigen bigint NULL,
ReferenciaOrigen varchar(150) COLLATE Modern_Spanish_CS_AS NULL,
VersionCfdi varchar(5) COLLATE Modern_Spanish_CS_AS CONSTRAINT DF_Fac_CfdiDocumentos_Version DEFAULT ('4.0') NOT NULL,
Serie varchar(25) COLLATE Modern_Spanish_CS_AS NULL,
Folio varchar(40) COLLATE Modern_Spanish_CS_AS NULL,
FechaEmision datetime2(0) NOT NULL,
TipoComprobante char(1) COLLATE Modern_Spanish_CS_AS NOT NULL,
FormaPago varchar(2) COLLATE Modern_Spanish_CS_AS NULL,
MetodoPago varchar(3) COLLATE Modern_Spanish_CS_AS NULL,
CondicionesPago varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
Moneda varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
TipoCambio decimal(19, 6) NULL,
Exportacion varchar(2) COLLATE Modern_Spanish_CS_AS NOT NULL,
LugarExpedicion varchar(5) COLLATE Modern_Spanish_CI_AS NOT NULL,
Subtotal decimal(19, 6) NOT NULL,
Descuento decimal(19, 6) CONSTRAINT DF_Fac_CfdiDocumentos_Descuento DEFAULT (0) NOT NULL,
TotalImpuestosTrasladados decimal(19, 6) CONSTRAINT DF_Fac_CfdiDocumentos_Trasladados DEFAULT (0) NOT NULL,
TotalImpuestosRetenidos decimal(19, 6) CONSTRAINT DF_Fac_CfdiDocumentos_Retenidos DEFAULT (0) NOT NULL,
Total decimal(19, 6) NOT NULL,
RfcEmisor varchar(13) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreEmisor varchar(300) COLLATE Modern_Spanish_CS_AS NOT NULL,
RegimenFiscalEmisor varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
RfcReceptor varchar(13) COLLATE Modern_Spanish_CS_AS NOT NULL,
NombreReceptor varchar(300) COLLATE Modern_Spanish_CS_AS NOT NULL,
DomicilioFiscalReceptor varchar(5) COLLATE Modern_Spanish_CI_AS NOT NULL,
RegimenFiscalReceptor varchar(3) COLLATE Modern_Spanish_CS_AS NOT NULL,
UsoCfdi varchar(5) COLLATE Modern_Spanish_CS_AS NOT NULL,
Estado varchar(20) COLLATE Modern_Spanish_CS_AS CONSTRAINT DF_Fac_CfdiDocumentos_Estado DEFAULT ('BORRADOR') NOT NULL,
XmlSinTimbrar varbinary(max) NOT NULL,
HashXmlSinTimbrar binary(32) NOT NULL,
CveCfdiTimbradoVigente bigint NULL,
FechaAlta datetime2(0) CONSTRAINT DF_Fac_CfdiDocumentos_FechaAlta DEFAULT (SYSDATETIME()) NOT NULL,
FechaModificacion datetime2(0) NULL,
CveUsuario int NOT NULL,
VersionFila rowversion NOT NULL,
CONSTRAINT PK_Fac_CfdiDocumentos
PRIMARY KEY CLUSTERED (CveCfdiDocumento),
CONSTRAINT UQ_Fac_CfdiDocumentos_Identificador
UNIQUE NONCLUSTERED (IdentificadorDocumento),
CONSTRAINT CK_Fac_CfdiDocumentos_Estado
CHECK (Estado IN ('BORRADOR', 'LISTO', 'TIMBRADO', 'ERROR', 'REVISAR')),
CONSTRAINT CK_Fac_CfdiDocumentos_Importes
CHECK
(
Subtotal >= 0
AND Descuento >= 0
AND TotalImpuestosTrasladados >= 0
AND TotalImpuestosRetenidos >= 0
AND Total >= 0
),
CONSTRAINT FK_Fac_CfdiDocumentos_Clientes
FOREIGN KEY (CveCliente)
REFERENCES dbo.Clientes (CveCliente),
CONSTRAINT FK_Fac_CfdiDocumentos_Usuarios
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario)
);
END;
GO
IF OBJECT_ID(N'dbo.Fac_CfdiTimbrados', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Fac_CfdiTimbrados
(
CveCfdiTimbrado bigint IDENTITY(1, 1) NOT NULL,
CveCfdiDocumento bigint NOT NULL,
NumeroIntento int NOT NULL,
IdSolicitud uniqueidentifier NOT NULL,
ProveedorPac varchar(50) COLLATE Modern_Spanish_CS_AS NOT NULL,
Ambiente varchar(20) COLLATE Modern_Spanish_CS_AS NOT NULL,
Estado varchar(20) COLLATE Modern_Spanish_CS_AS CONSTRAINT DF_Fac_CfdiTimbrados_Estado DEFAULT ('PENDIENTE') NOT NULL,
Exitoso bit CONSTRAINT DF_Fac_CfdiTimbrados_Exitoso DEFAULT (0) NOT NULL,
EsDuplicado bit CONSTRAINT DF_Fac_CfdiTimbrados_EsDuplicado DEFAULT (0) NOT NULL,
IdOperacionPac varchar(150) COLLATE Modern_Spanish_CS_AS NULL,
ReferenciaContratoPac varchar(100) COLLATE Modern_Spanish_CS_AS NULL,
CodigoRespuesta varchar(100) COLLATE Modern_Spanish_CI_AS NULL,
MensajeRespuesta varchar(2000) COLLATE Modern_Spanish_CS_AS NULL,
TipoExcepcion varchar(300) COLLATE Modern_Spanish_CS_AS NULL,
Uuid varchar(36) COLLATE Modern_Spanish_CS_AS NULL,
FechaSolicitud datetime2(0) CONSTRAINT DF_Fac_CfdiTimbrados_FechaSolicitud DEFAULT (SYSDATETIME()) NOT NULL,
FechaRespuesta datetime2(0) NULL,
FechaTimbrado datetime2(0) NULL,
RfcProveedorCertificacion varchar(13) COLLATE Modern_Spanish_CS_AS NULL,
NumeroCertificadoEmisor varchar(20) COLLATE Modern_Spanish_CS_AS NULL,
NumeroCertificadoSat varchar(20) COLLATE Modern_Spanish_CS_AS NULL,
SelloCfdi varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
SelloSat varchar(1000) COLLATE Modern_Spanish_CS_AS NULL,
CadenaTimbre varchar(max) COLLATE Modern_Spanish_CS_AS NULL,
XmlTimbrado varbinary(max) NULL,
HashXmlTimbrado binary(32) NULL,
CodigoBidimensional varbinary(max) NULL,
CveUsuario int NOT NULL,
CONSTRAINT PK_Fac_CfdiTimbrados
PRIMARY KEY CLUSTERED (CveCfdiTimbrado),
CONSTRAINT UQ_Fac_CfdiTimbrados_Solicitud
UNIQUE NONCLUSTERED (IdSolicitud),
CONSTRAINT UQ_Fac_CfdiTimbrados_Intento
UNIQUE NONCLUSTERED (CveCfdiDocumento, NumeroIntento),
CONSTRAINT CK_Fac_CfdiTimbrados_Estado
CHECK (Estado IN ('PENDIENTE', 'EXITOSO', 'FALLIDO', 'INDETERMINADO', 'DUPLICADO')),
CONSTRAINT FK_Fac_CfdiTimbrados_Documentos
FOREIGN KEY (CveCfdiDocumento)
REFERENCES dbo.Fac_CfdiDocumentos (CveCfdiDocumento),
CONSTRAINT FK_Fac_CfdiTimbrados_Usuarios
FOREIGN KEY (CveUsuario)
REFERENCES dbo.Sis_Usuarios (CveUsuario)
);
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.foreign_keys
WHERE parent_object_id = OBJECT_ID(N'dbo.Fac_CfdiDocumentos')
AND name = N'FK_Fac_CfdiDocumentos_TimbradoVigente'
)
BEGIN
ALTER TABLE dbo.Fac_CfdiDocumentos
ADD CONSTRAINT FK_Fac_CfdiDocumentos_TimbradoVigente
FOREIGN KEY (CveCfdiTimbradoVigente)
REFERENCES dbo.Fac_CfdiTimbrados (CveCfdiTimbrado);
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.Fac_CfdiDocumentos')
AND name = N'IX_Fac_CfdiDocumentos_Cliente_Fecha'
)
BEGIN
CREATE NONCLUSTERED INDEX IX_Fac_CfdiDocumentos_Cliente_Fecha
ON dbo.Fac_CfdiDocumentos
(
CveCliente,
FechaEmision DESC,
CveCfdiDocumento DESC
);
END;
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.Fac_CfdiTimbrados')
AND name = N'IX_Fac_CfdiTimbrados_Documento_Estado'
)
BEGIN
CREATE NONCLUSTERED INDEX IX_Fac_CfdiTimbrados_Documento_Estado
ON dbo.Fac_CfdiTimbrados
(
CveCfdiDocumento,
Estado,
NumeroIntento DESC
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_EmisorFiscalGet
@CveEmpresa int,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa no tiene configurado un emisor fiscal activo.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
CveEmisorFiscal,
CveEmpresa,
Rfc,
NombreFiscal,
RegimenFiscal,
CodigoPostal,
ProveedorPac,
AmbienteProduccion,
ReferenciaCredencialPac,
ReferenciaContratoPac,
ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd,
NumeroCertificado,
VigenciaCertificadoDesde,
VigenciaCertificadoHasta,
HuellaCertificado,
EsActivo
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el emisor fiscal; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_EmisorFiscalGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_EmisorFiscalSave
@CveEmisorFiscal int = NULL,
@CveEmpresa int,
@Rfc varchar(13),
@NombreFiscal varchar(300),
@RegimenFiscal varchar(3),
@CodigoPostal varchar(5),
@ProveedorPac varchar(50),
@AmbienteProduccion bit,
@ReferenciaCredencialPac varchar(100),
@ReferenciaContratoPac varchar(100) = NULL,
@ReferenciaCertificadoCsd varchar(500) = NULL,
@ReferenciaLlavePrivadaCsd varchar(500) = NULL,
@NumeroCertificado varchar(20) = NULL,
@VigenciaCertificadoDesde datetime2(0) = NULL,
@VigenciaCertificadoHasta datetime2(0) = NULL,
@HuellaCertificado varchar(128) = NULL,
@EsActivo bit,
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
SELECT
@Rfc = UPPER(REPLACE(LTRIM(RTRIM(@Rfc)), ' ', '')),
@NombreFiscal = LTRIM(RTRIM(@NombreFiscal)),
@RegimenFiscal = LTRIM(RTRIM(@RegimenFiscal)),
@CodigoPostal = LTRIM(RTRIM(@CodigoPostal)),
@ProveedorPac = UPPER(LTRIM(RTRIM(@ProveedorPac))),
@ReferenciaCredencialPac = LTRIM(RTRIM(@ReferenciaCredencialPac)),
@ReferenciaContratoPac = NULLIF(LTRIM(RTRIM(@ReferenciaContratoPac)), ''),
@ReferenciaCertificadoCsd = NULLIF(LTRIM(RTRIM(@ReferenciaCertificadoCsd)), ''),
@ReferenciaLlavePrivadaCsd = NULLIF(LTRIM(RTRIM(@ReferenciaLlavePrivadaCsd)), ''),
@NumeroCertificado = NULLIF(LTRIM(RTRIM(@NumeroCertificado)), ''),
@HuellaCertificado = NULLIF(LTRIM(RTRIM(@HuellaCertificado)), '');
IF LEN(@Rfc) NOT IN (12, 13)
OR NULLIF(@NombreFiscal, '') IS NULL
OR LEN(@RegimenFiscal) <> 3
OR LEN(@CodigoPostal) <> 5
OR NULLIF(@ProveedorPac, '') IS NULL
OR NULLIF(@ReferenciaCredencialPac, '') IS NULL
BEGIN
SELECT
@ErrorMostrar = 'Capture RFC, nombre fiscal, régimen, código postal, PAC y referencia de credencial válidos.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveEmisorFiscal IS NULL
BEGIN
IF EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa ya cuenta con una configuración fiscal.',
@ErrorTipo = 2;
RETURN;
END;
INSERT dbo.Fac_EmisoresFiscales
(
CveEmpresa,
Rfc,
NombreFiscal,
RegimenFiscal,
CodigoPostal,
ProveedorPac,
AmbienteProduccion,
ReferenciaCredencialPac,
ReferenciaContratoPac,
ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd,
NumeroCertificado,
VigenciaCertificadoDesde,
VigenciaCertificadoHasta,
HuellaCertificado,
EsActivo,
CveUsuario
)
VALUES
(
@CveEmpresa,
@Rfc,
@NombreFiscal,
@RegimenFiscal,
@CodigoPostal,
@ProveedorPac,
@AmbienteProduccion,
@ReferenciaCredencialPac,
@ReferenciaContratoPac,
@ReferenciaCertificadoCsd,
@ReferenciaLlavePrivadaCsd,
@NumeroCertificado,
@VigenciaCertificadoDesde,
@VigenciaCertificadoHasta,
@HuellaCertificado,
@EsActivo,
@CveUsuarioEjecuta
);
SET @CveEmisorFiscal = CONVERT(int, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmisorFiscal = @CveEmisorFiscal
AND CveEmpresa = @CveEmpresa
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró la configuración fiscal seleccionada.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Fac_EmisoresFiscales
SET Rfc = @Rfc,
NombreFiscal = @NombreFiscal,
RegimenFiscal = @RegimenFiscal,
CodigoPostal = @CodigoPostal,
ProveedorPac = @ProveedorPac,
AmbienteProduccion = @AmbienteProduccion,
ReferenciaCredencialPac = @ReferenciaCredencialPac,
ReferenciaContratoPac = @ReferenciaContratoPac,
ReferenciaCertificadoCsd = @ReferenciaCertificadoCsd,
ReferenciaLlavePrivadaCsd = @ReferenciaLlavePrivadaCsd,
NumeroCertificado = @NumeroCertificado,
VigenciaCertificadoDesde = @VigenciaCertificadoDesde,
VigenciaCertificadoHasta = @VigenciaCertificadoHasta,
HuellaCertificado = @HuellaCertificado,
EsActivo = @EsActivo,
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveEmisorFiscal = @CveEmisorFiscal;
END;
SELECT @CveEmisorFiscal AS CveEmisorFiscal;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el emisor fiscal; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_EmisorFiscalSave'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_ReceptorFiscalGet
@CveCliente 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.Clientes
WHERE CveCliente = @CveCliente
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el cliente solicitado.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
C.CveCliente,
C.RFC AS Rfc,
C.Nombre AS NombreFiscal,
C.CP AS CodigoPostal,
RF.CodigoRegimenFiscal AS RegimenFiscal,
UCFDI.UsoCFDI AS UsoCfdi
FROM dbo.Clientes AS C
LEFT JOIN dbo.Gral_RegimenesFiscales AS RF
ON RF.CveRegimenFiscal = C.CveRegimenFiscal
LEFT JOIN dbo.Gral_SAT_UsosCFDI AS UCFDI
ON UCFDI.CveUsoCFDI = C.CveUsoCFDI
WHERE C.CveCliente = @CveCliente;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar la información fiscal del cliente; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_ReceptorFiscalGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiDocumentoSaveDraft
@CveCfdiDocumento bigint = NULL,
@CveEmpresa int,
@CveCliente int,
@TipoOrigen varchar(50) = NULL,
@CveOrigen bigint = NULL,
@ReferenciaOrigen varchar(150) = NULL,
@VersionCfdi varchar(5),
@Serie varchar(25) = NULL,
@Folio varchar(40) = NULL,
@FechaEmision datetime2(0),
@TipoComprobante char(1),
@FormaPago varchar(2) = NULL,
@MetodoPago varchar(3) = NULL,
@CondicionesPago varchar(1000) = NULL,
@Moneda varchar(3),
@TipoCambio decimal(19, 6) = NULL,
@Exportacion varchar(2),
@LugarExpedicion varchar(5),
@Subtotal decimal(19, 6),
@Descuento decimal(19, 6),
@TotalImpuestosTrasladados decimal(19, 6),
@TotalImpuestosRetenidos decimal(19, 6),
@Total decimal(19, 6),
@RfcEmisor varchar(13),
@NombreEmisor varchar(300),
@RegimenFiscalEmisor varchar(3),
@RfcReceptor varchar(13),
@NombreReceptor varchar(300),
@DomicilioFiscalReceptor varchar(5),
@RegimenFiscalReceptor varchar(3),
@UsoCfdi varchar(5),
@XmlSinTimbrar varbinary(max),
@HashXmlSinTimbrar binary(32),
@CveUsuarioEjecuta int,
@ErrorMostrar varchar(max) OUTPUT,
@ErrorTipo int OUTPUT,
@Return bit OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @ErrorMostrar = NULL, @ErrorTipo = 0, @Return = 0;
BEGIN TRY
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_EmisoresFiscales
WHERE CveEmpresa = @CveEmpresa
AND EsActivo = 1
)
BEGIN
SELECT
@ErrorMostrar = 'La empresa no tiene un emisor fiscal activo.',
@ErrorTipo = 2;
RETURN;
END;
IF @XmlSinTimbrar IS NULL
OR DATALENGTH(@XmlSinTimbrar) = 0
OR @HashXmlSinTimbrar IS NULL
OR DATALENGTH(@HashXmlSinTimbrar) <> 32
BEGIN
SELECT
@ErrorMostrar = 'El XML previo al timbrado no es válido.',
@ErrorTipo = 2;
RETURN;
END;
IF @CveCfdiDocumento IS NULL
BEGIN
INSERT dbo.Fac_CfdiDocumentos
(
CveEmpresa,
CveCliente,
TipoOrigen,
CveOrigen,
ReferenciaOrigen,
VersionCfdi,
Serie,
Folio,
FechaEmision,
TipoComprobante,
FormaPago,
MetodoPago,
CondicionesPago,
Moneda,
TipoCambio,
Exportacion,
LugarExpedicion,
Subtotal,
Descuento,
TotalImpuestosTrasladados,
TotalImpuestosRetenidos,
Total,
RfcEmisor,
NombreEmisor,
RegimenFiscalEmisor,
RfcReceptor,
NombreReceptor,
DomicilioFiscalReceptor,
RegimenFiscalReceptor,
UsoCfdi,
Estado,
XmlSinTimbrar,
HashXmlSinTimbrar,
CveUsuario
)
VALUES
(
@CveEmpresa,
@CveCliente,
NULLIF(LTRIM(RTRIM(@TipoOrigen)), ''),
@CveOrigen,
NULLIF(LTRIM(RTRIM(@ReferenciaOrigen)), ''),
@VersionCfdi,
NULLIF(LTRIM(RTRIM(@Serie)), ''),
NULLIF(LTRIM(RTRIM(@Folio)), ''),
@FechaEmision,
@TipoComprobante,
NULLIF(LTRIM(RTRIM(@FormaPago)), ''),
NULLIF(LTRIM(RTRIM(@MetodoPago)), ''),
NULLIF(LTRIM(RTRIM(@CondicionesPago)), ''),
@Moneda,
@TipoCambio,
@Exportacion,
@LugarExpedicion,
@Subtotal,
@Descuento,
@TotalImpuestosTrasladados,
@TotalImpuestosRetenidos,
@Total,
@RfcEmisor,
@NombreEmisor,
@RegimenFiscalEmisor,
@RfcReceptor,
@NombreReceptor,
@DomicilioFiscalReceptor,
@RegimenFiscalReceptor,
@UsoCfdi,
'LISTO',
@XmlSinTimbrar,
@HashXmlSinTimbrar,
@CveUsuarioEjecuta
);
SET @CveCfdiDocumento = CONVERT(bigint, SCOPE_IDENTITY());
END
ELSE
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos WITH (UPDLOCK, HOLDLOCK)
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND CveEmpresa = @CveEmpresa
AND CveCliente = @CveCliente
AND CveCfdiTimbradoVigente IS NULL
AND Estado IN ('BORRADOR', 'LISTO', 'ERROR')
)
BEGIN
SELECT
@ErrorMostrar = 'El CFDI no existe, ya fue timbrado o requiere revisión antes de modificarse.',
@ErrorTipo = 2;
RETURN;
END;
UPDATE dbo.Fac_CfdiDocumentos
SET TipoOrigen = NULLIF(LTRIM(RTRIM(@TipoOrigen)), ''),
CveOrigen = @CveOrigen,
ReferenciaOrigen = NULLIF(LTRIM(RTRIM(@ReferenciaOrigen)), ''),
VersionCfdi = @VersionCfdi,
Serie = NULLIF(LTRIM(RTRIM(@Serie)), ''),
Folio = NULLIF(LTRIM(RTRIM(@Folio)), ''),
FechaEmision = @FechaEmision,
TipoComprobante = @TipoComprobante,
FormaPago = NULLIF(LTRIM(RTRIM(@FormaPago)), ''),
MetodoPago = NULLIF(LTRIM(RTRIM(@MetodoPago)), ''),
CondicionesPago = NULLIF(LTRIM(RTRIM(@CondicionesPago)), ''),
Moneda = @Moneda,
TipoCambio = @TipoCambio,
Exportacion = @Exportacion,
LugarExpedicion = @LugarExpedicion,
Subtotal = @Subtotal,
Descuento = @Descuento,
TotalImpuestosTrasladados = @TotalImpuestosTrasladados,
TotalImpuestosRetenidos = @TotalImpuestosRetenidos,
Total = @Total,
RfcEmisor = @RfcEmisor,
NombreEmisor = @NombreEmisor,
RegimenFiscalEmisor = @RegimenFiscalEmisor,
RfcReceptor = @RfcReceptor,
NombreReceptor = @NombreReceptor,
DomicilioFiscalReceptor = @DomicilioFiscalReceptor,
RegimenFiscalReceptor = @RegimenFiscalReceptor,
UsoCfdi = @UsoCfdi,
Estado = 'LISTO',
XmlSinTimbrar = @XmlSinTimbrar,
HashXmlSinTimbrar = @HashXmlSinTimbrar,
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiDocumento = @CveCfdiDocumento;
END;
SELECT @CveCfdiDocumento AS CveCfdiDocumento;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el XML 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_CfdiDocumentoSaveDraft'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiDocumentoGet
@CveCfdiDocumento bigint,
@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
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el CFDI solicitado.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
D.CveCfdiDocumento,
D.IdentificadorDocumento,
D.CveEmpresa,
D.CveCliente,
D.TipoOrigen,
D.CveOrigen,
D.ReferenciaOrigen,
D.VersionCfdi,
D.Serie,
D.Folio,
D.FechaEmision,
D.TipoComprobante,
D.FormaPago,
D.MetodoPago,
D.CondicionesPago,
D.Moneda,
D.TipoCambio,
D.Exportacion,
D.LugarExpedicion,
D.Subtotal,
D.Descuento,
D.TotalImpuestosTrasladados,
D.TotalImpuestosRetenidos,
D.Total,
D.RfcEmisor,
D.NombreEmisor,
D.RegimenFiscalEmisor,
D.RfcReceptor,
D.NombreReceptor,
D.DomicilioFiscalReceptor,
D.RegimenFiscalReceptor,
D.UsoCfdi,
D.Estado,
D.XmlSinTimbrar,
D.HashXmlSinTimbrar,
D.CveCfdiTimbradoVigente,
T.Uuid AS UuidVigente,
D.VersionFila
FROM dbo.Fac_CfdiDocumentos AS D
LEFT JOIN dbo.Fac_CfdiTimbrados AS T
ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
WHERE D.CveCfdiDocumento = @CveCfdiDocumento;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar el 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_CfdiDocumentoGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiTimbradoAttemptStart
@CveCfdiDocumento bigint,
@IdSolicitud uniqueidentifier,
@ProveedorPac varchar(50),
@Ambiente varchar(20),
@ReferenciaContratoPac varchar(100) = 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 @CveCliente int;
DECLARE @CveCfdiTimbrado bigint;
DECLARE @NumeroIntento int;
DECLARE @Estado varchar(20);
DECLARE @PuedeEnviar bit = 0;
SELECT @CveCliente = D.CveCliente
FROM dbo.Fac_CfdiDocumentos AS D WITH (UPDLOCK, HOLDLOCK)
WHERE D.CveCfdiDocumento = @CveCfdiDocumento;
IF @CveCliente IS NULL
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el CFDI solicitado.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND
(
CveCfdiTimbradoVigente IS NOT NULL
OR Estado = 'TIMBRADO'
)
)
BEGIN
SELECT
@ErrorMostrar = 'El CFDI ya cuenta con un timbre vigente.',
@ErrorTipo = 2;
RETURN;
END;
IF EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND Estado = 'REVISAR'
)
BEGIN
SELECT
@ErrorMostrar = 'El resultado anterior es indeterminado. Consulte el PAC antes de reenviar el CFDI.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
@CveCfdiTimbrado = T.CveCfdiTimbrado,
@NumeroIntento = T.NumeroIntento,
@Estado = T.Estado,
@IdSolicitud = T.IdSolicitud
FROM dbo.Fac_CfdiTimbrados AS T
WHERE T.IdSolicitud = @IdSolicitud;
IF @CveCfdiTimbrado IS NULL
BEGIN
SELECT TOP (1)
@CveCfdiTimbrado = T.CveCfdiTimbrado,
@NumeroIntento = T.NumeroIntento,
@Estado = T.Estado,
@IdSolicitud = T.IdSolicitud
FROM dbo.Fac_CfdiTimbrados AS T
WHERE T.CveCfdiDocumento = @CveCfdiDocumento
AND T.Estado = 'PENDIENTE'
ORDER BY T.NumeroIntento DESC;
END;
IF @CveCfdiTimbrado IS NULL
BEGIN
SELECT @NumeroIntento =
ISNULL(MAX(NumeroIntento), 0) + 1
FROM dbo.Fac_CfdiTimbrados
WHERE CveCfdiDocumento = @CveCfdiDocumento;
INSERT dbo.Fac_CfdiTimbrados
(
CveCfdiDocumento,
NumeroIntento,
IdSolicitud,
ProveedorPac,
Ambiente,
Estado,
ReferenciaContratoPac,
CveUsuario
)
VALUES
(
@CveCfdiDocumento,
@NumeroIntento,
@IdSolicitud,
UPPER(LTRIM(RTRIM(@ProveedorPac))),
UPPER(LTRIM(RTRIM(@Ambiente))),
'PENDIENTE',
NULLIF(LTRIM(RTRIM(@ReferenciaContratoPac)), ''),
@CveUsuarioEjecuta
);
SET @CveCfdiTimbrado = CONVERT(bigint, SCOPE_IDENTITY());
SET @Estado = 'PENDIENTE';
SET @PuedeEnviar = 1;
END;
SELECT
@CveCfdiTimbrado AS CveCfdiTimbrado,
@NumeroIntento AS NumeroIntento,
@IdSolicitud AS IdSolicitud,
@Estado AS Estado,
@PuedeEnviar AS PuedeEnviar;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al registrar el intento de timbrado; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_CfdiTimbradoAttemptStart'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiTimbradoAttemptComplete
@CveCfdiTimbrado bigint,
@Exitoso bit,
@ResultadoIndeterminado bit,
@IdOperacionPac varchar(150) = NULL,
@CodigoRespuesta varchar(100) = NULL,
@MensajeRespuesta varchar(2000) = NULL,
@TipoExcepcion varchar(300) = NULL,
@Uuid varchar(36) = NULL,
@FechaTimbrado datetime2(0) = NULL,
@RfcProveedorCertificacion varchar(13) = NULL,
@NumeroCertificadoEmisor varchar(20) = NULL,
@NumeroCertificadoSat varchar(20) = NULL,
@SelloCfdi varchar(1000) = NULL,
@SelloSat varchar(1000) = NULL,
@CadenaTimbre varchar(max) = NULL,
@XmlTimbrado varbinary(max) = NULL,
@HashXmlTimbrado binary(32) = NULL,
@CodigoBidimensional varbinary(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
DECLARE @CveCfdiDocumento bigint;
DECLARE @CveCliente int;
DECLARE @EstadoActual varchar(20);
DECLARE @CveTimbradoVigente bigint;
DECLARE @EsDuplicado bit = 0;
DECLARE @EstadoNuevo varchar(20);
SELECT
@CveCfdiDocumento = T.CveCfdiDocumento,
@EstadoActual = T.Estado
FROM dbo.Fac_CfdiTimbrados AS T WITH (UPDLOCK, HOLDLOCK)
WHERE T.CveCfdiTimbrado = @CveCfdiTimbrado;
SELECT
@CveCliente = D.CveCliente,
@CveTimbradoVigente = D.CveCfdiTimbradoVigente
FROM dbo.Fac_CfdiDocumentos AS D WITH (UPDLOCK, HOLDLOCK)
WHERE D.CveCfdiDocumento = @CveCfdiDocumento;
IF @CveCfdiDocumento IS NULL
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el intento de timbrado.',
@ErrorTipo = 2;
RETURN;
END;
IF @EstadoActual <> 'PENDIENTE'
BEGIN
SELECT
T.CveCfdiTimbrado,
T.CveCfdiDocumento,
T.NumeroIntento,
T.IdSolicitud,
T.ProveedorPac,
T.Ambiente,
T.Estado,
T.Exitoso,
T.EsDuplicado,
T.IdOperacionPac,
T.ReferenciaContratoPac,
T.CodigoRespuesta,
T.MensajeRespuesta,
T.TipoExcepcion,
T.Uuid,
T.FechaSolicitud,
T.FechaRespuesta,
T.FechaTimbrado,
T.RfcProveedorCertificacion,
T.NumeroCertificadoEmisor,
T.NumeroCertificadoSat,
T.SelloCfdi,
T.SelloSat,
T.CadenaTimbre,
T.XmlTimbrado,
T.HashXmlTimbrado,
T.CodigoBidimensional
FROM dbo.Fac_CfdiTimbrados AS T
WHERE T.CveCfdiTimbrado = @CveCfdiTimbrado;
SET @Return = 1;
RETURN;
END;
IF @Exitoso = 1
AND
(
NULLIF(LTRIM(RTRIM(@Uuid)), '') IS NULL
OR @XmlTimbrado IS NULL
OR DATALENGTH(@XmlTimbrado) = 0
OR @HashXmlTimbrado IS NULL
OR DATALENGTH(@HashXmlTimbrado) <> 32
)
BEGIN
SET @Exitoso = 0;
SET @ResultadoIndeterminado = 1;
SET @CodigoRespuesta =
COALESCE(NULLIF(@CodigoRespuesta, ''), 'PAC_RESPUESTA_INCOMPLETA');
SET @MensajeRespuesta =
'El PAC indicó éxito, pero la respuesta no contiene UUID y XML completos.';
END;
IF @Exitoso = 1 AND @CveTimbradoVigente IS NOT NULL
BEGIN
SET @EsDuplicado = 1;
SET @EstadoNuevo = 'DUPLICADO';
END
ELSE IF @Exitoso = 1
BEGIN
SET @EstadoNuevo = 'EXITOSO';
END
ELSE IF @ResultadoIndeterminado = 1
BEGIN
SET @EstadoNuevo = 'INDETERMINADO';
END
ELSE
BEGIN
SET @EstadoNuevo = 'FALLIDO';
END;
UPDATE dbo.Fac_CfdiTimbrados
SET Estado = @EstadoNuevo,
Exitoso = @Exitoso,
EsDuplicado = @EsDuplicado,
IdOperacionPac = NULLIF(LTRIM(RTRIM(@IdOperacionPac)), ''),
CodigoRespuesta = NULLIF(LTRIM(RTRIM(@CodigoRespuesta)), ''),
MensajeRespuesta = NULLIF(@MensajeRespuesta, ''),
TipoExcepcion = NULLIF(LTRIM(RTRIM(@TipoExcepcion)), ''),
Uuid = NULLIF(LTRIM(RTRIM(@Uuid)), ''),
FechaRespuesta = SYSDATETIME(),
FechaTimbrado = @FechaTimbrado,
RfcProveedorCertificacion = NULLIF(LTRIM(RTRIM(@RfcProveedorCertificacion)), ''),
NumeroCertificadoEmisor = NULLIF(LTRIM(RTRIM(@NumeroCertificadoEmisor)), ''),
NumeroCertificadoSat = NULLIF(LTRIM(RTRIM(@NumeroCertificadoSat)), ''),
SelloCfdi = NULLIF(@SelloCfdi, ''),
SelloSat = NULLIF(@SelloSat, ''),
CadenaTimbre = NULLIF(@CadenaTimbre, ''),
XmlTimbrado = @XmlTimbrado,
HashXmlTimbrado = @HashXmlTimbrado,
CodigoBidimensional = @CodigoBidimensional,
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiTimbrado = @CveCfdiTimbrado;
IF @EstadoNuevo = 'EXITOSO'
BEGIN
UPDATE dbo.Fac_CfdiDocumentos
SET CveCfdiTimbradoVigente = @CveCfdiTimbrado,
Estado = 'TIMBRADO',
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND CveCfdiTimbradoVigente IS NULL;
IF @@ROWCOUNT = 0
BEGIN
UPDATE dbo.Fac_CfdiTimbrados
SET Estado = 'DUPLICADO',
EsDuplicado = 1
WHERE CveCfdiTimbrado = @CveCfdiTimbrado;
END;
END
ELSE IF @EstadoNuevo = 'INDETERMINADO'
BEGIN
UPDATE dbo.Fac_CfdiDocumentos
SET Estado = 'REVISAR',
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND CveCfdiTimbradoVigente IS NULL;
END
ELSE IF @EstadoNuevo = 'FALLIDO'
BEGIN
UPDATE dbo.Fac_CfdiDocumentos
SET Estado = 'ERROR',
FechaModificacion = SYSDATETIME(),
CveUsuario = @CveUsuarioEjecuta
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND CveCfdiTimbradoVigente IS NULL;
END;
SELECT
T.CveCfdiTimbrado,
T.CveCfdiDocumento,
T.NumeroIntento,
T.IdSolicitud,
T.ProveedorPac,
T.Ambiente,
T.Estado,
T.Exitoso,
T.EsDuplicado,
T.IdOperacionPac,
T.ReferenciaContratoPac,
T.CodigoRespuesta,
T.MensajeRespuesta,
T.TipoExcepcion,
T.Uuid,
T.FechaSolicitud,
T.FechaRespuesta,
T.FechaTimbrado,
T.RfcProveedorCertificacion,
T.NumeroCertificadoEmisor,
T.NumeroCertificadoSat,
T.SelloCfdi,
T.SelloSat,
T.CadenaTimbre,
T.XmlTimbrado,
T.HashXmlTimbrado,
T.CodigoBidimensional
FROM dbo.Fac_CfdiTimbrados AS T
WHERE T.CveCfdiTimbrado = @CveCfdiTimbrado;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al guardar el resultado del timbrado; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_CfdiTimbradoAttemptComplete'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiTimbradoAttemptList
@CveCfdiDocumento bigint,
@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
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el CFDI solicitado.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
T.CveCfdiTimbrado,
T.CveCfdiDocumento,
T.NumeroIntento,
T.IdSolicitud,
T.ProveedorPac,
T.Ambiente,
T.Estado,
T.Exitoso,
T.EsDuplicado,
T.IdOperacionPac,
T.ReferenciaContratoPac,
T.CodigoRespuesta,
T.MensajeRespuesta,
T.TipoExcepcion,
T.Uuid,
T.FechaSolicitud,
T.FechaRespuesta,
T.FechaTimbrado,
T.RfcProveedorCertificacion,
T.NumeroCertificadoEmisor,
T.NumeroCertificadoSat,
T.SelloCfdi,
T.SelloSat,
T.CadenaTimbre,
T.XmlTimbrado,
T.HashXmlTimbrado,
T.CodigoBidimensional
FROM dbo.Fac_CfdiTimbrados AS T
WHERE T.CveCfdiDocumento = @CveCfdiDocumento
ORDER BY T.NumeroIntento DESC;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al consultar los intentos de timbrado; favor de contactar a Sistemas.',
@ErrorTipo = 1,
@Return = 0;
DECLARE @ErrorTecnico nvarchar(2048) =
CONCAT(
'Número: ', ERROR_NUMBER(),
'; Procedimiento: ', COALESCE(ERROR_PROCEDURE(), 'PA_Fac_CfdiTimbradoAttemptList'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO
CREATE OR ALTER PROCEDURE dbo.PA_Fac_CfdiXmlGet
@CveCfdiDocumento bigint,
@Timbrado 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 NOT EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE CveCfdiDocumento = @CveCfdiDocumento
)
BEGIN
SELECT
@ErrorMostrar = 'No se encontró el CFDI solicitado.',
@ErrorTipo = 2;
RETURN;
END;
IF @Timbrado = 1
AND NOT EXISTS
(
SELECT 1
FROM dbo.Fac_CfdiDocumentos
WHERE CveCfdiDocumento = @CveCfdiDocumento
AND CveCfdiTimbradoVigente IS NOT NULL
)
BEGIN
SELECT
@ErrorMostrar = 'El CFDI todavía no cuenta con un XML timbrado.',
@ErrorTipo = 2;
RETURN;
END;
SELECT
D.CveCfdiDocumento,
CASE
WHEN @Timbrado = 1
THEN D.CveCfdiTimbradoVigente
ELSE NULL
END AS CveCfdiTimbrado,
@Timbrado AS EsTimbrado,
CONCAT
(
'CFDI-',
D.CveCfdiDocumento,
CASE
WHEN @Timbrado = 1
THEN CONCAT('-', T.Uuid, '-Timbrado.xml')
ELSE '-SinTimbrar.xml'
END
) AS NombreArchivo,
'application/xml' AS TipoContenido,
CASE
WHEN @Timbrado = 1
THEN T.XmlTimbrado
ELSE D.XmlSinTimbrar
END AS Contenido,
CASE
WHEN @Timbrado = 1
THEN T.HashXmlTimbrado
ELSE D.HashXmlSinTimbrar
END AS HashSha256
FROM dbo.Fac_CfdiDocumentos AS D
LEFT JOIN dbo.Fac_CfdiTimbrados AS T
ON T.CveCfdiTimbrado = D.CveCfdiTimbradoVigente
WHERE D.CveCfdiDocumento = @CveCfdiDocumento;
SET @Return = 1;
END TRY
BEGIN CATCH
SELECT
@ErrorMostrar = 'Ocurrió un error al recuperar el XML 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_CfdiXmlGet'),
'; Línea: ', ERROR_LINE(),
'; Detalle: ', ERROR_MESSAGE());
RAISERROR(N'%s', 10, 1, @ErrorTecnico);
END CATCH;
END;
GO