/// <summary>
        /// Crea un dettaglio di Spedizione per Archiviazione Ottica valido
        /// </summary>
        public SpedizioneArchiviazioneOtticaDettaglio(SpedizioneArchiviazioneOttica testata, Documento documentoRiferimento)
        {
            Testata = testata;
            DocumentoRiferimento = documentoRiferimento;

            if (Testata != null)
                Testata.Dettaglio.Add(this);
        }
        /// <summary>
        /// Crea un dettaglio di Spedizione per Archiviazione Ottica valido
        /// </summary>
        public SpedizioneArchiviazioneOtticaDettaglio(SpedizioneArchiviazioneOttica testata, TestataMovimentoContabile testataMovimentoRiferimento)
        {
            Testata = testata;
            TestataMovimentoRiferimento = testataMovimentoRiferimento;

            if (Testata != null)
                Testata.Dettaglio.Add(this);
        }
        /// <summary>
        /// Crea un dettaglio di Spedizione per Archiviazione Ottica valido
        /// </summary>
        public SpedizioneArchiviazioneOtticaDettaglio(SpedizioneArchiviazioneOttica testata, Spesa spesaRiferimento)
        {
            Testata = testata;
            SpesaRiferimento = spesaRiferimento;

            if (Testata != null)
                Testata.Dettaglio.Add(this);
        }
        private SpedizioneArchiviazioneOtticaDTO setDto(SpedizioneArchiviazioneOttica item)
        {
            var dettaglio = item.Dettaglio;
            var dto = new SpedizioneArchiviazioneOtticaDTO
            {
                ID = item.ID,
                Tipo = item.Tipo,
                Data = item.Data,
                Descrizione = item.Descrizione,
                NumeroFatture = dettaglio.Count(dett => dett.SpesaRiferimento != null),
                NumeroMovimenti = dettaglio.Count(dett => dett.TestataMovimentoRiferimento != null),
                NumeroDocumenti = dettaglio.Count(dett => dett.DocumentoRiferimento != null),
                Version = item.Version
            };

            return dto;
        }
