Imports DevExpress.Xpf.Editors Imports tsWPFCore Imports System.Data Imports DevExpress.Xpf.Core Imports tsWPFCore.modExtensiones Imports Microsoft.EntityFrameworkCore Imports DevExpress.Xpf.Bars Imports DevExpress.Xpf.Grid Imports bdGrupoSanchoToro.db Imports bdGrupoSanchoToro.db.Utilidades Public Class ucConciliacionBancaria Private bd As tscGrupoSanchoToro Friend _idConciliacion As Nullable(Of Integer) Public Overrides Function EstablecedcPrincipal(Optional Background As Boolean = False, Optional FuerzaNuevo As Boolean = False, Optional Refrescar As Boolean = False) As tsUtilidades.EstadosAplicacion Dim NuevoEstado As tsUtilidades.EstadosAplicacion Dim ra As conciliacionesbancarias Dim cajas = bd.cajas.Where(Function(x) x.idEmpresa = EmpresaActual.idEmpresa AndAlso x.FechaBaja.HasValue = False AndAlso x.IBAN IsNot Nothing).OrderBy(Function(x) x.Descripcion).ToList cbCaja.ItemsSource = cajas If Estado = tsUtilidades.EstadosAplicacion.Nuevo OrElse _idConciliacion Is Nothing OrElse FuerzaNuevo Then ra = New conciliacionesbancarias Me.DataContext = ra ' ra.FechaInicio = Date.Today ' ra.FechaFin = Date.Today ra.FechaConciliacion = Now Dim TipoCajaBanco = CInt(db.cajas.TipoCajaEnum.BANCO) ra.idCaja = cajas.First(Function(x) x.IBAN IsNot Nothing AndAlso x.Tipo = TipoCajaBanco).idCaja ra.idUsuarioNavigation = bd.usuarios.First(Function(x) x.idUsuario = idUsuario) _idConciliacion = Nothing NuevoEstado = tsUtilidades.EstadosAplicacion.Nuevo Else ra = bd.conciliacionesbancarias.First(Function(x) x.idConciliacion = _idConciliacion.Value) NuevoEstado = tsUtilidades.EstadosAplicacion.ModificandoRegistro End If Me.DataContext = ra ObtieneExtractosYApuntes(ra) Return NuevoEstado 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 "conciliacionesbancarias" End Get End Property Public Overrides ReadOnly Property idRegistroAplicacionActual As String Get If Estado = tsUtilidades.EstadosAplicacion.Nuevo Then Return "ConciliacionBancaria.Nuevo" Else Return "ConciliacionBancaria." & DirectCast(Me.DataContext, conciliacionesbancarias).idConciliacion.ToString End If End Get End Property Public Overrides ReadOnly Property DescripcionRegistro As String Get Return "Conciliación Bancaria" End Get End Property Public Sub New(Optional idConciliacion As Integer? = Nothing) ' Llamada necesaria para el diseñador. InitializeComponent() _idConciliacion = idConciliacion ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). 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 = "CONCILIACIÓN AUTOMÁTICA"}) Me.ContenedorAplicacion.cbAcciones.ItemsSource = Acciones If Acciones.Count > 0 Then Me.ContenedorAplicacion.beAcciones.EditValue = Acciones.First.idAccion 'Dim plantillas As List(Of tsWPFCore.Plantilla) = Comun.ObtienePlantillasPorCodigo(bd, {"CONBAN"}) 'Me.ContenedorAplicacion.cbPlantillaAImprimir.ItemsSource = plantillas 'If plantillas.Count > 0 Then ' Me.ContenedorAplicacion.bePlantilla.EditValue = plantillas.First.idPlantilla 'End If End Sub Public Overrides Sub EstableceTitulo() If Me.Estado = tsUtilidades.EstadosAplicacion.ModificandoRegistro Then Dim ext As conciliacionesbancarias = Me.DataContext Me.docpanel.Caption = "Conciliación Bancaria " & ext.idConciliacion.ToString Me.docpanel.Tag = "Conciliacion Bancaria." & ext.idConciliacion.ToString Else Me.docpanel.Caption = "Conciliación Bancaria Nueva" Me.docpanel.Tag = "Conciliacion Bancaria.Nueva" End If End Sub Public Overrides Function ObtienePermisos() As tsUtilidades.Permisos Return Comun.ObtienePermisos(Me.bd, "AP.SUPERADMINISTRATIVOS", idUsuario) End Function Public Overrides Sub Cargado() Me.Tipo_ucControlBusqueda = GetType(ucExtractosBancarios) Me.cbMes.ItemsSource = tsUtilidades.Utilidades.Meses End Sub Private Sub ObtieneExtractosYApuntes(ra As conciliacionesbancarias) Try If ra.FechaInicio <> DateOnly.MinValue Then If DXSplashScreen.IsActive = False Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Obteniendo Extractos Bancarios y Movimientos de caja, por favor espere ...") ' Dim fechainicio As New Date(2020, 1, 1) Dim iban = bd.cajas.First(Function(x) x.idCaja = ra.idCaja).IBAN ' Dim aps = bd.movimientoscaja.Include(Function(x) x.conciliacionesbancarias).Include(Function(x) x.facturas).Include(Function(x) x.albaranes).Include(Function(x) x.facturasrecibidas).Where(Function(x) x.Fecha >= fechainicio AndAlso x.Tipo <> bdGrupoSanchoToro.db.TipoMovimientoEnum.CIERRE_CAJA AndAlso x.cajas.IBAN = iban AndAlso ((x.idConciliacion.HasValue = False OrElse x.Fecha <= ra.FechaFin) OrElse (x.Fecha >= ra.FechaInicio AndAlso x.Fecha <= ra.FechaFin) OrElse (x.idConciliacion = ra.idConciliacion))).ToList ' Dim exts = bd.movimientosbancarios.Include(Function(x) x.conciliacionesbancarias).Where(Function(x) x.extractosbancarios.cajas.IBAN = iban AndAlso ((x.idConciliacion.HasValue = False OrElse x.FechaOperacion <= ra.FechaFin) OrElse (x.FechaOperacion >= ra.FechaInicio AndAlso x.FechaOperacion <= ra.FechaFin) OrElse (x.idConciliacion.HasValue = False OrElse x.FechaValor <= ra.FechaFin) OrElse (x.FechaValor >= ra.FechaInicio AndAlso x.FechaValor <= ra.FechaFin) OrElse (x.idConciliacion = ra.idConciliacion))).ToList Dim fi As DateOnly = ra.FechaInicio Dim ff = ra.FechaFin.AddDays(1) Dim dfi As Date = New Date(fi.Year, fi.Month, fi.Day) Dim dff As Date = New Date(ff.Year, ff.Month, ff.Day) Dim aps = bd.movimientoscaja.Include(Function(x) x.idConciliacionNavigation).Include(Function(x) x.idFacturaNavigation).Include(Function(x) x.idFacturaRecibidaNavigation).Where(Function(x) x.Fecha >= dfi AndAlso x.Fecha < dff AndAlso x.Tipo <> bdGrupoSanchoToro.db.TipoMovimientoEnum.CIERRE_CAJA AndAlso x.Tipo <> bdGrupoSanchoToro.db.TipoMovimientoEnum.REGULARIZACION_CAJA AndAlso x.idCajaNavigation.IBAN = iban).ToList Dim exts = bd.movimientosbancarios.Include(Function(x) x.idConciliacionNavigation).Where(Function(x) x.idExtractoBancarioNavigation.idCajaNavigation.IBAN = iban AndAlso x.FechaOperacion >= fi AndAlso x.FechaOperacion < ff).ToList For Each ap In aps ap.ConciliacionActual_TMP = ra Next For Each ext In exts ext.ConciliacionActual_TMP = ra Next 'Dim exts = bd.movimientosbancarios.Where(Function(x) x.extractosbancarios.idCaja = ra.idCaja AndAlso ((x.idConciliacion.HasValue = False OrElse x.FechaOperacion <= ra.FechaFin) OrElse (x.FechaOperacion >= ra.FechaInicio AndAlso x.FechaOperacion <= ra.FechaFin) OrElse (x.FechaOperacion >= ra.FechaInicio AndAlso x.FechaOperacion <= ra.FechaFin) OrElse (x.idConciliacion = ra.idConciliacion))).ToList gcApuntes.ItemsSource = aps gcMovimientos.ItemsSource = exts End If Catch ex As Exception If DXSplashScreen.IsActive Then DXSplashScreen.Close() FuncionesDinamicas.ErrorNoControladoAp(Me, ex) DXMessageBox.Show(ex.Message, "Error") Finally If DXSplashScreen.IsActive Then DXSplashScreen.Close() End Try End Sub Private Sub ucConciliacionBancaria_CampoActualizado(sender As Object, e As DataTransferEventArgs) Handles Me.CampoActualizado Dim pts As PropiedadesTS = sender.parent.propiedadests If Not pts Is Nothing Then Dim ra As conciliacionesbancarias = Me.DataContext Select Case pts.NombreCampo.ToLower Case "año", "mes", "idcaja" ObtieneExtractosYApuntes(ra) End Select End If End Sub Private Sub ConciliacionAutomatica() Try If Me.gcApuntes.ItemsSource IsNot Nothing AndAlso Me.gcMovimientos.ItemsSource IsNot Nothing Then Dim ra As conciliacionesbancarias = Me.DataContext If DXSplashScreen.IsActive = False Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Conciliando automáticamente extractos bancarios y movimientos de caja, por favor espere ...") Dim apu As List(Of movimientoscaja) = Me.gcApuntes.ItemsSource Dim mov As List(Of movimientosbancarios) = Me.gcMovimientos.ItemsSource Dim dfi = New Date(ra.FechaInicio.Year, ra.FechaInicio.Month, ra.FechaInicio.Day) Dim dff = New Date(ra.FechaFin.Year, ra.FechaFin.Month, ra.FechaFin.Day).AddDays(1) Dim doff = ra.FechaFin.AddDays(1) Dim app = apu.Where(Function(x) x.Conciliado = False AndAlso x.Fecha >= dfi AndAlso x.Fecha < dfi).ToList Dim mop = mov.Where(Function(x) x.Conciliado = False AndAlso x.FechaOperacion >= ra.FechaInicio AndAlso x.FechaOperacion < doff).ToList If Math.Round(app.Sum(Function(x) x.Importe), 2, MidpointRounding.AwayFromZero) = Math.Round(mop.Sum(Function(x) x.Importe), 2, MidpointRounding.AwayFromZero) Then For Each m In mop m.Conciliado = True Next For Each ap In app ap.Conciliado = True Next CalculaTotalesApuntes() CalculaTotalesMovimientos() If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show("Se han conciliado todos los movimientos del mes de apuntes y movimientos bancarios", "Conciliación Automática") Else Dim f As DateOnly = ra.FechaInicio Dim NumeroConciliados As Integer = 0 Do Until f = ra.FechaFin Dim df As New Date(f.Year, f.Month, f.Day) Dim apd = apu.Where(Function(x) x.Conciliado = False AndAlso x.Fecha = df).ToList Dim movd = mov.Where(Function(x) x.Conciliado = False AndAlso x.FechaOperacion = f).ToList Dim apdag = apd.GroupBy(Function(x) x.Importe) Dim movdag = movd.GroupBy(Function(x) x.Importe) For Each g In apdag Dim ma = movdag.FirstOrDefault(Function(x) x.Count = g.Count AndAlso x.Sum(Function(y) y.Importe) = g.Sum(Function(z) z.Importe)) If ma IsNot Nothing Then NumeroConciliados += g.Count For Each m In ma m.Conciliado = True Next For Each ap In g ap.Conciliado = True Next End If Next f = f.AddDays(1) Loop Dim apm = apu.Where(Function(x) x.Conciliado = False AndAlso x.Fecha >= dfi AndAlso x.Fecha < dff).ToList Dim movm = mov.Where(Function(x) x.Conciliado = False AndAlso x.FechaOperacion >= ra.FechaInicio AndAlso x.FechaOperacion < doff).ToList Dim apsag = apm.Where(Function(x) x.Conciliado = False).GroupBy(Function(x) x.Importe) Dim movsag = movm.Where(Function(x) x.Conciliado = False).GroupBy(Function(x) x.Importe) For Each g In apsag Dim ma = movsag.FirstOrDefault(Function(x) x.Count = g.Count AndAlso x.Sum(Function(y) y.Importe) = g.Sum(Function(z) z.Importe)) If ma IsNot Nothing Then NumeroConciliados += g.Count For Each m In ma m.Conciliado = True Next For Each ap In g ap.Conciliado = True Next End If Next Dim aprag = apm.Where(Function(x) x.Conciliado = False).GroupBy(Function(x) x.Importe) Dim movrag = movm.Where(Function(x) x.Conciliado = False).GroupBy(Function(x) x.Importe) For Each g In aprag Dim ma = movrag.FirstOrDefault(Function(x) x.Count = g.Count AndAlso x.Sum(Function(y) y.Importe) = g.Sum(Function(z) z.Importe)) If ma IsNot Nothing Then NumeroConciliados += g.Count For Each m In ma m.Conciliado = True Next For Each ap In g ap.Conciliado = True Next End If Next CalculaTotalesApuntes() CalculaTotalesMovimientos() If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show("Se han conciliado " & NumeroConciliados.ToString & " apuntes y movimientos bancarios", "Conciliación Automática") End If gcApuntes.RefreshData() gcMovimientos.RefreshData() Else DXMessageBox.Show("No existen movimientos caja o bancarios que conciliar", "Atención") End If Catch ex As Exception If DXSplashScreen.IsActive Then DXSplashScreen.Close() FuncionesDinamicas.ErrorNoControladoAp(Me, ex) DXMessageBox.Show(ex.Message, "Error") Finally If DXSplashScreen.IsActive Then DXSplashScreen.Close() End Try End Sub Private Sub ucConciliacionBancaria_EjecutarAccion(sender As Object, e As ItemClickEventArgs, idAccion As Integer) Handles Me.EjecutarAccion Select Case idAccion Case 1 ' CONCILIACION AUTOMÁTICA ConciliacionAutomatica() End Select End Sub Private Sub tvApuntes_ValidateRow(sender As Object, e As GridRowValidationEventArgs) Handles tvApuntes.ValidateRow CalculaTotalesApuntes() End Sub Private Sub CalculaTotalesApuntes() Dim ra As conciliacionesbancarias = Me.DataContext Dim apuntes As List(Of movimientoscaja) = gcApuntes.ItemsSource ra.TotalMovimientosCaja = apuntes.Where(Function(x) x.Conciliado).Sum(Function(x) x.Importe) End Sub Private Sub CalculaTotalesMovimientos() Dim ra As conciliacionesbancarias = Me.DataContext Dim movs As List(Of movimientosbancarios) = gcMovimientos.ItemsSource ra.TotalMovimientosBancarios = movs.Where(Function(x) x.Conciliado).Sum(Function(x) x.Importe) End Sub Private Sub tvApuntes_CellValueChanging(sender As Object, e As CellValueChangedEventArgs) Handles tvApuntes.CellValueChanging tvApuntes.CommitEditing() CalculaTotalesApuntes() End Sub Private Sub tvMovimientos_CellValueChanging(sender As Object, e As CellValueChangedEventArgs) Handles tvMovimientos.CellValueChanging tvMovimientos.CommitEditing() CalculaTotalesMovimientos() End Sub 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 Try If Not pts Is Nothing Then Me.ErroresValidacion.EliminaError("validando-" & pts.NombreCampo) Dim ra As conciliacionesbancarias = Me.DataContext Select Case pts.NombreCampo.ToLower Case "año" If Not e.Value Is Nothing Then Dim Valor = CInt(e.Value) If Valor < 2019 OrElse Valor > 2100 Then Throw New Exception("Valor del año incorrecto") End If End If End Select End If Catch ex As Exception Dim sCodigoError As String = "validando-" If pts IsNot Nothing Then sCodigoError &= pts.NombreCampo End If ev = New ErrorValidacion(sCodigoError, sender, ex.Message, ex, DevExpress.XtraEditors.DXErrorProvider.ErrorType.Critical) e.IsValid = False End Try End Sub Private Sub tvMovimientos_ShowingEditor(sender As Object, e As ShowingEditorEventArgs) Dim mov As movimientosbancarios = gcMovimientos.GetRow(e.RowHandle) If e.Column.FieldName.ToLower = "conciliado" Then If mov.ConciliadoEn <> "" Then e.Cancel = True e.Handled = True End If End If End Sub 'Private Sub tvApuntes_ShowingEditor(sender As Object, e As ShowingEditorEventArgs) ' Dim ap As movimientoscaja = gcApuntes.GetRow(e.RowHandle) ' If e.Column.FieldName.ToLower = "conciliado" Then ' If ap.ConciliadoEn <> "" Then ' e.Cancel = True ' e.Handled = True ' End If ' End If 'End Sub Private Sub ucConciliacionBancaria_Enlazar(Celda As EditGridCellData, Defecto As Boolean) Handles Me.Enlazar Select Case Celda.View.Name.ToLower Case "tvapuntes" Dim ra As movimientoscaja = Me.gcApuntes.CurrentItem Dim id As Integer = ra.idConciliacionNavigation.idConciliacion FuncionesDinamicas.AbrirAP(New ucConciliacionBancaria(id), OtrosParametros) Case Else Dim ra As movimientosbancarios = Me.gcMovimientos.CurrentItem Dim id As Integer = ra.idConciliacionNavigation.idConciliacion FuncionesDinamicas.AbrirAP(New ucConciliacionBancaria(id), OtrosParametros) End Select End Sub Private Sub ucConciliacionBancaria_AntesGuardar(sender As Object, e As ItemClickEventArgs, ByRef Cancelar As Boolean, ByRef MensajesError As Hashtable, OpcionGuardado As Integer) Handles Me.AntesGuardar Dim ra As conciliacionesbancarias = Me.DataContext Dim hte As New Hashtable If Math.Round(ra.TotalMovimientosCaja, 2, MidpointRounding.AwayFromZero) <> Math.Round(ra.TotalMovimientosBancarios, 2, MidpointRounding.AwayFromZero) Then If DXMessageBox.Show("La suma de los movimientos de caja no coincide con la de los extractos bancarios. ¿Desea continuar?", "Atención", MessageBoxButton.YesNo) = MessageBoxResult.No Then hte.Add("Almacenar-SUMA", "La suma de los movimientos de caja debe coincidir con la de los extractos bancarios") End If End If If hte.Count > 0 Then MensajesError = hte Cancelar = True End If End Sub Private Sub ucConciliacionBancaria_ImprimirPlantilla(sender As Object, e As ItemClickEventArgs, idPlantilla As Integer) Handles Me.ImprimirPlantilla 'Try ' Dim pl = bd.plantillas.First(Function(x) x.idPlantilla = idPlantilla) ' Select Case pl.Codigo ' Case "CONBAN" ' Dim ra As conciliacionesbancarias = Me.DataContext ' Dim ds As New List(Of bdGrupoSanchoToro.db.InformeConciliacionBancaria) ' Dim inf = New bdGrupoSanchoToro.db.InformeConciliacionBancaria(bd, ra.cajas.CuentaContable, ra.FechaFin) ' ds.Add(inf) ' Comun.ImprimirPlantilla(bd, idPlantilla, ds, False, 1) ' End Select 'Catch ex As Exception ' DXMessageBox.Show(ex.Message, "Error") 'End Try End Sub Private Sub ucConciliacionBancaria_DespuesEliminar(sender As Object) Handles Me.DespuesEliminar If docpanel IsNot Nothing AndAlso tsWPFCore.Comun.dm IsNot Nothing Then tsWPFCore.Comun.dm.DockController.RemovePanel(docpanel) End Sub Private Sub ucConciliacionBancaria_DespuesGuardar(sender As Object, e As ItemClickEventArgs, OpcionGuardado As Integer) Handles Me.DespuesGuardar Dim con As conciliacionesbancarias = Me.DataContext _idConciliacion = con.idConciliacion End Sub End Class