using System; using System.Web; using System.Text; using System.Data; using System.Collections; using System.Collections.Generic; namespace PDFGenerator.BusinessLayer.DataSection { public class DSFD170RischioDiversificazione : IDataSection { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private TipoReport _tiporeport; /// /// Tipologia report. /// public TipoReport TipoReport { get { return _tiporeport; } set { _tiporeport = value; } } public DataSectionResult getDataSection(List tabelleSessione, string querySql, DataThread dataThread) { try { DataSectionResult dsr = new DataSectionResult(); FormatNum conv = new FormatNum(); DataSetS170 ds170 = new DataSetS170(); DataSetS170.RischioDiversificazioneRow dr; DataSetS170.RischioPatrimonioFinanziarioRow patrimonioFinanziario; DataSetS170.RischioDiversificazioneTableRow rischioDiversificazione; //MIFID2 Nei casi particolari sulla rischiosità e l'adeguatezza, il valore di Rischio Mercato, se 0, deve essere impostato a "n.c." string preQuerySql = dataThread.Periodico ? "[C6MartPeriodico].[PL_D_S178CasiParticolari]" : "[C6Mart].[PL_D_S178CasiParticolari]"; int IdCaso = 0; DataTable dtTestoKO = SectionManager.GetDataSection(tabelleSessione, preQuerySql, dataThread); if (dtTestoKO.Rows.Count > 0) IdCaso = (int)dtTestoKO.Rows[0]["ID"]; //--MIFID2 //MIFID2 CR Napolitano: va inserita una nota sul Limite Massimo (su Complessità), quindi il numero di asterischi viene calcolato in base alle note precedenti. int notaComplessita = dataThread.TipoReport.ToUpper().Equals("DIAGNOSI") ? 1 : 0; ds170.RischioDiversificazione.Columns["Copertura"].Caption = "Copertura
(%)"; if (dataThread.TipoReport.ToUpper().Equals("DIAGNOSI")) ds170.RischioDiversificazioneTable.Columns["Controvalore"].Caption = "Controvalore* (€)"; DataTable dt = SectionManager.GetDataSection(tabelleSessione, querySql, dataThread); if (dt.Rows.Count > 0) { for (int r = 0; r < (dt.Rows.Count < 3 ? 1 : 3); r++) //for (int r = 0; r < dt.Rows.Count; r++) { DataRow row = dt.Rows[r]; dr = ds170.RischioDiversificazione.NewRischioDiversificazioneRow(); dr.patrimonio = row["patrimonio"].ToString(); dr.var = Convert.ToDecimal(row["var"]); if (row["coperturaString"] != DBNull.Value) dr.copertura = row["coperturaString"].ToString(); else dr.copertura = conv.ConvertNum(row["copertura"]); //dr.diversificazione = Convert.ToDecimal(row["diversificazione"]); if (row["diversificazione"] != DBNull.Value) dr.diversificazione = Convert.ToDecimal(row["diversificazione"]); else dr.diversificazione = 0; //MIFID2 20180521 dr.ordine = Convert.ToInt32(row["ordine"]); //--MIFID2 //Adriano 20180405 da prendere dalla stored procedure dr.complessita = row["complessita"].ToString(); //--Adriano 20180405 ds170.RischioDiversificazione.Rows.Add(dr); patrimonioFinanziario = ds170.RischioPatrimonioFinanziario.NewRischioPatrimonioFinanziarioRow(); int profilo_code = Convert.ToInt32(row["profiloCode"]); //patrimonioFinanziario.descrizioneProfilo = "Profilo Cliente: " + profilo_code.ToString(); string valoreProfilo = getProfiloName(profilo_code); patrimonioFinanziario.descrizioneProfilo = "Profilo Cliente: " + valoreProfilo; patrimonioFinanziario.valoreProfilo = profilo_code.ToString(); //20180914 AC patrimonioFinanziario.var = (dataThread.IsProffesionalClient && profilo_code == 5) ? 50.00M : (row["var_profilo"].ToString() != string.Empty ? Convert.ToDecimal(SoglieVar.ConvOld(row["var_profilo"])) : 0.00M); ds170.RischioPatrimonioFinanziario.Rows.Add(patrimonioFinanziario); rischioDiversificazione = ds170.RischioDiversificazioneTable.NewRischioDiversificazioneTableRow(); rischioDiversificazione.patrimonio = row["patrimonio"].ToString(); rischioDiversificazione.ordine = Convert.ToInt32(row["ordine"]); //MIFID2 20180522 //20180904 Su segnalazione Napolitano, per i professionali va mostrata la complessità relativa al Patrimonio //// CR Napolitano, per i clienti professionali, la complessità deve essere posta a "n.a." //if (dataThread.IsProffesionalClient) //{ // rischioDiversificazione.complessita = "n.a."; //} //else //{ //Vanno sempre mostrati due asterischi per Diagnosi e uno per Monitoraggio che rimandano a una nota (ovviamente se non è un trattino) if (row["complessita"].ToString().Equals("-")) rischioDiversificazione.complessita = row["complessita"].ToString(); else { if (dataThread.TipoReport.ToUpper().Equals("DIAGNOSI")) { rischioDiversificazione.complessita = row["complessita"].ToString() + "**"; notaComplessita = 2; } else { rischioDiversificazione.complessita = row["complessita"].ToString() + "*"; notaComplessita = 1; } } //} //rischioDiversificazione.controvalore = Convert.ToDecimal(row["CTV_AGGREG"]).ToString(); rischioDiversificazione.controvalore = conv.ConvertNum(row["CTV_AGGREG"].ToString()); //MIFID2 20180718 Aggiunto per includere nel CTV del patrimonio Fideuram (riga 0) anche le altre voci, cc negativo, partite viaggianti, linea self if (r == 0) { decimal tot = Convert.ToDecimal(row["CTV_AGGREG"]) + //dataThread.PatrimonioBancaFideuramCtvAlNettoContoCorrente + dataThread.ContoCorrente + dataThread.PartiteViaggiantiInvestimento + dataThread.PartiteViaggiantiDisinvestimento + dataThread.TotalSelfNegCurrentAccountValue; rischioDiversificazione.controvalore = conv.ConvertNum(tot.ToString()); } //MIFID2 //#region Totale Patrimonio //decimal risorseFinanziarie = dataThread.PatrimonioBancaFideuramCtvAlNettoContoCorrente; //decimal CC = dataThread.ContoCorrente; //decimal investimentiInCorso = dataThread.PartiteViaggiantiInvestimento + dataThread.PartiteViaggiantiDisinvestimento; //decimal totale = risorseFinanziarie + CC + investimentiInCorso + dataThread.TotalSelfNegCurrentAccountValue; ////rowTableMonit.TotalePatrimonio = totale.ToString(); //rowTableMonit.TotalePatrimonio = conv.ConvertNum(totale); //#endregion if (row["CREDITRISK"] != DBNull.Value) { rischioDiversificazione.rischioCredito = UtilityBusinessLayer.GetRiskCreditClassName(row["CREDITRISK"].ToString()); } else //20180914 su segnalazione Napolitano //rischioDiversificazione.rischioCredito = "n.c."; rischioDiversificazione.rischioCredito = "n.a."; // MZ: Show n.c. as a value for VAR if there is no coverage if (row["varString"] != DBNull.Value) { rischioDiversificazione.varString = row["varString"].ToString(); } else { rischioDiversificazione.varString = conv.ConvertNum(row["var"], 2).ToString(); } //MIFID2 20180702 su richiesta Napolitano: se il rischio mercato è 0, portare a "n.c." nei casi Particolari 1 e 3 if (IdCaso == 1 || IdCaso == 3) { if (rischioDiversificazione.varString.Equals("0,00")) rischioDiversificazione.varString = "n.c."; } //--MIFID2 if (row["coperturaString"] != DBNull.Value) rischioDiversificazione.copertura = row["coperturaString"].ToString(); else rischioDiversificazione.copertura = conv.ConvertNum(row["copertura"]); //MIFID2 20180619 Gestione indicatore per patrimonio terzi e complessivo (per Diagnosi) che non viene restituito //rischioDiversificazione.diversificazione = Convert.ToDecimal(conv.ConvertNum(row["diversificazione"])).ToString(); if (row["diversificazione"] != DBNull.Value) rischioDiversificazione.diversificazione = Convert.ToDecimal(conv.ConvertNum(row["diversificazione"])).ToString(); else rischioDiversificazione.diversificazione = "-"; //--MIFID2 ds170.RischioDiversificazioneTable.Rows.Add(rischioDiversificazione); } //MIFID2 20180405 Inserimento ultima riga per la tabella, come richiesto nel documento MIFID II string maxLimQStr = dataThread.Periodico ? "[C6MartPeriodico].[PL_S170LimitiMassimi]" : "[C6Mart].[PL_S170LimitiMassimi]"; DataTable dtLimiteMassimo = SectionManager.GetDataSection(tabelleSessione, maxLimQStr, dataThread); rischioDiversificazione = ds170.RischioDiversificazioneTable.NewRischioDiversificazioneTableRow(); rischioDiversificazione.patrimonio = "Limite massimo profilo"; rischioDiversificazione.controvalore = "-"; rischioDiversificazione.rischioCredito = dtLimiteMassimo.Rows[0]["RischioCreditoMassimo"].ToString(); rischioDiversificazione.varString = dataThread.IsProffesionalClient && ds170.RischioPatrimonioFinanziario[0].valoreProfilo == "5" ? ds170.RischioPatrimonioFinanziario[0].var.ToString() : dtLimiteMassimo.Rows[0]["varMassimo"].ToString(); rischioDiversificazione.diversificazione = "-"; //MIFID2 CR Napolitano // Per i clienti professionali va impostato come "n.a." // altrimenti, se persona giuridica con delegati profilati, va riportata una nota sul Limite Massimo Complessità //rischioDiversificazione.complessita = dtLimiteMassimo.Rows[0]["Complessita"].ToString(); if (dataThread.Flgprof.ToUpper().Equals("S")) rischioDiversificazione.complessita = "n.a."; else { if (!dtLimiteMassimo.Rows[0]["Complessita"].ToString().Equals("-") && !dtLimiteMassimo.Rows[0]["Complessita"].ToString().Equals("n.d.")) { if (dataThread.Flagpg.Equals(1) && dataThread.Flagnqp.Equals("S") && dataThread.Flagprlrde.Equals("S")) { rischioDiversificazione.complessita = string.Concat(dtLimiteMassimo.Rows[0]["Complessita"].ToString(), new String('*', notaComplessita + 1)); } else rischioDiversificazione.complessita = dtLimiteMassimo.Rows[0]["Complessita"].ToString(); } else rischioDiversificazione.complessita = dtLimiteMassimo.Rows[0]["Complessita"].ToString(); } rischioDiversificazione.ordine = 4; ds170.RischioDiversificazioneTable.Rows.Add(rischioDiversificazione); //--MIFID2 20180405 decimal coperturaRisorseNonAllocate = dataThread.VaRRisorseNonAssociate; DataRow[] filtrata = ds170.RischioDiversificazione.Select("Copertura <> '100,00'"); bool _mostracolonnacopertura = filtrata.Length > 0 ? true : false; DataSetS170.ResultSetRow rs170; rs170 = ds170.ResultSet.NewResultSetRow(); rs170.MostraColonnaCopertura = _mostracolonnacopertura; ds170.ResultSet.AddResultSetRow(rs170); } dsr.DatiSezione = ds170; dsr.Esito = ds170.RischioDiversificazione.Rows.Count; return dsr; } catch (Exception ex) { try { logger.Error(string.Concat(ex.Message, " ", dataThread.CodiceFiscale)); } catch { } } return null; } private string getProfiloName(int profilo_code) { string valoreProfilo = string.Empty; #region SWITCH CODICI PROFILO switch (profilo_code) { case 1: valoreProfilo += " Prudente"; break; case 2: valoreProfilo += " Moderato"; break; case 3: valoreProfilo += " Equilibrato"; break; case 4: valoreProfilo += " Dinamico"; break; case 5: valoreProfilo += " Aggressivo"; break; default: break; } #endregion return valoreProfilo; } } }