RgpdComunicadosOperation.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using sage.ew.interficies;
7 using System.Data;
8 using sage.ew.global;
9 using sage.ew.db;
11 
12 namespace sage.addons.rgpd.Negocio
13 {
14  internal class RgpdComunicadosOperation
15  {
19  private static IRgpdComunicadosOperationProvider _ComunicadosManager
20  {
21  get
22  {
23  if (_oComunicadosManager == null)
24  _oComunicadosManager = getComunicadorsOperationProvider();
25  return _oComunicadosManager;
26  }
27  set { _oComunicadosManager = value; }
28  }
29  private static IRgpdComunicadosOperationProvider _oComunicadosManager = null;
30 
31 
36  private static IRgpdComunicadosOperationProvider getComunicadorsOperationProvider()
37  {
38  return new RgpdComunicadosManagerFiltrado(); //RgpdComunicadosManager();
39  //return new RgpdComunicadosOperationsProviderTest();
40  }
41 
48  internal static IRespuestaComunicado _MandarComunicadoDeSolicitudConsentimiento(object sender, string tcRutaFichero = "")
49  {
50  if (_ComunicadosManager != null)
51  {
52  return _ComunicadosManager._RgpdEnviarComunicado(eTipoPlantilla.RecogidaDatos.__ToSolicitudComunicado(sender, tcRutaFichero));
53  }
54  else
55  return null;
56  }
57 
64  internal static IRespuestaComunicado _MandarComunicadoDeConfirmacionSolicitudSupresion(object sender, string tcRutaFichero = "")
65  {
66  if (_ComunicadosManager != null)
67  {
68  return _ComunicadosManager._RgpdEnviarComunicado(eTipoPlantilla.Supresion.__ToSolicitudComunicado(sender, tcRutaFichero));
69  }
70  else
71  return null;
72  }
73 
80  internal static IRespuestaComunicado _MandarComunicadoDeNotificacionDeAcceso(object sender, string tcRutaFichero = "")
81  {
82  if (_ComunicadosManager != null)
83  {
84  return _ComunicadosManager._RgpdEnviarComunicado(eTipoPlantilla.Acceso.__ToSolicitudComunicado(sender, tcRutaFichero));
85  }
86  else
87  return null;
88  }
89 
96  internal static IRespuestaComunicado _MandarComunicadoDeEmisionPortabilidad(object sender, string tcRutaFichero = "")
97  {
98  if (_ComunicadosManager != null)
99  {
100  return _ComunicadosManager._RgpdEnviarComunicado(eTipoPlantilla.Portabilidad.__ToSolicitudComunicado(sender, tcRutaFichero));
101  }
102  else
103  return null;
104  }
105 
106  internal static IRespuestaProceso _ComunicadoMasivoSolicitudConsentimiento(string tcCodigoEntidad, IEnumerable<string> tlisCodigoInstancias)
107  {
108  //Datos generales para el comunicado
109  ISolicitudComunicado loSolicitud = new RgpdSolicitudComunicado();
110  loSolicitud._NombreOrigen = eTipoPlantilla.RecogidaDatos.__ObtenerNombreOrigen();
111  loSolicitud._CodigoPlantilla = eTipoPlantilla.RecogidaDatos.__ObtenerPlantilla();
112 
113  //Datos de tratamientos
114  List<ManteExtEntidades> lisInstancias = new List<ManteExtEntidades>();
115  List<IMante> lisInstanciasMante = new List<IMante>();
116 
117  //Recupero todas las instancias de tratamientos de entidades
118  tlisCodigoInstancias.ToList().ForEach(loCodigoInstancia =>lisInstancias.Add(new ManteExtEntidades(tcCodigoEntidad, loCodigoInstancia.TrimEnd())));
119 
120  //Ordeno por código de instacia
121  lisInstancias = lisInstancias.OrderBy(loEle => loEle._CodigoInstancia).ToList();
122 
123  //No es necesario => El Manager de comunicados esta decorado con una validación de permiso
125  //lisInstancias = lisInstancias.Where(loEle => loEle._NoEnviarComunicados == false).ToList();
126 
127  //Recupero los mantenimientos
128  lisInstancias.ForEach(loTratamiento => lisInstanciasMante.Add(loTratamiento._Mante));
129 
130  //Asigno los mantenimientos a la solicitud
131  loSolicitud._Mantenimientos = lisInstanciasMante;
132 
133  //Invoco a los comunicados
134  IRespuestaComunicado loRespuesta = _ComunicadosManager._RgpdEnviarComunicado(loSolicitud);
135 
136  //Creamos una instancia de respuesta
137  ResultadoProceso loResultadoProceso = new ResultadoProceso();
138 
139  if (loRespuesta._Ejecutado) //Si se ha procesado
140  {
141  //Ahora debo procesar los ficheros de respuesta
142  if (lisInstancias.Count == loRespuesta._RutasFicheros.Count())
143  {
144  OperationBroker loBrokerOperaciones = new OperationBroker();
145  string lcFicherosNoRecibidos = string.Empty;
146  bool llErroresPresentes = false;
147 
148  //Creamos las operaciones
149  foreach (ManteExtEntidades loInstanciaEntidad in lisInstancias)
150  {
151  int lnIndex = lisInstancias.FindIndex(loEle => loEle == loInstanciaEntidad);
152  string lcRuta = loRespuesta._RutasFicheros.ElementAt(lnIndex);
153 
154  if (String.IsNullOrWhiteSpace(lcRuta))
155  {
156  llErroresPresentes = true;
157  lcFicherosNoRecibidos += "No se ha generado fichero para " + loInstanciaEntidad._CodigoInstancia + Environment.NewLine;
158  }
159  else
160  {
161  loBrokerOperaciones._AddOperacion(new OperationAdjuntarSolicitudConsentimiento(loInstanciaEntidad, lcRuta));
162  }
163  }
164  loBrokerOperaciones._EjecutarOperaciones();
165 
166  loResultadoProceso._Estado = llErroresPresentes ? eResultadoProceso.CompletadoConErrores : eResultadoProceso.CompletadoCorrectamente;
167  loResultadoProceso._DetallesDelProceso = lcFicherosNoRecibidos;
168  }
169  else
170  {
171  loResultadoProceso._Estado = eResultadoProceso.Error;
172  loResultadoProceso._DetallesDelProceso = "La solicitud no se ha completado correctamente, los ficheros generados no concuerdan con las solicitudes.";
173  //Número de ficheros no concordante
174  //ew.functions.FUNCTIONS._MessageBox("La solicitud no se ha completado correctamente, los ficheros generados no concuerdan con las solicitudes.", caption: "RGPD Comunicados");
175  }
176  }
177  else
178  {
179  loResultadoProceso._Estado = eResultadoProceso.Error;
180  loResultadoProceso._DetallesDelProceso = "La solicitud no se ha podido completar: " +
181  Environment.NewLine + Environment.NewLine + loRespuesta._MessageError;
182 
184  //ew.functions.FUNCTIONS._MessageBox("La solicitud no se ha podido completar, los comunicados indican lo siguiente: " +
185  // Environment.NewLine + Environment.NewLine + loRespuesta._MessageError, caption: "RGPD Comunicados");
186  }
187 
188  return loResultadoProceso;
189  }
190 
191  private bool laEntidadPuedeRecibirComunicados(object toSender)
192  {
193  bool puedeRecibirComunicados = true;
194  if(toSender is ManteExtEntidades)
195  {
196  puedeRecibirComunicados = ((ManteExtEntidades)toSender)._NoEnviarComunicados;
197  }
198  return puedeRecibirComunicados;
199  }
200  }
201 
202  internal class ResultadoProceso : IRespuestaProceso
203  {
204  public eResultadoProceso _Estado
205  {
206  get { return estadoProceso; }
207  set { estadoProceso = value; }
208  }
209  private eResultadoProceso estadoProceso = eResultadoProceso.Indeterminado;
210 
211  public string _DetallesDelProceso
212  {
213  get { return _cDetallesDelProceso; }
214  set { _cDetallesDelProceso = value; }
215  }
216  private string _cDetallesDelProceso = string.Empty;
217 
218  public ResultadoProceso() { }
219  }
220 
221 
225  internal class TipoPlantillaInfoAttribute : Attribute
226  {
227 
234  public TipoPlantillaInfoAttribute(string tcNombreOrigen, string tcPlantillaPorDefecto, string tcCampoPlantilla)
235  {
236  SetProperties(tcNombreOrigen, tcPlantillaPorDefecto, tcCampoPlantilla);
237  }
238 
245  private void SetProperties(string tcNombreOrigen, string tcPlantillaPorDefecto, string tcCampoPlantilla)
246  {
247  this._NombreOrigen = tcNombreOrigen;
248  this._PlantillaPorDefecto = tcPlantillaPorDefecto;
249  this._CampoPlantillaEspecifica = tcCampoPlantilla;
250  }
251 
255  public string _NombreOrigen { get; private set; }
259  public string _PlantillaPorDefecto { get; private set; }
263  public string _CampoPlantillaEspecifica { get; private set; }
264  }
265 
269  internal static class EnumExtensions
270  {
277  public static TAttribute __GetAttribute<TAttribute>(this eTipoPlantilla value)
278  where TAttribute : Attribute
279  {
280  var type = value.GetType();
281  var name = Enum.GetName(type, value);
282  return type.GetField(name) // I prefer to get attributes this way
283  .GetCustomAttributes(false)
284  .OfType<TAttribute>()
285  .SingleOrDefault();
286  }
287  }
288 
292  internal static class TipoPlantillaExtensions
293  {
299  public static string __ObtenerNombreOrigen(this eTipoPlantilla p)
300  {
301  var attr = p.__GetAttribute<TipoPlantillaInfoAttribute>();
302 
303  return attr._NombreOrigen;
304  }
305 
311  public static string __ObtenerNombreCampoPlantilla(this eTipoPlantilla p)
312  {
313  var attr = p.__GetAttribute<TipoPlantillaInfoAttribute>();
314 
315  return attr._CampoPlantillaEspecifica;
316  }
317 
323  public static string __ObtenerCodigoPlantillaPorDefecto(this eTipoPlantilla p)
324  {
325  var attr = p.__GetAttribute<TipoPlantillaInfoAttribute>();
326 
327  return attr._PlantillaPorDefecto;
328  }
329 
330  public static string __ObtenerPlantilla(this eTipoPlantilla p)
331  {
332  //Empresa actual
333  string lcEmpresaActual = DB.SQLString(Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa", "")));
334  string lcCampo = p.__ObtenerNombreCampoPlantilla();
335  string lcDefaultValue = p.__ObtenerCodigoPlantillaPorDefecto();
336 
337  //Recupero los datos por empresa
338  DataTable ldtDatos = new DataTable();
339 
340  //Es un query que devuelve siempre valor si hay registro (con o sin valor informado)
341  string lcSQL = "SELECT TOP(1) " + lcCampo + " AS PLANTILLA FROM " + DB.SQLDatabase("RGPD", "DELEGADOS") +
342  " WHERE EMPRESA = " + lcEmpresaActual + " AND " + lcCampo + " != '' " +
343  "UNION " +
344  "SELECT TOP(1) " + DB.SQLString(lcDefaultValue) + " AS PLANTILLA FROM " + DB.SQLDatabase("RGPD", "DELEGADOS") +
345  " WHERE EMPRESA = " + lcEmpresaActual + " AND " + lcCampo + " = '' ";
346 
347  if (DB.SQLExec(lcSQL, ref ldtDatos) && ldtDatos.Rows.Count > 0)
348  return Convert.ToString(ldtDatos.Rows[0]["PLANTILLA"]).TrimEnd();
349 
350  return lcDefaultValue;
351  }
352 
360  public static ISolicitudComunicado __ToSolicitudComunicado(this eTipoPlantilla tePlantilla, object toSender, string tcRutaFichero = "")
361  {
362  RgpdSolicitudComunicado loSolicitud = new RgpdSolicitudComunicado(toSender as ManteExtEntidades);
363  loSolicitud._CodigoPlantilla = tePlantilla.__ObtenerPlantilla();
364  loSolicitud._NombreOrigen = tePlantilla.__ObtenerNombreOrigen();
365  if (!String.IsNullOrWhiteSpace(tcRutaFichero))
366  loSolicitud._RutasFicheros = new List<string>() { tcRutaFichero };
367  return loSolicitud;
368  }
369  }
370 }
Interfície de respuesta de los comunicados
Extensión para el mantenimiento de clientes
Intefície para solicitar comunicados
string _NombreOrigen
Literal del orígen de la llamada
Es como el tipo de entrada asientos pero por negocio, sin formulario, pq quiero que me haga las propu...
string _CodigoInstancia
Código de instancia concreta de entidad (pe. 43000002 o 40000001 o 0001, etc). Valores concretos ...
IEnumerable< String > _RutasFicheros
Fichero(s) de comunicado generados
IEnumerable< IMante > _Mantenimientos
Mantenimiento(s) asociado(s) a la solicitud.
string _MessageError
Mensaje de error si lo hay.
eResultadoProceso
Enumeración de titpos de resultado
bool _Ejecutado
True si se ha ejecutado, false en caso contrario (cancelado, error, etc.)
string _CodigoPlantilla
Código de la plantilla a comunicar