diff --git a/App_Code/CFDITimbreRetenciones.vb b/App_Code/CFDITimbreRetenciones.vb new file mode 100644 index 000000000..12cc0135b --- /dev/null +++ b/App_Code/CFDITimbreRetenciones.vb @@ -0,0 +1,134 @@ +Option Strict On +Option Explicit On +Imports Extensiones + + +Public Class CFDITimbreRetenciones + Private StrMsg As StringBuilder + Public Property Retencion As CFDIRetencion + Public Property CFDIRelacionados As CFDIRelacionados + Public Property Fecha As DateTime + Public Property Emisor As CFDIEmisor + Public Property Receptor As CFDIReceptorR + Public Property RetencionesImpuestos As List(Of CFDIImpuestosRetenidos) + Public Property ISRCorrespondiente As Decimal = 0 + 'Public Property Complementos As CFDIComplementos + Public Property Timbrado As Boolean + Public Property IStimbreFiniquito As Boolean + + Public ReadOnly Property TotalOperacionRetenidos As Decimal + Get + Return (From c In RetencionesImpuestos + Where c.ImpuestoRetencion = "001" + Select c.MontoRetencion).Sum + End Get + End Property + + Public ReadOnly Property TotalImpuestosGravado As Decimal + Get + Return (From c In RetencionesImpuestos + Where c.ImpuestoRetencion = "001" + Select c.MontoRetencion).Sum + End Get + End Property + + Public ReadOnly Property TotalImpuestosRetenidos As Decimal + Get + Return (From c In RetencionesImpuestos + Where c.ImpuestoRetencion = "001" + Select c.MontoRetencion).Sum + End Get + End Property + Public ReadOnly Property TotalImpuestosExento As Decimal + Get + Return (From c In RetencionesImpuestos + Where c.ImpuestoRetencion = "001" + Select c.MontoRetencion).Sum + End Get + End Property + + + 'Public ReadOnly Property Retenciones As List(Of CFDIRetenciones) + ' Get + ' Dim tRetorno As New List(Of CFDIRetenciones) + ' Dim TRetenciones As New List(Of CFDIRetenciones) + ' For Each c As CFDIConceptos In Conceptos + ' For Each imp As CFDIConceptosImpuestos In c.Impuestos + ' If imp.TrasladooRetencion = "R" Then + ' tRetorno.Add(New CFDIRetenciones With {.Impuesto = imp.Impuesto, .Importe = imp.Importe}) + ' 'If imp.Impuesto = "001" Then RetencionISR += imp.Importe + ' 'If imp.Impuesto = "002" Then RetencionIVA += imp.Importe + ' 'If imp.Impuesto = "003" Then RetencionIEPS += imp.Importe + ' End If + ' Next + ' Next + ' If tRetorno.Count > 0 Then + ' TRetenciones = tRetorno.GroupBy(Function(t) New With {Key t.Impuesto}) _ + ' .Select(Function(t) New CFDIRetenciones With {.Impuesto = t.Key.Impuesto, + ' .Importe = t.Sum(Function(tt) tt.Importe)}) _ + ' .OrderBy(Function(x) x.Impuesto).ToList + ' End If + ' 'If RetencionISR > 0 Then Retorno.Add(New CFDIRetenciones With {.Impuesto = "001", .Importe = RetencionISR}) + ' 'if RetencionIVA > 0 Then Retorno.Add(New CFDIRetenciones With {.Impuesto = "002", .Importe = RetencionIVA}) + ' 'If RetencionIEPS > 0 Then Retorno.Add(New CFDIRetenciones With {.Impuesto = "003", .Importe = RetencionIEPS}) + ' tRetorno = Nothing + ' Return TRetenciones + + ' End Get + 'End Property + + Public ReadOnly Property Mensaje As String + Get + Return StrMsg.ToString + End Get + End Property + Sub New() + StrMsg = New StringBuilder + Retencion = New CFDIRetencion + CFDIRelacionados = New CFDIRelacionados + Emisor = New CFDIEmisor + Receptor = New CFDIReceptorR + RetencionesImpuestos = New List(Of CFDIImpuestosRetenidos) + 'Complementos = New CFDIComplementos + End Sub + + Public Sub AddMsg(Msg As String) + StrMsg.AppendLine(Msg) + End Sub + +End Class + +Public Class CFDIRetencion + Public Property Version As String + Public Property Serie As String = "" + Public Property Folio As String = "" + Public ReadOnly Property SerieFolio As String + Get + 'sino tiene serie no pone el guión + Return If(Serie = "", Folio, $"{Serie}-{Folio}") + End Get + End Property + Public Property ClaveRetencion As String = "28" + Public Property Fecha As Date + Public Property LugarExpedicion As String = "" + Public Property PeriodoMesInicio As String = "" + Public Property PeriodoMesFin As String = "" + Public Property PeriodoEjercicio As Integer = 0 + +End Class + + +Public Class CFDIReceptorR + Public Property RFCR As String + Public Property NombreDenominacionR As String + Public Property NacionalidadR As String = "Nacional" + Public Property DomicilioFiscalR As String = "" +End Class +Public Class CFDIImpuestosRetenidos + Public Property BaseRetencion As Decimal = 0.00D + Public Property ImpuestoRetencion As String = "" '001,002,003 + Public Property MontoRetencion As Decimal = 0.00D ' propiedad utilizada solo para hacer ajustes, por default toma la multiplicación de base * tasa + Public Property TipoPagoRetencion As String = "" + Public Property BaseRetencionGravado As Decimal = 0.00D + Public Property BaseRetencionExento As Decimal = 0.00D +End Class diff --git a/General/TimbraRetencion.aspx b/General/TimbraRetencion.aspx new file mode 100644 index 000000000..4b95fe6dc --- /dev/null +++ b/General/TimbraRetencion.aspx @@ -0,0 +1,171 @@ +<%@ Page Title="" Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="TimbraRetencion.aspx.vb" Inherits="General_TimbraRetencion" %> + + + + + + + + Timbrados de retenciones + + + + + + +
  • + Agregar Retención
  • + +
    +
    +
  • + Genera Excel +
  • +
    + + + + + + + diff --git a/General/TimbraRetencion.aspx.vb b/General/TimbraRetencion.aspx.vb new file mode 100644 index 000000000..d62ce4858 --- /dev/null +++ b/General/TimbraRetencion.aspx.vb @@ -0,0 +1,345 @@ +Option Explicit On +Option Strict On +Imports System.IO +Imports System.Data +Imports System.Xml +Imports System.Xml.Serialization +Imports ADSNetLibrary.PacsTimbrado.SAT +Imports Extensiones +Imports Profact.TimbraCFDI40 + +Partial Class General_TimbraRetencion + Inherits ClsPaginas + +#Region "PROPIEDADES" + Private Property CveMarca() As Integer + Get + Return If(IsNothing(ViewState("CveMarca")), -1, CInt(ViewState("CveMarca"))) + End Get + Set + ViewState("CveMarca") = Value + End Set + End Property + Private Property Modalidad() As String + Get + Return If(IsNothing(ViewState("Modalidad")), "", (ViewState("Modalidad").ToString)) + End Get + Set + ViewState("Modalidad") = Value + End Set + End Property + + Private Property DtDetalle As Data.DataTable + Get + Return If(IsNothing(ViewState("DtDetalle")), Nothing, CType(ViewState("DtDetalle"), DataTable)) + End Get + Set(value As DataTable) + ViewState("DtDetalle") = value + End Set + End Property + +#End Region + + Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load + If Not IsPostBack Then + DdlClientes.setEsWebService(True) + End If + End Sub + +#Region "Timbra" + Private Function TimbraRetencion(cfditimbre As CFDITimbreRetenciones, UsuarioActual As Usuario) As String + Dim sw As New Diagnostics.Stopwatch + Dim swTiempo As New StringBuilder + Dim swmili As Long = 0 + sw.Start() + Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}" + Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}" + + Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey + Dim EmisorRFC As String = UsuarioActual.Empresa.RFC + Dim EmisorNombre As String = UsuarioActual.Empresa.Empresa + Dim SubTotal As Decimal = 0 + Dim AmbienteProductivo As Boolean = True + Dim NumDecimalesImporte As Integer = 2 + + + If Not ClsPaginas.EsProduccion AndAlso (Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1) Then + AmbienteProductivo = False + Clave = "12345678a" + EmisorRFC = "EKU9003173C9" + EmisorNombre = "ESCUELA KEMPER URGATE" + ArchivoLLave = $"{Extensiones.ModExtensiones.DirectorioEmpresas}\1\Certificados\EKU9003173C9.key" + ArchivoCertificado = $"{Extensiones.ModExtensiones.DirectorioEmpresas}\1\Certificados\EKU9003173C9.cer" + UsuarioActual.Empresa.CodigoRegimenFiscal = "601" + End If + +#Region "Valida" + If Not File.Exists(ArchivoCertificado) Then + Alert("El archivo de certificado no existe", TipoMensaje.MsgError) + Return "" + End If + If Not File.Exists(ArchivoLLave) Then + Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) + Return "" + End If + If UsuarioActual.Empresa.ContraseñaKey = "" Then + Alert("La clave no puede ser vacía", TipoMensaje.MsgError) + Return "" + End If +#End Region + + +#Region "Variables" + Dim llaveByte As Byte(), certByte As Byte() + Dim llaveBase64 As String, certBase64 As String + + Dim complemento As String = "" + Dim complementoConcepto As String = "" + '//Inicializamos el conector el parámetro indica el ambiente en el que se utilizará + '//Fasle = Ambiente de pruebas + '//True = Ambiente de producción + Dim cfdi As New Profact.TimbraCFDI40.Conector(AmbienteProductivo) + Dim comprobante As New Profact.TimbraCFDI40.Comprobante() + + If Not UsuarioActual.Empresa.FacturaProduccion OrElse UsuarioActual.CveEmpresa = 1 OrElse Not ClsPaginas.EsProduccion Then + cfdi.EstableceCredenciales("mvpNUXmQfK8=") + Else + cfdi.EstableceCredenciales($"vSGxMFWnNRy/nDoowxqrqw==|Sia123654") + End If + +#End Region + +#Region "Verifica" + Try + llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) + llaveBase64 = Convert.ToBase64String(llaveByte) + Catch ex As Exception + Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) + Return "" + End Try + + Try + certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) + certBase64 = Convert.ToBase64String(certByte) + Catch ex As Exception + Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) + Return "" + End Try + sw.Stop() + swTiempo.AppendFormat("Verificado : ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() +#End Region + 'CType([Enum].Parse(GetType(ProfactCartaPorte.CartaPorteTranspInternac), Carta.TranspInternac), ProfactCartaPorte.CartaPorteTranspInternac) + + Dim retenciones As Retenciones = New Profact.TimbraCFDI40.Retenciones() + retenciones.Version = "2.0" + retenciones.FechaExp = cfditimbre.Fecha + retenciones.CveRetenc = CType([Enum].Parse(GetType(c_CveRetenc), "Item" & cfditimbre.Retencion.ClaveRetencion), c_CveRetenc) + retenciones.Emisor = New RetencionesEmisor() + retenciones.Emisor.RfcE = EmisorRFC + retenciones.Emisor.NomDenRazSocE = EmisorNombre + retenciones.Emisor.RegimenFiscalE = CType([Enum].Parse(GetType(c_RegimenFiscal), "Item" & UsuarioActual.Empresa.CodigoRegimenFiscal), c_RegimenFiscal) + retenciones.LugarExpRetenc = cfditimbre.Retencion.LugarExpedicion + + Dim retencionNacional As RetencionesReceptorNacional = New RetencionesReceptorNacional() + retenciones.Receptor = New RetencionesReceptor() + retenciones.Receptor.NacionalidadR = If(cfditimbre.Receptor.NacionalidadR = "Nacional", RetencionesReceptorNacionalidadR.Nacional, RetencionesReceptorNacionalidadR.Extranjero) + retencionNacional.RfcR = cfditimbre.Receptor.RFCR + retencionNacional.NomDenRazSocR = cfditimbre.Receptor.NombreDenominacionR + retencionNacional.DomicilioFiscalR = cfditimbre.Receptor.DomicilioFiscalR + retenciones.Receptor.Item = retencionNacional + If cfditimbre.CFDIRelacionados.TipoRelacion <> "" Then + For Each uid As String In cfditimbre.CFDIRelacionados.UUID + Dim uuidrela As New RetencionesCfdiRetenRelacionados + uuidrela.TipoRelacion = CType([Enum].Parse(GetType(c_TipoRelacion), "Item" & cfditimbre.CFDIRelacionados.TipoRelacion), c_TipoRelacion) + uuidrela.UUID = uid + retenciones.CfdiRetenRelacionados = uuidrela + Next + End If + + retenciones.Periodo = New RetencionesPeriodo() + retenciones.Periodo.MesIni = CType([Enum].Parse(GetType(c_Periodo), "Item" & cfditimbre.Retencion.PeriodoMesInicio), c_Periodo) + retenciones.Periodo.MesFin = CType([Enum].Parse(GetType(c_Periodo), "Item" & cfditimbre.Retencion.PeriodoMesFin), c_Periodo) + retenciones.Periodo.Ejercicio = CType([Enum].Parse(GetType(c_Ejercicio), "Item" & cfditimbre.Retencion.PeriodoEjercicio.ToString), c_Ejercicio) + retenciones.Totales = New RetencionesTotales() + retenciones.Totales.MontoTotOperacion = 0 + retenciones.Totales.MontoTotGrav = 0 + retenciones.Totales.MontoTotExent = 0 + retenciones.Totales.MontoTotRet = cfditimbre.TotalImpuestosRetenidos + retenciones.Totales.UtilidadBimestral = 1 + retenciones.Totales.UtilidadBimestralSpecified = True + retenciones.Totales.ISRCorrespondiente = cfditimbre.ISRCorrespondiente + retenciones.Totales.ISRCorrespondienteSpecified = True + retenciones.Totales.ImpRetenidos = New RetencionesTotalesImpRetenidos(cfditimbre.RetencionesImpuestos.Count - 1) {} + Dim i As Integer = 0 + For Each drimp As CFDIImpuestosRetenidos In cfditimbre.RetencionesImpuestos + retenciones.Totales.ImpRetenidos(i) = New RetencionesTotalesImpRetenidos() + retenciones.Totales.ImpRetenidos(i).BaseRet = 0 + retenciones.Totales.ImpRetenidos(i).BaseRetSpecified = True + retenciones.Totales.ImpRetenidos(i).ImpuestoRet = CType([Enum].Parse(GetType(c_Impuesto), "Item0" & drimp.ImpuestoRetencion), c_Impuesto) ' c_Impuesto.Item001 + retenciones.Totales.ImpRetenidos(i).ImpuestoRetSpecified = True + retenciones.Totales.ImpRetenidos(i).MontoRet = drimp.MontoRetencion + retenciones.Totales.ImpRetenidos(i).TipoPagoRet = CType([Enum].Parse(GetType(c_TipoPagoRet), "Item" & drimp.TipoPagoRetencion), c_TipoPagoRet) 'c_TipoPagoRet.Item04 + i += 1 + Next + + 'retenciones.Totales.ImpRetenidos(i) = New RetencionesTotalesImpRetenidos() + 'retenciones.Totales.ImpRetenidos(i).BaseRet = 0 + 'retenciones.Totales.ImpRetenidos(i).BaseRetSpecified = True + 'retenciones.Totales.ImpRetenidos(i).ImpuestoRet = c_Impuesto.Item001 + 'retenciones.Totales.ImpRetenidos(i).ImpuestoRetSpecified = True + 'retenciones.Totales.ImpRetenidos(i).MontoRet = 705 + 'retenciones.Totales.ImpRetenidos(i).TipoPagoRet = c_TipoPagoRet.Item04 + + '' dividendos + 'Dim dividendos As Profact.TimbraCFDI.Dividendos = New Profact.TimbraCFDI.Dividendos() + 'dividendos.Version = "1.0" + 'dividendos.DividOUtil = New Profact.TimbraCFDI.DividendosDividOUtil() + 'dividendos.DividOUtil.CveTipDivOUtil = Profact.TimbraCFDI.c_TipoDividendoOUtilidadDistribuida.Item06 + 'dividendos.DividOUtil.MontISRAcredRetMexico = 0.00D + 'dividendos.DividOUtil.MontISRAcredRetExtranjero = 0.00D + 'dividendos.DividOUtil.TipoSocDistrDiv = Profact.TimbraCFDI.DividendosDividOUtilTipoSocDistrDiv.SociedadNacional + 'dividendos.DividOUtil.MontDivAcumNal = 426180D + 'dividendos.DividOUtil.MontDivAcumNalSpecified = True + 'dividendos.DividOUtil.MontISRAcredNal = 127586D + 'dividendos.DividOUtil.MontDivAcumNalSpecified = True + Dim LXmlComplementos As List(Of XmlElement) = New List(Of XmlElement)() + 'Dim nombres As System.Xml.Serialization.XmlSerializerNamespaces = New System.Xml.Serialization.XmlSerializerNamespaces() + 'nombres.Add("dividendos", "http://www.sat.gob.mx/esquemas/retencionpago/1/dividendos") + 'Dim xmlDividendos As String = Profact.TimbraCFDI.XMLUtilerias.SerializaObjeto(dividendos, GetType(Profact.TimbraCFDI.Dividendos), nombres) + 'Dim docDividendos As XmlDocument = New XmlDocument() + 'docDividendos.LoadXml(xmlDividendos) + 'retenciones.DividendosSpecified = True + 'LXmlComplementos.Add(docDividendos.DocumentElement) + ''fin dividendos + + 'retenciones.Complemento = New RetencionesComplemento() + 'retenciones.Complemento.Any = LXmlComplementos.ToArray() + Dim xmlEncode As String + + Using sww As New System.IO.StringWriter() + Dim xs As XmlSerializer + xs = New System.Xml.Serialization.XmlSerializer(GetType(Profact.TimbraCFDI40.Retenciones)) + xs.Serialize(sww, retenciones) + xmlEncode = sww.ToString() + End Using + + Dim resultadoTimbre As Profact.TimbraCFDI.ResultadoTimbre + resultadoTimbre = cfdi.TimbraRetencion(retenciones) + + If resultadoTimbre.Exitoso Then + Dim Retorno As String = "" + Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\Ret\" + Dim NombreArchivoXML As String = "" + Dim objGrales As New ClsGenerales + objGrales.IniciaTransacSQL() + Dim tCveTimbre As Integer = objGrales.AddGralTimbre("Ret", 12679, cfditimbre.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) + NombreArchivoXML = $"{objGrales.SerieInsertada}-{objGrales.FolioInsertado}.xml" + If Not Directory.Exists(RutaArchivo) Then Directory.CreateDirectory(RutaArchivo) + + If tCveTimbre > 0 Then + If objGrales.UpdateTimbreTimbrado(tCveTimbre, resultadoTimbre.FolioUUID, cfditimbre.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, 3, "4.0") Then + resultadoTimbre.GuardaXml(RutaArchivo, NombreArchivoXML) + Else + Retorno = "Error" + End If + Else + Retorno = "Error" + End If + If Retorno = "" Then + objGrales.Commit() + Else + objGrales.RollBack() + End If + objGrales.Dispose() + + 'If resultadoTimbre.GuardaXml("C:/", "EjemploRetencion_nombre") Then + ' Alert("El xml fue guardado correctamente") + 'Else + ' Alert("Ocurrió un error al guardar el comprobante, por favor verifica los permisos de la carpeta") + 'End If + + 'If resultadoTimbre.GuardaCodigoBidimensional("C:/", "codigoRetencion_nombre") Then + ' Alert("El código bidimensional fue guardado correctamente") + 'Else + ' Alert("Ocurrió un error al guardar el código bidimensional, por favor verifica los permisos de la carpeta") + 'End If + + 'Dim folioFiscal As String = resultadoTimbre.FolioUUID + 'Dim noCertificado As String = resultadoTimbre.No_Certificado + 'Dim noCertificadoSAT As String = resultadoTimbre.No_Certificado_SAT + 'Dim fechaCert As String = resultadoTimbre.FechaCertificacion + 'Dim selloCFDI As String = resultadoTimbre.SelloCFDI + 'Dim selloSAT As String = resultadoTimbre.SelloSAT + 'Dim cadena As String = resultadoTimbre.CadenaTimbre + Alert("Timbrado Exitoso") + Else + Alert(resultadoTimbre.Descripcion) + Dim detalle As String = resultadoTimbre.Detalle + End If + End Function +#End Region + + + Protected Sub BtnEmitirRetencion_Click(sender As Object, e As EventArgs) + Dim cfditimbre As New CFDITimbreRetenciones + cfditimbre.Fecha = Now + cfditimbre.Retencion.ClaveRetencion = DdlClaveRetencion.SelectedValue + cfditimbre.Retencion.PeriodoMesInicio = DdlPeriodoInicio.SelectedValue + cfditimbre.Retencion.PeriodoMesFin = DdlPeriodoFin.SelectedValue + cfditimbre.Retencion.PeriodoEjercicio = DdlEjercicio.SelectedValue.ToEntero + cfditimbre.Retencion.LugarExpedicion = UsuarioActual.Empresa.CP + cfditimbre.Receptor.RFCR = "AEMV690902NM5" + cfditimbre.Receptor.NacionalidadR = "Nacional" + cfditimbre.Receptor.DomicilioFiscalR = "11950" + cfditimbre.Receptor.NombreDenominacionR = "VERONICA MICHELLE ARMENTA MASON" + cfditimbre.CFDIRelacionados.TipoRelacion = "01" + cfditimbre.CFDIRelacionados.UUID.Add("671fdb07-406a-42a6-9a89-40219f663ea1") + cfditimbre.ISRCorrespondiente = 705 + cfditimbre.RetencionesImpuestos.Add(New CFDIImpuestosRetenidos With {.MontoRetencion = 705, .BaseRetencion = 0, .ImpuestoRetencion = "01", .TipoPagoRetencion = "04"}) + + For Each gvr As GridViewRow In GvD.Rows + Dim ret As New CFDIImpuestosRetenidos With {.BaseRetencion = gvr.DataKey("BaseRetencion").ToDecimal, + .ImpuestoRetencion = gvr.DataKey("ImpuestoRetencion")} + cfditimbre.RetencionesImpuestos.Add(ret) + Next + + + TimbraRetencion(cfditimbre, UsuarioActual) + + End Sub + + + Protected Sub LnkAgregarRetencion_Click(sender As Object, e As EventArgs) + + UpModal.Update() + RegistraScript("$('#DModalRetencion').modal()") + + DtDetalle = New DataTable + DtDetalle.Columns.Add("TipoImpuesto", GetType(String)) + DtDetalle.Columns.Add("ClaveTipoImpuesto", GetType(String)) + DtDetalle.Columns.Add("BaseRetencion", GetType(Decimal)) + DtDetalle.Columns.Add("ClaveTipoPago", GetType(String)) + DtDetalle.Columns.Add("TipoPago", GetType(String)) + DtDetalle.Columns.Add("ImpuestoRetenido", GetType(Decimal)) + + End Sub + + Protected Sub BtnAgregar_Click(sender As Object, e As EventArgs) + + Dim dr As DataRow = DtDetalle.NewRow + dr("TipoImpuesto") = DdlTipoImpuesto.Text + dr("ClaveTipoImpuesto") = DdlTipoImpuesto.SelectedValue + dr("BaseRetencion") = TxtBase.Text.ToDecimal + dr("ClaveTipoPago") = DdlTipoPagoRet.SelectedValue + dr("TipoPago") = DdlTipoPagoRet.Text + dr("ImpuestoRetenido") = TxtImpuestoRetenido.Text.ToDecimal + + DtDetalle.Rows.Add(dr) + + GvD.DataSource = DtDetalle + GvD.DataBind() + + End Sub +End Class