From 1e02a1874df6dc4a4842a462c7db451aa09b14e0 Mon Sep 17 00:00:00 2001 From: rrene Date: Sat, 11 Dec 2021 16:56:01 -0700 Subject: [PATCH] -- cambios en carta porte --- Acarreos/CatChoferes.aspx.vb | 20 +- App_Code/CFDITimbre.vb | 25 +- App_Code/ClsGenerales.vb | 70 +- App_Code/ClsNominas.vb | 4 +- App_Code/ClsPaginas.vb | 142 ++- App_Code/Modelos.vb | 127 +-- App_Code/Timbrado.vb | 123 ++- App_Code/Timbres.vb | 355 +++++++ Bin/GoCfdi.dll | Bin 388608 -> 392192 bytes Compras/PopUpVerFactura.aspx.vb | 120 ++- Compras/Proveedores.aspx.vb | 2 +- General/RepEntregaAlmacenRuta.aspx | 10 +- General/RepEntregaAlmacenRuta.aspx.cs | 49 +- Inventarios/EntregaAlmacenRuta.aspx | 484 +++++---- Inventarios/EntregaAlmacenRuta.aspx.cs | 643 ++++++------ Inventarios/RecepcionAlmacen.aspx.vb | 147 ++- Inventarios/TraspasoAlmacen.aspx | 282 +++-- Inventarios/TraspasoAlmacen.aspx.vb | 1308 ++---------------------- Planeacion/CatSubProyectos.aspx.vb | 12 +- Ventas/Clientes.aspx.vb | 579 +---------- 20 files changed, 1678 insertions(+), 2824 deletions(-) create mode 100644 App_Code/Timbres.vb diff --git a/Acarreos/CatChoferes.aspx.vb b/Acarreos/CatChoferes.aspx.vb index b19289490..dfad4ec10 100644 --- a/Acarreos/CatChoferes.aspx.vb +++ b/Acarreos/CatChoferes.aspx.vb @@ -14,7 +14,6 @@ Partial Class Acarreos_CatChoferes CargaDatos() CargaDdlTransportista() - Dim DT As DataTable = GlobalDTColonia(-1) CargaDdls() @@ -23,14 +22,10 @@ Partial Class Acarreos_CatChoferes Private Sub CargaDdls() - - - - DdlEstado.DataSource = GlobalDTEstado(-1).FiltraParametros("ClaveSATPais = 'MEX'") + DdlEstado.DataSource = GlobalDTEstado("MEX") DdlEstado.DataBind() DdlEstado.Items.Insert(0, New ListItem("Seleccione uno", "-1")) - DdlMunicipio.Items.Insert(0, New ListItem("Seleccione Uno", "-1")) DdlLocalidad.Items.Insert(0, New ListItem("Seleccione Una", "-1")) DdlColonia.Items.Insert(0, New ListItem("Seleccione Una", "-1")) @@ -153,10 +148,9 @@ Partial Class Acarreos_CatChoferes DdlLocalidad.DataSource = GlobalDTLocalidad(DdlEstado.SelectedValue.ToEntero, DdlMunicipio.SelectedValue.ToEntero) DdlLocalidad.DataBind() - DdlColonia.DataSource = GlobalDTColonia(GlobalDTMunicipio(GlobalDTEstado("MEX").FiltraParametros($"CveEstado = {DdlEstado.SelectedValue.ToEntero}")(0)("ClaveSATEstado").ToString).FiltraParametros($"CveMunicipio = {DdlMunicipio.SelectedValue.ToEntero}")(0)("ClaveSATMunicipio").ToString).FiltraParametros(If(TxtCP.Text.Trim.Length > 0, $"CP = {TxtCP.Text}", "")) + DdlColonia.DataSource = GlobalDTGralColonias("-1", "-1", "-1", DdlMunicipio.SelectedValue.ToEntero, CodigoPostal:=If(TxtCP.Text.Trim.Length > 0, TxtCP.Text.ToEntero, -1)) DdlColonia.DataBind() - End If DdlLocalidad.Items.Insert(0, New ListItem("Seleccione Uno", "-1")) @@ -282,12 +276,9 @@ Partial Class Acarreos_CatChoferes DdlLocalidad.DataSource = GlobalDTLocalidad(DdlEstado.SelectedValue.ToEntero, DdlMunicipio.SelectedValue.ToEntero) DdlLocalidad.DataBind() - DdlColonia.DataSource = GlobalDTColonia(GlobalDTMunicipio(GlobalDTEstado("MEX").FiltraParametros($"CveEstado = {DdlEstado.SelectedValue.ToEntero}")(0)("ClaveSATEstado").ToString).FiltraParametros($"CveMunicipio = {DdlMunicipio.SelectedValue.ToEntero}")(0)("ClaveSATMunicipio").ToString).FiltraParametros(If(TxtCP.Text.Trim.Length > 0, $"CP = {TxtCP.Text}", "")) + DdlColonia.DataSource = GlobalDTGralColonias("-1", "-1", "-1", DdlMunicipio.SelectedValue.ToEntero, CodigoPostal:=If(TxtCP.Text.Trim.Length > 0, TxtCP.Text.ToEntero, -1)) DdlColonia.DataBind() - - - End If DdlLocalidad.Items.Insert(0, New ListItem("Seleccione Uno", "-1")) @@ -320,12 +311,11 @@ Partial Class Acarreos_CatChoferes Dim CveColonia As Integer = DdlColonia.SelectedValue.ToEntero If CPTxt > 0 And CveColonia > 0 Then - Dim CP As Integer = GlobalDTColonia(-1).FiltroPrimeroValor("CP", $"CveColonia = {CveColonia}") + Dim CP As Integer = GlobalDTGralColonias("-1", "-1", "-1", CveColonia:=CveColonia).FiltroPrimeroValor("CP", "").ToEntero If CPTxt <> CP Then - Alert("El codigo postal selecionado es diferente del codigo postal de la Colonia.", TipoMensaje.MsgAdvertencia) + Alert("El código postal selecionado es diferente del codigo postal de la Colonia.", TipoMensaje.MsgAdvertencia) End If End If - End Sub Protected Sub DdlColonia_SelectedIndexChanged(sender As Object, e As EventArgs) diff --git a/App_Code/CFDITimbre.vb b/App_Code/CFDITimbre.vb index fd2700c84..71e8e6a3a 100644 --- a/App_Code/CFDITimbre.vb +++ b/App_Code/CFDITimbre.vb @@ -218,16 +218,16 @@ Public Class CFDIComprobante End Property Public Property TipoDocto As String Public Property FormadePago As String - Public Property CondicionesdePago As String + Public Property CondicionesdePago As String = "" Public Property Fecha As Date - Public Property Subtotal As Decimal = 0 + Public Property SubTotal As Decimal = 0 Public Property Descuentos As Decimal = 0 + Public Property Total As Decimal = 0 Public Property MotivoDescuento As String = "" Public Property TipoCambio As String = "1" Public Property Moneda As String = "" Public Property TipoComprobante As String = "" Public Property MetodoPago As String = "" - Public Property Total As Decimal = 0 Public Property LugarExpedicion As String = "" Public Property NumCuentaPago As String = "" Public Property Confirmacion As String = "" @@ -616,9 +616,8 @@ Public Class CFDICartaPorteUbicacion Public Property NumEstacion As String = "" Public Property NombreEstacion As String = "" Public Property NavegacionTrafico As String = "" - Public Property FechaHoraSalida As String = "" + Public Property FechaHoraSalidaLlegada As String = "" Public Property DistanciaRecorrida As Decimal = 0 - Public Property FechaHoraProgLlegada As String Public Property Domicilio As New CFDICartaPorteDomicilio End Class @@ -652,7 +651,11 @@ End Class Public Class CFDICartaPorteMercancias - Public Property PesoBrutoTotal As Double = 0 + Public ReadOnly Property PesoBrutoTotal As Double + Get + Return Mercancias.Sum(Function(item) item.PesoenKg) + End Get + End Property Public Property UnidadPeso As String = "" Public ReadOnly Property PesoNetoTotal As Double Get @@ -706,6 +709,7 @@ Public Class CFDICartaPorteMercanciaTransporta Public Property Cantidad As Decimal = 0 Public Property IDOrigen As String = "" Public Property IDDestino As String = "" + Public Property CvesTransportes As String = "" End Class @@ -744,10 +748,11 @@ End Class Public Class CFDICartaPorteOperador - Public Property RFCOperador As String = "" + Public Property TipoFigura As String = "01" + Public Property RFCFigura As String = "" Public Property NumLicencia As String = "" - Public Property NombreOperador As String = "" - Public Property NumRegidTribOperador As String = "" - Public Property ResidenciaFiscalOperador As String = "" + Public Property NombreFigura As String = "" + Public Property NumRegidTribFigura As String = "" + Public Property ResidenciaFiscalFigura As String = "" Public Property Domicilio As New CFDICartaPorteDomicilio End Class diff --git a/App_Code/ClsGenerales.vb b/App_Code/ClsGenerales.vb index fea44cef7..1ac11fb10 100644 --- a/App_Code/ClsGenerales.vb +++ b/App_Code/ClsGenerales.vb @@ -2844,11 +2844,13 @@ Public Class ClsGenerales Return Retorno End Function - Public Function GetSATColonia(ClaveSATMunicipio As String) As Boolean + Public Function GetSATColonia(ClaveSATEstado As String, ClaveSATMunicipio As String, ClaveSATColonia As String) As Boolean Dim Retorno As Boolean = False - DataAdapter("Gral_SAT_ColoniaGet") + DataAdapter("PA_Gral_SAT_ColoniaGet") With SqlAdapter.SelectCommand.Parameters + .Add("@ClaveSATEstado", SqlDbType.VarChar).Value = ClaveSATEstado .Add("@ClaveSATMunicipio", SqlDbType.VarChar).Value = ClaveSATMunicipio + .Add("@ClaveSATColonia", SqlDbType.VarChar).Value = ClaveSATColonia End With Try SqlAdapter.Fill(Data) @@ -3613,8 +3615,10 @@ Public Class ClsGenerales #Region "GRAL TIMBRES" - Public Function AddGralTimbre(TipoDocto As String, Serie As String, Folio As Integer, FolioFiscal As String, Fecha As Date, CveUsuario As Integer, CveEmpresa As Integer, - Estatus As Integer, CvePAC As Integer, AplicaCP As Boolean, CveEntregaAlmacen As Integer, CveSubProyectoOrigen As Integer) As Integer + Public Function AddGralTimbre(TipoDocto As String, CveSubProyecto As Integer, Fecha As DateTime, CveUsuario As Integer, CveEmpresa As Integer, + Optional Serie As String = "-1", Optional Folio As Integer = -1, Optional Estatus As Integer = 0, + Optional CveEntregaAlmacen As Integer = -1, + Optional AplicaCP As Boolean = False) As Integer Dim Retorno As Integer = -1 DataAdapter("PA_Gral_TimbreAdd") @@ -3624,15 +3628,13 @@ Public Class ClsGenerales .Add("@TipoDocto", SqlDbType.VarChar).Value = TipoDocto .Add("@Serie", SqlDbType.VarChar).Value = Serie .Add("@Folio", SqlDbType.Int).Value = Folio - .Add("@FolioFiscal", SqlDbType.VarChar).Value = FolioFiscal - .Add("@Fecha", SqlDbType.Date).Value = Fecha + .Add("@Fecha", SqlDbType.DateTime).Value = Fecha .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa .Add("@Estatus", SqlDbType.Int).Value = Estatus - .Add("@CvePAC", SqlDbType.Int).Value = CvePAC .Add("@AplicaCP", SqlDbType.Bit).Value = AplicaCP .Add("@CveEntregaAlmacen", SqlDbType.Int).Value = CveEntregaAlmacen - .Add("@CveSubProyectoOrigen", SqlDbType.Int).Value = CveSubProyectoOrigen + .Add("@CveSubProyectoOrigen", SqlDbType.Int).Value = CveSubProyecto .Add("@CveTimbre", SqlDbType.Int).Direction = ParameterDirection.Output .Add("@FolioInsertado", SqlDbType.Int).Direction = ParameterDirection.Output @@ -3654,15 +3656,13 @@ Public Class ClsGenerales Return Retorno End Function - Public Function GetGralTimbre(CveTimbre As Integer, TipoDocto As String, Serie As String, Folio As Integer, FechaI As Date, FechaF As Date, Estatus As Integer, CveEmpresa As Integer, CveMovimiento As Integer) As Boolean + Public Function GetGralTimbre(CveTimbre As Integer, TipoDocto As String, FechaI As Date, FechaF As Date, Estatus As Integer, CveEmpresa As Integer, CveMovimiento As Integer) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Gral_TimbreGet") With SqlAdapter.SelectCommand.Parameters .Add("@CveTimbre", SqlDbType.Int).Value = CveTimbre .Add("@TipoDocto", SqlDbType.VarChar).Value = TipoDocto - .Add("@Serie", SqlDbType.VarChar).Value = Serie - .Add("@Folio", SqlDbType.Int).Value = Folio .Add("@FechaI", SqlDbType.Date).Value = FechaI .Add("@FechaF", SqlDbType.Date).Value = FechaF .Add("@Estatus", SqlDbType.Int).Value = Estatus @@ -3681,37 +3681,49 @@ Public Class ClsGenerales Return Retorno End Function - Public Function UpdateGralTimbre(CveTimbre As Integer, TipoDocto As String, Serie As String, Folio As Integer, FolioFiscal As String, Fecha As Date, CveUsuario As Integer, CveEmpresa As Integer, - Estatus As Integer, CvePAC As Integer, CvePACCancelacion As Integer, FechaCancelacion As Date, AplicaCP As Boolean, SelloCancelacion As String - ) As Boolean + Public Function UpdateTimbreTimbrado(CveTimbre As Integer, FolioFiscal As String, Fecha As DateTime, CveUsuario As Integer, CveEmpresa As Integer, + CvePAC As Integer) As Boolean Dim Retorno As Boolean = False - DataAdapter("PA_Gral_TimbreUpdate") + DataAdapter("PA_Gral_TimbreTimbrado") With SqlAdapter.SelectCommand.Parameters .Add("@CveTimbre", SqlDbType.Int).Value = CveTimbre - .Add("@TipoDocto", SqlDbType.VarChar).Value = TipoDocto - .Add("@Serie", SqlDbType.VarChar).Value = Serie - .Add("@Folio", SqlDbType.Int).Value = Folio .Add("@FolioFiscal", SqlDbType.VarChar).Value = FolioFiscal - .Add("@Fecha", SqlDbType.Date).Value = Fecha - .Add("@Estatus", SqlDbType.Int).Value = Estatus + .Add("@Fecha", SqlDbType.DateTime).Value = Fecha .Add("@CvePAC", SqlDbType.Int).Value = CvePAC - .Add("@CvePACCancelacion", SqlDbType.Int).Value = CvePACCancelacion - .Add("@FechaCancelacion", SqlDbType.DateTime).Value = FechaCancelacion - .Add("@AplicaCP", SqlDbType.Bit).Value = AplicaCP .Add("@CveUsuario", SqlDbType.Int).Value = CveUsuario .Add("@CveEmpresa", SqlDbType.Int).Value = CveEmpresa - .Add("@SelloCancelacion", SqlDbType.VarChar).Value = SelloCancelacion - - End With Try SqlAdapter.Fill(Data) Retorno = True Catch ex As Exception - OnError("Ocurrió un error al actualizar el timbre", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + OnError("Ocurrió un error al actualizar el timbrado", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) + End Try + Return Retorno + End Function + + Public Function CancelarTimbreTimbrado(CveTimbre As Integer, FechaCancelacion As DateTime, CvePACCancelacion As Integer, SelloCancelacion As String, CveUsuario As Integer, CveEmpresa As Integer) As Boolean + Dim Retorno As Boolean = False + DataAdapter("PA_Gral_TimbreTimbradoCancelar") + + With SqlAdapter.SelectCommand.Parameters + + .Add("@CveTimbre", SqlDbType.Int).Value = CveTimbre + .Add("@FechaCancelacion", SqlDbType.DateTime).Value = FechaCancelacion + .Add("@CvePACCancelacion", SqlDbType.Int).Value = CvePACCancelacion + .Add("@SelloCancelacion", SqlDbType.VarChar).Value = SelloCancelacion + .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 timbrado", ex, SqlAdapter.SelectCommand.Parameters.ParametrosInfo) End Try Return Retorno End Function @@ -3758,13 +3770,13 @@ Public Class ClsGenerales End Function - Public Function AddInvEntregaAlmacenRuta(CveSubProyectoOrigen As Integer, CveMovimientoAlmacen As Integer, CveDireccionOrigen As Integer, CveDireccionDestino As Integer, CveChofer As Integer, CveCamion As Integer, FechaEntrega As Date, Tipo As String, Orden As Integer, Estatus As Integer) As Integer + Public Function AddInvEntregaAlmacenRuta(CveSubProyecto As Integer, CveDireccionOrigen As Integer, CveDireccionDestino As Integer, CveMovimientoAlmacen As Integer, CveChofer As Integer, CveCamion As Integer, FechaEntrega As Date, Tipo As String, Orden As Integer, Estatus As Integer) As Integer Dim Retorno As Integer = -1 DataAdapter("PA_Inv_EntregaAlmacenRutaAdd") With SqlAdapter.SelectCommand.Parameters - .Add("@CveSubProyectoOrigen", SqlDbType.Int).Value = CveSubProyectoOrigen + .Add("@CveSubProyecto", SqlDbType.Int).Value = CveSubProyecto .Add("@CveMovimientoAlmacen", SqlDbType.Int).Value = CveMovimientoAlmacen .Add("@CveDireccionOrigen", SqlDbType.Int).Value = CveDireccionOrigen .Add("@CveDireccionDestino", SqlDbType.Int).Value = CveDireccionDestino diff --git a/App_Code/ClsNominas.vb b/App_Code/ClsNominas.vb index 54d9be053..89dff6d21 100644 --- a/App_Code/ClsNominas.vb +++ b/App_Code/ClsNominas.vb @@ -1032,7 +1032,7 @@ Public Class ClsNominas Return Retorno End Function - Public Function UpdateEstatusNomNominas(Estatus As Integer, CvePAC As Integer, FolioFiscal As String, SelloSAT As String, FechaCancelacion As DateTime, CveNomina As Integer, Optional SubTotal As Double = -1, Optional Descuento As Double = -1, Optional ISR As Double = -1, Optional Total As Double = -1, Optional DiasPagados As Double = -1, Optional isFiniquito As Boolean = False) As Boolean + Public Function UpdateEstatusNomNominas(Estatus As Integer, CvePAC As Integer, FolioFiscal As String, FechaTimbrado As DateTime, FechaCancelacion As DateTime, CveNomina As Integer, Optional SubTotal As Double = -1, Optional Descuento As Double = -1, Optional ISR As Double = -1, Optional Total As Double = -1, Optional DiasPagados As Double = -1, Optional isFiniquito As Boolean = False) As Boolean Dim Retorno As Boolean = False DataAdapter("PA_Nom_NominasUpdateEstatus") @@ -1042,7 +1042,7 @@ Public Class ClsNominas .Add("@CveEstatusCFDi", SqlDbType.Int).Value = Estatus .Add("@CvePAC", SqlDbType.Int).Value = CvePAC .Add("@FolioFiscal", SqlDbType.VarChar).Value = FolioFiscal - .Add("@SelloDigitalSAT", SqlDbType.VarChar).Value = SelloSAT + .Add("@FechaTimbrado", SqlDbType.DateTime).Value = FechaTimbrado .Add("@FechaCancelacion", SqlDbType.DateTime).Value = FechaCancelacion .Add("@SubTotal", SqlDbType.Money).Value = SubTotal .Add("@Descuento", SqlDbType.Money).Value = Descuento diff --git a/App_Code/ClsPaginas.vb b/App_Code/ClsPaginas.vb index b8a1e8186..a66b688da 100644 --- a/App_Code/ClsPaginas.vb +++ b/App_Code/ClsPaginas.vb @@ -372,56 +372,68 @@ Public Class ClsPaginas End Set End Property - Property GlobalDTPais() As DataTable + + Property GlobalDTGralPaises() As DataTable Get - GlobalDTPais = DirectCast(Application("GlobalDTPais"), DataTable) + If Application("GlobalDTGralPaises") Is Nothing Then + Dim ObjGrales As New ClsGenerales + If ObjGrales.GetSATPais() Then Application("GlobalDTGralPaises") = ObjGrales.DtResultados Else Application("GlobalDTGralPaises") = Nothing + ObjGrales.Dispose() + End If + GlobalDTGralPaises = DirectCast(Application("GlobalDTGralPaises"), DataTable) End Get Set(value As DataTable) - Application("GlobalDTPais") = value + Application("GlobalDTGralPaises") = value End Set End Property - - Property GlobalDTEstado(ClaveSATPais As String) As DataTable + Property GlobalDTEstado(ClaveSATPais As String, Optional CvePais As Integer = -1) As DataTable Get - If Application("GlobalDTEstado") Is Nothing Then + Dim AppNombre As String = "GlobalDTEstado" + If Application(AppNombre) Is Nothing Then Dim ObjGrales As New ClsGenerales - If ObjGrales.GetSATEstado("-1") Then Application("GlobalDTEstado") = ObjGrales.DtResultados Else Application("GlobalDTEstado") = Nothing + If ObjGrales.GetSATEstado("-1") Then Application(AppNombre) = ObjGrales.DtResultados Else Application(AppNombre) = Nothing ObjGrales.Dispose() End If - If ClaveSATPais <> "-1" Then - Dim Dv As New DataView(DirectCast(Application("GlobalDTEstado"), DataTable), String.Format("ClaveSATPais = '{0}'", ClaveSATPais), "", DataViewRowState.CurrentRows) - GlobalDTEstado = Dv.ToTable - Dv.Dispose() - Else - GlobalDTEstado = DirectCast(Application("GlobalDTEstado"), DataTable) - End If + Dim Filtro As New StringBuilder + Filtro.Append(" 1 = 1 ") + If ClaveSATPais <> "-1" Then Filtro.AppendFormat(" AND ClaveSATPais = '{0}' ", ClaveSATPais) + If CvePais > 0 Then Filtro.AppendFormat(" AND CvePais = {0} ", CvePais) + + Dim Dv As New DataView(DirectCast(Application(AppNombre), DataTable), Filtro.ToString, "", DataViewRowState.CurrentRows) + GlobalDTEstado = Dv.ToTable + Dv.Dispose() End Get Set(value As DataTable) - Application("GlobalDTEstado") = value + Dim AppNombre As String = "GlobalDTEstado" + Application(AppNombre) = value End Set End Property - Property GlobalDTMunicipio(ClaveSATEstado As String) As DataTable + Property GlobalDTMunicipio(ClaveSATEstado As String, Optional CveEstado As Integer = -1) As DataTable Get - If Application("GlobalDTMunicipio") Is Nothing Then + + Dim AppNombre As String = "GlobalDTMunicipio" + If Application(AppNombre) Is Nothing Then Dim ObjGrales As New ClsGenerales - If ObjGrales.GetSATMunicipio("-1") Then Application("GlobalDTMunicipio") = ObjGrales.DtResultados Else Application("GlobalDTMunicipio") = Nothing + If ObjGrales.GetSATMunicipio("-1") Then Application(AppNombre) = ObjGrales.DtResultados Else Application(AppNombre) = Nothing ObjGrales.Dispose() End If - If ClaveSATEstado <> "-1" Then - Dim Dv As New DataView(DirectCast(Application("GlobalDTMunicipio"), DataTable), String.Format("ClaveSATEstado = '{0}'", ClaveSATEstado), "", DataViewRowState.CurrentRows) - GlobalDTMunicipio = Dv.ToTable - Dv.Dispose() - Else - GlobalDTMunicipio = DirectCast(Application("GlobalDTMunicipio"), DataTable) - End If + Dim Filtro As New StringBuilder + Filtro.Append(" 1 = 1 ") + If ClaveSATEstado <> "-1" Then Filtro.AppendFormat(" AND ClaveSATEstado = '{0}' ", ClaveSATEstado) + If CveEstado > 0 Then Filtro.AppendFormat(" AND CveEstado = {0} ", CveEstado) + + Dim Dv As New DataView(DirectCast(Application(AppNombre), DataTable), Filtro.ToString, "", DataViewRowState.CurrentRows) + GlobalDTMunicipio = Dv.ToTable + Dv.Dispose() End Get Set(value As DataTable) - Application("GlobalDTMunicipio") = value + Dim AppNombre As String = "GlobalDTMunicipio" + Application(AppNombre) = value End Set End Property @@ -466,26 +478,34 @@ Public Class ClsPaginas End Property - - Property GlobalDTColonia(ClaveSATMunicipio As String) As DataTable + Property GlobalDTGralColonias(ClaveSATEstado As String, ClaveSATMunicipio As String, ClaveSATColonia As String, + Optional CveMunicipio As Integer = -1, Optional CodigoPostal As Integer = -1, Optional CveColonia As Integer = -1) As DataTable Get - If Application("GlobalDTColonia") Is Nothing Then + Dim AppNombre As String = "GlobalDTGralColonias" + If Application(AppNombre) Is Nothing Then Dim ObjGrales As New ClsGenerales - If ObjGrales.GetSATColonia("-1") Then Application("GlobalDTColonia") = ObjGrales.DtResultados Else Application("GlobalDTColonia") = Nothing + If ObjGrales.GetSATColonia("-1", "-1", "-1") Then Application(AppNombre) = ObjGrales.DtResultados Else Application(AppNombre) = Nothing ObjGrales.Dispose() End If - If ClaveSATMunicipio <> "-1" Then - Dim Dv As New DataView(DirectCast(Application("GlobalDTColonia"), DataTable), String.Format("ClaveSATMunicipio = '{0}'", ClaveSATMunicipio), "", DataViewRowState.CurrentRows) - GlobalDTColonia = Dv.ToTable - Dv.Dispose() - Else - GlobalDTColonia = DirectCast(Application("GlobalDTColonia"), DataTable) - End If + Dim Filtro As New StringBuilder + Filtro.Append(" 1 = 1 ") + If ClaveSATEstado <> "-1" Then Filtro.AppendFormat(" AND ClaveSATEstado = '{0}' ", ClaveSATEstado) + If ClaveSATMunicipio <> "-1" Then Filtro.AppendFormat(" AND ClaveSATMunicipio = '{0}' ", ClaveSATMunicipio) + If ClaveSATColonia <> "-1" Then Filtro.AppendFormat(" AND ClaveSATColonia = '{0}' ", ClaveSATColonia) + If CveMunicipio > 0 Then Filtro.AppendFormat(" AND CveMunicipio = {0} ", CveMunicipio) + If CodigoPostal > 0 Then Filtro.AppendFormat(" AND CP = {0} ", CodigoPostal) + If CveColonia > 0 Then Filtro.AppendFormat(" AND CveColonia = {0} ", CveColonia) + + Dim Dv As New DataView(DirectCast(Application(AppNombre), DataTable), Filtro.ToString, "", DataViewRowState.CurrentRows) + GlobalDTGralColonias = Dv.ToTable + Dv.Dispose() + End Get Set(value As DataTable) - Application("GlobalDTColonia") = value + Dim AppNombre As String = "GlobalDTGralColonias" + Application(AppNombre) = value End Set End Property @@ -2420,39 +2440,6 @@ Public Class ClsPaginas #End Region #Region "***********************************************************************DT GENERALES**************************************************************************************" - Property GlobalDTGralPaises() As DataTable - Get - GlobalDTGralPaises = DirectCast(Application("GlobalDTGralPaises"), DataTable) - End Get - Set(value As DataTable) - Application("GlobalDTGralPaises") = value - End Set - End Property - Property GlobalDTGralEstados(CvePais As Integer) As DataTable - Get - GlobalDTGralEstados = DirectCast(Application("GlobalDTGralEstados"), DataTable).FiltraParametros(String.Format("CvePais ={0}", CvePais)) - End Get - Set(value As DataTable) - Application("GlobalDTGralEstados") = value - End Set - End Property - Property GlobalDTGralMunicipios(CveEstado As Integer) As DataTable - Get - GlobalDTGralMunicipios = DirectCast(Application("GlobalDTGralMunicipios"), DataTable).FiltraParametros(String.Format("CveEstado ={0}", CveEstado)) - End Get - Set(value As DataTable) - Application("GlobalDTGralMunicipios") = value - End Set - End Property - - Property GlobalDTGralPoblaciones() As DataTable - Get - GlobalDTGralPoblaciones = DirectCast(Application("GlobalDTGralPoblaciones"), DataTable) - End Get - Set(value As DataTable) - Application("GlobalDTGralPoblaciones") = value - End Set - End Property Property GlobalDTGralCategorias(CveEmpresa As Integer) As DataTable Get @@ -6751,7 +6738,7 @@ Public Class ClsPaginas GuardaLog(String.Format("Ocurrio un error al generar el reporte RLDC {0}", ex)) End Try End Sub - Protected Function PdfFactura(ByRef Vta As Modelos.Factura, Optional AplicaPagare As String = "0", Optional Guardar As Boolean = True) As Byte() + Public Function PdfFactura(ByRef Vta As Modelos.Factura, Optional AplicaPagare As String = "0", Optional Guardar As Boolean = True) As Byte() Dim retorno As Byte() = Nothing ' Dim ObjVentas As New ClsVentas @@ -6823,12 +6810,9 @@ Public Class ClsPaginas End Try If EsXMLValido Then - Dim TC As Decimal = 1 - Try - TC = XmlDoc.DocumentElement.Attributes("TipoCambio").InnerText.ToDecimal - Catch ex As Exception - TC = 1 - End Try + Dim TC As Decimal = ValorNodoXML(XmlDoc.DocumentElement, "TC").ToDecimal + If TC <= 0 Then TC = 1 + If ValorNodoXML(XmlDoc.DocumentElement, "version") = "3.3" Then Vta.FechaEmision = ValorNodoXML(XmlDoc.DocumentElement, "fecha").ToDate Vta.NoSerieCertificadoContribuyente = ValorNodoXML(XmlDoc.DocumentElement, "NoCertificado") @@ -7424,8 +7408,8 @@ Public Class ClsPaginas RutaFormato = String.Format("{0}Formatos\{1}.rdlc", UsuarioActual.Empresa.Ruta, NombreArchivo) RutaFormatoDefault = String.Format("Empresas\Grales\Formatos\{0}.rdlc", NombreArchivo) - Case "RNC" + Case "RNC" NombreArchivo = "RemisionNC" NombreArchivoDescarga = "RemisionNC" diff --git a/App_Code/Modelos.vb b/App_Code/Modelos.vb index a23c7af68..7f68a1c1b 100644 --- a/App_Code/Modelos.vb +++ b/App_Code/Modelos.vb @@ -6175,6 +6175,7 @@ Namespace Modelos Public Property DtMovimientosUsados As DataTable Public Property CveAlmacenDevolucion As Integer Public Property CveVenta As Integer + Public Property CveTimbre As Integer Public Property CveEmpresa As Integer Public Property CveSucursal As Integer 'sucursal de la empresa que factura Public Property CveSubProyecto As Integer @@ -6244,7 +6245,7 @@ Namespace Modelos End Property Public Property Inv_CveMovimiento As Integer - Public Property Inv_CveEstatusEntrega As Integer + Public Property Inv_CveEstatusEntrega As Integer = 0 Public Property Inv_EstatusEntrega As String Public Property Inv_ValorInventario As Decimal Public Property Fecha As DateTime @@ -6266,7 +6267,8 @@ Namespace Modelos Public Property EstatusFactura As String Public Property SeTimbro As String Public Property TipoDocto As String - Public Property RefDocto As String + Public Property TipoComprobante As String + Public Property RefDocto As String = "" Public Property RealizarDevolucionAlmacen As Boolean Public Property CveAlmacenDevolucionVenta As Integer @@ -6402,24 +6404,24 @@ Namespace Modelos End Get End Property - Public Property MotivoDescuento As String + Public Property MotivoDescuento As String = "" #Region "Totales" - Public Property SubTotal As Decimal - Public Property Descuento As Decimal - Public Property Amortizacion As Decimal + Public Property SubTotal As Decimal = 0 + Public Property Descuento As Decimal = 0 + Public Property Amortizacion As Decimal = 0 'IVA - Public Property RetIVA As Decimal - Public Property RetISR As Decimal - Public Property IVA As Decimal - Public Property IEPS As Decimal + Public Property RetIVA As Decimal = 0 + Public Property RetISR As Decimal = 0 + Public Property IVA As Decimal = 0 + Public Property IEPS As Decimal = 0 - Public Property Total As Decimal - Public Property Otros As Decimal + Public Property Total As Decimal = 0 + Public Property Otros As Decimal = 0 - Public Property TotalRemNCAplicado As Decimal + Public Property TotalRemNCAplicado As Decimal = 0 #Region "Totales por Tipo de cambio" @@ -6507,32 +6509,31 @@ Namespace Modelos End Property #End Region #End Region - Public Property AtencionA As String - Public Property AtnA As String - Public Property TelefonoGenerico As String - Public Property Det_OrdenCompra As String - Public Property Det_FechaOrdenCompra As String - Public Property Det_ContraRecibo As String - Public Property Observaciones As String + Public Property AtencionA As String = "" + Public Property TelefonoGenerico As String = "" + Public Property Det_OrdenCompra As String = "" + Public Property Det_FechaOrdenCompra As String = "" + Public Property Det_ContraRecibo As String = "" + Public Property Observaciones As String = "" - Public Property Alfa1 As String - Public Property Alfa2 As String - Public Property Alfa3 As String + Public Property Alfa1 As String = "" + Public Property Alfa2 As String = "" + Public Property Alfa3 As String = "" Public Property Fech1 As Date Public Property Fech2 As Date Public Property Fech3 As Date - Public Property Num1 As Double - Public Property Num2 As Double - Public Property Num3 As Double + Public Property Num1 As Double = 0 + Public Property Num2 As Double = 0 + Public Property Num3 As Double = 0 Public Property DiasCredito As Integer Public Property EsDiasCreditoFijo As Boolean - Public Property CveCorte As Integer - Public Property CveMesa As Integer - Public Property NumeroPersonas As Integer + Public Property CveCorte As Integer = -1 + Public Property CveMesa As Integer = -1 + Public Property NumeroPersonas As Integer = 0 Public Property FechaPago As Date @@ -6540,15 +6541,15 @@ Namespace Modelos Public Property CveNCaVincular As Integer Public Property FolioFiscal As String Public Property NoSerieCertificado As String - Public Property SelloCFDi As String - Public Property SelloSAT As String + Public Property SelloCFDi As String = "" + Public Property SelloSAT As String = "" Public Property FechaEmision As Date Public Property FechaCertificacion As Date Public Property NoSerieCertificadoContribuyente As String - Public Property NumeroCuenta As String + Public Property NumeroCuenta As String = "" Public Property CveTipoAmortizacionAnticipo As Integer = -1 - Public Property DescripcionContrato As String - Public Property NumeroDescripcionContrato As String + Public Property DescripcionContrato As String = "" + Public Property NumeroDescripcionContrato As String = "" Public Property CveComplementoTimbrado As Integer = 0 Public Property ComplementoINE As Modelos.ComplementoINE Public Property FordGSDB As String = "" @@ -6646,28 +6647,28 @@ Namespace Modelos End If End Sub - Public Property CveClienteSucursal As Integer + Public Property CveClienteSucursal As Integer = 0 Public Property ClienteSucursal As Modelos.SucursalModel Public Property EnviarA As Modelos.EnviarAModel - Public Property NumeroContrato As String - Public Property PedidoContrato As String - Public Property OrdenCompra As String = "-1" + Public Property NumeroContrato As String = "" + Public Property PedidoContrato As String = "" + Public Property OrdenCompra As String = "" Public Property CveMetodoPago As Integer - Public Property MetodoPago As String - Public Property ClaveMetodoPagoSAT As String + Public Property MetodoPago As String = "" + Public Property ClaveMetodoPagoSAT As String = "" Public Property CveMetodoPago33 As Integer - Public Property MetodoPago33 As String + Public Property MetodoPago33 As String = "" Public Property CveFormaPago33 As Integer - Public Property MetodoPagoSAT33 As String - Public Property FormaPago33 As String - Public Property FormaPagoSAT33 As String + Public Property MetodoPagoSAT33 As String = "" + Public Property FormaPago33 As String = "" + Public Property FormaPagoSAT33 As String = "" Public Property UsoCFDI As String = "" Public Property CveUsoCFDI As Integer Public Property ClaveUsoCFDI As String = "" Public Property CveTipoRelacion As Integer = -1 Public Property CveEstatusFactura As Integer Public Property CveVendedor As Integer - Public Property VendedorCodigo As String + Public Property VendedorCodigo As String = "" Public Property CveSucursalEjecucion As Integer Public Property FechaEjecucion As Date Public Property CveSucursalCobranza As Integer @@ -6675,15 +6676,15 @@ Namespace Modelos Public Property CveSubProyectoCobranza As Integer Public Property CveSubProyectoEjecucion As Integer Public Property CveOS As Integer - Public Property CveContrato As Integer - Public Property CveVentaPadre As Integer - Public Property CvePrePoliza As Integer - Public Property Entrega As String - Public Property TiempoEntrega As String + Public Property CveContrato As Integer = -1 + Public Property CveVentaPadre As Integer = -1 + Public Property CvePrePoliza As Integer = -1 + Public Property Entrega As String = "" + Public Property TiempoEntrega As String = "" Public Property Vigencia As Date Public Property TipoEstatus As Integer Public Property CveCondicionEntrega As Integer - Public Property CondicionEntrega As String + Public Property CondicionEntrega As String = "" Public Property TipoRelacion As String Public Property UUIDRelacionados As List(Of String) @@ -9667,21 +9668,21 @@ Namespace Modelos End Sub Public Property AplicaFEMSA As Boolean = False 'AplicaFEMSA - Public Property FEMSA_NumSociedad As String 'TxtFEMSA_NumSociedad.Text.Trim, - Public Property FEMSA_NumProveedor As String 'TxtFEMSA_NumProveedor.Text.Trim, - Public Property FEMSA_Mail As String 'TxtFEMSA_Mail.Text.Trim + Public Property FEMSA_NumSociedad As String = "" 'TxtFEMSA_NumSociedad.Text.Trim, + Public Property FEMSA_NumProveedor As String = "" 'TxtFEMSA_NumProveedor.Text.Trim, + Public Property FEMSA_Mail As String = "" 'TxtFEMSA_Mail.Text.Trim - Public Property FEMSA_Version As Integer 'TxtFEMSA_Version.Text.ToEntero, ClaseDocto, + Public Property FEMSA_Version As Integer 'TxtFEMSA_Version.Text.ToEntero, ClaseDocto, Public Property FEMSA_NumPedido As Long 'TxtFEMSA_NumPedido.Text.Trim.ToLong, - Public Property FEMSA_NumEntrada As String 'TxtFEMSA_NumEntrada.Text.Trim, - Public Property FEMSA_NumRemision As String 'TxtFEMSA_NumRemision.Text.Trim, - Public Property FEMSA_NumSocio As String 'TxtFEMSA_NumSocio.Text.Trim, - Public Property FEMSA_CentroCosto As String 'TxtFEMSA_CentroCosto.Text.Trim, - Public Property FEMSA_IPeriodoLiquidacion As String 'TxtFEMSA_IPeriodoLiquidacion.Text.Trim, - Public Property FEMSA_FPeriodoLiquidacion As String 'TxtFEMSA_FPeriodoLiquidacion.Text.Trim, - Public Property FEMSA_CodRetencion1 As String 'TxtFEMSA_CodRetencion1.Text.Trim, - Public Property FEMSA_CodRetencion2 As String 'TxtFEMSA_CodRetencion2.Text.Trim, + Public Property FEMSA_NumEntrada As String = "" 'TxtFEMSA_NumEntrada.Text.Trim, + Public Property FEMSA_NumRemision As String = "" 'TxtFEMSA_NumRemision.Text.Trim, + Public Property FEMSA_NumSocio As String = "" 'TxtFEMSA_NumSocio.Text.Trim, + Public Property FEMSA_CentroCosto As String = "" 'TxtFEMSA_CentroCosto.Text.Trim, + Public Property FEMSA_IPeriodoLiquidacion As String = "" 'TxtFEMSA_IPeriodoLiquidacion.Text.Trim, + Public Property FEMSA_FPeriodoLiquidacion As String = "" 'TxtFEMSA_FPeriodoLiquidacion.Text.Trim, + Public Property FEMSA_CodRetencion1 As String = "" 'TxtFEMSA_CodRetencion1.Text.Trim, + Public Property FEMSA_CodRetencion2 As String = "" 'TxtFEMSA_CodRetencion2.Text.Trim, End Class diff --git a/App_Code/Timbrado.vb b/App_Code/Timbrado.vb index d354d4be3..19d241d77 100644 --- a/App_Code/Timbrado.vb +++ b/App_Code/Timbrado.vb @@ -1754,7 +1754,7 @@ Public Class Timbrado If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then Using ObjNomina2 As New ClsNominas() - If ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then + If ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, ObjCFDITimbre.Comprobante.Fecha, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then Retorno = "" Else Retorno = "Error" @@ -2137,16 +2137,16 @@ Public Class Timbrado Dim Carta As CFDICartaPorte = ObjCFDITimbre.Complementos.CartaPorte ''DATOS GENERALES - cfdi.CartaPorte(Carta.TranspInternac, Carta.EntradaSalidaMercancia, "MEX", Carta.ViaEntradaSalida, Carta.TotalDistanciaRecorrida) + cfdi.CartaPorte(Carta.TranspInternac, Carta.EntradaSalidaMercancia, "", Carta.ViaEntradaSalida, Carta.TotalDistanciaRecorrida) 'UBICACIONES If Carta.Ubicaciones IsNot Nothing AndAlso Carta.Ubicaciones.Count > 0 Then For Each ubica As CFDICartaPorteUbicacion In Carta.Ubicaciones 'origen - cfdi.CartaPorteUbicacion(ubica.TipoUbicacion, ubica.IDUbicacion, ubica.IDUbicacion, ubica.NombreRemitenteDestinatario, ubica.NumRegIdTrib, ubica.ResidenciaFiscal, ubica.NumEstacion, ubica.NombreEstacion, ubica.NavegacionTrafico, ubica.FechaHoraSalida, ubica.TipoEstacion, ubica.DistanciaRecorrida) + cfdi.CartaPorteUbicacion(ubica.TipoUbicacion, ubica.IDUbicacion, ubica.RFCRemitenteDestinatario, ubica.NombreRemitenteDestinatario, ubica.NumRegIdTrib, ubica.ResidenciaFiscal, ubica.NumEstacion, ubica.NombreEstacion, ubica.NavegacionTrafico, ubica.FechaHoraSalidaLlegada, ubica.TipoEstacion, ubica.DistanciaRecorrida) 'cfdi.CartaPorteOrigen(ubica.Origen.IDOrigen, ubica.Origen.RFCRemitente, ubica.Origen.NombreRemitente, ubica.NumRegIdTrib, ubica.Origen.ResidenciaFiscal, ubica.Origen.NumEstacion, ubica.Origen.NombreEstacion, ubica.Origen.NavegacionTrafico, ubica.Origen.FechaHoraSalida) cfdi.CartaPorteDomicilio(ubica.Domicilio.Calle, ubica.Domicilio.NumeroExterior, ubica.Domicilio.NumeroInterior, ubica.Domicilio.Colonia, ubica.Domicilio.Localidad, ubica.Domicilio.Referencia, ubica.Domicilio.Municipio, ubica.Domicilio.Estado, ubica.Domicilio.Pais, ubica.Domicilio.CP) - '''destino + ''''destino 'cfdi.CartaPorteUbicacion(ubica.TipoEstacion, ubica.DistanciaRecorridaDestino) 'cfdi.CartaPorteDestino(ubica.Destino.IDDestino, ubica.Destino.RFCDestinatario, ubica.Destino.NombreDestinatario, ubica.Destino.NumRegIdTrib, ubica.Destino.ResidenciaFiscal, ubica.Destino.NumEstacion, ubica.Destino.NombreEstacion, ubica.Destino.NavegacionTrafico, ubica.Destino.FechaHoraProgLlegada) ' cfdi.CartaPorteDomicilio(ubica.Destino.Domicilio.Calle, ubica.Destino.Domicilio.NumeroExterior, ubica.Destino.Domicilio.NumeroInterior, ubica.Destino.Domicilio.Colonia, ubica.Destino.Domicilio.Localidad, ubica.Destino.Domicilio.Referencia, ubica.Destino.Domicilio.Municipio, ubica.Destino.Domicilio.Estado, ubica.Destino.Domicilio.Pais, ubica.Destino.Domicilio.CP) @@ -2154,16 +2154,18 @@ Public Class Timbrado End If - 'MERCANCIAS - If Carta.Mercancias IsNot Nothing Then - cfdi.CartaPorteMercancias(Carta.Mercancias.PesoBrutoTotal, Carta.Mercancias.UnidadPeso, Carta.Mercancias.PesoNetoTotal, Carta.Mercancias.NumTotalMercancias, Carta.Mercancias.CargoporTasacion) - If Carta.Mercancias IsNot Nothing AndAlso Carta.Mercancias.Mercancias.Count > 0 Then - For Each concep As CFDICartaPorteMercancia In Carta.Mercancias.Mercancias + 'MERCANCIAS + If Carta.Mercancias IsNot Nothing Then + cfdi.CartaPorteMercancias(Carta.Mercancias.PesoBrutoTotal, Carta.Mercancias.UnidadPeso, Carta.Mercancias.PesoNetoTotal, Carta.Mercancias.NumTotalMercancias, Carta.Mercancias.CargoporTasacion) + If Carta.Mercancias IsNot Nothing AndAlso Carta.Mercancias.Mercancias.Count > 0 Then + For Each concep As CFDICartaPorteMercancia In Carta.Mercancias.Mercancias cfdi.CartaPorteMercancia(concep.BienesTransp, concep.ClaveSTCC, concep.Descripción, concep.Cantidad, concep.ClaveUnidad, concep.Unidad, concep.Dimensiones, concep.MaterialPeligroso, concep.ClaveMaterialPeligroso, If(concep.ClaveMaterialPeligroso <> "", concep.Embalaje, ""), concep.DescripEmbalaje, concep.PesoenKg, concep.ValorMercancia, concep.Moneda, concep.FraccionArrancelaria, concep.UUIDComercioExt) + For Each transp In concep.MercanciasCantidadTransporta + cfdi.CartaPorteCantidadTransporta(transp.Cantidad, transp.IDOrigen, transp.IDDestino, transp.CvesTransportes) + Next Next - End If End If - + End If ' If Carta.FiguraTransporte IsNot Nothing Then @@ -2186,13 +2188,15 @@ Public Class Timbrado End If End If - - 'If Carta.FiguraTransporte.Operadores IsNot Nothing AndAlso Carta.FiguraTransporte.Operadores.Count > 0 Then - ' For Each concep As CFDICartaPorteOperador In Carta.FiguraTransporte.Operadores - ' cfdi.CartaPorteOperador(concep.RFCOperador, concep.NumLicencia, concep.NombreOperador, concep.NumRegidTribOperador, concep.ResidenciaFiscalOperador) - ' cfdi.CartaPorteOperadorDomicilio(concep.Domicilio.Calle, concep.Domicilio.NumeroExterior, concep.Domicilio.NumeroInterior, concep.Domicilio.Colonia, concep.Domicilio.Localidad, concep.Domicilio.Referencia, concep.Domicilio.Municipio, concep.Domicilio.Estado, concep.Domicilio.Pais, concep.Domicilio.CP) - ' Next - ' End If + If Carta.FiguraTransporte.Operadores IsNot Nothing AndAlso Carta.FiguraTransporte.Operadores.Count > 0 Then + For Each concep As CFDICartaPorteOperador In Carta.FiguraTransporte.Operadores + cfdi.CartaPorteTiposFigura(concep.TipoFigura, concep.RFCFigura, concep.NumLicencia, concep.NombreFigura, concep.NumRegidTribFigura, If(concep.ResidenciaFiscalFigura <> "MEX", concep.ResidenciaFiscalFigura, "")) + If concep.TipoFigura.Contiene("02", "03") Then ' “02”- Propietario o “03” -Arrendador + cfdi.CartaPortePartesTransporte("PT01") + cfdi.CartaPortePartesTransporteDomicilio(concep.Domicilio.Calle, concep.Domicilio.NumeroExterior, concep.Domicilio.NumeroInterior, concep.Domicilio.Colonia, concep.Domicilio.Localidad, concep.Domicilio.Referencia, concep.Domicilio.Municipio, concep.Domicilio.Estado, concep.Domicilio.Pais, concep.Domicilio.CP) + End If + Next + End If End If @@ -2414,45 +2418,28 @@ Public Class Timbrado swmili = sw.ElapsedMilliseconds sw.Start() - If ObjCFDITimbre.Comprobante.TipoComprobante <> "P" Then + Select Case ObjCFDITimbre.Comprobante.TipoComprobante + Case "N" - 'Actualiza Estatus Factura - If Ventas.CveVenta > 0 Then - - Using ObjVentas As New ClsVentas() - - If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=CvePACEspecial, RFCReceptor:=ObjCFDITimbre.Receptor.RFC) Then - Retorno = "" - Else - Retorno = "Error" - End If - End Using - - 'Genero la addenda Ford - If Ventas.Cliente.Ford_GSDB <> "" Then - - Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio)) - - Dim FolioFactura As String = "" - If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura - GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB) - - End If - - End If - - If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then Using ObjNomina2 As New ClsNominas() - If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0, isFiniquito:=Ventas.Timbre.IStimbreFiniquito) Then + If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0, isFiniquito:=Ventas.Timbre.IStimbreFiniquito) Then Retorno = "" Else Retorno = "Error" End If End Using - End If - If ObjCFDITimbre.Comprobante.TipoComprobante = "T" Then + Case "T" + + Dim objGrales As New ClsGenerales + If objGrales.UpdateTimbreTimbrado(Ventas.CveTimbre, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, UsuarioActual.Empresa.CvePAC) Then + Retorno = "" + Else + Retorno = "Error" + End If + objGrales.Dispose() + Using ObjInv As New ClsInventarios() If ObjInv.UpdateMovimientoTimbrado(Ventas.Inv_CveMovimiento, 1, FolioFiscal, MinFecha) Then Retorno = "" @@ -2460,8 +2447,36 @@ Public Class Timbrado Retorno = "Error" End If End Using - End If - End If + + + Case Else + + 'Actualiza Estatus Factura + If Ventas.CveVenta > 0 Then + + Using ObjVentas As New ClsVentas() + + If ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", ObjCFDITimbre.Comprobante.Fecha, Ventas.CveVenta, CvePAC:=CvePACEspecial, RFCReceptor:=ObjCFDITimbre.Receptor.RFC) Then + Retorno = "" + Else + Retorno = "Error" + End If + End Using + + 'Genero la addenda Ford + If Ventas.Cliente.Ford_GSDB <> "" Then + + Dim RutaCadena As String = String.Format("{0}{1}.xml", RutaArchivo, NombreArchivoXML) 'If(UsuarioActual.Empresa.FacturaProduccion, String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.SerieFolio), String.Format("{0}XML\{1}\{2}.xml", Ruta, Ventas.TipoDocto, Ventas.SerieFolio)) + + Dim FolioFactura As String = "" + If UsuarioActual.CveEmpresa = 8 Then FolioFactura = Ventas.Folio.ToString ' sogo, pordefault manda el folio de la factura + GeneraAddendaFord(RutaCadena, FolioFactura, Ventas.FordASN, Ventas.FordGSDB) + + End If + + End If + End Select + If Not IO.Directory.Exists($"{UsuarioActual.Empresa.Ruta}CBB\") Then IO.Directory.CreateDirectory($"{UsuarioActual.Empresa.Ruta}CBB\") @@ -3047,7 +3062,7 @@ Public Class Timbrado If ObjCFDITimbre.Comprobante.TipoComprobante = "N" Then Using ObjNomina2 As New ClsNominas() - If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then + If ObjNomina2.UpdateEstatusNomNominas(3, CvePACEspecial, FolioFiscal, ObjCFDITimbre.Comprobante.Fecha, ObjCFDITimbre.Comprobante.Fecha, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) Then Retorno = "" Else Retorno = "Error" @@ -3936,10 +3951,10 @@ Public Class Timbrado ComCartaPorte.FiguraTransporte.Operadores = New ProfactCartaPorte.CartaPorteFiguraTransporteOperadoresOperador(Carta.FiguraTransporte.Operadores.Count - 1) {} For Each concep As CFDICartaPorteOperador In Carta.FiguraTransporte.Operadores ComCartaPorte.FiguraTransporte.Operadores(i) = New ProfactCartaPorte.CartaPorteFiguraTransporteOperadoresOperador - ComCartaPorte.FiguraTransporte.Operadores(i).RFCOperador = concep.RFCOperador + ComCartaPorte.FiguraTransporte.Operadores(i).RFCOperador = concep.RFCFigura ComCartaPorte.FiguraTransporte.Operadores(i).NumLicencia = concep.NumLicencia - ComCartaPorte.FiguraTransporte.Operadores(i).NombreOperador = concep.NombreOperador - ComCartaPorte.FiguraTransporte.Operadores(i).NumRegIdTribOperador = concep.NumRegidTribOperador + ComCartaPorte.FiguraTransporte.Operadores(i).NombreOperador = concep.NombreFigura + ComCartaPorte.FiguraTransporte.Operadores(i).NumRegIdTribOperador = concep.NumRegidTribFigura 'OComCartaPorte.FiguraTransporte.Operadores(i)(0) = concep.ResidenciaFiscalOperador 'falta ComCartaPorte.FiguraTransporte.Operadores(i).Domicilio = New ProfactCartaPorte.CartaPorteFiguraTransporteOperadoresOperadorDomicilio() diff --git a/App_Code/Timbres.vb b/App_Code/Timbres.vb new file mode 100644 index 000000000..0c276d71c --- /dev/null +++ b/App_Code/Timbres.vb @@ -0,0 +1,355 @@ +Imports System.Data +Imports Extensiones + +Public Class Timbres + Private _MsgError As StringBuilder + Private _MensajeAlert As StringBuilder + Public Property TieneError As Boolean + Public ReadOnly Property MsgError As String + Get + Return _MsgError.ToString + End Get + End Property + + Public ReadOnly Property MensajeAlert As String + Get + Return _MensajeAlert.ToString + End Get + End Property + + Private Property CveMovimiento As Integer + Private Property UsuarioActual As Usuario + Private Property AplicaCP As Boolean + Private Property FechaSalidaLlegada As Date + + Private Property Serie As String + Private Property Folio As Integer + Private Property CveTimbre As Integer + + Private Property CPCliente As Integer + Public Property ObjFactura As Modelos.Factura + + Public Sub New() + + End Sub + + Public Sub New(TipoDocto As String, tCveTimbre As Integer, tUsuarioActual As Usuario) + _MsgError = New StringBuilder + UsuarioActual = tUsuarioActual + CveTimbre = tCveTimbre + CreaObjetosTraslados(TipoDocto, tCveTimbre) + End Sub + + + Private Sub CreaObjetosTraslados(TipoDocto As String, CveTimbre As Integer) + ObjFactura = New Modelos.Factura + ObjFactura.Version = "3.3" + ObjFactura.CveUsuario = UsuarioActual.CveUsuario + ObjFactura.CveEmpresa = UsuarioActual.CveEmpresa + ObjFactura.UsuarioActual = UsuarioActual + 'ObjFactura.TipoCambio = 1 + ObjFactura.ConvertirPesos = False + ObjFactura.CveMoneda = 1 + ObjFactura.Moneda = "XXX" + ObjFactura.MonedaSAT = "XXX" + ObjFactura.MonedaAbreviatura = "XXX" + ObjFactura.TipoDocto = TipoDocto + ObjFactura.TipoComprobante = "T" + + ObjFactura.Fecha = Now + ObjFactura.FechaPago = Now + ObjFactura.FechaEjecucion = Now + ObjFactura.UsuarioCreo = UsuarioActual.Usuario + ObjFactura.TipoDocumento = "Traspaso" + + + ObjFactura.RFCReceptor = "XAXX010101000" ' RFC empresa traslado , si es entrega RFC Cliente + + ObjFactura.Inv_CveMovimiento = CveMovimiento + ObjFactura.CveTimbre = CveTimbre + + If CveTimbre > 0 AndAlso ObjFactura.TipoComprobante = "T" Then + + ObjFactura.Timbre = PreParaTimbreCartaPorte(ObjFactura) + + End If + + End Sub + + Private Function PreParaTimbreCartaPorte(Obj As Modelos.Factura) As CFDITimbre + Dim Timbre As New CFDITimbre + Timbre.Comprobante.TipoComprobante = "T" + Timbre.Comprobante.Fecha = Obj.Fecha + Timbre.Comprobante.FormadePago = Obj.FormaPagoSAT33 + Timbre.Comprobante.MetodoPago = Obj.ClaveMetodoPagoSAT + Timbre.Comprobante.SubTotal = Obj.SubTotal + Timbre.Comprobante.Descuentos = Obj.Descuento + Timbre.Comprobante.Moneda = "XXX" + Timbre.Comprobante.TipoCambio = "" ' CONDICIÓN SI LA MONEDA ES 'XXX' + + Timbre.Receptor.RFC = UsuarioActual.Empresa.RFC + Timbre.Receptor.Nombre = UsuarioActual.Empresa.Empresa + Timbre.Receptor.UsoCFDI = "P01" + + + Dim totSubTotal As Decimal = Obj.SubTotal + Dim totIVA As Decimal = Obj.IVA + Dim totRetIVA As Decimal = Obj.RetIVA + Dim totRetISR As Decimal = Obj.RetISR + Dim i As Integer = 1 + + + Timbre.Comprobante.LugarExpedicion = UsuarioActual.Empresa.CP.ToString + + + 'DETALLES + Dim tPS As String = "" + + Dim CartaPorte As New CFDICartaPorte + CartaPorte.TranspInternac = "No" + CartaPorte.EntradaSalidaMercancia = "" + CartaPorte.ViaEntradaSalida = "" + + CartaPorte.Mercancias.UnidadPeso = "KGM" + CartaPorte.Mercancias.CargoporTasacion = 0 + + Dim FI As Date = New Date(1900, 1, 1) + Dim FF As Date = New Date(9999, 1, 1) + + Dim ObjGrales As New ClsGenerales + If ObjGrales.GetGralTimbre(CveTimbre, "-1", FI, FF, 0, UsuarioActual.CveEmpresa, -1) Then + + If ObjGrales.DtResultados.Rows.Count = 1 Then + Dim DtMovimientos As DataTable = Nothing + + Dim drT As DataRow = ObjGrales.DtResultados.Rows(0) + + CveMovimiento = drT("CveMovimientoAlmacen").ToString.ToEntero + FechaSalidaLlegada = drT("FechaEntrega").ToString.ToDate + + ObjFactura.Folio = drT("Folio").ToString.ToEntero + ObjFactura.Serie = drT("Serie").ToString + Timbre.Comprobante.Serie = Obj.Serie + Timbre.Comprobante.Folio = Obj.Folio.ToString + + If ObjGrales.GetGralMovimientosDetalleTimbre(CveTimbre, UsuarioActual.CveEmpresa) Then + DtMovimientos = ObjGrales.DtResultados + Else + TieneError = True + _MsgError.AppendLine("Error al obtener Movimientos") + End If + + ObjFactura.DtDetalle = DtMovimientos + + AplicaCP = Boolean.Parse(drT("AplicaCP").ToString) + + ObjFactura.CveSubProyecto = drT("CveSubProyecto").ToString.ToEntero + + ObjFactura.SetSubProyecto() + ObjFactura.SetSubProyectoMatriz() + + If AplicaCP Then + + CartaPorte.FiguraTransporte.AutoTransporte.PermSCT = drT("TipoPermisoSCT").ToString '"TPAF01" + CartaPorte.FiguraTransporte.AutoTransporte.NumPermisoSCT = drT("NumPermisoSCT").ToString + CartaPorte.FiguraTransporte.AutoTransporte.NombreSeguroResponsabilidadCivil = drT("NombreAseguradora").ToString + CartaPorte.FiguraTransporte.AutoTransporte.PolizaSeguroResponsabilidadCivil = drT("NumPolizaSeguro").ToString + CartaPorte.FiguraTransporte.AutoTransporte.NombreSeguroMedioAmbiente = drT("NombreAseguradoraMedioAmbiente").ToString + CartaPorte.FiguraTransporte.AutoTransporte.PolizaSeguroMedioAmbiente = drT("NumPolizaSeguroMedioAmbiente").ToString + CartaPorte.FiguraTransporte.AutoTransporte.NombreSeguroCarga = drT("NombreAseguradoraCarga").ToString + CartaPorte.FiguraTransporte.AutoTransporte.PolizaSeguroCarga = drT("NumPolizaSeguroCarga").ToString + CartaPorte.FiguraTransporte.AutoTransporte.Vehiculo.ConfigVehicular = drT("ConfigCartaPorte").ToString + CartaPorte.FiguraTransporte.AutoTransporte.Vehiculo.PlacaVM = drT("Placa").ToString + CartaPorte.FiguraTransporte.AutoTransporte.Vehiculo.AnioModeloVM = drT("Anio").ToString.ToEntero + + CPCliente = drT("CPCliente").ToString.ToEntero + + + Dim DomOrigen As CFDICartaPorteDomicilio = Nothing + DomOrigen = New CFDICartaPorteDomicilio With {.Calle = drT("DirOriCalle").ToString, + .Colonia = drT("DirOriClaveSATColonia").ToString, + .CP = drT("DirOriCP").ToString, + .Estado = drT("DirOriClaveSATEstado").ToString, + .Pais = drT("DirOriClaveSATPais").ToString, + .Municipio = drT("DIrOriClaveSATMunicipio").ToString, + .Localidad = drT("DirOriClaveSATLocalidad").ToString} + + Dim DomDestino As CFDICartaPorteDomicilio = Nothing + + + DomDestino = New CFDICartaPorteDomicilio With {.Calle = drT("DirDesCalle").ToString, + .Colonia = drT("DirDesClaveSATColonia").ToString, + .CP = drT("DirDesCP").ToString, + .Estado = drT("DirDesClaveSATEstado").ToString, + .Pais = drT("DirDesClaveSATPais").ToString, + .Municipio = drT("DirDesClaveSATMunicipio").ToString, + .Localidad = drT("DirDesClaveSATLocalidad").ToString} + + + Dim Ubica As New CFDICartaPorteUbicacion + Ubica.TipoEstacion = "" + Ubica.DistanciaRecorrida = 1 + Ubica = New CFDICartaPorteUbicacion With {.TipoUbicacion = "Origen", .IDUbicacion = "OR000001", .RFCRemitenteDestinatario = UsuarioActual.Empresa.RFC,'UsuarioActual.Empresa.RFC, + .FechaHoraSalidaLlegada = Now.ToString("yyyy-MM-ddTHH:mm:ss"),' "2021-08-23T11:13:01", + .NombreRemitenteDestinatario = UsuarioActual.Empresa.Empresa, + .Domicilio = DomOrigen} + CartaPorte.Ubicaciones.Add(Ubica) + Ubica = New CFDICartaPorteUbicacion With {.TipoUbicacion = "Destino", .IDUbicacion = "DE000001", .RFCRemitenteDestinatario = UsuarioActual.Empresa.RFC,'UsuarioActual.Empresa.RFC,'"CAMJ841219I33", + .FechaHoraSalidaLlegada = FechaSalidaLlegada.ToString("yyyy-MM-ddT23:59:59"), + .NombreRemitenteDestinatario = UsuarioActual.Empresa.Empresa, + .Domicilio = DomDestino, + .DistanciaRecorrida = 1} + + CartaPorte.Ubicaciones.Add(Ubica) + CartaPorte.FiguraTransporte.ClaveTransporte = "01" + + Dim DomicilioOperador As New CFDICartaPorteDomicilio With {.Calle = drT("FiguraDomicilio").ToString, + .NumeroExterior = drT("FiguraNumeroExterior").ToString, + .NumeroInterior = drT("FiguraNumeroInterior").ToString, + .Colonia = drT("FiguraClaveSATColonia").ToString, + .Municipio = drT("FiguraClaveSATMunicipio").ToString, + .Estado = drT("FiguraClaveSATEstado").ToString, + .CP = drT("FiguraCP").ToString} + + + + CartaPorte.FiguraTransporte.Operadores.Add(New CFDICartaPorteOperador With { + .RFCFigura = drT("FiguraRFC").ToString, + .NombreFigura = drT("FiguraChofer").ToString, + .NumLicencia = drT("FiguraLicencia").ToString, + .NumRegidTribFigura = drT("FiguraNumRegidTribFigura").ToString, + .ResidenciaFiscalFigura = drT("FiguraResidenciaFiscalFigura").ToString, + .Domicilio = DomicilioOperador}) + + + 'concepto único + Dim concepto As New CFDIConceptos With {.Cantidad = 1, + .Descripcion = "Flete", + .ValorUnitario = 0, + .Importe = 0, + .Descuento = 0, + .Unidad = "Servicio", + .ClaveUnidad = "E48", + .ClaveProdServ = "78101802", + .Noidentificacion = "", + .CuentaPredial = ""} + + Timbre.Conceptos.Add(concepto) + + For Each drr As DataRow In Obj.DtDetalle.Rows + + If drr("PS").ToString.Length = 1 Then + tPS = drr("Obs").ToString + Else + If drr("PS").ToString.Length = 0 Then + tPS = "" + Else + tPS = String.Format("{0} {1}", drr("PS"), drr("Obs")) + End If + End If + Dim conceptoCarta As New CFDICartaPorteMercancia With { + .BienesTransp = drr("SATClaveProdServ").ToString, + .ClaveSTCC = "", 'para metodo ferroviario + .Cantidad = drr("Cantidad").ToString.ToDecimal, + .Descripción = tPS, + .ClaveUnidad = drr("SATClaveUM").ToString, + .Unidad = drr("UM").ToString, + .Dimensiones = "", + .PesoenKg = drr("PesoKg").ToString.ToDecimal, + .MaterialPeligroso = If(drr("ClaveMaterialPeligroso").ToString <> "", "Sí", "No"), + .ClaveMaterialPeligroso = drr("ClaveMaterialPeligroso").ToString, + .Embalaje = drr("ClaveEmbalaje").ToString, + .DescripEmbalaje = drr("Embalaje").ToString, + .ValorMercancia = drr("PU").ToString.ToDecimal, + .Moneda = "MXN", 'temporal + .FraccionArrancelaria = "", + .UUIDComercioExt = "" + } + + Dim DetalleMercancia As New CFDICartaPorteMercanciaDetalleMercancia With {.PesoNeto = drr("PesoKg").ToString.ToDecimal} + conceptoCarta.DetalleMercancia = DetalleMercancia + + Dim MercanciaTransporta As New CFDICartaPorteMercanciaTransporta With {.Cantidad = drr("Cantidad").ToString.ToDecimal, .IDOrigen = "OR000001", .IDDestino = "DE000001"} + conceptoCarta.MercanciasCantidadTransporta.Add(MercanciaTransporta) + + totSubTotal = totSubTotal - concepto.Importe + CartaPorte.Mercancias.Mercancias.Add(conceptoCarta) + + i += 1 + Next + Timbre.Complementos.CartaPorte = CartaPorte + + Else + '' T R A S L A D O S + + 'DETALLES + + For Each drr As DataRow In Obj.DtDetalle.Rows + + If drr("PS").ToString.Length = 1 Then + tPS = drr("Obs").ToString + Else + If drr("PS").ToString.Length = 0 Then + tPS = "" + Else + tPS = String.Format("{0} {1}", drr("PS"), drr("Obs")) + End If + End If + + 'CONDICIONANTE, ESPECIAL + If UsuarioActual.CveEmpresa = 15 Then drr("UM") = "" 'LES COMENTAN QUE NO DEBE IR LA ETIQUETA DE LA UNIDAD EN EL PRODUCTO + + Dim concepto As New CFDIConceptos With {.Cantidad = drr("Cantidad").ToString.ToDecimal, + .Descripcion = tPS, + .ValorUnitario = drr("PU").ToString.ToDecimal, + .Importe = drr("TotalImporte").ToString.ToDecimal, + .Descuento = drr("Descuento").ToString.ToDecimal, + .Unidad = drr("UM").ToString, + .ClaveUnidad = drr("SATClaveUM").ToString, + .ClaveProdServ = drr("SATClaveProdServ").ToString, + .Noidentificacion = drr("Noidentificacion").ToString, + .CuentaPredial = drr("CuentaPredial").ToString} + 'VERIFICA SUMA SUBTOTALES + If i = Obj.DtDetalle.Rows.Count AndAlso totSubTotal <> concepto.Importe Then 'PROCESO DE AJUSTA DE DECIMALES + concepto.Importe = totSubTotal + End If + totSubTotal = totSubTotal - concepto.Importe + + 'SIEMPRE ESTAMOS AGREGANDO EL IVA + 'concepto.Impuestos.Add(New CFDIConceptosImpuestos With {.TrasladooRetencion = "T", .Base = concepto.Importe - concepto.Descuento, .TasaOCuota = drr("PorcentajeIVA").ToString.ToDecimal, .Impuesto = "002", .Importe = drr("ImporteIVA").ToString.ToDecimal}) + + Timbre.Conceptos.Add(concepto) + i += 1 + Next + + End If + + Else + TieneError = True + _MsgError.AppendLine("Consultar datos de timbrado") + End If + + ObjGrales.Dispose() + + End If + Return Timbre + End Function + Public Function Timbrar() As Boolean + + Dim Respuesta As Boolean = False + + Dim ObjTimbrado As New Timbrado + + If ObjTimbrado.TimbrarFactura(UsuarioActual, ObjFactura) Then + Respuesta = True + Else + Respuesta = False + _MsgError.AppendLine(ObjTimbrado.MensajeErrorCFDI) + End If + + Return Respuesta + + End Function + + +End Class diff --git a/Bin/GoCfdi.dll b/Bin/GoCfdi.dll index c1d9e7fa4ac57583cd46980417d34282059a6510..9ccff8cbe33fba3848dd91e71a5e7b23dd4aa750 100644 GIT binary patch delta 54027 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 delta 52450 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 Tezwh`OKQT8S)Z$l&hGyO;(K?$ diff --git a/Compras/PopUpVerFactura.aspx.vb b/Compras/PopUpVerFactura.aspx.vb index 2bb063817..5827d865e 100644 --- a/Compras/PopUpVerFactura.aspx.vb +++ b/Compras/PopUpVerFactura.aspx.vb @@ -931,8 +931,8 @@ Partial Class PopUpVerFactura Dim TransporteInternacional As String = "" Dim PermisoSTCC As String = "" Dim NumPermiso As String = "" - Dim Aseguradora As String = "" - Dim NumPolizaSeguro As String = "" + Dim AseguradoraRespCivil As String = "" + Dim NumPolizaSeguroRespCivil As String = "" Dim NombreAseguradoraMedioAmbiente As String = "" Dim NumPolizaSeguroMedioAmbiente As String = "" Dim NombreAseguradoraCarga As String = "" @@ -950,15 +950,17 @@ Partial Class PopUpVerFactura Dim FechaCertificacion As DateTime = Nothing Dim SelloCFDi As String = "" Dim SelloSAT As String = "" + Dim TipoDocto As String = "" Dim ObjInv As New ClsGenerales - If ObjInv.GetGralTimbre(CveTimbre, "-1", "-1", -1, MinFecha, MaxFecha, -1, UsuarioActual.CveEmpresa, -1) Then + If ObjInv.GetGralTimbre(CveTimbre, "-1", MinFecha, MaxFecha, -1, UsuarioActual.CveEmpresa, -1) Then If ObjInv.DtResultados.Rows.Count > 0 Then Dim Dr As DataRow = ObjInv.DtResultados.Rows(0) If Dr IsNot Nothing Then SerieFolio = Dr("SerieFolio").ToString - Telefono = Dr("Telefono").ToString + Telefono = Dr("FiguraTelefono").ToString + TipoDocto = Dr("TipoDocto").ToString End If End If End If @@ -973,6 +975,7 @@ Partial Class PopUpVerFactura Dim DtUbicaciones As New DataTable() DtUbicaciones.Columns.Add(New DataColumn("Distancia", GetType(String))) + DtUbicaciones.Columns.Add(New DataColumn("TipoUbicacion", GetType(String))) DtUbicaciones.Columns.Add(New DataColumn("RFC", GetType(String))) DtUbicaciones.Columns.Add(New DataColumn("Nombre", GetType(String))) DtUbicaciones.Columns.Add(New DataColumn("FechaHoraSalida", GetType(DateTime))) @@ -990,7 +993,7 @@ Partial Class PopUpVerFactura DtOperadores.Columns.Add(New DataColumn("NombreOperador", GetType(String))) Dim XMLDoc As New XmlDocument - Dim Path As String = String.Format("{0}\{1}\{2}\{3}.{4}", UsuarioActual.Empresa.Ruta, "XML", "Tra", String.Format("{0}", SerieFolio), "xml") + Dim Path As String = String.Format("{0}\{1}\{2}\{3}.{4}", UsuarioActual.Empresa.Ruta, "XML", TipoDocto, String.Format("{0}", SerieFolio), "xml") Dim Archivo As New System.IO.FileInfo(Path) If Archivo.Exists Then @@ -1024,6 +1027,7 @@ Partial Class PopUpVerFactura namespaces.AddNamespace("implocal", "http://www.sat.gob.mx/implocal") namespaces.AddNamespace("registrofiscal", "http://www.sat.gob.mx/registrofiscal") namespaces.AddNamespace("cartaporte", "http://www.sat.gob.mx/CartaPorte") + namespaces.AddNamespace("cartaporte20", "http://www.sat.gob.mx/CartaPorte20") Dim nodeComprobante As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Comprobante", Prefijo), namespaces) If nodeComprobante IsNot Nothing Then @@ -1060,40 +1064,42 @@ Partial Class PopUpVerFactura Dim nodeComp As XmlNode = XMLDoc.SelectSingleNode(String.Format("//{0}:Complemento", Prefijo), namespaces) - Dim nodeCartaPorte As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CartaPorte", "cartaporte"), namespaces) + Dim nodeCartaPorte As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:CartaPorte", "cartaporte20"), namespaces) If nodeCartaPorte IsNot Nothing Then TransporteInternacional = ValorXML(nodeCartaPorte, "TranspInternac", "") End If - Dim nodeAutotransporteFederal As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:AutotransporteFederal", "cartaporte"), namespaces) + Dim nodeAutotransporteFederal As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:Autotransporte", "cartaporte20"), namespaces) If nodeAutotransporteFederal IsNot Nothing Then PermisoSTCC = ValorXML(nodeAutotransporteFederal, "PermSCT", "") NumPermiso = ValorXML(nodeAutotransporteFederal, "NumPermisoSCT", "") - Aseguradora = ValorXML(nodeAutotransporteFederal, "NombreAseg", "") - NumPolizaSeguro = ValorXML(nodeAutotransporteFederal, "NumPolizaSeguro", "") - - 'Por Definir de donde sale - 'NombreAseguradoraMedioAmbiente = ValorXML(nodeAutotransporteFederal, "", "") - 'NumPolizaSeguroMedioAmbiente = ValorXML(nodeAutotransporteFederal, "", "") - 'NombreAseguradoraCarga = ValorXML(nodeAutotransporteFederal, "", "") - 'NumPolizaSeguroCarga = ValorXML(nodeAutotransporteFederal, "", "") - - End If - Dim nodeIdentificacionVehicular As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:IdentificacionVehicular", "cartaporte"), namespaces) + Dim nodeIdentificacionVehicular As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:IdentificacionVehicular", "cartaporte20"), namespaces) If nodeIdentificacionVehicular IsNot Nothing Then PlacaVM = ValorXML(nodeIdentificacionVehicular, "PlacaVM", "") AnioModeloVM = ValorXML(nodeIdentificacionVehicular, "AnioModeloVM", "") End If - Dim nodeFiguraTransporte As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:FiguraTransporte", "cartaporte"), namespaces) - If nodeFiguraTransporte IsNot Nothing Then - Dim CveTransporte As String = ValorXML(nodeFiguraTransporte, "CveTransporte", "") - MedioTransporte = String.Format("{0} - {1}", CveTransporte, HtTransporte(CveTransporte).ToString()) + Dim nodeSeguros As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:Seguros", "cartaporte20"), namespaces) + If nodeIdentificacionVehicular IsNot Nothing Then + AseguradoraRespCivil = ValorXML(nodeSeguros, "AseguraRespCivil", "") + NumPolizaSeguroRespCivil = ValorXML(nodeSeguros, "PolizaRespCivil", "") + + 'Por Definir de donde sale + NombreAseguradoraMedioAmbiente = ValorXML(nodeSeguros, "AseguraMedAmbiente", "") + NumPolizaSeguroMedioAmbiente = ValorXML(nodeSeguros, "PolizaMedAmbiente", "") + NombreAseguradoraCarga = ValorXML(nodeSeguros, "AseguraCarga", "") + NumPolizaSeguroCarga = ValorXML(nodeSeguros, "PolizaCarga", "") End If - Dim nodeMercancias As XmlNodeList = nodeComp.SelectNodes(String.Format("//{0}:Mercancia", "cartaporte"), namespaces) + 'Dim nodeFiguraTransporte As XmlNode = nodeComp.SelectSingleNode(String.Format("//{0}:FiguraTransporte", "cartaporte20"), namespaces) + 'If nodeFiguraTransporte IsNot Nothing Then + ' Dim CveTransporte As String = ValorXML(nodeFiguraTransporte, "TipoFigura", "") + ' MedioTransporte = String.Format("{0} - {1}", CveTransporte, HtTransporte(CveTransporte).ToString()) + 'End If + + Dim nodeMercancias As XmlNodeList = nodeComp.SelectNodes(String.Format("//{0}:Mercancia", "cartaporte20"), namespaces) For Each node As XmlNode In nodeMercancias Dim Row As DataRow = DtMercancias.NewRow @@ -1105,45 +1111,44 @@ Partial Class PopUpVerFactura DtMercancias.Rows.Add(Row) Next - Dim nodeOperadores As XmlNodeList = nodeComp.SelectNodes(String.Format("//{0}:Operador", "cartaporte"), namespaces) + Dim nodeOperadores As XmlNodeList = nodeComp.SelectNodes(String.Format("//{0}:TiposFigura", "cartaporte20"), namespaces) For Each node As XmlNode In nodeOperadores Dim Row As DataRow = DtOperadores.NewRow - Row("RFC") = ValorXML(node, "RFCOperador", "") + Row("RFC") = ValorXML(node, "RFCFigura", "") Row("NumLicencia") = ValorXML(node, "NumLicencia", "") - Row("NombreOperador") = ValorXML(node, "NombreOperador", "") + Row("NombreOperador") = ValorXML(node, "NombreFigura", "") DtOperadores.Rows.Add(Row) Next - Dim nodeUbicaciones As XmlNodeList = nodeComp.SelectNodes(String.Format("//{0}:Ubicacion", "cartaporte"), namespaces) + Dim nodeUbicaciones As XmlNodeList = nodeComp.SelectNodes(String.Format("//{0}:Ubicacion", "cartaporte20"), namespaces) For Each node As XmlNode In nodeUbicaciones Dim Row As DataRow = DtUbicaciones.NewRow Row("Distancia") = ValorXML(node, "DistanciaRecorrida", "") - Dim nodeOrigen = node.ChildNodes.Cast(Of XmlNode).FirstOrDefault(Function(x) x.Name = "cartaporte:Origen") - If nodeOrigen IsNot Nothing Then - Row("RFC") = ValorXML(nodeOrigen, "RFCRemitente", "") - Row("Nombre") = ValorXML(nodeOrigen, "NombreRemitente", "") - Row("FechaHoraSalida") = ValorXML(nodeOrigen, "FechaHoraSalida", "").ToDateTime() - End If + Row("TipoUbicacion") = ValorXML(node, "TipoUbicacion", "") + Row("FechaHoraSalida") = ValorXML(node, "FechaHoraSalidaLlegada", "") + Row("RFC") = ValorXML(node, "RFCRemitenteDestinatario", "") + Row("Nombre") = ValorXML(node, "NombreRemitenteDestinatario", "") - Dim nodeDestino = node.ChildNodes.Cast(Of XmlNode).FirstOrDefault(Function(x) x.Name = "cartaporte:Destino") 'node.SelectSingleNode(String.Format("//{0}:Destino", "cartaporte"), namespaces) - If nodeDestino IsNot Nothing Then - Row("RFC") = ValorXML(nodeDestino, "RFCDestinatario", "") - Row("Nombre") = ValorXML(nodeDestino, "NombreDestinatario", "") - Row("FechaHoraSalida") = ValorXML(nodeDestino, "FechaHoraProgLlegada", "").ToDateTime() - End If - - Dim nodeDomicilio = node.ChildNodes.Cast(Of XmlNode).FirstOrDefault(Function(x) x.Name = "cartaporte:Domicilio") 'node.SelectSingleNode(String.Format("//{0}:Domicilio", "cartaporte"), namespaces) + Dim nodeDomicilio = node.ChildNodes.Cast(Of XmlNode).FirstOrDefault(Function(x) x.Name = "cartaporte20:Domicilio") 'node.SelectSingleNode(String.Format("//{0}:Domicilio", "cartaporte"), namespaces) If nodeDomicilio IsNot Nothing Then + + Dim Estado As String = "" + Dim Municipio As String = "" + Dim Colonia As String = "" Dim calle = ValorXML(nodeDomicilio, "Calle", "") - Dim Estado = ValorXML(nodeDomicilio, "Estado", "") - Dim Pais = ValorXML(nodeDomicilio, "MEX", "") Dim CP = ValorXML(nodeDomicilio, "CodigoPostal", "") - Row("Direccion") = String.Format("{0} ,{1},{2}. CP {3}", calle, Estado, Pais, CP) + Dim dr As DataRow = GlobalDTGralColonias(ValorXML(nodeDomicilio, "Estado", ""), ValorXML(nodeDomicilio, "Municipio", ""), ValorXML(nodeDomicilio, "Colonia", "")).FiltroPrimero("") + If dr IsNot Nothing Then + Estado = dr("NombreEstado").ToString + Municipio = dr("NombreMunicipio").ToString + Colonia = dr("NombreAsentamiento").ToString + End If + Row("Direccion") = String.Format("{0} Col.{1},{2},{3}. CP {4}", calle, Colonia, Municipio, Estado, CP) End If DtUbicaciones.Rows.Add(Row) @@ -1197,8 +1202,8 @@ Partial Class PopUpVerFactura params.Add(New ReportParameter("PermisoSTCC", PermisoSTCC)) params.Add(New ReportParameter("NumPermiso", NumPermiso)) - params.Add(New ReportParameter("Aseguradora", Aseguradora)) - params.Add(New ReportParameter("NumPoliza", NumPolizaSeguro)) + params.Add(New ReportParameter("Aseguradora", AseguradoraRespCivil)) + params.Add(New ReportParameter("NumPoliza", NumPolizaSeguroRespCivil)) params.Add(New ReportParameter("NombreAseguradoraMedioAmbiente", NombreAseguradoraMedioAmbiente)) params.Add(New ReportParameter("NumPolizaSeguroMedioAmbiente", NumPolizaSeguroMedioAmbiente)) @@ -1246,7 +1251,7 @@ Partial Class PopUpVerFactura rds4.Value = DtOperadores lrds.Add(rds4) - ImprimirPDF("Empresas/Grales/Formatos/CartaPorteTimbrado.rdlc", lrds, params, String.Format("Carta Porte -{0}", Now.ToDateTime.ToShortDateString)) + ImprimirPDF("Empresas/Grales/Formatos/CartaPorteTimbrado.rdlc", lrds, params, SerieFolio) End If End If End Sub @@ -1256,7 +1261,7 @@ Partial Class PopUpVerFactura #Region "OP = 'DesXmlTra' - IMPRIME XML TRASLADO" Private Sub DescargaXMLTraslado(Parametros As Hashtable) - If Parametros("CVEMOVIMIENTO") IsNot Nothing AndAlso Parametros("CVEMOVIMIENTO").ToString.ToEntero > 0 Then + If Parametros("TIPODOCTO") IsNot Nothing AndAlso Parametros("TIPODOCTO").ToString <> "" Then Dim Exten As String = If(Parametros("EXT").ToString.ToLower = "xml", "xml", "pdf") Dim Path As String = String.Format("{0}\{1}\{2}\{3}.{4}", UsuarioActual.Empresa.Ruta, Parametros("EXT").ToString, Parametros("TIPODOCTO").ToString, Parametros("FOLIO").ToString, Exten) Dim Archivo As New System.IO.FileInfo(Path) @@ -1280,29 +1285,32 @@ Partial Class PopUpVerFactura #Region "OP = 'DesPdfTra' - IMPRIME PDF TRASLADO" Private Sub DescargaPDFTraslado(Parametros As Hashtable) - If Parametros("CVEMOVIMIENTO") IsNot Nothing AndAlso Parametros("CVEMOVIMIENTO").ToString.ToEntero > 0 Then + If Parametros("TIPODOCTO") IsNot Nothing AndAlso Parametros("TIPODOCTO").ToString <> "" Then Dim Exten As String = If(Parametros("EXT").ToString.ToLower = "xml", "xml", "pdf") Dim Path As String = String.Format("{0}\{1}\{2}\{3}.{4}", UsuarioActual.Empresa.Ruta, Parametros("EXT").ToString, Parametros("TIPODOCTO").ToString, Parametros("FOLIO").ToString, Exten) Dim Archivo As New System.IO.FileInfo(Path) - + Dim cvetimbre As Integer = Parametros("CVETIMBRE").ToString.ToEntero + If Archivo.Exists Then DescargarArchivoPDFTraslado(Archivo, Path) Else If Exten = "pdf" Then - GeneraPDFFactura(Parametros("CVEMOVIMIENTO").ToString.ToEntero) + Dim ObjTimbres As New Timbres("Rec", cvetimbre, UsuarioActual) + + GeneraPDFFactura(ObjTimbres.ObjFactura) Archivo = New System.IO.FileInfo(Path) If Archivo.Exists Then DescargarArchivoPDFTraslado(Archivo, Path) End If - End If - End If + End If + End If Archivo = Nothing End If End Sub Private Sub DescargarArchivoPDFTraslado(Archivo As System.IO.FileInfo, path As String) HttpContext.Current.Response.Clear() HttpContext.Current.Response.ClearContent() - HttpContext.Current.Response.ContentType = If(IO.Path.GetExtension(Archivo.Name) = "xml", "application/xml", "application/pdf") + HttpContext.Current.Response.ContentType = If(IO.Path.GetExtension(Archivo.Name) = "xml", "text/xml", "application/pdf") HttpContext.Current.Response.AppendHeader("Content-disposition", String.Format("attachment; filename={0}", Archivo.Name)) HttpContext.Current.Response.AddHeader("Content-Length", Archivo.Length.ToString()) HttpContext.Current.Response.TransmitFile(path) @@ -1310,9 +1318,9 @@ Partial Class PopUpVerFactura HttpContext.Current.Response.End() End Sub - Private Sub GeneraPDFFactura(CveMovimiento As Integer) + Private Sub GeneraPDFFactura(ObjFactura As Modelos.Factura) Try - Dim objFactura = CreaObjetosTraslado(CveMovimiento) + ' Dim objFactura = CreaObjetosTraslado(CveMovimiento) If objFactura IsNot Nothing Then PdfFactura(objFactura) objFactura.Dispose() diff --git a/Compras/Proveedores.aspx.vb b/Compras/Proveedores.aspx.vb index 0d721b704..8763f2b39 100644 --- a/Compras/Proveedores.aspx.vb +++ b/Compras/Proveedores.aspx.vb @@ -1482,7 +1482,7 @@ Partial Class Compras_Proveedores DdlCveClasificacionProveedor.Items.Insert(0, New ListItem("Sin Clasificación", "0")) End Sub Private Sub CargaDIOTPais() - DdlDIOTPais.DataSource = GlobalDTPais() + DdlDIOTPais.DataSource = GlobalDTGralPaises() DdlDIOTPais.DataBind() DdlDIOTPais.Items.Insert(0, New ListItem("-", "0")) End Sub diff --git a/General/RepEntregaAlmacenRuta.aspx b/General/RepEntregaAlmacenRuta.aspx index 522992dcc..f177f0868 100644 --- a/General/RepEntregaAlmacenRuta.aspx +++ b/General/RepEntregaAlmacenRuta.aspx @@ -99,7 +99,7 @@ " style="margin-top: -3px;" class="btn btn-circle btn-sm label-info"> @@ -111,8 +111,7 @@ - - + @@ -125,7 +124,7 @@ - + @@ -147,8 +146,7 @@ -