439 lines
21 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
//Lodinamento dei fabbricati elencati nella tabella è costruito con le seguenti regole:
// 1. Immobile di residenza (se indicato)
// 2. Pertinenza dellimmobile 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;
}
}
}