using ClosedXML.Excel; using Gestor.Application.Componentes; using Gestor.Application.Helpers; using Gestor.Application.Model; using Gestor.Application.ViewModels.Generic; using Gestor.Common.Helpers; using Gestor.Model.Attributes; using Gestor.Model.Domain.Configuracoes; using Gestor.Model.Domain.Relatorios; using LiveCharts; using LiveCharts.Definitions.Series; using LiveCharts.Helpers; using LiveCharts.Wpf; using NReco.PdfGenerator; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; using System.Windows.Media; namespace Gestor.Application.ViewModels.Relatorios { public class SinteticoViewModel : BaseSegurosViewModel { private Visibility _unicaPaginaVisibility = Visibility.Collapsed; private Geometry _maximizeRestore = Geometry.Parse((string)System.Windows.Application.Current.Resources["Restore"]); private ObservableCollection _series; private string _titulotela = string.Format("RELATÓRIO SINTÉTICO | VERSÃO GESTOR {0}", ApplicationHelper.Versao); public Geometry MaximizeRestore { get { return this._maximizeRestore; } set { this._maximizeRestore = value; base.OnPropertyChanged("MaximizeRestore"); } } public string Relatorio { get; set; } public ObservableCollection Series { get { return this._series; } set { this._series = value; base.OnPropertyChanged("Series"); } } public string Titulotela { get { return this._titulotela; } set { this._titulotela = value; base.OnPropertyChanged("Titulotela"); } } public Visibility UnicaPaginaVisibility { get { return this._unicaPaginaVisibility; } set { this._unicaPaginaVisibility = value; base.OnPropertyChanged("UnicaPaginaVisibility"); } } public SinteticoViewModel(List sintetico, string relatorio) { this.Relatorio = relatorio; this.GerarSintetico(sintetico); } public async Task GerarExcel(SinteticoSource sintetico) { List listagems = SinteticoViewModel.GerarRelacao(sintetico.Lista.ToList()); string tempPath = ""; string str = ""; List configuracoes = Recursos.Configuracoes; if (!configuracoes.Any((ConfiguracaoSistema x) => x.get_Configuracao() == 41)) { tempPath = Path.GetTempPath(); str = string.Format("{0}{1}.xlsx", tempPath, Guid.NewGuid()); } else { using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog()) { if (DialogResult.OK == folderBrowserDialog.ShowDialog()) { tempPath = string.Concat(folderBrowserDialog.SelectedPath, "\\"); Directory.CreateDirectory(tempPath); } else { str = null; return; } } DateTime date = Functions.GetNetworkTime().Date; str = string.Concat(tempPath, "SINTETICO ", date.ToShortDateString().Replace("/", ""), ".xlsx"); } await Funcoes.GerarXls(new XLWorkbook(), "SINTÉTICO", listagems, null).SaveAs(str); Process.Start(str); str = null; } public async Task GerarPdf(SinteticoSource sintetico) { string str = await Funcoes.GenerateTable(SinteticoViewModel.GerarRelacao(sintetico.Lista.ToList()), new List(), false, false, "", null); TipoRelatorio tipoRelatorio = new TipoRelatorio(); tipoRelatorio.set_Nome(sintetico.Titulo); tipoRelatorio.set_Inicio(DateTime.MinValue); tipoRelatorio.set_Fim(DateTime.MinValue); string str1 = Funcoes.ExportarHtml(tipoRelatorio, str, "60", "landscape", false, ""); NRecoHtmlToPdfConverter nRecoHtmlToPdfConverter = new NRecoHtmlToPdfConverter(); ((HtmlToPdfConverter)nRecoHtmlToPdfConverter).set_Orientation(1); ((HtmlToPdfConverter)nRecoHtmlToPdfConverter).set_Zoom(0.5f); byte[] numArray = ((HtmlToPdfConverter)nRecoHtmlToPdfConverter).GeneratePdf(str1); using (SaveFileDialog saveFileDialog = new SaveFileDialog()) { saveFileDialog.Filter = "All Files|*.*"; saveFileDialog.FileName = string.Format("RELATORIO FINANCEIRO_{0:ddMMyyyyhhmmss}", Funcoes.GetNetworkTime()); if (DialogResult.OK != saveFileDialog.ShowDialog()) { return; } else if (!File.Exists(string.Concat(saveFileDialog.FileName, ".pdf"))) { File.WriteAllBytes(string.Concat(saveFileDialog.FileName, ".pdf"), numArray); Process.Start(string.Concat(saveFileDialog.FileName, ".pdf")); } else { string[] fileName = new string[] { "JÁ EXISTE UM ARQUIVO COM O NOME DE ", saveFileDialog.FileName, ".pdf NA PASTA SELECIONADA. ", Environment.NewLine, "TENTE NOVAMENTE EM OUTRA PASTA." }; await base.ShowMessage(string.Concat(fileName), "OK", "", false); return; } } saveFileDialog = null; } private static List GerarRelacao(List lista) { return lista.Select((ValorSintetico x) => { Listagem listagem = new Listagem(); listagem.set_Agrupamento(x.get_Indice()); listagem.set_Valor((x.get_Formato() == "VALOR" ? x.get_Valor().ToString("c2") : (x.get_Formato() == "PERCENTUAL" ? x.get_Valor().ToString("p2") : x.get_Valor().ToString(new CultureInfo("pt-BR"))))); listagem.set_NomeRelatorio(x.get_NomeRelatorio()); return listagem; }).ToList(); } private static List> GerarRelacao(List> listas) { List> lists = new List>(); foreach (List lista in listas) { lists.Add(SinteticoViewModel.GerarRelacao(lista)); } return lists; } private void GerarSintetico(List sintetico) { IChartValues chartValue; decimal num; this.UnicaPaginaVisibility = (this.Relatorio == "RELATÓRIO DE FECHAMENTO" ? Visibility.Visible : Visibility.Collapsed); this.Series = new ObservableCollection(); PropertyInfo[] properties = sintetico.First().GetType().GetProperties(); for (int i = 0; i < (int)properties.Length; i++) { PropertyInfo propertyInfo = properties[i]; if (!(propertyInfo.Name == "ValidationEvent") && !(propertyInfo.Name == "Agrupamento") && !sintetico.All((Sintetico s) => { object value; PropertyInfo property = s.GetType().GetProperty(propertyInfo.Name); value = (property != null ? property.GetValue(s, null) : null); return value == null; })) { object obj = propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault(); if (obj != null) { string description = ((DescriptionAttribute)obj).Description; SinteticoSource sinteticoSource = new SinteticoSource() { Titulo = description, Colecao = new SeriesCollection(), Lista = new ObservableCollection() }; object obj1 = propertyInfo.GetCustomAttributes(typeof(TipoAttribute), true).FirstOrDefault(); string str = ""; if (obj1 != null) { str = ((TipoAttribute)obj1).get_Description(); } sintetico = ( from x in sintetico orderby propertyInfo.GetValue(x, null) descending select x).ToList(); foreach (Sintetico sintetico1 in sintetico) { bool flag = false; PieSeries pieSeries = new PieSeries(); pieSeries.set_Title(sintetico1.get_Agrupamento()); pieSeries.set_DataLabels(false); PieSeries pieSeries1 = pieSeries; if (str == "PERCENTUAL") { flag = (decimal)propertyInfo.GetValue(sintetico1) < decimal.Zero; ChartValues chartValue1 = new ChartValues(); chartValue1.Add(Math.Abs((decimal)propertyInfo.GetValue(sintetico1))); chartValue = chartValue1; ObservableCollection lista = sinteticoSource.Lista; ValorSintetico valorSintetico = new ValorSintetico(); valorSintetico.set_Indice(string.Concat(sintetico1.get_Agrupamento(), (flag ? " (-)" : ""))); valorSintetico.set_Valor(Math.Round((decimal)propertyInfo.GetValue(sintetico1) * new decimal(1, 0, 0, false, 2), 2)); valorSintetico.set_Unidate("%"); valorSintetico.set_Sinal((flag ? 1 : 0)); valorSintetico.set_NomeRelatorio(description); lista.Add(valorSintetico); pieSeries1.set_LabelPoint((ChartPoint chartPoint) => ((decimal)propertyInfo.GetValue(sintetico1)).ToString("n2")); } else if (str == "VALOR") { flag = (decimal)propertyInfo.GetValue(sintetico1) < decimal.Zero; ChartValues chartValue2 = new ChartValues(); chartValue2.Add(Math.Abs((decimal)propertyInfo.GetValue(sintetico1))); chartValue = chartValue2; ObservableCollection observableCollection = sinteticoSource.Lista; ValorSintetico valorSintetico1 = new ValorSintetico(); valorSintetico1.set_Indice(string.Concat(sintetico1.get_Agrupamento(), (flag ? " (-)" : ""))); valorSintetico1.set_Valor(Math.Round((decimal)propertyInfo.GetValue(sintetico1), 2)); valorSintetico1.set_Formato(str); valorSintetico1.set_Unidate("R$"); valorSintetico1.set_Sinal((flag ? 1 : 0)); valorSintetico1.set_NomeRelatorio(description); observableCollection.Add(valorSintetico1); pieSeries1.set_LabelPoint((ChartPoint chartPoint) => ((decimal)propertyInfo.GetValue(sintetico1)).ToString("n2")); } else { flag = (int)propertyInfo.GetValue(sintetico1) < 0; ChartValues chartValue3 = new ChartValues(); chartValue3.Add(Math.Abs((int)propertyInfo.GetValue(sintetico1))); chartValue = chartValue3; ObservableCollection lista1 = sinteticoSource.Lista; ValorSintetico valorSintetico2 = new ValorSintetico(); valorSintetico2.set_Indice(string.Concat(sintetico1.get_Agrupamento(), (flag ? " (-)" : ""))); valorSintetico2.set_Valor(decimal.Parse(propertyInfo.GetValue(sintetico1).ToString())); valorSintetico2.set_Formato(str); valorSintetico2.set_Sinal((flag ? 1 : 0)); valorSintetico2.set_NomeRelatorio(description); lista1.Add(valorSintetico2); pieSeries1.set_LabelPoint((ChartPoint chartPoint) => ((int)propertyInfo.GetValue(sintetico1)).ToString("n")); } pieSeries1.set_Values(chartValue); sinteticoSource.Colecao.Add(pieSeries1); } if (obj1 != null && !(str == "PERCENTUAL")) { if (str != "VALOR") { if (this.Relatorio.Equals("RELATÓRIO DE FECHAMENTO")) { int num1 = sintetico.Sum((Sintetico x) => (int)propertyInfo.GetValue(x, null)); if (num1 != 0) { foreach (ValorSintetico listum in sinteticoSource.Lista) { num = (new decimal(100) * listum.get_Valor()) / num1; listum.set_Porcentagem(string.Concat(num.ToString("F"), "%")); } } } else { int num2 = sintetico.Sum((Sintetico x) => (int)propertyInfo.GetValue(x, null)); if (num2 != 0) { foreach (ValorSintetico listum1 in sinteticoSource.Lista) { num = (new decimal(100) * listum1.get_Valor()) / num2; listum1.set_Porcentagem(string.Concat(num.ToString("F"), "%")); } } ObservableCollection observableCollection1 = sinteticoSource.Lista; ValorSintetico valorSintetico3 = new ValorSintetico(); valorSintetico3.set_Indice("TOTAL"); valorSintetico3.set_Valor(num2); valorSintetico3.set_Formato(str); valorSintetico3.set_Sinal((sintetico.Sum((Sintetico x) => (int)propertyInfo.GetValue(x, null)) < 0 ? 1 : 0)); valorSintetico3.set_Porcentagem("100%"); observableCollection1.Add(valorSintetico3); } } else if (this.Relatorio.Equals("RELATÓRIO DE FECHAMENTO")) { decimal num3 = Math.Round(sintetico.Sum((Sintetico x) => (decimal)propertyInfo.GetValue(x, null)), 2); if (num3 != decimal.Zero) { foreach (ValorSintetico listum2 in sinteticoSource.Lista) { num = (new decimal(100) * listum2.get_Valor()) / num3; listum2.set_Porcentagem(string.Concat(num.ToString("F"), "%")); } } } else { decimal num4 = Math.Round(sintetico.Sum((Sintetico x) => (decimal)propertyInfo.GetValue(x, null)), 2); if (num4 != decimal.Zero) { foreach (ValorSintetico listum3 in sinteticoSource.Lista) { num = (new decimal(100) * listum3.get_Valor()) / num4; listum3.set_Porcentagem(string.Concat(num.ToString("F"), "%")); } } ObservableCollection lista2 = sinteticoSource.Lista; ValorSintetico valorSintetico4 = new ValorSintetico(); valorSintetico4.set_Indice("TOTAL"); valorSintetico4.set_Valor(num4); valorSintetico4.set_Unidate("R$"); valorSintetico4.set_Formato(str); valorSintetico4.set_Sinal((sintetico.Sum((Sintetico x) => (decimal)propertyInfo.GetValue(x, null)) < decimal.Zero ? 1 : 0)); valorSintetico4.set_Porcentagem("100%"); lista2.Add(valorSintetico4); } } this.Series.Add(sinteticoSource); } } } } public async Task Print(SinteticoSource sintetico) { DateTime dateTime; DateTime dateTime1; string str = Funcoes.GerarGrafico(sintetico.Lista.ToList()); string str1 = await Funcoes.GenerateTable(SinteticoViewModel.GerarRelacao(sintetico.Lista.ToList()), new List(), true, false, "", null); TipoRelatorio tipoRelatorio = new TipoRelatorio(); tipoRelatorio.set_Nome(sintetico.Titulo); DateTime? dateStart = sintetico.DateStart; dateTime = (dateStart.HasValue ? dateStart.GetValueOrDefault() : DateTime.MinValue); tipoRelatorio.set_Inicio(dateTime); dateStart = sintetico.DateFinal; dateTime1 = (dateStart.HasValue ? dateStart.GetValueOrDefault() : DateTime.MinValue); tipoRelatorio.set_Fim(dateTime1); string str2 = Funcoes.ExportarHtml(tipoRelatorio, str1, "60", "landscape", false, str); string tempPath = Path.GetTempPath(); string str3 = string.Format("{0}{1}_{2:ddMMyyyyhhmmss}.html", tempPath, (new Regex(string.Concat("[", Regex.Escape(string.Concat(new string(Path.GetInvalidFileNameChars()), new string(Path.GetInvalidPathChars()))), "]"))).Replace(this.Relatorio, ""), Funcoes.GetNetworkTime()); StreamWriter streamWriter = new StreamWriter(str3, true, Encoding.UTF8); streamWriter.Write(str2); streamWriter.Close(); Process.Start(str3); str = null; } public async Task PrintUnica(SinteticoSource sintetico) { DateTime dateTime; DateTime dateTime1; List> lists = new List>(); foreach (SinteticoSource series in this.Series) { lists.Add(series.Lista.ToList()); } string str = Funcoes.GerarGraficoUnico(lists); string str1 = await Funcoes.GenerateMultipleTable(SinteticoViewModel.GerarRelacao(lists), new List(), true, false, "", null); TipoRelatorio tipoRelatorio = new TipoRelatorio(); tipoRelatorio.set_Nome("RELATÓRIOS"); DateTime? dateStart = sintetico.DateStart; dateTime = (dateStart.HasValue ? dateStart.GetValueOrDefault() : DateTime.MinValue); tipoRelatorio.set_Inicio(dateTime); dateStart = sintetico.DateFinal; dateTime1 = (dateStart.HasValue ? dateStart.GetValueOrDefault() : DateTime.MinValue); tipoRelatorio.set_Fim(dateTime1); string str2 = Funcoes.ExportarMultipleHtml(tipoRelatorio, str1, "60", "landscape", false, str); string tempPath = Path.GetTempPath(); string str3 = string.Format("{0}{1}_{2:ddMMyyyyhhmmss}.html", tempPath, (new Regex(string.Concat("[", Regex.Escape(string.Concat(new string(Path.GetInvalidFileNameChars()), new string(Path.GetInvalidPathChars()))), "]"))).Replace(this.Relatorio, ""), Funcoes.GetNetworkTime()); StreamWriter streamWriter = new StreamWriter(str3, true, Encoding.UTF8); streamWriter.Write(str2); streamWriter.Close(); Process.Start(str3); str = null; } } }