1179 lines
51 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;
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
{
/// <summary>
/// Scheda 14
/// </summary>
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);
}
}
/// <summary>
/// Scheda2. Patrimonio immobiliare Sintesi (distribuzione del patrimonio complessivo del cliente diviso per tipologia e cointestatari)
/// </summary>
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);
}
/// <summary>
/// Recupera i dati necessari alla Section restituendo un DataTable.
/// </summary>
/// <returns></returns>
protected override DataTable GetDataTable()
{
return null;
}
/// <summary>
/// Recupera i dati necessari alla Section restituendo un DataSet.
/// </summary>
/// <returns></returns>
protected override DataSet GetDataSet()
{
var parametri = new List<Parametro>
{
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<ChartRecord> GetChartData(DataSet dataSet, int chiaveTipoChart)
{
List<ChartRecord> results = new List<ChartRecord>();
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<ChartRecord> chartRecords)
{
List<ChartRecord> 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<string, int> keyMappaturaGroups = new Dictionary<string, int>();
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<string, Series> series = new Dictionary<string, Series>();
//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<string, Series> series = new Dictionary<string, Series>();
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary<string, int> serieItemsOrder = new Dictionary<string, int>()
{
//{"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<ChartRecord> 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<string, int> keyMappaturaGroups = new Dictionary<string, int>();
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<string, Series> series = new Dictionary<string, Series>();
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary<string, int> serieItemsOrder = new Dictionary<string, int>()
{
//{"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<LegendItem> legendItems = new List<LegendItem>();
foreach (LegendItem item in items)
{
item.Legend.LegendStyle = LegendStyle.Table;
legendItems.Add(item);
}
Dictionary<string, int> serieItemsOrder = new Dictionary<string, int>()
{
{"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<ChartRecord> chartRecords)
{
Dictionary<string, int> itemsOrder = new Dictionary<string, int>()
{
{"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<string, int> keyMappaturaGroups = new Dictionary<string, int>();
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<string, Series> series = new Dictionary<string, Series>();
// 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<string, int> serieItemsOrder = new Dictionary<string, int>()
{
//{"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<ChartRecord> chartRecords)
{
Dictionary<string, int> itemsOrder = new Dictionary<string, int>()
{
{"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<string, int> keyMappaturaGroups = new Dictionary<string, int>();
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<string, Series> series = new Dictionary<string, Series>();
int colorIndex = 0;
var serieNames = tableDataGroups.OrderByDescending(x => x.ValUsoTotal).Select(x => x.UsoTipologia).Distinct().ToList();
Dictionary<string, int> serieItemsOrder = new Dictionary<string, int>()
{
//{"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<br>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<br>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<br>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à<br>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<Parametro>
{
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);
}
}
}
}