using Gestor.Application.Helpers; using Gestor.Application.Servicos; using Gestor.Common.Validation; using Gestor.Model.Common; using Gestor.Model.Domain.Common; using Gestor.Model.Domain.Ferramentas; using Gestor.Model.Domain.Generic; using Gestor.Model.Domain.MalaDireta; using Gestor.Model.Domain.Seguros; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace Gestor.Application.ViewModels.Generic { public class DialogEnviarEmailsViewModel : BaseSegurosViewModel { private ObservableCollection _listaTela = new ObservableCollection(); private string _infoEnvio = "CLIQUE EM ENVIAR PARA INCIAR O ENVIO"; private List _arquivosAnexados { get; set; } private bool _assinatura { get; set; } private string _assunto { get; set; } private bool _confirmarLeitura { get; set; } private string _corpo { get; set; } private Credencial _credencial { get; set; } private FiltroArquivoDigital _filtro { get; set; } private bool _original { get; set; } private bool _salvarAd { get; set; } public string InfoEnvio { get { return this._infoEnvio; } set { this._infoEnvio = value; base.OnPropertyChanged("InfoEnvio"); } } public List Lista { get; set; } public ObservableCollection ListaTela { get { return this._listaTela; } set { this._listaTela = value; base.OnPropertyChanged("ListaTela"); } } public DialogEnviarEmailsViewModel(List lista, bool assinatura, bool original, List arquivosAnexados, string assunto, string corpo, Credencial credencial, FiltroArquivoDigital filtro, bool salvarAd, bool confirmarLeitura) { lista.ForEach((MalaDireta x) => x.set_InfoEnvio(null)); this.Lista = lista; this.PrepararLista(); this._assinatura = assinatura; this._original = original; this._arquivosAnexados = arquivosAnexados; this._assunto = assunto; this._corpo = corpo; this._credencial = credencial; this._filtro = filtro; this._salvarAd = salvarAd; this._confirmarLeitura = confirmarLeitura; } public void Enviar() { this.Enviar(this._assinatura, this._original, this._arquivosAnexados, this._assunto, this._corpo, this._credencial, this._filtro, this._salvarAd, this._confirmarLeitura); } private async void Enviar(bool assinatura, bool original, List arquivosAnexados, string assunto, string corpo, Credencial credencial, FiltroArquivoDigital filtro, bool salvarAd, bool confirmarLeitura) { base.Loading(true); this.InfoEnvio = "ENVIANDO, AGUARDE ATÉ O PROCESSO TERMINAR."; await this.EnviarEmails(assinatura, original, arquivosAnexados, assunto, corpo, credencial, filtro, salvarAd, confirmarLeitura); this.InfoEnvio = "TENTATIVA DE ENVIO CONCLUÍDA, CONFIRA O STATUS ABAIXO."; base.Loading(false); } private async Task EnviarEmails(bool assinatura, bool original, List arquivosAnexados, string assunto, string corpo, Credencial credencial, FiltroArquivoDigital filtro, bool salvarAd, bool confirmarLeitura) { int i; List arquivoDigitals; List arquivoDigitals1; bool flag; bool arquivoDigital; List copiaComum; List copiaOculta; string str; long? nullable; bool valueOrDefault; List strs = new List(); VariaveisMalaDireta[] values = (VariaveisMalaDireta[])Enum.GetValues(typeof(VariaveisMalaDireta)); for (i = 0; i < (int)values.Length; i++) { strs.Add(ValidationHelper.GetEntity(values[i])); } if (strs.Any(new Func(assunto.Contains)) || strs.Any(new Func(corpo.Contains))) { flag = true; } else { List lista = this.Lista; flag = lista.Any((MalaDireta x) => { if (x.get_ArquivoDigital() == null) { return false; } return x.get_ArquivoDigital().Count > 0; }); } bool flag1 = flag; Credencial credencial1 = credencial; MailHelper mailHelper = new MailHelper(); bool flag2 = false; if (salvarAd) { Gestor.Application.Servicos.ArquivoDigitalServico arquivoDigitalServico = new Gestor.Application.Servicos.ArquivoDigitalServico(); foreach (MalaDireta listum in this.Lista) { arquivosAnexados.ForEach((Gestor.Model.Domain.Common.ArquivoDigital a) => { a.set_IdCliente((listum.get_Tela() == 1 ? listum.get_Cliente().get_Id() : (long)0)); a.set_IdDocumento((listum.get_Tela() == 2 ? listum.get_Apolice().get_Id() : (long)0)); a.set_IdItem((listum.get_Tela() == 3 ? listum.get_Item().get_Id() : (long)0)); a.set_IdParcela((listum.get_Tela() == 5 ? listum.get_Parcela().get_Id() : (long)0)); a.set_IdProspeccao((listum.get_Tela() == 33 ? listum.get_Prospeccao().get_Id() : (long)0)); a.set_IdSinistro((listum.get_Tela() == 7 ? listum.get_Sinistro().get_Id() : (long)0)); a.set_IdEmpresa(Recursos.Usuario.get_IdEmpresa()); }); List indiceArquivoDigitals = await arquivoDigitalServico.Insert(arquivosAnexados.ToList()); List arquivoDigitals2 = arquivosAnexados; if (!arquivoDigitals2.Any((Gestor.Model.Domain.Common.ArquivoDigital arquivo) => arquivo.get_Arquivo() == null)) { continue; } arquivoDigitals = await arquivoDigitalServico.Buscar(indiceArquivoDigitals); arquivosAnexados = arquivoDigitals; } arquivoDigitalServico = null; } if (!string.IsNullOrWhiteSpace(credencial.get_Cabecalho())) { corpo = string.Concat(credencial.get_Cabecalho(), corpo); } if (!string.IsNullOrWhiteSpace(credencial.get_Assinatura())) { corpo = string.Concat(corpo, "

", credencial.get_Assinatura()); } if (flag1) { for (int j = 0; j < this.Lista.Count; j = i + 1) { MalaDireta item = this.Lista[j]; if (item.get_ArquivoDigital() == null) { arquivoDigitals = new List(); } else { if (!(!assinatura | original)) { Gestor.Application.Servicos.ArquivoDigitalServico arquivoDigitalServico1 = this.ArquivoDigitalServico; List arquivoDigital1 = item.get_ArquivoDigital(); arquivoDigitals1 = await arquivoDigitalServico1.Buscar(( from x in arquivoDigital1 where string.IsNullOrWhiteSpace(x.get_UrlAssinatura()) select x).ToList()); } else { arquivoDigitals1 = await this.ArquivoDigitalServico.Buscar(item.get_ArquivoDigital().ToList()); } arquivoDigitals = arquivoDigitals1; } List arquivoDigitals3 = arquivoDigitals; if (arquivosAnexados != null && arquivosAnexados.Count > 0) { arquivoDigitals3.AddRange(arquivosAnexados); } MalaDireta malaDiretum = item; if (malaDiretum != null) { arquivoDigital = malaDiretum.get_ArquivoDigital(); } else { arquivoDigital = false; } if (!arquivoDigital) { MalaDireta malaDiretum1 = item; if (malaDiretum1 != null) { Documento apolice = malaDiretum1.get_Apolice(); if (apolice != null) { nullable = new long?(apolice.get_Id()); } else { nullable = null; } long? nullable1 = nullable; long num = (long)0; valueOrDefault = nullable1.GetValueOrDefault() > num & nullable1.HasValue; } else { valueOrDefault = false; } if (valueOrDefault) { MalaDireta malaDiretum2 = item; List indiceArquivoDigitals1 = await this.ArquivoDigitalServico.BuscarPorTipo(2, item.get_Apolice().get_Id()); malaDiretum2.set_ArquivoDigital(indiceArquivoDigitals1); malaDiretum2 = null; } } Destinatario destinatario = new Destinatario(); destinatario.set_Assunto(Funcoes.SubstituirVariaveis(assunto, item)); destinatario.set_Corpo(Funcoes.SubstituirVariaveis(corpo, item)); destinatario.set_Email(item.get_Email()); Copia copia = item.get_Copia(); if (copia != null) { copiaComum = copia.get_CopiaComum(); } else { copiaComum = null; } destinatario.set_Encaminhar(copiaComum); Copia copium = item.get_Copia(); if (copium != null) { copiaOculta = copium.get_CopiaOculta(); } else { copiaOculta = null; } destinatario.set_EncaminharOculto(copiaOculta); destinatario.set_Nome(item.get_Cliente().get_Nome()); destinatario.set_Anexos(arquivoDigitals3); Destinatario destinatario1 = destinatario; List malaDiretas = new List() { item }; LogEnvio logEnvio = await mailHelper.SendAsync(credencial, destinatario1, filtro, malaDiretas, 0, confirmarLeitura); item.set_Enviado(new bool?(logEnvio.get_Enviado())); MalaDireta malaDiretum3 = item; str = (logEnvio.get_Enviado() ? "ENVIADO COM SUCESSO" : string.Concat("NÃO ENVIADO, ENTRE EM CONTATO COM SEU PROVEDOR/SERVIÇO DE E-MAIL E INFORME OS DADOS ABAIXO: \r\n", logEnvio.get_Erro())); malaDiretum3.set_InfoEnvio(str); item.set_ArquivoDigital(null); this.Lista = this.Lista; item = null; arquivoDigitals3 = null; i = j; } } else { while (!flag2) { List lista1 = this.Lista; List list = ( from x in lista1 where !x.get_Enviado().HasValue select x).Take(200).ToList(); List malaDiretas1 = list; List list1 = ( from x in malaDiretas1 select x.get_Email()).ToList(); list.ForEach((MalaDireta x) => { if (x.get_Copia() == null) { return; } list1.AddRange(x.get_Copia().get_CopiaComum()); list1.AddRange(x.get_Copia().get_CopiaOculta()); }); list1 = list1.Distinct().ToList(); Destinatario destinatario2 = new Destinatario(); destinatario2.set_Assunto(assunto); destinatario2.set_Corpo(corpo); destinatario2.set_Email(credencial1.get_Email()); destinatario2.set_Nome(credencial1.get_Descricao()); destinatario2.set_Encaminhar(new List()); destinatario2.set_EncaminharOculto(list1); destinatario2.set_Anexos(arquivosAnexados.ToList()); Destinatario destinatario3 = destinatario2; LogEnvio logEnvio1 = await mailHelper.SendAsync(credencial, destinatario3, filtro, this.Lista.ToList(), 0, confirmarLeitura); LogEnvio logEnvio2 = logEnvio1; List list2 = this.Lista.ToList(); list2.ForEach((MalaDireta x) => { x.set_Enviado(new bool?(logEnvio2.get_Enviado())); x.set_InfoEnvio((logEnvio2.get_Enviado() ? "ENVIADO COM SUCESSO" : string.Concat("NÃO ENVIADO, ENTRE EM CONTATO COM SEU PROVEDOR/SERVIÇO DE E-MAIL E INFORME OS DADOS ABAIXO: \r\n", logEnvio2.get_Erro()))); }); this.Lista = list2; List lista2 = this.Lista; flag2 = lista2.All((MalaDireta x) => x.get_Enviado().HasValue); } } this.PrepararLista(); credencial1 = null; mailHelper = null; } private void PrepararLista() { List malaDiretas = new List(); this.Lista.ForEach((MalaDireta x) => { malaDiretas.Add(x); if (x.get_Copia() == null) { return; } malaDiretas.AddRange(x.get_Copia().get_CopiaOculta().Select((string c) => { MalaDireta malaDiretum = new MalaDireta(); malaDiretum.set_Cliente(x.get_Cliente()); malaDiretum.set_Email(c); malaDiretum.set_Enviado(x.get_Enviado()); malaDiretum.set_InfoEnvio(x.get_InfoEnvio()); return malaDiretum; }).ToList()); }); this.ListaTela = new ObservableCollection(malaDiretas); } } }