public ResultCreazioneFile GetModello(int idAzienda, int anno, IList<DatiCertificazioneDTO> datiCertificazione, DateTime dataDichiarazione, bool intermediarioDichiarazioneCondominio, bool aggregatoPerFornitore, bool ordinatoPerFornitore, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, TipoOperazioneFiscale tipoOperazione, TipoStampaModelloCU tipoStampa, long? protocolloComunicazione, int? progressivoInvio)
        {
            byte[] bytes = null;
            var message = string.Empty;

            var numeroRecordB = 0;
            var numeroRecordD = 0;
            var numeroRecordH = 0;

            StreamWriter sw = null;
            try
            {
                var fileName = Path.GetTempPath() + "\\" + Guid.NewGuid();
                if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
                    fileName = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.DataDirectory + "\\" + Guid.NewGuid();
                if (File.Exists(fileName))
                    File.Delete(fileName);

                var azienda = _daoFactory.GetAziendaDao().GetById(idAzienda, false);

                // -----------------------------------------------------------------
                // Raggruppamento per condominio
                // -----------------------------------------------------------------
                var datiGroupByCondominio = datiCertificazione.GroupBy(item => item.IdCondominio).ToList();

                // =============================================================================================
                // Creazione del file
                // =============================================================================================
                using (sw = File.CreateText(fileName))
                {
                    var codiceFiscale = azienda.CodiceFiscale;

                    if (intermediarioDichiarazione != null)
                        codiceFiscale = intermediarioDichiarazione.CodiceFiscale;
                    else if (intermediarioDichiarazioneCondominio)
                    {
                        var condominio = _daoFactory.GetCondominioDao().GetById(datiGroupByCondominio.FirstOrDefault().Key, false);
                        codiceFiscale = condominio.CodiceFiscale;
                    }

                    writeTestataA("CUR", codiceFiscale, anno, sw);

                    foreach (var datiPerCondominio in datiGroupByCondominio)
                    {
                        var condominio = _daoFactory.GetCondominioDao().GetById(datiPerCondominio.Key, false);

                        // -----------------------------------------------------------------
                        // Raggruppamento per fornitore
                        // -----------------------------------------------------------------
                        var datiPerFornitore = datiPerCondominio.GroupBy(item => item.IdFornitore).ToList();
                        var numeroCertificazioni = datiPerFornitore.Count();

                        writeRowB(condominio, dataDichiarazione, numeroCertificazioni, intermediarioDichiarazioneCondominio, firmatarioDichiarazione, intermediarioDichiarazione, tipoOperazione, sw);
                        numeroRecordB++;

                        // Una comunicazione per ogni fornitore
                        var index = 0;
                        foreach (var datiFornitore in datiPerFornitore)
                        {
                            var fornitore = _daoFactory.GetFornitoreDao().GetById(datiFornitore.Key, false);
                            if (aggregatoPerFornitore)
                            {
                                index++;
                                writeRowD(condominio, fornitore, index, dataDichiarazione, tipoOperazione, protocolloComunicazione, progressivoInvio, sw);
                                numeroRecordD++;

                                var datiCertificazioneFornitore = datiFornitore.FirstOrDefault();
                                if (datiCertificazioneFornitore != null)
                                {
                                    if (tipoOperazione != TipoOperazioneFiscale.Annullamento)
                                    {
                                        writeRowH(condominio, fornitore, anno, datiCertificazioneFornitore.Dettaglio, datiCertificazioneFornitore.EsenteRegimeMinimo, index, 1, sw);
                                        numeroRecordH++;
                                    }
                                }
                            }
                            else
                            {
                                foreach (var datiCertificazioneDTO in datiFornitore)
                                {
                                    foreach (var dettaglioDatiCertificazioneDTO in datiCertificazioneDTO.Dettaglio)
                                    {
                                        index++;
                                        writeRowD(condominio, fornitore, index, dataDichiarazione, tipoOperazione, protocolloComunicazione, progressivoInvio, sw);
                                        numeroRecordD++;

                                        if (tipoOperazione != TipoOperazioneFiscale.Annullamento)
                                        {
                                            writeRowH(condominio, fornitore, anno, new List<DettaglioDatiCertificazioneDTO> { dettaglioDatiCertificazioneDTO }, datiCertificazioneDTO.EsenteRegimeMinimo, index, 1, sw);
                                            numeroRecordH++;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    writePiedeZ(numeroRecordB, 0, numeroRecordD, 0, numeroRecordH, sw);
                }

                var infile = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                bytes = new byte[infile.Length];
                infile.Read(bytes, 0, bytes.Length);

                return new ResultCreazioneFile(bytes, message);
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la creazione del file per il modello CU - Certificazione Unica - {0} - anno:{1}", ex, Library.Utility.GetMethodDescription(), anno);
                message = "Si sono verificati problemi inaspettati durante la generazione del modello CU - Certificazione Unica." + Environment.NewLine + "Controllare il log per ulteriori dettagli.";
                return new ResultCreazioneFile(bytes, message);
            }
            finally
            {
                if (sw != null)
                {
                    sw.Close();
                    sw.Dispose();
                }
            }
        }
        public string GetModelloCertificazioneUnicaPDF(int anno, List<DatiCertificazioneDTO> datiCertificazione, string nomeFile, DateTime dataDichiarazione, bool aggregatoPerFornitore, bool ordinatoPerFornitore, bool intermediarioDichiarazioneCondominio, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, TipoOperazioneFiscale tipoOperazione, TipoStampaModelloCU tipoStampa)
        {
            var result = GetServiceClient().GetModelloCertificazioneUnicaPDF(anno, datiCertificazione, dataDichiarazione, aggregatoPerFornitore, ordinatoPerFornitore, intermediarioDichiarazioneCondominio, firmatarioDichiarazione, intermediarioDichiarazione, tipoOperazione, tipoStampa, GetUserInfo());
            if (string.IsNullOrEmpty(result.Message))
            {
                var doc = new DocumentInfo { Body = result.FileBody, FileName = nomeFile };
                _manageDocumentService.Open(doc, "Modello CU", false, MergeFieldType.Default);
            }

            CloseService();
            return result.Message;
        }
        public string GetModelloCertificazioneUnica(int anno, List<DatiCertificazioneDTO> datiCertificazione, string nomeFile, DateTime dataDichiarazione, bool aggregatoPerFornitore, bool ordinatoPerFornitore, bool intermediarioDichiarazioneCondominio, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, TipoOperazioneFiscale tipoOperazione, TipoStampaModelloCU tipoStampa, long? protocolloComunicazione, int? progressivoInvio)
        {
            var result = GetServiceClient().GetModelloCertificazioneUnica(anno, datiCertificazione, dataDichiarazione, aggregatoPerFornitore, ordinatoPerFornitore, intermediarioDichiarazioneCondominio, firmatarioDichiarazione, intermediarioDichiarazione, tipoOperazione, tipoStampa, protocolloComunicazione, progressivoInvio, GetUserInfo());
            if (string.IsNullOrEmpty(result.Message))
            {
                var doc = new DocumentInfo { Body = result.FileBody, FileName = nomeFile };
                _manageDocumentService.Save(doc);
            }

            CloseService();
            return result.Message;
        }
        private List<byte[]> getModuloPages(IList<DatiCertificazioneDTO> datiCertificazione, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, bool aggregatoPerFornitore, bool intermediarioDichiarazioneCondominio, DateTime dataDichiarazione, TipoOperazioneFiscale tipoOperazione, TipoStampaModelloCU tipoStampa, int anno, Azienda azienda, byte[] templateFrontespizio, byte[] templatePercipiente, byte[] templateDatiLavoratoreAutonomo)
        {
            var moduloFrontespizio = new Dictionary<int, byte[]>();
            var moduloFornitori = new Dictionary<int, IList<byte[]>>();

            var datiGroupByCondominio = datiCertificazione.GroupBy(item => item.IdCondominio);
            foreach (var datiPerCondominio in datiGroupByCondominio)
            {
                try
                {
                    var condominio = _daoFactory.GetCondominioDao().GetById(datiPerCondominio.Key, false);

                    var datiGroupByFornitore = datiPerCondominio.GroupBy(item => item.IdFornitore).ToList();

                    // =============================================================================================
                    // Creazione dei moduli
                    // =============================================================================================

                    byte[] bytes;

                    // -----------------------------------------------------------------------------
                    // Frontespizio
                    // -----------------------------------------------------------------------------
                    if (tipoStampa == TipoStampaModelloCU.Completa ||  tipoOperazione == TipoOperazioneFiscale.Annullamento || tipoOperazione == TipoOperazioneFiscale.Sostituzione)
                    {
                        string codiceFiscaleFirmatario;
                        string nomeFirmatario;
                        string cognomeFirmatario;
                        if (firmatarioDichiarazione != null)
                        {
                            nomeFirmatario = firmatarioDichiarazione.Nome;
                            cognomeFirmatario = firmatarioDichiarazione.Cognome;
                            codiceFiscaleFirmatario = firmatarioDichiarazione.CodiceFiscale;
                        }
                        else
                        {
                            nomeFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.Nome;
                            cognomeFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.Cognome;
                            codiceFiscaleFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.CodiceFiscale;
                        }

                        var numeroCertificazioni = 0;
                        if (!aggregatoPerFornitore)
                            numeroCertificazioni += datiCertificazione.Sum(datiCertificazioneDTO => datiCertificazioneDTO.Dettaglio.Count);
                        else
                            numeroCertificazioni = datiGroupByFornitore.Count;

                        string codiceFiscaleIntermediario;
                        string nominativoIntermediario;
                        if (intermediarioDichiarazione != null)
                        {
                            codiceFiscaleIntermediario = intermediarioDichiarazione.CodiceFiscale;
                            nominativoIntermediario = intermediarioDichiarazione.DisplayName;
                        }
                        else if (intermediarioDichiarazioneCondominio)
                        {
                            codiceFiscaleIntermediario = condominio.CodiceFiscale;
                            nominativoIntermediario = condominio.Descrizione;
                        }
                        else
                        {
                            codiceFiscaleIntermediario = azienda.CodiceFiscale;
                            nominativoIntermediario = azienda.Descrizione;
                        }

                        var datiFrontespizio = new DatiFrontespizioCU
                        {
                            CodiceFiscaleCondominio = condominio.CodiceFiscale,
                            DenominazioneCondominio = condominio.Descrizione,
                            Annullamento = tipoOperazione == TipoOperazioneFiscale.Annullamento ? "1" : string.Empty,
                            Sostituzione = tipoOperazione == TipoOperazioneFiscale.Sostituzione ? "1" : string.Empty,
                            CodiceFiscaleAmministratore = codiceFiscaleFirmatario,
                            CognomeAmministratore = cognomeFirmatario.ToUpper(),
                            NomeAmministratore = nomeFirmatario.ToUpper(),
                            CodiceCarica = "13",
                            CodiceFiscaleIntermediario = codiceFiscaleIntermediario,
                            DataPresentazione = dataDichiarazione.ToShortDateString(),
                            NominativoIntermediario = nominativoIntermediario.ToUpper(),
                            NumeroCertificazioni = numeroCertificazioni.ToString(_cultureInfo),
                            FirmaComunicazione = azienda.Amministratore.PersonaRiferimento.DisplayName,
                            ImpegnoTrasmettereComunicazione = "1"
                        };

                        bytes = FillForm.FillStream(datiFrontespizio, templateFrontespizio, GestioneFiscaleResources.ModelloCUFrontespizio_FieldMapping, false, true);

                        // Firma
                        if (azienda.FirmaAmministratore != null)
                        {
                            var signature = new Signature(bytes);
                            var firma = _documentService.GetDocument(azienda.FirmaAmministratore.Checksum, azienda.ID, TipoDocumentoArchiviazione.Contratto);
                            if (firma.Body != null)
                                bytes = signature.AddSignature(firma.Body, 1, 470, 460, string.Empty);
                        }

                        moduloFrontespizio.Add(condominio.ID, bytes);
                    }
                    else
                    {
                        moduloFrontespizio.Add(condominio.ID, null);
                    }
                    
                    // -----------------------------------------------------------------------------
                    // Dati Percipiente - FORNITORE
                    // -----------------------------------------------------------------------------
                    var listaModuloFornitori = new List<byte[]>(datiGroupByFornitore.Count);
                    foreach (var datiPerFornitore in datiGroupByFornitore)
                    {
                        var progressivoModulo = 0;
                        var fornitore = _daoFactory.GetFornitoreDao().GetById(datiPerFornitore.Key, false);

                        var codiceSedeEntratel = "000";
                        if (!string.IsNullOrEmpty(azienda.CodiceSedeEntratel))
                            codiceSedeEntratel = azienda.CodiceSedeEntratel;

                        var datiFornitore = new DatiPercipienteCU
                        {
                            Anno = anno.ToString(_cultureInfo),
                            CodiceFiscaleCondominio = condominio.CodiceFiscale,
                            DenominazioneCondominio = condominio.Descrizione,
                            ComuneCondominio = condominio.Indirizzo.Comune.Descrizione,
                            ProvinciaCondominio = condominio.Indirizzo.Comune.ProvinciaAppartenenza.Codice,
                            CapCondominio = condominio.Indirizzo.Cap,
                            IndirizzoCondominio = condominio.Indirizzo.GetIndirizzoCompleto(),
                            CodiceFiscalePercipiente = fornitore.GetCodiceFiscale(),
                            CognomeRagioneSocialePercipiente = (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Giuridica) ? fornitore.PersonaRiferimento.RagioneSociale.ToUpper() : fornitore.PersonaRiferimento.Cognome.ToUpper(),
                            NomePercipiente = (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Giuridica) ? string.Empty : fornitore.PersonaRiferimento.Nome.ToUpper(),
                            ComuneNascitaPercipiente = (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Fisica) ? fornitore.PersonaRiferimento.ComuneNascita.Descrizione : string.Empty,
                            ProvinciaNascitaPercipiente = (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Fisica) ? fornitore.PersonaRiferimento.ComuneNascita.ProvinciaAppartenenza.Codice : string.Empty,
                            DataNascitaPercipiente = (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Fisica) ? fornitore.PersonaRiferimento.DataNascita.GetValueOrDefault().ToShortDateString() : string.Empty,
                            SessoPercipiente = (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Fisica) ? fornitore.PersonaRiferimento.Sesso.ToString().Substring(0, 1).ToUpper() : string.Empty,
                            ComuneResidenzaPercipiente2014 = fornitore.PersonaRiferimento.IndirizzoResidenza.Comune.Descrizione,
                            ProvinciaResidenzaPercipiente2014 = fornitore.PersonaRiferimento.IndirizzoResidenza.Comune.ProvinciaAppartenenza.Codice,
                            CodiceComuneResidenzaPercipiente2014 =  fornitore.PersonaRiferimento.IndirizzoResidenza.Comune.CodiceCatastale,
                            ComuneResidenzaPercipiente2015 = fornitore.PersonaRiferimento.IndirizzoResidenza.Comune.Descrizione,
                            ProvinciaResidenzaPercipiente2015 = fornitore.PersonaRiferimento.IndirizzoResidenza.Comune.ProvinciaAppartenenza.Codice,
                            CodiceComuneResidenzaPercipiente2015 = fornitore.PersonaRiferimento.IndirizzoResidenza.Comune.CodiceCatastale,
                            CodiceAttivita = "970000",
                            CodiceSedeEntratel = codiceSedeEntratel,
                            DataPresentazione = dataDichiarazione.ToShortDateString(),
                            FirmaSostitutoImposta = condominio.Descrizione
                        };

                        if (fornitore.PersonaRiferimento.TipoPersona.GetValueOrDefault() == TipoPersonaEnum.Fisica && int.Parse(fornitore.PersonaRiferimento.ComuneNascita.Codice) > 999201)
                            datiFornitore.ProvinciaNascitaPercipiente = "EE";

                        bytes = FillForm.FillStream(datiFornitore, templatePercipiente, GestioneFiscaleResources.ModelloCUPercipiente_FieldMapping, false, true);

                        // Firma
                        if (azienda.FirmaAmministratore != null)
                        {
                            var signature = new Signature(bytes);
                            var firma = _documentService.GetDocument(azienda.FirmaAmministratore.Checksum, azienda.ID, TipoDocumentoArchiviazione.Contratto);
                            if(firma.Body != null)
                                bytes = signature.AddSignature(firma.Body, 1, 470, 350, string.Empty);
                        }

                        listaModuloFornitori.Add(bytes);

                        if (tipoOperazione != TipoOperazioneFiscale.Annullamento)
                        {
                            if (aggregatoPerFornitore)
                            {
                                var datiCertificazioneFornitore = datiPerFornitore.FirstOrDefault();
                                if (datiCertificazioneFornitore != null)
                                {
                                    progressivoModulo++;
                                    listaModuloFornitori.Add(getModuloLavoratoreAutonomo(fornitore, datiCertificazioneFornitore.Dettaglio, datiCertificazioneFornitore.EsenteRegimeMinimo, anno, progressivoModulo, templateDatiLavoratoreAutonomo, azienda));
                                }
                            }
                            else
                            {
                                foreach (var datiCertificazioneDTO in datiPerFornitore)
                                {
                                    foreach (var dettaglioDatiCertificazioneDTO in datiCertificazioneDTO.Dettaglio)
                                    {
                                        progressivoModulo++;
                                        listaModuloFornitori.Add(getModuloLavoratoreAutonomo(fornitore, new List<DettaglioDatiCertificazioneDTO> { dettaglioDatiCertificazioneDTO }, datiCertificazioneDTO.EsenteRegimeMinimo, anno, progressivoModulo, templateDatiLavoratoreAutonomo, azienda));
                                    }
                                }
                            }
                        }
                    }

                    moduloFornitori.Add(condominio.ID, listaModuloFornitori);
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore inaspettato durante la creazione del file per il modello CU - {0} - anno:{1} - azienda:{2}", ex, Library.Utility.GetMethodDescription(), anno, azienda);
                    throw;
                }
            }

            var result = new List<byte[]>();
            foreach (var frontespizio in moduloFrontespizio)
            {
                // frontespizio
                if(frontespizio.Value != null)
                    result.Add(frontespizio.Value);

                // percipiente
                result.AddRange(moduloFornitori[frontespizio.Key]);
            }

            return result;
        } 
        public ResultCreazioneFile GetModello(int idAzienda, int anno, IList<DatiCertificazioneDTO> datiCertificazione, DateTime dataDichiarazione, bool intermediarioDichiarazioneCondominio, bool aggregatoPerFornitore, bool ordinatoPerFornitore, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, TipoOperazioneFiscale tipoOperazione, TipoStampaModelloCU tipoStampa, long? protocolloComunicazione, int? progressivoInvio)
        {
            byte[] bytes = null;
            var message = string.Empty;

            var annoModulo = string.Empty;
            if (anno > 2009)
                annoModulo = (anno + 1).ToString(CultureInfo.InvariantCulture);

            var azienda = _daoFactory.GetAziendaDao().GetById(idAzienda, false);

            var templateFrontespizio = getTemplate("frontespizio", annoModulo);
            var templatePercipiente = getTemplate("percipiente", annoModulo);
            var templateDatiLavoratoreAutonomo = getTemplate("lavoratoreAutonomo", annoModulo);
            
            if (templateFrontespizio != null && templatePercipiente != null && templateDatiLavoratoreAutonomo != null)
            {
                try
                {
                    var pageBytes = new List<byte[]>();
                    if (ordinatoPerFornitore)
                    {
                        var dataSource = datiCertificazione.GroupBy(item => item.IdFornitore).ToList();
                        foreach (var dataSourcePerFornitore in dataSource)
                        {
                            pageBytes.AddRange(getModuloPages(dataSourcePerFornitore.ToList(), firmatarioDichiarazione, intermediarioDichiarazione, aggregatoPerFornitore, intermediarioDichiarazioneCondominio, dataDichiarazione, tipoOperazione, tipoStampa, anno, azienda, templateFrontespizio, templatePercipiente, templateDatiLavoratoreAutonomo));
                        }
                    }
                    else
                        pageBytes.AddRange(getModuloPages(datiCertificazione, firmatarioDichiarazione, intermediarioDichiarazione, aggregatoPerFornitore, intermediarioDichiarazioneCondominio, dataDichiarazione, tipoOperazione, tipoStampa, anno, azienda, templateFrontespizio, templatePercipiente, templateDatiLavoratoreAutonomo));


                    // =============================================================================================
                    // Merge dei moduli
                    // =============================================================================================
                    var stream = new MemoryStream();
                    var doc = new PdfMerge();

                    foreach (var pageByte in pageBytes)
                    {
                        doc.AddDocument(pageByte);
                    }
                    doc.Merge(stream, true);

                    bytes = new byte[stream.Length];
                    stream.Seek(0, SeekOrigin.Begin);
                    stream.Read(bytes, 0, bytes.Length);
                    stream.Close();

                    return new ResultCreazioneFile(bytes, message);
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore inaspettato durante la creazione del file per il modello CU - {0} - anno:{1} - azienda:{2}", ex, Library.Utility.GetMethodDescription(), anno, azienda);
                    message = "Si sono verificati problemi inaspettati durante la generazione del modello CU." + Environment.NewLine + "Controllare il log per ulteriori dettagli.";
                    return new ResultCreazioneFile(bytes, message);
                } 
            }

            return new ResultCreazioneFile(null, $"Il modulo per l'anno {annoModulo} non è ancora disponibile");
        }
Ejemplo n.º 6
0
 public ResultCreazioneFile GetModelloCertificazioneUnicaPDF(int anno, IList<DatiCertificazioneDTO> datiCertificazione, DateTime dataDichiarazione, bool aggregatoPerFornitore, bool ordinatoPerFornitore, bool intermediarioDichiarazioneCondominio, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, TipoOperazioneFiscale tipoOperazione, TipoStampaModelloCU tipoStampa, UserInfo userinfo)
 {
     var windsorRep = new WindsorConfigRepository();
     try
     {
         windsorRep.BeginTransaction(userinfo);
         var service = windsorRep.GetContainer(userinfo.Azienda).Resolve<IGestioneFiscaleModelloCUService>("gestionefiscalemodellocu.pdf");
         var item = service.GetModello(userinfo.Azienda, anno, datiCertificazione, dataDichiarazione, intermediarioDichiarazioneCondominio, aggregatoPerFornitore, ordinatoPerFornitore, firmatarioDichiarazione, intermediarioDichiarazione, tipoOperazione, tipoStampa, null, null);
         windsorRep.Commit();
         return item;
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore durante la generazione del modello CU - Certificazione Unica PDF - {0} - anno:{1} - dataDichiarazione:{2}", ex, Utility.GetMethodDescription(), anno, dataDichiarazione.ToShortDateString());
         windsorRep.Rollback();
         throw;
     }
 }