2025-04-15 12:10:19 +02:00

309 lines
15 KiB
C#

using System;
using System.Web;
using System.Text;
using System.Data;
using System.Collections;
using System.Collections.Generic;
namespace PDFGenerator.BusinessLayer.DataSection
{
public class DSS170RischioDiversificazione : IDataSection
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private TipoReport _tiporeport;
/// <summary>
/// Tipologia report.
/// </summary>
public TipoReport TipoReport
{
get
{
return _tiporeport;
}
set
{
_tiporeport = value;
}
}
public DataSectionResult getDataSection(List<SessionStruct> 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 <BR> (%)";
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: Convert.ToDecimal(SoglieVar.ConvOld(row["var_profilo"]));
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;
}
}
}