private void decodificaCodiceFiscale()
        {
            if (!string.IsNullOrEmpty(codiceFiscale?.Text))
            {
                if (codiceFiscale.Text.Length == 16)
                {
                    try
                    {
                        var cf = new CodiceFiscale();
                        var datiNascita = cf.CalcoloInversoCF(codiceFiscale.Text.ToUpper());
                        if (cf.CodiceFiscaleOk())
                        {
                            var comune = getLocalitaService().GetComuneByCodiceCatastale(datiNascita.GetValueOrDefault().CodiceComune);
                            var descrizioneComune = "<NON DEFINITO>";
                            if (comune != null)
                                descrizioneComune = comune.Descrizione;
                            else
                                _log.ErrorFormat("Non trovato codice catastale comune - {0} - codiceCatastale:{1} - codiceFiscale:{2} - azienda:{3}", Utility.GetMethodDescription(), datiNascita.GetValueOrDefault().CodiceComune, codiceFiscale.Text, Login.Instance.CurrentLogin().Azienda);

                            lblDecodificaCodiceFiscale.Text = $"Nato a: {descrizioneComune} il {datiNascita.GetValueOrDefault().DataNascita.ToShortDateString()} - Sesso: {datiNascita.GetValueOrDefault().Sesso}";
                        }
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Errore nella decodifica del codice fiscale - {0} - codiceFiscale:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), codiceFiscale.Text, Login.Instance.CurrentLogin().Azienda);
                        throw;
                    }
                }
            }
        }
 private void codiceFiscaleIntermediarioValidatorValidating(object sender, CustomValidator.ValidatingCancelEventArgs e)
 {
     try
     {
         if (!string.IsNullOrEmpty(codiceFiscaleIntermediario.Text))
         {
             var cf = new CodiceFiscale();
             var datiNascita = cf.CalcoloInversoCF(codiceFiscaleIntermediario.Text);
             e.Valid = datiNascita != null || PartitaIva.CheckPartitaIva(codiceFiscaleIntermediario.Text);
         }
         else
             e.Valid = true;
     }
     catch (Exception ex)
     {
         _log.ErrorFormat("Errore nella validazione del codice fiscale dell'intermediario - {0} - codice fiscale:{1}", ex, Utility.GetMethodDescription(), codiceFiscale.Text);
         throw;
     }
 }
        public ResultCreazioneFile GetModello770(int idCondominio, int idAzienda, int anno, int? idFornitoreModello770, DateTime dataDichiarazione, int? numeroIscrizioneCaf, bool intermediarioDichiarazioneCondominio, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione)
        {
            byte[] bytes = null;
            var message = string.Empty;
            var numeroRecordE = 0;

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

            var modulo = GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_frontespizio");
            if (modulo != null)
            {
                try
                {
                    var condominio = _daoFactory.GetCondominioDao().GetById(idCondominio, false);

                    // =============================================================================================
                    // Ritenute da inserire nel modello 770
                    // =============================================================================================
                    var ritenute = _ritenutaService.GetByCondominioAnno(idCondominio, idAzienda, anno).OrderBy(item => item.PagamentoRiferimento.Data.GetValueOrDefault());

                    // -----------------------------------------------------------------
                    // Raggruppamento per periodo riferimento, tributo, data versamento
                    // -----------------------------------------------------------------
                    var ritenutePerMese = (from item in ritenute
                                           group item by item.GetPeriodoRiferimento(false) + "¥" + item.PagamentoRiferimento.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.CodiceTributo + "¥" + item.GetDataVersamento().GetValueOrDefault().ToShortDateString() into itemPerMese
                                           select itemPerMese).ToList();

                    // -----------------------------------------------------------------
                    // Raggruppamento per fornitore
                    // -----------------------------------------------------------------
                    var ritenutePerFornitore = (from item in ritenute
                                                group item by item.PagamentoRiferimento.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.ID into itemPerFornitore
                                                select itemPerFornitore).ToList();

                    // ---------------------------------------------------------------------
                    //  Fornitori regime minimo
                    // ---------------------------------------------------------------------
                    var listaPagamentiEsentiMinimo = _daoFactory.GetPagamentoDao().GetPagamentiEsentiRegimeMinimo(idAzienda, anno, idCondominio, null);
                    var regimeMinimoPerFornitore = listaPagamentiEsentiMinimo.GroupBy(item => item.ScadenzaRiferimento.SpesaRiferimento.FornitoreRiferimento.ID);

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

                    // Importi versati in eccesso
                    var importiVersatiInEccesso = ritenute.Where(item => item.Tipo == TipoVersamentoRitenutaEnum.Eccesso).Sum(item => item.Importo.GetValueOrDefault());

                    // -----------------------------------------------------------------------------
                    // Frontespizio
                    // -----------------------------------------------------------------------------
                    string codiceFiscaleFirmatario;
                    string nomeFirmatario;
                    string cognomeFirmatario;
                    var sessoFirmatario = string.Empty;
                    DateTime? dataNascitaFirmatario = null;
                    var comuneNascitaFirmatario = string.Empty;
                    var siglaProvinciaNascitaFirmatario = string.Empty;
                    if (firmatarioDichiarazione != null)
                    {
                        nomeFirmatario = firmatarioDichiarazione.Nome;
                        cognomeFirmatario = firmatarioDichiarazione.Cognome;
                        codiceFiscaleFirmatario = firmatarioDichiarazione.CodiceFiscale;
                        var cf = new CodiceFiscale();
                        var datiNascita = cf.CalcoloInversoCF(firmatarioDichiarazione.CodiceFiscale);
                        if (datiNascita != null)
                        {
                            sessoFirmatario = datiNascita.GetValueOrDefault().Sesso;
                            dataNascitaFirmatario = datiNascita.GetValueOrDefault().DataNascita;

                            var codiceComuneNascita = datiNascita.GetValueOrDefault().CodiceComune;
                            var comune = _daoFactory.GetComuneDao().GetByCodiceCatastale(codiceComuneNascita);
                            if (comune != null)
                            {
                                comuneNascitaFirmatario = comune.Descrizione;
                                siglaProvinciaNascitaFirmatario = comune.ProvinciaAppartenenza.Codice;
                            }
                        }
                    }
                    else
                    {
                        nomeFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.Nome;
                        cognomeFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.Cognome;
                        codiceFiscaleFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.CodiceFiscale;
                        sessoFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.Sesso.ToString();
                        dataNascitaFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.DataNascita;
                        comuneNascitaFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.ComuneNascita.Descrizione;
                        siglaProvinciaNascitaFirmatario = condominio.Azienda.Amministratore.PersonaRiferimento.ComuneNascita.ProvinciaAppartenenza.Codice;
                    }


                    string codiceFiscaleIntermediario;
                    if (intermediarioDichiarazione != null)
                        codiceFiscaleIntermediario = intermediarioDichiarazione.CodiceFiscale;
                    else if (intermediarioDichiarazioneCondominio)
                        codiceFiscaleIntermediario = condominio.CodiceFiscale;
                    else 
                        codiceFiscaleIntermediario = condominio.Azienda.CodiceFiscale;

                    var datiFrontespizio = new DatiFrontespizio770
                    {
                        CodiceFiscaleCondominio = condominio.CodiceFiscale,
                        CognomeStudio = condominio.Azienda.Descrizione,
                        CapCondominio = condominio.Indirizzo.Cap,
                        CodiceComuneCondominio = condominio.Indirizzo.Comune.CodiceCatastale,
                        DenominazioneCondominio = condominio.Descrizione,
                        IndirizzoCompletoCondominio = condominio.Indirizzo.GetIndirizzoCompleto(),
                        ProvinciaCondominio = condominio.Indirizzo.Comune.ProvinciaAppartenenza.Codice,
                        ComuneCondominio = condominio.Indirizzo.Comune.Descrizione,
                        CodiceAttivitaCondominio = "970000",
                        NaturaGiuridicaCondominio = "51",
                        SituazioneCondominio = "6",
                        StatoCondominio = "1",
                        ImpegnoPresentazione = "2",
                        CapStudio = condominio.Azienda.IndirizzoSede.Cap,
                        CivicoStudio = condominio.Azienda.IndirizzoSede.Civico,
                        ComuneStudio = condominio.Azienda.IndirizzoSede.Comune.Descrizione,
                        IndirizzoStudio = condominio.Azienda.IndirizzoSede.Indirizzo,
                        TipoIndirizzoStudio = "VIA",
                        LocalitaStudio = condominio.Azienda.IndirizzoSede.Localita,
                        NomeStudio = string.Empty,
                        CodiceFiscaleStudio = condominio.Azienda.CodiceFiscale,
                        CodiceComuneStudio = condominio.Indirizzo.Comune.CodiceCatastale,

                        CodiceFiscaleAmministratore = codiceFiscaleFirmatario,
                        CognomeAmministratore = cognomeFirmatario,
                        NomeAmministratore = nomeFirmatario,
                        ComuneNascitaAmministratore = comuneNascitaFirmatario,
                        DataNascitaAmministratore = dataNascitaFirmatario.GetValueOrDefault().ToShortDateString(),
                        MaschioAmministratore = sessoFirmatario.ToUpper().StartsWith("M") ? "1" : string.Empty,
                        FemminaAmministratore = sessoFirmatario.ToUpper().StartsWith("F") ? "1" : string.Empty,
                        ProvinciaNascitaAmministratore = siglaProvinciaNascitaFirmatario,

                        CodiceFiscaleIntermediario = codiceFiscaleIntermediario,
                        ImpegnoPresentareDichiarazioneIntermediario = intermediarioDichiarazione != null || intermediarioDichiarazioneCondominio ? "1" : "2",
                        NumeroIscrizioneCaf = numeroIscrizioneCaf == null ? string.Empty : numeroIscrizioneCaf.GetValueOrDefault().ToString(),

                        CodiceCaricaAmministratore = "13",
                        ProvinciaStudio = condominio.Azienda.IndirizzoSede.Comune.ProvinciaAppartenenza.Codice,
                        DataPresentazione = dataDichiarazione.ToShortDateString(),
                        NumeroComunicazioniFornitori = idFornitoreModello770 == null ? (ritenutePerFornitore.Count() + regimeMinimoPerFornitore.Count()).ToString() : string.Empty,
                        PresenzaModelloSS = idFornitoreModello770 == null && ritenute.Any() ? "1" : string.Empty,
                        PresenzaModelloST = idFornitoreModello770 == null && ritenute.Any() ? "1" : string.Empty,
                        PresenzaModelloSV = string.Empty,
                        PresenzaModelloSX = idFornitoreModello770 == null && importiVersatiInEccesso > 0 ? "1" : string.Empty,
                        NonTrasmissioneModelloSTSVSX = !ritenute.Any() ? "2" : string.Empty,
                        PresenzaModello770Ordinario = string.Empty,

                        PresenzaModelloSSLavoratoreAutonomo = idFornitoreModello770 != null ? "1" : string.Empty,
                        PresenzaModelloSTLavoratoreAutonomo = idFornitoreModello770 != null ? "1" : string.Empty,
                        PresenzaModelloSXLavoratoreAutonomo = idFornitoreModello770 != null && importiVersatiInEccesso > 0 ? "1" : string.Empty,
                        PresenzaModelloSYLavoratoreAutonomo = string.Empty,
                        NumeroComunicazioniFornitoriLavoratoreAutonomo = idFornitoreModello770 != null ? (ritenutePerFornitore.Count() + regimeMinimoPerFornitore.Count()).ToString() : string.Empty,
                        CodiceFiscaleFornitore770 = string.Empty
                    };
                    
                    if(idFornitoreModello770 > 0)
                    {
                        var fornitoreModello770 = _daoFactory.GetFornitoreDao().Find(idFornitoreModello770.GetValueOrDefault(), false);
                        if (fornitoreModello770 != null)
                            datiFrontespizio.CodiceFiscaleFornitore770 = fornitoreModello770.GetCodiceFiscale();
                    }

                    var moduloFrontespizio = FillForm.FillStream(datiFrontespizio, (byte[])modulo, GestioneFiscaleResources.Modello770Frontespizio_FieldMapping, false, true);

                    // -----------------------------------------------------------------------------
                    // Dati Fornitori
                    // -----------------------------------------------------------------------------
                    var index = 0;
                    var moduloFornitori = new List<byte[]>(ritenutePerFornitore.Count() + regimeMinimoPerFornitore.Count());
                    foreach (var itemGroup in ritenutePerFornitore)
                    {
                        var fornitore = _daoFactory.GetFornitoreDao().GetById(itemGroup.Key, false);
                        index++;
                        var datiFornitore = getDatiFornitore(fornitore, condominio, index);

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

                        // Importi
                        var speseSoggette = _spesaService.GetSoggetteRitenutaByFornitoreCondominioAnno(fornitore, condominio, anno);

                        var compensiSoggetti = speseSoggette.Sum(item => item.GetImponibileRitenutaPagata(anno));
                        var compensiNonSoggetti =  speseSoggette.Sum(item => item.AltreSpese.GetValueOrDefault());
                        var altreSpeseNonSoggette = speseSoggette.Sum(item => item.SpeseEsentiRitenuta.GetValueOrDefault());
                        var importoLordoCorrisposto = compensiSoggetti + compensiNonSoggetti + altreSpeseNonSoggette;
                        var altreSommeNonSoggette = compensiNonSoggetti + altreSpeseNonSoggette;

                        datiFornitore.CodiceAltreSommeNonSoggetteARitenuta = (altreSommeNonSoggette > 0) ? "3" : string.Empty;
                        datiFornitore.AltreSommeNonSoggetteARitenuta = (altreSommeNonSoggette > 0) ? altreSommeNonSoggette.ToString() : string.Empty;
                        datiFornitore.AmmontareLordoCorrisposto = Math.Round(importoLordoCorrisposto, 2).ToString();
                        datiFornitore.Imponibile = Math.Round(compensiSoggetti, 2).ToString();
                        datiFornitore.Ritenute = Math.Round(itemGroup.Sum(item => item.Importo.GetValueOrDefault()), 2).ToString();

                        moduloFornitori.Add(FillForm.FillStream(datiFornitore, (byte[])GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_fornitore"), GestioneFiscaleResources.Modello770Fornitore_FieldMapping, false, true));
                    }

                    // Regime minimo
                    // -------------------------------
                    foreach (var itemGroup in regimeMinimoPerFornitore)
                    {
                        var fornitore = _daoFactory.GetFornitoreDao().GetById(itemGroup.Key, false);
                        index++;
                        var datiFornitore = getDatiFornitore(fornitore, condominio, index);

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

                        // Importi
                        var speseSoggette = itemGroup.Select(item => item.ScadenzaRiferimento.SpesaRiferimento).ToList();

                        var compensiNonSoggetti = speseSoggette.Sum(item => item.GetImponibileRitenutaPagata(anno));
                        var altreSpeseNonSoggette = speseSoggette.Sum(item => item.SpeseEsentiRitenuta.GetValueOrDefault());
                        var importoLordoCorrisposto = compensiNonSoggetti + altreSpeseNonSoggette;
                        var altreSommeNonSoggette = compensiNonSoggetti + altreSpeseNonSoggette;

                        datiFornitore.CodiceAltreSommeNonSoggetteARitenuta = (altreSommeNonSoggette > 0) ? "3" : string.Empty;
                        datiFornitore.AltreSommeNonSoggetteARitenuta = (altreSommeNonSoggette > 0) ? altreSommeNonSoggette.ToString() : string.Empty;
                        datiFornitore.AmmontareLordoCorrisposto = Math.Round(importoLordoCorrisposto, 2).ToString();
                        datiFornitore.Imponibile = string.Empty;
                        datiFornitore.Ritenute = string.Empty;

                        moduloFornitori.Add(FillForm.FillStream(datiFornitore, (byte[])GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_fornitore"), GestioneFiscaleResources.Modello770Fornitore_FieldMapping, false, true));
                    }

                    // ---------------------------------------------------------------------
                    //  Quadro ST
                    // ---------------------------------------------------------------------
                    var moduloST = new List<byte[]>();
                    var datiST = new List<DatiProspettoSTBody770>();
                    var countRow = 0;
                    foreach (var itemGroup in ritenutePerMese)
                    {
                        countRow++;
                        var keys = itemGroup.Key.Split('¥');
                        var importoInteressi = itemGroup.Sum(item => item.ImportoInteressi.GetValueOrDefault());
                        var importoSanzioni = itemGroup.Sum(item => item.ImportoSanzione.GetValueOrDefault());

                        // Nel calcolo dell'importo delle ritenute operate NON devono essere compresi gli importi versate due volte
                        // http://www.condominioweb.com/forum/f17/errore-versamenti-ritenute-con-ff24-12097/
                        var importo = itemGroup.Where(item => item.Tipo == TipoVersamentoRitenutaEnum.Normale).Sum(item => item.Importo.GetValueOrDefault());
                        var importoRitenute = Math.Round(importo, 2);

                        // Nel calcolo dell'importo delle ritenute versate DEVONO essere compresi gli importi versati in eccesso
                        importo = itemGroup.Sum(item => item.ImportoConInteressi);
                        var importoVersato = Math.Round(importo, 2);

                        var datiProspettoST = new DatiProspettoSTBody770
                        {
                            AnnoRiferimento = keys[0].Substring(2, 4),
                            MeseRiferimento = keys[0].Substring(0, 2),
                            CodiceTributo = keys[1],
                            RitenuteOperate = importoRitenute > 0 ? importoRitenute.ToString() : string.Empty,
                            Interessi = (importoInteressi > 0) ? Math.Round(importoInteressi, 2).ToString() : string.Empty,
                            Ravvedimento = (importoInteressi > 0 || importoSanzioni > 0) ? "1" : string.Empty,
                            ImportoVersato = importoVersato.ToString(),
                            DataVersamento = keys[2]
                        };
                        datiST.Add(datiProspettoST);

                        if (countRow == 12)
                        {
                            numeroRecordE++;
                            var datiSTHeader = new DatiProspettoSTHeader770
                            {
                                CodiceFiscaleCondominio = condominio.CodiceFiscale,
                                NumeroModello = numeroRecordE.ToString().PadLeft(2, '0'),
                            };
                            var precompilato = FillForm.FillStream(datiSTHeader, (byte[])GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_ST"), GestioneFiscaleResources.Modello770STHeader_FieldMapping, true, true);
                            moduloST.Add(FillForm.FillStream(datiST.ToArray(), precompilato, GestioneFiscaleResources.Modello770STBody_FieldMapping, false, true));
                            countRow = 0;
                            datiST.Clear();
                        }
                    }
                    if (datiST.Count > 0)
                    {
                        numeroRecordE++;
                        var datiSTHeader = new DatiProspettoSTHeader770
                        {
                            CodiceFiscaleCondominio = condominio.CodiceFiscale,
                            NumeroModello = numeroRecordE.ToString().PadLeft(2, '0'),
                        };
                        var precompilato = FillForm.FillStream(datiSTHeader, (byte[])GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_ST"), GestioneFiscaleResources.Modello770STHeader_FieldMapping, true, true);
                        moduloST.Add(FillForm.FillStream(datiST.ToArray(), precompilato, GestioneFiscaleResources.Modello770STBody_FieldMapping, false, true));
                    }

                    // ---------------------------------------------------------------------
                    //  Quadro SX - Riepilogo dei crediti e delle compensazioni
                    // ---------------------------------------------------------------------
                    byte[] moduloSX = null;
                    if (importiVersatiInEccesso > 0)
                    {
                        var datiSX = new DatiProspettoSX770
                        {
                            CodiceFiscaleCondominio = condominio.CodiceFiscale,
                            NumeroModello = "0001",
                            CreditoCompensazione = Math.Round(importiVersatiInEccesso, 2).ToString(),
                            ImportoRitenuteVersateEccesso = Math.Round(importiVersatiInEccesso, 2).ToString(),
                            RiepilogoCreditoCompensazione = Math.Round(importiVersatiInEccesso, 2).ToString()
                        };
                        moduloSX = FillForm.FillStream(datiSX, (byte[])GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_SX"), GestioneFiscaleResources.Modello770SX_FieldMapping, false, true);
                    }

                    // ---------------------------------------------------------------------
                    //  Quadro SS - Dati riassuntivi
                    // ---------------------------------------------------------------------
                    byte[] moduloSS = null;
                    var importoRitenuteVersate = ritenute.Sum(item => item.Importo.GetValueOrDefault());
                    if (importoRitenuteVersate != 0)
                    {
                        var datiSS = new DatiProspettoSS770
                        {
                            CodiceFiscaleCondominio = condominio.CodiceFiscale,
                            NumeroModello = "01",
                            ImportoRitenute = Math.Round(importoRitenuteVersate, 2).ToString()
                        };
                        moduloSS = FillForm.FillStream(datiSS, (byte[])GestioneFiscaleResources.ResourceManager.GetObject("Modello770" + annoModulo + "_SS"), GestioneFiscaleResources.Modello770SS_FieldMapping, false, true);
                    }

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

                    // frontespizio
                    doc.AddDocument(moduloFrontespizio);

                    // fornitore
                    foreach (var item in moduloFornitori)
                        doc.AddDocument(item);

                    // quadro ST
                    foreach (var item in moduloST)
                        doc.AddDocument(item);

                    // quadro SX
                    if (moduloSX != null)
                        doc.AddDocument(moduloSX);

                    // quadro SS
                    if (moduloSS != null)
                        doc.AddDocument(moduloSS);

                    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.Fatal("Errore inaspettato durante la creazione del file per il modello 770 -" + Library.Utility.GetMethodDescription() + " - condominio:" + idCondominio + " - anno:" + anno, ex);
                    message = "Si sono verificati problemi inaspettati durante la generazione del modello 770." + 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");
        }
Beispiel #4
0
        private void calcolaCodiceFiscaleClick(object sender, EventArgs e)
        {
            // Calcolo codice fiscale
            if (string.IsNullOrEmpty(codiceFiscale.Text))
            {
                try
                {
                    string nome;
                    string cognome;
                    if (_referente != null)
                    {
                        nome = _referente.Nome;
                        cognome = _referente.Cognome;
                    }
                    else
                    {
                        nome = _persona.Nome;
                        cognome = _persona.Cognome;
                    }
                    var messaggio = string.Empty;
                    if (string.IsNullOrEmpty(nome))
                        messaggio += " - Immettere il nome" + Environment.NewLine;
                    if (string.IsNullOrEmpty(cognome))
                        messaggio += " - Immettere il cognome" + Environment.NewLine;
                    if (sceltaComuneCombo.GetComuneCorrente() == null)
                        messaggio += " - Scegliere il comune di nascita" + Environment.NewLine;
                    if (dataNascita.Value == null)
                        messaggio += " - Immettere la data di nascita" + Environment.NewLine;
                    if (sesso.Value == null)
                        messaggio += " - Immettere il sesso" + Environment.NewLine;

                    if (messaggio != string.Empty)
                    {
                        CommonMessages.DisplayWarning(messaggio);
                    }
                    else
                    {
                        var listaErrori = new System.Collections.ArrayList();
                        var codice = new CodiceFiscale();
                        var codiceFiscalePulito = codice.CalcolaCF(nome, cognome, Convert.ToChar(sesso.Text.Substring(0, 1)), dataNascita.DateTime.ToShortDateString(), _persona.ComuneNascita.CodiceCatastale, listaErrori);
                        codiceFiscale.Text = codiceFiscalePulito;
                        if (_referente != null)
                            _referente.CodiceFiscale = codiceFiscalePulito;
                        else
                            _persona.CodiceFiscale = codiceFiscalePulito;
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nel calcolo del codice fiscale - {0} - persona:{1} - referente:{2} - codice fiscale:{3} - azienda:{4}", ex, Utility.GetMethodDescription(), _persona?.ID.ToString() ?? "<NULL>", _referente?.ID.ToString() ?? "<NULL>", codiceFiscale.Text, Security.Login.Instance.CurrentLogin().Azienda);
                }
            }

            // Calcolo inverso codice fiscale
            else
            {
                try
                {
                    var codice = new CodiceFiscale();
                    var dati = codice.CalcoloInversoCF(codiceFiscale.Text);
                    if (dati != null)
                    {
                        _persona.DataNascita = dati.Value.DataNascita;

                        switch (dati.Value.Sesso)
                        {
                            case "M":
                                sesso.Value = "Maschio";
                                _persona.Sesso = SessoEnum.Maschio;
                                break;
                            case "F":
                                sesso.Value = "Femmina";
                                _persona.Sesso = SessoEnum.Femmina;
                                break;
                        }

                        var comune = getLocalitaService().GetComuneByCodiceCatastale(dati.Value.CodiceComune);
                        if (comune != null)
                        {
                            _persona.ComuneNascita = comune;
                            sceltaComuneCombo.Value = comune.ID;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore nella decodifica del codice fiscale - {0} - codice fiscale:{1} - azienda:{2}", ex, Utility.GetMethodDescription(), codiceFiscale.Text, Security.Login.Instance.CurrentLogin().Azienda);
                }
            }
        }
        /// <summary>
        /// Record contenente i dati anagrafici del contribuente e gli altri dati del modello base
        /// </summary>
        /// <param name="condominio"></param>
        /// <param name="numeroCertificazioniLavoroAutonomo"></param>
        /// <param name="presenteSx">Indica se è presente il modulo SX relativo ai versamenti in eccesso</param>
        /// <param name="idFornitoreModello770">Indica, se presente, l'identificativo del fornitore (consulente del lavoro) che presenta la parte della dichiarazione relativa ai contributi del dipendente.</param>
        /// <param name="numeroIscrizioneCaf">Numero di iscrizione all'albo del CAF, deve essere vuoto se il modello 770 non viene inviato tramite CAF</param>
        /// <param name="intermediarioDichiarazioneCondominio">Se true è il condominio che invia la dichiarazione</param>
        /// <param name="firmatarioDichiarazione">Persona firmatario della dichiarazione, se null viene usato l'amministratore dello studio</param>
        /// <param name="intermediarioDichiarazione">Persona intermediario della dichiarazione, se null sono usate le informazioni dello studio</param>
        /// <param name="sw">File di scrittura</param>
        /// <param name="dataDichiarazione"></param>
        private void writeRowB(Condominio condominio, DateTime dataDichiarazione, int numeroCertificazioniLavoroAutonomo, bool presenteSx, int? idFornitoreModello770, int? numeroIscrizioneCaf, bool intermediarioDichiarazioneCondominio, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, StreamWriter sw)
        {
            try
            {
                var sb = new StringBuilder(1900);

                // Tipo record
                sb.Append("B");

                // Codice Fiscale del soggetto dichiarante (Condominio)
                sb.Append(condominio.CodiceFiscale.PadRight(16, ' '));

                // Progressivo Modulo
                const int progressivoModulo = 1;
                sb.Append(progressivoModulo.ToString().PadLeft(8, '0'));

                // campo utente
                sb.Append(string.Empty.PadLeft(3));

                // filler
                sb.Append(string.Empty.PadLeft(25));

                // campo utente per identificativo dichiarazione
                sb.Append(string.Empty.PadRight(20));

                // Identificativo del produttore del software (codice fiscale)
                sb.Append("02818651206".PadRight(16));

                // Flag conferma
                sb.Append("1");

                //======================================================
                // Dati del frontespizio
                //======================================================

                //---------------------------------------------
                // Tipo di dichiarazione
                //---------------------------------------------

                // Dichiarazione correttiva nei termini
                sb.Append("0");
                // Dichiarazione correttiva/integrativa parziale
                sb.Append("0");
                // Dichiarazione integrativa
                sb.Append("0");
                // Eventi eccezionali
                sb.Append("0");

                //---------------------------------------------
                // Dati del sostituto (condominio)
                //---------------------------------------------

                // Cognome
                sb.Append(string.Empty.PadRight(24));
                // Nome
                sb.Append(string.Empty.PadRight(20));

                // Denominazione
                var denominazione = Library.Conversione.ToInvioTelematico(condominio.Descrizione);
                if (denominazione.Length > 60)
                    denominazione = denominazione.Substring(0, 60);
                sb.Append(denominazione.PadRight(60));

                // filler
                sb.Append(string.Empty.PadLeft(11));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));

                // codice attività
                sb.Append("949990");

                // Indirizzo posta elettronica
                sb.Append(string.Empty.PadRight(100));
                // Telefono o Cellulare - Prefisso e numero
                sb.Append(string.Empty.PadRight(12));
                // FAX - Prefisso e numero
                sb.Append(string.Empty.PadRight(12));

                //---------------------------------------------
                // Dati anagrafici Persona Fisica
                //---------------------------------------------

                // Comune di nascita
                sb.Append(string.Empty.PadRight(40));
                // Provincia di nascita
                sb.Append(string.Empty.PadRight(2));
                // Data di nascita
                sb.Append(string.Empty.PadRight(8, '0'));
                // Sesso
                sb.Append(string.Empty.PadRight(1));
                // Comune di residenza anagrafica o di domicilio fiscale del contribuente
                sb.Append(string.Empty.PadRight(40));
                // Sigla della provincia di residenza anagrafica o di domicilio fiscale del contribuente
                sb.Append(string.Empty.PadRight(2));
                // C.a.p. della residenza anagrafica o del domicilio fiscale del contribuente
                sb.Append(string.Empty.PadRight(5, '0'));
                // Codice Comune
                sb.Append(string.Empty.PadRight(4));
                // Indirizzo, frazione, via e numero civico della residenza anagrafica o del domicilio fiscale del contribuente
                sb.Append(string.Empty.PadRight(35));
                // Data della variazione
                sb.Append(string.Empty.PadRight(8, '0'));

                //---------------------------------------------
                // Dati Soggetti diversi da persona fisica
                //---------------------------------------------

                // Natura Giuridica
                sb.Append("51");

                // Data di variazione sede legale
                sb.Append(string.Empty.PadRight(6, '0'));

                // Comune della sede legale
                var comuneSedeLegale = Library.Conversione.ToInvioTelematico(condominio.Indirizzo.Comune.Descrizione);
                if (comuneSedeLegale.Length > 40)
                    comuneSedeLegale = comuneSedeLegale.Substring(0, 40);
                sb.Append(comuneSedeLegale.PadRight(40));

                // Sigla della provincia della sede legale
                sb.Append(condominio.Indirizzo.Comune.ProvinciaAppartenenza.Codice);

                // C.A.P. del comune della sede legale
                sb.Append(condominio.Indirizzo.Cap.PadLeft(5));

                // Codice comune
                sb.Append(condominio.Indirizzo.Comune.CodiceCatastale.PadRight(4));

                // Indirizzo della sede legale: frazione, via e numero civico
                var indirizzoSedeLegale = Library.Conversione.ToInvioTelematico(condominio.Indirizzo.Localita);
                if (!string.IsNullOrEmpty(indirizzoSedeLegale))
                    indirizzoSedeLegale += ",";
                indirizzoSedeLegale += Library.Conversione.ToInvioTelematico(condominio.Indirizzo.GetIndirizzoCompleto());
                if (indirizzoSedeLegale.Length > 35)
                    indirizzoSedeLegale = indirizzoSedeLegale.Substring(0, 35);
                sb.Append(indirizzoSedeLegale.PadRight(35));

                // Data di variazione domicilio fiscale
                sb.Append(string.Empty.PadRight(6, '0'));

                // Comune del domicilio fiscale
                sb.Append(string.Empty.PadRight(40));
                // Provincia (sigla) del domicilio fiscale
                sb.Append(string.Empty.PadRight(2));
                // Cap del domicilio fiscale
                sb.Append(string.Empty.PadRight(5, '0'));
                // Codice Comune
                sb.Append(string.Empty.PadRight(4));
                // Frazione, via e numero civico del domicilio fiscale
                sb.Append(string.Empty.PadRight(35));

                // Stato
                sb.Append("1");

                // Situazione
                sb.Append("6");

                // Codice fiscale del dicastero di appartenenza
                sb.Append(string.Empty.PadRight(11, '0'));

                // filler
                sb.Append(string.Empty.PadLeft(24));
                sb.Append(string.Empty.PadLeft(3));
                sb.Append(string.Empty.PadLeft(24));
                sb.Append(string.Empty.PadLeft(8));

                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(16));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(16));
                // filler
                sb.Append(string.Empty.PadLeft(1));

                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));
                // filler
                sb.Append(string.Empty.PadLeft(1));

                //---------------------------------------------
                // Caselle 770 semplificato
                //---------------------------------------------

                // Redazione della dichiarazione, Campo obbligatorio, assume i seguenti valori:
                // - 1 (sezione I) 
                // - 2 (sezione II)
                // - 3 (sezione III)
                // - 4 (sezione IV)
                sb.Append(idFornitoreModello770 == null ? "1" : "4");

                // Numero comunicazioni relative a certificazioni lavoro dipendente ed assimilati
                const int numeroCertificazioniLavoroDipendente = 0;
                sb.Append(numeroCertificazioniLavoroDipendente.ToString().PadLeft(8, '0'));

                // Numero comunicazioni relative a certificazioni lavoro autonomo e provvigioni
                sb.Append(numeroCertificazioniLavoroAutonomo.ToString().PadLeft(8, '0'));

                // Casella prospetto SS
                sb.Append("1");
                // Casella prospetto ST
                sb.Append("1");
                // Casella prospetto SV
                sb.Append("0");
                // Casella prospetto SX
                sb.Append(presenteSx ? "1" : "0");
                // Casella prospetto SY
                sb.Append("0");
                // Presenza di modello 770 ordinario
                sb.Append("0");

                // Codice fiscale del soggetto che presenta la restante parte della dichiarazione
                if(idFornitoreModello770 == null)
                    sb.Append(string.Empty.PadRight(16));
                else
                {
                    var fornitore770 = _daoFactory.GetFornitoreDao().Find(idFornitoreModello770.GetValueOrDefault(), false);
                    if(fornitore770 != null)
                        sb.Append(fornitore770.GetCodiceFiscale().PadRight(16));
                }

                //---------------------------------------------
                // Dichiarazione "correttiva nei termini/integrativa" parziale
                //---------------------------------------------

                // Protocollo assegnato dal Servizio telematico alla dichiarazione per la quale si è reso necessario il nuovo invio - Identificativo
                sb.Append(string.Empty.PadLeft(17, '0'));

                // Protocollo assegnato dal Servizio telematico alla dichiarazione per la quale si è reso necessario il nuovo invio - Progressivo dichiarazione
                sb.Append(string.Empty.PadLeft(6, '0'));

                //---------------------------------------------
                // Modello 770 semplificato - Invio dichiarazioni "integrative parziali/correttive" o dichiarazioni su più invii
                //---------------------------------------------

                // Casella prospetto SS
                sb.Append("0");
                // Casella prospetto ST
                sb.Append("0");
                // Casella prospetto SV
                sb.Append("0");
                // Casella prospetto SX
                sb.Append("0");
                // Casella prospetto SY
                sb.Append("0");

                // Numero comunicazioni relative a certificazioni lavoro dipendente ed assimilati contenute nella dichiarazione "parziale"
                sb.Append(string.Empty.PadLeft(8, '0'));

                // Numero comunicazioni relative a certificazioni lavoro autonomo e provvigioni contenute nella dichiarazione "parziale"
                sb.Append(string.Empty.PadLeft(8, '0'));

                //---------------------------------------------
                // Firma della dichiarazione - La casella relativa all'invio avviso telematico all'internediario è presente nella sezione avviso telematico al campo 147 del record B.
                // I controlli relativi ai campi 95, 96 e 97 sono validi anche per i campi da 98 a 109
                //---------------------------------------------

                // Firma del dichiarante
                sb.Append("1");

                // Codice fiscale - 1
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");
                
                // Codice fiscale - 2
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Codice fiscale - 3
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Codice fiscale - 4
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Codice fiscale - 5
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Casella non trasmissione prospetti ST, SV e/o SX
                sb.Append("0");

                // Casella attestazione
                sb.Append("0");

                //---------------------------------------------
                // Spazio non utilizzato
                //---------------------------------------------

                // filler
                sb.Append(string.Empty.PadLeft(123));

                // filler
                sb.Append(string.Empty.PadRight(24));

                // filler
                sb.Append(string.Empty.PadRight(20));

                // filler
                sb.Append(string.Empty.PadRight(40));

                // Situazioni particolari - Codice
                sb.Append("00");

                // filler
                sb.Append(string.Empty.PadLeft(4));

                // filler
                sb.Append(string.Empty.PadLeft(5));

                // filler
                sb.Append(string.Empty.PadLeft(15));

                // filler
                sb.Append(string.Empty.PadLeft(35));

                // filler
                sb.Append(string.Empty.PadLeft(10));

                // filler
                sb.Append(string.Empty.PadLeft(35));

                // filler
                sb.Append(string.Empty.PadRight(24));

                // filler
                sb.Append(string.Empty.PadRight(3));

                // filler
                sb.Append(string.Empty.PadRight(83));

                //---------------------------------------------
                // Dati relativi al rappresentante firmatario della dichiarazione.
                //---------------------------------------------

                // Codice fiscale del firmatario della dichiarazione il dato è obbligatorio se presente un campo della sezione.
                // Deve essere diverso dal codice fiscale del contribuente (campo 2). 
                // Il codice fiscale deve essere formalmente corretto, registrato in Anagrafe tributaria e deve essere attribuito ad una persona fisica.
                var codiceFiscale = firmatarioDichiarazione != null ? firmatarioDichiarazione.CodiceFiscale : condominio.Azienda.Amministratore.PersonaRiferimento.CodiceFiscale;
                sb.Append(codiceFiscale.PadRight(16));

                // Codice carica del rappresentante
                sb.Append("13");

                // Data carica del rappresentante
                sb.Append("00000000");

                // filler
                sb.Append(string.Empty.PadLeft(11));

                // filler
                sb.Append(string.Empty.PadLeft(60));

                // Cognome del rappresentante
                var cognome = firmatarioDichiarazione != null ? firmatarioDichiarazione.Cognome : condominio.Azienda.Amministratore.PersonaRiferimento.Cognome;
                sb.Append(Library.Conversione.ToInvioTelematico(cognome).ToUpper().PadRight(24));

                // Nome del rappresentante
                var nome = firmatarioDichiarazione != null ? firmatarioDichiarazione.Nome : condominio.Azienda.Amministratore.PersonaRiferimento.Nome;
                sb.Append(Library.Conversione.ToInvioTelematico(nome).ToUpper().PadRight(20));

                var sesso = string.Empty;
                DateTime? dataNascita = null;
                var comuneNascita = string.Empty;
                var siglaProvinciaNascita = string.Empty;
                if (firmatarioDichiarazione != null)
                {
                    var cf = new CodiceFiscale();
                    var datiNascita = cf.CalcoloInversoCF(firmatarioDichiarazione.CodiceFiscale);
                    if (datiNascita != null)
                    {
                        sesso = datiNascita.GetValueOrDefault().Sesso;
                        dataNascita = datiNascita.GetValueOrDefault().DataNascita;

                        var codiceComuneNascita = datiNascita.GetValueOrDefault().CodiceComune;
                        var comune = _daoFactory.GetComuneDao().GetByCodiceCatastale(codiceComuneNascita);
                        if (comune != null)
                        {
                            comuneNascita = comune.Descrizione;
                            siglaProvinciaNascita = comune.ProvinciaAppartenenza.Codice;
                        }
                    }
                }
                else
                {
                    sesso = condominio.Azienda.Amministratore.PersonaRiferimento.Sesso.ToString();
                    dataNascita = condominio.Azienda.Amministratore.PersonaRiferimento.DataNascita;
                    comuneNascita = condominio.Azienda.Amministratore.PersonaRiferimento.ComuneNascita.Descrizione;
                    siglaProvinciaNascita = condominio.Azienda.Amministratore.PersonaRiferimento.ComuneNascita.ProvinciaAppartenenza.Codice;
                }

                // Sesso del rappresentante
                sb.Append(sesso.Substring(0, 1));

                // Data di nascita del rappresentante
                sb.Append(convertData(dataNascita));

                // Comune o stato estero di nascita del rappresentante
                sb.Append(Library.Conversione.ToInvioTelematico(comuneNascita).PadRight(40));

                // Sigla della provincia di nascita del rappresentante
                sb.Append(siglaProvinciaNascita.PadRight(2));

                // Codice Stato Esterno
                sb.Append("000");

                // Stato federato, provincia, contea
                sb.Append(string.Empty.PadRight(24));

                // Località di residenza
                sb.Append(string.Empty.PadRight(24));

                // Indirizzo estero
                sb.Append(string.Empty.PadRight(35));

                // telefono - cellulare del rappresentante
                sb.Append(string.Empty.PadRight(12));

                // Data apertura fallimento
                sb.Append("00000000");

                // Codice fiscale societa o ente dichiarante
                sb.Append(string.Empty.PadLeft(11, '0'));

                // filler
                sb.Append(string.Empty.PadLeft(8));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));

                // Invio avviso telematico all'intermediario
                sb.Append("0");
                // Ricezione avviso telematico
                sb.Append("0");

                //---------------------------------------------
                // Impegno alla trasmissione telematica
                //---------------------------------------------

                // Codice fiscale dell'intermediario
                string codiceFiscaleIntermediario;
                if (intermediarioDichiarazione != null)
                    codiceFiscaleIntermediario = intermediarioDichiarazione.CodiceFiscale;
                else if (intermediarioDichiarazioneCondominio)
                    codiceFiscaleIntermediario = condominio.CodiceFiscale;
                else 
                    codiceFiscaleIntermediario = condominio.Azienda.CodiceFiscale;
                sb.Append(codiceFiscaleIntermediario.PadRight(16));

                // Numero di iscrizione all'albo del C.A.F.
                var numeroCaf = string.Empty;
                if (numeroIscrizioneCaf != null)
                {
                    numeroCaf = numeroIscrizioneCaf.Value.ToString();
                    if (numeroCaf.Length > 5)
                        numeroCaf = numeroCaf.Substring(0, 5);
                }
                sb.Append(numeroCaf.PadLeft(5, '0'));

                // Impegno a trasmettere in via telematica la dichiarazione
                var impegnoTrasmettereDichiarazione = intermediarioDichiarazione != null || intermediarioDichiarazioneCondominio ? "1" : "2";
                sb.Append(impegnoTrasmettereDichiarazione);

                // Data dell'impegno
                var dataImpegno = convertData(dataDichiarazione);
                sb.Append(dataImpegno);

                // Firma dell'intermediario
                sb.Append("1");

                //---------------------------------------------
                // Visto di conformità
                //---------------------------------------------

                // Codice fiscale del responsabile del C.A.F.
                sb.Append(string.Empty.PadRight(16));

                // Codice fiscale del C.A.F.
                sb.Append(string.Empty.PadRight(11, '0'));

                // Codice fiscale del professionista
                sb.Append(string.Empty.PadRight(16));

                // Firma
                sb.Append("0");

                // filler
                sb.Append(string.Empty.PadLeft(16));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(7));
                sb.Append(string.Empty.PadLeft(27));

                //---------------------------------------------
                // Spazio riservato al Servizio telematico
                //---------------------------------------------

                // Spazio riservato al Servizio Telematico
                sb.Append(string.Empty.PadLeft(20));

                // filler
                sb.Append(string.Empty.PadLeft(7));
                sb.Append(string.Empty.PadLeft(3));
                sb.Append(string.Empty.PadLeft(3));
                sb.Append(string.Empty.PadLeft(1));

                // filler
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(15));

                //---------------------------------------------
                // Ultimi caratteri di controllo
                //---------------------------------------------
                sb.Append("A");

                // CarriageReturn LineFeed
                sb.Append(CRLF);

                sw.Write(sb.ToString());
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la creazione della riga B per modello 770 - {0} - condominio:{1} - data dichiarazione:{2}", ex, Library.Utility.GetMethodDescription(), condominio.ID, dataDichiarazione);
                throw;
            }
        /// <summary>
        /// Record contenente i dati anagrafici del contribuente e gli altri dati del modello base
        /// </summary>
        /// <param name="condominio"></param>
        /// <param name="presenteSx">Indica se è presente il modulo SX relativo ai versamenti in eccesso</param>
        /// <param name="presenteSsSt">Indica se sono presenti i moduli SS e ST relativi alle ritenute versate</param>
        /// <param name="idFornitoreModello770">Indica, se presente, l'identificativo del fornitore (consulente del lavoro) che presenta la parte della dichiarazione relativa ai contributi del dipendente.</param>
        /// <param name="numeroIscrizioneCaf">Numero di iscrizione all'albo del CAF, deve essere vuoto se il modello 770 non viene inviato tramite CAF</param>
        /// <param name="intermediarioDichiarazioneCondominio">Se true è il condominio che invia la dichiarazione</param>
        /// <param name="firmatarioDichiarazione">Persona firmatario della dichiarazione, se null viene usato l'amministratore dello studio</param>
        /// <param name="intermediarioDichiarazione">Persona intermediario della dichiarazione, se null sono usate le informazioni dello studio</param>
        /// <param name="sw">File di scrittura</param>
        /// <param name="dataDichiarazione"></param>
        private void writeRowB(Condominio condominio, DateTime dataDichiarazione, bool presenteSx, bool presenteSsSt, int? idFornitoreModello770, int? numeroIscrizioneCaf, bool intermediarioDichiarazioneCondominio, bool enteDichiarante, PersonaDTO firmatarioDichiarazione, PersonaDTO intermediarioDichiarazione, StreamWriter sw)
        {
            try
            {
                var sb = new StringBuilder(1900);

                // Tipo record
                sb.Append("B");

                // Codice Fiscale del soggetto dichiarante (Condominio)
                sb.Append(condominio.CodiceFiscale.PadRight(16, ' '));

                // Progressivo Modulo
                const int progressivoModulo = 1;
                sb.Append(progressivoModulo.ToString().PadLeft(8, '0'));

                // campo utente
                sb.Append(string.Empty.PadLeft(3));

                // filler
                sb.Append(string.Empty.PadLeft(25));

                // campo utente per identificativo dichiarazione
                sb.Append(string.Empty.PadRight(20));

                // Identificativo del produttore del software (codice fiscale)
                sb.Append("02818651206".PadRight(16));

                // Flag conferma
                sb.Append("1");

                //======================================================
                // Dati del frontespizio
                //======================================================

                //---------------------------------------------
                // Tipo di dichiarazione
                //---------------------------------------------

                // Dichiarazione correttiva nei termini
                sb.Append("0");
                // Dichiarazione correttiva/integrativa parziale
                sb.Append("0");
                // Dichiarazione integrativa
                sb.Append("0");
                // Filler
                sb.Append("0");

                //---------------------------------------------
                // Dati del sostituto (condominio)
                //---------------------------------------------

                // Cognome
                sb.Append(string.Empty.PadRight(24));
                // Nome
                sb.Append(string.Empty.PadRight(20));

                // Denominazione
                var denominazione = Library.Conversione.ToInvioTelematico(condominio.Descrizione);
                if (denominazione.Length > 60)
                    denominazione = denominazione.Substring(0, 60);
                sb.Append(denominazione.PadRight(60));

                // Comune di nascita (Dato obbligatorio se presenti i campi 13[Cognome], 14[Nome])
                sb.Append(string.Empty.PadLeft(40));
                // Provincia di nascita (Dato obbligatorio se presenti i campi 13[Cognome], 14[Nome])
                sb.Append(string.Empty.PadLeft(2));
                // Data di nascita (Dato obbligatorio se presenti i campi 13[Cognome], 14[Nome])
                sb.Append("00000000");
                // Sesso (Dato obbligatorio se presenti i campi 13[Cognome], 14[Nome])
                sb.Append(string.Empty.PadLeft(1));

                // Filler
                sb.Append(string.Empty.PadLeft(10));

                // Eventi eccezionali
                sb.Append("00");

                // Filler
                sb.Append(string.Empty.PadLeft(1));

                // codice attività
                sb.Append("970000");

                // Indirizzo posta elettronica
                sb.Append(string.Empty.PadRight(100));
                // Telefono o Fax
                sb.Append(string.Empty.PadRight(12));

                // Filler
                sb.Append(string.Empty.PadRight(12));
                // Filler
                sb.Append(string.Empty.PadRight(40));
                // Filler
                sb.Append(string.Empty.PadRight(54));

                //---------------------------------------------
                // Dati Soggetti diversi da persona fisica
                // La sezione (e i controlli in essa descritti) deve essere presente se presente il campo 15.
                //---------------------------------------------

                // Stato
                sb.Append("1");

                // Natura Giuridica
                sb.Append("51");

                // Situazione
                sb.Append("6");

                // Codice fiscale del dicastero di appartenenza
                sb.Append(string.Empty.PadRight(11, '0'));

                // filler
                sb.Append(string.Empty.PadLeft(57));
                sb.Append(string.Empty.PadLeft(127));
                sb.Append(string.Empty.PadLeft(111));


                //---------------------------------------------
                // Dati relativi al rappresentante firmatario della dichiarazione.
                //---------------------------------------------

                // Codice fiscale del firmatario della dichiarazione il dato è obbligatorio se presente un campo della sezione.
                // Deve essere diverso dal codice fiscale del contribuente (campo 2). 
                // Il codice fiscale deve essere formalmente corretto, registrato in Anagrafe tributaria e deve essere attribuito ad una persona fisica.
                var codiceFiscale = firmatarioDichiarazione != null ? firmatarioDichiarazione.CodiceFiscale : condominio.Azienda.Amministratore.PersonaRiferimento.CodiceFiscale;
                sb.Append(codiceFiscale.PadRight(16));

                // Codice carica del rappresentante
                sb.Append("13");

                // Data carica del rappresentante
                sb.Append("00000000");

                // filler
                sb.Append(string.Empty.PadLeft(11));

                // filler
                sb.Append(string.Empty.PadLeft(60));

                // Cognome del rappresentante
                var cognome = firmatarioDichiarazione != null ? firmatarioDichiarazione.Cognome : condominio.Azienda.Amministratore.PersonaRiferimento.Cognome;
                sb.Append(Library.Conversione.ToInvioTelematico(cognome).ToUpper().PadRight(24));

                // Nome del rappresentante
                var nome = firmatarioDichiarazione != null ? firmatarioDichiarazione.Nome : condominio.Azienda.Amministratore.PersonaRiferimento.Nome;
                sb.Append(Library.Conversione.ToInvioTelematico(nome).ToUpper().PadRight(20));

                var sesso = string.Empty;
                DateTime? dataNascita = null;
                var comuneNascita = string.Empty;
                var siglaProvinciaNascita = string.Empty;
                if (firmatarioDichiarazione != null)
                {
                    var cf = new CodiceFiscale();
                    var datiNascita = cf.CalcoloInversoCF(firmatarioDichiarazione.CodiceFiscale);
                    if (datiNascita != null)
                    {
                        sesso = datiNascita.GetValueOrDefault().Sesso;
                        dataNascita = datiNascita.GetValueOrDefault().DataNascita;

                        var codiceComuneNascita = datiNascita.GetValueOrDefault().CodiceComune;
                        var comune = _daoFactory.GetComuneDao().GetByCodiceCatastale(codiceComuneNascita);
                        if (comune != null)
                        {
                            comuneNascita = comune.Descrizione;
                            siglaProvinciaNascita = comune.ProvinciaAppartenenza.Codice;
                        }
                    }
                }
                else
                {
                    sesso = condominio.Azienda.Amministratore.PersonaRiferimento.Sesso.ToString();
                    dataNascita = condominio.Azienda.Amministratore.PersonaRiferimento.DataNascita;
                    comuneNascita = condominio.Azienda.Amministratore.PersonaRiferimento.ComuneNascita.Descrizione;
                    siglaProvinciaNascita = condominio.Azienda.Amministratore.PersonaRiferimento.ComuneNascita.ProvinciaAppartenenza.Codice;
                }

                // Sesso del rappresentante
                sb.Append(sesso.Substring(0, 1));

                // Data di nascita del rappresentante
                sb.Append(convertData(dataNascita));

                // Comune o stato estero di nascita del rappresentante
                sb.Append(Library.Conversione.ToInvioTelematico(comuneNascita).PadRight(40));

                // Sigla della provincia di nascita del rappresentante
                sb.Append(siglaProvinciaNascita.PadRight(2));

                // Codice Stato Estero
                sb.Append("000");

                // Stato federato, provincia, contea
                sb.Append(string.Empty.PadRight(24));

                // Località di residenza
                sb.Append(string.Empty.PadRight(24));

                // Indirizzo estero
                sb.Append(string.Empty.PadRight(35));

                // telefono - cellulare del rappresentante
                sb.Append(string.Empty.PadRight(12));

                // Data apertura fallimento
                sb.Append("00000000");

                // Codice fiscale societa o ente dichiarante
                sb.Append(!enteDichiarante ? string.Empty.PadLeft(11, '0') : condominio.Azienda.PartitaIva);

                // filler
                sb.Append(string.Empty.PadLeft(8));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));

                //---------------------------------------------
                // Firma della Dichiarazione - Prospetti compilati
                //---------------------------------------------

                // filler
                sb.Append(string.Empty.PadLeft(1));

                // Casella relativa a certificazioni lavoro dipendente ed assimilati
                sb.Append("0");

                // Casella relativa a certificazioni lavoro autonomo e provvigioni
                sb.Append("1");

                // filler (numerico)
                sb.Append(string.Empty.PadLeft(15));

                // Casella prospetto ST (Se il campo è impostato ad '1' deve essere presente almeno un dato del relativo prospetto.)
                sb.Append(presenteSsSt ? "1" : "0");
                // Casella prospetto SV (Se il campo è impostato ad '1' deve essere presente almeno un dato del relativo prospetto.)
                sb.Append("0");
                // Casella prospetto SX (Se il campo è impostato ad '1' deve essere presente almeno un dato del relativo prospetto.)
                sb.Append(presenteSx ? "1" : "0");
                // Casella prospetto SY (Se il campo è impostato ad '1' deve essere presente almeno un dato del relativo prospetto.)
                sb.Append("0");

                // filler
                sb.Append("0");

                // Codice fiscale del soggetto che presenta la restante parte della dichiarazione
                if (idFornitoreModello770 == null)
                    sb.Append(string.Empty.PadRight(16));
                else
                {
                    var fornitore770 = _daoFactory.GetFornitoreDao().Find(idFornitoreModello770.GetValueOrDefault(), false);
                    if(fornitore770 != null)
                        sb.Append(fornitore770.GetCodiceFiscale().PadRight(16));
                }

                // filler
                sb.Append(string.Empty.PadLeft(17));
                sb.Append(string.Empty.PadLeft(6));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(8));
                sb.Append(string.Empty.PadLeft(8));

                //---------------------------------------------
                // Firma della dichiarazione - La casella relativa all'invio avviso telematico all'internediario è presente nella sezione avviso telematico al campo 147 del record B.
                // I controlli relativi ai campi 95, 96 e 97 sono validi anche per i campi da 98 a 109
                //---------------------------------------------

                // Firma del dichiarante
                sb.Append("1");

                // Codice fiscale (Dato obbligatorio se presente il campo 78. Se il campo 78 vale 3 il codice fiscale deve essere numerico)
                sb.Append(string.Empty.PadRight(16));
                // Soggetto (Vale 1o 2 o 3 o 4. Dato obbligatorio se presente il campo 77. Vale 4 se uno dei campi 81 o 84 o 87 o 90 assume valore 4.Se vale 2, almeno uno dei campi  81 o 84 o 87 o 90 assume valore 3 )
                sb.Append("0");
                // Firma (Dato obbligatorio se è presente il campo 77 o 78 e se 78 assume valori diversi da  3)
                sb.Append("0");
                
                // Codice fiscale - 2
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Codice fiscale - 3
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Codice fiscale - 4
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // Codice fiscale - 5
                sb.Append(string.Empty.PadRight(16));
                // Soggetto
                sb.Append("0");
                // Firma
                sb.Append("0");

                // filler
                sb.Append(string.Empty.PadLeft(1));

                // Casella attestazione (Se barrata deve essere compilato almeno un campo da 77 a 91.)
                sb.Append("0");

                //---------------------------------------------
                // Spazio non utilizzato
                //---------------------------------------------

                // filler
                sb.Append(string.Empty.PadLeft(123));

                // filler
                sb.Append(string.Empty.PadRight(24));

                // filler
                sb.Append(string.Empty.PadRight(20));

                // filler
                sb.Append(string.Empty.PadRight(40));

                // Situazioni particolari - Codice
                sb.Append("00");

                // filler
                sb.Append(string.Empty.PadLeft(4));

                // filler
                sb.Append(string.Empty.PadLeft(5));

                // filler
                sb.Append(string.Empty.PadLeft(15));

                // filler
                sb.Append(string.Empty.PadLeft(35));

                // filler
                sb.Append(string.Empty.PadLeft(10));

                // filler
                sb.Append(string.Empty.PadLeft(35));

                // filler
                sb.Append(string.Empty.PadRight(24));

                // filler
                sb.Append(string.Empty.PadRight(3));

                // filler
                sb.Append(string.Empty.PadRight(83));
                
                // Invio avviso telematico all'intermediario
                sb.Append("0");
                // Ricezione avviso telematico
                sb.Append("0");

                //---------------------------------------------
                // Impegno alla trasmissione telematica
                //---------------------------------------------

                // Codice fiscale dell'incaricato
                string codiceFiscaleIncaricato;
                if (intermediarioDichiarazione != null)
                    codiceFiscaleIncaricato = intermediarioDichiarazione.CodiceFiscale;
                else if (intermediarioDichiarazioneCondominio)
                    codiceFiscaleIncaricato = condominio.CodiceFiscale;
                else 
                    codiceFiscaleIncaricato = condominio.Azienda.CodiceFiscale;
                sb.Append(codiceFiscaleIncaricato.PadRight(16));

                // Numero di iscrizione all'albo del C.A.F.
                var numeroCaf = string.Empty;
                if (numeroIscrizioneCaf != null)
                {
                    numeroCaf = numeroIscrizioneCaf.Value.ToString();
                    if (numeroCaf.Length > 5)
                        numeroCaf = numeroCaf.Substring(0, 5);
                }
                sb.Append(numeroCaf.PadLeft(5, '0'));

                // Impegno a trasmettere in via telematica la dichiarazione
                var impegnoTrasmettereDichiarazione = intermediarioDichiarazione != null || intermediarioDichiarazioneCondominio ? "1" : "2";
                sb.Append(impegnoTrasmettereDichiarazione);

                // Data dell'impegno
                var dataImpegno = convertData(dataDichiarazione);
                sb.Append(dataImpegno);

                // Firma dell'incaricato
                sb.Append("1");

                //---------------------------------------------
                // Visto di conformità
                //---------------------------------------------

                // Codice fiscale del responsabile del C.A.F.
                sb.Append(string.Empty.PadRight(16));

                // Codice fiscale del C.A.F.
                sb.Append(string.Empty.PadRight(11, '0'));

                // Codice fiscale del professionista
                sb.Append(string.Empty.PadRight(16));

                // Firma
                sb.Append("0");

                // filler
                sb.Append(string.Empty.PadLeft(16));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(7));
                sb.Append(string.Empty.PadLeft(27));

                //---------------------------------------------
                // Spazio riservato al Servizio telematico
                //---------------------------------------------

                // Spazio riservato al Servizio Telematico
                sb.Append(string.Empty.PadLeft(20));

                // filler
                sb.Append(string.Empty.PadLeft(7));
                sb.Append(string.Empty.PadLeft(3));
                sb.Append(string.Empty.PadLeft(3));
                sb.Append(string.Empty.PadLeft(1));

                // filler
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(1));
                sb.Append(string.Empty.PadLeft(15));

                //---------------------------------------------
                // Ultimi caratteri di controllo
                //---------------------------------------------
                sb.Append("A");

                // CarriageReturn LineFeed
                sb.Append(CRLF);

                sw.Write(sb.ToString());
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la creazione della riga B per modello 770 - {0} - condominio:{1} - data dichiarazione:{2}", ex, Library.Utility.GetMethodDescription(), condominio.ID, dataDichiarazione);
                throw;
            }
        }