Exemplo n.º 1
0
        public RisultatoInvioMessaggioAllegati InvioMessaggioPersone(MotivoMessaggio motivoMessaggio, string oggetto, string messaggio, IList<PersonaMessaggioDTO> persone, Dictionary<int, BindingList<ContattoDTO>> contatti, string mittente, string emailRapportino, IList<DocumentoMessaggioDTO> allegati, IList<DocumentInfo> allegatiNuovi, TipoMessaggio tipo, int? idModello, ParametriStampaUnione parametri, ParametriInvioLettera parametriInvioLettera, bool aggiornaContatti, int? idCondominio, int azienda)
        {
            try
            {
                var result = new List<RisultatoInvioMessaggio>();
                var allegatiResult = new List<DocumentInfo>();
                var messaggioInviato = new DocumentInfo();
                if (persone.Count > 0)
                {
                    var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
                    var archiviazioneService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IArchiviazioneOtticaService>();
                    var converter = _windsorRepository.GetContainer(_info.Azienda).Resolve<IConverter>();

                    Condominio condominio = null;
                    if (idCondominio > 0)
                        condominio = daoFactory.GetCondominioDao().Find(idCondominio.GetValueOrDefault(), false);

                    IMessageService service = null;

                    switch (tipo)
                    {
                        case TipoMessaggio.Fax:
                            service = _windsorRepository.GetContainer(_info.Azienda).Resolve<IMessageService>("messageservice.fax");
                            break;
                        case TipoMessaggio.Email:
                            service = _windsorRepository.GetContainer(_info.Azienda).Resolve<IMessageService>("messageservice.email");
                            break;
                        case TipoMessaggio.Sms:
                            service = _windsorRepository.GetContainer(_info.Azienda).Resolve<IMessageService>("messageservice.sms");
                            break;
                        case TipoMessaggio.Lettera:
                            service = _windsorRepository.GetContainer(_info.Azienda).Resolve<IMessageService>("messageservice.lettera");
                            break;
                        case TipoMessaggio.Manuale:
                            service = _windsorRepository.GetContainer(_info.Azienda).Resolve<IMessageService>("messageservice.manuale");
                            break;
                    }

                    var personaService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IPersonaService>();

                    ModelloLettera modello = null;
                    if (idModello != null)
                        modello = daoFactory.GetModelloLetteraDao().GetById(idModello.Value, false);

                    // =========================================================================================
                    // Allegati
                    // =========================================================================================
                    var allegatiMessaggio = new List<DocumentInfo>(allegati.Count() + 1);
                    var documentoRepository = new DocumentoRepository(_info, _windsorRepository);
                    foreach (var idDocumento in allegati)
                    {
                        Documento documento = null;
                        if(idDocumento.Id != null)
                            documento = daoFactory.GetDocumentoDao().Find(idDocumento.Id.Value, false);
                        if (documento != null)
                        {
                            var tipoDocumento = TipoDocumentoArchiviazione.Contratto;
                            if (documento.SpesaRiferimento != null)
                                tipoDocumento = TipoDocumentoArchiviazione.FatturaPassiva;
                            var docInfo = documentoRepository.GetDocumentInfo(idDocumento.Id.Value, tipoDocumento);

                            if (docInfo.Body != null)
                            {
                                allegatiMessaggio.Add(docInfo);
                                allegatiResult.Add(docInfo);
                            }
                            else
                                _log.ErrorFormat("Tentativo di allegare documento vuoto - {0} - documento:{1}", Utility.GetMethodDescription(), documento.ID);
                        }
                        else if(documento == null && idDocumento.IdSpesa != null)
                        {
                            var spesa = daoFactory.GetSpesaDao().Find(idDocumento.IdSpesa.Value, false);
                            var identificativoArchiviazione = archiviazioneService.GetIdentificativoArchiviazione(spesa, false);
                            var docInfo = documentoRepository.GetDocumentBody(identificativoArchiviazione, TipoDocumentoArchiviazione.FatturaPassiva);
                            if (docInfo.Body != null)
                                allegatiMessaggio.Add(docInfo);
                            else
                                _log.ErrorFormat("Tentativo di allegare documento vuoto - {0} - spesa:{1}", Utility.GetMethodDescription(), idDocumento.IdSpesa);
                        }
                    }

                    // =========================================================================================
                    // Allegati Nuovi
                    // =========================================================================================
                    var allegatiNuoviAry = allegatiNuovi.ToArray();
                    for (var i = 0; i < allegatiNuoviAry.Length; i++)
                    {
                        if (string.IsNullOrEmpty(allegatiNuoviAry[i].BodyText))
                        {
                            var allegatiElaborati = elaboraAllegato(allegatiNuoviAry[i], null, parametri, tipo, converter, azienda);
                            if (allegatiElaborati != null)
                            {
                                allegatiMessaggio.Add(allegatiElaborati.Value.AllegatoDaInviare);
                                allegatiResult.Add(allegatiElaborati.Value.AllegatoResult);
                            }
                        }
                    }

                    // =========================================================================================
                    //  Non è presente nessuna stampa unione
                    // =========================================================================================
                    if ((modello == null || !modello.StampaUnione) && !isStampaUnione(oggetto, messaggio))
                    {
                        if (modello != null && (tipo == TipoMessaggio.Fax || tipo == TipoMessaggio.Lettera || tipo == TipoMessaggio.Manuale || tipo == TipoMessaggio.Email))
                        {
                            var modelloLetteraService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IModelloLetteraService>();
                            var documento = modelloLetteraService.GetLettera(idModello.Value);
                            documento.FileName = "Documento Allegato";

                            if (tipo != TipoMessaggio.Manuale)
                            {
                                var doc = new Document(new MemoryStream(documento.Body));
                                var pdfStream = new MemoryStream();
                                doc.Save(pdfStream, SaveFormat.Pdf);
                                documento.Body = pdfStream.ToArray();
                                documento.FileExtension = ".pdf";
                            }

                            allegatiMessaggio.Insert(0, documento);
                            allegatiResult.Add(documento);
                        }

                        IList<PersonaMessaggioDTO> personeMessaggio = new List<PersonaMessaggioDTO>();
                        foreach (var personaMessaggio in persone)
                        {
                            IList<ContattoDTO> contattiPersona = new List<ContattoDTO>();
                            if (contatti.ContainsKey(personaMessaggio.ID))
                                contattiPersona = contatti[personaMessaggio.ID];
                            personaMessaggio.Contatti = contattiPersona;
                            personeMessaggio.Add(personaMessaggio);
                        }
                        var destinatari = personaService.GetContattiSelezionatiByTipo(personeMessaggio, tipo);
                        if (destinatari.Count > 0)
                        {
                            if (service != null)
                            {
                                var risultatoInvio = service.InvioMessaggio(azienda, null, null, parametri.IdUnitaImmobiliare, parametri.IdFornitore, parametri.IdResponsabile, parametri.IdIncaricatoAttivita, motivoMessaggio, oggetto, messaggio, destinatari, mittente, emailRapportino, allegatiMessaggio, parametriInvioLettera).ToArray();
   
                                // In questo caso lo storico deve essere creato ora per ogni persona
                                foreach (var personaMessaggio in persone)
                                {
                                    var persona = daoFactory.GetPersonaDao().Find(personaMessaggio.ID, false);
                                    if (persona != null)
                                    {
                                        var storicoMessaggio = getMessaggisticaService().StoricizzaMessaggio(persona, condominio, risultatoInvio[0], motivoMessaggio, oggetto, messaggio, destinatari, mittente, emailRapportino, allegatiMessaggio, tipo);
                                        if (storicoMessaggio != null)
                                        {
                                            for (var i = 0; i < risultatoInvio.Length; i++)
                                                risultatoInvio[i].IdMessaggio = storicoMessaggio.ID;
                                        }
                                    }
                                }

                                if (parametriInvioLettera.AccodaMessaggio || parametriInvioLettera.ApriFileGenerato)
                                {
                                    var zipFile = service.FinalizzaMessaggio(oggetto, parametriInvioLettera.AccodaMessaggio, azienda);
                                    if (parametriInvioLettera.ApriFileGenerato)
                                        messaggioInviato = zipFile;
                                }

                                result.AddRange(risultatoInvio);
                            }
                        }
                        else
                            result.Add(new RisultatoInvioMessaggio(string.Empty, null, false, "Non è presente nessun destinatario", new DocumentInfo()));
                    }

                    // =========================================================================================
                    //  E' presente stampa unione con modello oppure direttamente nel testo
                    // =========================================================================================
                    else
                    {
                        Delivery delivery = null;
                        foreach (var personaMessaggio in persone)
                        {
                            var allegatiInvio = allegatiMessaggio.ToList();

                            var persona = daoFactory.GetPersonaDao().Find(personaMessaggio.ID, false);

                            if (persona != null)
                            {

                                var modelloLetteraService = _windsorRepository.GetContainer(_info.Azienda).Resolve<IModelloLetteraService>();
                                parametri.IdPersonaAttiva = personaMessaggio.ID;
                                parametri.Importo = personaMessaggio.Importo;
                                parametri.IdUnitaImmobiliare = personaMessaggio.IdUnitaImmobiliare;
                                if (idCondominio != null)
                                    parametri.IdCondominio = idCondominio.Value;
                                
                                var faxDestinatario = string.Empty;
                                if (tipo == TipoMessaggio.Fax && contatti.ContainsKey(persona.ID) && contatti[persona.ID].Count > 0)
                                    faxDestinatario = contatti[persona.ID].FirstOrDefault().Valore;
                                if (string.IsNullOrEmpty(faxDestinatario))
                                {
                                    var contattiCollection = new ContattoCollection(persona.Contatti);
                                    var contattoFax = contattiCollection.GetFirstContatto<Fax>();
                                    if (contattoFax != null)
                                        faxDestinatario = contattoFax.Valore;
                                }
                                parametri.FaxDestinatario = faxDestinatario;

                                // Se è definita una persona da contattare nella stampa unione deve essere usata quest'ultima
                                var idPersonaStampaUnione = persona.ID;
                                if (parametri.IdPersonaRichiedente != null)
                                    idPersonaStampaUnione = parametri.IdPersonaRichiedente.GetValueOrDefault();
                                var parametriStampaUnione = new ParametriStampaUnione(idPersonaStampaUnione, parametri.IdUnitaImmobiliare, parametri.IdResponsabile, parametri.IdIncaricatoAttivita, parametri.IdFornitore, idCondominio, null, personaMessaggio.TipoIndirizzo, personaMessaggio.Importo, null, null, null, parametri.TelefonoDaContattare, null, null, null, null, null, parametri.IdPersonaRichiedente, null, null, parametri.Descrizione, null, null, null, null, null, null) { IdAssemblea = parametri.IdAssemblea };
                                var messaggioPrincipale = getMessaggisticaService().ApplicaStampaUnione(messaggio, parametriStampaUnione, _info.Azienda);
                                var oggettoPrincipale = getMessaggisticaService().ApplicaStampaUnione(oggetto, parametriStampaUnione, _info.Azienda);

                                parametri.Oggetto = oggettoPrincipale;
                                parametri.TipoIndirizzo = personaMessaggio.TipoIndirizzo;

                                // ------------------------------------------------------------------------
                                //allegatiInvio
                                //devo processare gli allegati nuovi che hanno bodytext non nullo
                                //questi doc possono avere tag di stampa unione per persona
                                // =========================================================================================
                                // Allegati Nuovi
                                // =========================================================================================
                                allegatiNuoviAry = allegatiNuovi.ToArray();
                                for (var i = 0; i < allegatiNuoviAry.Length; i++)
                                {
                                    if (!string.IsNullOrEmpty(allegatiNuoviAry[i].BodyText))
                                    {
                                        var allegatiElaborati = elaboraAllegato(allegatiNuoviAry[i], persona, parametri, tipo, converter, azienda);
                                        if (allegatiElaborati != null)
                                        {
                                            allegatiInvio.Insert(0, allegatiElaborati.Value.AllegatoDaInviare);
                                            allegatiResult.Add(allegatiElaborati.Value.AllegatoResult);
                                        }
                                    }
                                }
                                // ------------------------------------------------------------------------


                                // ------------------------------------------------------------------------
                                //  Modello allegato presente
                                // ------------------------------------------------------------------------
                                if (idModello != null)
                                {
                                    var documentoStampaUnione = modelloLetteraService.GetLetteraCompilata(idModello.Value, parametri);

                                    switch (tipo)
                                    {
                                        case TipoMessaggio.Fax:
                                        case TipoMessaggio.Lettera:
                                        case TipoMessaggio.Email:
                                        case TipoMessaggio.Manuale:

                                            // Se l'invio è manuale con generazione creazione un unico file PDF non deve essere creato un nuovo documento con il modello selezionato
                                            var checkSumDocumento = string.Empty;
                                            if(tipo != TipoMessaggio.Manuale || parametriInvioLettera.Aggregazione == AggregazioneDocumentiEnum.DocumentiSeparati)
                                            {
                                                var documentMessage = getDocumentService().SaveDocument(documentoStampaUnione.Body, documentoStampaUnione.FileName, ".rtf", null, _info.Azienda);
                                                if(documentMessage.Documento != null)
                                                    checkSumDocumento = documentMessage.Documento.Checksum;
                                            }
                                            else if (documentoStampaUnione.Body != null)
                                                checkSumDocumento = Utility.GetFileChecksum(documentoStampaUnione.Body);

                                            if (!string.IsNullOrEmpty(checkSumDocumento))
                                            {
                                                var body = documentoStampaUnione.Body;
                                                var fileExtension = documentoStampaUnione.FileExtension;
                                                if (tipo != TipoMessaggio.Manuale)
                                                {
                                                    var doc = new Document(new MemoryStream(documentoStampaUnione.Body));
                                                    var pdfStream = new MemoryStream();
                                                    doc.Save(pdfStream, SaveFormat.Pdf);
                                                    body = pdfStream.ToArray();
                                                    fileExtension = ".pdf";
                                                }
                                                var documento = new DocumentInfo { Body = body, FileId = checkSumDocumento, FileName = checkSumDocumento, FileExtension = fileExtension };
                                                allegatiInvio.Insert(0, documento);

                                                if (tipo != TipoMessaggio.Manuale || !parametriInvioLettera.ApriFileGenerato)
                                                    allegatiResult.Add(documento);
                                            }

                                            break;
                                    }
                                }

                                IList<ContattoDTO> contattiPersona = new List<ContattoDTO>();
                                if (contatti.ContainsKey(personaMessaggio.ID))
                                    contattiPersona = contatti[personaMessaggio.ID];
                                var personeMessaggio = new List<PersonaMessaggioDTO>(1) { new PersonaMessaggioDTO { ID = personaMessaggio.ID, Contatti = contattiPersona,  } };
                                var destinatari = personaService.GetContattiSelezionatiByTipo(personeMessaggio, tipo);

                                if (service != null)
                                {
                                    int? idDelivery = null;
                                    if (delivery != null)
                                        idDelivery = delivery.Id;

                                    var resultMessage = service.InvioMessaggio(azienda, new PersonaMessaggioDTO {ID = persona.ID, IdDelivery = idDelivery}, condominio, parametri.IdUnitaImmobiliare, parametri.IdFornitore, parametri.IdResponsabile, parametri.IdIncaricatoAttivita, motivoMessaggio, oggettoPrincipale, messaggioPrincipale, destinatari, mittente, emailRapportino, allegatiInvio, parametriInvioLettera);

                                    if (resultMessage.Count > 0)
                                    {
                                        delivery = daoFactory.GetDeliveryPoDao().Find(resultMessage[0].IdDelivery, false);
                                        result.AddRange(resultMessage);
                                    }
                                                                        
                                }
                            }
                        }

                        if (parametriInvioLettera.AccodaMessaggio || parametriInvioLettera.ApriFileGenerato)
                        {
                            var zipFile = service.FinalizzaMessaggio(oggetto, parametriInvioLettera.AccodaMessaggio, azienda);
                            if (parametriInvioLettera.ApriFileGenerato)
                                messaggioInviato = zipFile;
                        }
                    }
                }
                else
                    result.Add(new RisultatoInvioMessaggio(string.Empty, null, false, "Non è presente nessun destinatario", new DocumentInfo()));

                // ========================================
                // Aggiorno i contatti
                // ========================================
                if(aggiornaContatti)
                {
                    var daoFactory = _windsorRepository.GetDaoFactory(_info.Azienda);
                    foreach (var kvp in contatti)
                    {
                        var persona = daoFactory.GetPersonaDao().Find(kvp.Key, false);
                        if(persona != null)
                        {
                            var contattoRepository = new ContattoRepository(persona, _info, _windsorRepository);
                            foreach (var contattoDTO in kvp.Value)
                            {
                                var contatto = persona.Contatti.FirstOrDefault(item => item.Valore == contattoDTO.Valore);
                                if (contatto != null)
                                    contattoDTO.ID = contatto.ID;

                                contattoDTO.Stato = "U";
                                contattoRepository.ManageDomainEntity(contattoDTO, true);
                            }
                        }
                    }
                }

                return new RisultatoInvioMessaggioAllegati(result, allegatiResult, messaggioInviato);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore durante l'invio del messaggio - {0} - idAzienda:{1} - oggetto:{2}", ex, Utility.GetMethodDescription(), azienda, oggetto);
                throw;
            }
        }
Exemplo n.º 2
0
 public DocumentInfo GetDocumentInfoByIdentificativo(string id, TipoDocumentoArchiviazione tipo, UserInfo userinfo)
 {
     var windsorRep = new WindsorConfigRepository();
     try
     {
         windsorRep.BeginTransaction(userinfo);
         var repo = new DocumentoRepository(userinfo, windsorRep);
         var item = repo.GetDocumentBody(id, tipo);
         windsorRep.Commit();
         return item;
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore nella lettura di un documento - {0} - id:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), id, userinfo.Azienda);
         windsorRep.Rollback();
         throw;
     }
 }