439 lines
21 KiB
C#
439 lines
21 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using Consulenza.ExternalServices;
|
||
using Consulenza.ReportWriter.Business;
|
||
using Consulenza.ReportWriter.Business.OBJ_PDF;
|
||
using System.Data;
|
||
using Consulenza.ReportWriter.Business.CHART_PDF;
|
||
using Consulenza.ReportCommon;
|
||
using Consulenza.ReportWriter.Business.Entity;
|
||
|
||
namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.Diagnosi.Nucleo
|
||
{
|
||
public class S5 : Entity.Section
|
||
{
|
||
public bool bPrintAltri = false;
|
||
|
||
public S5(EnvironmentFacade environmentFacade, int idSection)
|
||
: base(environmentFacade, idSection)
|
||
{
|
||
try
|
||
{
|
||
Draw();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SectionLogger.Write("S5", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Scheda5. Dettaglio fabbricati (elenco dei fabbricati e dei principali dati catastali, quote e valore stimato del cliente e dei cointestatari)
|
||
/// </summary>
|
||
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<bool>("AnomaliaCatastale"));
|
||
|
||
// Immobili selezionati dall'utente
|
||
if (EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.IdImmobileCatasto == null)
|
||
EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.IdImmobileCatasto = new List<string>();
|
||
|
||
var immobiliSelezionati = dati.Tables["Dati"].AsEnumerable().Where(r => EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.IdImmobileCatasto.Contains(r.Field<string>("IdImmobileCatasto")));
|
||
|
||
// Immobili non a catasto
|
||
var immobiliNonACatasto = dati.Tables["Dati"].AsEnumerable().Where(r => r.Field<bool>("Catasto") == false);
|
||
|
||
#region Recupero il numero massimo di colonne di tipo immagine da aggiungere
|
||
|
||
var numeroColonneImmagine = 0;
|
||
|
||
var listaCompletaIndici = new List<Int32>();
|
||
listaCompletaIndici.AddRange(immobiliConAnomalieCatastali.Select(o => o.Field<Int32>("Indice")));
|
||
if (immobiliSelezionati != null) listaCompletaIndici.AddRange(immobiliSelezionati.Select(o => o.Field<Int32>("Indice")));
|
||
listaCompletaIndici.AddRange(immobiliNonACatasto.Select(o => o.Field<Int32>("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 = 130,
|
||
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 = 50;
|
||
const int larghezzaParziale = 70;
|
||
const int larghezzaTotale = 70;
|
||
|
||
//La colonna descrizione è l'unica variabile.
|
||
var larghezzaDescrizione = larghezzaTabella - larghezzaParziale - larghezzaImmagine - larghezzaCategoriaCatastale - larghezzaSuperficieStimata - larghezzaRenditaCatastale - 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.Centrato, 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";
|
||
|
||
var iColonna = 1;
|
||
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 = ColorPDF.Immobiliare_Marrone,
|
||
HeaderFontColor = ColorPDF.Bianco,
|
||
HeaderFontBold = true,
|
||
BackgroundColor = ColorPDF.Immobiliare_Marrone,
|
||
FontColor = ColorPDF.Bianco,
|
||
FontBold = true,
|
||
HeaderPaddingLeft = -5// -larghezzaSingoloCliente + (larghezzaSingoloCliente/2) + 10
|
||
});
|
||
|
||
tabella.FooterColumns.Add(new ColumnPDF(campoStringa, larghezzaSingoloCliente, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Testo)
|
||
{
|
||
BackgroundColor = ColorPDF.Immobiliare_Marrone,
|
||
FontColor = ColorPDF.Bianco,
|
||
FontBold = true
|
||
});
|
||
|
||
var totalePerCliente = Convert.ToDecimal(dati.Tables["Dati"].Compute(string.Format("{0}{1}{2}", "SUM(Cliente", iCliente, ")"), string.Format("Cliente{0} <> -100", iCliente)));
|
||
tabella.FooterCells[iColonna, 0].Value = totalePerCliente.Equals(0) ? "-" : Helper.FormatCurrency(totalePerCliente.ToString());
|
||
|
||
iColonna++;
|
||
}
|
||
|
||
tabella.Columns.Add(new ColumnPDF("Parziale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale, "ParzialeStringa", "Altri")
|
||
{
|
||
HeaderVerticalAlignment = VerticalAlignmentType.Basso,
|
||
HeaderTextVerticalDirection = true,
|
||
FontColor = ColorPDF.Nero,
|
||
FontBold = true
|
||
});
|
||
tabella.FooterColumns.Add(new ColumnPDF("Parziale", larghezzaTotale, HorizontalAlignmentType.Destra, false, true, 7, ColumnType.Decimale));
|
||
tabella.FooterCells[iColonna, 0].Value = Convert.ToDecimal(dati.Tables["Dati"].Compute("Sum(parziale)", string.Empty)).ToString();
|
||
|
||
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 + 1, 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
|
||
|
||
// 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<ObjectPDF> { 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);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Recupera i dati necessari alla Section restituendo un DataTable.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected sealed override DataTable GetDataTable()
|
||
{
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Recupera i dati necessari alla Section restituendo un DataSet.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected sealed override DataSet GetDataSet()
|
||
{
|
||
|
||
#region Definizione dei parametri
|
||
|
||
var parametri = new List<Parametro>
|
||
{
|
||
new Parametro
|
||
{
|
||
Direction = ParameterDirection.Input,
|
||
DbType = DbType.Int64,
|
||
ParameterName = "ChiaveNucleo",
|
||
Value = EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.ChiaveNucleo
|
||
}
|
||
};
|
||
|
||
#endregion
|
||
|
||
var dsOriginal = EnvironmentFacade.ReportEnvironment.NucleoImmobiliare.ImmobiliareCEUnica ? DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Nucleo_Immobiliare_S5_DettaglioFabbricati", parametri)
|
||
: DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_Nucleo_Immobiliare_S5_DettaglioFabbricati", parametri);
|
||
if (dsOriginal.Tables[0].Rows.Count == 0)
|
||
return null;
|
||
|
||
decimal nTotaleAltri = 0;
|
||
for (int k = 0; k < dsOriginal.Tables[0].Rows.Count; k++)
|
||
nTotaleAltri = nTotaleAltri + Convert.ToDecimal(dsOriginal.Tables[0].Rows[k]["parziale"]);
|
||
|
||
if (nTotaleAltri > 0)
|
||
bPrintAltri = true;
|
||
|
||
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("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("ParzialeStringa", 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());
|
||
|
||
for (int i = 1; i <= 5; i++)
|
||
{
|
||
var campo = string.Format("Cliente{0}", i);
|
||
var campoStringa = string.Format("Cliente{0}Stringa", i);
|
||
item[campoStringa] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item[campo]));
|
||
}
|
||
item["ParzialeStringa"] = Helper.Decodifiche.DecodificaValoreStimatoProQuota(Convert.ToDecimal(item["Parziale"]));
|
||
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))
|
||
{
|
||
dtOrdinamentoStep1 = dt1.AsEnumerable()
|
||
.OrderByDescending(o => o.Field<int>("ordResidenza"))
|
||
.ThenByDescending(o => o.Field<int>("ordPertinenza"))
|
||
.ThenByDescending(o => o.Field<decimal>("controvaloreComune"))
|
||
.ThenByDescending(o => o.Field<int>("ordFabbricati"))
|
||
|
||
.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<string>("CodComune").Equals(codiceComuneResidenza)))
|
||
{
|
||
dtOrdinamentoStep2 = dtOrdinamentoStep1.AsEnumerable().Where(o => o.Field<string>("CodComune").Equals(codiceComuneResidenza))
|
||
.OrderByDescending(o => o.Field<int>("ordResidenza"))
|
||
.ThenByDescending(o => o.Field<int>("ordPertinenza"))
|
||
.ThenByDescending(o => o.Field<int>("ordFabbricati"))
|
||
|
||
.CopyToDataTable();
|
||
}
|
||
else
|
||
dtOrdinamentoStep2 = dtOrdinamentoStep1;
|
||
|
||
// poi recupero tutti gli altri
|
||
// - verifico che siano presenti prima di ordinare
|
||
if (dtOrdinamentoStep1.AsEnumerable().Any(o => o.Field<string>("CodComune") != codiceComuneResidenza))
|
||
{
|
||
dtOrdinamentoStep2.Merge(dtOrdinamentoStep1.AsEnumerable().Where(o => o.Field<string>("CodComune") != codiceComuneResidenza)
|
||
.OrderByDescending(o => o.Field<decimal>("controvaloreComune"))
|
||
.ThenByDescending(o => o.Field<int>("ordFabbricati"))
|
||
|
||
.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;
|
||
}
|
||
}
|
||
}
|