diff --git a/App_Code/ClsCompras.vb b/App_Code/ClsCompras.vb index c5682ee52..83ca8fdb9 100644 --- a/App_Code/ClsCompras.vb +++ b/App_Code/ClsCompras.vb @@ -3540,6 +3540,22 @@ Public Class ClsCompras Return Retorno End Function + Public Function GetVinculacionRNC(UUID As String, CveEmpresa As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Comp_ComprasMedicosRemove") + With SqlAdapter.SelectCommand.Parameters + .Add("@UUID", SqlDbType.VarChar).Value = UUID + .Add("@CveMedico", SqlDbType.Int).Value = CveEmpresa + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al eliminar gasto de médico.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + Return Retorno + End Function + #End Region End Class diff --git a/App_Code/ClsContabilidad.vb b/App_Code/ClsContabilidad.vb index d6f77b7f8..8f709f32e 100644 --- a/App_Code/ClsContabilidad.vb +++ b/App_Code/ClsContabilidad.vb @@ -1278,7 +1278,7 @@ Public Class ClsContabilidad Catch ex As Exception If ex.Message.Contains("50015;") Then OnError("No se puede actualizar una póliza en un ejercicio Cerrado", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) - ElseIf ex.Message.Contains("IDX_UN_ContaPrePolizasCveEmpresaCveTipoPolizaFoliosAnioMes") Then + ElseIf ex.Message.Contains("UK_CveEmpresa_CveTipoPoliza_AnioMes_FolioPoliza") Then OnError($"El Folio {Folio} ya esta registrado.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) Else OnError("Ocurrió un error al contabilizar las prepoliza detalle.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) diff --git a/App_Code/ClsInventarios.vb b/App_Code/ClsInventarios.vb index 4917e8d32..e0e8b665d 100644 --- a/App_Code/ClsInventarios.vb +++ b/App_Code/ClsInventarios.vb @@ -5602,12 +5602,13 @@ Public Class ClsInventarios #End Region #Region "PRESTAMOS DE PROVEEDOR" - Public Function PrestamosdeProveedorGet(CveProveedor As Integer, Folio As Integer, CveEmpresa As Integer) As Boolean + Public Function PrestamosdeProveedorGet(CveProveedor As Integer, Folio As Integer, CveSubProyecto As Integer, CveEmpresa As Integer) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Inv_PrestamosdeProveedorGet") With SqlAdapter.SelectCommand.Parameters .Add("@CveProveedor", SqlDbType.Int).Value = CveProveedor .Add("@Folio", SqlDbType.Int).Value = Folio + .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa End With Try diff --git a/App_Code/ClsOP.vb b/App_Code/ClsOP.vb index 87bcf4845..16b22fa7b 100644 --- a/App_Code/ClsOP.vb +++ b/App_Code/ClsOP.vb @@ -357,6 +357,32 @@ Public Class ClsOP #End Region + +#Region "O R D E N E S D E P R O D U C C I O N" + Public Function GetReportesOP(CveOP As Integer, CveCliente As Integer, CveSubProyecto As Integer, CvePS As Integer, CveEstatus As Integer, Asignado As Integer, FechaInicio As Date, FechaFin As Date, CveEmpresa As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_OP_OrdendeProduccionGet") + With SqlAdapter.SelectCommand.Parameters + .Add("@CveOP", SqlDbType.Int).Value = CveOP + .Add("@CveCliente", SqlDbType.Int).Value = CveCliente + .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto + .Add("@CvePS", SqlDbType.Int).Value = CvePS + .Add("@CveEstatus", SqlDbType.Int).Value = CveEstatus + .Add("@Asignado", SqlDbType.Int).Value = Asignado + .Add("@FechaI", SqlDbType.Date).Value = FechaInicio + .Add("@FechaF", SqlDbType.Date).Value = FechaFin + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al obtener los productos.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo()) + End Try + Return Retorno + End Function + +#End Region #Region "IDisposable Support" ' IDisposable Protected Overridable Sub Dispose(disposing As Boolean) diff --git a/App_Code/ClsPaginas.vb b/App_Code/ClsPaginas.vb index 72e96b468..b9c0c104c 100644 --- a/App_Code/ClsPaginas.vb +++ b/App_Code/ClsPaginas.vb @@ -11124,6 +11124,7 @@ Public Class ClsPaginas #Region "Ordenes de Produccion" PaginaDict.Add("/OP/CatConfiguracionProducto.aspx".ToUpper(), 790) + PaginaDict.Add("/OP/RepOS.aspx".ToUpper(), 791) #End Region 'Antes de aquí. diff --git a/App_Code/ClsVentas.vb b/App_Code/ClsVentas.vb index 6f3d45107..04f886a95 100644 --- a/App_Code/ClsVentas.vb +++ b/App_Code/ClsVentas.vb @@ -4,6 +4,7 @@ Option Strict On Imports System.Data Imports System.Data.SqlClient Imports Extensiones +Imports Profact.TimbraCFDI40 Public Class ClsVentas Implements IDisposable @@ -1826,6 +1827,7 @@ Public Class ClsVentas Try SqlAdapter.Fill(Data) Retorno = True + Retorno = True Catch ex As Exception OnError("Ocurrió un error al obtener los datos del reporte.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) End Try @@ -1856,38 +1858,53 @@ Public Class ClsVentas 'Reporte de Ventas por Período + 'Public Function GetRepVentasPeriodos(FechaI As Date, FechaF As Date, FechaIEjec As Date, FechaFEjec As Date, CveCliente As Integer, CveSubProyectoEjecucion As Integer, + ' CveVendedor As Integer, CveUsuario As Integer, CveEstatus As Integer, IVA As String, CveEmpresa As Integer, Gpo As Integer, Optional TipoDocto As String = "-1", + ' Optional CveProyecto As Integer = -1, Optional CveSubProyecto As Integer = -1, Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveUsuarioConsulta As Integer = -1, Optional VerEn As Integer = -1, + ' Optional CveClienteClasificacion As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False) As Boolean + + Public Function GetRepVentasPeriodos(FechaI As Date, FechaF As Date, FechaIEjec As Date, FechaFEjec As Date, CveCliente As Integer, CveSubProyectoEjecucion As Integer, - CveVendedor As Integer, CveUsuario As Integer, CveEstatus As Integer, IVA As String, CveEmpresa As Integer, Gpo As Integer, Optional TipoDocto As String = "-1", - Optional CveProyecto As Integer = -1, Optional CveSubProyecto As Integer = -1, Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveUsuarioConsulta As Integer = -1, Optional VerEn As Integer = -1, - Optional CveClienteClasificacion As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False) As Boolean + CveVendedor As String, CveUsuario As Integer, CveEstatus As String, IVA As String, CveEmpresa As Integer, Gpo As Integer, Optional TipoDocto As String = "-1", + Optional CveProyecto As Integer = -1, Optional CveSubProyecto As String = "-1", Optional TipoCambio As Integer = 1, Optional TCEspecifico As Decimal = -1, Optional CveUsuarioConsulta As Integer = -1, + Optional CveClienteClasificacion As Integer = -1, Optional CveCondicionesPago As Integer = -1, Optional TipoCliente As Integer = -1, Optional ModalidadContable As Boolean = False, + Optional EsDistribuidor As Integer = -1, Optional CveTipoRelacion As Integer = -1, Optional ServicioDomicilio As Integer = -1, Optional EsFacturaGlobal As Integer = -1, Optional EsFilial As Integer = -1, + Optional VerEn As Integer = -1) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_VentasGetRepPeriodo") With SqlAdapter.SelectCommand.Parameters - '.Add("@CveVenta", SqlDbType.Int).Value = CveVenta + 'PARAMETROS BASE .Add("@FechaI", SqlDbType.Date).Value = FechaI .Add("@FechaF", SqlDbType.Date).Value = FechaF .Add("@FechaIEjec", SqlDbType.Date).Value = FechaIEjec .Add("@FechaFEjec", SqlDbType.Date).Value = FechaFEjec .Add("@CveCliente", SqlDbType.Int).Value = CveCliente .Add("@CveSubProyectoEjecucion", SqlDbType.Int).Value = CveSubProyectoEjecucion - .Add("@CveVendedor", SqlDbType.Int).Value = CveVendedor + .Add("@CveVendedor", SqlDbType.VarChar).Value = CveVendedor .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario - .Add("@CveEstatus", SqlDbType.Int).Value = CveEstatus + .Add("@CveEstatus", SqlDbType.VarChar).Value = CveEstatus .Add("@IVA", SqlDbType.VarChar).Value = IVA .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa .Add("@GPO", SqlDbType.Int).Value = Gpo .Add("@TipoDocto", SqlDbType.VarChar).Value = TipoDocto - .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto + .Add("@CveSubProyecto", SqlDbType.VarChar).Value = CveSubProyecto .Add("@CveProyecto", SqlDbType.Int).Value = CveProyecto .Add("@TipoCambio", SqlDbType.Int).Value = TipoCambio .Add("@TCEspecifico", SqlDbType.Float).Value = TCEspecifico .Add("@CveUsuarioConsulta", SqlDbType.Int).Value = CveUsuarioConsulta - .Add("@VerEn", SqlDbType.Int).Value = VerEn .Add("@CveClienteClasificacion", SqlDbType.Int).Value = CveClienteClasificacion + .Add("@CveCondicionesPago", SqlDbType.Int).Value = CveCondicionesPago .Add("@TipoCliente", SqlDbType.Int).Value = TipoCliente + .Add("@EsDistribuidor", SqlDbType.Int).Value = EsDistribuidor .Add("@ModalidadContable", SqlDbType.Bit).Value = ModalidadContable + .Add("@CveTipoRelacion", SqlDbType.Int).Value = CveTipoRelacion + .Add("@ServicioDomicilio", SqlDbType.Int).Value = ServicioDomicilio + .Add("@EsFacturaGlobal", SqlDbType.Int).Value = EsFacturaGlobal + .Add("@EsFilial", SqlDbType.Int).Value = EsFilial + 'PARAMETROS EXTRA + .Add("@VerEn", SqlDbType.Int).Value = VerEn End With Try @@ -2484,34 +2501,33 @@ Public Class ClsVentas #Region " PROMOCIONES " Public Function GetPromociones(CvePromocion As Integer, Fecha As Date, CveVendedor As Integer, CveCliente As Integer, Estatus As Integer, CveEmpresa As Integer, - CveSubProyecto As Integer, Optional CveMarca As Integer = -1, Optional CveUsuario As Integer = -1, Optional CvePS As Integer = -1) As Boolean + CveSubProyecto As Integer, Optional CveMarca As Integer = -1, Optional CveUsuario As Integer = -1, Optional CvePS As Integer = -1, + Optional FechaI As DateTime = MinFecha, Optional FechaF As DateTime = MaxFecha) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Vta_PromocionesGet") + With SqlAdapter.SelectCommand.Parameters + .Add("@CvePromocion", SqlDbType.Int).Value = CvePromocion + .Add("@Fecha", SqlDbType.Date).Value = Fecha + .Add("@Estatus", SqlDbType.Int).Value = Estatus + .Add("@CveVendedor", SqlDbType.Int).Value = CveVendedor + .Add("@CveCliente", SqlDbType.Int).Value = CveCliente + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto + .Add("@CveMarca", SqlDbType.Int).Value = CveMarca + .Add("@CveUsuarioConsulta", SqlDbType.Int).Value = CveUsuario + .Add("@CvePS", SqlDbType.Int).Value = CvePS + .Add("@FechaI", SqlDbType.DateTime).Value = FechaI + .Add("@FechaF", SqlDbType.DateTime).Value = FechaF + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al obtener las Promociones.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + Return Retorno + End Function - Dim Retorno As Boolean = False - DataAdapter("PA_Vta_PromocionesGet") - - With SqlAdapter.SelectCommand.Parameters - .Add("@CvePromocion", SqlDbType.Int).Value = CvePromocion - .Add("@Fecha", SqlDbType.Date).Value = Fecha - .Add("@Estatus", SqlDbType.Int).Value = Estatus - .Add("@CveVendedor", SqlDbType.Int).Value = CveVendedor - .Add("@CveCliente", SqlDbType.Int).Value = CveCliente - .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa - .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto - .Add("@CveMarca", SqlDbType.Int).Value = CveMarca - .Add("@CveUsuarioConsulta", SqlDbType.Int).Value = CveUsuario - .Add("@CvePS", SqlDbType.Int).Value = CvePS - End With - - Try - SqlAdapter.Fill(Data) - Retorno = True - Catch ex As Exception - OnError("Ocurrió un error al obtener las Promociones.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) - End Try - - Return Retorno - End Function - Public Function AddPromociones(Promocion As String, FechaInicio As Date, FechaFin As Date, CveVendedor As Integer, CveCliente As Integer, Estatus As Boolean, CveMoneda As Integer, CveUsuario As Integer, CveEmpresa As Integer, CveSubProyecto As Integer, TipoAplicacion As String, Optional CveMarca As Integer = -1, Optional EsDistribuidor As Integer = -1, Optional ReqAutorizacion As Boolean = False) As Integer @@ -2613,30 +2629,27 @@ Public Class ClsVentas Return Retorno End Function - - - Public Function UpdatePromocionEstatus(CvePromocion As Integer, Estatus As Boolean, CveUsuario As Integer, CveEmpresa As Integer) As Boolean - Dim Retorno As Boolean = False - DataAdapter("PA_Vta_PromocionEstatusUpdate") - With SqlAdapter.SelectCommand.Parameters - .Add("@CvePromocion", SqlDbType.Float).Value = CvePromocion - .Add("@Estatus", SqlDbType.Bit).Value = Estatus - .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario - .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa - End With - Try - SqlAdapter.Fill(Data) - Retorno = True - Catch ex As Exception - OnError("Ocurrió un error al actualizar el estatus la Promoción.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) - End Try + Public Function UpdatePromocionEstatus(CvePromocion As Integer, Estatus As Boolean, CveUsuario As Integer, CveEmpresa As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Vta_PromocionEstatusUpdate") + With SqlAdapter.SelectCommand.Parameters + .Add("@CvePromocion", SqlDbType.Float).Value = CvePromocion + .Add("@Estatus", SqlDbType.Bit).Value = Estatus + .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al actualizar el estatus la Promoción.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + Return Retorno + End Function + - Return Retorno - End Function - - Public Function RemovePromociones(CvePromocion As Integer, CveEmpresa As Integer) As Boolean Dim Retorno As Boolean = False @@ -3294,36 +3307,33 @@ Public Class ClsVentas Return Retorno End Function - + Public Function GetRepRemisionesSinFacturar(FechaI As String, FechaF As String, FechaV As String, CveSubProyecto As String, CveCliente As Integer, CveContrato As Integer, CveVendedor As String, CveEmpresa As Integer, Optional CveUsuarioConsulta As Integer = -1, Optional ConsultaInventario As Boolean = False, Optional PrimerProducto As Boolean = False) As Boolean - Dim Retorno As Boolean = False - DataAdapter("PA_Vta_RepRemisionesGet") + Dim Retorno As Boolean = False + DataAdapter("PA_Vta_RepRemisionesGet") + With SqlAdapter.SelectCommand.Parameters + .Add("@FechaI", SqlDbType.VarChar).Value = FechaI + .Add("@FechaF", SqlDbType.VarChar).Value = FechaF + .Add("@FechaV", SqlDbType.VarChar).Value = FechaV + .Add("@CveSubProyecto", SqlDbType.VarChar).Value = CveSubProyecto + .Add("@CveCliente", SqlDbType.Int).Value = CveCliente + .Add("@CveContrato", SqlDbType.Int).Value = CveContrato + .Add("@CveVendedor", SqlDbType.VarChar).Value = CveVendedor + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + .Add("@CveUsuarioConsulta", SqlDbType.Int).Value = CveUsuarioConsulta + .Add("@ConsultaInventario", SqlDbType.Bit).Value = ConsultaInventario + .Add("@PrimerProducto", SqlDbType.Bit).Value = PrimerProducto + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al obtener las remisiones sin facturar.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + Return Retorno + End Function - With SqlAdapter.SelectCommand.Parameters - .Add("@FechaI", SqlDbType.VarChar).Value = FechaI - .Add("@FechaF", SqlDbType.VarChar).Value = FechaF - .Add("@FechaV", SqlDbType.VarChar).Value = FechaV - .Add("@CveSubProyecto", SqlDbType.VarChar).Value = CveSubProyecto - .Add("@CveCliente", SqlDbType.Int).Value = CveCliente - .Add("@CveContrato", SqlDbType.Int).Value = CveContrato - .Add("@CveVendedor", SqlDbType.VarChar).Value = CveVendedor - .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa - .Add("@CveUsuarioConsulta", SqlDbType.Int).Value = CveUsuarioConsulta - .Add("@ConsultaInventario", SqlDbType.Bit).Value = ConsultaInventario - .Add("@PrimerProducto", SqlDbType.Bit).Value = PrimerProducto - End With - - Try - SqlAdapter.Fill(Data) - Retorno = True - Catch ex As Exception - OnError("Ocurrió un error al obtener las remisiones sin facturar.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) - End Try - - Return Retorno - End Function - Public Function GetRepRemisionesSinFacturarDetalle(FechaI As String, FechaF As String, FechaV As String, CveCliente As Integer, CveContrato As Integer, CveVenta As Integer, CveEmpresa As Integer, CveSubProyecto As String, Optional CveUsuarioConsulta As Integer = -1, Optional ConsultaInventario As Boolean = False) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Vta_RepRemisionesDetalleGet") @@ -7614,29 +7624,26 @@ Public Class ClsVentas Return Retorno End Function - - Public Function GetSabanaE189(CveEmpresa As Integer, FechaInicio As Date, FechaFin As Date, CveProveedor As Integer, CodigoPSInicio As String, CodigoPSFin As String) As Boolean - Dim Retorno As Boolean = False - DataAdapter("PA_Vta_VentasSabanaDatos") - With SqlAdapter.SelectCommand.Parameters - .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa - .Add("@FechaInicio", SqlDbType.Date).Value = FechaInicio - .Add("@FechaFin", SqlDbType.Date).Value = FechaFin - .Add("@CveProveedor", SqlDbType.Int).Value = CveProveedor - .Add("@CodigoProductoI", SqlDbType.VarChar).Value = CodigoPSInicio - .Add("@CodigoProductoF", SqlDbType.VarChar).Value = CodigoPSFin - End With - - Try - SqlAdapter.Fill(Data) - Retorno = True - Catch ex As Exception - OnError("Ocurrió un error al obtener los datos de la Venta.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) - End Try - - Return Retorno - End Function + Public Function GetSabanaE189(CveEmpresa As Integer, FechaInicio As Date, FechaFin As Date, CveProveedor As Integer, CodigoPSInicio As String, CodigoPSFin As String) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Vta_VentasSabanaDatos") + With SqlAdapter.SelectCommand.Parameters + .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa + .Add("@FechaInicio", SqlDbType.Date).Value = FechaInicio + .Add("@FechaFin", SqlDbType.Date).Value = FechaFin + .Add("@CveProveedor", SqlDbType.Int).Value = CveProveedor + .Add("@CodigoProductoI", SqlDbType.VarChar).Value = CodigoPSInicio + .Add("@CodigoProductoF", SqlDbType.VarChar).Value = CodigoPSFin + End With + Try + SqlAdapter.Fill(Data) + Retorno = True + Catch ex As Exception + OnError("Ocurrió un error al obtener los datos de la Venta.", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + Return Retorno + End Function #Region "IDisposable Support" diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb index ea5c15c34..26e98bffa 100644 --- a/App_Code/Modelos.vb +++ b/App_Code/Modelos.vb @@ -1689,9 +1689,16 @@ Namespace Modelos Timbre.Comprobante.Folio = Me.Folio.ToString() Timbre.Comprobante.Serie = Me.Serie Timbre.Comprobante.Fecha = Me.FechaCP - Timbre.Comprobante.FormadePago = Me.ClaveFormaPagoSAT - Timbre.Comprobante.CondicionesdePago = Me.FormaPago - Timbre.Comprobante.MetodoPago = Me.ClaveMetodoPagoSAT + + 'Timbre.Comprobante.FormadePago = Me.ClaveFormaPagoSAT + 'Timbre.Comprobante.CondicionesdePago = Me.FormaPago + 'Timbre.Comprobante.MetodoPago = Me.ClaveMetodoPagoSAT + + Timbre.Comprobante.MetodoPago = ClsPaginas.GlobalDTVtaMetodoPago.FiltroPrimeroValor("ClaveMetodoPagoSAT", $"CveMetodoPago = {Me.CveMetodoPago}") + Timbre.Comprobante.FormadePago = ClsPaginas.GlobalDTVtaFormaPago.FiltroPrimeroValor("ClaveFormaPagoSAT", $"CveFormaPago = {Me.CveFormaPago}") + Timbre.Receptor.UsoCFDI = ClsPaginas.GlobalDTSATUsosCFDI.FiltroPrimeroValor("UsoCFDI", $"CveUsoCFDI = {Me.CveUsoCFDI}") + Timbre.Comprobante.CondicionesdePago = ClsPaginas.GlobalDTVtaFormaPago().FiltroPrimeroValor("FormaPago", $"CveFormaPago = {Me.CveFormaPago}") + Timbre.Comprobante.SubTotal = Me.SubTotal Timbre.Comprobante.Descuentos = Me.Descuento Timbre.Comprobante.Moneda = Me.MonedaSAT @@ -1720,7 +1727,7 @@ Namespace Modelos Timbre.Receptor.ResidenciaFiscal = "" Timbre.Receptor.NumeroRegistroTributario = "" - Timbre.Receptor.UsoCFDI = Me.ClaveUsoCFDISAT + 'Timbre.Receptor.UsoCFDI = Me.ClaveUsoCFDISAT Dim totSubTotal As Decimal = Me.SubTotal Dim totIVA As Decimal = Me.IVA diff --git a/App_Code/modExtensiones.vb b/App_Code/modExtensiones.vb index 4b42c5616..4fd95269a 100644 --- a/App_Code/modExtensiones.vb +++ b/App_Code/modExtensiones.vb @@ -177,6 +177,52 @@ Namespace Extensiones Dim dataTable As DataTable = New DataTable() Dim worksheet As GemBox.Spreadsheet.ExcelWorksheet = excelFile.Worksheets(0) + + + ' VALIDACIÓN DE COLUMNAS DUPLICADAS + Try + If firstRowHasHeaders Then + Dim columnNames As New List(Of String)() + + For col As Integer = 0 To worksheet.Rows(curRow).AllocatedCells.Count - 1 + Dim cellValue As Object = worksheet.Rows(curRow).Cells(col).Value + Dim colName As String = If(cellValue Is Nothing, $"Unnamed Column {col + 1}", + cellValue.ToString()) + + columnNames.Add(colName) + Next + + + Dim duplicates As New List(Of String)() + Dim dict As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase) + + For Each name In columnNames + If dict.ContainsKey(name) Then + dict(name) += 1 + Else + dict(name) = 1 + End If + Next + + For Each kvp In dict + If kvp.Value > 1 Then + duplicates.Add(kvp.Key) + End If + Next + + + If duplicates.Count > 0 Then + Alert(New Object, "El archivo de Excel contiene columnas duplicadas, las columnas duplicadas son: " & String.Join(", ", duplicates), TipoMensaje.MsgAdvertencia) + Return New DataTable + End If + End If + Catch ex As Exception + + End Try + ' FIN DE LA VALIDACIÓN + + + For cols = 0 To worksheet.Rows(curRow).AllocatedCells.Count - 1 If firstRowHasHeaders Then diff --git a/Ashx/SIGFacturacion.ashx b/Ashx/SIGFacturacion.ashx index b549c0ccd..f9ff0d3cb 100644 --- a/Ashx/SIGFacturacion.ashx +++ b/Ashx/SIGFacturacion.ashx @@ -31,7 +31,7 @@ Public Class SIGFacturacion : Implements IHttpHandler, IRequiresSessionState pFechaI = context.Request("FechaI") pFechaF = context.Request("FechaF") End If - + If context.Request("CveEmpresa") IsNot Nothing Then CveEmpresaFacturar = context.Request("CveEmpresa").ToString.ToEntero Retorno = IniciaFacturacionMasiva(CveEmpresaFacturar.ToString, pFechaI, pFechaF) End If GuardaLogFacturacion(" -------------------------- Fin de Petición Metodo:" & Metodo & " --------------------------") @@ -60,13 +60,13 @@ Public Class SIGFacturacion : Implements IHttpHandler, IRequiresSessionState GuardaLogFacturacion("- Inicio de facturación ") If CveEmpresa > 0 Then - GuardaLogFacturacion($"1.10 - CveE:{CveEmpresa}") + GuardaLogFacturacion($"1.10 - CveE:{CveEmpresa} - ") Dim Usuario = ValidaUsuarioSistema(CveEmpresa) Dim FechaI, FechaF As DateTime 'EnviarCorreoFactura(New Modelos.Factura(Usuario, 844966, 1, context.ModExtensiones.DirectorioBaseEmpresas), Usuario) If String.IsNullOrEmpty(pFechaI) AndAlso String.IsNullOrEmpty(pFechaF) Then - GuardaLogFacturacion("1.200") + GuardaLogFacturacion("1.200 - ") Dim FechaReferencia As Date = ClsPaginas.NowADS() If FechaReferencia.DayOfWeek = DayOfWeek.Sunday Then Dim Sabado = FechaReferencia.AddDays(-1) @@ -81,7 +81,7 @@ Public Class SIGFacturacion : Implements IHttpHandler, IRequiresSessionState GuardaLogFacturacion("Ejecución no permitida, no es el dia permitido para ejecucion o no se espeficaron las fechas") End If Else - GuardaLogFacturacion("1.300") + GuardaLogFacturacion("1.300 - ") FechaI = pFechaI.ToDateTime() FechaF = pFechaF.ToDateTime() @@ -137,7 +137,7 @@ Public Class SIGFacturacion : Implements IHttpHandler, IRequiresSessionState Dim DatosRemisiones As JObject = CargaRemisiones(FechaI, FechaF, CveCliente) Dim CveRemisiones As String = DatosRemisiones("VentasConcatenadas").ToString() - + GuardaLogFacturacion("1.25 -- ClavesRemisiones: " & CveRemisiones) If Not String.IsNullOrEmpty(CveRemisiones) Then Dim ObjClientes As New ClsClientes If ObjClientes.GetVentasRemisionesTotales(CveCliente, CveRemisiones, 1, UsuarioActual.CveEmpresa) Then @@ -228,7 +228,7 @@ Public Class SIGFacturacion : Implements IHttpHandler, IRequiresSessionState Dim UsuarioActual As Usuario = Nothing Dim NombreCadena As String = ClsPaginas.GlobalNombreCadenaConexion(CveEmpresa) Dim ObjUsuarios As New ClsSisUsuarioAutenticacion(NombreCadena:=NombreCadena) - UsuarioActual = ObjUsuarios.GetUsuarioDetalle(100) + UsuarioActual = ObjUsuarios.GetUsuarioDetalle(100, CveEmpresa) If UsuarioActual IsNot Nothing Then Dim Usuario = ObjUsuarios.DtResultados.Rows(0)("Usuario").ToString() Dim Contrasenia = ObjUsuarios.DtResultados.Rows(0)("Contraseña").ToString() diff --git a/Ashx/TareasProgramadas.ashx b/Ashx/TareasProgramadas.ashx index 11eaff1b9..fb461e57e 100644 --- a/Ashx/TareasProgramadas.ashx +++ b/Ashx/TareasProgramadas.ashx @@ -9,9 +9,25 @@ Imports Extensiones Imports System.IO Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared -Imports Microsoft.Reporting.WebForms +Imports Microsoft.Reporting.WebForms +Imports System.Threading +Imports System.Threading.Tasks +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports SharpCompress.Archive.Rar +Imports SharpCompress.Common +Imports SharpCompress.Reader +Imports ADS.TareasProgramdas +Imports System.Xml +'Imports ADSistemaLibrary.SatXml +'Imports ADSistemaLibrary.SatXml.XmlSatCFDI +Imports System.Diagnostics +Imports System.Drawing +Imports System.Drawing.Imaging -Public Class TareasProgramadas : Implements IHttpHandler + + +Public Class TareasProgramadas : Implements IHttpHandler, IReadOnlySessionState Private ReadOnly Property GlobalDTUsuariosE140(Optional CveUsuario As Integer = -1, Optional CveCliente As Integer = -1, Optional CveProveedor As Integer = -1) As DataTable @@ -95,12 +111,28 @@ Public Class TareasProgramadas : Implements IHttpHandler CargaEstadosCuenta(context, 119, -1, FechaEnvio, FechaActual) Case "ScoreCard" - CargaScoreCard(context, 140, FechaEnvio) + CargaScoreCard(context, 140, FechaEnvio) + Case "EjecutaReporteDiario" + Dim tCveEmpresa As Integer = context.Request("CveEmpresa").ToString.ToEntero + retorno = If(ReporteDiario(tCveEmpresa, context), "True", "false") + context.Response.Write(retorno) + Case "DescargaSAT" + Dim tCveEmpresa As Integer = context.Request("CveEmpresa").ToString.ToEntero + retorno = If(DescargaSAT(tCveEmpresa, context), "True", "false") + context.Response.Write(retorno) + Case "ValidaDescargaSAT" + Dim tCveEmpresa As Integer = context.Request("CveEmpresa").ToString.ToEntero + retorno = If(ValidaDescargaSAT(tCveEmpresa, context), "True", "false") + context.Response.Write(retorno) + + 'Case "TmpFacturas" + ' TmpFacturas() + End Select Catch ex As Exception ex.GuardaLog(ex.ToString()) context.Response.Write(retorno) - End Try + End Try End Sub @@ -332,7 +364,7 @@ Public Class TareasProgramadas : Implements IHttpHandler If DtEmpresas IsNot Nothing Then For Each Row As DataRow In DtEmpresas.Rows - Dim Usuario As Usuario = ValidaUsuarioSistema(Row("CveEmpresa").ToString().ToEntero()) + Dim Usuario As Usuario = ValidaUsuarioSistema(100, Row("CveEmpresa").ToString().ToEntero()) Dim obj As JObject = EjecutarEnvioEstadoCuenta(Usuario, FechaEnvio, FechaActual, pCveCliente:=pCveCliente) Retorno.Add(obj) @@ -347,11 +379,11 @@ Public Class TareasProgramadas : Implements IHttpHandler End Sub - Private Function ValidaUsuarioSistema(CveEmpresa As Integer) As Usuario + Private Function ValidaUsuarioSistema(CveUsuario As Integer, CveEmpresa As Integer) As Usuario Dim UsuarioActual As Usuario = Nothing Dim NombreCadena As String = ClsPaginas.GlobalNombreCadenaConexion(CveEmpresa) Dim ObjUsuarios As New ClsSisUsuarioAutenticacion(NombreCadena:=NombreCadena) - UsuarioActual = ObjUsuarios.GetUsuarioDetalle(100) + UsuarioActual = ObjUsuarios.GetUsuarioDetalle(CveUsuario, CveEmpresa) If UsuarioActual IsNot Nothing Then HttpContext.Current.Session("UsuarioSIG") = UsuarioActual 'CreaObjetoEmpresa(UsuarioActual) @@ -398,7 +430,7 @@ Public Class TareasProgramadas : Implements IHttpHandler Dim FechaCorte As DateTime = New DateTime(ClsPaginas.NowADS().Year, 12, 31) If ObjMov.GetCxC(FechaI, FechaF, CveCliente, CveSubProyecto, CveVendedor, -1, -1, "-1", UsuarioActual.CveEmpresa, Grupo, -1, TipoCambio, TCEspecifico, TipoDocto, FechaVI, FechaVF, FechaCorte:=FechaCorte, - EstatusCliente:=1, CveUsuarioConsulta:=UsuarioActual.CveUsuario, CveCobranzaEstatus:=CveCobranzaEstatus, CveClienteClasificacion:=-1, TipoCliente:=-1 ) Then + EstatusCliente:=1, CveUsuarioConsulta:=UsuarioActual.CveUsuario, CveCobranzaEstatus:=CveCobranzaEstatus, CveClienteClasificacion:=-1, TipoCliente:=-1) Then DTClientes = ObjMov.DtResultados.FiltraParametros("CveCliente > 0", DistinctColumns:={"CveCliente"}) End If @@ -874,7 +906,7 @@ Public Class TareasProgramadas : Implements IHttpHandler #Region "S C O R E C A R D" Private Sub CargaScoreCard(ByVal context As HttpContext, pCveEmpresa As Integer, FechaEnvio As DateTime) - Dim Usuario As Usuario = ValidaUsuarioSistema(pCveEmpresa) + Dim Usuario As Usuario = ValidaUsuarioSistema(100, pCveEmpresa) Dim obj As Boolean = EjecutarEnvioScoreCard(Usuario, FechaEnvio) End Sub @@ -1298,4 +1330,4759 @@ Public Class TareasProgramadas : Implements IHttpHandler End Function #End Region -End Class \ No newline at end of file +#Region "R E P O R T E D I A R I O " + 'Private Function ReporteDiario(ByVal CveEmpresa As Integer, ByVal context As HttpContext) As Boolean + ' Dim Usuario As Usuario = ValidaUsuarioSistema(100, CveEmpresa) + ' Dim objGenerales As ClsGenerales = New ClsGenerales() + ' Dim respuesta As Boolean = True + ' Dim sbTablas As StringBuilder = New StringBuilder() + ' sbTablas.Append($"
Reporte Diario {DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")}


") + + ' If objGenerales.GetReporteDiario(CveEmpresa) Then + ' Dim TablaActual As Integer = 1 + + ' For Each tabla As DataTable In objGenerales.DSResultados.Tables + ' sbTablas.AppendLine(ConvertDataTableToHtml(tabla)) + ' TablaActual += 1 + ' sbTablas.Append("
") + ' sbTablas.Append("
") + ' Next + ' Else + ' respuesta = False + ' End If + + ' objGenerales.Dispose() + ' 'MandaCorreoDiario + ' Dim Correos As String = "hdiaz@grupodiaz.com.mx;libarra@grupodiaz.com.mx;jguerrero@grupodiaz.com.mx;contabilidad@grupodiaz.com.mx;cnazarit@yahoo.com;julian@adsistemas.mx;rene.molina@adssistemas.mx" + ' ' Dim Correos As String = " rene.molina@adssistemas.mx" + ' MandaCorreoDiario(sbTablas.ToString(), Correos, respuesta) + ' Return respuesta + 'End Function + + 'Private Function ConvertDataTableToHtml(ByVal table As DataTable) As String + ' Dim html As StringBuilder = New StringBuilder() + ' Dim ColumnaTitulo As String = "Titulo" + ' html.Append("") + ' If table.Columns(0).ColumnName = ColumnaTitulo AndAlso table.Rows.Count > 0 Then html.AppendFormat(" ", table.Rows(0)(ColumnaTitulo)) + ' html.Append("") + + ' For Each column As DataColumn In table.Columns + ' If ColumnaTitulo <> column.ColumnName Then html.Append($"") + ' Next + + ' html.Append("") + ' html.Append("") + ' Dim numericValue As Decimal = Nothing + + ' For Each row As DataRow In table.Rows + ' html.Append("") + + ' For Each column As DataColumn In table.Columns + + ' If ColumnaTitulo <> column.ColumnName Then + ' Dim value As Object = row(column) + ' Dim cellValue As String + + ' If column.DataType = GetType(Integer) OrElse column.DataType = GetType(Decimal) OrElse column.DataType = GetType(Double) OrElse column.DataType = GetType(Single) Then + + ' If value IsNot DBNull.Value AndAlso Decimal.TryParse(value.ToString(), numericValue) Then + + ' If numericValue <> 0 Then + ' cellValue = numericValue.ToString("N2") + ' Else + ' cellValue = "" + ' End If + ' Else + ' cellValue = "" + ' End If + + ' html.Append($"") + ' Else + ' cellValue = If(value?.ToString(), String.Empty) + ' html.Append($"") + ' End If + ' End If + ' Next + + ' html.Append("") + ' Next + + ' html.Append("") + ' html.Append("
{0}
{column.ColumnName}
{cellValue}{cellValue}
") + ' Return html.ToString() + 'End Function + + Private Function ReporteDiario(ByVal CveEmpresa As Integer, ByVal context As HttpContext) As Boolean + Dim Usuario As Usuario = ValidaUsuarioSistema(100, CveEmpresa) + Dim objGenerales As ClsGenerales = New ClsGenerales() + Dim respuesta As Boolean = True + Dim sbTablas As StringBuilder = New StringBuilder() + 'sbTablas.Append($"
Reporte Diario {DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")}


") + + Dim LogoBase64emp As String = "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" + Dim LogoBase64ADS As String = "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" + Dim Logo As New FileInfo($"{Usuario.Empresa.Ruta}/Logo.png") + If Logo.Exists Then + LogoBase64emp = RedimensionarYConvertirBase64(Logo.FullName) + End If + + 'RedimensionarYConvertirBase64 + + sbTablas.AppendLine($" +
+

Notificaciones AD Sistemas

+
+ + + + +
+

Reporte Diario {DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")}


+

{Usuario.Empresa.Empresa}


+
+ ") + + If objGenerales.GetReporteDiario(CveEmpresa) Then + + If objGenerales.DSResultados.Tables(0).Rows.Count > 0 AndAlso objGenerales.DSResultados.Tables(0).Columns.Count > 0 Then + sbTablas.AppendLine($" +

VENTA ACUMULADA

+

Mes actual: ${objGenerales.DSResultados.Tables(0).Rows(0)(1).ToString.ToDecimal.ToString("###,###,###.00")}M.N.

+

Año actual: ${objGenerales.DSResultados.Tables(0).Rows(0)(2).ToString.ToDecimal.ToString("###,###,###.00")}M.N.

+ ") + End If + + sbTablas.AppendLine($"
") + sbTablas.AppendLine("
") + + sbTablas.AppendLine(ConvertDataTableToHtml(objGenerales.DSResultados.Tables(4))) + sbTablas.AppendLine($"
") + sbTablas.AppendLine("
") + + sbTablas.AppendLine(ConvertDataTableToHtml(objGenerales.DSResultados.Tables(3))) + sbTablas.AppendLine($"
") + sbTablas.AppendLine("
") + + + + sbTablas.AppendLine($" + + + +
{ConvertDataTableToHtml(objGenerales.DSResultados.Tables(1))}{ConvertDataTableToHtml(objGenerales.DSResultados.Tables(2))}
+ ") + sbTablas.AppendLine($"
") + sbTablas.AppendLine("
") + + sbTablas.AppendLine($" + + + +
{ConvertDataTableToHtml(objGenerales.DSResultados.Tables(5))}
+ ") + + 'sbTablas.AppendLine($" + ' + ' + ' + '
{ConvertDataTableToHtml(objGenerales.DSResultados.Tables(2))}
+ '") + 'sbTablas.AppendLine($"
") + 'sbTablas.AppendLine("
") + + 'Dim TablaActual As Integer = 1 + 'For Each tabla As DataTable In objGenerales.DSResultados.Tables + ' sbTablas.AppendLine(ConvertDataTableToHtml(tabla)) + ' TablaActual += 1 + ' sbTablas.Append("
") + ' sbTablas.Append("
") + 'Next + Else + respuesta = False + End If + + sbTablas.AppendLine(" +
+ + + +
Información generada por SIG ERP (www.adsistemas.mx)
+
+
+
") + + + objGenerales.Dispose() + 'MandaCorreoDiario + Dim Correos As String = "hdiaz@grupodiaz.com.mx;libarra@grupodiaz.com.mx;jguerrero@grupodiaz.com.mx;contabilidad@grupodiaz.com.mx;cnazarit@yahoo.com;julian@adsistemas.mx;rene.molina@adssistemas.mx" + 'Dim Correos As String = " oscar.irigoyen@adssistemas.mx" + MandaCorreoDiario(sbTablas.ToString(), Correos, respuesta) + Return respuesta + End Function + + + + Public Function RedimensionarYConvertirBase64(ByVal rutaImagen As String) As String + Try + + Using imagenOriginal As Image = Image.FromFile(rutaImagen) + + Dim maxWidth As Integer = 210 + Dim maxHeight As Integer = 95 + Dim ratio As Double = Math.Min(maxWidth / imagenOriginal.Width, maxHeight / imagenOriginal.Height) + + Dim nuevoAncho As Integer = CInt(imagenOriginal.Width * ratio) + Dim nuevoAlto As Integer = CInt(imagenOriginal.Height * ratio) + + + Using imagenRedimensionada As New Bitmap(nuevoAncho, nuevoAlto) + Using g As Graphics = Graphics.FromImage(imagenRedimensionada) + g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic + g.DrawImage(imagenOriginal, 0, 0, nuevoAncho, nuevoAlto) + End Using + + 'System.Drawing.Imaging + Using ms As New MemoryStream() + imagenRedimensionada.Save(ms, System.Drawing.Imaging.ImageFormat.Png) + Dim imagenBytes As Byte() = ms.ToArray() + Return Convert.ToBase64String(imagenBytes) + End Using + End Using + End Using + Catch ex As Exception + Return String.Empty ' En caso de error, retornar cadena vacía + End Try + End Function + + + + + + Private Function ConvertDataTableToHtml(ByVal table As DataTable) As String + Dim html As StringBuilder = New StringBuilder() + Dim ColumnaTitulo As String = "Titulo" + html.Append("") + If table.Columns(0).ColumnName = ColumnaTitulo AndAlso table.Rows.Count > 0 Then html.AppendFormat("", table.Rows(0)(ColumnaTitulo)) + html.Append("") + + For Each column As DataColumn In table.Columns + If ColumnaTitulo <> column.ColumnName Then html.Append($"") + Next + + html.Append("") + html.Append("") + Dim numericValue As Decimal = Nothing + + For Each row As DataRow In table.Rows + html.Append("") + + For Each column As DataColumn In table.Columns + + If ColumnaTitulo <> column.ColumnName Then + Dim value As Object = row(column) + Dim cellValue As String + + If column.DataType = GetType(Integer) OrElse column.DataType = GetType(Decimal) OrElse column.DataType = GetType(Double) OrElse column.DataType = GetType(Single) Then + + If value IsNot DBNull.Value AndAlso Decimal.TryParse(value.ToString(), numericValue) Then + + If numericValue <> 0 Then + cellValue = numericValue.ToString("N2") + Else + cellValue = "" + End If + Else + cellValue = "" + End If + + html.Append($"") + Else + cellValue = If(value?.ToString(), String.Empty) + html.Append($"") + End If + End If + Next + + html.Append("") + Next + + html.Append("") + html.Append("

{0}

{column.ColumnName}
{cellValue}{cellValue}
") + Return html.ToString() + End Function + + Private Sub MandaCorreoDiario(ByVal Cuerpo As String, Correos As String, ByVal ProcesoOK As Boolean) + Try + Dim ListaArchivos As List(Of ClsSisMail.ArchivoMail) = New List(Of ClsSisMail.ArchivoMail)() + Dim Correo As ClsSisMail = New ClsSisMail() + Dim Para As String = Correos '"hdiaz@grupodiaz.com.mx;libarra@grupodiaz.com.mx;jguerrero@grupodiaz.com.mx;contabilidad@grupodiaz.com.mx;cnazarit@yahoo.com;julian@adsistemas.mx;rene.molina@adssistemas.mx" + Dim Asunto As String = If(ProcesoOK, $"Reporte Diario", "Reporte Diario Error") + Asunto = $"{Asunto} {DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")}" + Correo.SendMail(ClsPaginas.EmpresaNotificaciones, Para, Asunto, Cuerpo, Archivos:=ListaArchivos) + Me.GuardaLog($"EjecutaReporteDiario: MandaCorreo() correo enviado. ") + Catch ex As Exception + Extensiones.ModExtensiones.GuardaLog(Nothing, $"Error Tareas Programadas 119 error enviar mail --> {ex.Message} ") + Me.GuardaLog($"EjecutaReporteDiario: MandaCorreo() Error {ex.StackTrace.ToString()}. ") + End Try + End Sub + + + Private Function DescargaSAT(ByVal CveEmpresa As Integer, ByVal context As HttpContext) As Boolean + + Dim Usuario As Usuario = ValidaUsuarioSistema(100, CveEmpresa) + Dim respuesta As Boolean = True + Dim fInicial As DateTime = Now.AddDays(-2) + Dim fFinal As DateTime = Now.AddDays(-1) + + 'Dim fInicial As DateTime = "2025-01-01".ToDate + 'Dim fFinal As DateTime = "2025-01-03".ToDate + + 'Dim CveSolicitudAgregadaTipo1 As Integer = -1 'Nomina + Dim CveSolicitudAgregadaTipo2 As Integer = -1 'Egresos (Compras) + ' Dim CveSolicitudAgregadaTipo3 As Integer = -1 'Ingresos (Ventas) + + 'Dim FolioTipo1 As Integer = -1 'Nomina + Dim FolioTipo2 As Integer = -1 'Egresos (Compras) + ' Dim FolioTipo3 As Integer = -1 'Ingresos (Ventas) + + Using nom As ClsNominas = New ClsNominas() + ''Nomina + 'CveSolicitudAgregadaTipo1 = nom.SolicitudesAdd2(0, 0, 0, "", fInicial, fFinal, 100, CveEmpresa, CveTipoSolicitud:=1) + 'If CveSolicitudAgregadaTipo1 > 0 Then + ' FolioTipo1 = nom.FolioSolicitud + + ' GuardaLog($"DescargaSAT: Solictud Nomina Registrada CveSolicitudAgregada: {CveSolicitudAgregadaTipo1}, Folio: {FolioTipo1} ".ToString()) + 'Else + ' GuardaLog("DescargaSAT: No se puedo registrar la solictud de Nomina".ToString()) + 'End If + + 'Egresos (Compras) + CveSolicitudAgregadaTipo2 = nom.SolicitudesAdd2(0, 0, 0, "", fInicial, fFinal, 100, CveEmpresa, CveTipoSolicitud:=2) + If CveSolicitudAgregadaTipo2 > 0 Then + FolioTipo2 = nom.FolioSolicitud + GuardaLog($"DescargaSAT: Solictud Compras Registrada CveSolicitudAgregada: {CveSolicitudAgregadaTipo2}, Folio: {FolioTipo2} ".ToString()) + Else + GuardaLog("DescargaSAT: No se puedo registrar la solictud de Compras".ToString()) + End If + + ''Ingresos (Ventas) + 'CveSolicitudAgregadaTipo3 = nom.SolicitudesAdd2(0, 0, 0, "", fInicial, fFinal, 100, CveEmpresa, CveTipoSolicitud:=3) + 'If CveSolicitudAgregadaTipo3 > 0 Then + ' FolioTipo3 = nom.FolioSolicitud + ' GuardaLog($"DescargaSAT: Solictud ventas Registrada CveSolicitudAgregada: {CveSolicitudAgregadaTipo3}, Folio: {FolioTipo3} ".ToString()) + 'Else + ' GuardaLog("DescargaSAT: No se puedo registrar la solictud de Ventas".ToString()) + 'End If + + End Using + + 'If CveSolicitudAgregadaTipo1 > 0 Then + ' GeneraSolictud(CveEmpresa, CveSolicitudAgregadaTipo1, FolioTipo1, 1) + 'End If + + If CveSolicitudAgregadaTipo2 > 0 Then + respuesta = GeneraSolictud(CveEmpresa, CveSolicitudAgregadaTipo2, FolioTipo2, 2) + End If + + 'If CveSolicitudAgregadaTipo3 > 0 Then + ' GeneraSolictud(CveEmpresa, CveSolicitudAgregadaTipo3, FolioTipo1, 3) + 'End If + + Return respuesta + + End Function + + Function GeneraSolictud(CveEmpresa As Integer, CveSolicitudAgregada As Integer, Folio As Integer, CveTipoSolicitud As Integer) As Boolean + + + Dim TipoStr As String = "" + Select Case CveTipoSolicitud + Case 1 + TipoStr = "Nomina" + Case 2 + TipoStr = "Facturas" + Case 3 + TipoStr = "Ventas" + End Select + + GuardaLog($"DescargaSAT: Inicia solicitud de generación de solicitud {TipoStr} a API") + + Dim api As New GeneralesAPIeFacturas() + Dim ObjApiSolicitud As JToken = CType(api.GeneraSolicitud(CveEmpresa, CveTipoSolicitud, CveSolicitudAgregada), JToken) + Dim resultSolicitud As List(Of String) = New List(Of String)() + Dim resultVerificacion As List(Of String) = New List(Of String)() + Dim TipoMensaje As ModExtensiones.TipoMensaje = ModExtensiones.TipoMensaje.MsgInformacion + Dim ResultadoSolicitudOK As Boolean = False + + If Not (ObjApiSolicitud Is Nothing) Then + resultSolicitud = ObjApiSolicitud.[Select](Function(token) token.Values().Aggregate(Function(i, j) $"{i}|{j}").Value(Of String)()).ToList() + ResultadoSolicitudOK = Boolean.Parse(resultSolicitud(0)) + Else + GuardaLog($"DescargaSAT: Solicitud Folio: {Folio} Procesada incorrectamente.") + End If + + If ResultadoSolicitudOK Then + GuardaLog($"DescargaSAT: Solicitud registrada. {resultSolicitud(1)}
Folio: {Folio}") + Else + + If ObjApiSolicitud IsNot Nothing AndAlso resultSolicitud.Count = 4 Then + GuardaLog($"DescargaSAT: Solicitud registrada, pendiente de verificar en SAT
Folio: {Folio}
({resultSolicitud(1)})
") + Else + GuardaLog($"DescargaSAT: Solicitud registrada, pendiente de verificar en SAT
Folio: {Folio}") + End If + + End If + + Return ResultadoSolicitudOK + End Function + + + Private Function ValidaDescargaSAT(ByVal CveEmpresa As Integer, ByVal context As HttpContext) As Boolean + GuardaLog($"ValidaDescargaSAT: Inicio") + + Dim Usuario As Usuario = ValidaUsuarioSistema(100, CveEmpresa) + Dim respuesta As Boolean = True + + 'Dim DTSolicitudesNom As New DataTable + Dim DTSolicitudesCom As New DataTable + ' Dim DTSolicitudesVen As New DataTable + + Using nom As ClsNominas = New ClsNominas() + + 'If nom.SolicitudesGet(-1, CveEmpresa, CveTipoSolicitud:=1, Estatus:=0, Top:=50) Then + ' DTSolicitudesNom = nom.DtResultados + ' GuardaLog($"ValidaDescargaSAT: DTSolicitudesNom registros {DTSolicitudesNom.Rows.Count}") + 'End If + + If nom.SolicitudesGet(-1, CveEmpresa, CveTipoSolicitud:=2, Estatus:=0, Top:=50) Then + DTSolicitudesCom = nom.DtResultados + GuardaLog($"ValidaDescargaSAT: DTSolicitudesCom registros {DTSolicitudesCom.Rows.Count}") + End If + + 'If nom.SolicitudesGet(-1, CveEmpresa, CveTipoSolicitud:=3, Estatus:=0, Top:=50) Then + ' DTSolicitudesVen = nom.DtResultados + ' GuardaLog($"ValidaDescargaSAT: DTSolicitudesVen registros {DTSolicitudesVen.Rows.Count}") + 'End If + + End Using + + + 'If DTSolicitudesNom.Rows.Count > 0 Then + ' VerificarSolicitudes(CveEmpresa, DTSolicitudesNom, 1, Usuario) + 'End If + + If DTSolicitudesCom.Rows.Count > 0 Then + VerificarSolicitudes(CveEmpresa, DTSolicitudesCom, 2, Usuario) + End If + + 'If DTSolicitudesVen.Rows.Count > 0 Then + ' VerificarSolicitudes(CveEmpresa, DTSolicitudesVen, 3, Usuario) + 'End If + + GuardaLog($"ValidaDescargaSAT: Fin") + + Return respuesta + + End Function + + + Private Function VerificarSolicitudes(CveEmpresa As Integer, DTDatos As DataTable, CveTipoSolicitud As Integer, UsuarioActual As Usuario) As Boolean + Try + Dim sbResultado As StringBuilder = New StringBuilder() + Dim sbArchivosFaltantes As New StringBuilder() + + Dim TipoMensaje As ModExtensiones.TipoMensaje = ModExtensiones.TipoMensaje.MsgInformacion + + + + For Each drow As DataRow In DTDatos.Rows + + Dim ListComprimidos As New List(Of String) + Dim ListXML As New List(Of String) + Dim ListPDF As New List(Of String) + + Dim CveSolicitudActual As Integer = drow("CveSolicitud").ToString.ToEntero() + Dim idSolicitud As String = drow("idSolicitud").ToString.Trim() + 'Dim CveTipoSolicitud As Integer = GvRow.DataKey("CveTipoSolicitud").ToEntero() + Dim Folio As Integer = drow("Folio").ToString.ToEntero() + Dim CveSolicitudDetalle As Integer = drow("CveSolicitudDetalle").ToString.ToEntero() + + Dim resultSolicitud As List(Of String) = New List(Of String)() + Dim resultVerificacion As List(Of String) = New List(Of String)() + Dim ResultadoVerificaionOK As Boolean = False + Dim SeVerifico As Boolean = False + + Dim ResultadoSolicitudOK As Boolean = False + Dim api As New GeneralesAPIeFacturas("http://localhost:4001/") + + '"http://localhost:60281/" + + Dim Verificar As Boolean = True + + If idSolicitud.Length = 0 Then + Dim ObjApiSolicitud As JToken = CType(api.GeneraSolicitud(CveEmpresa, CveTipoSolicitud, CveSolicitudActual), JToken) + + If Not (ObjApiSolicitud Is Nothing) Then + resultSolicitud = ObjApiSolicitud.[Select](Function(token) token.Values().Aggregate(Function(i, j) $"{i}|{j}").Value(Of String)()).ToList() + ResultadoSolicitudOK = Boolean.Parse(resultSolicitud(0)) + + Try + sbResultado.Append($"Solicitud {Folio} { resultSolicitud(1)}.
") + + If resultSolicitud(1).Contains("No se Generaron solicitudes al SAT") Then + Verificar = False + Else + Verificar = True + End If + Catch ex As Exception + sbResultado.Append($"Solicitud {Folio} solicitada a SAT.
") + Verificar = False + End Try + + + Else + TipoMensaje = ModExtensiones.TipoMensaje.MsgAdvertencia + End If + Else + resultSolicitud = New List(Of String)() + resultSolicitud.Add("true") + resultSolicitud.Add("") + resultSolicitud.Add("") + resultSolicitud.Add("") + ResultadoSolicitudOK = True + Verificar = True + End If + + If ResultadoSolicitudOK And Verificar Then + + ' If EsProduccion Then + Dim ObjApiVerificacion As JToken = CType(api.VerificaSolicitudesNominas(CveEmpresa, CveTipoSolicitud, CveSolicitudActual), JToken) + + If Not (ObjApiVerificacion Is Nothing) Then + resultVerificacion = ObjApiVerificacion.[Select](Function(token) token.Values().Aggregate(Function(i, j) $"{i}|{j}").Value(Of String)()).ToList() + + ResultadoVerificaionOK = Boolean.Parse(resultVerificacion(0)) + SeVerifico = True + Else + TipoMensaje = ModExtensiones.TipoMensaje.MsgAdvertencia + End If + 'Else + ' ResultadoVerificaionOK = True + ' SeVerifico = True + 'End If + + + Dim Archivo = New FileInfo(String.Format("{0}DescargasSATXML\Compras\{1}.zip", UsuarioActual.Empresa.Ruta, CveSolicitudDetalle)) + Dim fileName = Archivo.Name + Dim filemove = Archivo.FullName + + If ResultadoVerificaionOK AndAlso Archivo.Exists Then + Try + 'COPIAR ARCHIVO A LA CARPETA DE PROCESAMIENTO DE FACTURAS, SE ELIMINARAN ESOS ARCHIVOS TEMPORALES + Dim destFile = String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, fileName) + File.Copy(filemove, destFile, overwrite:=True) + + If File.Exists(destFile) Then + ListComprimidos.Add(destFile) + 'GuardaLogAD($"eFacturas Solicitudes SAT Archivo copiado a {destFile}") + Else + sbArchivosFaltantes.AppendFormat("
Folio: {0} Archivo: {1}", Folio, fileName) + End If + + Catch ex As Exception + ex.ToString().GuardaLog() + sbArchivosFaltantes.AppendFormat("
Folio: {0} Archivo: {1}. Error al procesar", Folio, fileName) + End Try + + End If + + Else + + If resultSolicitud.Count >= 4 Then + sbResultado.Append($"({resultSolicitud(1)})
Folio:{Folio}
") + Else + sbResultado.Append($"Solicitud pendiente de verificar en SAT
Folio:{Folio}
") + End If + + TipoMensaje = ModExtensiones.TipoMensaje.MsgAdvertencia + End If + + If SeVerifico Then + SubirFacturas(ListComprimidos, ListXML, ListPDF, 1, UsuarioActual) + End If + + 'If UsuarioActual.CveRol = 1 Then + ' Alert($"SeVerifico {SeVerifico.ToString} resultVerificacion.Count {resultVerificacion.Count }") + 'End If + + If Verificar Then + If SeVerifico AndAlso resultVerificacion.Count >= 4 Then + + If ResultadoVerificaionOK Then + sbResultado.Append($"Solicitud procesadaFolio: {Folio}
{resultVerificacion(1)}") + Else + sbResultado.Append($"Solicitud no verificada
Folio: {Folio}{resultVerificacion(1)}.
") + TipoMensaje = ModExtensiones.TipoMensaje.MsgAdvertencia + End If + Else + sbResultado.Append($"Se presento un error al verificar la solicitud Folio: {Folio}.
") + TipoMensaje = ModExtensiones.TipoMensaje.MsgAdvertencia + End If + End If + + + Next + + Alert(sbResultado.ToString(), TipoMensaje) + + If sbArchivosFaltantes.Length > 0 Then + 'Alert($"No se pudieron procesar los siguientes folios. {sbArchivosFaltantes.ToString()}", TipoMensaje.MsgError) + GuardaLog($"ValidaDescargaSAT: No se pudieron procesar los siguientes folios. {sbArchivosFaltantes.ToString()}") + End If + + 'cargasolicitudes() + Catch ex As Exception + 'Alert(ex.StackTrace) + GuardaLog($"ValidaDescargaSAT: {ex.StackTrace}") + End Try + + Return True + End Function + + Private Sub ProcesarPDF(UsuarioActual As Usuario, a As ComprobanteFactura, FF As Factura) + a.GeneraPDF(UsuarioActual, UsuarioActual.Empresa.Ruta, FF, UsuarioActual.Empresa.Ruta, True) + End Sub + + + 'Private Sub TmpFacturas() + ' Dim Usuario As Usuario = ValidaUsuarioSistema(100, 189) + ' Dim ListComprimidos As New List(Of String) + ' ListComprimidos.Add("C:\inetpub\WWWSigGit\Empresas\189\Temp\Facturas\3694.zip") + + ' SubirFacturas(ListComprimidos, New List(Of String), New List(Of String), 1, Usuario) + 'End Sub + + Private Sub SubirFacturas(ByRef ListComprimidos As List(Of String), ByRef ListXML As List(Of String), ByRef ListPDF As List(Of String), Validada As Integer, UsuarioActual As Usuario) + Dim DTLOG As New DataTable + DTLOG.Columns.Add("Serie", GetType(String)) + DTLOG.Columns.Add("Folio", GetType(String)) + DTLOG.Columns.Add("Fecha", GetType(Date)) + DTLOG.Columns.Add("Proveedor", GetType(String)) + DTLOG.Columns.Add("Importe", GetType(Decimal)) + DTLOG.Columns.Add("Motivo", GetType(String)) + DTLOG.Columns.Add("RFCde", GetType(String)) + DTLOG.Columns.Add("Estatus", GetType(Integer)) + DTLOG.Columns.Add("Tipo", GetType(String)) + + + 'Serie Folio Fecha Proveedor Importe Motivo + + Dim sw As New Diagnostics.Stopwatch + Dim swmili As Long = 0 + Dim swTiempo As New StringBuilder + sw.Start() + + For Each comprmido As String In ListComprimidos + + Dim FiInfo As New FileInfo(comprmido) + + Try + Using stream As Stream = System.IO.File.OpenRead(FiInfo.FullName) + Try + Dim reader = ReaderFactory.Open(stream) + + Dim Multiparte As Boolean = False + If Path.GetExtension(FiInfo.FullName.ToUpper()) = ".RAR" And FiInfo.FullName.ToUpper().Contains(".PART") Then + 'SI ES .RAR, PUEDE SER MULTI PART Y PUEDE TRONAR + Using archive As RarArchive = RarArchive.Open(FiInfo.FullName) + If archive.IsMultipartVolume() Then + Multiparte = True + End If + End Using + End If + + Dim PdfList As New List(Of String) + If Not Multiparte Then + 'puede tronar si el archivo es multiparte + While reader.MoveToNextEntry() + If Not reader.Entry.IsDirectory Then + 'Si es un archivo XML, lo leo y lo guardo + + Dim nombreArchivo As String = "" + + If reader.Entry.FilePath.Contains("/") Then + nombreArchivo = reader.Entry.FilePath.Substring(reader.Entry.FilePath.LastIndexOf("/") + 1) + Else + nombreArchivo = reader.Entry.FilePath + End If + + If Path.GetExtension(reader.Entry.FilePath.ToUpper()) = ".XML" Then + reader.WriteEntryToDirectory(String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ExtractOptions.None Or ExtractOptions.Overwrite) + ListXML.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, nombreArchivo)) + End If + If Path.GetExtension(reader.Entry.FilePath.ToUpper()) = ".PDF" Then + 'este sale de un error al leer el pdf, como lo estoy recorriendo de una vez lo guardo y lo vinculo, si la coincidencia es por nombre o número de folio + 'string RFCEmisor = BuscaFactura(System.IO.Path.GetFileNameWithoutExtension(reader.Entry.FilePath).ToUpper(), Arreglo, True); + 'if (!string.IsNullOrEmpty(RFCEmisor)) + ' { + 'If Not Directory.Exists(String.Format("{0}{1}", Temporal, RFCEmisor)) Then Directory.CreateDirectory(String.Format("{0}{1}", Temporal, RFCEmisor)) + + 'reader.WriteEntryToDirectory(String.Format("{0}{1}", Temporal, ""), ExtractOptions.None Or ExtractOptions.Overwrite) + reader.WriteEntryToDirectory(String.Format("{0}{1}", String.Format("{0}Temp\Facturas", UsuarioActual.Empresa.Ruta), ""), ExtractOptions.None Or ExtractOptions.Overwrite) + ListPDF.Add(String.Format("{0}Temp\Facturas\{1}", UsuarioActual.Empresa.Ruta, nombreArchivo)) + + End If + End If + End While + End If + Catch ex As Exception + 'GuardaLogAD("'ERROR :" & ex.Message, eFacturasLog) + GuardaLog($"ValidaDescargaSAT: ERROR : {ex.Message}") + End Try + End Using + Catch ex As Exception + If UsuarioActual.CveRol = 1 Then + 'Alert($"Error al procesar archivo: {FiInfo.FullName} Error:{ex.Message} stackTrace: {ex.StackTrace}", TipoMensaje.MsgAdvertencia) + 'GuardaLogAD($"Error al procesar archivo: {FiInfo.FullName} Error:{ex.Message} stackTrace: {ex.StackTrace}") + GuardaLog($"ValidaDescargaSAT: ERROR al procesar archivo : {FiInfo.FullName} Error:{ex.Message} stackTrace: {ex.StackTrace}") + Else + 'Alert("Se presento un error al procesar las solcictudes. comuniquese con soporte tecnico.", TipoMensaje.MsgAdvertencia) + 'GuardaLogAD($"Error al procesar archivo: {FiInfo.FullName} Error:{ex.Message} stackTrace: {ex.StackTrace}") + GuardaLog($"ValidaDescargaSAT: ERROR al procesar archivo : {FiInfo.FullName} Error:{ex.Message} stackTrace: {ex.StackTrace}") + End If + + Exit Sub + End Try + + + + Next + + + 'Anexo.Text = "" + 'UPAddFacturas.Update() + Dim ErrorFacturas As Boolean = False + For Each filePathXML As String In ListXML + + Dim rowLog As DataRow = DTLOG.NewRow + rowLog("Serie") = "" + rowLog("Folio") = "" + rowLog("Fecha") = Now + rowLog("Proveedor") = "" + rowLog("Importe") = 0 + rowLog("Motivo") = "" + rowLog("RFCde") = "" + rowLog("Estatus") = 0 + rowLog("Tipo") = "" + + + Dim fInfoXML As New FileInfo(filePathXML) + + Dim RutaPDF As String = "" + + For Each filePathPDF As String In ListPDF + + Dim fInfoPDF As New FileInfo(filePathPDF) + + + Dim fxml As String = fInfoXML.Name.ToUpper().Replace(".XML", "") + Dim fpdf As String = fInfoPDF.Name.ToUpper().Replace(".PDF", "") + Dim fpdfSplit As String() = fpdf.Split("-"c) + + If fpdfSplit.Length >= 2 AndAlso fpdfSplit(0).Length = 18 Then + fpdf = fpdf.Replace($"{fpdfSplit(0)}-", "") + End If + + If fxml.Contains(fpdf) Or (ListXML.Count = 1 And ListPDF.Count = 1) Then + RutaPDF = fInfoPDF.FullName + Exit For + End If + + Next + + If File.Exists(filePathXML) Then + Dim a As New ComprobanteFactura("Log") + Dim FF As ADS.TareasProgramdas.Factura = a.CargaComprobanteXML(File.ReadAllText(filePathXML), UsuarioActual.Empresa.Ruta, UsuarioActual.Empresa.RFC, UsuarioActual.CveEmpresa, True, rowLog, NombreArchivo:=fInfoXML.Name, Validada:=Validada) + + If FF IsNot Nothing AndAlso FF.CveFactura > 0 Then + + If RutaPDF = "" Then + 'Dim Hilo As New System.Threading.Thread(Sub() ProcesarPDF(UsuarioActual, a, FF)) + ProcesarPDF(UsuarioActual, a, FF) + 'Hilo.Start() + Else + Dim PDfDestino As String = $"{UsuarioActual.Empresa.Ruta}\Compras\{FF.EmisorRFC}\{FF.CveFactura}.PDF" + If File.Exists(RutaPDF) Then + If File.Exists(PDfDestino) Then + File.Delete(PDfDestino) + End If + File.Move(RutaPDF, PDfDestino) + End If + End If + Else + ErrorFacturas = True + End If + End If + + DTLOG.Rows.Add(rowLog) + + Next + + sw.Stop() + swTiempo.AppendFormat("Fill ClsSisMail.ArchivoMail: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + + sw.Stop() + swTiempo.AppendFormat("BorrarInicio: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + sw.Start() + + + For Each s As String In ListXML + Try + File.Delete(s) + Catch ex As Exception + End Try + Next + + For Each s As String In ListComprimidos + Try + If Not ErrorFacturas Then + File.Delete(s) + GuardaLogAD($"Se elimina comprimido {s}") + End If + + Catch ex As Exception + End Try + Next + + sw.Stop() + swTiempo.AppendFormat("BorrarEnd: ({0}) {1} ", sw.ElapsedMilliseconds - swmili, sw.ElapsedMilliseconds) + swmili = sw.ElapsedMilliseconds + + 'GuardaLogefacturas(swTiempo.ToString()) + + 'mesajeFaturasSubidas(DTLOG) + + + 'CargaDatosBitacora() + + 'Alert(String.Format("Se cargaron {0} Facturas", Arreglo.Count), TipoMensaje.MsgInformacion) + End Sub + +End Class + + + + + + +Public Class GeneralesAPIeFacturas + + Inherits ADSNetLibraryzdT.HelpersE.ConexionesE.SIGAPIE.BaseSIGAPIeFacturas + + Public Sub New(ByVal Optional domainApi As String = "http://localhost:4001/", ByVal Optional token As String = "") + MyBase.New(domainApi, token) + End Sub + + Public Function GeneraSolicitud(CveEmpresa As Integer, CveTipoSolicitud As Integer, CveSolicitud As Integer) As Object + Return getData(Of Object)($"GeneraSolicitud/{CveEmpresa}/{CveTipoSolicitud}/{CveSolicitud}", Nothing, ADSNetLibraryzdT.HelpersE.ConexionesE.SIGAPIE.requestMethod.[GET], False) + End Function + + Public Function VerificaSolicitudesNominas(CveEmpresa As Integer, CveTipoSolicitud As Integer, CveSolicitud As Integer) As Object + Return getData(Of Object)($"VerificaSolicitudesNominas/{CveEmpresa}/{CveTipoSolicitud}/{CveSolicitud}", Nothing, ADSNetLibraryzdT.HelpersE.ConexionesE.SIGAPIE.requestMethod.[GET], False) + End Function + + Public Function CancelarSolicitud(CveEmpresa As Integer, CveSolicitud As Integer, CveUsuario As Integer) As Object + Return getData(Of Object)($"CancelarSolicitud/{CveEmpresa}/{CveSolicitud}/{CveUsuario}", Nothing, ADSNetLibraryzdT.HelpersE.ConexionesE.SIGAPIE.requestMethod.[GET], False) + End Function + +End Class + + +Namespace ADSNetLibraryzdT.HelpersE.ConexionesE.SIGAPIE + Public Enum requestMethod + POST = 1 + [GET] = 2 + End Enum + + Public Class BaseSIGAPIeFacturas + Private Const tituloLog As String = "ADSNetLibrary.Helpers.Conexiones.SIGAPI" + Public domainApi As String + Public authorization As String + Protected RouteController As String = "Generales" + Protected FullRoute As String = "" + + Public Function GetRoutbyclass() As String + Dim classname As String = Me.[GetType]().Name + Return classname.Substring(0, classname.Length - 12) + End Function + + Public Function GetRoute(ByVal path As String) As String + If String.IsNullOrEmpty(FullRoute) Then + Return String.Format("api/{0}/{1}", (If(String.IsNullOrEmpty(RouteController), GetRoutbyclass(), RouteController)), path) + Else + Return String.Format("{0}{1}", FullRoute, path) + End If + End Function + + Public Sub New(ByVal domainApi As String, ByVal Optional authorization As String = Nothing, ByVal Optional fullRoute As String = Nothing) + If String.IsNullOrEmpty(domainApi) Then + domainApi = "http://localhost:4001/" + End If + + Me.authorization = authorization + Me.domainApi = domainApi + Me.FullRoute = fullRoute + End Sub + + Public Async Function getDataAsync(Of T As {Class, New})(ByVal path As String, ByVal requestobject As Object, ByVal Optional reqmet As requestMethod = requestMethod.POST, ByVal Optional needauthorization As Boolean = True, ByVal Optional isfullpath As Boolean = False) As Task(Of T) + Dim objreturn As T = Nothing + + Using client As HttpClient = New HttpClient() + client.BaseAddress = New Uri(domainApi) + client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json")) + + If needauthorization Then + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", authorization) + End If + + client.Timeout = TimeSpan.FromMinutes(15) + Dim response As HttpResponseMessage = New HttpResponseMessage() + Dim strjsonreq As String = Newtonsoft.Json.JsonConvert.SerializeObject(requestobject) + Dim content As StringContent = New StringContent(strjsonreq, Encoding.UTF8, "application/json") + Dim route As String = If(isfullpath, path, GetRoute(path)) + + Try + + Select Case reqmet + Case requestMethod.POST + response = Await client.PostAsync(route, content) + Case requestMethod.[GET] + response = Await client.GetAsync(route) + End Select + + If response.IsSuccessStatusCode Then + Dim jsondata As String = Await response.Content.ReadAsStringAsync() + Dim settings As Newtonsoft.Json.JsonSerializerSettings = New Newtonsoft.Json.JsonSerializerSettings With { + .NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore, + .MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore + } + objreturn = Newtonsoft.Json.JsonConvert.DeserializeObject(Of T)(jsondata, settings) + Else + End If + + Catch e As Exception + End Try + End Using + + Return objreturn + End Function + + Public Function getData(Of T As {Class, New})(ByVal path As String, ByVal requestobject As Object, ByVal Optional reqmet As requestMethod = requestMethod.POST, ByVal Optional needauthorization As Boolean = True, ByVal Optional isfullpath As Boolean = False) As T + Return AsyncHelper.RunSync(Of T)(Function() getDataAsync(Of T)(path, requestobject, reqmet, needauthorization, isfullpath)) + End Function + End Class + + Friend Module AsyncHelper + Private ReadOnly _myTaskFactory As TaskFactory = New TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.[Default]) + + Function RunSync(Of TResult)(ByVal func As Func(Of Task(Of TResult))) As TResult + + 'Return AsyncHelper._myTaskFactory.StartNew(Of Task(Of TResult))(func).Unwrap(Of TResult)().GetAwaiter().GetResult() + Return AsyncHelper._myTaskFactory.StartNew(Of Task(Of TResult))(func).Unwrap().GetAwaiter().GetResult() + + + + End Function + + Sub RunSync(ByVal func As Func(Of Task)) + AsyncHelper._myTaskFactory.StartNew(Of Task)(func).Unwrap().GetAwaiter().GetResult() + End Sub + End Module + + + + + + + +End Namespace + + +Public Class ComprobanteFactura + + + + Private Property EsProduccion As Boolean = True + + + + + Public Property ArchivoLog As String + + Public Sub New(NombreArchivoLog As String) + ArchivoLog = NombreArchivoLog + End Sub + + Public Property Pagos As List(Of Pago) + Public Property XMLNodosPagos As String + Public Property XMLNodosPagosCount As Integer + Private Function CargaFactVersion33(CveEmpresa As Integer, ByRef node As XmlNode, ByRef nodo As XmlNode, ByRef XMLDoc As XmlDocument, ByVal Prefijo As String, ByRef namespaces As XmlNamespaceManager, ByVal VersionCFDI As String) As Factura + Dim Fact = New Factura() + Fact.Version = VersionCFDI + Fact.CveEmpresa = CveEmpresa + Fact.Serie = CaratecteresvalidosFolio(ValorXML(nodo, "serie")) + If Not String.IsNullOrEmpty(Fact.Serie) Then Fact.Serie = Fact.Serie + Fact.Folio = ValorXML(nodo, "folio").TrimStart("0"c) + Fact.Fecha = ValorXML(nodo, "fecha").ToDateTime + Fact.SubTotal = ValorXML(nodo, "subTotal").Replace("..", ".").ToDecimal + Fact.Total = ValorXML(nodo, "total").ToDecimal + Fact.Moneda = ValorXML(nodo, "Moneda") + Fact.MetododePago = ValorXML(nodo, "MetododePago") + Fact.TipoComprobante = ValorXML(nodo, "tipoDeComprobante") + Fact.TipoCambio = ValorXML(nodo, "TipoCambio", "1.0").ToDecimal + If Fact.TipoCambio < 1 Then Fact.TipoCambio = 1 + + If Fact.TipoComprobante = "P" Then + Dim PagoPrefix As String = "" + + If VersionCFDI = "3.3" Then + PagoPrefix = "pago10" + namespaces.AddNamespace("pago10", "http://www.sat.gob.mx/Pagos") + ElseIf VersionCFDI = "4.0" Then + PagoPrefix = "pago20" + namespaces.AddNamespace("pago20", "http://www.sat.gob.mx/Pagos20") + End If + + Dim NodoComplementos As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + Dim nodePagos As XmlNode = NodoComplementos.SelectSingleNode($"//{PagoPrefix}:Pagos", namespaces) + + For Each nPago As XmlNode In nodePagos.ChildNodes + Fact.Total = ValorXML(nPago, "Monto").ToDecimal + If VersionCFDI = "4.0" And nPago.LocalName.ToUpper() = "TOTALES" Then + Continue For + Else + Exit For + End If + Next + End If + + Fact.sUPPrefijo = Prefijo + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Emisor", Prefijo), namespaces) + + If node IsNot Nothing AndAlso node.Attributes.Count > 0 Then + Fact.EmisorRFC = ValorXML(node, "RFC").Trim() + Fact.EmisorNombre = ValorXML(node, "nombre") + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Receptor", Prefijo), namespaces) + + If node IsNot Nothing Then + Fact.ReceptorRFC = ValorXML(node, "RFC").Trim() + End If + + If XMLDoc.HasChildNodes Then + node = XMLDoc.ChildNodes(0).ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Impuestos", Prefijo), StringComparison.OrdinalIgnoreCase)).FirstOrDefault() + + If XMLDoc.ChildNodes.Count > 1 Then + node = XMLDoc.ChildNodes(1).ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Impuestos", Prefijo), StringComparison.OrdinalIgnoreCase)).FirstOrDefault() + End If + End If + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + + Try + Dim nodeRetenciones = node.ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Retenciones", Prefijo), StringComparison.OrdinalIgnoreCase)) + Fact.TotalRetenciones = ValorXML(node, "totalImpuestosRetenidos", "0").ToDecimal + + Try + Dim retenciones = nodeRetenciones.FirstOrDefault().ChildNodes + + For Each retencion As XmlNode In retenciones + Dim TipoImpuesto As String = ValorXML(retencion, "impuesto") + Dim importe As Decimal = ValorXML(retencion, "importe").ToDecimal + + If TipoImpuesto = "002" Then + Fact.RetencionIVA += importe + End If + + If TipoImpuesto = "001" Then + Fact.RetencionISR += importe + End If + Next + + Catch ex As Exception + End Try + + Fact.SumaTotalRetenciones += Fact.RetencionIVA + Fact.SumaTotalRetenciones += Fact.RetencionISR + Fact.TotalTraslados = ValorXML(node, "totalImpuestosTrasladados", "0").ToDecimal + Dim nodeTraslados = node.ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Traslados", Prefijo), StringComparison.OrdinalIgnoreCase)) + Dim traslados = nodeTraslados.FirstOrDefault().ChildNodes + + For Each traslado As XmlNode In traslados + Dim TipoImpuesto As String = ValorXML(traslado, "impuesto") + Dim importe As Decimal = ValorXML(traslado, "importe").ToDecimal() + + If TipoImpuesto = "003" Then + Fact.TrasladoIEPS += importe + End If + + If TipoImpuesto = "002" Then + Fact.TrasladoIVA += importe + End If + + If TipoImpuesto = "001" Then + Fact.TrasladoISR += importe + End If + Next + + Fact.SumaTotalTraslados += Fact.TrasladoIVA + Fact.TrasladoIEPS + Catch ex As Exception + ex.ToString().GuardaLogAD(ArchivoLog) + End Try + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) + Fact.UUID = ValorXML(nodeTFD, "UUID", "") + Dim nodeRF As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CFDIRegistroFiscal ", "registrofiscal"), namespaces) + + If nodeRF IsNot Nothing Then + Fact.Folio = ValorXML(nodeRF, "folio").TrimStart("0"c) + End If + Else + Fact.UUID = "" + + If String.IsNullOrEmpty(Fact.UUID) AndAlso Fact.sUPPrefijo.ToLower() = "cfdi" Then + 'Mensajes.AppendFormat("{0}|{1}|{2}|{3}|{4}|{5}{6}&", ValorXML(nodo, "serie"), ValorXML(nodo, "folio"), ValorXML(nodo, "fecha").ToDate().ToShortDateString(), Fact.EmisorNombre, ValorXML(nodo, "total").ToDouble().FormatoNumero(), "Factura no timbrada correctamente.", "") + 'CargaMensaje(ValorXML(nodo, "serie"), ValorXML(nodo, "folio"), ValorXML(nodo, "fecha").ToDate(), Fact.EmisorNombre, ValorXML(nodo, "total").ToDouble(), "Factura no timbrada correctamente.", CorreoActual, DateTime.Now, _EmiRFC, 0) + End If + + Fact = Nothing + End If + + If Fact.TipoComprobante = "P" Then + CargaPagos(XMLDoc) + End If + + Return Fact + End Function + + Private Sub CargaPagos(ByVal XMLDoc As XmlDocument) + Dim nodo = XMLDoc.DocumentElement + Dim Prefijo As String = If(String.IsNullOrEmpty(XMLDoc.DocumentElement.Prefix), "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "http://www.sat.gob.mx/cfd/3" + Dim namespaces As XmlNamespaceManager = New XmlNamespaceManager(XMLDoc.NameTable) + Dim Version = ValorXML(nodo, "version").Replace("..", ".") + Dim PrefijoPagos As String = "" + If Prefijo.ToLower() <> "cfdi" Then cfdVer = "http://www.sat.gob.mx/cfd/2" + + If Version = "3.3" Then + PrefijoPagos = "pago10" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/3" + namespaces.AddNamespace(Prefijo, cfdVer) + ElseIf Version = "4.0" Then + PrefijoPagos = "pago20" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos20") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/4" + namespaces.AddNamespace(Prefijo, cfdVer) + Else + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If Version = "3.2" Then + ElseIf Version = "3.3" OrElse Version = "4.0" Then + + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim NodosNodePagos As XmlNodeList = nodeComp.SelectNodes($"//{PrefijoPagos}:Pago", namespaces) + + If NodosNodePagos IsNot Nothing Then + + Try + Dim nodePagos As XmlNode = nodeComp.SelectSingleNode($"//{PrefijoPagos}:Pagos", namespaces) + + If Version = "3.3" Then + XMLNodosPagos = nodePagos.InnerXml.Replace("pago10:", "").Replace("pagos10:", "").Replace(PrefijoPagos & ":", "") + Else + XMLNodosPagos = nodePagos.InnerXml.Replace("pago20:", "").Replace("pagos20:", "").Replace(PrefijoPagos & ":", "") + End If + + Catch ex As Exception + ModExtensiones.GuardaLogAD(ex.ToString(), ArchivoLog) + End Try + End If + + Dim Pagos = New List(Of Pago)() + Dim FechaPago As Date + For Each nodePago As XmlNode In NodosNodePagos + + Try + FechaPago = ValorXML(nodePago, "FechaPago").ToDate() + Catch e As Exception + End Try + + Dim pago = New Pago() + pago.FechaPago = FechaPago + pago.FormaDePagoP = ValorXML(nodePago, "FormaDePagoP").ToString() + pago.MonedaP = ValorXML(nodePago, "MonedaP").ToString() + pago.Monto = ValorXML(nodePago, "Monto").ToString().ToDecimal() + Dim docs = New List(Of DoctoRelacionado)() + Dim NodosPagosRelacionados As XmlNodeList = nodePago.SelectNodes($"//{PrefijoPagos}:DoctoRelacionado", namespaces) + + For Each docto As XmlNode In NodosPagosRelacionados + Dim idDoc = ValorXML(docto, "idDocumento") + Dim ImportePago = ValorXML(docto, "ImpPagado").ToDecimal() + Dim serie = ValorXML(docto, "Serie") + Dim Folio = ValorXML(docto, "Folio") + Dim MonedaDR = ValorXML(docto, "MonedaDR") + Dim MetodoDePagoDR = ValorXML(docto, "MetodoDePagoDR") + Dim NumParcialidad = ValorXML(docto, "NumParcialidad") + Dim ImpSaldoInsoluto = ValorXML(docto, "ImpSaldoInsoluto").ToDecimal() + Dim ImpSaldoAnt = ValorXML(docto, "ImpSaldoAnt").ToDecimal() + docs.Add(New DoctoRelacionado() With { + .idDocumento = idDoc, + .ImportePago = ImportePago, + .Serie = serie, + .Folio = Folio, + .MonedaDR = MonedaDR, + .MetodoDePagoDR = MetodoDePagoDR, + .NumParcialidad = NumParcialidad, + .ImpSaldoAnt = ImpSaldoAnt, + .ImpSaldoInsoluto = ImpSaldoInsoluto + }) + Next + + pago.Documentos = docs + Pagos.Add(pago) + Next + + Me.Pagos = Pagos + End If + End If + End Sub + 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 + Private Function CaratecteresvalidosFolio(ByVal Folio As String) As String + Dim Respuesta As String = "" + + 'For Each c As Char In Folio.ToArray() + + ' If (c >= 48 AndAlso c <= 57) OrElse (c >= 65 AndAlso c <= 90) OrElse (c >= 97 AndAlso c <= 122) Then + ' Respuesta += c + ' End If + 'Next + Return Respuesta + End Function + + 'Private Sub CargaDesdeString(StrFuente As String) + ' Dim XMLCargaExistosa As Boolean = False + ' Dim XMlStr As String = StrFuente.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 + Public Function CargaComprobanteXML(StrFuente As String, DirectorioEmpresa As String, RFCEmpresa As String, CveEmpresa As Integer, Registrar As Boolean, ByRef rowLog As DataRow, NombreArchivo As String, Optional Validada As Integer = 0) As Factura + + + Dim SeValido As Boolean = False + Dim XMLCargaExistosa As Boolean = False + Dim XMlStr As String = StrFuente.Replace("<br>", "").Replace("<", "").Replace("o;?", "") + Dim XMLDoc As New XmlDocument + + Try + XMLDoc.LoadXml(XMlStr) + XMLCargaExistosa = True + Catch ex As Exception + GuardaLogAD("Error al intentar leer . Error:" & ex.ToString(), ArchivoLog) + 'Errores.AppendLine("Error al intentar leer el XML. Error:" & ex.ToString()) + XMLCargaExistosa = False + End Try + + If Not XMLCargaExistosa Then + rowLog("Motivo") = $"Error extructura XML archivo {NombreArchivo}" + Return Nothing + End If + + Dim nodo As XmlNode = XMLDoc.DocumentElement + Dim Fact As Factura = New Factura() + Fact.Serie = ValorXML(nodo, "serie") + + Dim StrCFDIVersion As String = ValorXML(nodo, "version") + + Fact.Version = StrCFDIVersion + + Fact.Folio = ValorXML(nodo, "folio") + Fact.Fecha = ValorXML(nodo, "fecha").ToDate + Fact.SubTotal = ValorXML(nodo, "subTotal").ToDecimal + Fact.Total = ValorXML(nodo, "total").ToDecimal + Fact.Descuento = ValorXML(nodo, "descuento").ToDecimal + Fact.Moneda = ValorXML(nodo, "Moneda") + Fact.CveMoneda = ClsPaginas.GlobalDTMonedas().FiltroPrimeroValor("CveMoneda", $" AbreviaturaSAT = '{Fact.Moneda}' ").ToEntero + Fact.TipoComprobante = ValorXML(nodo, "tipoDeComprobante") + Fact.TipoCambio = ValorXML(nodo, "TipoCambio", "1").ToDecimal + Fact.noCertificado = ValorXML(nodo, "NoCertificado") + Fact.FormaDePago = ValorXML(nodo, "formaDePago") + Fact.condicionesDePago = ValorXML(nodo, "condicionesDePago", "") + Fact.NumCtaPagoNumCtaPago = ValorXML(nodo, "NumCtaPago", "") + + If Fact.Version = "3.3" Or Fact.Version = "4.0" Then + Dim drm As DataRow = ClsPaginas.GlobalDTVtaMetodoPago.FiltroPrimero(String.Format("ClaveMetodoPagoSAT = '{0}'", ValorXML(nodo, "MetodoPago"))) + If drm IsNot Nothing Then + Fact.MetododePago = 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 StrCFDIVersion = "3.2" Then + Prefijo = "cfd" + cfdVer = "http://www.sat.gob.mx/cfd/2" + ElseIf StrCFDIVersion = "3.3" 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") + + Fact.sUPPrefijo = Prefijo + + If StrCFDIVersion = "3.2" Then + + For i As Integer = 0 To XMLDoc.DocumentElement.ChildNodes(2).ChildNodes.Count - 1 + nodo = XMLDoc.DocumentElement.ChildNodes(2).ChildNodes(i) + Fact.AddPS(Convert.ToDouble(nodo.Attributes.GetNamedItem("cantidad").Value), nodo.Attributes.GetNamedItem("unidad").Value, nodo.Attributes.GetNamedItem("descripcion").Value, Convert.ToDouble(nodo.Attributes.GetNamedItem("valorUnitario").Value), 0, Convert.ToDouble(nodo.Attributes.GetNamedItem("importe").Value)) + Next + + Try + + Dim nodosEmisor = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().FirstOrDefault(Function(n) n.Name.Equals("cfdi:Emisor", StringComparison.OrdinalIgnoreCase)) + + Dim nodoEmisor As XmlNode = nodosEmisor + + Fact.EmiRFC = ValorXML(nodoEmisor, "rfc", "") + Fact.EmiNombre = ValorXML(nodoEmisor, "nombre", "") + + nodoEmisor = nodosEmisor.ChildNodes(0) + Fact.DomFisCalle = ValorXML(nodoEmisor, "calle", "") + Fact.DomFisNoExt = ValorXML(nodoEmisor, "noExterior", "") + Fact.DomFisCol = ValorXML(nodoEmisor, "colonia", "") + Fact.DomFisCP = ValorXML(nodoEmisor, "codigoPostal", "") + Fact.DomFisMun = ValorXML(nodoEmisor, "municipio", "") + Fact.DomFisLoc = ValorXML(nodoEmisor, "localidad", "") + Fact.DomFisEst = ValorXML(nodoEmisor, "estado", "") + Fact.DomFisPais = ValorXML(nodoEmisor, "pais", "") + + nodoEmisor = nodosEmisor.ChildNodes(1) + Fact.ExpEnCalle = ValorXML(nodoEmisor, "calle", "") + Fact.ExpEnNoExt = ValorXML(nodoEmisor, "noExterior", "") + Fact.ExpEnCol = ValorXML(nodoEmisor, "colonia", "") + Fact.ExpEnCP = ValorXML(nodoEmisor, "codigoPostal", "") + Fact.ExpEnMun = ValorXML(nodoEmisor, "municipio", "") + Fact.ExpEnLoc = ValorXML(nodoEmisor, "localidad", "") + Fact.ExpEnEst = ValorXML(nodoEmisor, "estado", "") + Fact.ExpEnPais = ValorXML(nodoEmisor, "pais", "") + + nodoEmisor = nodoEmisor.ChildNodes(2) + Fact.Regimen = ValorXML(nodo, "Regimen", "") + Catch ex As Exception + Throw New Exception($"Error CargaEmisorXML - {ex.Message} - {ex.StackTrace}") + End Try + + Try + Dim nodosReceptor = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().FirstOrDefault(Function(n) n.Name.Equals("cfdi:Receptor", StringComparison.OrdinalIgnoreCase)) + + Dim nodoReceptor As XmlNode = nodosReceptor + Fact.RecRfc = ValorXML(nodoReceptor, "rfc", "") + Fact.RecNombre = ValorXML(nodoReceptor, "nombre", "") + + nodoReceptor = nodosReceptor.ChildNodes(0) + Fact.DomRecCalle = ValorXML(nodoReceptor, "calle", "") + Fact.DomRecFisNoExt = ValorXML(nodoReceptor, "noExterior", "") + Fact.DomRecFisNoInt = ValorXML(nodoReceptor, "noInterior", "") + Fact.DomRecCol = ValorXML(nodoReceptor, "colonia", "") + Fact.DomRecCP = ValorXML(nodoReceptor, "codigoPostal", "") + Fact.DomRecMun = ValorXML(nodoReceptor, "municipio", "") + Fact.DomRecLoc = ValorXML(nodoReceptor, "localidad", "") + Fact.DomRecEst = ValorXML(nodoReceptor, "estado", "") + Fact.DomRecPais = ValorXML(nodoReceptor, "pais", "") + Catch ex As Exception + Throw New Exception($"Error CargaReceptorXML - {ex.Message} - {ex.StackTrace}") + End Try + + + ElseIf StrCFDIVersion = "3.3" OrElse StrCFDIVersion = "4.0" Then + Try + Dim nodos = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().Where(Function(n) n.Name.Equals("cfdi:Conceptos", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().ChildNodes + + For Each item As XmlNode In nodos + Dim cantidad = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("cantidad", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + Dim unidad = item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("ClaveUnidad", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value + Dim descripcion = item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("descripcion", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value + Dim valorUnitario = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("valorUnitario", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + Dim importe = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("importe", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + + Fact.AddPS(cantidad, unidad, descripcion, valorUnitario, 0, importe) + Next + Catch ex As Exception + Throw New Exception($"Error CargaConceptosXML - {ex.Message} - {ex.StackTrace}") + End Try + End If + + + + If Fact.TipoComprobante.ToUpper = "E" AndAlso (Fact.Version.Contiene("3.3", "4.0")) 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 + End If + + Dim node As XmlNode + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Emisor", Prefijo), namespaces) + + If node IsNot Nothing Then + Fact.EmisorRFC = ValorXML(node, "RFC") + Fact.EmisorNombre = ValorXML(node, "Nombre") + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Receptor", Prefijo), namespaces) + + If node IsNot Nothing Then + Fact.ReceptorRFC = ValorXML(node, "RFC") + 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) + + If Fact.Version.Contiene("3.3", "4.0") Then + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("Impuesto").Value = "002" Then Fact.RetencionIVA += retencion.Attributes("Importe").Value.ToDecimal + If retencion.Attributes("Impuesto").Value = "001" Then Fact.RetencionISR += retencion.Attributes("Importe").Value.ToDecimal + Next + + Else + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("impuesto").Value = "IVA" Then Fact.RetencionIVA += retencion.Attributes("importe").Value.ToDecimal + If retencion.Attributes("impuesto").Value = "ISR" Then Fact.RetencionISR += retencion.Attributes("importe").Value.ToDecimal + Next + End If + + Dim nodeTraslados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Traslados/{0}:Traslado", Prefijo), namespaces) + + If Fact.Version.Contiene("3.3", "4.0") Then + + For Each traslado As XmlNode In nodeTraslados + + If traslado.Attributes("Importe") IsNot Nothing Then + If traslado.Attributes("Impuesto").Value = "002" Then Fact.TrasladoIVA += traslado.Attributes("Importe").Value.ToDecimal + If traslado.Attributes("Impuesto").Value = "003" Then Fact.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 Fact.TrasladoIVA += traslado.Attributes("importe").Value.ToDecimal + + If traslado.Attributes("impuesto").Value = "IEPS" Then Fact.TrasladoIEPS += traslado.Attributes("importe").Value.ToDecimal + End If + Next + End If + + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + + Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) + Fact.UUID = ValorXML(nodeTFD, "UUID", "") + + Dim nodeRF As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CFDIRegistroFiscal ", "registrofiscal"), namespaces) + If nodeRF IsNot Nothing Then + Fact.Folio = ValorXML(nodeRF, "folio").TrimStart("0"c) + End If + End If + + If Fact.TipoComprobante = "P" Then + CargaPagos(XMLDoc, Fact) + End If + + rowLog("Serie") = Fact.Serie + rowLog("Folio") = Fact.Folio + rowLog("Fecha") = Fact.Fecha + rowLog("Proveedor") = Fact.EmisorNombre + rowLog("Importe") = Fact.Total + rowLog("Motivo") = "" + + rowLog("RFCde") = Fact.EmisorRFC + rowLog("Estatus") = 0 + rowLog("Tipo") = Fact.TipoComprobante + + + + If Registrar Then + + If Fact.ReceptorRFC = RFCEmpresa Then + + Fact.Validada = Validada + + Dim ObjCompra As New ClsCompras + Dim Correcto As Boolean = False + + ObjCompra.IniciaTransacSQL() + + Fact.RespuestaInsert = ObjCompra.AddFactura(Fact.Serie, Fact.Folio, Fact.Fecha, Fact.EmisorNombre, Fact.EmisorRFC, Fact.SubTotal, Fact.TrasladoIVA, Fact.Total, Fact.UUID, Fact.ReceptorRFC, "", "", Fact.Version, Fact.Descuento, Fact.TipoCambio, Fact.Validada, CveEmpresa, Fact.sUPPrefijo, Fact.TipoComprobante, Fact.Moneda, Fact.MetododePago, 3, Fact.Version, Fact.IEPS, Fact.RetencionIVA, Fact.RetencionISR) + + If Fact.RespuestaInsert >= 0 Then + + rowLog("Estatus") = 1 + + Dim Destino As String = $"{DirectorioEmpresa}\Compras\" + + Try + If Not Directory.Exists(Destino & Fact.EmisorRFC) Then + Directory.CreateDirectory(Destino & Fact.EmisorRFC) + End If + + Select Case Fact.RespuestaInsert + Case 0 + Dim RRutaDestino As String = String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura) + ModExtensiones.GuardaLogAD(String.Format(" '--------{0} Compra ya insertada : {1}{2} - {3}", 1, Fact.Serie, Fact.Folio, RRutaDestino), ArchivoLog) + + File.WriteAllText(RRutaDestino, StrFuente, UTF8Encoding.UTF8) + 'ObjCompra.UpdateArchivo(ObjCompra.CveFactura, "XML") + ModExtensiones.GuardaLogAD(" '--------XML Actualizado ", ArchivoLog) + rowLog("Motivo") = $"Ya registrado {Fact.Serie}-{Fact.Folio} se actualiza XML." + + Correcto = True + Exit Select + + Case 1 + + Dim StrMover As String = "" + Try + File.WriteAllText(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura), StrFuente, UTF8Encoding.UTF8) + ' ObjCompra.UpdateArchivo(ObjCompra.CveFactura, "XML") + ModExtensiones.GuardaLogAD($" '-------- XML Guardado Factura: {Fact.Serie}-{Fact.Folio} UUID: {Fact.UUID} , RFC Emisor: {Fact.EmisorRFC}", ArchivoLog) + + ' Si se movieron los dos archivos, los marca como correcto + If File.Exists(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura)) Then + Correcto = True + Else + Correcto = False + End If + + ModExtensiones.GuardaLogAD(" '++++++++ Compra Insertada :" & Fact.Serie & Fact.Folio & " - Correcto:" & If(Correcto, "Si", "No" & " Obs: "), ArchivoLog) + rowLog("Motivo") = $"Agregado {Fact.Serie}-{Fact.Folio}" + + Catch ex As Exception + StrMover = ex.Message + Correcto = False + ModExtensiones.GuardaLogAD(" '++++++++ Compra no Insertada :" & Fact.Serie & Fact.Folio & " - Correcto:" & If(Correcto, "Si", "No" & " Obs: ") & StrMover, ArchivoLog) + rowLog("Motivo") = $"Error al agregar {Fact.Serie}-{Fact.Folio}" + End Try + + Exit Select + End Select + + Catch ex As Exception + Correcto = True + GuardaLogAD(ex.ToString(), ArchivoLog) + End Try + + + ElseIf Fact.RespuestaInsert = 0 AndAlso Fact.CveFactura > 0 Then + 'FIXME OIC + Else + rowLog("Motivo") = $"RFC ""{Fact.ReceptorRFC}"" Error al insertar" + End If + + + If Correcto Then + ObjCompra.Commit() + Fact.CveFactura = ObjCompra.CveFactura + Fact.ArchivoXML = $"{ObjCompra.CveFactura}.xml" + Else + ObjCompra.RollBack() + End If + + ObjCompra.Dispose() + + Else + ModExtensiones.GuardaLogAD($" '++++++++ Compra RFC Distinto RFC Empresa: {RFCEmpresa}, RFC XML: {Fact.ReceptorRFC} ", ArchivoLog) + rowLog("Motivo") = "RFC Distinto" + rowLog("Motivo") = $"RFC ""{Fact.ReceptorRFC}"" Incorrecto" + End If + + End If + + + Return Fact + End Function + + + + + + Public Function GeneraPDF(UsuarioActual As Usuario, ByVal Ruta As String, ByVal Fact As Factura, DirectorioEmpresa As String, Guardar As Boolean) As Boolean + Dim RutaXML As String = String.Empty + Dim RutaPDF As String = String.Empty + Dim Retorno As Boolean = False + Try + Dim XMLDoc As New XmlDocument() + Dim TmpArchivoPDF As String = $"{Ruta}\Temp\Facturas\{Path.GetFileNameWithoutExtension(Fact.ArchivoXML)}-ttt.pdf" + Dim TmpArchivoQR As String = $"{Ruta}\Temp\Facturas\{Path.GetFileNameWithoutExtension(Fact.ArchivoXML)}-ttt.jpg" + Dim ArchivoXML As String = String.Format("{0}\Compras\{2}\{1}", DirectorioEmpresa, Fact.ArchivoXML, Fact.EmisorRFC) + Dim ArchivoPDF As String = String.Format("{0}\Compras\{2}\{1}.pdf", DirectorioEmpresa, Fact.CveFactura, Fact.EmisorRFC) + Dim dtotal As Decimal = If(Fact.Total <= 0.0D, 0.0001D, Fact.Total) + Dim cfdi As New RVCFDI33.GeneraCFDI() + + Try + Dim b As Byte() = cfdi.ConvertirQrCode(String.Format("?re={0}&rr={1}&tt={2}&id={3}", Fact.EmisorRFC, Fact.ReceptorRFC, String.Format("{0,12:F6}", dtotal).Trim(), Fact.UUID)) + File.WriteAllBytes(TmpArchivoQR, b) + Catch ex As Exception + ModExtensiones.GuardaLogAD(ex.Message, ArchivoLog) + End Try + + If System.IO.File.Exists(TmpArchivoQR) Then + Dim TipoDocto As String = "" + If Fact.Version = "3.3" Or Fact.Version = "4.0" Then + Select Case Fact.TipoComprobante + Case "I" + TipoDocto = "Ing" + Case "E" + TipoDocto = "Egs" + Case "P" + TipoDocto = "Pag" + Case "T" + TipoDocto = "Tra" + Case Else + End Select + Else + TipoDocto = Fact.TipoComprobante + End If + + 'Dim DtPagos As DataTable = Nothing + 'Dim DtDocumentosR As DataTable = Nothing + + If Fact.TipoComprobante.Contiene("P", "T") Then + ModExtensiones.GuardaLogAD(String.Format(" '--------PDF Generar Tipo {0}", Fact.TipoComprobante), ArchivoLog) + Retorno = GenGoPdf(ArchivoXML, TmpArchivoPDF, DirectorioEmpresas) + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + + Try + If Guardar Then + If File.Exists(ArchivoPDF) Then + File.Delete(ArchivoPDF) + End If + File.Move(TmpArchivoPDF, ArchivoPDF) + End If + Retorno = True + Catch ex As Exception + Retorno = False + End Try + + Else + + If (Fact.Version = "3.3" Or Fact.Version = "4.0") Then + Dim cxml As XmlSatCFDI = XmlSatCFDI.readXML(ArchivoXML, ArchivoLog) + ModExtensiones.GuardaLogAD(String.Format(" *********** UUID : {0} ***********", cxml.complemento.UUID), ArchivoLog) + cxml.ImprimirPDF(UsuarioActual, TmpArchivoPDF, DirectorioEmpresa, Fact.TipoComprobante) + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + + Try + If Guardar Then + If File.Exists(ArchivoPDF) Then + File.Delete(ArchivoPDF) + End If + File.Move(TmpArchivoPDF, ArchivoPDF) + End If + Retorno = True + Catch ex As Exception + Retorno = False + End Try + + Else + ModExtensiones.GuardaLogAD(String.Format(" *********** TFDUUID : {0} ***********", Fact.UUID), ArchivoLog) + Dim DomFiscal As String = String.Format("Domicilio Fiscal {0}{1} {2}{0}Col.{3}{0}CP. {4} {5},{6},{7}", vbCr, Fact.DomFisCalle, Fact.DomFisNoExt, Fact.DomFisCol, Fact.DomFisCP, Fact.DomFisMun, Fact.DomFisEst, Fact.DomFisPais) + + If GeneraPDFNew(UsuarioActual, TmpArchivoPDF, Fact.UUID, Fact.SubTotal, Fact.Descuento, Fact.Total, Fact.TrasladoIVA.FormatoNumero(), Fact.Moneda, Fact.FormaDePago, Fact.TFDNoCertSAT, Fact.TFDFechaTimbrado.ToDate(), Fact.noCertificado, + Fact.DTConceptos, Fact.TFDSelloCFD, Fact.TFDSelloSAT, TmpArchivoQR, Fact.Serie + Fact.Folio, Fact.TipoComprobante, "", Fact.ReceptorRFC, Fact.RecNombre, Fact.DomRecCalle, Fact.DomRecCol, Fact.DomRecFisNoExt, + Fact.DomRecFisNoInt, Fact.DomRecCP, Fact.DomRecMun, Fact.DomRecEst, Fact.Regimen, Fact.condicionesDePago, Fact.MetododePago, Fact.NumCtaPagoNumCtaPago, DateTime.Now, Fact.DtPagos, Fact.DtDocumentosR, Fact.RetencionIVA, + Fact.RetencionISR, Fact.EmiNombre, Fact.EmiRFC, Fact.ReceptorNombre, DirectorioEmpresa, DomFiscal) Then + + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + Retorno = True + + If Guardar Then + + End If + + End If + + + + End If + + File.Delete(TmpArchivoQR) + + End If + + RutaPDF = TmpArchivoPDF + Else + Retorno = False + + End If + 'If DTConceptos IsNot Nothing Then DTConceptos.Dispose() + Catch ex As Exception + Dim MensajeError As String = "***********Ocurrio un error al generar el pdf: " & ex.Message & "" + + If ex.InnerException Is Nothing Then + MensajeError &= "." + Else + MensajeError &= " - " & ex.InnerException.ToString() + End If + + ModExtensiones.GuardaLogAD(MensajeError, ArchivoLog) + End Try + Return Retorno + End Function + + + Private Function GeneraPDFNew(UsuarioActual As Usuario, ByVal TmpArchivoPDF As String, ByVal FolioFiscal As String, ByVal SubTotal As Decimal, ByVal Descuento As Decimal, ByVal Total As Decimal, ByVal IVA As String, ByVal Moneda As String, ByVal FormaDePago As String, + ByVal NoSerieCertificado As String, ByVal FechaCertificacion As DateTime, ByVal NoSerieCertificadoContribuyente As String, ByVal DTConceptos As DataTable, ByVal SelloCFDi As String, ByVal SelloSAT As String, + ByVal CBB As String, ByVal Folio As String, ByVal TipodeComprobante As String, ByVal CadenaOriginalCFD As String, ByVal RFC As String, ByVal Cliente As String, ByVal Direccion As String, ByVal Colonia As String, + ByVal NoExt As String, ByVal NoInt As String, ByVal CP As String, ByVal Ciudad As String, ByVal Estado As String, ByVal Regimen As String, ByVal CondicionPago As String, ByVal MetodoPago As String, ByVal NumCtaPago As String, + ByVal fecha As DateTime, Optional ByVal DtPagos As DataTable = Nothing, Optional ByVal DtRelacionados As DataTable = Nothing, Optional ByVal RetIVA As Double = 0, Optional ByVal RetISR As Double = 0, + Optional EmiNombre As String = "", Optional EmiRFC As String = "", Optional NombreEmpresa As String = "", Optional DirectorioEmpresa As String = "", Optional DomFiscal As String = "") As Boolean + + + Dim RutaRDLC As String = If(TipodeComprobante = "Pag", "Grales\Formatos\CFDIPago.rdlc", "Grales\Formatos\CFDI.rdlc") + + Dim Retorno As Boolean = False + Dim NombreArchivo As String = TmpArchivoPDF + Dim CadenaOriginal As String = "||1.0|" & FolioFiscal & "|" & FechaCertificacion.ToString("yyyy-MM-dd") & "T" & FechaCertificacion.ToString("HH:mm:ss") & "|" & SelloCFDi & "|" & NoSerieCertificado & "||" + Dim RutaFormato As String = RutaRDLC + + + Try + Dim Archivo As New System.IO.FileInfo(RutaFormato) + + If Archivo.Exists Then + Dim parametros As New List(Of ReportParameter)() + parametros.Add(New ReportParameter("FolioFiscal", FolioFiscal)) + parametros.Add(New ReportParameter("SubTotal", SubTotal.FormatoNumero())) + parametros.Add(New ReportParameter("Descuento", Descuento.FormatoNumero())) + parametros.Add(New ReportParameter("Total", Total.FormatoNumero())) + parametros.Add(New ReportParameter("IVA", IVA.FormatoNumero())) + parametros.Add(New ReportParameter("RetIVA", RetIVA.FormatoNumero())) + parametros.Add(New ReportParameter("RetISR", RetISR.FormatoNumero())) + parametros.Add(New ReportParameter("Moneda", Moneda)) + parametros.Add(New ReportParameter("FormaDePago", FormaDePago)) + parametros.Add(New ReportParameter("NoSerieCertificado", NoSerieCertificado)) + parametros.Add(New ReportParameter("FechaCertificacion", FechaCertificacion.ToString("yyyy-MM-dd") & "T" & FechaCertificacion.ToString("HH:mm:ss"))) + parametros.Add(New ReportParameter("NoSerieCertificadoContribuyente", NoSerieCertificadoContribuyente)) + parametros.Add(New ReportParameter("SelloCFDi", SelloCFDi)) + parametros.Add(New ReportParameter("SelloSAT", SelloSAT)) + parametros.Add(New ReportParameter("CBB", String.Format("file:///{0}", CBB))) + parametros.Add(New ReportParameter("Folio", Folio)) + parametros.Add(New ReportParameter("TipodeComprobante", TipodeComprobante.ToUpper())) + parametros.Add(New ReportParameter("CadenaOriginalCFD", CadenaOriginalCFD)) + parametros.Add(New ReportParameter("RFC", RFC)) + parametros.Add(New ReportParameter("Cliente", Cliente)) + parametros.Add(New ReportParameter("Direccion", Direccion)) + parametros.Add(New ReportParameter("Colonia", Colonia)) + parametros.Add(New ReportParameter("NoExt", NoExt)) + parametros.Add(New ReportParameter("NoInt", NoInt)) + parametros.Add(New ReportParameter("CP", CP)) + parametros.Add(New ReportParameter("Ciudad", Ciudad)) + parametros.Add(New ReportParameter("Estado", Estado)) + parametros.Add(New ReportParameter("Regimen", Regimen)) + parametros.Add(New ReportParameter("CondicionPago", CondicionPago)) + parametros.Add(New ReportParameter("MetodoPago", MetodoPago)) + parametros.Add(New ReportParameter("NumCtaPago", NumCtaPago)) + parametros.Add(New ReportParameter("fecha", fecha.ToString("yyyy-MM-dd") & "T" & fecha.ToString("HH:mm:ss"))) + parametros.Add(New ReportParameter("Fiscal", DomFiscal)) + parametros.Add(New ReportParameter("EmiNombre", EmiNombre)) + parametros.Add(New ReportParameter("EmiRFC", EmiRFC)) + parametros.Add(New ReportParameter("TotalLetra", ModExtensiones.Texto2Letras(Total))) + parametros.Add(New ReportParameter("Empresa", NombreEmpresa)) + + + Dim listaDs As New List(Of ReportDataSource) + + Dim rds1 As New ReportDataSource() + rds1.Name = "DsOC" + rds1.Value = DTConceptos + + 'MR.LocalReport.DataSources.Add(rds1) + listaDs.Add(rds1) + + If DtPagos IsNot Nothing Then + Dim rds2 As New ReportDataSource() + rds2.Name = "DsPago" + rds2.Value = DtPagos + 'MR.LocalReport.DataSources.Add(rds2) + listaDs.Add(rds2) + End If + + If DtRelacionados IsNot Nothing Then + Dim rds3 As New ReportDataSource() + rds3.Name = "DsDocRelacionados" + rds3.Value = DtRelacionados + 'MR.LocalReport.DataSources.Add(rds3) + listaDs.Add(rds3) + End If + + + Dim bytes As Byte() = Nothing + + bytes = StreamPDF(UsuarioActual, RutaRDLC, listaDs, parametros, NombreArchivo:=NombreArchivo, Formato:="PDF") + If bytes IsNot Nothing Then + Using fs As New FileStream(NombreArchivo, FileMode.Create) + fs.Write(bytes, 0, bytes.Length) + fs.Close() + End Using + Retorno = True + Else + Retorno = False + End If + Else + ModExtensiones.GuardaLogAD("ERROR: No existe Formato Base", ArchivoLog) + End If + Catch ex As Exception + ModExtensiones.GuardaLogAD(String.Format("Ocurrio un Error al generar el reporte RLDC :" & ex.ToString()), ArchivoLog) + Retorno = False + End Try + Return Retorno + End Function + + + Private Sub CargaPagos(ByVal XMLDoc As XmlDocument, ByRef Fact As Factura) + + Fact.Pagos.Clear() + + Dim nodo = XMLDoc.DocumentElement + + Dim Prefijo As String = If(String.IsNullOrEmpty(XMLDoc.DocumentElement.Prefix), "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "http://www.sat.gob.mx/cfd/3" + Dim namespaces As New XmlNamespaceManager(XMLDoc.NameTable) + + Dim Version As String = ValorXML(nodo, "version").Replace("..", ".") + Dim PrefijoPagos As String = "" + + If Prefijo.ToLower() <> "cfdi" Then + cfdVer = "http://www.sat.gob.mx/cfd/2" + End If + + If Version = "3.3" Then + PrefijoPagos = "pago10" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/3" + namespaces.AddNamespace(Prefijo, cfdVer) + ElseIf Version = "4.0" Then + PrefijoPagos = "pago20" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos20") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/4" + namespaces.AddNamespace(Prefijo, cfdVer) + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If Version = "3.3" OrElse Version = "4.0" Then + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim NodosNodePagos As XmlNodeList = nodeComp.SelectNodes($"//{PrefijoPagos}:Pago", namespaces) + + If NodosNodePagos IsNot Nothing Then + Try + Dim nodePagos As XmlNode = nodeComp.SelectSingleNode($"//{PrefijoPagos}:Pagos", namespaces) + If Version = "3.3" Then + XMLNodosPagos = nodePagos.InnerXml.Replace("pago10:", "").Replace("pagos10:", "").Replace(PrefijoPagos & ":", "") + Else + XMLNodosPagos = nodePagos.InnerXml.Replace("pago20:", "").Replace("pagos20:", "").Replace(PrefijoPagos & ":", "") + End If + Catch ex As Exception + ModExtensiones.GuardaLogAD(ex.ToString(), ArchivoLog) + End Try + End If + + Dim Pagos As New List(Of Pago)() + For Each nodePago As XmlNode In NodosNodePagos + Dim FechaPago As DateTime = DateTime.Now + Try + FechaPago = ValorXML(nodePago, "FechaPago").ToDate() + Catch e As Exception + End Try + + Dim pago As New Pago() + pago.FechaPago = FechaPago + pago.FormaDePagoP = ValorXML(nodePago, "FormaDePagoP").ToString() + pago.MonedaP = ValorXML(nodePago, "MonedaP").ToString() + pago.Monto = ValorXML(nodePago, "Monto").ToString().ToDecimal() + + Dim docs As New List(Of DoctoRelacionado)() + Dim NodosPagosRelacionados As XmlNodeList = nodePago.SelectNodes($"//{PrefijoPagos}:DoctoRelacionado", namespaces) + + For Each docto As XmlNode In NodosPagosRelacionados + Dim idDoc = ValorXML(docto, "idDocumento") + Dim ImportePago = ValorXML(docto, "ImpPagado").ToDecimal() + Dim serie = ValorXML(docto, "Serie") + Dim Folio = ValorXML(docto, "Folio") + Dim MonedaDR = ValorXML(docto, "MonedaDR") + Dim MetodoDePagoDR = ValorXML(docto, "MetodoDePagoDR") + Dim NumParcialidad = ValorXML(docto, "NumParcialidad") + Dim ImpSaldoInsoluto = ValorXML(docto, "ImpSaldoInsoluto").ToDecimal() + Dim ImpSaldoAnt = ValorXML(docto, "ImpSaldoAnt").ToDecimal() + docs.Add(New DoctoRelacionado() With { + .idDocumento = idDoc, + .ImportePago = ImportePago, + .Serie = serie, + .Folio = Folio, + .MonedaDR = MonedaDR, + .MetodoDePagoDR = MetodoDePagoDR, + .NumParcialidad = NumParcialidad, + .ImpSaldoAnt = ImpSaldoAnt, + .ImpSaldoInsoluto = ImpSaldoInsoluto + }) + Next + + pago.Documentos = docs + Pagos.Add(pago) + Next + Fact.Pagos = Pagos + End If + End If + End Sub + + + Private Function GenGoPdf(ByVal XmlRutaArchivo As String, ByVal PDFRutaArchivo As String, DirectorioEmpresa As String) As Boolean + ModExtensiones.GuardaLogAD(" '--------PDF GenGoPdf Inicia ", ArchivoLog) + + Dim Respuesta As Boolean = False + Dim RutaRDLC As String = $"{DirectorioEmpresa}\Grales\Formatos\ReciboDePagoGOPDF.rdlc" 'String.Format("{0}{1}", Extensiones.ApplicationParameter.RutaArchivos, "Empresas\Grales\Formatos\ReciboDePagoGOPDF.rdlc") + + Dim Inicio As DateTime = DateTime.Now + Dim goPdf As New GoPdf.GoPdf() + Dim logotipo As Byte() = Nothing 'File.ReadAllBytes(@"C:\inetpub\WWWSIGGit\Empresas\119\Logo.jpg") + + Try + Dim XmlString As String = File.ReadAllText(XmlRutaArchivo) + Dim result As Byte() = goPdf.ExportarPdf(XmlString, logotipo, "", RutaRDLC, New GoPdf.Modelos.DatosAdicionales() With {.DomicilioReceptor = ""}) + + Dim Fin As DateTime = DateTime.Now + If result IsNot Nothing Then + File.WriteAllBytes(PDFRutaArchivo, result) + Respuesta = True + ModExtensiones.GuardaLogAD($" '--------PDF GenGoPdf Generado", ArchivoLog) + Else + ModExtensiones.GuardaLogAD($" '--------PDF GenGoPdf Error se genero nulo \n RDLC: {RutaRDLC} Ruta Xml: {XmlRutaArchivo} Ruta PDF: {PDFRutaArchivo} \n MensajeError: {goPdf.MensajeError} CodigoError :{goPdf.CodigoError}", ArchivoLog) + End If + Catch ex As Exception + ModExtensiones.GuardaLogAD($" '--------PDF GenGoPdf Error {ex.Message} -- > {ex.StackTrace} \n RDLC: {RutaRDLC} Ruta Xml: {XmlRutaArchivo} Ruta PDF: {PDFRutaArchivo}", ArchivoLog) + End Try + + ModExtensiones.GuardaLogAD(" '--------PDF GenGoPdf Finaliza ", ArchivoLog) + Return Respuesta + End Function + + + Public Function StreamPDF(UsuarioActual As Usuario, RutaReporte As String, DataSource As List(Of ReportDataSource), Parametros As List(Of ReportParameter), Optional NombreArchivo As String = "Reporte", Optional Formato As String = "PDF", Optional MR As ReportViewer = Nothing, Optional SubReportData As Modelos.MSubReportData = Nothing) As Byte() + 'limpio ReportViwer + Dim sw As Stopwatch = Stopwatch.StartNew() + + + Dim Bytes As Byte() = Nothing + Dim CveUsuario As Integer = 0 + Dim CveEmpresa As Integer = 0 + Dim RutaEmpresa As String = "" + If UsuarioActual IsNot Nothing Then + CveUsuario = UsuarioActual.CveUsuario + CveEmpresa = UsuarioActual.CveEmpresa + RutaEmpresa = UsuarioActual.Empresa.Ruta + End If + + Dim bdir As String = If(RutaReporte.Contains("Empresas"), ModExtensiones.DirectorioBaseEmpresas, AppDomain.CurrentDomain.BaseDirectory) + 'TOMAR LA RUTA BASE PARA EL DIRECTORIO DE LA EMPRESA + If Not String.IsNullOrEmpty(RutaEmpresa) AndAlso Not RutaReporte.Contains("Grales") AndAlso Not RutaReporte.Contains("Contabilidad/Reportes/") AndAlso Not RutaReporte.Contains("Contabilidad/Reportes/") AndAlso Not RutaReporte.Contains("AC/Reportes/") Then + bdir = RutaEmpresa.Replace($"{CveEmpresa}/", "") + End If + RutaReporte.Replace("/", "\") + If Not RutaReporte.ToUpper().StartsWith(bdir.ToUpper()) Then + RutaReporte = String.Format("{0}{1}", bdir, RutaReporte) + End If + If EsProduccion Then + Dim wsreport As New WSRDLC2.WebServiceSoapClient + Dim params As New List(Of WSRDLC2.ReportParameter) + Dim reportobjects As New List(Of WSRDLC2.ReportObjects) + Dim jsonData As String = Nothing + If SubReportData IsNot Nothing Then + jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(SubReportData) + End If + Dim ds As New DataSet + For Each rpds As ReportDataSource In DataSource + If rpds.Value IsNot Nothing Then + If rpds.Value.GetType().ToString() = "System.Data.DataTable" Then + Dim dt As DataTable = DirectCast(rpds.Value, Data.DataTable) + dt = dt.Copy() + dt.TableName = rpds.Name + ds.Tables.Add(dt) + Else + Dim ojext As New WSRDLC2.ReportObjects + ojext.Name = rpds.Name + ojext.Value = rpds.Value + reportobjects.Add(ojext) + End If + Else + Dim dt As DataTable = New DataTable() + dt.TableName = If(String.IsNullOrEmpty(rpds.Name), "DataTable1", rpds.Name) + ds.Tables.Add(dt) + End If + Next + For Each rpds As ReportParameter In Parametros + Dim param As New WSRDLC2.ReportParameter + param.Name = rpds.Name + 'SI ES TEXTO, QUITAR TABS Y OTROS ESPACIOS QUE DEN PROBLEMAS AL MANDAR LA PETICION + If rpds IsNot Nothing AndAlso rpds.Values IsNot Nothing AndAlso rpds.Values.Count > 0 AndAlso rpds.Values(0) IsNot Nothing AndAlso rpds.Values(0).GetType() = GetType(String) Then + param.Values = {rpds.Values(0).Replace(vbVerticalTab, "")} + Else + param.Values = {rpds.Values(0)} + End If + params.Add(param) + Next + Bytes = wsreport.StreamNEWPDFBytes(RutaReporte, ds, reportobjects.ToArray(), params.ToArray(), NombreArchivo, Formato, CveEmpresa, CveUsuario, jsonData) + wsreport = Nothing + params = Nothing + ds.Dispose() : ds = Nothing + Else + If IsNothing(MR) Then MR = New ReportViewer + Try + ' MasterReporteador.LocalReport.DataSources.Clear() + For Each RDS As ReportDataSource In DataSource + MR.LocalReport.DataSources.Add(RDS) + Next + MR.LocalReport.ReportPath = RutaReporte + MR.ProcessingMode = ProcessingMode.Local + MR.LocalReport.EnableExternalImages = True + MR.LocalReport.SetParameters(Parametros) + MR.LocalReport.Refresh() + Dim Warnings As Warning() = Nothing + Dim StreamIds As String() = Nothing + Dim MimeType As String = Nothing + Dim Encoding As String = Nothing + Dim Extension As String = Nothing + Bytes = MR.LocalReport.Render(Formato, Nothing, MimeType, Encoding, Extension, StreamIds, Warnings) + Catch ex As Microsoft.Reporting.WebForms.ScriptManagerNotFoundException + GuardaLog($"Error: { If(ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, ex.Message) } | Descripcion: {If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException.Message IsNot Nothing, ex.InnerException.InnerException.Message, If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, "Sin descripcion"))} - Ruta {RutaReporte}") + 'HAY QUE VALIDAR QUE LOS OBJETOS QUE SE USAN PARA GUARDAR LOG EXISTEN!!! IPP 14 AGOSTO 2017 + 'GuardaLog($"Error: {ex.InnerException.Message} | Descripcion: {If(ex.InnerException.InnerException IsNot Nothing, ex.InnerException.InnerException.Message, "Sin descripcion")} - Ruta {RutaReporte}") + Catch ex As Exception + GuardaLog($"Error: { If(ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, ex.Message) } | Descripcion: {If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException.Message IsNot Nothing, ex.InnerException.InnerException.Message, If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, "Sin descripcion"))} - Ruta {RutaReporte}") + 'HAY QUE VALIDAR QUE LOS OBJETOS QUE SE USAN PARA GUARDAR LOG EXISTEN!!! IPP 14 AGOSTO 2017 + 'GuardaLog($"Error {ex.InnerException.Message} | Descripcion: {If(ex.InnerException.InnerException IsNot Nothing, ex.InnerException.InnerException.Message, "Sin descripcion")} - Ruta {RutaReporte}") + End Try + Try + MR.Dispose() + Catch ex As Exception + GuardaLog($"Error: { ex.ToString() }") + End Try + MR = Nothing + + End If + sw.Stop() + If sw.Elapsed.TotalSeconds > 5 Then + GuardaLog($"Reporte:{RutaReporte} | Tiempo Renderizado Milisegundos: {sw.ElapsedMilliseconds},Total Segundos: {sw.Elapsed.TotalSeconds} ") + End If + Return Bytes + End Function + +End Class + + + + + + + + +Namespace ADS.TareasProgramdas + Public Class Factura + + Public Property CveFactura As Integer = -1 + Public Property RespuestaInsert As Integer = -1 + + Friend noCertificado As String = "" + Public Property CveEmpresa As Integer + Public Property Version As String + Public Property Serie As String + Public Property Folio As String + Public Property Fecha As Date + Public Property SubTotal As Decimal + Public Property Total As Decimal + Public Property Moneda As String + Public Property CveMoneda As Integer + Public Property TipoComprobante As String + Public Property Descuento As Decimal + Public Property TipoCambio As Decimal + Public Property MetododePago As String = "" + Public Property EmisorRFC As String + Public Property EmisorNombre As String + Public Property EmisorRegimenFiscal As String + Public Property ReceptorRFC As String + Public Property ReceptorNombre As String + Public Property ReceptorUsoCFDI As String + Public Property TotalRetenciones As Decimal + Public Property SumaTotalRetenciones As Decimal + Public Property TotalTraslados As Decimal + Public Property SumaTotalTraslados As Decimal + Public Property TrasladoIVA As Decimal + Public Property TrasladoIEPS As Decimal + Public Property TrasladoISR As Decimal + Public Property RetencionIVA As Decimal + Public Property RetencionISR As Decimal + Public Property sUPPrefijo As String + Public Property UUID As String + Public Property Validada As Integer = 0 + Public Property ArchivoXML As String + Public Property ArchivoPDF As String + Public Property Pagos As New List(Of Pago) + Public Property IEPS As Decimal + Public Property TFDFechaTimbrado As String + Public Property TFDSelloCFD As String + Public Property TFDNoCertSAT As String + Public Property TFDSelloSAT As String + Public Property FormaDePago As String + Public Property DTConceptos As DataTable + Public Property EmiRFC As String + Public Property EmiNombre As String + Public Property DomFisCalle As String + Public Property DomFisNoExt As String + Public Property DomFisCol As String + Public Property DomFisCP As String + Public Property DomFisMun As String + Public Property DomFisLoc As String + Public Property DomFisEst As String + Public Property DomFisPais As String + Public Property ExpEnCalle As String + Public Property ExpEnNoExt As String + Public Property ExpEnCol As String + Public Property ExpEnCP As String + Public Property ExpEnMun As String + Public Property ExpEnLoc As String + Public Property ExpEnEst As String + Public Property ExpEnPais As String + Public Property Regimen As String + Public Property RecRfc As String + Public Property RecNombre As String + Public Property DomRecCalle As String + Public Property DomRecFisNoExt As String + Public Property DomRecFisNoInt As String + Public Property DomRecCol As String + Public Property DomRecCP As String + Public Property DomRecMun As String + Public Property DomRecLoc As String + Public Property DomRecEst As String + Public Property DomRecPais As String + Public Property condicionesDePago As String + Public Property NumCtaPagoNumCtaPago As String + + + Private Property EsProduccion As Boolean = True + + Public ReadOnly Property DtPagos As DataTable + Get + + If Pagos.Count > 0 Then + + Dim query = From p In Me.Pagos Select New With {.FechaPago = p.FechaPago, .FormaDePagoP = p.FormaDePagoP, .MonedaP = p.MonedaP, .ImportePago = p.Monto} + Dim DtPagosNew As DataTable = ModExtensiones.CopyToDataTable(query, True) + DtPagosNew.TableName = "DsPagos" + Return DtPagosNew + Else + Dim DtPagosNew As New DataTable + DtPagosNew.TableName = "DsPagos" + Return DtPagosNew + End If + + End Get + End Property + + Public ReadOnly Property DtDocumentosR As DataTable + Get + If Pagos.Count > 0 Then + + Dim DtDocumentosRNew As DataTable = ModExtensiones.CopyToDataTable(Pagos(0).Documentos, True) + DtDocumentosRNew.TableName = "DsDocRelacionados" + Return DtDocumentosRNew + + Else + Dim DtDocumentosRNew As New DataTable + DtDocumentosRNew.TableName = "DsDocRelacionados" + Return DtDocumentosRNew + + End If + End Get + End Property + + Private Sub CreaDTConceptos() + DTConceptos = New DataTable() + DTConceptos.Columns.Add("Consec", GetType(Integer)) + DTConceptos.Columns.Add("Cantidad", GetType(Double)) + DTConceptos.Columns.Add("UM", GetType(String)) + DTConceptos.Columns.Add("PS", GetType(String)) + DTConceptos.Columns.Add("PU", GetType(Double)) + DTConceptos.Columns.Add("IVA", GetType(Double)) + DTConceptos.Columns.Add("Total", GetType(Double)) + End Sub + + Public Sub New() + CreaDTConceptos() + End Sub + + Public Sub AddPS(ByVal Cantidad As Double, ByVal UM As String, ByVal PS As String, ByVal PU As Double, ByVal IVA As Double, Optional ByVal Total As Double = 0) + If PS <> "IVA" Then + Dim Row As DataRow = Nothing + Row = DTConceptos.NewRow() + Row("Consec") = DTConceptos.Rows.Count + 1 + Row("Cantidad") = Cantidad + Row("UM") = UM + Row("PS") = PS + Row("PU") = PU + Row("IVA") = IVA + Row("Total") = If(Total > 0, Total, (Cantidad * PU)) + DTConceptos.Rows.Add(Row) + End If + End Sub + + End Class + + Public Class Pago + Public Property FechaPago As DateTime + Public Property FormaDePagoP As String + Public Property MonedaP As String + Public Property Monto As Decimal + Public Property Documentos As List(Of DoctoRelacionado) + End Class + + Public Class DoctoRelacionado + Public Property Serie As String + Public Property Folio As String + Public Property ImportePago As Decimal + Public Property ImpSaldoAnt As Decimal + Public Property ImpSaldoInsoluto As Decimal + Public Property idDocumento As String + Public Property MonedaDR As String + Public Property MetodoDePagoDR As String + Public Property NumParcialidad As String + + End Class + + Public Class ComprobanteFactura + Private Property EsProduccion As Boolean = True + Public Property ArchivoLog As String + + Public Sub New(NombreArchivoLog As String) + ArchivoLog = NombreArchivoLog + End Sub + + Public Property Pagos As List(Of Pago) + Public Property XMLNodosPagos As String + Public Property XMLNodosPagosCount As Integer + Private Function CargaFactVersion33(CveEmpresa As Integer, ByRef node As XmlNode, ByRef nodo As XmlNode, ByRef XMLDoc As XmlDocument, ByVal Prefijo As String, ByRef namespaces As XmlNamespaceManager, ByVal VersionCFDI As String) As Factura + Dim Fact = New Factura() + Fact.Version = VersionCFDI + Fact.CveEmpresa = CveEmpresa + Fact.Serie = CaratecteresvalidosFolio(ValorXML(nodo, "serie")) + If Not String.IsNullOrEmpty(Fact.Serie) Then Fact.Serie = Fact.Serie + Fact.Folio = ValorXML(nodo, "folio").TrimStart("0"c) + Fact.Fecha = ValorXML(nodo, "fecha").ToDateTime + Fact.SubTotal = ValorXML(nodo, "subTotal").Replace("..", ".").ToDecimal + Fact.Total = ValorXML(nodo, "total").ToDecimal + Fact.Moneda = ValorXML(nodo, "Moneda") + Fact.MetododePago = ValorXML(nodo, "MetododePago") + Fact.TipoComprobante = ValorXML(nodo, "tipoDeComprobante") + Fact.TipoCambio = ValorXML(nodo, "TipoCambio", "1.0").ToDecimal + If Fact.TipoCambio < 1 Then Fact.TipoCambio = 1 + + If Fact.TipoComprobante = "P" Then + Dim PagoPrefix As String = "" + + If VersionCFDI = "3.3" Then + PagoPrefix = "pago10" + namespaces.AddNamespace("pago10", "http://www.sat.gob.mx/Pagos") + ElseIf VersionCFDI = "4.0" Then + PagoPrefix = "pago20" + namespaces.AddNamespace("pago20", "http://www.sat.gob.mx/Pagos20") + End If + + Dim NodoComplementos As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + Dim nodePagos As XmlNode = NodoComplementos.SelectSingleNode($"//{PagoPrefix}:Pagos", namespaces) + + For Each nPago As XmlNode In nodePagos.ChildNodes + Fact.Total = ValorXML(nPago, "Monto").ToDecimal + If VersionCFDI = "4.0" And nPago.LocalName.ToUpper() = "TOTALES" Then + Continue For + Else + Exit For + End If + Next + End If + + Fact.sUPPrefijo = Prefijo + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Emisor", Prefijo), namespaces) + + If node IsNot Nothing AndAlso node.Attributes.Count > 0 Then + Fact.EmisorRFC = ValorXML(node, "RFC").Trim() + Fact.EmisorNombre = ValorXML(node, "nombre") + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Receptor", Prefijo), namespaces) + + If node IsNot Nothing Then + Fact.ReceptorRFC = ValorXML(node, "RFC").Trim() + End If + + If XMLDoc.HasChildNodes Then + node = XMLDoc.ChildNodes(0).ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Impuestos", Prefijo), StringComparison.OrdinalIgnoreCase)).FirstOrDefault() + + If XMLDoc.ChildNodes.Count > 1 Then + node = XMLDoc.ChildNodes(1).ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Impuestos", Prefijo), StringComparison.OrdinalIgnoreCase)).FirstOrDefault() + End If + End If + + If node IsNot Nothing AndAlso node.ChildNodes.Count > 0 Then + + Try + Dim nodeRetenciones = node.ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Retenciones", Prefijo), StringComparison.OrdinalIgnoreCase)) + Fact.TotalRetenciones = ValorXML(node, "totalImpuestosRetenidos", "0").ToDecimal + + Try + Dim retenciones = nodeRetenciones.FirstOrDefault().ChildNodes + + For Each retencion As XmlNode In retenciones + Dim TipoImpuesto As String = ValorXML(retencion, "impuesto") + Dim importe As Decimal = ValorXML(retencion, "importe").ToDecimal + + If TipoImpuesto = "002" Then + Fact.RetencionIVA += importe + End If + + If TipoImpuesto = "001" Then + Fact.RetencionISR += importe + End If + Next + + Catch ex As Exception + End Try + + Fact.SumaTotalRetenciones += Fact.RetencionIVA + Fact.SumaTotalRetenciones += Fact.RetencionISR + Fact.TotalTraslados = ValorXML(node, "totalImpuestosTrasladados", "0").ToDecimal + Dim nodeTraslados = node.ChildNodes.Cast(Of XmlNode)().Where(Function(n, b) n.Name.Equals(String.Format("{0}:Traslados", Prefijo), StringComparison.OrdinalIgnoreCase)) + Dim traslados = nodeTraslados.FirstOrDefault().ChildNodes + + For Each traslado As XmlNode In traslados + Dim TipoImpuesto As String = ValorXML(traslado, "impuesto") + Dim importe As Decimal = ValorXML(traslado, "importe").ToDecimal() + + If TipoImpuesto = "003" Then + Fact.TrasladoIEPS += importe + End If + + If TipoImpuesto = "002" Then + Fact.TrasladoIVA += importe + End If + + If TipoImpuesto = "001" Then + Fact.TrasladoISR += importe + End If + Next + + Fact.SumaTotalTraslados += Fact.TrasladoIVA + Fact.TrasladoIEPS + Catch ex As Exception + ex.ToString().GuardaLogAD(ArchivoLog) + End Try + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) + Fact.UUID = ValorXML(nodeTFD, "UUID", "") + Dim nodeRF As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CFDIRegistroFiscal ", "registrofiscal"), namespaces) + + If nodeRF IsNot Nothing Then + Fact.Folio = ValorXML(nodeRF, "folio").TrimStart("0"c) + End If + Else + Fact.UUID = "" + + If String.IsNullOrEmpty(Fact.UUID) AndAlso Fact.sUPPrefijo.ToLower() = "cfdi" Then + 'Mensajes.AppendFormat("{0}|{1}|{2}|{3}|{4}|{5}{6}&", ValorXML(nodo, "serie"), ValorXML(nodo, "folio"), ValorXML(nodo, "fecha").ToDate().ToShortDateString(), Fact.EmisorNombre, ValorXML(nodo, "total").ToDouble().FormatoNumero(), "Factura no timbrada correctamente.", "") + 'CargaMensaje(ValorXML(nodo, "serie"), ValorXML(nodo, "folio"), ValorXML(nodo, "fecha").ToDate(), Fact.EmisorNombre, ValorXML(nodo, "total").ToDouble(), "Factura no timbrada correctamente.", CorreoActual, DateTime.Now, _EmiRFC, 0) + End If + + Fact = Nothing + End If + + If Fact.TipoComprobante = "P" Then + CargaPagos(XMLDoc) + End If + + Return Fact + End Function + + Private Sub CargaPagos(ByVal XMLDoc As XmlDocument) + Dim nodo = XMLDoc.DocumentElement + Dim Prefijo As String = If(String.IsNullOrEmpty(XMLDoc.DocumentElement.Prefix), "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "http://www.sat.gob.mx/cfd/3" + Dim namespaces As XmlNamespaceManager = New XmlNamespaceManager(XMLDoc.NameTable) + Dim Version = ValorXML(nodo, "version").Replace("..", ".") + Dim PrefijoPagos As String = "" + If Prefijo.ToLower() <> "cfdi" Then cfdVer = "http://www.sat.gob.mx/cfd/2" + + If Version = "3.3" Then + PrefijoPagos = "pago10" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/3" + namespaces.AddNamespace(Prefijo, cfdVer) + ElseIf Version = "4.0" Then + PrefijoPagos = "pago20" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos20") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/4" + namespaces.AddNamespace(Prefijo, cfdVer) + Else + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If Version = "3.2" Then + ElseIf Version = "3.3" OrElse Version = "4.0" Then + + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim NodosNodePagos As XmlNodeList = nodeComp.SelectNodes($"//{PrefijoPagos}:Pago", namespaces) + + If NodosNodePagos IsNot Nothing Then + + Try + Dim nodePagos As XmlNode = nodeComp.SelectSingleNode($"//{PrefijoPagos}:Pagos", namespaces) + + If Version = "3.3" Then + XMLNodosPagos = nodePagos.InnerXml.Replace("pago10:", "").Replace("pagos10:", "").Replace(PrefijoPagos & ":", "") + Else + XMLNodosPagos = nodePagos.InnerXml.Replace("pago20:", "").Replace("pagos20:", "").Replace(PrefijoPagos & ":", "") + End If + + Catch ex As Exception + ModExtensiones.GuardaLogAD(ex.ToString(), ArchivoLog) + End Try + End If + + Dim Pagos = New List(Of Pago)() + Dim FechaPago As Date + For Each nodePago As XmlNode In NodosNodePagos + + Try + FechaPago = ValorXML(nodePago, "FechaPago").ToDate() + Catch e As Exception + End Try + + Dim pago = New Pago() + pago.FechaPago = FechaPago + pago.FormaDePagoP = ValorXML(nodePago, "FormaDePagoP").ToString() + pago.MonedaP = ValorXML(nodePago, "MonedaP").ToString() + pago.Monto = ValorXML(nodePago, "Monto").ToString().ToDecimal() + Dim docs = New List(Of DoctoRelacionado)() + Dim NodosPagosRelacionados As XmlNodeList = nodePago.SelectNodes($"//{PrefijoPagos}:DoctoRelacionado", namespaces) + + For Each docto As XmlNode In NodosPagosRelacionados + Dim idDoc = ValorXML(docto, "idDocumento") + Dim ImportePago = ValorXML(docto, "ImpPagado").ToDecimal() + Dim serie = ValorXML(docto, "Serie") + Dim Folio = ValorXML(docto, "Folio") + Dim MonedaDR = ValorXML(docto, "MonedaDR") + Dim MetodoDePagoDR = ValorXML(docto, "MetodoDePagoDR") + Dim NumParcialidad = ValorXML(docto, "NumParcialidad") + Dim ImpSaldoInsoluto = ValorXML(docto, "ImpSaldoInsoluto").ToDecimal() + Dim ImpSaldoAnt = ValorXML(docto, "ImpSaldoAnt").ToDecimal() + docs.Add(New DoctoRelacionado() With { + .idDocumento = idDoc, + .ImportePago = ImportePago, + .Serie = serie, + .Folio = Folio, + .MonedaDR = MonedaDR, + .MetodoDePagoDR = MetodoDePagoDR, + .NumParcialidad = NumParcialidad, + .ImpSaldoAnt = ImpSaldoAnt, + .ImpSaldoInsoluto = ImpSaldoInsoluto + }) + Next + + pago.Documentos = docs + Pagos.Add(pago) + Next + + Me.Pagos = Pagos + End If + End If + End Sub + 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 + Private Function CaratecteresvalidosFolio(ByVal Folio As String) As String + Dim Respuesta As String = "" + + 'For Each c As Char In Folio.ToArray() + + ' If (c >= 48 AndAlso c <= 57) OrElse (c >= 65 AndAlso c <= 90) OrElse (c >= 97 AndAlso c <= 122) Then + ' Respuesta += c + ' End If + 'Next + Return Respuesta + End Function + + 'Private Sub CargaDesdeString(StrFuente As String) + ' Dim XMLCargaExistosa As Boolean = False + ' Dim XMlStr As String = StrFuente.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 + Public Function CargaComprobanteXML(StrFuente As String, DirectorioEmpresa As String, RFCEmpresa As String, CveEmpresa As Integer, Registrar As Boolean, ByRef rowLog As DataRow, NombreArchivo As String, Optional Validada As Integer = 0) As Factura + + + Dim SeValido As Boolean = False + Dim XMLCargaExistosa As Boolean = False + Dim XMlStr As String = StrFuente.Replace("<br>", "").Replace("<", "").Replace("o;?", "") + Dim XMLDoc As New XmlDocument + + Try + XMLDoc.LoadXml(XMlStr) + XMLCargaExistosa = True + Catch ex As Exception + GuardaLogAD("Error al intentar leer . Error:" & ex.ToString(), ArchivoLog) + 'Errores.AppendLine("Error al intentar leer el XML. Error:" & ex.ToString()) + XMLCargaExistosa = False + End Try + + If Not XMLCargaExistosa Then + rowLog("Motivo") = $"Error extructura XML archivo {NombreArchivo}" + Return Nothing + End If + + Dim nodo As XmlNode = XMLDoc.DocumentElement + Dim Fact As Factura = New Factura() + Fact.Serie = ValorXML(nodo, "serie") + + Dim StrCFDIVersion As String = ValorXML(nodo, "version") + + Fact.Version = StrCFDIVersion + + Fact.Folio = ValorXML(nodo, "folio") + Fact.Fecha = ValorXML(nodo, "fecha").ToDate + Fact.SubTotal = ValorXML(nodo, "subTotal").ToDecimal + Fact.Total = ValorXML(nodo, "total").ToDecimal + Fact.Descuento = ValorXML(nodo, "descuento").ToDecimal + Fact.Moneda = ValorXML(nodo, "Moneda") + Fact.CveMoneda = ClsPaginas.GlobalDTMonedas().FiltroPrimeroValor("CveMoneda", $" AbreviaturaSAT = '{Fact.Moneda}' ").ToEntero + Fact.TipoComprobante = ValorXML(nodo, "tipoDeComprobante") + Fact.TipoCambio = ValorXML(nodo, "TipoCambio", "1").ToDecimal + Fact.noCertificado = ValorXML(nodo, "NoCertificado") + Fact.FormaDePago = ValorXML(nodo, "formaDePago") + Fact.condicionesDePago = ValorXML(nodo, "condicionesDePago", "") + Fact.NumCtaPagoNumCtaPago = ValorXML(nodo, "NumCtaPago", "") + + If Fact.Version = "3.3" Or Fact.Version = "4.0" Then + Dim drm As DataRow = ClsPaginas.GlobalDTVtaMetodoPago.FiltroPrimero(String.Format("ClaveMetodoPagoSAT = '{0}'", ValorXML(nodo, "MetodoPago"))) + If drm IsNot Nothing Then + Fact.MetododePago = 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 StrCFDIVersion = "3.2" Then + Prefijo = "cfd" + cfdVer = "http://www.sat.gob.mx/cfd/2" + ElseIf StrCFDIVersion = "3.3" 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") + + Fact.sUPPrefijo = Prefijo + + If StrCFDIVersion = "3.2" Then + + For i As Integer = 0 To XMLDoc.DocumentElement.ChildNodes(2).ChildNodes.Count - 1 + nodo = XMLDoc.DocumentElement.ChildNodes(2).ChildNodes(i) + Fact.AddPS(Convert.ToDouble(nodo.Attributes.GetNamedItem("cantidad").Value), nodo.Attributes.GetNamedItem("unidad").Value, nodo.Attributes.GetNamedItem("descripcion").Value, Convert.ToDouble(nodo.Attributes.GetNamedItem("valorUnitario").Value), 0, Convert.ToDouble(nodo.Attributes.GetNamedItem("importe").Value)) + Next + + Try + + Dim nodosEmisor = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().FirstOrDefault(Function(n) n.Name.Equals("cfdi:Emisor", StringComparison.OrdinalIgnoreCase)) + + Dim nodoEmisor As XmlNode = nodosEmisor + + Fact.EmiRFC = ValorXML(nodoEmisor, "rfc", "") + Fact.EmiNombre = ValorXML(nodoEmisor, "nombre", "") + + nodoEmisor = nodosEmisor.ChildNodes(0) + Fact.DomFisCalle = ValorXML(nodoEmisor, "calle", "") + Fact.DomFisNoExt = ValorXML(nodoEmisor, "noExterior", "") + Fact.DomFisCol = ValorXML(nodoEmisor, "colonia", "") + Fact.DomFisCP = ValorXML(nodoEmisor, "codigoPostal", "") + Fact.DomFisMun = ValorXML(nodoEmisor, "municipio", "") + Fact.DomFisLoc = ValorXML(nodoEmisor, "localidad", "") + Fact.DomFisEst = ValorXML(nodoEmisor, "estado", "") + Fact.DomFisPais = ValorXML(nodoEmisor, "pais", "") + + nodoEmisor = nodosEmisor.ChildNodes(1) + Fact.ExpEnCalle = ValorXML(nodoEmisor, "calle", "") + Fact.ExpEnNoExt = ValorXML(nodoEmisor, "noExterior", "") + Fact.ExpEnCol = ValorXML(nodoEmisor, "colonia", "") + Fact.ExpEnCP = ValorXML(nodoEmisor, "codigoPostal", "") + Fact.ExpEnMun = ValorXML(nodoEmisor, "municipio", "") + Fact.ExpEnLoc = ValorXML(nodoEmisor, "localidad", "") + Fact.ExpEnEst = ValorXML(nodoEmisor, "estado", "") + Fact.ExpEnPais = ValorXML(nodoEmisor, "pais", "") + + nodoEmisor = nodoEmisor.ChildNodes(2) + Fact.Regimen = ValorXML(nodo, "Regimen", "") + Catch ex As Exception + Throw New Exception($"Error CargaEmisorXML - {ex.Message} - {ex.StackTrace}") + End Try + + Try + Dim nodosReceptor = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().FirstOrDefault(Function(n) n.Name.Equals("cfdi:Receptor", StringComparison.OrdinalIgnoreCase)) + + Dim nodoReceptor As XmlNode = nodosReceptor + Fact.RecRfc = ValorXML(nodoReceptor, "rfc", "") + Fact.RecNombre = ValorXML(nodoReceptor, "nombre", "") + + nodoReceptor = nodosReceptor.ChildNodes(0) + Fact.DomRecCalle = ValorXML(nodoReceptor, "calle", "") + Fact.DomRecFisNoExt = ValorXML(nodoReceptor, "noExterior", "") + Fact.DomRecFisNoInt = ValorXML(nodoReceptor, "noInterior", "") + Fact.DomRecCol = ValorXML(nodoReceptor, "colonia", "") + Fact.DomRecCP = ValorXML(nodoReceptor, "codigoPostal", "") + Fact.DomRecMun = ValorXML(nodoReceptor, "municipio", "") + Fact.DomRecLoc = ValorXML(nodoReceptor, "localidad", "") + Fact.DomRecEst = ValorXML(nodoReceptor, "estado", "") + Fact.DomRecPais = ValorXML(nodoReceptor, "pais", "") + Catch ex As Exception + Throw New Exception($"Error CargaReceptorXML - {ex.Message} - {ex.StackTrace}") + End Try + + + ElseIf StrCFDIVersion = "3.3" OrElse StrCFDIVersion = "4.0" Then + Try + Dim nodos = XMLDoc.DocumentElement.ChildNodes.Cast(Of XmlNode)().Where(Function(n) n.Name.Equals("cfdi:Conceptos", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().ChildNodes + + For Each item As XmlNode In nodos + Dim cantidad = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("cantidad", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + Dim unidad = item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("ClaveUnidad", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value + Dim descripcion = item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("descripcion", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value + Dim valorUnitario = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("valorUnitario", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + Dim importe = Convert.ToDouble(item.Attributes.Cast(Of XmlAttribute)().Where(Function(n) n.Name.Equals("importe", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Value) + + Fact.AddPS(cantidad, unidad, descripcion, valorUnitario, 0, importe) + Next + Catch ex As Exception + Throw New Exception($"Error CargaConceptosXML - {ex.Message} - {ex.StackTrace}") + End Try + End If + + + + If Fact.TipoComprobante.ToUpper = "E" AndAlso (Fact.Version.Contiene("3.3", "4.0")) 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 + End If + + Dim node As XmlNode + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Emisor", Prefijo), namespaces) + + If node IsNot Nothing Then + Fact.EmisorRFC = ValorXML(node, "RFC") + Fact.EmisorNombre = ValorXML(node, "Nombre") + End If + + node = XMLDoc.SelectSingleNode(String.Format("//{0}:Receptor", Prefijo), namespaces) + + If node IsNot Nothing Then + Fact.ReceptorRFC = ValorXML(node, "RFC") + 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) + + If Fact.Version.Contiene("3.3", "4.0") Then + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("Impuesto").Value = "002" Then Fact.RetencionIVA += retencion.Attributes("Importe").Value.ToDecimal + If retencion.Attributes("Impuesto").Value = "001" Then Fact.RetencionISR += retencion.Attributes("Importe").Value.ToDecimal + Next + + Else + + For Each retencion As XmlNode In nodeRetenciones + If retencion.Attributes("impuesto").Value = "IVA" Then Fact.RetencionIVA += retencion.Attributes("importe").Value.ToDecimal + If retencion.Attributes("impuesto").Value = "ISR" Then Fact.RetencionISR += retencion.Attributes("importe").Value.ToDecimal + Next + End If + + Dim nodeTraslados As XmlNodeList = XMLDoc.SelectNodes(String.Format("//{0}:Comprobante/{0}:Impuestos/{0}:Traslados/{0}:Traslado", Prefijo), namespaces) + + If Fact.Version.Contiene("3.3", "4.0") Then + + For Each traslado As XmlNode In nodeTraslados + + If traslado.Attributes("Importe") IsNot Nothing Then + If traslado.Attributes("Impuesto").Value = "002" Then Fact.TrasladoIVA += traslado.Attributes("Importe").Value.ToDecimal + If traslado.Attributes("Impuesto").Value = "003" Then Fact.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 Fact.TrasladoIVA += traslado.Attributes("importe").Value.ToDecimal + + If traslado.Attributes("impuesto").Value = "IEPS" Then Fact.TrasladoIEPS += traslado.Attributes("importe").Value.ToDecimal + End If + Next + End If + + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + + Dim nodeTFD As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:TimbreFiscalDigital", "tfd"), namespaces) + Fact.UUID = ValorXML(nodeTFD, "UUID", "") + + Dim nodeRF As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CFDIRegistroFiscal ", "registrofiscal"), namespaces) + If nodeRF IsNot Nothing Then + Fact.Folio = ValorXML(nodeRF, "folio").TrimStart("0"c) + End If + End If + + If Fact.TipoComprobante = "P" Then + CargaPagos(XMLDoc, Fact) + End If + + rowLog("Serie") = Fact.Serie + rowLog("Folio") = Fact.Folio + rowLog("Fecha") = Fact.Fecha + rowLog("Proveedor") = Fact.EmisorNombre + rowLog("Importe") = Fact.Total + rowLog("Motivo") = "" + + rowLog("RFCde") = Fact.EmisorRFC + rowLog("Estatus") = 0 + rowLog("Tipo") = Fact.TipoComprobante + + + + If Registrar Then + + If Fact.ReceptorRFC = RFCEmpresa Then + + Fact.Validada = Validada + + Dim ObjCompra As New ClsCompras + Dim Correcto As Boolean = False + + ObjCompra.IniciaTransacSQL() + + Fact.RespuestaInsert = ObjCompra.AddFactura(Fact.Serie, Fact.Folio, Fact.Fecha, Fact.EmisorNombre, Fact.EmisorRFC, Fact.SubTotal, Fact.TrasladoIVA, Fact.Total, Fact.UUID, Fact.ReceptorRFC, "", "", Fact.Version, Fact.Descuento, Fact.TipoCambio, Fact.Validada, CveEmpresa, Fact.sUPPrefijo, Fact.TipoComprobante, Fact.Moneda, Fact.MetododePago, 3, Fact.Version, Fact.IEPS, Fact.RetencionIVA, Fact.RetencionISR) + + If Fact.RespuestaInsert >= 0 Then + + rowLog("Estatus") = 1 + + Dim Destino As String = $"{DirectorioEmpresa}\Compras\" + + Try + If Not Directory.Exists(Destino & Fact.EmisorRFC) Then + Directory.CreateDirectory(Destino & Fact.EmisorRFC) + End If + + Select Case Fact.RespuestaInsert + Case 0 + Dim RRutaDestino As String = String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura) + ModExtensiones.GuardaLogAD(String.Format(" '--------{0} Compra ya insertada : {1}{2} - {3}", 1, Fact.Serie, Fact.Folio, RRutaDestino), ArchivoLog) + + File.WriteAllText(RRutaDestino, StrFuente, UTF8Encoding.UTF8) + 'ObjCompra.UpdateArchivo(ObjCompra.CveFactura, "XML") + ModExtensiones.GuardaLogAD(" '--------XML Actualizado ", ArchivoLog) + rowLog("Motivo") = $"Ya registrado {Fact.Serie}-{Fact.Folio} se actualiza XML." + + Correcto = True + Exit Select + + Case 1 + + Dim StrMover As String = "" + Try + File.WriteAllText(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura), StrFuente, UTF8Encoding.UTF8) + ' ObjCompra.UpdateArchivo(ObjCompra.CveFactura, "XML") + ModExtensiones.GuardaLogAD($" '-------- XML Guardado Factura: {Fact.Serie}-{Fact.Folio} UUID: {Fact.UUID} , RFC Emisor: {Fact.EmisorRFC}", ArchivoLog) + + ' Si se movieron los dos archivos, los marca como correcto + If File.Exists(String.Format("{0}{1}\{2}.xml", Destino, Fact.EmisorRFC, ObjCompra.CveFactura)) Then + Correcto = True + Else + Correcto = False + End If + + ModExtensiones.GuardaLogAD(" '++++++++ Compra Insertada :" & Fact.Serie & Fact.Folio & " - Correcto:" & If(Correcto, "Si", "No" & " Obs: "), ArchivoLog) + rowLog("Motivo") = $"Agregado {Fact.Serie}-{Fact.Folio}" + + Catch ex As Exception + StrMover = ex.Message + Correcto = False + ModExtensiones.GuardaLogAD(" '++++++++ Compra no Insertada :" & Fact.Serie & Fact.Folio & " - Correcto:" & If(Correcto, "Si", "No" & " Obs: ") & StrMover, ArchivoLog) + rowLog("Motivo") = $"Error al agregar {Fact.Serie}-{Fact.Folio}" + End Try + + Exit Select + End Select + + Catch ex As Exception + Correcto = True + GuardaLogAD(ex.ToString(), ArchivoLog) + End Try + + + ElseIf Fact.RespuestaInsert = 0 AndAlso Fact.CveFactura > 0 Then + 'FIXME OIC + Else + rowLog("Motivo") = $"RFC ""{Fact.ReceptorRFC}"" Error al insertar" + End If + + + If Correcto Then + ObjCompra.Commit() + Fact.CveFactura = ObjCompra.CveFactura + Fact.ArchivoXML = $"{ObjCompra.CveFactura}.xml" + Else + ObjCompra.RollBack() + End If + + ObjCompra.Dispose() + + Else + ModExtensiones.GuardaLogAD($" '++++++++ Compra RFC Distinto RFC Empresa: {RFCEmpresa}, RFC XML: {Fact.ReceptorRFC} ", ArchivoLog) + rowLog("Motivo") = "RFC Distinto" + rowLog("Motivo") = $"RFC ""{Fact.ReceptorRFC}"" Incorrecto" + End If + + End If + + + Return Fact + End Function + + + + + + Public Function GeneraPDF(UsuarioActual As Usuario, ByVal Ruta As String, ByVal Fact As Factura, DirectorioEmpresa As String, Guardar As Boolean) As Boolean + Dim RutaXML As String = String.Empty + Dim RutaPDF As String = String.Empty + Dim Retorno As Boolean = False + Try + Dim XMLDoc As New XmlDocument() + Dim TmpArchivoPDF As String = $"{Ruta}\Temp\Facturas\{Path.GetFileNameWithoutExtension(Fact.ArchivoXML)}-ttt.pdf" + Dim TmpArchivoQR As String = $"{Ruta}\Temp\Facturas\{Path.GetFileNameWithoutExtension(Fact.ArchivoXML)}-ttt.jpg" + Dim ArchivoXML As String = String.Format("{0}\Compras\{2}\{1}", DirectorioEmpresa, Fact.ArchivoXML, Fact.EmisorRFC) + Dim ArchivoPDF As String = String.Format("{0}\Compras\{2}\{1}.pdf", DirectorioEmpresa, Fact.CveFactura, Fact.EmisorRFC) + Dim dtotal As Decimal = If(Fact.Total <= 0.0D, 0.0001D, Fact.Total) + Dim cfdi As New RVCFDI33.GeneraCFDI() + + Try + Dim b As Byte() = cfdi.ConvertirQrCode(String.Format("?re={0}&rr={1}&tt={2}&id={3}", Fact.EmisorRFC, Fact.ReceptorRFC, String.Format("{0,12:F6}", dtotal).Trim(), Fact.UUID)) + File.WriteAllBytes(TmpArchivoQR, b) + Catch ex As Exception + ModExtensiones.GuardaLogAD(ex.Message, ArchivoLog) + End Try + + If System.IO.File.Exists(TmpArchivoQR) Then + Dim TipoDocto As String = "" + If Fact.Version = "3.3" Or Fact.Version = "4.0" Then + Select Case Fact.TipoComprobante + Case "I" + TipoDocto = "Ing" + Case "E" + TipoDocto = "Egs" + Case "P" + TipoDocto = "Pag" + Case "T" + TipoDocto = "Tra" + Case Else + End Select + Else + TipoDocto = Fact.TipoComprobante + End If + + 'Dim DtPagos As DataTable = Nothing + 'Dim DtDocumentosR As DataTable = Nothing + + If Fact.TipoComprobante.Contiene("P", "T") Then + ModExtensiones.GuardaLogAD(String.Format(" '--------PDF Generar Tipo {0}", Fact.TipoComprobante), ArchivoLog) + Retorno = GenGoPdf(ArchivoXML, TmpArchivoPDF, DirectorioEmpresas) + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + + Try + If Guardar Then + If File.Exists(ArchivoPDF) Then + File.Delete(ArchivoPDF) + End If + File.Move(TmpArchivoPDF, ArchivoPDF) + End If + Retorno = True + Catch ex As Exception + Retorno = False + End Try + + Else + + If (Fact.Version = "3.3" Or Fact.Version = "4.0") Then + Dim cxml As XmlSatCFDI = XmlSatCFDI.readXML(ArchivoXML, ArchivoLog) + ModExtensiones.GuardaLogAD(String.Format(" *********** UUID : {0} ***********", cxml.complemento.UUID), ArchivoLog) + cxml.ImprimirPDF(UsuarioActual, TmpArchivoPDF, DirectorioEmpresa, Fact.TipoComprobante) + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + + Try + If Guardar Then + If File.Exists(ArchivoPDF) Then + File.Delete(ArchivoPDF) + End If + File.Move(TmpArchivoPDF, ArchivoPDF) + End If + Retorno = True + Catch ex As Exception + Retorno = False + End Try + + Else + ModExtensiones.GuardaLogAD(String.Format(" *********** TFDUUID : {0} ***********", Fact.UUID), ArchivoLog) + Dim DomFiscal As String = String.Format("Domicilio Fiscal {0}{1} {2}{0}Col.{3}{0}CP. {4} {5},{6},{7}", vbCr, Fact.DomFisCalle, Fact.DomFisNoExt, Fact.DomFisCol, Fact.DomFisCP, Fact.DomFisMun, Fact.DomFisEst, Fact.DomFisPais) + + If GeneraPDFNew(UsuarioActual, TmpArchivoPDF, Fact.UUID, Fact.SubTotal, Fact.Descuento, Fact.Total, Fact.TrasladoIVA.FormatoNumero(), Fact.Moneda, Fact.FormaDePago, Fact.TFDNoCertSAT, Fact.TFDFechaTimbrado.ToDate(), Fact.noCertificado, + Fact.DTConceptos, Fact.TFDSelloCFD, Fact.TFDSelloSAT, TmpArchivoQR, Fact.Serie + Fact.Folio, Fact.TipoComprobante, "", Fact.ReceptorRFC, Fact.RecNombre, Fact.DomRecCalle, Fact.DomRecCol, Fact.DomRecFisNoExt, + Fact.DomRecFisNoInt, Fact.DomRecCP, Fact.DomRecMun, Fact.DomRecEst, Fact.Regimen, Fact.condicionesDePago, Fact.MetododePago, Fact.NumCtaPagoNumCtaPago, DateTime.Now, Fact.DtPagos, Fact.DtDocumentosR, Fact.RetencionIVA, + Fact.RetencionISR, Fact.EmiNombre, Fact.EmiRFC, Fact.ReceptorNombre, DirectorioEmpresa, DomFiscal) Then + + Fact.ArchivoPDF = Path.GetFileName(TmpArchivoPDF) + Retorno = True + + If Guardar Then + + End If + + End If + + + + End If + + File.Delete(TmpArchivoQR) + + End If + + RutaPDF = TmpArchivoPDF + Else + Retorno = False + + End If + 'If DTConceptos IsNot Nothing Then DTConceptos.Dispose() + Catch ex As Exception + Dim MensajeError As String = "***********Ocurrio un error al generar el pdf: " & ex.Message & "" + + If ex.InnerException Is Nothing Then + MensajeError &= "." + Else + MensajeError &= " - " & ex.InnerException.ToString() + End If + + ModExtensiones.GuardaLogAD(MensajeError, ArchivoLog) + End Try + Return Retorno + End Function + + + Private Function GeneraPDFNew(UsuarioActual As Usuario, ByVal TmpArchivoPDF As String, ByVal FolioFiscal As String, ByVal SubTotal As Decimal, ByVal Descuento As Decimal, ByVal Total As Decimal, ByVal IVA As String, ByVal Moneda As String, ByVal FormaDePago As String, + ByVal NoSerieCertificado As String, ByVal FechaCertificacion As DateTime, ByVal NoSerieCertificadoContribuyente As String, ByVal DTConceptos As DataTable, ByVal SelloCFDi As String, ByVal SelloSAT As String, + ByVal CBB As String, ByVal Folio As String, ByVal TipodeComprobante As String, ByVal CadenaOriginalCFD As String, ByVal RFC As String, ByVal Cliente As String, ByVal Direccion As String, ByVal Colonia As String, + ByVal NoExt As String, ByVal NoInt As String, ByVal CP As String, ByVal Ciudad As String, ByVal Estado As String, ByVal Regimen As String, ByVal CondicionPago As String, ByVal MetodoPago As String, ByVal NumCtaPago As String, + ByVal fecha As DateTime, Optional ByVal DtPagos As DataTable = Nothing, Optional ByVal DtRelacionados As DataTable = Nothing, Optional ByVal RetIVA As Double = 0, Optional ByVal RetISR As Double = 0, + Optional EmiNombre As String = "", Optional EmiRFC As String = "", Optional NombreEmpresa As String = "", Optional DirectorioEmpresa As String = "", Optional DomFiscal As String = "") As Boolean + + + Dim RutaRDLC As String = If(TipodeComprobante = "Pag", "Grales\Formatos\CFDIPago.rdlc", "Grales\Formatos\CFDI.rdlc") + + Dim Retorno As Boolean = False + Dim NombreArchivo As String = TmpArchivoPDF + Dim CadenaOriginal As String = "||1.0|" & FolioFiscal & "|" & FechaCertificacion.ToString("yyyy-MM-dd") & "T" & FechaCertificacion.ToString("HH:mm:ss") & "|" & SelloCFDi & "|" & NoSerieCertificado & "||" + Dim RutaFormato As String = RutaRDLC + + + Try + Dim Archivo As New System.IO.FileInfo(RutaFormato) + + If Archivo.Exists Then + Dim parametros As New List(Of ReportParameter)() + parametros.Add(New ReportParameter("FolioFiscal", FolioFiscal)) + parametros.Add(New ReportParameter("SubTotal", SubTotal.FormatoNumero())) + parametros.Add(New ReportParameter("Descuento", Descuento.FormatoNumero())) + parametros.Add(New ReportParameter("Total", Total.FormatoNumero())) + parametros.Add(New ReportParameter("IVA", IVA.FormatoNumero())) + parametros.Add(New ReportParameter("RetIVA", RetIVA.FormatoNumero())) + parametros.Add(New ReportParameter("RetISR", RetISR.FormatoNumero())) + parametros.Add(New ReportParameter("Moneda", Moneda)) + parametros.Add(New ReportParameter("FormaDePago", FormaDePago)) + parametros.Add(New ReportParameter("NoSerieCertificado", NoSerieCertificado)) + parametros.Add(New ReportParameter("FechaCertificacion", FechaCertificacion.ToString("yyyy-MM-dd") & "T" & FechaCertificacion.ToString("HH:mm:ss"))) + parametros.Add(New ReportParameter("NoSerieCertificadoContribuyente", NoSerieCertificadoContribuyente)) + parametros.Add(New ReportParameter("SelloCFDi", SelloCFDi)) + parametros.Add(New ReportParameter("SelloSAT", SelloSAT)) + parametros.Add(New ReportParameter("CBB", String.Format("file:///{0}", CBB))) + parametros.Add(New ReportParameter("Folio", Folio)) + parametros.Add(New ReportParameter("TipodeComprobante", TipodeComprobante.ToUpper())) + parametros.Add(New ReportParameter("CadenaOriginalCFD", CadenaOriginalCFD)) + parametros.Add(New ReportParameter("RFC", RFC)) + parametros.Add(New ReportParameter("Cliente", Cliente)) + parametros.Add(New ReportParameter("Direccion", Direccion)) + parametros.Add(New ReportParameter("Colonia", Colonia)) + parametros.Add(New ReportParameter("NoExt", NoExt)) + parametros.Add(New ReportParameter("NoInt", NoInt)) + parametros.Add(New ReportParameter("CP", CP)) + parametros.Add(New ReportParameter("Ciudad", Ciudad)) + parametros.Add(New ReportParameter("Estado", Estado)) + parametros.Add(New ReportParameter("Regimen", Regimen)) + parametros.Add(New ReportParameter("CondicionPago", CondicionPago)) + parametros.Add(New ReportParameter("MetodoPago", MetodoPago)) + parametros.Add(New ReportParameter("NumCtaPago", NumCtaPago)) + parametros.Add(New ReportParameter("fecha", fecha.ToString("yyyy-MM-dd") & "T" & fecha.ToString("HH:mm:ss"))) + parametros.Add(New ReportParameter("Fiscal", DomFiscal)) + parametros.Add(New ReportParameter("EmiNombre", EmiNombre)) + parametros.Add(New ReportParameter("EmiRFC", EmiRFC)) + parametros.Add(New ReportParameter("TotalLetra", ModExtensiones.Texto2Letras(Total))) + parametros.Add(New ReportParameter("Empresa", NombreEmpresa)) + + + Dim listaDs As New List(Of ReportDataSource) + + Dim rds1 As New ReportDataSource() + rds1.Name = "DsOC" + rds1.Value = DTConceptos + + 'MR.LocalReport.DataSources.Add(rds1) + listaDs.Add(rds1) + + If DtPagos IsNot Nothing Then + Dim rds2 As New ReportDataSource() + rds2.Name = "DsPago" + rds2.Value = DtPagos + 'MR.LocalReport.DataSources.Add(rds2) + listaDs.Add(rds2) + End If + + If DtRelacionados IsNot Nothing Then + Dim rds3 As New ReportDataSource() + rds3.Name = "DsDocRelacionados" + rds3.Value = DtRelacionados + 'MR.LocalReport.DataSources.Add(rds3) + listaDs.Add(rds3) + End If + + + Dim bytes As Byte() = Nothing + + bytes = StreamPDF(UsuarioActual, RutaRDLC, listaDs, parametros, NombreArchivo:=NombreArchivo, Formato:="PDF") + If bytes IsNot Nothing Then + Using fs As New FileStream(NombreArchivo, FileMode.Create) + fs.Write(bytes, 0, bytes.Length) + fs.Close() + End Using + Retorno = True + Else + Retorno = False + End If + Else + ModExtensiones.GuardaLogAD("ERROR: No existe Formato Base", ArchivoLog) + End If + Catch ex As Exception + ModExtensiones.GuardaLogAD(String.Format("Ocurrio un Error al generar el reporte RLDC :" & ex.ToString()), ArchivoLog) + Retorno = False + End Try + Return Retorno + End Function + + + Private Sub CargaPagos(ByVal XMLDoc As XmlDocument, ByRef Fact As Factura) + + Fact.Pagos.Clear() + + Dim nodo = XMLDoc.DocumentElement + + Dim Prefijo As String = If(String.IsNullOrEmpty(XMLDoc.DocumentElement.Prefix), "cfd", XMLDoc.DocumentElement.Prefix) + Dim cfdVer As String = "http://www.sat.gob.mx/cfd/3" + Dim namespaces As New XmlNamespaceManager(XMLDoc.NameTable) + + Dim Version As String = ValorXML(nodo, "version").Replace("..", ".") + Dim PrefijoPagos As String = "" + + If Prefijo.ToLower() <> "cfdi" Then + cfdVer = "http://www.sat.gob.mx/cfd/2" + End If + + If Version = "3.3" Then + PrefijoPagos = "pago10" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/3" + namespaces.AddNamespace(Prefijo, cfdVer) + ElseIf Version = "4.0" Then + PrefijoPagos = "pago20" + namespaces.AddNamespace(PrefijoPagos, "http://www.sat.gob.mx/Pagos20") + Prefijo = "cfdi" + cfdVer = "http://www.sat.gob.mx/cfd/4" + namespaces.AddNamespace(Prefijo, cfdVer) + End If + + Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) + + If Version = "3.3" OrElse Version = "4.0" Then + If nodeComp IsNot Nothing AndAlso nodeComp.ChildNodes.Count > 0 Then + Dim NodosNodePagos As XmlNodeList = nodeComp.SelectNodes($"//{PrefijoPagos}:Pago", namespaces) + + If NodosNodePagos IsNot Nothing Then + Try + Dim nodePagos As XmlNode = nodeComp.SelectSingleNode($"//{PrefijoPagos}:Pagos", namespaces) + If Version = "3.3" Then + XMLNodosPagos = nodePagos.InnerXml.Replace("pago10:", "").Replace("pagos10:", "").Replace(PrefijoPagos & ":", "") + Else + XMLNodosPagos = nodePagos.InnerXml.Replace("pago20:", "").Replace("pagos20:", "").Replace(PrefijoPagos & ":", "") + End If + Catch ex As Exception + ModExtensiones.GuardaLogAD(ex.ToString(), ArchivoLog) + End Try + End If + + Dim Pagos As New List(Of Pago)() + For Each nodePago As XmlNode In NodosNodePagos + Dim FechaPago As DateTime = DateTime.Now + Try + FechaPago = ValorXML(nodePago, "FechaPago").ToDate() + Catch e As Exception + End Try + + Dim pago As New Pago() + pago.FechaPago = FechaPago + pago.FormaDePagoP = ValorXML(nodePago, "FormaDePagoP").ToString() + pago.MonedaP = ValorXML(nodePago, "MonedaP").ToString() + pago.Monto = ValorXML(nodePago, "Monto").ToString().ToDecimal() + + Dim docs As New List(Of DoctoRelacionado)() + Dim NodosPagosRelacionados As XmlNodeList = nodePago.SelectNodes($"//{PrefijoPagos}:DoctoRelacionado", namespaces) + + For Each docto As XmlNode In NodosPagosRelacionados + Dim idDoc = ValorXML(docto, "idDocumento") + Dim ImportePago = ValorXML(docto, "ImpPagado").ToDecimal() + Dim serie = ValorXML(docto, "Serie") + Dim Folio = ValorXML(docto, "Folio") + Dim MonedaDR = ValorXML(docto, "MonedaDR") + Dim MetodoDePagoDR = ValorXML(docto, "MetodoDePagoDR") + Dim NumParcialidad = ValorXML(docto, "NumParcialidad") + Dim ImpSaldoInsoluto = ValorXML(docto, "ImpSaldoInsoluto").ToDecimal() + Dim ImpSaldoAnt = ValorXML(docto, "ImpSaldoAnt").ToDecimal() + docs.Add(New DoctoRelacionado() With { + .idDocumento = idDoc, + .ImportePago = ImportePago, + .Serie = serie, + .Folio = Folio, + .MonedaDR = MonedaDR, + .MetodoDePagoDR = MetodoDePagoDR, + .NumParcialidad = NumParcialidad, + .ImpSaldoAnt = ImpSaldoAnt, + .ImpSaldoInsoluto = ImpSaldoInsoluto + }) + Next + + pago.Documentos = docs + Pagos.Add(pago) + Next + Fact.Pagos = Pagos + End If + End If + End Sub + + + Private Function GenGoPdf(ByVal XmlRutaArchivo As String, ByVal PDFRutaArchivo As String, DirectorioEmpresa As String) As Boolean + ModExtensiones.GuardaLogAD(" '--------PDF GenGoPdf Inicia ", ArchivoLog) + + Dim Respuesta As Boolean = False + Dim RutaRDLC As String = $"{DirectorioEmpresa}\Grales\Formatos\ReciboDePagoGOPDF.rdlc" 'String.Format("{0}{1}", Extensiones.ApplicationParameter.RutaArchivos, "Empresas\Grales\Formatos\ReciboDePagoGOPDF.rdlc") + + Dim Inicio As DateTime = DateTime.Now + Dim goPdf As New GoPdf.GoPdf() + Dim logotipo As Byte() = Nothing 'File.ReadAllBytes(@"C:\inetpub\WWWSIGGit\Empresas\119\Logo.jpg") + + Try + Dim XmlString As String = File.ReadAllText(XmlRutaArchivo) + Dim result As Byte() = goPdf.ExportarPdf(XmlString, logotipo, "", RutaRDLC, New GoPdf.Modelos.DatosAdicionales() With {.DomicilioReceptor = ""}) + + Dim Fin As DateTime = DateTime.Now + If result IsNot Nothing Then + File.WriteAllBytes(PDFRutaArchivo, result) + Respuesta = True + ModExtensiones.GuardaLogAD($" '--------PDF GenGoPdf Generado", ArchivoLog) + Else + ModExtensiones.GuardaLogAD($" '--------PDF GenGoPdf Error se genero nulo \n RDLC: {RutaRDLC} Ruta Xml: {XmlRutaArchivo} Ruta PDF: {PDFRutaArchivo} \n MensajeError: {goPdf.MensajeError} CodigoError :{goPdf.CodigoError}", ArchivoLog) + End If + Catch ex As Exception + ModExtensiones.GuardaLogAD($" '--------PDF GenGoPdf Error {ex.Message} -- > {ex.StackTrace} \n RDLC: {RutaRDLC} Ruta Xml: {XmlRutaArchivo} Ruta PDF: {PDFRutaArchivo}", ArchivoLog) + End Try + + ModExtensiones.GuardaLogAD(" '--------PDF GenGoPdf Finaliza ", ArchivoLog) + Return Respuesta + End Function + + + Public Function StreamPDF(UsuarioActual As Usuario, RutaReporte As String, DataSource As List(Of ReportDataSource), Parametros As List(Of ReportParameter), Optional NombreArchivo As String = "Reporte", Optional Formato As String = "PDF", Optional MR As ReportViewer = Nothing, Optional SubReportData As Modelos.MSubReportData = Nothing) As Byte() + 'limpio ReportViwer + Dim sw As Stopwatch = Stopwatch.StartNew() + + + Dim Bytes As Byte() = Nothing + Dim CveUsuario As Integer = 0 + Dim CveEmpresa As Integer = 0 + Dim RutaEmpresa As String = "" + If UsuarioActual IsNot Nothing Then + CveUsuario = UsuarioActual.CveUsuario + CveEmpresa = UsuarioActual.CveEmpresa + RutaEmpresa = UsuarioActual.Empresa.Ruta + End If + + Dim bdir As String = If(RutaReporte.Contains("Empresas"), ModExtensiones.DirectorioBaseEmpresas, AppDomain.CurrentDomain.BaseDirectory) + 'TOMAR LA RUTA BASE PARA EL DIRECTORIO DE LA EMPRESA + If Not String.IsNullOrEmpty(RutaEmpresa) AndAlso Not RutaReporte.Contains("Grales") AndAlso Not RutaReporte.Contains("Contabilidad/Reportes/") AndAlso Not RutaReporte.Contains("Contabilidad/Reportes/") AndAlso Not RutaReporte.Contains("AC/Reportes/") Then + bdir = RutaEmpresa.Replace($"{CveEmpresa}/", "") + End If + RutaReporte.Replace("/", "\") + If Not RutaReporte.ToUpper().StartsWith(bdir.ToUpper()) Then + RutaReporte = String.Format("{0}{1}", bdir, RutaReporte) + End If + If EsProduccion Then + Dim wsreport As New WSRDLC2.WebServiceSoapClient + Dim params As New List(Of WSRDLC2.ReportParameter) + Dim reportobjects As New List(Of WSRDLC2.ReportObjects) + Dim jsonData As String = Nothing + If SubReportData IsNot Nothing Then + jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(SubReportData) + End If + Dim ds As New DataSet + For Each rpds As ReportDataSource In DataSource + If rpds.Value IsNot Nothing Then + If rpds.Value.GetType().ToString() = "System.Data.DataTable" Then + Dim dt As DataTable = DirectCast(rpds.Value, Data.DataTable) + dt = dt.Copy() + dt.TableName = rpds.Name + ds.Tables.Add(dt) + Else + Dim ojext As New WSRDLC2.ReportObjects + ojext.Name = rpds.Name + ojext.Value = rpds.Value + reportobjects.Add(ojext) + End If + Else + Dim dt As DataTable = New DataTable() + dt.TableName = If(String.IsNullOrEmpty(rpds.Name), "DataTable1", rpds.Name) + ds.Tables.Add(dt) + End If + Next + For Each rpds As ReportParameter In Parametros + Dim param As New WSRDLC2.ReportParameter + param.Name = rpds.Name + 'SI ES TEXTO, QUITAR TABS Y OTROS ESPACIOS QUE DEN PROBLEMAS AL MANDAR LA PETICION + If rpds IsNot Nothing AndAlso rpds.Values IsNot Nothing AndAlso rpds.Values.Count > 0 AndAlso rpds.Values(0) IsNot Nothing AndAlso rpds.Values(0).GetType() = GetType(String) Then + param.Values = {rpds.Values(0).Replace(vbVerticalTab, "")} + Else + param.Values = {rpds.Values(0)} + End If + params.Add(param) + Next + Bytes = wsreport.StreamNEWPDFBytes(RutaReporte, ds, reportobjects.ToArray(), params.ToArray(), NombreArchivo, Formato, CveEmpresa, CveUsuario, jsonData) + wsreport = Nothing + params = Nothing + ds.Dispose() : ds = Nothing + Else + If IsNothing(MR) Then MR = New ReportViewer + Try + ' MasterReporteador.LocalReport.DataSources.Clear() + For Each RDS As ReportDataSource In DataSource + MR.LocalReport.DataSources.Add(RDS) + Next + MR.LocalReport.ReportPath = RutaReporte + MR.ProcessingMode = ProcessingMode.Local + MR.LocalReport.EnableExternalImages = True + MR.LocalReport.SetParameters(Parametros) + MR.LocalReport.Refresh() + Dim Warnings As Warning() = Nothing + Dim StreamIds As String() = Nothing + Dim MimeType As String = Nothing + Dim Encoding As String = Nothing + Dim Extension As String = Nothing + Bytes = MR.LocalReport.Render(Formato, Nothing, MimeType, Encoding, Extension, StreamIds, Warnings) + Catch ex As Microsoft.Reporting.WebForms.ScriptManagerNotFoundException + GuardaLog($"Error: { If(ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, ex.Message) } | Descripcion: {If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException.Message IsNot Nothing, ex.InnerException.InnerException.Message, If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, "Sin descripcion"))} - Ruta {RutaReporte}") + 'HAY QUE VALIDAR QUE LOS OBJETOS QUE SE USAN PARA GUARDAR LOG EXISTEN!!! IPP 14 AGOSTO 2017 + 'GuardaLog($"Error: {ex.InnerException.Message} | Descripcion: {If(ex.InnerException.InnerException IsNot Nothing, ex.InnerException.InnerException.Message, "Sin descripcion")} - Ruta {RutaReporte}") + Catch ex As Exception + GuardaLog($"Error: { If(ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, ex.Message) } | Descripcion: {If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException.Message IsNot Nothing, ex.InnerException.InnerException.Message, If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, "Sin descripcion"))} - Ruta {RutaReporte}") + 'HAY QUE VALIDAR QUE LOS OBJETOS QUE SE USAN PARA GUARDAR LOG EXISTEN!!! IPP 14 AGOSTO 2017 + 'GuardaLog($"Error {ex.InnerException.Message} | Descripcion: {If(ex.InnerException.InnerException IsNot Nothing, ex.InnerException.InnerException.Message, "Sin descripcion")} - Ruta {RutaReporte}") + End Try + Try + MR.Dispose() + Catch ex As Exception + GuardaLog($"Error: { ex.ToString() }") + End Try + MR = Nothing + + End If + sw.Stop() + If sw.Elapsed.TotalSeconds > 5 Then + GuardaLog($"Reporte:{RutaReporte} | Tiempo Renderizado Milisegundos: {sw.ElapsedMilliseconds},Total Segundos: {sw.Elapsed.TotalSeconds} ") + End If + Return Bytes + End Function + + End Class + + + + ''' + ''' Clase para contener los valores de un xml CFDI cambio norma + ''' + Public Class XmlSatCFDI + Private Property EsProduccion As Boolean = True + Public Sub New(NombreArchivoLog As String) + comprobante = New CFDIComprobante() + emisor = New CFDIEmisor() + receptor = New CFDIReceptor() + complemento = New CFDIComplemento() + cFDIRelacionados = New List(Of CFDIRelacionado)() + conceptos = New List(Of CFDIConcepto)() + Impuestos = New List(Of CFDIImpuesto)() + ArchivoLog = NombreArchivoLog + End Sub + + Public comprobante As CFDIComprobante + Public emisor As CFDIEmisor + Public receptor As CFDIReceptor + Public complemento As CFDIComplemento + Public cFDIRelacionados As List(Of CFDIRelacionado) + Public conceptos As List(Of CFDIConcepto) + Public Impuestos As List(Of CFDIImpuesto) + Public Property ArchivoLog As String = "Log" + + Public Function GetConceptosforpdf() As List(Of CFDIConcepto_I) + Dim lcon As New List(Of CFDIConcepto_I)() + If conceptos IsNot Nothing Then + Dim _orden As Integer = 0 + For Each item As CFDIConcepto In conceptos + _orden += 1 + Dim con As New CFDIConcepto_I With { + .tipo = 1, + .orden = _orden, + .ClaveProdServ = item.ClaveProdServ, + .NoIdentificacion = item.NoIdentificacion, + .Cantidad = item.Cantidad, + .ClaveUnidad = item.ClaveUnidad, + .Unidad = item.Unidad, + .ValorUnitario = item.ValorUnitario, + .Importe = item.Importe, + .Descuento = item.Descuento, + .NumeroPedimento = item.NumeroPedimento, + .CuentaPredial = item.CuentaPredial, + .Descripcion = item.Descripcion + } + Dim index As Integer = 0 + For Each Imp As CFDIConceptoImpuesto In item.Impuestos + index += 1 + If index > 1 Then + lcon.Add(con) + con = New CFDIConcepto_I With { + .tipo = 2, + .orden = _orden + } + End If + + con.Impuesto = Imp.ImpuestoTexto + con.Impuesto_Tipo = Imp.Tipo + con.Impuesto_Base = Imp.Base + con.Impuesto_TipoFactor = Imp.TipoFactor + con.Impuesto_TasaOCuota = Imp.TasaOCuota + con.Impuesto_Importe = Imp.Importe + Next + lcon.Add(con) + Next + End If + + Return lcon + End Function + + Public Shared Function readXML(fileUrl As String, NombreArchivoLog As String) As XmlSatCFDI + Dim xmlCFDI As New XmlSatCFDI(NombreArchivoLog) + Dim canread As Boolean = True + ' Keys + Dim keyComprobante As String = "cfdi:Comprobante" + Dim keyCfdiRelacionados As String = "cfdi:CfdiRelacionados" + Dim keyEmisor As String = "cfdi:Emisor" + Dim keyReceptor As String = "cfdi:Receptor" + Dim keyConceptos As String = "cfdi:Conceptos" + Dim keyImpuestos As String = "cfdi:Impuestos" + Dim keyComplemento As String = "cfdi:Complemento" + ' Endkeys + Dim PrimerNivel As String() = {keyCfdiRelacionados, keyEmisor, keyReceptor, keyConceptos, keyImpuestos, keyComplemento} + + ' (canread = xtr.Read()) para evitar ciclos infinitos, todos los .Read() los guardo en la variable Canread y en los while reviso primero esta variable + If File.Exists(fileUrl) Then + Dim settings As New XmlReaderSettings() + settings.ConformanceLevel = ConformanceLevel.Fragment + settings.IgnoreWhitespace = True + settings.IgnoreComments = True + Using xtr As XmlReader = XmlReader.Create(fileUrl, settings) + While (InlineAssignHelper.Assign(canread, xtr.Read())) AndAlso Not (xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyComprobante) + 'if (xtr.NodeType != XmlNodeType.Element) { while (xtr.Read() && xtr.NodeType != XmlNodeType.Element) { } } + End While + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyComprobante Then + Dim Nivel As Integer = xtr.Depth + Dim cont As Boolean = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "XMLNS:CFDI" + xmlCFDI.comprobante.xmlns_cfdi = xtr.Value + Case "XMLNS:XSI" + xmlCFDI.comprobante.xmlns_xsi = xtr.Value + Case "XSI:SCHEMALOCATION" + xmlCFDI.comprobante.xsi_schemaLocation = xtr.Value + Case "VERSION" + xmlCFDI.comprobante.Version = xtr.Value + Case "SERIE" + xmlCFDI.comprobante.Serie = xtr.Value + Case "FOLIO" + xmlCFDI.comprobante.Folio = xtr.Value + Case "FECHA" + xmlCFDI.comprobante.Fecha = xtr.Value + Case "MONEDA" + xmlCFDI.comprobante.Moneda = xtr.Value + Case "SUBTOTAL" + Dim SubTotal As Decimal = 0 + Decimal.TryParse(xtr.Value, SubTotal) + xmlCFDI.comprobante.SubTotal = SubTotal + Case "TOTAL" + Dim Total As Decimal = 0 + Decimal.TryParse(xtr.Value, Total) + xmlCFDI.comprobante.Total = Total + Case "DESCUENTO" + Dim Descuento As Decimal = 0 + Decimal.TryParse(xtr.Value, Descuento) + xmlCFDI.comprobante.Descuento = Descuento + Case "TIPOCAMBIO" + Dim TipoCambio As Decimal = 0 + Decimal.TryParse(xtr.Value, TipoCambio) + xmlCFDI.comprobante.TipoCambio = TipoCambio + Case "TIPODECOMPROBANTE" + xmlCFDI.comprobante.TipoDeComprobante = xtr.Value + Case "FORMAPAGO", "FORMADEPAGO" + xmlCFDI.comprobante.FormaPago = xtr.Value + Case "METODOPAGO", "METODODEPAGO" + xmlCFDI.comprobante.MetodoPago = xtr.Value + Case "CONDICIONESDEPAGO" + xmlCFDI.comprobante.CondicionesDePago = xtr.Value + Case "LUGAREXPEDICION" + xmlCFDI.comprobante.LugarExpedicion = xtr.Value + Case "CONFIRMACION" + xmlCFDI.comprobante.Confirmacion = xtr.Value + Case "NOCERTIFICADO" + xmlCFDI.comprobante.NoCertificado = xtr.Value + Case "SELLO" + xmlCFDI.comprobante.Sello = xtr.Value + Case "CERTIFICADO" + xmlCFDI.comprobante.Certificado = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + cont = xtr.MoveToFirstAttribute() + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > Nivel + If PrimerNivel.Contains(xtr.Name) Then + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyCfdiRelacionados Then + Dim cDepth As Integer = xtr.Depth + + Dim TipoRelacion As String = Nothing + cont = xtr.MoveToFirstAttribute() + While cont + If xtr.Name.ToUpper() = "TIPORELACION" Then + TipoRelacion = xtr.Value + End If + cont = xtr.MoveToNextAttribute() + End While + + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + If xtr.Name = "cfdi:CfdiRelacionado" Then + Dim cfdir As New CFDIRelacionado() + cfdir.TipoRelacion = TipoRelacion + cfdir.UUID = xtr.GetAttribute("UUID") + xmlCFDI.cFDIRelacionados.Add(cfdir) + End If + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyEmisor Then + Dim curentNivel As Integer = xtr.Depth + cont = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "REGIMENFISCAL" + xmlCFDI.emisor.RegimenFiscal = xtr.Value + Case "NOMBRE" + xmlCFDI.emisor.Nombre = xtr.Value + Case "RFC" + xmlCFDI.emisor.Rfc = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso Not (xtr.NodeType = XmlNodeType.Element AndAlso curentNivel >= xtr.Depth) + End While 'continua hasta que no tenga nodos y (el nodo sea tipo elemento y este en el mismo nivel) + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyReceptor Then + Dim curentNivel As Integer = xtr.Depth + cont = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "RFC" + xmlCFDI.receptor.Rfc = xtr.Value + Case "NOMBRE" + xmlCFDI.receptor.Nombre = xtr.Value + Case "RESIDENCIAFISCAL" + xmlCFDI.receptor.ResidenciaFiscal = xtr.Value + Case "NUMREGIDTRIB" + xmlCFDI.receptor.NumRegIdTrib = xtr.Value + Case "USOCFDI" + xmlCFDI.receptor.UsoCFDI = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso Not (xtr.NodeType = XmlNodeType.Element AndAlso curentNivel >= xtr.Depth) + End While 'continua hasta que no tenga nodos y (el nodo sea tipo elemento y este en el mismo nivel) + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyConceptos Then + Dim cDepth As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + If xtr.Name = "cfdi:Concepto" Then + Dim cDepthb As Integer = xtr.Depth + Dim concepto As New CFDIConcepto() + + cont = xtr.MoveToFirstAttribute() + While cont + Select Case xtr.Name.ToUpper() + Case "CLAVEPRODSERV" + concepto.ClaveProdServ = xtr.Value + Case "NOIDENTIFICACION" + concepto.NoIdentificacion = xtr.Value + Case "CANTIDAD" + concepto.Cantidad = xtr.Value + Case "CLAVEUNIDAD" + concepto.ClaveUnidad = xtr.Value + Case "UNIDAD" + concepto.Unidad = xtr.Value + Case "VALORUNITARIO" + Dim ValorUnitario As Decimal = 0 + Decimal.TryParse(xtr.Value, ValorUnitario) + concepto.ValorUnitario = ValorUnitario + Case "IMPORTE" + Dim Importe As Decimal = 0 + Decimal.TryParse(xtr.Value, Importe) + concepto.Importe = Importe + Case "DESCUENTO" + Dim DDescuento As Decimal = 0 + Decimal.TryParse(xtr.Value, DDescuento) + concepto.Descuento = DDescuento + Case "DESCRIPCION" + concepto.Descripcion = xtr.Value + End Select + cont = xtr.MoveToNextAttribute() + End While + + xtr.MoveToFirstAttribute() + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepthb + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = "cfdi:Impuestos" Then + Dim cDepthc As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepthc + If xtr.Name = "cfdi:Traslado" OrElse xtr.Name = "cfdi:Retencion" Then + Dim impuesto As New CFDIConceptoImpuesto() + impuesto.Impuesto = xtr.GetAttribute("Impuesto") + impuesto.Tipo = xtr.LocalName + Dim Base As Decimal = 0 + Decimal.TryParse(xtr.GetAttribute("Base"), Base) + impuesto.Base = Base + impuesto.TipoFactor = xtr.GetAttribute("TipoFactor") + Dim tasaOCuota As Decimal = 0 + Decimal.TryParse(xtr.GetAttribute("TasaOCuota"), tasaOCuota) + impuesto.TasaOCuota = If(impuesto.TipoFactor = "Tasa", (tasaOCuota * 100).ToString("N4"), xtr.GetAttribute("TasaOCuota")) + Dim ImImporte As Decimal = 0 + Decimal.TryParse(xtr.GetAttribute("Importe"), ImImporte) + impuesto.Importe = ImImporte + + concepto.Impuestos.Add(impuesto) + End If + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + Else + Dim rednew As Boolean = True + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = "cfdi:InformacionAduanera" Then + concepto.NumeroPedimento = xtr.GetAttribute("NumeroPedimento") + rednew = False + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = "cfdi:CuentaPredial" Then + concepto.CuentaPredial = xtr.GetAttribute("CuentaPredial") + rednew = False + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + If rednew Then + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + End If + End While + + xmlCFDI.conceptos.Add(concepto) + End If + End While + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyImpuestos Then + Dim cDepth As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + Dim impuest As New CFDIImpuesto() + If (xtr.Name = "cfdi:Traslado" OrElse xtr.Name = "cfdi:Retencion") AndAlso xmlCFDI.comprobante.Version IsNot Nothing Then + impuest.Tipo = If(xtr.LocalName = "Traslado", "Traslados", If(xtr.LocalName = "Retencion", "Retenciones", "")) + impuest.Impuesto = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("Impuesto"), xtr.GetAttribute("impuesto")) + impuest.TipoFactor = xtr.GetAttribute("TipoFactor") + impuest.TasaOCuota = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("TasaOCuota"), xtr.GetAttribute("tasa")) + Dim ImImporte As Decimal = 0 + Decimal.TryParse(If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("Importe"), xtr.GetAttribute("importe")), ImImporte) + impuest.Importe = ImImporte + xmlCFDI.Impuestos.Add(impuest) + End If + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.Name = keyComplemento Then + Dim cDepth As Integer = xtr.Depth + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > cDepth + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.LocalName = "TimbreFiscalDigital" AndAlso xmlCFDI.comprobante.Version IsNot Nothing Then + xmlCFDI.complemento.xmlns_tfd = xtr.GetAttribute("xmlns:tfd") + xmlCFDI.complemento.xsi_schemaLocation = xtr.GetAttribute("xsi:schemaLocation") + xmlCFDI.complemento.Version = xtr.GetAttribute("Version") + xmlCFDI.complemento.UUID = xtr.GetAttribute("UUID") + xmlCFDI.complemento.FechaTimbrado = xtr.GetAttribute("FechaTimbrado") + xmlCFDI.complemento.RfcProvCertif = xtr.GetAttribute("RfcProvCertif") + xmlCFDI.complemento.SelloCFD = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("SelloCFD"), xtr.GetAttribute("selloCFD")) + xmlCFDI.complemento.NoCertificadoSAT = If(xmlCFDI.comprobante.Version = "3.3", xtr.GetAttribute("NoCertificadoSAT"), xtr.GetAttribute("noCertificadoSAT")) + xmlCFDI.complemento.SelloSAT = If(xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "4.0", xtr.GetAttribute("SelloSAT"), xtr.GetAttribute("selloSAT")) + End If + + If xtr.NodeType = XmlNodeType.Element AndAlso xtr.LocalName = "Pagos" AndAlso xmlCFDI.comprobante.Version IsNot Nothing Then + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + xmlCFDI.complemento.Pagos = New CFDIPago() + Dim depthpagos As Integer = xtr.Depth + Dim conts As Boolean = xtr.MoveToFirstAttribute() + While conts + Dim Base As Decimal = 0 + Select Case xtr.Name.ToUpper() + Case "FECHAPAGO" + xmlCFDI.complemento.Pagos.FechaPago = xtr.Value + Case "FORMADEPAGOP" + xmlCFDI.complemento.Pagos.FormaDePagoP = xtr.Value + Case "FORMADEPAGOPTEXT" + xmlCFDI.complemento.Pagos.FormaDePagoPText = xtr.Value + Case "MONEDAP" + xmlCFDI.complemento.Pagos.MonedaP = xtr.Value + Case "MONTO" + Decimal.TryParse(xtr.Value, Base) + xmlCFDI.complemento.Pagos.Monto = Base + Case "TIPOCAMBIOP" + Decimal.TryParse(xtr.Value, Base) + xmlCFDI.complemento.Pagos.TipoCambioP = Base + Case "NUMOPERACION" + xmlCFDI.complemento.Pagos.NumOperacion = xtr.Value + Case "NOMBANCOORDEXT" + xmlCFDI.complemento.Pagos.NomBancoOrdExt = xtr.Value + Case "RFCEMISORCTAORD" + xmlCFDI.complemento.Pagos.RfcEmisorCtaOrd = xtr.Value + Case "CTAORDENANTE" + xmlCFDI.complemento.Pagos.CtaOrdenante = xtr.Value + Case "RFCEMISORCTABEN" + xmlCFDI.complemento.Pagos.RfcEmisorCtaBen = xtr.Value + Case "CTABENEFICIARIO" + xmlCFDI.complemento.Pagos.CtaBeneficiario = xtr.Value + End Select + conts = xtr.MoveToNextAttribute() + End While + + conts = xtr.MoveToFirstAttribute() + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + + While canread AndAlso xtr.Depth > depthpagos + Dim objpago As New CFDIPagoDoctoRelacionado() + conts = xtr.MoveToFirstAttribute() + While conts + Dim Basep As Decimal = 0 + Select Case xtr.Name.ToUpper() + Case "IDDOCUMENTO" + objpago.IdDocumento = xtr.Value + Case "SERIE" + objpago.Serie = xtr.Value + Case "FOLIO" + objpago.Folio = xtr.Value + Case "MONEDADR" + objpago.MonedaDR = xtr.Value + Case "METODODEPAGODR" + objpago.MetodoDePagoDR = xtr.Value + Case "NUMPARCIALIDAD" + objpago.NumParcialidad = xtr.Value + Case "IMPSALDOANT" + Decimal.TryParse(xtr.Value, Basep) + objpago.ImpSaldoAnt = Basep + Case "IMPPAGADO" + Decimal.TryParse(xtr.Value, Basep) + objpago.ImpPagado = Basep + Case "IMPSALDOINSOLUTO" + Decimal.TryParse(xtr.Value, Basep) + objpago.ImpSaldoInsoluto = Basep + End Select + conts = xtr.MoveToNextAttribute() + End While + + conts = xtr.MoveToFirstAttribute() + xmlCFDI.complemento.Pagos.doctosRelacionados.Add(objpago) + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End While + Else + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + End While + End If + Else + 'si no entro en ninguna de los anteriores no se debe ciclar + While InlineAssignHelper.Assign(canread, xtr.Read()) AndAlso xtr.NodeType <> XmlNodeType.Element + End While + End If + End While + End If + End Using + End If + + If xmlCFDI.comprobante.Version = "4.0" OrElse xmlCFDI.comprobante.Version = "3.3" OrElse xmlCFDI.comprobante.Version = "3.2" Then + Return xmlCFDI + Else + Return Nothing + End If + End Function + + Public Sub ImprimirPDF(UsuarioActual As Usuario, NombreArchivo As String, DirectorioEmpresa As String, TipodeComprobante As String) + Dim objxml As XmlSatCFDI = Me + + Dim rutaReporte As String = $"{DirectorioEmpresas}{If(TipodeComprobante = "Pag", "Grales\Formatos\CFDIV3Pago.rdlc", "Grales\Formatos\CFDIV3.rdlc")}" + + 'Dim rutaReporte As String = If(TipodeComprobante = "Pag", "Grales\Formatos\CFDIV3Pago.rdlc", "Grales\Formatos\CFDIV3.rdlc") + + + Dim cQr As Byte() = Nothing + Try + Dim cfdi As New RVCFDI33.GeneraCFDI() + cQr = cfdi.ConvertirQrCode($"?re={objxml.emisor.Rfc}&rr={objxml.receptor.Rfc}&tt={(If(objxml.complemento.Pagos Is Nothing, objxml.comprobante.Total, objxml.complemento.Pagos.Monto))}&id={objxml.complemento.UUID}") + Catch exQR As Exception + ModExtensiones.GuardaLogAD("Error al generar QR - " & exQR.Message & " - " & exQR.StackTrace.ToString(), ArchivoLog) + End Try + + Dim parametros As New List(Of ReportParameter)() + ' Comprobante + parametros.Add(New ReportParameter("comprobante_Certificado", objxml.comprobante.Certificado)) + parametros.Add(New ReportParameter("comprobante_CondicionesDePago", objxml.comprobante.CondicionesDePago)) + parametros.Add(New ReportParameter("comprobante_Confirmacion", objxml.comprobante.Confirmacion)) + parametros.Add(New ReportParameter("comprobante_Fecha", objxml.comprobante.Fecha)) + parametros.Add(New ReportParameter("comprobante_Serie", objxml.comprobante.Serie)) + parametros.Add(New ReportParameter("comprobante_Folio", objxml.comprobante.Folio)) + parametros.Add(New ReportParameter("comprobante_Descuento", objxml.comprobante.Descuento.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_SubTotal", objxml.comprobante.SubTotal.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_Total", objxml.comprobante.Total.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_Version", objxml.comprobante.Version)) + parametros.Add(New ReportParameter("comprobante_TipoDeComprobante", objxml.comprobante.TipoDeComprobanteTexto)) + parametros.Add(New ReportParameter("comprobante_FormaPago", objxml.comprobante.FormaPagoTexto)) + parametros.Add(New ReportParameter("comprobante_LugarExpedicion", objxml.comprobante.LugarExpedicion)) + parametros.Add(New ReportParameter("comprobante_NoCertificado", objxml.comprobante.NoCertificado)) + parametros.Add(New ReportParameter("comprobante_Sello", objxml.comprobante.Sello)) + parametros.Add(New ReportParameter("comprobante_Moneda", objxml.comprobante.Moneda)) + parametros.Add(New ReportParameter("comprobante_TipoCambio", objxml.comprobante.TipoCambio.ToString("N2"))) + parametros.Add(New ReportParameter("comprobante_MetodoPago", objxml.comprobante.MetodoPagoTexto)) + ' Emisor + parametros.Add(New ReportParameter("emisor_Rfc", objxml.emisor.Rfc)) + parametros.Add(New ReportParameter("emisor_Nombre", objxml.emisor.Nombre)) + parametros.Add(New ReportParameter("emisor_RegimenFiscal", objxml.emisor.RegimenFiscalTexto)) + ' Receptor + parametros.Add(New ReportParameter("receptor_Rfc", objxml.receptor.Rfc)) + parametros.Add(New ReportParameter("receptor_Nombre", objxml.receptor.Nombre)) + parametros.Add(New ReportParameter("receptor_NumRegIdTrib", objxml.receptor.NumRegIdTrib)) + parametros.Add(New ReportParameter("receptor_ResidenciaFiscal", objxml.receptor.ResidenciaFiscal)) + parametros.Add(New ReportParameter("receptor_UsoCFDI", objxml.receptor.UsoCFDITexto)) + ' Complemento + parametros.Add(New ReportParameter("complemento_FechaTimbrado", objxml.complemento.FechaTimbrado)) + parametros.Add(New ReportParameter("complemento_NoCertificadoSAT", objxml.complemento.NoCertificadoSAT)) + parametros.Add(New ReportParameter("complemento_RfcProvCertif", objxml.complemento.RfcProvCertif)) + parametros.Add(New ReportParameter("complemento_SelloCFD", objxml.complemento.SelloCFD)) + parametros.Add(New ReportParameter("complemento_SelloSAT", objxml.complemento.SelloSAT)) + parametros.Add(New ReportParameter("complemento_UUID", objxml.complemento.UUID)) + parametros.Add(New ReportParameter("complemento_CadenaOriginal", objxml.complemento.CadenaOriginal)) + ' Pagos + If objxml.complemento.Pagos IsNot Nothing Then + parametros.Add(New ReportParameter("CPFechaPago", objxml.complemento.Pagos.FechaPago)) + parametros.Add(New ReportParameter("CPFormaDePagoP", objxml.complemento.Pagos.FormaDePagoP)) + parametros.Add(New ReportParameter("CPFormaDePagoPText", objxml.complemento.Pagos.FormaDePagoPText)) + parametros.Add(New ReportParameter("CPMonedaP", objxml.complemento.Pagos.MonedaP)) + parametros.Add(New ReportParameter("CPMonto", objxml.complemento.Pagos.Monto.ToString())) + parametros.Add(New ReportParameter("CPTipoCambioP", objxml.complemento.Pagos.TipoCambioP.ToString())) + parametros.Add(New ReportParameter("CPNumOperacion", objxml.complemento.Pagos.NumOperacion)) + parametros.Add(New ReportParameter("CPNomBancoOrdExt", objxml.complemento.Pagos.NomBancoOrdExt)) + parametros.Add(New ReportParameter("CPRfcEmisorCtaOrd", objxml.complemento.Pagos.RfcEmisorCtaOrd)) + parametros.Add(New ReportParameter("CPCtaOrdenante", objxml.complemento.Pagos.CtaOrdenante)) + parametros.Add(New ReportParameter("CPRfcEmisorCtaBen", objxml.complemento.Pagos.RfcEmisorCtaBen)) + parametros.Add(New ReportParameter("CPCtaBeneficiario", objxml.complemento.Pagos.CtaBeneficiario)) + End If + + Try + Dim listaDS As New List(Of ReportDataSource) + Dim rdsTotales As New ReportDataSource() + 'Dim ltotales As New List(Of utilValores)() + + Dim DTTotales As New DataTable + DTTotales.TableName = "DTTotales" + DTTotales.Columns.Add("Nombre") + DTTotales.Columns.Add("Valor") + + Dim nRowSubtotales As DataRow = DTTotales.NewRow + nRowSubtotales("Nombre") = "Subtotal" + nRowSubtotales("Valor") = objxml.comprobante.SubTotal.ToString("N2") + DTTotales.Rows.Add(nRowSubtotales) + + If objxml.comprobante.Descuento > 0 Then + Dim nRowDescuento As DataRow = DTTotales.NewRow + nRowDescuento("Nombre") = "Descuento" + nRowDescuento("Valor") = objxml.comprobante.Descuento.ToString("N2") + DTTotales.Rows.Add(nRowDescuento) + End If + + For Each item As CFDIImpuesto In objxml.Impuestos + Dim nRow As DataRow = DTTotales.NewRow + If item.Importe > 0 Then + Dim TasaOCuota As Decimal = 0 + Decimal.TryParse(item.TasaOCuota, TasaOCuota) + nRow("Nombre") = $"Impuestos {item.Tipo} {item.ImpuestoTexto} {(If(item.TipoFactor = "Tasa", (TasaOCuota * 100).ToString("N4"), item.TasaOCuota))} {(If(item.TipoFactor = "Tasa", "%", ""))}" + nRow("Valor") = item.Importe.ToString("N2") + DTTotales.Rows.Add(nRow) + + End If + Next + + Dim nRowTotal As DataRow = DTTotales.NewRow + nRowTotal("Nombre") = "Subtotal" + nRowTotal("Valor") = objxml.comprobante.Total.ToString("N2") + DTTotales.Rows.Add(nRowTotal) + + rdsTotales.Name = "dsTotales" + rdsTotales.Value = DTTotales 'ltotales.ToDataTable + listaDS.Add(rdsTotales) + + + Dim dtByte As New DataTable() + dtByte.Columns.Add("ImagenByte", GetType(Byte())) + dtByte.TableName = "dtImagenes" + Dim nrowByteArray As DataRow = dtByte.NewRow + nrowByteArray("ImagenByte") = cQr + dtByte.Rows.Add(nrowByteArray) + + 'byteArrayList.Add(cQr) + Dim rds2 As New ReportDataSource() + 'Dim limagenes As New List(Of utilImage)() + 'limagenes.Add(New utilImage(cQr)) + rds2.Name = "dsImagenes" + rds2.Value = dtByte + listaDS.Add(rds2) + + + Dim dtRelacionados As New DataTable + dtRelacionados.TableName = "dtRelacionados" + dtRelacionados.Columns.Add("TipoRelacion") + dtRelacionados.Columns.Add("TipoRelacionTexto") + dtRelacionados.Columns.Add("UUID") + + + For Each relaciondo As CFDIRelacionado In objxml.cFDIRelacionados + Dim CFDIRelacionadoRow As DataRow = dtRelacionados.NewRow + CFDIRelacionadoRow("TipoRelacion") = relaciondo.TipoRelacion + CFDIRelacionadoRow("TipoRelacionTexto") = relaciondo.TipoRelacionTexto + CFDIRelacionadoRow("UUID") = relaciondo.UUID + dtRelacionados.Rows.Add(CFDIRelacionadoRow) + Next + + Dim rdsrelacionados As New ReportDataSource() + rdsrelacionados.Name = "dsRelacionados" + rdsrelacionados.Value = dtRelacionados 'objxml.cFDIRelacionados + listaDS.Add(rdsrelacionados) + + + + Dim dtConceptos As New DataTable + dtConceptos.TableName = "dtConceptos" + dtConceptos.Columns.Add("tipo", GetType(Integer)) + dtConceptos.Columns.Add("orden", GetType(Integer)) + dtConceptos.Columns.Add("ClaveProdServ", GetType(String)) + dtConceptos.Columns.Add("NoIdentificacion", GetType(String)) + dtConceptos.Columns.Add("Cantidad", GetType(String)) ' Nota: Se asume que es cadena, cambiar si necesario + dtConceptos.Columns.Add("ClaveUnidad", GetType(String)) + dtConceptos.Columns.Add("Unidad", GetType(String)) + dtConceptos.Columns.Add("ValorUnitario", GetType(Decimal)) + dtConceptos.Columns.Add("Importe", GetType(Decimal)) + dtConceptos.Columns.Add("Descuento", GetType(Decimal)) + dtConceptos.Columns.Add("NumeroPedimento", GetType(String)) + dtConceptos.Columns.Add("CuentaPredial", GetType(String)) + dtConceptos.Columns.Add("Descripcion", GetType(String)) + dtConceptos.Columns.Add("Impuesto", GetType(String)) + dtConceptos.Columns.Add("Impuesto_Tipo", GetType(String)) + dtConceptos.Columns.Add("Impuesto_Base", GetType(Decimal)) + dtConceptos.Columns.Add("Impuesto_TipoFactor", GetType(String)) + dtConceptos.Columns.Add("Impuesto_TasaOCuota", GetType(String)) + dtConceptos.Columns.Add("Impuesto_Importe", GetType(Decimal)) + + For Each concepto As CFDIConcepto_I In objxml.GetConceptosforpdf() + Dim CFDIRelacionadoRow As DataRow = dtConceptos.NewRow + + CFDIRelacionadoRow("tipo") = concepto.tipo + CFDIRelacionadoRow("orden") = concepto.orden + CFDIRelacionadoRow("ClaveProdServ") = concepto.ClaveProdServ + CFDIRelacionadoRow("NoIdentificacion") = concepto.NoIdentificacion + CFDIRelacionadoRow("Cantidad") = concepto.Cantidad + CFDIRelacionadoRow("ClaveUnidad") = concepto.ClaveUnidad + CFDIRelacionadoRow("Unidad") = concepto.Unidad + CFDIRelacionadoRow("ValorUnitario") = concepto.ValorUnitario + CFDIRelacionadoRow("Importe") = concepto.Importe + CFDIRelacionadoRow("Descuento") = concepto.Descuento + CFDIRelacionadoRow("NumeroPedimento") = concepto.NumeroPedimento + CFDIRelacionadoRow("CuentaPredial") = concepto.CuentaPredial + CFDIRelacionadoRow("Descripcion") = concepto.Descripcion + CFDIRelacionadoRow("Impuesto") = concepto.Impuesto + CFDIRelacionadoRow("Impuesto_Tipo") = concepto.Impuesto_Tipo + CFDIRelacionadoRow("Impuesto_Base") = concepto.Impuesto_Base + CFDIRelacionadoRow("Impuesto_TipoFactor") = concepto.Impuesto_TipoFactor + CFDIRelacionadoRow("Impuesto_TasaOCuota") = If(concepto.Impuesto_TasaOCuota Is Nothing, "", concepto.Impuesto_TasaOCuota) + CFDIRelacionadoRow("Impuesto_Importe") = If(concepto.Impuesto_Importe > 0, concepto.Impuesto_Importe, 0) + + dtConceptos.Rows.Add(CFDIRelacionadoRow) + Next + + + + Dim rds1 As New ReportDataSource() + rds1.Name = "dsConceptos" + rds1.Value = dtConceptos 'objxml.GetConceptosforpdf() + listaDS.Add(rds1) + + + If objxml.complemento.Pagos IsNot Nothing Then + + ' Crear un nuevo DataTable y agregar las columnas correspondientes + Dim DTdoctosRelacionados As New DataTable() + DTdoctosRelacionados.TableName = "dtDocumentos" + + ' Agregar todas las columnas respetando los tipos de datos + DTdoctosRelacionados.Columns.Add("IdDocumento", GetType(String)) + DTdoctosRelacionados.Columns.Add("Serie", GetType(String)) + DTdoctosRelacionados.Columns.Add("Folio", GetType(String)) + DTdoctosRelacionados.Columns.Add("MonedaDR", GetType(String)) + DTdoctosRelacionados.Columns.Add("MetodoDePagoDR", GetType(String)) + DTdoctosRelacionados.Columns.Add("NumParcialidad", GetType(String)) + DTdoctosRelacionados.Columns.Add("ImpSaldoAnt", GetType(Decimal)) + DTdoctosRelacionados.Columns.Add("ImpPagado", GetType(Decimal)) + DTdoctosRelacionados.Columns.Add("ImpSaldoInsoluto", GetType(Decimal)) + + ' Llenar el DataTable con los valores de la lista de documentos + For Each doctosRelacionado As CFDIPagoDoctoRelacionado In objxml.complemento.Pagos.doctosRelacionados + Dim nRowdoctosRelacionados As DataRow = DTdoctosRelacionados.NewRow() + + ' Asignar valores a cada columna desde las propiedades del objeto documento + nRowdoctosRelacionados("IdDocumento") = doctosRelacionado.IdDocumento + nRowdoctosRelacionados("Serie") = doctosRelacionado.Serie + nRowdoctosRelacionados("Folio") = doctosRelacionado.Folio + nRowdoctosRelacionados("MonedaDR") = doctosRelacionado.MonedaDR + nRowdoctosRelacionados("MetodoDePagoDR") = doctosRelacionado.MetodoDePagoDR + nRowdoctosRelacionados("NumParcialidad") = doctosRelacionado.NumParcialidad + nRowdoctosRelacionados("ImpSaldoAnt") = doctosRelacionado.ImpSaldoAnt + nRowdoctosRelacionados("ImpPagado") = doctosRelacionado.ImpPagado + nRowdoctosRelacionados("ImpSaldoInsoluto") = doctosRelacionado.ImpSaldoInsoluto + + ' Agregar la fila al DataTable + DTdoctosRelacionados.Rows.Add(nRowdoctosRelacionados) + Next + + Dim rdsp As New ReportDataSource() + rdsp.Name = "dsPagos" + rdsp.Value = DTdoctosRelacionados ' objxml.complemento.Pagos.doctosRelacionados + listaDS.Add(rdsp) + + + End If + + + 'Dim bytes As Byte() = Nothing + 'bytes = MR.LocalReport.Render("PDF", Nothing, mimeType, encoding, extension, streamids, warnings) + Dim bytes As Byte() = Nothing + bytes = StreamPDF(UsuarioActual, rutaReporte, listaDS, parametros, NombreArchivo:=NombreArchivo, Formato:="PDF") + + If bytes IsNot Nothing Then + Using fs As New FileStream(NombreArchivo, FileMode.Create) + fs.Write(bytes, 0, bytes.Length) + fs.Close() + End Using + End If + + Catch ex As Exception + ex.ToString().GuardaLogAD() + End Try + + End Sub + + Public Class utilValores + + Public Sub New() + ' Constructor sin parámetros + End Sub + + Public Sub New(nombre As String, valor As String) + Me.Nombre = nombre + Me.Valor = valor + End Sub + Public Property Nombre As String + Public Property Valor As String + End Class + + Public Class utilImage + Public Sub New(imagenByte As Byte()) + Me.ImagenByte = imagenByte + End Sub + Public Property ImagenByte As Byte() + End Class + + Public Function StreamPDF(UsuarioActual As Usuario, RutaReporte As String, DataSource As List(Of ReportDataSource), Parametros As List(Of ReportParameter), Optional NombreArchivo As String = "Reporte", Optional Formato As String = "PDF", Optional MR As ReportViewer = Nothing, Optional SubReportData As Modelos.MSubReportData = Nothing) As Byte() + 'limpio ReportViwer + Dim sw As Stopwatch = Stopwatch.StartNew() + + + Dim Bytes As Byte() = Nothing + Dim CveUsuario As Integer = 0 + Dim CveEmpresa As Integer = 0 + Dim RutaEmpresa As String = "" + If UsuarioActual IsNot Nothing Then + CveUsuario = UsuarioActual.CveUsuario + CveEmpresa = UsuarioActual.CveEmpresa + RutaEmpresa = UsuarioActual.Empresa.Ruta + End If + + Dim bdir As String = If(RutaReporte.Contains("Empresas"), ModExtensiones.DirectorioBaseEmpresas, AppDomain.CurrentDomain.BaseDirectory) + 'TOMAR LA RUTA BASE PARA EL DIRECTORIO DE LA EMPRESA + If Not String.IsNullOrEmpty(RutaEmpresa) AndAlso Not RutaReporte.Contains("Grales") AndAlso Not RutaReporte.Contains("Contabilidad/Reportes/") AndAlso Not RutaReporte.Contains("Contabilidad/Reportes/") AndAlso Not RutaReporte.Contains("AC/Reportes/") Then + bdir = RutaEmpresa.Replace($"{CveEmpresa}/", "") + End If + RutaReporte.Replace("/", "\") + If Not RutaReporte.ToUpper().StartsWith(bdir.ToUpper()) Then + RutaReporte = String.Format("{0}{1}", bdir, RutaReporte) + End If + If EsProduccion Then + Dim wsreport As New WSRDLC2.WebServiceSoapClient + Dim params As New List(Of WSRDLC2.ReportParameter) + Dim reportobjects As New List(Of WSRDLC2.ReportObjects) + Dim jsonData As String = Nothing + If SubReportData IsNot Nothing Then + jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(SubReportData) + End If + Dim ds As New DataSet + For Each rpds As ReportDataSource In DataSource + If rpds.Value IsNot Nothing Then + If rpds.Value.GetType().ToString() = "System.Data.DataTable" Then + Dim dt As DataTable = DirectCast(rpds.Value, Data.DataTable) + dt = dt.Copy() + dt.TableName = rpds.Name + ds.Tables.Add(dt) + Else + Dim ojext As New WSRDLC2.ReportObjects + ojext.Name = rpds.Name + ojext.Value = rpds.Value + reportobjects.Add(ojext) + End If + Else + Dim dt As DataTable = New DataTable() + dt.TableName = If(String.IsNullOrEmpty(rpds.Name), "DataTable1", rpds.Name) + ds.Tables.Add(dt) + End If + Next + For Each rpds As ReportParameter In Parametros + Dim param As New WSRDLC2.ReportParameter + param.Name = rpds.Name + 'SI ES TEXTO, QUITAR TABS Y OTROS ESPACIOS QUE DEN PROBLEMAS AL MANDAR LA PETICION + If rpds IsNot Nothing AndAlso rpds.Values IsNot Nothing AndAlso rpds.Values.Count > 0 AndAlso rpds.Values(0) IsNot Nothing AndAlso rpds.Values(0).GetType() = GetType(String) Then + param.Values = {rpds.Values(0).Replace(vbVerticalTab, "")} + Else + param.Values = {rpds.Values(0)} + End If + params.Add(param) + Next + Bytes = wsreport.StreamNEWPDFBytes(RutaReporte, ds, reportobjects.ToArray(), params.ToArray(), NombreArchivo, Formato, CveEmpresa, CveUsuario, jsonData) + wsreport = Nothing + params = Nothing + ds.Dispose() : ds = Nothing + Else + If IsNothing(MR) Then MR = New ReportViewer + Try + ' MasterReporteador.LocalReport.DataSources.Clear() + For Each RDS As ReportDataSource In DataSource + MR.LocalReport.DataSources.Add(RDS) + Next + MR.LocalReport.ReportPath = RutaReporte + MR.ProcessingMode = ProcessingMode.Local + MR.LocalReport.EnableExternalImages = True + MR.LocalReport.SetParameters(Parametros) + MR.LocalReport.Refresh() + Dim Warnings As Warning() = Nothing + Dim StreamIds As String() = Nothing + Dim MimeType As String = Nothing + Dim Encoding As String = Nothing + Dim Extension As String = Nothing + Bytes = MR.LocalReport.Render(Formato, Nothing, MimeType, Encoding, Extension, StreamIds, Warnings) + Catch ex As Microsoft.Reporting.WebForms.ScriptManagerNotFoundException + GuardaLog($"Error: { If(ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, ex.Message) } | Descripcion: {If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException.Message IsNot Nothing, ex.InnerException.InnerException.Message, If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, "Sin descripcion"))} - Ruta {RutaReporte}") + 'HAY QUE VALIDAR QUE LOS OBJETOS QUE SE USAN PARA GUARDAR LOG EXISTEN!!! IPP 14 AGOSTO 2017 + 'GuardaLog($"Error: {ex.InnerException.Message} | Descripcion: {If(ex.InnerException.InnerException IsNot Nothing, ex.InnerException.InnerException.Message, "Sin descripcion")} - Ruta {RutaReporte}") + Catch ex As Exception + GuardaLog($"Error: { If(ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, ex.Message) } | Descripcion: {If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException IsNot Nothing AndAlso ex.InnerException.InnerException.Message IsNot Nothing, ex.InnerException.InnerException.Message, If(ex.InnerException IsNot Nothing AndAlso ex.InnerException.Message IsNot Nothing, ex.InnerException.Message, "Sin descripcion"))} - Ruta {RutaReporte}") + 'HAY QUE VALIDAR QUE LOS OBJETOS QUE SE USAN PARA GUARDAR LOG EXISTEN!!! IPP 14 AGOSTO 2017 + 'GuardaLog($"Error {ex.InnerException.Message} | Descripcion: {If(ex.InnerException.InnerException IsNot Nothing, ex.InnerException.InnerException.Message, "Sin descripcion")} - Ruta {RutaReporte}") + End Try + + Try + MR.Dispose() + Catch ex As Exception + GuardaLog($"Error: { ex.ToString() }") + End Try + + MR = Nothing + + End If + sw.Stop() + If sw.Elapsed.TotalSeconds > 5 Then + GuardaLog($"Reporte:{RutaReporte} | Tiempo Renderizado Milisegundos: {sw.ElapsedMilliseconds},Total Segundos: {sw.Elapsed.TotalSeconds} ") + End If + Return Bytes + End Function + End Class + + Public Module InlineAssignHelper + Public Function Assign(Of T)(ByRef target As T, value As T) As T + target = value + Return value + End Function + End Module + +#Region "impresion nd" + Public Class CFDIComprobante + Public Property xmlns_cfdi As String + Public Property xmlns_xsi As String + Public Property xsi_schemaLocation As String + Public Property Version As String + Public Property Serie As String + Public Property Folio As String + Public Property Fecha As String + Public Property Moneda As String + Public Property SubTotal As Decimal + Public Property Total As Decimal + Public Property Descuento As Decimal + Public Property TipoCambio As Decimal + Public Property TipoDeComprobante As String + Public ReadOnly Property TipoDeComprobanteTexto As String + Get + Dim retorno As String = "" + If Version = "3.3" OrElse Version = "4.0" Then + Select Case TipoDeComprobante + Case "I" + retorno = "Ingreso" + Case "E" + retorno = "Egreso" + Case "P" + retorno = "Pago" + Case "T" + retorno = "Traslado" + Case "N" + retorno = "Nómina" + Case Else + retorno = TipoDeComprobante + End Select + End If + If Version = "3.2" Then + Select Case TipoDeComprobante + Case "ingreso" + retorno = "Ing" + Case "egreso" + retorno = "Egs" + Case "P" + retorno = "PA" + Case Else + retorno = TipoDeComprobante + End Select + Else + retorno = TipoDeComprobante + End If + Return retorno + End Get + End Property + Public ReadOnly Property TipoDeComprobanteSIG As String + Get + Dim retorno As String = "" + If Version = "3.3" OrElse Version = "4.0" Then + Select Case TipoDeComprobante + Case "I" + retorno = "Ing" + Case "E" + retorno = "Egs" + Case "P" + retorno = "PA" + Case Else + retorno = TipoDeComprobante + End Select + End If + If Version = "3.2" Then + Select Case TipoDeComprobante + Case "ingreso" + retorno = "Ing" + Case "egreso" + retorno = "Egs" + Case "P" + retorno = "PA" + Case Else + retorno = TipoDeComprobante + End Select + Else + retorno = TipoDeComprobante + End If + Return retorno + End Get + End Property + Public Property FormaPago As String + Public ReadOnly Property FormaPagoTexto As String + Get + Dim retorno As String = "" + Select Case FormaPago + Case "01" + retorno = "Efectivo" + Case "02" + retorno = "Cheque nominativo" + Case "03" + retorno = "Transferencia electrónica de fondos" + Case "04" + retorno = "Tarjeta de crédito" + Case "05" + retorno = "Monedero electrónico" + Case "06" + retorno = "Dinero electrónico" + Case "08" + retorno = "Vales de despensa" + Case "12" + retorno = "Dación en pago" + Case "13" + retorno = "Pago por subrogación" + Case "14" + retorno = "Pago por consignación" + Case "15" + retorno = "Condonación" + Case "17" + retorno = "Compensación" + Case "23" + retorno = "Novación" + Case "24" + retorno = "Confusión" + Case "25" + retorno = "Remisión de deuda" + Case "26" + retorno = "Prescripción o caducidad" + Case "27" + retorno = "A satisfacción del acreedor" + Case "28" + retorno = "Tarjeta de débito" + Case "29" + retorno = "Tarjeta de servicios" + Case "30" + retorno = "Aplicación de anticipos" + Case "31" + retorno = "Intermediario pagos" + Case "99" + retorno = "Por definir" + Case Else + retorno = FormaPago + End Select + Return retorno + End Get + End Property + Public Property MetodoPago As String + Public ReadOnly Property MetodoPagoTexto As String + Get + Dim retorno As String = "" + Select Case MetodoPago + Case "PUE" + retorno = "Pago en una sola exhibición" + Case "PPD" + retorno = "Pago en parcialidades o diferido" + Case Else + retorno = MetodoPago + End Select + Return retorno + End Get + End Property + Public Property CondicionesDePago As String + Public Property LugarExpedicion As String + Public Property Confirmacion As String + Public Property NoCertificado As String + Public Property Sello As String + Public Property Certificado As String + End Class + + Public Class CFDIEmisor + Public Property RegimenFiscal As String + Public ReadOnly Property RegimenFiscalTexto As String + Get + Dim retorno As String = "" + Select Case RegimenFiscal + Case "601" + retorno = "General de Ley Personas Morales" + Case "603" + retorno = "Personas Morales con Fines no Lucrativos" + Case "605" + retorno = "Sueldos y Salarios e Ingresos Asimilados a Salarios" + Case "606" + retorno = "Arrendamiento" + Case "608" + retorno = "Demás ingresos" + Case "609" + retorno = "Consolidación" + Case "610" + retorno = "Residentes en el Extranjero sin Establecimiento Permanente en México" + Case "611" + retorno = "Ingresos por Dividendos (socios y accionistas)" + Case "612" + retorno = "Personas Físicas con Actividades Empresariales y Profesionales" + Case "614" + retorno = "Ingresos por intereses" + Case "616" + retorno = "Sin obligaciones fiscales" + Case "620" + retorno = "Sociedades Cooperativas de Producción que optan por diferir sus ingresos" + Case "621" + retorno = "Incorporación Fiscal" + Case "622" + retorno = "Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras" + Case "623" + retorno = "Opcional para Grupos de Sociedades" + Case "624" + retorno = "Coordinados" + Case "628" + retorno = "Hidrocarburos" + Case "607" + retorno = "Régimen de Enajenación o Adquisición de Bienes" + Case "629" + retorno = "De los Regímenes Fiscales Preferentes y de las Empresas Multinacionales" + Case "630" + retorno = "Enajenación de acciones en bolsa de valores" + Case "615" + retorno = "Régimen de los ingresos por obtención de premios" + End Select + Return retorno + End Get + End Property + Public Property Nombre As String + Public Property Rfc As String + End Class + + Public Class CFDIReceptor + Public Property Rfc As String + Public Property Nombre As String + Public Property ResidenciaFiscal As String + Public Property NumRegIdTrib As String + Public Property UsoCFDI As String + Public ReadOnly Property UsoCFDITexto As String + Get + Dim retorno As String = "N/A" + Select Case UsoCFDI + Case "G01" + retorno = "Adquisición de mercancías" + Case "G02" + retorno = "Devoluciones, descuentos o bonificaciones" + Case "G03" + retorno = "Gastos en general" + Case "I01" + retorno = "Construcciones" + Case "I02" + retorno = "Mobiliario y equipo de oficina por inversiones" + Case "I03" + retorno = "Equipo de transporte" + Case "I04" + retorno = "Equipo de cómputo y accesorios" + Case "I05" + retorno = "Dados, troqueles, moldes, matrices y herramental" + Case "I06" + retorno = "Comunicaciones telefónicas" + Case "I07" + retorno = "Comunicaciones satelitales" + Case "I08" + retorno = "Otra maquinaria y equipo" + Case "D01" + retorno = "Honorarios médicos, dentales y gastos hospitalarios." + Case "D02" + retorno = "Gastos médicos por incapacidad o discapacidad" + Case "D03" + retorno = "Gastos funerales." + Case "D04" + retorno = "Donativos." + Case "D05" + retorno = "Intereses reales efectivamente pagados por créditos hipotecarios (casa habitación)." + Case "D06" + retorno = "Aportaciones voluntarias al SAR." + Case "D07" + retorno = "Primas por seguros de gastos médicos." + Case "D08" + retorno = "Gastos de transportación escolar obligatoria." + Case "D09" + retorno = "Depósitos en cuentas para el ahorro, primas que tengan como base planes de pensiones." + Case "D10" + retorno = "Pagos por servicios educativos (colegiaturas)" + Case "P01" + retorno = "Por definir" + Case Else + retorno = UsoCFDI + End Select + Return retorno + End Get + End Property + End Class + + Public Class CFDIComplemento + Public Property xmlns_tfd As String + Public Property xsi_schemaLocation As String + Public Property Version As String + Public Property UUID As String + Public Property FechaTimbrado As String + Public Property RfcProvCertif As String + Public Property SelloCFD As String + Public Property NoCertificadoSAT As String + Public Property SelloSAT As String + Public Property Pagos As CFDIPago + + Public ReadOnly Property CadenaOriginal As String + Get + Return $"||{Version}|{UUID}|{FechaTimbrado}|{RfcProvCertif}|{SelloCFD}|{NoCertificadoSAT}||" + End Get + End Property + End Class + + Public Class CFDIPago + Public Sub New() + doctosRelacionados = New List(Of CFDIPagoDoctoRelacionado)() + End Sub + + Public Property FechaPago As String + Public Property FormaDePagoP As String + Public Property FormaDePagoPText As String + Public Property MonedaP As String + Public Property Monto As Decimal + Public Property TipoCambioP As Decimal + Public Property NumOperacion As String + Public Property NomBancoOrdExt As String + Public Property RfcEmisorCtaOrd As String + Public Property CtaOrdenante As String + Public Property RfcEmisorCtaBen As String + Public Property CtaBeneficiario As String + Public Property doctosRelacionados As List(Of CFDIPagoDoctoRelacionado) + End Class + + Public Class CFDIPagoDoctoRelacionado + Public Property IdDocumento As String + Public Property Serie As String + Public Property Folio As String + Public Property MonedaDR As String + Public Property MetodoDePagoDR As String + Public Property NumParcialidad As String + Public Property ImpSaldoAnt As Decimal + Public Property ImpPagado As Decimal + Public Property ImpSaldoInsoluto As Decimal + End Class + + Public Class CFDIRelacionado + Public Property TipoRelacion As String + Public ReadOnly Property TipoRelacionTexto As String + Get + Dim retorno As String = "" + Select Case TipoRelacion + Case "01" + retorno = "Nota de crédito de los documentos relacionados" + Case "02" + retorno = "Nota de débito de los documentos relacionados" + Case "03" + retorno = "Devolución de mercancía sobre facturas o traslados previos" + Case "04" + retorno = "Sustitución de los CFDI previos" + Case "05" + retorno = "Traslados de mercancías facturados previamente" + Case "06" + retorno = "Factura generada por los traslados previos" + Case "07" + retorno = "CFDI por aplicación de anticipo" + Case Else + retorno = "Por definir" + End Select + Return retorno + End Get + End Property + Public Property UUID As String + End Class + + Public Class CFDIConcepto + Public Sub New() + Impuestos = New List(Of CFDIConceptoImpuesto)() + End Sub + + Public Property ClaveProdServ As String + Public Property NoIdentificacion As String + Public Property Cantidad As String + Public Property ClaveUnidad As String + Public Property Unidad As String + Public Property ValorUnitario As Decimal + Public Property Importe As Decimal + Public Property Descuento As Decimal + Public Property NumeroPedimento As String + Public Property CuentaPredial As String + Public Property Descripcion As String + Public Property Impuestos As List(Of CFDIConceptoImpuesto) + End Class + + Public Class CFDIConceptoImpuesto + Public Property Impuesto As String + Public ReadOnly Property ImpuestoTexto As String + Get + Dim retorno As String = "" + Select Case Impuesto + Case "001" + retorno = "ISR" + Case "002" + retorno = "IVA" + Case "003" + retorno = "IEPS" + End Select + Return retorno + End Get + End Property + Public Property Tipo As String + Public Property Base As Decimal + Public Property TipoFactor As String + Public Property TasaOCuota As String + Public Property Importe As Decimal + End Class + + Public Class CFDIImpuesto + Public Property Tipo As String + Public Property Impuesto As String + Public ReadOnly Property ImpuestoTexto As String + Get + Dim retorno As String = "" + Select Case Impuesto + Case "001" + retorno = "ISR" + Case "002" + retorno = "IVA" + Case "003" + retorno = "IEPS" + End Select + Return retorno + End Get + End Property + Public Property TipoFactor As String + Public Property TasaOCuota As String + Public Property Importe As Decimal + End Class + + Public Class CFDIConcepto_I + Public Property tipo As Integer + Public Property orden As Integer + Public Property ClaveProdServ As String + Public Property NoIdentificacion As String + Public Property Cantidad As String + Public Property ClaveUnidad As String + Public Property Unidad As String + Public Property ValorUnitario As Decimal + Public Property Importe As Decimal + Public Property Descuento As Decimal + Public Property NumeroPedimento As String + Public Property CuentaPredial As String + Public Property Descripcion As String + Public Property Impuesto As String + Public Property Impuesto_Tipo As String + Public Property Impuesto_Base As Decimal + Public Property Impuesto_TipoFactor As String + Public Property Impuesto_TasaOCuota As String + Public Property Impuesto_Importe As Decimal + End Class + +#End Region + +End Namespace + + +#End Region + + + + + diff --git a/Bancos/PopIEVentas.aspx.vb b/Bancos/PopIEVentas.aspx.vb index 5731c6c7d..7f47b4731 100644 --- a/Bancos/PopIEVentas.aspx.vb +++ b/Bancos/PopIEVentas.aspx.vb @@ -1243,16 +1243,21 @@ Partial Class Bancos_PopIEVentas Pago.Fecha = TxtFechaDocumento.Text.ToDate Pago.CveMonedaPago = CveMoneda Pago.Referencia = VentaActual.SerieFolio + + If TxtComision.Text.ToDecimal <> 0 Then Pago.OtroGastoIngreso = TxtComision.Text.ToDecimal Else Pago.OtroGastoIngreso = 0 + If DdlOtrosPagos.SelectedValue = "2" Then ImportePagado = TxtImporte.Text.Trim.ToDecimal.RoundSQL + TxtComision.Text.ToDecimal Else ImportePagado = TxtImporte.Text.Trim.ToDecimal.RoundSQL End If - ImportePagadoVenta = ImportePagado + + ImportePagadoVenta = ImportePagado - Pago.OtroGastoIngreso + 'Tipos de cambio If Pago.CveMonedaPago = 1 AndAlso VentaActual.CveMoneda = 2 Then 'Si la venta viene en Dolares y se va a pagar en Pesos 'Pago.TCPago = 1 / TxtTipoCambio.Text.ToDecimal - ImportePagadoVenta = (ImportePagado / TxtTipoCambio.Text.ToDecimal).RoundSQL + ImportePagadoVenta = (ImportePagadoVenta / TxtTipoCambio.Text.ToDecimal).RoundSQL ElseIf Pago.CveMonedaPago = 2 AndAlso VentaActual.CveMoneda = 2 Then 'Si la venta viene en Dolares y se va a pagar en DOLARES Pago.TCPago = TxtTCDolaresDolares.Text.ToDecimal ElseIf Pago.CveMonedaPago = 2 AndAlso VentaActual.CveMoneda = 1 Then 'Si la venta viene en pesos y se va a pagar en DOLARES @@ -1261,8 +1266,6 @@ Partial Class Bancos_PopIEVentas 'If ChkPagarPesos.Checked Then Pago.TCPago = 1 / TxtTipoCambio.Text.ToDecimal If ChkPagarDolares.Checked Then Pago.TCPago = TxtTipoCambio.Text.ToDecimal - If TxtComision.Text.ToDecimal <> 0 Then Pago.OtroGastoIngreso = TxtComision.Text.ToDecimal Else Pago.OtroGastoIngreso = 0 - Select Case RBLContado.SelectedValue Case "1" ' Banco CveIE = ObjIE.AddBancos_IE(DdlCuenta.SelectedValue.ToEntero, DdlTipoTransaccion.SelectedValue.ToEntero, Fecha, TxtFolio.Text.Trim, TxtPagueseA.Text.Trim, ImportePagado, CveMoneda, Pago.TCPago, TxtObservaciones.Text.Trim, "", @@ -1286,7 +1289,7 @@ Partial Class Bancos_PopIEVentas Case "2" ' FyE Pago.ImportePago = ImportePagado - Pago.ImportePagoVenta = ImportePagado - Pago.OtroGastoIngreso + Pago.ImportePagoVenta = ImportePagadoVenta Pago.TipoPago = "FyE" Pago.CvePersonal = DdlFuncionarioEmpleado.SelectedValue.ToEntero Pago.Referencia = DdlFuncionarioEmpleado.SelectedItem.ToString diff --git a/Compras/Compras.aspx b/Compras/Compras.aspx index 6f55e7050..a80a8b9a8 100644 --- a/Compras/Compras.aspx +++ b/Compras/Compras.aspx @@ -1494,36 +1494,36 @@
-
- - - - - - -
Compra: - - - -
+
+
+ + + + + +
Almacen: + +
+
+
+ + + + + + +
Compra: + + + +
+
+
-
-
- - - - - -
Almacen: - -
-
-
- -
+ @@ -1533,6 +1533,7 @@ + @@ -1541,9 +1542,9 @@ - + - + diff --git a/Compras/Compras.aspx.vb b/Compras/Compras.aspx.vb index 4c2820c32..033be19eb 100644 --- a/Compras/Compras.aspx.vb +++ b/Compras/Compras.aspx.vb @@ -1271,8 +1271,44 @@ Partial Class Compras_Compras ViewState("FechaMovtoDev") = value End Set End Property + Private Property DevolucionImporteOriginal As Decimal + Get + If ViewState("DevolucionImporteOriginal") Is Nothing Then + ViewState("DevolucionImporteOriginal") = 0 + End If + Return ViewState("DevolucionImporteOriginal").ToString.ToDecimal + End Get + Set(value As Decimal) + ViewState("DevolucionImporteOriginal") = value + End Set + End Property + Private Property ObsOC As String + Get + If ViewState("ObsOC") Is Nothing Then + ViewState("ObsOC") = "" + End If + + Return ViewState("ObsOC").ToString + End Get + Set(value As String) + ViewState("ObsOC") = value + End Set + End Property + + Private Property AplicarObsOC As Boolean + Get + If ViewState("AplicarObsOC") Is Nothing Then + ViewState("AplicarObsOC") = False + End If + + Return Boolean.Parse(ViewState("AplicarObsOC").ToString) + End Get + Set(value As Boolean) + ViewState("AplicarObsOC") = value + End Set + End Property @@ -2893,204 +2929,204 @@ Partial Class Compras_Compras TxtSubTotal2.Text = (dr("SubTotal").ToString.ToDouble - dr("Descuentos").ToString.ToDouble).FormatoNumero(2) TxtDescuento.Text = dr("Descuentos").ToString.FormatoNumero(2) - LblAmortizacion.Text = dr("Amortizacion").ToString.FormatoNumero(2) - TxtIVA.Text = dr("IVA").ToString.FormatoNumero(2) - TxtRetIVA.Text = dr("RetIVA").ToString.FormatoNumero(2) - TxtRetISR.Text = dr("RetISR").ToString.FormatoNumero(2) - TxtIEPS.Text = dr("IEPS").ToString.FormatoNumero(2) - If dr("IEPS").ToString.ToDouble > 0 Then TrIEPS.Visible = True - If dr("RetIVA").ToString.ToDouble > 0 Then TrRetIVA.Visible = True - If dr("RetISR").ToString.ToDouble > 0 Then TrRetISR.Visible = True - If Math.Abs(dr("Redondeo").ToString.ToDouble) > 0 Then TrRedondeo.Visible = True - TxtRedondeo.Text = dr("Redondeo").ToString.FormatoNumero(2) + LblAmortizacion.Text = dr("Amortizacion").ToString.FormatoNumero(2) + TxtIVA.Text = dr("IVA").ToString.FormatoNumero(2) + TxtRetIVA.Text = dr("RetIVA").ToString.FormatoNumero(2) + TxtRetISR.Text = dr("RetISR").ToString.FormatoNumero(2) + TxtIEPS.Text = dr("IEPS").ToString.FormatoNumero(2) + If dr("IEPS").ToString.ToDouble > 0 Then TrIEPS.Visible = True + If dr("RetIVA").ToString.ToDouble > 0 Then TrRetIVA.Visible = True + If dr("RetISR").ToString.ToDouble > 0 Then TrRetISR.Visible = True + If Math.Abs(dr("Redondeo").ToString.ToDouble) > 0 Then TrRedondeo.Visible = True + TxtRedondeo.Text = dr("Redondeo").ToString.FormatoNumero(2) - TxtOtrosImpuestos.Text = dr("OtrosImpuestos").ToString.FormatoNumero(2) - If dr("OtrosImpuestos").ToString.ToDouble > 0 Then TrOtrosImpuestos.Visible = True - TxtTotal.Text = dr("Total").ToString.FormatoNumero(2) + TxtOtrosImpuestos.Text = dr("OtrosImpuestos").ToString.FormatoNumero(2) + If dr("OtrosImpuestos").ToString.ToDouble > 0 Then TrOtrosImpuestos.Visible = True + TxtTotal.Text = dr("Total").ToString.FormatoNumero(2) - HfTotalCompra.Value = TxtTotal.Text + HfTotalCompra.Value = TxtTotal.Text - TipoCambio = dr("TipoCambio").ToString.ToDecimal - TipoCambioOriginal = dr("TipoCambioOriginal").ToString.ToDecimal - If TipoCambio > 1 Then LblTC.Text = String.Format("TC: {0}", TipoCambio.ToString("N4")) - If TipoCambio <> TipoCambioOriginal Then LblTCO.Text = String.Format("
TC Original: {0}", TipoCambioOriginal.ToString("N4")) + TipoCambio = dr("TipoCambio").ToString.ToDecimal + TipoCambioOriginal = dr("TipoCambioOriginal").ToString.ToDecimal + If TipoCambio > 1 Then LblTC.Text = String.Format("TC: {0}", TipoCambio.ToString("N4")) + If TipoCambio <> TipoCambioOriginal Then LblTCO.Text = String.Format("
TC Original: {0}", TipoCambioOriginal.ToString("N4")) - AsignaValoresOriginales(TxtSubTotal.Text.ToDecimal, TxtSubTotal2.Text.ToDecimal, TxtIVA.Text.ToDouble, TxtRetIVA.Text.ToDouble, TxtRetISR.Text.ToDouble, TxtTotal.Text.ToDecimal) - CalculaTotalPorDevengar() - TxtDocumentoImporteFE.Text = dr("Total").ToString - RVDocumentoImporte.MaximumValue = dr("Total").ToString.FormatoNumero(2) - RVDocumentoImporteFE.MaximumValue = RVDocumentoImporte.MaximumValue - RVDocumentoImporteCaja.MaximumValue = RVDocumentoImporte.MaximumValue + AsignaValoresOriginales(TxtSubTotal.Text.ToDecimal, TxtSubTotal2.Text.ToDecimal, TxtIVA.Text.ToDouble, TxtRetIVA.Text.ToDouble, TxtRetISR.Text.ToDouble, TxtTotal.Text.ToDecimal) + CalculaTotalPorDevengar() + TxtDocumentoImporteFE.Text = dr("Total").ToString + RVDocumentoImporte.MaximumValue = dr("Total").ToString.FormatoNumero(2) + RVDocumentoImporteFE.MaximumValue = RVDocumentoImporte.MaximumValue + RVDocumentoImporteCaja.MaximumValue = RVDocumentoImporte.MaximumValue - HFDiferenciaCompra.Value = TxtTotal.Text + HFDiferenciaCompra.Value = TxtTotal.Text - TotalGeneral = dr("Total").ToString.ToDouble - CveMoneda = dr("CveMoneda").ToString.ToEntero - DdlValidadaSAT.SelectedValue = "Si" - TxtObsFact.Text = dr("Observaciones").ToString - LblUsuarioCaptura.Text = dr("Usuario").ToString - LitFechCaptura.Text = dr("FechaIng").ToString.ToDate.ToShortDateString - LitFechCaptura.ToolTip = dr("FechaIng").ToString - LblRetIVA.Text = If(dr("RetIVA").ToString.ToDecimal > 0, TmpDT.MAX("RetIVAPorcentaje").ToDecimal * 100, 0).ToString.FormatoNumero(4) '(If(SubTotal2 > 0, (RetencionIVA / SubTotal2), 0) * 100).FormatoNumero(3) + "%" - LblRetISR.Text = If(dr("RetISR").ToString.ToDecimal > 0, TmpDT.MAX("RetISRPorcentaje").ToDecimal * 100, 0).ToString.FormatoNumero(4) '(If(SubTotal2 > 0, (RetencionISR / SubTotal2), 0) * 100).FormatoNumero(3) - If dr("TipoFactura").ToString <> "CFDi" Then LblTipoFact.Text = dr("TipoFactura").ToString : divTipoFactura.Visible = True - ViewState("CveFactura") = dr("CveFactura").ToString.ToEntero - ViewState("IdPoliza") = dr("IdPoliza").ToString.ToEntero + TotalGeneral = dr("Total").ToString.ToDouble + CveMoneda = dr("CveMoneda").ToString.ToEntero + DdlValidadaSAT.SelectedValue = "Si" + TxtObsFact.Text = dr("Observaciones").ToString + LblUsuarioCaptura.Text = dr("Usuario").ToString + LitFechCaptura.Text = dr("FechaIng").ToString.ToDate.ToShortDateString + LitFechCaptura.ToolTip = dr("FechaIng").ToString + LblRetIVA.Text = If(dr("RetIVA").ToString.ToDecimal > 0, TmpDT.MAX("RetIVAPorcentaje").ToDecimal * 100, 0).ToString.FormatoNumero(4) '(If(SubTotal2 > 0, (RetencionIVA / SubTotal2), 0) * 100).FormatoNumero(3) + "%" + LblRetISR.Text = If(dr("RetISR").ToString.ToDecimal > 0, TmpDT.MAX("RetISRPorcentaje").ToDecimal * 100, 0).ToString.FormatoNumero(4) '(If(SubTotal2 > 0, (RetencionISR / SubTotal2), 0) * 100).FormatoNumero(3) + If dr("TipoFactura").ToString <> "CFDi" Then LblTipoFact.Text = dr("TipoFactura").ToString : divTipoFactura.Visible = True + ViewState("CveFactura") = dr("CveFactura").ToString.ToEntero + ViewState("IdPoliza") = dr("IdPoliza").ToString.ToEntero - DdlMoneda.SelectedValue = dr("CveMoneda").ToString - 'primero se asigna la moneda, para que dentro del proveedor carge los anticipos solo de esa moneda - DdlProveedor.Visible = False - HplProveedor.Visible = True - If dr("CveRetIVAConcepto").ToString.Contiene("2", "3") Then RetIVAFlete = True - If dr("CveRetISRConcepto").ToString.Contiene("3") Then RetISRResico = True - CargaProveedor(CveProveedor, "-1") + DdlMoneda.SelectedValue = dr("CveMoneda").ToString + 'primero se asigna la moneda, para que dentro del proveedor carge los anticipos solo de esa moneda + DdlProveedor.Visible = False + HplProveedor.Visible = True + If dr("CveRetIVAConcepto").ToString.Contiene("2", "3") Then RetIVAFlete = True + If dr("CveRetISRConcepto").ToString.Contiene("3") Then RetISRResico = True + CargaProveedor(CveProveedor, "-1") - DdlRetIVAConcepto.SelectedValueExist(dr("CveRetIVAConcepto").ToString) + DdlRetIVAConcepto.SelectedValueExist(dr("CveRetIVAConcepto").ToString) - DdlRetISRConcepto.SelectedValueExist(dr("CveRetISRConcepto").ToString) - CveRetIVAConceptoOriginal = If(dr("CveRetIVAConcepto").ToString.ToEntero > 0, dr("CveRetIVAConcepto").ToString.ToEntero, -1) - CveRetISRConceptoOriginal = If(dr("CveRetISRConcepto").ToString.ToEntero > 0, dr("CveRetISRConcepto").ToString.ToEntero, -1) + DdlRetISRConcepto.SelectedValueExist(dr("CveRetISRConcepto").ToString) + CveRetIVAConceptoOriginal = If(dr("CveRetIVAConcepto").ToString.ToEntero > 0, dr("CveRetIVAConcepto").ToString.ToEntero, -1) + CveRetISRConceptoOriginal = If(dr("CveRetISRConcepto").ToString.ToEntero > 0, dr("CveRetISRConcepto").ToString.ToEntero, -1) - If dr("CveTipoConcepto").ToString.ToEntero = 1 Then LblProveedor.Text = "Proveedor:" Else LblProveedor.Text = "Acreedor:" - HdnCveEstatusFactura.Value = dr("CveEstatusFactura").ToString - LblCompraEstatus.Text = dr("EstatusFactura").ToString - If dr("CveEstatusFactura").ToString = "2" Then ChkProgramarPago.Checked = True + If dr("CveTipoConcepto").ToString.ToEntero = 1 Then LblProveedor.Text = "Proveedor:" Else LblProveedor.Text = "Acreedor:" + HdnCveEstatusFactura.Value = dr("CveEstatusFactura").ToString + LblCompraEstatus.Text = dr("EstatusFactura").ToString + If dr("CveEstatusFactura").ToString = "2" Then ChkProgramarPago.Checked = True - TrRembolsoUpdate.Visible = True - TrRembolsoNumero.Visible = True + TrRembolsoUpdate.Visible = True + TrRembolsoNumero.Visible = True - Dim DtPersonal As DataTable = GlobalDTRHPersonal(UsuarioActual.CveEmpresa).FiltraParametros("", "NombreCompleto") - DdlRembolsoPersonal.DataSource = DtPersonal - DdlRembolsoPersonal.Items.Insert(0, New ListItem("Sin Seleccionar", "-1")) - DdlRembolsoPersonal.DataBind() - If dr("CvePersonal").ToString.ToEntero > 0 Then - DdlRembolsoPersonal.SelectedValueExist(dr("CvePersonal").ToString) - TxtRembolsoNumero.Text = dr("NumeroReembolso").ToString - RblRembolso.SelectedValuesIfExist("1") - TrRembolsoPersonal.Visible = True - End If + Dim DtPersonal As DataTable = GlobalDTRHPersonal(UsuarioActual.CveEmpresa).FiltraParametros("", "NombreCompleto") + DdlRembolsoPersonal.DataSource = DtPersonal + DdlRembolsoPersonal.Items.Insert(0, New ListItem("Sin Seleccionar", "-1")) + DdlRembolsoPersonal.DataBind() + If dr("CvePersonal").ToString.ToEntero > 0 Then + DdlRembolsoPersonal.SelectedValueExist(dr("CvePersonal").ToString) + TxtRembolsoNumero.Text = dr("NumeroReembolso").ToString + RblRembolso.SelectedValuesIfExist("1") + TrRembolsoPersonal.Visible = True + End If - Dim DtCajaChica As DataTable = GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa:=UsuarioActual.CveEmpresa) - DtCajaChica = DtCajaChica.FiltraParametros(String.Format("CveTipoCuenta = 1")) - DdlRembolsoCajaChica.DataSource = DtCajaChica - DdlRembolsoCajaChica.Items.Insert(0, New ListItem("Sin Seleccionar", "-1")) - DdlRembolsoCajaChica.DataBind() - If dr("CveCajaChica").ToString.ToEntero > 0 Then - DdlRembolsoCajaChica.SelectedValueExist(dr("CveCajaChica").ToString) - TxtRembolsoNumero.Text = dr("NumeroReembolso").ToString - RblRembolso.SelectedValuesIfExist("2") - TrRembolsoCajaChica.Visible = True - End If + Dim DtCajaChica As DataTable = GlobalDTBancosCuentas(UsuarioActual.CveUsuario, CveEmpresa:=UsuarioActual.CveEmpresa) + DtCajaChica = DtCajaChica.FiltraParametros(String.Format("CveTipoCuenta = 1")) + DdlRembolsoCajaChica.DataSource = DtCajaChica + DdlRembolsoCajaChica.Items.Insert(0, New ListItem("Sin Seleccionar", "-1")) + DdlRembolsoCajaChica.DataBind() + If dr("CveCajaChica").ToString.ToEntero > 0 Then + DdlRembolsoCajaChica.SelectedValueExist(dr("CveCajaChica").ToString) + TxtRembolsoNumero.Text = dr("NumeroReembolso").ToString + RblRembolso.SelectedValuesIfExist("2") + TrRembolsoCajaChica.Visible = True + End If - If dr("CvePersonal").ToString.ToEntero > 0 Or dr("CveCajaChica").ToString.ToEntero > 0 Then - NumeroReembolsoOriginal = dr("NumeroReembolso").ToString - End If + If dr("CvePersonal").ToString.ToEntero > 0 Or dr("CveCajaChica").ToString.ToEntero > 0 Then + NumeroReembolsoOriginal = dr("NumeroReembolso").ToString + End If - VisualizaEstatusCompraSaldo(dr("TipoDocto").ToString, dr("Saldo").ToString.ToDecimal, dr("Total").ToString.ToDecimal) - If dr("IdPoliza").ToString.ToEntero > 0 Then - HplCompraContabilizada.Text = "Si" - If UsuarioActual.Empresa.TipoContabilidad = 2 Then HplCompraContabilizada.NavigateUrl = String.Format("/Contabilidad/RegPoliza.aspx?IdPoliza={0}", dr("IdPoliza")) - LblCompraEstatus.ForeColor = Drawing.Color.Navy - trContabilizada.Visible = True - If UsuarioActual.TienePermisoProceso(107) Then BtnDescontabilizar.Visible = True - Else - BtnDescontabilizar.Visible = False - HplCompraContabilizada.Text = "No" - trContabilizada.Visible = True - End If + VisualizaEstatusCompraSaldo(dr("TipoDocto").ToString, dr("Saldo").ToString.ToDecimal, dr("Total").ToString.ToDecimal) + If dr("IdPoliza").ToString.ToEntero > 0 Then + HplCompraContabilizada.Text = "Si" + If UsuarioActual.Empresa.TipoContabilidad = 2 Then HplCompraContabilizada.NavigateUrl = String.Format("/Contabilidad/RegPoliza.aspx?IdPoliza={0}", dr("IdPoliza")) + LblCompraEstatus.ForeColor = Drawing.Color.Navy + trContabilizada.Visible = True + If UsuarioActual.TienePermisoProceso(107) Then BtnDescontabilizar.Visible = True + Else + BtnDescontabilizar.Visible = False + HplCompraContabilizada.Text = "No" + trContabilizada.Visible = True + End If - If UsuarioActual.Empresa.TipoContabilidad = 1 Then - trContabilizada.Visible = False - End If + If UsuarioActual.Empresa.TipoContabilidad = 1 Then + trContabilizada.Visible = False + End If - UPPDescontablizar.Update() + UPPDescontablizar.Update() - TxtFechaPago.Text = dr("FechaVencimiento").ToString.ToDate.ToShortDateString - RowBitacora.Visible = True - CargaEventoBitacora() - 'ImgAddObs.Attributes.Add("onclick", "javascript: PosicionaObjeto(this.id,'DivEventoBitacora',null,-250,-250); $('#DivEventoBitacora').show(1000); ") - ImgAddObs.Visible = True - ChkAplicaNotaCredito.Checked = CBool(dr("AplicaNotaCredito").ToString) + TxtFechaPago.Text = dr("FechaVencimiento").ToString.ToDate.ToShortDateString + RowBitacora.Visible = True + CargaEventoBitacora() + 'ImgAddObs.Attributes.Add("onclick", "javascript: PosicionaObjeto(this.id,'DivEventoBitacora',null,-250,-250); $('#DivEventoBitacora').show(1000); ") + ImgAddObs.Visible = True + ChkAplicaNotaCredito.Checked = CBool(dr("AplicaNotaCredito").ToString) - 'CompraSaldo = TotalGeneral - LblAmortizacion.Text.ToDouble + 'CompraSaldo = TotalGeneral - LblAmortizacion.Text.ToDouble + CompraSaldo = dr("Saldo").ToString.ToDouble + + If CompraSaldo > dr("Saldo").ToString.ToDouble Then CompraSaldo = dr("Saldo").ToString.ToDouble + End If + HdnCompraSaldo.Value = CompraSaldo.ToString - If CompraSaldo > dr("Saldo").ToString.ToDouble Then - CompraSaldo = dr("Saldo").ToString.ToDouble - End If - HdnCompraSaldo.Value = CompraSaldo.ToString + If CompraSaldo > 0 And UsuarioActual.TienePermisoProceso(100) Then + HLPagar.Visible = True + HLPagar.NavigateUrl = $"/Bancos/PopIECompras.aspx?CveCompra={CveCompra}&TB_iframe=true&height=520&width=700" + End If - If CompraSaldo > 0 And UsuarioActual.TienePermisoProceso(100) Then - HLPagar.Visible = True - HLPagar.NavigateUrl = $"/Bancos/PopIECompras.aspx?CveCompra={CveCompra}&TB_iframe=true&height=520&width=700" - End If + If dr("CveFactura").ToString.ToEntero > 0 Then + ImgDownXML.Visible = True : ImgDownXML.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", Encripta(String.Format("OP=Fact&EXT=xml&CveFactura={0}&RFC={1}", dr("CveFactura"), dr("RFC").ToString.Replace("&", "%26%")))) + ImgDownPDF.Visible = True : ImgDownPDF.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", Encripta(String.Format("OP=Fact&EXT=pdf&CveFactura={0}&RFC={1}", dr("CveFactura"), dr("RFC").ToString.Replace("&", "%26%")))) + Else + LnkGenrarPDF.Visible = True + End If - If dr("CveFactura").ToString.ToEntero > 0 Then - ImgDownXML.Visible = True : ImgDownXML.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", Encripta(String.Format("OP=Fact&EXT=xml&CveFactura={0}&RFC={1}", dr("CveFactura"), dr("RFC").ToString.Replace("&", "%26%")))) - ImgDownPDF.Visible = True : ImgDownPDF.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", Encripta(String.Format("OP=Fact&EXT=pdf&CveFactura={0}&RFC={1}", dr("CveFactura"), dr("RFC").ToString.Replace("&", "%26%")))) + TxtRembolsoNumero.Enabled = If(IdPoliza > 0, False, True) + + If dr("CveImportacion").ToString <> "" Then + divCompraImportacion.Visible = True + HplCompraImportacion.Text = dr("Importacion").ToString + If dr("TipoImportacion").ToString = "2" Then 'flete/indirecto + LtlImportacionTexto.Text = "Indirecto" + HplCompraImportacion.NavigateUrl = $"/Inventarios/Fletes.aspx?CveFlete={dr("CveImportacion")}" Else - LnkGenrarPDF.Visible = True + HplCompraImportacion.NavigateUrl = $"/Compras/Importaciones.aspx?CveImportacion={dr("CveImportacion")}" End If + End If - TxtRembolsoNumero.Enabled = If(IdPoliza > 0, False, True) + If dr("CveFolioGarantia").ToString <> "" Then + divFolioGarantia.Visible = True + DdlFolioGarantia.Items.Insert(0, New ListItem(dr("FolioGarantia").ToString, dr("CveFolioGarantia").ToString)) + DdlFolioGarantia.SelectedValue = dr("CveFolioGarantia").ToString + End If - If dr("CveImportacion").ToString <> "" Then - divCompraImportacion.Visible = True - HplCompraImportacion.Text = dr("Importacion").ToString - If dr("TipoImportacion").ToString = "2" Then 'flete/indirecto - LtlImportacionTexto.Text = "Indirecto" - HplCompraImportacion.NavigateUrl = $"/Inventarios/Fletes.aspx?CveFlete={dr("CveImportacion")}" - Else - HplCompraImportacion.NavigateUrl = $"/Compras/Importaciones.aspx?CveImportacion={dr("CveImportacion")}" - End If - End If + 'CargaDetalle + If ObjCompra.GetCompraDetalle(CveCompra, UsuarioActual.CveEmpresa) Then + TmpDT = ObjCompra.DtResultados + TmpDTOriginal = ObjCompra.DtResultados.Copy - If dr("CveFolioGarantia").ToString <> "" Then - divFolioGarantia.Visible = True - DdlFolioGarantia.Items.Insert(0, New ListItem(dr("FolioGarantia").ToString, dr("CveFolioGarantia").ToString)) - DdlFolioGarantia.SelectedValue = dr("CveFolioGarantia").ToString - End If + TmpDT.Columns.Add("CveClasificacionActualizar", GetType(Integer)) + 'TmpDT.Columns.Add("CveEq", GetType(Integer)) + TmpDT.Columns.Add("CveAlmacen", GetType(Integer)) + 'TmpDT.Columns.Add("CvePersonal", GetType(Integer)) - 'CargaDetalle - If ObjCompra.GetCompraDetalle(CveCompra, UsuarioActual.CveEmpresa) Then - TmpDT = ObjCompra.DtResultados - TmpDTOriginal = ObjCompra.DtResultados.Copy + TmpDT.Columns.Add("IdCuentaComprometido", GetType(Integer)) + TmpDT.Columns.Add("IdCuentaPorEjercer", GetType(Integer)) + TmpDT.Columns.Add("IdCuentaDevengado", GetType(Integer)) + TmpDT.Columns.Add("IdCuentaMatriz", GetType(Integer)) - TmpDT.Columns.Add("CveClasificacionActualizar", GetType(Integer)) - 'TmpDT.Columns.Add("CveEq", GetType(Integer)) - TmpDT.Columns.Add("CveAlmacen", GetType(Integer)) - 'TmpDT.Columns.Add("CvePersonal", GetType(Integer)) + TmpDT.Columns.Add("PSDescripcion", GetType(String)) + TmpDT.Columns.Add("ProductoOC", GetType(String)) + TmpDT.Columns.Add("CantidadF", GetType(Double)) - TmpDT.Columns.Add("IdCuentaComprometido", GetType(Integer)) - TmpDT.Columns.Add("IdCuentaPorEjercer", GetType(Integer)) - TmpDT.Columns.Add("IdCuentaDevengado", GetType(Integer)) - TmpDT.Columns.Add("IdCuentaMatriz", GetType(Integer)) + '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)) - TmpDT.Columns.Add("PSDescripcion", GetType(String)) - TmpDT.Columns.Add("ProductoOC", GetType(String)) - TmpDT.Columns.Add("CantidadF", GetType(Double)) + 'INVENTARIO SERIE/LOTE + TmpDT.Columns.Add("CveMetodoInventario", GetType(Integer)) - '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)) 'Ya traemos el estatus flete + TmpDT.Columns.Add("CostoIndirectoAlmacen", GetType(Decimal)) + TmpDT.Columns.Add("EntregaDirecta", GetType(Integer)) - 'INVENTARIO SERIE/LOTE - TmpDT.Columns.Add("CveMetodoInventario", GetType(Integer)) - - 'Fletes y Servicios - 'TmpDT.Columns.Add("AplicaCostoIndirecto", GetType(Integer)) 'Ya traemos el estatus flete - TmpDT.Columns.Add("CostoIndirectoAlmacen", GetType(Decimal)) - TmpDT.Columns.Add("EntregaDirecta", GetType(Integer)) - - TmpDT.Columns.Add("CveContrato", GetType(Integer)) - TmpDT.Columns.Add("DifPSSat", GetType(Integer)) + TmpDT.Columns.Add("CveContrato", GetType(Integer)) + TmpDT.Columns.Add("DifPSSat", GetType(Integer)) If Not TmpDT.Columns.Contains("CveContratoDetalle") Then TmpDT.Columns.Add("CveContratoDetalle", GetType(Integer)) If Not TmpDT.Columns.Contains("CveCultivoCuadroDetalle") Then TmpDT.Columns.Add("CveCultivoCuadroDetalle", GetType(Integer)) @@ -3109,334 +3145,333 @@ Partial Class Compras_Compras GvPS.DataBind() If UsuarioActual.Empresa.UsaAC Then - CargaHidendsAC() - End If - - CalculaTotales(True) - - 'If UsuarioActual.Empresa.UsaInventarios Then - ' DtInv = TmpDT.FiltraParametros(String.Format("CveTipoPS = 2")).Copy - - ' If dr("Inventario").ToString = "1" Then - - ' CveMovimientoAlmacen = dr("CveMovimiento").ToString.ToEntero - - ' Dim Inv As New ClsInventarios - ' If Inv.GetMovimientosDetalle(dr("CveMovimiento").ToString.ToEntero, UsuarioActual.CveEmpresa) Then - ' 'Dim TempParametros = Encripta(String.Format("OP=Alm&CveMovimiento={0}", dr("CveMovimiento"))) - ' 'ImgImprimirAlmacen.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", TempParametros) - - ' ImgImprimirAlmacen.Visible = True - ' ImgImprimirAlmacen.NavigateUrl = String.Format("/Inventarios/EntradasSalidas.aspx?CveMovimiento={0}", dr("CveMovimiento")) - - ' Dim drt As DataRow - ' 'actualizo el almacen - ' For Each dri As DataRow In DtInv.Rows - - ' drt = Inv.DtResultados.FiltroPrimero(String.Format("CvePS = {0} AND Cantidad = {1}", dri("CvePS"), dri("Cantidad"))) - ' If drt IsNot Nothing Then - ' Dim TmpDr As DataRow = TmpDT.Select($"Consec = {dri("Consec").ToString.ToEntero}")(0) 'Charlie - ' TmpDr("CveAlmacen") = drt("CveAlmacen") 'Charlie - - ' dri("CveAlmacen") = drt("CveAlmacen") - - ' End If - - ' Next - - ' End If - - ' ''Proceso Super Tramposo de Charlie - ' 'If Inv.GetMovimientosDetalle(dr("CveMovimiento").ToString.ToEntero, UsuarioActual.CveEmpresa, CveCompra:=-123) Then - ' ' Dim drt As DataRow - ' ' For Each dri As DataRow In DtInv.Rows - ' ' drt = Inv.DtResultados.FiltroPrimero(String.Format("CvePS = {0} AND Cantidad = {1}", dri("CvePS"), dri("Cantidad"))) - ' ' If drt IsNot Nothing Then - ' ' Dim TmpDr As DataRow = TmpDT.Select($"Consec = {dri("Consec").ToString.ToEntero}")(0) - ' ' TmpDr("CveAlmacen") = drt("CveAlmacen") - ' ' End If - ' ' Next - ' 'End If - - ' Inv.Dispose() - - ' End If - - ' CargaGvInv() - - ' 'Ocultamos "Recibir Aqui" - ' GvInv.Columns(6).Visible = False - ' GvInv.Columns(7).Visible = False - - 'End If + CargaHidendsAC() End If - DdlTipoComprobante.Enabled = False - If dr("TipoDocto").ToString = "RNC" Then - DdlTipoComprobante.Items.Add(New ListItem("Remisión de Nota de Crédito", "RNC")) - End If + CalculaTotales(True) - DdlTipoComprobante.SelectedValue = dr("TipoDocto").ToString - If dr("TipoDocto").ToString.Contiene("Fac", "Ant") Then - ChkAplicaNotaCredito.Enabled = True - ImgAnticiposPendientes.Visible = True - Else - ImgAnticiposPendientes.Visible = False - ChkAplicaNotaCredito.Enabled = False - End If - HlProveedor.HRef = "" - TxtCodigo.ReadOnly = True - 'IPP Usuario Sistema No Bloquea, se cambió al proceso - If UsuarioActual.TienePermisoProceso(79) Then - TxtCantidad.Enabled = True - TxtPrecio.Enabled = True - Else - TxtCantidad.Enabled = False - TxtPrecio.Enabled = False - End If + 'If UsuarioActual.Empresa.UsaInventarios Then + ' DtInv = TmpDT.FiltraParametros(String.Format("CveTipoPS = 2")).Copy - DdlPS.Enabled = False - TxtObsPS.Enabled = False - 'ImgAmort.Attributes.Clear() - LbAgregar.Enabled = False - TxtSerie.Enabled = False - TxtFolio.Enabled = False + ' If dr("Inventario").ToString = "1" Then - TxtFecha.Enabled = False - ImgFecha.Enabled = False - CEFecha.Enabled = False + ' CveMovimientoAlmacen = dr("CveMovimiento").ToString.ToEntero - If UsuarioActual.TienePermisoProceso(342) Then - TxtFecha.Enabled = True - ImgFecha.Enabled = True - CEFecha.Enabled = True - LnkActualziarFechadecompra.Visible = True - End If + ' Dim Inv As New ClsInventarios + ' If Inv.GetMovimientosDetalle(dr("CveMovimiento").ToString.ToEntero, UsuarioActual.CveEmpresa) Then + ' 'Dim TempParametros = Encripta(String.Format("OP=Alm&CveMovimiento={0}", dr("CveMovimiento"))) + ' 'ImgImprimirAlmacen.NavigateUrl = String.Format("/Compras/PopUpVerFactura.aspx?P={0}", TempParametros) - DdlProveedor.Enabled = False - DdlProveedorSucursal.Enabled = False - DdlEstatus.Enabled = False - DdlMoneda.Enabled = False - DdlRetIVAConcepto.Enabled = False - DdlRetISRConcepto.Enabled = False - If UsuarioActual.TienePermisoProceso(79) Then - BtnActualizar.Visible = True - DdlProveedorSucursal.Enabled = True - DdlPS.Enabled = True - TxtObsPS.Enabled = True - LbAgregar.Enabled = True - LnkUpdateFechaPago.Visible = True + ' ImgImprimirAlmacen.Visible = True + ' ImgImprimirAlmacen.NavigateUrl = String.Format("/Inventarios/EntradasSalidas.aspx?CveMovimiento={0}", dr("CveMovimiento")) - If DdlRetIVAConcepto.SelectedValue.ToEntero > 0 Then - DdlRetIVAConcepto.Enabled = True - End If + ' Dim drt As DataRow + ' 'actualizo el almacen + ' For Each dri As DataRow In DtInv.Rows - If DdlRetISRConcepto.SelectedValue.ToEntero > 0 Then - DdlRetISRConcepto.Enabled = True - End If - End If + ' drt = Inv.DtResultados.FiltroPrimero(String.Format("CvePS = {0} AND Cantidad = {1}", dri("CvePS"), dri("Cantidad"))) + ' If drt IsNot Nothing Then + ' Dim TmpDr As DataRow = TmpDT.Select($"Consec = {dri("Consec").ToString.ToEntero}")(0) 'Charlie + ' TmpDr("CveAlmacen") = drt("CveAlmacen") 'Charlie - BtnGuardar.Visible = False - BtnGuardar.Enabled = False - UpPSS.Update() + ' dri("CveAlmacen") = drt("CveAlmacen") - 'GvLeyendasFiscales.Enabled = False - TxtSubTotal.ReadOnly = True - TxtIVA.ReadOnly = True - TxtRetIVA.ReadOnly = True - TxtRetISR.ReadOnly = True - TxtIEPS.ReadOnly = True - TxtOtrosImpuestos.ReadOnly = True - TxtTotal.ReadOnly = True + ' End If - 'CargaLeyendasFiscales - ViewState("CompraFolio") = TxtFolio.Text.Trim + ' Next - Dim dtnc As DataTable = Nothing - If dr("TipoDocto").ToString = "Fac" Then - 'carga as notas de credito vinculadas - If ObjCompra.GetComprasNotasCredito(CveCompra, -1) Then - dtnc = ObjCompra.DtResultados - End If - ElseIf dr("TipoDocto").ToString.Contiene("NC", "DEV", "Ant") Then - If dr("TipoDocto").ToString = "NC" Then - DivReembolso.Visible = False - RBLPago.Items(2).Enabled = False - End If - If ObjCompra.GetComprasNotasCredito(-1, CveCompra) Then - dtnc = ObjCompra.DtResultados - LtlGvAnticiposSel.Text = "
Compras Aplicadas
" - End If - End If + ' End If - 'VINCULACIÓN OC - NUEVA DICIEMBRE 2015 - If dr("OCVinculada").ToString() <> "" Then + ' ''Proceso Super Tramposo de Charlie + ' 'If Inv.GetMovimientosDetalle(dr("CveMovimiento").ToString.ToEntero, UsuarioActual.CveEmpresa, CveCompra:=-123) Then + ' ' Dim drt As DataRow + ' ' For Each dri As DataRow In DtInv.Rows + ' ' drt = Inv.DtResultados.FiltroPrimero(String.Format("CvePS = {0} AND Cantidad = {1}", dri("CvePS"), dri("Cantidad"))) + ' ' If drt IsNot Nothing Then + ' ' Dim TmpDr As DataRow = TmpDT.Select($"Consec = {dri("Consec").ToString.ToEntero}")(0) + ' ' TmpDr("CveAlmacen") = drt("CveAlmacen") + ' ' End If + ' ' Next + ' 'End If - Dim OCS As String = "", CveOCS As String = "" - Dim DtOCs As New DataTable - DtOCs.Columns.Add("SerieFolioOC", GetType(String)) - DtOCs.Columns.Add("CveOrdenCompra", GetType(Integer)) - DtOCs.Columns.Add("Fecha", GetType(Date)) - DtOCs.Columns.Add("Descripcion", GetType(String)) - For Each drt As DataRow In TmpDT.FiltraParametros("", "", {"SerieFolioOC", "CveOrdenCompra"}).Rows - If drt("SerieFolioOC").ToString <> "" Then - Dim DrOC As DataRow = DtOCs.NewRow - DrOC("SerieFolioOC") = drt("SerieFolioOC").ToString - DrOC("CveOrdenCompra") = drt("CveOrdenCompra").ToString - DtOCs.Rows.Add(DrOC) - End If - Next + ' Inv.Dispose() - If DtOCs.Rows.Count > 0 Then - For Each drt As DataRow In DtOCs.Rows - OCS += If(OCS <> "", String.Format(",{0}", drt("SerieFolioOC").ToString), drt("SerieFolioOC").ToString) - CveOCS += If(CveOCS <> "", String.Format(",{0}", drt("CveOrdenCompra").ToString), drt("CveOrdenCompra").ToString) - 'If ObjOC.GetOrdenesCompraRep("OC", -1, -1, -1, -1, MinFecha, MaxFecha, drt("CveOrdenCompra").ToString.ToEntero, CveProveedor, -1, -1, -1, UsuarioActual.CveEmpresa, -1) Then - ' If ObjOC.DtResultados.Rows.Count = 1 Then - ' OCS += If(OCS <> "", String.Format(",{0}", drt("FolioOC").ToString), drt("FolioOC").ToString) - ' CveOCS += If(CveOCS <> "", String.Format(",{0}", drt("CveOrdenCompra").ToString), drt("CveOrdenCompra").ToString) - ' drt("Fecha") = ObjOC.DtResultados.FiltroPrimeroValor("FechaIng") - ' drt("Descripcion") = ObjOC.DtResultados.FiltroPrimeroValor("Descripcion") - ' End If - 'End If - Next - End If + ' End If - TxtOC.Text = OCS - TieneOC = True + ' CargaGvInv() - If DtOCs.Rows.Count > 1 Then - HLOCsVinculadas.Visible = True - GvOCsVinculadas.DataSource = DtOCs - GvOCsVinculadas.DataBind() - UpOCsVinculadas.Update() - ElseIf DtOCs.Rows.Count = 1 Then - HLOCsVinculadas.Visible = True - HLOCsVinculadas.Attributes.Remove("data-toggle") - HLOCsVinculadas.Attributes.Remove("data-target") - HLOCsVinculadas.Attributes.Add("data-toggle", "tooltip") - HLOCsVinculadas.NavigateUrl = $"/OC/OC.aspx?OC={DtOCs.FiltroPrimeroValor("CveOrdenCompra")}" - HLOCsVinculadas.Target = "_blank" - End If + ' 'Ocultamos "Recibir Aqui" + ' GvInv.Columns(6).Visible = False + ' GvInv.Columns(7).Visible = False + 'End If + End If - End If - - 'BLOQUEA OC - TxtOC.Enabled = False - ImgBtnBuscarOC.Visible = False - Tab.ActiveTabIndex = 0 - - GvAnticiposSel.DataSource = dtnc - GvAnticiposSel.DataBind() - - If dtnc IsNot Nothing AndAlso dtnc.Rows.Count > 0 Then - LtlGvAnticiposSel.Visible = True - End If - - '' VALIDA ELIMINAR COMPRA, QUE NO TENGA PAGOS CONCILIADOS - If (UsuarioActual.TienePermisoProceso(77) OrElse UsuarioActual.TienePermisoProceso(135)) AndAlso dr("NumPagosConciliados").ToString.ToEntero = 0 Then ' Eliminar compra - - 'SIN VINCULACIÓN - If UsuarioActual.TienePermisoProceso(135) Then - If TxtOC.Text = "" AndAlso IdPoliza < 1 AndAlso CveMovimientoAlmacen < 1 AndAlso LblUsuarioCaptura.Text = UsuarioActual.Usuario AndAlso TmpDT.MAX("CveActivoFijo").ToEntero < 1 AndAlso Not ChkProgramarPago.Checked AndAlso CompraSaldo = TxtTotal.Text.ToDouble Then - BtnEliminarCompra.Visible = True - End If - End If - - 'ELIMINAR A FUERZAS - If UsuarioActual.TienePermisoProceso(77) Then - BtnEliminarCompra.Visible = True - If CompraSaldo <> TxtTotal.Text.ToDouble AndAlso dr("TipoDocto").ToString = "Fac" Then - BtnEliminarCompra.Enabled = False - BtnEliminarCompra.ToolTip = "La compra tiene pagos asociados, elimine los pagos primero." - End If - End If - - Dim StrInventario As String = "" - If dr("Inventario").ToString = "1" Then - StrInventario = "los Movimientos de Inventario relacionados" - End If - - If UsuarioActual.Empresa.UsaAC Then - BtnEliminarCompra.Attributes.Add("data-original-title", String.Format("¿Está seguro que desea eliminar la Compra, {0} y la Poliza Asociada?", StrInventario)) - ElseIf BtnEliminarCompra.Enabled Then - BtnEliminarCompra.Attributes.Add("data-original-title", String.Format("¿Está seguro que desea eliminar la Compra y {0}?", StrInventario)) - End If - End If - - 'VALIDA CANCELAR COMPRA - AC - ValidaCancelarCompra() - - 'CUANDO ESTA CANCELADA - If dr("CveEstatusFactura").ToString = "-2" Then - BtnEliminarCompra.Visible = False - BtnActualizar.Visible = False - BtnGuardar.Visible = False - BtnCancelarCompra.Visible = False - - LblCompraEstatus.Text = "CANCELADA" - LblCompraEstatus.Font.Bold = True - LblCompraEstatus.Font.Size = 12 - LblCompraEstatus.ForeColor = Drawing.Color.DarkRed - 'HplIr.Visible = False - - BtnDescontabilizar.Visible = False - BtnEliminarPolizaMultiple.Visible = False - - 'LIGA POLIZA CANCELACIÓN - 'HplPolizaCancelación.NavigateUrl = String.Format("/Contabilidad/RegPoliza.aspx?IdPoliza={0}", dr("IdPoliza")) - - End If - - 'CUANDO FUE REFACTURADA - If dr("CompraRefacturada").ToString.ToEntero > 0 Then - BtnEliminarCompra.Visible = False - BtnActualizar.Visible = False - BtnGuardar.Visible = False - BtnCancelarCompra.Visible = False - End If - - 'TIENE AMORTIZACIÓN - If GvAnticiposSel.Rows.Count > 0 Then - - If Not DdlTipoComprobante.SelectedValue.Contiene("NC", "DEV") Then - BtnCancelarCompra.Visible = False - BtnEliminarCompra.Visible = False - End If - End If - - 'Tiene Importacion - - If dr("EsImportacion").ToString = "True" Then - chkImportacion.Checked = True - Else - chkImportacion.Checked = False - End If - CargaComplementosPago() - CargaGvBitacora() - InventarioMov() - HabilitaNCInv() - - If Request("RG") IsNot Nothing Then - BtnRegenerarPrePolizaAlmacen_Click(Nothing, Nothing) - End If - - If DdlTipoComprobante.SelectedValue = "RNC" And CompraSaldo <> TxtTotal.Text.ToDecimal Then - BtnCancelarCompra.Visible = False - BtnEliminarCompra.Visible = False - End If - - If UsuarioActual.Empresa.Funcionalidad(578) = "1" Then - If ObjCompra.GetGastoMedicos(CveCompra) Then - DTMedicos = ObjCompra.DtResultados - GvMedicosGastos.DataSource = ObjCompra.DtResultados - GvMedicosGastos.DataBind() - End If - End If + DdlTipoComprobante.Enabled = False + If dr("TipoDocto").ToString = "RNC" Then + DdlTipoComprobante.Items.Add(New ListItem("Remisión de Nota de Crédito", "RNC")) + End If + DdlTipoComprobante.SelectedValue = dr("TipoDocto").ToString + If dr("TipoDocto").ToString.Contiene("Fac", "Ant") Then + ChkAplicaNotaCredito.Enabled = True + ImgAnticiposPendientes.Visible = True Else - Alert("La compra solicitada no se encontró. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) + ImgAnticiposPendientes.Visible = False + ChkAplicaNotaCredito.Enabled = False + End If + HlProveedor.HRef = "" + TxtCodigo.ReadOnly = True + 'IPP Usuario Sistema No Bloquea, se cambió al proceso + If UsuarioActual.TienePermisoProceso(79) Then + TxtCantidad.Enabled = True + TxtPrecio.Enabled = True + Else + TxtCantidad.Enabled = False + TxtPrecio.Enabled = False + End If + + DdlPS.Enabled = False + TxtObsPS.Enabled = False + 'ImgAmort.Attributes.Clear() + LbAgregar.Enabled = False + TxtSerie.Enabled = False + TxtFolio.Enabled = False + + TxtFecha.Enabled = False + ImgFecha.Enabled = False + CEFecha.Enabled = False + + If UsuarioActual.TienePermisoProceso(342) Then + TxtFecha.Enabled = True + ImgFecha.Enabled = True + CEFecha.Enabled = True + LnkActualziarFechadecompra.Visible = True + End If + + DdlProveedor.Enabled = False + DdlProveedorSucursal.Enabled = False + DdlEstatus.Enabled = False + DdlMoneda.Enabled = False + DdlRetIVAConcepto.Enabled = False + DdlRetISRConcepto.Enabled = False + If UsuarioActual.TienePermisoProceso(79) Then + BtnActualizar.Visible = True + DdlProveedorSucursal.Enabled = True + DdlPS.Enabled = True + TxtObsPS.Enabled = True + LbAgregar.Enabled = True + LnkUpdateFechaPago.Visible = True + + If DdlRetIVAConcepto.SelectedValue.ToEntero > 0 Then + DdlRetIVAConcepto.Enabled = True + End If + If DdlRetISRConcepto.SelectedValue.ToEntero > 0 Then + DdlRetISRConcepto.Enabled = True + End If + End If + + BtnGuardar.Visible = False + BtnGuardar.Enabled = False + UpPSS.Update() + + 'GvLeyendasFiscales.Enabled = False + TxtSubTotal.ReadOnly = True + TxtIVA.ReadOnly = True + TxtRetIVA.ReadOnly = True + TxtRetISR.ReadOnly = True + TxtIEPS.ReadOnly = True + TxtOtrosImpuestos.ReadOnly = True + TxtTotal.ReadOnly = True + + 'CargaLeyendasFiscales + ViewState("CompraFolio") = TxtFolio.Text.Trim + + Dim dtnc As DataTable = Nothing + If dr("TipoDocto").ToString = "Fac" Then + 'carga as notas de credito vinculadas + If ObjCompra.GetComprasNotasCredito(CveCompra, -1) Then + dtnc = ObjCompra.DtResultados + End If + ElseIf dr("TipoDocto").ToString.Contiene("NC", "DEV", "Ant") Then + If dr("TipoDocto").ToString = "NC" Then + DivReembolso.Visible = False + RBLPago.Items(2).Enabled = False + End If + If ObjCompra.GetComprasNotasCredito(-1, CveCompra) Then + dtnc = ObjCompra.DtResultados + LtlGvAnticiposSel.Text = "
Compras Aplicadas
" + End If + End If + + 'VINCULACIÓN OC - NUEVA DICIEMBRE 2015 + If dr("OCVinculada").ToString() <> "" Then + + Dim OCS As String = "", CveOCS As String = "" + Dim DtOCs As New DataTable + DtOCs.Columns.Add("SerieFolioOC", GetType(String)) + DtOCs.Columns.Add("CveOrdenCompra", GetType(Integer)) + DtOCs.Columns.Add("Fecha", GetType(Date)) + DtOCs.Columns.Add("Descripcion", GetType(String)) + For Each drt As DataRow In TmpDT.FiltraParametros("", "", {"SerieFolioOC", "CveOrdenCompra"}).Rows + If drt("SerieFolioOC").ToString <> "" Then + Dim DrOC As DataRow = DtOCs.NewRow + DrOC("SerieFolioOC") = drt("SerieFolioOC").ToString + DrOC("CveOrdenCompra") = drt("CveOrdenCompra").ToString + DtOCs.Rows.Add(DrOC) + End If + Next + + If DtOCs.Rows.Count > 0 Then + For Each drt As DataRow In DtOCs.Rows + OCS += If(OCS <> "", String.Format(",{0}", drt("SerieFolioOC").ToString), drt("SerieFolioOC").ToString) + CveOCS += If(CveOCS <> "", String.Format(",{0}", drt("CveOrdenCompra").ToString), drt("CveOrdenCompra").ToString) + 'If ObjOC.GetOrdenesCompraRep("OC", -1, -1, -1, -1, MinFecha, MaxFecha, drt("CveOrdenCompra").ToString.ToEntero, CveProveedor, -1, -1, -1, UsuarioActual.CveEmpresa, -1) Then + ' If ObjOC.DtResultados.Rows.Count = 1 Then + ' OCS += If(OCS <> "", String.Format(",{0}", drt("FolioOC").ToString), drt("FolioOC").ToString) + ' CveOCS += If(CveOCS <> "", String.Format(",{0}", drt("CveOrdenCompra").ToString), drt("CveOrdenCompra").ToString) + ' drt("Fecha") = ObjOC.DtResultados.FiltroPrimeroValor("FechaIng") + ' drt("Descripcion") = ObjOC.DtResultados.FiltroPrimeroValor("Descripcion") + ' End If + 'End If + Next + End If + + TxtOC.Text = OCS + TieneOC = True + + If DtOCs.Rows.Count > 1 Then + HLOCsVinculadas.Visible = True + GvOCsVinculadas.DataSource = DtOCs + GvOCsVinculadas.DataBind() + UpOCsVinculadas.Update() + ElseIf DtOCs.Rows.Count = 1 Then + HLOCsVinculadas.Visible = True + HLOCsVinculadas.Attributes.Remove("data-toggle") + HLOCsVinculadas.Attributes.Remove("data-target") + HLOCsVinculadas.Attributes.Add("data-toggle", "tooltip") + HLOCsVinculadas.NavigateUrl = $"/OC/OC.aspx?OC={DtOCs.FiltroPrimeroValor("CveOrdenCompra")}" + HLOCsVinculadas.Target = "_blank" + End If + + + End If + + 'BLOQUEA OC + TxtOC.Enabled = False + ImgBtnBuscarOC.Visible = False + Tab.ActiveTabIndex = 0 + + GvAnticiposSel.DataSource = dtnc + GvAnticiposSel.DataBind() + + If dtnc IsNot Nothing AndAlso dtnc.Rows.Count > 0 Then + LtlGvAnticiposSel.Visible = True + End If + + '' VALIDA ELIMINAR COMPRA, QUE NO TENGA PAGOS CONCILIADOS + If (UsuarioActual.TienePermisoProceso(77) OrElse UsuarioActual.TienePermisoProceso(135)) AndAlso dr("NumPagosConciliados").ToString.ToEntero = 0 Then ' Eliminar compra + + 'SIN VINCULACIÓN + If UsuarioActual.TienePermisoProceso(135) Then + If TxtOC.Text = "" AndAlso IdPoliza < 1 AndAlso CveMovimientoAlmacen < 1 AndAlso LblUsuarioCaptura.Text = UsuarioActual.Usuario AndAlso TmpDT.MAX("CveActivoFijo").ToEntero < 1 AndAlso Not ChkProgramarPago.Checked AndAlso CompraSaldo = TxtTotal.Text.ToDouble Then + BtnEliminarCompra.Visible = True + End If + End If + + 'ELIMINAR A FUERZAS + If UsuarioActual.TienePermisoProceso(77) Then + BtnEliminarCompra.Visible = True + If CompraSaldo <> TxtTotal.Text.ToDouble AndAlso dr("TipoDocto").ToString = "Fac" Then + BtnEliminarCompra.Enabled = False + BtnEliminarCompra.ToolTip = "La compra tiene pagos asociados, elimine los pagos primero." + End If + End If + + Dim StrInventario As String = "" + If dr("Inventario").ToString = "1" Then + StrInventario = "los Movimientos de Inventario relacionados" + End If + + If UsuarioActual.Empresa.UsaAC Then + BtnEliminarCompra.Attributes.Add("data-original-title", String.Format("¿Está seguro que desea eliminar la Compra, {0} y la Poliza Asociada?", StrInventario)) + ElseIf BtnEliminarCompra.Enabled Then + BtnEliminarCompra.Attributes.Add("data-original-title", String.Format("¿Está seguro que desea eliminar la Compra y {0}?", StrInventario)) + End If + End If + + 'VALIDA CANCELAR COMPRA - AC + ValidaCancelarCompra() + + 'CUANDO ESTA CANCELADA + If dr("CveEstatusFactura").ToString = "-2" Then + BtnEliminarCompra.Visible = False + BtnActualizar.Visible = False + BtnGuardar.Visible = False + BtnCancelarCompra.Visible = False + + LblCompraEstatus.Text = "CANCELADA" + LblCompraEstatus.Font.Bold = True + LblCompraEstatus.Font.Size = 12 + LblCompraEstatus.ForeColor = Drawing.Color.DarkRed + 'HplIr.Visible = False + + BtnDescontabilizar.Visible = False + BtnEliminarPolizaMultiple.Visible = False + + 'LIGA POLIZA CANCELACIÓN + 'HplPolizaCancelación.NavigateUrl = String.Format("/Contabilidad/RegPoliza.aspx?IdPoliza={0}", dr("IdPoliza")) + + End If + + 'CUANDO FUE REFACTURADA + If dr("CompraRefacturada").ToString.ToEntero > 0 Then + BtnEliminarCompra.Visible = False + BtnActualizar.Visible = False + BtnGuardar.Visible = False + BtnCancelarCompra.Visible = False + End If + + 'TIENE AMORTIZACIÓN + If GvAnticiposSel.Rows.Count > 0 Then + + If Not DdlTipoComprobante.SelectedValue.Contiene("NC", "DEV") Then + BtnCancelarCompra.Visible = False + BtnEliminarCompra.Visible = False + End If + End If + + 'Tiene Importacion + + If dr("EsImportacion").ToString = "True" Then + chkImportacion.Checked = True + Else + chkImportacion.Checked = False + End If + CargaComplementosPago() + CargaGvBitacora() + InventarioMov() + HabilitaNCInv() + + If Request("RG") IsNot Nothing Then + BtnRegenerarPrePolizaAlmacen_Click(Nothing, Nothing) + End If + + If DdlTipoComprobante.SelectedValue = "RNC" And CompraSaldo <> TxtTotal.Text.ToDecimal Then + BtnCancelarCompra.Visible = False + BtnEliminarCompra.Visible = False + End If + + If UsuarioActual.Empresa.Funcionalidad(578) = "1" Then + If ObjCompra.GetGastoMedicos(CveCompra) Then + DTMedicos = ObjCompra.DtResultados + GvMedicosGastos.DataSource = ObjCompra.DtResultados + GvMedicosGastos.DataBind() + End If + End If + + Else + Alert("La compra solicitada no se encontró. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) End If Else Alert("Ocurrió un error al cargar la compra. Por favor vuelta a intentar o comuniquese con Sistemas.", TipoMensaje.MsgError) @@ -4389,14 +4424,14 @@ Partial Class Compras_Compras '------------------ INICIA VALIDACIONES ------------------ - If UsuarioActual.CveEmpresa.Contiene(13, 83) AndAlso UsuarioActual.CveUsuario <> 1803 Then - Dim AnioFactura As Integer = TxtFecha.Text.ToDate.Year - Dim Fecha28Dic As Date = New Date(2024, 12, 28) - If NowADS() >= Fecha28Dic AndAlso TxtFecha.Text.ToDate.Year < 2025 Then - Alert("A partir del 28 de diciembre de 2024 no se pueden registrar facturas de 2024.", TipoMensaje.MsgAdvertencia) - Exit Sub - End If - End If + 'If UsuarioActual.CveEmpresa.Contiene(13, 83) AndAlso UsuarioActual.CveUsuario <> 1803 Then + ' Dim AnioFactura As Integer = TxtFecha.Text.ToDate.Year + ' Dim Fecha28Dic As Date = New Date(2024, 12, 28) + ' If NowADS() >= Fecha28Dic AndAlso TxtFecha.Text.ToDate.Year < 2025 Then + ' Alert("A partir del 28 de diciembre de 2024 no se pueden registrar facturas de 2024.", TipoMensaje.MsgAdvertencia) + ' Exit Sub + ' End If + 'End If If Not ValidaPresupuesto(2) Then Exit Sub @@ -4432,7 +4467,6 @@ Partial Class Compras_Compras End If Dim TotalRealDevolucion As Decimal = 0 - Dim EstatusCredito As Integer = 0 Dim CveSubProyecto As Integer = 0 'Credito Multiple @@ -5780,6 +5814,10 @@ Partial Class Compras_Compras Dim ObsGDiaz As String = If(EsGrupoDiaz, TxtObsFact.Text, "") + If AplicarObsOC Then + ObsGDiaz = ObsOC + End If + For Each tCveAlmacen As Integer In ListAlmacenes If GvInv.Rows(indice).FCDropDownList("DdlRecibirInv").SelectedValue = "1" Then Continue For @@ -6491,7 +6529,7 @@ Partial Class Compras_Compras Dim AgregaMercanciaInventario As Boolean = UsuarioActual.Empresa.UsaInventarios If UsuarioActual.CveEmpresa.Contiene(13, 83, 7, 11, 12, 122) Then AgregaMercanciaInventario = False - Dim RegistraConcepto225 As Boolean = AgregaMercanciaInventario AndAlso DdlTipoComprobante.SelectedValue.Contiene("NC", "DEV") + Dim RegistraConcepto225 As Boolean = AgregaMercanciaInventario AndAlso DdlTipoComprobante.SelectedValue.Contiene("DEV") Dim Insertado205 As Boolean = False @@ -6873,7 +6911,6 @@ Partial Class Compras_Compras ErrorMovInv = True Exit For End If - ' Dim DifTC As Decimal = tipoCambioActual - Gvr.DataKey("TipoCambio").ToDecimal 'diferenciaTransito = DifTC * (Gvr.DataKey("IVA").ToDecimal / Gvr.FCTextBox("TxtCantidadNCInv").Text.ToDecimal) 'diferenciaTransito += DifTC * (Gvr.DataKey("IEPSPS").ToDecimal / Gvr.FCTextBox("TxtCantidadNCInv").Text.ToDecimal) @@ -6881,7 +6918,6 @@ Partial Class Compras_Compras ImporteTransito += importeMNTemp CveCompraAmortizacion = Gvr.DataKey("CveCompra").ToEntero 'se registra por cada compra relacionada - End If Next @@ -6927,18 +6963,30 @@ Partial Class Compras_Compras DiferenciaDevolucion = -DiferenciaDevolucion End If If UsuarioActual.Empresa.Funcionalidad(574) = "1" Then ' las devoluciones, que tengan descuento por rnc, debe de descontar del saldo de la factura aplicada - tConceptoDiferencia = 272 - tCveCompraAmortizacion = tCveCompra - If ObjConta.GetPrePolizasDetalle(CvePrePoliza, UsuarioActual.CveEmpresa) Then - tCveCompra = ObjConta.DtResultados.FiltroPrimeroValor("CveCompraAmortizacion", "CveConceptoContable = 60").ToEntero 'a aplicación de la nc + Dim DiferenciaSaldo As Decimal = DevolucionImporteOriginal ''If(DdlMoneda.SelectedValue.ToEntero <> 1, (importeMovimiento * TxtTC.Text.ToDecimal), importeMovimiento) - DevolucionImporteOriginal + + If DiferenciaSaldo <> 0 Then + DiferenciaDevolucion += DiferenciaSaldo ' si hay diferencia se manda al costo + Dim DiferenciaBonif As Decimal = DiferenciaSaldo * (PorcentajeIVA) 'se saca el iva de la dif + DiferenciaSaldo = -DiferenciaSaldo * (1 + PorcentajeIVA) 'se invierte su aplicación + + tCveCompraAmortizacion = tCveCompra + If ObjConta.GetPrePolizasDetalle(CvePrePoliza, UsuarioActual.CveEmpresa) Then + tCveCompra = ObjConta.DtResultados.FiltroPrimeroValor("CveCompraAmortizacion", "CveConceptoContable = 60").ToEntero 'a aplicación de la nc + End If + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, tMovto, DiferenciaSaldo, DiferenciaSaldo, 272, Referencia, Concepto, CveCompra:=tCveCompra, CveCompraAmortizacion:=tCveCompraAmortizacion, CveProveedor:=CveProveedorConcepto, ImporteME:=If(tipoCambioActual = 1, 0, DiferenciaDevolucion), TipoCambio:=tipoCambioActual, CveMovimientoAlmacen:=CveMovimientoDevolucion, Contabilizable:=SeContabiliza, CveSubProyecto:=tCveSubProyecto, CveClasificacion:=tCveClasif) Then + ErrorPrepoliza = True + End If + If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, tMovto, DiferenciaBonif, DiferenciaBonif, 259, Referencia, Concepto, CveCompra:=tCveCompra, CveCompraAmortizacion:=tCveCompraAmortizacion, CveProveedor:=CveProveedorConcepto, ImporteME:=If(tipoCambioActual = 1, 0, DiferenciaDevolucion), TipoCambio:=tipoCambioActual, CveMovimientoAlmacen:=CveMovimientoDevolucion, Contabilizable:=SeContabiliza, CveSubProyecto:=tCveSubProyecto, CveClasificacion:=tCveClasif) Then + ErrorPrepoliza = True + End If End If End If - - If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, tMovto, DiferenciaDevolucion, DiferenciaDevolucion, tConceptoDiferencia, Referencia, Concepto, CveCompra:=tCveCompra, CveCompraAmortizacion:=tCveCompraAmortizacion, CveProveedor:=CveProveedorConcepto, ImporteME:=If(tipoCambioActual = 1, 0, DiferenciaDevolucion), TipoCambio:=tipoCambioActual, CveMovimientoAlmacen:=CveMovimientoDevolucion, Contabilizable:=SeContabiliza, CveSubProyecto:=tCveSubProyecto, CveClasificacion:=tCveClasif) Then + If DiferenciaDevolucion <> 0 AndAlso Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, tMovto, DiferenciaDevolucion, DiferenciaDevolucion, tConceptoDiferencia, Referencia, Concepto, CveCompra:=tCveCompra, CveCompraAmortizacion:=tCveCompraAmortizacion, CveProveedor:=CveProveedorConcepto, ImporteME:=If(tipoCambioActual = 1, 0, DiferenciaDevolucion), TipoCambio:=tipoCambioActual, CveMovimientoAlmacen:=CveMovimientoDevolucion, Contabilizable:=SeContabiliza, CveSubProyecto:=tCveSubProyecto, CveClasificacion:=tCveClasif) Then ErrorPrepoliza = True End If End If - If Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, TipoMovimiento, TotalRealDevolucion.RoundSQL(), (TotalRealDevolucion).RoundSQL(), ConceptoContabilizacionNC, Referencia, Concepto, CveCompra:=CveCompra, CveProveedor:=CveProveedorConcepto, ImporteME:=If(tipoCambioActual = 1, 0, TotalRealDevolucion).RoundSQL(), TipoCambio:=tipoCambioActual, CveMovimientoAlmacen:=CveMovimientoDevolucion, Contabilizable:=SeContabiliza) Then + If TotalRealDevolucion.RoundSQL() <> 0 AndAlso Not ObjConta.AddPrePolizasDetalle(CvePrePoliza, TipoMovimiento, TotalRealDevolucion.RoundSQL(), (TotalRealDevolucion).RoundSQL(), ConceptoContabilizacionNC, Referencia, Concepto, CveCompra:=CveCompra, CveProveedor:=CveProveedorConcepto, ImporteME:=If(tipoCambioActual = 1, 0, TotalRealDevolucion).RoundSQL(), TipoCambio:=tipoCambioActual, CveMovimientoAlmacen:=CveMovimientoDevolucion, Contabilizable:=SeContabiliza) Then ErrorPrepoliza = True End If Else @@ -7301,7 +7349,6 @@ Partial Class Compras_Compras End If Case 21 'Anticipo - If ArrAnticipos.Count > 0 Then Dim PorcentajeImpuestoAnticipo As Decimal = PorcentajeIVA @@ -7506,7 +7553,6 @@ Partial Class Compras_Compras Next importeMovimiento = 0 End If - End Select If ErrorPrepoliza Then @@ -7745,8 +7791,8 @@ Partial Class Compras_Compras Alert("Ocurrió un Error al agregar el IVA.
Revise su factura y cualquier detalle comuníquese a Soporte Técnico", TipoMensaje.MsgAdvertencia) ElseIf ErrorMovInv Then Alert("Ocurrió un Error al agregar el Producto o Servicio al Inventario.
Revise su factura y cualquier detalle comuníquese a Soporte Técnico", TipoMensaje.MsgAdvertencia) - ElseIf TieneError Then - Alert("El total de los IMPORTES del FINANCIAMIENTO debe ser mayor que 0 y menor o igual al total de la compra", TipoMensaje.MsgAdvertencia) + 'ElseIf TieneError Then + ' Alert("El total de los IMPORTES del FINANCIAMIENTO debe ser mayor que 0 y menor o igual al total de la compra", TipoMensaje.MsgAdvertencia) ElseIf ErrorAF Then Alert("Error al actualizar la vinculacion del Activo Fijo", TipoMensaje.MsgAdvertencia) ElseIf ErrorAC Then @@ -7906,7 +7952,7 @@ Partial Class Compras_Compras If CveEvaluacionProveedor > 0 Then Msg.Append("

El proveedor tiene evaluaciones pendientes
") - Msg.Append("¿Desea realizar una evaluacion al proveedor?") + Msg.Append("¿Desea realizar una evaluación al proveedor?") Msg.AppendFormat($"
Evaluar Proveedor.") End If @@ -13860,9 +13906,9 @@ Partial Class Compras_Compras Next 'si no esta vinculado a nc simplemente me lo brinco If realizadevolucion Then - + subtotaldevolucion = subtotaldevolucion.RoundSQL(2) 'si el subtotal es igual a la nc lo guardo si no marco error - Dim tTolerancia As Decimal = 0 + Dim tTolerancia As Decimal = 0.1D Dim tAjustaUltimo As Boolean = True If UsuarioActual.Empresa.Funcionalidad(574) = "1" Then tTolerancia = Math.Abs(TxtSubTotal2.Text.ToDecimal - subtotaldevolucion) @@ -13919,11 +13965,11 @@ Partial Class Compras_Compras End If Else ErrorMovInv = True - Alert("El Total de la NC debe ser igual al total de la devolucion", TipoMensaje.MsgAdvertencia) - End If + Alert("El Total de la NC debe ser igual al total de la devolución", TipoMensaje.MsgAdvertencia) End If + End If - If ObjInventario.GetMovimientosDetalle(CveMovimientoEntrada, UsuarioActual.CveEmpresa, -1) Then + If Not ErrorMovInv AndAlso ObjInventario.GetMovimientosDetalle(CveMovimientoEntrada, UsuarioActual.CveEmpresa, -1) Then For Each drow As DataRow In ObjInventario.DtResultados.Rows TotalSumaPU = TotalSumaPU + drow("Total").ToString.ToDecimal @@ -13969,7 +14015,7 @@ Partial Class Compras_Compras Dim objcompras As New ClsCompras() If objcompras.GetCompraDetalleAlmacen(UsuarioActual.CveEmpresa, DDLDevolucion.SelectedValue.ToEntero) Then GVDevolucion.DataSource = objcompras.DtResultados - FechaMovtoDev = objcompras.DtResultados.FiltroPrimeroValor("FechaMovto").ToDate.ToString("dd/MM/yyyy").ToDate + FechaMovtoDev = objcompras.DtResultados.FiltroPrimeroValor("FechaMovto").ToDate End If objcompras.Dispose() GVDevolucion.DataBind() @@ -13982,7 +14028,7 @@ Partial Class Compras_Compras DdlAlmacenDevolucion.SelectedValueExist(CveAlmacen) UPDevolucion.Update() - If EsGrupoDiaz AndAlso FechaMovtoDev <> MinFecha AndAlso (FechaMovtoDev >= TxtFecha.Text.ToDate) Then + If FechaMovtoDev <> MinFecha AndAlso (FechaMovtoDev >= TxtFecha.Text.ToDate) Then Alert("La fecha de la devolución se cambiará a una fecha posterior al ingreso.", TipoMensaje.ToastAdventencia) End If @@ -13992,7 +14038,6 @@ Partial Class Compras_Compras Try Dim subtotaldevolucion As Decimal = 0 Dim realizadevolucion As Boolean = False - 'Calculo los subtotales para comparar con la NC Dim cantidad As Decimal = 0D @@ -14015,14 +14060,13 @@ Partial Class Compras_Compras If Math.Abs(TxtSubTotal2.Text.ToDecimal - subtotaldevolucion) <= tTolerancia Then VinculaDevolucion() - If EsGrupoDiaz AndAlso FechaMovtoDev <> MinFecha AndAlso (FechaMovtoDev >= TxtFecha.Text.ToDate) Then + If FechaMovtoDev <> MinFecha AndAlso (FechaMovtoDev >= TxtFecha.Text.ToDate) Then TxtFecha.Text = FechaMovtoDev.AddDays(1).ToString("dd/MM/yyyy") Alert("La fecha de la devolución se cambiará a una fecha posterior al ingreso.", TipoMensaje.ToastAdventencia) UpParametros.Update() End If - Else - Alert("El Total de la NC debe ser igual al total de la devolucion", TipoMensaje.MsgAdvertencia) + Alert("El Total de la NC debe ser igual al total de la devolución", TipoMensaje.MsgAdvertencia) End If Else Alert("No se ha seleccionado nada para la devolución. Por favor rectifique y vuelva a intentar.", TipoMensaje.MsgAdvertencia) @@ -14043,10 +14087,7 @@ Partial Class Compras_Compras Dim IEPSCompra As Decimal = TxtIEPS.Text.ToDecimal() Dim RetIVACompra As Decimal = TxtRetIVA.Text.ToDecimal() Dim RetISRCompra As Decimal = TxtRetISR.Text.ToDecimal() - Dim Acumulado As Decimal = 0 - - 'Dim TotalCalculable As Decimal = TotalCompra - IEPSCompra + RetIVACompra + RetISRCompra - + Dim AcumuladoDevolucion As Decimal = 0 Dim IVAPorcentajeCompra As Decimal = Math.Round((IVACompra / SubTotalCompra), 2) Dim Contador As Integer = 0 Dim Consec As Integer = 0 @@ -14082,12 +14123,12 @@ Partial Class Compras_Compras Dim IVA As Decimal = IVAPorcentajeCompra 'Math.Round(Total * IVAPorcentajeCompra, 2) Dim Descuento As Decimal = 0 - Acumulado += (PU * Cantidad) + AcumuladoDevolucion += (PU * Cantidad) Consec += 1 - If Consec = Contador AndAlso tAjusteUltimo Then 'SubTotalCompra < Acumulado Then + If Consec = Contador AndAlso tAjusteUltimo Then 'SubTotalCompra < AcumuladoDevolucion Then 'ajusta el valor - Dim dif As Decimal = SubTotalCompra - Acumulado + Dim dif As Decimal = SubTotalCompra - AcumuladoDevolucion If dif <> 0 Then PU = ((PU * Cantidad) + dif) / Cantidad Total = Cantidad * PU @@ -14105,7 +14146,8 @@ Partial Class Compras_Compras End If Dim PSRow As DataRow = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=CvePSRNC).FiltroPrimero("") Dim PS As String = PSRow("PSCodigo").ToString - Dim tDif As Decimal = TxtSubTotal2.Text.ToDecimal - Total + Dim tDif As Decimal = TxtSubTotal2.Text.ToDecimal - AcumuladoDevolucion + DevolucionImporteOriginal = tDif AddPS(1, PSRow("CveUnidadMedida").ToString.ToEntero, PSRow("UnidadMedida").ToString, PSRow("CveClasificacion").ToString.ToEntero, PSRow("Clasificacion").ToString, CvePSRNC, PS, 1, CveSubProyectoDev.ToString, SubProyecto, "", "-1", "", tDif, tDif, IVAPorcentajeCompra, 0, 0, 0, 0, 0) @@ -15031,7 +15073,18 @@ Partial Class Compras_Compras + Dim ObsOCAsignado As Boolean = False + For Each CveOCItem As String In ArrayCveOC.Distinct + + + If Not ObsOCAsignado Then + If ObjOC.GetOC(CveOCItem.ToEntero, UsuarioActual.CveEmpresa) Then + ObsOC = ObjOC.Descripcion + End If + ObsOCAsignado = True + End If + If ObjOC.GetOrdenesDetalle(CveOCItem.ToEntero, UsuarioActual.CveEmpresa) AndAlso ObjOC.DtResultados.Rows.Count > 0 Then If IsNothing(DTOCTemp) Then DTOCTemp = ObjOC.DtResultados.Copy @@ -15277,23 +15330,27 @@ Partial Class Compras_Compras 'PROCESO DE ASIGNACION DE CANTIDAD DEPENDIENDO DEL NoIdentificacion DEL XML Y EL NumeroParte DEL PRODUCTO If UsuarioActual.Empresa.Funcionalidad(382) = "1" Then - For Each Gvr As GridViewRow In GvOC1.Rows - Dim Change As Boolean = False - For Each Dr2 As DataRow In TmpDT.Rows - If Gvr.DataKey("NumeroParte") = Dr2("NoIdentificacion").ToString() OrElse Gvr.DataKey("CvePS") = Dr2("CvePS").ToString() Then - ' que la cantidad de la Fact no exceda a la de la OC - If Dr2("Cantidad").ToString.ToDecimal > Gvr.DataKey("CantidadF").ToDecimal Then - Gvr.FCTextBox("TxtCantidad").Text = Gvr.DataKey("CantidadF").ToDecimal.ToString("#,###.####") - Else - Gvr.FCTextBox("TxtCantidad").Text = Dr2("Cantidad").ToString + + If CveFactura > 0 Then + For Each Gvr As GridViewRow In GvOC1.Rows + Dim Change As Boolean = False + For Each Dr2 As DataRow In TmpDT.Rows + If Gvr.DataKey("NumeroParte") = Dr2("NoIdentificacion").ToString() OrElse Gvr.DataKey("CvePS") = Dr2("CvePS").ToString() Then + ' que la cantidad de la Fact no exceda a la de la OC + If Dr2("Cantidad").ToString.ToDecimal > Gvr.DataKey("CantidadF").ToDecimal Then + Gvr.FCTextBox("TxtCantidad").Text = Gvr.DataKey("CantidadF").ToDecimal.ToString("#,###.####") + Else + Gvr.FCTextBox("TxtCantidad").Text = Dr2("Cantidad").ToString + End If + Change = True End If - Change = True + Next + If Not Change Then + Gvr.FCTextBox("TxtCantidad").Text = "" End If Next - If Not Change Then - Gvr.FCTextBox("TxtCantidad").Text = "" - End If - Next + End If + 'detectar los ps que no están en la OC, códigos que no están en la OC 'mostrar los ps que no están en la oc Dim strMsg As New StringBuilder @@ -15914,6 +15971,8 @@ Partial Class Compras_Compras End If + AplicarObsOC = True + CalculaTotales() End Sub @@ -18201,7 +18260,7 @@ Partial Class Compras_Compras Case "U" 'UPDATE UpdatePS(CveContratoDetalle) - Alert("Concepto actualizado Correctamente.", TipoMensaje.MsgInformacion) + Alert("Concepto actualizado Correctamente.", TipoMensaje.ToastInformacion) RegistraScript(String.Format("$('#{0}').modal('hide');", "divAddProducto")) End Select ActualizaTotales = False @@ -18213,13 +18272,8 @@ Partial Class Compras_Compras GuardaAC() End If - - - - If CveCompra > 0 AndAlso ChkModalDesvincularAF.Checked Then - If Not TmpDT.Columns.Contains("DesvicularAF") Then TmpDT.Columns.Add("DesvicularAF", GetType(Boolean)) End If @@ -18473,7 +18527,6 @@ Partial Class Compras_Compras Exit Sub End Try - 'BANDERA Dim AplicaCalculaTotales As Boolean = False diff --git a/Compras/PopUpVerFactura.aspx.vb b/Compras/PopUpVerFactura.aspx.vb index a4e7e7422..8922c3ac0 100644 --- a/Compras/PopUpVerFactura.aspx.vb +++ b/Compras/PopUpVerFactura.aspx.vb @@ -5,6 +5,7 @@ Imports System.Data Imports System.IO Imports System.Xml Imports Extensiones +Imports iText.Barcodes.Dmcode Imports Microsoft.Reporting.WebForms Imports ZXing @@ -6020,6 +6021,9 @@ Partial Class PopUpVerFactura End If Else If ObjIE.GetBancosIE(CveIE, UsuarioActual.CveEmpresa) Then + + ParamComprobacion = ObjIE.DtResultados + If ObjIE.DtResultados.Rows.Count > 0 Then Dim reportDataSetsList As New List(Of ReportDataSource) @@ -6096,6 +6100,14 @@ Partial Class PopUpVerFactura ImprimirPDF("Empresas\Grales\Formatos\rptChequeMovimientosPrePoliza.rdlc", reportDataSetsList, paramList, ObjIE.Folio, "PDF") Else + + If UsuarioActual.CveEmpresa = 140 Then + Dim Aplicado As Decimal = 0 + Dim ImporteDoc As Decimal = ParamComprobacion.Rows(0)("Importe").ToString.ToDecimal + Dim LeyendaSaldo As String = $"Folio #{ParamComprobacion.Rows(0)("Folio").ToString} con importe de ${ImporteDoc.ToString("###,###,###.00")} y saldo antes de la comprobación de ${SaldoTotal.ToString("###,###,###.00")}, Comprobaciones a la fecha {ParamComprobacion.Rows(0)("FechaDocumento").ToString().ToDate().ToString("dd/MM/yyyy")} ${ImportePagoTotal.ToString("###,###,###.00")} saldo después de la comprobación ${(SaldoTotal - ImportePagoTotal).ToString("###,###,###.00")} ." + paramList.Add(New ReportParameter("LeyendaSaldo", LeyendaSaldo)) + End If + ImprimirPDF("Empresas\Grales\Formatos\rptChequeMovimientos.rdlc", reportDataSetsList, paramList, ObjIE.Folio, "PDF") End If diff --git a/Compras/eFacturas.aspx b/Compras/eFacturas.aspx index 577e6b336..11748af36 100644 --- a/Compras/eFacturas.aspx +++ b/Compras/eFacturas.aspx @@ -106,7 +106,7 @@
- +
@@ -231,6 +231,12 @@ + + +   Prueba + + +
@@ -1362,10 +1368,9 @@

-   Consultar -   Prueba +
diff --git a/Compras/eFacturas.aspx.vb b/Compras/eFacturas.aspx.vb index dcd6b6243..a8be99ea4 100644 --- a/Compras/eFacturas.aspx.vb +++ b/Compras/eFacturas.aspx.vb @@ -1156,12 +1156,12 @@ Partial Class Compras_eFacturas e.Row.FCCheckBox("chkRegistraFactura").Visible = False End If - If UsuarioActual.CveEmpresa.Contiene(13, 83) AndAlso UsuarioActual.CveUsuario <> 1803 Then - Dim Fecha28Dic As Date = New Date(2024, 12, 28) - If NowADS() >= Fecha28Dic AndAlso e.Row.DBCampo("FechaFactura").ToDate.Year < 2025 Then - e.Row.FCHyperLink("HplAgregar").Visible = False - End If - End If + 'If UsuarioActual.CveEmpresa.Contiene(13, 83) AndAlso UsuarioActual.CveUsuario <> 1803 Then + ' Dim Fecha28Dic As Date = New Date(2024, 12, 28) + ' If NowADS() >= Fecha28Dic AndAlso e.Row.DBCampo("FechaFactura").ToDate.Year < 2025 Then + ' e.Row.FCHyperLink("HplAgregar").Visible = False + ' End If + 'End If e.Row.FCCheckBox("chkRegistraFactura").Attributes.Add("onclick", "ChkRegsitraFacturas()") @@ -6080,6 +6080,7 @@ Partial Class Compras_eFacturas End Sub Private Sub VinculacionAutomaticaRNC() + Dim ErrorProceso As Boolean = False Dim ErrorProcesoStr As String = "" Dim Contador As Integer = 0 @@ -6088,7 +6089,6 @@ Partial Class Compras_eFacturas 'DataKeyNames="CveFactura,CveCompra,CveProveedor,SerieFolio,NombreProveedor,UUID,RFCDe,RFCPara,TipoFactura,FueValidado,TipoComprobante,Version,RFCde,XML,PDF,BloquePorComplemento,Total,CveTipoProveedor,FechaFactura" - For Each GvRow As GridViewRow In GvD.Rows If GvRow.DataKey("TipoComprobante") = "E" Then @@ -6113,28 +6113,97 @@ Partial Class Compras_eFacturas CompraActual.Descripcion = TxtDescripcionCompra.Text.Trim CompraActual.NombreProveedor = GvRow.DataKey("NombreProveedor") - For Each DR As String In CompraActual.DocumentosRelacionadosUUIDSList + Dim DT_RNC As New DataTable + DT_RNC.Columns.Add("CveCompra", GetType(Integer)) + DT_RNC.Columns.Add("CveSubProyecto", GetType(Integer)) + DT_RNC.Columns.Add("Saldo", GetType(Decimal)) + + For Each DR As String In CompraActual.DocumentosRelacionadosUUIDSList + If Objcompras.GetVinculacionRNC(UUID:=DR, CveEmpresa:=UsuarioActual.CveEmpresa) Then + For Each drRNC As DataRow In Objcompras.DtResultados.Rows + Dim DR_RNC As DataRow = DT_RNC.NewRow + DR_RNC("CveCompra") = drRNC("CveCompra").ToString.ToEntero + DR_RNC("CveSubProyecto") = drRNC("CveSubProyecto").ToString.ToEntero + DR_RNC("Saldo") = drRNC("Saldo").ToString.ToDecimal + DT_RNC.Rows.Add(DR_RNC) + Next + End If Next + Dim Saldo As Decimal = DT_RNC.SUM("Saldo") + Dim CveSubProyectoPrincipal As Integer = DT_RNC.FiltroPrimeroValor("CveSubProyecto").ToEntero + + If Saldo >= CompraActual.Total Then + + Dim CvePSRNC As Integer = UsuarioActual.Empresa.Funcionalidad(580).ToEntero + Dim PSRow As DataRow = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa, CvePS:=CvePSRNC).FiltroPrimero("") + + + + If CompraActual.ConfiguraRegistroCompra(CvePSRNC, CveSubProyectoPrincipal, -1, -1, + -1, -1, NumeroReembolso:="", + DTProrrateo:=New DataTable, DTPagosDeudores:=New DataTable, TipoComprobante:="E") Then + + If CompraActual.AddCompra(Objcompras.IniciaTransacSQL()) Then + Contador = Contador + 1 + Else + ErrorProceso = True + ErrorProcesoStr = CompraActual.MensajeError + Exit For + End If + Else + ErrorProceso = True + ErrorProcesoStr = CompraActual.MensajeError + Exit For + End If + + + + If Not ErrorProceso Then + Dim ObjConta As New ClsContabilidad(Objcompras.IniciaTransacSQL()) + Dim TotalSaldo As Decimal = CompraActual.Total + Dim Referencia As String = GvRow.DataKey("SerieFolio") + Dim Concepto As String = GvRow.DataKey("SerieFolio") + Dim TipoCambio As Decimal = GlobalTipoCambio(GvRow.DataKey("FechaFactura").ToDate).ToDecimal + + For Each drRNC As GridViewRow In DT_RNC.Rows + + + Dim ImporteRNCSaldar As Decimal = drRNC.DataKey("Saldo").ToDecimal + Dim CveCompraRNC As Integer = drRNC.DataKey("CveCompra").ToEntero + If ImporteRNCSaldar > TotalSaldo Then ImporteRNCSaldar = TotalSaldo + + If Not ErrorProceso Then + + If Not ObjConta.AddPrePolizasDetalle(CompraActual.CvePrePoliza, False, ImporteRNCSaldar, ImporteRNCSaldar, 373, Referencia, Concepto, CveCompra:=CveCompraRNC, CveProveedor:=Me.CveProveedor, ImporteME:=If(TipoCambio = 1, 0, ImporteRNCSaldar), TipoCambio:=TipoCambio, + CveClasificacion:=-1, CveSubProyecto:=CompraActual.CveSubProyecto, Contabilizable:=True) Then + ErrorProceso = True + Exit For + End If + + If Not ErrorProceso Then + Dim ConPrePNC As ConceptosTipoSaldo = ObtenerCveConceptoPrePoliza(15, CompraActual.CveMoneda, True, CompraActual.CveTipoConceptoProveedor) + + If Not ObjConta.AddPrePolizasDetalle(CompraActual.CvePrePoliza, True, ImporteRNCSaldar, ImporteRNCSaldar, ConPrePNC.CveConcepto, Referencia, Concepto, CveCompra:=CompraActual.CveCompra, CveProveedor:=Me.CveProveedor, ImporteME:=If(TipoCambio = 1, 0, ImporteRNCSaldar), TipoCambio:=TipoCambio, + CveClasificacion:=-1, CveSubProyecto:=CompraActual.CveSubProyecto, Contabilizable:=True) Then + ErrorProceso = True + Exit For + End If + End If + + If Not ErrorProceso Then + TotalSaldo = TotalSaldo - ImporteRNCSaldar + End If + + End If + + Next + End If + + End If - 'If CompraActual.ConfiguraRegistroCompra(DdlPS.SelectedValue.ToEntero, DdlSubProyecto.SelectedValue.ToEntero, CveCajachica, CvePersonal, - ' DdlRetIVAConcepto.SelectedValue.ToEntero, DdlRetISRConcepto.SelectedValue.ToEntero, NumeroReembolso:=TxtNumeroReembolso.Text, - ' DTProrrateo:=DTProrrateo, DTPagosDeudores:=New DataTable) Then - ' 'FIX ME OIC Recuerda cambiar el tipo de documento al registrar, actualmente tiene FAC y NC uno u otro, ajustar para que registre *** Egs *** cuado TipoComprobante = 'E' - ' If CompraActual.AddCompra(Objcompras.IniciaTransacSQL()) Then - ' Contador = Contador + 1 - ' Else - ' ErrorProceso = True - ' ErrorProcesoStr = CompraActual.MensajeError - ' Exit For - ' End If - 'Else - ' ErrorProceso = True - ' ErrorProcesoStr = CompraActual.MensajeError - ' Exit For - 'End If 'If RBLContado.SelectedValue.ToEntero = 4 Then 'Deudores ' Dim CompraActualPagar = New Compra @@ -6847,7 +6916,8 @@ Public Class ClsCompraManager #End Region End Sub - Public Function ConfiguraRegistroCompra(CvePS As Integer, CveSubProyecto As Integer, CveCajaChica As Integer, CvePersonal As Integer, CveRetIVAConcepto As Integer, CveRetISRConcepto As Integer, NumeroReembolso As String, DTProrrateo As DataTable, DTPagosDeudores As DataTable) As Boolean + Public Function ConfiguraRegistroCompra(CvePS As Integer, CveSubProyecto As Integer, CveCajaChica As Integer, CvePersonal As Integer, CveRetIVAConcepto As Integer, CveRetISRConcepto As Integer, NumeroReembolso As String, DTProrrateo As DataTable, + DTPagosDeudores As DataTable, Optional TipoComprobante As String = "") As Boolean Dim respuesta As Boolean = True Me.CveSubProyecto = CveSubProyecto @@ -6860,6 +6930,10 @@ Public Class ClsCompraManager Me.NumeroReembolso = NumeroReembolso Me.DTPagosDeudores = DTPagosDeudores + If TipoComprobante.Length > 0 Then + Me.TipoComprobante = TipoComprobante + End If + Dim dRowSubProyecto As DataRow = GlobalDTSubProyectos(UsuarioActual.CveEmpresa, CveSubProyecto:=CveSubProyecto).FiltroPrimero("") If dRowSubProyecto IsNot Nothing Then @@ -6874,7 +6948,7 @@ Public Class ClsCompraManager 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 + If Not UpdatePSDetalles(dRowIndex("Consec").ToString.ToEntero, CvePS) Then respuesta = False End If Next @@ -7827,7 +7901,7 @@ Public Class ClsCompraManager End Sub - Private Function UpdatePSReembolso(Index As Integer, CvePS As Integer) As Boolean + Private Function UpdatePSDetalles(Index As Integer, CvePS As Integer) As Boolean Dim Respuesta As Boolean = True diff --git a/Contabilidad/RegPrePolizaS.aspx.vb b/Contabilidad/RegPrePolizaS.aspx.vb index c4129847f..caf9c6f53 100644 --- a/Contabilidad/RegPrePolizaS.aspx.vb +++ b/Contabilidad/RegPrePolizaS.aspx.vb @@ -2847,6 +2847,7 @@ Partial Class ContabilidadC_RegPrePolizaS LnkFolioManual.Visible = True BtnDescontabilizar.Visible = False BtnContabilizar.Visible = True + Folio = "0" End If ObjConta.Dispose() @@ -2857,7 +2858,7 @@ Partial Class ContabilidadC_RegPrePolizaS End Sub Private Sub LnkFolioManual_Click(sender As Object, e As EventArgs) Handles LnkFolioManual.Click - + Folio = "0" TxtFolio.Enabled = True TxtFolio.Focus() UpPoliza.Update() diff --git a/Empresas/Grales/Formatos/CartaPorteTimbrado.rdlc b/Empresas/Grales/Formatos/CartaPorteTimbrado.rdlc index f02dfff7c..ef50cb052 100644 --- a/Empresas/Grales/Formatos/CartaPorteTimbrado.rdlc +++ b/Empresas/Grales/Formatos/CartaPorteTimbrado.rdlc @@ -4256,7 +4256,7 @@ - ="3. Página " & code.PageNumber & " de " & code.TotalPages + ="3. Página " & Code.PageNumber & " de " & Code.TotalPages @@ -5298,7 +5298,7 @@ DataSet3 0.06703cm 1cm - 17.53311cm + 17.8346cm @@ -5310,7 +5310,7 @@ 11.49939cm 1.33863cm 1.06703cm - 17.82891cm + 17.8346cm 21 + LightGrey 2pt 2pt 2pt @@ -6015,6 +6016,7 @@ Se ha recibido el número arriba indicado de bultos/contenedores/remolques/autot + LightGrey 2pt 2pt 2pt @@ -6134,6 +6136,7 @@ Se ha recibido el número arriba indicado de bultos/contenedores/remolques/autot + LightGrey 2pt 2pt 2pt @@ -6985,11 +6988,11 @@ Se ha recibido el número arriba indicado de bultos/contenedores/remolques/autot Function PageNumber() As String - Return Me.Report.Globals!PageNumber + Return Me.Report.Globals!OverallPageNumber End Function Function TotalPages() As String - Return Me.Report.Globals!TotalPages + Return Me.Report.Globals!OverallTotalPages End Function es-MX true diff --git a/Empresas/Grales/Formatos/RepRembolsosComprobaciones.rdlc b/Empresas/Grales/Formatos/RepRembolsosComprobaciones.rdlc index baf4d6fd7..fe395548e 100644 --- a/Empresas/Grales/Formatos/RepRembolsosComprobaciones.rdlc +++ b/Empresas/Grales/Formatos/RepRembolsosComprobaciones.rdlc @@ -1121,7 +1121,9 @@ - Textbox1 diff --git a/Empresas/Grales/Formatos/rptChequeMovimientos.rdlc b/Empresas/Grales/Formatos/rptChequeMovimientos.rdlc index 22ac7bbe0..42a6e879e 100644 --- a/Empresas/Grales/Formatos/rptChequeMovimientos.rdlc +++ b/Empresas/Grales/Formatos/rptChequeMovimientos.rdlc @@ -1,1814 +1,5 @@ - - - - - true - true - - - - - =Parameters!Cuenta.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - =Parameters!Paguese.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - ="<b>Importe: </b>" & FormatCurrency(Parameters!Importe.Value, 2) & " " & Parameters!MonedaAbreviatura.Value - HTML - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - =Parameters!Observaciones.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - 2.57974cm - - - 6.32386cm - - - 2.08353cm - - - 2.00257cm - - - 2.29951cm - - - 1.79499cm - - - 2.18122cm - - - - - 0.4677cm - - - - - true - true - - - - - Factura - - - - - - - Textbox19 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Descripción - - - - - - - Textbox21 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - F. Factura - - - - - - - Textbox23 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Original - - - - - - - Textbox25 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Abonado - - - - - - - Textbox27 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - N.C - - - - - - - Textbox2 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Saldo - - - - - - - Textbox3 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - 0.6cm - - - - - true - true - - - - - =Fields!SerieFolio.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!Descripcion.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!FechaCompra.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!Total.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!Importe.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Sum(Fields!ImporteNC.Value) - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!Saldo.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - 0.6cm - - - - - true - true - - - - - Total - - - - : - - - - - - - Textbox30 - - - 2pt - 2pt - 2pt - 2pt - - - 4 - - - - - - - - - true - true - - - - - =IiF(SUM(Fields!Importe.Value) > 0, SUM(Fields!Importe.Value),0.00) - - - - - - - Importe2 - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Sum(Fields!ImporteNC.Value) - - - - - - - Textbox5 - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Sum(Fields!Saldo.Value) - - - - - - - Textbox6 - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - - - - - - - - - - - - - - - - After - - - - - =Fields!SerieFolio.Value - =Fields!Descripcion.Value - =Fields!FechaCompra.Value - =Fields!Total.Value - =Fields!Importe.Value - =Fields!Saldo.Value - - - - - Before - - - - true - DataSet1 - 2.18687cm - 0.25413cm - 1.6677cm - 19.26542cm - 4 - - - - - - true - true - - - - - Cuenta: - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - Paguese: - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - Obs: - - - - - - 2pt - 2pt - 2pt - 2pt - - - - 2.03432cm - 19.51955cm - 0cm - -19.47588cm - 8 - - - - - - true - true - - - - - ="<b> Folio: </b>" & Parameters!Folio.Value - HTML - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - 2.5cm - - - 2.95074cm - - - 2.5cm - - - - - 0.52063cm - - - - - true - true - - - - - Resumen Notas de Crédito - - - - - - - Textbox7 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - 3 - - - - - - - - 0.6cm - - - - - true - true - - - - - Factura - - - - - - - Textbox4 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Nota de Crédito - - - - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - Importe - - - - - - - Textbox10 - - - LightGrey - 2pt - 2pt - 2pt - 2pt - - - - - - - - 0.6cm - - - - - true - true - - - - - =Fields!SerieFolio.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!SerieFolioNC.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - true - true - - - - - =Fields!Importe.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - 0.6cm - - - - - true - true - - - - - Total: - - - - - - - Textbox13 - - - 2pt - 2pt - 2pt - 2pt - - - 2 - - - - - - - true - true - - - - - =SUM(Fields!Importe.Value) - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - - - - - - - - - - - - After - - - After - - - - - - =Fields!SerieFolio.Value - - - - - - - - Before - - - - true - DataSet2 - 4.20735cm - 0.25413cm - 2.32063cm - 7.95074cm - 10 - - =iif(Sum(Fields!Importe.Value)>0,false, true) - - - - - - - 6.70437cm - 19.51955cm - 0cm - -19.51955cm - 11 - - - - - - true - true - - - - - Fecha: - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - =Parameters!Fecha.Value - - - - - - - Cuenta - 0.0635cm - 6.22945in - 0.23622in - 1.40532in - 13 - - - 2pt - 2pt - 2pt - 2pt - - - - 7.24235cm - - - - - - - Textbox1 - 0.3175cm - 2.52765cm - 0.6cm - 14.40301cm - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - REPORTE DE PAGO DE MOVIMIENTOS - - - - - - - - - - - - - - - - Textbox2 - 0.95278cm - 2.52765cm - 0.55591cm - 14.40301cm - 1 - - - 2pt - 2pt - 2pt - 2pt - - - - External - =Parameters!LogoPath.Value - FitProportional - 0.15522cm - 2.22362cm - 2.33715cm - 2 - - - - - - - - - - - 0.52063cm - true - true - - - true - true - - - - - ="Página " & Globals.PageNumber & " de " & Globals.TotalPages - - - - - - - Textbox41 - 0.01764cm - 16.41607cm - 0.48535cm - 2.97625cm - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - Usuario: - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - =Parameters!UsuarioImprimio.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - Fecha Impresión: - - - - - - 2pt - 2pt - 2pt - 2pt - - - - true - true - - - - - =Parameters!FechaImpresion.Value - - - - - - 2pt - 2pt - 2pt - 2pt - - - - - - - - 27.94cm - 21.59cm - 1cm - 1cm - 1.5cm - 1.5cm - 0.13cm - + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!Paguese.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + ="<b>Importe: </b>" & FormatCurrency(Parameters!Importe.Value, 2) & " " & Parameters!MonedaAbreviatura.Value + HTML + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!Observaciones.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.57974cm + + + 6.32386cm + + + 2.08353cm + + + 2.00257cm + + + 2.29951cm + + + 1.79499cm + + + 2.18122cm + + + + + 0.4677cm + + + + + true + true + + + + + Factura + + + + + + + Textbox19 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Descripción + + + + + + + Textbox21 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + F. Factura + + + + + + + Textbox23 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Original + + + + + + + Textbox25 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Abonado + + + + + + + Textbox27 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + N.C + + + + + + + Textbox2 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Saldo + + + + + + + Textbox3 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.6cm + + + + + true + true + + + + + =Fields!SerieFolio.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Descripcion.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!FechaCompra.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Total.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Importe.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!ImporteNC.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Saldo.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.6cm + + + + + true + true + + + + + Total + + + + : + + + + + + + Textbox30 + + + 2pt + 2pt + 2pt + 2pt + + + 4 + + + + + + + + + true + true + + + + + =IiF(SUM(Fields!Importe.Value) > 0, SUM(Fields!Importe.Value),0.00) + + + + + + + Importe2 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!ImporteNC.Value) + + + + + + + Textbox5 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Sum(Fields!Saldo.Value) + + + + + + + Textbox6 + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + + + After + + + + + =Fields!SerieFolio.Value + =Fields!Descripcion.Value + =Fields!FechaCompra.Value + =Fields!Total.Value + =Fields!Importe.Value + =Fields!Saldo.Value + + + + + Before + + + + true + DataSet1 + 2.18687cm + 0.24221cm + 1.6677cm + 19.26542cm + 4 + + + + + + true + true + + + + + Cuenta: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Paguese: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Obs: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + 2.03432cm + 19.50763cm + 0cm + -19.47588cm + 8 + + + + + + true + true + + + + + ="<b> Folio: </b>" & Parameters!Folio.Value + HTML + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.5cm + + + 2.95074cm + + + 2.5cm + + + + + 0.52063cm + + + + + true + true + + + + + Resumen Notas de Crédito + + + + + + + Textbox7 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + 3 + + + + + + + + 0.6cm + + + + + true + true + + + + + Factura + + + + + + + Textbox4 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Nota de Crédito + + + + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Importe + + + + + + + Textbox10 + + + LightGrey + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.6cm + + + + + true + true + + + + + =Fields!SerieFolio.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!SerieFolioNC.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Importe.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.6cm + + + + + true + true + + + + + Total: + + + + + + + Textbox13 + + + 2pt + 2pt + 2pt + 2pt + + + 2 + + + + + + + true + true + + + + + =SUM(Fields!Importe.Value) + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + After + + + After + + + + + + =Fields!SerieFolio.Value + + + + + + + + Before + + + + true + DataSet2 + 4.90585cm + 0.24221cm + 2.32063cm + 7.95074cm + 10 + + =iif(Sum(Fields!Importe.Value)>0,false, true) + + + + + + + 7.33937cm + 19.45252cm + 0cm + -18.86119cm + 11 + + + + + + true + true + + + + + Fecha: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!Fecha.Value + + + + + + + Cuenta + 0.0635cm + 6.22476in + 0.23622in + 1.40532in + 13 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + true + + + + + =Parameters!LeyendaSaldo.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + 7.33937cm + + + + + + + Textbox1 + 0.3175cm + 2.54748cm + 0.6cm + 14.40301cm + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + REPORTE DE PAGO DE MOVIMIENTOS + + + + + + + + + + + + + + + + Textbox2 + 0.95278cm + 2.54748cm + 0.55591cm + 14.40301cm + 1 + + + 2pt + 2pt + 2pt + 2pt + + + + External + =Parameters!LogoPath.Value + FitProportional + 0.17505cm + 2.22362cm + 2.33715cm + 2 + + + + + + + + + + + 0.52063cm + true + true + + + true + true + + + + + ="Página " & Globals.PageNumber & " de " & Globals.TotalPages + + + + + + + Textbox41 + 0.01764cm + 16.46765cm + 0.48535cm + 2.97625cm + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Usuario: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!UsuarioImprimio.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + Fecha Impresión: + + + + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!FechaImpresion.Value + + + + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 27.94cm + 21.59cm + 1cm + 1cm + 1.5cm + 1.5cm + 0.13cm + @@ -67,18 +100,17 @@ -
+
-
+
- - + @@ -86,16 +118,54 @@ - + + <%-- + + + + + + + + + --%>
- - -
- - - +
+ Fecha Inicio: + +
+
+
+ + + + +
+ + + + + + +
+
+ Fecha Fin: + +
+
+
+ + + + +
+ + + + + +
-
@@ -120,67 +190,52 @@
- - - -
-
-
+