Imports Extensiones Imports System.Data Imports System.Drawing Imports Microsoft.Reporting.WebForms Imports System.IO Imports System.Xml Partial Class Nomina_Nomina Inherits ClsPaginas #Region "Propiedades" Private Shared CveNominaT As Integer 'Local Private Property DTConceptos As Data.DataTable Get Return CType(ViewState("DTConceptos"), Data.DataTable) End Get Set(value As Data.DataTable) ViewState("DTConceptos") = value End Set End Property Private Property DTResultados As Data.DataTable Get Return CType(ViewState("DTResultados"), Data.DataTable) End Get Set(value As Data.DataTable) ViewState("DTResultados") = value End Set End Property Private ReadOnly Property DTPeriodos As Data.DataTable Get Return DirectCast(ViewState("DTPeriodos"), Data.DataTable) End Get End Property Private Property PermisoAutorizar As Boolean Get Return CType(ViewState("PermisoAutorizar"), Boolean) End Get Set(value As Boolean) ViewState("PermisoAutorizar") = value End Set End Property Private Property PermisoEmitir As Boolean Get Return CType(ViewState("PermisoEmitir"), Boolean) End Get Set(value As Boolean) ViewState("PermisoEmitir") = value End Set End Property Public Property PermisoCancelarEmitido As Boolean Get Return CType(ViewState("PermisoCancelarEmitido"), Boolean) End Get Set(value As Boolean) ViewState("PermisoCancelarEmitido") = value End Set End Property Private ReadOnly Property CvePersonal As Integer Get If ViewState("CvePersonal") Is Nothing Then Return -1 Else Return ViewState("CvePersonal").ToString.ToEntero End If End Get End Property 'Private ReadOnly Property CveNomina As Integer ' Get ' Return ViewState("CveNomina").ToString.ToEntero ' End Get 'End Property 'Private ReadOnly Property NominaFolio As String ' Get ' Return ViewState("NominaFolio").ToString ' End Get 'End Property Private ReadOnly Property FolioFiscal As String Get Return ViewState("FolioFiscal").ToString End Get End Property Private ReadOnly Property Ruta As String Get Return AppDomain.CurrentDomain.BaseDirectory & "Empresas\" & UsuarioActual.CveEmpresa & "\" End Get End Property Private ReadOnly Property RutaPruebas As String Get Return AppDomain.CurrentDomain.BaseDirectory & "Empresas\1\" End Get End Property Private ReadOnly Property SucCalle As String Get Return ViewState("SucCalle").ToString End Get End Property Private ReadOnly Property SucNoExt As String Get Return ViewState("SucNoExt").ToString End Get End Property Private ReadOnly Property SucNoInt As String Get Return ViewState("SucNoInt").ToString End Get End Property Private ReadOnly Property SucColonia As String Get Return ViewState("SucColonia").ToString End Get End Property Private ReadOnly Property SucLocalidad As String Get Return ViewState("SucLocalidad").ToString End Get End Property Private ReadOnly Property SucMunicipio As String Get Return ViewState("SucMunicipio").ToString End Get End Property Private ReadOnly Property SucEstado As String Get Return ViewState("SucEstado").ToString End Get End Property Private ReadOnly Property SucPais As String Get Return ViewState("SucPais").ToString End Get End Property Private ReadOnly Property SucCP As String Get Return ViewState("SucCP").ToString End Get End Property Private ReadOnly Property MatCalle As String Get Return ViewState("MatCalle").ToString End Get End Property Private ReadOnly Property MatNoExt As String Get Return ViewState("MatNoExt").ToString End Get End Property Private ReadOnly Property MatNoInt As String Get Return ViewState("MatNoInt").ToString End Get End Property Private ReadOnly Property MatColonia As String Get Return ViewState("MatColonia").ToString End Get End Property Private ReadOnly Property MatLocalidad As String Get Return ViewState("MatLocalidad").ToString End Get End Property Private ReadOnly Property MatMunicipio As String Get Return ViewState("MatMunicipio").ToString End Get End Property Private ReadOnly Property MatEstado As String Get Return ViewState("MatEstado").ToString End Get End Property Private ReadOnly Property MatPais As String Get Return ViewState("MatPais").ToString End Get End Property Private ReadOnly Property MatCP As String Get Return ViewState("MatCP").ToString End Get End Property 'Private ReadOnly Property DiasPeriodo As Integer ' Get ' Return ViewState("DiasPeriodo").ToString.ToEntero ' End Get 'End Property 'Private ReadOnly Property CvePeriodo As Integer ' Get ' Return ViewState("CvePeriodo").ToString.ToEntero ' End Get 'End Property Private ReadOnly Property CvePeriodoSeleccionado As Integer Get Return ViewState("CvePeriodoSeleccionado").ToString.ToEntero End Get End Property 'Private ReadOnly Property FechaI As Date ' Get ' Return ViewState("FechaI").ToString.ToDate ' End Get 'End Property 'Private ReadOnly Property FechaF As Date ' Get ' Return ViewState("FechaF").ToString.ToDate ' End Get 'End Property #End Region Partial Public Class ActualizaTimbre Public Property Estatus As Boolean Public Property CveNomina As Integer Public Property CvePAC As Integer End Class Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load If Not IsPostBack Then CargaTiposPeriodo() CargaProyecto() CargaTurnos() CargaEmpresa() CargaFolios() LnkCorreos.Visible = False TxtFechaPago.Text = Now.ToShortDateString DdlEjercicios.Items.Add(New ListItem(UsuarioActual.Empresa.EjercicioActual.ToString, UsuarioActual.Empresa.EjercicioActual.ToString)) DdlEjercicios.Items.Add(New ListItem((UsuarioActual.Empresa.EjercicioActual - 1).ToString, (UsuarioActual.Empresa.EjercicioActual - 1).ToString)) 'Verifica Permisos de Autorizar If UsuarioActual.TienePermisoProceso(82) Then PermisoAutorizar = True Else PermisoAutorizar = False 'Verifica Permisos de Timbrar If UsuarioActual.TienePermisoProceso(83) Then PermisoEmitir = True PermisoCancelarEmitido = True Else PermisoEmitir = False PermisoCancelarEmitido = False End If 'If UsuarioActual.Rol = "Administrador AD" Then ' BtnGeneraPDF.Visible = True ' BtnActualizaNomina.Visible = True 'End If End If End Sub #Region "Carga Datos,Combos, Etc..." Private Sub CargaTiposPeriodo() DdlTipoPeriodo.DataSource = GlobalDTTipoPeriodo.FiltraParametros("Estatus = 'Activo'") DdlTipoPeriodo.DataBind() End Sub Private Sub CargaPeriodos() If DdlTipoPeriodo.SelectedValue.ToEntero > 0 Then Dim ObjPeriodos As New ClsNominas If ObjPeriodos.GetPeriodos(DdlTipoPeriodo.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, DdlEjercicios.SelectedValue.ToEntero, -1, -1) Then ViewState("DTPeriodos") = ObjPeriodos.DtResultados.FiltraParametros("Estatus IN (1,2,3,4,5)") DdlPeriodo.DataSource = DTPeriodos Else DdlPeriodo.DataSource = Nothing End If ObjPeriodos.Dispose() End If DdlPeriodo.Items.Clear() DdlPeriodo.DataBind() DdlPeriodo.Items.Insert(0, New ListItem("Seleccione", "-1")) End Sub Private Sub CargaProyecto() DdlProyecto.DataSource = GlobalDTProyectos(UsuarioActual.Empresa.CveEmpresa) DdlProyecto.DataBind() End Sub Private Sub CargaSubProyecto() DdlSubProyecto.Items.Clear() DdlSubProyecto.DataSource = GlobalDTSubProyectos(DdlProyecto.SelectedValue.ToEntero) DdlSubProyecto.DataBind() DdlSubProyecto.Items.Insert(0, New ListItem("Todos", "-1")) End Sub Private Sub CargaTurnos() DdlTurno.DataSource = GlobalDTTurno.FiltraParametros("CveEmpresa = " & UsuarioActual.CveEmpresa) DdlTurno.DataBind() End Sub Private Sub CargaEmpresa() Dim dr As DataRow = Nothing dr = GlobalDTSubProyectos(-1).FiltroPrimero("SubProyecto = 'MATRIZ' AND Estatus = 'Activo' AND CveEmpresa = " & UsuarioActual.CveEmpresa) If dr IsNot Nothing Then ViewState("MatCalle") = dr("Calle") ViewState("MatNoExt") = dr("NoExt") ViewState("MatNoInt") = dr("NoInt") ViewState("MatColonia") = dr("Colonia") ViewState("MatLocalidad") = dr("Localidad") ViewState("MatMunicipio") = dr("Municipio") ViewState("MatEstado") = dr("Estado") ViewState("MatPais") = dr("Pais") ViewState("MatCP") = dr("CP") 'dr = GlobalDTSucursales.FiltroPrimero("CveSucursal = " & ObjCliente.CveSucursal) ViewState("SucCalle") = dr("Calle") ViewState("SucNoExt") = dr("NoExt") ViewState("SucNoInt") = dr("NoInt") ViewState("SucColonia") = dr("Colonia") ViewState("SucLocalidad") = dr("Localidad") ViewState("SucMunicipio") = dr("Municipio") ViewState("SucEstado") = dr("Estado") ViewState("SucPais") = dr("Pais") ViewState("SucCP") = dr("CP") End If End Sub Private Sub CargaFolios() Dim ObjFolios As New ClsGralFolios() If ObjFolios.GetFolios(TipoDocto:="Nom", CveEmpresa:=UsuarioActual.CveEmpresa) Then Dim DT As DataTable = ObjFolios.DtResultados.FiltraParametros("Estado = 'Activo'") If DT.Rows.Count = 1 Then ViewState("CveFolio") = DT.Rows(0)("CveFolio").ToString.ToEntero 'ViewState("NumAprobacion") = CLng(DT.Rows(0)("Aprobacion").ToString) 'ViewState("FechaAprobacion") = DT.Rows(0)("FechaAprobacion").ToString.ToDate ViewState("FolioActual") = DT.Rows(0)("FActual").ToString 'BtnAutorizar.Visible = True 'BtnEmitir.Visible = True Else Alert("No tiene registrados Folios para Nómina en esta sucursal.", TipoMensaje.MsgAdvertencia) 'BtnAutorizar.Visible = False 'BtnEmitir.Visible = False End If DT.Dispose() End If ObjFolios.Dispose() End Sub Private Sub CargaDatos() VerificaPermisos() Dim ObjNomina As New ClsRH If ObjNomina.GetNomina2(DdlProyecto.SelectedValue.ToEntero, DdlSubProyecto.SelectedValue.ToEntero, DdlTurno.SelectedValue.ToEntero, DdlPeriodo.SelectedValue.ToEntero, UsuarioActual.CveEmpresa, DdlAgrupador.SelectedValue) Then LnkCorreos.Visible = True 'Ocultar todas las columnas del grid y prenderlas con forme se vayan llenando For i As Integer = 1 To GVDatos.Columns.Count If (i >= 2 And i <= 16) Or (i >= 18 And i <= 32) Or (i >= 35 And i <= 51) Then GVDatos.Columns(i).Visible = False End If Next DTConceptos = ObjNomina.DSResultados().Tables(0) DTResultados = ObjNomina.DSResultados().Tables(1) ViewState("CvePeriodoSeleccionado") = DdlPeriodo.SelectedValue Dim P As Integer = 2 Dim D As Integer = 2 Dim O As Integer = 2 For Each RowConceptos As DataRow In DTConceptos.FiltraParametros("Tipo IN ('P','D','O') AND EsPadre = 1 ").Rows If RowConceptos("Tipo").ToString = "P" Then GVDatos.Columns(P).Visible = True Dim field As BoundField = DirectCast(GVDatos.Columns(P), BoundField) GVDatos.Columns(P).Visible = True field.DataField = RowConceptos("CveConcepto").ToString field.HeaderText = RowConceptos("Concepto").ToString P = P + 1 ElseIf RowConceptos("Tipo").ToString = "D" Then GVDatos.Columns(D + 17).Visible = True Dim field As BoundField = DirectCast(GVDatos.Columns(D + 17), BoundField) GVDatos.Columns(D).Visible = True field.DataField = RowConceptos("CveConcepto").ToString field.HeaderText = RowConceptos("Concepto").ToString D = D + 1 ElseIf RowConceptos("Tipo").ToString = "O" AndAlso UsuarioActual.CveRol = 1 Then GVDatos.Columns(O + 34).Visible = True Dim field As BoundField = DirectCast(GVDatos.Columns(O + 34), BoundField) GVDatos.Columns(O).Visible = True field.DataField = RowConceptos("CveConcepto").ToString field.HeaderText = If(RowConceptos("Concepto").ToString.Length > 15, RowConceptos("Concepto").ToString.Substring(0, 15), RowConceptos("Concepto").ToString) O = O + 1 End If Next If DTResultados.Rows.Count > 0 And DTResultados.Rows(0)("FechaPago").ToString.ToDate > MinFecha Then TxtFechaPago.Text = DTResultados.Rows(0)("FechaPago").ToString.ToDate.ToShortDateString End If If O > 1 AndAlso UsuarioActual.CveRol = 1 Then ' si tiene activadas las obligaciones, que muestre el total GVDatos.Columns(GVDatos.Columns.Count - 3).Visible = True End If GVDatos.DataSource = DTResultados Else GVDatos.DataSource = Nothing End If ObjNomina.Dispose() GVDatos.DataBind() If GVDatos.Rows.Count > 0 Then 'Ocultar las columnas donde el total sea cero Dim tContador As Integer = 0 For i As Integer = 1 To GVDatos.Columns.Count If (i >= 1 And i <= 15) Or (i >= 17 And i <= 31) Or (i >= 34 And i <= 49) Then If GVDatos.Rows(0).Cells(i).Text.ToDecimal = 0 Then GVDatos.Columns(i).Visible = False Else tContador += 1 End If End If Next GVDatos.Width = Unit.Pixel(350 + 240 + (80 * (tContador)) + 55) End If GVDatos.Columns(1).Visible = True UPDatos.Update() End Sub Private Sub VerificaPermisos() 'verifico los permisos de cada periodo If DdlPeriodo.SelectedValue.ToEntero > 0 Then Dim Per As New ClsNominas If Per.GetPeriodos(-1, UsuarioActual.CveEmpresa, -1, -1, DdlPeriodo.SelectedValue.ToEntero) Then Dim dr As DataRow = Per.DtResultados.FiltroPrimero("") If dr IsNot Nothing Then Select Case dr("Estatus").ToString().ToEntero() Case 0 BtnAutorizar.Visible = False BtnEmitir.Visible = False LnkPagoNomina.Visible = False LnkProvisionNomina.Visible = False LblFechaPago.Visible = False DivFechaPago.Visible = False Case 1 BtnAutorizar.Visible = True BtnEmitir.Visible = False LnkPagoNomina.Visible = False LnkProvisionNomina.Visible = False LblFechaPago.Visible = True DivFechaPago.Visible = True TxtFechaPago.Text = Now.ToShortDateString TxtFechaPago.Enabled = True Case 2 BtnAutorizar.Visible = True BtnEmitir.Visible = True LblFechaPago.Visible = True DivFechaPago.Visible = True TxtFechaPago.Text = Now.ToShortDateString TxtFechaPago.Enabled = True If dr("CveIE").ToString <> "" Then LnkPagoNomina.Visible = True LnkPagoNomina.Text = "Ver Pago" LnkPagoNomina.Attributes.Add("href", $"../Bancos/IE.aspx?CveIE={dr("CveIE").ToString}") Else LnkPagoNomina.Visible = True LnkPagoNomina.Attributes.Add("href", $"../Bancos/PolizaCheque.aspx?CvePeriodo={DdlPeriodo.SelectedValue.ToEntero}&CveProyecto={DdlProyecto.SelectedValue.ToEntero}&CveSubProyecto={DdlProyecto.SelectedValue.ToEntero}&CveTurno={DdlTurno.SelectedValue.ToEntero}") End If If dr("CvePrePolizaProvision").ToString <> "" Then LnkProvisionNomina.Visible = True LnkProvisionNomina.Text = "Ver Provisón" LnkProvisionNomina.Attributes.Add("href", $"../Contabilidad/RegPrePoliza.aspx?CvePrePoliza={dr("CvePrePolizaProvision").ToString}&Tipo=NOMPROV") Else LnkProvisionNomina.Visible = True LnkProvisionNomina.Attributes.Add("href", $"../Contabilidad/RegPrePoliza.aspx?CvePeriodo={DdlPeriodo.SelectedValue.ToEntero}&CveProyecto={DdlProyecto.SelectedValue.ToEntero}&CveSubProyecto={DdlProyecto.SelectedValue.ToEntero}&CveTurno={DdlTurno.SelectedValue.ToEntero}&Tipo=NOMPROV") End If UpnTools.Update() Case 3 BtnAutorizar.Visible = True BtnEmitir.Visible = False LblFechaPago.Visible = True DivFechaPago.Visible = True TxtFechaPago.Text = dr("FechaPago").ToString.ToDate.ToShortDateString TxtFechaPago.Enabled = False If dr("CveIE").ToString <> "" Then LnkPagoNomina.Visible = True LnkPagoNomina.Text = "Ver Pago" LnkPagoNomina.Attributes.Add("href", $"../Bancos/IE.aspx?CveIE={dr("CveIE").ToString}") Else LnkPagoNomina.Visible = True LnkPagoNomina.Attributes.Add("href", $"../Bancos/PolizaCheque.aspx?CvePeriodo={DdlPeriodo.SelectedValue.ToEntero}&CveProyecto={DdlProyecto.SelectedValue.ToEntero}&CveSubProyecto={DdlProyecto.SelectedValue.ToEntero}&CveTurno={DdlTurno.SelectedValue.ToEntero}") End If If dr("CvePrePolizaProvision").ToString <> "" Then LnkProvisionNomina.Visible = True LnkProvisionNomina.Text = "Ver Provisón" LnkProvisionNomina.Attributes.Add("href", $"../Contabilidad/RegPrePoliza.aspx?CvePrePoliza={dr("CvePrePolizaProvision").ToString}&Tipo=NOMPROV") Else LnkProvisionNomina.Visible = True LnkProvisionNomina.Attributes.Add("href", $"../Contabilidad/RegPrePoliza.aspx?CvePeriodo={DdlPeriodo.SelectedValue.ToEntero}&CveProyecto={DdlProyecto.SelectedValue.ToEntero}&CveSubProyecto={DdlProyecto.SelectedValue.ToEntero}&CveTurno={DdlTurno.SelectedValue.ToEntero}&Tipo=NOMPROV") End If UpnTools.Update() Case 4 BtnAutorizar.Visible = True BtnEmitir.Visible = False LblFechaPago.Visible = True DivFechaPago.Visible = True TxtFechaPago.Text = Now.ToShortDateString TxtFechaPago.Enabled = True If dr("CveIE").ToString <> "" Then LnkPagoNomina.Visible = True LnkPagoNomina.Text = "Ver Pago" LnkPagoNomina.Attributes.Add("href", $"../Bancos/IE.aspx?CveIE={dr("CveIE").ToString}") Else LnkPagoNomina.Visible = True LnkPagoNomina.Attributes.Add("href", $"../Bancos/PolizaCheque.aspx?CvePeriodo={DdlPeriodo.SelectedValue.ToEntero}&CveProyecto={DdlProyecto.SelectedValue.ToEntero}&CveSubProyecto={DdlProyecto.SelectedValue.ToEntero}&CveTurno={DdlTurno.SelectedValue.ToEntero}") End If If dr("CvePrePolizaProvision").ToString <> "" Then LnkProvisionNomina.Visible = True LnkProvisionNomina.Text = "Ver Provisón" LnkProvisionNomina.Attributes.Add("href", $"../Contabilidad/RegPrePoliza.aspx?CvePrePoliza={dr("CvePrePolizaProvision").ToString}&Tipo=NOMPROV") Else LnkProvisionNomina.Visible = True LnkProvisionNomina.Attributes.Add("href", $"../Contabilidad/RegPrePoliza.aspx?CvePeriodo={DdlPeriodo.SelectedValue.ToEntero}&CveProyecto={DdlProyecto.SelectedValue.ToEntero}&CveSubProyecto={DdlProyecto.SelectedValue.ToEntero}&CveTurno={DdlTurno.SelectedValue.ToEntero}&Tipo=NOMPROV") End If UpnTools.Update() Case 5 BtnAutorizar.Visible = True End Select End If End If Per.Dispose() If PermisoAutorizar And BtnAutorizar.Visible Then BtnAutorizar.Visible = True Else BtnAutorizar.Visible = False If PermisoEmitir And BtnEmitir.Visible Then BtnEmitir.Visible = True Else BtnEmitir.Visible = False End If End Sub #End Region #Region "DDL'S SELECT INDEX CHANGED" Protected Sub DdlProyecto_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles DdlProyecto.SelectedIndexChanged CargaSubProyecto() CargaFolios() End Sub Protected Sub DdlTipoPeriodo_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles DdlTipoPeriodo.SelectedIndexChanged CargaPeriodos() CargaFolios() End Sub Protected Sub DdlPeriodo_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DdlPeriodo.SelectedIndexChanged If DdlPeriodo.SelectedValue.ToEntero > 0 Then BtnConsultar.Visible = True Else BtnConsultar.Visible = False End If End Sub #End Region #Region "BTN'S CLICK" Protected Sub BtnConsultar_Click(sender As Object, e As System.EventArgs) Handles BtnConsultar.Click If DdlPeriodo.SelectedValue <> "-1" Then CargaDatos() Else Alert("Debe de seleccionar el Período con el que se desea trabajar", TipoMensaje.MsgAdvertencia) End If End Sub Protected Sub LnkTimbrar_Click(sender As Object, e As EventArgs) Dim lnk As LinkButton = DirectCast(sender, LinkButton) Dim gvRow As GridViewRow = DirectCast(lnk.NamingContainer, GridViewRow) Dim CvePeriodo As Integer = gvRow.DataKey("CvePeriodo").ToEntero() Dim CvePersonal As Integer = gvRow.DataKey("CvePersonal").ToEntero() Dim CveNomina As Integer = gvRow.DataKey("CveNomina").ToEntero() Dim lognom As New LogicNominas Dim Msg As String = lognom.TimbrarNomina(CveNomina, CvePersonal, CvePeriodo, UsuarioActual) If Not IsNothing(Msg) AndAlso Msg.Length > 0 Then Alert(Msg, TipoMensaje.MsgAdvertencia) Else Dim ObjPeriodo As New ClsNominas() ObjPeriodo.CambiaEstatusPeriodo(CvePeriodo, enumNominasEstatus.Timbrada, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) ObjPeriodo.Dispose() Alert("Se ha timbrado correctamente") gvRow.FindControl("ImgDelete").Visible = False gvRow.FindControl("LnkCancelar").Visible = False gvRow.FCImage("ImgBandera").ImageUrl = "/Imagenes/flag_green.png" gvRow.ForeColor = Color.Green lnk.Visible = False End If End Sub Protected Sub ImgDelete_Click(sender As Object, e As EventArgs) Dim Cve As Integer = DirectCast(sender, LinkButton).CommandArgument.ToEntero Dim Nom As New ClsNominas If Nom.RemoveNom_Nominas(Cve) Then Alert("Los Movimientos de la Nómina fueron eliminados", TipoMensaje.MsgInformacion) CargaDatos() End If Nom.Dispose() End Sub Protected Sub ImgCancelar_Click(sender As Object, e As EventArgs) Dim CveNomina As Integer = DirectCast(sender, LinkButton).CommandArgument.ToEntero If CveNomina > 0 Then Dim Nom As New ClsNominas If Nom.GetNom_Nominas(CveNomina, -1, -1, -1, UsuarioActual.CveEmpresa) Then Dim ObjTimbrado As New Timbrado Dim FolioFiscal As String = Nom.FolioFiscal Dim Total As Decimal = Nom.Total Dim RFCReceptor As String = Nom.RFC Dim RFCEmisor As String = UsuarioActual.Empresa.RFC If ObjTimbrado.CFDICancelar(UsuarioActual.Empresa, FolioFiscal, Total, RFCReceptor, RFCEmisor) Then Nom.UpdateEstatusNomNominas(2, UsuarioActual.Empresa.CvePAC, "", "", ("01/01/2000").ToDate, CveNomina, 0, 0, 0, 0, 0) Alert("La nómina con folio fiscal fue cancelada ante el SAT", TipoMensaje.MsgInformacion) End If End If Nom.Dispose() CargaDatos() End If End Sub Private Sub ImgExcel_Click(sender As Object, e As EventArgs) Handles ImgExcel.Click GVDatos.Columns(0).Visible = False GVDatos.ExportToExcel("Nomina") GVDatos.Columns(0).Visible = True End Sub Protected Sub BtnAutorizar_Click(sender As Object, e As EventArgs) Handles BtnAutorizar.Click 'DTConceptos 'DTResultados ' Dim CvePeriodo As Integer If Not (DdlAgrupador.SelectedValue = "1" AndAlso DdlProyecto.SelectedValue = "-1" AndAlso DdlSubProyecto.SelectedValue = "-1" AndAlso DdlTurno.SelectedValue = "-1") Then Alert("Seleccione el agrupador Empresa y limpie los filtros", TipoMensaje.MsgAdvertencia) Exit Sub End If Dim Errores As Boolean = False Dim objAsistencias As New ClsRH 'Checar la existencia de este personal If objAsistencias.GetAsistenciasPeriodo(CvePeriodoSeleccionado, UsuarioActual.CveEmpresa) Then If objAsistencias.DtResultados.COUNT("CvePersonal", "Asistencias <> DiasPeriodo") = 0 Then For Each Row As DataRow In DTResultados.FiltraParametros("CvePersonal > 0").Rows Dim objNomina As New ClsNominas Dim CveNomina As Integer = Row("CveNomina").ToString.ToEntero Dim CvePersonal As Integer = Row("CvePersonal").ToString.ToEntero Dim NombrePersonal As String = Row("Nombre").ToString Dim CveMetodoPago As Integer = Row("CveMetodoPago").ToString.ToEntero If CveNomina = 0 Then objNomina.IniciaTransacSQL() Errores = False Dim SubTotal As Double = Row("SumaPercepciones").ToString.ToDouble Dim Total As Double = Row("Total").ToString.ToDouble Dim CveMoneda As Integer = 1 'RMF, verificar este ciclo, que no debe de ir 'For i As Integer = 0 To GVDatos.Rows.Count - 1 ' If GVDatos.Rows(i).FCLabel("LblCvePersonal").Text.ToEntero = CvePersonal Then ' CveNomina = GVDatos.Rows(i).DataKey("CveNomina").ToEntero '.FCLabel("LblCveNomina").Text.ToEntero ' SubTotal = GVDatos.Rows(i).Cells(16).Text.ToDecimal ' Total = GVDatos.Rows(i).Cells(28).Text.ToDecimal ' Exit For ' End If 'Next If objNomina.AddNom_Nominas(-1, 1, CvePersonal, CvePeriodoSeleccionado, SubTotal, 0, 0, Total, CveMoneda, 1, CveMetodoPago, Now, "Deducciones nómina", "", "", "", "", 0, 0, 0, New Date, New Date, New Date, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) Then CveNomina = objNomina.CveNomina 'recorro los conceptos y saco el valor For Each drr As DataRow In DTConceptos.Rows Dim Importe As Decimal = Row(drr("CveConcepto").ToString).ToString.ToDecimal Dim ImporteExento As Decimal = Row(String.Format("{0}-E", drr("CveConcepto"))).ToString.ToDecimal Dim ImporteGravado As Decimal = Row(String.Format("{0}-G", drr("CveConcepto"))).ToString.ToDecimal Dim CveConcepto As Integer = drr("CveConcepto").ToString.ToEntero 'If Importe > 0 OrElse drr("CveSATConcepto").ToString.ToEntero > 0 Then 'JLL Se quita el OrElse, siempre que el importe sea mayor a cero debe ingresarse If Importe > 0 OrElse drr("Obligatorio").ToString = "True" Then Errores = Not objNomina.AddNom_NominasDetalles(objNomina.CveNomina, CvePeriodoSeleccionado, CvePersonal, CveConcepto, Importe, ImporteGravado, ImporteExento) End If If Errores Then Exit For Next 'RECORRO LOS CONCEPTOS OBLIGATORIOS QUE DEBE DE HABER EN LAS AUTORIZACIONES COMO SUELDO 'For Each drr As DataRow In GlobalDTNomConceptos(UsuarioActual.CveEmpresa).FiltraParametros("Obligatorio = True").Rows ' Errores = Not objNomina.AddNom_NominasDetalles(objNomina.CveNomina, CvePeriodoSeleccionado, CvePersonal, drr("CveConcepto").ToString.ToEntero, 0, 0, 0) 'Next ''Inicia del 9, porque anteriores a esa son columnas fijas, y apartir de alli inician las columnas variables 'For i As Integer = 9 To DTResultados.Columns.Count - 1 ' Dim Importe As Decimal = Row(i).ToString.ToDecimal ' Dim ImporteExento As Decimal = Row(i + 1).ToString.ToDecimal ' Dim ImporteGravado As Decimal = Row(i + 2).ToString.ToDecimal ' Dim CveConcepto As Integer = DTResultados.Columns(i).ColumnName.ToEntero ' If Importe > 0 Then ' Errores = Not objNomina.AddNom_NominasDetalles(objNomina.CveNomina, CvePeriodo, CvePersonal, CveConcepto, Importe, ImporteGravado, ImporteExento) ' End If ' If Errores = True Then ' Exit For ' End If ' i = i + 2 'Next Else Errores = True End If If Errores = False Then objNomina.Commit() Else objNomina.RollBack() End If End If objNomina.Dispose() Next 'ACTUALIZO EL PERIODO, COMO AUTORIZADO, RMF, QUE ME REGRESE SI EST[A COMPLETA LA NOMINA AUTORIZADA O FALTAN EMPLEADOS If Errores = False Then Dim ObjPeriodo As New ClsNominas If ObjPeriodo.CambiaEstatusPeriodo(CvePeriodoSeleccionado, enumNominasEstatus.Autorizada, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) And ObjPeriodo.UpdatePeriodoFechaPago(CvePeriodoSeleccionado, TxtFechaPago.Text.ToDate) Then BtnEmitir.Visible = True Dim temp As String = DdlPeriodo.SelectedValue CargaPeriodos() DdlPeriodo.SelectedValue = temp End If ObjPeriodo.Dispose() End If BtnConsultar_Click(New Object, New EventArgs) Else Dim Msg As String = String.Empty Dim StrErrores As New StringBuilder For Each Row As DataRow In objAsistencias.DtResultados.FiltraParametros("Asistencias <> DiasPeriodo").Rows StrErrores.AppendFormat("- {0}, {1} de {2}
", Row("Nombre"), Row("Asistencias"), Row("DiasPeriodo")) Next Alert("No se pudo autorizar el siguiente personal por no tener completas las asistencias:

" & StrErrores.ToString, TipoMensaje.MsgAdvertencia) End If End If objAsistencias.Dispose() End Sub Protected Sub BtnEmitir_Click(sender As Object, e As EventArgs) Handles BtnEmitir.Click If False Then 'UsuarioActual.CveUsuario <> 100 AndAlso (Now.Hour > 7 And Now.Hour <18) Then Alert("Los servicios de timbrado de nómina del PAC no están disponibles. Favor de intentarlo más tarde.", TipoMensaje.MsgError) Else If Not (DdlAgrupador.SelectedValue = "1" AndAlso DdlProyecto.SelectedValue = "-1" AndAlso DdlSubProyecto.SelectedValue = "-1") Then Alert("Seleccione el agrupador Empresa y limpie los filtros", TipoMensaje.MsgAdvertencia) Exit Sub End If 'Dim StrErrores As New StringBuilder Dim Msg As String = String.Empty 'Dim CvePeriodo As Integer Dim noCiclos As Integer = 0 Dim noTotal As Integer = DTResultados.FiltraParametros("CvePersonal > 0 and SeTimbro = False AND SerieFolio <> ''").Rows.Count 'For Each Row As DataRow In DTResultados.FiltraParametros("CvePersonal > 0 and SeTimbro = False AND SerieFolio <> ''").Rows ' If noCiclos < 4 Then ' noCiclos = noCiclos + 1 ' Dim CveNomina As Integer = Row("CveNomina").ToString.ToEntero ' Dim CvePersonal As Integer = Row("CvePersonal").ToString.ToEntero ' Dim SerieFolio As String = Row("SerieFolio").ToString ' CvePeriodo = Row("CvePeriodo").ToString.ToEntero ' If CveNomina > 0 Then ' If DdlEjercicios.SelectedValue.ToEntero < 2017 Then ' Msg = "No se puede timbrar del 2017" ' ' Msg = TimbrarNomina11(CveNomina, CvePersonal, CvePeriodo) ' Else ' Msg = TimbrarNomina12(CveNomina, CvePersonal, CvePeriodo) ' End If ' 'If Msg = "" Then ' ' Dim NombreComercial As String = UsuarioActual.Empresa.Empresa ' ' Dim Destinatario As String = Row("Mail").ToString ' ' Dim Personal As String = Row("Nombre").ToString ' ' Dim objNommina As New ClsNominas ' ' objNommina.GetPeriodos(-1, UsuarioActual.Empresa.CveEmpresa, -1, -1, Periodo) ' ' Dim DT As DataTable = objNommina.DtResultados ' ' Dim FechaI = DT.Rows(0)("FechaInicio").ToString.ToDate.ToShortDateString ' ' Dim FechaF = DT.Rows(0)("FechaFin").ToString.ToDate.ToShortDateString ' ' MandaCorreo(NombreComercial, SerieFolio, Destinatario, Personal, FechaI, FechaF) ' 'End If ' If Msg.Trim <> String.Empty Then StrErrores.Append(Msg & "
") ' End If ' Else ' Exit For ' End If 'Next 'GC.Collect() 'StrErrores.ToString().GuardaLog() 'If StrErrores.ToString <> "" Then ' Alert($" Ocurrieron los siguientes errores al timbrar:
{StrErrores.ToString()}
{noCiclos} timbres de {noTotal}", TipoMensaje.MsgError) 'Else Alert($" Se ha generado su solicitud de timbre un vez procesada se le enviara un correo con los resultados.
", TipoMensaje.MsgInformacion) If DdlTurno.SelectedValue = "-1" Then Dim ObjPeriodo As New ClsNominas() ObjPeriodo.CambiaEstatusPeriodo(CvePeriodoSeleccionado, enumNominasEstatus.PorAutorizar, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) ObjPeriodo.Dispose() 'EnvioMasivoCorreo() Dim temp As String = DdlPeriodo.SelectedValue CargaPeriodos() BtnEmitir.Visible = False DdlPeriodo.SelectedValue = temp End If 'End If 'If StrErrores.ToString <> "" Then ' Alert($"Ocurrieron los siguientes errores al timbrar:
{StrErrores.ToString}", TipoMensaje.MsgError) 'Else ' Alert("La Nómina Se Timbró correctamente.", TipoMensaje.MsgInformacion) ' 'RMF. se debe de actualizar el estatus de la nomina y activar el siguiente periodo al estatus activo ' 'condicion temporal, para filtrar por filtro y timbrar por partes y no marque timeout ' If DdlTurno.SelectedValue = "-1" Then ' Dim ObjPeriodo As New ClsNominas ' ObjPeriodo.CambiaEstatusPeriodo(CvePeriodoSeleccionado, 3, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa) ' ObjPeriodo.Dispose() ' EnvioMasivoCorreo() ' Dim temp As String = DdlPeriodo.SelectedValue ' CargaPeriodos() ' DdlPeriodo.SelectedValue = temp ' End If 'End If CargaDatos() UPDatos.Update() End If End Sub Private Sub MandaCorreo(NombreComercial As String, SerieFolio As String, Destinatario As String, Optional Personal As String = "", Optional FechaI As String = "", Optional FechaF As String = "", Optional CvePeriodo As Integer = -1, Optional CvePersonal As Integer = -1) Dim RutaXml As String = String.Format("{0}\XML\Nomina\{1}.xml", UsuarioActual.Empresa.Ruta, SerieFolio) Dim RutaPdf As String = String.Format("{0}\PDF\Nomina\{1}.pdf", UsuarioActual.Empresa.Ruta, SerieFolio) If Destinatario.Length > 0 Then Dim Correo As New ClsSisMail() Dim Asunto As String = "Comprobante de Nómina" Dim Cuerpo As New StringBuilder Cuerpo.AppendFormat("Estimado {0}
Por este medio le hacemos llegar los comprobantes fiscales de su nomina, correspondiente al periodo del {1} al {2}

