1450 lines
49 KiB
Transact-SQL
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
|