Imports bdGrupoSanchoToro.db Imports DevExpress.Xpf.Core Imports tsWPFCore Imports DevExpress.Xpf.Bars Imports bdGrupoSanchoToro.db.Utilidades Imports Microsoft.Win32 Imports System.IO Imports tsEFCore8.Extensiones.StringExtensions Imports TSpdfUtils Public Class ucFacturasEmitidas Private bd As tscGrupoSanchoToro Public Sub New() ' Esta llamada es exigida por el diseñador. InitializeComponent() ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). End Sub Public Overrides Sub Cargado() ContenedorAplicacion.btGuardar.IsVisible = False ContenedorAplicacion.siEstado.IsVisible = False 'Dim Hoy = Date.Today 'teFechaFin.EditValue = Hoy 'teFechaInicio.EditValue = New Date(Hoy.Year, 1, 1) Me.GridSeleccion = Me.gc Me.HabilitarRefresco = True End Sub Public Overrides Function EstablecedcPrincipal(Optional Background As Boolean = False, Optional FuerzaNuevo As Boolean = False, Optional Refrescar As Boolean = False) As tsUtilidades.EstadosAplicacion If Background OrElse Refrescar Then ObtienefacturasAsync(bd, Background) Return tsUtilidades.EstadosAplicacion.AplicacionSinIndice End Function Public Overrides Sub EstableceDataContextSecundarios(Optional Background As Boolean = False) Dim Acciones As New List(Of tsWPFCore.Accion) Acciones.Add(New Accion With { .idAccion = 4, .Descripcion = "ENVIA EXCEL Y FRAS. IMPRESAS SELECCIONADAS A ASESORIA"}) Acciones.Add(New Accion With { .idAccion = 1, .Descripcion = "ENVIA FACTURAS SELECCIONADAS POR EMAIL AL CLIENTE"}) Acciones.Add(New Accion With { .idAccion = 3, .Descripcion = "GENERA EXCEL DE FACTURAS SELECCIONADAS"}) Acciones.Add(New Accion With { .idAccion = 5, .Descripcion = "GENERA PDF DE FACTURAS SELECCIONADAS"}) Me.ContenedorAplicacion.cbAcciones.ItemsSource = Acciones Me.ContenedorAplicacion.beAcciones.EditValue = Acciones.First.idAccion End Sub Public Overrides Sub EstableceTitulo() Me.docpanel.Caption = "Facturas A Clientes" End Sub Public Overrides ReadOnly Property idRegistroAplicacionActual As String Get Return "FacturasEmitidas" End Get End Property Public Overrides ReadOnly Property NombreTablaBase As String Get Return "facturas" End Get End Property Public Overrides ReadOnly Property DescripcionRegistro As String Get Return "Facturas A Clientes" End Get End Property Public Overrides Function ObtieneBD() As tsUtilidades.ItsContexto bd = tscGrupoSanchoToro.NuevoContexto() Return bd End Function Public Overrides Function ObtienePermisos() As tsUtilidades.Permisos Dim per = Comun.ObtienePermisos(Me.bd, "AP.ADMINISTRATIVOS", idUsuario) per.Eliminar = False Return per End Function Private Sub Nuevo() Handles Me.BotonNuevoPulsado FuncionesDinamicas.AbrirAP(New ucFacturaEmitida, OtrosParametros) End Sub Private Sub ap_Enlazar(Celda As DevExpress.Xpf.Grid.EditGridCellData, Defecto As Boolean) Handles Me.Enlazar Dim ra = DirectCast(Me.gc.CurrentItem, facturas) Select Case Celda.Column.FieldName.ToLower Case "numerofactura" Dim id As Integer = ra.idFactura FuncionesDinamicas.AbrirAP(New ucFacturaEmitida(id), OtrosParametros) Case "razonsocial" Dim id As Integer = ra.idCliente FuncionesDinamicas.AbrirAP(New ucEntidad(id), OtrosParametros) End Select End Sub Private Sub ap_AntesGuardar(sender As Object, e As ItemClickEventArgs, ByRef Cancelar As Boolean, ByRef MensajesError As Hashtable, OpcionGuardado As Integer) Handles Me.AntesGuardar End Sub Public Function ObtieneFacturasEmitidas(ByRef DataContext As Object, BackGround As Boolean, TextoBusqueda As String, FechaInicio As DateOnly?, FechaFin As DateOnly?, IncluirTodos As Boolean, Pendientes As Boolean) As List(Of facturas) Dim rs As IQueryable(Of facturas) Dim lf As New List(Of facturas) Dim iNumExc As Integer = 0 Do Try rs = bd.facturas.Where(Function(x) x.idClienteNavigation.idEmpresa = EmpresaActual.idEmpresa).Include(Function(x) x.idSerieFacturaNavigation).Include(Function(x) x.movimientoscaja).Include(Function(x) x.idClienteNavigation).Include(Function(x) x.idEventoNavigation.CodigoMunicipioNavigation.CodigoProvinciaNavigation).Include(Function(x) x.idUsuarioNavigation).AsQueryable If FechaInicio.HasValue Then rs = rs.Where(Function(x) x.FechaFactura >= FechaInicio.Value) End If If FechaFin.HasValue Then rs = rs.Where(Function(x) x.FechaFactura <= FechaFin.Value) End If If IncluirTodos = False Then rs = rs.Where(Function(x) x.movimientoscaja.Count = 0 OrElse Math.Round(x.movimientoscaja.Sum(Function(y) y.Importe), 2) <> Math.Round(x.TotalFactura, 2)) End If If Pendientes Then rs = rs.Where(Function(x) x.FechaEnvioAsesoria.HasValue = False) End If If TextoBusqueda <> "" Then Dim parametros(0) As Object Dim CamposBusquedaNumericos() As String = {"idFactura"} Dim CamposBusquedaAlfabeticos() As String = {"idClienteNavigation.RazonSocial", "idClienteNavigation.NIF", "NumeroFactura"} Dim ExpresionBusqueda = tsWPFCore.Utilidades.Varias.GeneraExpresionBusqueda(TextoBusqueda, CamposBusquedaNumericos, CamposBusquedaAlfabeticos, Nothing) rs = rs.Where(Function(x) x.idClienteNavigation.idEmpresa = EmpresaActual.idEmpresa).Where(ExpresionBusqueda).AsQueryable End If lf = rs.OrderByDescending(Function(x) x.FechaFactura).ThenByDescending(Function(x) x.NumeroFactura).ToList Exit Do Catch ex As Exception iNumExc += 1 If iNumExc > 3 Then rs = Nothing Exit Do End If End Try Loop Return lf End Function Public Async Sub ObtienefacturasAsync(bd As tscGrupoSanchoToro, Background As Boolean) Try Dim rs As New List(Of facturas) Dim Busqueda = If(Me.teBusqueda.EditValue Is Nothing, "", Me.teBusqueda.EditValue) Dim fi As DateOnly? : If teFechaInicio.EditValue IsNot Nothing Then fi = DateOnly.FromDateTime(teFechaInicio.EditValue) Dim ff As DateOnly? : If teFechaFin.EditValue IsNot Nothing Then ff = DateOnly.FromDateTime(teFechaFin.EditValue) Dim it As Boolean = cbIncluirTodos.IsChecked Dim bPendientes As Boolean = cbSoloPendientes.IsChecked If Background Then Me.ContenedorAplicacion.IsEnabled = False Await Task.Run(Sub() rs = ObtieneFacturasEmitidas(bd, Background, Busqueda, fi, ff, it, bPendientes) End Sub) Else If DXSplashScreen.IsActive = False Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Buscando Facturas Emitidas ...") rs = ObtieneFacturasEmitidas(bd, Background, Busqueda, fi, ff, it, bPendientes) End If gc.ItemsSource = rs DataContext = rs Catch ex As Exception If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show(ex.Message, "Error") Finally Me.ContenedorAplicacion.IsEnabled = True If DXSplashScreen.IsActive Then DXSplashScreen.Close() End Try End Sub Private Sub BtBuscar_Click(sender As Object, e As RoutedEventArgs) ObtienefacturasAsync(bd, False) End Sub Private Sub ucFacturasEmitidas_EjecutarAccion(sender As Object, e As ItemClickEventArgs, idAccion As Integer) Handles Me.EjecutarAccion Try ' Dim ra As entidades = Me.DataContext Dim tf As List(Of facturas) = gc.ItemsSource Dim fras = gc.ElementosSeleccionados.Cast(Of facturas).ToList If fras.Count = 0 Then DXMessageBox.Show("Antes debe seleccionar alguna factura emitida", "Atención") Else If fras.Any(Function(x) x.TotalIVA = 0) Then DXMessageBox.Show("Atención alguna de las facturas seleccionadas no tienen IVA", "Atención") End If Select Case idAccion Case 1 Dim sFacturas As String = "" Dim cta = bd.cuentascorreo.First(Function(x) x.Codigo = "DEFECTO" AndAlso x.idEmpresa = EmpresaActual.idEmpresa) Dim sMensaje As String = "" Dim grf = fras.GroupBy(Function(x) x.idCliente) Dim NumCorreos As Integer = 0 If DXMessageBox.Show("Atención se van a enviar " & grf.Count.ToString & " correos. ¿Desea Continuar?", "Atención", MessageBoxButton.YesNo) = MessageBoxResult.Yes Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Generando correos, por favor espere ...") For Each g In grf If g.First.idClienteNavigation.Email.NothingAVacio = "" Then sMensaje &= g.First.idClienteNavigation.RazonSocial & vbCrLf Else NumCorreos += 1 Dim dArchivos As Dictionary(Of String, Byte()) = Nothing For Each fe In g DXSplashScreen.SetState("Generando archivos de la factura " & fe.NumeroFactura & ", por favor espere ...") Next DXSplashScreen.SetState("Comprimiendo Archivos, por favor espere ...") Dim bzip = tsUtilidades.zip.ComprimirArchivos(dArchivos) Dim Asunto, Cuerpo As String Asunto = EmpresaActual.RazonSocial & " - Adjunto le remitimos facturas" Cuerpo = "Distinguidos Sres., adjunto le remitimos facturas" bdGrupoSanchoToro.db.correos.GeneraRegistroCorreon(bd, Asunto, Cuerpo, cta, g.First.idClienteNavigation.Email, g.First.idClienteNavigation.Email2, cta.Remitente, bzip, "Facturas" & ".zip", g.First.idCliente, "ENTIDAD", g.First.idCliente) End If Next If DXSplashScreen.IsActive Then DXSplashScreen.Close() End If If sMensaje <> "" Then DXMessageBox.Show("Los siguientes Clientes no tienen correo electrónico: " & sMensaje, "Generación de correos") End If DXMessageBox.Show("Se han generado " & NumCorreos.ToString & " correos electrónicos", "Generación de correos") Case 3 Try Dim sfd As New SaveFileDialog sfd.FileName = IO.Path.GetDirectoryName("Exportacion") & ("Facturas.xlsx").Trim sfd.Filter = "Fichero Excel (*.xls, *.xlsx, *.csv)|*.xls;*.xlsx;*.csv" sfd.DefaultExt = ".xlsx" If sfd.ShowDialog Then gc.ItemsSource = fras Select Case IO.Path.GetExtension(sfd.FileName).ToLower Case ".xls" tv.ExportToXls(sfd.FileName) Case ".xlsx" tv.ExportToXlsx(sfd.FileName) Case ".csv" tv.ExportToCsv(sfd.FileName) End Select tsUtilidades.Sistema.EjecutaFichero(sfd.FileName) End If Catch ex As Exception Throw New Exception(ex.Message, ex) Finally gc.ItemsSource = tf End Try Case 4 Try Dim sCorreo = bd.enumeraciones.First(Function(x) x.Codigo = "CONF.EMAILASESORIA").ValorAlfabeticoLargo Dim dxnc = New dxwEnvioCorreo(sCorreo, "", "", EmpresaActual.RazonSocial & " - Adjunto le remitimos listado de facturas solicitadas", "Distinguidos Sres., " & vbCrLf & "Adjunto le remitimos listado de facturas solicitadas", "Facturas.zip") If dxnc.ShowDialog Then Dim cta = bd.cuentascorreo.First(Function(x) x.Codigo = "DEFECTO" AndAlso x.idEmpresa = EmpresaActual.idEmpresa) gc.ItemsSource = fras Dim ms As New MemoryStream tv.ExportToXlsx(ms) Dim bFacturas = ms.ToArray DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() Dim dArchivos As New Dictionary(Of String, Byte()) dArchivos.Add("FacturasEmitidas_" & Today.ToString("yyyy-MM-dd") & ".xlsx", bFacturas) For Each fe In fras DXSplashScreen.SetState("Generando archivos de la factura " & fe.NumeroFactura & ", por favor espere ...") Dim ff = fe.documentosfacturas.FirstOrDefault(Function(x) x.Tipo = documentosfacturas.TipoDocumentoFacturaEnum.FACTURA_IMPRESA) If ff IsNot Nothing Then dArchivos.Add(fe.NumeroFactura.Replace("/", "-") & ".pdf", ff.idFicheroNavigation.Fichero) Else If fe.idSerieFacturaNavigation.Tipo = seriesfacturas.TipoSerieFacturaEnum.EMITIDA_POR_CLIENTE Then Throw New Exception("No se ha adjuntado la factura impresa de la factura " & fe.NumeroFactura) Dim ds = New List(Of facturas) Dim idpl As Integer idpl = bd.plantillas.First(Function(x) x.Codigo = "FACTURA").idPlantilla ds.Add(fe) dArchivos.Add(fe.NumeroFactura.Replace("/", "-") & ".pdf", Informes.GuardaInformeEnPdf(bd, idpl, ds)) End If Next DXSplashScreen.SetState("Comprimiendo Archivos, por favor espere ...") Dim bzip = tsUtilidades.zip.ComprimirArchivos(dArchivos) bdGrupoSanchoToro.db.correos.GeneraRegistroCorreon(bd, dxnc._Asunto, dxnc._Cuerpo, cta, dxnc._Destinatarios, dxnc._CC, dxnc._BCC, bzip, dxnc._Adjunto,, "FACTURASEMITIDAS") For Each f In fras f.FechaEnvioAsesoria = Now Next bd.GuardarCambios() End If Catch ex As Exception If ex.Message.StartsWith("No se ha adjuntado la factura impresa") = False Then Throw New Exception(ex.Message, ex) If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show(ex.Message, "Atención") Finally gc.ItemsSource = tf End Try Case 5 'generación de pdf de facturas seleccionadas Dim sfd As New SaveFileDialog sfd.FileName = "Facturas.pdf" sfd.Filter = "Fichero PDF (*.pdf)|*.pdf" sfd.DefaultExt = ".pdf" If sfd.ShowDialog Then DXSplashScreen.Show(Of tsWPFCore.SplashScreenTecnosis)() DXSplashScreen.SetState("Generando PDF, por favor espere ...") Dim lfras As New List(Of Byte()) For Each factura In fras.OrderBy(Function(x) x.NumeroFactura).ToList DXSplashScreen.SetState("Generando Factura " & factura.NumeroFactura & " ...") Dim ds = New List(Of facturas) Dim idpl As Integer If factura.PorcentajeIVA1 > 0 Then idpl = bd.plantillas.First(Function(x) x.Codigo = "FACEMI").idPlantilla Else idpl = bd.plantillas.First(Function(x) x.Codigo = "NOTENT").idPlantilla End If ds.Add(factura) lfras.Add(Informes.GuardaInformeEnPdf(bd, idpl, ds)) Next Dim lista = lfras.Select(Function(x) New MemoryStream(x)).ToArray TSpdfUtils.pdf.UnePdfs(lista, sfd.FileName) tsUtilidades.Sistema.EjecutaFichero(sfd.FileName) End If End Select End If Catch ex As Exception FuncionesDinamicas.ErrorNoControladoAp(Me, ex) 'Comun.GeneraRegistroCorreoExcepcion(bd, ex, "ucEntidad_EjecutarAccion") If DXSplashScreen.IsActive Then DXSplashScreen.Close() DXMessageBox.Show("Error " & ex.Message, "Error") Finally If DXSplashScreen.IsActive Then DXSplashScreen.Close() End Try End Sub Private Sub cbIncluirTodos_Checked(sender As Object, e As RoutedEventArgs) Handles cbIncluirTodos.Checked If Me.teFechaInicio.EditValue Is Nothing Then Me.teFechaInicio.EditValue = Now.Date End Sub End Class