Ejemplo n.º 5
0
        // TODO: Quando possibile rivedere tutta la funzione interfaccia utente compresa
        public string CreateSpedizione(TipoDocumentoArchiviazione tipo, int idAzienda, IList<int> idCondomini, bool automatedEmail, bool returnFileText)
        {
            var file = new StringBuilder();
            var message = string.Empty;

            if (idCondomini != null && idCondomini.Count > 0)
            {
                var azienda = _daoFactory.GetAziendaDao().GetById(idAzienda, false);

                try
                {
                    // ============================================================
                    //  Fatture Passive
                    // ============================================================

                    // ------------------------------------------------------------
                    //  Creazione File
                    // ============================================================
                    if (tipo == TipoDocumentoArchiviazione.FatturaPassiva)
                    {
                        // --------------------------------------------
                        //  Spese / Fatture
                        // --------------------------------------------
                        var speseDaArchiviare = getSpeseDaArchiviare(idAzienda, idCondomini);

                        if (speseDaArchiviare.Any())
                        {
                            file.AppendLine("IdentificativoUnivoco;TipoDocumento;RagioneSocialeFornitore;IndirizzoFornitore;CapFornitore;ComuneFornitore;ProvinciaFornitore;NumeroDocumento;DataDocumento;PartitaIvaFornitore;CodiceFiscaleFornitore;ImportoTotaleDocumento;CodiceCondominio;AnnoRegistrazione;NumeroProtocollo;CodiceFiscaleCondominio;CodiceStudio;IdentificativoSfera");
                            foreach (var spesa in speseDaArchiviare)
                            {
                                try
                                {
                                    var linea = new StringBuilder();
                                    decimal importo;
                                    if ((spesa.ImportoLordo >= 0 || spesa.ImportoBolletta >= 0) && spesa.TipoDocumento != "NOTACC")
                                    {
                                        importo = spesa.TipoDocumento == "BOLLETTA" ? spesa.ImportoBolletta.GetValueOrDefault() : spesa.ImportoLordo;
                                        linea.Append(getIdentificativoArchiviazione(spesa, false) + ";F;");
                                    }
                                    else
                                    {
                                        linea.Append(getIdentificativoArchiviazione(spesa, false) + ";N;");
                                        importo = spesa.ImportoLordo*-1;
                                    }

                                    linea.Append(spesa.FornitoreRiferimento.DisplayName.Replace(';', ',').Trim() + ";");

                                    if (spesa.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza != null)
                                    {
                                        linea.Append(spesa.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Indirizzo.Replace(';', ',').Trim() + ";");
                                        linea.Append(spesa.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Cap.Replace(';', ',').Trim() + ";");
                                        if (spesa.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Comune != null)
                                        {
                                            linea.Append(spesa.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Comune.Descrizione.Replace(';', ',').Trim() + ";");
                                            linea.Append(spesa.FornitoreRiferimento.PersonaRiferimento.IndirizzoResidenza.Comune.ProvinciaAppartenenza.Codice.Replace(';', ',').Trim() + ";");
                                        }
                                        else
                                            linea.Append(";;");
                                    }
                                    else
                                        linea.Append(";;;;");

                                    linea.Append(spesa.NumeroDocumento.Replace(';', ',').Trim() + ";");
                                    linea.Append(spesa.DataDocumento.GetValueOrDefault().ToShortDateString() + ";");

                                    if (!string.IsNullOrEmpty(spesa.FornitoreRiferimento.PersonaRiferimento.PartitaIva))
                                        linea.Append(spesa.FornitoreRiferimento.PersonaRiferimento.PartitaIva.Replace(';', ',').Trim() + ";");
                                    else
                                        linea.Append(";");

                                    if (!string.IsNullOrEmpty(spesa.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale))
                                        linea.Append(spesa.FornitoreRiferimento.PersonaRiferimento.CodiceFiscale.Replace(';', ',').Trim() + ";");
                                    else
                                        linea.Append(";");

                                    linea.Append(importo.ToString().Replace(';', ',').Trim() + ";");
                                    linea.Append(spesa.EsercizioRiferimento.CondominioRiferimento.Codice.Replace(';', ',').Trim().PadLeft(5, '0') + ";");
                                    linea.Append(spesa.DataDocumento.GetValueOrDefault().Year + ";");
                                    linea.Append(spesa.NumeroProtocollo.GetValueOrDefault() + ";");

                                    if (!string.IsNullOrEmpty(spesa.EsercizioRiferimento.CondominioRiferimento.CodiceFiscale))
                                        linea.Append(spesa.EsercizioRiferimento.CondominioRiferimento.CodiceFiscale.Replace(';', ',').Trim() + ";");
                                    else
                                        linea.Append(";");

                                    if (!string.IsNullOrEmpty(spesa.EsercizioRiferimento.CondominioRiferimento.Azienda.Codice))
                                        linea.Append(spesa.EsercizioRiferimento.CondominioRiferimento.Azienda.Codice.Replace(';', ',').Trim().PadLeft(4, '0') + ";");
                                    else
                                        linea.Append(";");

                                    linea.Append(spesa.ID.ToString());

                                    file.Append(linea + Environment.NewLine);
                                }
                                catch (Exception ex)
                                {
                                    
                                    _log.Error("Errore inaspettato durante la creazione del file CSV per l'archiviazione ottica sostitutiva, singola spesa - " + Utility.GetMethodDescription() + " - idSpesa: " + spesa.ID + " - idAzienda:" + idAzienda, ex);
                                    throw;
                                }
                            }
                        }

                        // --------------------------------------------
                        //  Movimenti contabili
                        // --------------------------------------------
                        var testateMovimentiDaArchiviare = getMovimentiDaArchiviare(idAzienda, idCondomini);

                        if (testateMovimentiDaArchiviare.Count > 0)
                        {
                            foreach (var testata in testateMovimentiDaArchiviare)
                            {
                                try
                                {
                                    var linea = new StringBuilder();
                                    linea.Append(getIdentificativoArchiviazione(testata, false) + ";M;");
                                    linea.Append(";;;;;;;;;");

                                    decimal? importo = testata.GetImportoSpesa();
                                    if (importo != null)
                                        linea.Append(importo.Value.ToString().Replace(';', ',').Trim() + ";");
                                    else
                                        linea.Append(";;");

                                    linea.Append(testata.EsercizioRiferimento.CondominioRiferimento.Codice.Replace(';', ',').Trim().PadLeft(5, '0') + ";");
                                    linea.Append(testata.DataRegistrazione.GetValueOrDefault().Year + ";");
                                    linea.Append(testata.NumeroProtocollo.GetValueOrDefault() + ";");

                                    if (!string.IsNullOrEmpty(testata.EsercizioRiferimento.CondominioRiferimento.CodiceFiscale))
                                        linea.Append(testata.EsercizioRiferimento.CondominioRiferimento.CodiceFiscale.Replace(';', ',').Trim() + ";");
                                    else
                                        linea.Append(";");

                                    if (!string.IsNullOrEmpty(testata.EsercizioRiferimento.CondominioRiferimento.Azienda.Codice))
                                        linea.Append(testata.EsercizioRiferimento.CondominioRiferimento.Azienda.Codice.Replace(';', ',').Trim().PadLeft(4, '0') + ";");
                                    else
                                        linea.Append(";");

                                    linea.Append(testata.ID.ToString());

                                    file.Append(linea + Environment.NewLine);
                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore inaspettato durante la creazione del file CSV per l'archiviazione ottica sostitutiva, singola testata di movimento contabile - {0} - spesa:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), testata.ID, idAzienda);
                                    throw;
                                }
                            }
                        }

                        // ------------------------------------------------------------
                        //  Creazione spedizione
                        // ============================================================
                        if (speseDaArchiviare != null && (speseDaArchiviare.Any() || testateMovimentiDaArchiviare.Any()))
                        {
                            var spedizione = new SpedizioneArchiviazioneOttica(tipo, "Fatture spedite il:" + DateTime.Today.ToShortDateString(), file.ToString(), DateTime.Today, azienda);
                            foreach (var spesa in speseDaArchiviare)
                                spedizione.Dettaglio.Add(new SpedizioneArchiviazioneOtticaDettaglio(spedizione, spesa));
                            foreach (var testata in testateMovimentiDaArchiviare)
                                spedizione.Dettaglio.Add(new SpedizioneArchiviazioneOtticaDettaglio(spedizione, testata));

                            _daoFactory.GetSpedizioneArchiviazioneOtticaDao().SaveOrUpdate(spedizione);
                        }
                    }

                    // ============================================================
                    //  Documenti
                    // ============================================================

                    // ------------------------------------------------------------
                    //  Creazione File
                    // ============================================================
                    if (tipo == TipoDocumentoArchiviazione.Contratto)
                    {
                        // --------------------------------------------
                        //  Documenti
                        // --------------------------------------------
                        var documenti = getDocumentiDaArchiviare(idAzienda, idCondomini);

                        if (documenti.Count > 0)
                        {
                            file.AppendLine("IdentificativoUnivoco;TipoDocumento;CodiceStudio;CodiceCondominio;NumeroProtocollo;TipologiaContratto;Data;Fornitore;IdentificativoSfera");
                            foreach (var documento in documenti)
                            {
                                try
                                {
                                    var condominio = documento.GetCondominioRiferimento();
                                    if (condominio != null)
                                    {
                                        var fascicolo = IesiGenericCollections<FascicoloCondominio>.GetByIndex(documento.Fascicoli, 0);
                                        if (fascicolo != null)
                                        {
                                            var linea = new StringBuilder();

                                            var identificativoArchiviazione = getIdentificativoArchiviazione(documento, condominio, false);
                                            linea.Append(identificativoArchiviazione + ";F" + fascicolo.DettaglioFascicolo.Codice + ";");
                                            documento.IdentificativoArchiviazioneOttica = identificativoArchiviazione;

                                            linea.Append(condominio.Azienda.Codice.Replace(';', ',').Trim() + ";");
                                            linea.Append(condominio.Codice.Replace(';', ',').Trim().PadLeft(5, '0') + ";");
                                            linea.Append(documento.NumeroProtocollo.GetValueOrDefault() + ";");

                                            if (documento.ContrattoRiferimento != null)
                                            {
                                                if(documento.ContrattoRiferimento.Tipo != null)
                                                    linea.Append(documento.ContrattoRiferimento.Tipo.Descrizione + ";");
                                                else
                                                    linea.Append(documento.Tipo + ";");
                                            }
                                            else
                                                linea.Append(";");

                                            if (documento.Data != null)
                                                linea.Append(documento.Data.GetValueOrDefault().ToShortDateString() + ";");
                                            else
                                                linea.Append(";");

                                            if (documento.FornitoreRiferimento != null)
                                                linea.Append(documento.FornitoreRiferimento.DisplayName.Replace(';', ',').Trim() + ";");
                                            else
                                                linea.Append(";");

                                            linea.Append(documento.ID.ToString());

                                            file.Append(linea + Environment.NewLine);
                                        }
                                        else
                                        {
                                            message += string.Format(" - Il documento '{0}' del condominio '{1}' non può essere inviato perchè non è presente il fascicolo condominio.{2}", documento.Descrizione, condominio.DisplayName, Environment.NewLine);
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    _log.ErrorFormat("Errore inaspettato durante la creazione del file CSV per l'archiviazione ottica sostitutiva, singola spesa - {0} - documento:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), documento.ID, idAzienda);
                                    throw;
                                }
                            }
                        }

                        // ------------------------------------------------------------
                        //  Creazione spedizione
                        // ============================================================
                        if (documenti.Count > 0)
                        {
                            if (string.IsNullOrEmpty(message))
                            {
                                var spedizione = new SpedizioneArchiviazioneOttica(tipo, "Documenti spediti il:" + DateTime.Today.ToShortDateString(), file.ToString(), DateTime.Today, azienda);
                                foreach (var documento in documenti)
                                    spedizione.Dettaglio.Add(new SpedizioneArchiviazioneOtticaDettaglio(spedizione, documento));

                                _daoFactory.GetSpedizioneArchiviazioneOtticaDao().SaveOrUpdate(spedizione);
                                _log.InfoFormat("Creato il file per archiviazione ottica - {0} - id:{1}", Utility.GetMethodDescription(), spedizione.ID);
                            }
                            else
                            {
                                _log.ErrorFormat("Errore nella creazione del file indice - {0} - messaggio:{1} - azienda:{2}", Utility.GetMethodDescription(), message, idAzienda);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore inaspettato durante la creazione del file CSV per l'archiviazione ottica sostitutiva - {0} - azienda:{1}", ex, Utility.GetMethodDescription(), idAzienda);
                    throw;
                }

                if (!string.IsNullOrEmpty(file.ToString()) && string.IsNullOrEmpty(message))
                    message = "OK";

                if (automatedEmail && !string.IsNullOrEmpty(file.ToString()) && message == "OK")
                {
                    string fileName;
                    switch (tipo)
                    {
                        case TipoDocumentoArchiviazione.Contratto:
                            fileName = azienda.NomeCompatto + "_Contratti.csv";
                            break;
                        case TipoDocumentoArchiviazione.FatturaPassiva:
                            fileName = azienda.NomeCompatto + "_FattureFornitori.csv";
                            break;
                        default:
                            fileName = azienda.NomeCompatto + "_FattureFornitori.csv";
                            break;
                    }

                    var allegati = new List<DocumentInfo> {new DocumentInfo {FileName = fileName, FileExtension = ".csv", Body = Conversione.ToByteArray(file.ToString())}};

                    var emailAddresses = ConfigurationManager.AppSettings["emailAddressArchiviazioneOttica"].Split(',');
                    var destinatari = new List<string>(emailAddresses.Length);
                    destinatari.AddRange(emailAddresses.Select(t => t.Trim()));

                    _messageService.InvioMessaggio(idAzienda, null, null, null, null, null, null, MotivoMessaggio.FileIndiceArchiviazione, "File indice per Archiva", "Allego il file indice per i documenti che abbiamo inviato." + Environment.NewLine + Environment.NewLine + "Cordiali saluti" + Environment.NewLine + "Nadir s.r.l.", destinatari, "*****@*****.**", "*****@*****.**", allegati, new ParametriInvioLettera { Asincrono = true });
                }
            }
            else
                message = "Non è stata effettuata nessuna selezione";

            // Ritorno il corpo del file, oppure KO se si è verificato un errore, OK se è tutto a posto
            if (returnFileText && !string.IsNullOrEmpty(file.ToString()) &&  message == "OK")
                return file.ToString();

            if (message == "OK")
                return message;

            return "KO$" + message;
        }