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;
using System.Text;
using System.Drawing;
using Dundas.Charting.WebControl;
using System.Globalization;
using System.IO;
using System.Drawing.Imaging;
namespace Consulenza.ReportWriter.Manager.Section.Immobiliare.Monitoraggio
{
///
/// Scheda 14
///
public class S14 : Entity.Section
{
public bool bFlag = false;
public S14(EnvironmentFacade environmentFacade, int idSection)
: base(environmentFacade, idSection)
{
try
{
if (idSection == 999)
bFlag = true;
else
bFlag = false;
Draw();
}
catch (Exception ex)
{
SectionLogger.Write("S14", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
}
}
///
/// Scheda2. Patrimonio immobiliare –Sintesi (distribuzione del patrimonio complessivo del cliente diviso per tipologia e cointestatari)
///
protected override void Draw()
{
var data = GetDataSet();
var image = getImageFromStored();
AddElement(new FormattedTextAreaPDF("Di seguito si rappresenta la distribuzione geografica degli immobili nei comuni di appartenenza per numerosità e valore stimato.", 30)
{
AutoIncrementYWritable = false,
Width = 800,
FontSize = 9.96f,
FontColor = new ColorPDF(91, 88, 79),
Y = 60
});
Single nScale = 0;
if (bFlag == true)
{
//nScale = 0.245f;
nScale = 0.37f;
}
else
{
nScale = 0.37f;
}
AddElement(new ImagePDF(20, nScale, image)//new Prometeia().GetImageMonitoraggioFromValidator(EnvironmentFacade.ReportEnvironment.Cliente.CodiceFiscale))
{
AutoIncrementYWritable = false,
Y = 87
});
AddElement(new FormattedTextAreaPDF("Numerosità immobili – distribuzione per Comune", 350)
{
AutoIncrementYWritable = false,
Width = 800,
FontSize = 9,
FontColor = new ColorPDF(91, 88, 79),
Y = 85,
FontBold = true
});
AddElement(new FormattedTextAreaPDF("Valore stimato totale (€) – distribuzione per Comune", 350)
{
AutoIncrementYWritable = false,
Width = 800,
FontSize = 9,
FontColor = new ColorPDF(91, 88, 79),
Y = 260,
FontBold = true
});
var chart1Records = GetChartData(data, 4);
DrawChart1(chart1Records);
var chart2Records = GetChartData(data, 1);
DrawChart2(chart2Records);
AddElement(new ResetterYPDF());
DrawLegend(350, 437);
AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
AddElement(new FormattedTextAreaPDF("Di seguito si rappresenta il valore stimato degli immobili distribuiti per tipologia comune e posizione urbana.", 30)
{
AutoIncrementYWritable = false,
Width = 800,
FontSize = 9.96f,
FontColor = new ColorPDF(91, 88, 79),
Y = 60
});
AddElement(new ImagePDF(20, nScale, image)//new Prometeia().GetImageMonitoraggioFromValidator(EnvironmentFacade.ReportEnvironment.Cliente.CodiceFiscale))
{
AutoIncrementYWritable = false,
Y = 87
});
AddElement(new FormattedTextAreaPDF("Valore stimato totale (€) – distribuzione per tipologia Comune", 350)
{
AutoIncrementYWritable = false,
Width = 800,
FontSize = 9,
FontColor = new ColorPDF(91, 88, 79),
Y = 85,
FontBold = true
});
AddElement(new FormattedTextAreaPDF("Valore stimato totale (€) – distribuzione per posizione urbana", 350)
{
AutoIncrementYWritable = false,
Width = 800,
FontSize = 9,
FontColor = new ColorPDF(91, 88, 79),
Y = 260,
FontBold = true
});
var chart3Records = GetChartData(data, 3);
DrawChart3(chart3Records);
var chart4Records = GetChartData(data, 2);
DrawChart4(chart4Records);
DrawLegend(350, 444);
}
///
/// Recupera i dati necessari alla Section restituendo un DataTable.
///
///
protected override DataTable GetDataTable()
{
return null;
}
///
/// Recupera i dati necessari alla Section restituendo un DataSet.
///
///
protected override DataSet GetDataSet()
{
var parametri = new List
{
new Parametro
{
Direction = ParameterDirection.Input,
DbType = DbType.Int32,
ParameterName = "chiaveClientePB",
Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
}
};
//return DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_ImmobiliareMonitoraggio_S14_MapDistrGeografica_NEW", parametri);
return DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_ImmobiliareMonitoraggio_S14_MapDistrGeografica", parametri);
}
private List GetChartData(DataSet dataSet, int chiaveTipoChart)
{
List results = new List();
foreach (DataRow row in dataSet.Tables[0].Rows)
{
if ((int)row["chiaveTipoChart"] == chiaveTipoChart)
{
ChartRecord chartRecord = new ChartRecord()
{
ChiaveTipoChart = (int)row["chiaveTipoChart"],
KeyMappature = (string)row["keyMappatura"],
ValUsoAbitativo = (decimal)(row["valUsoAbitativo"] != DBNull.Value ? (decimal)row["valUsoAbitativo"] : 0),
ValUsoStrumentale = (decimal)(row["valUsoStrumentale"] != DBNull.Value ? (decimal)row["valUsoStrumentale"] : 0),
ValUsoInvestimento = (decimal)(row["valUsoInvestimento"] != DBNull.Value ? (decimal)row["valUsoInvestimento"] : 0),
ValUsoNS = (decimal)(row["valUsoNS"] != DBNull.Value ? (decimal)row["valUsoNS"] : 0),
ValTotaleTipologia = (decimal)(row["valTotaleTipologia"] != DBNull.Value ? (decimal)row["valTotaleTipologia"] : 0),
NumImmobili = (decimal)row["numImmobili"],
OrderInGraph = (string)row["OrderInGraph"]
};
chartRecord.UsoTipologia = chartRecord.ValUsoAbitativo > 0 ? "Immobili d'uso abitativo" :
chartRecord.ValUsoStrumentale > 0 ? "Immobili strumentali" :
chartRecord.ValUsoInvestimento > 0 ? "Immobili d'investimento" :
chartRecord.ValUsoNS > 0 ? "Finalità non specificata" : "Finalità non specificata";
if (!string.IsNullOrEmpty(chartRecord.UsoTipologia))
{
results.Add(chartRecord);
}
}
}
return results;
}
private Color[] ChartsColors = new Color[]
{
Color.FromArgb(206, 219, 209),
Color.FromArgb(167, 192, 168),
Color.FromArgb(114, 152, 110),
Color.FromArgb(245, 245, 220)
};
private void DrawChart1(List chartRecords)
{
List chartRec;
chartRec = chartRecords.OrderByDescending(x => x.NumImmobili).ToList();
//chartRecords = chartRecords.OrderByDescending(x => x.NumImmobili).ToList();
chartRecords = chartRecords.OrderBy(x => x.OrderInGraph).ThenByDescending(x => x.NumImmobili).ToList();
if (chartRecords.Count > 4)
{
decimal valUsoAbitativo = 0;
decimal valUsoStrumentale = 0;
decimal valUsoInvestimento = 0;
decimal valUsoNS = 0;
for (int i = 4; i < chartRecords.Count; i++)
{
valUsoAbitativo += chartRecords[i].ValUsoAbitativo;
valUsoStrumentale += chartRecords[i].ValUsoStrumentale;
valUsoInvestimento += chartRecords[i].ValUsoInvestimento;
valUsoNS += chartRecords[i].ValUsoNS;
}
// Commento ES per problemi con Categoria Altro 10/08/2017
//chartRecords.RemoveRange(4, chartRecords.Count - 4);
//chartRecords.Add(new ChartRecord()
//{
// ValUsoAbitativo = valUsoAbitativo,
// ValUsoInvestimento = valUsoInvestimento,
// ValUsoNS = valUsoNS,
// ValUsoStrumentale = valUsoStrumentale,
// KeyMappature = "Altro",
// NumImmobili = valUsoAbitativo + valUsoInvestimento + valUsoNS + valUsoStrumentale
//});
}
//AddElement(new SpacePDF(50));
//int nLeftStart;
//if (chartRec[0].NumImmobili > 9)
// nLeftStart = 378;
//else
// nLeftStart = 386;
int nLeftStart;
int nWidth = 339;
switch ((int)chartRec[0].NumImmobili)
{
case 1:
case 2:
nLeftStart = 368;
nWidth = 357;
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
nLeftStart = 386;
break;
default:
nLeftStart = 378;
nWidth = 347;
break;
}
var customChart = new CustomChartPDF()
{
X = nLeftStart,
Y = 115
};
var baseChart = customChart.ChartBase;
baseChart.Width = new System.Web.UI.WebControls.Unit(nWidth);
baseChart.Height = new System.Web.UI.WebControls.Unit(136);
baseChart.ChartAreas.Add("Default");
baseChart.ChartAreas["Default"].Area3DStyle.Enable3D = false;
baseChart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisX.LabelsAutoFit = true;
baseChart.ChartAreas[0].AxisX.LabelsAutoFitStyle = LabelsAutoFitStyle.WordWrap;
baseChart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Verdana", 6);
baseChart.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Verdana", 5);
baseChart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
baseChart.ChartAreas[0].AxisX.MinorTickMark.Enabled = false;
baseChart.Legends[0].Docking = LegendDocking.Bottom;
baseChart.Legends[0].Alignment = StringAlignment.Center;
baseChart.Legends[0].Font = new Font("Verdana", 6);
baseChart.Legends[0].Enabled = false;
var valUsoAbitativoRecords =
chartRecords.Where(x => x.ValUsoAbitativo > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'uso abitativo",
ValUsoTotal = x.ValUsoAbitativo
}).ToList();
var ValUsoStrumentaleRecords =
chartRecords.Where(x => x.ValUsoStrumentale > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili strumentali",
ValUsoTotal = x.ValUsoStrumentale
}).ToList();
var ValUsoInvestimentoRecords =
chartRecords.Where(x => x.ValUsoInvestimento > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'investimento",
ValUsoTotal = x.ValUsoInvestimento
}).ToList();
var ValUsoNSRecords =
chartRecords.Where(x => x.ValUsoNS > 0 || (x.ValUsoAbitativo == 0 && x.ValUsoStrumentale == 0 && x.ValUsoInvestimento == 0)).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Finalità non specificata",
ValUsoTotal = x.ValUsoNS
}).ToList();
var tableDataGroups = valUsoAbitativoRecords;
tableDataGroups.AddRange(ValUsoStrumentaleRecords);
tableDataGroups.AddRange(ValUsoInvestimentoRecords);
tableDataGroups.AddRange(ValUsoNSRecords);
var keyMappaturaGroupNames = chartRecords.Select(x => x.KeyMappature).ToList();
Dictionary keyMappaturaGroups = new Dictionary();
int xVal = 1;
foreach (var keyMap in keyMappaturaGroupNames)
{
keyMappaturaGroups.Add(keyMap, xVal);
baseChart.ChartAreas[0].AxisX.CustomLabels.Add((double)xVal - 0.5d, (double)xVal + 0.5d, keyMap);
xVal++;
}
// Remmato da ES per problemi Ordinamento
//Dictionary series = new Dictionary();
//int colorIndex = 0;
//foreach (var usoTipologia in tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList())
//{
// var serie = baseChart.Series.Add(usoTipologia);
// serie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
// serie["StackedGroupName"] = "AllSeries";
// serie["PixelPointWidth"] = "80";
// serie.Color = getColorPDF(usoTipologia);//ChartsColors[colorIndex];
// series.Add(usoTipologia, serie);
// colorIndex++;
//}
// Fine
// Inserito Nuovo per giusto ordinamento 29/12/2917
Dictionary series = new Dictionary();
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary serieItemsOrder = new Dictionary()
{
//{"Immobili d'uso abitativo", 1 },
//{"Immobili strumentali",2 },
//{"Immobili d'investimento", 3 },
//{"Finalità non specificata", 4 }
{"Immobili d'uso abitativo", 2 },
{"Immobili strumentali",3 },
{"Immobili d'investimento", 4 },
{"Finalità non specificata", 1 }
};
serieNames = serieNames.OrderBy(x => serieItemsOrder[x]).ToList();
foreach (var usoTipologia in serieNames)
{
var serie = baseChart.Series.Add(usoTipologia);
serie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
serie["StackedGroupName"] = "AllSeries";
serie["PixelPointWidth"] = "80";
serie.Color = getColorPDF(usoTipologia);
series.Add(usoTipologia, serie);
colorIndex++;
}
// Fine Nuovo
var topLabelSerie = baseChart.Series.Add("topLabelSerie");
topLabelSerie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
topLabelSerie["StackedGroupName"] = "AllSeries";
topLabelSerie["PixelPointWidth"] = "80";
topLabelSerie.Color = Color.Transparent;
topLabelSerie.Font = new Font("Verdana", 6);
topLabelSerie.ShowInLegend = false;
series.Add("topLabelSerie", topLabelSerie);
#region removing blank gaps ...
//https://social.msdn.microsoft.com/Forums/en-US/24b22f09-8b23-435c-a6ed-08fc58270239/vertical-gaps-in-stacked-bar-charts?forum=MSWinWebChart
var data = tableDataGroups.ToList();
foreach (var keyMappaturaGroup in keyMappaturaGroups)
{
foreach (var serie in series)
{
if (tableDataGroups.Where(x => x.KeyMappature == keyMappaturaGroup.Key &&
x.UsoTipologia == serie.Key).FirstOrDefault() == null)
{
data.Add(new { KeyMappature = keyMappaturaGroup.Key, UsoTipologia = serie.Key, ValUsoTotal = 0m });
}
}
}
data = data.OrderBy(x => x.UsoTipologia).OrderBy(x => x.KeyMappature).ToList();
#endregion
foreach (var record in data)
{
var addedPoint = series[record.UsoTipologia].Points.AddXY(keyMappaturaGroups[record.KeyMappature], record.ValUsoTotal);
}
baseChart.ChartAreas[0].ReCalc();
baseChart.ChartAreas[0].AxisX.Minimum = 0.5d;
baseChart.ChartAreas[0].AxisX.Maximum = xVal - 0.5d;
#region bars top labels
foreach (var serie in series)
{
if (serie.Value.Name == "topLabelSerie")
{
foreach (DataPoint point in serie.Value.Points)
{
point.SetValueY(baseChart.ChartAreas[0].AxisY.Maximum * 0.15);
string keyMappatura = keyMappaturaGroups.Where(x => x.Value == point.XValue).FirstOrDefault().Key;
string label = tableDataGroups.Where(x => x.KeyMappature == keyMappatura).Sum(x => x.ValUsoTotal).ToString("##,#", new CultureInfo("es-ES"));
if (string.IsNullOrEmpty(label))
{
label = "-";
}
point.Label = label;
}
}
}
#endregion
AddElement(customChart);
}
private void DrawChart2(List chartRecords)
{
//chartRecords = chartRecords.OrderByDescending(x => x.ValTotaleTipologia).ToList();
chartRecords = chartRecords.OrderBy(x => x.OrderInGraph).ThenByDescending(x => x.ValTotaleTipologia).ToList();
if (chartRecords.Count > 4)
{
decimal valUsoAbitativo = 0;
decimal valUsoStrumentale = 0;
decimal valUsoInvestimento = 0;
decimal valUsoNS = 0;
for (int i = 4; i < chartRecords.Count; i++)
{
valUsoAbitativo += chartRecords[i].ValUsoAbitativo;
valUsoStrumentale += chartRecords[i].ValUsoStrumentale;
valUsoInvestimento += chartRecords[i].ValUsoInvestimento;
valUsoNS += chartRecords[i].ValUsoNS;
}
// Commento ES per problemi con Categoria Altro 10/08/2017
//chartRecords.RemoveRange(4, chartRecords.Count - 4);
//chartRecords.Add(new ChartRecord()
//{
// ValUsoAbitativo = valUsoAbitativo,
// ValUsoInvestimento = valUsoInvestimento,
// ValUsoNS = valUsoNS,
// ValUsoStrumentale = valUsoStrumentale,
// KeyMappature = "Altro",
// ValTotaleTipologia = valUsoAbitativo + valUsoInvestimento + valUsoNS + valUsoStrumentale
//});
}
//AddElement(new SpacePDF(195));
int nLeftStart;
int nWidth;
if ((int)chartRecords[0].ValTotaleTipologia < 999999)
{
nLeftStart = 335;
nWidth = 390;
}
else
{
nLeftStart = 335;
nWidth = 385;
}
var customChart = new CustomChartPDF()
{
X = nLeftStart,
Y = 280
};
var baseChart = customChart.ChartBase;
baseChart.Width = new System.Web.UI.WebControls.Unit(nWidth);
baseChart.Height = new System.Web.UI.WebControls.Unit(145);
baseChart.ChartAreas.Add("Default");
baseChart.ChartAreas["Default"].Area3DStyle.Enable3D = false;
baseChart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisX.LabelsAutoFit = true;
baseChart.ChartAreas[0].AxisX.LabelsAutoFitStyle = LabelsAutoFitStyle.WordWrap;
baseChart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Verdana", 6);
baseChart.ChartAreas[0].AxisY.LabelStyle.Format = "€ {#,0}";
baseChart.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Verdana", 5);
baseChart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
baseChart.ChartAreas[0].AxisX.MinorTickMark.Enabled = false;
baseChart.Legends[0].Docking = LegendDocking.Bottom;
baseChart.Legends[0].Alignment = StringAlignment.Center;
baseChart.Legends[0].Font = new Font("Verdana", 6);
baseChart.Legends[0].TextWrapThreshold = 8;
baseChart.Legends[0].Enabled = false;
baseChart.CustomizeLegend += BaseChart_CustomizeLegend;
var valUsoAbitativoRecords =
chartRecords.Where(x => x.ValUsoAbitativo > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'uso abitativo",
ValUsoTotal = x.ValUsoAbitativo
}).ToList();
var ValUsoStrumentaleRecords =
chartRecords.Where(x => x.ValUsoStrumentale > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili strumentali",
ValUsoTotal = x.ValUsoStrumentale
}).ToList();
var ValUsoInvestimentoRecords =
chartRecords.Where(x => x.ValUsoInvestimento > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'investimento",
ValUsoTotal = x.ValUsoInvestimento
}).ToList();
var ValUsoNSRecords =
chartRecords.Where(x => x.ValUsoNS > 0 || (x.ValUsoAbitativo == 0 && x.ValUsoStrumentale == 0 && x.ValUsoInvestimento == 0)).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Finalità non specificata",
ValUsoTotal = x.ValUsoNS
}).ToList();
var tableDataGroups = valUsoAbitativoRecords;
tableDataGroups.AddRange(ValUsoStrumentaleRecords);
tableDataGroups.AddRange(ValUsoInvestimentoRecords);
tableDataGroups.AddRange(ValUsoNSRecords);
var keyMappaturaGroupNames = chartRecords.Select(x => x.KeyMappature).Distinct().ToList();
Dictionary keyMappaturaGroups = new Dictionary();
int xVal = 1;
foreach (var keyMap in keyMappaturaGroupNames)
{
keyMappaturaGroups.Add(keyMap, xVal);
baseChart.ChartAreas[0].AxisX.CustomLabels.Add((double)xVal - 0.5d, (double)xVal + 0.5d, keyMap);
xVal++;
}
Dictionary series = new Dictionary();
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary serieItemsOrder = new Dictionary()
{
//{"Immobili d'uso abitativo", 1 },
//{"Immobili strumentali",2 },
//{"Immobili d'investimento", 3 },
//{"Finalità non specificata", 4 }
{"Immobili d'uso abitativo", 2 },
{"Immobili strumentali",3 },
{"Immobili d'investimento", 4 },
{"Finalità non specificata", 1 }
};
serieNames = serieNames.OrderBy(x => serieItemsOrder[x]).ToList();
foreach (var usoTipologia in serieNames)
{
var serie = baseChart.Series.Add(usoTipologia);
serie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
serie["StackedGroupName"] = "AllSeries";
serie["PixelPointWidth"] = "80";
serie.Color = getColorPDF(usoTipologia);
series.Add(usoTipologia, serie);
colorIndex++;
}
var topLabelSerie = baseChart.Series.Add("topLabelSerie");
topLabelSerie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
topLabelSerie["StackedGroupName"] = "AllSeries";
topLabelSerie["PixelPointWidth"] = "80";
topLabelSerie.Color = Color.Transparent;
topLabelSerie.Font = new Font("Verdana", 6);
topLabelSerie.ShowInLegend = false;
series.Add("topLabelSerie", topLabelSerie);
#region removing blank gaps ...
//https://social.msdn.microsoft.com/Forums/en-US/24b22f09-8b23-435c-a6ed-08fc58270239/vertical-gaps-in-stacked-bar-charts?forum=MSWinWebChart
var data = tableDataGroups.ToList();
foreach (var keyMappaturaGroup in keyMappaturaGroups)
{
foreach (var serie in series)
{
if (tableDataGroups.Where(x => x.KeyMappature == keyMappaturaGroup.Key &&
x.UsoTipologia == serie.Key).FirstOrDefault() == null)
{
data.Add(new { KeyMappature = keyMappaturaGroup.Key, UsoTipologia = serie.Key, ValUsoTotal = 0m });
}
}
}
data = data.OrderBy(x => x.UsoTipologia).OrderBy(x => x.KeyMappature).ToList();
#endregion
foreach (var record in data)
{
var addedPoint = series[record.UsoTipologia].Points.AddXY(keyMappaturaGroups[record.KeyMappature], record.ValUsoTotal);
}
baseChart.ChartAreas[0].ReCalc();
baseChart.ChartAreas[0].AxisX.Minimum = 0.5d;
baseChart.ChartAreas[0].AxisX.Maximum = xVal - 0.5d;
#region bars top labels
foreach (var serie in series)
{
if (serie.Value.Name == "topLabelSerie")
{
foreach (DataPoint point in serie.Value.Points)
{
point.SetValueY(baseChart.ChartAreas[0].AxisY.Maximum * 0.15);
string keyMappatura = keyMappaturaGroups.Where(x => x.Value == point.XValue).FirstOrDefault().Key;
string label = tableDataGroups.Where(x => x.KeyMappature == keyMappatura).Sum(x => x.ValUsoTotal).ToString("##,#", new CultureInfo("es-ES"));
if (string.IsNullOrEmpty(label))
{
label = "-";
}
point.Label = label;
}
}
}
#endregion
AddElement(customChart);
}
private void BaseChart_CustomizeLegend(Chart sender, CustomizeLegendEventArgs e)
{
var items = e.LegendItems;
List legendItems = new List();
foreach (LegendItem item in items)
{
item.Legend.LegendStyle = LegendStyle.Table;
legendItems.Add(item);
}
Dictionary serieItemsOrder = new Dictionary()
{
{"Immobili d'uso abitativo", 1 },
{"Immobili strumentali",2 },
{"Immobili d'investimento", 3 },
{"Finalità non specificata", 4 }
};
legendItems = legendItems.OrderBy(x => serieItemsOrder[x.SeriesName]).ToList();
e.LegendItems.Clear();
foreach (var item in legendItems)
{
e.LegendItems.Add(item);
}
}
private void DrawChart3(List chartRecords)
{
Dictionary itemsOrder = new Dictionary()
{
{"Roma/Milano", 1 },
{"Capoluogo di Provincia",3 },
{"Capoluogo di Regione", 2 },
{"Piccolo comune", 4 },
{"Altro", 5 }
};
chartRecords = chartRecords.OrderBy(x => itemsOrder[x.KeyMappature]).ToList();
int nLeftStart;
int nWidth;
if ((int)chartRecords[0].ValTotaleTipologia < 999999)
{
nLeftStart = 340;
nWidth = 385;
}
else
{
nLeftStart = 335;
nWidth = 385;
}
var customChart = new CustomChartPDF()
{
X = nLeftStart,
Y = 115
};
var baseChart = customChart.ChartBase;
baseChart.Width = new System.Web.UI.WebControls.Unit(nWidth);
baseChart.Height = new System.Web.UI.WebControls.Unit(136);
baseChart.ChartAreas.Add("Default");
baseChart.ChartAreas["Default"].Area3DStyle.Enable3D = false;
baseChart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisX.LabelsAutoFit = true;
baseChart.ChartAreas[0].AxisX.LabelsAutoFitStyle = LabelsAutoFitStyle.WordWrap;
baseChart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Verdana", 6);
baseChart.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Verdana", 5);
baseChart.ChartAreas[0].AxisY.LabelStyle.Format = "€ {#,0}";
baseChart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
baseChart.ChartAreas[0].AxisX.MinorTickMark.Enabled = false;
baseChart.Legends[0].Docking = LegendDocking.Bottom;
baseChart.Legends[0].Alignment = StringAlignment.Center;
baseChart.Legends[0].Font = new Font("Verdana", 6);
baseChart.Legends[0].Enabled = false;
var valUsoAbitativoRecords =
chartRecords.Where(x => x.ValUsoAbitativo > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'uso abitativo",
ValUsoTotal = x.ValUsoAbitativo
}).ToList();
var ValUsoStrumentaleRecords =
chartRecords.Where(x => x.ValUsoStrumentale > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili strumentali",
ValUsoTotal = x.ValUsoStrumentale
}).ToList();
var ValUsoInvestimentoRecords =
chartRecords.Where(x => x.ValUsoInvestimento > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'investimento",
ValUsoTotal = x.ValUsoInvestimento
}).ToList();
var ValUsoNSRecords =
chartRecords.Where(x => x.ValUsoNS > 0 || (x.ValUsoAbitativo == 0 && x.ValUsoStrumentale == 0 && x.ValUsoInvestimento == 0)).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Finalità non specificata",
ValUsoTotal = x.ValUsoNS
}).ToList();
var tableDataGroups = valUsoAbitativoRecords;
tableDataGroups.AddRange(ValUsoStrumentaleRecords);
tableDataGroups.AddRange(ValUsoInvestimentoRecords);
tableDataGroups.AddRange(ValUsoNSRecords);
var keyMappaturaGroupNames = chartRecords.Select(x => x.KeyMappature).Distinct().ToList();
Dictionary keyMappaturaGroups = new Dictionary();
int xVal = 1;
foreach (var keyMap in keyMappaturaGroupNames)
{
keyMappaturaGroups.Add(keyMap, xVal);
baseChart.ChartAreas[0].AxisX.CustomLabels.Add((double)xVal - 0.5d, (double)xVal + 0.5d, keyMap);
xVal++;
}
Dictionary series = new Dictionary();
// Vecchio Codice 20171011
//int colorIndex = 0;
//foreach (var usoTipologia in tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList())
//{
// var serie = baseChart.Series.Add(usoTipologia);
// serie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
// serie["StackedGroupName"] = "AllSeries";
// serie["PixelPointWidth"] = "80";
// serie.Color = getColorPDF(usoTipologia);
// series.Add(usoTipologia, serie);
// colorIndex++;
//}
// Nuovo Codice
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary serieItemsOrder = new Dictionary()
{
//{"Immobili d'uso abitativo", 1 },
//{"Immobili strumentali",2 },
//{"Immobili d'investimento", 3 },
//{"Finalità non specificata", 4 }
{"Immobili d'uso abitativo", 2 },
{"Immobili strumentali",3 },
{"Immobili d'investimento", 4 },
{"Finalità non specificata", 1 }
};
serieNames = serieNames.OrderBy(x => serieItemsOrder[x]).ToList();
foreach (var usoTipologia in serieNames)
{
var serie = baseChart.Series.Add(usoTipologia);
serie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
serie["StackedGroupName"] = "AllSeries";
serie["PixelPointWidth"] = "80";
serie.Color = getColorPDF(usoTipologia);
series.Add(usoTipologia, serie);
colorIndex++;
}
// Fine Nuovo Codice
var topLabelSerie = baseChart.Series.Add("topLabelSerie");
topLabelSerie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
topLabelSerie["StackedGroupName"] = "AllSeries";
topLabelSerie["PixelPointWidth"] = "80";
topLabelSerie.Color = Color.Transparent;
topLabelSerie.Font = new Font("Verdana", 6);
topLabelSerie.ShowInLegend = false;
series.Add("topLabelSerie", topLabelSerie);
#region removing blank gaps ...
//https://social.msdn.microsoft.com/Forums/en-US/24b22f09-8b23-435c-a6ed-08fc58270239/vertical-gaps-in-stacked-bar-charts?forum=MSWinWebChart
var data = tableDataGroups.ToList();
foreach (var keyMappaturaGroup in keyMappaturaGroups)
{
foreach (var serie in series)
{
if (tableDataGroups.Where(x => x.KeyMappature == keyMappaturaGroup.Key &&
x.UsoTipologia == serie.Key).FirstOrDefault() == null)
{
data.Add(new { KeyMappature = keyMappaturaGroup.Key, UsoTipologia = serie.Key, ValUsoTotal = 0m });
}
}
}
data = data.OrderBy(x => x.UsoTipologia).OrderBy(x => x.KeyMappature).ToList();
#endregion
foreach (var record in data)
{
var addedPoint = series[record.UsoTipologia].Points.AddXY(keyMappaturaGroups[record.KeyMappature], record.ValUsoTotal);
}
baseChart.ChartAreas[0].ReCalc();
baseChart.ChartAreas[0].AxisX.Minimum = 0.5d;
baseChart.ChartAreas[0].AxisX.Maximum = xVal - 0.5d;
#region bars top labels
foreach (var serie in series)
{
if (serie.Value.Name == "topLabelSerie")
{
foreach (DataPoint point in serie.Value.Points)
{
point.SetValueY(baseChart.ChartAreas[0].AxisY.Maximum * 0.15);
string keyMappatura = keyMappaturaGroups.Where(x => x.Value == point.XValue).FirstOrDefault().Key;
string label = tableDataGroups.Where(x => x.KeyMappature == keyMappatura).Sum(x => x.ValUsoTotal).ToString("##,#", new CultureInfo("es-ES"));
if (string.IsNullOrEmpty(label))
{
label = "-";
}
point.Label = label;
}
}
}
#endregion
AddElement(customChart);
}
private void DrawChart4(List chartRecords)
{
Dictionary itemsOrder = new Dictionary()
{
{"Centrale", 1 },
{"Semicentrale",2 },
{"Periferica/Suburbana", 3 },
{"Rurale", 4 },
{"n.d.", 5 }
};
chartRecords = chartRecords.OrderBy(x => itemsOrder[x.KeyMappature]).ToList();
int nLeftStart;
int nWidth;
if ((int)chartRecords[0].ValTotaleTipologia < 999999)
{
nLeftStart = 340;
nWidth = 385;
}
else
{
nLeftStart = 335;
nWidth = 385;
}
var customChart = new CustomChartPDF()
{
X = nLeftStart,
Y = 280
};
var baseChart = customChart.ChartBase;
baseChart.Width = new System.Web.UI.WebControls.Unit(nWidth);
baseChart.Height = new System.Web.UI.WebControls.Unit(165);
baseChart.ChartAreas.Add("Default");
baseChart.ChartAreas["Default"].Area3DStyle.Enable3D = false;
baseChart.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisY.MajorGrid.Enabled = false;
baseChart.ChartAreas[0].AxisX.LabelsAutoFit = true;
baseChart.ChartAreas[0].AxisX.LabelsAutoFitStyle = LabelsAutoFitStyle.WordWrap;
baseChart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Verdana", 6);
baseChart.ChartAreas[0].AxisX.LabelStyle.Font = new Font("Verdana", 5);
baseChart.ChartAreas[0].AxisY.LabelStyle.Format = "€ {#,0}";
baseChart.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
baseChart.ChartAreas[0].AxisX.MinorTickMark.Enabled = false;
baseChart.Legends[0].Docking = LegendDocking.Bottom;
baseChart.Legends[0].Alignment = StringAlignment.Center;
baseChart.Legends[0].Font = new Font("Verdana", 6);
baseChart.Legends[0].Enabled = false;
baseChart.Legends[0].TextWrapThreshold = 8;
baseChart.CustomizeLegend += BaseChart_CustomizeLegend;
var valUsoAbitativoRecords =
chartRecords.Where(x => x.ValUsoAbitativo > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'uso abitativo",
ValUsoTotal = x.ValUsoAbitativo
}).ToList();
var ValUsoStrumentaleRecords =
chartRecords.Where(x => x.ValUsoStrumentale > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili strumentali",
ValUsoTotal = x.ValUsoStrumentale
}).ToList();
var ValUsoInvestimentoRecords =
chartRecords.Where(x => x.ValUsoInvestimento > 0).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Immobili d'investimento",
ValUsoTotal = x.ValUsoInvestimento
}).ToList();
var ValUsoNSRecords =
chartRecords.Where(x => x.ValUsoNS > 0 || (x.ValUsoAbitativo == 0 && x.ValUsoStrumentale == 0 && x.ValUsoInvestimento == 0)).Select(x => new
{
KeyMappature = x.KeyMappature,
UsoTipologia = "Finalità non specificata",
ValUsoTotal = x.ValUsoNS
}).ToList();
var tableDataGroups = valUsoAbitativoRecords;
tableDataGroups.AddRange(ValUsoStrumentaleRecords);
tableDataGroups.AddRange(ValUsoInvestimentoRecords);
tableDataGroups.AddRange(ValUsoNSRecords);
var keyMappaturaGroupNames = chartRecords.Select(x => x.KeyMappature).Distinct().ToList();
Dictionary keyMappaturaGroups = new Dictionary();
int xVal = 1;
foreach (var keyMap in keyMappaturaGroupNames)
{
keyMappaturaGroups.Add(keyMap, xVal);
baseChart.ChartAreas[0].AxisX.CustomLabels.Add((double)xVal - 0.5d, (double)xVal + 0.5d, keyMap.Replace("/", "/\n"));
xVal++;
}
Dictionary series = new Dictionary();
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary serieItemsOrder = new Dictionary()
{
//{"Immobili d'uso abitativo", 1 },
//{"Immobili strumentali",2 },
//{"Immobili d'investimento", 3 },
//{"Finalità non specificata", 4 }
{"Immobili d'uso abitativo", 2 },
{"Immobili strumentali",3 },
{"Immobili d'investimento", 4 },
{"Finalità non specificata", 1 }
};
serieNames = serieNames.OrderBy(x => serieItemsOrder[x]).ToList();
foreach (var usoTipologia in serieNames)
{
var serie = baseChart.Series.Add(usoTipologia);
serie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
serie["StackedGroupName"] = "AllSeries";
serie["PixelPointWidth"] = "80";
serie.Color = getColorPDF(usoTipologia);
series.Add(usoTipologia, serie);
colorIndex++;
}
var topLabelSerie = baseChart.Series.Add("topLabelSerie");
topLabelSerie.Type = Dundas.Charting.WebControl.SeriesChartType.StackedColumn;
topLabelSerie["StackedGroupName"] = "AllSeries";
topLabelSerie["PixelPointWidth"] = "80";
topLabelSerie.Color = Color.Transparent;
topLabelSerie.Font = new Font("Verdana", 6);
topLabelSerie.ShowInLegend = false;
series.Add("topLabelSerie", topLabelSerie);
#region removing blank gaps ...
//https://social.msdn.microsoft.com/Forums/en-US/24b22f09-8b23-435c-a6ed-08fc58270239/vertical-gaps-in-stacked-bar-charts?forum=MSWinWebChart
var data = tableDataGroups.ToList();
foreach (var keyMappaturaGroup in keyMappaturaGroups)
{
foreach (var serie in series)
{
if (tableDataGroups.Where(x => x.KeyMappature == keyMappaturaGroup.Key &&
x.UsoTipologia == serie.Key).FirstOrDefault() == null)
{
data.Add(new { KeyMappature = keyMappaturaGroup.Key, UsoTipologia = serie.Key, ValUsoTotal = 0m });
}
}
}
data = data.OrderBy(x => x.UsoTipologia).OrderBy(x => x.KeyMappature).ToList();
#endregion
foreach (var record in data)
{
var addedPoint = series[record.UsoTipologia].Points.AddXY(keyMappaturaGroups[record.KeyMappature], record.ValUsoTotal);
}
baseChart.ChartAreas[0].ReCalc();
baseChart.ChartAreas[0].AxisX.Minimum = 0.5d;
baseChart.ChartAreas[0].AxisX.Maximum = xVal - 0.5d;
#region bars top labels
foreach (var serie in series)
{
if (serie.Value.Name == "topLabelSerie")
{
foreach (DataPoint point in serie.Value.Points)
{
point.SetValueY(baseChart.ChartAreas[0].AxisY.Maximum * 0.15);
string keyMappatura = keyMappaturaGroups.Where(x => x.Value == point.XValue).FirstOrDefault().Key;
string label = tableDataGroups.Where(x => x.KeyMappature == keyMappatura).Sum(x => x.ValUsoTotal).ToString("##,#", new CultureInfo("es-ES"));
if (string.IsNullOrEmpty(label))
{
label = "-";
}
point.Label = label;
}
}
}
#endregion
AddElement(customChart);
}
private void DrawLegend(int positionX, int positionY)
{
ColorPDF coloriUsoAbitativo = new ColorPDF(207, 220, 210);
ColorPDF coloriStrumentale = new ColorPDF(167, 192, 168);
ColorPDF coloriInvestimento = new ColorPDF(115, 152, 109);
ColorPDF coloriNonSpecificata = new ColorPDF(245, 245, 220);
var originalX = positionX;
int xOffset = 100;//150;
var legendaUsoAbitativoRettangolo = new RectanglePDF(positionX, 12, 17, coloriUsoAbitativo) { AutoIncrementYWritable = false, Y = positionY };
var legendaUsoAbitativoTesto = new FormattedTextAreaPDF(string.Format("{0}", "Immobili
d'uso abitativo"), positionX + 25) { FontSize = 6, AutoIncrementYWritable = false, Y = positionY-0.5F };
positionX += xOffset;
var legendaStrumentaleRettangolo = new RectanglePDF(positionX, 12, 17, coloriStrumentale) { AutoIncrementYWritable = false, Y = positionY };
var legendaStrumentaleTesto = new FormattedTextAreaPDF(string.Format("{0}", "Immobili
strumentali"), positionX + 25) { FontSize = 6, AutoIncrementYWritable = true, Y = positionY - 0.5F };
//positionY += 15;
//positionX= originalX;
positionX += xOffset;
var legendaInvestimentoRettangolo = new RectanglePDF(positionX, 12, 17, coloriInvestimento) { AutoIncrementYWritable = false, Y = positionY };
var legendaInvestimentoTesto = new FormattedTextAreaPDF(string.Format("{0}", "Immobili
d'investimento"), positionX + 25) { FontSize = 6, AutoIncrementYWritable = true, Y = positionY - 0.5F };
positionX += xOffset;
var legendaNonSpecificataRettangolo = new RectanglePDF(positionX, 12, 17, coloriNonSpecificata) { AutoIncrementYWritable = false, Y = positionY };
var legendaNonSpecificataTesto = new FormattedTextAreaPDF(string.Format("{0}", "Finalità
non specificata"), positionX + 25) { FontSize = 6, AutoIncrementYWritable = true, Y = positionY - 0.5F };
AddElement(legendaUsoAbitativoRettangolo);
AddElement(legendaUsoAbitativoTesto);
AddElement(legendaStrumentaleRettangolo);
AddElement(legendaStrumentaleTesto);
AddElement(legendaInvestimentoRettangolo);
AddElement(legendaInvestimentoTesto);
AddElement(legendaNonSpecificataRettangolo);
AddElement(legendaNonSpecificataTesto);
}
public virtual Stream getImageFromStored()
{
var parametri = new List
{
new Parametro
{
Direction = ParameterDirection.Input,
DbType = DbType.Int32,
ParameterName = "chiaveClientePB",
Value = EnvironmentFacade.ReportEnvironment.Cliente.Chiave
},
new Parametro
{
Direction = ParameterDirection.Input,
DbType = DbType.Int32,
ParameterName = "chiaveNucleo",
Value = 0
}
};
var data = DataAccess.ExecuteDataSetStoredProcedure(DBProvider.SqlServerConsulenzaUnica, "REP_ImmobiliareMonitoraggio_S14_MapDistrGeografica_Image", parametri);
byte[] imageBytes = (byte[])data.Tables[0].Rows[0][0];
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
ms.Write(imageBytes, 0, imageBytes.Length);
return ms;
}
private class ChartRecord
{
public int ChiaveTipoChart { get; set; }
public string KeyMappature { get; set; }
public decimal ValTotaleTipologia { get; set; }
public decimal ValUsoAbitativo { get; set; }
public decimal ValUsoStrumentale { get; set; }
public decimal ValUsoInvestimento { get; set; }
public decimal ValUsoNS { get; set; }
public string UsoTipologia { get; set; }
public decimal NumImmobili { get; set; }
public string OrderInGraph { get; set; }
}
private Color getColorPDF(string usoTipologia) {
switch (usoTipologia) {
case "Immobili d'uso abitativo":
return Color.FromArgb(206, 219, 209);
case "Immobili strumentali":
return Color.FromArgb(167, 192, 168);
case "Immobili d'investimento":
return Color.FromArgb(114, 152, 110);
case "Finalità non specificata":
return Color.FromArgb(245, 245, 220);
default:
return Color.FromArgb(206, 219, 209);
}
}
}
}