AsientoPredefinidoGestorDeEjecuciones.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using sage.ew.cliente;
6 using sage.ew.docscompra;
7 using sage.ew.global;
8 using sage.ew.interficies;
9 
10 namespace sage.ew.contabilidad
11 {
15  internal class AsientoPredefinidoGestorDeEjecuciones
16  {
20  private readonly AsientosPredefinidosGenerador generadorPredefinidos;
21 
25  private List<AsientoPredefinidoEjecutado> generacionesEjecutadas = new List<AsientoPredefinidoEjecutado>();
26 
27  private Dictionary<string, string> dicFacturasAutomaticas = new Dictionary<string, string>();
28 
29  #region Constructores
30 
34  AsientoPredefinidoGestorDeEjecuciones() { }
35 
40  public AsientoPredefinidoGestorDeEjecuciones(AsientosPredefinidosGenerador toGenerador) : this()
41  {
42  generadorPredefinidos = toGenerador;
43  }
44 
45  #endregion Constructores
46 
52  public void AddOperacionEjecutada(IEnumerable<AsientoPredefinido.LineaAsientoPredefinido> toLineas, IAsientos toAsientoGenerado)
53  {
54  generacionesEjecutadas.Add(new AsientoPredefinidoEjecutado(generadorPredefinidos, toLineas, toAsientoGenerado));
55  }
56 
60  public void Init()
61  {
62  generacionesEjecutadas.Clear();
63  dicFacturasAutomaticas.Clear();
64  }
65 
69  public void Execute(Dictionary<string, string> tdicNumFraAutomatico)
70  {
71  dicFacturasAutomaticas = tdicNumFraAutomatico;
72 
73  //Bug 142044 => Corrección de definiciones
74  CorreccionDeDefinicionesEnAsientoGenerado();
75 
76  //Primero ejecutamos las acciones relativas a las líneas y posteriormente miramos si tiene que ejecutar otro predefinido
77  if (TieneRelacionesInformadas())
78  {
79  //Debo realizar el tratamiento. En principio solo contemplamos matar previsiones por lo que filtro las ejecuciones de ese tipo
80  var ejecucionesDePagos = generacionesEjecutadas.Where(loExec => loExec.EsUnPagoConRelaciones()).ToList();
81  ejecucionesDePagos.ForEach(loEjecucion => MatarPrevisonesDePago(loEjecucion));
82 
83  var ejecucionesDeCobros = generacionesEjecutadas.Where(loExec => loExec.EsUnCobroConRelaciones()).ToList();
84  ejecucionesDeCobros.ForEach(loEjecucion => MatarPrevisonesDeCobro(loEjecucion));
85  }
86 
87  //Ejecutamos el predefinido concatenado (si lo hay)
88  if (generadorPredefinidos.TienePredefinidoConcatenado())
89  {
90  string codigoPredefinidoConcatenado = generadorPredefinidos.GetPredefinidoConcatenado();
91  Trace.WriteLineIf(Debugger.IsAttached, "Invocar predefinido concatenado " + codigoPredefinidoConcatenado, "AsientosPredefinidos");
92 
93  if(generacionesEjecutadas.Any() && generacionesEjecutadas.First().GetAsiento() != null)
94  {
95  //Utilizo la fecha de uno de los asientos generados
96  var fechaDeAsientoGenerado = generacionesEjecutadas.First().GetAsiento()._Fecha;
97  AsientosPredefinidosGenerador._CargarPredefinidoEnAsiento(codigoPredefinidoConcatenado, fechaDeAsientoGenerado);
98  }
99  else //Raro entrar por aqui...
100  AsientosPredefinidosGenerador._CargarPredefinidoEnAsiento(codigoPredefinidoConcatenado);
101  }
102  }
103 
107  private void CorreccionDeDefinicionesEnAsientoGenerado()
108  {
109  //Primera parte => Sustituir literal <<NúmeroAutomáticoX>> en las definiciones
110  dicFacturasAutomaticas.ToList().ForEach(kvp => SustituirLiteralesAutomaticosEnNombre(kvp.Key, "[" + kvp.Value + "]"));
111 
112  //Segunda parte => Con las definiciones corregidas sustituyo los literales del asiento generado y grabo
113  generacionesEjecutadas.ForEach(ejecucion => CorregirDefiniciones(ejecucion));
114  }
115 
116  private void CorregirDefiniciones(AsientoPredefinidoEjecutado ejecucion)
117  {
118  //Sino ha generado asiento acabo
119  if (ejecucion.GetAsiento() == null)
120  return;
121 
122  var lineasPredefinido = ejecucion.GetLineas().ToList();
123  var asiento = ejecucion.GetAsiento();
124 
125  //CCR 149209 => Había 2 tratamientos para resolver la definición, se modifica y centraliza
126  AsientosPredefinidosGenerador.RestablecerDefinicionesLineas(lineasPredefinido, asiento, dicFacturasAutomaticas);
127  }
128 
134  private void SustituirLiteralesAutomaticosEnNombre(string tcLiteral, string tcValor)
135  {
136  //Me recorro todas las ejecuciones sustituyendo el texto <<NúmeroAutmaticoX>>
137  generacionesEjecutadas.ForEach(ejecucion =>
138  {
139  var lineas = ejecucion.GetLineas().ToList();
140  lineas.ForEach(linea => linea._Definicion = linea._Definicion.Replace(tcLiteral, tcValor));
141  });
142  }
143 
148  private void MatarPrevisonesDePago(AsientoPredefinidoEjecutado loEjecucion)
149  {
150  //Santi: Este método deberá ser adaptado cuando se asuma la revisión de negocio relativa a previsiones
151 
152  //Se amplia el concepto de 'banco' a 'tesoreria' que hace de banco
153  string banco = loEjecucion.GetLineas().Where(lolinea => CONTABILIDAD._EsTesoreria(lolinea._Cuenta)).FirstOrDefault()._Cuenta;
154  string proveedor = loEjecucion.GetLineas().Where(lolinea => CONTABILIDAD._EsProveedor(lolinea._Cuenta)).FirstOrDefault()._Cuenta;
155  decimal importe = loEjecucion.GetAsiento()._TotalDebe;
156  DateTime fecha = loEjecucion.GetAsiento()._Fecha;
157  string empresa = loEjecucion.GetAsiento()._Empresa;
158  string asi = loEjecucion.GetAsiento()._Lineas.First()._Asi;
159 
160  //Obtención de la factura
161  string factura = loEjecucion.ObtenerRelaciones().FirstOrDefault(); //Devuelve el número de automàtico o el valor literal
162  if (dicFacturasAutomaticas.Keys.Contains(factura))
163  factura = dicFacturasAutomaticas[factura]; //Sustituyo el número de automático por su valor
164 
165  //Busco las previsiones
166  PrevisionPago loPrevision = new PrevisionPago();
167  loPrevision._Empresa = empresa;
168  loPrevision._Factura = factura;
169  loPrevision._Proveedor = proveedor;
170  loPrevision._Ejercicio = Convert.ToInt32(EW_GLOBAL._GetVariable("wc_any"));
171  List<PrevisionPago> lisPrevisiones = loPrevision._Lista_Previsiones(PrevisionPago.EstadoPrevisiones.Pendientes);
172  decimal totalPendiente = 0.0M;
173  lisPrevisiones.ForEach(prevision => totalPendiente = totalPendiente + prevision._Importe);
174  decimal diferencia = Math.Abs(totalPendiente - importe);
175 
176  //Validar Importe
177  if (diferencia.CompareTo(0.011M) <= 0)
178  {
179  lisPrevisiones.ForEach(prevision => prevision._Contbilizar_VincularPrevisionConAsiento(fecha, asi, banco));
180  }
181 
182 
183  }
184 
189  private void MatarPrevisonesDeCobro(AsientoPredefinidoEjecutado loEjecucion)
190  {
191  //Santi: Este método deberá ser adaptado cuando se asuma la revisión de negocio relativa a previsiones
192 
193  //Se amplia el concepto de 'banco' a 'tesoreria' que hace de banco
194  string banco = loEjecucion.GetLineas().Where(lolinea => CONTABILIDAD._EsTesoreria(lolinea._Cuenta)).FirstOrDefault()._Cuenta;
195  string cliente = loEjecucion.GetLineas().Where(lolinea => CONTABILIDAD._EsCliente(lolinea._Cuenta)).FirstOrDefault()._Cuenta;
196  decimal importe = loEjecucion.GetAsiento()._TotalDebe;
197  DateTime fecha = loEjecucion.GetAsiento()._Fecha;
198  string empresa = loEjecucion.GetAsiento()._Empresa;
199  string asi = loEjecucion.GetAsiento()._Lineas.First()._Asi;
200 
201  string factura = loEjecucion.ObtenerRelaciones().FirstOrDefault(); //Devuelve el número de automàtico o el valor literal
202  if (dicFacturasAutomaticas.Keys.Contains(factura))
203  factura = dicFacturasAutomaticas[factura]; //Sustituyo el número de automático por su valor
204 
205  PrevisionCobro loPrevision = new PrevisionCobro();
206  loPrevision._Empresa = empresa;
207  loPrevision._Factura = factura;
208  loPrevision._Cliente = cliente;
209  loPrevision._Ejercicio = Convert.ToInt32(EW_GLOBAL._GetVariable("wc_any"));
210  List<PrevisionCobro> lisPrevisiones = loPrevision._Lista_Previsiones(PrevisionCobro.EstadoPrevisiones.Pendientes);
211 
212  decimal totalPendiente = 0.0M;
213  lisPrevisiones.ForEach(prevision => totalPendiente = totalPendiente + prevision._Importe);
214  decimal diferencia = Math.Abs(totalPendiente - importe);
215 
216  //Validar Importe
217  if (diferencia.CompareTo(0.011M) <= 0)
218  {
219  lisPrevisiones.ForEach(prevision => prevision._Contbilizar_VincularPrevisionConAsiento(fecha, asi, banco));
220  }
221  }
222 
223  private bool TieneRelacionesInformadas()
224  {
225  return generacionesEjecutadas.Any(ejecucion => ejecucion.ContieneRelaciones());
226  }
227  }
228 }
Clase para las previsiones de cobro
Interficie Asientos
Definition: IAsientos.cs:17
string _Empresa
Código de empresa.
string _Proveedor
Código de proveedor Contable
List< PrevisionPago > _Lista_Previsiones(EstadoPrevisiones tcEstadoPrevision=EstadoPrevisiones.Todas)
Ens retorna les previsions relacionades amb una factura.
EstadoPrevisiones
Estado de las previsiones
string _Cliente
Código de cliente Contable
EstadoPrevisiones
Estado de las previsiones
Clase para las previsiones de pago de proveedores
List< PrevisionCobro > _Lista_Previsiones(EstadoPrevisiones tcEstadoPrevision=EstadoPrevisiones.Todas)
Ens retorna les previsions relacionades amb una factura.
string _Factura
Número de factura
string _Factura
Número de factura
string _Empresa
Código de empresa.