using System; using Consulenza.ReportWriter.Business; using Consulenza.ReportWriter.Business.OBJ_PDF; using System.Data; using Consulenza.ReportCommon; using System.Collections.Generic; using Consulenza.ReportWriter.Manager.Integration; using Consulenza.ReportWriter.Business.CHART_PDF; using Consulenza.ReportWriter.Business.Entity; using Consulenza.ReportWriter.Business.CUSTOM_PDF.ConsulenzaUnica; using System.Linq; namespace Consulenza.ReportWriter.Manager.Section.Unica { public class S59 : Entity.Section { /// ///S59.RiservaPortafoglioModelloVSProposto idSezione = 102 /// public S59(EnvironmentFacade environmentFacade, int idSection) : base(environmentFacade, idSection) { try { Draw(); } catch (Exception ex) { SectionLogger.Write("S59", 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( "Riserva: portafoglio modello vs " + (isAdeguata ? "proposto" : "prospettico"), EnvironmentFacade.RendererFacade.XLeftLimit, EnvironmentFacade.RendererFacade.YUpperLimit, EnvironmentFacade.ReportEnvironment.FontFamily); AddElement(intestazione.ToElement()); if (dati.Tables["assetClass"].Rows.Count > 0) { DataTable dtOrdinamento = dati.Tables["assetClass"].AsEnumerable().OrderBy(l => l.Field("Ordinamento")).CopyToDataTable(); 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(15)); var tabellaCtv = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dati.Tables["labelControvalore"]) { Style = Style.ConsulenzaUnica, Header = false, Footer = false, AlternateRow = false, RowHeight = 28, ShowSeparationLines = false, WhiteSpacesHorizontalSeparator = true, HideLastSeparationLine = true }; tabellaCtv.Columns.Add(new ColumnPDF("ControvalorepropostoString", 130, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo, "ControvalorepropostoString", "") { FontSize = 7, DeltaYContent = -1 }); tabellaCtv.Columns.Add(new ColumnPDF("Controvaloreproposto", 130, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "Controvaloreproposto", "") { HeaderFontSize = 7, FontBold = false, PaddingRight = 10, DeltaYContent = -1 }); tabellaCtv.Columns.Add(new ColumnPDF("AderenzaportafogliomodelloString", 130, HorizontalAlignmentType.Sinistra, true, true, 7, ColumnType.Testo, "AderenzaportafogliomodelloString", "") { FontSize = 7, PaddingLeft = 5, DeltaYContent = -1 }); tabellaCtv.Columns.Add(new ColumnPDF("Aderenzaportafogliomodello", 130, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Testo, "Aderenzaportafogliomodello", "") { HeaderFontSize = 7, FontBold = false, DeltaYContent = -1, PaddingRight = 4 }); AddElement(tabellaCtv); } AddElement(new SpacePDF(8)); string valore = isControvalore() ? "(€)" : "(%)"; AddElement(new FormattedTextAreaPDF(isAssetClass() ? "Asset class" : "Macro asset class", EnvironmentFacade.RendererFacade.XLeftLimit, 130) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontBold = true, FontSize = 7, FontColor = ColorPDF.ConsulenzaUnica_Rosso, AutoIncrementYWritable = false, BackGroundMarginLeft = 5 }); AddElement(new FormattedTextAreaPDF("Portafoglio modello " + valore, EnvironmentFacade.RendererFacade.XLeftLimit + 133.5f, 190) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontBold = true, FontSize = 7, FontColor = ColorPDF.ConsulenzaUnica_Rosso, AutoIncrementYWritable = false, BackGroundMarginLeft = 5 }); AddElement(new FormattedTextAreaPDF("Portafoglio " + ( isAdeguata ? "proposto " : "prospettico ") + valore, EnvironmentFacade.RendererFacade.XLeftLimit + 327.5f, 190) { BackGroundColor = ColorPDF.Standard_Grigio_SfondoColonnaTabella, FontBold = true, FontSize = 7, FontColor = ColorPDF.ConsulenzaUnica_Rosso, BackGroundMarginLeft = 5 }); //340 = + 145 + 195 #region ASSET var tabellaAsset = new TablePDF(EnvironmentFacade.RendererFacade.XLeftLimit, dtOrdinamento) { Style = Style.ConsulenzaUnica, Header = false, Footer = false, AlternateRow = false, RowHeight = 28, ShowSeparationLines = false }; tabellaAsset.Columns.Add(new ColumnPDF("descrizione", 145, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Testo, "Descrizione", "") { HeaderFontSize = 7, FontSize = 7 }); tabellaAsset.Columns.Add(new ColumnPDF("portafogliomodello", 179, HorizontalAlignmentType.Destra, false, false, 7, ColumnType.Objectpdf, "PercentualeControvaloreModello", "") { HeaderPaddingLeft = 5, HeaderFontSize = 7, DeltaYContent = 2, FontSize=7 }); tabellaAsset.Columns.Add(new ColumnPDF("portafoglioproposto", 180, HorizontalAlignmentType.Sinistra, false, false, 7, ColumnType.Objectpdf, "PercentualeControvaloreProposto", "") { HeaderPaddingLeft = 5, HeaderFontSize = 7, PaddingLeft = 3.5f, DeltaYContent = 2, FontSize = 7 }); int o = 0; var list = new List(); list.Add(Convert.ToDouble(dati.Tables["assetClass"].AsEnumerable().Max(x => x["PercentualeControvaloreModello"]))); list.Add(Convert.ToDouble(dati.Tables["assetClass"].AsEnumerable().Max(x => x["PercentualeControvaloreProposto"]))); var max = (float)Helper.Round(list.Max()); float larghezzaBarra = 0; float deltaXBarra = 0; var width = 0; foreach (DataRow row in dtOrdinamento.Rows) { var colore = new ColorPDF(Convert.ToInt32(row["Red"]), Convert.ToInt32(row["Green"]), Convert.ToInt32(row["Blue"])); #region barra colonna Portafogliomodello width = tabellaAsset.Columns[1].Width - (isControvalore() ? 50 : 20); larghezzaBarra = Helper.GetWidthProportional(Convert.ToDouble(row["PercentualeControvaloreModello"]) == 0 ? (float)0.01 : (float)Convert.ToDouble(row["PercentualeControvaloreModello"]), max, width); /**************************** Modifica aladdin 17062021 - Andrea *************************************************************************/ //deltaXBarra = Convert.ToDouble(row["PercentualeControvaloreModello"]) == 0 ? -larghezzaBarra + 10 : -larghezzaBarra + (isControvalore() ? 0 : 7); deltaXBarra = Convert.ToDouble(row["ValoreAttuale"]) == 0 ? larghezzaBarra + 5 : larghezzaBarra + (isControvalore() ? 0 : 7); tabellaAsset.Columns[1].HorizontalAlignment = HorizontalAlignmentType.Sinistra; /**************************************************************************************************************************************/ if (Convert.ToDouble(row["PercentualeControvaloreModello"]) == 0) { tabellaAsset.Cells[1, o].ValueObjectList = new List() { new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreModello"].ToString()) : Helper.FormatDecimal(row["PercentualeControvaloreModello"].ToString(), 2), deltaXBarra-10, isControvalore()? 50 : 35) { DeltaY = 4, /**************************** Modifica aladdin 17062021 - Andrea *************************************************************************/ //TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right, /*****************************************************************************************************************************************/ DeltaX = isControvalore() ? deltaXBarra+20 : deltaXBarra+5, FontSize = 7 }, new RectanglePDF(12, 1 , ColorPDF.Bianco){DeltaY = 4} }; } else { tabellaAsset.Cells[1, o].ValueObjectList = new List() { new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreModello"].ToString()) : Helper.FormatDecimal(row["PercentualeControvaloreModello"].ToString(), 2), deltaXBarra, isControvalore()? 50 : 35) { DeltaY = 4, /**************************** Modifica aladdin 17062021 - Andrea *************************************************************************/ //TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Left, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right, /*****************************************************************************************************************************************/ DeltaX = deltaXBarra, FontSize = 7 }, new RectanglePDF(12, larghezzaBarra , colore){DeltaY = 4} }; } #endregion #region barra colonna Portafoglioattuale width = tabellaAsset.Columns[2].Width - (isControvalore() ? 50 : 20); larghezzaBarra = Helper.GetWidthProportional(Convert.ToDouble(row["PercentualeControvaloreProposto"]) == 0 ? (float)0.01 : (float)Convert.ToDouble(row["PercentualeControvaloreProposto"]), max, width); deltaXBarra = Convert.ToDouble(row["PercentualeControvaloreProposto"]) == 0 ? isControvalore() ? larghezzaBarra -20 : larghezzaBarra-10 : isControvalore() ? larghezzaBarra + 3 :larghezzaBarra - 5; if (Convert.ToDouble(row["PercentualeControvaloreProposto"]) == 0) { tabellaAsset.Cells[2, o].ValueObjectList = new List() { new RectanglePDF(12, 1 , ColorPDF.Bianco){DeltaY = 4}, new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreProposto"].ToString()) :Helper.FormatDecimal(row["PercentualeControvaloreProposto"].ToString(), 2), deltaXBarra-10, isControvalore()? 50 : 35) { DeltaY = 4, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right, DeltaX = isControvalore() ? deltaXBarra-10 : deltaXBarra-8, FontSize = 7 } }; } else { tabellaAsset.Cells[2, o].ValueObjectList = new List() { new RectanglePDF(12, larghezzaBarra , colore){DeltaY = 4}, new FormattedTextAreaPDF(isControvalore() ? Helper.FormatCurrency(row["PercentualeControvaloreProposto"].ToString()) :Helper.FormatDecimal(row["PercentualeControvaloreProposto"].ToString(), 2), deltaXBarra, isControvalore()? 50 : 35) { DeltaY = 4, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Right, DeltaX = deltaXBarra, FontSize = 7 } }; } #endregion o++; } #endregion AddElement(new SpacePDF(5)); AddElement(tabellaAsset); string note = "*"; if (getNota1().Length > 0) { tabellaAsset.Notes.Add( new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, getNota1(), new[] { "" }, string.Empty, TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign = ceTe.DynamicPDF.TextAlign.Justify } ); //captionAderenzaModello.Text += note; //captionCtvProposto.Text += note; //note += "*"; } if (getNota2().Length > 0) { tabellaAsset.Notes.Add( new TableNotePDF(TableNotePDF.TableNotePositionType.PièDiTabella, getNota2(), new[] { "" }, string.Empty, TableNotePDF.TableNoteAsteriskPositionType.CorpoTabella) { FontSize = 6, TextHorizontalAlign= ceTe.DynamicPDF.TextAlign.Justify } ); //captionVarProposto.Text += note; note += "*"; } } } /// /// Recupera i dati necessari alla Section restituendo un DataTable. /// /// protected sealed override DataTable GetDataTable() { return null; } /// /// Recupera i dati necessari alla Section restituendo un DataSet. /// /// protected sealed override DataSet GetDataSet() { var ds = new DataSet(); ds.Tables.Add(new DataTable("labelControvalore")); ds.Tables.Add(new DataTable("assetClass")); var progettoRiserva = datiSeiUnico.pianificazioneUnit().pianificazioneOrizzontale.FirstOrDefault(o => o.portafoglioModello.area.Equals("Ris")); var progettoRiservaPro = datiSeiUnico.propostaUnit().stPianificazioneVerticale.stAreePianificazione.FirstOrDefault(o => o.area.Equals("Ris")).progetti.FirstOrDefault(); var valoreCtvTotaleProposto = progettoRiservaPro.ctvProgettoPro; var valoriAssetProposto = isAssetClass() ? datiSeiUnico.propostaUnit().assetClass.distribuzioneAree.FirstOrDefault(o => o.area.Equals("Ris")) //.ToList().FirstOrDefault(o => o.chiaveProgetto != null && o.chiaveProgetto == item.chiaveProgetto.ToString()).distribuzione : datiSeiUnico.propostaUnit().macroAssetClass.distribuzioneAree.FirstOrDefault(o => o.area.Equals("Ris")); var valoriAssetModello = isAssetClass() ? progettoRiserva.portafoglioModello.distribuzioniPtfModello.Where(l => l.asset.livello == 2).ToList() : progettoRiserva.portafoglioModello.distribuzioniPtfModello.Where(l => l.asset.livello == 1).ToList(); var displayInfoM = datiSeiUnico.displayInfos().macroAssetDisplayInfos.ToList(); var displayInfoA = datiSeiUnico.displayInfos().assetDisplayInfos.ToList(); #region patrimonio controvalore ds.Tables["labelControvalore"].Columns.Add("ControvalorepropostoString", typeof(string)); ds.Tables["labelControvalore"].Columns.Add("Controvaloreproposto", typeof(string)); ds.Tables["labelControvalore"].Columns.Add("AderenzaportafogliomodelloString", typeof(string)); ds.Tables["labelControvalore"].Columns.Add("Aderenzaportafogliomodello", typeof(string)); ds.Tables["labelControvalore"].Rows.Add( "Controvalore " + (datiSeiUnico.flagAdeguatezzaPro() ? " proposto (€)" : "prospettico (€)") + (getNota1().Length > 0 && getNota1().Contains("Grado") ? "*" : ""), Helper.FormatCurrency(valoriAssetProposto.distribuzione.totaleCtv.ToString()), "Aderenza al portafoglio
modello (%)" + (getNota1().Length > 0 ? "*" : ""), Helper.FormatDecimal(progettoRiserva.aderenza.valoreAderenza.ToString(), 2)); ds.Tables["labelControvalore"].Rows.Add( "VaR " + (datiSeiUnico.flagAdeguatezzaPro() ? " proposto (%)" : "prospettico (%)") + (getNota2().Length > 0 ? "*" : ""), progettoRiservaPro.varProgettoPro, "VaR portafoglio modello (%)", Helper.FormatDecimal(progettoRiserva.varPianificatoDec, 2)); #endregion #region asset ds.Tables["assetClass"].Columns.Add(new DataColumn("Codice", typeof(string))); ds.Tables["assetClass"].Columns.Add(new DataColumn("Descrizione", typeof(string))); ds.Tables["assetClass"].Columns.Add(new DataColumn("Red", typeof(int))); ds.Tables["assetClass"].Columns.Add(new DataColumn("Green", typeof(int))); ds.Tables["assetClass"].Columns.Add(new DataColumn("Blue", typeof(int))); ds.Tables["assetClass"].Columns.Add(new DataColumn("PercentualeControvaloreModello", typeof(decimal))); ds.Tables["assetClass"].Columns.Add(new DataColumn("PercentualeControvaloreProposto", typeof(decimal))); ds.Tables["assetClass"].Columns.Add(new DataColumn("Ordinamento", typeof(int))); #region portafoglio modello if (isAssetClass()) { foreach (var valore in from c in displayInfoA join l in valoriAssetModello on c.key equals l.asset.asset // orderby c.value.order select new { l.asset.asset, l.asset.descrizione, new ColorPDF(c.value.fill).Red, new ColorPDF(c.value.fill).Green, new ColorPDF(c.value.fill).Blue, l.percentuale, c.value.order }) { ds.Tables["assetClass"].Rows.Add( valore.asset, valore.descrizione, valore.Red, valore.Green, valore.Blue, isControvalore() ? valore.percentuale * valoreCtvTotaleProposto : valore.percentuale * 100, 0,//portafoglio proposto che viene caricato successivamente valore.order ); } } else { foreach (var valore in from c in displayInfoM join l in valoriAssetModello on c.key equals l.asset.asset //orderby c.value.order select new { l.asset.asset, l.asset.descrizione, new ColorPDF(c.value.fill).Red, new ColorPDF(c.value.fill).Green, new ColorPDF(c.value.fill).Blue, l.percentuale, c.value.order }) { ds.Tables["assetClass"].Rows.Add( valore.asset, valore.descrizione, valore.Red, valore.Green, valore.Blue, isControvalore() ? valore.percentuale * valoreCtvTotaleProposto : valore.percentuale * 100, 0,//portafoglio proposto che viene caricato successivamente valore.order ); } } #endregion #region portafoglioproposto if (isAssetClass()) { foreach (var valore in from c in displayInfoA join l in valoriAssetProposto.distribuzione.elencoSlice on c.key equals l.codice // orderby c.value.order select new { l.codice, l.descrizione, new ColorPDF(c.value.fill).Red, new ColorPDF(c.value.fill).Green, new ColorPDF(c.value.fill).Blue, l.pesoCC, l.ctvCC, c.value.order }) { if (ds.Tables["assetClass"].AsEnumerable().FirstOrDefault(l => l.Field("Codice") == valore.codice) != null) { ds.Tables["assetClass"].Select(string.Format("[Codice] = '{0}'", valore.codice)) .ToList() .ForEach(r => { r["PercentualeControvaloreProposto"] = isControvalore() ? Convert.ToDecimal(valore.ctvCC) : Convert.ToDecimal(valore.pesoCC * 100); }); } else { ds.Tables["assetClass"].Rows.Add( valore.codice, valore.descrizione, valore.Red, valore.Green, valore.Blue, 0,//portafoglio modello per un item che non è presente isControvalore() ? valore.ctvCC : valore.pesoCC * 100, valore.order ); } } } else { foreach (var valore in from c in displayInfoM join l in valoriAssetProposto.distribuzione.elencoSlice on c.key equals l.codice // orderby c.value.order select new { l.codice, l.descrizione, new ColorPDF(c.value.fill).Red, new ColorPDF(c.value.fill).Green, new ColorPDF(c.value.fill).Blue, l.pesoCC, l.ctvCC, c.value.order }) { if (ds.Tables["assetClass"].AsEnumerable().FirstOrDefault(l => l.Field("Codice") == valore.codice) != null) { ds.Tables["assetClass"].Select(string.Format("[Codice] = '{0}'", valore.codice)) .ToList() .ForEach(r => { r["PercentualeControvaloreProposto"] = isControvalore() ? valore.ctvCC : valore.pesoCC * 100; }); } else { ds.Tables["assetClass"].Rows.Add( valore.codice, valore.descrizione, valore.Red, valore.Green, valore.Blue, isControvalore() ? valore.ctvCC : valore.pesoCC * 100, valore.order ); } } } #endregion #endregion return ds; } public virtual string getTesto1() { bool isAdeguata = datiSeiUnico.flagAdeguatezzaPro(); string adeguataStr = isAdeguata ? "la presente proposta" : "le operazioni da lei richieste al suo private banker"; return isAssetClass() ? !isControvalore() ? //"In questa scheda è riportato il confronto, sulla base delle principali asset class finanziarie, tra il patrimonio che, secondo " + adeguataStr + " è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini percentuali, a ciascuna asset class, e con indicazione del grado di Aderenza." : "In questa scheda è riportato il confronto, sulla base delle principali asset class finanziarie, tra il patrimonio che secondo la presente proposta è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini di controvalore, a ciascuna asset class, e con indicazione del grado di Aderenza." : isControvalore() ? "In questa scheda è riportato il confronto, sulla base delle principali macro asset class finanziarie, tra il patrimonio che secondo la presente proposta è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini di controvalore, a ciascuna macro asset class, e con indicazione del grado di Aderenza." : "In questa scheda è riportato il confronto, sulla base delle principali macro asset class finanziarie, tra il patrimonio che secondo la presente proposta è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini percentuali, a ciascuna macro asset class, e con indicazione del grado di Aderenza."; /**************************** Modifica aladdin 17062021 - Andrea *************************************************************************/ "In questa scheda è riportato il confronto, sulla base delle principali asset class finanziarie, tra il patrimonio che, secondo " + adeguataStr + " è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini percentuali, a ciascuna asset class, e con indicazione del grado di Aderenza." : "In questa scheda è riportato il confronto, sulla base delle principali asset class finanziarie, tra il patrimonio che secondo la presente proposta è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini di controvalore, a ciascuna asset class, e con indicazione del grado di Aderenza." : isControvalore() ? "In questa scheda è riportato il confronto, sulla base delle principali macro asset class finanziarie, tra il patrimonio che secondo la presente proposta è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini di controvalore, a ciascuna macro asset class, e con indicazione del grado di Aderenza." : "In questa scheda è riportato il confronto, sulla base delle principali macro asset class finanziarie, tra il patrimonio che secondo la presente proposta è destinato all'area Riserva, e il relativo portafoglio modello, con evidenza dell'esposizione, in termini percentuali, a ciascuna macro asset class."; /*****************************************************************************************************************************************/ } //note da fare public virtual string getNota1() { // Nota Portafoglio Consigliato var aderenza = datiSeiUnico.pianificazioneUnit().pianificazioneOrizzontale.FirstOrDefault(o => o.portafoglioModello.area.Equals("Ris")).aderenza.portafoglioConsiderato; var gradoCoperturaAllocation = datiSeiUnico.pianificazioneUnit().pianificazioneVerticale.varInfos.stat.copertura; string nota = ""; if (gradoCoperturaAllocation < 100) { string var = isAssetClass() ? "asset" : "macro asset"; nota += string.Format("Grado di copertura prodotti rappresentabili in " + var + " allocation (%): {0}.", Helper.FormatDecimal(gradoCoperturaAllocation.ToString(), 2)); } if (aderenza < 100) nota += string.Format(" Portafoglio considerato nel calcolo dell'aderenza (%): {0}.", Helper.FormatDecimal(aderenza.ToString(), 2)); return nota; } public virtual string getNota2() { var coperturaRischioMercato = (isAssetClass() ? datiSeiUnico.propostaUnit().assetClass.distribuzione.coverageCC : datiSeiUnico.propostaUnit().macroAssetClass.distribuzione.coverageCC)*100; string nota = ""; if (coperturaRischioMercato < 100) { nota = string.Format("Grado di copertura prodotti in termini di Rischio Mercato (VaR %): {0}.", Helper.FormatDecimal(coperturaRischioMercato.ToString(), 2)); } return nota; } public virtual bool isControvalore() { return !GetOption().Valore; } public virtual bool isAssetClass() { return GetOption().Valore; } } }