AsientoPredefinidoGestorDeVariables.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using sage.ew.global;
6 using sage.ew.interficies;
7 
8 namespace sage.ew.contabilidad
9 {
13  internal class AsientoPredefinidoGestorDeVariablesImpl : IAsientoPredefinidoGestorDeVariables
14  {
15  #region Variables
16 
17  readonly AsientosPredefinidosGenerador generadorDePredefinidos;
18 
22  private readonly bool _trabajaConSeriesDeFactura = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_serfact"));
23 
24  #endregion Variables
25 
26  #region Constructores
27 
31  private AsientoPredefinidoGestorDeVariablesImpl() { }
32 
37  public AsientoPredefinidoGestorDeVariablesImpl(AsientosPredefinidosGenerador toGenerador)
38  {
39  generadorDePredefinidos = toGenerador;
40  }
41 
42  #endregion Constructores
43 
44  #region Métodos públicos
45 
46  #region Nombres de variables
47 
52  public IEnumerable<string> _ObtenerNombresDeVariablesTodos()
53  {
54  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.Todas);
55  }
56 
61  public IEnumerable<string> _ObtenerNombresDeVariablesColumnaCuenta()
62  {
63  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloPropiedadCuenta);
64  }
65 
70  public IEnumerable<string> _ObtenerNombresDeVariablesColumnaRelacion()
71  {
72  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloPropiedadRelacion);
73  }
74 
79  public IEnumerable<string> _ObtenerNombresDeVariablesColumnaCuentaAsignacion()
80  {
81  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloPropiedadCtaAsignacion);
82  }
83 
88  public IEnumerable<string> _ObtenerNombresDeVariablesDeTipoCuenta()
89  {
90  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloCuentas);
91  }
92 
97  public IEnumerable<string> _ObtenerNombresDeVariablesDeTipoVariable()
98  {
99  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloVariables);
100  }
101 
106  public IEnumerable<string> _ObtenerNombresDeVariablesDebeHaber()
107  {
108  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloVariables);
109  }
110 
111  #endregion Nombres de variables
112 
113  #region IVaribleAsientoPredefinido
114 
119  public IEnumerable<IAsientoPredefinidoVarible> _ObtenerVariablesDeTipoCuenta()
120  {
121  return obtenerVariablesFiltradasPor(TipoFiltroVariables.SoloCuentas);
122  }
123 
128  public IEnumerable<IAsientoPredefinidoVarible> _ObtenerVariablesDeTipoVariable()
129  {
130  return obtenerVariablesFiltradasPor(TipoFiltroVariables.SoloVariables);
131  }
132 
137  public IEnumerable<IAsientoPredefinidoVarible> _ObtenerVariablesColumnaRelacion()
138  {
139  return obtenerVariablesFiltradasPor(TipoFiltroVariables.SoloPropiedadRelacion);
140  }
141 
146  public IEnumerable<IAsientoPredefinidoVarible> _ObtenerVariablesColumnaCuentaAsignacion()
147  {
148  return obtenerVariablesFiltradasPor(TipoFiltroVariables.SoloPropiedadCtaAsignacion);
149  }
150 
151 
156  public IEnumerable<IAsientoPredefinidoVarible> _ObtenerVariablesColumnaDebeHaber()
157  {
158  return obtenerVariablesFiltradasPor(TipoFiltroVariables.SoloDebeHaber);
159  }
160 
161  #endregion IVaribleAsientoPredefinido
162 
167  public void _EstablecerVariables(Dictionary<string, string> tdicValores)
168  {
169  foreach (var lineaAsientoPredef in generadorDePredefinidos._LineasAsientoPredefinido)
170  {
171  lineaAsientoPredef._EstablecerVariables(tdicValores);
172  }
173  }
174 
179  public void _EstablecerVariablesDebeHaber(Dictionary<string, string> tdicValores)
180  {
181  foreach (var lineaAsientoPredef in generadorDePredefinidos._LineasAsientoPredefinido)
182  {
183  lineaAsientoPredef._EstablecerVariablesDebeHaber(tdicValores);
184  }
185  }
186 
191  public void _EstablecerVariables(IEnumerable<IAsientoPredefinidoVarible> tlisValores)
192  {
193  //Creo un diccionario de valores e invoco al método convencional
194  Dictionary<string, string> dicValores = new Dictionary<string, string>();
195 
196  tlisValores.ToList().ForEach(variable => dicValores.Add(variable._Clave, variable._Valor));
197 
198  _EstablecerVariables(dicValores);
199  }
200 
204  private void Init()
205  {
206  //Limpio lo que pudiera tener
207  claseInicializada = false;
208  contadorAutomatico = 1;
209  dicValoresPorDefecto.Clear();
210  lisNombresVariablesFraInicializados.Clear();
211 
212  //Ha de obtener el número de asientos y por asiento determinar si hay variables de factura y si estas variables admiten valores automàticos
213  bool tengoVariablesFactura = _ObtenerNombresDeVariablesColumnaRelacion().Count() > 0;
214  if (tengoVariablesFactura)
215  {
216  inicilizarValoresFactura(); //Llamo
217  }
218 
219  claseInicializada = true;
220  }
221 
222  private void inicilizarValoresFactura()
223  {
224  //Recupero la cantidad de asientos a generar
225  var numerosDeAsientos = generadorDePredefinidos._LineasAsientoPredefinido.Select(linea => linea._Asiento).Distinct().ToList();
226 
227  //Ordeno lo que me llega
228  var lineasOrdenadas = generadorDePredefinidos._LineasAsientoPredefinido.OrderBy(loEle => loEle._Asiento).ThenBy(loEle => loEle._Orden).ToList();
229 
230  foreach (var numeroDeAsiento in numerosDeAsientos) //Voy iterando por los asientos a generar
231  {
232  var lineasDelAsiento = lineasOrdenadas.Where(lolinea => lolinea._Asiento == numeroDeAsiento).ToList();
233  inicializarValoresFacturaPorAsientoDeLasLineas(lineasDelAsiento);
234  }
235  lisNombresVariablesFraInicializados = _ObtenerNombresDeVariablesColumnaRelacion().ToList();
236  }
237 
238  private void inicializarValoresFacturaPorAsientoDeLasLineas(List<AsientoPredefinido.LineaAsientoPredefinido> lineasDelAsiento)
239  {
240  if (lineasDelAsiento.Any() && contieneVariablesDeFactura(lineasDelAsiento)) //Si el asiento tiene lineas y variables de factura en esas lineas
241  {
242  var nombresVariablesDeFactura = obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloPropiedadRelacion, lineasDelAsiento).ToList();
243  if (nombresVariablesDeFactura.Count() == 1) //Si solo tengo una...
244  {
245  string nombre = nombresVariablesDeFactura.First();
246  bool necesitaFactura = generadorDePredefinidos._DebeContenerInformacionDeFactura(lineasDelAsiento);
247  if (necesitaFactura)
248  {
249  bool esDeCompras = generadorDePredefinidos._ModoCompras(lineasDelAsiento);
250  if (esDeCompras) //Para compras se requiere el flag
251  {
252  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_factucom")))
253  {
254  insertarValorDefectoFactura(nombre, obtenerLiteralNumeradoFra());
255  }
256  else //Sino hay contador, no puedo dar número
257  insertarValorDefectoFactura(nombre, "");
258 
259  }
260  else //Ventas... automático
261  {
262  insertarValorDefectoFactura(nombre, obtenerLiteralNumeradoFra());
263  }
264  }
265  else
266  insertarValorDefectoFacturaSiFalta(nombre, ""); //No es una factura => Que lo inserte blanco sino lo tiene, si ya lo ha insertado previamente que respete el valor
267  }
268  else //Hay varias... no tengo ni idea de como procesarlas, asigno valor blanco sino lo tengo definido ya
269  {
270  nombresVariablesDeFactura.ForEach(nombre => insertarValorDefectoFacturaSiFalta(nombre, "")); //Inserto como blancos los que no tengo
271  }
272  }
273  }
274 
275  private bool todasLasFacturasConValorDefecto()
276  {
277  var variablesFacturaActual = _ObtenerNombresDeVariablesColumnaRelacion().ToList();
278  return (variablesFacturaActual.All(loVar => lisNombresVariablesFraInicializados.Contains(loVar)));
279  }
280 
281  private string obtenerLiteralNumeradoFra()
282  {
283  string literal = "<<NúmeroAutomático" + contadorAutomatico + ">>";
284  contadorAutomatico += 1;
285  return literal;
286  }
287 
288  private void insertarValorDefectoFacturaSiFalta(string tcClave, string tcValor)
289  {
290  if (!dicValoresPorDefecto.ContainsKey(tcClave))
291  dicValoresPorDefecto.Add(tcClave, tcValor);
292  }
293 
294  private void insertarValorDefectoFactura(string tcClave, string tcValor)
295  {
296  if (dicValoresPorDefecto.ContainsKey(tcClave))
297  {
298  if (String.IsNullOrWhiteSpace(dicValoresPorDefecto[tcClave])) //Sólo actualizo si el valor es blanco
299  dicValoresPorDefecto[tcClave] = tcValor;
300  }
301  else
302  dicValoresPorDefecto.Add(tcClave, tcValor);
303  }
304 
305  private bool contieneVariablesDeFactura(IEnumerable<AsientoPredefinido.LineaAsientoPredefinido> source)
306  {
307  return obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloPropiedadRelacion, source).Count() > 0;
308  }
309 
315  public string ObtenerValorPorDefectoDe(string tcNombreVariable)
316  {
317  if (String.IsNullOrWhiteSpace(tcNombreVariable))
318  return "";
319 
320  if (!claseInicializada) //Sino esta inicializada
321  Init();
322  else
323  {
324  if (!todasLasFacturasConValorDefecto()) //Esta inicializada pero han cambiado valores => inicializo sin restear
325  inicilizarValoresFactura();
326  }
327 
328  tcNombreVariable = tcNombreVariable.TrimEnd();
329 
330  //Si tengo el valor en el diccionario lo devuelvo sino blanco
331  if (dicValoresPorDefecto.ContainsKey(tcNombreVariable))
332  return dicValoresPorDefecto[tcNombreVariable];
333  else
334  return "";
335  }
336 
337  #endregion Métodos públicos
338 
339  private int contadorAutomatico = 1;
340  private Dictionary<string, string> dicValoresPorDefecto = new Dictionary<string, string>();
341  private bool claseInicializada = false;
342  private List<string> lisNombresVariablesFraInicializados = new List<string>();
343 
344  private enum TipoFiltroVariables
345  {
349  Todas = 0,
353  SoloCuentas = 1,
357  SoloVariables = 2,
361  SoloPropiedadCuenta = 3,
365  SoloPropiedadCtaAsignacion = 4,
369  SoloPropiedadRelacion = 5,
373  SoloDebeHaber = 6,
377  //SoloPropiedadContrapar = 7,
378  }
379 
386  private IEnumerable<string> obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables teTipoFiltrado, IEnumerable<AsientoPredefinido.LineaAsientoPredefinido> source = null)
387  {
388  //Lista de retorno
389  List<string> llisVariables = new List<string>();
390  List<string> llisVariablesTemp = new List<string>();
391 
392  //Sino me han pasado un subconjunto de líneas, evaluo todas
393  if (source == null)
394  source = generadorDePredefinidos._LineasAsientoPredefinido;
395 
396  foreach (var lineaAsientoPredef in source)
397  {
398  switch (teTipoFiltrado)
399  {
400 
401  case TipoFiltroVariables.SoloCuentas:
402  llisVariablesTemp = lineaAsientoPredef._ObtenerVariablesPropiedadesDeTipoCuenta();
403  break;
404 
405 
406  case TipoFiltroVariables.SoloVariables:
407  llisVariablesTemp = lineaAsientoPredef._ObtenerVariablesPropiedadesExceptoDeTipoCuenta();
408  break;
409 
410 
411  case TipoFiltroVariables.SoloPropiedadCuenta:
412  llisVariablesTemp = lineaAsientoPredef._ObtenerVariablesPropiedadCuenta();
413  break;
414 
415 
416  case TipoFiltroVariables.SoloPropiedadCtaAsignacion:
417  llisVariablesTemp = lineaAsientoPredef._ObtenerVariablesPropiedadCtaAsig();
418  break;
419 
420  case TipoFiltroVariables.SoloPropiedadRelacion:
421  llisVariablesTemp = lineaAsientoPredef._ObtenerVariablesPropiedadRelacion();
422  break;
423 
424  case TipoFiltroVariables.SoloDebeHaber:
425  llisVariablesTemp = lineaAsientoPredef._ObtenerVariablesPropiedadesDebeHaber();
426  break;
427 
428  case TipoFiltroVariables.Todas:
429  default:
430  llisVariablesTemp = lineaAsientoPredef._ObtenerVariables();
431  break;
432  }
433 
434  llisVariables.AddRange(llisVariablesTemp);
435  }
436 
437  return llisVariables.Distinct().ToList().OrderBy(loEle => loEle);
438  }
439 
446  private IEnumerable<IAsientoPredefinidoVarible> obtenerVariablesFiltradasPor(TipoFiltroVariables teTipoFiltrado, IEnumerable<AsientoPredefinido.LineaAsientoPredefinido> source = null)
447  {
448  List<IAsientoPredefinidoVarible> listaVariables = new List<IAsientoPredefinidoVarible>();
449 
450  //Sino me han pasado un subconjunto de líneas, evaluo todas
451  if (source == null)
452  source = generadorDePredefinidos._LineasAsientoPredefinido;
453 
454  //Primero debo obtener la lista de nombres de variables
455  var nombresDeVariables = obtenerNombresDeVariableFiltradasPor(teTipoFiltrado, source);
456  if (nombresDeVariables.Any())
457  {
458  //Una vez tengo los nombres debo determinar si hay alguna que requiera lógica especial de asignación (facturas básicamente)
459  var nombresDeVariablesDeFactura = obtenerNombresDeVariableFiltradasPor(TipoFiltroVariables.SoloPropiedadRelacion, source);
460  if (nombresDeVariablesDeFactura.Any()) //Si hay alguna de tipo factura
461  {
462  //Busco las coincidentes
463  var variablesCoincidentes = nombresDeVariables.Intersect(nombresDeVariablesDeFactura).ToList();
464  if (variablesCoincidentes.Any())
465  {
466  variablesCoincidentes.ForEach(nombreDeVariable => listaVariables.Add(generarVariable(nombreDeVariable, source)));
467  nombresDeVariables = nombresDeVariables.Except(variablesCoincidentes).ToList(); //Suprimo las que ya he instanciado
468  }
469  }
470 
471  //Instancio el negocio para las variables normales
472  foreach (var nombreDeVariable in nombresDeVariables)
473  {
474  listaVariables.Add(new VariableDeSusticionEnAsientoPredefinido(nombreDeVariable));
475  }
476  }
477 
478  return listaVariables;
479  }
480 
487  private IAsientoPredefinidoVarible generarVariable(string tcNombreVariable, IEnumerable<AsientoPredefinido.LineaAsientoPredefinido> source)
488  {
489  IAsientoPredefinidoVarible nuevaVariable = null;
490 
491  string varible = "[" + tcNombreVariable + "]"; //Reconstruyo el formato de variable para poder buscarla
492 
493  var lineasConLaVariable = source.Where(loLinea => loLinea._Relacion.Contains(varible)).ToList();
494  var numerosDeAsiento = lineasConLaVariable.Select(lolinea => lolinea._Asiento).ToList();
495  foreach (var numAsiento in numerosDeAsiento)
496  {
497  var lineasDelAsiento = source.Where(lolinea => lolinea._Asiento == numAsiento).ToList();
498  if (generadorDePredefinidos._EsFacturaCompra(lineasDelAsiento) ||
499  generadorDePredefinidos._EsFacturaNominas(lineasDelAsiento) ||
500  lineasDelAsiento.Any(l => l._IvaNoSujeto && CONTABILIDAD._EsProveedor(l._Cuenta)))
501  {
502  nuevaVariable = new VariableDeFacturaCompraEnAsientoPredefinido(tcNombreVariable, ObtenerValorPorDefectoDe(tcNombreVariable));
503  break;
504  }
505  else
506  {
507  if(generadorDePredefinidos._EsFacturaVenta(lineasDelAsiento) ||
508  lineasDelAsiento.Any(l => l._IvaNoSujeto && CONTABILIDAD._EsCliente(l._Cuenta)))
509  {
510 
511  //Bug 171444 => Propagar serie de factura
512  var serieFactura = (_trabajaConSeriesDeFactura ? generadorDePredefinidos._SerieFactura : "");
513  nuevaVariable = new VariableDeFacturaVentaEnAsientoPredefinido(tcNombreVariable, ObtenerValorPorDefectoDe(tcNombreVariable), serieFactura);
514  break;
515  }
516  }
517  }
518 
519  if(nuevaVariable == null)
520  {
521  //No debería...
522  Trace.WriteLineIf(Debugger.IsAttached, "Tipo de variable de factura no inicializado.");
523  nuevaVariable = new VariableDeSusticionEnAsientoPredefinido(tcNombreVariable); //Variable corriente y moliente
524  }
525 
526  return nuevaVariable;
527  }
528 
529  }
530 }
Interficie que a parte de heredar las operaciones con variables incluye las de gestión ...
Interficie para las variables de asientos predefinidos