802 lines
45 KiB
C#
Raw Permalink 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 Consulenza.ReportWriter.Business;
using Consulenza.ReportWriter.Business.OBJ_PDF;
using System.Data;
using Consulenza.ReportCommon;
using System.Collections.Generic;
using System.Linq;
using Consulenza.ReportWriter.Business.CHART_PDF;
using Consulenza.ReportWriter.Business.CUSTOM_PDF.ConsulenzaUnica;
using Consulenza.ReportWriter.Business.Entity;
namespace Consulenza.ReportWriter.Manager.Section.Unica
{
public class S63 : Entity.Section
{
/// <summary>
///S63.PropostaRischioMercatoVSRischioCredito idSezione = 106
/// </summary>
bool presenzaColonnaGradoCopertura;
public S63(EnvironmentFacade environmentFacade, int idSection)
: base(environmentFacade, idSection)
{
try
{
Draw();
}
catch (Exception ex)
{
SectionLogger.Write("S63", ex.Message, SectionLoggerMessageLevel.E, EnvironmentFacade.ReportEnvironment);
}
}
protected override sealed void Draw()
{
var dati = GetDataSet();
bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
AddElement(new PagePDF(PagePDF.PagePDFType.Generic));
var intestazione = new SectionHeadingPDF(
(isAdeguata ? "Proposta" : "Operazioni richieste") + ": rischio mercato vs rischio credito",
EnvironmentFacade.RendererFacade.XLeftLimit,
EnvironmentFacade.RendererFacade.YUpperLimit,
EnvironmentFacade.ReportEnvironment.FontFamily);
AddElement(intestazione.ToElement());
#region Testo Introduttivo
if (GetTesto1().Length > 0)
{
AddElement(new SpacePDF(20));
AddElement(new FormattedTextAreaPDF(GetTesto1(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 7, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
AddElement(new SpacePDF(20));
}
#endregion
#region Serie, Colori, Label del Grafico
var series = new List<Serie>();
var coloreSerieAreaAdeguata = new ColorPDF(228, 235, 238);
var coloreSerieAreaNonAdeguata = new ColorPDF(204, 217, 222);
var labelPersonalizzateAsseX = new List<CombinationPDFCustomLabel>();
var labelPersonalizzateAsseY = new List<CombinationPDFCustomLabel>();
foreach (DataRow rowX in dati.Tables["soglieX"].Rows)
{
labelPersonalizzateAsseX.Add(new CombinationPDFCustomLabel { Text = string.Empty, Value = Convert.ToDouble(rowX["Valore"]) });
}
foreach (DataRow rowX in dati.Tables["soglieY"].Rows)
{
labelPersonalizzateAsseY.Add(new CombinationPDFCustomLabel { Text = rowX["Testo"].ToString(), Value = Convert.ToDouble(rowX["Valore"]) });
}
#endregion
AddElement(new FormattedTextAreaPDF("Rischio Mercato (VaR %)", EnvironmentFacade.RendererFacade.XLeftLimit + 110) { FontBold = true, FontSize = 7 });
AddElement(new SpacePDF(7));
#region Grafico Rischio Mercato - Rischio Credito
var graficoCombination = new CombinationPDF(EnvironmentFacade.RendererFacade.XLeftLimit + 150, 1F)
{
Height = 200,
Width = 300,
MinorGridAxisY = false,
BackColor = coloreSerieAreaNonAdeguata,
LegendFontSizeText = 7,
MarginAxisY = 0,
ShowLineAxisY = true,
ShowLabelAxisY = true,
IntervalNumberAxisY = 5,
StartFromZeroAxisY = true,
//Adriano
// imposta il valore massimo per la scala, per i clienti Retail, per i quali il valore massimo è 27, è 30, per i professionali, per i quali il valore può arrivare a 50, è 55
MaximumValueAxisY = Convert.ToInt32(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"]) > 27 ? 53 : 30,
//--Adriano
//originale:
//MaximumValueAxisY = 30, // valore fisso
IndicatorAxisY = new CombinationPDFIndicator() { Text = "Rischio Mercato (VaR) massimo", Value = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"]), DeltaX = -120, DeltaYText = -10 },
CustomLabelAxisY = labelPersonalizzateAsseY,
LabelFormatAxisY = FormatType.Decimale2,
ShowLineAxisX = true,
ShowLabelAxisX = true,
StartFromZeroAxisX = true,
MaximumValueAxisX = 35, // valore fisso
IntervalNumberAxisX = 4,
CustomLabelAxisX = labelPersonalizzateAsseX,
IndicatorAxisX = new CombinationPDFIndicator() { Text = "Rischio Credito massimo", Value = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioCreditoMassimoProfilo"]), DeltaXText = 7 }
};
#region Serie di adeguatezza
series.Add(
new Serie
{
Name = "AreaDiAdeguatezza",
Type = Dundas.Charting.WebControl.SeriesChartType.Area,
Color = coloreSerieAreaAdeguata,
BorderColor = ColorPDF.Nero,
BorderWidth = 1,
Points = new List<Point>() {
new Point {
Values = new ValuesPointXY(0, Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"])),
ShowLabelAxisY = false,
ShowLabelAxisX = false,
Color = coloreSerieAreaAdeguata
},
new Point {
Values = new ValuesPointXY(Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioCreditoMassimoProfilo"]), Convert.ToDouble(dati.Tables[3].Rows[0]["RischioMercatoMassimoProfilo"])),
ShowLabelAxisY = false,
ShowLabelAxisX = false,
Color = coloreSerieAreaAdeguata
},
}
}
);
var d = dati.Tables[0].AsEnumerable().OrderByDescending(o => o.Field<int>("NumeroPatrimonio")).CopyToDataTable();
foreach (DataRow item in d.Rows)
{
graficoCombination.Markers.Add(new Marker()
{
Image = item["CodicePatrimonio"].ToString().Equals("PA") ? "PallinoPortafoglioAttuale.png" : "PallinoPortafoglioProposto.png",
Width = 15,
Height = 15,
//Scale = 1,
//20180907 AC
//X = (float)Convert.ToDouble(item["RischioCredito"]),
X = (float)Convert.ToDouble(xPosRC(item["RischioCreditoString"].ToString())),
// E.S. To Check
Y = (float)Convert.ToDouble(item["VaR"]) > 30 ? 30 : (float)Convert.ToDouble(item["VaR"])
});
}
#endregion
#region Serie di non adeguatezza
// ***************Lo sfondo grigio del grafico è dato dalla proprietà BackColor del CombinationPDF. *************
#endregion
#region Serie Patrimoni
//foreach (DataRow item in dati.Tables["rischio"].Rows)
//{
// //double puntoY = Convert.ToDouble(item["VaR"]) >= 30 ? 30 : Convert.ToDouble(item["VaR"]);
// //double puntoX = Convert.ToDouble(item["RischioCredito"]) <= 0 ? 0.0 : Convert.ToDouble(item["RischioCredito"]);
// double puntoY = Convert.ToDouble(item["VaR"]);
// double puntoX = Convert.ToDouble(item["RischioCredito"]);
// series.Add(
// new Serie
// {
// Name = item["CodicePatrimonio"].ToString(),
// Type = Dundas.Charting.WebControl.SeriesChartType.Point,
// MarkerImage = item["CodicePatrimonio"].ToString().Equals("PA") ? "PallinoPortafoglioAttuale2.png" : "PallinoPortafoglioProposto2.png",
// Points = new List<Point>() {
// new Point {
// Values = new ValuesPointXY(puntoX, puntoY),
// ShowLabelAxisY = false,
// ShowLabelAxisX = false
// }
// }
// }
// );
//};
#endregion
// aggiungo le Serie al grafico
graficoCombination.SeriesCollection = series;
AddElement(graficoCombination);
#endregion
AddElement(new FormattedTextAreaPDF("Classe A", graficoCombination.X + 20) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
AddElement(new FormattedTextAreaPDF("Classe B", graficoCombination.X + 97) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
AddElement(new FormattedTextAreaPDF("Classe C", graficoCombination.X + 170) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
AddElement(new FormattedTextAreaPDF("Classe D", graficoCombination.X + 247) { FontSize = 7, AutoIncrementYWritable = false, DeltaY = -90 });
AddElement(new FormattedTextAreaPDF("Rischio Credito", EnvironmentFacade.RendererFacade.XLeftLimit + 420) { FontBold = true, FontSize = 7, DeltaY = -80 });
#region Tabella
var tabella = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["rischio"])
{
Style = Style.ConsulenzaUnica,
AlternateRow = false,
ShowSeparationLines = true,
RowHeight = 27,
Footer = false,
HeaderHeight = 30,
ShowBorderLastLine = true
};
tabella.Columns.Add(new ColumnPDF("ImmaginePatrimonio", 15, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Immagine, "ImmaginePatrimonio", string.Empty) { DeltaYContent = 6.5F, ScaleColumnTypeImage = 0.27F });
if (presenzaColonnaGradoCopertura)
tabella.Columns.Add(new ColumnPDF("Patrimonio", 110, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Patrimonio", "Portafoglio") { HeaderPaddingLeft = 10, PaddingLeft = 10, HeaderFontSize = 7 });
else
tabella.Columns.Add(new ColumnPDF("Patrimonio", 185, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Patrimonio", "Portafoglio") { HeaderPaddingLeft = 10, PaddingLeft = 10, HeaderFontSize = 7 });
tabella.Columns.Add(new ColumnPDF("Controvalore", 100, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "Controvalore", "Controvalore (€)") { HeaderFontSize = 7, PaddingRight = 4 });
tabella.Columns.Add(new ColumnPDF("RischioCredito", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "RischioCreditoString", "Rischio Credito") { HeaderFontSize = 7, PaddingRight = 4 });
tabella.Columns.Add(new ColumnPDF("Var", 60, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "VaRString", "VaR (%)") { HeaderFontSize = 7, PaddingRight = 4 });
if (presenzaColonnaGradoCopertura)
tabella.Columns.Add(new ColumnPDF("GradoCopertura", 80, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Decimale, "GradoCopertura", "Grado di <br>copertura (%)") { HeaderFontSize = 7, PaddingRight = 4 });
tabella.Columns.Add(new ColumnPDF("Adeguatezza", 75, HorizontalAlignmentType.Centrato, false, false, 7, ColumnType.Testo, "AdeguatezzaString", "Adeguatezza") { HeaderFontSize = 7, PaddingRight = 2 });
int i = 0;
int colonna = 0;
foreach (DataRow r in tabella.DataSource.Rows)
{
if (presenzaColonnaGradoCopertura)
colonna = 6;
else
colonna = 5;
switch (r["AdeguatezzaString"].ToString())
{
case "Adeguato":
tabella.Cells[colonna, i].FontColor = ColorPDF.Verde;
break;
case "Non adeguato":
tabella.Cells[colonna, i].FontColor = ColorPDF.Rosso;
break;
default:
tabella.Cells[colonna, i].FontColor = ColorPDF.Nero;
break;
}
//var colorAdeguatezza = Convert.ToBoolean(r["Adeguatezza"]) ? new ColorPDF(0, 176, 70) : new ColorPDF(255, 0, 0);
//if (presenzaColonnaGradoCopertura)
// tabella.Cells[6, i].FontColor = colorAdeguatezza;
//else
// tabella.Cells[5, i].FontColor = colorAdeguatezza;
tabella.Cells[2, i].HorizontalAlignment =
tabella.Cells[3, i].HorizontalAlignment =
tabella.Cells[4, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
tabella.Cells[3, i].Value = r["RischioCreditoString"].ToString().ToLower().Contains("classe") ? Helper.CapitalizeWords(r["RischioCreditoString"].ToString()) : r["RischioCreditoString"].ToString();
if (presenzaColonnaGradoCopertura)
tabella.Cells[5, i].HorizontalAlignment = HorizontalAlignmentType.Destra;
i++;
}
#endregion
//manca il grafico sopra
AddElement(tabella);
#region Label Grafico
AddElement(new FormattedTextAreaPDF("Area di non adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 365) { Y = 227, FontSize = 6.5F, AbsolutePosition = true });
var xAreaAdeguatezza = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioCreditoMassimoProfilo"]);
var yAreaAdeguatezza = Convert.ToDouble(dati.Tables["cliente"].Rows[0]["RischioMercatoMassimoProfilo"]);
//AddElement(new FormattedTextAreaPDF("Area adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 230) { Y = 410, FontSize = 6.5F, AbsolutePosition = true });
AddElement(new FormattedTextAreaPDF("Area di adeguatezza", EnvironmentFacade.RendererFacade.XLeftLimit + 140 + ((float)xAreaAdeguatezza * graficoCombination.Width / (float)graficoCombination.MaximumValueAxisX) - 59)
{
Y = 417 - ((float)yAreaAdeguatezza * graficoCombination.Height / (float)graficoCombination.MaximumValueAxisY) + 8,
FontSize = 6.5F,
AbsolutePosition = true
});
#endregion
AddElement(new SpacePDF(-15));
if (GetNota1().Length + GetNota2().Length > 0)
{
tabella.Notes.Add(
new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella,
GetNota1() + GetNota2(),
new[] { /*"Patrimonio", "CodicePatrimonio='PA'"*/ "" },
string.Empty,
TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella)
{ FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify, DeltaY = 5 }
);
AddElement(new SpacePDF(5));
}
if (GetNota3().Length > 0)
{
AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 ? 10 : 5));
AddElement(new FormattedTextAreaPDF(GetNota3(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
}
if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio != null && GetNota4().Length > 0)
{
AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 ? 10 : 5));
AddElement(new FormattedTextAreaPDF(GetNota4(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
}
if (GetNota5().Length > 0)
{
AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 ? 10 : 5));
AddElement(new FormattedTextAreaPDF(GetNota5(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
}
if (GetNota6().Length > 0)
{
AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 || GetNota5().Length > 0 ? 10 : 5));
AddElement(new FormattedTextAreaPDF(GetNota6(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
}
if (datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato)
{
string testonota637 = isAdeguata ? "La valutazione di adeguatezza del \"portafoglio attuale\" e del \"portafoglio proposto\" in termini di \"Rischio Mercato (VaR)\" e di \"Rischio Credito\" prende in considerazione il patrimonio detenuto presso $/Banca/$ da tutti i mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme al patrimonio del mandato " + datiSeiUnico.getClienteReport().codiceMandato + " derivante dalla presente proposta (limitatamente al \"portafoglio proposto\"). Gli indicatori \"Rischio Mercato (VaR)\" e \"Rischio Credito\", invece, sono calcolati considerando esclusivamente i prodotti detenuti dal mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme alle operazioni effettuate nella presente proposta. "
: "La valutazione di adeguatezza del \"portafoglio attuale\" e del \"portafoglio prospettico\" in termini di \"Rischio Mercato (VaR)\" e di \"Rischio Credito\" prende in considerazione il patrimonio detenuto presso $/Banca/$ da tutti i mandati fiduciari associati al medesimo fiduciante a cui appartiene il mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme al patrimonio del mandato " + datiSeiUnico.getClienteReport().codiceMandato + " derivante dalle operazioni da lei richieste al suo private banker (limitatamente al \"portafoglio prospettico\"). Gli indicatori \"Rischio Mercato (VaR)\" e \"Rischio Credito\", invece, sono calcolati considerando esclusivamente i prodotti detenuti dal mandato " + datiSeiUnico.getClienteReport().codiceMandato + ", insieme alle operazioni da lei richieste al suo private banker. ";
AddElement(new SpacePDF(GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 || GetNota5().Length > 0 || GetNota6().Length > 0 ? 10 : 5));
AddElement(new FormattedTextAreaPDF(datiSeiUnico.FormatBanca(testonota637), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
}
if (GetNota7().Length > 0)
{
AddElement(new SpacePDF(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.flagfiduciariaPluriMandato || GetNota1().Length + GetNota2().Length > 0 || GetNota3().Length > 0 || GetNota4().Length > 0 || GetNota5().Length > 0 || GetNota6().Length > 0 ? 10 : 5));
AddElement(new FormattedTextAreaPDF(GetNota7(), EnvironmentFacade.RendererFacade.XLeftLimit) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify });
}
}
/// <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()
{
var ds = new DataSet();
ds.Tables.Add(new DataTable("rischio"));
ds.Tables.Add(new DataTable("soglieX"));
ds.Tables.Add(new DataTable("soglieY"));
ds.Tables.Add(new DataTable("cliente"));
//profilo finanziario cliente/nucleo
var anagrafica = datiSeiUnico.piramideModelloUnit().questionarioMifid;
//Adriano
#region Cliente professionale
var cliente = datiSeiUnico.clienteUnit().anagrafica;
bool profiloProfessionale;
bool profiloAggressivo;
bool profiloProfessionaleAggressivo;
var profiler = new Profiler(cliente);
profiloProfessionale = profiler.ProfiloProfessionale;
profiloAggressivo = profiler.ProfiloAggressivo;
profiloProfessionaleAggressivo = profiler.ProfiloProfessionaleAggressivo;
//Adriano per test:
//profiloProfessionale = true;
//profiloAggressivo = true;
//profiloProfessionaleAggressivo = true;
#endregion
//--Adriano
var rischioMercatoMassimoProfiloCliente = anagrafica.profileVarMax;
var rischioCreditoMassimoProfiloCliente = Convert.ToInt32(anagrafica.profileClassRcId);
//Adriano: forzo a 50 il Rischio Mercato Massimo per simulare il caso dei Clienti Pro
// Verificare il valore fornito dal WS, che potrebbe essere già corretto
if (profiloProfessionaleAggressivo)
rischioMercatoMassimoProfiloCliente = 50;
//--Adriano
////RC
//var adegRischioCreditoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RC" select o).LastOrDefault();
////RM
//var adegRischioMercatoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RM" select o).LastOrDefault();
//RC
var adegRischioCreditoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RC" select o).LastOrDefault();
//RM
var adegRischioMercatoAttuale = (from o in datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.listaAdeguatezza where o.id == "RM" select o).LastOrDefault();
//RC
var adegRischioCreditoProposto = (from o in datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza where o.idDescIndicatore == "RC" select o).LastOrDefault();
//RM
var adegRischioMercatoProposto = (from o in datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza where o.idDescIndicatore == "RM" select o).LastOrDefault();
var datiPortaglioAttuale = datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio;
var portafoglioproposto = datiSeiUnico.propostaUnit().stDettaglioProposta;
var datiAdeguatezzaProposta = datiSeiUnico.propostaUnit().stAdequatezza;
string[] lowerString = { "-", "n.a.", "n.d.", "n.c." };
var rischioCreditoPortafoglioProposto = "";
foreach (var item in from a in datiAdeguatezzaProposta.listaDettagliAdeguatezza orderby a.ordinamento select a)
{
{
if (item.descrizioneIndicatore != null && item.descrizioneIndicatore.ToLower().Equals("rischio credito")) {
rischioCreditoPortafoglioProposto = item.ptfProspettico.Equals("") ? "-" :
!lowerString.Contains(item.ptfProspettico.ToLower()) && !item.descrizioneIndicatore.ToLower().Contains("frequenza") ?
Helper.FormatCurrency(item.ptfProspettico.ToString().Replace(".", ",")) : Helper.FormatDecimal(item.ptfProspettico, 0);
}
}
}
if (datiPortaglioAttuale != null)
presenzaColonnaGradoCopertura = datiPortaglioAttuale.copertura < 100 || portafoglioproposto.copertura < 100;
else
presenzaColonnaGradoCopertura = false;
#region Rischio
ds.Tables["rischio"].Columns.Add(new DataColumn("Patrimonio", typeof(string)));
ds.Tables["rischio"].Columns.Add(new DataColumn("NumeroPatrimonio", typeof(int)));
ds.Tables["rischio"].Columns.Add(new DataColumn("CodicePatrimonio", typeof(string)));
ds.Tables["rischio"].Columns.Add(new DataColumn("ImmaginePatrimonio", typeof(string)));
ds.Tables["rischio"].Columns.Add(new DataColumn("Controvalore", typeof(decimal)));
ds.Tables["rischio"].Columns.Add(new DataColumn("VaR", typeof(decimal)));
ds.Tables["rischio"].Columns.Add(new DataColumn("VaRString", typeof(string)));
ds.Tables["rischio"].Columns.Add(new DataColumn("RischioCredito", typeof(decimal)));
ds.Tables["rischio"].Columns.Add(new DataColumn("RischioCreditoString", typeof(string)));
ds.Tables["rischio"].Columns.Add(new DataColumn("GradoCopertura", typeof(decimal)));
ds.Tables["rischio"].Columns.Add(new DataColumn("Adeguatezza", typeof(bool)));
ds.Tables["rischio"].Columns.Add(new DataColumn("AdeguatezzaString", typeof(string)));
#region Portafoglio Attuale
if (datiPortaglioAttuale != null)
{
ds.Tables["rischio"].Rows.Add(
"Portafoglio attuale" + (GetNota1().Length > 0 ? "*" : ""), //Patrimonio
1,
"PA", //CodicePortafoglio
"PallinoPortafoglioAttuale.png", //pallino
datiSeiUnico.ATTUTALE_TOTALEPOSITIVO, //Controvalore
Convert.ToDecimal(datiPortaglioAttuale.valoreVaR), //VaR
adegRischioMercatoAttuale.patrimonioFideuram.Replace(".", ","), //VaRString
datiPortaglioAttuale.classeRischioCredito.ToString(), //RischioCredito
Helper.resultValueVariousString(adegRischioCreditoAttuale.patrimonioFideuram), //RischioCreditoString
//datiPortaglioAttuale.copertura, //GradoCopertura
datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura,
adegRischioCreditoAttuale.isAdeguato && adegRischioMercatoAttuale.isAdeguato, //Adeguatezza
//!adegRischioCreditoAttuale.isAdeguatoSpecified ? "n.a." : (datiPortaglioAttuale.copertura > 0 ? adegRischioMercatoAttuale.isAdeguato ? "Adeguato" : "Non Adeguato" : "n.c.") //AdeguatezzaString
!adegRischioCreditoAttuale.isAdeguatoSpecified ? "n.a." : (adegRischioCreditoAttuale.isAdeguato && adegRischioMercatoAttuale.isAdeguato ? "Adeguato" : "Non adeguato") //AdeguatezzaString
);
}
#endregion
#region Portafoglio Proposto
ds.Tables["rischio"].Rows.Add(
"Portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico") + (GetNota2().Length > 0 ? "*" : ""), //Patrimonio
2,
"PP", //CodicePortafoglio
"PallinoPortafoglioProposto.png", //pallino
datiSeiUnico.PROPOSTO_TOTALEPOSITIVO, //Controvalore
portafoglioproposto.rischioMercato, //VaR
portafoglioproposto.rischioMercatoDec, //VaRString
portafoglioproposto.rischioCredito, //RischioCredito
Helper.resultValueVariousString(rischioCreditoPortafoglioProposto.Equals("")? portafoglioproposto.rischioCreditoDec : rischioCreditoPortafoglioProposto), //RischioCreditoString
Math.Round(portafoglioproposto.copertura, 2), //GradoCopertura
adegRischioCreditoProposto.flagAdeguatezza && adegRischioMercatoProposto.flagAdeguatezza, //Adeguatezza TODO
!adegRischioCreditoProposto.flagAdeguatezzaSpecified ? "n.a." : (adegRischioCreditoProposto.flagAdeguatezza && adegRischioMercatoProposto.flagAdeguatezza ? "Adeguato" : "Non adeguato") //AdeguatezzaString
);
#endregion
#endregion
#region Soglie Asse X
// I valori non sono quelli reali definiti nel database ma sono riproporzionati in funzione della richiesta del cliente.
ds.Tables["soglieX"].Columns.Add(new DataColumn("Id", typeof(int)));
ds.Tables["soglieX"].Columns.Add(new DataColumn("Valore", typeof(decimal)));
ds.Tables["soglieX"].Rows.Add(1, 8.77);
ds.Tables["soglieX"].Rows.Add(2, 17.54);
ds.Tables["soglieX"].Rows.Add(3, 26.31);
// dtSoglieX.Rows.Add(4, 32);m valore cliente: modificato il 30 maggio perchè ppt è diverso. e quindi mettiamo quello sotto:
ds.Tables["soglieX"].Rows.Add(4, 35.08);
#endregion
#region Soglie Asse Y
ds.Tables["soglieY"].Columns.Add(new DataColumn("Valore", typeof(decimal)));
ds.Tables["soglieY"].Columns.Add(new DataColumn("Testo", typeof(string)));
ds.Tables["soglieY"].Rows.Add(2, "2,00");
ds.Tables["soglieY"].Rows.Add(4.5, "4,50");
ds.Tables["soglieY"].Rows.Add(9.5, "9,50");
ds.Tables["soglieY"].Rows.Add(15, "15,00");
//Adriano
//ds.Tables["soglieY"].Rows.Add(27, "27,00");
if (profiloProfessionaleAggressivo)
ds.Tables["soglieY"].Rows.Add(50, "50,00");
else
ds.Tables["soglieY"].Rows.Add(27, "27,00");
//--Adriano
#endregion
#region Cliente
ds.Tables["cliente"].Columns.Add(new DataColumn("RischioMercatoMassimoProfilo", typeof(decimal)));
ds.Tables["cliente"].Columns.Add(new DataColumn("RischioCreditoMassimoProfilo", typeof(decimal)));
var RischioCreditoMassimoProfilo = ds.Tables["soglieX"].AsEnumerable().FirstOrDefault(o => o.Field<int>("Id").Equals(rischioCreditoMassimoProfiloCliente))["Valore"];
ds.Tables["cliente"].Rows.Add(rischioMercatoMassimoProfiloCliente, RischioCreditoMassimoProfilo);
#endregion
return ds;
}
public virtual string GetTesto1()
{
bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro();
string testo = "";
testo = isAdeguata ?
Helper.ReplaceVariables("In questa scheda è riportato il confronto, in termini di Rischio Mercato (VaR) e di Rischio Credito, tra il patrimonio che lei attualmente detiene presso $/Banca/$ (\"portafoglio attuale\"), il patrimonio derivante dalla presente proposta (\"portafoglio proposto\"), e i limiti massimi associati al suo profilo finanziario. Nel grafico sono indicate l'area di adeguatezza e l'area di non adeguatezza: la prima individua le situazioni in cui sia il Rischio Mercato (VaR) sia il Rischio Credito del singolo portafoglio sono inferiori ai livelli massimi associati al suo profilo finanziario.", base.EnvironmentFacade.ReportEnvironment) :
Helper.ReplaceVariables("In questa scheda è riportato il confronto, in termini di Rischio Mercato (VaR) e di Rischio Credito, tra il patrimonio che lei attualmente detiene presso $/Banca/$ (\"portafoglio attuale\"), il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\"), e i limiti massimi associati al suo profilo finanziario. Nel grafico sono indicate l'area di adeguatezza e l'area di non adeguatezza: la prima individua le situazioni in cui sia il Rischio Mercato (VaR) sia il Rischio Credito del singolo portafoglio sono inferiori ai livelli massimi associati al suo profilo finanziario.", base.EnvironmentFacade.ReportEnvironment);
return testo;
}
public virtual string GetNota1()
{
string nota = "";
// 20181009 AC
//if (getCCN_CASA() != 0 || getGPELIGOFONDI_CASA() != 0 || getGPELIGOTITOLI_CASA() != 0)
if (getCCN_CASA() != 0 || getGPELIGOFONDI_CASA() != 0 || getGPELIGOTITOLI_CASA() != 0 || getTUOFOGLIO_CASA() != 0)
//--20181009 AC
{
nota = "Il controvalore del portafoglio attuale esclude il saldo negativo ";
if (getCCN_CASA() != 0)
nota += "dei conti correnti (" + Helper.FormatCurrency(getCCN_CASA().ToString()) + " €)";
// 20181009 AC
if (getTUOFOGLIO_CASA() != 0)
{
nota += getCCN_CASA() != 0 ? ", " : "";
nota += "della liquidità sottostante Il Mio Foglio (" + Helper.FormatCurrency(getTUOFOGLIO_CASA().ToString()) + "€)";
}
//--20181009 AC
if (getGPELIGOFONDI_CASA() != 0)
{
nota += getCCN_CASA() != 0 ? ", " : "";
nota += "della liquidità sottostante la GP Eligo Fondi (" + Helper.FormatCurrency(getGPELIGOFONDI_CASA().ToString()) + "€)";
}
if (getGPELIGOTITOLI_CASA() != 0)
{
nota += (getCCN_CASA() != 0 || getGPELIGOFONDI_CASA() != 0) ? ", " : "";
nota += "della liquidità sottostante la GP Eligo Titoli (" + Helper.FormatCurrency(getGPELIGOTITOLI_CASA().ToString()) + "€)";
}
nota += ". ";
}
return nota;
}
public virtual string GetNota2()
{
string nota = "";
// 20181009 AC
//if (getPropostaCCN_CASA() != 0 || getPropostaGPELIGOFONDI_CASA() != 0 || getPropostaGPELIGOTITOLI_CASA() != 0)
if (getPropostaCCN_CASA() != 0 || getPropostaGPELIGOFONDI_CASA() != 0 || getPropostaGPELIGOTITOLI_CASA() != 0 || getPropostaTUOFOGLIO_CASA() != 0)
//--20181009 AC
{
nota += "Il controvalore del portafoglio " + (datiSeiUnico.flagAdeguatezzaPro() ? "proposto" : "prospettico") + " esclude il saldo negativo ";
if (getPropostaCCN_CASA() != 0)
nota += "dei conti correnti (" + Helper.FormatCurrency(getTotaleNonRappr().ToString()) + " €)";
// 20181009 AC
if (getPropostaTUOFOGLIO_CASA() != 0)
{
nota += getCCN_CASA() != 0 ? ", " : "";
nota += "della liquidità sottostante Il Mio Foglio (" + Helper.FormatCurrency(getPropostaTUOFOGLIO_CASA().ToString()) + "€)";
}
//--20181009 AC
if (getPropostaGPELIGOFONDI_CASA() != 0)
{
nota += getCCN_CASA() != 0 ? ", " : "";
nota += "della liquidità sottostante la GP Eligo Fondi (" + Helper.FormatCurrency(getPropostaGPELIGOFONDI_CASA().ToString()) + "€)";
}
if (getGPELIGOTITOLI_CASA() != 0)
{
nota += (getPropostaCCN_CASA() != 0 || getPropostaGPELIGOFONDI_CASA() != 0) ? ", " : "";
nota += "della liquidità sottostante la GP Eligo Titoli (" + Helper.FormatCurrency(getPropostaGPELIGOTITOLI_CASA().ToString()) + "€)";
}
nota += ". ";
}
return nota;
}
public virtual string GetNota3()
{
foreach (var item in datiSeiUnico.propostaUnit().dettaglioOperazioni.elencoDettagliOperazioni)
{
foreach (var i in item.listaOperzioni)
{
if (i.investi != 0) return "";
}
}
string nota = "A prescindere dai singoli indicatori di rischio relativi al patrimonio derivante dalla presente proposta (";
nota += "\"portafoglio proposto\"), la proposta risulta adeguata in quanto contiene esclusivamente operazioni di vendita ";
nota += "/ liquidazione / riscatto, che non sono oggetto di valutazione di adeguatezza. ";
return nota;
}
public virtual string GetNota4()
{
string nota = "";
var GCproposto = datiSeiUnico.propostaUnit().stDettaglioProposta.copertura;
var coperturaDeltaRM = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("RM")).coperturaDelta;
var coperturaDeltaRC = datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.FirstOrDefault(x => x.idDescIndicatore.Equals("RC")).coperturaDelta;
var GCattuale = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura;
bool coperturaAdeguatezza = GCproposto < 90 & coperturaDeltaRM.Equals("100.00");
var varProposto = datiSeiUnico.propostaUnit().stDettaglioProposta.rischioMercato;
var varAttuale = Convert.ToDecimal(datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio.valoreVaR);
var varMax = datiSeiUnico.piramideModelloUnit().questionarioMifid.profileVarMax;
bool prospetticoMigliorativoVar = varProposto < varAttuale & varProposto > varMax;
var rischioCreditoProposto = datiSeiUnico.propostaUnit().stDettaglioProposta.rischioCredito;
var rischioCreditoMax = Convert.ToDecimal(datiSeiUnico.piramideModelloUnit().questionarioMifid.profileClassRcId);
var rischioAttuale = datiSeiUnico.rischioUnit().adeguatezza.adeguatezzaTopBean.datiPortafoglio.classeRischioCredito;
bool prospetticoMigliorativoRC = rischioCreditoProposto < rischioAttuale & rischioCreditoProposto > rischioCreditoMax;
string adeguata = datiSeiUnico.flagAdeguatezzaPro() ?
"effettuate sia coerente con la soglia massima associata al suo profilo finanziario" :
"da lei richieste al suo private banker sia coerente con la soglia massima associata al suo profilo finanziario";
if (prospetticoMigliorativoVar || prospetticoMigliorativoRC || coperturaAdeguatezza)
{
nota = "La valutazione di adeguatezza in termini di ";
if (prospetticoMigliorativoVar || coperturaAdeguatezza)
nota += "Rischio Mercato (VaR) " + (prospetticoMigliorativoRC || coperturaAdeguatezza ? "e " : "");
if (prospetticoMigliorativoRC || coperturaAdeguatezza)
nota += "Rischio Credito ";
nota += "è stata effettuata verificando che ";
if (prospetticoMigliorativoVar || coperturaAdeguatezza)
nota += "il livello di Rischio Mercato (VaR) delle sole operazioni dinvestimento " + adeguata + (prospetticoMigliorativoRC || coperturaAdeguatezza ? " e che " : "");
if (prospetticoMigliorativoRC || coperturaAdeguatezza)
nota += "la Classe di Rischio Credito delle sole operazioni dinvestimento " + adeguata;
nota += ". ";
}
return nota;
}
public virtual string GetNota5()
{
string nota = "";
var RM = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.AsEnumerable().FirstOrDefault(o => o.idDescIndicatore == "RM").copertura.Equals("100.00");
var RC = !datiSeiUnico.propostaUnit().stAdequatezza.listaDettagliAdeguatezza.AsEnumerable().FirstOrDefault(o => o.idDescIndicatore == "RC").copertura.Equals("100.00");
if (!datiSeiUnico.flagAdeguatezzaPro() && (RM || RC))
{
nota += "Il patrimonio derivante dalle operazioni da lei richieste al suo private banker (\"portafoglio prospettico\") risulta non adeguato al suo profilo finanziario in termini di " +
(RM ? RC ? "Rischio Mercato (VaR) e di Rischio Credito" : "Rischio Mercato (VaR)" : RC ? "Rischio Credito" : "") +
", in quanto le operazioni da lei richieste al suo private banker hanno ad oggetto uno o più prodotti per cui non è disponibile " +
(RM ? RC ? "il relativo livello di Rischio Mercato (VaR) e la relativa classe di Rischio Credito" : "il relativo livello di Rischio Mercato (VaR)" : RC ? "la relativa classe di Rischio Credito" : "") +
".";
}
return datiSeiUnico.FormatBanca(nota);
}
public virtual string GetNota6()
{
string nota = string.Empty;
if (datiSeiUnico.propostaUnit().stAdequatezza.flagAdeguatezzaMIFIDPro)
{
nota += "La valutazione di adeguatezza del patrimonio derivante dalla presente proposta (\"portafoglio proposto\") ";
nota += "non è necessaria in quanto tutti i prodotti oggetto delle operazioni di investimento effettuate non sono ";
nota += "soggetti alla valutazione di adeguatezza MiFID. ";
}
return nota;
}
public virtual string GetNota7()
{
string nota = string.Empty;
if (datiSeiUnico.propostaUnit().stAdequatezza.flagVarEccessivamenteAdeguatoPro)
{
nota += "Il patrimonio derivante dalla presente proposta (\"portafoglio proposto\") risulta adeguato al suo profilo ";
nota += "finanziario. Le segnaliamo, tuttavia, che il livello di Rischio Mercato (VaR) del patrimonio derivante dalla ";
nota += "presente proposta (\"portafoglio proposto\") si posiziona su un valore sensibilmente inferiore rispetto alla ";
nota += "soglia minima attribuita al suo profilo finanziario. ";
}
return nota;
}
public virtual decimal getCCN_CASA()
{
return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.contoCorrenteNegativo;
}
public virtual decimal getTotaleNonRappr()
{
return datiSeiUnico.patrimonioUnit().patrimonioCasa.esposizioneValutariaTutte.distribuzione.totaleNonRappr;
}
public virtual decimal getGPELIGOFONDI_CASA()
{
return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.liqEligoFondiNeg;
}
public virtual decimal getGPELIGOTITOLI_CASA()
{
return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.liqEligoTitoliNeg;
}
public virtual decimal getPropostaCCN_CASA()
{
return datiSeiUnico.propostaUnit().stDettaglioProposta.contoCorrenteNegativo;
}
public virtual decimal getPropostaGPELIGOFONDI_CASA()
{
return datiSeiUnico.propostaUnit().stDettaglioProposta.liqEligoFondiNeg;
}
public virtual decimal getPropostaGPELIGOTITOLI_CASA()
{
return datiSeiUnico.propostaUnit().stDettaglioProposta.liqEligoTitoliNeg;
}
// 20181009 AC
public virtual decimal getTUOFOGLIO_CASA()
{
return datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.liqFogliNeg;
}
public virtual decimal getPropostaTUOFOGLIO_CASA()
{
return datiSeiUnico.propostaUnit().stDettaglioProposta.liqFogliNeg;
}
//--20181009 AC
//20180907 AC
private double xPosRC(string val)
{
double retVal = 0;
switch (val.ToLower())
{
case "classe a": retVal = 4.385; break;
case "classe b": retVal = 13.155; break;
case "classe c": retVal = 21.925; break;
case "classe d": retVal = 30.695; break;
default: retVal = 0; break;
}
return retVal;
}
// xVal = 4.375f; // middle of classe A
//}
//else if (item["RischioCreditoString"].ToString().ToLower() == "classe b")
//{
// xVal = 13.125f; // middle of classe B
//}
//else if (item["RischioCreditoString"].ToString().ToLower() == "classe c")
//{
// xVal = 21.875f; // middle of classe C
//}
//else if (item["RischioCreditoString"].ToString().ToLower() == "classe d")
//{
// xVal = 26.25f; // middle of classe D
}
}