using System;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using Consulenza.ReportWriter.Business;
using ceTe.DynamicPDF;
using System.Data;
using System.Linq;
using Consulenza.ReportCommon;
using System.Collections.Generic;
using Consulenza.ReportWriter.Business.Entity;
namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.Finalita
{
///
/// Dettaglio fabbricati (id 143)
///
public class S4 : Entity.Section
{
public S4(EnvironmentFacade environmentFacade, int idSection)
: base(environmentFacade, idSection)
{
try
{
Draw();
}
catch (Exception ex)
{
SectionLogger.Write("S4", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
}
}
///
/// Scheda4. Dettaglio fabbricati (elenco dei fabbricati e dei principali dati catastali, quote e valore stimato del cliente e dei cointestatari)
///
protected override sealed void Draw()
{
var dati = GetDataSet();
if (dati == null || dati.Tables[0].Rows.Count == 0) return;
var testi = GetText();
// Immobili con anomalie catastali
var immobiliConAnomalieCatastali = dati.Tables["Dati"].AsEnumerable().Where(r => r.Field("AnomaliaCatastale"));
// Immobili selezionati dall'utente
var immobiliSelezionati = dati.Tables["Dati"].AsEnumerable().Where(r => EnvironmentFacade.ReportEnvironment.FinalitaImmobiliare.IdImmobileCatasto.Contains(r.Field("IdImmobileCatasto")));
// Immobili non a catasto
var immobiliNonACatasto = dati.Tables["Dati"].AsEnumerable().Where(r => r.Field("Catasto") == false);
#region Recupero il numero massimo di colonne di tipo immagine da aggiungere
var numeroColonneImmagine = 0;
var listaCompletaIndici = new List();
listaCompletaIndici.AddRange(immobiliConAnomalieCatastali.Select(o => o.Field("Indice")));
listaCompletaIndici.AddRange(immobiliSelezionati.Select(o => o.Field("Indice")));
listaCompletaIndici.AddRange(immobiliNonACatasto.Select(o => o.Field("Indice")));
if (listaCompletaIndici.Any())
{
numeroColonneImmagine = (from indice in listaCompletaIndici
group indice by indice into grouping
select new
{
Key = grouping.Key,
Count = grouping.Count()
}).Max(x => x.Count);
}
#endregion
var icona = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.20F, "Fabbricati.png") { AutoIncrementYWritable = false };
var titolo = new FormattedTextAreaPDF(testi.Rows[0]["testo1"].ToString(), 82, 600) { FontSize = 10, FontColor = ColorPDF.Immobiliare_Grigio_TestoStandard, DeltaY = 5 };
#region Tabella
var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["Dati"])
{
Style = Style.Immobiliare,
RowsPadding = 3,
Footer = true,
HeaderHeight = 115,
MinimumRowHeight = 12
};
#region definizione larghezza colonne
const int larghezzaTabella = 755; // massima larghezza tabella
var larghezzaImmagine = immobiliConAnomalieCatastali.Any() || immobiliSelezionati.Any() || immobiliNonACatasto.Any() ? 17 : 0;
const int larghezzaSingoloCliente = 65;
const int larghezzaCategoriaCatastale = 22;
const int larghezzaSuperficieStimata = 25;
const int larghezzaRenditaCatastale = 45;
const int larghezzaQuotaProprieta = 42;
const int larghezzaTotale = 70;
//La colonna descrizione è l'unica variabile.
var larghezzaDescrizione = larghezzaTabella - larghezzaImmagine - larghezzaCategoriaCatastale - larghezzaSuperficieStimata - larghezzaRenditaCatastale - larghezzaQuotaProprieta - larghezzaTotale - (larghezzaSingoloCliente * dati.Tables[1].Rows.Count);
// Colonne di tipo Immagine
for (int i = 1; i <= numeroColonneImmagine; i++)
{
larghezzaDescrizione -= larghezzaImmagine;
tabella.Columns.Add(new ColumnPDF(string.Format("immagine{0}", i), larghezzaImmagine, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Immagine, string.Empty, string.Empty) { ScaleColumnTypeImage = 0.1F });
}
#endregion
#region colonne e colonne del footer
tabella.Columns.Add(new ColumnPDF("descrizione", larghezzaDescrizione, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "Descrizione") { HeaderVerticalAlignment = VerticalAlignmentType.Basso, HeaderFontBold = true, PaddingLeft = 5 });
tabella.Columns.Add(new ColumnPDF("categoriacatastale", larghezzaCategoriaCatastale, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "CategoriaCatastale", "Categoria catastale") { HeaderTextVerticalDirection = true, HeaderFontBold = false });
tabella.Columns.Add(new ColumnPDF("superficiestimata", larghezzaSuperficieStimata, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "SuperficieStimataStringa", "Superficie stimata (mq)") { HeaderTextVerticalDirection = true, HeaderFontBold = false });
tabella.Columns.Add(new ColumnPDF("renditacatastale", larghezzaRenditaCatastale, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "RenditaCatastaleStringa", "Rendita catastale") { HeaderTextVerticalDirection = true, HeaderFontBold = false, PaddingRight = 5 });
tabella.FooterColumns.Add(new ColumnPDF("descrizione", tabella.Columns.Sum(p => p.Width), HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo));
tabella.FooterCells[0, 0].Value = "Totale";
tabella.Columns.Add(new ColumnPDF("quotaproprieta", larghezzaQuotaProprieta, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "QuotaProprietaStringa", "")
{
HeaderTextVerticalDirection = true,
BackgroundColor = ColorPDF.Immobiliare_Marrone,
HeaderBackgroundColor = ColorPDF.Immobiliare_Marrone,
FontColor = ColorPDF.Bianco,
FontBold = true
});
tabella.FooterColumns.Add(new ColumnPDF("quotaproprieta", larghezzaQuotaProprieta, HorizontalAlignmentType.Sinistra, false, true, 7, ColumnType.Testo)
{
BackgroundColor = ColorPDF.Immobiliare_Marrone
});
var iColonna = 2;
foreach (DataRow cliente in dati.Tables["Clienti"].Rows)
{
var iCliente = Convert.ToInt32(cliente["PosizioneCliente"]);
var campoStringa = string.Format("Cliente{0}Stringa", iCliente);
tabella.Columns.Add(new ColumnPDF(campoStringa, larghezzaSingoloCliente, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, campoStringa, cliente["Cliente"].ToString())
{
HeaderVerticalAlignment = VerticalAlignmentType.Basso,
HeaderTextVerticalDirection = true,
HeaderBackgroundColor = iColonna == 2 ? ColorPDF.Immobiliare_Marrone : null,
HeaderFontColor = iColonna == 2 ? ColorPDF.Bianco : null,
HeaderFontBold = iColonna == 2,
BackgroundColor = iColonna == 2 ? ColorPDF.Immobiliare_Marrone : null,
FontColor = iColonna == 2 ? ColorPDF.Bianco : null,
FontBold = iColonna == 2,
HeaderPaddingLeft = iColonna == 2 ? -larghezzaSingoloCliente + (larghezzaSingoloCliente / 2) + 10 : 0
});
tabella.FooterColumns.Add(new ColumnPDF(campoStringa, larghezzaSingoloCliente, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo)
{
BackgroundColor = iColonna == 2 ? ColorPDF.Immobiliare_Marrone : null,
FontColor = iColonna == 2 ? ColorPDF.Bianco : null,
FontBold = iColonna == 2
});
// verifico se il cliente ha solo fabbricati in usufrutto
var clienteSoloUsufrutto = dati.Tables["Dati"]
.AsEnumerable()
.Select(r => r.Field(string.Format("Cliente{0}", iCliente)))
.Distinct().Sum().Equals(-100);
var totalePerCliente = clienteSoloUsufrutto ? 0 : Convert.ToDecimal(dati.Tables["Dati"].Compute(string.Format("{0}{1}{2}", "SUM(Cliente", iCliente, ")"), string.Format("Cliente{0} <> -100", iCliente))); // escludo i -100 dal computo del totale
tabella.FooterCells[iColonna, 0].Value = totalePerCliente.Equals(0) || totalePerCliente.Equals(-100) ? "-" : Helper.FormatCurrency(totalePerCliente.ToString()); //-100 = usufrutto
iColonna++;
}
tabella.Columns.Add(new ColumnPDF("totale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale, "TotaleStringa", "Totale")
{
HeaderVerticalAlignment = VerticalAlignmentType.Basso,
HeaderTextVerticalDirection = true,
FontColor = ColorPDF.Nero,
FontBold = true
});
tabella.FooterColumns.Add(new ColumnPDF("totale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale));
tabella.FooterCells[iColonna, 0].Value = Convert.ToDecimal(dati.Tables["Dati"].Compute("Sum(totale)", string.Empty)).ToString();
#endregion
#region immagini e border nelle colonne di tipo immagine
// Da specifica le immagini devo essere disegnate sempre nella colonna più vicina possibile al testo (in modo da ottenere allineamento a destra)
int indiceColonna = -1;
#region Immobili con anomalia catastale
// Immagine per immobile con anomalie catastali
foreach (var item in immobiliConAnomalieCatastali)
{
int indiceRiga = Convert.ToInt32(item["indice"]);
for (int i = numeroColonneImmagine - 1; i >= 0; i--)
{
if (string.IsNullOrEmpty(tabella.Cells[i, indiceRiga].Value))
{
indiceColonna = i;
break;
}
}
tabella.Row[indiceRiga].FontColor = new ColorPDF(205, 0, 6); // Rosso
tabella.Row[indiceRiga].ForceStyleFontColor = true;
tabella.Cells[indiceColonna, indiceRiga].Value = "warning.png";
}
#endregion
#region Immobili selezionati
// grassetto e immagine per immobili selezionati
foreach (var item in immobiliSelezionati)
{
int indiceColonnaDescrizione = Convert.ToInt32(tabella.Columns.FindIndex(o => o.Id.ToLower().Equals("descrizione")));
int indiceRiga = Convert.ToInt32(item["indice"]);
for (int i = numeroColonneImmagine - 1; i >= 0; i--)
{
if (string.IsNullOrEmpty(tabella.Cells[i, indiceRiga].Value))
{
indiceColonna = i;
break;
}
}
tabella.Row[indiceRiga].ShowBorderInColumnImage = false;
tabella.Cells[indiceColonnaDescrizione, indiceRiga].FontBold = false;
tabella.Cells[indiceColonna, indiceRiga].Value = "focus.png";
}
#endregion
#region Immobili non a catasto
// Immagine per immobile non a catasto
foreach (var item in immobiliNonACatasto)
{
int indiceRiga = Convert.ToInt32(item["indice"]);
for (int i = numeroColonneImmagine - 1; i >= 0; i--)
{
if (string.IsNullOrEmpty(tabella.Cells[i, indiceRiga].Value))
{
indiceColonna = i;
break;
}
}
tabella.Cells[indiceColonna, indiceRiga].Value = "info.png";
}
#endregion
#endregion
#region note della tabella
var campiAsterisco = new[] { "Cliente1Stringa", "Cliente2Stringa", "Cliente3Stringa", "Cliente4Stringa", "Cliente5Stringa" }; // campi del datasource su cui aggiungere gli asterischi.
var campiCondizione = new[] { "Cliente1StringaAsterischi", "Cliente2StringaAsterischi", "Cliente3StringaAsterischi", "Cliente4StringaAsterischi", "Cliente5StringaAsterischi" };
var condizioneNota1 = string.Empty;
var condizioneNota2 = string.Empty;
// var condizioneNota3 = string.Empty; NOTA 3 PIù DIRITTI DI PROPRIETà. INSERITO IN MAPPATURA E SELECT PRESENTE ANCHE NELLA SP IMMOBILIARE. PER IL MOMENTO COMMENTATO
const int condizioneNota1Valore = 1;
const int condizioneNota2Valore = 2;
// const int condizioneNota3Valore = 88;//più diritti
for (int j = 0; j < campiCondizione.Length; j++)
{
if (j != campiCondizione.Length - 1)
{
condizioneNota1 += string.Format("{0}={1} OR ", campiCondizione[j], condizioneNota1Valore);
condizioneNota2 += string.Format("{0}={1} OR ", campiCondizione[j], condizioneNota2Valore);
// condizioneNota3 += string.Format("{0}={1} OR ", campiCondizione[j], condizioneNota3Valore);
}
else
{
condizioneNota1 += string.Format("{0}={1}", campiCondizione[j], condizioneNota1Valore);
condizioneNota2 += string.Format("{0}={1}", campiCondizione[j], condizioneNota2Valore);
// condizioneNota3 += string.Format("{0}={1}", campiCondizione[j], condizioneNota3Valore);
}
}
// Determino quale nota aggiungere
var notaNudaProprieta = dati.Tables["Dati"].Select(condizioneNota1).Any();
var notaDirittoProprieta = dati.Tables["Dati"].Select(condizioneNota2).Any();
// var notaPiuDiritti = dati.Tables["Dati"].Select(condizioneNota3).Any();
// Nota nuda proprietà
if (notaNudaProprieta)
{
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo2"].ToString(), campiAsterisco, condizioneNota1, TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella)
{
FontSize = 7,
MappingType = TableNotePDF.TableNoteMappingType.Dinamico,
MappingKey = "Indice",
ConditionFields = campiCondizione,
ConditionValue = condizioneNota1Valore
});
}
// Nota diritto proprietà
if (notaDirittoProprieta)
{
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo3"].ToString(), campiAsterisco, condizioneNota2, TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella)
{
FontSize = 7,
MappingType = TableNotePDF.TableNoteMappingType.Dinamico,
MappingKey = "Indice",
ConditionFields = campiCondizione,
ConditionValue = condizioneNota2Valore
});
}
// Nota più diritti
/*if (notaPiuDiritti)
{
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo7"].ToString(), campiAsterisco, condizioneNota3, TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella)
{
FontSize = 7,
MappingType = TableNotePDF.TableNoteMappingType.Dinamico,
MappingKey = "Indice",
ConditionFields = campiCondizione,
ConditionValue = condizioneNota3Valore
});
}
*/
// Nota immagine 1
if (immobiliConAnomalieCatastali.Any())
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo4"].ToString()) { FontSize = 7, DeltaY = 3, Image = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.1F, "warning.png") });
// Nota immagine 2
if (immobiliSelezionati.Any())
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo5"].ToString()) { FontSize = 7, DeltaY = 3, Image = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.1F, "focus.png") });
// Nota immagine 3
if (immobiliNonACatasto.Any())
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo6"].ToString()) { FontSize = 7, DeltaY = 3, Image = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.1F, "info.png") });
#endregion
#endregion
#region Oggetti da ripetere al salto pagina della tabella
var listaOggettiDaRipetere = new List { new SpacePDF(40), icona, titolo, new SpacePDF(20) };
AddElement(new RepeaterPDF(listaOggettiDaRipetere));
#endregion
AddElement(new SpacePDF(40));
AddElement(icona);
AddElement(titolo);
AddElement(new SpacePDF(20));
AddElement(tabella);
}
///
/// Recupera i dati necessari alla Section restituendo un DataTable.
///
///
protected sealed override DataTable GetDataTable()
{
return null;
}
///
/// Recupera i dati necessari alla Section restituendo un DataSet.
///
///
protected sealed override DataSet GetDataSet()
{
#region Definizione dei parametri
var parametri = new List
{
new Parametro
{
Direction = ParameterDirection.Input,
DbType = DbType.Int64,
ParameterName = "ChiaveClientePB",
Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
}
};
#endregion
var dsOriginal = EnvironmentFacade.ReportEnvironment.FinalitaImmobiliare.ImmobiliareCEUnica ? DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_FinalitaImmobiliare_S4_DettaglioFabbricati", parametri)
: DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_FinalitaImmobiliare_S4_DettaglioFabbricati", parametri);
if (dsOriginal.Tables[0].Rows.Count == 0)
return null;
var dt1 = dsOriginal.Tables[0].Copy();
dt1.TableName = "Dati";
// Colonne aggiuntive per formattazione in stringa
dt1.Columns.Add("Indice", typeof(int));
dt1.Columns.Add("SuperficieStimataStringa", typeof(string));
dt1.Columns.Add("RenditaCatastaleStringa", typeof(string));
dt1.Columns.Add("QuotaProprietaStringa", typeof(string));
dt1.Columns.Add("Cliente1Stringa", typeof(string));
dt1.Columns.Add("Cliente2Stringa", typeof(string));
dt1.Columns.Add("Cliente3Stringa", typeof(string));
dt1.Columns.Add("Cliente4Stringa", typeof(string));
dt1.Columns.Add("Cliente5Stringa", typeof(string));
dt1.Columns.Add("TotaleStringa", typeof(string));
foreach (DataRow item in dt1.Rows)
{
item["SuperficieStimataStringa"] = Convert.ToInt32(item["SuperficieStimata"]) == 0 ? "n.d." : Helper.FormatInteger(item["SuperficieStimata"].ToString());
item["RenditaCatastaleStringa"] = item["RenditaCatastale"] == DBNull.Value ? "-" : Helper.FormatCurrency(item["RenditaCatastale"].ToString());
item["QuotaProprietaStringa"] = item["QuotaProprieta"] == DBNull.Value ? "-" : Helper.FormatPercentage(item["QuotaProprieta"].ToString(), 2);
for (int i = 1; i <= 5; i++)
{
var campo = string.Format("Cliente{0}", i);
var campoStringa = string.Format("Cliente{0}Stringa", i);
/*var campoStringaAs = string.Format("Cliente{0}StringaAsterischi", i);
if (dsOriginal.Tables[2].AsEnumerable()
.FirstOrDefault(l => l.Field("IdImmobileCatasto") == item["IdImmobileCatasto"].ToString()
&& l.Field("posizionecliente") == i) != null)
{
item[campo] = item[campoStringaAs] = 88;
}
*/
item[campoStringa] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item[campo]));
}
item["TotaleStringa"] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item["Totale"]));
}
// Clienti
var dt2 = dsOriginal.Tables[1];
dt2.TableName = "Clienti";
#region Ordinamento
//L’odinamento dei fabbricati elencati nella tabella è costruito con le seguenti regole:
// 1. Immobile di residenza (se indicato)
// 2. Pertinenza dell’immobile di residenza (se indicata)
// 3. Fabbricati del comune di residenza:
// Abitazioni (per valore decrescente);
// Box/posti auto (per valore decrescente);
// Altre categorie fabbricati (per valore decrescente).
// 4. Fabbricati di altri comuni (per valore aggregato complessivo decrescente):
// Abitazioni (per valore decrescente);
// Box/posti auto (per valore decrescente);
// Altre categorie fabbricati (per valore decrescente).
var codiceComuneResidenza = dt2.Rows[0]["codComuneResidenza"] != DBNull.Value ? dt2.Rows[0]["codComuneResidenza"].ToString() : string.Empty;
DataTable dtOrdinamentoStep1;
DataTable dtOrdinamentoStep2;
if (string.IsNullOrEmpty(codiceComuneResidenza))
{
//NUOVO ORDINAMENTO DA PASSARE IL 22-01-2016
dtOrdinamentoStep1 = dt1.AsEnumerable()
.OrderByDescending(o => o.Field("ordResidenza"))
.ThenByDescending(o => o.Field("ordPertinenza"))
.ThenByDescending(o => o.Field("ordindirizzo"))
.ThenByDescending(o => o.Field("controvaloreComune"))
.ThenBy(o => o.Field("indirizzo"))
.ThenByDescending(o => o.Field("ordFabbricati"))
.ThenByDescending(o => o.Field("Cliente1"))
.CopyToDataTable();
dtOrdinamentoStep2 = dtOrdinamentoStep1;
}
else
{
dtOrdinamentoStep1 = dt1.AsEnumerable().CopyToDataTable();
// prima recupero i CodComune = codiceComuneResidenza
// - verifico che siano presenti prima di ordinare
if (dtOrdinamentoStep1.AsEnumerable().Any(o => o.Field("CodComune").Equals(codiceComuneResidenza)))
{
dtOrdinamentoStep2 = dtOrdinamentoStep1.AsEnumerable().Where(o => o.Field("CodComune").Equals(codiceComuneResidenza))
.OrderByDescending(o => o.Field("ordResidenza"))
.ThenByDescending(o => o.Field("ordPertinenza"))
.ThenByDescending(o => o.Field("ordindirizzo"))
.ThenByDescending(o => o.Field("controvaloreComune"))
.ThenBy(o => o.Field("indirizzo"))
.ThenByDescending(o => o.Field("ordFabbricati"))
.ThenByDescending(o => o.Field("Cliente1"))
.CopyToDataTable();
}
else
dtOrdinamentoStep2 = dtOrdinamentoStep1;
// poi recupero tutti gli altri
// - verifico che siano presenti prima di ordinare
if (dtOrdinamentoStep1.AsEnumerable().Any(o => o.Field("CodComune") != codiceComuneResidenza))
{
dtOrdinamentoStep2.Merge(dtOrdinamentoStep1.AsEnumerable().Where(o => o.Field("CodComune") != codiceComuneResidenza)
//.OrderByDescending(o => o.Field("controvaloreComune"))
.OrderBy(o => o.Field("indirizzo"))
.ThenByDescending(o => o.Field("ordFabbricati"))
.ThenByDescending(o => o.Field("Cliente1"))
.CopyToDataTable());
}
}
// Riordino l'indice
var indice = 0;
foreach (DataRow item in dtOrdinamentoStep2.Rows)
{
item["Indice"] = indice;
indice++;
}
//Rinomino dt di output
dtOrdinamentoStep2.TableName = "Dati";
#endregion
// Dataset di ritorno
var dsResult = new DataSet();
dsResult.Tables.Add(dtOrdinamentoStep2.Copy());
dsResult.Tables.Add(dt2.Copy());
return dsResult;
}
}
}