Imports DevExpress.Xpf.Editors Imports DevExpress.Xpf.LayoutControl Imports tsWPFCore Imports System.ComponentModel Imports System.Data Imports DevExpress.Xpf.Editors.Validation Imports DevExpress.Xpf.Editors.Helpers Imports DevExpress.Xpf.Core Imports System.Data.Common Imports DevExpress.Xpf.Bars Imports DevExpress.Xpf.Grid Imports System.IO Imports DevExpress.Spreadsheet Imports Microsoft.Win32 Imports System.Drawing Imports tsWPFCore.Comun Imports bdGrupoSanchoToro.db Imports bdGrupoSanchoToro.db.Utilidades Imports tsUtilidades Public Class ucEjercicioContable Private bd As tscGrupoSanchoToro Friend _idEjercicio As Nullable(Of Integer) ' Public Overrides Sub Cargado() Me.Tipo_ucControlBusqueda = GetType(ucEjerciciosContables) End Sub Dim ra As ejercicioscontables Public Overrides Function EstablecedcPrincipal(Optional Background As Boolean = False, Optional FuerzaNuevo As Boolean = False, Optional Refrescar As Boolean = False) As EstadosAplicacion Try Dim NuevoEstado As EstadosAplicacion If FuerzaNuevo OrElse _idEjercicio Is Nothing Then ra = New bdGrupoSanchoToro.db.ejercicioscontables ra.FechaApertura = DateOnly.FromDateTime(Now) Dim Anno As Integer = Now.Year If Now.Month > 1 Then Anno += 1 ra.Descripcion = Anno.ToString ra.FechaInicio = New DateOnly(Anno, 1, 1) ra.FechaFin = New DateOnly(Anno, 12, 31) ra.idEmpresa = bd.empresas.First(Function(x) x.FechaBaja.HasValue = False).idEmpresa Me.DataContext = ra _idEjercicio = Nothing ' ra.idEjercicio = Nothing NuevoEstado = EstadosAplicacion.Nuevo tsUserControl.EstableceSoloLectura(Me.cbEmpresa, False) Else ra = bd.ejercicioscontables.First(Function(x) x.idEjercicio = _idEjercicio) NuevoEstado = EstadosAplicacion.ModificandoRegistro tsUserControl.EstableceSoloLectura(Me.cbEmpresa, ra.cuentas.Count > 0 Or ra.asientos.Count > 0) End If Me.DataContext = ra gcAsientos.ItemsSource = ra.asientos If cbNivel.ItemsSource Is Nothing Then cbNivel.ItemsSource = bdGrupoSanchoToro.db.cuentas.ListadoGruposCuentas cbNivel.EditValue = cuentas.LongitudCuentaFinal Else ' If Not DXSplashScreen.IsActive Then DXSplashScreen.Show(Of tsWPF.SplashScreenTecnosis)() ' DXSplashScreen.SetState("Obteniendo cuentas ...") ObtieneCuentas(ra) ' If DXSplashScreen.IsActive Then DXSplashScreen.Close() End If Return NuevoEstado Catch ex As Exception If DXSplashScreen.IsActive Then DXSplashScreen.Close() FuncionesDinamicas.ErrorNoControladoAp(Me, ex) DXMessageBox.Show(ex.Message, "Error") Return EstadosAplicacion.SinDatos End Try End Function Public Overrides Function ObtieneBD() As tsUtilidades.ItsContexto bd = tscGrupoSanchoToro.NuevoContexto() Return bd End Function Public Overrides ReadOnly Property NombreTablaBase As String Get Return "ejercicioscontables" End Get End Property Public Overrides ReadOnly Property idRegistroAplicacionActual As String Get If Estado = EstadosAplicacion.Nuevo Then Me.cbEmpresa.ItemsSource = bd.empresas.Where(Function(x) x.FechaBaja.HasValue = False) Return "Entidad.Nuevo" Else Me.cbEmpresa.ItemsSource = bd.empresas.ToList Return "Ejercicio." & DirectCast(Me.DataContext, ejercicioscontables).Descripcion.ToString End If End Get End Property Public Overrides ReadOnly Property DescripcionRegistro As String Get Return "Ejercicio Contable" End Get End Property Public Sub New(Optional idEjercicio As Integer? = Nothing) ' Llamada necesaria para el diseñador. InitializeComponent() _idEjercicio = idEjercicio ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). End Sub Public Overrides Sub EstableceTitulo() If Me.docpanel Is Nothing Then Dim w As dxwGenerica = Window.GetWindow(Me) w.Title = "Agregar nuevo ejercicio" Else If Me.Estado = EstadosAplicacion.ModificandoRegistro Then Me.docpanel.Caption = "Ejercicio " & ra.Descripcion Me.docpanel.Tag = "Ejercicio." & ra.Descripcion Else Me.docpanel.Caption = "Ejercicio Nuevo" Me.docpanel.Tag = "Ejercicio.Nuevo" End If End If End Sub Public Overrides Function ObtienePermisos() As tsUtilidades.Permisos Return Comun.ObtienePermisos(Me.bd, "AP.CONTABILIDAD", idUsuario) End Function 'Public Overrides Function ObtieneConexionBD() As BBDD ' Return bdGrupoSanchoToro.gestionasegasaEntities.bdga 'End Function Private Sub ap_ValidarControl(sender As Object, e As ValidationEventArgs, ByRef ev As ErrorValidacion, ByRef ValorOriginalCambiado As Object) Handles Me.ValidarControl Dim pts As PropiedadesTS = sender.parent.propiedadests If Not pts Is Nothing Then Dim ra As ejercicioscontables = Me.DataContext End If End Sub Private Sub ObtieneCuentas(ra As ejercicioscontables) Try If Not DXSplashScreen.IsActive Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Obteniendo cuentas ...") Dim Nivel As Integer = cbNivel.EditValue Dim ctas = bdGrupoSanchoToro.db.vf_cuentas.Obtiene_vf_cuentas(bd, ra.idEjercicio, Nivel) gcCuentas.ItemsSource = ctas If DXSplashScreen.IsActive Then DXSplashScreen.Close() Catch ex As Exception If DXSplashScreen.IsActive Then DXSplashScreen.Close() FuncionesDinamicas.ErrorNoControladoAp(Me, ex) DXMessageBox.Show(ex.Message, "Error") End Try End Sub Private Sub cbNivel_EditValueChanged(sender As Object, e As EditValueChangedEventArgs) Handles cbNivel.EditValueChanged ObtieneCuentas(ra) End Sub Private Sub HlAsientoRegularizacion_Click(sender As Object, e As RoutedEventArgs) Dim id = DirectCast(Me.DataContext, ejercicioscontables).AsientoRegularizacion.idAsiento FuncionesDinamicas.AbrirAP(New ucDiario(id), OtrosParametros) End Sub Public Overrides Sub EstableceDataContextSecundarios(Optional Background As Boolean = False) Dim Acciones As New List(Of tsWPFCore.Accion) Acciones.Add(New Accion With { .idAccion = 1, .Descripcion = "GENERA ASIENTO DE REGULARIZACIÓN Y DE APERTURA"}) Acciones.Add(New Accion With { .idAccion = 2, .Descripcion = "REENUMERA Nº ASIENTO OFICIAL"}) Acciones.Add(New Accion With { .idAccion = 3, .Descripcion = "GENERA BALANCE DE SITUACION"}) Me.ContenedorAplicacion.cbAcciones.ItemsSource = Acciones If Acciones.Count > 0 Then Me.ContenedorAplicacion.beAcciones.EditValue = Acciones.First.idAccion End Sub Private Sub HlAsientoApertura_Click(sender As Object, e As RoutedEventArgs) Dim id = DirectCast(Me.DataContext, ejercicioscontables).AsientoApertura.idAsiento FuncionesDinamicas.AbrirAP(New ucDiario(id), OtrosParametros) End Sub Private Sub ap_Enlazar(Celda As EditGridCellData, Defecto As Boolean) Handles Me.Enlazar Select Case Celda.Column.FieldName.ToLower Case "idasiento" Dim id As Integer = DirectCast(Me.gcAsientos.CurrentItem, asientos).idAsiento FuncionesDinamicas.AbrirAP(New ucDiario(id), OtrosParametros) Case "idcuenta" Dim id As Integer = DirectCast(Me.gcCuentas.CurrentItem, vf_cuentas).idCuenta FuncionesDinamicas.AbrirAP(New ucCuenta(id), OtrosParametros) End Select End Sub Private Sub ap_DespuesGuardar(sender As Object, e As ItemClickEventArgs, OpcionGuardado As Integer) Handles Me.DespuesGuardar Dim NuevoEjercicio As ejercicioscontables = ra _idEjercicio = NuevoEjercicio.idEjercicio If NuevoEjercicio.FechaCierre.HasValue = False AndAlso NuevoEjercicio.FechaApertura.Year = Now.Year Then Dim ea = bd.ejercicioscontables.OrderByDescending(Function(x) x.FechaInicio).FirstOrDefault(Function(x) x.FechaInicio < NuevoEjercicio.FechaInicio) If DXMessageBox.Show("¿Desea copiar las cuentas del Ejercicio Anterior?", "Atención", vbYesNo) = MessageBoxResult.Yes Then CopiaCuentas(NuevoEjercicio) RefrescaUC(True) End If End If End Sub Friend Sub CopiaCuentas(NuevoEjercicio As ejercicioscontables) Try Dim ea = bd.ejercicioscontables.OrderByDescending(Function(x) x.FechaInicio).FirstOrDefault(Function(x) x.FechaInicio < NuevoEjercicio.FechaInicio) If ea IsNot Nothing Then If Not DXSplashScreen.IsActive Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Copiando Cuentas del Ejercicio " & ea.Descripcion & " ...") Dim ctas1 = ea.cuentas.Where(Function(x) x.NumeroCuenta.Length = 1).ToList Dim ctas2 = ea.cuentas.Where(Function(x) x.NumeroCuenta.Length = 2).ToList Dim ctas3 = ea.cuentas.Where(Function(x) x.NumeroCuenta.Length = 3).ToList Dim ctas4 = ea.cuentas.Where(Function(x) x.NumeroCuenta.Length = 4).ToList Dim ctas8 = ea.cuentas.Where(Function(x) x.NumeroCuenta.Length = 8).ToList Dim Nc As Integer = 0 For Each cta In ctas1 Nc += CopiaCuenta(bd, NuevoEjercicio, cta) Next For Each cta In ctas2 Nc += CopiaCuenta(bd, NuevoEjercicio, cta) Next For Each cta In ctas3 Nc += CopiaCuenta(bd, NuevoEjercicio, cta) Next For Each cta In ctas4 Nc += CopiaCuenta(bd, NuevoEjercicio, cta) Next For Each cta In ctas8 Nc += CopiaCuenta(bd, NuevoEjercicio, cta) Next bd.GuardarCambios() DXSplashScreen.Close() 'DXMessageBox.Show("Se han copiado " & (ctas1.Count + ctas2.Count + ctas3.Count + ctas4.Count + ctas8.Count).ToString & " Cuentas", "Información") DXMessageBox.Show("Se han copiado " & Nc.ToString, "Información") End If Catch ex As Exception FuncionesDinamicas.ErrorNoControladoAp(Me, ex) If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show(ex.Message, "Error") Finally If DXSplashScreen.IsActive Then DXSplashScreen.Close() End Try End Sub Friend Function CopiaCuenta(bdtmp As tscGrupoSanchoToro, NuevoEjercicio As ejercicioscontables, CtaAnterior As cuentas, Optional ByRef CuentaNueva As cuentas = Nothing) As Integer If Not NuevoEjercicio.cuentas.Any(Function(X) X.NumeroCuenta = CtaAnterior.NumeroCuenta) Then Dim nc As New cuentas nc.Denominacion = CtaAnterior.Denominacion nc.EsCuentaFinal = CtaAnterior.EsCuentaFinal nc.Mote = CtaAnterior.Mote nc.Observaciones = CtaAnterior.Observaciones nc.NumeroCuenta = CtaAnterior.NumeroCuenta nc.idEjercicio = NuevoEjercicio.idEjercicio nc.idEmpresaAmortizacion = CtaAnterior.idEmpresaAmortizacion nc.PresupuestoEnero = CtaAnterior.PresupuestoEnero nc.PresupuestoFebrero = CtaAnterior.PresupuestoFebrero nc.PresupuestoMarzo = CtaAnterior.PresupuestoMarzo nc.PresupuestoAbril = CtaAnterior.PresupuestoAbril nc.PresupuestoMayo = CtaAnterior.PresupuestoMayo nc.PresupuestoJunio = CtaAnterior.PresupuestoJunio nc.PresupuestoJulio = CtaAnterior.PresupuestoJulio nc.PresupuestoAgosto = CtaAnterior.PresupuestoAgosto nc.PresupuestoSeptiembre = CtaAnterior.PresupuestoSeptiembre nc.PresupuestoOctubre = CtaAnterior.PresupuestoOctubre nc.PresupuestoNoviembre = CtaAnterior.PresupuestoNoviembre nc.PresupuestoDiciembre = CtaAnterior.PresupuestoDiciembre bdtmp.cuentas.Add(nc) CuentaNueva = nc Return 1 Else CuentaNueva = Nothing Return 0 End If End Function Friend Sub ReenumeraAsientosOficiales() Try If Estado = EstadosAplicacion.Nuevo Then DXMessageBox.Show("No se puede realizar esta operación en ejercicios nuevos", "Atención") Else bd = bdGrupoSanchoToro.tscGrupoSanchoToro.NuevoContexto Dim ejact As ejercicioscontables = bd.ejercicioscontables.Where(Function(x) x.idEjercicio = ra.idEjercicio) Dim asap = bd.asientos.FirstOrDefault(Function(x) x.idEjercicio = ejact.idEjercicio AndAlso x.Tipo = bdGrupoSanchoToro.db.asientos.TipoAsiento.APERTURA) Dim asci = bd.asientos.FirstOrDefault(Function(x) x.idEjercicio = ejact.idEjercicio And x.Tipo = bdGrupoSanchoToro.db.asientos.TipoAsiento.REGULARIZACION) bd.Database.ExecuteSqlRaw("UPDATE ASIENTOS SET NumeroAsiento=null where idEjercicio=" & ejact.idEjercicio.ToString & ";") Dim asn = bd.asientos.Where(Function(x) x.idEjercicio = ejact.idEjercicio And x.Tipo = bdGrupoSanchoToro.db.asientos.TipoAsiento.NORMAL).ToList Dim cont = 0 If asap IsNot Nothing Then cont += 1 asap.NumeroAsiento = cont End If For Each asi In asn cont += 1 asap.NumeroAsiento = cont Next If asci IsNot Nothing Then cont += 1 asap.NumeroAsiento = cont End If bd.GuardarCambios() End If Catch ex As Exception End Try End Sub Friend Sub GeneraAsientoRegularizacionYApertura() Try If Estado = EstadosAplicacion.Nuevo Then DXMessageBox.Show("No se puede realizar esta operación sobre ejercicios nuevos", "Atención") Else bd = bdGrupoSanchoToro.tscGrupoSanchoToro.NuevoContexto Dim ejact As ejercicioscontables = bd.ejercicioscontables.FirstOrDefault(Function(x) x.idEjercicio = ra.idEjercicio) Dim ejnue As ejercicioscontables = bd.ejercicioscontables.FirstOrDefault(Function(x) x.FechaInicio > ejact.FechaInicio) If ejnue Is Nothing Then DXMessageBox.Show("Antes debe crear el nuevo ejercicio", "Información") Else Dim Continua As Boolean = True If ejact.FechaCierre.HasValue OrElse ejnue.FechaCierre.HasValue Then DXMessageBox.Show("Alguno de los ejerccicios implicados ya están cerrados. Si desea volverlo a cerrar primero debe quitar dicha fecha.", "Atención") Else Dim AsiCie = bd.asientos.FirstOrDefault(Function(x) x.idEjercicio = ejact.idEjercicio And x.Tipo = bdGrupoSanchoToro.db.asientos.TipoAsiento.REGULARIZACION) Dim AsiAper = bd.asientos.FirstOrDefault(Function(x) x.idEjercicio = ejnue.idEjercicio And x.Tipo = asientos.TipoAsiento.APERTURA) If AsiCie IsNot Nothing OrElse AsiAper IsNot Nothing Then Continua = DXMessageBox.Show("Ya existe un asiento de regularización/apertura en los ejercicios implicados. ¿Desea eliminar dichos asientos y generarlos de nuevo?", "Atención", MessageBoxButton.YesNo) = MessageBoxResult.Yes If Continua Then If Not DXSplashScreen.IsActive Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Generando Cierre Ejercicio " & ejact.Descripcion & " ...") If AsiCie IsNot Nothing Then bd.asientos.Remove(AsiCie) bd.GuardarCambios() End If Dim ctasgr6Y7 = bd.cuentas.Where(Function(x) x.idEjercicio = ejact.idEjercicio And x.EsCuentaFinal And (x.NumeroCuenta.StartsWith("6") Or x.NumeroCuenta.StartsWith("7"))).OrderBy(Function(X) X.NumeroCuenta).ToList.Where(Function(x) x.TotalSaldo <> 0) Dim asireg As New asientos bd.asientos.Add(asireg) With asireg .Fecha = ejact.FechaFin .idEjercicio = ejact.idEjercicio .idUsuario = idUsuario .Tipo = bdGrupoSanchoToro.db.asientos.TipoAsiento.REGULARIZACION End With For Each cta In ctasgr6Y7 Dim na As New apuntes asireg.apuntes.Add(na) With na .idCuenta = ejact.cuentas.First(Function(x) x.NumeroCuenta = cta.NumeroCuenta).idCuenta ' .Fecha = ejact.FechaFin .Concepto = "A PERDIDAS Y GANANCIAS" ' If cta.TotalSaldo > 0 Then If cta.NumeroCuenta.StartsWith("6") Then .Debe = 0 .Haber = Math.Round(cta.TotalSaldo, 2, MidpointRounding.AwayFromZero) Else .Debe = Math.Round(cta.TotalSaldo * -1, 2, MidpointRounding.AwayFromZero) .Haber = 0 End If 'Else ' .Debe = cta.TotalSaldo * -1 ' .Haber = 0 'End If asireg.Importe = Math.Round(asireg.Importe + .Debe, 2, MidpointRounding.AwayFromZero) End With Dim naPYG As New apuntes asireg.apuntes.Add(naPYG) With naPYG .idCuenta = ejact.cuentas.First(Function(x) x.NumeroCuenta = bdGrupoSanchoToro.db.cuentas.CUENTA_PERDIDAS_Y_GANANCIAS).idCuenta '.Fecha = ejact.FechaFin .Concepto = cta.Denominacion ' If cta.TotalSaldo > 0 Then If cta.NumeroCuenta.StartsWith("6") Then .Debe = Math.Round(cta.TotalSaldo, 2, MidpointRounding.AwayFromZero) .Haber = 0 Else .Debe = 0 .Haber = Math.Round(cta.TotalSaldo * -1, 2, MidpointRounding.AwayFromZero) End If 'Else ' .Debe = 0 ' .Haber = cta.TotalSaldo * -1 'End If asireg.Importe = Math.Round(asireg.Importe + .Debe, 2, MidpointRounding.AwayFromZero) End With Next asireg.Importe = Math.Round(asireg.Importe, 2, MidpointRounding.AwayFromZero) bd.GuardarCambios() ' ' APERTURA ' DXSplashScreen.SetState("Generando Apertura Ejercicio " & ejnue.Descripcion & " ...") ' Dim AsiAper = bd.asientos.FirstOrDefault(Function(x) x.idEjercicio = ejnue.idEjercicio And x.Tipo = asientos.TipoAsiento.APERTURA) If AsiAper IsNot Nothing Then bd.asientos.Remove(AsiAper) bd.GuardarCambios() End If bd = bdGrupoSanchoToro.tscGrupoSanchoToro.NuevoContexto ejact = bd.ejercicioscontables.FirstOrDefault(Function(x) x.idEjercicio = ra.idEjercicio) ejnue = bd.ejercicioscontables.FirstOrDefault(Function(x) x.FechaInicio > ejact.FechaInicio) ' Dim ctas = bd.Obtiene_ve_cuentas(bd.apuntes.Where(Function(x) x.asientos.idEjercicio = ejact.idEjercicio)).Where(Function(x) x.TotalDebe - x.TotalHaber <> 0).OrderBy(Function(X) X.NumeroCuenta).ToList Dim ctas = bdGrupoSanchoToro.db.vf_cuentas.Obtiene_vf_cuentas(bd, ejact.idEjercicio, 8).Where(Function(x) x.TotalDebe - x.TotalHaber <> 0).OrderBy(Function(X) X.NumeroCuenta).ToList Dim NueAsiAper As New asientos bd.asientos.Add(NueAsiAper) With NueAsiAper .Fecha = ejnue.FechaInicio .idEjercicio = ejnue.idEjercicio .idUsuario = idUsuario .Tipo = bdGrupoSanchoToro.db.asientos.TipoAsiento.APERTURA End With For Each cta In ctas Dim na As New apuntes NueAsiAper.apuntes.Add(na) With na Dim ctne = ejnue.cuentas.FirstOrDefault(Function(x) x.NumeroCuenta = cta.NumeroCuenta) If ctne Is Nothing Then Dim ctaea = bd.cuentas.First(Function(x) x.idCuenta = cta.idCuenta) CopiaCuenta(bd, ejnue, ctaea, ctne) End If .idCuentaNavigation = ctne '.idCuenta = ejnue.cuentas.First(Function(x) x.NumeroCuenta = cta.NumeroCuenta).idCuenta '.Fecha = ejnue.FechaInicio .Concepto = "ASIENTO APERTURA" If cta.TotalSaldo > 0 Then .Haber = 0 .Debe = Math.Round(cta.TotalSaldo, 2, MidpointRounding.AwayFromZero) Else .Haber = Math.Round(cta.TotalSaldo * -1, 2, MidpointRounding.AwayFromZero) .Debe = 0 End If NueAsiAper.Importe += .Debe End With Next NueAsiAper.Importe = Math.Round(NueAsiAper.Importe, 2, MidpointRounding.AwayFromZero) bd.GuardarCambios() RefrescaUC() If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show("Asiento de Regularización y Apertura creado correctamente.", "Atención") End If End If End If End If Catch ex As Exception FuncionesDinamicas.ErrorNoControladoAp(Me, ex) If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show(ex.Message, "Error") Finally If DXSplashScreen.IsActive Then DXSplashScreen.Close() End Try End Sub Private Sub ap_EjecutarAccion(sender As Object, e As ItemClickEventArgs, idAccion As Integer) Handles Me.EjecutarAccion Select Case idAccion Case 1 ' GENERA ASIENTO DE CIERRE Y APERTURA GeneraAsientoRegularizacionYApertura() Case 2 ' REENUMERA ASIENTOS OFICIALES Y CIERRA EL EJERCCIO ReenumeraAsientosOficiales() Case 3 GeneraInformeContable("BALSIT") End Select End Sub Public Sub GeneraInformeContable(Codigo As String) Try If Estado = EstadosAplicacion.Nuevo Then DXMessageBox.Show("No se puede realizar esta operación sobre ejercicios nuevos", "Atención") Else Dim fb As New SaveFileDialog Dim ic = bd.informescontables.First(Function(x) x.Codigo = Codigo) fb.FileName = ic.Descripcion & " " & Now.ToString("dd-MM-yyyy") fb.Filter = "Fichero Excel | *.xlsx" fb.DefaultExt = "xlsx" fb.FileName &= ".xlsx" fb.AddExtension = True If fb.ShowDialog Then bd = bdGrupoSanchoToro.tscGrupoSanchoToro.NuevoContexto If Not DXSplashScreen.IsActive Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Generando Informe ...") Dim ej As ejercicioscontables = bd.ejercicioscontables.First(Function(x) x.idEjercicio = ra.idEjercicio) Dim b() As Byte = ic.idFicheroNavigation.Fichero Dim ms As New MemoryStream(b) Dim wb As New Workbook If ic.idFicheroNavigation.NombreFichero.ToLower.EndsWith(".xls") Then wb.LoadDocument(ms, DevExpress.Spreadsheet.DocumentFormat.Xls) Else wb.LoadDocument(ms, DevExpress.Spreadsheet.DocumentFormat.Xlsx) End If Dim ctas = ej.cuentas.ToList Dim ctasejant As New List(Of cuentas) Dim ejant = bd.ejercicioscontables.Where(Function(x) x.FechaInicio < ej.FechaInicio).OrderByDescending(Function(x) x.FechaInicio).FirstOrDefault If ejant IsNot Nothing Then ctasejant = ejant.cuentas.ToList End If For Each c In ic.celdasinformescontables Dim celda As String = c.Columna & c.Fila.ToString Try Select Case c.NombreCampo.ToLower Case "totalsaldoejant" If ejant IsNot Nothing Then wb.Worksheets(c.Hoja).Cells(celda).Value = ObtieneTotalSaldo(ctasejant, c) Case "totalsaldo" wb.Worksheets(c.Hoja).Cells(celda).Value = ObtieneTotalSaldo(ctas, c) Case "totalsaldoac" 'Antes de CIERRE wb.Worksheets(c.Hoja).Cells(celda).Value = ObtieneTotalSaldoAC(ctas, c) Case "totalsaldoacejant" 'Antes de CIERRE If ejant IsNot Nothing Then wb.Worksheets(c.Hoja).Cells(celda).Value = ObtieneTotalSaldoAC(ctasejant, c) Case "ejercicio" wb.Worksheets(c.Hoja).Cells(celda).Value = ej.Descripcion Case "ejercicioant" If ejant IsNot Nothing Then wb.Worksheets(c.Hoja).Cells(celda).Value = ejant.Descripcion End Select Catch ex As Exception Throw New Exception("Error en Hoja " & c.Hoja.ToString & " Columna " & celda & " " & ex.Message, ex) End Try Next wb.SaveDocument(fb.FileName, DevExpress.Spreadsheet.DocumentFormat.Xlsx) If DXSplashScreen.IsActive Then DXSplashScreen.Close() Process.Start(fb.FileName) End If End If Catch ex As Exception FuncionesDinamicas.ErrorNoControladoAp(Me, ex) If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show(ex.Message, "Error") End Try End Sub Private Function ObtieneTotalSaldo(ctas As List(Of cuentas), c As celdasinformescontables) As Double Dim Total As Double = 0 Dim ctascelda = c.cuentasceldasinformescontables.ToList For Each cc In ctascelda Dim cta = ctas.FirstOrDefault(Function(x) x.NumeroCuenta = cc.NumeroCuenta) If cta IsNot Nothing Then If cc.SoloSiNegativo Then If cta.TotalSaldo < 0 Then Total += (cta.TotalSaldo * cc.Factor) Else If cc.SoloSiPositivo Then If cta.TotalSaldo > 0 Then Total += (cta.TotalSaldo * cc.Factor) Else Total += (cta.TotalSaldo * cc.Factor) End If End If End If Next Return Total End Function Private Function ObtieneTotalSaldoAC(ctas As List(Of cuentas), c As celdasinformescontables) As Double Dim Total As Double = 0 Dim ctascelda = c.cuentasceldasinformescontables.ToList For Each cc In ctascelda Dim cta = ctas.FirstOrDefault(Function(x) x.NumeroCuenta = cc.NumeroCuenta) If cta IsNot Nothing Then If cc.SoloSiNegativo Then If cta.TotalSaldoAntesCierre < 0 Then Total += (cta.TotalSaldoAntesCierre * cc.Factor) Else If cc.SoloSiPositivo Then If cta.TotalSaldoAntesCierre > 0 Then Total += (cta.TotalSaldoAntesCierre * cc.Factor) Else Total += (cta.TotalSaldoAntesCierre * cc.Factor) End If End If End If Next Return Total End Function Private Sub EstableceEstiloGrupo(rg As DevExpress.Spreadsheet.CellRange) Dim rgf As Formatting = rg.BeginUpdateFormatting rgf.Font.Bold = True rgf.Fill.BackgroundColor = Color.LightCyan rgf.Borders.BottomBorder.LineStyle = BorderLineStyle.DashDot rgf.Borders.TopBorder.LineStyle = BorderLineStyle.DashDot rgf.Borders.LeftBorder.LineStyle = BorderLineStyle.DashDot rgf.Borders.RightBorder.LineStyle = BorderLineStyle.DashDot End Sub Private Sub ucEjercicioContable_EstadoCambiado(EstadoAnterior As EstadosAplicacion, EstadoNuevo As EstadosAplicacion) Handles Me.EstadoCambiado End Sub 'Private Sub ucEjercicioContable_AbreRegistroBuscado(uc As tsUserControl) Handles Me.AbreRegistroBuscado 'End Sub 'Private Sub ucEjercicioContable_AbreRegistroBuscado(uc As tsUserControl) Handles Me.AbreRegistroBuscado ' Dim ucecs = DirectCast(uc, ucEjerciciosContables) ' _idEjercicio = DirectCast(ucecs.gcEjercicios.CurrentItem, ejercicioscontables).idEjercicio 'End Sub End Class