diff --git a/App_Code/ClsVentas.vb b/App_Code/ClsVentas.vb index 1e17d5ae3..eb05b55d1 100644 --- a/App_Code/ClsVentas.vb +++ b/App_Code/ClsVentas.vb @@ -3345,7 +3345,9 @@ Public Class ClsVentas 'SOLO SI ESTA CANCELADA ANTE SAT EN SIG SE INTENTARA CANCELAR DE NUEVO CONTRA EL SAT If CveEstatus = 5 Then - If ObjCancelacion.CFDICancelar(Usuario.Empresa, FolioFiscal, Total, RFCReceptor, Usuario.Empresa.RFC) Then + Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(Usuario.Empresa, FolioFiscal, Total, RFCReceptor, Usuario.Empresa.RFC) + If Resp.Verificado Then + If Not ObjVentas.UpdateEstatusFactura(5, FolioFiscal, ObjCancelacion.CancelacionAcuse, Now, PCveVenta.ToEntero, -1, CvePAC:=Usuario.Empresa.CvePAC) Then CveVentasError.Add(PCveVenta.ToEntero) End If diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb index 91de26f6c..b801573a8 100644 --- a/App_Code/Modelos.vb +++ b/App_Code/Modelos.vb @@ -4909,7 +4909,8 @@ Namespace Modelos 'SI NO SE PUDO OBTENER DEL SERVICIO, UTILIZA EL METODO DE CANCELACION PARA OBTENER EL ACUSE If CancelacionAcuse = "" Then - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, TotalT, RFCReceptor, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) Then + Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, TotalT, RFCReceptor, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) + If Resp.Verificado Then 'GENERAMOS EL ACUSE Y MANDAMOS MAIL DE CON EL ACUSE DE CANCELACIÓN If RequiereAceptacion Then CancelacionFecha = Now.Date @@ -4988,15 +4989,18 @@ Namespace Modelos If Not ObtenerAcuse Then If ContinuarCancelacion Then - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, TotalT, RFCReceptor, UsuarioActual.Empresa.RFC, CvePACCancelacion:=CvePACCancelacion, ValidaFactura:=ValidarSAT, CveSATMotivoCancelacion:=CveSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) Then + Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, TotalT, RFCReceptor, UsuarioActual.Empresa.RFC, CvePACCancelacion:=CvePACCancelacion, ValidaFactura:=ValidarSAT, CveSATMotivoCancelacion:=CveSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) + If Resp.Verificado Then 'GENERAMOS EL ACUSE Y MANDAMOS MAIL DE CON EL ACUSE DE CANCELACIÓN - If RequiereAceptacion Then - CancelacionFecha = Now.Date - CveEstatus = 20 - Else - CancelacionFecha = ObjCancelacion.CancelacionFecha - CveEstatus = 5 - End If + 'If Resp.cve Then + ' CancelacionFecha = Now.Date + ' CveEstatus = 20 + 'Else + ' CancelacionFecha = ObjCancelacion.CancelacionFecha + ' CveEstatus = 5 + 'End If + CveEstatus = Resp.CveEstatus + CancelacionFecha = Resp.CancelacionFecha CancelacionAcuse = ObjCancelacion.CancelacionAcuse Else Retorno.Mensaje = "Los servicios de cancelación del SAT no se encuentran disponibles o presentan time out. Intente de nuevo en unos minutos.
Origen del error: WebService www.sat.gob.mx" @@ -5098,7 +5102,7 @@ Namespace Modelos If Not AplicaRefacturacionConPagos AndAlso ((((ObjFactura.Saldo > 0 AndAlso (CveEstatus > 0 AndAlso Not CveEstatus.Contiene(20, 23))) OrElse (ObjFactura.Total = 0 AndAlso UsuarioActual.CveEmpresa.Contiene(72) AndAlso ObjFactura.TipoDocto.Contiene("Ing"))) AndAlso CveEstatus.Contiene(4, 5)) OrElse (CvePlantillaPoliza = 7 AndAlso (CveEstatus > 0 AndAlso Not CveEstatus.Contiene(20, 23)))) Then 'CUANDO SE CANCELA, LA PÓLIZA DEBE DE SER DE DIARIO - CvePrePoliza = ObjConta.AddPrePolizas("Modelos/CancelarDocumento", CvePlantillaPoliza, ObjFactura.Total, ObjFactura.Total, ObjFactura.CveMoneda, Now, ObjFactura.Cliente.Nombre, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoPoliza:=3) + CvePrePoliza = ObjConta.AddPrePolizas("Modelos/CancelarDocumento", CvePlantillaPoliza, ObjFactura.Total, ObjFactura.Total, ObjFactura.CveMoneda, CancelacionFecha, ObjFactura.Cliente.Nombre, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoPoliza:=3) ObjFactura.CvePrePoliza = CvePrePoliza If ObjFactura.CvePrePoliza <= 0 Then @@ -6128,7 +6132,9 @@ Namespace Modelos ErrorCancelar = True End If - If ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, Total, RFCReceptor, UsuarioActual.Empresa.RFC) Then + Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, Total, RFCReceptor, UsuarioActual.Empresa.RFC) + + If Resp.Verificado Then 'falta verificar traer el acuse y reenviarlo If UsuarioActual.Empresa.UsaAC Then Dim Pol As Modelos.RetornoPolizaConta = GenerarPolizaAC(Me, ObjAC, True) diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index e511b6335..7b36fe3bc 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -111,7 +111,8 @@ Public Class Timbrado End If solicitud = Nothing Else - If CFDICancelar(UsuarioActual.Empresa, FolioFiscal, TotalT, RFCReceptor, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) Then + Dim Resp As RespuestaCancelacionSAT = CFDICancelar(UsuarioActual.Empresa, FolioFiscal, TotalT, RFCReceptor, UsuarioActual.Empresa.RFC, CvePACCancelacion, CveSATMotivoCancelacion:=CveSATMotivoCancelacion, FolioSustitucion:=FolioSustitucion) + If Resp.Verificado Then 'GENERAMOS EL ACUSE Y MANDAMOS MAIL DE CON EL ACUSE DE CANCELACIÓN CancelacionFecha = Me.CancelacionFecha CancelacionAcuse = Me.CancelacionAcuse @@ -206,8 +207,8 @@ Public Class Timbrado Return Retorno End Function - Public Function CFDICancelar(Empresa As Empresa, FolioFiscal As String, Total As Decimal, RFCReceptor As String, RFCEmisor As String, Optional CvePACCancelacion As Integer = 2, Optional ValidaFactura As Boolean = True, Optional CveSATMotivoCancelacion As Integer = -1, Optional FolioSustitucion As String = "") As Boolean - Dim Retorno As Boolean = False + Public Function CFDICancelar(Empresa As Empresa, FolioFiscal As String, Total As Decimal, RFCReceptor As String, RFCEmisor As String, Optional CvePACCancelacion As Integer = 2, Optional ValidaFactura As Boolean = True, Optional CveSATMotivoCancelacion As Integer = -1, Optional FolioSustitucion As String = "") As RespuestaCancelacionSAT + Dim Retorno As New RespuestaCancelacionSAT Dim MsgCancelacion As New StringBuilder If CvePACCancelacion = 3 Then @@ -219,10 +220,14 @@ Public Class Timbrado Dim Vigencia = VerificarVigenciaSAT(FolioFiscal, RFCEmisor, RFCReceptor, Total.ToString(), True) If Vigencia IsNot Nothing Then If Vigencia.EsCancelable.ToUpper() = "NO CANCELABLE" Then - Return False + Retorno.Estado = "NO CANCELABLE" + Retorno.Verificado = False + Return Retorno End If Else - Return False + Retorno.Estado = "NO VALIDADO" + Retorno.Verificado = False + Return Retorno End If End If End If @@ -277,7 +282,10 @@ Public Class Timbrado Catch ex As Exception CancelacionFecha = xmlDoc.GetElementsByTagName("CancelaCFDResult")(0).Attributes("Fecha").Value.ToDate End Try - Retorno = True + + Retorno.Verificado = True + Retorno.CancelacionFecha = CancelacionFecha + Retorno.CancelacionAcuse = CancelacionAcuse End If 'End If @@ -324,15 +332,15 @@ Public Class Timbrado #Region "Valida" If Not File.Exists(ArchivoCertificado) Then Alert("El archivo de certificado no existe", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If If Not File.Exists(ArchivoLLave) Then Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If If Empresa.ContraseñaKey = "" Then Alert("La clave no puede ser vacía", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If #End Region @@ -351,7 +359,7 @@ Public Class Timbrado llaveBase64 = Convert.ToBase64String(llaveByte) Catch ex As Exception Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End Try @@ -360,8 +368,7 @@ Public Class Timbrado certBase64 = Convert.ToBase64String(certByte) Catch ex As Exception Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) - Return False - + Retorno.Verificado = False End Try #End Region @@ -430,10 +437,14 @@ Public Class Timbrado CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate - Retorno = True + Retorno.Verificado = True + Retorno.CancelacionFecha = CancelacionFecha + Retorno.CancelacionAcuse = CancelacionAcuse Else CancelacionAcuse = resp.MensajeDeError - Retorno = False + Retorno.Verificado = True + Retorno.CancelacionFecha = CancelacionFecha + Retorno.CancelacionAcuse = CancelacionAcuse End If solicitud = Nothing Case 4 @@ -456,10 +467,13 @@ Public Class Timbrado CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate - Retorno = True + Retorno.Verificado = True + Retorno.CancelacionFecha = CancelacionFecha + Retorno.CancelacionAcuse = CancelacionAcuse Else CancelacionAcuse = resp.Descripcion - Retorno = False + Retorno.Verificado = True + Retorno.CancelacionAcuse = CancelacionAcuse End If solicitud = Nothing End Select @@ -468,7 +482,7 @@ Public Class Timbrado End If Catch ex As Exception CancelacionMensaje += $" | ex: {ex}" - Retorno = False + Retorno.Verificado = False End Try 'Libera memoria @@ -503,15 +517,15 @@ Public Class Timbrado #Region "Valida" If Not File.Exists(ArchivoCertificado) Then Alert("El archivo de certificado no existe", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If If Not File.Exists(ArchivoLLave) Then Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If If Empresa.ContraseñaKey = "" Then Alert("La clave no puede ser vacía", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If #End Region @@ -561,16 +575,19 @@ Public Class Timbrado MsgCancelacion.AppendFormat("-3.4.3") CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText CancelacionFecha = xmlDoc.SelectSingleNode("Acuse").Attributes("Fecha").Value.ToDate + Retorno.CancelacionAcuse = CancelacionAcuse + Retorno.CancelacionFecha = CancelacionFecha + Else CancelacionFecha = Now End If + Retorno.Verificado = True - Retorno = True Else MsgCancelacion.AppendFormat("-3.5") CancelacionAcuse = resp.NumeroError CancelacionMensaje = resultadoCancelacion.Descripcion - Retorno = False + Retorno.Verificado = True End If Case 4 @@ -599,15 +616,15 @@ Public Class Timbrado #Region "Valida" If Not File.Exists(ArchivoCertificado) Then Alert("El archivo de certificado no existe", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If If Not File.Exists(ArchivoLLave) Then Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If If Empresa.ContraseñaKey = "" Then Alert("La clave no puede ser vacía", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End If #End Region @@ -627,7 +644,7 @@ Public Class Timbrado llaveBase64 = Convert.ToBase64String(llaveByte) Catch ex As Exception Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End Try @@ -636,8 +653,7 @@ Public Class Timbrado certBase64 = Convert.ToBase64String(certByte) Catch ex As Exception Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) - Return False - + Retorno.Verificado = False End Try #End Region objCan.CancelacionCfdi = True @@ -662,7 +678,9 @@ Public Class Timbrado CancelacionAcuse = xmlDoc.GetElementsByTagName("SignatureValue")(0).InnerText CancelacionFecha = xmlDoc.DocumentElement.Attributes("Fecha").Value.ToDate - Retorno = True + Retorno.Verificado = True + Retorno.CancelacionAcuse = CancelacionAcuse + Retorno.CancelacionFecha = CancelacionFecha MsgCancelacion.AppendFormat("4.5.2-") End If @@ -671,7 +689,6 @@ Public Class Timbrado Case 5 CancelacionAcuse = "" - Retorno = False MsgCancelacion.AppendFormat("5.1-") Dim TimbraProduccion As Boolean = True @@ -700,7 +717,7 @@ Public Class Timbrado llaveBase64 = Convert.ToBase64String(llaveByte) Catch ex As Exception Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End Try Try @@ -708,7 +725,7 @@ Public Class Timbrado certBase64 = Convert.ToBase64String(certByte) Catch ex As Exception Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) - Return False + Retorno.Verificado = False End Try Dim Contrato As String = "72330711-cac6-4106-8051-cbcda1aef495" @@ -734,8 +751,11 @@ Public Class Timbrado 'EN PROCESO, CANCELABLE SIN ACEPTACION,CANCEALDO PREVIAMENTE If cancelacion.codigo.Contiene("96", "201", "202") Then CancelacionFecha = Now - Retorno = True + CancelacionAcuse = result.acuseCancelBase64 + Retorno.Verificado = True + Retorno.CancelacionAcuse = CancelacionAcuse + Retorno.CancelacionFecha = CancelacionFecha End If CancelacionMensaje = cancelacion.mensaje Else @@ -749,8 +769,25 @@ Public Class Timbrado End If End Select + 'valida que si se halla cancelado + Dim VigenciaExtra = VerificarVigenciaSAT(FolioFiscal, RFCEmisor, RFCReceptor, Total.ToString(), True) + If Retorno.Verificado AndAlso VigenciaExtra IsNot Nothing Then + If VigenciaExtra.Estado.ToUpper = "VIGENTE" AndAlso Not VigenciaExtra.EstatusCancelacion.ToUpper.Contiene("EN PROCESO") Then + Retorno.Estado = "VIGENTE" + Retorno.CveEstatus = 23 + End If + If VigenciaExtra.Estado.ToUpper = "VIGENTE" AndAlso VigenciaExtra.EstatusCancelacion.ToUpper.Contiene("EN PROCESO") Then + Retorno.Estado = "EN PROCESO" + Retorno.CveEstatus = 20 + End If + If VigenciaExtra.Estado.ToUpper = "CANCELADO" Then + Retorno.Estado = "CANCELADO" + Retorno.CveEstatus = 5 + End If - If Not Retorno Then + End If + + If Not Retorno.Verificado Then GuardaLog($"****** Error al cancelar factura ****** Estatus: {CancelacionState} | Mensaje: {CancelacionMensaje} | Mensaje SAT: {MsgCancelacion.ToString} ") End If diff --git a/App_Code/WsSIGWeb.vb b/App_Code/WsSIGWeb.vb index d8e3a40da..cee8000b4 100644 --- a/App_Code/WsSIGWeb.vb +++ b/App_Code/WsSIGWeb.vb @@ -67,8 +67,9 @@ Public Class WsSIGWeb 'SOLO SI ESTA CANCELADA ANTE SAT EN SIG SE INTENTARA CANCELAR DE NUEVO CONTRA EL SAT If CveEstatus = 5 Then - If ObjCancelacion.CFDICancelar(Usuario.Empresa, FolioFiscal, Total, RFCReceptor, Usuario.Empresa.RFC) Then - If ObjVentas.UpdateEstatusFactura(5, FolioFiscal, ObjCancelacion.CancelacionAcuse, Now, PCveVenta.ToEntero, -1, CvePAC:=Usuario.Empresa.CvePAC) Then + Dim Resp As RespuestaCancelacionSAT = ObjCancelacion.CFDICancelar(Usuario.Empresa, FolioFiscal, Total, RFCReceptor, Usuario.Empresa.RFC) + If Resp.Verificado Then + If ObjVentas.UpdateEstatusFactura(5, FolioFiscal, ObjCancelacion.CancelacionAcuse, Resp.CancelacionFecha, PCveVenta.ToEntero, -1, CvePAC:=Usuario.Empresa.CvePAC) Then Retorno = True Else MensajeError = $"Ocurrió un error al actualizar la cancelación la CveVenta {PCveVenta}" diff --git a/App_Code/modExtensiones.vb b/App_Code/modExtensiones.vb index bb6c90d07..0cad09345 100644 --- a/App_Code/modExtensiones.vb +++ b/App_Code/modExtensiones.vb @@ -147,6 +147,16 @@ Namespace Extensiones End If End Function + Public Class RespuestaCancelacionSAT + Public Property Verificado As Boolean = False + Public Property CveEstatus As Integer = 0 + Public Property Estado As String = "" + Public Property EstatusCancelacion As String = "" + Public Property CancelacionFecha As Date + Public Property CancelacionAcuse As String = "" + End Class + + #Region "Log"