@@ -1268,6 +1316,10 @@
// printJS({ printable: urlPDF, type: 'pdf', showModal: true });
//}
+ function BtnEnviarMailCancelacion() {
+ $('#BtnEnviarMailCancelacion').click();
+ }
+
function chkAnt(t, txt, importe, AmorContrato = 0) {
let totalAnt = 0;
@@ -1375,7 +1427,7 @@
let totalDebito = ToDouble($get("TxtImporteDebito").value);
let totalCheque = ToDouble($get("TxtImporteCheque").value);
let totalTransferencia = ToDouble($get("TxtImporteTransferencia").value);
- let TotalOtrosContado = 0;
+ let TotalOtrosContado = 0;
let total = totalEfectivo + totalCredito + totalDebito + totalCheque + totalTransferencia;
diff --git a/Ventas/PVCobranza.aspx.vb b/Ventas/PVCobranza.aspx.vb
index 66d031f83..73019e857 100644
--- a/Ventas/PVCobranza.aspx.vb
+++ b/Ventas/PVCobranza.aspx.vb
@@ -25,6 +25,18 @@ Partial Class Ventas_PVCobranza
End Set
End Property
+ Private Property CveVentaCancelacion As Integer
+ Get
+ If ViewState("CveVentaCancelacion") Is Nothing Then
+ ViewState("CveVentaCancelacion") = -1
+ End If
+ Return ViewState("CveVentaCancelacion").ToString.ToEntero
+ End Get
+ Set(value As Integer)
+ ViewState("CveVentaCancelacion") = value
+ End Set
+ End Property
+
Private Property TmpDTAnticiposNCIxCCliente As DataTable
Get
Return If(IsNothing(ViewState("TmpDTAnticiposNCIxCCliente")), Nothing, CType(ViewState("TmpDTAnticiposNCIxCCliente"), DataTable))
@@ -365,9 +377,30 @@ Partial Class Ventas_PVCobranza
End If
MuestraNoTimbradasCentroCosto()
+ If UsuarioActual.Empresa.Funcionalidad(382) = "1" Then
+ CargaCancelaciones()
+ End If
End Sub
+ Private Sub CargaCancelaciones()
+ DivCancelacionesPendientes.Visible = True
+ Dim DtVentas As DataTable = Nothing
+
+ Dim ObjVentas = New ClsVentas()
+ If ObjVentas.GetVentasPendientesCancelacion(UsuarioActual.CveEmpresa, UsuarioActual.CveUsuario) Then
+ DtVentas = ObjVentas.DtResultados.Copy()
+ End If
+ ObjVentas.Dispose()
+
+ If DtVentas IsNot Nothing Then
+ GvCancelaciones.DataSource = DtVentas.FiltraParametros("(CveEstatusFactura IN (20,23) AND CveEstatusRefacturacion IN (0,4))")
+ GvCancelaciones.DataBind()
+ End If
+
+ UpL.Update()
+ End Sub
+
Private Sub GvDatos_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvDatos.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
@@ -770,6 +803,12 @@ Partial Class Ventas_PVCobranza
AjustarTimbre(respFactura.Factura, Nothing)
MsgTimbrado = TimbrarFactura(respFactura.Factura, Nothing)
End If
+
+ If Not String.IsNullOrEmpty(MsgTimbrado) Then
+ Dim StrEr As String = $"
Comprobante no emitido : {MsgTimbrado}
Por favor inténtelo de nuevo a través del botón 'Emitir' en ventas.
"
+ MsgTimbrado = StrEr
+ End If
+
End If
If respFactura IsNot Nothing Then
@@ -1233,7 +1272,7 @@ Partial Class Ventas_PVCobranza
Dim TimbroNC As Boolean = ObjTimbradoNC.TimbrarFactura(UsuarioActual, ObjNC)
If Not TimbroNC Then
- MsgErrorTimbrado = ObjTimbradoNC.MensajeErrorCFDI
+ MsgErrorTimbrado = $"{MsgErrorTimbrado} {ObjTimbradoNC.MensajeErrorCFDI}"
End If
ObjTimbradoNC = Nothing
End If
@@ -2160,4 +2199,391 @@ Partial Class Ventas_PVCobranza
UpContadoOtros.Update()
End Sub
+
+#Region "C A N C E L A C I O N E S"
+
+
+ Protected Sub BtnValidar_Click(ByVal sender As Object, ByVal e As EventArgs)
+ CveVentaCancelacion = -1
+
+ Dim GvRow As GridViewRow = CType(((CType(sender, LinkButton)).NamingContainer), GridViewRow)
+ CveVentaCancelacion = GvRow.DataKey("CveVenta").ToEntero()
+ Dim CveCliente As Integer = GvRow.DataKey("CveCliente").ToEntero()
+ Dim Total As String = GvRow.DataKey("Total")
+ Dim SubTotal As String = GvRow.DataKey("SubTotal")
+ Dim Uuid As String = GvRow.DataKey("FolioFiscal")
+ Dim RFCReceptor As String = GvRow.DataKey("RFCReceptor")
+ Dim Folio As String = GvRow.DataKey("Folio")
+ Dim TipoDocto As String = GvRow.DataKey("TipoDocto")
+ Dim Nombre As String = GvRow.DataKey("Nombre")
+ Dim CveEstatusRefact As String = GvRow.DataKey("CveEstatusRefacturacion")
+ Dim Msg As String
+
+ If CveVentaCancelacion > 0 AndAlso Uuid <> "" Then
+ Dim resp = VerificarVigenciaSAT(CveVentaCancelacion, CveCliente, Folio, TipoDocto, Uuid, UsuarioActual.Empresa.RFC, RFCReceptor, Total)
+
+ If resp.EnviarAcuse Then
+ Msg = resp.Mensaje
+
+ If CveEstatusRefact = "4" Then
+ Msg = Msg & "
Refacturar"
+ End If
+
+ Alert(Msg, TipoMensaje.MsgConfirmacion, "BtnEnviarMailCancelacion();", TextoConfirmacion:="Enviar", TextoSegundoBoton:="Cancelar")
+ Else
+ Msg = resp.Mensaje
+
+ If CveEstatusRefact = "4" Then
+ Msg = Msg & "
Refacturar"
+ End If
+
+ Alert(Msg)
+ End If
+ End If
+
+ CargaCancelaciones()
+ End Sub
+
+ Private Function VerificarVigenciaSAT(ByVal CveVenta As Integer, ByVal CveCliente As Integer, ByVal Folio As String, ByVal TipoDocto As String, ByVal uuid As String, ByVal emisor As String, ByVal receptor As String, ByVal total As String, ByVal Optional EsRefacturacion As Boolean = False, ByVal Optional FolioSustitucion As String = "", ByVal Optional CveEstatusFactura As Integer = -1, ByVal Optional CveMotivoSustitucion As Integer = 0) As MRespuestaSAT
+ Dim retorno = New MRespuestaSAT With {
+ .Mensaje = "",
+ .EnviarAcuse = False,
+ .LigaRefacturacion = "",
+ .IrARefacturar = False
+ }
+ Dim sb = New StringBuilder()
+ Dim CancelacionAcuse As String = ""
+ Dim CancelacionFecha As DateTime = NowADS()
+ Dim CveEstatus As Integer = 4
+
+ Try
+ Dim resp = Timbrado.VerificarVigenciaSAT(uuid, UsuarioActual.Empresa.RFC, receptor, total, True)
+
+ If resp IsNot Nothing Then
+
+ If resp.Estado Is Nothing Then
+ sb.Append("No se pudo comprobar el estado de la factura. El servicio del sat no esta disponible")
+ retorno.Mensaje = sb.ToString()
+ Return retorno
+ End If
+
+ sb.AppendFormat("Folio Fiscal: {0}
", uuid)
+ sb.AppendFormat("Código Estado: {0}
", resp.CodigoEstatus)
+ sb.AppendFormat("Estado: {0}
", resp.Estado)
+ sb.AppendFormat("Es Cancelable: {0}
", If(String.IsNullOrEmpty(resp.EsCancelable), "Desconocido", resp.EsCancelable))
+ sb.AppendFormat("Estatus de Cancelación: {0}
", If(String.IsNullOrEmpty(resp.EsCancelable), "Desconocido", resp.EstatusCancelacion))
+
+ If Not UsuarioActual.Empresa.FacturaProduccion AndAlso (String.IsNullOrEmpty(uuid) OrElse uuid.Contains("test")) Then
+ Dim respCancelacion = CancelarDocumento(CveVenta, CveEstatus, CveCliente, Folio, uuid, CancelacionAcuse, CancelacionFecha, TipoDocto, total.ToDouble(), UsuarioActual.Empresa.CvePAC, EsRefacturacion:=EsRefacturacion, FolioSustitucion:=FolioSustitucion, CveMotivoCancelacion:=CveMotivoSustitucion)
+
+ If Not respCancelacion.HuboError Then
+ CveEstatus = respCancelacion.CveEstatus
+ retorno.EnviarAcuse = True
+ sb.Append("El documento se canceló correctamente.")
+ sb.Append($" Imprimir Acuse")
+
+ If Not EsRefacturacion Then
+ sb.Append(" ¿Desea enviar el Acuse de Cancelación al Cliente?")
+ End If
+ End If
+ Else
+
+ If EsRefacturacion AndAlso CveEstatusFactura = 20 AndAlso resp.Estado.ToUpper().Trim() = "VIGENTE" AndAlso String.IsNullOrEmpty(resp.EstatusCancelacion) Then
+ CveEstatus = 23
+ Dim ObjVentas = New ClsVentas()
+
+ If ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa) Then
+ sb.Append("El estatus de la factura fue cambiado a 'Cancelación Pendiente'.")
+ Else
+ sb.Append("Ocurrió un error al cambiar el estatus de la factura.")
+ End If
+
+ ObjVentas.Dispose()
+ ElseIf resp.Estado.ToUpper().Trim() = "CANCELADO" OrElse resp.EstatusCancelacion.ToUpper() = "PLAZO VENCIDO" Then
+ CveEstatus = 5
+ Dim respCancelacion = CancelarDocumento(CveVenta, CveEstatus, CveCliente, Folio, uuid, CancelacionAcuse, CancelacionFecha, TipoDocto, total.ToDouble(), UsuarioActual.Empresa.CvePAC, EsRefacturacion:=EsRefacturacion, FolioSustitucion:=FolioSustitucion, CveMotivoCancelacion:=CveMotivoSustitucion)
+
+ If Not respCancelacion.HuboError Then
+
+ If respCancelacion.CveEstatus > 0 Then
+ retorno.EnviarAcuse = True
+ CveEstatus = respCancelacion.CveEstatus
+ Dim ObjVentas = New ClsVentas()
+
+ If ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa) Then
+
+ If respCancelacion.CveEstatus = 20 Then
+ sb.Append("El estatus de la factura fue cambiado a 'Cancelación en proceso'.")
+ ElseIf respCancelacion.CveEstatus = 23 Then
+ sb.Append("La solicitud de cancelación no la aplicó el SAT, intente cancelar de nuevo.
")
+ sb.AppendFormat("Folio Fiscal: {0}
", uuid)
+ sb.AppendFormat("Código Estado: {0}
", resp.CodigoEstatus)
+ sb.AppendFormat("Estado: {0}
", resp.Estado)
+ sb.AppendFormat("Es Cancelable: {0}
", If(String.IsNullOrEmpty(resp.EsCancelable), "Desconocido", resp.EsCancelable))
+ sb.AppendFormat("Estatus de Cancelación: {0}
", If(String.IsNullOrEmpty(resp.EsCancelable), "Desconocido", resp.EstatusCancelacion))
+ Else
+ sb.Append("El estatus de la factura fue cambiado a 'Cancelada'.")
+ End If
+ Else
+ sb.Append("Ocurrió un error al cambiar el estatus de la factura.")
+ End If
+
+ ObjVentas.Dispose()
+ sb.Append("El documento se canceló correctamente.")
+ sb.Append($" Imprimir Acuse")
+
+ If Not EsRefacturacion Then
+ sb.Append(" ¿Desea enviar el Acuse de Cancelación al Cliente?")
+ End If
+ Else
+ sb.Append(respCancelacion.Mensaje)
+ End If
+ End If
+ ElseIf resp.EstatusCancelacion.ToUpper() = "SOLICITUD RECHAZADA" Then
+ CveEstatus = 3
+ Dim Estatus As String = "Emitida"
+
+ If EsRefacturacion Then
+ CveEstatus = 23
+ Estatus = "Cancelación pendiente"
+ End If
+
+ Dim ObjVentas = New ClsVentas()
+
+ If ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa) Then
+ sb.Append($"El estatus de la factura fue cambiado a '{Estatus}'.")
+ Else
+ sb.Append("Ocurrió un error al cambiar el estatus de la factura.")
+ End If
+
+ ObjVentas.Dispose()
+ ElseIf resp.Estado.ToUpper().Trim() = "VIGENTE" AndAlso String.IsNullOrEmpty(resp.EstatusCancelacion) AndAlso Not EsRefacturacion Then
+ CveEstatus = 3
+ Dim Estatus As String = "Emitida"
+
+ If EsRefacturacion Then
+ CveEstatus = 23
+ Estatus = "Cancelación pendiente"
+ End If
+
+ Dim ObjVentas = New ClsVentas()
+
+ If ObjVentas.UpdateEstatusVenta(CveVenta, CveEstatus, UsuarioActual.CveEmpresa) Then
+ sb.Append($"El estatus de la factura fue cambiado a '{Estatus}'.")
+ Else
+ sb.Append("Ocurrió un error al cambiar el estatus de la factura.")
+ End If
+
+ ObjVentas.Dispose()
+ ElseIf (resp.EsCancelable.ToUpper() = "NO CANCELABLE") Then
+ sb.Append("Esta factura no es cancelable.")
+ retorno.Mensaje = sb.ToString()
+ Return retorno
+ End If
+ End If
+ Else
+ sb.Append("No se pudo comprobar la vigencia de la factura.")
+ retorno.Mensaje = sb.ToString()
+ Return retorno
+ End If
+
+ Catch ex As Exception
+ sb.Append("Error al consumir el servicio: " & ex.Message)
+ retorno.Mensaje = sb.ToString()
+ Return retorno
+ End Try
+
+ retorno.CveEstatus = CveEstatus
+ retorno.Mensaje = sb.ToString()
+ Return retorno
+ End Function
+
+ Private Function CancelarDocumento(ByVal CveVenta As Integer, ByVal CveEstatus As Integer, ByVal CveCliente As Integer, ByVal Folio As String, ByVal FolioFiscal As String, ByVal CancelacionAcuse As String, ByVal CancelacionFecha As DateTime, ByVal TipoComprobante As String, ByVal Total As Double, ByVal CvePACCancelacion As Integer, ByVal Optional EsRefacturacion As Boolean = False, ByVal Optional FolioSustitucion As String = "", ByVal Optional CveEstatusRefacturacion As Integer = 0, ByVal Optional CveMotivoCancelacion As Integer = 0) As Modelos.Factura.MCancelacionVentaMensaje
+ Dim retorno As Modelos.Factura.MCancelacionVentaMensaje = Nothing
+ Dim factura = New Modelos.Factura(UsuarioActual, CveVenta, UsuarioActual.CveEmpresa, EsCancelacion:=True, VerificaAlmacen:=True)
+
+ If factura.ErrorList.Count > 0 Then
+ retorno.HuboError = True
+ Return retorno
+ End If
+
+ If EsRefacturacion Then
+
+ If Not String.IsNullOrEmpty(FolioSustitucion) Then
+ CveEstatusRefacturacion = 2
+ End If
+
+ If CveEstatusRefacturacion > 0 Then
+ factura.CveEstatusRefacturacion = CveEstatusRefacturacion
+ End If
+
+ If CveMotivoCancelacion > 0 Then
+ factura.CveMotivoCancelacion = CveMotivoCancelacion
+ End If
+
+ Dim CveEstatusFactura As Integer = -1
+
+ If CveEstatus = 5 Then
+ CveEstatusFactura = CveEstatus
+ End If
+
+ If CveEstatus = -2 Then
+ CveEstatusFactura = -1
+ End If
+
+ retorno = factura.CancelarPorRefacturacion(factura.CveMotivoCancelacion, factura.MotivoCancelacion, FolioSustitucion:=FolioSustitucion, CveEstadoCancelacion:=CveEstatusFactura)
+ Else
+
+ If UsuarioActual.Empresa.Funcionalidad(531) = "1" AndAlso factura.TipoDocto = "Dev" AndAlso factura.SaldoAlmacen <> 0 Then
+ factura.RealizarDevolucionAlmacen = 1
+ End If
+
+ If UsuarioActual.Empresa.Funcionalidad(567) = "1" AndAlso factura.TipoDocto.Contiene("Ing", "Dev") AndAlso factura.SaldoAlmacen <> 0 Then
+ factura.RealizarDevolucionAlmacen = 1
+ End If
+
+ If UsuarioActual.TienePermisoProceso(269) AndAlso factura.TipoDocto.Contiene("Ing", "Dev") AndAlso factura.SaldoAlmacen <> 0 Then
+ factura.RealizarDevolucionAlmacen = 1
+ End If
+
+ If factura.TipoDocto = "Ing" Then
+
+ Using ObjVentas = New ClsVentas()
+
+ If ObjVentas.GetRemisionesRelacionadas(CveVenta, factura.TipoDocto) Then
+
+ If ObjVentas.DtResultados.Copy().Rows.Count > 0 Then
+ factura.RealizarDevolucionAlmacen = 1
+ End If
+ Else
+ retorno = New Modelos.Factura.MCancelacionVentaMensaje()
+ retorno.Mensaje = "No se pudo verificar si tiene remisiones relacionadas"
+ retorno.HuboError = True
+ Return retorno
+ End If
+ End Using
+ End If
+
+ Dim CancelacionPagos = Modelos.OpcionesCancelacionPagos.SinPagos
+
+ If UsuarioActual.Empresa.Funcionalidad(109) = "1" OrElse UsuarioActual.Empresa.Funcionalidad(382) = "1" Then
+ CancelacionPagos = Modelos.OpcionesCancelacionPagos.ConPagos_CancelarIE
+ End If
+
+ retorno = factura.EjecutarCancelacionPendiente(CveEstatus, CancelacionFecha, CancelacionAcuse, CancelacionPagos:=CancelacionPagos)
+ End If
+
+ Return retorno
+ End Function
+
+ Protected Sub GvCancelaciones_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
+ If e.Row.RowType = DataControlRowType.DataRow Then
+ Dim gv As GridView = CType(sender, GridView)
+
+ If Not (e.Row.DBCampo("PuedeRefacturar").ToEntero() = 0 OrElse Not String.IsNullOrEmpty(e.Row.DBCampo("FolioFiscalSustitucion"))) Then
+ e.Row.FCHyperLink("HplRefact").NavigateUrl = String.Format("/Ventas/Ventas.aspx?CveDevolucion={0}&NuevaFactura=1", e.Row.DBCampo("CveVenta"))
+ e.Row.FCHyperLink("HplRefact").Visible = True
+ End If
+
+ If e.Row.DBCampo("CveEstatusRefacturacion") = "4" AndAlso gv.ID = "GvDatos" Then
+ e.Row.FCLinkButton("BtnValidar").Text = "02"
+ e.Row.FCLinkButton("BtnValidar").CssClass = "btn btn-circle btn-sm blue"
+ End If
+
+ If e.Row.DBCampo("PuedeRefacturar") = "0" AndAlso e.Row.DBCampo("CveEstatusFactura") = "23" AndAlso e.Row.DBCampo("CveVentaSustitucion").ToEntero() > 0 Then
+ If e.Row.FCLinkButton("LnkCancelar") IsNot Nothing Then e.Row.FCLinkButton("LnkCancelar").Visible = True
+ End If
+ End If
+ End Sub
+
+ Public Sub BtnEnviarMailCancelacion_Click(ByVal sender As Object, ByVal e As EventArgs)
+ If CveVentaCancelacion > 0 Then
+ ImprimeCancelacion(CveVentaCancelacion)
+ Else
+ Alert("No se encontro la factura para enviar el acuse", TipoMensaje.MsgAdvertencia)
+ End If
+ End Sub
+
+ Public Sub ImprimeCancelacion(ByVal CveVenta As Integer)
+ Dim Archivo = New System.IO.FileInfo(ModExtensiones.DirectorioBaseEmpresas & "Empresas\Grales\Formatos\AcuseCancelacion.rdlc")
+
+ If Archivo.Exists Then
+ Dim ObjFactura = New Modelos.Factura(UsuarioActual, CveVenta, UsuarioActual.CveEmpresa, CargaDTDetalle:=False, CargaDatosRelacionados:=False)
+ Dim ObjetoPDF As Byte() = DescargarPDF(Encripta(String.Format("OP=CAN&CVEVTA={0}", CveVenta)))
+ Dim LSRutasMail As List(Of ClsSisMail.ArchivoMail) = New List(Of ClsSisMail.ArchivoMail)()
+ Dim Asunto As String = String.Empty
+ Dim Cuerpo As String = String.Empty
+ Dim sb As StringBuilder = New StringBuilder()
+
+ sb.Append("")
+ sb.Append("")
+ sb.Append("")
+ sb.Append("")
+ sb.Append(" Acuse De Cancelación")
+ sb.Append(vbTab & "")
+ sb.Append("")
+ sb.Append("")
+ sb.Append(" ")
+ sb.Append($" Estimado Cliente {ObjFactura.Cliente.Nombre},
")
+ sb.Append($" A través del presente medio la Empresa {UsuarioActual.Empresa.Empresa} - {UsuarioActual.Empresa.RFC}, canceló el documento tipo {ObjFactura.TipodeComprobante}
")
+ sb.Append($" con folio {ObjFactura.SerieFolio} y el Importe de ${ObjFactura.Total}.
")
+ sb.Append(" Le hacemos llegar el acuse de cancelación. ")
+ sb.Append(" ")
+ sb.Append("
")
+ sb.Append(" Este correo se generó automaticamente, favor de no responder este mensaje.")
+ sb.Append(" ")
+ sb.Append("")
+ sb.Append("")
+
+ Asunto = $"Acuse de Cancelacion {ObjFactura.SerieFolio}"
+ Cuerpo = sb.ToString()
+ Dim DisplayName As String = ""
+
+ LSRutasMail.Add(New ClsSisMail.ArchivoMail() With {
+ .ArchivoBinario = ObjetoPDF,
+ .NombreArchivo = $"AcuseCancelacion{ObjFactura.SerieFolio}.pdf"
+ })
+ Dim ObjMail As ClsSisMail = New ClsSisMail()
+
+ If ObjMail.SendMail(UsuarioActual.Empresa, ObjFactura.Cliente.Mail, Asunto, Cuerpo, "", LSRutasMail, Displayname:=DisplayName) Then
+ Alert("El acuse de cancelación ha sido envíado correctamente.")
+ Else
+ Alert("El acuse de cancelación no pudo ser enviado.", TipoMensaje.MsgError)
+ End If
+ End If
+ End Sub
+ Private Function DescargarPDF(Parametros As String) As Byte()
+ Dim Url = New Uri(String.Format("{0}Compras/PopUpVerFactura.aspx?P={1}", ClsPaginas.UrlSitio, Parametros))
+ Dim File As Byte() = Nothing
+ Try
+ Using httpClient = New HttpClient()
+ httpClient.Timeout = New TimeSpan(0, 1, 0)
+ Using request = New HttpRequestMessage(HttpMethod.Get, Url)
+ request.Headers.Add("ADSToken", Encripta(String.Format("CVEEMPRESA={0}&TICKS={1}&CVEUSUARIO={2}", UsuarioActual.CveEmpresa, DateTime.UtcNow.Ticks, UsuarioActual.CveUsuario)))
+ Dim response = httpClient.SendAsync(request).Result
+ If response.StatusCode = Net.HttpStatusCode.OK Then
+ File = response.Content.ReadAsByteArrayAsync().Result
+ End If
+ End Using
+ End Using
+ Catch ex As Exception
+ File = Nothing
+ OnError("Ocurrió un error al descargar la factura", ex)
+ End Try
+
+ Return File
+ End Function
+
+
+
+#End Region
+
End Class
+
+Public Class MRespuestaSAT
+ Public Property CveEstatus As Integer
+ Public Property EnviarAcuse As Boolean
+ Public Property LigaRefacturacion As String
+ Public Property IrARefacturar As Boolean
+ Public Property Mensaje As String
+End Class
\ No newline at end of file