From d034f59768f489465448a21d5279cec33e2866da Mon Sep 17 00:00:00 2001 From: rakcsle Date: Sat, 23 Mar 2024 13:16:39 -0700 Subject: [PATCH] GDiaz - Compras Prontos Pagos --- App_Code/ClsCompraManager.vb | 1865 +++++++++++++++++++++++++++ Compras/Compras.aspx.vb | 2341 +++++++++++++++++++++++++++++++++- Compras/eFacturas.aspx.vb | 11 +- 3 files changed, 4188 insertions(+), 29 deletions(-) create mode 100644 App_Code/ClsCompraManager.vb diff --git a/App_Code/ClsCompraManager.vb b/App_Code/ClsCompraManager.vb new file mode 100644 index 000000000..fcdc08bc1 --- /dev/null +++ b/App_Code/ClsCompraManager.vb @@ -0,0 +1,1865 @@ +Imports System.Data +Imports System.IO +Imports System.Xml +Imports ClsPaginas +Imports Extensiones +Imports Microsoft.VisualBasic + +Public Class ClsCompraManager + + Enum EnumCargaCompra + DesdeXML + DesdeArchivo + SinXML + End Enum + Public Enum EnumCFDIVersion + v32 + V33 + V40 + End Enum + + Public Enum EnumTipoCompra + Sin_definir = -1 + Gasto_con_almacen = 10 + Activo_Fijo = 1 + 'Costo_Indirecto = 2 + Almacen = 3 + Almacen_con_costo_indirecto = 8 + Costo_Indirecto = 4 + Importación = 5 + NC_Con_Productos = 6 + Apoyo_Logístico = 9 + NC_Por_Devolución = 11 + Garantia = 12 + End Enum + + + Public Enum EnumModalidadAccionPS + Agregar + Actualizar + End Enum + + Public Property CveCompra As Integer = -1 + Public Property CveProveedor As Integer + Public Property CveTipoConceptoProveedor As Integer + Public Property CveMoneda As Integer + Public Property Fecha As Date + Public ReadOnly Property SerieFolio As String + Get + If Serie.Length > 0 Then + Return $"{Serie}-{Folio}" + Else + Return $"{Folio}" + End If + End Get + End Property + + Public Property Serie As String = "" + Public Property Folio As String = "" + Public Property FolioSecundario As String = "" + Public Property Descripcion As String = "" + Public Property CFDIVersion As EnumCFDIVersion = EnumCFDIVersion.V40 + Public Property ProveedorNombre As String = "" + Public Property EsImportacion As Boolean = False + Public Property TC As Decimal = 1 + Public Property SubTotal As Decimal = 0D + Public Property SubTotal2 As Decimal = 0D + Public Property Descuento As Decimal = 0D + Public Property Total As Decimal = 0D + Public Property Moneda As String = "" + Public Property TipoComprobante As String + Public Property TipoCambio As Decimal = 1 + Public Property CompraNoDeducible As Integer = 0 + Public Property IVA As Decimal = 0D + Public Property IVADeducible As Decimal = 0D + Public Property IVANoDeducible As Decimal = 0 + Public Property IEPS As Decimal = 0D + Public Property RetIVA As Decimal = 0D + Public Property RetISR As Decimal = 0D + Public Property PorcentajeIVA As Decimal = 0 + Public Property PorcentajeISR As Decimal = 0 + Public Property CveRetIVAConcepto As Integer = -1 + Public Property CveRetISRConcepto As Integer = -1 + Public Property CveSubProyecto As Integer = -1 + Public Property UsuarioActual As Usuario + Public ReadOnly Property ConceptoPrePolizaIVA As ConceptosRetenciones + Get + Dim Ret As New ConceptosRetenciones + If EsImportacion Then + Ret.CveConceptoAcreditable = 288 + Ret.CveConceptoxAcreditar = 287 + Else + Ret.CveConceptoAcreditable = 19 + Ret.CveConceptoxAcreditar = 14 + End If + Return Ret + End Get + End Property + Public ReadOnly Property ConceptoPrePolizaRetIVA As ConceptosRetenciones + Get + Dim Ret As New ConceptosRetenciones + Dim Funcionalidad, FuncionalidadxAcred As Integer + If CveRetIVAConcepto = 1 Then + Funcionalidad = 308 : FuncionalidadxAcred = 307 + Ret.CveConceptoAcreditable = 22 + Ret.CveConceptoxAcreditar = 15 + ElseIf CveRetIVAConcepto = 2 Then + Funcionalidad = 310 : FuncionalidadxAcred = 309 + Ret.CveConceptoAcreditable = 184 + Ret.CveConceptoxAcreditar = 183 + ElseIf CveRetIVAConcepto = 3 Then + Funcionalidad = 312 : FuncionalidadxAcred = 311 + Ret.CveConceptoAcreditable = 186 + Ret.CveConceptoxAcreditar = 185 + ElseIf CveRetIVAConcepto = 4 Then + Funcionalidad = 314 : FuncionalidadxAcred = 313 + Ret.CveConceptoAcreditable = 249 + Ret.CveConceptoxAcreditar = 248 + ElseIf CveRetIVAConcepto = 5 Then + Funcionalidad = 578 : FuncionalidadxAcred = 578 + Ret.CveConceptoAcreditable = 286 + Ret.CveConceptoxAcreditar = 285 + ElseIf CveRetIVAConcepto = 6 Then + Funcionalidad = 578 : FuncionalidadxAcred = 578 + Ret.CveConceptoAcreditable = 333 + Ret.CveConceptoxAcreditar = 334 + End If + Return Ret + End Get + End Property + Public ReadOnly Property ConceptoPrePolizaRetISR As ConceptosRetenciones + Get + Dim Ret As New ConceptosRetenciones + Dim Funcionalidad, FuncionalidadxAcred As Integer + If CveRetISRConcepto = 1 Then + Funcionalidad = 316 : FuncionalidadxAcred = 315 + Ret.CveConceptoAcreditable = 23 + Ret.CveConceptoxAcreditar = 16 + ElseIf CveRetISRConcepto = 2 Then + Funcionalidad = 318 : FuncionalidadxAcred = 317 + Ret.CveConceptoAcreditable = 244 + Ret.CveConceptoxAcreditar = 243 + ElseIf CveRetISRConcepto = 3 Then + Funcionalidad = 349 : FuncionalidadxAcred = 348 + Ret.CveConceptoAcreditable = 328 + Ret.CveConceptoxAcreditar = 327 + End If + Return Ret + End Get + End Property + + Public Property CveMetodoPago As Integer + Public Property MetodoPago As String + Public Property DocumentosRelacionadosUUIDSList As List(Of String) = New List(Of String) + Public ReadOnly Property DocumentosRelacionadosUUIDSString As String + Get + Return GeneraStringDoctosRelacionados() + End Get + End Property + + Public Property DocumentosRelacionadosAnticiposUUIDList As List(Of String) = New List(Of String) + Public Property TieneAnticiposXML As Boolean = False + Public Property EmisorRFC As String + Public Property ReceptorRFC As String + Public Property UUID As String = "" + Public Property TotalRetenciones As Decimal = 0D + Public Property RetencionIVA As Decimal = 0D + Public Property RetencionISR As Decimal = 0D + Public Property SumaTotalRetenciones As Decimal = 0D + Public Property TotalTraslados As Decimal = 0D + Public Property TrasladoIVA As Decimal = 0D + Public Property TrasladoIEPS As Decimal = 0D + Public Property SumaTotalTraslados As Decimal = 0D + Public Property OtrosImpuestos As Decimal = 0D + Private Property OtrosImpuestosRetenciones As Decimal = 0D + Public Property Amortizacion As Decimal = 0D + Public Property FechaPago As Date 'FIX ME corregir usando fecha interna calculada por los dias de credito del proveedor + Public Property AplicaNotaCredito As Boolean = False + Public Property XMlStr As String + Public Property XMLCargaExistosa As Boolean = True + Public Property Observaciones As String = "" + Public Property CveEstatusFactura As Integer = 1 + Public Property CvePrePoliza As Integer = -1 + Public Property Redondeo As Decimal = 0 + Public Property IdPoliza As Integer = -1 + Public Property CveCajaChica As Integer = -1 + Public Property CvePersonal As Integer = -1 + Public Property NumeroReembolso As String = "" + Public Property CveProveedorSucursal As Integer = -1 + Public Property AplicoPromocion As Boolean = False + Public Property CveConceptoContableAlmacen As Integer = -1 + Public Property NoDeducible As Integer = 0 + Public Property CveTipoCompra As Integer = 1 + Public Property TotalOriginal As Decimal = 0D + Public Property CveTipoConcepto As Integer = 1 'FIX ME Esto tiene que ver con el CveTipoProveedor 1 y 3 es CveTipoConcepto 1 y 2 es CveTipoConcepto 2 + Public Property CveSubProyectoPrincipal As Integer = -1 + Public Property CveFactura As Integer = -1 + Public Property CveFolioGarantia As Integer = -1 + Public Property TmpDT As DataTable = New DataTable + Public Property SubTotalConceptos As Decimal = 0D + + Private Errores As StringBuilder = New StringBuilder + + Public ReadOnly Property MensajeError As String + Get + Return Errores.ToString() + End Get + End Property + + Public Property CompraSaldo As Decimal = 0D + Public Property SubTotalOriginal As Decimal = 0D + Public Property SubTotal2Original As Double = 0D + Public Property IVAOriginal As Decimal = 0D + Public Property RetIVAOriginal As Decimal = 0D + Public Property RetISROriginal As Decimal = 0D + Public Property Proyecto As String = "" + Public Property CveProyecto As Integer = -1 + Public Property SubProyecto As String = "" + Public Property TipoCompra As EnumTipoCompra = EnumTipoCompra.Sin_definir + Private Property DTTiposGastos() As DataTable + Public Property CveTipoProveedor As Integer = -1 + Public Property IEPSGasto As Boolean = False + Public Property OtrosImpuestosGasto As Boolean = False + Public Property OCVinculada As Boolean = False + Public Property NumNoDed As Integer = 0 + Public Property CveTipoPoliza As Integer = -1 + Public Property NombreProveedor As Object + Public Property CveCreditoDetalle As Integer = -1 + Public Property CveIE As Integer = -1 + Public Property CveCompraAmortizacion As Integer = -1 + + Public Sub New(XmlFuente As String, OpcionCarga As EnumCargaCompra, DTTiposGastos As DataTable, UsuarioActual As Usuario) + + Errores = New StringBuilder + + Me.DTTiposGastos = DTTiposGastos + Me.UsuarioActual = UsuarioActual + + If OpcionCarga = EnumCargaCompra.DesdeArchivo Then + CargaDesdeArchivo(XmlFuente) + Else + CargaDesdeString(XmlFuente) + End If + + End Sub + + Private Sub CargaDesdeArchivo(XmlFuenteRuta As String) + + Dim XMLDoc As New XmlDocument + + If IO.File.Exists(XmlFuenteRuta) Then + XMlStr = File.ReadAllText(XmlFuenteRuta).Replace("<br>", "").Replace("<", "").Replace("o;?", "") + Try + XMLDoc.LoadXml(XMlStr) + XMLCargaExistosa = True + Catch ex As Exception + Try + Dim oReader As New StreamReader(XmlFuenteRuta, Encoding.GetEncoding("ISO-8859-1")) + XMLDoc.Load(oReader) + oReader.Dispose() + XMLCargaExistosa = True + Catch ex2 As Exception + GuardaLog("Error al intentar leer el XML del SAT. Error:" & ex2.ToString()) + Errores.AppendLine("Error al intentar leer el XML. Error:" & ex2.ToString()) + XMLCargaExistosa = False + End Try + End Try + End If + + If XMLCargaExistosa Then + CargaComprobanteXML(XMLDoc) + End If + + End Sub + Private Sub CargaDesdeString(XmlFuente As String) + XMlStr = XmlFuente.Replace("<br>", "").Replace("<", "").Replace("o;?", "") + Dim XMLDoc As New XmlDocument + Try + XMLDoc.LoadXml(XMlStr) + XMLCargaExistosa = True + Catch ex As Exception + GuardaLog("Error al intentar leer . Error:" & ex.ToString()) + Errores.AppendLine("Error al intentar leer el XML. Error:" & ex.ToString()) + XMLCargaExistosa = False + End Try + + If XMLCargaExistosa Then + CargaComprobanteXML(XMLDoc) + End If + + End Sub + + Private Sub CargaComprobanteXML(XMLDoc As XmlDocument) + Dim nodo As XmlNode = XMLDoc.DocumentElement + + Serie = ValorXML(nodo, "serie") + + Dim StrCFDIVerion As String = ValorXML(nodo, "version") + + If StrCFDIVerion = "3.2" Then + CFDIVersion = EnumCFDIVersion.v32 + ElseIf StrCFDIVerion = "3.3" Then + CFDIVersion = EnumCFDIVersion.V33 + ElseIf StrCFDIVerion = "4.0" Then + CFDIVersion = EnumCFDIVersion.V40 + Else + GuardaLog($"CFDI Versión {StrCFDIVerion} no soportada") + Errores.AppendLine($"CFDI Versión {StrCFDIVerion} no soportada") + XMLCargaExistosa = False + Exit Sub + End If + + Folio = ValorXML(nodo, "folio") + Fecha = ValorXML(nodo, "fecha").ToDate + SubTotal = ValorXML(nodo, "subTotal").ToDecimal + Total = ValorXML(nodo, "total").ToDecimal + Descuento = ValorXML(nodo, "descuento").ToDecimal + Moneda = ValorXML(nodo, "Moneda") + + CveMoneda = GlobalDTMonedas().FiltroPrimeroValor("CveMoneda", $" AbreviaturaSAT = '{Moneda}' ").ToEntero + If Not CveMoneda > 0 Then + GuardaLog($"Moneda {Moneda} no se obtuvo la clabe") + Errores.AppendLine($"Moneda {Moneda} no se obtuvo la clabe") + XMLCargaExistosa = False + Exit Sub + End If + + TipoComprobante = ValorXML(nodo, "tipoDeComprobante") + TipoCambio = ValorXML(nodo, "TipoCambio", "1").ToDecimal + + If CFDIVersion = EnumCFDIVersion.V33 Or CFDIVersion = EnumCFDIVersion.V40 Then + Dim drm As DataRow = GlobalDTVtaMetodoPago.FiltroPrimero(String.Format("ClaveMetodoPagoSAT = '{0}'", ValorXML(nodo, "MetodoPago"))) + If drm IsNot Nothing Then + CveMetodoPago = drm("CveMetodoPago").ToString.ToEntero + MetodoPago = drm("MetodoPagoSAT").ToString + End If + End If + + Dim namespaces As New XmlNamespaceManager(XMLDoc.NameTable) + Dim Prefijo As String = If(XMLDoc.DocumentElement.Prefix = "", "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "" + + If CFDIVersion = EnumCFDIVersion.v32 Then + Prefijo = "cfd" + cfdVer = "http://www.sat.gob.mx/cfd/2" + ElseIf CFDIVersion = EnumCFDIVersion.V33 Then + cfdVer = "http://www.sat.gob.mx/cfd/3" + Else ' se considera que es la version 4.0 + cfdVer = "http://www.sat.gob.mx/cfd/4" + End If + namespaces.AddNamespace(Prefijo, cfdVer) + namespaces.AddNamespace("aerolineas", "http://www.sat.gob.mx/aerolineas") + namespaces.AddNamespace("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital") + namespaces.AddNamespace("implocal", "http://www.sat.gob.mx/implocal") + namespaces.AddNamespace("registrofiscal", "http://www.sat.gob.mx/registrofiscal") + + If TipoComprobante.ToUpper = "E" AndAlso (CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40) Then + Dim UUIDS As String = "" + + Dim UUIDSLista As New List(Of String) + Dim nodeCFDIRelacionados As XmlNode + nodeCFDIRelacionados = XMLDoc.SelectSingleNode(String.Format("//{0}:CfdiRelacionados", Prefijo), namespaces) + + If nodeCFDIRelacionados IsNot Nothing Then + For Each CFDIRelacionados As XmlNode In nodeCFDIRelacionados + UUIDSLista.Add("" & CFDIRelacionados.Attributes("UUID").Value.ToString & "") + Next + End If + DocumentosRelacionadosUUIDSList = UUIDSLista + + End If + + Dim node As XmlNode + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Emisor", Prefijo), namespaces) + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + EmisorRFC = ValorXML(node, "RFC") + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Receptor", Prefijo), namespaces) + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + ReceptorRFC = ValorXML(node, "RFC") + End If + + If UsuarioActual.CveEmpresa.Contiene(119, 7) Then + node = XMLDoc.SelectSingleNode(String.Format("//{0}:CfdiRelacionados", Prefijo), namespaces) + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + If ValorXML(node, "TipoRelacion").ToString.Contiene("07") Then + Dim nodeDocumentosRelacionados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:CfdiRelacionado", Prefijo), namespaces) + For Each documento As XmlNode In nodeDocumentosRelacionados + If documento.Attributes("UUID").Value <> "" Then + DocumentosRelacionadosAnticiposUUIDList.Add(documento.Attributes("UUID").Value) + End If + TieneAnticiposXML = True + Next + End If + End If + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Impuestos", Prefijo), namespaces) + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + Dim nodeRetenciones As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Retenciones/{0}:Retencion", Prefijo), namespaces) + + TotalRetenciones = ValorXML(node, "totalImpuestosRetenidos", "0").ToDecimal + + If CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40 Then + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("Impuesto").Value = "002" Then RetencionIVA += retencion.Attributes("Importe").Value.ToDecimal + If retencion.Attributes("Impuesto").Value = "001" Then RetencionISR += retencion.Attributes("Importe").Value.ToDecimal + Next + + Else + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("impuesto").Value = "IVA" Then RetencionIVA += retencion.Attributes("importe").Value.ToDecimal + If retencion.Attributes("impuesto").Value = "ISR" Then RetencionISR += retencion.Attributes("importe").Value.ToDecimal + Next + End If + SumaTotalRetenciones += RetencionIVA + SumaTotalRetenciones += RetencionISR + + TotalTraslados = ValorXML(node, "totalImpuestosTrasladados", "0").ToDecimal + Dim nodeTraslados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Traslados/{0}:Traslado", Prefijo), namespaces) + + If CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40 Then + + For Each traslado As XmlNode In nodeTraslados + + If traslado.Attributes("Importe") IsNot Nothing Then + If traslado.Attributes("Impuesto").Value = "002" Then TrasladoIVA += traslado.Attributes("Importe").Value.ToDecimal + If traslado.Attributes("Impuesto").Value = "003" Then TrasladoIEPS += traslado.Attributes("Importe").Value.ToDecimal + End If + Next + Else + + For Each traslado As XmlNode In nodeTraslados + If traslado.Attributes("Importe") IsNot Nothing Then + If traslado.Attributes("impuesto").Value = "IVA" Then TrasladoIVA += traslado.Attributes("importe").Value.ToDecimal + + If traslado.Attributes("impuesto").Value = "IEPS" Then TrasladoIEPS += traslado.Attributes("importe").Value.ToDecimal + End If + Next + End If + + SumaTotalTraslados += TrasladoIVA + SumaTotalTraslados += TrasladoIEPS + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + + Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) + + UUID = ValorXML(nodeTFD, "UUID", "") + + Dim nodeRF As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CFDIRegistroFiscal ", "registrofiscal"), namespaces) + If nodeRF IsNot Nothing Then + Folio = ValorXML(nodeRF, "folio").TrimStart("0"c) + End If + + node = node.SelectSingleNode(String.Format("//{0}:ImpuestosLocales", "implocal"), namespaces) + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + OtrosImpuestos = ValorXML(node, "TotaldeTraslados", "0").ToDecimal + '2022.06.04-- se quitan los datos de retenciones de impuestos locales, generan conflicto. RMF + 'OtrosImpuestosRetenciones = ValorXML(node, "TotaldeRetenciones", "0").ToDecimal + End If + End If + + + If XMLCargaExistosa Then + If Not ValidateUUID(UUID) Then + GuardaLog($"UUID Invalido {UUID} .") + Errores.AppendLine($"UUID Invalido {UUID} .") + XMLCargaExistosa = False + End If + End If + + +#Region "DETALLES" + + Dim ObjeFacturas As New ClsCompras + Dim AjustaUltimoConcepto As Boolean = False + + Dim nodeconceptos As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Conceptos", Prefijo), namespaces) + Dim XML As String = Replace(nodeconceptos.OuterXml, "", "") 'salto de linea html + XML = XML.Replace("<br>", "") + XML = XML.Replace("<", "") + + XML = XML.Replace("&", "") 'adicional, si hay otros + + If ObjeFacturas.GetFacturasComparacionXML(StrCFDIVerion, XML, UsuarioActual.CveEmpresa) Then + TmpDT = ObjeFacturas.DtResultados + TmpDT.Columns.Add("CveSATPSActualizado") + SubTotalConceptos = TmpDT.SUMD("Total").RoundSQL + + If Not TmpDT.Columns.Contains("Amortizacion") Then + TmpDT.Columns.Add("Amortizacion", GetType(Decimal)) + End If + 'VALIDA QUE EL XML SI VIENE CON EL CODIGO SAT 01010101 + Dim ProductosCodigoSATNoPermitidos As New StringBuilder("") + For Each drr As DataRow In TmpDT.FiltraParametros("ClaveProdServ = '01010101'").Rows + ProductosCodigoSATNoPermitidos.AppendFormat("{0}
", drr("PS")) + Next + + If ProductosCodigoSATNoPermitidos.ToString.Length > 0 Then + Errores.AppendLine($"El comprobante contiene productos con código SAT '01010101', revise los productos:

{ProductosCodigoSATNoPermitidos.ToString}") + + End If + Else + GuardaLog($"Error al cargar detalles GetFacturasComparacionXML.") + Errores.AppendLine($"Error al cargar detalles GetFacturasComparacionXML.") + XMLCargaExistosa = False + End If + + ObjeFacturas.Dispose() + + If CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40 Then + If Not TmpDT.Columns.Contains("Amortizacion") Then + TmpDT.Columns.Add("Amortizacion", GetType(Decimal)) + End If + TmpDT.AcceptChanges() + ValidacionesTotalesXml() + End If + + Me.PorcentajeIVA = TmpDT.MAX("IVAPorcentaje").ToDecimal + +#End Region + End Sub + + Public Function ConfiguraRegistroRapidoReembolso(CvePS As Integer, CveSubProyecto As Integer, CveCajaChica As Integer, CvePersonal As Integer, CveRetIVAConcepto As Integer, CveRetISRConcepto As Integer, NumeroReembolso As String) As Boolean + + Dim respuesta As Boolean = True + Me.CveSubProyecto = CveSubProyecto + Me.CveSubProyectoPrincipal = CveSubProyecto + Me.CveCajaChica = CveCajaChica + Me.CvePersonal = CvePersonal + Me.CveRetIVAConcepto = CveRetIVAConcepto + Me.CveRetISRConcepto = CveRetISRConcepto + Me.CveTipoPoliza = 3 + Me.NumeroReembolso = NumeroReembolso + + Dim dRowSubProyecto As DataRow = GlobalDTSubProyectos(-1, CveSubProyecto, CveEmpresa:=UsuarioActual.CveEmpresa).FiltroPrimero("") + + If dRowSubProyecto IsNot Nothing Then + Me.Proyecto = dRowSubProyecto("Proyecto").ToString + Me.CveProyecto = (dRowSubProyecto("CveProyecto").ToString).ToEntero + Me.SubProyecto = dRowSubProyecto("SubProyecto").ToString + Else + Errores.AppendLine($"Error al cargar el Sub Proyecto CveSubProyecto: {CveSubProyecto}") + Return False + End If + + Dim DTIndex As DataTable = TmpDT.FiltraParametros("", DistinctColumns:={"Consec"}) + + For Each dRowIndex As DataRow In DTIndex.Rows + If Not UpdatePSReembolso(dRowIndex("Consec").ToString.ToEntero, CvePS) Then + respuesta = False + End If + Next + + If respuesta AndAlso IEPS > 0 Then + If Not AgregaIEPSReembolso(CvePS:=CvePS) Then + respuesta = False + Else + IEPS = 0 + End If + End If + + If Not AjustesValidacion() Then + respuesta = False + End If + + Return respuesta + + End Function + Public Function ConfiguraRegistroRapidoRemNC(CvePS As Integer, CveSubProyecto As Integer, CveCajaChica As Integer, CvePersonal As Integer, CveRetIVAConcepto As Integer, CveRetISRConcepto As Integer, NumeroReembolso As String) As Boolean + + Dim respuesta As Boolean = True + Me.CveSubProyecto = CveSubProyecto + Me.CveSubProyectoPrincipal = CveSubProyecto + Me.CveCajaChica = CveCajaChica + Me.CvePersonal = CvePersonal + Me.CveRetIVAConcepto = CveRetIVAConcepto + Me.CveRetISRConcepto = CveRetISRConcepto + Me.CveTipoPoliza = 3 + Me.NumeroReembolso = NumeroReembolso + + Dim dRowSubProyecto As DataRow = GlobalDTSubProyectos(-1, CveSubProyecto, CveEmpresa:=UsuarioActual.CveEmpresa).FiltroPrimero("") + + If dRowSubProyecto IsNot Nothing Then + Me.Proyecto = dRowSubProyecto("Proyecto").ToString + Me.CveProyecto = (dRowSubProyecto("CveProyecto").ToString).ToEntero + Me.SubProyecto = dRowSubProyecto("SubProyecto").ToString + Else + Errores.AppendLine($"Error al cargar el Sub Proyecto CveSubProyecto: {CveSubProyecto}") + Return False + End If + + Dim DTIndex As DataTable = TmpDT.FiltraParametros("", DistinctColumns:={"Consec"}) + + For Each dRowIndex As DataRow In DTIndex.Rows + If Not UpdatePSReembolso(dRowIndex("Consec").ToString.ToEntero, CvePS) Then + respuesta = False + End If + Next + + If respuesta AndAlso IEPS > 0 Then + If Not AgregaIEPSReembolso(CvePS:=CvePS) Then + respuesta = False + Else + IEPS = 0 + End If + End If + + If Not AjustesValidacion() Then + respuesta = False + End If + + Return respuesta + + End Function + + Private Function AjustesValidacion() As Boolean + Dim respuesta As Boolean = True + 'VALIDA IMPORTES + If Not ValidaTotalesGuardar() Then + respuesta = False + End If + + If Not AjustaCombustibles() Then + respuesta = False + End If + + If Not AjustaIVA() Then + respuesta = False + End If + + If Not AjustaRetIVA() Then + respuesta = False + End If + + If Not AjustaRetISR() Then + respuesta = False + End If + + Return respuesta + + End Function + + Private Function ValidaTotalesGuardar() As Boolean + Dim EsValido As Boolean = True + + 'VALIDA IMPORTES + 'VALIDA TOTAL CON LOS IMPORTES TOTALES + Dim TempSubTotal, TempDescuentos, TempIVA, TempSubTotal2, TempRetIVA, TempRetISR, TempTotal, DifTotales, TempIEPS As Decimal + + Dim Amortizacion As Decimal = 0 + Dim TieneAmortizacion As Boolean = False + If DocumentosRelacionadosAnticiposUUIDList IsNot Nothing AndAlso DocumentosRelacionadosAnticiposUUIDList.Count > 0 Then 'Fix me + ' AndAlso ArrAnticipos IsNot Nothing AndAlso ArrAnticipos.Count > 0 Then + 'TieneAmortizacion = True + End If + + 'If CveCompra < 0 AndAlso Not TieneAmortizacion Then + ' LblAmortizacion.Text = "0.00" + 'End If + + 'If UsuarioActual.CveEmpresa = 119 AndAlso TieneAmortizacion Then + ' Amortizacion = LblAmortizacion.Text.Trim.ToDecimal + ' TxtSubTotal.Text = (TxtSubTotal.Text.ToDouble + Amortizacion).ToString + 'End If + + + TempSubTotal = SubTotal + SubTotalOriginal = SubTotal + SubTotal2Original = SubTotal2 + TempDescuentos = Descuento + Amortizacion + TempSubTotal2 = TempSubTotal - TempDescuentos + TempIVA = IVA + TempIEPS = IEPS + TempRetIVA = RetIVA + TempRetISR = RetISR + TempTotal = Math.Round(TempSubTotal2 + TempIVA + TempIEPS - TempRetIVA - TempRetISR + OtrosImpuestos - Amortizacion, 2) + DifTotales = Total - TempTotal + Dim DiferenciaPermitida As Decimal = 0.6D + + If Math.Abs(DifTotales) > DiferenciaPermitida Then + Errores.AppendLine($"Los importes de los conceptos (Productos/Servicios) no cuadran con el total. Por favor verifique y vuelva a intentar.[{Math.Abs(DifTotales) - DiferenciaPermitida}]") + EsValido = False + ElseIf DifTotales <> 0 Then + SubTotal2 = (SubTotal2 + DifTotales) + SubTotal = (SubTotal + DifTotales) + SubTotalOriginal = SubTotal + SubTotal2Original = SubTotal2 + End If + + Dim DiferenciaSubtotales As Decimal = 0 + If CveCompra > 0 Or CveFactura > 0 Or OCVinculada Then + + If SubTotalOriginal = Nothing Then + SubTotalOriginal = 0 + End If + + If SubTotal2Original = Nothing Then + SubTotal2Original = 0 + End If + + DiferenciaSubtotales = SubTotal2Original.ToString.ToDecimal - TmpDT.SUM("Total").ToString.ToDecimal + '[IPP] PARCHE: Factura TELMEX para APH 12/ENERO/2018 + If CveFactura = 286290 Then + DiferenciaSubtotales += Descuento + End If + If Math.Abs(DiferenciaSubtotales) > 1 And Not CompraNoDeducible = 1 Then 'EsNoDeducible + Errores.AppendLine("Los importes de los conceptos (Productos/Servicios) no cuadran con el total. Por favor verifique y vuelva a intentar.") + EsValido = False + Else + AjustaImporteUltimoConcepto(DiferenciaSubtotales) + End If + Else + DiferenciaSubtotales = (SubTotal2 - TmpDT.SUMD("Total")).ToString.ToDecimal + If Math.Abs(DiferenciaSubtotales) > 1 Then + Errores.AppendLine("Los importes de los conceptos (Productos/Servicios) no cuadran con el total. Por favor verifique y vuelva a intentar.") + EsValido = False + Else + AjustaImporteUltimoConcepto(DiferenciaSubtotales) + End If + End If + + Return EsValido + End Function + + + + Private Function AjustaCombustibles() As Boolean + + Dim Respuesta As Boolean = False + + Dim IVADetalles As Decimal = TmpDT.SUMD("IVA", " IVA > 0 ") + Dim DiferenciaIVas As Decimal = IVA - IVADetalles + + + If Not TmpDT.Columns.Contains("AplicaIEPS") Then + TmpDT.Columns.Add(New DataColumn("AplicaIEPS", GetType(Boolean))) + End If + + If Not TmpDT.Columns.Contains("IEPSGrabaIVA") Then + TmpDT.Columns.Add(New DataColumn("IEPSGrabaIVA", GetType(Boolean))) + End If + + For Each dRow As DataRow In TmpDT.Rows + Dim DttPS As DataTable = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=dRow("CvePS").ToString.ToEntero) + If DttPS IsNot Nothing AndAlso DttPS.Rows.Count > 0 Then + Dim DrPS As DataRow = DttPS.Rows(0) + dRow("AplicaIEPS") = Boolean.Parse(DrPS("AplicaIEPS").ToString) + dRow("IEPSGrabaIVA") = Boolean.Parse(DrPS("IEPSGrabaIVA").ToString) + Else + dRow("AplicaIEPS") = False + dRow("IEPSGrabaIVA") = False + End If + Next + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" AplicaIEPS = 'True' AND IEPSGrabaIVA = 'False' AND IVA > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConIVA As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If Boolean.Parse(dRow("AplicaIEPS").ToString) And Boolean.Parse(dRow("IEPSGrabaIVA").ToString) = False And dRow("IVA").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConIVA = CantidadRegistroConIVA + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.01D Then + + If (TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaIVas) / CantidadRegistroConIVA + + For Each dRow As DataRow In TmpDT.Rows + If Boolean.Parse(dRow("AplicaIEPS").ToString) And Boolean.Parse(dRow("IEPSGrabaIVA").ToString) = False And dRow("IVA").ToString.ToDecimal > 0 Then + dRow("IVA") = dRow("IVA").ToString.ToDecimal - AjusteteDividido + End If + Next + Else + TmpDT.Rows(IndiceUltimo)("IVA") = TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas + End If + TmpDT.AcceptChanges() + End If + + End If + + 'Revalidacion de ajuste + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.01D Then + Respuesta = False + If IVADetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IVA").ToString.ToDecimal > 0 Then + dRow("IVA") = dRow("IVA").ToString.ToDecimal + DiferenciaIVas + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + Else + Alert("Los productos especificados en el listado no tienen asignado impuesto IVA, favor de realizar la corrección en el producto que aplique el impuesto.", TipoMensaje.MsgAdvertencia) + Respuesta = False + End If + Else + Respuesta = True + End If + + If Respuesta Then + + Dim IEPSPSDetalles As Decimal = TmpDT.SUMD("IEPSPS", " IEPSPS > 0 ") + Dim DiferenciaIEPSPS As Decimal = IEPS - IEPSPSDetalles + + Dim DTConsultaIEPSPS As New DataTable + DTConsultaIEPSPS = TmpDT.FiltraParametros(" AplicaIEPS = 'True'") + Dim IndiceContador As Integer = 0 + Dim IndicePrimero As Integer = 0 + + For Each dRow As DataRow In TmpDT.Rows + If Boolean.Parse(dRow("AplicaIEPS").ToString) And dRow("IEPSPS").ToString.ToDecimal > 0 Then + IndicePrimero = IndiceContador + Exit For + End If + IndiceContador = IndiceContador + 1 + Next + If DiferenciaIEPSPS.RoundSQL(2) <> 0 Then + + TmpDT.Rows(IndicePrimero)("IEPSPS") = TmpDT.Rows(IndicePrimero)("IEPSPS").ToString.ToDecimal + DiferenciaIEPSPS + TmpDT.AcceptChanges() + End If + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IEPSPSPorcentaje").ToString.ToDecimal > 0 AndAlso dRow("IEPSPS").ToString.ToDecimal = 0 Then + dRow("IEPSPSPorcentaje") = 0 + End If + Next + TmpDT.AcceptChanges() + End If + + Return Respuesta + + End Function + + + Private Function AjustaIVA() As Boolean + + Dim Respuesta As Boolean = False + + Dim IVADetalles As Decimal = TmpDT.SUMD("IVA", " IVA > 0 ") + Dim DiferenciaIVas As Decimal = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0 Then + If Math.Abs(DiferenciaIVas) <= 0.05 Then + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" IVA > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConIVA As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IVA").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConIVA = CantidadRegistroConIVA + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.0D Then + + If (TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaIVas) / CantidadRegistroConIVA + + For Each dRow As DataRow In TmpDT.Rows + dRow("IVA") = dRow("IVA").ToString.ToDecimal - AjusteteDividido + Next + Else + TmpDT.Rows(IndiceUltimo)("IVA") = TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas + End If + TmpDT.AcceptChanges() + End If + End If + + 'Revalidacion de ajuste + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.01D Then + Respuesta = False + If IVADetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IVA").ToString.ToDecimal > 0 Then + dRow("IVA") = dRow("IVA").ToString.ToDecimal + DiferenciaIVas + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + + Else + Errores.AppendLine("Los productos especificados en el listado no tienen asignado impuesto IVA, favor de realizar la corrección en el producto que aplique el impuesto.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Else + Errores.AppendLine($"existe una diferencia de {DiferenciaIVas} entre el IVA de la compra y los detalles.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Return Respuesta + + End Function + + Private Function AjustaRetIVA() As Boolean + + Dim Respuesta As Boolean = False + + Dim RetIVADetalles As Decimal = TmpDT.SUMD("RetIVA", " RetIVA > 0 ") + Dim DiferenciaRetIVA As Decimal = RetIVA - RetIVADetalles + + If Math.Abs(DiferenciaRetIVA) > 0 Then + If Math.Abs(DiferenciaRetIVA) <= 0.05 Then + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" RetIVA > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConRetIVA As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetIVA").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConRetIVA = CantidadRegistroConRetIVA + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + RetIVADetalles = TmpDT.SUMD("RetIVA", " RetIVA > 0 ") + DiferenciaRetIVA = RetIVA - RetIVADetalles + + If Math.Abs(DiferenciaRetIVA) > 0.0D Then + + If (TmpDT.Rows(IndiceUltimo)("RetIVA").ToString.ToDecimal + DiferenciaRetIVA) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaRetIVA) / CantidadRegistroConRetIVA + + For Each dRow As DataRow In TmpDT.Rows + dRow("RetIVA") = dRow("RetIVA").ToString.ToDecimal - AjusteteDividido + Next + + Else + TmpDT.Rows(IndiceUltimo)("RetIVA") = TmpDT.Rows(IndiceUltimo)("RetIVA").ToString.ToDecimal + DiferenciaRetIVA + End If + + TmpDT.AcceptChanges() + + End If + + End If + + 'Revalidacion de ajuste + RetIVADetalles = TmpDT.SUMD("RetIVA", " RetIVA > 0 ") + DiferenciaRetIVA = RetIVA - RetIVADetalles + + If Math.Abs(DiferenciaRetIVA) > 0.01D Then + Respuesta = False + If RetIVADetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetIVA").ToString.ToDecimal > 0 Then + dRow("RetIVA") = dRow("RetIVA").ToString.ToDecimal + DiferenciaRetIVA + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + + Else + Errores.AppendLine("Los productos especificados en el listado no tienen asignado impuesto RetIVA, favor de realizar la corrección en el producto que aplique el impuesto.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Else + Errores.AppendLine($"existe una diferencia de {DiferenciaRetIVA} entre el RetIVA de la compra y los detalles.") + End If + Else + Respuesta = True + + End If + + Return Respuesta + + End Function + + Private Function AjustaRetISR() As Boolean + + Dim Respuesta As Boolean = False + + Dim RetISRDetalles As Decimal = TmpDT.SUMD("RetISR", " RetISR > 0 ") + Dim DiferenciaRetISR As Decimal = RetISR - RetISRDetalles + + If Math.Abs(DiferenciaRetISR) > 0 Then + If Math.Abs(DiferenciaRetISR) <= 0.05 Then + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" RetISR > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConRetISR As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetISR").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConRetISR = CantidadRegistroConRetISR + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + RetISRDetalles = TmpDT.SUMD("RetISR", " RetISR > 0 ") + DiferenciaRetISR = RetISR - RetISRDetalles + + If Math.Abs(DiferenciaRetISR) > 0.0D Then + + If (TmpDT.Rows(IndiceUltimo)("RetISR").ToString.ToDecimal + DiferenciaRetISR) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaRetISR) / CantidadRegistroConRetISR + + For Each dRow As DataRow In TmpDT.Rows + dRow("RetISR") = dRow("RetISR").ToString.ToDecimal - AjusteteDividido + Next + + Else + TmpDT.Rows(IndiceUltimo)("RetISR") = TmpDT.Rows(IndiceUltimo)("RetISR").ToString.ToDecimal + DiferenciaRetISR + End If + + TmpDT.AcceptChanges() + + End If + + End If + + 'Revalidacion de ajuste + RetISRDetalles = TmpDT.SUMD("RetISR", " RetISR > 0 ") + DiferenciaRetISR = RetISR - RetISRDetalles + + If Math.Abs(DiferenciaRetISR) > 0.01D Then + Respuesta = False + If RetISRDetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetISR").ToString.ToDecimal > 0 Then + dRow("RetISR") = dRow("RetISR").ToString.ToDecimal + DiferenciaRetISR + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + + Else + Errores.AppendLine("Los productos especificados en el listado no tienen asignado impuesto RetISR, favor de realizar la corrección en el producto que aplique el impuesto.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Else + Errores.AppendLine($"existe una diferencia de {DiferenciaRetISR} entre el RetISR de la compra y los detalles.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Return Respuesta + + End Function + + Private Function AgregaIEPSReembolso(CvePS As Integer) As Boolean + + Dim respuesta As Boolean = True + + If IEPSGasto Or OtrosImpuestosGasto Then + + 'AGREGA IEPS COMO CONCEPTO + If IEPSGasto Then + AgregarConceptoIEPS(TrasladoIEPS, CvePS) + For Each Dr As DataRow In TmpDT.Rows + Dr("IEPSPS") = 0 + Dr("IEPSPSPorcentaje") = 0 + Next + TmpDT.AcceptChanges() + End If + 'AGREGA OTROS IMPUESTOS COMO CONCEPTO + If OtrosImpuestosGasto Then + AgregarConceptoIEPS(OtrosImpuestos, CvePS) + End If + Else + respuesta = False + Errores.AppendLine("Debe seleccionar al menos un impuesto. ") + End If + CalculaTotales() + + Return respuesta + + End Function + + + Private Sub AgregarConceptoIEPS(IEPS As Decimal, CvePS1 As Integer) + Dim SubTotalR As Decimal = TmpDT.SUM("Total").ToString.ToDecimal + + Dim PSS As DataTable = GlobalDTPS(UsuarioActual.CveEmpresa).FiltraParametros(String.Format("CvePS = {0} ", CvePS1), "PS") + Dim PSS2 As DataTable = TmpDT.FiltraParametros(String.Format("CvePS = {0} ", CvePS1), "PS") + + If PSS.Rows.Count > 0 Or PSS2.Rows.Count > 0 Then + Dim CveUM As Integer = 0 + Dim UM As String = "" + Dim CveClasificacion As Integer = 0 + Dim Clasificacion As String = "" + Dim CvePS As Integer = 0 + Dim PS As String = "" + Dim CveTipoPS As Integer = 0 + + If PSS.Rows.Count > 0 Then + CveUM = PSS.Rows(0)("CveUM").ToString.ToEntero + UM = PSS.Rows(0)("UnidadMedida").ToString + CveClasificacion = PSS.Rows(0)("CveClasificacion").ToString.ToEntero + Clasificacion = PSS.Rows(0)("Clasificacion").ToString + CvePS = PSS.Rows(0)("CvePS").ToString.ToEntero + PS = PSS.Rows(0)("PS").ToString + CveTipoPS = PSS.Rows(0)("CveTipoPS").ToString.ToEntero + End If + + Dim Cantidad As Decimal = 1 + Dim CveSubProyectoContrato As String = "-1" + Dim CveProyecto As String = "-1" + Dim SubProyecto As String = "SE" + Dim Proyecto As String = "SE" + Dim Obs As String = "" + Dim PU As Decimal = IEPS + Dim Total As Decimal = Cantidad * PU + Dim IVA As Decimal = 0 + Dim Descuento As Decimal = 0 + + If PSS2.Rows.Count > 0 Then + CveUM = PSS2.Rows(0)("CveUM").ToString.ToEntero + UM = PSS2.Rows(0)("UM").ToString + CveClasificacion = PSS2.Rows(0)("CveClasificacion").ToString.ToEntero + Clasificacion = PSS2.Rows(0)("Clasificacion").ToString + CvePS = PSS2.Rows(0)("CvePS").ToString.ToEntero + PS = PSS2.Rows(0)("PS").ToString + CveTipoPS = PSS2.Rows(0)("CveTipoPS").ToString.ToEntero + + CveSubProyectoContrato = PSS2.Rows(0)("CveSubProyecto").ToString + CveProyecto = PSS2.Rows(0)("CveProyecto").ToString + SubProyecto = PSS2.Rows(0)("SubProyecto").ToString + Proyecto = PSS2.Rows(0)("Proyecto").ToString + Obs = PSS2.Rows(0)("Obs").ToString + + Dim CveTipoGasto As Integer = PSS2.Rows(0)("CveTipoGasto").ToString.ToEntero + Dim TipoGasto As String = PSS2.Rows(0)("TipoGasto").ToString + + AddPS(Cantidad, CveUM, UM, CveClasificacion, Clasificacion, CvePS, PS, CveTipoPS, CveSubProyectoContrato, SubProyecto, Proyecto, CveProyecto, Obs, PU, Total, IVA, 0, 0, 0, 0, Descuento, TCalculaTotales:=False, CveTipoGasto:=CveTipoGasto, + TipoGasto:=TipoGasto, ModalidadAccionPS:=EnumModalidadAccionPS.Agregar) + + Else + AddPS(Cantidad, CveUM, UM, CveClasificacion, Clasificacion, CvePS, PS, CveTipoPS, CveSubProyectoContrato, SubProyecto, Proyecto, CveProyecto, Obs, PU, Total, IVA, 0, 0, 0, 0, Descuento, TCalculaTotales:=False) + End If + End If + + Dim SubTotalIEPS As Decimal = TmpDT.SUMD("Total") + + Me.SubTotal = Math.Round(SubTotalIEPS, 2) + Me.SubTotalConceptos = Math.Round(SubTotalIEPS, 2) + + PSS.Dispose() + End Sub + + Private Function AddPS(Cantidad As Decimal, CveUM As Integer, UM As String, CveClasificacion As Integer, Clasificacion As String, CvePS As Integer, PS As String, CveTipoPS As Integer, CveSubProyectoContrato As String, SubProyecto As String, Proyecto As String, CveProyecto As String, + Obs As String, PU As Decimal, Total As Decimal, IVA As Decimal, RetIVA As Decimal, RetISR As Decimal, IEPSPS As Decimal, IEPSPSIVA As Decimal, Descuento As Decimal, Optional CveOrdenCompraDetalle As Integer = -1, Optional TCalculaTotales As Boolean = True, + Optional PSCodigo As String = "-", Optional PSDescripcion As String = "-", Optional CantidadF As Double = -1, Optional EntregaDirecta As Integer = -1, Optional OtrosGastos As Decimal = 0, + Optional CveSATPS As Integer = -1, Optional CargaXml As Boolean = False, Optional CveTipoGasto As Integer = -1, Optional TipoGasto As String = "", Optional PorcentajeIVA As Decimal = 0, + Optional PorcentajeIEPS As Decimal = 0, Optional PorcentajeRetIVA As Decimal = 0, Optional PorcentajeRetISR As Decimal = 0, Optional NoDeducible As Boolean = False, Optional CveContratoDetalle As Integer = -1, Optional CveCultivoCuadroDetalle As Integer = -1, + Optional CveSATPSActualizado As Boolean = False, Optional TemporadaCuadro As String = "", Optional ModalidadAccionPS As EnumModalidadAccionPS = EnumModalidadAccionPS.Agregar, Optional Con As Integer = -1, + Optional CveProgramaOperativo As Integer = -1, Optional CveUnidadAdministrativa As Integer = -1, Optional CveFuenteFinanciamiento As Integer = -1, Optional CveTipoGastoAC As Integer = -1, Optional CveClasificacionOG As Integer = -1) As Integer + + Dim Row As DataRow = Nothing + + Row = TmpDT.NewRow() + Dim Retorno As Integer = 0 + Dim CveContrato As Integer = -1 + Dim CveSubProyecto As Integer = -1 + Dim Valores As String() + + ''CONTRATOS + If CveSubProyectoContrato.Contains("|"c) Then + Valores = CveSubProyectoContrato.Split("|"c) + CveContrato = Valores(1).ToEntero + CveSubProyecto = Valores(0).ToEntero + Else + CveSubProyecto = CveSubProyectoContrato.ToEntero + End If + + 'DR PS + Dim DrPS As DataRow = Nothing + If CvePS > 0 Then + DrPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS).Rows(0) + End If + + If DrPS IsNot Nothing Then + Row("PSCodigo") = If(PSCodigo = "", DrPS("PSCodigo").ToString, PSCodigo) + Row("CveMetodoInventario") = DrPS("Inv_CveMetodoInventario").ToString.ToEntero + + If CveTipoCompra = EnumTipoCompra.Garantia AndAlso DrPS("AplicaSerie").ToString = "True" Then + Row("CveMetodoInventario") = "1" + End If + + Else + Row("PSCodigo") = PSCodigo + Row("CveMetodoInventario") = 0 + End If + + If ModalidadAccionPS = EnumModalidadAccionPS.Actualizar Then + Row("Consec") = Con + Else + Row("Consec") = TmpDT.Rows.Count + 1 + End If + + If (CFDIVersion = EnumCFDIVersion.V33 Or CFDIVersion = EnumCFDIVersion.V40) And CveSATPS > 0 Then + Dim DrPSSAT As DataRow = Nothing + If CargaXml Then + DrPSSAT = GlobalDTPSATPS("-1", CveSATPS.ToString).FiltroPrimero("") + Else + DrPSSAT = GlobalDTPSATPS("-1", CveSATPS.ToString).FiltroPrimero("") + End If + If DrPSSAT IsNot Nothing Then + Row("SATClaveProductoServicio") = DrPSSAT("SATClaveProductoServicio").ToString + Row("CveSATPS") = DrPSSAT("CveSATPS").ToString + If CveSATPSActualizado Then + Row("CveSATPSActualizado") = 1 + Else + Row("CveSATPSActualizado") = 0 + End If + End If + End If + + Try + If (DrPS("CvePSCargo").ToString <> "") Then 'si es un producto de usado. que se registre contablemente como alamcen(como producto) + CveTipoPS = 2 + End If + Catch ex As Exception + + End Try + + Dim DecimalesPermitidos As Integer = 6 + + Row("CveConcepto") = TmpDT.Rows.Count + 1 + Row("Cantidad") = Math.Round(Cantidad, DecimalesPermitidos) + Row("CantidadF") = If(CantidadF = -1, Math.Round(Cantidad, DecimalesPermitidos), Math.Round(CantidadF, DecimalesPermitidos)) + Row("CveUM") = CveUM + Row("UM") = UM + Row("CveClasificacion") = CveClasificacion + Row("CveClasificacionActualizar") = CveClasificacion + Row("Clasificacion") = Clasificacion + Row("CvePS") = CvePS + Row("PS") = PS + Row("CveTipoPS") = CveTipoPS + + Row("PSDescripcion") = PSDescripcion + Row("CveSubProyecto") = CveSubProyecto.ToEntero + Row("CveProyecto") = CveProyecto.ToEntero + Row("CveContrato") = CveContrato.ToEntero + Row("SubProyecto") = If(SubProyecto = "Seleccione", "Sin Sub Proyecto", SubProyecto) + Row("Proyecto") = If(Proyecto = "Seleccione", "Sin Proyecto", Proyecto) + Row("CveActivoFijo") = -1 + Row("Obs") = Obs + Row("CveActivoFijo") = -1 + Row("CodAF") = "-1" + Row("TipoAF") = -1 + Row("CveOrdenCompraDetalle") = CveOrdenCompraDetalle + Row("EntregaDirecta") = EntregaDirecta + + Row("NoDeducible") = NoDeducible + + + Total = Math.Round(PU, DecimalesPermitidos) * Cantidad - Descuento + Row("PU") = Math.Round(PU, DecimalesPermitidos) + If CargaXml And (CFDIVersion = EnumCFDIVersion.V33 Or CFDIVersion = EnumCFDIVersion.V40) Then + + If CveFactura > 0 And IVA = 0 Then + Row("IVA") = 0 + Row("IVAPorcentaje") = 0 + Else + Row("IVA") = Math.Round(IVA, DecimalesPermitidos) + Row("IVAPorcentaje") = PorcentajeIVA + End If + + Row("RetIVA") = Math.Round(RetIVA, DecimalesPermitidos) + Row("RetIVAPorcentaje") = PorcentajeRetIVA + Row("RetISR") = Math.Round(RetISR, DecimalesPermitidos) + Row("RetISRPorcentaje") = PorcentajeRetISR + Row("IEPSPS") = Math.Round(IEPSPS, DecimalesPermitidos) + Row("IEPSPSPorcentaje") = PorcentajeIEPS + Else + 'If DdlIVA.SelectedValue.ToDouble = 0 Then Row("IVA") = 0 Else Row("IVA") = Math.Round(IVA * Total, DecimalesPermitidos) + + If CveFactura > 0 And IVA = 0 Then + Row("IVA") = 0 + Row("IVAPorcentaje") = 0 + Else + Row("IVA") = (IVA * Total).RoundSQL + Row("IVAPorcentaje") = IVA + End If + + Row("RetIVA") = (RetIVA * Total).RoundSQL + Row("RetIVAPorcentaje") = RetIVA + Row("RetISR") = (RetISR * Total).RoundSQL + Row("RetISRPorcentaje") = RetISR + Row("IEPSPS") = (IEPSPS * Total).RoundSQL + Row("IEPSPSPorcentaje") = IEPSPS + End If + + Row("ImporteConImpuestos") = (Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal) + Row("IVA").ToString.ToDecimal + Row("IEPSPS").ToString.ToDecimal - (Row("RetIVA").ToString.ToDecimal + Row("RetISR").ToString.ToDecimal) + Row("ImporteSinImpuestos") = Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal + + Row("IEPSPSIVA") = Math.Round(IEPSPSIVA * Total, DecimalesPermitidos) + Row("IEPSPSIVAPorcentaje") = IEPSPSIVA + Row("Descuento") = Math.Round(Descuento, DecimalesPermitidos) + Row("OtrosGastos") = Math.Round(OtrosGastos, DecimalesPermitidos) + Row("Total") = Math.Round(Total, DecimalesPermitidos) + + Row("CveTipoGasto") = CveTipoGasto + Row("TipoGasto") = If(CveTipoGasto > 0, TipoGasto, "") + + Row("CveContratoDetalle") = CveContratoDetalle + + Row("CveCultivoCuadroDetalle") = CveCultivoCuadroDetalle + Row("TemporadaCuadro") = TemporadaCuadro + + If UsuarioActual.Empresa.UsaAC Then + Row("CveProgramaOperativo") = CveProgramaOperativo + Row("CveUnidadAdministrativa") = CveUnidadAdministrativa + Row("CveFuenteFinanciamiento") = CveFuenteFinanciamiento + Row("CveTipoGastoAC") = CveTipoGastoAC + Row("CveClasificacionOG") = CveClasificacionOG + End If + 'Esta parte es para validar cuando la factura tenga ieps en o se asignara el ieps como una partida ya no se considere + If (CveFactura > 0 Or CveCompra > 0) And IEPS = 0 Then + Row("IEPSPS") = 0 + Row("IEPSPSPorcentaje") = 0 + End If + TmpDT.Rows.Add(Row) + TmpDT.Rows.IndexOf(Row) + + If TCalculaTotales Then + CalculaTotales(True) + End If + + Return Retorno + End Function + + Private Sub CalculaTotales(Optional CalculaIVA As Boolean = False, Optional EsNoDeducible As Boolean = False) + 'VARIABLES DE CALCULO + Dim LocalSubTotal, LocalDescuentos, LocalAmortizacion, LocalIVA, LocalSubTotal2, LocalRetIVA, LocalRetISR, LocalIEPSPS, LocalTotal, LocalSubTotalIVA, LocalSubTotalIEPSIVA As Decimal + + 'HACEMOS CALCULOS + LocalSubTotalIVA = TmpDT.SUMD("IVA") + LocalSubTotalIEPSIVA = TmpDT.SUMD("IEPSPSIVA") + LocalSubTotal = (TmpDT.SUMD("Total") + TmpDT.SUMD("Descuento")).RoundSQL(8) + LocalRetIVA = TmpDT.SUMD("RetIVA") + LocalRetISR = TmpDT.SUMD("RetISR") + LocalIEPSPS = TmpDT.SUMD("IEPSPS") + + If CveCompra > 0 AndAlso CveFactura > 0 Then + LocalIVA = IVA + Else + LocalIVA = If(TmpDT.SUM("IVA") > 0, LocalSubTotalIVA + LocalSubTotalIEPSIVA, 0) + End If + + LocalDescuentos = TmpDT.SUMD("Descuento") + + If Not CveCompra > 0 Then + LocalAmortizacion = Me.Amortizacion + End If + + 'RETENCIONES + Dim Retenciones As Decimal = 0 + Retenciones = LocalRetIVA + Retenciones += LocalRetISR + + + LocalSubTotal2 = LocalSubTotal - LocalDescuentos + LocalTotal = LocalSubTotal2 + LocalIVA + LocalIEPSPS - Retenciones + + 'ASIGNAMOS VALORES A VISTA + If CveCompra > 0 Or CveFactura > 0 Or Me.OCVinculada Then + SubTotal = LocalSubTotal + SubTotal2 = LocalSubTotal2 + Descuento = LocalDescuentos + + If EsNoDeducible Then + IVA = LocalIVA + RetIVA = LocalRetIVA + RetISR = LocalRetISR + IEPS = LocalIEPSPS + End If + + Total = LocalTotal + Else + SubTotal = LocalSubTotal + SubTotal2 = LocalSubTotal2 + IVA = LocalIVA + Descuento = LocalDescuentos + RetIVA = LocalRetIVA + RetISR = LocalRetISR + IEPS = LocalIEPSPS + Total = LocalTotal + 'VALORES PROPIEDAD + CompraSaldo = LocalTotal + + End If + Me.NumNoDed = TmpDT.COUNT("CvePS", "NoDeducible = True ") + + End Sub + + Private Function UpdatePSReembolso(Index As Integer, CvePS As Integer) As Boolean + + Dim Respuesta As Boolean = True + + Dim DrPS As DataRow = Nothing + Try + DrPS = TmpDT.Select($"Consec = {Index}")(0) + If DrPS Is Nothing Then + Errores.AppendLine($"No se encontrol el producto con index {Index}") + Return False + End If + Catch ex As Exception + Errores.AppendLine($"No se encontrol el producto con index {Index}") + Return False + End Try + + 'DATOS GENERALES + DrPS("Obs") = "" + DrPS("Proyecto") = Proyecto + DrPS("CveProyecto") = CveProyecto + DrPS("SubProyecto") = SubProyecto + DrPS("CveSubProyecto") = CveSubProyecto + DrPS("CveContratoDetalle") = -1 + + 'IMPORTES - [CANTIDAD Y PRECIO] + Dim Cantidad As Double = DrPS("Cantidad").ToString.ToDouble + Dim PU As Double = DrPS("PU").ToString.ToDouble + Dim Descuento As Double = DrPS("Descuento").ToString.ToDouble + Dim Total As Double = (Cantidad * PU) - Descuento + DrPS("NoDeducible") = NoDeducible + + Dim PSRow As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS).FiltroPrimero("") + If PSRow IsNot Nothing Then + Dim CveTipoPS As Integer = PSRow("CveTipoPS").ToString.ToEntero + If PSRow("CvePSCargo").ToString <> "" Then 'si es un producto de usado. que se registre contablemente como alamcen(como producto) + CveTipoPS = 2 + End If + + DrPS("CveClasificacion") = PSRow("CveClasificacion").ToString + DrPS("Clasificacion") = PSRow("Clasificacion").ToString + DrPS("CvePS") = CvePS + DrPS("PS") = PSRow("PS").ToString + DrPS("CveTipoPS") = CveTipoPS + DrPS("CveSATPS") = PSRow("CveSATPS").ToString.ToEntero + DrPS("SATClaveProductoServicio") = PSRow("SATClaveProductoServicio").ToString + DrPS("CveSATPSActualizado") = 0 + + DrPS("CveUM") = PSRow("CveUnidadMedida").ToString.ToEntero + DrPS("UM") = PSRow("UnidadMedida").ToString + + Dim DrTipoGasto As DataRow = Me.DTTiposGastos.FiltroPrimero("") + + DrPS("CveTipoGasto") = DrTipoGasto("CveTipoGasto") + DrPS("TipoGasto") = DrTipoGasto("TipoGasto") + + If UsuarioActual.Empresa.Funcionalidad(562).ToEntero > 0 Then + DrPS("AplicaCostoIndirecto") = "0" + End If + + DrPS("CveCultivoCuadroDetalle") = -1 + DrPS("TemporadaCuadro") = "" + + Else + Errores.AppendLine($"No se encontrol el producto con CvePS {CvePS}") + Respuesta = False + End If + TmpDT.AcceptChanges() + Return Respuesta + End Function + + Private Sub ValidacionesTotalesXml() + + If Not TmpDT.Columns.Contains("Amortizacion") Then + TmpDT.Columns.Add("Amortizacion", GetType(Decimal)) + End If + + Dim Msg As String = "" + Dim SubtotalTemp As Decimal = TmpDT.SUMD("Total") + Math.Round(TmpDT.SUM("Descuento") + Math.Round(TmpDT.SUM("Amortizacion")), 2) + Dim DescuentosTemp As Decimal = TmpDT.SUMD("Descuento") + Dim Subtotal2Temp As Decimal = TmpDT.SUMD("Total") + Dim IVATemp As Decimal = TmpDT.SUMD("IVA") + Dim IEPSTemp As Decimal = TmpDT.SUMD("IEPSPS") + Dim RetIVATemp As Decimal = TmpDT.SUMD("RetIVA") + Dim RetISRTemp As Decimal = TmpDT.SUMD("RetISR") + Dim TotalTemp As Decimal = Subtotal2Temp - RetIVATemp - RetISRTemp + Math.Round(IVATemp, 6) + IEPSTemp + OtrosImpuestos - OtrosImpuestosRetenciones + + If Math.Abs(Math.Round(DescuentosTemp, 6) - Math.Round(Descuento, 6)) > 0.01 Then + Msg &= String.Format("- Los descuentos del detalle no coinciden con el descuento general
") + End If + + If Math.Abs(Math.Round(IVATemp, 6) - Math.Round(TrasladoIVA, 6)) > 0.01 Then + Msg &= String.Format("- Los IVAS del detalle no coinciden con el IVA general
") + End If + + If Math.Abs(Math.Round(IEPSTemp, 6) - Math.Round(TrasladoIEPS, 6)) > 0.01 Then + Msg &= String.Format("- Los IEPS del detalle no coinciden con el IEPS general
") + End If + + If Math.Abs(Math.Round(RetIVATemp, 6) - Math.Round(RetencionIVA, 6)) > 0.01 Then + Msg &= String.Format("- Los RetIVA del detalle no coinciden con el RetIVA general
") + End If + + If Math.Abs(Math.Round(RetISRTemp, 6) - Math.Round(RetencionISR, 6)) > 0.01 Then + Msg &= String.Format("- Las RetISR del detalle no coinciden con el RetIVA general
") + End If + + If Math.Abs(Math.Round(TotalTemp, 2) - Math.Round(Total, 2)) > 0.01 Then + Msg &= String.Format("- El total generado por los detalles no coincide con el total general
({0}-{1})", Math.Round(TotalTemp, 2), Math.Round(Total, 2)) + End If + + If Msg <> "" Then + Errores.AppendLine($" El comprobante XML presenta las siguientes inconsistencias:{Msg}. ") + Else + + DescuentosTemp = Descuento + IVATemp = TrasladoIVA + TotalTemp = Total + RetIVATemp = RetencionIVA + RetISRTemp = RetencionISR + IEPSTemp = TrasladoIEPS + End If + + Me.SubTotal = SubtotalTemp + Me.Descuento = DescuentosTemp + Me.SubTotal2 = Subtotal2Temp + Me.IVA = IVATemp + Me.Total = TotalTemp + Me.RetIVA = RetIVATemp + Me.RetISR = RetISRTemp + Me.IEPS = IEPSTemp + CompraSaldo = TotalTemp + + AsignaValoresOriginales(SubtotalTemp, Subtotal2Temp, IVATemp, RetIVATemp, RetISRTemp, Total) + + End Sub + + Private Sub AsignaValoresOriginales(SubTotal As Decimal, SubTotal2 As Double, IVA As Decimal, RetIVA As Decimal, RetISR As Decimal, Total As Decimal) + SubTotalOriginal = SubTotal + SubTotal2Original = SubTotal2 + IVAOriginal = IVA + RetIVAOriginal = RetIVA + RetISROriginal = RetISR + TotalOriginal = Total + End Sub + + Private Sub AjustaImporteUltimoConcepto(ImporteAjuste As Decimal, Optional EsCarga As Boolean = False) + + If ImporteAjuste = 0 Then Exit Sub + + Dim Amortizacion As Decimal = 0 + + If TmpDT.Rows.Count > 0 Then ' si hay movimientos y si esta afectando al total, que se haga el ajuste + Dim Indice As Integer = If(TmpDT.Rows(TmpDT.Rows.Count - 1)("CvePS").ToString = UsuarioActual.Empresa.Funcionalidad(112).ToString, TmpDT.Rows.Count - 2, TmpDT.Rows.Count - 1) + Dim tPU As Decimal + + If TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal > 0 Then + tPU = ImporteAjuste / TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal + Else + tPU = 0 + End If + + If TmpDT.Rows(Indice)("PU").ToString.ToDecimal + tPU < 0 Then 'si es negativo, que tome el dato anterior + Indice = Indice - 1 + If TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal > 0 Then + tPU = ImporteAjuste / TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal + Else + tPU = 0 + End If + End If + + TmpDT.Rows(Indice)("PU") = TmpDT.Rows(Indice)("PU").ToString.ToDecimal + tPU + TmpDT.Rows(Indice)("Total") = TmpDT.Rows(Indice)("Total").ToString.ToDecimal + ImporteAjuste + TmpDT.Rows(Indice)("IEPSPS") = (TmpDT.Rows(Indice)("Total").ToString.ToDecimal() * TmpDT.Rows(Indice)("IEPSPSPorcentaje").ToString.ToDecimal()).RoundAD(2) + TmpDT.Rows(Indice)("IVA") = (TmpDT.Rows(Indice)("PU").ToString.ToDecimal * TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal - TmpDT.Rows(Indice)("Descuento").ToString.ToDecimal) * TmpDT.Rows(Indice)("IVAPorcentaje").ToString.ToDecimal + TmpDT.AcceptChanges() + End If + + SubTotal = TmpDT.SUMD("Total") + If Not EsCarga Then + Descuento = TmpDT.SUMD("Descuento") + End If + + SubTotalConceptos = SubTotal + + End Sub + + Public Function ValidateUUID(ByVal uuid As String) As Boolean + Dim pattern As String = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + Dim regex As New Regex(pattern) + Return regex.IsMatch(uuid) + End Function + Private Function GeneraStringDoctosRelacionados() As String + + Dim DoctosRelacionados As String = "-1" + Dim listaUUIDSRelacionados As New List(Of String) + + If DocumentosRelacionadosUUIDSList.Count > 0 Then + For Each s As String In DocumentosRelacionadosUUIDSList + If s.Trim.Length > 0 Then + listaUUIDSRelacionados.Add(s.Trim) + End If + Next + End If + + If listaUUIDSRelacionados.Count > 0 Then + DoctosRelacionados = String.Join(",", listaUUIDSRelacionados.ToArray()) + End If + + Return DoctosRelacionados + End Function + Private Function ValorXML(n As XmlNode, Campo As String, Optional Retorno As String = "") As String + Dim o As XmlNode = n.Attributes.Cast(Of XmlAttribute)().SingleOrDefault(Function(a) String.Compare(a.Name, Campo, True) = 0) + If o Is Nothing Then + Return Retorno + Else + Return o.Value + End If + End Function + + Public Function AddCompra() As Boolean + + If Not AjustesValidacion() Then Return False + + Dim respuesta As Boolean = True + Dim ObjCompras As New ClsCompras + Dim ObjConta As New ClsContabilidad(ObjCompras.IniciaTransacSQL()) + + If Not AddPrepolizaCabecera(ObjConta) Then + respuesta = False + End If + + If respuesta AndAlso ObjCompras.AddCompra(If(Me.TipoComprobante = "I", "Fac", "NC"), Me.Descripcion, Me.Serie, Me.Folio, Me.FolioSecundario, Me.CveProveedor, Me.SubTotal, Me.Descuento, + Me.Amortizacion, Me.IVA, Me.RetIVA, Me.RetISR, Me.IEPS, Me.OtrosImpuestos, + Me.Redondeo, Me.Total, Me.Fecha, Me.CveMoneda, Me.TipoCambio, If(Me.FechaPago = Nothing, Me.Fecha, Me.FechaPago), Me.AplicaNotaCredito, Me.Observaciones, Me.CveEstatusFactura, + Me.CvePrePoliza, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, Me.IdPoliza, CveCajaChica:=Me.CveCajaChica, CvePersonal:=Me.CvePersonal, NumeroReembolso:=Me.NumeroReembolso, CveProveedorSucursal:=Me.CveProveedorSucursal, + AplicoPromocion:=Me.AplicoPromocion, PorcentajeIVA:=Me.PorcentajeIVA, CveMetodoPago:=Me.CveMetodoPago, CveRetIVAConcepto:=Me.CveRetIVAConcepto, + CveConceptoContableAlmacen:=Me.CveConceptoContableAlmacen, + CveRetISRConcepto:=Me.CveRetISRConcepto, NoDeducible:=Me.NoDeducible, CveTipoCompra:=Me.CveTipoCompra, TotalOriginal:=Me.TotalOriginal, CveTipoConcepto:=Me.CveTipoConcepto, + EsImportacion:=Me.EsImportacion, CveFactura:=Me.CveFactura, CveSubProyecto:=Me.CveSubProyectoPrincipal, DoctosRelacionados:=Me.DocumentosRelacionadosUUIDSString, CveFolioGarantia:=Me.CveFolioGarantia) Then + Me.CveCompra = ObjCompras.CveCompra + Else + respuesta = False + End If + + If respuesta AndAlso Me.CveCompra > 0 Then + + For Each Row As DataRow In Me.TmpDT.Rows + + Dim TipoRecepcion As Integer = -1 + Dim Referencia As String = "" + Dim EsNoDeducible As Boolean = False + Dim CveAF As Integer = If(Row("CveActivoFijo").ToString.ToEntero > 0 AndAlso Row("TipoAF").ToString.ToEntero = 1, Row("CveActivoFijo").ToString.ToEntero, -1) + Dim CveAFC As Integer = If(Row("CveActivoFijo").ToString.ToEntero > 0 AndAlso Row("TipoAF").ToString.ToEntero = 2, Row("CveActivoFijo").ToString.ToEntero, -1) + + If Not ObjCompras.AddCompraDetalle(Me.CveCompra, Row("CveUM").ToString.ToEntero, Row("CvePS").ToString.ToEntero, Row("CveSubProyecto").ToString.ToEntero, -1, CveAF, + Row("Cantidad").ToString.ToDecimal, Row("PU").ToString.ToDecimal, Row("IVA").ToString.ToDecimal, Row("Total").ToString.ToDecimal, Row("Descuento").ToString.ToDecimal, + Row("Obs").ToString, Row("CveOrdenCompraDetalle").ToString.ToEntero, TipoRecepcion, Row("CveContrato").ToString.ToEntero, Row("CvePresupuestoEgreso").ToString.ToEntero, + AplicaCostoIndirecto:=Row("AplicaCostoIndirecto").ToString.ToEntero, EstatusAlmacen:=Row("EntregaDirecta").ToString.ToEntero, CvePersonal:=CvePersonal, + CveTipoGasto:=Row("CveTipoGasto").ToString.ToEntero, AF_Medida:=Row("AFMedida").ToString.ToEntero, AF_TipoMantenimiento:=Row("AFTipoMantenimiento").ToString.ToEntero, Referencia:=Referencia, OtrosGastos:=Row("OtrosGastos").ToString.ToDecimal, + RetIVA:=Row("RetIVA").ToString.ToDecimal, RetISR:=Row("RetISR").ToString.ToDecimal, IEPSPS:=Row("IEPSPS").ToString.ToDecimal.RoundSQL, IEPSPSIVA:=Row("IEPSPSIVA").ToString.ToDecimal, + IVAPorcentaje:=Row("IVAPorcentaje").ToString.ToDecimal, RetIVAPorcentaje:=Row("RetIVAPorcentaje").ToString.ToDecimal, RetISRPorcentaje:=Row("RetISRPorcentaje").ToString.ToDecimal, + IEPSPSPorcentaje:=Row("IEPSPSPorcentaje").ToString.ToDecimal, IEPSPSIVAPorcentaje:=Row("IEPSPSIVAPorcentaje").ToString.ToDecimal, NoDeducible:=If((Row("NoDeducible").ToString().ToUpper().Contiene("TRUE", "1")) AndAlso EsNoDeducible, True, False), + CveContratoDetalle:=Row("CveContratoDetalle").ToString.ToEntero, CveCultivoCuadroDetalle:=Row("CveCultivoCuadroDetalle").ToString.ToEntero, CveActivoFijoCompra:=CveAFC) Then + + respuesta = False + Exit For + End If + Next + End If + + If respuesta Then + If Not AddPrePolizaDetalles(ObjConta) Then respuesta = False + End If + + If respuesta AndAlso ObjConta.ValidacionesPrePoliza(CvePrePoliza, UsuarioActual, 4) Then + If ObjConta.ValorPolizaDescuadre > 0 Then + Errores.AppendLine($"eFacturas/Compras-Guardar | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}.") + GuardaLogAD($"eFacturas/Compras-Guardar | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") + respuesta = False + End If + End If + + If respuesta Then + If Not ObjCompras.UpdateCompraFactura(Me.CveCompra, Me.CveFactura, Me.Serie, Me.Folio) Then respuesta = False + End If + + If respuesta Then + ObjCompras.Commit() + Else + ObjCompras.RollBack() + End If + + ObjCompras.Dispose() + ObjConta.Dispose() + + Return respuesta + End Function + + Private Function AddPrepolizaCabecera(ByRef ObjConta As ClsContabilidad) As Boolean + + Dim respuesta As Boolean = False + Dim ConceptoPoliza As String = String.Format("{0} - {1} - {2}", NombreProveedor, SerieFolio, "") + Me.CvePrePoliza = ObjConta.AddPrePolizas("eFacturas/Registrar", 1, Me.Total, Me.Total, Me.CveMoneda, Me.Fecha, ConceptoPoliza, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, 0, "", CveTipoPoliza:=Me.CveTipoPoliza) + respuesta = If(Me.CvePrePoliza > 0, True, False) + + Return respuesta + End Function + + Private Function AddPrePolizaDetalles(ByRef ObjConta As ClsContabilidad) As Boolean + Dim respuesta As Boolean = True + Dim Concepto As String = $"{Me.NombreProveedor} {Me.SerieFolio}" + Dim Referencia As String = Me.SerieFolio + Dim importeMovimiento As Decimal + Dim importeMN As Decimal + '6 + For Each RowDetalle As DataRow In TmpDT.FiltraParametros("ISNULL(TipoAF,0) <> 2", "", {"CveClasificacion", "CveSubProyecto"}).Rows + + importeMovimiento = TmpDT.SUMD("Total", $" CveClasificacion = {RowDetalle("CveClasificacion").ToString} AND CveSubProyecto = {RowDetalle("CveSubProyecto").ToString}") + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + + If importeMN <> 0 Then + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, importeMovimiento, importeMN, 6, Referencia, Concepto, CveCompra:=CveCompra, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=Me.CveCreditoDetalle, ImporteME:=If(TipoCambio = 1, 0, importeMovimiento), TipoCambio:=TipoCambio, + CveClasificacion:=RowDetalle("CveClasificacion").ToString().ToEntero(), CveSubProyecto:=RowDetalle("CveSubProyecto").ToString().ToEntero(), Contabilizable:=True) Then + respuesta = False + Exit For + End If + End If + Next + '14 + If respuesta AndAlso Me.IVA > 0 Then + importeMovimiento = Me.IVA + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, importeMovimiento, importeMN, 14, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=Me.PorcentajeIVA, Contabilizable:=True) Then + respuesta = False + End If + End If + '25 + If respuesta AndAlso Me.IEPS > 0 Then + importeMovimiento = Me.IEPS + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, 25, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + End If + ' + If respuesta AndAlso Me.RetIVA > 0 Then + importeMovimiento = Me.RetIVA + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + Dim ret As ConceptosRetenciones = ConceptoPrePolizaRetIVA + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, ret.CveConceptoxAcreditar, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + End If + ' + If respuesta AndAlso Me.RetISR > 0 Then + importeMovimiento = Me.RetISR + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + Dim ret As ConceptosRetenciones = ConceptoPrePolizaRetISR + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, ret.CveConceptoxAcreditar, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + End If + '5 + If respuesta Then + importeMovimiento = Me.Total + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + Dim ConPreP As ConceptosTipoSaldo = ObtenerCveConceptoPrePoliza(1, Me.CveMoneda, False, Me.CveTipoConceptoProveedor) + Dim ImporteME As Decimal = importeMovimiento + Dim UsaComplementaria As Boolean = True + If Me.CveMoneda > 1 Then ImporteME = importeMovimiento + + If UsuarioActual.CveEmpresa.Contiene(13, 83) Then 'caso excepcional de complementarias + UsaComplementaria = False + importeMN = importeMovimiento * Me.TipoCambio + Else + importeMN = importeMovimiento + End If + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, ConPreP.CveConcepto, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + If respuesta AndAlso Me.CveMoneda > 1 AndAlso UsaComplementaria Then + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, (importeMovimiento * Me.TipoCambio - importeMovimiento).RoundSQL, ConPreP.CveConceptoComplementario, Referencia, Concepto, CveCompra:=Me.CveCompra, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=Me.CvePersonal, CveCompraAmortizacion:=Me.CveCompraAmortizacion, TipoCambio:=Me.TipoCambio, TipoCambioPago:=1, ImporteME:=ImporteME, CveSubProyecto:=Me.CveSubProyecto) Then + respuesta = False + End If + End If + End If + + Return respuesta + End Function + +End Class \ No newline at end of file diff --git a/Compras/Compras.aspx.vb b/Compras/Compras.aspx.vb index b8355d7c9..407979093 100644 --- a/Compras/Compras.aspx.vb +++ b/Compras/Compras.aspx.vb @@ -10,7 +10,8 @@ Imports System.Threading.Tasks Imports Newtonsoft.Json Imports Extensiones Imports MoreLinq - +Imports ClsPaginas +Imports System.Data.SqlClient @@ -1132,26 +1133,62 @@ Partial Class Compras_Compras ViewState("PorcentajeProntoPago") = value End Set End Property - Private Property ImporteRemNC As Decimal + Private Property AjusteProntoPagoConIVA As Decimal Get - If ViewState("ImporteRemNC") Is Nothing Then - ViewState("ImporteRemNC") = 0D + If ViewState("AjusteProntoPagoConIVA") Is Nothing Then + ViewState("AjusteProntoPagoConIVA") = 0D End If - Return ViewState("ImporteRemNC").ToString.ToDecimal + Return ViewState("AjusteProntoPagoConIVA").ToString.ToDecimal End Get Set(value As Decimal) - ViewState("ImporteRemNC") = value + ViewState("AjusteProntoPagoConIVA") = value End Set End Property - Private Property ImporteRemNCProntoPago As Decimal + + Private Property AjusteProntoPagoPorcentajeIVA As Decimal Get - If ViewState("ImporteRemNCProntoPago") Is Nothing Then - ViewState("ImporteRemNCProntoPago") = 0D + If ViewState("AjusteProntoPagoPorcentajeIVA") Is Nothing Then + ViewState("AjusteProntoPagoPorcentajeIVA") = 0D End If - Return ViewState("ImporteRemNCProntoPago").ToString.ToDecimal + Return ViewState("AjusteProntoPagoPorcentajeIVA").ToString.ToDecimal End Get Set(value As Decimal) - ViewState("ImporteRemNCProntoPago") = value + ViewState("AjusteProntoPagoPorcentajeIVA") = value + End Set + End Property + + + Private Property AjusteProntoPagoSinIVA As Decimal + Get + If ViewState("AjusteProntoPagoSinIVA") Is Nothing Then + ViewState("AjusteProntoPagoSinIVA") = 0D + End If + Return ViewState("AjusteProntoPagoSinIVA").ToString.ToDecimal + End Get + Set(value As Decimal) + ViewState("AjusteProntoPagoSinIVA") = value + End Set + End Property + Private Property ImporteRNC As Decimal + Get + If ViewState("ImporteRNC") Is Nothing Then + ViewState("ImporteRNC") = 0D + End If + Return ViewState("ImporteRNC").ToString.ToDecimal + End Get + Set(value As Decimal) + ViewState("ImporteRNC") = value + End Set + End Property + Private Property ImporteRNCProntoPago As Decimal + Get + If ViewState("ImporteRNCProntoPago") Is Nothing Then + ViewState("ImporteRNCProntoPago") = 0D + End If + Return ViewState("ImporteRNCProntoPago").ToString.ToDecimal + End Get + Set(value As Decimal) + ViewState("ImporteRNCProntoPago") = value End Set End Property @@ -7428,6 +7465,14 @@ Partial Class Compras_Compras 'End If End If + + If UsuarioActual.Empresa.Funcionalidad(574).ToEntero = 1 AndAlso (ImporteRNC > 0 Or ImporteRNCProntoPago > 0) Then + If Not GeneraRemisionsNotadeCredito(ObjCompras.IniciaTransacSQL) Then + TieneError = True + End If + End If + + If Not TieneError Then ObjCompras.Commit() If ObjContaAC IsNot Nothing Then ObjContaAC.Commit() @@ -10048,8 +10093,7 @@ Partial Class Compras_Compras TmpDT.Columns.Add("CveContratoDetalle", GetType(Integer)) TmpDT.Columns.Add("CveCultivoCuadroDetalle", GetType(Integer)) TmpDT.Columns.Add("TemporadaCuadro", GetType(String)) - TmpDT.Columns.Add("PUProntoPago", GetType(Decimal)) - TmpDT.Columns.Add("TotalProntoPago", GetType(Decimal)) + TmpDTOriginal = New DataTable TmpDTOriginal.Columns.Add("Consec", GetType(Integer)) @@ -10159,8 +10203,7 @@ Partial Class Compras_Compras TmpDTOriginal.Columns.Add("CveContratoDetalle", GetType(Double)) TmpDTOriginal.Columns.Add("CveCultivoCuadroDetalle", GetType(Double)) TmpDTOriginal.Columns.Add("TemporadaCuadro", GetType(String)) - TmpDTOriginal.Columns.Add("PUProntoPago", GetType(Decimal)) - TmpDTOriginal.Columns.Add("TotalProntoPago", GetType(Decimal)) + End Sub @@ -10493,7 +10536,7 @@ Partial Class Compras_Compras If UsuarioActual.Empresa.Funcionalidad(574).ToEntero = 1 Then - e.Row.Cells(4).Text = e.Row.DataKey("PUProtoPago").ToDecimal.ToString("###,###,###.00") + 'e.Row.Cells(4).Text = e.Row.DataKey("PUProtoPago").ToDecimal.ToString("###,###,###.00") 'If PorcentajeProntoPago > 0 Then ' e.Row.Cells(4).Text = e.Row.DataKey("PUProtoPago").ToDecimal - () @@ -14301,6 +14344,10 @@ Partial Class Compras_Compras End Sub Protected Sub BtnVincularOC_Click(sender As Object, e As EventArgs) + + AjusteProntoPagoPorcentajeIVA = 0D + AjusteProntoPagoConIVA = 0D + AjusteProntoPagoSinIVA = 0D 'If DdlOCVinculaInv.SelectedValue.ToEntero = 237 And Not CveFlete > 0 Then Alert("Necesita vincular un flete si selecciona Factura de Flete", TipoMensaje.MsgAdvertencia) : Exit Sub 'If DdlOCVinculaInv.SelectedValue.ToEntero = 240 And Not CveImportacion > 0 Then Alert("Necesita vincular una Importación si selecciona Factura de Importación", TipoMensaje.MsgAdvertencia) : Exit Sub @@ -14360,8 +14407,26 @@ Partial Class Compras_Compras If UsuarioActual.Empresa.Funcionalidad(574).ToEntero = 1 Then - ImporteRemNC = (SubTotalCompra - SubTotalGV).RoundSQL(2) - ImporteRemNCProntoPago = (SubTotalCompra * PorcentajeProntoPago).RoundSQL(2) + ImporteRNC = (SubTotalCompra - SubTotalGV).RoundSQL(2) + ImporteRNCProntoPago = (SubTotalCompra * PorcentajeProntoPago).RoundSQL(2) + + Dim ImporteOCConIVA As Decimal = 0D + Dim ImporteOCSinIVA As Decimal = 0D + + Dim ImporteCompraConIVA As Decimal = TmpDT.SUM("Total", " IVAPorcentaje > 0 ") + Dim ImporteCompraSinIVA As Decimal = TmpDT.SUM("Total", " IVAPorcentaje = 0 ") + + For Each gvr As GridViewRow In GvOC1.Rows + If gvr.DataKey("IVAPorcentaje").ToDecimal > 0 Then + ImporteOCConIVA = ImporteOCConIVA + (gvr.FCTextBox("TxtCantidad").Text.ToDecimal * gvr.FCTextBox("TxtPU").Text.ToDecimal) + Else + ImporteOCSinIVA = ImporteOCSinIVA + (gvr.FCTextBox("TxtCantidad").Text.ToDecimal * gvr.FCTextBox("TxtPU").Text.ToDecimal) + End If + Next + + AjusteProntoPagoPorcentajeIVA = TmpDT.MAX("IVAPorcentaje").ToDecimal + AjusteProntoPagoConIVA = (ImporteCompraConIVA - ImporteOCConIVA) '+ ((ImporteCompraConIVA) * PorcentajeProntoPago) + AjusteProntoPagoSinIVA = (ImporteCompraSinIVA - ImporteOCSinIVA) '+ ((ImporteCompraSinIVA) * PorcentajeProntoPago) Vinculacion() @@ -14505,6 +14570,51 @@ Partial Class Compras_Compras IndexTmpOriginal += 1 Next + + + + + If UsuarioActual.Empresa.Funcionalidad(574).ToEntero = 1 AndAlso (AjusteProntoPagoConIVA > 0 Or AjusteProntoPagoSinIVA > 0) Then + + Dim CvePS_RNC As Integer = UsuarioActual.Empresa.Funcionalidad(580).ToEntero + Dim PSRow As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS_RNC).FiltroPrimero("") + Dim CveSubProyectoPrincipal As Integer = AsignarSubProyectoPrincipal() + Dim SubProyecto As String = GlobalDTSubProyectos(-1, CveSubProyectoPrincipal, UsuarioActual.CveEmpresa).FiltroPrimeroValor("SubProyecto") + + Dim CveTipoPS As Integer = PSRow("CveTipoPS").ToString.ToEntero + If PSRow("CvePSCargo").ToString <> "" Then + CveTipoPS = 2 + End If + + Dim CveClasificacion As Integer = PSRow("CveClasificacion").ToString.ToEntero + Dim Clasificacion As String = PSRow("Clasificacion").ToString + Dim PS As String = PSRow("PS").ToString + Dim CveUM As Integer = PSRow("CveUnidadMedida").ToString.ToEntero + + + + Dim DTConIVA As DataTable = TmpDT.FiltraParametros(" IVAPorcentaje > 0") + If DTConIVA.Rows.Count > 0 Then + + End If + + Dim DTSinIVA As DataTable = TmpDT.FiltraParametros(" IVAPorcentaje = 0") + If DTSinIVA.Rows.Count > 0 Then + + End If + + Dim UM As String = PSRow("UnidadMedida").ToString + + If AjusteProntoPagoConIVA > 0 Then + AddPS(1, CveUM, UM, CveClasificacion, Clasificacion, CvePS_RNC, PS, 1, CveSubProyectoPrincipal.ToString, SubProyecto, "", "-1", "", AjusteProntoPagoConIVA, AjusteProntoPagoConIVA, AjusteProntoPagoPorcentajeIVA, 0, 0, 0, 0, 0) + End If + + If AjusteProntoPagoSinIVA > 0 Then + AddPS(1, CveUM, UM, CveClasificacion, Clasificacion, CvePS_RNC, PS, 1, CveSubProyectoPrincipal.ToString, SubProyecto, "", "-1", "", AjusteProntoPagoSinIVA, AjusteProntoPagoSinIVA, 0, 0, 0, 0, 0, 0) + End If + + End If + AddPS2(False) 'AJUSTE DE REDONDEO O DIFERENCIA PERMITIDA DE IMPORTE @@ -14614,6 +14724,7 @@ Partial Class Compras_Compras End If + CalculaTotales() CompraEstaVinculadaOC = True @@ -16942,12 +17053,7 @@ Partial Class Compras_Compras Dim Row As DataRow = Nothing - If Not TmpDT.Columns.Contains("PUProntoPago") Then - TmpDT.Columns.Add("PUProntoPago", GetType(Decimal)) - End If - If Not TmpDT.Columns.Contains("TotalProntoPago") Then - TmpDT.Columns.Add("TotalProntoPago", GetType(Decimal)) - End If + Row = TmpDT.NewRow() Dim Retorno As Integer = 0 @@ -20512,6 +20618,91 @@ Partial Class Compras_Compras End Function +#End Region + + +#Region "PRONTO PAGO" + + Public Function GeneraRemisionsNotadeCredito(ByRef trasaccion As SqlTransaction) As Boolean + Dim respuesta As Boolean = True + + Dim CvePS_RNC As Integer = UsuarioActual.Empresa.Funcionalidad(580).ToEntero + Dim PSRow As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS_RNC).FiltroPrimero("") + Dim CveSubProyectoPrincipal As Integer = AsignarSubProyectoPrincipal() + Dim SubProyecto As String = "" + + If Not CvePS_RNC > 0 Then + Alert("No esta definido el producto de Remisión de Nota de Crédito.", TipoMensaje.MsgAdvertencia) + Return False + End If + + + If Not CveSubProyectoPrincipal > 0 Then + Alert("No esta definido el Sub Proyecto.", TipoMensaje.MsgAdvertencia) + Return False + End If + + SubProyecto = GlobalDTSubProyectos(-1, CveSubProyectoPrincipal, UsuarioActual.CveEmpresa).FiltroPrimeroValor("SubProyecto") + + If PSRow IsNot Nothing Then + + Dim CompraRNC As New ClsCompraManagerCompras("", ClsCompraManagerCompras.EnumCargaCompra.SinXML, GlobalDTTiposGastos(UsuarioActual.CveEmpresa), UsuarioActual) + CompraRNC.CveFactura = -1 + CompraRNC.CveProveedor = DdlProveedor.SelectedValue.ToEntero + CompraRNC.CveTipoProveedor = CveTipoProveedor + CompraRNC.CveTipoConceptoProveedor = CveTipoConcepto + CompraRNC.TipoCompra = ClsCompraManagerCompras.EnumTipoCompra.Sin_definir + CompraRNC.IEPSGasto = False + CompraRNC.Descripcion = $"Remisión Nota de Crédito {TxtDescripcion.Text}" + CompraRNC.NombreProveedor = DdlProveedor.SelectedItem.Text + CompraRNC.Fecha = TxtFecha.Text.ToDate + CompraRNC.CveMoneda = DdlMoneda.SelectedValue.ToEntero + + + Dim CveTipoPS As Integer = PSRow("CveTipoPS").ToString.ToEntero + If PSRow("CvePSCargo").ToString <> "" Then + CveTipoPS = 2 + End If + + Dim CveClasificacion As Integer = PSRow("CveClasificacion").ToString.ToEntero + Dim Clasificacion As String = PSRow("Clasificacion").ToString + Dim PS As String = PSRow("PS").ToString + Dim CveUM As Integer = PSRow("CveUnidadMedida").ToString.ToEntero + Dim UM As String = PSRow("UnidadMedida").ToString + + CompraRNC.ConfiguraRegistroRapidoRNC(CvePS_RNC, CveUM, UM, CveClasificacion, Clasificacion, PS, CveSubProyectoPrincipal, SubProyecto, ImporteRNC, ImporteRNC) + If Not CompraRNC.AddCompraRNC(trasaccion) Then + respuesta = False + End If + + If respuesta Then + + Dim CompraRNCProntoPAgo As New ClsCompraManagerCompras("", ClsCompraManagerCompras.EnumCargaCompra.SinXML, GlobalDTTiposGastos(UsuarioActual.CveEmpresa), UsuarioActual) + CompraRNCProntoPAgo.CveFactura = -1 + CompraRNCProntoPAgo.CveProveedor = DdlProveedor.SelectedValue.ToEntero + CompraRNCProntoPAgo.CveTipoProveedor = CveTipoProveedor + CompraRNCProntoPAgo.CveTipoConceptoProveedor = CveTipoConcepto + CompraRNCProntoPAgo.TipoCompra = ClsCompraManagerCompras.EnumTipoCompra.Sin_definir + CompraRNCProntoPAgo.IEPSGasto = False + CompraRNCProntoPAgo.Descripcion = $"Remisión Nota de Crédito {TxtDescripcion.Text}" + CompraRNCProntoPAgo.NombreProveedor = DdlProveedor.SelectedItem.Text + CompraRNCProntoPAgo.Fecha = TxtFecha.Text.ToDate + CompraRNCProntoPAgo.CveMoneda = DdlMoneda.SelectedValue.ToEntero + + CompraRNCProntoPAgo.ConfiguraRegistroRapidoRNC(CvePS_RNC, CveUM, UM, CveClasificacion, Clasificacion, PS, CveSubProyectoPrincipal, SubProyecto, ImporteRNCProntoPago, ImporteRNCProntoPago) + If Not CompraRNCProntoPAgo.AddCompraRNC(trasaccion) Then + respuesta = False + End If + + End If + + + End If + + + + Return respuesta + End Function #End Region @@ -20525,3 +20716,2105 @@ Public Class MMensajeDevolucion Public Property Total As Decimal End Class + + +Public Class ClsCompraManagerCompras + + Enum EnumCargaCompra + DesdeXML + DesdeArchivo + SinXML + End Enum + Public Enum EnumCFDIVersion + v32 + V33 + V40 + End Enum + Public Enum EnumTipoCompra + Sin_definir = -1 + Gasto_con_almacen = 10 + Activo_Fijo = 1 + 'Costo_Indirecto = 2 + Almacen = 3 + Almacen_con_costo_indirecto = 8 + Costo_Indirecto = 4 + Importación = 5 + NC_Con_Productos = 6 + Apoyo_Logístico = 9 + NC_Por_Devolución = 11 + Garantia = 12 + End Enum + + + Public Enum EnumModalidadAccionPS + Agregar + Actualizar + End Enum + + Public Property CveCompra As Integer = -1 + Public Property CveProveedor As Integer + Public Property CveTipoConceptoProveedor As Integer + Public Property CveMoneda As Integer + Public Property Fecha As Date + Public ReadOnly Property SerieFolio As String + Get + If Serie.Length > 0 Then + Return $"{Serie}-{Folio}" + Else + Return $"{Folio}" + End If + End Get + End Property + + Public Property Serie As String = "" + Public Property Folio As String = "" + Public Property FolioSecundario As String = "" + Public Property Descripcion As String = "" + Public Property CFDIVersion As EnumCFDIVersion = EnumCFDIVersion.V40 + Public Property ProveedorNombre As String = "" + Public Property EsImportacion As Boolean = False + Public Property TC As Decimal = 1 + Public Property SubTotal As Decimal = 0D + Public Property SubTotal2 As Decimal = 0D + Public Property Descuento As Decimal = 0D + Public Property Total As Decimal = 0D + Public Property Moneda As String = "" + Public Property TipoComprobante As String + Public Property TipoCambio As Decimal = 1 + Public Property CompraNoDeducible As Integer = 0 + Public Property IVA As Decimal = 0D + Public Property IVADeducible As Decimal = 0D + Public Property IVANoDeducible As Decimal = 0 + Public Property IEPS As Decimal = 0D + Public Property RetIVA As Decimal = 0D + Public Property RetISR As Decimal = 0D + Public Property PorcentajeIVA As Decimal = 0 + Public Property PorcentajeISR As Decimal = 0 + Public Property CveRetIVAConcepto As Integer = -1 + Public Property CveRetISRConcepto As Integer = -1 + Public Property CveSubProyecto As Integer = -1 + Public Property UsuarioActual As Usuario + Public ReadOnly Property ConceptoPrePolizaIVA As ConceptosRetenciones + Get + Dim Ret As New ConceptosRetenciones + If EsImportacion Then + Ret.CveConceptoAcreditable = 288 + Ret.CveConceptoxAcreditar = 287 + Else + Ret.CveConceptoAcreditable = 19 + Ret.CveConceptoxAcreditar = 14 + End If + Return Ret + End Get + End Property + Public ReadOnly Property ConceptoPrePolizaRetIVA As ConceptosRetenciones + Get + Dim Ret As New ConceptosRetenciones + Dim Funcionalidad, FuncionalidadxAcred As Integer + If CveRetIVAConcepto = 1 Then + Funcionalidad = 308 : FuncionalidadxAcred = 307 + Ret.CveConceptoAcreditable = 22 + Ret.CveConceptoxAcreditar = 15 + ElseIf CveRetIVAConcepto = 2 Then + Funcionalidad = 310 : FuncionalidadxAcred = 309 + Ret.CveConceptoAcreditable = 184 + Ret.CveConceptoxAcreditar = 183 + ElseIf CveRetIVAConcepto = 3 Then + Funcionalidad = 312 : FuncionalidadxAcred = 311 + Ret.CveConceptoAcreditable = 186 + Ret.CveConceptoxAcreditar = 185 + ElseIf CveRetIVAConcepto = 4 Then + Funcionalidad = 314 : FuncionalidadxAcred = 313 + Ret.CveConceptoAcreditable = 249 + Ret.CveConceptoxAcreditar = 248 + ElseIf CveRetIVAConcepto = 5 Then + Funcionalidad = 578 : FuncionalidadxAcred = 578 + Ret.CveConceptoAcreditable = 286 + Ret.CveConceptoxAcreditar = 285 + ElseIf CveRetIVAConcepto = 6 Then + Funcionalidad = 578 : FuncionalidadxAcred = 578 + Ret.CveConceptoAcreditable = 333 + Ret.CveConceptoxAcreditar = 334 + End If + Return Ret + End Get + End Property + Public ReadOnly Property ConceptoPrePolizaRetISR As ConceptosRetenciones + Get + Dim Ret As New ConceptosRetenciones + Dim Funcionalidad, FuncionalidadxAcred As Integer + If CveRetISRConcepto = 1 Then + Funcionalidad = 316 : FuncionalidadxAcred = 315 + Ret.CveConceptoAcreditable = 23 + Ret.CveConceptoxAcreditar = 16 + ElseIf CveRetISRConcepto = 2 Then + Funcionalidad = 318 : FuncionalidadxAcred = 317 + Ret.CveConceptoAcreditable = 244 + Ret.CveConceptoxAcreditar = 243 + ElseIf CveRetISRConcepto = 3 Then + Funcionalidad = 349 : FuncionalidadxAcred = 348 + Ret.CveConceptoAcreditable = 328 + Ret.CveConceptoxAcreditar = 327 + End If + Return Ret + End Get + End Property + + Public Property CveMetodoPago As Integer + Public Property MetodoPago As String + Public Property DocumentosRelacionadosUUIDSList As List(Of String) = New List(Of String) + Public ReadOnly Property DocumentosRelacionadosUUIDSString As String + Get + Return GeneraStringDoctosRelacionados() + End Get + End Property + + Public Property DocumentosRelacionadosAnticiposUUIDList As List(Of String) = New List(Of String) + Public Property TieneAnticiposXML As Boolean = False + Public Property EmisorRFC As String + Public Property ReceptorRFC As String + Public Property UUID As String = "" + Public Property TotalRetenciones As Decimal = 0D + Public Property RetencionIVA As Decimal = 0D + Public Property RetencionISR As Decimal = 0D + Public Property SumaTotalRetenciones As Decimal = 0D + Public Property TotalTraslados As Decimal = 0D + Public Property TrasladoIVA As Decimal = 0D + Public Property TrasladoIEPS As Decimal = 0D + Public Property SumaTotalTraslados As Decimal = 0D + Public Property OtrosImpuestos As Decimal = 0D + Private Property OtrosImpuestosRetenciones As Decimal = 0D + Public Property Amortizacion As Decimal = 0D + Public Property FechaPago As Date 'FIX ME corregir usando fecha interna calculada por los dias de credito del proveedor + Public Property AplicaNotaCredito As Boolean = False + Public Property XMlStr As String + Public Property XMLCargaExistosa As Boolean = True + Public Property Observaciones As String = "" + Public Property CveEstatusFactura As Integer = 1 + Public Property CvePrePoliza As Integer = -1 + Public Property Redondeo As Decimal = 0 + Public Property IdPoliza As Integer = -1 + Public Property CveCajaChica As Integer = -1 + Public Property CvePersonal As Integer = -1 + Public Property NumeroReembolso As String = "" + Public Property CveProveedorSucursal As Integer = -1 + Public Property AplicoPromocion As Boolean = False + Public Property CveConceptoContableAlmacen As Integer = -1 + Public Property NoDeducible As Integer = 0 + Public Property CveTipoCompra As Integer = 1 + Public Property TotalOriginal As Decimal = 0D + Public Property CveTipoConcepto As Integer = 1 'FIX ME Esto tiene que ver con el CveTipoProveedor 1 y 3 es CveTipoConcepto 1 y 2 es CveTipoConcepto 2 + Public Property CveSubProyectoPrincipal As Integer = -1 + Public Property CveFactura As Integer = -1 + Public Property CveFolioGarantia As Integer = -1 + Public Property TmpDT As DataTable = New DataTable + Public Property SubTotalConceptos As Decimal = 0D + + Private Errores As StringBuilder = New StringBuilder + + Public ReadOnly Property MensajeError As String + Get + Return Errores.ToString() + End Get + End Property + + Public Property CompraSaldo As Decimal = 0D + Public Property SubTotalOriginal As Decimal = 0D + Public Property SubTotal2Original As Double = 0D + Public Property IVAOriginal As Decimal = 0D + Public Property RetIVAOriginal As Decimal = 0D + Public Property RetISROriginal As Decimal = 0D + Public Property Proyecto As String = "" + Public Property CveProyecto As Integer = -1 + Public Property SubProyecto As String = "" + Public Property TipoCompra As EnumTipoCompra = EnumTipoCompra.Sin_definir + Private Property DTTiposGastos() As DataTable + Public Property CveTipoProveedor As Integer = -1 + Public Property IEPSGasto As Boolean = False + Public Property OtrosImpuestosGasto As Boolean = False + Public Property OCVinculada As Boolean = False + Public Property NumNoDed As Integer = 0 + Public Property CveTipoPoliza As Integer = -1 + Public Property NombreProveedor As Object + Public Property CveCreditoDetalle As Integer = -1 + Public Property CveIE As Integer = -1 + Public Property CveCompraAmortizacion As Integer = -1 + + Public Sub New(XmlFuente As String, OpcionCarga As EnumCargaCompra, DTTiposGastos As DataTable, UsuarioActual As Usuario) + + Errores = New StringBuilder + + Me.DTTiposGastos = DTTiposGastos + Me.UsuarioActual = UsuarioActual + + + + If OpcionCarga = EnumCargaCompra.SinXML Then + + Else + If OpcionCarga = EnumCargaCompra.DesdeArchivo Then + CargaDesdeArchivo(XmlFuente) + Else + CargaDesdeString(XmlFuente) + End If + End If + + + + End Sub + + Private Sub CargaDesdeArchivo(XmlFuenteRuta As String) + + Dim XMLDoc As New XmlDocument + + If IO.File.Exists(XmlFuenteRuta) Then + XMlStr = File.ReadAllText(XmlFuenteRuta).Replace("<br>", "").Replace("<", "").Replace("o;?", "") + Try + XMLDoc.LoadXml(XMlStr) + XMLCargaExistosa = True + Catch ex As Exception + Try + Dim oReader As New StreamReader(XmlFuenteRuta, Encoding.GetEncoding("ISO-8859-1")) + XMLDoc.Load(oReader) + oReader.Dispose() + XMLCargaExistosa = True + Catch ex2 As Exception + GuardaLog("Error al intentar leer el XML del SAT. Error:" & ex2.ToString()) + Errores.AppendLine("Error al intentar leer el XML. Error:" & ex2.ToString()) + XMLCargaExistosa = False + End Try + End Try + End If + + If XMLCargaExistosa Then + CargaComprobanteXML(XMLDoc) + End If + + End Sub + Private Sub CargaDesdeString(XmlFuente As String) + XMlStr = XmlFuente.Replace("<br>", "").Replace("<", "").Replace("o;?", "") + Dim XMLDoc As New XmlDocument + Try + XMLDoc.LoadXml(XMlStr) + XMLCargaExistosa = True + Catch ex As Exception + GuardaLog("Error al intentar leer . Error:" & ex.ToString()) + Errores.AppendLine("Error al intentar leer el XML. Error:" & ex.ToString()) + XMLCargaExistosa = False + End Try + + If XMLCargaExistosa Then + CargaComprobanteXML(XMLDoc) + End If + + End Sub + + Private Sub CargaComprobanteXML(XMLDoc As XmlDocument) + Dim nodo As XmlNode = XMLDoc.DocumentElement + + Serie = ValorXML(nodo, "serie") + + Dim StrCFDIVerion As String = ValorXML(nodo, "version") + + If StrCFDIVerion = "3.2" Then + CFDIVersion = EnumCFDIVersion.v32 + ElseIf StrCFDIVerion = "3.3" Then + CFDIVersion = EnumCFDIVersion.V33 + ElseIf StrCFDIVerion = "4.0" Then + CFDIVersion = EnumCFDIVersion.V40 + Else + GuardaLog($"CFDI Versión {StrCFDIVerion} no soportada") + Errores.AppendLine($"CFDI Versión {StrCFDIVerion} no soportada") + XMLCargaExistosa = False + Exit Sub + End If + + Folio = ValorXML(nodo, "folio") + Fecha = ValorXML(nodo, "fecha").ToDate + SubTotal = ValorXML(nodo, "subTotal").ToDecimal + Total = ValorXML(nodo, "total").ToDecimal + Descuento = ValorXML(nodo, "descuento").ToDecimal + Moneda = ValorXML(nodo, "Moneda") + + CveMoneda = GlobalDTMonedas().FiltroPrimeroValor("CveMoneda", $" AbreviaturaSAT = '{Moneda}' ").ToEntero + If Not CveMoneda > 0 Then + GuardaLog($"Moneda {Moneda} no se obtuvo la clabe") + Errores.AppendLine($"Moneda {Moneda} no se obtuvo la clabe") + XMLCargaExistosa = False + Exit Sub + End If + + TipoComprobante = ValorXML(nodo, "tipoDeComprobante") + TipoCambio = ValorXML(nodo, "TipoCambio", "1").ToDecimal + + If CFDIVersion = EnumCFDIVersion.V33 Or CFDIVersion = EnumCFDIVersion.V40 Then + Dim drm As DataRow = GlobalDTVtaMetodoPago.FiltroPrimero(String.Format("ClaveMetodoPagoSAT = '{0}'", ValorXML(nodo, "MetodoPago"))) + If drm IsNot Nothing Then + CveMetodoPago = drm("CveMetodoPago").ToString.ToEntero + MetodoPago = drm("MetodoPagoSAT").ToString + End If + End If + + Dim namespaces As New XmlNamespaceManager(XMLDoc.NameTable) + Dim Prefijo As String = If(XMLDoc.DocumentElement.Prefix = "", "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "" + + If CFDIVersion = EnumCFDIVersion.v32 Then + Prefijo = "cfd" + cfdVer = "http://www.sat.gob.mx/cfd/2" + ElseIf CFDIVersion = EnumCFDIVersion.V33 Then + cfdVer = "http://www.sat.gob.mx/cfd/3" + Else ' se considera que es la version 4.0 + cfdVer = "http://www.sat.gob.mx/cfd/4" + End If + namespaces.AddNamespace(Prefijo, cfdVer) + namespaces.AddNamespace("aerolineas", "http://www.sat.gob.mx/aerolineas") + namespaces.AddNamespace("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital") + namespaces.AddNamespace("implocal", "http://www.sat.gob.mx/implocal") + namespaces.AddNamespace("registrofiscal", "http://www.sat.gob.mx/registrofiscal") + + If TipoComprobante.ToUpper = "E" AndAlso (CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40) Then + Dim UUIDS As String = "" + + Dim UUIDSLista As New List(Of String) + Dim nodeCFDIRelacionados As XmlNode + nodeCFDIRelacionados = XMLDoc.SelectSingleNode(String.Format("//{0}:CfdiRelacionados", Prefijo), namespaces) + + If nodeCFDIRelacionados IsNot Nothing Then + For Each CFDIRelacionados As XmlNode In nodeCFDIRelacionados + UUIDSLista.Add("" & CFDIRelacionados.Attributes("UUID").Value.ToString & "") + Next + End If + DocumentosRelacionadosUUIDSList = UUIDSLista + + End If + + Dim node As XmlNode + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Emisor", Prefijo), namespaces) + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + EmisorRFC = ValorXML(node, "RFC") + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Receptor", Prefijo), namespaces) + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + ReceptorRFC = ValorXML(node, "RFC") + End If + + If UsuarioActual.CveEmpresa.Contiene(119, 7) Then + node = XMLDoc.SelectSingleNode(String.Format("//{0}:CfdiRelacionados", Prefijo), namespaces) + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + If ValorXML(node, "TipoRelacion").ToString.Contiene("07") Then + Dim nodeDocumentosRelacionados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:CfdiRelacionado", Prefijo), namespaces) + For Each documento As XmlNode In nodeDocumentosRelacionados + If documento.Attributes("UUID").Value <> "" Then + DocumentosRelacionadosAnticiposUUIDList.Add(documento.Attributes("UUID").Value) + End If + TieneAnticiposXML = True + Next + End If + End If + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Impuestos", Prefijo), namespaces) + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + Dim nodeRetenciones As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Retenciones/{0}:Retencion", Prefijo), namespaces) + + TotalRetenciones = ValorXML(node, "totalImpuestosRetenidos", "0").ToDecimal + + If CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40 Then + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("Impuesto").Value = "002" Then RetencionIVA += retencion.Attributes("Importe").Value.ToDecimal + If retencion.Attributes("Impuesto").Value = "001" Then RetencionISR += retencion.Attributes("Importe").Value.ToDecimal + Next + + Else + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("impuesto").Value = "IVA" Then RetencionIVA += retencion.Attributes("importe").Value.ToDecimal + If retencion.Attributes("impuesto").Value = "ISR" Then RetencionISR += retencion.Attributes("importe").Value.ToDecimal + Next + End If + SumaTotalRetenciones += RetencionIVA + SumaTotalRetenciones += RetencionISR + + TotalTraslados = ValorXML(node, "totalImpuestosTrasladados", "0").ToDecimal + Dim nodeTraslados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Traslados/{0}:Traslado", Prefijo), namespaces) + + If CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40 Then + + For Each traslado As XmlNode In nodeTraslados + + If traslado.Attributes("Importe") IsNot Nothing Then + If traslado.Attributes("Impuesto").Value = "002" Then TrasladoIVA += traslado.Attributes("Importe").Value.ToDecimal + If traslado.Attributes("Impuesto").Value = "003" Then TrasladoIEPS += traslado.Attributes("Importe").Value.ToDecimal + End If + Next + Else + + For Each traslado As XmlNode In nodeTraslados + If traslado.Attributes("Importe") IsNot Nothing Then + If traslado.Attributes("impuesto").Value = "IVA" Then TrasladoIVA += traslado.Attributes("importe").Value.ToDecimal + + If traslado.Attributes("impuesto").Value = "IEPS" Then TrasladoIEPS += traslado.Attributes("importe").Value.ToDecimal + End If + Next + End If + + SumaTotalTraslados += TrasladoIVA + SumaTotalTraslados += TrasladoIEPS + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + + Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) + + UUID = ValorXML(nodeTFD, "UUID", "") + + Dim nodeRF As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CFDIRegistroFiscal ", "registrofiscal"), namespaces) + If nodeRF IsNot Nothing Then + Folio = ValorXML(nodeRF, "folio").TrimStart("0"c) + End If + + node = node.SelectSingleNode(String.Format("//{0}:ImpuestosLocales", "implocal"), namespaces) + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + OtrosImpuestos = ValorXML(node, "TotaldeTraslados", "0").ToDecimal + '2022.06.04-- se quitan los datos de retenciones de impuestos locales, generan conflicto. RMF + 'OtrosImpuestosRetenciones = ValorXML(node, "TotaldeRetenciones", "0").ToDecimal + End If + End If + + + If XMLCargaExistosa Then + If Not ValidateUUID(UUID) Then + GuardaLog($"UUID Invalido {UUID} .") + Errores.AppendLine($"UUID Invalido {UUID} .") + XMLCargaExistosa = False + End If + End If + + +#Region "DETALLES" + + Dim ObjeFacturas As New ClsCompras + Dim AjustaUltimoConcepto As Boolean = False + + Dim nodeconceptos As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Conceptos", Prefijo), namespaces) + Dim XML As String = Replace(nodeconceptos.OuterXml, "", "") 'salto de linea html + XML = XML.Replace("<br>", "") + XML = XML.Replace("<", "") + + XML = XML.Replace("&", "") 'adicional, si hay otros + + If ObjeFacturas.GetFacturasComparacionXML(StrCFDIVerion, XML, UsuarioActual.CveEmpresa) Then + TmpDT = ObjeFacturas.DtResultados + TmpDT.Columns.Add("CveSATPSActualizado") + SubTotalConceptos = TmpDT.SUMD("Total").RoundSQL + + If Not TmpDT.Columns.Contains("Amortizacion") Then + TmpDT.Columns.Add("Amortizacion", GetType(Decimal)) + End If + 'VALIDA QUE EL XML SI VIENE CON EL CODIGO SAT 01010101 + Dim ProductosCodigoSATNoPermitidos As New StringBuilder("") + For Each drr As DataRow In TmpDT.FiltraParametros("ClaveProdServ = '01010101'").Rows + ProductosCodigoSATNoPermitidos.AppendFormat("{0}
", drr("PS")) + Next + + If ProductosCodigoSATNoPermitidos.ToString.Length > 0 Then + Errores.AppendLine($"El comprobante contiene productos con código SAT '01010101', revise los productos:

{ProductosCodigoSATNoPermitidos.ToString}") + + End If + Else + GuardaLog($"Error al cargar detalles GetFacturasComparacionXML.") + Errores.AppendLine($"Error al cargar detalles GetFacturasComparacionXML.") + XMLCargaExistosa = False + End If + + ObjeFacturas.Dispose() + + If CFDIVersion = EnumCFDIVersion.V33 OrElse CFDIVersion = EnumCFDIVersion.V40 Then + If Not TmpDT.Columns.Contains("Amortizacion") Then + TmpDT.Columns.Add("Amortizacion", GetType(Decimal)) + End If + TmpDT.AcceptChanges() + ValidacionesTotalesXml() + End If + + Me.PorcentajeIVA = TmpDT.MAX("IVAPorcentaje").ToDecimal + +#End Region + End Sub + + Public Function ConfiguraRegistroRapidoReembolso(CvePS As Integer, CveSubProyecto As Integer, CveCajaChica As Integer, CvePersonal As Integer, CveRetIVAConcepto As Integer, CveRetISRConcepto As Integer, NumeroReembolso As String) As Boolean + + Dim respuesta As Boolean = True + Me.CveSubProyecto = CveSubProyecto + Me.CveSubProyectoPrincipal = CveSubProyecto + Me.CveCajaChica = CveCajaChica + Me.CvePersonal = CvePersonal + Me.CveRetIVAConcepto = CveRetIVAConcepto + Me.CveRetISRConcepto = CveRetISRConcepto + Me.CveTipoPoliza = 3 + Me.NumeroReembolso = NumeroReembolso + + Dim dRowSubProyecto As DataRow = GlobalDTSubProyectos(-1, CveSubProyecto, CveEmpresa:=UsuarioActual.CveEmpresa).FiltroPrimero("") + + If dRowSubProyecto IsNot Nothing Then + Me.Proyecto = dRowSubProyecto("Proyecto").ToString + Me.CveProyecto = (dRowSubProyecto("CveProyecto").ToString).ToEntero + Me.SubProyecto = dRowSubProyecto("SubProyecto").ToString + Else + Errores.AppendLine($"Error al cargar el Sub Proyecto CveSubProyecto: {CveSubProyecto}") + Return False + End If + + Dim DTIndex As DataTable = TmpDT.FiltraParametros("", DistinctColumns:={"Consec"}) + + For Each dRowIndex As DataRow In DTIndex.Rows + If Not UpdatePSReembolso(dRowIndex("Consec").ToString.ToEntero, CvePS) Then + respuesta = False + End If + Next + + If respuesta AndAlso IEPS > 0 Then + If Not AgregaIEPSReembolso(CvePS:=CvePS) Then + respuesta = False + Else + IEPS = 0 + End If + End If + + If Not AjustesValidacion() Then + respuesta = False + End If + + Return respuesta + + End Function + Public Function ConfiguraRegistroRapidoRNC(CvePS As Integer, CveUM As Integer, UM As String, CveClasificacion As Integer, Clasificacion As String, PS As String, CveSubProyecto As Integer, SubProyecto As String, + SubTotal As Decimal, Total As Decimal) As Boolean + + Dim respuesta As Boolean = True + Me.CveSubProyecto = CveSubProyecto + Me.CveSubProyectoPrincipal = CveSubProyecto + Me.CveCajaChica = -1 + Me.CvePersonal = -1 + Me.CveRetIVAConcepto = -1 + Me.CveRetISRConcepto = -1 + Me.CveTipoPoliza = 3 + Me.NumeroReembolso = "" + Me.SubTotal = SubTotal + Me.Total = Total + + + Dim dRowSubProyecto As DataRow = GlobalDTSubProyectos(-1, CveSubProyecto, CveEmpresa:=UsuarioActual.CveEmpresa).FiltroPrimero("") + + If dRowSubProyecto IsNot Nothing Then + Me.Proyecto = dRowSubProyecto("Proyecto").ToString + Me.CveProyecto = (dRowSubProyecto("CveProyecto").ToString).ToEntero + Me.SubProyecto = dRowSubProyecto("SubProyecto").ToString + Else + Errores.AppendLine($"Error al cargar el Sub Proyecto CveSubProyecto: {CveSubProyecto}") + Return False + End If + + + CreaDTCompras() + AddPS(1, CveUM, UM, CveClasificacion, Clasificacion, CvePS, PS, 1, CveSubProyecto.ToString, SubProyecto, "", "-1", "", SubTotal, SubTotal, 0, 0, 0, 0, 0, 0) + + 'If respuesta AndAlso IEPS > 0 Then + ' If Not AgregaIEPSReembolso(CvePS:=CvePS) Then + ' respuesta = False + ' Else + ' IEPS = 0 + ' End If + 'End If + + 'If Not AjustesValidacion() Then + ' respuesta = False + 'End If + + Return respuesta + + End Function + + + Private Sub CreaDTCompras() + + TmpDT = New DataTable + TmpDT.Columns.Add("Consec", GetType(Integer)) + TmpDT.Columns.Add("Cantidad", GetType(Decimal)) + TmpDT.Columns.Add("Codigo", GetType(String)) + TmpDT.Columns.Add("CveUM", GetType(Integer)) + TmpDT.Columns.Add("UM", GetType(String)) + TmpDT.Columns.Add("CveClasificacion", GetType(Integer)) + TmpDT.Columns.Add("Clasificacion", GetType(String)) + TmpDT.Columns.Add("CveClasificacionActualizar", GetType(Integer)) + TmpDT.Columns.Add("CvePS", GetType(Integer)) + TmpDT.Columns.Add("PS", GetType(String)) + TmpDT.Columns.Add("Obs", GetType(String)) + TmpDT.Columns.Add("PU", GetType(Decimal)) + TmpDT.Columns.Add("IVA", GetType(Decimal)) + TmpDT.Columns.Add("IVAPorcentaje", GetType(Decimal)) + TmpDT.Columns.Add("RetIVA", GetType(Decimal)) + TmpDT.Columns.Add("RetIVAPorcentaje", GetType(Decimal)) + TmpDT.Columns.Add("RetISR", GetType(Decimal)) + TmpDT.Columns.Add("RetISRPorcentaje", GetType(Decimal)) + TmpDT.Columns.Add("IEPSPS", GetType(Double)) + TmpDT.Columns.Add("IEPSPSPorcentaje", GetType(Double)) + TmpDT.Columns.Add("IEPSPSIVA", GetType(Double)) + TmpDT.Columns.Add("IEPSPSIVAPorcentaje", GetType(Double)) + TmpDT.Columns.Add("Descuento", GetType(Decimal)) + TmpDT.Columns.Add("OtrosGastos", GetType(Decimal)) + TmpDT.Columns.Add("Total", GetType(Decimal)) + TmpDT.Columns.Add("AsientoContableCompras", GetType(Integer)) + TmpDT.Columns.Add("Proyecto", GetType(String)) + TmpDT.Columns.Add("CveProyecto", GetType(Integer)) + TmpDT.Columns.Add("CveSubProyecto", GetType(Integer)) + TmpDT.Columns.Add("CveContrato", GetType(Integer)) + TmpDT.Columns.Add("SubProyecto", GetType(String)) + 'TmpDT.Columns.Add("CveEq", GetType(Integer)) + TmpDT.Columns.Add("CveAlmacen", GetType(Integer)) + TmpDT.Columns.Add("CvePersonal", GetType(String)) + TmpDT.Columns.Add("Referencia", GetType(String)) + + 'AC + TmpDT.Columns.Add("CveTipoGastoAC", GetType(Integer)) + TmpDT.Columns.Add("CvePresupuestoEgreso", GetType(Integer)) + TmpDT.Columns.Add("CveProgramaOperativo", GetType(Integer)) + TmpDT.Columns.Add("CveUnidadAdministrativa", GetType(Integer)) + TmpDT.Columns.Add("CveFuenteFinanciamiento", GetType(Integer)) + TmpDT.Columns.Add("CveClasificacionOG", GetType(Integer)) + + TmpDT.Columns.Add("IdCuentaComprometido", GetType(Integer)) + TmpDT.Columns.Add("IdCuentaPorEjercer", GetType(Integer)) + TmpDT.Columns.Add("IdCuentaDevengado", GetType(Integer)) + TmpDT.Columns.Add("IdCuentaMatriz", GetType(Integer)) + + 'INVENTARIO SERIE/LOTE + TmpDT.Columns.Add("CveMetodoInventario", GetType(Integer)) + + TmpDT.Columns.Add("CveConcepto", GetType(Integer)) + + 'AF + TmpDT.Columns.Add("CveActivoFijo", GetType(Integer)) + TmpDT.Columns.Add("CodAF", GetType(String)) + TmpDT.Columns.Add("TipoAF", GetType(Integer)) + TmpDT.Columns.Add("AFMedida", GetType(Integer)) + TmpDT.Columns.Add("AFTipoMantenimiento", GetType(Integer)) + + 'PS + TmpDT.Columns.Add("CveTipoPS", GetType(Integer)) + TmpDT.Columns.Add("CodigoPS", GetType(String)) + TmpDT.Columns.Add("PSDescripcion", GetType(String)) + 'CAMPO ESPECIAL PARA GLUYAS - LEE EL DEL XML - A GLUYAS LE INTERESA EL CODIGO DEL PROVEEDOR + TmpDT.Columns.Add("PSCodigo", GetType(String)) + + + 'OC + TmpDT.Columns.Add("CveOrdenCompraDetalle", GetType(Integer)) + TmpDT.Columns.Add("ProductoOC", GetType(String)) + TmpDT.Columns.Add("CantidadF", GetType(Double)) + + 'Consignaciones + TmpDT.Columns.Add("CveAlmacenConsignacion", GetType(Integer)) + TmpDT.Columns.Add("NoConsignacion", GetType(Integer)) + TmpDT.Columns.Add("CveConsignacion", GetType(Integer)) + TmpDT.Columns.Add("HdnPS", GetType(String)) + TmpDT.Columns.Add("HdnCvePS", GetType(String)) + TmpDT.Columns.Add("HdnClasificacion", GetType(String)) + TmpDT.Columns.Add("HdnCveClasificacion", GetType(String)) + TmpDT.Columns.Add("HdnCveAlmacen", GetType(String)) + + 'Fletes y Servicios + TmpDT.Columns.Add("AplicaCostoIndirecto", GetType(Integer)) + TmpDT.Columns.Add("CostoIndirectoAlmacen", GetType(Decimal)) + TmpDT.Columns.Add("CveCompraDetalle", GetType(Integer)) + + TmpDT.Columns.Add("EntregaDirecta", GetType(Integer)) + + 'SAT + TmpDT.Columns.Add("CveSATPS", GetType(Integer)) + TmpDT.Columns.Add("SATClaveProductoServicio", GetType(String)) + TmpDT.Columns.Add("CveUnidadMedidaSAT", GetType(Integer)) + TmpDT.Columns.Add("SATClaveUnidadMedida", GetType(String)) + TmpDT.Columns.Add("CveSATPSActualizado", GetType(Integer)) + + + 'Tipo de Gasto + TmpDT.Columns.Add("CveTipoGasto", GetType(Integer)) + TmpDT.Columns.Add("TipoGasto", GetType(String)) + + TmpDT.Columns.Add("ImporteSinImpuestos", GetType(Double)) + TmpDT.Columns.Add("ImporteConImpuestos", GetType(Double)) + TmpDT.Columns.Add("NoDeducible", GetType(Boolean)) + + TmpDT.Columns.Add("DifPSSat", GetType(Integer)) + + + TmpDT.Columns.Add("CveContratoDetalle", GetType(Integer)) + TmpDT.Columns.Add("CveCultivoCuadroDetalle", GetType(Integer)) + TmpDT.Columns.Add("TemporadaCuadro", GetType(String)) + + + TmpDT.AcceptChanges() + + + End Sub + Private Function AjustesValidacion() As Boolean + Dim respuesta As Boolean = True + 'VALIDA IMPORTES + If Not ValidaTotalesGuardar() Then + respuesta = False + End If + + If Not AjustaCombustibles() Then + respuesta = False + End If + + If Not AjustaIVA() Then + respuesta = False + End If + + If Not AjustaRetIVA() Then + respuesta = False + End If + + If Not AjustaRetISR() Then + respuesta = False + End If + + Return respuesta + + End Function + + Private Function ValidaTotalesGuardar() As Boolean + Dim EsValido As Boolean = True + + 'VALIDA IMPORTES + 'VALIDA TOTAL CON LOS IMPORTES TOTALES + Dim TempSubTotal, TempDescuentos, TempIVA, TempSubTotal2, TempRetIVA, TempRetISR, TempTotal, DifTotales, TempIEPS As Decimal + + Dim Amortizacion As Decimal = 0 + Dim TieneAmortizacion As Boolean = False + If DocumentosRelacionadosAnticiposUUIDList IsNot Nothing AndAlso DocumentosRelacionadosAnticiposUUIDList.Count > 0 Then 'Fix me + ' AndAlso ArrAnticipos IsNot Nothing AndAlso ArrAnticipos.Count > 0 Then + 'TieneAmortizacion = True + End If + + 'If CveCompra < 0 AndAlso Not TieneAmortizacion Then + ' LblAmortizacion.Text = "0.00" + 'End If + + 'If UsuarioActual.CveEmpresa = 119 AndAlso TieneAmortizacion Then + ' Amortizacion = LblAmortizacion.Text.Trim.ToDecimal + ' TxtSubTotal.Text = (TxtSubTotal.Text.ToDouble + Amortizacion).ToString + 'End If + + + TempSubTotal = SubTotal + SubTotalOriginal = SubTotal + SubTotal2Original = SubTotal2 + TempDescuentos = Descuento + Amortizacion + TempSubTotal2 = TempSubTotal - TempDescuentos + TempIVA = IVA + TempIEPS = IEPS + TempRetIVA = RetIVA + TempRetISR = RetISR + TempTotal = Math.Round(TempSubTotal2 + TempIVA + TempIEPS - TempRetIVA - TempRetISR + OtrosImpuestos - Amortizacion, 2) + DifTotales = Total - TempTotal + Dim DiferenciaPermitida As Decimal = 0.6D + + If Math.Abs(DifTotales) > DiferenciaPermitida Then + Errores.AppendLine($"Los importes de los conceptos (Productos/Servicios) no cuadran con el total. Por favor verifique y vuelva a intentar.[{Math.Abs(DifTotales) - DiferenciaPermitida}]") + EsValido = False + ElseIf DifTotales <> 0 Then + SubTotal2 = (SubTotal2 + DifTotales) + SubTotal = (SubTotal + DifTotales) + SubTotalOriginal = SubTotal + SubTotal2Original = SubTotal2 + End If + + Dim DiferenciaSubtotales As Decimal = 0 + If CveCompra > 0 Or CveFactura > 0 Or OCVinculada Then + + If SubTotalOriginal = Nothing Then + SubTotalOriginal = 0 + End If + + If SubTotal2Original = Nothing Then + SubTotal2Original = 0 + End If + + DiferenciaSubtotales = SubTotal2Original.ToString.ToDecimal - TmpDT.SUM("Total").ToString.ToDecimal + '[IPP] PARCHE: Factura TELMEX para APH 12/ENERO/2018 + If CveFactura = 286290 Then + DiferenciaSubtotales += Descuento + End If + If Math.Abs(DiferenciaSubtotales) > 1 And Not CompraNoDeducible = 1 Then 'EsNoDeducible + Errores.AppendLine("Los importes de los conceptos (Productos/Servicios) no cuadran con el total. Por favor verifique y vuelva a intentar.") + EsValido = False + Else + AjustaImporteUltimoConcepto(DiferenciaSubtotales) + End If + Else + DiferenciaSubtotales = (SubTotal2 - TmpDT.SUMD("Total")).ToString.ToDecimal + If Math.Abs(DiferenciaSubtotales) > 1 Then + Errores.AppendLine("Los importes de los conceptos (Productos/Servicios) no cuadran con el total. Por favor verifique y vuelva a intentar.") + EsValido = False + Else + AjustaImporteUltimoConcepto(DiferenciaSubtotales) + End If + End If + + Return EsValido + End Function + + + + Private Function AjustaCombustibles() As Boolean + + Dim Respuesta As Boolean = False + + Dim IVADetalles As Decimal = TmpDT.SUMD("IVA", " IVA > 0 ") + Dim DiferenciaIVas As Decimal = IVA - IVADetalles + + + If Not TmpDT.Columns.Contains("AplicaIEPS") Then + TmpDT.Columns.Add(New DataColumn("AplicaIEPS", GetType(Boolean))) + End If + + If Not TmpDT.Columns.Contains("IEPSGrabaIVA") Then + TmpDT.Columns.Add(New DataColumn("IEPSGrabaIVA", GetType(Boolean))) + End If + + For Each dRow As DataRow In TmpDT.Rows + Dim DttPS As DataTable = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=dRow("CvePS").ToString.ToEntero) + If DttPS IsNot Nothing AndAlso DttPS.Rows.Count > 0 Then + Dim DrPS As DataRow = DttPS.Rows(0) + dRow("AplicaIEPS") = Boolean.Parse(DrPS("AplicaIEPS").ToString) + dRow("IEPSGrabaIVA") = Boolean.Parse(DrPS("IEPSGrabaIVA").ToString) + Else + dRow("AplicaIEPS") = False + dRow("IEPSGrabaIVA") = False + End If + Next + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" AplicaIEPS = 'True' AND IEPSGrabaIVA = 'False' AND IVA > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConIVA As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If Boolean.Parse(dRow("AplicaIEPS").ToString) And Boolean.Parse(dRow("IEPSGrabaIVA").ToString) = False And dRow("IVA").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConIVA = CantidadRegistroConIVA + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.01D Then + + If (TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaIVas) / CantidadRegistroConIVA + + For Each dRow As DataRow In TmpDT.Rows + If Boolean.Parse(dRow("AplicaIEPS").ToString) And Boolean.Parse(dRow("IEPSGrabaIVA").ToString) = False And dRow("IVA").ToString.ToDecimal > 0 Then + dRow("IVA") = dRow("IVA").ToString.ToDecimal - AjusteteDividido + End If + Next + Else + TmpDT.Rows(IndiceUltimo)("IVA") = TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas + End If + TmpDT.AcceptChanges() + End If + + End If + + 'Revalidacion de ajuste + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.01D Then + Respuesta = False + If IVADetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IVA").ToString.ToDecimal > 0 Then + dRow("IVA") = dRow("IVA").ToString.ToDecimal + DiferenciaIVas + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + Else + Alert("Los productos especificados en el listado no tienen asignado impuesto IVA, favor de realizar la corrección en el producto que aplique el impuesto.", TipoMensaje.MsgAdvertencia) + Respuesta = False + End If + Else + Respuesta = True + End If + + If Respuesta Then + + Dim IEPSPSDetalles As Decimal = TmpDT.SUMD("IEPSPS", " IEPSPS > 0 ") + Dim DiferenciaIEPSPS As Decimal = IEPS - IEPSPSDetalles + + Dim DTConsultaIEPSPS As New DataTable + DTConsultaIEPSPS = TmpDT.FiltraParametros(" AplicaIEPS = 'True'") + Dim IndiceContador As Integer = 0 + Dim IndicePrimero As Integer = 0 + + For Each dRow As DataRow In TmpDT.Rows + If Boolean.Parse(dRow("AplicaIEPS").ToString) And dRow("IEPSPS").ToString.ToDecimal > 0 Then + IndicePrimero = IndiceContador + Exit For + End If + IndiceContador = IndiceContador + 1 + Next + If DiferenciaIEPSPS.RoundSQL(2) <> 0 Then + + TmpDT.Rows(IndicePrimero)("IEPSPS") = TmpDT.Rows(IndicePrimero)("IEPSPS").ToString.ToDecimal + DiferenciaIEPSPS + TmpDT.AcceptChanges() + End If + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IEPSPSPorcentaje").ToString.ToDecimal > 0 AndAlso dRow("IEPSPS").ToString.ToDecimal = 0 Then + dRow("IEPSPSPorcentaje") = 0 + End If + Next + TmpDT.AcceptChanges() + End If + + Return Respuesta + + End Function + + + Private Function AjustaIVA() As Boolean + + Dim Respuesta As Boolean = False + + Dim IVADetalles As Decimal = TmpDT.SUMD("IVA", " IVA > 0 ") + Dim DiferenciaIVas As Decimal = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0 Then + If Math.Abs(DiferenciaIVas) <= 0.05 Then + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" IVA > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConIVA As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IVA").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConIVA = CantidadRegistroConIVA + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.0D Then + + If (TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaIVas) / CantidadRegistroConIVA + + For Each dRow As DataRow In TmpDT.Rows + dRow("IVA") = dRow("IVA").ToString.ToDecimal - AjusteteDividido + Next + Else + TmpDT.Rows(IndiceUltimo)("IVA") = TmpDT.Rows(IndiceUltimo)("IVA").ToString.ToDecimal + DiferenciaIVas + End If + TmpDT.AcceptChanges() + End If + End If + + 'Revalidacion de ajuste + IVADetalles = TmpDT.SUMD("IVA", " IVA > 0 ") + DiferenciaIVas = IVA - IVADetalles + + If Math.Abs(DiferenciaIVas) > 0.01D Then + Respuesta = False + If IVADetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("IVA").ToString.ToDecimal > 0 Then + dRow("IVA") = dRow("IVA").ToString.ToDecimal + DiferenciaIVas + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + + Else + Errores.AppendLine("Los productos especificados en el listado no tienen asignado impuesto IVA, favor de realizar la corrección en el producto que aplique el impuesto.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Else + Errores.AppendLine($"existe una diferencia de {DiferenciaIVas} entre el IVA de la compra y los detalles.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Return Respuesta + + End Function + + Private Function AjustaRetIVA() As Boolean + + Dim Respuesta As Boolean = False + + Dim RetIVADetalles As Decimal = TmpDT.SUMD("RetIVA", " RetIVA > 0 ") + Dim DiferenciaRetIVA As Decimal = RetIVA - RetIVADetalles + + If Math.Abs(DiferenciaRetIVA) > 0 Then + If Math.Abs(DiferenciaRetIVA) <= 0.05 Then + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" RetIVA > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConRetIVA As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetIVA").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConRetIVA = CantidadRegistroConRetIVA + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + RetIVADetalles = TmpDT.SUMD("RetIVA", " RetIVA > 0 ") + DiferenciaRetIVA = RetIVA - RetIVADetalles + + If Math.Abs(DiferenciaRetIVA) > 0.0D Then + + If (TmpDT.Rows(IndiceUltimo)("RetIVA").ToString.ToDecimal + DiferenciaRetIVA) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaRetIVA) / CantidadRegistroConRetIVA + + For Each dRow As DataRow In TmpDT.Rows + dRow("RetIVA") = dRow("RetIVA").ToString.ToDecimal - AjusteteDividido + Next + + Else + TmpDT.Rows(IndiceUltimo)("RetIVA") = TmpDT.Rows(IndiceUltimo)("RetIVA").ToString.ToDecimal + DiferenciaRetIVA + End If + + TmpDT.AcceptChanges() + + End If + + End If + + 'Revalidacion de ajuste + RetIVADetalles = TmpDT.SUMD("RetIVA", " RetIVA > 0 ") + DiferenciaRetIVA = RetIVA - RetIVADetalles + + If Math.Abs(DiferenciaRetIVA) > 0.01D Then + Respuesta = False + If RetIVADetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetIVA").ToString.ToDecimal > 0 Then + dRow("RetIVA") = dRow("RetIVA").ToString.ToDecimal + DiferenciaRetIVA + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + + Else + Errores.AppendLine("Los productos especificados en el listado no tienen asignado impuesto RetIVA, favor de realizar la corrección en el producto que aplique el impuesto.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Else + Errores.AppendLine($"existe una diferencia de {DiferenciaRetIVA} entre el RetIVA de la compra y los detalles.") + End If + Else + Respuesta = True + + End If + + Return Respuesta + + End Function + + Private Function AjustaRetISR() As Boolean + + Dim Respuesta As Boolean = False + + Dim RetISRDetalles As Decimal = TmpDT.SUMD("RetISR", " RetISR > 0 ") + Dim DiferenciaRetISR As Decimal = RetISR - RetISRDetalles + + If Math.Abs(DiferenciaRetISR) > 0 Then + If Math.Abs(DiferenciaRetISR) <= 0.05 Then + + Dim DTConsulta As New DataTable + DTConsulta = TmpDT.FiltraParametros(" RetISR > 0 ") + + If DTConsulta.Rows.Count > 0 Then + + Dim IndiceContador As Integer = 0 + Dim IndiceUltimo As Integer = 0 + Dim CantidadRegistroConRetISR As Decimal + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetISR").ToString.ToDecimal > 0 Then + IndiceUltimo = IndiceContador + CantidadRegistroConRetISR = CantidadRegistroConRetISR + 1 + End If + IndiceContador = IndiceContador + 1 + Next + + RetISRDetalles = TmpDT.SUMD("RetISR", " RetISR > 0 ") + DiferenciaRetISR = RetISR - RetISRDetalles + + If Math.Abs(DiferenciaRetISR) > 0.0D Then + + If (TmpDT.Rows(IndiceUltimo)("RetISR").ToString.ToDecimal + DiferenciaRetISR) < 0 Then + + Dim AjusteteDividido As Decimal = Math.Abs(DiferenciaRetISR) / CantidadRegistroConRetISR + + For Each dRow As DataRow In TmpDT.Rows + dRow("RetISR") = dRow("RetISR").ToString.ToDecimal - AjusteteDividido + Next + + Else + TmpDT.Rows(IndiceUltimo)("RetISR") = TmpDT.Rows(IndiceUltimo)("RetISR").ToString.ToDecimal + DiferenciaRetISR + End If + + TmpDT.AcceptChanges() + + End If + + End If + + 'Revalidacion de ajuste + RetISRDetalles = TmpDT.SUMD("RetISR", " RetISR > 0 ") + DiferenciaRetISR = RetISR - RetISRDetalles + + If Math.Abs(DiferenciaRetISR) > 0.01D Then + Respuesta = False + If RetISRDetalles > 0 Then + + For Each dRow As DataRow In TmpDT.Rows + If dRow("RetISR").ToString.ToDecimal > 0 Then + dRow("RetISR") = dRow("RetISR").ToString.ToDecimal + DiferenciaRetISR + TmpDT.AcceptChanges() + Respuesta = True + Exit For + End If + Next + + Else + Errores.AppendLine("Los productos especificados en el listado no tienen asignado impuesto RetISR, favor de realizar la corrección en el producto que aplique el impuesto.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Else + Errores.AppendLine($"existe una diferencia de {DiferenciaRetISR} entre el RetISR de la compra y los detalles.") + Respuesta = False + End If + Else + Respuesta = True + End If + + Return Respuesta + + End Function + + Private Function AgregaIEPSReembolso(CvePS As Integer) As Boolean + + Dim respuesta As Boolean = True + + If IEPSGasto Or OtrosImpuestosGasto Then + + 'AGREGA IEPS COMO CONCEPTO + If IEPSGasto Then + AgregarConceptoIEPS(TrasladoIEPS, CvePS) + For Each Dr As DataRow In TmpDT.Rows + Dr("IEPSPS") = 0 + Dr("IEPSPSPorcentaje") = 0 + Next + TmpDT.AcceptChanges() + End If + 'AGREGA OTROS IMPUESTOS COMO CONCEPTO + If OtrosImpuestosGasto Then + AgregarConceptoIEPS(OtrosImpuestos, CvePS) + End If + Else + respuesta = False + Errores.AppendLine("Debe seleccionar al menos un impuesto. ") + End If + CalculaTotales() + + Return respuesta + + End Function + + + Private Sub AgregarConceptoIEPS(IEPS As Decimal, CvePS1 As Integer) + Dim SubTotalR As Decimal = TmpDT.SUM("Total").ToString.ToDecimal + + Dim PSS As DataTable = GlobalDTPS(UsuarioActual.CveEmpresa).FiltraParametros(String.Format("CvePS = {0} ", CvePS1), "PS") + Dim PSS2 As DataTable = TmpDT.FiltraParametros(String.Format("CvePS = {0} ", CvePS1), "PS") + + If PSS.Rows.Count > 0 Or PSS2.Rows.Count > 0 Then + Dim CveUM As Integer = 0 + Dim UM As String = "" + Dim CveClasificacion As Integer = 0 + Dim Clasificacion As String = "" + Dim CvePS As Integer = 0 + Dim PS As String = "" + Dim CveTipoPS As Integer = 0 + + If PSS.Rows.Count > 0 Then + CveUM = PSS.Rows(0)("CveUM").ToString.ToEntero + UM = PSS.Rows(0)("UnidadMedida").ToString + CveClasificacion = PSS.Rows(0)("CveClasificacion").ToString.ToEntero + Clasificacion = PSS.Rows(0)("Clasificacion").ToString + CvePS = PSS.Rows(0)("CvePS").ToString.ToEntero + PS = PSS.Rows(0)("PS").ToString + CveTipoPS = PSS.Rows(0)("CveTipoPS").ToString.ToEntero + End If + + Dim Cantidad As Decimal = 1 + Dim CveSubProyectoContrato As String = "-1" + Dim CveProyecto As String = "-1" + Dim SubProyecto As String = "SE" + Dim Proyecto As String = "SE" + Dim Obs As String = "" + Dim PU As Decimal = IEPS + Dim Total As Decimal = Cantidad * PU + Dim IVA As Decimal = 0 + Dim Descuento As Decimal = 0 + + If PSS2.Rows.Count > 0 Then + CveUM = PSS2.Rows(0)("CveUM").ToString.ToEntero + UM = PSS2.Rows(0)("UM").ToString + CveClasificacion = PSS2.Rows(0)("CveClasificacion").ToString.ToEntero + Clasificacion = PSS2.Rows(0)("Clasificacion").ToString + CvePS = PSS2.Rows(0)("CvePS").ToString.ToEntero + PS = PSS2.Rows(0)("PS").ToString + CveTipoPS = PSS2.Rows(0)("CveTipoPS").ToString.ToEntero + + CveSubProyectoContrato = PSS2.Rows(0)("CveSubProyecto").ToString + CveProyecto = PSS2.Rows(0)("CveProyecto").ToString + SubProyecto = PSS2.Rows(0)("SubProyecto").ToString + Proyecto = PSS2.Rows(0)("Proyecto").ToString + Obs = PSS2.Rows(0)("Obs").ToString + + Dim CveTipoGasto As Integer = PSS2.Rows(0)("CveTipoGasto").ToString.ToEntero + Dim TipoGasto As String = PSS2.Rows(0)("TipoGasto").ToString + + AddPS(Cantidad, CveUM, UM, CveClasificacion, Clasificacion, CvePS, PS, CveTipoPS, CveSubProyectoContrato, SubProyecto, Proyecto, CveProyecto, Obs, PU, Total, IVA, 0, 0, 0, 0, Descuento, TCalculaTotales:=False, CveTipoGasto:=CveTipoGasto, + TipoGasto:=TipoGasto, ModalidadAccionPS:=EnumModalidadAccionPS.Agregar) + + Else + AddPS(Cantidad, CveUM, UM, CveClasificacion, Clasificacion, CvePS, PS, CveTipoPS, CveSubProyectoContrato, SubProyecto, Proyecto, CveProyecto, Obs, PU, Total, IVA, 0, 0, 0, 0, Descuento, TCalculaTotales:=False) + End If + End If + + Dim SubTotalIEPS As Decimal = TmpDT.SUMD("Total") + + Me.SubTotal = Math.Round(SubTotalIEPS, 2) + Me.SubTotalConceptos = Math.Round(SubTotalIEPS, 2) + + PSS.Dispose() + End Sub + + Private Function AddPS(Cantidad As Decimal, CveUM As Integer, UM As String, CveClasificacion As Integer, Clasificacion As String, CvePS As Integer, PS As String, CveTipoPS As Integer, CveSubProyectoContrato As String, SubProyecto As String, Proyecto As String, CveProyecto As String, + Obs As String, PU As Decimal, Total As Decimal, IVA As Decimal, RetIVA As Decimal, RetISR As Decimal, IEPSPS As Decimal, IEPSPSIVA As Decimal, Descuento As Decimal, Optional CveOrdenCompraDetalle As Integer = -1, Optional TCalculaTotales As Boolean = True, + Optional PSCodigo As String = "-", Optional PSDescripcion As String = "-", Optional CantidadF As Double = -1, Optional EntregaDirecta As Integer = -1, Optional OtrosGastos As Decimal = 0, + Optional CveSATPS As Integer = -1, Optional CargaXml As Boolean = False, Optional CveTipoGasto As Integer = -1, Optional TipoGasto As String = "", Optional PorcentajeIVA As Decimal = 0, + Optional PorcentajeIEPS As Decimal = 0, Optional PorcentajeRetIVA As Decimal = 0, Optional PorcentajeRetISR As Decimal = 0, Optional NoDeducible As Boolean = False, Optional CveContratoDetalle As Integer = -1, Optional CveCultivoCuadroDetalle As Integer = -1, + Optional CveSATPSActualizado As Boolean = False, Optional TemporadaCuadro As String = "", Optional ModalidadAccionPS As EnumModalidadAccionPS = EnumModalidadAccionPS.Agregar, Optional Con As Integer = -1, + Optional CveProgramaOperativo As Integer = -1, Optional CveUnidadAdministrativa As Integer = -1, Optional CveFuenteFinanciamiento As Integer = -1, Optional CveTipoGastoAC As Integer = -1, Optional CveClasificacionOG As Integer = -1) As Integer + + Dim Row As DataRow = Nothing + + Row = TmpDT.NewRow() + Dim Retorno As Integer = 0 + Dim CveContrato As Integer = -1 + Dim CveSubProyecto As Integer = -1 + Dim Valores As String() + + ''CONTRATOS + If CveSubProyectoContrato.Contains("|"c) Then + Valores = CveSubProyectoContrato.Split("|"c) + CveContrato = Valores(1).ToEntero + CveSubProyecto = Valores(0).ToEntero + Else + CveSubProyecto = CveSubProyectoContrato.ToEntero + End If + + 'DR PS + Dim DrPS As DataRow = Nothing + If CvePS > 0 Then + DrPS = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS).Rows(0) + End If + + If DrPS IsNot Nothing Then + Row("PSCodigo") = If(PSCodigo = "", DrPS("PSCodigo").ToString, PSCodigo) + Row("CveMetodoInventario") = DrPS("Inv_CveMetodoInventario").ToString.ToEntero + + If CveTipoCompra = EnumTipoCompra.Garantia AndAlso DrPS("AplicaSerie").ToString = "True" Then + Row("CveMetodoInventario") = "1" + End If + + Else + Row("PSCodigo") = PSCodigo + Row("CveMetodoInventario") = 0 + End If + + If ModalidadAccionPS = EnumModalidadAccionPS.Actualizar Then + Row("Consec") = Con + Else + Row("Consec") = TmpDT.Rows.Count + 1 + End If + + If (CFDIVersion = EnumCFDIVersion.V33 Or CFDIVersion = EnumCFDIVersion.V40) And CveSATPS > 0 Then + Dim DrPSSAT As DataRow = Nothing + If CargaXml Then + DrPSSAT = GlobalDTPSATPS("-1", CveSATPS.ToString).FiltroPrimero("") + Else + DrPSSAT = GlobalDTPSATPS("-1", CveSATPS.ToString).FiltroPrimero("") + End If + If DrPSSAT IsNot Nothing Then + Row("SATClaveProductoServicio") = DrPSSAT("SATClaveProductoServicio").ToString + Row("CveSATPS") = DrPSSAT("CveSATPS").ToString + If CveSATPSActualizado Then + Row("CveSATPSActualizado") = 1 + Else + Row("CveSATPSActualizado") = 0 + End If + End If + End If + + Try + If (DrPS("CvePSCargo").ToString <> "") Then 'si es un producto de usado. que se registre contablemente como alamcen(como producto) + CveTipoPS = 2 + End If + Catch ex As Exception + + End Try + + Dim DecimalesPermitidos As Integer = 6 + + Row("CveConcepto") = TmpDT.Rows.Count + 1 + Row("Cantidad") = Math.Round(Cantidad, DecimalesPermitidos) + Row("CantidadF") = If(CantidadF = -1, Math.Round(Cantidad, DecimalesPermitidos), Math.Round(CantidadF, DecimalesPermitidos)) + Row("CveUM") = CveUM + Row("UM") = UM + Row("CveClasificacion") = CveClasificacion + Row("CveClasificacionActualizar") = CveClasificacion + Row("Clasificacion") = Clasificacion + Row("CvePS") = CvePS + Row("PS") = PS + Row("CveTipoPS") = CveTipoPS + + Row("PSDescripcion") = PSDescripcion + Row("CveSubProyecto") = CveSubProyecto.ToEntero + Row("CveProyecto") = CveProyecto.ToEntero + Row("CveContrato") = CveContrato.ToEntero + Row("SubProyecto") = If(SubProyecto = "Seleccione", "Sin Sub Proyecto", SubProyecto) + Row("Proyecto") = If(Proyecto = "Seleccione", "Sin Proyecto", Proyecto) + Row("CveActivoFijo") = -1 + Row("Obs") = Obs + Row("CveActivoFijo") = -1 + Row("CodAF") = "-1" + Row("TipoAF") = -1 + Row("CveOrdenCompraDetalle") = CveOrdenCompraDetalle + Row("EntregaDirecta") = EntregaDirecta + + Row("NoDeducible") = NoDeducible + + + Total = Math.Round(PU, DecimalesPermitidos) * Cantidad - Descuento + Row("PU") = Math.Round(PU, DecimalesPermitidos) + If CargaXml And (CFDIVersion = EnumCFDIVersion.V33 Or CFDIVersion = EnumCFDIVersion.V40) Then + + If CveFactura > 0 And IVA = 0 Then + Row("IVA") = 0 + Row("IVAPorcentaje") = 0 + Else + Row("IVA") = Math.Round(IVA, DecimalesPermitidos) + Row("IVAPorcentaje") = PorcentajeIVA + End If + + Row("RetIVA") = Math.Round(RetIVA, DecimalesPermitidos) + Row("RetIVAPorcentaje") = PorcentajeRetIVA + Row("RetISR") = Math.Round(RetISR, DecimalesPermitidos) + Row("RetISRPorcentaje") = PorcentajeRetISR + Row("IEPSPS") = Math.Round(IEPSPS, DecimalesPermitidos) + Row("IEPSPSPorcentaje") = PorcentajeIEPS + Else + 'If DdlIVA.SelectedValue.ToDouble = 0 Then Row("IVA") = 0 Else Row("IVA") = Math.Round(IVA * Total, DecimalesPermitidos) + + If CveFactura > 0 And IVA = 0 Then + Row("IVA") = 0 + Row("IVAPorcentaje") = 0 + Else + Row("IVA") = (IVA * Total).RoundSQL + Row("IVAPorcentaje") = IVA + End If + + Row("RetIVA") = (RetIVA * Total).RoundSQL + Row("RetIVAPorcentaje") = RetIVA + Row("RetISR") = (RetISR * Total).RoundSQL + Row("RetISRPorcentaje") = RetISR + Row("IEPSPS") = (IEPSPS * Total).RoundSQL + Row("IEPSPSPorcentaje") = IEPSPS + End If + + Row("ImporteConImpuestos") = (Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal) + Row("IVA").ToString.ToDecimal + Row("IEPSPS").ToString.ToDecimal - (Row("RetIVA").ToString.ToDecimal + Row("RetISR").ToString.ToDecimal) + Row("ImporteSinImpuestos") = Row("Cantidad").ToString.ToDecimal * Row("PU").ToString.ToDecimal + + Row("IEPSPSIVA") = Math.Round(IEPSPSIVA * Total, DecimalesPermitidos) + Row("IEPSPSIVAPorcentaje") = IEPSPSIVA + Row("Descuento") = Math.Round(Descuento, DecimalesPermitidos) + Row("OtrosGastos") = Math.Round(OtrosGastos, DecimalesPermitidos) + Row("Total") = Math.Round(Total, DecimalesPermitidos) + + Row("CveTipoGasto") = CveTipoGasto + Row("TipoGasto") = If(CveTipoGasto > 0, TipoGasto, "") + + Row("CveContratoDetalle") = CveContratoDetalle + + Row("CveCultivoCuadroDetalle") = CveCultivoCuadroDetalle + Row("TemporadaCuadro") = TemporadaCuadro + + If UsuarioActual.Empresa.UsaAC Then + Row("CveProgramaOperativo") = CveProgramaOperativo + Row("CveUnidadAdministrativa") = CveUnidadAdministrativa + Row("CveFuenteFinanciamiento") = CveFuenteFinanciamiento + Row("CveTipoGastoAC") = CveTipoGastoAC + Row("CveClasificacionOG") = CveClasificacionOG + End If + 'Esta parte es para validar cuando la factura tenga ieps en o se asignara el ieps como una partida ya no se considere + If (CveFactura > 0 Or CveCompra > 0) And IEPS = 0 Then + Row("IEPSPS") = 0 + Row("IEPSPSPorcentaje") = 0 + End If + TmpDT.Rows.Add(Row) + TmpDT.Rows.IndexOf(Row) + + If TCalculaTotales Then + CalculaTotales(True) + End If + + Return Retorno + End Function + + Private Sub CalculaTotales(Optional CalculaIVA As Boolean = False, Optional EsNoDeducible As Boolean = False) + 'VARIABLES DE CALCULO + Dim LocalSubTotal, LocalDescuentos, LocalAmortizacion, LocalIVA, LocalSubTotal2, LocalRetIVA, LocalRetISR, LocalIEPSPS, LocalTotal, LocalSubTotalIVA, LocalSubTotalIEPSIVA As Decimal + + 'HACEMOS CALCULOS + LocalSubTotalIVA = TmpDT.SUMD("IVA") + LocalSubTotalIEPSIVA = TmpDT.SUMD("IEPSPSIVA") + LocalSubTotal = (TmpDT.SUMD("Total") + TmpDT.SUMD("Descuento")).RoundSQL(8) + LocalRetIVA = TmpDT.SUMD("RetIVA") + LocalRetISR = TmpDT.SUMD("RetISR") + LocalIEPSPS = TmpDT.SUMD("IEPSPS") + + If CveCompra > 0 AndAlso CveFactura > 0 Then + LocalIVA = IVA + Else + LocalIVA = If(TmpDT.SUM("IVA") > 0, LocalSubTotalIVA + LocalSubTotalIEPSIVA, 0) + End If + + LocalDescuentos = TmpDT.SUMD("Descuento") + + If Not CveCompra > 0 Then + LocalAmortizacion = Me.Amortizacion + End If + + 'RETENCIONES + Dim Retenciones As Decimal = 0 + Retenciones = LocalRetIVA + Retenciones += LocalRetISR + + + LocalSubTotal2 = LocalSubTotal - LocalDescuentos + LocalTotal = LocalSubTotal2 + LocalIVA + LocalIEPSPS - Retenciones + + 'ASIGNAMOS VALORES A VISTA + If CveCompra > 0 Or CveFactura > 0 Or Me.OCVinculada Then + SubTotal = LocalSubTotal + SubTotal2 = LocalSubTotal2 + Descuento = LocalDescuentos + + If EsNoDeducible Then + IVA = LocalIVA + RetIVA = LocalRetIVA + RetISR = LocalRetISR + IEPS = LocalIEPSPS + End If + + Total = LocalTotal + Else + SubTotal = LocalSubTotal + SubTotal2 = LocalSubTotal2 + IVA = LocalIVA + Descuento = LocalDescuentos + RetIVA = LocalRetIVA + RetISR = LocalRetISR + IEPS = LocalIEPSPS + Total = LocalTotal + 'VALORES PROPIEDAD + CompraSaldo = LocalTotal + + End If + Me.NumNoDed = TmpDT.COUNT("CvePS", "NoDeducible = True ") + + End Sub + + Private Function UpdatePSReembolso(Index As Integer, CvePS As Integer) As Boolean + + Dim Respuesta As Boolean = True + + Dim DrPS As DataRow = Nothing + Try + DrPS = TmpDT.Select($"Consec = {Index}")(0) + If DrPS Is Nothing Then + Errores.AppendLine($"No se encontrol el producto con index {Index}") + Return False + End If + Catch ex As Exception + Errores.AppendLine($"No se encontrol el producto con index {Index}") + Return False + End Try + + 'DATOS GENERALES + DrPS("Obs") = "" + DrPS("Proyecto") = Proyecto + DrPS("CveProyecto") = CveProyecto + DrPS("SubProyecto") = SubProyecto + DrPS("CveSubProyecto") = CveSubProyecto + DrPS("CveContratoDetalle") = -1 + + 'IMPORTES - [CANTIDAD Y PRECIO] + Dim Cantidad As Double = DrPS("Cantidad").ToString.ToDouble + Dim PU As Double = DrPS("PU").ToString.ToDouble + Dim Descuento As Double = DrPS("Descuento").ToString.ToDouble + Dim Total As Double = (Cantidad * PU) - Descuento + DrPS("NoDeducible") = NoDeducible + + Dim PSRow As DataRow = GlobalDTPS(UsuarioActual.CveEmpresa, CvePS:=CvePS).FiltroPrimero("") + If PSRow IsNot Nothing Then + Dim CveTipoPS As Integer = PSRow("CveTipoPS").ToString.ToEntero + If PSRow("CvePSCargo").ToString <> "" Then 'si es un producto de usado. que se registre contablemente como alamcen(como producto) + CveTipoPS = 2 + End If + + DrPS("CveClasificacion") = PSRow("CveClasificacion").ToString + DrPS("Clasificacion") = PSRow("Clasificacion").ToString + DrPS("CvePS") = CvePS + DrPS("PS") = PSRow("PS").ToString + DrPS("CveTipoPS") = CveTipoPS + DrPS("CveSATPS") = PSRow("CveSATPS").ToString.ToEntero + DrPS("SATClaveProductoServicio") = PSRow("SATClaveProductoServicio").ToString + DrPS("CveSATPSActualizado") = 0 + + DrPS("CveUM") = PSRow("CveUnidadMedida").ToString.ToEntero + DrPS("UM") = PSRow("UnidadMedida").ToString + + Dim DrTipoGasto As DataRow = Me.DTTiposGastos.FiltroPrimero("") + + DrPS("CveTipoGasto") = DrTipoGasto("CveTipoGasto") + DrPS("TipoGasto") = DrTipoGasto("TipoGasto") + + If UsuarioActual.Empresa.Funcionalidad(562).ToEntero > 0 Then + DrPS("AplicaCostoIndirecto") = "0" + End If + + DrPS("CveCultivoCuadroDetalle") = -1 + DrPS("TemporadaCuadro") = "" + + Else + Errores.AppendLine($"No se encontrol el producto con CvePS {CvePS}") + Respuesta = False + End If + TmpDT.AcceptChanges() + Return Respuesta + End Function + + Private Sub ValidacionesTotalesXml() + + If Not TmpDT.Columns.Contains("Amortizacion") Then + TmpDT.Columns.Add("Amortizacion", GetType(Decimal)) + End If + + Dim Msg As String = "" + Dim SubtotalTemp As Decimal = TmpDT.SUMD("Total") + Math.Round(TmpDT.SUM("Descuento") + Math.Round(TmpDT.SUM("Amortizacion")), 2) + Dim DescuentosTemp As Decimal = TmpDT.SUMD("Descuento") + Dim Subtotal2Temp As Decimal = TmpDT.SUMD("Total") + Dim IVATemp As Decimal = TmpDT.SUMD("IVA") + Dim IEPSTemp As Decimal = TmpDT.SUMD("IEPSPS") + Dim RetIVATemp As Decimal = TmpDT.SUMD("RetIVA") + Dim RetISRTemp As Decimal = TmpDT.SUMD("RetISR") + Dim TotalTemp As Decimal = Subtotal2Temp - RetIVATemp - RetISRTemp + Math.Round(IVATemp, 6) + IEPSTemp + OtrosImpuestos - OtrosImpuestosRetenciones + + If Math.Abs(Math.Round(DescuentosTemp, 6) - Math.Round(Descuento, 6)) > 0.01 Then + Msg &= String.Format("- Los descuentos del detalle no coinciden con el descuento general
") + End If + + If Math.Abs(Math.Round(IVATemp, 6) - Math.Round(TrasladoIVA, 6)) > 0.01 Then + Msg &= String.Format("- Los IVAS del detalle no coinciden con el IVA general
") + End If + + If Math.Abs(Math.Round(IEPSTemp, 6) - Math.Round(TrasladoIEPS, 6)) > 0.01 Then + Msg &= String.Format("- Los IEPS del detalle no coinciden con el IEPS general
") + End If + + If Math.Abs(Math.Round(RetIVATemp, 6) - Math.Round(RetencionIVA, 6)) > 0.01 Then + Msg &= String.Format("- Los RetIVA del detalle no coinciden con el RetIVA general
") + End If + + If Math.Abs(Math.Round(RetISRTemp, 6) - Math.Round(RetencionISR, 6)) > 0.01 Then + Msg &= String.Format("- Las RetISR del detalle no coinciden con el RetIVA general
") + End If + + If Math.Abs(Math.Round(TotalTemp, 2) - Math.Round(Total, 2)) > 0.01 Then + Msg &= String.Format("- El total generado por los detalles no coincide con el total general
({0}-{1})", Math.Round(TotalTemp, 2), Math.Round(Total, 2)) + End If + + If Msg <> "" Then + Errores.AppendLine($" El comprobante XML presenta las siguientes inconsistencias:{Msg}. ") + Else + + DescuentosTemp = Descuento + IVATemp = TrasladoIVA + TotalTemp = Total + RetIVATemp = RetencionIVA + RetISRTemp = RetencionISR + IEPSTemp = TrasladoIEPS + End If + + Me.SubTotal = SubtotalTemp + Me.Descuento = DescuentosTemp + Me.SubTotal2 = Subtotal2Temp + Me.IVA = IVATemp + Me.Total = TotalTemp + Me.RetIVA = RetIVATemp + Me.RetISR = RetISRTemp + Me.IEPS = IEPSTemp + CompraSaldo = TotalTemp + + AsignaValoresOriginales(SubtotalTemp, Subtotal2Temp, IVATemp, RetIVATemp, RetISRTemp, Total) + + End Sub + + Private Sub AsignaValoresOriginales(SubTotal As Decimal, SubTotal2 As Double, IVA As Decimal, RetIVA As Decimal, RetISR As Decimal, Total As Decimal) + SubTotalOriginal = SubTotal + SubTotal2Original = SubTotal2 + IVAOriginal = IVA + RetIVAOriginal = RetIVA + RetISROriginal = RetISR + TotalOriginal = Total + End Sub + + Private Sub AjustaImporteUltimoConcepto(ImporteAjuste As Decimal, Optional EsCarga As Boolean = False) + + If ImporteAjuste = 0 Then Exit Sub + + Dim Amortizacion As Decimal = 0 + + If TmpDT.Rows.Count > 0 Then ' si hay movimientos y si esta afectando al total, que se haga el ajuste + Dim Indice As Integer = If(TmpDT.Rows(TmpDT.Rows.Count - 1)("CvePS").ToString = UsuarioActual.Empresa.Funcionalidad(112).ToString, TmpDT.Rows.Count - 2, TmpDT.Rows.Count - 1) + Dim tPU As Decimal + + If TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal > 0 Then + tPU = ImporteAjuste / TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal + Else + tPU = 0 + End If + + If TmpDT.Rows(Indice)("PU").ToString.ToDecimal + tPU < 0 Then 'si es negativo, que tome el dato anterior + Indice = Indice - 1 + If TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal > 0 Then + tPU = ImporteAjuste / TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal + Else + tPU = 0 + End If + End If + + TmpDT.Rows(Indice)("PU") = TmpDT.Rows(Indice)("PU").ToString.ToDecimal + tPU + TmpDT.Rows(Indice)("Total") = TmpDT.Rows(Indice)("Total").ToString.ToDecimal + ImporteAjuste + TmpDT.Rows(Indice)("IEPSPS") = (TmpDT.Rows(Indice)("Total").ToString.ToDecimal() * TmpDT.Rows(Indice)("IEPSPSPorcentaje").ToString.ToDecimal()).RoundAD(2) + TmpDT.Rows(Indice)("IVA") = (TmpDT.Rows(Indice)("PU").ToString.ToDecimal * TmpDT.Rows(Indice)("Cantidad").ToString.ToDecimal - TmpDT.Rows(Indice)("Descuento").ToString.ToDecimal) * TmpDT.Rows(Indice)("IVAPorcentaje").ToString.ToDecimal + TmpDT.AcceptChanges() + End If + + SubTotal = TmpDT.SUMD("Total") + If Not EsCarga Then + Descuento = TmpDT.SUMD("Descuento") + End If + + SubTotalConceptos = SubTotal + + End Sub + + Public Function ValidateUUID(ByVal uuid As String) As Boolean + Dim pattern As String = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" + Dim regex As New Regex(pattern) + Return regex.IsMatch(uuid) + End Function + Private Function GeneraStringDoctosRelacionados() As String + + Dim DoctosRelacionados As String = "-1" + Dim listaUUIDSRelacionados As New List(Of String) + + If DocumentosRelacionadosUUIDSList.Count > 0 Then + For Each s As String In DocumentosRelacionadosUUIDSList + If s.Trim.Length > 0 Then + listaUUIDSRelacionados.Add(s.Trim) + End If + Next + End If + + If listaUUIDSRelacionados.Count > 0 Then + DoctosRelacionados = String.Join(",", listaUUIDSRelacionados.ToArray()) + End If + + Return DoctosRelacionados + End Function + Private Function ValorXML(n As XmlNode, Campo As String, Optional Retorno As String = "") As String + Dim o As XmlNode = n.Attributes.Cast(Of XmlAttribute)().SingleOrDefault(Function(a) String.Compare(a.Name, Campo, True) = 0) + If o Is Nothing Then + Return Retorno + Else + Return o.Value + End If + End Function + + Public Function AddCompra() As Boolean + + If Not AjustesValidacion() Then Return False + + Dim respuesta As Boolean = True + Dim ObjCompras As New ClsCompras + Dim ObjConta As New ClsContabilidad(ObjCompras.IniciaTransacSQL()) + + If Not AddPrepolizaCabecera(ObjConta) Then + respuesta = False + End If + + If respuesta AndAlso ObjCompras.AddCompra(If(Me.TipoComprobante = "I", "Fac", "NC"), Me.Descripcion, Me.Serie, Me.Folio, Me.FolioSecundario, Me.CveProveedor, Me.SubTotal, Me.Descuento, + Me.Amortizacion, Me.IVA, Me.RetIVA, Me.RetISR, Me.IEPS, Me.OtrosImpuestos, + Me.Redondeo, Me.Total, Me.Fecha, Me.CveMoneda, Me.TipoCambio, If(Me.FechaPago = Nothing, Me.Fecha, Me.FechaPago), Me.AplicaNotaCredito, Me.Observaciones, Me.CveEstatusFactura, + Me.CvePrePoliza, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, Me.IdPoliza, CveCajaChica:=Me.CveCajaChica, CvePersonal:=Me.CvePersonal, NumeroReembolso:=Me.NumeroReembolso, CveProveedorSucursal:=Me.CveProveedorSucursal, + AplicoPromocion:=Me.AplicoPromocion, PorcentajeIVA:=Me.PorcentajeIVA, CveMetodoPago:=Me.CveMetodoPago, CveRetIVAConcepto:=Me.CveRetIVAConcepto, + CveConceptoContableAlmacen:=Me.CveConceptoContableAlmacen, + CveRetISRConcepto:=Me.CveRetISRConcepto, NoDeducible:=Me.NoDeducible, CveTipoCompra:=Me.CveTipoCompra, TotalOriginal:=Me.TotalOriginal, CveTipoConcepto:=Me.CveTipoConcepto, + EsImportacion:=Me.EsImportacion, CveFactura:=Me.CveFactura, CveSubProyecto:=Me.CveSubProyectoPrincipal, DoctosRelacionados:=Me.DocumentosRelacionadosUUIDSString, CveFolioGarantia:=Me.CveFolioGarantia) Then + Me.CveCompra = ObjCompras.CveCompra + Else + respuesta = False + End If + + If respuesta AndAlso Me.CveCompra > 0 Then + + For Each Row As DataRow In Me.TmpDT.Rows + + Dim TipoRecepcion As Integer = -1 + Dim Referencia As String = "" + Dim EsNoDeducible As Boolean = False + Dim CveAF As Integer = If(Row("CveActivoFijo").ToString.ToEntero > 0 AndAlso Row("TipoAF").ToString.ToEntero = 1, Row("CveActivoFijo").ToString.ToEntero, -1) + Dim CveAFC As Integer = If(Row("CveActivoFijo").ToString.ToEntero > 0 AndAlso Row("TipoAF").ToString.ToEntero = 2, Row("CveActivoFijo").ToString.ToEntero, -1) + + If Not ObjCompras.AddCompraDetalle(Me.CveCompra, Row("CveUM").ToString.ToEntero, Row("CvePS").ToString.ToEntero, Row("CveSubProyecto").ToString.ToEntero, -1, CveAF, + Row("Cantidad").ToString.ToDecimal, Row("PU").ToString.ToDecimal, Row("IVA").ToString.ToDecimal, Row("Total").ToString.ToDecimal, Row("Descuento").ToString.ToDecimal, + Row("Obs").ToString, Row("CveOrdenCompraDetalle").ToString.ToEntero, TipoRecepcion, Row("CveContrato").ToString.ToEntero, Row("CvePresupuestoEgreso").ToString.ToEntero, + AplicaCostoIndirecto:=Row("AplicaCostoIndirecto").ToString.ToEntero, EstatusAlmacen:=Row("EntregaDirecta").ToString.ToEntero, CvePersonal:=CvePersonal, + CveTipoGasto:=Row("CveTipoGasto").ToString.ToEntero, AF_Medida:=Row("AFMedida").ToString.ToEntero, AF_TipoMantenimiento:=Row("AFTipoMantenimiento").ToString.ToEntero, Referencia:=Referencia, OtrosGastos:=Row("OtrosGastos").ToString.ToDecimal, + RetIVA:=Row("RetIVA").ToString.ToDecimal, RetISR:=Row("RetISR").ToString.ToDecimal, IEPSPS:=Row("IEPSPS").ToString.ToDecimal.RoundSQL, IEPSPSIVA:=Row("IEPSPSIVA").ToString.ToDecimal, + IVAPorcentaje:=Row("IVAPorcentaje").ToString.ToDecimal, RetIVAPorcentaje:=Row("RetIVAPorcentaje").ToString.ToDecimal, RetISRPorcentaje:=Row("RetISRPorcentaje").ToString.ToDecimal, + IEPSPSPorcentaje:=Row("IEPSPSPorcentaje").ToString.ToDecimal, IEPSPSIVAPorcentaje:=Row("IEPSPSIVAPorcentaje").ToString.ToDecimal, NoDeducible:=If((Row("NoDeducible").ToString().ToUpper().Contiene("TRUE", "1")) AndAlso EsNoDeducible, True, False), + CveContratoDetalle:=Row("CveContratoDetalle").ToString.ToEntero, CveCultivoCuadroDetalle:=Row("CveCultivoCuadroDetalle").ToString.ToEntero, CveActivoFijoCompra:=CveAFC) Then + + respuesta = False + Exit For + End If + Next + End If + + If respuesta Then + If Not AddPrePolizaDetalles(ObjConta) Then respuesta = False + End If + + If respuesta AndAlso ObjConta.ValidacionesPrePoliza(CvePrePoliza, UsuarioActual, 4) Then + If ObjConta.ValorPolizaDescuadre > 0 Then + Errores.AppendLine($"eFacturas/Compras-Guardar | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}.") + GuardaLogAD($"eFacturas/Compras-Guardar | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") + respuesta = False + End If + End If + + If respuesta Then + If Not ObjCompras.UpdateCompraFactura(Me.CveCompra, Me.CveFactura, Me.Serie, Me.Folio) Then respuesta = False + End If + + If respuesta Then + ObjCompras.Commit() + Else + ObjCompras.RollBack() + End If + + ObjCompras.Dispose() + ObjConta.Dispose() + + Return respuesta + End Function + + + Public Function AddCompraRNC(ByRef transacccion As SqlTransaction) As Boolean + + If Not AjustesValidacion() Then Return False + + Dim respuesta As Boolean = True + Dim ObjCompras As New ClsCompras + Dim ObjConta As New ClsContabilidad(transacccion) + + If Not AddPrepolizaCabecera(ObjConta) Then + respuesta = False + End If + + If respuesta AndAlso ObjCompras.AddCompra("RNC", Me.Descripcion, Me.Serie, Me.Folio, Me.FolioSecundario, Me.CveProveedor, Me.SubTotal, Me.Descuento, + Me.Amortizacion, Me.IVA, Me.RetIVA, Me.RetISR, Me.IEPS, Me.OtrosImpuestos, + Me.Redondeo, Me.Total, Me.Fecha, Me.CveMoneda, Me.TipoCambio, If(Me.FechaPago = Nothing, Me.Fecha, Me.FechaPago), Me.AplicaNotaCredito, Me.Observaciones, Me.CveEstatusFactura, + Me.CvePrePoliza, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, Me.IdPoliza, CveCajaChica:=Me.CveCajaChica, CvePersonal:=Me.CvePersonal, NumeroReembolso:=Me.NumeroReembolso, CveProveedorSucursal:=Me.CveProveedorSucursal, + AplicoPromocion:=Me.AplicoPromocion, PorcentajeIVA:=Me.PorcentajeIVA, CveMetodoPago:=Me.CveMetodoPago, CveRetIVAConcepto:=Me.CveRetIVAConcepto, + CveConceptoContableAlmacen:=Me.CveConceptoContableAlmacen, + CveRetISRConcepto:=Me.CveRetISRConcepto, NoDeducible:=Me.NoDeducible, CveTipoCompra:=Me.CveTipoCompra, TotalOriginal:=Me.TotalOriginal, CveTipoConcepto:=Me.CveTipoConcepto, + EsImportacion:=Me.EsImportacion, CveFactura:=Me.CveFactura, CveSubProyecto:=Me.CveSubProyectoPrincipal, DoctosRelacionados:=Me.DocumentosRelacionadosUUIDSString, CveFolioGarantia:=Me.CveFolioGarantia) Then + Me.CveCompra = ObjCompras.CveCompra + Else + respuesta = False + End If + + If respuesta AndAlso Me.CveCompra > 0 Then + + For Each Row As DataRow In Me.TmpDT.Rows + + Dim TipoRecepcion As Integer = -1 + Dim Referencia As String = "" + Dim EsNoDeducible As Boolean = False + Dim CveAF As Integer = If(Row("CveActivoFijo").ToString.ToEntero > 0 AndAlso Row("TipoAF").ToString.ToEntero = 1, Row("CveActivoFijo").ToString.ToEntero, -1) + Dim CveAFC As Integer = If(Row("CveActivoFijo").ToString.ToEntero > 0 AndAlso Row("TipoAF").ToString.ToEntero = 2, Row("CveActivoFijo").ToString.ToEntero, -1) + + If Not ObjCompras.AddCompraDetalle(Me.CveCompra, Row("CveUM").ToString.ToEntero, Row("CvePS").ToString.ToEntero, Row("CveSubProyecto").ToString.ToEntero, -1, CveAF, + Row("Cantidad").ToString.ToDecimal, Row("PU").ToString.ToDecimal, Row("IVA").ToString.ToDecimal, Row("Total").ToString.ToDecimal, Row("Descuento").ToString.ToDecimal, + Row("Obs").ToString, Row("CveOrdenCompraDetalle").ToString.ToEntero, TipoRecepcion, Row("CveContrato").ToString.ToEntero, Row("CvePresupuestoEgreso").ToString.ToEntero, + AplicaCostoIndirecto:=Row("AplicaCostoIndirecto").ToString.ToEntero, EstatusAlmacen:=Row("EntregaDirecta").ToString.ToEntero, CvePersonal:=CvePersonal, + CveTipoGasto:=Row("CveTipoGasto").ToString.ToEntero, AF_Medida:=Row("AFMedida").ToString.ToEntero, AF_TipoMantenimiento:=Row("AFTipoMantenimiento").ToString.ToEntero, Referencia:=Referencia, OtrosGastos:=Row("OtrosGastos").ToString.ToDecimal, + RetIVA:=Row("RetIVA").ToString.ToDecimal, RetISR:=Row("RetISR").ToString.ToDecimal, IEPSPS:=Row("IEPSPS").ToString.ToDecimal.RoundSQL, IEPSPSIVA:=Row("IEPSPSIVA").ToString.ToDecimal, + IVAPorcentaje:=Row("IVAPorcentaje").ToString.ToDecimal, RetIVAPorcentaje:=Row("RetIVAPorcentaje").ToString.ToDecimal, RetISRPorcentaje:=Row("RetISRPorcentaje").ToString.ToDecimal, + IEPSPSPorcentaje:=Row("IEPSPSPorcentaje").ToString.ToDecimal, IEPSPSIVAPorcentaje:=Row("IEPSPSIVAPorcentaje").ToString.ToDecimal, NoDeducible:=If((Row("NoDeducible").ToString().ToUpper().Contiene("TRUE", "1")) AndAlso EsNoDeducible, True, False), + CveContratoDetalle:=Row("CveContratoDetalle").ToString.ToEntero, CveCultivoCuadroDetalle:=Row("CveCultivoCuadroDetalle").ToString.ToEntero, CveActivoFijoCompra:=CveAFC) Then + + respuesta = False + Exit For + End If + Next + End If + + If respuesta Then + If Not AddPrePolizaDetalles(ObjConta, True) Then respuesta = False + End If + + If respuesta AndAlso ObjConta.ValidacionesPrePoliza(CvePrePoliza, UsuarioActual, 4) Then + If ObjConta.ValorPolizaDescuadre > 0 Then + Errores.AppendLine($"Compras/RNC | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}.") + GuardaLogAD($"Compras/RNC | Error{ObjConta.MensajePolizaDescuadre} Diferencia{ObjConta.ValorDiferencia} | CvePrePoliza:{CvePrePoliza}", "LogPrePolizas") + respuesta = False + End If + End If + + 'If respuesta Then + ' If Not ObjCompras.UpdateCompraFactura(Me.CveCompra, Me.CveFactura, Me.Serie, Me.Folio) Then respuesta = False + 'End If + + 'If respuesta Then + ' ObjCompras.Commit() + 'Else + ' ObjCompras.RollBack() + 'End If + + 'ObjCompras.Dispose() + 'ObjConta.Dispose() + + Return respuesta + End Function + + + Private Function AddPrepolizaCabecera(ByRef ObjConta As ClsContabilidad, Optional ES_RNC As Boolean = False) As Boolean + + Dim respuesta As Boolean = False + + Dim ConceptoPoliza As String = String.Format("{0} - {1} - {2}", NombreProveedor, SerieFolio, "") + Dim Modulo As String = "eFacturas/Registrar" + + If ES_RNC Then + ConceptoPoliza = String.Format("{0} - {1} - {2}", NombreProveedor, SerieFolio, "") + Modulo = "Compras/RNC" + End If + + Me.CvePrePoliza = ObjConta.AddPrePolizas(Modulo, 1, Me.Total, Me.Total, Me.CveMoneda, Me.Fecha, ConceptoPoliza, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, 0, "", CveTipoPoliza:=Me.CveTipoPoliza) + respuesta = If(Me.CvePrePoliza > 0, True, False) + + Return respuesta + End Function + + Private Function AddPrePolizaDetalles(ByRef ObjConta As ClsContabilidad, Optional ES_RNC As Boolean = False) As Boolean + Dim respuesta As Boolean = True + Dim Concepto As String = $"{Me.NombreProveedor} {Me.SerieFolio}" + Dim Referencia As String = Me.SerieFolio + + If ES_RNC Then + + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, Me.Total, Me.Total, 370, Referencia, Concepto, CveCompra:=CveCompra, CveProveedor:=Me.CveProveedor, ImporteME:=If(TipoCambio = 1, 0, Me.Total), TipoCambio:=TipoCambio, + CveClasificacion:=-1, CveSubProyecto:=Me.CveSubProyecto, Contabilizable:=False) Then + respuesta = False + + End If + + If respuesta Then + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, Me.Total, Me.Total, 371, Referencia, Concepto, CveCompra:=CveCompra, CveProveedor:=Me.CveProveedor, ImporteME:=If(TipoCambio = 1, 0, Me.Total), TipoCambio:=TipoCambio, + CveClasificacion:=-1, CveSubProyecto:=Me.CveSubProyecto, Contabilizable:=False) Then + respuesta = False + + End If + End If + + Else + + Dim importeMovimiento As Decimal + Dim importeMN As Decimal + + + '6 + For Each RowDetalle As DataRow In TmpDT.FiltraParametros("ISNULL(TipoAF,0) <> 2", "", {"CveClasificacion", "CveSubProyecto"}).Rows + + importeMovimiento = TmpDT.SUMD("Total", $" CveClasificacion = {RowDetalle("CveClasificacion").ToString} AND CveSubProyecto = {RowDetalle("CveSubProyecto").ToString}") + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + + If importeMN <> 0 Then + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, importeMovimiento, importeMN, 6, Referencia, Concepto, CveCompra:=CveCompra, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=Me.CveCreditoDetalle, ImporteME:=If(TipoCambio = 1, 0, importeMovimiento), TipoCambio:=TipoCambio, + CveClasificacion:=RowDetalle("CveClasificacion").ToString().ToEntero(), CveSubProyecto:=RowDetalle("CveSubProyecto").ToString().ToEntero(), Contabilizable:=True) Then + respuesta = False + Exit For + End If + End If + Next + '14 + If respuesta AndAlso Me.IVA > 0 Then + importeMovimiento = Me.IVA + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, False, importeMovimiento, importeMN, 14, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=Me.PorcentajeIVA, Contabilizable:=True) Then + respuesta = False + End If + End If + '25 + If respuesta AndAlso Me.IEPS > 0 Then + importeMovimiento = Me.IEPS + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, 25, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + End If + ' + If respuesta AndAlso Me.RetIVA > 0 Then + importeMovimiento = Me.RetIVA + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + Dim ret As ConceptosRetenciones = ConceptoPrePolizaRetIVA + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, ret.CveConceptoxAcreditar, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + End If + ' + If respuesta AndAlso Me.RetISR > 0 Then + importeMovimiento = Me.RetISR + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + Dim ret As ConceptosRetenciones = ConceptoPrePolizaRetISR + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, ret.CveConceptoxAcreditar, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + End If + '5 + If respuesta Then + importeMovimiento = Me.Total + importeMN = (importeMovimiento * Me.TipoCambio).RoundSQL + Dim ConPreP As ConceptosTipoSaldo = ObtenerCveConceptoPrePoliza(1, Me.CveMoneda, False, Me.CveTipoConceptoProveedor) + Dim ImporteME As Decimal = importeMovimiento + Dim UsaComplementaria As Boolean = True + If Me.CveMoneda > 1 Then ImporteME = importeMovimiento + + If UsuarioActual.CveEmpresa.Contiene(13, 83) Then 'caso excepcional de complementarias + UsaComplementaria = False + importeMN = importeMovimiento * Me.TipoCambio + Else + importeMN = importeMovimiento + End If + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, importeMN, ConPreP.CveConcepto, Referencia, Concepto, CveCompra:=CveCompra, CveSubProyecto:=Me.CveSubProyectoPrincipal, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=CvePersonal, CveCreditoDetalle:=CveCreditoDetalle, ImporteME:=If(Me.TipoCambio = 1, 0, importeMovimiento), TipoCambio:=Me.TipoCambio, PorcentajeImpuesto:=0, Contabilizable:=True) Then + respuesta = False + End If + If respuesta AndAlso Me.CveMoneda > 1 AndAlso UsaComplementaria Then + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, True, importeMovimiento, (importeMovimiento * Me.TipoCambio - importeMovimiento).RoundSQL, ConPreP.CveConceptoComplementario, Referencia, Concepto, CveCompra:=Me.CveCompra, CveProveedor:=Me.CveProveedor, CveIE:=Me.CveIE, CvePersonal:=Me.CvePersonal, CveCompraAmortizacion:=Me.CveCompraAmortizacion, TipoCambio:=Me.TipoCambio, TipoCambioPago:=1, ImporteME:=ImporteME, CveSubProyecto:=Me.CveSubProyecto) Then + respuesta = False + End If + End If + End If + End If + + Return respuesta + + End Function + +End Class \ No newline at end of file diff --git a/Compras/eFacturas.aspx.vb b/Compras/eFacturas.aspx.vb index 9563c4d45..8497a219a 100644 --- a/Compras/eFacturas.aspx.vb +++ b/Compras/eFacturas.aspx.vb @@ -5205,13 +5205,13 @@ Partial Class Compras_eFacturas Exit For End If - Dim CompraActual As New Compra2(CFDIXmlPath, Compra2.EnumCargaCompra.DesdeArchivo, GlobalDTTiposGastos(UsuarioActual.CveEmpresa), UsuarioActual) + Dim CompraActual As New ClsCompraManager(CFDIXmlPath, ClsCompraManager.EnumCargaCompra.DesdeArchivo, GlobalDTTiposGastos(UsuarioActual.CveEmpresa), UsuarioActual) CompraActual.CveFactura = GvRow.DataKey("CveFactura").ToEntero CompraActual.CveProveedor = GvRow.DataKey("CveProveedor").ToEntero CompraActual.CveTipoProveedor = GvRow.DataKey("CveTipoProveedor").ToEntero CompraActual.CveTipoConceptoProveedor = GvRow.DataKey("CveTipoProveedor").ToEntero - CompraActual.TipoCompra = Compra2.EnumTipoCompra.Sin_definir + CompraActual.TipoCompra = ClsCompraManager.EnumTipoCompra.Sin_definir CompraActual.IEPSGasto = True CompraActual.Descripcion = TxtDescripcionCompra.Text.Trim CompraActual.NombreProveedor = GvRow.DataKey("NombreProveedor") @@ -5250,7 +5250,9 @@ Partial Class Compras_eFacturas End Class -Public Class Compra2 + + +Public Class ClsCompraManager Enum EnumCargaCompra DesdeXML @@ -6941,7 +6943,7 @@ Public Class Compra2 End If If respuesta Then - If Not AddPrepolizaDetalles(ObjConta) Then respuesta = False + If Not AddPrePolizaDetalles(ObjConta) Then respuesta = False End If If respuesta AndAlso ObjConta.ValidacionesPrePoliza(CvePrePoliza, UsuarioActual, 4) Then @@ -7064,7 +7066,6 @@ End Class - Public Class GeneralesAPIeFacturas Inherits ADSNetLibraryzdE.HelpersE.ConexionesE.SIGAPIE.BaseSIGAPIeFacturas