Files
SanchoToro/GestionGrupoSanchoToro/ucConciliacionBancaria.xaml.vb
2026-01-29 13:04:08 +01:00

405 lines
21 KiB
VB.net

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, Previsualizar As Boolean) 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