357 lines
15 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
{
/// <summary>
/// Distribuzione geografica Terreni (id 36)
/// </summary>
public class S4 : Entity.Section
{
private readonly float _xLocalizzazioneGeografica;
private int maxRigheTabella = 10;
private bool addNewPage = false;
public S4(EnvironmentFacade environmentFacade, int idSection)
: base(environmentFacade, idSection)
{
try
{
_xLocalizzazioneGeografica = EnvironmentFacade.RendererFacade.XLeftLimit + 420;
Draw();
}
catch (Exception ex)
{
SectionLogger.Write("S4", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
}
}
/// <summary>
/// Scheda4. Patrimonio immobiliare Distribuzione geografica (terreni) (distribuzione dei terreni del cliente divisa per Comune e categoria catastale)
/// </summary>
protected override sealed void Draw()
{
var dati = GetDataSet();
if (dati.Tables[0].Rows.Count == 0) return;
var testi = GetText();
#region Recupero immagine della cartina
var codiciComune = (from codice in dati.Tables[0].AsEnumerable()
select codice.Field<string>("codComune")).Distinct();
var immagine = new Prometeia().GetMapComuniItaly(codiciComune.ToArray());
#endregion
bool cartinaPresente = immagine != null;
ImagePDF iconaTerreno;
FormattedTextAreaPDF titoloTerreno;
ImagePDF iconaLocalizzazione = null;
FormattedTextAreaPDF titoloLocalizzazione = null;
ImagePDF cartina = null;
#region Localizzazione geografica
AddElement(new ResetterYPDF());
AddElement(new SpacePDF(35));
if (cartinaPresente)
{
iconaLocalizzazione = new ImagePDF(_xLocalizzazioneGeografica, 0.20F, "LocGeografica.png") { AutoIncrementYWritable = false };
titoloLocalizzazione = new FormattedTextAreaPDF("Localizzazione geografica", _xLocalizzazioneGeografica + 30) { FontSize = 14, FontColor = ColorPDF.Immobiliare_Grigio_TitoloGrande };
cartina = new ImagePDF(_xLocalizzazioneGeografica + 30, 0.35F, immagine) { AutoIncrementYWritable = true };
AddElement(iconaLocalizzazione);
AddElement(titoloLocalizzazione);
AddElement(new SpacePDF(20));
AddElement(cartina);
}
else
{
AddElement(new SpacePDF(20));
// Al posto della cartina verrà disegnato il Grafico (definito sotto)
AddChart(dati.Tables[2], false);
}
#endregion
#region Terreni
AddElement(new ResetterYPDF());
AddElement(new SpacePDF(35));
iconaTerreno = new ImagePDF(EnvironmentFacade.RendererFacade.XLeftLimit, 0.20F, "Terreni.png") { AutoIncrementYWritable = false };
titoloTerreno = new FormattedTextAreaPDF("Terreni", 82) { FontSize = 14, FontColor = ColorPDF.Immobiliare_Grigio_TitoloGrande };
#region Tabella
var datiTabella = dati.Tables[1];
#region definizione delle note
var campiAsterisco = new[] { "comune_tipologia" }; // campi del datasource su cui aggiungere gli asterischi di rimando alla note.
var notaFabbricatoDiroccato = datiTabella.Select("codice_tipologia = '380'").Any();
var notaFabbricatoRurale = datiTabella.Select("codice_tipologia = '379'").Any();
#endregion
var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit + 30, datiTabella)
{
Style = Style.Immobiliare,
RowsPadding = 4
};
tabella.Columns.Add(new ColumnPDF("comune_tipologia", 150, HorizontalAlignmentType.Sinistra, false, false, 8, ColumnType.Testo, "comune_tipologia", "Comune / Tipologia"));
tabella.Columns.Add(new ColumnPDF("immobili", 40, HorizontalAlignmentType.Centrato, false, false, 8, ColumnType.Intero, "numeroimmobili", "Numero<BR>immobili"));
tabella.Columns.Add(new ColumnPDF("stimatoproprieta", 75, HorizontalAlignmentType.Destra, false, false, 8, ColumnType.Decimale, "valorestimatoproprieta", "Valore stimato<BR>pro quota (€)"));
tabella.Columns.Add(new ColumnPDF("stimatototale", 80, HorizontalAlignmentType.Destra, false, false, 8, ColumnType.Decimale, "valorestimatototale", "Valore stimato<BR>totale (€)"));
tabella.FooterColumns.Add(new ColumnPDF("comune_tipologia", 150, HorizontalAlignmentType.Sinistra, false, true, 8, ColumnType.Testo));
tabella.FooterColumns.Add(new ColumnPDF("immobili", 40, HorizontalAlignmentType.Centrato, false, true, 8, ColumnType.Intero));
tabella.FooterColumns.Add(new ColumnPDF("stimatoproprieta", 75, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
tabella.FooterColumns.Add(new ColumnPDF("stimatototale", 80, HorizontalAlignmentType.Destra, false, true, 8, ColumnType.Decimale));
tabella.FooterCells[0, 0].Value = "Totale";
tabella.FooterCells[1, 0].Value = Convert.ToDecimal(datiTabella.Compute("Sum(numeroimmobili)", string.Empty)).ToString();
tabella.FooterCells[2, 0].Value = Convert.ToDecimal(datiTabella.Compute("Sum(valorestimatoproprieta)", string.Empty)).ToString();
tabella.FooterCells[3, 0].Value = Convert.ToDecimal(datiTabella.Compute("Sum(valorestimatototale)", string.Empty)).ToString();
#region note
if (notaFabbricatoDiroccato)
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo1"].ToString(), campiAsterisco, "codice_tipologia='380'") { FontSize = 7, Width = tabella.Width });
if (notaFabbricatoRurale)
tabella.Notes.Add(new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, testi.Rows[0]["testo2"].ToString(), campiAsterisco, "codice_tipologia='379'") { FontSize = 7, Width = tabella.Width });
#endregion
//Righe separatorie.
for (int i = 0; i < datiTabella.Rows.Count; i++)
{
tabella.Row[i].Border = Convert.ToBoolean(datiTabella.Rows[i]["fontbold"]) && i > 0;
tabella.Row[i].BorderType = BorderRowType.Alto;
}
#endregion
AddElement(iconaTerreno);
AddElement(titoloTerreno);
addNewPage = datiTabella.Rows.Count > maxRigheTabella ? true:false;
AddElement(new SpacePDF(20));
if (!addNewPage)
AddElement(tabella);
else
{
AddElement(tabella);
AddElement(new PagePDF());
}
#endregion
#region Grafico
if (cartinaPresente)
{
var listaOggettiDaRipetere = new List<ObjectPDF>();
// Ripeto la parte destra (localizzazione geografica)
listaOggettiDaRipetere.Add(new ResetterYPDF());
listaOggettiDaRipetere.Add(new SpacePDF(35));
listaOggettiDaRipetere.Add(iconaLocalizzazione);
listaOggettiDaRipetere.Add(titoloLocalizzazione);
listaOggettiDaRipetere.Add(new SpacePDF(20));
listaOggettiDaRipetere.Add(cartina);
// Ripeto la parte sinistra (terreni)
listaOggettiDaRipetere.Add(new ResetterYPDF());
listaOggettiDaRipetere.Add(new SpacePDF(35));
listaOggettiDaRipetere.Add(iconaTerreno);
listaOggettiDaRipetere.Add(titoloTerreno);
//listaOggettiDaRipetere.Add(new SpacePDF(10));
AddElement(new RepeaterPDF(listaOggettiDaRipetere));
// Aggiungo il grafico
if (!addNewPage)
AddChart(dati.Tables[2], true);
else
AddChart(dati.Tables[2], true, 20);
}
#endregion
}
/// <summary>
/// Disegna il grafico. Se presente la cartina verra disegnato dopo la tabella altrimenti al posto della cartina.
/// </summary>
/// <param name="dati"></param>
/// <param name="cartinaPresente"></param>
protected virtual void AddChart(DataTable dati, bool cartinaPresente,int spazioInizale=40)
{
// Il grafico sarà disegnato al posto della cartina se questa non è presente
float xGrafico = EnvironmentFacade.RendererFacade.XLeftLimit + 100;
if (!cartinaPresente)
{
xGrafico = _xLocalizzazioneGeografica + 50;
AddElement(new ResetterYPDF());
AddElement(new SpacePDF(35));
}
var serieCollezione = new List<Serie>();
var datiGrafico = dati;
var graficoBarre = new StackedPDF(xGrafico, 1F)
{
HeightSingleBar = 25,
Width = 250,
ShowLegend = true,
BorderLineTop = true,
BorderLineX = xGrafico - 100,
BorderLineWidth = 360,
MarginAxisYFromTop = 0,
MarginAxisY = 7,
DinamicFloatXEtichettaLateraleBarra = false
};
serieCollezione.Add(new Serie { Name = "ProprietaCliente", Text = "Proprietà del cliente", Color = new ColorPDF(174, 150, 81) });
serieCollezione.Add(new Serie { Name = "ProprietaAltriIntestatari", Text = "Proprietà di altri intestatari", Color = new ColorPDF(206, 219, 209) });
foreach (DataRow item in datiGrafico.Rows)
{
serieCollezione[0].Points.Add(new Point
{
LabelAxisX = item["Comune"].ToString(),
Color = serieCollezione[0].Color,
Value = Convert.ToDouble(item["ValoreStimatoProprieta"]),
ShowLabelAxisX = true,
ShowLabelAxisY = false
});
serieCollezione[1].Points.Add(new Point
{
LabelAxisY = Helper.FormatCurrency(item["ValoreStimatoTotale"].ToString()),
Color = serieCollezione[1].Color,
Value = Convert.ToDouble(item["ValoreStimatoAltri"]),
ShowLabelAxisY = true,
ShowLabelAxisX = false
});
}
graficoBarre.SeriesCollection = serieCollezione;
// if (datiGrafico.Rows.Count > 7)
// AddElement(new SpacePDF(45));
// //AddElement(new PagePDF());
// else
// AddElement(new SpacePDF(20));
AddElement(new SpacePDF(spazioInizale));
AddElement(graficoBarre);
}
/// <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 override DataSet GetDataSet()
{
var ds = new DataSet();
#region Definizione dei parametri
var parametri = new List<Parametro>
{
new Parametro
{
Direction = ParameterDirection.Input,
DbType = DbType.Int64,
ParameterName = "ChiaveClientePB",
Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
}
};
#endregion
var dt = EnvironmentFacade.ReportEnvironment.Immobiliare.ImmobiliareCEUnica ? DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_Immobiliare_S4_DistribuzioneGeograficaTerreni", parametri)
: DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerConsulenzaEvoluta, "REP_Immobiliare_S4_DistribuzioneGeograficaTerreni", parametri);
#region Riaggregazioni
var dt1 = new DataTable();
dt1.Columns.Add("Comune_Tipologia", typeof(string));
dt1.Columns.Add("NumeroImmobili", typeof(decimal));
dt1.Columns.Add("ValoreStimatoProprieta", typeof(decimal));
dt1.Columns.Add("ValoreStimatoTotale", typeof(decimal));
dt1.Columns.Add("FontBold", typeof(bool));
dt1.Columns.Add("ReplaceIfZero", typeof(string));
dt1.Columns.Add("CanLastRow", typeof(bool));
dt1.Columns.Add("Codice_Tipologia", typeof(string));
var dt2 = new DataTable();
dt2.Columns.Add("Comune", typeof(string));
dt2.Columns.Add("ValoreStimatoProprieta", typeof(decimal));
dt2.Columns.Add("ValoreStimatoAltri", typeof(decimal));
dt2.Columns.Add("ValoreStimatoTotale", typeof(decimal));
// Distinct sui comuni
var distinctComuni = new DataView(dt).ToTable(true, "Comune");
foreach (DataRow comune in distinctComuni.Rows)
{
IEnumerable<DataRow> query = from tipologie in dt.AsEnumerable()
where tipologie.Field<string>("Comune").Equals(comune["Comune"].ToString())
select tipologie;
var intestazione = true;
foreach (var item in query)
{
if (intestazione)
{
dt1.Rows.Add(string.Format("{0} ({1})", item["comune"], item["provincia"]), 0, 0, 0, true, " ", false, string.Empty); // Intestazione
dt2.Rows.Add(string.Format("{0} ({1})", item["comune"], item["provincia"]),
Convert.ToDecimal(query.Sum(o => o.Field<decimal>("valorestimatoproprieta"))),
Convert.ToDecimal(query.Sum(o => o.Field<decimal>("valorestimatototale")) - query.Sum(o => o.Field<decimal>("valorestimatoproprieta"))),
Convert.ToDecimal(query.Sum(o => o.Field<decimal>("valorestimatototale"))));
intestazione = false;
}
dt1.Rows.Add(item["tipologia"], Convert.ToDecimal(item["numeroimmobili"]), Convert.ToDecimal(item["valorestimatoproprieta"]), Convert.ToDecimal(item["valorestimatototale"]), false, "-", true, item["codicetipologia"]); // Dettaglio
}
}
#endregion
ds.Tables.Add(dt.Copy());
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
return ds;
}
}
}