", Personal, FechaI, FechaF) Cuerpo.AppendFormat("
{0}", NombreComercial) Dim Xml As New ClsSisMail.ArchivoMail Dim Pdf As New ClsSisMail.ArchivoMail Dim ListaAdjuntos As New List(Of ClsSisMail.ArchivoMail) If File.Exists(RutaXml) Then Xml.ArchivoBinario() = File.ReadAllBytes(RutaXml) Xml.Ruta = "" Xml.NombreArchivo = New FileInfo(SerieFolio + ".Xml").Name ListaAdjuntos.Add(Xml) End If If Not File.Exists(RutaPdf) Then GeneraPDFNomina(CvePersonal, CvePeriodo, UsuarioActual.CveEmpresa, UsuarioActual.Empresa.Ruta) End If If File.Exists(RutaPdf) Then Pdf.ArchivoBinario() = File.ReadAllBytes(RutaPdf) Pdf.Ruta = "" Pdf.NombreArchivo = New FileInfo(SerieFolio + ".Pdf").Name ListaAdjuntos.Add(Pdf) End If If ListaAdjuntos.Count > 0 Then If Correo.SendMail(UsuarioActual.Empresa, Destinatario, Asunto, Cuerpo.ToString, Archivos:=ListaAdjuntos) Then ' Alert("Correo enviado existosamente a " & Destinatario) Else ' Alert("Se presento un error al enviar el correo a " & Destinatario) End If Else If Correo.SendMail(UsuarioActual.Empresa, Destinatario, Asunto, Cuerpo.ToString) Then ' Alert("Correo enviado existosamente a " & Destinatario) Else ' Alert("Se presento un error al enviar el correo a " & Destinatario) End If End If Else End If End Sub Protected Sub BtnGeneraPDF_Click(sender As Object, e As EventArgs) Handles BtnGeneraPDF.Click Dim objPersonal As New ClsRH Dim objNomina As New ClsNominas For Each Row As DataRow In DTResultados.FiltraParametros("CvePersonal > 0 AND SeTimbro = True ").Rows 'Dim CveNomina As Integer = Row("CveNomina").ToString.ToEntero 'Dim CvePersonal As Integer = Row("CvePersonal").ToString.ToEntero 'Dim CvePeriodo As Integer = Row("CvePeriodo").ToString.ToEntero If Row("CveNomina").ToString.ToEntero > 0 Then objPersonal.GetPersonal(Row("CvePersonal").ToString.ToEntero, UsuarioActual.CveEmpresa) objNomina.GetNom_Nominas(Row("CveNomina").ToString.ToEntero, Row("CvePersonal").ToString.ToEntero, Row("CvePeriodo").ToString.ToEntero, -1, UsuarioActual.CveEmpresa) If objNomina.Folio > 0 Then 'GeneraPDF(String.Format("{0}XML\Nomina\{1}-{2}.xml", Ruta, objNomina.Serie, objNomina.Folio), Row("CvePersonal").ToString.ToEntero, Row("CvePeriodo").ToString.ToEntero, objPersonal.FormatoReciboCFDi) Else Alert("Error", TipoMensaje.MsgError) End If End If Next objNomina.Dispose() objPersonal.Dispose() objNomina = Nothing objPersonal = Nothing End Sub Protected Sub BtnActualizaNomina_Click(sender As Object, e As EventArgs) Handles BtnActualizaNomina.Click Dim objNomina As New ClsNominas 'saco el nombre de la columna ISR, Dim SubTotal, Deducciones, ISR As Double Dim Total As Double Dim ColISR As String = "" Dim dr As DataRow = DTConceptos.FiltroPrimero("CveSATConcepto = 3") 'saco los tipo ISR If dr IsNot Nothing Then ColISR = dr("CveConcepto").ToString End If For Each Row As DataRow In DTResultados.FiltraParametros("CvePersonal > 0 AND CveNomina > 0").Rows SubTotal = Row("SumaPercepciones").ToString.ToDouble Total = Row("Total").ToString.ToDouble Deducciones = Row("SumaDeducciones").ToString.ToDouble ISR = Row(String.Format("{0}", ColISR)).ToString.ToDouble Deducciones = Deducciones - ISR If objNomina.UpdateTotalesNominas(SubTotal, Deducciones, ISR, Total, Row("CveNomina").ToString.ToEntero) Then End If Next objNomina.Dispose() End Sub #End Region #Region "GvDatos" Protected Sub GvDatos_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GVDatos.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Then If e.Row.DBCampo("Turno") = "" AndAlso e.Row.DBCampo("Nombre") = "" AndAlso e.Row.DBCampo("SubProyecto") <> "" Then e.Row.FCLiteral("LtlNombre").Text = String.Format("Sub Proyecto: {0}", e.Row.DBCampo("SubProyecto")) e.Row.Cells(0).HorizontalAlign = HorizontalAlign.Left ElseIf e.Row.DBCampo("Turno") <> "" AndAlso e.Row.DBCampo("Nombre") = "" Then e.Row.FCLiteral("LtlNombre").Text = String.Format("Turno: {0}", e.Row.DBCampo("Turno")) e.Row.Cells(0).HorizontalAlign = HorizontalAlign.Left Else e.Row.Cells(0).HorizontalAlign = HorizontalAlign.Left e.Row.FCLiteral("LtlNombre").Text = String.Format("{1}", e.Row.DBCampo("CvePersonal"), e.Row.DBCampo("Nombre")) End If If e.Row.DBCampo("Turno") = "" AndAlso e.Row.DBCampo("Nombre") = "" AndAlso e.Row.DBCampo("SubProyecto") = "" Then e.Row.FCLiteral("LtlNombre").Text = "Total General" e.Row.CssClass = "SubTotales" e.Row.Cells(0).Text = "" End If e.Row.FindControl("LnkTimbrar").Visible = (e.Row.DBCampo("CveNomina").ToEntero > 0 AndAlso e.Row.DBCampo("SeTimbro").ToString = "False") 'Visible='<%# If(Eval("CveNomina").ToString <> "" And Eval("SeTimbro").ToString = "False", True, False)%>' If e.Row.DBCampo("CveNomina").ToEntero > 0 And e.Row.DBCampo("CvePersonal").ToEntero > 0 Then e.Row.FCImage("ImgBandera").Visible = True If e.Row.DBCampo("SeTimbro").ToString = "True" Then e.Row.FCImage("ImgBandera").ImageUrl = "/Imagenes/flag_green.png" e.Row.ForeColor = Color.Green Else e.Row.FCImage("ImgBandera").ImageUrl = "/Imagenes/flag_red.png" e.Row.ForeColor = Color.Blue End If End If End If End Sub #End Region #Region "P D F" Private Sub GeneraPDF(CveNomina As Integer, CvePersonal As Integer, CvePeriodo As Integer, FechaCFDi As DateTime, FolioFiscal As String, NoSerieCertificado As String, FechaCertificacion As DateTime, NoSerieCertificadoContribuyente As String, SelloCFDi As String, SelloSAT As String, CBB As String, RutaXML As String, EsVistaPrevia As Boolean, CadenaOriginalCFD As String, FormatoReciboCFDi As String) End Sub Private Sub GeneraPDFNuevo(PathXML As String, CvePersonal As Integer, CvePeriodo As Integer) Dim ObjNomina As New ClsNominas Dim objPersonal As New ClsRH Dim TieneError = False If Not ObjNomina.GetNom_Nominas(-1, CvePersonal, CvePeriodo, -1, UsuarioActual.CveEmpresa) Then Alert("Ocurrio un erro al obtener datos de la nomina", TipoMensaje.MsgError) objPersonal.Dispose() ObjNomina.Dispose() Exit Sub End If Dim CveNomina = ObjNomina.CveNomina Dim dtPercepciones As Data.DataTable Dim dtDeducciones As Data.DataTable Dim FechaEmision, FechaCertificacion As DateTime Dim FolioFiscal, NoSerieCertificado, NoSerieCertificadoContribuyente, SelloCFDi, SelloSAT As String FolioFiscal = "" NoSerieCertificado = "" SelloCFDi = "" SelloSAT = "" NoSerieCertificadoContribuyente = "" Dim SerieFolio = String.Format("{0}-{1}", ObjNomina.Serie, ObjNomina.Folio) Dim RutaCBB As String = Ruta & "CBB\" & SerieFolio & ".jpg" Dim ImagenCBB As New System.IO.FileInfo(RutaCBB) Dim ImgCBB = String.Format("{0}://{1}:{2}/Empresas/{3}/CBB/Nomina/{4}.jpg", Request.Url.Scheme, Request.Url.Host, Request.Url.Port, UsuarioActual.CveEmpresa, SerieFolio) Dim RutaFormato As String = String.Format("{0}Formatos\Nomina.rdlc", UsuarioActual.Empresa.Ruta) Dim RutaFormatoDefault As String = String.Format("Empresas\Grales\Formatos\Nomina.rdlc") 'SI ESTA TIMBRADA - CON XML If System.IO.File.Exists(PathXML) Then Dim XmlDoc As New System.Xml.XmlDocument 'XmlDoc.Load(Ruta & "XML\\Nomina\NOM A-3845.xml") XmlDoc.Load(PathXML) FechaEmision = XmlDoc.DocumentElement.Attributes("fecha").InnerText.ToDate NoSerieCertificadoContribuyente = XmlDoc.DocumentElement.Attributes("noCertificado").InnerText For i As Integer = 0 To XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes.Count - 1 If XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes(i).Name = "tfd:TimbreFiscalDigital" Then FolioFiscal = XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes(i).Attributes("UUID").InnerText NoSerieCertificado = XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes(i).Attributes("noCertificadoSAT").InnerText FechaCertificacion = XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes(i).Attributes("FechaTimbrado").InnerText.ToDate SelloCFDi = XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes(i).Attributes("selloCFD").InnerText SelloSAT = XmlDoc.DocumentElement("cfdi:Complemento").ChildNodes(i).Attributes("selloSAT").InnerText End If Next 'SIN TIMBRAR - SIN XML Else FolioFiscal = "Sin Timbrar" NoSerieCertificado = "Sin Timbrar" SelloCFDi = "Sin Timbrar" SelloSAT = "Sin Timbrar" End If Dim CadenaOriginalCFD As String = "||1.0|" + FolioFiscal + "|" + FechaCertificacion.ToString("yyyy-MM-dd") + "T" + FechaCertificacion.ToString("HH:mm:ss") + "|" + SelloCFDi + "|" + NoSerieCertificado + "||" Dim params As New List(Of ReportParameter) 'DATOS DEL EMPLEADO If objPersonal.GetPersonal(CvePersonal, UsuarioActual.CveEmpresa) Then Dim Departamento As DataRow = GlobalDTDepartamentos().FiltraParametros("CveDepartamento = " & objPersonal.CveDepartamento)(0) Dim Puesto As DataRow = GlobalDTRHPuestos(UsuarioActual.CveEmpresa).FiltraParametros($"CvePuesto = {objPersonal.CvePuesto}")(0) Dim TipoContrato As DataRow = GlobalDTTiposContrato().FiltraParametros("CveTipoContrato = " & objPersonal.CveTipoContrato.ToString)(0) params.Add(New ReportParameter("NoEmpleado", objPersonal.Codigo)) params.Add(New ReportParameter("RFC", objPersonal.RFC)) params.Add(New ReportParameter("CURP", objPersonal.CURP)) params.Add(New ReportParameter("NombreCompleto", objPersonal.NombreCompleto)) params.Add(New ReportParameter("Regimen", objPersonal.RegimenContratacion)) params.Add(New ReportParameter("RiesgoPuesto", objPersonal.RiesgoPuesto)) params.Add(New ReportParameter("NSS", objPersonal.NumeroSS)) params.Add(New ReportParameter("Departamento", Departamento("Departamento").ToString)) params.Add(New ReportParameter("Puesto", Puesto("Puesto").ToString)) params.Add(New ReportParameter("Contrato", TipoContrato("TipoContrato").ToString)) params.Add(New ReportParameter("Jornada", objPersonal.Jornada)) params.Add(New ReportParameter("Periodo", ObjNomina.TipoPeriodo)) params.Add(New ReportParameter("SalarioBase", objPersonal.SalarioDiario)) params.Add(New ReportParameter("SalarioDiarioInt", objPersonal.SDI)) params.Add(New ReportParameter("Banco", objPersonal.Banco)) params.Add(New ReportParameter("CLABE", objPersonal.CLABE)) Else TieneError = True End If 'DATOS NOMINA If Not TieneError Then If ObjNomina.GetNom_Nominas(CveNomina, CvePersonal, CvePeriodo, -1, UsuarioActual.CveEmpresa) Then params.Add(New ReportParameter("ReciboNomina", ObjNomina.Folio.ToString)) params.Add(New ReportParameter("Serie", ObjNomina.Serie)) params.Add(New ReportParameter("Fecha", ObjNomina.Fecha)) params.Add(New ReportParameter("Periodo", ObjNomina.TipoPeriodo)) params.Add(New ReportParameter("DiasPagados", ObjNomina.DiasPagados.ToString)) params.Add(New ReportParameter("MetodoPago", ObjNomina.MetodoPago)) params.Add(New ReportParameter("FormaPago", ObjNomina.FormaPago)) params.Add(New ReportParameter("Cantidad", "1")) params.Add(New ReportParameter("Unidad", "SERVICIO")) params.Add(New ReportParameter("Descripcion", "Pago de nómina")) params.Add(New ReportParameter("PU", ObjNomina.SubTotal)) params.Add(New ReportParameter("Importe", ObjNomina.SubTotal)) params.Add(New ReportParameter("SubTotal", ObjNomina.SubTotal)) params.Add(New ReportParameter("Descuentos", ObjNomina.Descuento)) params.Add(New ReportParameter("ISR", ObjNomina.RetISR)) params.Add(New ReportParameter("Total", ObjNomina.Total)) params.Add(New ReportParameter("ImporteLetra", ObjNomina.Total.ToString.ToDouble.Texto2Letras)) params.Add(New ReportParameter("Clave", "")) Else TieneError = True End If End If If Not TieneError Then If ObjNomina.GetPeriodos(-1, UsuarioActual.CveEmpresa, -1, -1, CvePeriodo) Then params.Add(New ReportParameter("FechaInicio", ObjNomina.FechaInicio.ToString("dd/MM/yyyy"))) params.Add(New ReportParameter("FechaFin", ObjNomina.FechaFin.ToString("dd/MM/yyyy"))) Else TieneError = True End If End If 'Timbrado params.Add(New ReportParameter("FolioFiscal", FolioFiscal)) params.Add(New ReportParameter("CertificadoSAT", NoSerieCertificado)) params.Add(New ReportParameter("FechaCertificacion", FechaCertificacion)) params.Add(New ReportParameter("SelloDigitalEmisor", SelloCFDi)) params.Add(New ReportParameter("SelloDigitalSAT", SelloSAT)) params.Add(New ReportParameter("CadenaOriginal", CadenaOriginalCFD)) params.Add(New ReportParameter("QR", ImgCBB)) 'PERCECIONES - DEDUCCIONES If ObjNomina.GetNom_NominasDetalles(CveNomina, CvePersonal, CvePeriodo, "-1") Then dtPercepciones = ObjNomina.DtResultados.FiltraParametros("Tipo = 'P' AND EsPadre = 1") dtDeducciones = ObjNomina.DtResultados.FiltraParametros("Tipo = 'D' AND EsPadre = 1 ") Else dtPercepciones = Nothing dtDeducciones = Nothing End If Dim lrds As New List(Of ReportDataSource) Dim rds As New ReportDataSource rds.Name = "DsOC" rds.Value = dtPercepciones lrds.Add(rds) Dim rds1 As New ReportDataSource rds1.Name = "DataSet1" rds1.Value = dtDeducciones lrds.Add(rds1) Dim Archivo As New System.IO.FileInfo(RutaFormato) If Not TieneError Then If Archivo.Exists Then 'ImprimirPDF(String.Format("{0}Formatos\Nomina.rdlc", UsuarioActual.Empresa.Ruta), lrds, params, String.Format("Nomina {0}-{1}", ObjNomina.Serie.ToString, ObjNomina.Folio.ToString)) StreamPDF(String.Format("{0}Formatos\Nomina.rdlc", UsuarioActual.Empresa.Ruta), lrds, params, String.Format("Nomina {0}-{1}", ObjNomina.Serie.ToString, ObjNomina.Folio.ToString)) End If Else Alert("Ocurrio un error al obtener los datos de la Nomina") End If ObjNomina.Dispose() objPersonal.Dispose() End Sub #End Region #Region "TIMBRADO" Private Function TimbrarNomina12(CveNomina As Integer, CvePersonal As Integer, CvePeriodo As Integer) As String Dim Retorno As String = "" UsuarioActual.Empresa.CvePAC = 2 Dim sw As New Diagnostics.Stopwatch sw.Start() Select Case UsuarioActual.Empresa.CvePAC Case 1 Retorno = False 'TimbrarBIInformNomina12(CveNomina, CvePersonal, CvePeriodo) Case 2 Dim cfdi As CFDITimbre = PreTimbrar(CveNomina, CvePersonal, CvePeriodo) If cfdi IsNot Nothing AndAlso cfdi.Mensaje = "" Then Dim ObjTimbrado As New Timbrado Dim ObjFactura As New Modelos.Factura ObjFactura.TipoDocto = "Nomina" ObjFactura.Folio = cfdi.Comprobante.Folio ObjFactura.Serie = cfdi.Comprobante.Serie ObjFactura.Timbre = cfdi If Not ObjTimbrado.TimbrarFactura(UsuarioActual, ObjFactura, 4) Then Retorno = ObjTimbrado.MensajeErrorCFDI End If 'Retorno = TimbrarFacturaRealVirtual(cfdi, UsuarioActual) If Retorno <> "" Then Retorno = $"{Retorno} - {cfdi.Receptor.Nombre}" Else 'Genero la addenda Ford ' GeneraPDFNuevo(String.Format("{0}XML\Nomina\{1}.xml", Ruta, NominaFolio), CvePersonal, CvePeriodo) End If Else Retorno = $"No se pudo generar el pretimbre:
{cfdi.Mensaje}" End If End Select sw.Stop() GuardaLogTimbrado(sw.ElapsedMilliseconds.ToString, UsuarioActual.Empresa.CvePAC, "Nomina") Return Retorno End Function 'Private Function TimbrarBIInformNomina12(CveNomina As Integer, CvePersonal As Integer, CvePeriodo As Integer) As String ' If UsuarioActual.CveEmpresa = 8 Then ' UsuarioActual.Empresa.FacturaProduccion = True ' End If ' 'UsuarioActual.Empresa.FacturaProduccion = False ' Dim MsgError As String = String.Empty ' Dim CFDi As New ClbNegBICFDv3_2.ClsNegEDI ' CFDi.ObjCompNomina12 = New ClbNegBICFDv3_2.ClsNegComplementoNomina12() ' 'CFDi.ObjCompNomina = New ClbNegBICFDv3_2.ClsNegCompNomina ' Dim objPersonal As New ClsRH ' Dim objNomina As New ClsNominas ' objPersonal.GetPersonal(CvePersonal, UsuarioActual.CveEmpresa) ' objNomina.GetNom_Nominas(CveNomina, CvePersonal, CvePeriodo, -1, UsuarioActual.CveEmpresa) ' Dim Total As Decimal = 0 ' Dim SubTotal As Decimal = 0 ' Dim Descuentos As Decimal = 0 ' Dim RetISR As Decimal = 0 ' Dim TotalExcento As Decimal = 0 ' Dim TotalGravado As Decimal = 0 ' Dim TotalPercepciones As Decimal = 0 ' Dim TotalDeducciones As Decimal = 0 ' Dim TotalOtrosPagos As Decimal = 0 ' Dim Serie As String = objNomina.Serie ' Dim Folio As String = objNomina.Folio.ToString ' Dim NominaFolio As String = Serie & "-" & Folio ' Dim RFC As String = objPersonal.RFC.Trim ' Dim Nombre As String = objPersonal.NombreCompleto.Trim ' Dim Direccion As String = String.Format("{0} {1} {2}", objPersonal.Calle.Trim, objPersonal.NumExt.Trim, objPersonal.NumInt.Trim).Trim ' Dim Ciudad As String = objPersonal.Ciudad.Trim ' Dim Estado As String = objPersonal.Estado.Trim ' Dim CP As String = objPersonal.CP.Trim ' 'Dim TipoContrato As String = GlobalDTTiposContrato.FiltraParametros("CveTipoContrato = " + objPersonal.CveTipoContrato.ToString)(0)("TipoContrato").ToString ' 'Dim TipoPeriodo As String = GlobalDTTipoPeriodo.FiltraParametros("CveTipoPeriodo = " + objPersonal.CveTipoPeriodo.ToString)(0)("TipoPeriodo").ToString ' Dim AntiguedadSemanas As Integer = DateDiff(DateInterval.Weekday, objPersonal.FechaIngreso, Now).ToEntero ' Dim FormatoReciboCFDi As String = objPersonal.FormatoReciboCFDi ' Dim FechaInicio, FechaFin, FechaPago As Date ' Dim DiasPagados As Integer = 0 ' Dim Msg As String = String.Empty ' Dim DiasIncapacitados As Integer = 0 ' Dim DrPeriodo As DataRow = Nothing ' If objNomina.GetPeriodos(-1, UsuarioActual.CveEmpresa, -1, -1, CvePeriodo) Then ' If objNomina.DtResultados.Rows().Count > 0 Then ' DrPeriodo = objNomina.DtResultados.Rows(0) ' End If ' End If ' 'Dim DrPeriodo As DataRow = GlobalDTNominasPeriodos(-1, CvePeriodo, -1).FiltroPrimero("") ' If DrPeriodo IsNot Nothing Then ' FechaInicio = DrPeriodo("FechaInicio").ToString.ToDate ' FechaFin = DrPeriodo("FechaFin").ToString.ToDate ' FechaPago = DrPeriodo("FechaPago").ToString.ToDate ' If objPersonal.GetAsistencias(CvePersonal, -1, -1, -1, -1, -1, FechaInicio, FechaFin, UsuarioActual.CveEmpresa) Then ' Dim Asistencias As Integer = objPersonal.DtResultados.SUM("AplicaAsistencia").ToEntero ' Dim Vacaciones As Integer = objPersonal.DtResultados.SUM("AplicaVacacion").ToEntero ' DiasIncapacitados = objPersonal.DtResultados.SUM("AplicaIncapacidad").ToEntero ' DiasPagados = Asistencias - Vacaciones ' If DiasPagados < 0 Then DiasPagados = 0 ' End If ' End If ' Dim DtPercepciones As Data.DataTable = Nothing ' Dim DtDeducciones As Data.DataTable = Nothing ' Dim DtOtrosPagos As Data.DataTable = Nothing ' If objNomina.GetNom_NominasDetalles(CveNomina, CvePersonal, CvePeriodo, "-1") Then ' If objNomina.DtResultados.Rows.Count > 0 Then ' DtPercepciones = objNomina.DtResultados.FiltraParametros("Tipo = 'P' AND EsPadre = 1 ") ' DtDeducciones = objNomina.DtResultados.FiltraParametros("Tipo = 'D' AND EsPadre = 1 ") ' TotalPercepciones = DtPercepciones.SUM("Importe") ' TotalDeducciones = DtDeducciones.SUM("Importe") ' Total = CType((Total + DtPercepciones.SUM("Importe")), Decimal) ' End If ' End If ' 'Tipo Nomina O de Ordinaria o E de extraordinaria ' 'Dim FechaPago As Date = Now ' Dim TotalSueldos As Decimal = 0 ' Dim TotalIndemnizacion As Decimal = 0 ' Dim TotalJubilacion As Decimal = 0 ' Msg = CFDi.ObjCompNomina12.Cargar("O", FechaPago, FechaInicio, FechaFin, DiasPagados, TotalPercepciones, TotalDeducciones, 0) ' If Msg = String.Empty Then ' If DtPercepciones IsNot Nothing Then ' If DtPercepciones.Rows.Count > 0 Then ' TotalSueldos = DtPercepciones.SUM("Importe", "SATCveConcepto = '001'") ' TotalIndemnizacion = DtPercepciones.SUM("Importe", "SATCveConcepto IN ('022','023','025')") ' https://www.ccpm.org.mx/avisos/nuevo-complemento-de-nomina-version-1.2-puntos-finos-diciembre-2016.pdf ' TotalJubilacion = DtPercepciones.SUM("Importe", "SATCveConcepto IN ('039','044')") 'https://www.ccpm.org.mx/avisos/nuevo-complemento-de-nomina-version-1.2-puntos-finos-diciembre-2016.pdf ' Msg = CFDi.ObjCompNomina12.CargarPercepciones(TotalSueldos, TotalIndemnizacion, TotalJubilacion, DtPercepciones.SUM("ImporteGravado").ToDecimal, DtPercepciones.SUM("ImporteExento").ToDecimal) ' End If ' For Each Row As DataRow In DtPercepciones.Rows ' If Row("Importe").ToString.ToDecimal > 0 Then ' If Row("CveSATConcepto").ToString = "" Then ' Msg = String.Format("Concepto No registrado ({0})", Row("Concepto").ToString) ' Else ' Msg = CFDi.ObjCompNomina12.AgregarPercepcion(Row("SATCveConcepto").ToString, Row("Codigo").ToString, Row("Concepto").ToString, Row("ImporteGravado").ToString.ToDecimal, Row("ImporteExento").ToString.ToDecimal) ' TotalExcento = TotalExcento + Row("ImporteExento").ToString.ToDecimal ' TotalGravado = TotalGravado + Row("ImporteGravado").ToString.ToDecimal ' SubTotal = SubTotal + Row("Importe").ToString.ToDecimal ' End If ' If Msg <> String.Empty Then ' Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Percepcion", New Exception) ' Exit For ' End If ' End If ' 'RMF, falta poner el numero de horas pagadas ' If Row("CveSATConcepto").ToString.ToEntero = 19 Then 'cuando son horas extras ' 'Obtengo el desglose de horas extras ' If objNomina.GetHorasExtras(CvePersonal, CvePeriodo, UsuarioActual.CveEmpresa) Then ' Dim dr As DataRow = objNomina.DtResultados.FiltroPrimero("") ' If dr IsNot Nothing Then ' If dr("HorasDobles").ToString.ToDouble > 0 Then CFDi.ObjCompNomina12.AgregarHorasExtra(dr("DiasHorasDobles").ToString.ToEntero, ClbNegBICFDv3_2.TipoHoras.Dobles, dr("HorasDobles").ToString.ToEntero, Row("Importe").ToString.ToDecimal) ' If dr("HorasTriples").ToString.ToDouble > 0 Then CFDi.ObjCompNomina12.AgregarHorasExtra(dr("DiasHorasTriples").ToString.ToEntero, ClbNegBICFDv3_2.TipoHoras.Triples, dr("HorasTriples").ToString.ToEntero, Row("Importe").ToString.ToDecimal) ' End If ' End If ' End If ' Next ' If Msg = "" Then ' CFDi.ObjCompNomina12.ObjPercepciones.TotalExento = TotalExcento ' CFDi.ObjCompNomina12.ObjPercepciones.TotalGravado = TotalGravado ' End If ' End If ' 'cargo las incapacidades ' If DiasIncapacitados > 0 Then ' If objNomina.GetIncapacidades(CvePersonal, CvePeriodo, UsuarioActual.CveEmpresa) Then ' CFDi.ObjCompNomina12.CargarIncapacidades() ' For Each dr As DataRow In objNomina.DtResultados.Rows ' CFDi.ObjCompNomina12.AgregarIncapacidad(dr("Dias").ToString.ToDecimal, dr("ClaveTipoIncapacidad").ToString.ToEntero, dr("Descuento").ToString.ToDecimal) ' Next ' End If ' End If ' TotalExcento = 0 ' TotalGravado = 0 ' If Msg = String.Empty Then ' If DtDeducciones IsNot Nothing Then ' If DtDeducciones.Rows.Count > 0 Then ' Total = CType((Total - DtDeducciones.SUM("Importe")), Decimal) ' CFDi.ObjCompNomina12.CargarDeducciones(CType(DtDeducciones.SUM("ImporteGravado"), Decimal), CType(DtDeducciones.SUM("ImporteExento"), Decimal)) ' End If ' For Each Row As DataRow In DtDeducciones.Rows ' If Row("Importe").ToString.ToDecimal > 0 Then ' If Row("CveSATConcepto").ToString = "" Then ' Msg = String.Format("Concepto No registrado ({0})", Row("Concepto").ToString) ' Else ' Msg = CFDi.ObjCompNomina12.AgregarDeduccion(Row("SATCveConcepto").ToString, Row("Codigo").ToString, Row("Concepto").ToString, 0) ' TotalExcento = TotalExcento + Row("ImporteExento").ToString.ToDecimal ' TotalGravado = TotalGravado + Row("ImporteGravado").ToString.ToDecimal ' If Row("CveSATConcepto").ToString.ToEntero = 3 Then ' RetISR = RetISR + Row("Importe").ToString.ToDecimal ' Else ' Descuentos = Descuentos + Row("Importe").ToString.ToDecimal ' End If ' End If ' If Msg <> String.Empty Then ' Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Deduccion", New Exception) ' Exit For ' End If ' End If ' Next ' If Msg = "" Then ' If CFDi.ObjCompNomina12.ObjDeducciones IsNot Nothing Then ' CFDi.ObjCompNomina12.ObjDeducciones.TotalOtrasDeducciones = Descuentos ' CFDi.ObjCompNomina12.ObjDeducciones.TotalImpuestosRetenidos = RetISR ' End If ' End If ' End If ' If Msg = String.Empty Then ' If DtOtrosPagos IsNot Nothing Then ' If DtOtrosPagos.Rows.Count > 0 Then ' Total = CType((Total - DtOtrosPagos.SUM("Importe")), Decimal) ' CFDi.ObjCompNomina12.CargarOtrosPagos() ' End If ' For Each Row As DataRow In DtOtrosPagos.Rows ' If Row("Importe").ToString.ToDecimal > 0 Then ' If Row("CveSATConcepto").ToString = "" Then ' Msg = String.Format("Concepto No registrado ({0})", Row("Concepto").ToString) ' Else ' Msg = CFDi.ObjCompNomina12.AgregarOtroPago(Row("SATCveConcepto").ToString, Row("Codigo").ToString, Row("Concepto").ToString, 0) ' 'Msg = CFDi.ObjCompNomina12.CargarSubsidioAlEmpleo(0) ' 'Msg = CFDi.ObjCompNomina12.CargarCompensacionSaldosAFavor(0, 0, 0) ' End If ' If Msg <> String.Empty Then ' Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Otros Pagos", New Exception) ' Exit For ' End If ' End If ' Next ' End If ' If Msg = String.Empty Then ' Dim x As Integer = 0 ' Dim Moneda As String = "MXN" ' Dim LugarExp As String = String.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8} ", SucCalle, SucNoExt, SucNoInt, SucColonia, SucLocalidad, SucMunicipio, SucEstado, SucPais, SucCP) ' Dim FechaFactura As DateTime = Now ' 'Nodo Comprobante ' Dim TipoComprobante As ClbNegBICFDv3_2.TipoDeComprobante = ClbNegBICFDv3_2.TipoDeComprobante.egreso ' Msg = CFDi.comprobantecfd(0, 0, Serie, Folio, FechaFactura, "PAGO EN UNA SOLA EXHIBICION", "CONTADO", SubTotal, Descuentos, "Deducciones nómina", "1", Moneda, Total, objPersonal.MetodoPagoSAT, ClbNegBICFDv3_2.TipoDeComprobante.egreso, LugarExp, "", "", "", New Date(1900, 1, 1), 0) ' If Msg = String.Empty Then ' 'Nodo emisor ' Msg = CFDi.ObjCompNomina12.CargarEmisor("", UsuarioActual.Empresa.RegistroPatronal, UsuarioActual.Empresa.RFC) ' 'If Msg = String.Empty Then Msg = CFDi.EmisorRegimen(UsuarioActual.Empresa.CodigoRegimenFiscal) ' If Msg = String.Empty Then ' 'Nodo Entidad SNCF ' If 1 = 2 Then 'cuando es gobierno ' Msg = CFDi.ObjCompNomina12.CargarEntidadSNCF("", 0) ' End If ' If Msg = String.Empty Then ' 'Nodo Receptor ' Msg = CFDi.ObjCompNomina12.CargarReceptor(objPersonal.CURP, objPersonal.NumeroSS, objPersonal.FechaInicioContrato, AntiguedadSemanas, objPersonal.TipoContrato, "", objPersonal.ClaveTipoJornada, objPersonal.CveRegimenContratacion, objPersonal.Codigo.ToString, ' objPersonal.Departamento, objPersonal.Puesto, objPersonal.CveRiesgoPuesto, objPersonal.TipoPeriodo, objPersonal.ClaveBanco, objPersonal.BancoNumCuenta, Total, objPersonal.SDI.ToString.ToDecimal, objPersonal.ClaveEstado) ' If Msg = String.Empty Then ' 'Nodo SubContratacion ' If 1 = 2 Then Msg = CFDi.ObjCompNomina12.AgregarSubContratacion("", 0) ' If Msg = String.Empty Then ' CFDi.LstCompNomina12.Add(CFDi.ObjCompNomina12) ' Dim HasErrorConceptos As Boolean = False ' 'Dim Importe As Decimal = 0 ' Msg = CFDi.ConceptosCfd(1, "ACT", "", "Pago de nómina", SubTotal, SubTotal) ' 'Timbrado ' 'Web Services de producción: http://biinform.com.mx/srvCFDi/service1.asmx ' 'Web Services de pruebasd: http://biinform.com.mx/srvCFDiPrueba/service1.asmx ' Dim WS As String = String.Empty ' If UsuarioActual.Empresa.FacturaProduccion Then ' WS = "http://portalbiinform.com.mx/srvCFDiPrueba/service1.asmx" ' Else ' WS = "http://portalbiinform.com.mx/srvCFDiPrueba/service1.asmx" ' End If ' If Not System.IO.Directory.Exists(Ruta & "XML\") Then System.IO.Directory.CreateDirectory(Ruta & "XML\") ' If Not System.IO.Directory.Exists(Ruta & "XML\Nomina\") Then System.IO.Directory.CreateDirectory(Ruta & "XML\Nomina\") ' 'Generar Timbre ' 'If UsuarioActual.Empresa.FacturaProduccion Then ' If 1 = 2 Then ' CFDi.Generar(String.Format("{0}Certificados\{1}", Ruta, UsuarioActual.Empresa.ArchivoPfx), ' UsuarioActual.Empresa.ContraseñaKey, ' String.Format("{0}Certificados\{1}", Ruta, UsuarioActual.Empresa.ArchivoCer), ' String.Format("{0}XML\Nomina\{1}.xml", Ruta, NominaFolio), ' String.Format("{0}Certificados\", Ruta), ' UsuarioActual.Empresa.BIUsuario, ' UsuarioActual.Empresa.BIContraseña, ' WS, ' True) ' Else ' If Not System.IO.Directory.Exists(Ruta & "XML\Nomina\Demo\") Then System.IO.Directory.CreateDirectory(Ruta & "XML\Nomina\Demo\") ' 'RutaPruebas & "XML\Demo\" & NominaFolio & ".xml", ' CFDi.Generar(String.Format("{0}Certificados\aaa010101aaa__csd_01.pfx", RutaPruebas), ' "12345678a", ' String.Format("{0}Certificados\aaa010101aaa__csd_01.cer", RutaPruebas), ' String.Format("{0}XML\Nomina\Demo\{1}.xml", Ruta, NominaFolio), ' String.Format("{0}Certificados\", RutaPruebas), ' "prueba", ' "123", ' WS, ' True) ' End If ' If CFDi.MsgError <> String.Empty Then ' 'OnError("Ocurrió un error al generar el timbre: " & CFDi.MsgError, New Exception) ' Dim params As New ActualizaTimbre ' params.Estatus = False ' params.CveNomina = CveNomina ' params.CvePAC = 1 ' 'Dim Hilo As New System.Threading.Thread(AddressOf ActualizaTimbrado) ' 'Hilo.Start(params) ' BtnAutorizar.Enabled = False ' MsgError = "Nombre: " & Nombre & ". Error: " & CFDi.MsgError ' Else ' 'Actualiza Estatus Timbrado ' Dim params As New ActualizaTimbre ' params.Estatus = True ' params.CveNomina = CveNomina ' params.CvePAC = 1 ' 'Dim Hilo As New System.Threading.Thread(AddressOf ActualizaTimbrado) ' 'Hilo.Start(params) ' Dim CBB As New ClbNegBICFDv3_2.ClsNegCBBGenerar() ' Dim FechaCertificacion As DateTime ' Dim FolioFiscal, NoSerieCertificado, NoSerieCertificadoContribuyente, SelloCFDi, SelloSAT As String ' FolioFiscal = CFDi.Timbrado.UUDI 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText ' NoSerieCertificado = CFDi.Timbrado.NoCertificadoSAT ' FechaCertificacion = CFDi.Timbrado.FechaTimbrado ' SelloCFDi = CFDi.Timbrado.SelloCFD ' SelloSAT = CFDi.Timbrado.SelloSAT ' NoSerieCertificadoContribuyente = CFDi.Timbrado.NoCertificado ' ViewState("FolioFiscal") = FolioFiscal ' 'Actualiza Estatus Factura ' CveNominaT = CveNomina ' Dim Rastro As String = String.Format("Nomina: CvePeriodo:{0}, CvePersonal:{1}, UUID: {2}, RFC:{3}", CvePeriodo, CvePersonal, FolioFiscal, objPersonal.RFC) ' Rastro.GuardaLog() ' If FolioFiscal <> "" Then ' 'If UsuarioActual.Empresa.FacturaProduccion Then ' ' Dim ObjNomina2 As New ClsNominas() ' ' ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, CveNomina, SubTotal, Descuentos, RetISR, Total, DiasPagados) ' ' ObjNomina2.Dispose() ' 'End If ' Rastro = "--Estatus" & Rastro ' Rastro.GuardaLog() ' 'Dim Hilo1 As New System.Threading.Thread(AddressOf ActualizaEstatus) ' 'Hilo1.Start(3) ' End If ' Dim RutaCBB As String = String.Empty ' If Not System.IO.Directory.Exists(Ruta & "CBB\") Then System.IO.Directory.CreateDirectory(Ruta & "CBB\") ' If Not System.IO.Directory.Exists(Ruta & "CBB\Nomina\") Then System.IO.Directory.CreateDirectory(Ruta & "CBB\Nomina\") ' If UsuarioActual.Empresa.FacturaProduccion Then ' RutaCBB = Ruta & "CBB\Nomina\" & NominaFolio & ".jpg" ' Else ' If Not System.IO.Directory.Exists(Ruta & "CBB\Nomina\Demo\") Then System.IO.Directory.CreateDirectory(Ruta & "CBB\Nomina\Demo\") ' RutaCBB = Ruta & "CBB\Nomina\Demo\" & NominaFolio & ".jpg" ' End If ' CBB.GenerarCBB(UsuarioActual.Empresa.RFC, RFC, Total, FolioFiscal, RutaCBB) ' 'GeneraPDF(FechaFactura, FolioFiscal, NoSerieCertificado, FechaCertificacion, NoSerieCertificadoContribuyente, TmpDT, SelloCFDi, SelloSAT, RutaCBB, VentaFolio, Ruta & "XML\" & VentaFolio & ".xml", False, CFDi.CadenaOriginal) ' 'GeneraPDF(CveNomina, CvePersonal, CvePeriodo, FechaFactura, FolioFiscal, NoSerieCertificado, FechaCertificacion, NoSerieCertificadoContribuyente, SelloCFDi, SelloSAT, RutaCBB, Ruta & "Nomina\XML\" & NominaFolio & ".xml", False, CFDi.Timbrado.CadenaOriginal, FormatoReciboCFDi) ' GeneraPDFNuevo(String.Format("{0}XML\Nomina\{1}.xml", Ruta, NominaFolio), CvePersonal, CvePeriodo) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorRegimen", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorRegimen", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorDomicilioExpedidoEn", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorDomicilioExpedidoEn", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorDomicilioFiscalCfd", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorDomicilioFiscalCfd", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorCfd", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: EmisorCfd", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre) ' End If ' Else ' 'Me.OnError(String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre), New Exception) ' MsgError = String.Format("El SAT regresó el siguiente mensaje: {0} Nombre: {1}. Objeto: Comprobante", Msg, Nombre) ' End If ' objPersonal.Dispose() ' objNomina.Dispose() ' Return MsgError 'End Function Private Function PreTimbrar(CveNomina As Integer, CvePersonal As Integer, CvePeriodo As Integer) As CFDITimbre Dim cfdi As New CFDITimbre Dim objPersonal As New ClsRH Dim objNomina As New ClsNominas objPersonal.GetPersonal(CvePersonal, UsuarioActual.CveEmpresa) objNomina.GetNom_Nominas(CveNomina, CvePersonal, CvePeriodo, -1, UsuarioActual.CveEmpresa) Dim DtPercepciones As Data.DataTable = Nothing Dim DtDeducciones As Data.DataTable = Nothing Dim DtOtrosPagos As Data.DataTable = Nothing Dim TotalPercepciones As Decimal = 0 Dim TotalDeducciones As Decimal = 0 Dim TotalOtrosPagos As Decimal = 0 Dim Total As Decimal = 0 If objNomina.GetNom_NominasDetalles(CveNomina, CvePersonal, CvePeriodo, "-1") Then If objNomina.DtResultados.Rows.Count > 0 Then DtPercepciones = objNomina.DtResultados.FiltraParametros("Tipo = 'P' AND EsPadre = 1 ") DtDeducciones = objNomina.DtResultados.FiltraParametros("Tipo = 'D' AND EsPadre = 1 ") TotalPercepciones = DtPercepciones.SUM("Importe") TotalDeducciones = DtDeducciones.SUM("Importe") Total = CType((Total + DtPercepciones.SUM("Importe")), Decimal) End If End If 'nota. siempre y cuando halla concepto 19 Dim DtHorasExtras As Data.DataTable = Nothing If objNomina.GetHorasExtras(CvePersonal, CvePeriodo, UsuarioActual.CveEmpresa) Then DtHorasExtras = objNomina.DtResultados End If Dim TotalExcento As Decimal = 0 Dim TotalGravado As Decimal = 0 Dim AntiguedadSemanas As Integer = DateDiff(DateInterval.Weekday, objPersonal.FechaIngreso, Now).ToEntero Dim FormatoReciboCFDi As String = objPersonal.FormatoReciboCFDi Dim FechaInicio, FechaFin, FechaPago As Date Dim DiasPagados As Integer = 0 Dim Msg As String = String.Empty Dim DiasIncapacitados As Integer = 0 Dim DrPeriodo As DataRow = Nothing If objNomina.GetPeriodos(-1, UsuarioActual.CveEmpresa, -1, -1, CvePeriodo) Then If objNomina.DtResultados.Rows().Count > 0 Then DrPeriodo = objNomina.DtResultados.Rows(0) End If End If 'Dim DrPeriodo As DataRow = GlobalDTNominasPeriodos(-1, CvePeriodo, -1).FiltroPrimero("") If DrPeriodo IsNot Nothing Then FechaInicio = DrPeriodo("FechaInicio").ToString.ToDate FechaFin = DrPeriodo("FechaFin").ToString.ToDate FechaPago = DrPeriodo("FechaPago").ToString.ToDate If objPersonal.GetAsistencias(CvePersonal, -1, -1, -1, -1, -1, FechaInicio, FechaFin, UsuarioActual.CveEmpresa) Then Dim Asistencias As Integer = objPersonal.DtResultados.SUM("AplicaAsistencia").ToEntero Dim Vacaciones As Integer = objPersonal.DtResultados.SUM("AplicaVacacion").ToEntero DiasIncapacitados = objPersonal.DtResultados.SUM("AplicaIncapacidad").ToEntero DiasPagados = Asistencias - Vacaciones If DiasPagados < 0 Then DiasPagados = 0 End If End If 'Tipo Nomina O de Ordinaria o E de extraordinaria 'Dim FechaPago As Date = Now Dim TotalSueldos As Decimal = 0 Dim TotalIndemnizacion As Decimal = 0 Dim TotalJubilacion As Decimal = 0 cfdi.Nomina = New CFDINomina cfdi.Nomina.Version = "1.2" cfdi.Nomina.TipoNomina = If(objNomina.CveTipoPeriodo = 6, "E", "O") cfdi.Nomina.FechaPago = FechaPago cfdi.Nomina.FechaInicio = FechaInicio cfdi.Nomina.FechaFin = FechaFin cfdi.Nomina.NumDiasPagados = DiasPagados cfdi.Emisor.Nombre = UsuarioActual.Empresa.Empresa cfdi.Emisor.RFC = UsuarioActual.Empresa.RFC cfdi.Emisor.RegistroPatronal = UsuarioActual.Empresa.RegistroPatronal cfdi.Emisor.RegimenFiscal = UsuarioActual.Empresa.CodigoRegimenFiscal 'aplica persona fisica debe de tener CURP If cfdi.Emisor.RegimenFiscal.Contiene("605", "606", "608", "611", "612", "614", "616", "621", "622", "629", "630", "615") Then cfdi.Emisor.CURP = UsuarioActual.Empresa.CURP End If cfdi.Nomina.CveNomina = CveNomina cfdi.Receptor.UsoCFDI = "P01" cfdi.Receptor.RFC = objPersonal.RFC cfdi.Receptor.Nombre = objPersonal.NombreCompleto If DtPercepciones IsNot Nothing Then If DtPercepciones.Rows.Count > 0 Then Dim ObjPercepciones As New List(Of CFDINominaPercepciones) Dim ObjHorasExtras As New List(Of CFDINominaHorasExtras) Dim ObjOtrosPagos As New List(Of CFDINominaOtrosPagos) For Each Row As DataRow In DtPercepciones.Rows If Row("Importe").ToString.ToDecimal > 0 AndAlso Row("SATCveConcepto").ToString.ToEntero <> 17 Then If Row("CveSATConcepto").ToString = "" Then cfdi.AddMsg(String.Format("Concepto No registrado ({0})", Row("Concepto").ToString)) : Exit For ObjPercepciones.Add(New CFDINominaPercepciones With {.TipoPercepcion = Row("SATCveConcepto").ToString, .Clave = Row("Codigo").ToString, .Concepto = Row("Concepto").ToString, .ImporteGravado = Row("ImporteGravado").ToString.ToDecimal, .ImporteExento = Row("ImporteExento").ToString.ToDecimal} ) End If 'RMF, falta poner el numero de horas pagadas If Row("CveSATConcepto").ToString.ToEntero = 19 Then 'cuando son horas extras 'Obtengo el desglose de horas extras If DtHorasExtras IsNot Nothing Then Dim dr As DataRow = DtHorasExtras.FiltroPrimero("") If dr IsNot Nothing Then If dr("HorasDobles").ToString.ToDouble > 0 Then ObjHorasExtras.Add(New CFDINominaHorasExtras With {.Dias = dr("DiasHorasDobles").ToString.ToEntero, .TipoHoras = "01", .HorasExtra = dr("HorasDobles").ToString.ToEntero, .ImportePagado = Row("Importe").ToString.ToDecimal}) If dr("HorasTriples").ToString.ToDouble > 0 Then ObjHorasExtras.Add(New CFDINominaHorasExtras With {.Dias = dr("DiasHorasTriples").ToString.ToEntero, .TipoHoras = "02", .HorasExtra = dr("HorasTriples").ToString.ToEntero, .ImportePagado = Row("Importe").ToString.ToDecimal}) End If End If End If 'subsidio al empleo If Row("SATCveConcepto").ToString.ToEntero.ToEntero = 17 AndAlso Row("Importe").ToString.ToDecimal > 0 Then 'Subsidio ObjOtrosPagos.Add(New CFDINominaOtrosPagos With {.TipoOtroPago = "002", ' codigo fijo, por ser refernte a subsidio al empleo .Clave = Row("Codigo").ToString, .Concepto = Row("Concepto").ToString, .Importe = Row("Importe").ToString.ToDecimal} ) End If Next If ObjPercepciones IsNot Nothing AndAlso ObjPercepciones.Count > 0 Then cfdi.Nomina.Percepciones = ObjPercepciones If ObjHorasExtras IsNot Nothing AndAlso ObjHorasExtras.Count > 0 Then cfdi.Nomina.HorasExtras = ObjHorasExtras If ObjOtrosPagos IsNot Nothing AndAlso ObjOtrosPagos.Count > 0 Then cfdi.Nomina.OtrosPagos = ObjOtrosPagos End If End If 'cargo las incapacidades If DiasIncapacitados > 0 Then If objNomina.GetIncapacidades(CvePersonal, CvePeriodo, UsuarioActual.CveEmpresa) Then If objNomina.DtResultados IsNot Nothing AndAlso objNomina.DtResultados.Rows.Count > 0 Then Dim ObjIncapacidades As New List(Of CFDINominaIncapacidades) For Each dr As DataRow In objNomina.DtResultados.Rows ObjIncapacidades.Add(New CFDINominaIncapacidades With {.DiasIncapacidad = dr("Dias").ToString.ToEntero, .TipoIncapacidad = dr("ClaveTipoIncapacidad").ToString, .Importe = dr("Descuento").ToString.ToDecimal}) Next If ObjIncapacidades IsNot Nothing AndAlso ObjIncapacidades.Count > 0 Then cfdi.Nomina.Incapacidades = ObjIncapacidades End If End If End If TotalExcento = 0 TotalGravado = 0 If DtDeducciones IsNot Nothing Then If DtDeducciones.Rows.Count > 0 Then Dim ObjDeducciones As New List(Of CFDINominaDeducciones) For Each Row As DataRow In DtDeducciones.Rows If Row("Importe").ToString.ToDecimal > 0 Then If Row("CveSATConcepto").ToString = "" Then cfdi.AddMsg(String.Format("Concepto No registrado ({0})", Row("Concepto").ToString)) : Exit For ObjDeducciones.Add(New CFDINominaDeducciones With {.TipoDeduccion = Row("SATCveConcepto").ToString, .Clave = Row("Codigo").ToString, .Concepto = Row("Concepto").ToString, .Importe = Row("Importe").ToString.ToDecimal} ) End If Next If ObjDeducciones IsNot Nothing AndAlso ObjDeducciones.Count > 0 Then cfdi.Nomina.Deducciones = ObjDeducciones End If End If 'If DtOtrosPagos IsNot Nothing Then ' If DtOtrosPagos.Rows.Count > 0 Then ' ' Total = CType((Total - DtOtrosPagos.SUM("Importe")), Decimal) ' Dim ObjOtrosPagos As New List(Of CFDINominaOtrosPagos) ' ' End If ' ' For Each Row As DataRow In DtOtrosPagos.Rows ' ' If Row("Importe").ToString.ToDecimal > 0 Then ' ' If Row("CveSATConcepto").ToString = "" Then ' ' Msg = String.Format("Concepto No registrado ({0})", Row("Concepto").ToString) ' ' Else ' ' Msg = cfdi.ObjCompNomina12.AgregarOtroPago(Row("SATCveConcepto").ToString, Row("Codigo").ToString, Row("Concepto").ToString, 0) ' ' 'Msg = CFDi.ObjCompNomina12.CargarSubsidioAlEmpleo(0) ' ' 'Msg = CFDi.ObjCompNomina12.CargarCompensacionSaldosAFavor(0, 0, 0) ' ' End If ' ' If Msg <> String.Empty Then ' ' Me.OnError("El SAT regresó el siguiente mensaje: " & Msg & ". Objeto: Otros Pagos", New Exception) ' ' Exit For ' ' End If ' ' End If ' ' Next ' If ObjOtrosPagos IsNot Nothing AndAlso ObjOtrosPagos.Count > 0 Then cfdi.Nomina.OtrosPagos = ObjOtrosPagos ' End If 'End If cfdi.Comprobante.Version = "3.3" cfdi.Comprobante.Serie = objNomina.Serie cfdi.Comprobante.Folio = objNomina.Folio cfdi.Comprobante.Fecha = Now cfdi.Comprobante.Subtotal = cfdi.Nomina.TotalPercepciones + cfdi.Nomina.TotalOtrosPagos cfdi.Comprobante.Descuentos = cfdi.Nomina.TotalDeducciones cfdi.Comprobante.Total = cfdi.Comprobante.Subtotal - cfdi.Comprobante.Descuentos 'cfdi.Nomina.TotalPercepciones + cfdi.Nomina.TotalOtrosPagos - cfdi.Nomina.TotalDeducciones cfdi.Comprobante.MotivoDescuento = "" '"Deducciones nómina" cfdi.Comprobante.Moneda = "MXN" cfdi.Comprobante.TipoComprobante = "N" cfdi.Comprobante.TipoDocto = "Egs" cfdi.Comprobante.MetodoPago = "PUE" cfdi.Comprobante.CondicionesdePago = "" '"CONTADO" cfdi.Comprobante.FormadePago = "99" cfdi.Comprobante.LugarExpedicion = UsuarioActual.Empresa.CP ' AHORITA SOLO SE REQUIERE ESPECIFICAR EL CODIGO POSTAL cfdi.Comprobante.NumCuentaPago = "" 'objPersonal.BancoNumCuenta cfdi.Nomina.Receptor.CURP = objPersonal.CURP cfdi.Nomina.Receptor.NSS = objPersonal.NumeroSS cfdi.Nomina.Receptor.FechaInicioContrato = objPersonal.FechaInicioContrato cfdi.Nomina.Receptor.Antiguedad = $"P{AntiguedadSemanas}W" cfdi.Nomina.Receptor.TipoContrato = objPersonal.CodigoTipoContrato cfdi.Nomina.Receptor.CodigoTipoJornada = objPersonal.ClaveTipoJornada cfdi.Nomina.Receptor.CodigoRegimenContratacion = objPersonal.CveRegimenContratacion cfdi.Nomina.Receptor.CodigoEmpleado = objPersonal.Codigo cfdi.Nomina.Receptor.Departamento = objPersonal.Departamento cfdi.Nomina.Receptor.Puesto = objPersonal.Puesto cfdi.Nomina.Receptor.CodigoRiesgoPuesto = objPersonal.CveSATRiesgoPuesto cfdi.Nomina.Receptor.TipoPeriodo = objPersonal.TipoPeriodoPago cfdi.Nomina.Receptor.CodigoBanco = objPersonal.ClaveBanco cfdi.Nomina.Receptor.NumeroCuenta = objPersonal.BancoNumCuenta cfdi.Nomina.Receptor.SDI = objPersonal.SDI cfdi.Nomina.Receptor.SBC = objPersonal.SDI cfdi.Nomina.Receptor.Sindicalizado = "" cfdi.Nomina.Receptor.CodigoEntidadFederativa = objPersonal.ClaveEstado cfdi.Conceptos.Add(New CFDIConceptos With {.Cantidad = 1, .ClaveUnidad = "ACT", .ClaveProdServ = "84111505", .Descripcion = "Pago de nómina", .ValorUnitario = cfdi.Comprobante.Subtotal, .Importe = cfdi.Comprobante.Subtotal, .Descuento = cfdi.Nomina.TotalDeducciones}) objPersonal.Dispose() objNomina.Dispose() Return cfdi End Function ' Private Function TimbrarFacturaRealVirtual(ObjCFDITimbre As CFDITimbre, UsuarioActual As Usuario) As String ' Dim Retorno As String = "" ' ' 'Sucursal matriz de la empresa ' Dim ArchivoLLave As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoKey}" ' Dim ArchivoCertificado As String = $"{UsuarioActual.Empresa.Ruta}Certificados\{UsuarioActual.Empresa.ArchivoCer}" ' Dim UsuarioServicio As String = UsuarioActual.Empresa.RFC ' Dim ClaveServicio As String = UsuarioActual.Empresa.RFC.ToLower ' Dim Clave As String = UsuarioActual.Empresa.ContraseñaKey ' Dim RFCPrueba As String = "AAA010101AAA" ' Dim UrlServicio As String = "http://generacfdi.com.mx/rvltimbrado/service1.asmx?WSDL" ' Produccion ' Dim RutaArchivo As String = $"{UsuarioActual.Empresa.Ruta}XML\Nomina\" ' Dim NombreArchivoXML As String = $"{ObjCFDITimbre.Comprobante.SerieFolio}" ' Dim SubTotal As Decimal = 0 ' If Not UsuarioActual.Empresa.FacturaProduccion Then ' UsuarioServicio = "fgomez" ' ClaveServicio = "12121212" ' Clave = "12345678a" ' ArchivoLLave = $"{UsuarioActual.Empresa.Ruta}Certificados\aad990814bp7_1210261233s.key" ' ArchivoCertificado = $"{UsuarioActual.Empresa.Ruta}Certificados\aad990814bp7_1210261233s.cer" ' UrlServicio = "http://108.60.211.43/rvltimbrado/service1.asmx" ' End If '#Region "Valida" ' If Not File.Exists(ArchivoCertificado) Then ' Alert("El archivo de certificado no existe", TipoMensaje.MsgError) ' Return False ' End If ' If Not File.Exists(ArchivoLLave) Then ' Alert("El archivo de llave privada no existe", TipoMensaje.MsgError) ' Return False ' End If ' If UsuarioActual.Empresa.ContraseñaKey = "" Then ' Alert("La clave no puede ser vacía", TipoMensaje.MsgError) ' Return False ' End If '#End Region '#Region "Variables" ' Dim llaveByte As Byte(), certByte As Byte() ' Dim llaveBase64 As String, certBase64 As String ' Dim cfdi As New RVCFDI.GeneraCFDI() ' Dim complemento As String = "" ' Dim complementoConcepto As String = "" '#End Region '#Region "Verifica" ' Try ' llaveByte = System.IO.File.ReadAllBytes(ArchivoLLave) ' llaveBase64 = Convert.ToBase64String(llaveByte) ' Catch ex As Exception ' Alert($"Error al leer la llave privada: {ex.Message}", TipoMensaje.MsgError) ' Return False ' End Try ' Try ' certByte = System.IO.File.ReadAllBytes(ArchivoCertificado) ' certBase64 = Convert.ToBase64String(certByte) ' Catch ex As Exception ' Alert($"Error al leer el certificado: {ex.Message}", TipoMensaje.MsgError) ' Return False ' End Try '#End Region ' cfdi.saltarValidacion("bNtMuvZockPVhEjaPj0E") '#Region "Certificado" ' cfdi.agregarCertificado(ArchivoCertificado) '#End Region '#Region "Comprobante" ' cfdi.agregarComprobante(ObjCFDITimbre.Comprobante.Version, ' ObjCFDITimbre.Comprobante.Serie, ' ObjCFDITimbre.Comprobante.Folio, ' ObjCFDITimbre.Comprobante.Fecha.ToString("yyyy-MM-ddTHH:mm:ss"), ' ObjCFDITimbre.Comprobante.FormadePago, ' ObjCFDITimbre.Comprobante.CondicionesdePago, ' ObjCFDITimbre.Comprobante.Subtotal, ' ObjCFDITimbre.Comprobante.Descuentos, ' ObjCFDITimbre.Comprobante.MotivoDescuento, ' ObjCFDITimbre.Comprobante.TipoCambio, ' ObjCFDITimbre.Comprobante.Moneda, ' ObjCFDITimbre.Comprobante.Total, ' ObjCFDITimbre.Comprobante.TipoComprobante, ' ObjCFDITimbre.Comprobante.MetodoPago, ' ObjCFDITimbre.Comprobante.LugarExpedicion, ' ObjCFDITimbre.Comprobante.NumCuentaPago) '#Region "Emisor" ' cfdi.agregarEmisor(If(UsuarioActual.Empresa.FacturaProduccion, UsuarioActual.Empresa.RFC, RFCPrueba), UsuarioActual.Empresa.Empresa) ' cfdi.agregarRegimenFiscal(UsuarioActual.Empresa.CodigoRegimenFiscal) '#End Region '#Region "Receptor" ' cfdi.agregarReceptor(ObjCFDITimbre.Receptor.RFC, ObjCFDITimbre.Receptor.Nombre) '#End Region '#Region "Conceptos" ' 'Nodo conceptos, se agregan los PS ' If ObjCFDITimbre.Conceptos IsNot Nothing AndAlso ObjCFDITimbre.Conceptos.Count > 0 Then ' For Each concep As CFDIConceptos In ObjCFDITimbre.Conceptos ' cfdi.agregarConcepto(concep.Cantidad, concep.Unidad, concep.Noidentificacion, concep.Descripcion, concep.ValorUnitario, concep.Importe) ' Next ' End If '#End Region '#Region "Impuestos" ' cfdi.agregarImpuestos(0, 0) '#End Region ' '#Region "Retenciones" ' 'cfdi.agregarRetencion("IVA", 0) ' ' If Ventas.RetISRTC > 0 Then cfdi.agregarRetencion("ISR", Ventas.RetISRTC) ' '#End Region ' '#Region "Traslados" ' ' cfdi.agregarTraslado("IVA", CDec(16.0), Ventas.IVATC) ' ' If Ventas.IEPS > 0 Then cfdi.agregarTraslado("IEPS", 10, Ventas.IEPS) ' '#End Region '#Region "Nomina12" ' Try ' cfdi._agregadoNomina12 = True ' cfdi.Esquema.AgregarEsquema("http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd") ' cfdi.agregarNomina12(ObjCFDITimbre.Nomina.Version, ObjCFDITimbre.Nomina.TipoNomina, ObjCFDITimbre.Nomina.FechaPago, ObjCFDITimbre.Nomina.FechaInicio, ObjCFDITimbre.Nomina.FechaFin, ObjCFDITimbre.Nomina.NumDiasPagados, ObjCFDITimbre.Nomina.TotalPercepciones, ObjCFDITimbre.Nomina.TotalDeducciones, ObjCFDITimbre.Nomina.TotalOtrosPagos) ' cfdi.agregarNominaEmisor12(ObjCFDITimbre.Emisor.CURP, ObjCFDITimbre.Emisor.RegistroPatronal, ObjCFDITimbre.Emisor.RFC) ' If UsuarioActual.Empresa.UsaAC Then cfdi.agregarNominaEmisorEntidadSNCF12("IF", "90") ' If ObjCFDITimbre.Nomina.Percepciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Percepciones.Count > 0 Then ' Dim TotalIndemnizacion As String = If(ObjCFDITimbre.Nomina.TotalIndemnizacion > 0, ObjCFDITimbre.Nomina.TotalIndemnizacion.ToString, "") ' Dim TotalJubilacion As String = If(ObjCFDITimbre.Nomina.TotalJubilacion > 0, ObjCFDITimbre.Nomina.TotalJubilacion.ToString, "") ' cfdi.agregarNominaPercepciones12(ObjCFDITimbre.Nomina.TotalSueldos, TotalIndemnizacion, TotalJubilacion, ObjCFDITimbre.Nomina.TotalPercepcionesGravado, ObjCFDITimbre.Nomina.TotalPercepcionesExento) ' For Each percep As CFDINominaPercepciones In ObjCFDITimbre.Nomina.Percepciones ' cfdi.agregarNominaPercepcionesPercepcion12(percep.TipoPercepcion, percep.Clave, percep.Concepto, Math.Round(percep.ImporteGravado, 2), Math.Round(percep.ImporteExento, 2)) ' Next ' End If ' 'cfdi.agregarNominaReceptorSubContratacion12("AAD990814BP6", "50") ' 'cfdi.agregarNominaPercepcionesPercepcionAccionesOTitulos12("100", "200"); ' 'cfdi.agregarNominaPercepcionesSeparacionIndemnizacion12("100", "10", "1000", "100", "50"); ' 'cfdi.agregarNominaPercepcionesJubilacionPensionRetiro12("50", "100", "10", "100", "0"); ' If ObjCFDITimbre.Nomina.HorasExtras IsNot Nothing AndAlso ObjCFDITimbre.Nomina.HorasExtras.Count > 0 Then ' For Each HoraExtra As CFDINominaHorasExtras In ObjCFDITimbre.Nomina.HorasExtras ' cfdi.agregarNominaPercepcionesPercepcionHorasExtra12(HoraExtra.Dias, HoraExtra.TipoHoras, HoraExtra.HorasExtra, HoraExtra.ImportePagado) ' Next ' End If ' If ObjCFDITimbre.Nomina.Incapacidades IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Incapacidades.Count > 0 Then ' For Each Incap As CFDINominaIncapacidades In ObjCFDITimbre.Nomina.Incapacidades ' cfdi.agregarNominaIncapacidadesIncapacidad12(Incap.DiasIncapacidad, Incap.TipoIncapacidad, Incap.Importe) ' Next ' End If ' If ObjCFDITimbre.Nomina.Deducciones IsNot Nothing AndAlso ObjCFDITimbre.Nomina.Deducciones.Count > 0 Then ' cfdi.agregarNominaDeducciones12(ObjCFDITimbre.Nomina.TotalDeduccionesOtras, Math.Round(ObjCFDITimbre.Nomina.TotalDeduccionesImpuestosRetenidos, 2)) ' For Each deduc As CFDINominaDeducciones In ObjCFDITimbre.Nomina.Deducciones ' cfdi.agregarNominaDeduccionesDeduccion12(deduc.TipoDeduccion, deduc.Clave, deduc.Concepto, Math.Round(deduc.Importe, 2)) ' Next ' End If ' If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing Then ' ' cfdi.agregarNominaOtrosPagosOtroPago12("002", "002", "Subsidio", "10.00"); ' ' cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12("10.00"); ' If ObjCFDITimbre.Nomina.OtrosPagos IsNot Nothing AndAlso ObjCFDITimbre.Nomina.OtrosPagos.Count > 0 Then ' For Each otpag As CFDINominaOtrosPagos In ObjCFDITimbre.Nomina.OtrosPagos ' cfdi.agregarNominaOtrosPagosOtroPago12(otpag.TipoOtroPago, otpag.Clave, otpag.Concepto, otpag.Importe) ' If otpag.TipoOtroPago = "002" Then ' cfdi.agregarNominaOtrosPagosOtroPagoSubsidioAlEmpleo12(otpag.Importe) ' End If ' Next ' End If ' End If '#Region "Receptor" ' cfdi.agregarNominaReceptor12(ObjCFDITimbre.Nomina.Receptor.CURP, ' ObjCFDITimbre.Nomina.Receptor.NSS, ' ObjCFDITimbre.Nomina.Receptor.FechaInicioContrato, ' ObjCFDITimbre.Nomina.Receptor.Antiguedad, ' ObjCFDITimbre.Nomina.Receptor.TipoContrato, ' ObjCFDITimbre.Nomina.Receptor.Sindicalizado, ' ObjCFDITimbre.Nomina.Receptor.CodigoTipoJornada, ' ObjCFDITimbre.Nomina.Receptor.CodigoRegimenContratacion, ' ObjCFDITimbre.Nomina.Receptor.CodigoEmpleado, ' ObjCFDITimbre.Nomina.Receptor.Departamento, ' ObjCFDITimbre.Nomina.Receptor.Puesto, ' ObjCFDITimbre.Nomina.Receptor.CodigoRiesgoPuesto, ' ObjCFDITimbre.Nomina.Receptor.TipoPeriodo, ' ObjCFDITimbre.Nomina.Receptor.CodigoBanco, ' ObjCFDITimbre.Nomina.Receptor.NumeroCuenta, ' ObjCFDITimbre.Nomina.Receptor.SBC, ' ObjCFDITimbre.Nomina.Receptor.SDI, ' ObjCFDITimbre.Nomina.Receptor.CodigoEntidadFederativa) '#End Region '#End Region ' 'String banco = cfdi.buscarClaveCatalogo("c_Banco", "BANAMEX"); '#End Region '#Region "Genera XML" ' Try ' cfdi.generaXMLBase64(llaveBase64, Clave) ' cfdi.escribirXML(cfdi.Xml, RutaArchivo, NombreArchivoXML) ' Catch ex As Exception ' End Try '#End Region '#Region "Timbra" ' cfdi.timbrar(UsuarioServicio, ClaveServicio, UrlServicio, RutaArchivo, NombreArchivoXML) '#End Region ' 'Verifica el error ' If cfdi.CodigoError = 0 Then ' Dim FechaCertificacion As DateTime ' Dim FolioFiscal, NoSerieCertificado, NoSerieCertificadoContribuyente, SelloCFDi, SelloSAT As String ' FolioFiscal = obtenerAtributo(cfdi.Xml, "TimbreFiscalDigital", "UUID") 'XmlDoc.DocumentElement("cfdi:Complemento").FirstChild.Attributes("UUID").InnerText ' NoSerieCertificado = obtenerAtributo(cfdi.Xml, "Comprobante", "noCertificado") ''++Pendiente ' FechaCertificacion = obtenerAtributo(cfdi.Xml, "TimbreFiscalDigital", "FechaTimbrado").ToDate ' SelloCFDi = cfdi.SelloEmisor ' SelloSAT = cfdi.SelloSat ' NoSerieCertificadoContribuyente = obtenerAtributo(cfdi.Xml, "TimbreFiscalDigital", "noCertificadoSAT") ''++Pendiente ' If FolioFiscal <> "" Then ' ''Actualiza Estatus Factura ' If UsuarioActual.Empresa.FacturaProduccion Then ' Dim ObjNomina2 As New ClsNominas() ' ObjNomina2.UpdateEstatusNomNominas(3, UsuarioActual.Empresa.CvePAC, FolioFiscal, "", ("01/01/2000").ToDate, ObjCFDITimbre.Nomina.CveNomina, 0, 0, 0, 0, 0) ' ObjNomina2.Dispose() ' End If ' 'Dim ObjVentas As New ClsVentas() ' 'Retorno = ObjVentas.UpdateEstatusFactura(3, FolioFiscal, "", Now, Ventas.CveVenta, CvePAC:=UsuarioActual.Empresa.CvePAC) ' 'ObjVentas.Dispose() ' If Not Directory.Exists(Ruta & "CBB\") Then Directory.CreateDirectory(Ruta & "CBB\") ' If Not Directory.Exists(Ruta & "CBB\Nomina\") Then Directory.CreateDirectory(Ruta & "CBB\Nomina\") ' Dim RutaCBB As String = $"{Ruta}CBB\Nomina\{ObjCFDITimbre.Comprobante.SerieFolio}.jpg" ' Dim b As Byte() = cfdi.ConvertirQrCode($"?re={UsuarioActual.Empresa.RFC}&rr={ObjCFDITimbre.Receptor.RFC}&tt={String.Format("{0,12:F6}", ObjCFDITimbre.Comprobante.Total).Trim()}&id={FolioFiscal}") ' File.WriteAllBytes(RutaCBB, b) ' Retorno = "" ' Else ' Retorno = "No se pudo timbrar ante el SAT. UUID no generado." ' End If ' Else ' Retorno = cfdi.MensajeError ' End If ' Catch ex As Exception ' Retorno = "Error al registrar nómina" ' End Try ' Return Retorno ' End Function 'Private Function obtenerAtributo(cadena_xml As String, nodo As String, nombre_atributo As String) As String ' Try ' 'Variables ' Dim valor As String ' Dim inicio As Integer = 0 ' Dim fin As Integer = 0 ' Dim inicionodo As Integer = cadena_xml.IndexOf(nodo) ' If inicionodo = -1 Then ' Return "" ' End If ' 'Buscamos inicio ' inicio = cadena_xml.IndexOf((Convert.ToString(" ") & nombre_atributo) + "=""", inicionodo) + nombre_atributo.Length + 3 ' 'Buscamos el final ' fin = cadena_xml.IndexOf("""", inicio) ' 'Cortamos la cadena ' valor = cadena_xml.Substring(inicio, fin - inicio) ' 'Retorna el valor ' Return valor ' Catch ' Return "" ' End Try 'End Function Private Sub ActualizaTimbrado(Data As Object) Dim Parametros As ActualizaTimbre = CType(Data, ActualizaTimbre) Dim ObjNomina As New ClsNominas() ObjNomina.UpdateNom_NominasTimbre(Parametros.Estatus, Parametros.CveNomina) ObjNomina.Dispose() End Sub Private Sub ActualizaCadenaOriginal(CadenaOriginal As Object) Dim ObjNomina As New ClsNominas() ObjNomina.UpdateNom_NominaCadenaOriginal(CadenaOriginal.ToString, CveNominaT) ObjNomina.Dispose() End Sub Private Sub ActualizaEstatus(CveEstatus As Object) 'If UsuarioActual.Empresa.FacturaProduccion Then ' Dim ObjNomina As New ClsNominas() ' ObjNomina.UpdateEstatusNom_Nominas(CInt(CveEstatus), FolioFiscal, "", Now, CveNominaT) ' ObjNomina.Dispose() 'End If End Sub #End Region #Region " DESCARGAR ZIP PDF, XML" Private Sub ImgDownZip_Click(sender As Object, e As EventArgs) Handles ImgDownZip.Click Dim pathXML As String Dim pathPDF As String 'Using archive As ZipArchive = Compression.ZipFile.Open(String.Format("{0}nomina.zip", UsuarioActual.Empresa.Ruta), ZipArchiveMode.Create) ' For Each gvr As GridViewRow In GVDatos.Rows ' If gvr.DataKey("CvePersonal").ToEntero > 0 Then ' pathXML = Server.MapPath(String.Format("~/Empresas/{0}/XML/Nomina/{1}.xml", UsuarioActual.CveEmpresa, gvr.DataKey("SerieFolio").ToString)) ' pathPDF = Server.MapPath(String.Format("~/Empresas/{0}/PDF/Nomina/{1}.pdf", UsuarioActual.CveEmpresa, gvr.DataKey("SerieFolio").ToString)) ' If IO.File.Exists(pathXML) Then ' archive.CreateEntryFromFile(pathXML, String.Format("{0}.xml", gvr.DataKey("SerieFolio").ToString)) ' End If ' If IO.File.Exists(pathPDF) Then ' archive.CreateEntryFromFile(pathPDF, String.Format("{0}.pdf", gvr.DataKey("SerieFolio").ToString)) ' End If ' End If ' Next 'End Using 'D E S C A R G A I O N I C ! Dim DescargaZIP As Ionic.Zip.ZipFile = New Ionic.Zip.ZipFile() Using DescargaZIP For Each gvr As GridViewRow In GVDatos.Rows If gvr.DataKey("CvePersonal").ToEntero > 0 Then pathXML = Server.MapPath(String.Format("~/Empresas/{0}/XML/Nomina/{1}.xml", UsuarioActual.CveEmpresa, gvr.DataKey("SerieFolio").ToString)) pathPDF = Server.MapPath(String.Format("~/Empresas/{0}/PDF/Nomina/{1}.pdf", UsuarioActual.CveEmpresa, gvr.DataKey("SerieFolio").ToString)) If IO.File.Exists(pathXML) Then DescargaZIP.AddFile(pathXML, "") End If If IO.File.Exists(pathPDF) Then DescargaZIP.AddFile(pathPDF, "") End If End If Next DescargaZIP.Save(Response.OutputStream) End Using Response.AddHeader("content-Disposition", "attachment; filename=NominaTimbrado.zip") Response.ContentType = "application/zip" Response.End() End Sub #End Region Protected Sub LnkCorreos_Click(sender As Object, e As EventArgs) EnvioMasivoCorreo() End Sub Private Sub EnvioMasivoCorreo() If GVDatos.Rows.Count > 0 Then Dim Periodo As Integer = DdlPeriodo.SelectedValue.ToEntero Dim objNommina As New ClsNominas objNommina.GetPeriodos(-1, UsuarioActual.Empresa.CveEmpresa, -1, -1, Periodo) Dim DT As DataTable = objNommina.DtResultados Dim FechaI = DT.Rows(0)("FechaInicio").ToString.ToDate.ToShortDateString Dim FechaF = DT.Rows(0)("FechaFin").ToString.ToDate.ToShortDateString objNommina.Dispose() For Each gvr As GridViewRow In GVDatos.Rows If gvr.DataKey("SeTimbro") = "True" Then Dim NombreComercial As String = UsuarioActual.Empresa.Empresa Dim SerieFolio As String = gvr.DataKey("SerieFolio") Dim Personal As String = gvr.DataKey("Nombre") Dim Destinatario As String = gvr.DataKey("Correo") Dim cvePeriodo = gvr.DataKey("CvePeriodo").ToString.ToEntero Dim CvePersonal = gvr.DataKey("CvePersonal").ToString.ToEntero MandaCorreo(NombreComercial, SerieFolio, Destinatario, Personal, FechaI, FechaF, cvePeriodo, CvePersonal) End If Next Alert("Envio de Correos exitoso", TipoMensaje.MsgInformacion) Else Alert("Favor de Carga un Periodo", TipoMensaje.MsgError) End If End Sub End Class #Region "Nomina" #End Region