ComparativosMensuales.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Data;
4 using System.Globalization;
5 using System.Linq;
6 using sage.ew.db;
7 using sage.ew.global;
9 using sage.ew.ewbase;
10 
11 namespace sage.ew.listados
12 {
16  public abstract class ComparativosMensuales : Clases.Listados
17  {
18  #region Variables
19 
23  protected bool TrabajaConEjercicioPartido = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_parti"));
24 
28  protected string _cTituloListado = string.Empty;
29 
33  protected string _cOpcFechas = string.Empty;
34 
38  protected string _cOpcSumaDe = string.Empty;
39 
43  protected bool _lAcumulandoImporte = false;
44 
48  protected bool _lfacturas = false;
49 
50  //Defino variables para la sentencia PIVOT
54  protected string _cTituloAgrupacion = string.Empty;
58  protected string _cColumnasPivot = string.Empty;
62  protected string _cInPivot = string.Empty;
66  protected string _cAgrupacion = string.Empty; //Operación a realizar con la fecha para particionar
67 
71  protected string _cColumnaDetalle = string.Empty;
75  protected string _cColumnaDetalleNull = string.Empty;
79  protected string _cCodigoParaLeftJoin = string.Empty;
83  protected string _cTablaNombre = string.Empty;
87  protected string _cCampoGroupBy = string.Empty;
88 
89  #endregion Variables
90 
94  public enum eTipoComparativa
95  {
99  Indeterminado = 0,
103  Ventas = 1,
107  Compras = 2,
111  Contabilidad = 3
112  }
113 
117  protected enum _eAgruparPor
118  {
122  dia,
126  semana,
130  mes,
134  trimestre,
138  semestre,
142  año,
146  nada
147  };
151  protected _eAgruparPor _eOpcAgruparPor = _eAgruparPor.mes;
152 
153  private readonly eTipoComparativa tipoDeComparativa = eTipoComparativa.Indeterminado;
154 
158  protected Dictionary<string, string> FiltrosParaEjercicios
159  {
160  get { return dicFiltrosParaEjercicios; }
161  set { dicFiltrosParaEjercicios = value; }
162  }
163  private Dictionary<string, string> dicFiltrosParaEjercicios = new Dictionary<string, string>();
164 
168  public bool _Mostrar_Beneficio_TPC
169  {
170  get { return _lMostrar_Beneficio_TPC; }
171  set { _lMostrar_Beneficio_TPC = value; }
172  }
173  private bool _lMostrar_Beneficio_TPC = false;
174 
175  #region Constructores
176 
180  private ComparativosMensuales()
181  : base()
182  {
183  InitComparativa();
184  }
185 
190  public ComparativosMensuales(eTipoComparativa teTipoComparativo)
191  : base()
192  {
193  tipoDeComparativa = teTipoComparativo;
194 
195  InitComparativa();
196  }
197 
203  public ComparativosMensuales(eTipoComparativa teTipoComparativo, object[] toObjects)
204  : base(toObjects)
205  {
206  tipoDeComparativa = teTipoComparativo;
207 
208  InitComparativa();
209  }
210 
211  #endregion Constructores
212 
213  #region Métodos abstractos
214 
218  protected abstract void InitComparativa();
219 
220  #endregion Métodos abstractos
221 
225  protected virtual void DeterminarTipoAgrupacion()
226  {
227  //{ día, semana, mes, trimestre, semestre, año }
228  int lnAgrupacion = _Opcion_Entero("ndiasemanamestrime");
229  switch (lnAgrupacion)
230  {
231  case 0: //Dia
232  _eOpcAgruparPor = _eAgruparPor.dia;
233  break;
234 
235  case 1: //Semana
236  _eOpcAgruparPor = _eAgruparPor.semana;
237  break;
238 
239  case 2: //Mes
240  default:
241  _eOpcAgruparPor = _eAgruparPor.mes;
242  break;
243 
244  case 3: //Trimestre
245  _eOpcAgruparPor = _eAgruparPor.trimestre;
246  break;
247 
248  case 4: //Semestre
249  _eOpcAgruparPor = _eAgruparPor.semestre;
250  break;
251 
252  case 5: //Año
253  _eOpcAgruparPor = _eAgruparPor.año;
254  break;
255 
256  case 6: //Sin escala de tiempo (1 solo bloque)
257  _eOpcAgruparPor = _eAgruparPor.nada;
258  break;
259  }
260  }
261 
265  protected virtual void DeterminarOpcionDeSuma()
266  {
267  _lAcumulandoImporte = false; //Bug 109054
268 
269  //Control que contiene si hemos de agrupar unidades o importe
270  int lnUnidades = _Opcion_Entero("nunidadesimporte");
271  switch (lnUnidades)
272  {
273  case 0:
274  _cOpcSumaDe = "unidades";
275  break;
276  case 1:
277  default:
278  _lAcumulandoImporte = true; //Bug 109054
279 
280  if (_DivisaConfig._DivisaEspecifica)
281  _cOpcSumaDe = "importediv";
282  else
283  _cOpcSumaDe = "importe";
284 
285  if (esUnaComparativaDeVentas() && _AplicarIVAIncluido)
286  {
287  if (_DivisaConfig._DivisaEspecifica)
288  _cOpcSumaDe = "impdiviva";
289  else
290  _cOpcSumaDe = "importeiva";
291  }
292  break;
293 
294  case 2:
295  _cOpcSumaDe = "cajas"; //PE-84136: opcion de suma de cajas
296  break;
297  case 3:
298  _cOpcSumaDe = "peso"; //PE-84136: opcion de suma de peso
299  break;
300  }
301  }
302 
307  protected virtual string ObtenerCodigoListadoDeNavegacion()
308  {
309  return ""; //Sobreecribir el las clases derivada
310  }
311 
316  private bool esUnaComparativaDeVentas()
317  {
318  return tipoDeComparativa == eTipoComparativa.Ventas;
319  }
320 
325  protected bool usarEscalaDeTiempo()
326  {
327  return _eOpcAgruparPor != _eAgruparPor.nada;
328  }
329 
333  protected virtual void DeterminarOpcionDeFecha()
334  {
335  int lnTipoFecha = -1;
336  lnTipoFecha = _Opcion_Entero("nalbaranesfacturas"); //PE-90076 NO CAMBIAR EL NOMBRE SIN CONSULTAR
337  switch (lnTipoFecha)
338  {
339  case 1:
340  _cOpcFechas = "fecha_fac";
341  _lfacturas = true; // PE-90199. Agrupar per facturats
342  break;
343  case 0:
344  default:
345  _cOpcFechas = "fecha";
346  _lfacturas = false; // PE-90199. No agrupar per facturats
347  break;
348  }
349 
350  }
351 
356  protected void _GarantizarAlmenosUnRegistro(ref DataTable tdtResultados)
357  {
358  //Si no hay datos debo devolver un datatable a 0's
359  if (tdtResultados.Rows.Count == 0)
360  {
361  foreach (string lcEjer in _Ejercicios)
362  {
363  DataRow ldrEmptyRow = tdtResultados.NewRow();
364  if (tdtResultados.Columns.Contains("EJERCICIO"))
365  ldrEmptyRow["EJERCICIO"] = lcEjer;
366  else
367  {
368  try { ldrEmptyRow[0] = lcEjer; } //pruebo de asignar en la primera fila
369  catch (Exception loEx) { DB.Registrar_Error(loEx); }
370  }
371  tdtResultados.Rows.Add(ldrEmptyRow);
372  }
373  }
374  }
375 
380  protected virtual string ObtenerColumnasBaseParaPivot()
381  {
382  return "[EJERCICIO], ";
383  }
384 
389  protected virtual string ObtenerColumnasDetalleAdicional()
390  {
391  return ""; //Por si se requierne columnas adicionales
392  }
393 
397  protected void CalcularParametrosAgrupacion(string tcAliasDatos)
398  {
399  //Defino columnas y pivote en funcion de la agrupación
400  switch (_eOpcAgruparPor)
401  {
402  #region dia
403  case _eAgruparPor.dia:
404  _cTituloAgrupacion = " dia ";
405  _cColumnasPivot = ObtenerColumnasBaseParaPivot();
406  _cInPivot = _cTituloAgrupacion + " IN ( ";
407 
408  //Por cada mes
409  for (int lnMes = 1; lnMes <= 12; lnMes++)
410  {
411  int lnNumeroDiasMes = 0;
412  int lnIndexColumna = 0;
413 
414  //Determino el nombre del més
415  string lcNombreMes = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(lnMes);
416 
417  //Determino el número de días
418  switch (lnMes)
419  {
420  case 1:
421  case 3:
422  case 5:
423  case 7:
424  case 8:
425  case 10:
426  case 12:
427  lnNumeroDiasMes = 31;
428  break;
429  case 2:
430  lnNumeroDiasMes = 29;
431  break;
432  case 4:
433  case 6:
434  case 9:
435  case 11:
436  lnNumeroDiasMes = 30;
437  break;
438  default:
439  break;
440  }
441 
442  for (int lnIndex = 1; lnIndex <= lnNumeroDiasMes; lnIndex++)
443  {
444  lnIndexColumna = lnMes * 100 + lnIndex; //Mes x 100 + dia para generar número único
445  _cColumnasPivot += "[" + lnIndexColumna.ToString() + "] AS '" + lcNombreMes + ", " + lnIndex.ToString() + "'";
446  _cInPivot += "[" + lnIndexColumna.ToString() + "]";
447  if (lnMes == 12 && lnIndex == 31)
448  {
449  _cColumnasPivot += " ";
450  _cInPivot += ") ";
451  }
452  else
453  {
454  _cColumnasPivot += ", ";
455  _cInPivot += ", ";
456  }
457  }
458  }
459  _cAgrupacion = _cColumnaDetalle + "DATEPART(m, " + tcAliasDatos + _cOpcFechas + ") * 100 + DATEPART ( d , " + tcAliasDatos + _cOpcFechas + ") as " + _cTituloAgrupacion;
460 
461  break;
462  #endregion dia
463 
464  #region semana
465  case _eAgruparPor.semana:
466  var numMaxSemanas = 52;
467 
468  foreach (var ejercicio in _Ejercicios)
469  {
470  var semanas = ObtenerNumeroSemanasEjercicio(ejercicio);
471  if (semanas > numMaxSemanas)
472  numMaxSemanas = semanas;
473  }
474 
475  _cTituloAgrupacion = " semana ";
476  _cColumnasPivot = ObtenerColumnasBaseParaPivot();
477  _cInPivot = _cTituloAgrupacion + " IN ( ";
478  for (int lnIndex = 1; lnIndex <= numMaxSemanas; lnIndex++)
479  {
480  _cColumnasPivot += "[" + lnIndex.ToString() + "] AS 'Semana " + lnIndex.ToString() + "'";
481  _cInPivot += "[" + lnIndex.ToString() + "]";
482  if (lnIndex == numMaxSemanas)
483  {
484  _cColumnasPivot += " ";
485  _cInPivot += ") ";
486  }
487  else
488  {
489  _cColumnasPivot += ", ";
490  _cInPivot += ", ";
491  }
492  }
493  _cAgrupacion = ObtenerColumnasDetalleAdicional() + "DATEPART ( wk , " + tcAliasDatos + _cOpcFechas + ") as " + _cTituloAgrupacion;
494  break;
495  #endregion semana
496 
497  case _eAgruparPor.trimestre:
498  _cTituloAgrupacion = " trimestre ";
499  _cColumnasPivot = ObtenerColumnasBaseParaPivot() + "[1] AS T1, [2] AS T2, [3] AS T3, [4] AS T4 ";
500  _cInPivot = _cTituloAgrupacion + " IN ( [1] , [2], [3], [4]) ";
501  _cAgrupacion = ObtenerColumnasDetalleAdicional() + " DATEPART ( qq ," + tcAliasDatos + _cOpcFechas + ") as " + _cTituloAgrupacion;
502  break;
503 
504  case _eAgruparPor.semestre:
505  _cTituloAgrupacion = " semestre ";
506  _cColumnasPivot = ObtenerColumnasBaseParaPivot() + "[1] AS SEM1, [2] AS SEM2 ";
507  _cInPivot = _cTituloAgrupacion + " IN ( [1] , [2]) ";
508  _cAgrupacion = ObtenerColumnasDetalleAdicional() + " FLOOR ((MONTH(" + tcAliasDatos + _cOpcFechas + ") - 1) / 6) + 1 as " + _cTituloAgrupacion;
509  break;
510 
511  case _eAgruparPor.año:
512  _cTituloAgrupacion = " año ";
513  _cColumnasPivot = ObtenerColumnasBaseParaPivot() + "[1] AS AÑO ";
514  _cInPivot = _cTituloAgrupacion + " IN ( [1] ) ";
515  _cAgrupacion = ObtenerColumnasDetalleAdicional() + " '1' as " + _cTituloAgrupacion;
516  break;
517 
518  case _eAgruparPor.nada:
519  _cTituloAgrupacion = " saldo ";
520  _cColumnasPivot = ObtenerColumnasBaseParaPivot() + "[1] AS SALDO ";
521  _cInPivot = _cTituloAgrupacion + " IN ( [1] ) ";
522  _cAgrupacion = ObtenerColumnasDetalleAdicional() + " '1' as " + _cTituloAgrupacion;
523  break;
524 
525  case _eAgruparPor.mes:
526  default:
527  _cTituloAgrupacion = " meses ";
528  _cColumnasPivot = ObtenerColumnasBaseParaPivot() + "[1] AS Enero, [2] AS Febrero, [3] AS Marzo, [4] AS Abril, [5] AS Mayo, [6] AS Junio, [7] AS Julio, " +
529  "[8] AS Agosto, [9] AS Septiembre , [10] AS Octubre, [11] AS Noviembre, [12] AS Diciembre ";
530  _cInPivot = _cTituloAgrupacion + " IN ( [1] , [2], [3], [4], [5] , [6], [7], [8],[9] , [10], [11], [12]) ";
531  _cAgrupacion = ObtenerColumnasDetalleAdicional() + " MONTH(" + tcAliasDatos + _cOpcFechas + ") as " + _cTituloAgrupacion;
532  break;
533  }
534  }
535 
541  protected int ObtenerNumeroSemanasEjercicio(string ejercicio)
542  {
543  DateTime fecha = new DateTime(Convert.ToInt32(ejercicio), 12, 31);
544  CultureInfo cultura = CultureInfo.InvariantCulture;
545  Calendar calendario = cultura.Calendar;
546  int cantidadSemanas = calendario.GetWeekOfYear(fecha, cultura.DateTimeFormat.CalendarWeekRule, cultura.DateTimeFormat.FirstDayOfWeek);
547  return cantidadSemanas;
548  }
549 
550  #region Métodos override
551 
555  public override List<string> _ReportColumns
556  {
557  get
558  {
559  List<string> ldReportColumns = new List<string>();
560 
561  foreach (DataColumn loCol in _Resultados.Columns)
562  {
563  if (loCol.ColumnName.ToLower() != "bold")
564  ldReportColumns.Add(loCol.ColumnName);
565  }
566  return ldReportColumns;
567  }
568  }
569 
573  public override void _SetColumnMasks()
574  {
575  base._SetColumnMasks();
576 
577  string lcColumnName = string.Empty;
578  List<string> llTPC = new List<string> { "%" };
579 
580  foreach (DataColumn ldc in _Resultados.Columns)
581  {
582  lcColumnName = ldc.ColumnName.ToLower().Trim();
583  string lcMascara = "";
584 
585  //Si es un %
586  if (llTPC.Any(s => lcColumnName.Contains(s)))
587  {
588  lcMascara = _Mascara_TPC;
589  }
590  else
591  {
592  //Verifico por tipo de datos ya que los títulos varia en función del ejercicio
593  string lcTipoCampo = ldc.DataType.Name.ToString();
594 
595  if ((lcTipoCampo == "Int32") || (lcTipoCampo == "Double") || (lcTipoCampo == "Decimal"))
596  {
597  switch (_cOpcSumaDe)
598  {
599  case "unidades":
600  lcMascara = _Mascara_Unidades;
601  break;
602 
603  case "importe":
604  case "importeiva":
605  default:
606  lcMascara = _Mascara_Importe;
607  break;
608 
609  case "importediv":
610  case "impdiviva":
611  case "(ASIENTO.DEBE - ASIENTO.HABER)":
612  lcMascara = _DivisaConfig._DivisaMascaraImporte;
613  break;
614 
615  case "cajas":
616  lcMascara = _Mascara_Cajas;
617  break;
618 
619  case "peso":
620  lcMascara = _Mascara_Peso;
621  break;
622  }
623  }
624  }
625 
626  //Paso a asignar la máscara
627  if (!ldc.ExtendedProperties.ContainsKey("Mascara"))
628  ldc.ExtendedProperties.Add("Mascara", lcMascara);
629  }
630  }
631 
637  public override void _ConvertVisualFiltersOptionsToObjects(Dictionary<string, object> toFiltrosVisuals = null, Dictionary<string, object> toOpcionesVisuals = null)
638  {
639  base._ConvertVisualFiltersOptionsToObjects(toFiltrosVisuals, toOpcionesVisuals);
640 
641  //Ejericicios (va por datatable)
642  if (toFiltrosVisuals.Keys.Contains("txtEjercicioDesdeHasta"))
643  {
644  txtEjercicioDesdeHasta loControlFiltro = new txtEjercicioDesdeHasta();
645  loControlFiltro = (txtEjercicioDesdeHasta)toFiltrosVisuals["txtEjercicioDesdeHasta"];
646 
647 
648  //Si no esta marcado el checkbox de Todos (=> caso en el que no se filtra)
649  if (!loControlFiltro._Todos)
650  {
651  //Si tengo elementos en la lista
652  if (loControlFiltro._Lista != null && loControlFiltro._Lista.Count > 0)
653  {
654  _Ejercicios = new string[loControlFiltro._Lista.Count];
655  _Ejercicios = loControlFiltro._Lista.ToArray<string>();
656  }
657  else //Usamos la combinación Desde - Hasta
658  {
659  if (loControlFiltro._Desde == loControlFiltro._Hasta) _Ejercicios = new string[1] { loControlFiltro._Desde };
660  else
661  {
662  bool llRowArray = false;
663  DataRow[] loRowArray = new DataRow[0];
664 
665  bool llDesde = !string.IsNullOrWhiteSpace(loControlFiltro._Desde); //Determino si tengo valor _Desde
666  bool llHasta = !string.IsNullOrWhiteSpace(loControlFiltro._Hasta); //Determino si tengo valor _Hasta
667 
668  //Si tengo los 2 valores
669  if (llDesde && llHasta)
670  {
671  llRowArray = true;
672  loRowArray = loControlFiltro._oFiltroDesde._DataTable.Select("ano>='" + loControlFiltro._Desde + "' AND ano<='" + loControlFiltro._Hasta + "'");
673  }
674  else
675  {
676  //Solo tengo valor Desde
677  if (llDesde && !llHasta)
678  {
679  llRowArray = true;
680  loRowArray = loControlFiltro._oFiltroDesde._DataTable.Select("ano>='" + loControlFiltro._Desde + "'");
681  }
682  //Solo tengo valor Hasta
683  if (!llDesde && llHasta)
684  {
685  llRowArray = true;
686  loRowArray = loControlFiltro._oFiltroDesde._DataTable.Select("ano<='" + loControlFiltro._Hasta + "'");
687  }
688  }
689 
690  if (llRowArray)
691  {
692  _Ejercicios = new string[loRowArray.Count()];
693  int lnIndex = 0;
694  foreach (DataRow loRow in loRowArray)
695  {
696  _Ejercicios[lnIndex] = loRow[0].ToString().TrimEnd();
697  lnIndex++;
698  }
699  }
700  }
701  }
702  }
703  else //Los quiero todos
704  {
705  _Ejercicios = new string[loControlFiltro._oFiltroDesde._DataTable.Rows.Count];
706  int lnIndex = 0;
707 
708  foreach (DataRow loRow in loControlFiltro._oFiltroDesde._DataTable.Rows)
709  {
710  _Ejercicios[lnIndex] = loRow[0].ToString().TrimEnd();
711  lnIndex++;
712  }
713  }
714  }
715  }
716 
722  protected override void _SetDefaultConfig(Dictionary<string, object> _Filtros, Dictionary<string, object> _Opciones)
723  {
724  base._SetDefaultConfig(_Filtros, _Opciones);
725  }
726 
730  public override void _SetEjercicios()
731  {
732  //Sobreescribo el método pq este listado ya es multiejercicio 'puro' y el tratamiento genérico no lo contemplo y lo estropeaba
733  }
734 
741  public override void _Navigate(string tcKeyNavigate, DataRow trRowList, Dictionary<string, object> tdicParams)
742  {
743  //Instancio una clase de cambio de ejercicio y lo cambio
744  functions.Clases.CambioEjercicio loEjer = new functions.Clases.CambioEjercicio();
745  loEjer._Cambiar(tcKeyNavigate);
746 
747  //Genero un botón de listados
748  botones.Clases.btListados loBotonListados = new botones.Clases.btListados();
749 
750  //Establecer destinos de navegación para gráficas en función de orígen
751  loBotonListados._NombreListado = ObtenerCodigoListadoDeNavegacion();
752 
753  loBotonListados._ShowDialog = true;
754 
755  // PE-100412 propago el parámetro de navegación directa del listado
756  loBotonListados._NavegacionDirecta = _NavegacionDirecta;
757 
758  //Miro si he recibido parámetros y si estos contienen el diccionario de filtros
759  if (tdicParams != null && tdicParams.ContainsKey("NavigateFromFiltros"))
760  {
761  //Me vuelco el diccionario en uno nuevo para no alterar el original y facilitar el acceso
762  Dictionary<string, object> ldicFiltrosToButton = new Dictionary<string, object>(tdicParams["NavigateFromFiltros"] as Dictionary<string, object>);
763 
764  //Tratamiento especial de la fecha
765  //Elimino del diccionario la fecha original ya que la que debo mandar al listado me la proporciona el DataRow y no el Formulario orígen
766  if (ldicFiltrosToButton.ContainsKey("txtFechaDesdeHasta")) ldicFiltrosToButton.Remove("txtFechaDesdeHasta");
767 
768  //Tratamiento especial de la fecha
769  if (trRowList != null && //Tengo fila origen
770  !String.IsNullOrEmpty(tcKeyNavigate)) //Tengo año
771  {
772  //Creo un nuevo filtro de fechas
773  txtFechaDesdeHasta loFiltroFecha = new txtFechaDesdeHasta();
774 
775  //Calculo las fechas a partir del Row
776  DateTime ldFechaIni = DateTime.Today;
777  DateTime ldFechaFin = DateTime.Today;
778  CalcularFechas(tcKeyNavigate, trRowList, out ldFechaIni, out ldFechaFin);
779  loFiltroFecha._Desde = ldFechaIni.ToString(EW_GLOBAL._CustomFormatDate);
780  loFiltroFecha._Hasta = ldFechaFin.ToString(EW_GLOBAL._CustomFormatDate);
781 
782  ldicFiltrosToButton.Add("txtFechaDesdeHasta", loFiltroFecha);
783  }
784 
785  //Reconvieto los txtFiltroBase a ConfiguradoresVisuales
786  var lisFiltros = ldicFiltrosToButton.Where(loEle => loEle.Value is txtFiltroBase).ToList();
787 
788  foreach (var loFiltro in lisFiltros)
789  {
790  ldicFiltrosToButton[loFiltro.Key] = ((txtFiltroBase)loFiltro.Value)._ToConfiguradorFiltroVisual(); //Reconvierto el filtro visual en su version Configurador
791  }
792 
793  //PE-95018 Opción se IVA INCLUIDO
794  //Bug 108852 Combo de divisa
795  //Miro si he recibido parámetros y si estos contienen el diccionario de opciones
796  if (tdicParams != null && tdicParams.ContainsKey("NavigateFromOpciones"))
797  {
798  //Recupero el diccionario de opciones en uno temporal para poder operar con el contenido
799  Dictionary<string, object> ldicTmpOpcsToButton = new Dictionary<string, object>(tdicParams["NavigateFromOpciones"] as Dictionary<string, object>);
800 
801  if (ldicTmpOpcsToButton.ContainsKey("txtSelIva"))
802  ldicFiltrosToButton.Add("txtSelIva", ldicTmpOpcsToButton["txtSelIva"]); //Le paso el control
803 
804  if (ldicTmpOpcsToButton.ContainsKey("cmbdivisa")) //Bug 108852 Combo de divisa
805  ldicFiltrosToButton.Add("cmbdivisa", ldicTmpOpcsToButton["cmbdivisa"]); //Le paso el control
806  }
807 
808  //Asigno el diccionario de valores por defecto
809  loBotonListados._DefaultValues = ldicFiltrosToButton;
810  }
811 
812  loBotonListados.PerformClick();
813 
814  loEjer._Restablecer();
815  }
816 
817  #endregion Métodos override
818 
819  #region Métodos auxiliares
820 
827  protected static DateTime FirstDateOfWeekISO8601(int tnYear, int tnWeekOfYear)
828  {
829  DateTime ld1Enero = new DateTime(tnYear, 1, 1);
830  int daysOffset = DayOfWeek.Thursday - ld1Enero.DayOfWeek;
831 
832  DateTime ldPrimerJueves = ld1Enero.AddDays(daysOffset);
833  var loCalendario = CultureInfo.CurrentCulture.Calendar;
834  int lnFirstWeek = loCalendario.GetWeekOfYear(ldPrimerJueves, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
835 
836  var lnWeekNum = tnWeekOfYear;
837  if (lnFirstWeek <= 1)
838  {
839  lnWeekNum -= 1;
840  }
841  var result = ldPrimerJueves.AddDays(lnWeekNum * 7);
842  return result.AddDays(-3);
843  }
844 
851  protected DateTime FirstDateOfWeek(int year, int weekNum)
852  {
853  DateTime jan1 = new DateTime(year, 1, 1);
854 
855  var diaDeLaSemana = jan1.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)jan1.DayOfWeek;
856  int daysOffset = (int)DayOfWeek.Monday - diaDeLaSemana;
857  DateTime firstMonday = jan1.AddDays(daysOffset); //El dia 1 ha de estar en la semana 1 => el dilluns pot estar al any anterior
858 
859  DateTime result;
860  if (weekNum == 1)
861  result = jan1;
862  else
863  {
864  weekNum -= 1;
865  result = firstMonday.AddDays(weekNum * 7);
866  }
867 
868  return result;
869  }
870 
878  protected void CalcularFechas(string tcEjercicio, DataRow trRow, out DateTime tdFechaIni, out DateTime tdFechaFin)
879  {
880  int lnEjercico = Convert.ToInt32(tcEjercicio);
881  int lnMes = 1;
882  Calendar loCalendar = CultureInfo.CurrentCulture.Calendar;
883  string lcFechaRow = Convert.ToString(trRow.Field<string>(_cTituloListado));
884 
885  switch (_eOpcAgruparPor)
886  {
887  #region Dia
888 
889  case _eAgruparPor.dia:
890  try
891  {
892  string[] lcDataPart = lcFechaRow.Split(',');
893  if (lcDataPart.Count() > 1) // 2 partes => fecha normal
894  {
895  lnMes = DateTime.ParseExact(lcDataPart[0], "MMMM", CultureInfo.CurrentCulture).Month;
896  int lnDia = Convert.ToInt32(lcDataPart[1].Trim());
897  tdFechaIni = tdFechaFin = new DateTime(lnEjercico, lnMes, lnDia);
898  }
899  else
900  {
901  tdFechaIni = new DateTime(lnEjercico, 1, 1);
902  tdFechaFin = new DateTime(lnEjercico, 12, 31);
903  }
904  }
905  catch //No me ha llegado un dia => Total
906  {
907  tdFechaIni = new DateTime(lnEjercico, 1, 1);
908  tdFechaFin = new DateTime(lnEjercico, 12, 31);
909  }
910  break;
911 
912  #endregion Dia
913 
914  #region Semana
915 
916  case _eAgruparPor.semana:
917 
918  if (lcFechaRow.StartsWith("Semana"))
919  {
920 
921  }
922  try
923  {
924  int lnNumSemana = Convert.ToInt32(lcFechaRow.Replace("Semana ", "").Trim());
925  //tdFechaIni = FirstDateOfWeekISO8601(lnEjercico, lnNumSemana);
926  tdFechaIni = FirstDateOfWeek(lnEjercico, lnNumSemana);
927  tdFechaFin = FirstDateOfWeek(lnEjercico, lnNumSemana + 1).AddDays(-1);
928  }
929  catch //No me ha llegado una seman => Total
930  {
931  tdFechaIni = new DateTime(lnEjercico, 1, 1);
932  tdFechaFin = new DateTime(lnEjercico, 12, 31);
933  }
934 
935 
936  break;
937 
938  #endregion Semana
939 
940  #region Mes
941 
942  case _eAgruparPor.mes:
943  try
944  {
945  lnMes = DateTime.ParseExact(lcFechaRow, "MMMM", CultureInfo.CurrentCulture).Month;
946  tdFechaIni = new DateTime(lnEjercico, lnMes, 1);
947  tdFechaFin = new DateTime(lnEjercico, lnMes, loCalendar.GetDaysInMonth(lnEjercico, lnMes));
948  }
949  catch //No me ha llegado un mes => Total
950  {
951  tdFechaIni = new DateTime(lnEjercico, 1, 1);
952  tdFechaFin = new DateTime(lnEjercico, 12, 31);
953  }
954  break;
955 
956  #endregion Mes
957 
958  #region Trimestre
959 
960  case _eAgruparPor.trimestre:
961 
962  switch (lcFechaRow)
963  {
964  case "T1":
965  tdFechaIni = new DateTime(lnEjercico, 1, 1);
966  tdFechaFin = new DateTime(lnEjercico, 3, loCalendar.GetDaysInMonth(lnEjercico, 3));
967  break;
968  case "T2":
969  tdFechaIni = new DateTime(lnEjercico, 4, 1);
970  tdFechaFin = new DateTime(lnEjercico, 6, loCalendar.GetDaysInMonth(lnEjercico, 6));
971  break;
972  case "T3":
973  tdFechaIni = new DateTime(lnEjercico, 7, 1);
974  tdFechaFin = new DateTime(lnEjercico, 9, loCalendar.GetDaysInMonth(lnEjercico, 9));
975  break;
976  case "T4":
977  tdFechaIni = new DateTime(lnEjercico, 10, 1);
978  tdFechaFin = new DateTime(lnEjercico, 12, loCalendar.GetDaysInMonth(lnEjercico, 12));
979  break;
980  default:
981  tdFechaIni = new DateTime(lnEjercico, 1, 1);
982  tdFechaFin = new DateTime(lnEjercico, 12, 31);
983  break;
984  }
985  break;
986 
987  #endregion Trimestre
988 
989  #region Semestre
990 
991  case _eAgruparPor.semestre:
992  switch (lcFechaRow)
993  {
994  case "SEM1":
995  tdFechaIni = new DateTime(lnEjercico, 1, 1);
996  tdFechaFin = new DateTime(lnEjercico, 6, loCalendar.GetDaysInMonth(lnEjercico, 6));
997  break;
998  case "SEM2":
999  tdFechaIni = new DateTime(lnEjercico, 7, 1);
1000  tdFechaFin = new DateTime(lnEjercico, 12, loCalendar.GetDaysInMonth(lnEjercico, 12));
1001  break;
1002 
1003  default:
1004  tdFechaIni = new DateTime(lnEjercico, 1, 1);
1005  tdFechaFin = new DateTime(lnEjercico, 12, 31);
1006  break;
1007  }
1008  break;
1009 
1010  #endregion Semestre
1011 
1012  #region Año
1013 
1014  case _eAgruparPor.año:
1015  tdFechaIni = new DateTime(lnEjercico, 1, 1);
1016  tdFechaFin = new DateTime(lnEjercico, 12, 31);
1017  break;
1018 
1019  #endregion Año
1020 
1021  default:
1022  tdFechaIni = new DateTime(lnEjercico, 1, 1);
1023  tdFechaFin = new DateTime(lnEjercico, 12, 31);
1024  break;
1025  }
1026  }
1027 
1038  public Dictionary<string, string> _FiltroFechaPorEjercicio(Dictionary<string, object> toFiltros, string teFiltro, string tcAlias, string tcCampo, string[] taEjecicios, _Operador_Condicional teOperador = _Operador_Condicional.And)
1039  {
1040  bool llFechaDesde = false;
1041  bool llFechaHasta = false;
1042  bool llFechaUnica = false;
1043  DateTime? ldFechaDesde = null;
1044  DateTime? ldFechaHasta = null;
1045  DateTime? ldFechaUnica = null;
1046  string lcAlias = string.Empty;
1047  object loParametro = null;
1048 
1049  Periodos periodosInstalacion = Periodos.Instancia;
1050 
1051  tcAlias = tcAlias.Trim();
1052  tcCampo = tcCampo.Trim();
1053 
1054  // Puede que nos interese realizar un filtro sin alicar el ALIAS
1055  if (string.IsNullOrWhiteSpace(tcAlias))
1056  {
1057  lcAlias = "";
1058  }
1059  else
1060  {
1061  lcAlias = tcAlias + ".";
1062  }
1063 
1064 
1065  //Creo el diccionario de retorno
1066  Dictionary<string, string> FiltroFechasPorEjercicio = new Dictionary<string, string>();
1067 
1068  //Si no hay ejercicios acabo
1069  if (taEjecicios == null || taEjecicios.Count() == 0)
1070  return FiltroFechasPorEjercicio;
1071 
1072  foreach (var ejercio in taEjecicios)
1073  {
1074  FiltroFechasPorEjercicio.Add(ejercio, ""); //Creo una entrada por cada ejercicio
1075  }
1076  bool ejercicioUnico = taEjecicios.Count() == 1;
1077 
1078  // Filtro Lista
1079  toFiltros.TryGetValue((teFiltro + "Lista"), out loParametro);
1080  if (loParametro != null)
1081  {
1082  List<string> loLista;
1083  if (loParametro is string)
1084  loLista = new List<String>(loParametro.ToString().Split(','));
1085  else
1086  loLista = (List<string>)loParametro;
1087 
1088  //Convierto a lista de objetos DateTime
1089  List<DateTime> listaFechas = new List<DateTime>();
1090  loLista.ForEach(loEle => listaFechas.Add(Convert.ToDateTime(loEle)));
1091 
1092  DateTime periodoIni = Convert.ToDateTime(EW_GLOBAL._GetVariable("wd_periodoini"));
1093  DateTime periodoFin = Convert.ToDateTime(EW_GLOBAL._GetVariable("wd_periodofin"));
1094  int ejercicioActual = Convert.ToInt32(EW_GLOBAL._GetVariable("wc_any").ToString());
1095 
1096  int diaPeriodoIni = periodoIni.Day;
1097  int mesPeriodoIni = periodoIni.Month;
1098  int anyPeriodoIni = periodoIni.Year;
1099  int correccionIni = ejercicioActual - anyPeriodoIni; //Determino un factor de correccion por si estamos en ejercicio partido
1100 
1101  int diaPeriodoFin = periodoFin.Day;
1102  int mesPeriodoFin = periodoFin.Month;
1103  int anyPeriodoFin = periodoFin.Year;
1104  int correccionFin = ejercicioActual - anyPeriodoFin; //Determino un factor de correccion por si estamos en ejercicio partido
1105 
1106  foreach (var ejercicio in taEjecicios)
1107  {
1108  string lcFiltroFecha = string.Empty;
1109 
1110  //Fabrico un rango de fechas
1111  DateTime fechaIni = new DateTime(Convert.ToInt32(ejercicio) - correccionIni, mesPeriodoIni, diaPeriodoIni);
1112  DateTime fechaFin = new DateTime(Convert.ToInt32(ejercicio) - correccionFin, mesPeriodoFin, diaPeriodoFin);
1113 
1114  //Obtengo las fechas que cumplen
1115  var fechasEnRango = listaFechas.Where(d => d.CompareTo(fechaIni) >= 0 && d.CompareTo(fechaFin) <= 0).ToList();
1116  if (ejercicioUnico) //Si el ejercicio es único respeto lo del cliente tal cual
1117  fechasEnRango = listaFechas;
1118 
1119  if (fechasEnRango.Any())
1120  {
1121  lcFiltroFecha = lcAlias + tcCampo + " IN (";
1122 
1123  int lnInd = 0;
1124  foreach (DateTime fechaEnRango in fechasEnRango)
1125  {
1126  lnInd++;
1127  lcFiltroFecha += DB.SQLString(fechaEnRango);
1128 
1129  if (fechasEnRango.Count == lnInd)
1130  lcFiltroFecha += ")";
1131  else
1132  lcFiltroFecha += ",";
1133  }
1134  }
1135  else
1136  {
1137  lcFiltroFecha = " 1=2 "; //No me ha dado ninguna fecha para ese ejercicio => Descarto todos los datos
1138  }
1139  FiltroFechasPorEjercicio[ejercicio] = lcFiltroFecha;
1140  }
1141  // fi 83330
1142  }
1143  else
1144  {
1145  // Fecha desde
1146  toFiltros.TryGetValue(teFiltro + "Desde", out loParametro);
1147  if (loParametro != null)
1148  {
1149  ldFechaDesde = Convert.ToDateTime(loParametro);
1150  llFechaDesde = true;
1151  }
1152  loParametro = null;
1153 
1154  // Fecha hasta
1155  toFiltros.TryGetValue(teFiltro + "Hasta", out loParametro);
1156  if (loParametro != null)
1157  {
1158  ldFechaHasta = Convert.ToDateTime(loParametro);
1159  loParametro = null;
1160  llFechaHasta = true;
1161  }
1162 
1163  // Filtro único
1164  toFiltros.TryGetValue((teFiltro + "Unico"), out loParametro);
1165  if (loParametro != null && !string.IsNullOrWhiteSpace(loParametro.ToString()))
1166  {
1167  ldFechaUnica = Convert.ToDateTime(loParametro);
1168  loParametro = null;
1169  llFechaUnica = true;
1170  }
1171  else
1172  {
1173  // Para mejorar rendimiento (unico es mejor que rango) => Miro si el desde y el hasta son iguales
1174  if (llFechaDesde && llFechaHasta && ldFechaDesde == ldFechaHasta)
1175  {
1176  ldFechaUnica = ldFechaDesde;
1177  llFechaUnica = true;
1178  }
1179  else
1180  {
1181  if (EnWidget && teFiltro == _Tipo_Filtro_Fecha.Fecha.ToString())
1182  {
1183  //Solo para listados contenidos en un widget, se aplicara para el filtro principal de fecha el periodo inicial/final
1184  if (ldFechaDesde == null)
1185  {
1186  ldFechaDesde = Convert.ToDateTime(EW_GLOBAL._GetVariable("wd_periodoini"));
1187  llFechaDesde = true;
1188  }
1189  if (ldFechaHasta == null)
1190  {
1191  ldFechaHasta = Convert.ToDateTime(EW_GLOBAL._GetVariable("wd_periodofin"));
1192  llFechaHasta = true;
1193  }
1194  llFechaUnica = false;
1195  }
1196  }
1197  }
1198 
1199  if (llFechaUnica)
1200  {
1201  //No admito el filtrado único a excepción del año real
1202  foreach (var ejercicio in taEjecicios)
1203  {
1204  var periodo = periodosInstalacion.GetPeriodo(ejercicio);
1205  if (periodo != null)
1206  {
1207  if (periodo.PerteneceAlPeriodo(ldFechaUnica.Value))
1208  FiltroFechasPorEjercicio[ejercicio] = lcAlias + tcCampo + " = " + DB.SQLString(ldFechaUnica);
1209  else
1210  FiltroFechasPorEjercicio[ejercicio] = " 1=2 "; //Invalido el filtro, nadie de ese ejercicio lo va a cumplir
1211  }
1212  }
1213  }
1214  else
1215  {
1216  if (llFechaDesde || llFechaHasta) // Si tengo inicial o final
1217  {
1218  foreach (var ejercicio in taEjecicios)
1219  {
1220  string lcFiltroFecha = string.Empty;
1221  PeriodoItem current = periodosInstalacion.GetPeriodo(ejercicio);
1222  if (llFechaDesde)
1223  {
1224  if (current.PerteneceAlPeriodo(ldFechaDesde.Value) || ejercicioUnico) //Si el ejercicio es único asigno los valores del usuario
1225  lcFiltroFecha += lcAlias + tcCampo + " >= " + DB.SQLString(ldFechaDesde); //Si es la fecha inicial la asigno
1226  else
1227  lcFiltroFecha += lcAlias + tcCampo + " >= " + DB.SQLString(current.PeriodoIni); //Sino asigno inicio período
1228  }
1229  if (llFechaHasta)
1230  {
1231  if (llFechaDesde) //Continuación del string de filtro
1232  lcFiltroFecha += " AND ";
1233 
1234  if (current.PerteneceAlPeriodo(ldFechaHasta.Value) || ejercicioUnico) //Si el ejercicio es único asigno los valores del usuario
1235  lcFiltroFecha += lcAlias + tcCampo + " <= " + DB.SQLString(ldFechaHasta);
1236  else
1237  lcFiltroFecha += lcAlias + tcCampo + " <= " + DB.SQLString(current.PeriodoFin); //Sino asigno fin período
1238  }
1239  FiltroFechasPorEjercicio[ejercicio] = lcFiltroFecha;
1240  }
1241  }
1242  else //No soy Unico, ni desde, ni hasta, ni lista => Genero periodos genéricos
1243  {
1244  if (ejercicioUnico)
1245  {
1246  FiltroFechasPorEjercicio[taEjecicios[0]] = ""; //Filtro vacio para ejercicio único en modalidad TODOS
1247  }
1248  else
1249  {
1250  foreach (var ejercicio in taEjecicios)
1251  {
1252  var periodo = periodosInstalacion.GetPeriodo(ejercicio);
1253  if (periodo != null)
1254  {
1255  FiltroFechasPorEjercicio[ejercicio] = periodo.ToFilterString(lcAlias, tcCampo);
1256  }
1257  }
1258  }
1259  }
1260  }
1261  }
1262 
1263  //Añado los operadores a cada filtro
1264  foreach (var ejercicio in taEjecicios)
1265  {
1266  FiltroFechasPorEjercicio[ejercicio] = FiltroFechaPorEjercicio_AddOperator(teOperador, FiltroFechasPorEjercicio[ejercicio]);
1267  }
1268 
1269  //Devuelvo el diccionario
1270  return FiltroFechasPorEjercicio;
1271  }
1272 
1279  private string FiltroFechaPorEjercicio_AddOperator(_Operador_Condicional teOperador, string lcFiltroFecha)
1280  {
1281  if (!string.IsNullOrWhiteSpace(lcFiltroFecha))
1282  {
1283  switch (teOperador)
1284  {
1285  case _Operador_Condicional.And:
1286  lcFiltroFecha = " And " + lcFiltroFecha;
1287  break;
1288 
1289  case _Operador_Condicional.Or:
1290  lcFiltroFecha = " Or " + lcFiltroFecha;
1291  break;
1292 
1293  case _Operador_Condicional.None:
1294  break;
1295 
1296  default:
1297  break;
1298  }
1299  }
1300  return lcFiltroFecha;
1301  }
1302 
1307  //private List<PeriodoItem> CargarDatosDePeriodos()
1308  //{
1309  // List<PeriodoItem> periodos = new List<PeriodoItem>();
1310  // DataTable dtPeriodos = new DataTable();
1311  // if (DB.SQLExec("SELECT [any] AS ejer, periodoini, periodofin, anterior FROM " + DB.SQLDatabase("COMUNES", "EJERCICI"), ref dtPeriodos))
1312  // {
1313  // dtPeriodos.AsEnumerable().Cast<DataRow>()
1314  // .ToList().ForEach(loRow => periodos.Add(new PeriodoItem(loRow.Field<string>("ejer"),
1315  // loRow.Field<DateTime>("periodoini"),
1316  // loRow.Field<DateTime>("periodofin"),
1317  // loRow.Field<string>("anterior"))));
1318  // }
1319  // return periodos;
1320  //}
1321 
1327  protected void ReordenarColumnasEjercicioPartido(ref DataTable tdtDatos)
1328  {
1329  if (TrabajaConEjercicioPartido)
1330  {
1331  DateTime periodoIni = Convert.ToDateTime(EW_GLOBAL._GetVariable("wd_periodoini"));
1332 
1333  switch (_eOpcAgruparPor)
1334  {
1335  case _eAgruparPor.dia:
1336 
1337  //Congiguro los valores para determinar el desplazamiento
1338  DateTime expectedIni = new DateTime(year: periodoIni.Year, month: 1, day: 1); //De entrada esperamos año natural
1339 
1340  //Calculo la diferencia => Ojo con febrero
1341  TimeSpan diferencia = periodoIni - expectedIni;
1342  if (diferencia.Days >= 60) //Incluye febrero que esta contado a 29 días para poder unir años bisiesto con normales (UNION ALL requiere mismo número de columnas)
1343  diferencia = diferencia = periodoIni - expectedIni.AddDays(-1);
1344 
1345  for (int i = 1; i <= diferencia.Days; i++)
1346  {
1347  //Tal como la mueva, la 2 pasa a ser la 1 => indice fijo
1348  tdtDatos.Columns[1].SetOrdinal(tdtDatos.Columns.Count - 1); //La paso al final
1349  }
1350  break;
1351 
1352  case _eAgruparPor.semana:
1353  break;
1354  case _eAgruparPor.mes: //CCR 143805
1355 
1356  int primerMes = periodoIni.Month;
1357  for (int i = 1; i < primerMes; i++)
1358  {
1359  //Tal como la mueva, la 2 pasa a ser la 1 => indice fijo
1360  tdtDatos.Columns[1].SetOrdinal(tdtDatos.Columns.Count - 1); //La paso al final
1361  }
1362 
1363  break;
1364  case _eAgruparPor.trimestre:
1365  break;
1366  case _eAgruparPor.semestre:
1367  break;
1368 
1369  //No hay que hacer nada
1370  case _eAgruparPor.año:
1371  case _eAgruparPor.nada:
1372  default:
1373  break;
1374  }
1375  }
1376  }
1377 
1378  #endregion Métodos auxiliares
1379 
1383  //public class Periodos
1384  //{
1385  // /// <summary>
1386  // /// Colecciñon de períodos
1387  // /// </summary>
1388  // private IEnumerable<PeriodoItem> _periodos;
1389 
1390  // /// <summary>
1391  // /// Constructor de la clase
1392  // /// </summary>
1393  // public Periodos()
1394  // {
1395  // CargarDatosDePeriodos();
1396  // }
1397 
1398  // /// <summary>
1399  // /// Método auxiliar para la carga de períodos
1400  // /// </summary>
1401  // private void CargarDatosDePeriodos()
1402  // {
1403  // List<PeriodoItem> periodos = new List<PeriodoItem>();
1404  // DataTable dtPeriodos = new DataTable();
1405  // if (DB.SQLExec("SELECT [any] AS ejer, periodoini, periodofin, anterior FROM " + DB.SQLDatabase("COMUNES", "EJERCICI"), ref dtPeriodos))
1406  // {
1407  // dtPeriodos.AsEnumerable().Cast<DataRow>()
1408  // .ToList().ForEach(loRow => periodos.Add(new PeriodoItem(loRow.Field<string>("ejer"),
1409  // loRow.Field<DateTime>("periodoini"),
1410  // loRow.Field<DateTime>("periodofin"),
1411  // loRow.Field<string>("anterior"))));
1412  // }
1413  // _periodos = periodos;
1414  // }
1415 
1416  // /// <summary>
1417  // /// Obtiene el período correspondiente al ejercicio pasado como parámetro
1418  // /// </summary>
1419  // /// <param name="tcEjercicio">Ejercicio del que obtener el período</param>
1420  // /// <returns></returns>
1421  // public PeriodoItem GetPeriodo(string tcEjercicio)
1422  // {
1423  // return _periodos.Where(p => p.Ejercicio == tcEjercicio.TrimEnd()).FirstOrDefault();
1424  // }
1425 
1426  // /// <summary>
1427  // /// Método que determina si existe el ejercicio anterior al indicado
1428  // /// </summary>
1429  // /// <param name="tcEjercicio"></param>
1430  // /// <returns></returns>
1431  // public bool ExisteEjercicioAnteriorAl(string tcEjercicio)
1432  // {
1433  // var periodo = GetPeriodo(tcEjercicio); //Obtengo periodo recibido por parametro
1434  // if (periodo != null)
1435  // {
1436  // return _periodos.Count(p => p.Ejercicio == periodo.Anterior) > 0;
1437  // }
1438  // else
1439  // {
1440  // return false;
1441  // }
1442  // }
1443  //}
1444 
1448  //public class PeriodoItem
1449  //{
1450  // /// <summary>
1451  // /// Ejercicio
1452  // /// </summary>
1453  // public string Ejercicio { get; set; }
1454  // /// <summary>
1455  // /// Fecha de inicio de período
1456  // /// </summary>
1457  // public DateTime PeriodoIni { get; set; }
1458  // /// <summary>
1459  // /// Fecha de fin de período
1460  // /// </summary>
1461  // public DateTime PeriodoFin { get; set; }
1462  // /// <summary>
1463  // /// Ejercicio anterior
1464  // /// </summary>
1465  // public string Anterior { get; set; }
1466 
1467  // /// <summary>
1468  // /// Constructor
1469  // /// </summary>
1470  // /// <param name="tcEjecicio"></param>
1471  // /// <param name="tdPeriodoIni"></param>
1472  // /// <param name="tdPeriodoFin"></param>
1473  // public PeriodoItem(string tcEjecicio, DateTime tdPeriodoIni, DateTime tdPeriodoFin, string tcAnterior)
1474  // {
1475  // Ejercicio = tcEjecicio.TrimEnd();
1476  // PeriodoIni = tdPeriodoIni;
1477  // PeriodoFin = tdPeriodoFin;
1478  // Anterior = tcAnterior.TrimEnd();
1479  // }
1480 
1481  // public string ToString(string tcAlias, string tcCampo)
1482  // {
1483  // string lcPeriodo = tcAlias + tcCampo + " >= " + DB.SQLString(PeriodoIni) +
1484  // " AND " + tcAlias + tcCampo + " <= " + DB.SQLString(PeriodoFin);
1485  // return lcPeriodo;
1486  // }
1487 
1488  // /// <summary>
1489  // /// Método que determina si una fecha pertenece al período
1490  // /// </summary>
1491  // /// <param name="tdFecha"></param>
1492  // /// <returns></returns>
1493  // public bool PerteneceAlPeriodo(DateTime tdFecha)
1494  // {
1495  // return (tdFecha.CompareTo(PeriodoIni) >= 0 && tdFecha.CompareTo(PeriodoFin) <= 0);
1496  // }
1497  //}
1498  }
1499 }
ComparativosMensuales(eTipoComparativa teTipoComparativo)
Constructor base
virtual string ObtenerColumnasBaseParaPivot()
Método virtual que obtiene las columnas que sirven de base para realizar el PIVOT ...
Plantilla para la creación de controles de tipo Filtro
Clase abstracta de base para comparativos mensuales
virtual string ObtenerColumnasDetalleAdicional()
Por si se requieren columnas adicionales
Clase período (Item)
Definition: Periodos.cs:197
virtual void DeterminarTipoAgrupacion()
Método virtual para determinar el tipo de agrupación de los datos
override void _SetColumnMasks()
Override del método de mascaras. Los títulos cambian con los años por lo que se mira por tipo de dato...
DataTable _DataTable
Objeto DataTable dónde podremos indicar un orígen de datos (DataTable) para el combo o grid ...
ConfiguradorFiltroVisual _ToConfiguradorFiltroVisual()
Genera un configurador visual a partir de los valores del control
override List< string > _Lista
Override de Lista de valores seleccionados para realizar operaciones adicionales
eTipoComparativa
Tipo de comparativa mensual
string ToFilterString(string tcAlias, string tcCampo)
Genera una cadena para filtros
Definition: Periodos.cs:237
_Tipo_Filtro_Fecha
Enumeración de los posibles filtros fecha a realizar
override void _ConvertVisualFiltersOptionsToObjects(Dictionary< string, object > toFiltrosVisuals=null, Dictionary< string, object > toOpcionesVisuals=null)
Override del método de conversión para recuperar los ejercicios
bool PerteneceAlPeriodo(DateTime tdFecha)
Método que determina si una fecha pertenece al período
Definition: Periodos.cs:249
virtual void DeterminarOpcionDeSuma()
Determina el tipo de opción de suma
virtual string ObtenerCodigoListadoDeNavegacion()
Obtiene los códigos de listados de navegación
new ewtxtcodlabel _oFiltroDesde
txtcodlabel de filtro para obtener el valor Mínimo
DateTime PeriodoIni
Fecha de inicio de período
Definition: Periodos.cs:206
_Operador_Condicional
Enumeración de los posbiles operadores a utilizar en el inicio de los filtros (PE-81807) ...
void ReordenarColumnasEjercicioPartido(ref DataTable tdtDatos)
Método de reordenación de columnas en base al trabajo con ejercicio partido
static Periodos Instancia
Instancia SINGLETON para períodos
Definition: Periodos.cs:18
override void _Navigate(string tcKeyNavigate, DataRow trRowList, Dictionary< string, object > tdicParams)
Override del _Navigate
virtual void DeterminarOpcionDeFecha()
Determina el tipo de opción de fecha deseado
Clase SINGLETON para la gestión de períodos
Definition: Periodos.cs:12
DateTime PeriodoFin
Fecha de fin de período
Definition: Periodos.cs:210
void CalcularFechas(string tcEjercicio, DataRow trRow, out DateTime tdFechaIni, out DateTime tdFechaFin)
Método auxiliar para reconvertir el Row en un rango de fechas
override void _SetEjercicios()
Override del _SetEjercicios pq estropea el funcionamiento multiejercicio del listado ...
static DateTime FirstDateOfWeekISO8601(int tnYear, int tnWeekOfYear)
Función auxiliar de la normativa ISO 8601 para obtener la fecha del primer día de una semana ...
override void _SetDefaultConfig(Dictionary< string, object > _Filtros, Dictionary< string, object > _Opciones)
Override del método para establecer la configuración (no visual) por defecto
int Count()
Obtiene el número de períodos
Definition: Periodos.cs:99
DateTime FirstDateOfWeek(int year, int weekNum)
Función auxiliar para obtener la fecha del primer día de una semana (sin norma especial => 01/01/xxxx...
bool usarEscalaDeTiempo()
Determina si se ha seleccionado no utilizar escala de tiempo
void CalcularParametrosAgrupacion(string tcAliasDatos)
Calcula los parametros de la agrupación solicitada
Dictionary< string, string > _FiltroFechaPorEjercicio(Dictionary< string, object > toFiltros, string teFiltro, string tcAlias, string tcCampo, string[] taEjecicios, _Operador_Condicional teOperador=_Operador_Condicional.And)
Método para preparar un filtro de tipo fecha
int ObtenerNumeroSemanasEjercicio(string ejercicio)
Obtiene el número de semanas que tiene un ejercicio
ComparativosMensuales(eTipoComparativa teTipoComparativo, object[] toObjects)
Constructor con parametros de entrada
void _GarantizarAlmenosUnRegistro(ref DataTable tdtResultados)
Método de corrección para garantizar que almenos haya un registro