RemesaBancariaPago.cs
1 using System;
2 using System.Data;
3 using System.Windows.Forms;
4 using System.ComponentModel;
5 using System.Collections.Generic;
6 using System.ComponentModel.DataAnnotations;
7 using System.Linq;
8 
9 using sage.ew.global;
10 using sage.ew.db;
11 using sage.ew.interficies;
12 using sage.ew.contabilidad.Form;
13 using sage.ew.ewbase;
14 using sage.ew.docscompra;
15 using sage.ew.ewbase.Attributes;
16 using sage.ew.functions;
17 using sage.ew.netvfp;
19 using sage.ew.functions.Clases;
20 
21 namespace sage.ew.contabilidad
22 {
35  public partial class RemesaBancariaPago : RemesaBancaria
36  {
37  #region PROPIEDADES PRIVADAS
38 
42  private RemesaBancariaDetallePrevis remesaBancariaDetallePrevis;
43 
44 
45  #endregion PROPIEDADES PRIVADAS
46 
47 
48  #region PROPIEDADES PÚBLICAS
49 
50 
58  [FieldName("Tiporemesa")]
59  [DisplayName("Tipo de esquema SEPA:")]
60  [ReportProperty("EsquemaSepa", "", "Tipo de esquema SEPA::")]
61  [DefaultValue(TipoEsquemaRemesaSepaPagos.Ninguno)]
62  public TipoEsquemaRemesaSepaPagos _EsquemaSepa
63  {
64  get
65  {
66  if (!Enum.IsDefined(typeof(TipoEsquemaRemesaSepaPagos), this._nEsquemaSepa))
67  {
68  this._nEsquemaSepa = (int)TipoEsquemaRemesaSepaPagos.Ninguno;
69  }
70  return (TipoEsquemaRemesaSepaPagos)this._nEsquemaSepa;
71  }
72  set
73  {
74  this._nEsquemaSepa = (int)value;
75  }
76  }
77 
78 
89  [FieldName("Tiporemesa")]
90  [DisplayName("Tipo de esquema SEPA:")]
91  [ReportProperty("EsquemaSepa", "", "Tipo de esquema SEPA::")]
92  [DefaultValue(0)]
93  public int _nEsquemaSepa
94  {
95  get
96  {
97  return Convert.ToInt32(this._Campo(this.GetFieldName(nameof(this._nEsquemaSepa))));
98  }
99  set
100  {
101  int lnValor = value;
102 
103  if (!Enum.IsDefined(typeof(TipoEsquemaRemesaSepaPagos), lnValor))
104  lnValor = (int)TipoEsquemaRemesaSepaPagos.Ninguno;
105 
106  this._Campo(this.GetFieldName(nameof(this._nEsquemaSepa)), lnValor);
107 
108  // Actualizar el campo tipo (disco o impresora) según si es una remesa SEPA si o no
109  this._Campo("TIPO", lnValor > 0 ? "D" : "I");
110 
111  }
112  }
113 
114 
119  [DefaultValue(false)]
120  public bool _Sepa
121  {
122  get
123  {
124  return ((int)this._Campo(this.GetFieldName(nameof(this._EsquemaSepa)))) >= 1;
125  }
126  }
127 
128 
132  public override IDocPrint _DocPrint
133  {
134  get
135  {
136  if (_oDocPrint == null)
137  _oDocPrint = (DocPrintRemesaBancariaPago)Activator.CreateInstance(typeof(DocPrintRemesaBancariaPago), this);
138 
139  return (DocPrintRemesaBancariaPago)_oDocPrint;
140  }
141  set { _oDocPrint = value; }
142  }
143 
144 
145  #endregion PROPIEDADES PÚBLICAS
146 
147 
148  #region CONSTRUCTORES
149 
150 
154  public RemesaBancariaPago() : base()
155  {
156  // Poner el código necesario en el método .Inicializar()
157 
158  return;
159  }
160 
161 
166  public RemesaBancariaPago(int numero) : base(numero)
167  {
168  // Poner el código necesario en el método .Inicializar()
169 
170  return;
171  }
172 
173 
174  #endregion CONSTRUCTORES
175 
176 
177  #region MÉTODOS PROTECTED OVERRIDE SOBREESCRITOS DE CLASE BASE 'DOCUMENTOBASE'
178 
179 
183  protected override void Inicializar()
184  {
185  this._TipoRemesaBancaria = TipoRemesaBancaria.Pago;
186 
187  // Asignamos las propiedades para el mantenimiento.
188  //
189  this._Clave = "EMPRESA,NUMERO";
190  this._DataBase = "GESTION";
191  this._Tabla = "REMESAPA";
192  this._TituloMantenimiento = "Remesa bancaria de pago";
193  this._TituloCabecera = "Remesa bancaria de pago";
194  this._TituloMenu = "Remesa bancaria de pago";
195 
196  this._Pantalla = "REM_PAGO";
197  this._FormManteBaseType = typeof(frmRemesaBancariaPago);
198 
199  // La remesa bancaria de pago actualmente (Julio 2019) solo puede ser de previsiones (no puede ser de pagarés), de entrada hacemos que la
200  // propiedad protected de 'detalleDocumento' de la clase base 'DocumentoBase' la cree de tipo detalles de previsiones de pago.
201  //
202  // Pensar que por compatibilidad con remesa de cobro donde se pueden crear remesas de dos tipos (previsiones o pagarés), aquí en remesa de
203  // pago se utilizará el mismo sistema de ManteTRels en previsión de que algún día puedan pedir hacer remesas de pago de pagarés.
204  //
205  // Al igual que en remesa de cobro, los objetos reales ManteTRel sobre los que trabajará la remesa bancaria de pago no será este objeto
206  // ManteTRel apuntado inicialmente por 'detalleDocumento' y que crea el constructor de la clase base 'DocumentoBase' (lo crea más adelante
207  // en la ejecución), sino que se crea (más abajo en este método) un ManteTRels de previsiones (en remesa de cobros se crean dos, el de
208  // previsiones y el de pagarés), y se hará que la propiedad 'detalleDocumento' de la clase base 'DocumentoBase' apunte a este ManteTRel de
209  // previsiones que hemos creado, prescindiendo del objeto ManteTRel al que inicialmente lo hace apuntar el constructor de 'DocumentoBase'
210  // del cual se descarta su uso.
211  //
212  // Si en un futuro se implementan remesas de pago de pagarés, al igual que en remesa de cobros, se creará un segundo ManteTRel de pagarés,
213  // y se hará que la propiedad 'detalleDocumento' apunte a un ManteTRel o a otro, en función del tipo de documento de la remesa.
214 
215  this._DetalleDocumentoType = typeof(RemesaBancariaDetallePrevis);
216  this._TypeLinea = typeof(RemesaBancariaDetallePrevis.Linea);
217 
218  // Datos de la tabla contador para poder obtener un nuevo número de remesa de pago.
219  //
220  this._cBdTablaContadorRemesa = "GESTION";
221  this._cTablaContadorRemesa = "EMPRESA";
222  this._cCampoEmpresaTablaContadorRemesa = "CODIGO";
223  this._cCampoContadorRemesa = "REMESAPA";
224 
225  // Creamos el mantetrel de previsiones de pago y hacemos apuntar la propiedad protected 'detalleDocumento' de la clase base 'DocumentoBase'
226  // al mantetrel de previsiones.
227  // De esta forma todo el código de la clase base 'DocumentoBase' que haga uso de la propiedad protected 'detalleDocumento' o de la propiedad
228  // pública _Detalle, continuará funcionando pues estará accediendo al ManteTRel de previsiones o al ManteTRel de pagarés, en función del tipo
229  // documento de remesa.
230  //
231  // Se mantiene el mismo sistema de creación de ManteTRel que en remesa bancaria de cobro, en previsión de si algún día nos piden por hacer
232  // remesas de pago de pagarés, con la salvedad de que aquí solo creamos de momento uno, el de previsiones (no creamos el de pagares), y también
233  // haremos apuntar la propiedad protected 'detalleDocumento' de la clase base 'DocumentoBase' a este ManteTRel aunque de momento no haya
234  // ningún otro.
235  //
236  this.remesaBancariaDetallePrevis = new RemesaBancariaDetallePrevis();
237  this._AddManteTRel(remesaBancariaDetallePrevis);
238 
239  this._ReportTitlePreview = this._TituloMantenimiento;
240  this._ReportBase = "DocumentoRemBancPago";
241 
242  return;
243  }
244 
245 
246  #endregion MÉTODOS PROTECTED OVERRIDE SOBREESCRITOS DE CLASE BASE 'DOCUMENTOBASE'
247 
248 
249  #region MÉTODOS PROTECTED OVERRIDE SOBREESCRITOS DE CLASE BASE 'REMESABANCARIA'
250 
251 
263  protected override void apuntarARemesaTipoDocumento(TipoDocumentoRemesa teTipoDocumentoRemesa)
264  {
265  switch (teTipoDocumentoRemesa)
266  {
267  case TipoDocumentoRemesa.Previsiones:
268  this.detalleDocumento = this.remesaBancariaDetallePrevis;
269  this._DetalleDocumentoType = typeof(RemesaBancariaDetallePrevis);
270  this._TypeLinea = typeof(RemesaBancariaDetallePrevis.Linea);
271  break;
272 
273  case TipoDocumentoRemesa.Pagares:
274  // Dejamos esto preparado por si algún día piden hacer remesa bancaria de pago de pagarés (al igual que en remesa de cobro).
275  break;
276  }
277  return;
278  }
279 
280 
287  protected override List<string> obtenerListaAsis()
288  {
289  List<string> lstAsis = new List<string>();
290  DataTable ldtAsisRelacs = new DataTable(), ldtAsisPrevis = new DataTable();
291  string lcSql = "", lcAsiRelac = "";
292  bool llOk = false;
293 
294  // En este punto si estoy ejecutando este procedimiento es por que la remesa está contabilizada lo cual quiere decir que todas las previsiones
295  // estan actualizadas en la bd. Puedo obtener los ASI,s de las previsiones accediendo directamente a la bd, en vez de ir mirando linea a linea
296  // la previsión de cobro del mantetrel de lineas y haciendo el _Load() de cada objeto PrevisionCobro. Mucho más rápido así.
297  //
298  DB.SQLExec("select asi from " + DB.SQLDatabase("comunes", "previs") + " " +
299  "where empresa=" + DB.SQLString(this._cEmpresa) + " and remesa=" + DB.SQLString(this._Numero) + " " +
300  "and empresa!=" + DB.SQLString("") + " and factura!=" + DB.SQLString("") + " and proveedor!=" + DB.SQLString("") + " and " +
301  "asi!=" + DB.SQLString("") + " " +
302  "order by vencim", ref ldtAsisPrevis);
303 
304  string lcAsi = "";
305  foreach (DataRow loRowPrevis in ldtAsisPrevis.Rows)
306  {
307  lcAsi = Convert.ToString(loRowPrevis["asi"]);
308  if (!lstAsis.Contains(lcAsi))
309  lstAsis.Add(lcAsi);
310 
311  // Obtengo los posibles asientos relacionados con el ASI de la prevision (para obtener los asientos 400-401 que se generan
312  // caso de asentar la remesa por vencimientos/proveedores y tener activado el OPCFLAG "ASENTAR REMESAS PAGO POR VTOS. MEDIANTE CUENTA DE EFECTOS"
313  // WL_EFEC_REMP).
314  //
315  lcSql = "select asi2 from " + DB.SQLDatabase("gestion", "asi_rel") + " " +
316  "where ejercicio=" + DB.SQLString(this._lcAny) + " and asi1=" + DB.SQLString(lcAsi) + " and asi2!=' '";
317  llOk = DB.SQLExec(lcSql, ref ldtAsisRelacs);
318 
319  foreach (DataRow loRow in ldtAsisRelacs.Rows)
320  {
321  lcAsiRelac = Convert.ToString(loRow["asi2"]);
322  if (!lstAsis.Contains(lcAsiRelac))
323  lstAsis.Add(lcAsiRelac);
324  }
325  }
326 
327  return lstAsis;
328  }
329 
330 
341  protected override bool generarAsientosPorConcepto(AsiRemAgruparPor teAsiRemAgruparPor, AsiRemCtaEfecDesc teAsiRemCtaEfecDesc, string tcCuentaContableBanco, string tcCuentaContablaEfecDescBanco, Dictionary<string, List<string>> toDicAsiEfecRemCta, ref string tcAsiRemesa)
342  {
343  bool llOk = false;
344  DateTime ldtVencimConcepto, ldtVencimPrevision;
345  int lnPeriodo, lnOrden, lnPendiente;
346  string lcFactura = "", lcProveedor="", lcCuentaLinea = "", lcAsi = "";
347  decimal lnImporteLinea = 0;
348  List<Tuple<int, string, int, int, int, string >> lstPrevisAsientoVencim = new List<Tuple<int, string, int, int, int, string>>();
349 
350 
351  // Si está activado el opcflag de "ASENTAR REMESAS PAGOPOR VTOS. MEDIANTE CUENTA DE EFECTOS" en vez de utilzarse cuentas 400 en los
352  // asientos de vencimiento o proveedor se utilizan cuentas 401, y además se hacen unos asientos adicionales para cada cuenta proveedor.
353  //
354  bool llEfecRemP = this._lEfecRemp && !string.IsNullOrWhiteSpace(this._cEfecRemP);
355 
356  // Si no llega instanciado un valor en tcAsiRemesa quiere decir que el ASI que hemos de devolver lo hemos
357  // de obtener dentro de este método y corresponderá al ASI del ultim asiento que generemos (al igual que hace
358  // FOX)
359  //
360  bool llObtenerAsiUltimoConcepto = string.IsNullOrWhiteSpace(tcAsiRemesa);
361 
362  // Agrupo las previsiones de la remesa por vencimiento o por proveedor
363  //
364  var previsionesPorVencim = from p in this.remesaBancariaDetallePrevis._Items
365  where p.Fila_Plena()
366  orderby p._Vencim
367  group p by p._Vencim into g
368  select new
369  {
370  concepto = Convert.ToString(g.Key),
371  importe = g.Sum(x => x._Importe),
372  vencim = g.Max(x => x._Vencim),
373  previsiones = g.ToList(),
374 
375  };
376 
377  // Si se asienta por proveedor la fecha de asiento será la máxima fecha de vencimiento para ese proveedor.
378  //
379  var previsionesPorProveed = from p in this.remesaBancariaDetallePrevis._Items
380  where p.Fila_Plena()
381  orderby p._Cuenta
382  group p by p._Cuenta into g
383  select new
384  {
385  concepto = g.Key,
386  importe = g.Sum(x => x._Importe),
387  vencim = g.Min(x => x._Vencim),
388  previsiones = g.ToList()
389  };
390 
391  // Para cada vencimiento o para cada proveedor hago asiento.
392  //
393  var conceptos = (teAsiRemAgruparPor == AsiRemAgruparPor.Vencimiento ? previsionesPorVencim : previsionesPorProveed);
394 
395  foreach (var concepto in conceptos)
396  {
397  // Si se asienta por vencimientos, la fecha de asiento de cada vencimiento será la fecha de vencimiento.
398  // Si se asienta por proveedor, la fecha de asiento de cada proveedor será la fecha máxima de vencimiento de los
399  // vencimientos del proveedor.
400  //
401  ldtVencimConcepto = Convert.ToDateTime(concepto.vencim);
402 
403  // Creamos el asiento para el vencimiento, o para el proveedor.
404  //
405  Asientos loAsiento = this.asientoNuevo(ldtVencimConcepto);
406 
407  // La cuenta que pondré en esta partida difiere según si utilizo cuenta de efectos descontados o no.
408  //
409 
410  this.asientoNuevaLinea(loAsiento, teAsiRemCtaEfecDesc == AsiRemCtaEfecDesc.NoUtilizarEfecD ? tcCuentaContableBanco : tcCuentaContablaEfecDescBanco, "REMESA DE RECIBOS Nº " + this._Numero.Trim(), 1, "H", concepto.importe);
411 
412  lstPrevisAsientoVencim.Clear();
413  foreach (RemesaBancariaDetallePrevis.Linea loLinea in concepto.previsiones)
414  {
415  lnPeriodo = loLinea._Periodo;
416  lcFactura = loLinea._Factura;
417  lcProveedor = loLinea._Cuenta;
418  lnOrden = loLinea._Orden;
419  lnPendiente = loLinea._Pendiente;
420  lnImporteLinea = loLinea._Importe;
421  ldtVencimPrevision = Convert.ToDateTime(loLinea._Vencim);
422 
423  if (!llEfecRemP)
424  {
425  lcCuentaLinea = loLinea._Cuenta;
426  }
427  else
428  {
429  // Obtener la cuenta de efectos respectiva a la linea del cliente de la previsión.
430  //
431  lcCuentaLinea = this.cuentaEfecto(loLinea._Cuenta);
432  }
433 
434  this.asientoNuevaLinea(loAsiento, lcCuentaLinea, "REMESA Nº " + this._Numero.Trim() + " FRA Nº " + lcFactura.ToUpper().Trim() + "/" + lnOrden.ToString().Trim() + " " + ldtVencimPrevision.ToString(EW_GLOBAL._CustomFormatDate), 1, "D", lnImporteLinea);
435 
436  lstPrevisAsientoVencim.Add(new Tuple<int, string, int, int, int, string >(lnPeriodo, lcFactura, lnOrden, 0, lnPendiente, lcProveedor));
437  }
438 
439 
440  // Grabo el asiento.
441  //
442  llOk = loAsiento._Save();
443  if (!llOk)
444  {
445  // Si algún asiento no se genera correctamente abandono sin esperar a causar más estragos.
446  //
447  this._Error_Message = loAsiento._Mensaje_Error;
448  return false;
449  }
450  else
451  {
452  // Para el caso de utilizar cuenta de efectos descontados el ASI que se guarda en la cabecera
453  // de la remesa ya es el del primer asiento general que se generó antes de entrar en el recorrido
454  // por las previsiones.
455  //
456  // Para el caso de no utilizar cuenta de efectos descontados el ASI será el del primer asiento
457  // por vencimiento que se genere en el recorrido por las previsiones.
458 
459  lcAsi = loAsiento._Asi_Primera_Linea();
460 
461  if (llEfecRemP)
462  {
463  // Guardar la relación de este asiento con el asiento 400-401, de esta forma si desasientan la remesa, a partir del
464  // asiento de pago de la prevision se puede acceder al asiento 400-401 y borrarlo también.
465  //
466  // En GESTION!ASI_REL se genera un registro para cada asiento 400-401 generado, lo suficiente para poder hacer lo descrito anteriormente
467  // si desasientan la remesa.
468  //
469  this.insertarRegistroAsiRela(loAsiento, toDicAsiEfecRemCta);
470  }
471 
472  // Nos quedamos con el ASI de cada asiento que vamos generando, así cuando abandonemos el métodoe necesariamente
473  // tcAsiRemesa será el del último asiento por concepto generado, que es lo que buscamos.
474  //
475  if (llObtenerAsiUltimoConcepto)
476  tcAsiRemesa = lcAsi;
477 
478  // Actualizar campos de pago en previsiones de pago de la remesa que han intervenido en este asiento en particular.
479  //
480  llOk = this.actualizarCamposCobroPagoEnPrevisiones(lcAsi, ldtVencimConcepto, tcCuentaContableBanco, null, lstPrevisAsientoVencim);
481  if (!llOk)
482  break;
483  }
484  }
485 
486  return llOk;
487  }
488 
489 
501  protected override bool actualizarCamposCobroPagoEnPrevisiones(string tcAsi, DateTime tdFechaAsiento, string tcCuentaContableBanco, DateTime? tdFechaDescuento = null, List<Tuple<int, string, int, int, int, string>> tlstPrevisiones = null)
502  {
503  bool llActuOk = true;
504  string lcEmpresa = "", lcFactura = "", lcProveedor="";
505  int lnPeriodo, lnOrden = 0, lnPendiente = 0;
506 
507  try
508  {
509  if (tlstPrevisiones == null)
510  {
511  // Actualizar campos pago en todas las previsiones de la remesa.
512  //
513  foreach (RemesaBancariaPago.RemesaBancariaDetallePrevis.Linea loLinea in this.remesaBancariaDetallePrevis)
514  {
515  if (loLinea.Fila_Plena())
516  {
517  lcEmpresa = loLinea._Empresa;
518  lnPeriodo = loLinea._Periodo;
519  lcFactura = loLinea._Factura;
520  lcProveedor = loLinea._Cuenta;
521  lnOrden = loLinea._Orden;
522  lnPendiente = Convert.ToInt32(loLinea._Pendiente);
523 
524  llActuOk = this.actualizarCamposPagoEnPrevis(lcEmpresa, lnPeriodo, lcProveedor, lcFactura, lnOrden, lnPendiente, tcAsi, tdFechaAsiento, tcCuentaContableBanco);
525  if (!llActuOk)
526  {
527  // El mensaje de error ya fue rellenado por la llamada anterior.
528  break;
529  }
530  }
531  }
532  }
533  else
534  {
535  // Actualizar campos de cobro en las previsiones de cobro recibidas en el parámetro tlstPrevisiones
536  //
537 
538  // Diccionario que vamos a utilizar para buscar previsiones en la remesa.
539  //
540  Dictionary<string, object> loDicBusqueda = new Dictionary<string, object>();
541  loDicBusqueda.Add("_Periodo", 0);
542  loDicBusqueda.Add("_Cuenta", "");
543  loDicBusqueda.Add("_Factura", "");
544  loDicBusqueda.Add("_Orden", 0);
545  loDicBusqueda.Add("_Pendiente", 0);
546 
547  for (int ln = 0; ln <= tlstPrevisiones.Count - 1; ln++)
548  {
549  lnPeriodo = tlstPrevisiones[ln].Item1;
550  lcFactura = tlstPrevisiones[ln].Item2;
551  lnOrden = tlstPrevisiones[ln].Item3;
552  lnPendiente = tlstPrevisiones[ln].Item5;
553  lcProveedor = tlstPrevisiones[ln].Item6;
554 
555  // Busco si la previsión está ya en la remesa.
556  //
557  loDicBusqueda["_Periodo"] = lnPeriodo;
558  loDicBusqueda["_Cuenta"] = lcProveedor;
559  loDicBusqueda["_Factura"] = lcFactura;
560  loDicBusqueda["_Orden"] = lnOrden;
561  loDicBusqueda["_Pendiente"] = lnPendiente;
562 
563  RemesaBancariaDetallePrevis.Linea loLinea = this.remesaBancariaDetallePrevis._GetItem(loDicBusqueda);
564  if (loLinea != null)
565  {
566  llActuOk = this.actualizarCamposPagoEnPrevis(loLinea._Empresa, loLinea._Periodo, loLinea._Cuenta, loLinea._Factura, loLinea._Orden, loLinea._Pendiente, tcAsi, tdFechaAsiento, tcCuentaContableBanco);
567  if (!llActuOk)
568  {
569  // El mensaje de error ya fue rellenado por la llamada anterior.
570  break;
571  }
572  }
573  }
574  }
575  }
576  catch (Exception e)
577  {
578  DB.Registrar_Error(e);
579  this._Error_Message = e.Message;
580  llActuOk = false;
581  }
582 
583  return llActuOk;
584  }
585 
586 
587  #endregion MÉTODOS PROTECTED OVERRIDE SOBREESCRITOS DE CLASE BASE 'REMESABANCARIA'
588 
589 
590  #region MÉTODOS PÚBLICOS OVERRIDE SOBREESCRITOS DE CLASE BASE 'DOCUMENTOBASE'
591 
592 
597  public override void _Show()
598  {
599  // Lo asocio a la propiedad _FormMante de negocio pues así se sabe internamente
600  // que negocio está ligado a visual.
601  //
602  this._FormMante = new frmRemesaBancariaPago(this);
603  this._FormMante._Show();
604 
605  if (!string.IsNullOrWhiteSpace(this._Codigo))
606  {
607  if (this._FormMante != null)
608  this._FormMante._Cargar_Documento();
609  }
610 
611  return;
612  }
613 
614 
615  #endregion MÉTODOS PÚBLICOS OVERRIDE SOBREESCRITOS DE CLASE BASE 'DOCUMENTOBASE'
616 
617 
618  #region MÉTODOS PÚBLICOS OVERRIDE SOBREESCRITOS DE CLASE BASE 'REMESABANCARIA'
619 
620 
639  public override bool _Contabilizar(Dictionary<string, object> toDicParametros)
640  {
641  bool llOk = true;
642  this._Error_Message = "";
643 
644  // Captación de parámetros.
645  //
646  DateTime tdFechaAsiento = DateTime.Today;
647  FormaContabilRemesaPago teFormaContabil = contabilidad.FormaContabilRemesaPago.AsientoUnico;
648  object objetoAuxi;
649 
650  if (toDicParametros.TryGetValue("fechaasiento", out objetoAuxi))
651  tdFechaAsiento = Convert.ToDateTime(objetoAuxi);
652 
653  if (toDicParametros.TryGetValue("formacontabil", out objetoAuxi))
654  teFormaContabil = (FormaContabilRemesaPago)Enum.Parse(typeof(FormaContabilRemesaPago), objetoAuxi.ToString());
655 
656 
657  try
658  {
659  // En función de la forma de contabilización llamamos al método respectivo.
660  //
661  switch (teFormaContabil)
662  {
663  case FormaContabilRemesaPago.AsientoUnico:
664  // Generamos asiento único de remesa (572 contra 400)
665  //
666  llOk = this.contabRemPreviAsientoUnico(tdFechaAsiento);
667  break;
668 
669  case FormaContabilRemesaPago.AsientoPorVencimNoEfecDto:
670  // Generamos un asiento para cada vencimiento en el cual se incluirán todas las previsiones con ese vencimiento.
671  // El asiento será del tipo 572 a 400.
672 
673  // Si está activado el opcflag de "ASENTAR REMESAS PAGO POR VTOS. MEDIANTE CUENTA DE EFECTOS" en los asientos de
674  // los vencimientos en vez de utilizarse las cuentas 400 se utilizan las cuentas 401 y se hace adicionalmente un
675  // asiento para cada proveedor del tipo (400 a 401).
676  //
677  llOk = this.contabRemPreviAsientoPorConcepto(tdFechaAsiento, AsiRemAgruparPor.Vencimiento, AsiRemCtaEfecDesc.NoUtilizarEfecD);
678  break;
679 
680  case FormaContabilRemesaPago.AsientoPorVencimEfecDto:
681  // Se genera un asiento 5208 a 5720 por el importe total de la remesa.
682  //
683  // Se genera un asiento para cada vencimiento en el cual se incluirán todas las previsiones con ese vencimiento.
684  // El asiento será del tipo 5208 a 400.
685  //
686  // Si está activado el opcflag de "ASENTAR REMESAS PAGO POR VTOS. MEDIANTE CUENTA DE EFECTOS" en los asientos de
687  // los vencimientos en vez de utilizarse las cuentas 400 se utilizan las cuentas 401 y se hace adicionalmente un
688  // asiento para cada proveedor del tipo (400 a 401).
689  //
690  llOk = this.contabRemPreviAsientoPorConcepto(tdFechaAsiento, AsiRemAgruparPor.Vencimiento, AsiRemCtaEfecDesc.UtilizarEfecD);
691  break;
692 
693  case FormaContabilRemesaPago.AsientoPorProveedNoEfecDto:
694  // Generamos un asiento para cada proveedor en el cual se incluirán todas las previsiones de ese proveedor.
695  // El asiento será del tipo 572 a 400.
696 
697  // Si está activado el opcflag de "ASENTAR REMESAS PAGO POR VTOS. MEDIANTE CUENTA DE EFECTOS" en los asientos de
698  // los proveedores en vez de utilizarse las cuentas 400 se utilizan las cuentas 401 y se hace adicionalmente un
699  // asiento para cada proveedor del tipo (400 a 401).
700  //
701  llOk = this.contabRemPreviAsientoPorConcepto(tdFechaAsiento, AsiRemAgruparPor.Cuenta, AsiRemCtaEfecDesc.NoUtilizarEfecD);
702  break;
703 
704  case FormaContabilRemesaPago.AsientoPorProveedEfecDto:
705  // Se genera un asiento 5208 a 5720 por el importe total de la remesa.
706  //
707  // Se genera un asiento para cada proveedor en el cual se incluirán todas las previsiones de ese proveedor.
708  // El asiento será del tipo 5208 a 400.
709  //
710  // Si está activado el opcflag de "ASENTAR REMESAS PAGO POR VTOS. MEDIANTE CUENTA DE EFECTOS" en los asientos de
711  // los proveedores en vez de utilizarse las cuentas 400 se utilizan las cuentas 401 y se hace adicionalmente un
712  // asiento para cada proveedor del tipo (400 a 401).
713  //
714  llOk = this.contabRemPreviAsientoPorConcepto(tdFechaAsiento, AsiRemAgruparPor.Cuenta, AsiRemCtaEfecDesc.UtilizarEfecD);
715  break;
716  }
717  }
718  catch (Exception e)
719  {
720  DB.Registrar_Error(e);
721  this._Error_Message = e.Message;
722  llOk = false;
723  }
724 
725 
726  if (!llOk && string.IsNullOrWhiteSpace(this._Error_Message))
727  this._Error_Message = "No se ha podido contabilizar la remesa.";
728 
729  return llOk;
730  }
731 
732 
737  public override bool _DesContabilizar()
738  {
739  bool llOkDescontabilizar = false, llOkVaciarCampos = false, llOkSaveRemesa = false;
740 
741  this._Error_Message = "";
742 
743  // La clase PrevisionPago en su método ._Descontabilizar() si detecta que el asiento del pago de la previsión afecta a más de una previsión
744  // de pago no elimina el asiento (como es lógico), motivo por el cual no puedo utilizar aquí ese método de la clase PrevisionPago.
745  //
746 
747  try
748  {
749  llOkVaciarCampos = this.vaciarCamposPagoEnPrevisiones();
750 
751  if (!string.IsNullOrWhiteSpace(this._Asi))
752  {
753  Asientos loAsiento = new Asientos(this._Asi);
754  loAsiento._Delete();
755  loAsiento = null;
756  }
757 
758  this._Asi = "";
759  this._Asentada = false;
760 
761  this._lDescontabilizando = true;
762 
763  llOkSaveRemesa = this._Save();
764 
765  this._lDescontabilizando = false;
766 
767  if (!llOkSaveRemesa)
768  {
769  if (string.IsNullOrWhiteSpace(this._Error_Message))
770  this._Error_Message = "No se pudieron actualizar los cambios en la remesa.";
771  }
772 
773  llOkDescontabilizar = llOkVaciarCampos && llOkSaveRemesa;
774  }
775  catch (Exception e)
776  {
777  DB.Registrar_Error(e);
778  this._Error_Message = e.Message;
779  llOkDescontabilizar = false;
780  }
781 
782  return llOkDescontabilizar;
783  }
784 
785 
790  public override bool _Comprobaciones_GenerarSepa()
791  {
792  this._Error_Message = "";
793 
794  bool llOk = base._Comprobaciones_GenerarSepa();
795  if (!llOk)
796  return false;
797 
798  // Control de tipo de esquema SEPA no seleccionado.
799  //
800  if (this._EsquemaSepa == TipoEsquemaRemesaSepaPagos.Ninguno)
801  {
802  _Error_Message = "No ha seleccionado el tipo de esquema SEPA para la generación del fichero.";
803  return false;
804  }
805 
806  return true;
807  }
808 
809 
810  #endregion MÉTODOS PÚBLICOS OVERRIDE SOBREESCRITOS DE CLASE BASE 'REMESABANCARIA'
811 
812 
813  #region MÉTODOS PÚBLICOS
814 
815 
838  public bool _AddPrevisiones(DataRow[] taDataRowsPrevis, out DataRow[] toDataRowsPrevisNoAnadidas, bool tlSave = false)
839  {
840  bool llOk = true;
841  this._Error_Message = "";
842 
843  // En esta lista guardaremos las previsiones no añadidas.
844  //
845  toDataRowsPrevisNoAnadidas = new DataRow[0];
846 
847  try
848  {
849  if (string.IsNullOrWhiteSpace(this._Numero))
850  {
851  this._Error_Message = "No está cargada ninguna remesa a la cual añadir previsiones.";
852  return false;
853  }
854 
855  if (this._TipoDocumentoRemesa != TipoDocumentoRemesa.Previsiones)
856  {
857  this._Error_Message = "No se permite añadir previsiones a una remesa que no es de tipo documento previsiones.";
858  return false;
859  }
860 
861  // Añadir las previsiones de pago a la remesa.
862  //
863  llOk = this.addPrevisiones(taDataRowsPrevis, out toDataRowsPrevisNoAnadidas);
864  if (!llOk)
865  return false;
866 
867  if (tlSave)
868  {
869  llOk = this._Save();
870 
871  if (!llOk)
872  {
873  if (string.IsNullOrWhiteSpace(this._Error_Save))
874  this._Error_Message = this._Error_Save;
875 
876  if (string.IsNullOrWhiteSpace(this._Error_Message))
877  this._Error_Message = "No se han podido añadir las previsiones a la remesa correctamente.";
878  }
879  }
880  }
881  catch (Exception e)
882  {
883  DB.Registrar_Error(e);
884  this._Error_Message = e.Message;
885  llOk = false;
886  }
887  return llOk;
888  }
889 
890 
913  public bool _AddPrevisiones(List<PrevisionPago> toLstPrevis, out List<PrevisionPago> tolstPrevisNoAnadidas, bool tlSave = false)
914  {
915  bool llOk = true;
916  this._Error_Message = "";
917 
918  // En esta lista guardaremos las previsiones no añadidas.
919  //
920  tolstPrevisNoAnadidas = new List<PrevisionPago>();
921 
922  try
923  {
924  if (string.IsNullOrWhiteSpace(this._Numero))
925  {
926  this._Error_Message = "No está cargada ninguna remesa a la cual añadir previsiones.";
927  return false;
928  }
929 
930  if (this._TipoDocumentoRemesa != TipoDocumentoRemesa.Previsiones)
931  {
932  this._Error_Message = "No se permite añadir previsiones a una remesa que no es de tipo documento previsiones.";
933  return false;
934  }
935 
936  // Añadir las previsiones de pago a la remesa.
937  //
938  llOk = this.addPrevisiones(toLstPrevis, out tolstPrevisNoAnadidas);
939  if (!llOk)
940  return false;
941 
942  if (tlSave)
943  {
944  llOk = this._Save();
945 
946  if (!llOk)
947  {
948  if (string.IsNullOrWhiteSpace(this._Error_Save))
949  this._Error_Message = this._Error_Save;
950 
951  if (string.IsNullOrWhiteSpace(this._Error_Message))
952  this._Error_Message = "No se han podido añadir las previsiones a la remesa correctamente.";
953  }
954  }
955  }
956  catch (Exception e)
957  {
958  DB.Registrar_Error(e);
959  this._Error_Message = e.Message;
960  llOk = false;
961  }
962  return llOk;
963  }
964 
965 
990  public bool _CrearRemesaPrevisiones(ParamCreacionRemesaPago loParamCreaCnf, DataRow[] taDataRowsPrevis, out DataRow[] toDataRowsPrevisNoAnadidas, bool tlSave = true)
991  {
992  bool llOk = true;
993  this._Error_Message = "";
994 
995  // En esta lista guardaremos las previsiones no añadidas.
996  //
997  toDataRowsPrevisNoAnadidas = new DataRow[0];
998 
999  try
1000  {
1001  if (llOk)
1002  {
1003  llOk = this.crearCabeceraRemesa(loParamCreaCnf);
1004  if (!llOk)
1005  return false;
1006  }
1007 
1008  // Añadir las previsiones de pago a la remesa.
1009  //
1010  llOk = this.addPrevisiones(taDataRowsPrevis, out toDataRowsPrevisNoAnadidas);
1011  if (!llOk)
1012  return false;
1013 
1014  if (tlSave)
1015  {
1016  llOk = this._Save();
1017  if (!llOk)
1018  {
1019  if (string.IsNullOrWhiteSpace(this._Error_Save))
1020  this._Error_Message = this._Error_Save;
1021 
1022  if (string.IsNullOrWhiteSpace(this._Error_Message))
1023  this._Error_Message = "No se han podido crear la remesa de pago correctamente.";
1024  }
1025  }
1026  }
1027  catch (Exception e)
1028  {
1029  DB.Registrar_Error(e);
1030  this._Error_Message = e.Message;
1031  llOk = false;
1032  }
1033 
1034  return llOk;
1035  }
1036 
1037 
1062  public bool _CrearRemesaPrevisiones(ParamCreacionRemesaPago loParamCreaCnf, List<PrevisionPago> toLstPrevis, out List<PrevisionPago> tolstPrevisNoAnadidas, bool tlSave=true)
1063  {
1064  bool llOk = true;
1065  this._Error_Message = "";
1066 
1067  // En esta lista guardaremos las previsiones no añadidas.
1068  //
1069  tolstPrevisNoAnadidas = new List<PrevisionPago>();
1070 
1071  try
1072  {
1073  if (llOk)
1074  {
1075  llOk = this.crearCabeceraRemesa(loParamCreaCnf);
1076  if (!llOk)
1077  return false;
1078  }
1079 
1080  // Añadir las previsiones de pago a la remesa.
1081  //
1082  llOk = this.addPrevisiones(toLstPrevis, out tolstPrevisNoAnadidas);
1083  if (!llOk)
1084  return false;
1085 
1086  if (tlSave)
1087  {
1088  llOk = this._Save();
1089  if (!llOk)
1090  {
1091  if (string.IsNullOrWhiteSpace(this._Error_Save))
1092  this._Error_Message = this._Error_Save;
1093 
1094  if (string.IsNullOrWhiteSpace(this._Error_Message))
1095  this._Error_Message = "No se han podido crear la remesa de pago correctamente.";
1096  }
1097  }
1098  }
1099  catch (Exception e)
1100  {
1101  DB.Registrar_Error(e);
1102  this._Error_Message = e.Message;
1103  llOk = false;
1104  }
1105 
1106  return llOk;
1107  }
1108 
1109 
1114  public void _Set_GridDetalleRemesaPrevisiones(objetos.UserControls.Mantegrid mantegrid)
1115  {
1116  this.remesaBancariaDetallePrevis._Grid = mantegrid;
1117 
1118  sage.ew.objetos.ewgrid loGrid = ((sage.ew.objetos.UserControls.Mantegrid)this.remesaBancariaDetallePrevis._Grid)._Grid;
1119 
1120  this.ajustesVisualesGrid(loGrid);
1121 
1122  return;
1123  }
1124 
1125 
1129  public new void _ShowDialog()
1130  {
1131  // Crear la instancia del formulario y asignar objetos
1132  this._FormMante = new frmRemesaBancariaPago(this);
1133 
1134  // En este caso, primero cargamos el documento y luego lo mostramos modal
1135  if (!string.IsNullOrWhiteSpace(this._Codigo))
1136  {
1137  if (this._FormMante != null)
1138  this._FormMante._CargarDocumento();
1139  }
1140 
1141  // Mostrar el form
1142  ((formul.FormBaseDocumento)_FormMante).ShowDialog();
1143  }
1144 
1145 
1146  #endregion MÉTODOS PÚBLICOS
1147 
1148 
1149  #region MÉTODOS PRIVADOS
1150 
1151 
1152  #region MÉTODOS PRIVADOS PARA CONTABILIZACION DE REMESAS DE PREVISIONES DE PAGO
1153 
1154 
1168  private bool actualizarCamposPagoEnPrevis(string tcEmpresa, int tnPeriodo, string tcProveedor, string tcFactura, int tnOrden, int tnPendiente, string tcAsi, DateTime tdFechaAsiento, string tcCuentaContableBanco)
1169  {
1170  bool llOk = true;
1171 
1172  try
1173  {
1174  PrevisionPago loPrevision = new PrevisionPago();
1175  loPrevision._Empresa = tcEmpresa;
1176  loPrevision._Ejercicio = tnPeriodo;
1177  loPrevision._Proveedor = tcProveedor;
1178  loPrevision._Factura = tcFactura;
1179  loPrevision._Numereb = tnOrden;
1180  loPrevision._Pendiente = tnPendiente;
1181  loPrevision._Load();
1182 
1183  if (loPrevision._Estado == _EstadosMantenimiento.MostrandoRegistro)
1184  {
1185  loPrevision._Asiento = true;
1186  loPrevision._Fecha_Pago = tdFechaAsiento;
1187  loPrevision._Banco = tcCuentaContableBanco;
1188  loPrevision._Asi = tcAsi;
1189  loPrevision._Pagada = "S";
1190 
1191  llOk = loPrevision._Save();
1192 
1193  if (!llOk)
1194  {
1195  this._Error_Message = "No se pudieron actualizar los campos de pago en la previsión de pago Proveedor "+tcProveedor+" Factura " + tcFactura.Trim() + " Orden " + tnOrden.ToString();
1196  }
1197  else
1198  {
1199  // Esto ya no hace falta hacerlo, lo hace la clase PrevisionPago al hacer el _Save() en las lineas anteriores,
1200  // si dejamos este código aquí duplicaba el asiento de traspaso de saldos por que un asiento lo hacía el _Save() y
1201  // el otro lo hacía aquí.
1202  // CCR205142
1203  // Comento el código
1204  //if (loPrevision._Recc)
1205  //{
1206  // // Si la previsión es de RECC llamamos a FOX para que haga el proceso respectivo.
1207 
1208  // // Preparamos los parámetros para actualizar el RECC
1209  // // LPARAMETERS tcEmpresa, tcProveedor, tcFactura, tnNumereb, tnPendiente, tdEmision, tnDoccargo, tcPeriodo, tcAsi, tcOldAsi, lnDigitosFra, tnOldImporte
1210  // object[] loParametros = new object[11]
1211  // {
1212  // tcEmpresa,
1213  // tcProveedor,
1214  // tcFactura,
1215  // tnOrden,
1216  // tnPendiente,
1217  // loPrevision._Fecha_Emision,
1218  // "", // DocCargo
1219  // tnPeriodo,
1220  // tcAsi,
1221  // "",
1222  // loPrevision._Importe
1223  // };
1224 
1225  // NETVFP._Ejecutar_Funcion_VFP("Modifica_Previs_Recc_Net", loParametros);
1226  //}
1227  }
1228  }
1229  }
1230  catch (Exception e)
1231  {
1232  DB.Registrar_Error(e);
1233  this._Error_Message = e.Message;
1234  llOk = false;
1235  }
1236 
1237  return llOk;
1238  }
1239 
1240 
1246  private bool vaciarCamposPagoEnPrevisiones()
1247  {
1248  bool llActuOk = true, llOk = false;
1249  string lcEmpresa = "", lcFactura = "", lcProveedor="";
1250  int lnPeriodo, lnOrden = 0, lnPendiente = 0;
1251 
1252  try
1253  {
1254  // Actualizar campos pago en todas las previsiones de la remesa.
1255  //
1256  foreach (RemesaBancariaDetallePrevis.Linea loLinea in this.remesaBancariaDetallePrevis)
1257  {
1258  if (loLinea.Fila_Plena())
1259  {
1260  lcEmpresa = loLinea._Empresa;
1261  lnPeriodo = loLinea._Periodo;
1262  lcProveedor = loLinea._Cuenta;
1263  lcFactura = loLinea._Factura;
1264  lnOrden = loLinea._Orden;
1265  lnPendiente = loLinea._Pendiente;
1266 
1267  llOk = this.vaciarCamposPagoEnPrevision(lcEmpresa, lnPeriodo, lcProveedor, lcFactura, lnOrden, lnPendiente);
1268  if (!llOk)
1269  llActuOk = false;
1270  }
1271  }
1272  }
1273  catch (Exception e)
1274  {
1275  DB.Registrar_Error(e);
1276  this._Error_Message = e.Message;
1277  llActuOk = false;
1278  }
1279 
1280  return llActuOk;
1281  }
1282 
1283 
1295  private bool vaciarCamposPagoEnPrevision(string tcEmpresa, int tnPeriodo, string tcProveedor, string tcFactura, int tnOrden, int tnPendiente)
1296  {
1297  bool llActuOk = true, llOk = false;
1298  string lcOldAsi = "";
1299 
1300  // Si está activado el opcflag de "ASENTAR REMESAS PAGO POR VTOS. MEDIANTE CUENTA DE EFECTOS" en vez de utilzarse cuentas 400 en los
1301  // asientos por vencimiento/proveedor se utilizan cuentas 401, y además se hacen unos asientos adicionales para cada cuenta proveedor.
1302  //
1303  bool llEfecRemP = this._lEfecRemp && !string.IsNullOrWhiteSpace(this._cEfecRemP);
1304 
1305  try
1306  {
1307  PrevisionPago loPrevision = new PrevisionPago();
1308  loPrevision._Empresa = tcEmpresa;
1309  loPrevision._Ejercicio = tnPeriodo;
1310  loPrevision._Proveedor = tcProveedor;
1311  loPrevision._Factura = tcFactura;
1312  loPrevision._Numereb = tnOrden;
1313  loPrevision._Pendiente = tnPendiente;
1314  loPrevision._Load();
1315 
1316  if (loPrevision._Estado == _EstadosMantenimiento.MostrandoRegistro)
1317  {
1318  // Estos campos de pago de la previsión podrian estar ya vacios si se pasó ya por otra previsión en esta misma remesa que apuntaba al mismo
1319  // asiento de pago pues entonces ya se eliminó el asiento de pago y al hacerlo se desmarcaron todas las previsiones de pago
1320  // asociadas con el mismo ASI que el asiento eliminado.
1321  //
1322 
1323  lcOldAsi = loPrevision._Asi;
1324 
1325  loPrevision._Asiento = false;
1326  loPrevision._Fecha_Pago = null;
1327  loPrevision._Asi = "";
1328  loPrevision._Pagada = "N";
1329 
1330  llOk = loPrevision._Save();
1331 
1332  if (!llOk)
1333  {
1334  this._Error_Message = "No se pudieron vaciar los campos de pago en la previsión de pago Proveedor "+tcProveedor+" Factura " + tcFactura.Trim() + " Orden " + tnOrden.ToString();
1335  llActuOk = false;
1336  }
1337 
1338  // Este ASI podría estar ya vacío por lo que se comentó más arriba.
1339  //
1340  if (!string.IsNullOrWhiteSpace(lcOldAsi))
1341  {
1342  Asientos loAsiento;
1343  String lcEjerDB = DB.Ejercicio_EW;
1344  DataTable loDt = _ObtenerEjerciciosAsi(new List<String>() { lcOldAsi });
1345 
1346  if (loDt.Rows.Count > 0)
1347  {
1348  string lcEjer = Convert.ToString(loDt.Rows[0]["EJERCICIO"]);
1349  functions.Clases.CambioEjercicio loEjer = new functions.Clases.CambioEjercicio();
1350 
1351  if (lcEjer != lcEjerDB) loEjer._Cambiar(lcEjer);
1352 
1353  loAsiento = new Asientos(lcOldAsi);
1354  if (!loAsiento._Delete(false))
1355  {
1356  this._Error_Message = string.Format("No se pudo eliminar el asiento de pago correspondiente a la previsión de pago proveedor {0}, factura {1}, orden {2} y ejercicio {3} : {4}", tcProveedor, loPrevision._Factura.Trim(), loPrevision._Numereb.ToString().Trim(), lcEjer, loAsiento._Mensaje_Error);
1357  llActuOk = false;
1358  }
1359 
1360  if (lcEjer != lcEjerDB) loEjer._Restablecer();
1361 
1362  }
1363 
1364  loAsiento = null;
1365 
1366  if (llEfecRemP)
1367  // Borrar asientos 400-401 que pudieran haber relacionados con el asiento de vencimiento/proveedor que se acaba de borrar.
1368  //
1369  this.borrarAsientosRelacionados(lcOldAsi);
1370 
1371  // Esto ya no hace falta hacerlo, lo hace la clase PrevisionPago al hacer el _Save() unas lineas más arriba.
1372  // CCR205142
1373  // Comento el código
1374  //if (loPrevision._Recc)
1375  //{
1376  // // Si la previsión es de RECC llamamos a FOX para que haga el proceso respectivo de eliminación de asientos de RECC.
1377 
1378  // // Preparamos los parámetros para actualizar el RECC
1379  // // LPARAMETERS tcEmpresa, tcProveedor, tcFactura, tnNumereb, tnPendiente, tdEmision, tnDoccargo, tcPeriodo, tcAsi, tcOldAsi, lnDigitosFra, tnOldImporte
1380  // object[] loParametros = new object[11]
1381  // { tcEmpresa,
1382  // tcProveedor,
1383  // tcFactura,
1384  // tnOrden,
1385  // tnPendiente,
1386  // loPrevision._Fecha_Emision,
1387  // "", // DocCargo
1388  // tnPeriodo,
1389  // new string(' ',20),
1390  // lcOldAsi,
1391  // loPrevision._Importe
1392  // };
1393  // NETVFP._Ejecutar_Funcion_VFP("Modifica_Previs_Recc_Net", loParametros);
1394  //}
1395  }
1396  }
1397  }
1398  catch (Exception e)
1399  {
1400  DB.Registrar_Error(e);
1401  this._Error_Message = e.Message;
1402  llActuOk = false;
1403  }
1404 
1405  return llActuOk;
1406  }
1407 
1408 
1409  #endregion MÉTODOS PRIVADOS PARA CONTABILIZACION DE REMESAS DE PREVISIONES DE PAGO
1410 
1411 
1412  #region MÉTODOS PRIVADOS PARA AÑADIR PREVISIONES DE PAGO A REMESA DE PAGO
1413 
1414 
1436  private bool addPrevisiones(DataRow[] taDataRowsPrevis, out DataRow[] taDataRowPrevisNoAnadidas)
1437  {
1438  bool llOk = true;
1439 
1440  this.remesaBancariaDetallePrevis._isLoading = true;
1441 
1442  // En este array de DataRows guardaremos las previsiones no añadidas que se devolverán al origen de la llamada.
1443  //
1444  taDataRowPrevisNoAnadidas = new DataRow[0];
1445 
1446  try
1447  {
1448 
1449  // Diccionario que vamos a utilizar para buscar previsiones en la remesa antes de añadirlas.
1450  //
1451  Dictionary<string, object> loDicBusqueda = new Dictionary<string, object>();
1452  loDicBusqueda["_Empresa"] = "";
1453  loDicBusqueda["_Periodo"] = 0;
1454  loDicBusqueda["_Cuenta"] = "";
1455  loDicBusqueda["_Factura"] = "";
1456  loDicBusqueda["_Orden"] = 0;
1457  loDicBusqueda["_Pendiente"] = 0;
1458  loDicBusqueda["_Emision"] = DateTime.Today;
1459 
1460 
1461  bool llCrearLinea = false;
1462  int lnContador = 0;
1463  foreach (DataRow aRowPrevision in taDataRowsPrevis)
1464  {
1465  // Esto en teoria se filtra en origen pero por si acaso lo vuelvo a comprobar.
1466  //
1467  if (Convert.ToInt32(aRowPrevision["remesa"]) != 0 || Convert.ToBoolean(aRowPrevision["asiento"]) ||
1468  !string.IsNullOrWhiteSpace(Convert.ToString(aRowPrevision["asi"])) || Convert.ToString(aRowPrevision["pagada"]) == "S" )
1469  {
1470  // Clono el DataRow de la previsión que no añadiré a la remesa.
1471  //
1472  DataRow laRowPrevisNoAnadida = aRowPrevision.Table.NewRow();
1473  laRowPrevisNoAnadida.ItemArray = aRowPrevision.ItemArray;
1474 
1475  // Añado el DataRow al array de DataRows de previsiones no añadidas que retornaré.
1476  //
1477  Array.Resize(ref taDataRowPrevisNoAnadidas, taDataRowPrevisNoAnadidas.GetLength(0) + 1);
1478  taDataRowPrevisNoAnadidas[taDataRowPrevisNoAnadidas.GetLength(0) - 1] = aRowPrevision;
1479  continue;
1480  }
1481 
1482  // Busco si la factura ya está en la remesa.
1483  //
1484  loDicBusqueda["_Empresa"] = Convert.ToInt32(aRowPrevision["empresa"]);
1485  loDicBusqueda["_Periodo"] = Convert.ToInt32(aRowPrevision["periodo"]);
1486  loDicBusqueda["_Cuenta"] = Convert.ToString(aRowPrevision["proveedor"]);
1487  loDicBusqueda["_Factura"] = Convert.ToString(aRowPrevision["factura"]);
1488  loDicBusqueda["_Orden"] = Convert.ToInt32(aRowPrevision["numereb"]);
1489  loDicBusqueda["_Pendiente"] = Convert.ToInt32(aRowPrevision["pendiente"]);
1490  loDicBusqueda["_Emision"] = Convert.ToDateTime(aRowPrevision["emision"]);
1491 
1492  RemesaBancariaDetallePrevis.Linea loLinea = this.remesaBancariaDetallePrevis._GetItem(loDicBusqueda);
1493  if (loLinea != null)
1494  {
1495  // Ha encontrado ya la previsión de pago en la remesa, no la añado.
1496 
1497  // Clono el DataRow de la previsión que no añadiré a la remesa.
1498  //
1499  DataRow laRowPrevisNoAnadida = aRowPrevision.Table.NewRow();
1500  laRowPrevisNoAnadida.ItemArray = aRowPrevision.ItemArray;
1501 
1502  // Añado el DataRow al array de DataRows de previsiones no añadidas que retornaré.
1503  //
1504  Array.Resize(ref taDataRowPrevisNoAnadidas, taDataRowPrevisNoAnadidas.GetLength(0)+1);
1505  taDataRowPrevisNoAnadidas[taDataRowPrevisNoAnadidas.GetLength(0)-1] = aRowPrevision;
1506  continue;
1507  }
1508  else
1509  {
1510  if (lnContador == 0)
1511  {
1512  // Estamos añadiendo la primera previsión, hay que mirar si estamos situados en una linea en blanco o no, para aprovecharla
1513  // si fuera el caso.
1514  //
1515  if (this.remesaBancariaDetallePrevis._CurrentItem == null)
1516  {
1517  llCrearLinea = true;
1518  }
1519  else
1520  {
1521  if (this.remesaBancariaDetallePrevis._CurrentItem.Fila_Plena())
1522  llCrearLinea = true;
1523  else
1524  llCrearLinea = false;
1525  }
1526  }
1527  else
1528  llCrearLinea = true;
1529 
1530 
1531  if (llCrearLinea)
1532  {
1533  // Creo nuevo registro de previsión en la remesa.
1534  //
1535  loLinea = this.remesaBancariaDetallePrevis._NewItem();
1536  }
1537  else
1538  loLinea = this.remesaBancariaDetallePrevis._CurrentItem;
1539 
1540  loLinea._Periodo = Convert.ToInt32(aRowPrevision["periodo"]);
1541 
1542  // El campo Emision siempre tendrá valor diferente de null.
1543  //
1544  loLinea._Emision = Convert.ToDateTime(aRowPrevision["emision"]);
1545  loLinea._Factura = Convert.ToString(aRowPrevision["factura"]);
1546  loLinea._Orden = Convert.ToInt32(aRowPrevision["numereb"]);
1547  loLinea._Pendiente = Convert.ToInt32(aRowPrevision["pendiente"]);
1548 
1549  loLinea._Cuenta = Convert.ToString(aRowPrevision["proveedor"]);
1550  loLinea._Importe = Convert.ToDecimal(aRowPrevision["importe"]);
1551 
1552  loLinea._ImporteDiv = Convert.ToDecimal(aRowPrevision["importediv"]);
1553  loLinea._Cambio = Convert.ToDecimal(aRowPrevision["cambio"]);
1554  //loLinea._Numbanco = Convert.ToInt32(aRowPrevision["num_banco"]);
1555  loLinea._Divisa = Convert.ToString(aRowPrevision["divisa"]);
1556 
1557  loLinea._ImporteDiv = Convert.ToDecimal(aRowPrevision["importediv"]);
1558  loLinea._Cambio = Convert.ToDecimal(aRowPrevision["cambio"]);
1559  //loLinea._Numbanco = Convert.ToInt32(aRowPrevision["num_banco"]);
1560 
1561 
1562 
1563  // El campo Vencim siempre tendrá valor diferente de null.
1564  //
1565  loLinea._Vencim = Convert.ToDateTime(aRowPrevision["vencim"]);
1566 
1569  //if (aRowPrevision["vencim2"] == DBNull.Value || aRowPrevision["vencim2"] == null)
1570  // loLinea._Vencim2 = null;
1571  //else
1572  // loLinea._Vencim2 = Convert.ToDateTime(aRowPrevision["vencim2"]);
1573 
1574  //loLinea._Concepto = Convert.ToString(aRowPrevision["concepto"]);
1575 
1576  //loLinea._Asi = Convert.ToString(aRowPrevision["asi"]);
1577  //loLinea._Asiento = Convert.ToBoolean(aRowPrevision["asiento"]);
1578 
1579  // El campo FecReme podria tener valor null.
1580  //
1581  if (aRowPrevision["fecreme"] == DBNull.Value || aRowPrevision["fecreme"] == null)
1582  loLinea._FecReme = null;
1583  else
1584  loLinea._FecReme = Convert.ToDateTime(aRowPrevision["fecreme"]);
1585 
1586  //loLinea._Pagada = Convert.ToString(aRowPrevision["pagada"]);
1587 
1588  // El campo Pago podria tener valor null.
1589  //
1590  //if (aRowPrevision["pago"] == DBNull.Value || aRowPrevision["pago"] == null)
1591  // loLinea._FecPago = null;
1592  //else
1593  // loLinea._FecPago = Convert.ToDateTime(aRowPrevision["pago"]);
1594 
1595  //loLinea._Banco = Convert.ToString(aRowPrevision["banco"]);
1596 
1597  // Guardo inmediatamente los datos en la bd. para que en el registdro conste el nº de remesa y no se puede volver a añadir.
1598  //
1599  this.remesaBancariaDetallePrevis._SaveItem(loLinea);
1600  }
1601  lnContador++;
1602  }
1603 
1604  this._Totalizar();
1605  }
1606  catch (Exception e)
1607  {
1608  DB.Registrar_Error(e);
1609  this._Error_Message = e.Message;
1610  llOk = false;
1611  }
1612 
1613  this.remesaBancariaDetallePrevis._isLoading = false;
1614 
1615  return llOk;
1616  }
1617 
1618 
1640  private bool addPrevisiones(List<PrevisionPago> toLstPrevis, out List<PrevisionPago> tolstPrevisNoAnadidas)
1641  {
1642  bool llOk = true;
1643 
1644  this.remesaBancariaDetallePrevis._isLoading = true;
1645 
1646  // En esta lista guardaremos las previsiones no añadidas.
1647  //
1648  tolstPrevisNoAnadidas = new List<PrevisionPago>();
1649 
1650  try
1651  {
1652 
1653  // Diccionario que vamos a utilizar para buscar previsiones en la remesa antes
1654  // de añadirlas.
1655  //
1656  Dictionary<string, object> loDicBusqueda = new Dictionary<string, object>();
1657  loDicBusqueda["_Empresa"] = "";
1658  loDicBusqueda["_Periodo"] = 0;
1659  loDicBusqueda["_Cuenta"] = "";
1660  loDicBusqueda["_Factura"] = "";
1661  loDicBusqueda["_Orden"] = 0;
1662  loDicBusqueda["_Pendiente"] = 0;
1663  loDicBusqueda["_Emision"] = DateTime.Today;
1664 
1665  bool llCrearLinea = false;
1666  int lnContador = 0;
1667  foreach (PrevisionPago loPrevision in toLstPrevis)
1668  {
1669  // Esto en teoria se filtra en origen pero por si acaso lo vuelvo a comprobar.
1670  //
1671  if (loPrevision._Remesa != 0 || loPrevision._Asiento || !string.IsNullOrWhiteSpace(loPrevision._Asi) || loPrevision._Pagada=="S" )
1672  {
1673  tolstPrevisNoAnadidas.Add(loPrevision);
1674  continue;
1675  }
1676 
1677  // Busco si la factura ya está en la remesa.
1678  //
1679  loDicBusqueda["_Empresa"] = loPrevision._Empresa;
1680  loDicBusqueda["_Periodo"] = loPrevision._Ejercicio;
1681  loDicBusqueda["_Cuenta"] = loPrevision._Proveedor;
1682  loDicBusqueda["_Factura"] = loPrevision._Factura;
1683  loDicBusqueda["_Orden"] = loPrevision._Numereb;
1684  loDicBusqueda["_Pendiente"] = loPrevision._Pendiente;
1685  loDicBusqueda["_Emision"] = loPrevision._Fecha_Emision;
1686 
1687  RemesaBancariaDetallePrevis.Linea loLinea = this.remesaBancariaDetallePrevis._GetItem(loDicBusqueda);
1688 
1689  if (loLinea != null)
1690  {
1691  tolstPrevisNoAnadidas.Add(loPrevision);
1692  continue;
1693  }
1694  else
1695  {
1696  if (lnContador == 0)
1697  {
1698  // Estamos añadiendo la primera previsión, hay que mirar si estamos situados en una linea en blanco o no, para aprovecharla
1699  // si fuera el caso.
1700  //
1701  if (this.remesaBancariaDetallePrevis._CurrentItem == null)
1702  {
1703  llCrearLinea = true;
1704  }
1705  else
1706  {
1707  if (this.remesaBancariaDetallePrevis._CurrentItem.Fila_Plena())
1708  llCrearLinea = true;
1709  else
1710  llCrearLinea = false;
1711  }
1712  }
1713  else
1714  llCrearLinea = true;
1715 
1716 
1717  if (llCrearLinea)
1718  {
1719  // Creo nuevo registro de previsión en la remesa.
1720  //
1721  loLinea = this.remesaBancariaDetallePrevis._NewItem();
1722  }
1723  else
1724  loLinea = this.remesaBancariaDetallePrevis._CurrentItem;
1725 
1726  loLinea._Periodo = loPrevision._Ejercicio;
1727  loLinea._Emision = loPrevision._Fecha_Emision;
1728  loLinea._Factura = loPrevision._Factura;
1729  loLinea._Orden = loPrevision._Numereb;
1730  loLinea._Pendiente = loPrevision._Pendiente;
1731 
1732  loLinea._Cuenta = loPrevision._Proveedor;
1733  loLinea._Vencim = loPrevision._Fecha_Vencim;
1734  //loLinea._Vencim2 = loPrevision._Fecha_Vencim2;
1735  loLinea._Concepto = loPrevision._Concepto;
1736  loLinea._Importe = loPrevision._Importe;
1737 
1738  loLinea._ImporteDiv = loPrevision._ImporteDiv;
1739  loLinea._Cambio = loPrevision._Cambio;
1740  loLinea._Divisa = loPrevision._Divisa;
1741 
1742  loLinea._FecReme = loPrevision._Fecha_Remesa;
1743 
1744  loLinea._NumBanco = loPrevision._Num_Banco;
1745 
1746  // Guardo inmediatamente los datos en la bd. para que en el registdro conste el nº de remesa y no se puede volver a añadir.
1747  this.remesaBancariaDetallePrevis._SaveItem(loLinea);
1748  }
1749  lnContador++;
1750  }
1751 
1752  this._Totalizar();
1753  }
1754  catch (Exception e)
1755  {
1756  DB.Registrar_Error(e);
1757  this._Error_Message = e.Message;
1758  llOk = false;
1759  }
1760 
1761  this.remesaBancariaDetallePrevis._isLoading = false;
1762 
1763  return llOk;
1764  }
1765 
1766 
1772  private bool crearCabeceraRemesa(ParamCreacionRemesaPago loParamCreaCnf)
1773  {
1774 
1775  bool llOk = true;
1776  string lcNumero = "";
1777  this._Error_Message = "";
1778 
1779  try
1780  {
1781  // Esto asigna nuevo número a la remesa.
1782  //
1783  lcNumero = this._Suma_Numero("");
1784 
1785  // Si tengo número lo asigno.
1786  //
1787  if (!string.IsNullOrWhiteSpace(lcNumero))
1788  {
1789  this._Codigo = this._cEmpresa + "|" + lcNumero.Trim();
1790  this._New();
1791 
1792  this._Fecha = loParamCreaCnf._Fecha;
1793  this._TipoDocumentoRemesa = TipoDocumentoRemesa.Previsiones;
1794  this._EsquemaSepa = loParamCreaCnf._EsquemaSepa;
1795  if (!string.IsNullOrWhiteSpace(loParamCreaCnf._Banco))
1796  this._Banco = loParamCreaCnf._Banco;
1797 
1798  this._Save();
1799  }
1800  else
1801  {
1802  this._Error_Message = "No se pudo crear la remesa, no se pudo obtener un nuevo número de remesa.";
1803  return false;
1804  }
1805  }
1806  catch (Exception e)
1807  {
1808  DB.Registrar_Error(e);
1809  this._Error_Message = e.Message;
1810  llOk = false;
1811  }
1812 
1813  return llOk;
1814  }
1815 
1816 
1817  #endregion MÉTODOS PRIVADOS PARA AÑADIR PREVISIONES DE PAGO A REMESA DE PAGO
1818 
1819 
1820  #endregion MÉTODOS PRIVADOS
1821 
1822 
1826  public class RemesaBancariaDetallePrevis : ewManteTRel<RemesaBancariaDetallePrevis.Linea, RemesaBancariaDetallePrevis.Clave>
1827  {
1828  #region PROPIEDADES PROTECTED
1829 
1830 
1834  protected string _lcMonedaEmpresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_moneda"));
1835 
1836 
1841 
1842 
1846  protected int _lnDigitos = Convert.ToInt32(EW_GLOBAL._GetLenCampo(KeyDiccionarioLenCampos.wn_digitos));
1847 
1848 
1852  protected int _nLenFactura = Convert.ToInt32(EW_GLOBAL._GetLenCampo(KeyDiccionarioLenCampos.wn_factcompra));
1853 
1854 
1855  #endregion PROPIEDADES PROTECTED
1856 
1857 
1858  #region PROPIEDADES PUBLICAS
1859 
1860 
1864  public RemesaBancariaPago _oRemesa
1865  {
1866  get
1867  {
1868  return (RemesaBancariaPago)_ewMantePrincipal;
1869  }
1870  }
1871 
1872 
1882  public bool _isLoading = false;
1883 
1884 
1885  #endregion PROPIEDADES PUBLICAS
1886 
1887 
1888  #region CONSTRUCTORES
1889 
1890 
1896  {
1897  this.crearEstructura();
1898  }
1899 
1900 
1901  #endregion CONSTRUCTORES
1902 
1903 
1904  #region MÉTODOS PRIVADOS
1905 
1906 
1910  private void crearEstructura()
1911  {
1912  Divisa loDivisa = new Divisa(this._lcMonedaEmpresa);
1913 
1914  string lcCuentaStdProv = Convert.ToString(EW_GLOBAL._GetVariable("wc_proveed"));
1915  string lcCuentaStdAcre = Convert.ToString(EW_GLOBAL._GetVariable("wc_acreed"));
1916 
1917  // Remuneraciones pendientes de pago (465)
1918  // Bug 171517, deben salir tambien en el browser de la columna proveedor las cuentas 465
1919  //
1920  string lcCuentaStrRemunPendPago = Convert.ToString(EW_GLOBAL._GetVariable("wc_remupenpag"));
1921 
1922 
1923  this.mascaraGranTotal = loDivisa._MascaraImporte;
1924 
1925  this._DataBase = "COMUNES";
1926  this._Tabla = "PREVIS";
1927  this._OrdenarPor = "VENCIM";
1928 
1929  this._Condicion = "";
1930  this._Titulo_Browser = "";
1931 
1932 
1933  ewCampoTRel def_Empresa = this._AddCampoTRel("_Empresa", "Empresa");
1934  def_Empresa._AnchoColumna = 7;
1935  def_Empresa._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
1936  def_Empresa._Editable = false;
1937  def_Empresa._Error_Duplicados = "";
1938  def_Empresa._Error_Validar_Dato = "";
1939  def_Empresa._ExpandirPunto = false;
1940  def_Empresa._FormatString = "";
1941  def_Empresa._PermiteDuplicados = true;
1942  def_Empresa._TipoColumna = gridColumnsTypes.Texto;
1943  def_Empresa._Titulo = "Empresa";
1944  def_Empresa._Updatable = true;
1945  def_Empresa._Validar_Asignar_Cargando = false;
1946  def_Empresa._Validar_Dato_BaseDatos = "";
1947  def_Empresa._Validar_Dato_Campos = "";
1948  def_Empresa._Validar_Dato_CampoTRel_Asignar = "";
1949  def_Empresa._Validar_Dato_Clave = "";
1950  def_Empresa._Validar_Dato_Tabla = "";
1951  def_Empresa._Visible = false;
1952 
1953  ewCampoTRel def_Numero = this._AddCampoTRel("_Numero", "Remesa");
1954  def_Numero._AnchoColumna = 7;
1955  def_Numero._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
1956  def_Numero._Editable = false;
1957  def_Numero._Error_Duplicados = "Ha introducido un valor que ya está asignado a otro registro. No se permiten valores duplicados en este campo.";
1958  def_Numero._Error_Validar_Dato = "Ha introducido un valor que no se ha encontrado en su mantenimiento origen.";
1959  def_Numero._ExpandirPunto = false;
1960  def_Numero._FormatString = "";
1961  def_Numero._PermiteDuplicados = true;
1962  def_Numero._TipoColumna = gridColumnsTypes.Número;
1963  def_Numero._Titulo = "Número";
1964  def_Numero._Updatable = true;
1965  def_Numero._Validar_Asignar_Cargando = false;
1966  def_Numero._Validar_Dato_BaseDatos = "";
1967  def_Numero._Validar_Dato_Campos = "";
1968  def_Numero._Validar_Dato_CampoTRel_Asignar = "";
1969  def_Numero._Validar_Dato_Clave = "";
1970  def_Numero._Validar_Dato_Tabla = "";
1971  def_Numero._Visible = false;
1972 
1973  ewCampoTRel def_Periodo = this._AddCampoTRel("_Periodo", "Periodo");
1974  def_Periodo._AnchoColumna = 7;
1975  def_Periodo._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
1976  def_Periodo._Editable = false;
1977  def_Periodo._Error_Duplicados = "Ha introducido un valor que ya está asignado a otro registro. No se permiten valores duplicados en este campo.";
1978  def_Periodo._Error_Validar_Dato = "Ha introducido un valor que no se ha encontrado en su mantenimiento origen.";
1979  def_Periodo._ExpandirPunto = false;
1980  def_Periodo._FormatString = "";
1981  def_Periodo._PermiteDuplicados = true;
1982  def_Periodo._TipoColumna = gridColumnsTypes.Número;
1983  def_Periodo._Titulo = "Periodo";
1984  def_Periodo._Updatable = true;
1985  def_Periodo._Validar_Asignar_Cargando = false;
1986  def_Periodo._Validar_Dato_BaseDatos = "";
1987  def_Periodo._Validar_Dato_Campos = "";
1988  def_Periodo._Validar_Dato_CampoTRel_Asignar = "";
1989  def_Periodo._Validar_Dato_Clave = "";
1990  def_Periodo._Validar_Dato_Tabla = "";
1991  def_Periodo._Visible = false;
1992 
1993 
1994  ewCampoTRel def_Emision = this._AddCampoTRel("_Emision", "Emision");
1995  def_Emision._AnchoColumna = 6;
1996  def_Emision._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
1997  def_Emision._Editable = false;
1998  def_Emision._Error_Duplicados = "";
1999  def_Emision._Error_Validar_Dato = "";
2000  def_Emision._ExpandirPunto = false;
2001  def_Emision._FormatString = "";
2002  def_Emision._PermiteDuplicados = true;
2003  def_Emision._TipoColumna = gridColumnsTypes.Fecha;
2004  def_Emision._Titulo = "Emision";
2005  def_Emision._Updatable = true;
2006  def_Emision._Validar_Asignar_Cargando = false;
2007  def_Emision._Validar_Dato_BaseDatos = "";
2008  def_Emision._Validar_Dato_Campos = "";
2009  def_Emision._Validar_Dato_CampoTRel_Asignar = "";
2010  def_Emision._Validar_Dato_Clave = "";
2011  def_Emision._Validar_Dato_Tabla = "";
2012  def_Emision._Visible = false;
2013 
2014 
2015  ewCampoTRel def_Factura = this._AddCampoTRel("_Factura", "Factura");
2016  if (this._nLenFactura <= 20)
2017  {
2018  // Si el ancho del campo factura es 20 (defecto), fijamos la anchura de la
2019  // columna al valor standar.
2020  def_Factura._AnchoColumna = 12;
2021  def_Factura._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2022  }
2023  else
2024  {
2025  // CCR167227
2026  // Si el ancho del campo factura es mayor a 20 quiere decir que lo han ampliaco
2027  // y puede ser cualquier cosa, por tanto adaptamos su anchura al contenido del
2028  // valor de las celdas de la columna factura, para que siempre se vea el nº entero
2029  // y no quede nunca recortado.
2030  //
2031  def_Factura._AnchoColumna = (int)(this._nLenFactura/1.7);
2032  }
2033 
2034  def_Factura._Editable = true;
2035  def_Factura._Error_Duplicados = "";
2036  def_Factura._Error_Validar_Dato = "";
2037  def_Factura._ExpandirPunto = false;
2038  def_Factura._FormatString = "";
2039  def_Factura._PermiteDuplicados = true;
2040  def_Factura._TipoColumna = gridColumnsTypes.Texto;
2041  def_Factura._Titulo = "Factura";
2042  def_Factura._Updatable = true;
2043  def_Factura._Validar_Asignar_Cargando = false;
2044  def_Factura._Validar_Dato_BaseDatos = "";
2045  def_Factura._Validar_Dato_Campos = "";
2046  def_Factura._Validar_Dato_CampoTRel_Asignar = "";
2047  def_Factura._Validar_Dato_Clave = "";
2048  def_Factura._Validar_Dato_Tabla = "";
2049  def_Factura._Visible = true;
2050  def_Factura._Mante = new sage.ew.botones.btMante();
2051  def_Factura._Mante._NombreManteNet = "PREV_PAG";
2052  def_Factura._Mante._Tooltip = "Acceder al mantenimiento de la previsión de pago seleccionada.";
2053 
2054 
2055  // Configurar el browser que ha de enviar al formulario de seleccion de previsiones de pago. Rellenamos estas propiedades pero lo hacemos
2056  // solamente por compatibilida, realmente en f4_before_click se envia la ejecución al formulario especial de búsqueda de previsiones de
2057  // pago frmPrevisionesPago.
2058  //
2059  def_Factura._Browser = new sage.ew.botones.btBrowser();
2060  def_Factura._Browser._Campos = "Factura, Proveedor";
2061  def_Factura._Browser._Campo_Predet = "Factura";
2062  def_Factura._Browser._Clave = "Factura";
2063  def_Factura._Browser._DataBase = "comunes";
2064  def_Factura._Browser._Tabla = "previs";
2065  def_Factura._Browser._Titulo = "Listado de previsiones de pago pendientes.";
2066  def_Factura._Browser._Titulos_Campos = "Factura, Proveedor";
2067  def_Factura._Browser.NombreMantenimiento = "PREV_PAG";
2068  def_Factura._Browser._Tooltip = "Buscar y añadir previsiones de pago a la remesa";
2069 
2070  ewCampoTRel def_Orden = this._AddCampoTRel("_Orden", "Numereb");
2071  def_Orden._AnchoColumna = 4;
2072  def_Orden._Mascara = new ewMascara("9999");
2073  def_Orden._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2074  def_Orden._Editable = true;
2075  def_Orden._Error_Duplicados = "";
2076  def_Orden._Error_Validar_Dato = "";
2077  def_Orden._ExpandirPunto = false;
2078  def_Orden._FormatString = "";
2079  def_Orden._PermiteDuplicados = true;
2080  def_Orden._TipoColumna = gridColumnsTypes.Entero;
2081  def_Orden._Titulo = "Orden";
2082  def_Orden._Updatable = true;
2083  def_Orden._Validar_Asignar_Cargando = false;
2084  def_Orden._Validar_Dato_BaseDatos = "";
2085  def_Orden._Validar_Dato_Campos = "";
2086  def_Orden._Validar_Dato_CampoTRel_Asignar = "";
2087  def_Orden._Validar_Dato_Clave = "";
2088  def_Orden._Validar_Dato_Tabla = "";
2089  def_Orden._Visible = true;
2090  def_Orden._Mante = new sage.ew.botones.btMante();
2091  def_Orden._Mante._NombreManteNet = "PREV_PAG";
2092  def_Orden._Mante._Tooltip = "Acceder al mantenimiento de la previsión de pago seleccionada";
2093 
2094  // Configurar el browser que ha de enviar al formulario de seleccion de previsiones de pago. Rellenamos estas propiedades pero lo hacemos
2095  // solamente por compatibilida, realmente en f4_before_click se envia la ejecución al formulario especial de búsqueda de previsiones de
2096  // pago frmPrevisionesPago.
2097  //
2098  def_Orden._Browser = new sage.ew.botones.btBrowser();
2099  def_Orden._Browser._Campos = "Factura, Proveedor";
2100  def_Orden._Browser._Campo_Predet = "Factura";
2101  def_Orden._Browser._Clave = "Factura";
2102  def_Orden._Browser._DataBase = "comunes";
2103  def_Orden._Browser._Tabla = "previs";
2104  def_Orden._Browser._Titulo = "Listado de previsiones de pago pendientes.";
2105  def_Orden._Browser._Titulos_Campos = "Factura, Proveedor";
2106  def_Orden._Browser.NombreMantenimiento = "PREV_PAG";
2107  def_Orden._Browser._Tooltip = "Buscar y añadir previsiones de pago a la remesa";
2108 
2109 
2110  ewCampoTRel def_Pendiente = this._AddCampoTRel("_Pendiente", "Pendiente");
2111  def_Pendiente._AnchoColumna = 4;
2112  def_Pendiente._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2113  def_Pendiente._Editable = false;
2114  def_Pendiente._Error_Duplicados = "";
2115  def_Pendiente._Error_Validar_Dato = "";
2116  def_Pendiente._ExpandirPunto = false;
2117  def_Pendiente._FormatString = "";
2118  def_Pendiente._PermiteDuplicados = true;
2119  def_Pendiente._TipoColumna = gridColumnsTypes.Entero;
2120  def_Pendiente._Titulo = "Pendiente";
2121  def_Pendiente._Updatable = true;
2122  def_Pendiente._Validar_Asignar_Cargando = false;
2123  def_Pendiente._Validar_Dato_BaseDatos = "";
2124  def_Pendiente._Validar_Dato_Campos = "";
2125  def_Pendiente._Validar_Dato_CampoTRel_Asignar = "";
2126  def_Pendiente._Validar_Dato_Clave = "";
2127  def_Pendiente._Validar_Dato_Tabla = "";
2128  def_Pendiente._Visible = false;
2129 
2130 
2131  ewCampoTRel def_Cuenta = this._AddCampoTRel("_Cuenta", "Proveedor");
2132  def_Cuenta._AnchoColumna = 6;
2133  def_Cuenta._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2134  def_Cuenta._Editable = true;
2135  def_Cuenta._Error_Duplicados = "";
2136  def_Cuenta._Error_Validar_Dato = "La cuenta introducida no existe.";
2137  def_Cuenta._ExpandirPunto = true;
2138  def_Cuenta._FormatString = "";
2139  def_Cuenta._PermiteDuplicados = true;
2140  def_Cuenta._TipoColumna = gridColumnsTypes.Texto;
2141  def_Cuenta._Titulo = "Proveedor";
2142  def_Cuenta._Updatable = true;
2143  def_Cuenta._Validar_Asignar_Cargando = true;
2144  def_Cuenta._Validar_Dato_BaseDatos = "GESTION";
2145  def_Cuenta._Validar_Dato_Campos = "NOMBRE";
2146  def_Cuenta._Validar_Dato_CampoTRel_Asignar = "_NombreCuenta";
2147  def_Cuenta._Validar_Dato_Clave = "CODIGO";
2148  def_Cuenta._Validar_Dato_Tabla = "cuentas";
2149  def_Cuenta._Visible = true;
2150 
2151  def_Cuenta._Browser = new sage.ew.botones.btBrowser();
2152  def_Cuenta._Browser._Campos = "Codigo,Nombre";
2153  def_Cuenta._Browser._Campo_Predet = "Nombre";
2154  def_Cuenta._Browser._Clave = "CODIGO";
2155  def_Cuenta._Browser._DataBase = "GESTION";
2156  def_Cuenta._Browser._Tabla = "cuentas";
2157  def_Cuenta._Browser._Titulo = "Buscar Cuenta";
2158  def_Cuenta._Browser._Titulos_Campos = "Código,Nombre";
2159  def_Cuenta._Browser._Condicion = "codigo in "+CONTABILIDAD._CuentasProveedores("codigo");
2160 
2161 
2162  def_Cuenta._Browser._Tooltip = "Acceder a la consulta de cuentas";
2163  def_Cuenta._Mante = new sage.ew.botones.btMante();
2164  def_Cuenta._Mante._NombreManteNet = "CUENTAS";
2165  def_Cuenta._Mante._Tooltip = "Acceder al mantenimiento de la cuenta de la previsión seleccionada";
2166 
2167  ewCampoTRel def_Nombrecuenta = this._AddCampoTRel("_Nombrecuenta", "");
2168  def_Nombrecuenta._AnchoColumna = 20;
2169  def_Nombrecuenta._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2170  def_Nombrecuenta._Editable = false;
2171  def_Nombrecuenta._Error_Duplicados = "Ha introducido un valor que ya está asignado a otro registro. No se permiten valores duplicados en este campo.";
2172  def_Nombrecuenta._Error_Validar_Dato = "Ha introducido un valor que no se ha encontrado en su mantenimiento origen.";
2173  def_Nombrecuenta._ExpandirPunto = false;
2174  def_Nombrecuenta._FormatString = "";
2175  def_Nombrecuenta._PermiteDuplicados = true;
2176  def_Nombrecuenta._TipoColumna = gridColumnsTypes.Texto;
2177  def_Nombrecuenta._Titulo = "Nombre";
2178  def_Nombrecuenta._Updatable = false;
2179  def_Nombrecuenta._Validar_Asignar_Cargando = true;
2180  def_Nombrecuenta._Validar_Dato_BaseDatos = "GESTION";
2181  def_Nombrecuenta._Validar_Dato_Campos = "NOMBRE";
2182  def_Nombrecuenta._Validar_Dato_CampoTRel_Asignar = "_Nombrecuenta";
2183  def_Nombrecuenta._Validar_Dato_Clave = "CODIGO";
2184  def_Nombrecuenta._Validar_Dato_Tabla = "CUENTAS";
2185  def_Nombrecuenta._Visible = true;
2186 
2187  ewCampoTRel def_Vencim = this._AddCampoTRel("_Vencim", "Vencim");
2188  def_Vencim._AnchoColumna = 6;
2189  def_Vencim._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2190  def_Vencim._Editable = false;
2191  def_Vencim._Error_Duplicados = "";
2192  def_Vencim._Error_Validar_Dato = "";
2193  def_Vencim._ExpandirPunto = false;
2194  def_Vencim._FormatString = "";
2195  def_Vencim._PermiteDuplicados = true;
2196  def_Vencim._TipoColumna = gridColumnsTypes.Fecha;
2197  def_Vencim._Titulo = "Vencimiento";
2198  def_Vencim._Updatable = true;
2199  def_Vencim._Validar_Asignar_Cargando = false;
2200  def_Vencim._Validar_Dato_BaseDatos = "";
2201  def_Vencim._Validar_Dato_Campos = "";
2202  def_Vencim._Validar_Dato_CampoTRel_Asignar = "";
2203  def_Vencim._Validar_Dato_Clave = "";
2204  def_Vencim._Validar_Dato_Tabla = "";
2205  def_Vencim._Visible = true;
2206 
2207  ewCampoTRel def_Importe = this._AddCampoTRel("_Importe", "Importe");
2208  def_Importe._AnchoColumna = 7;
2209  def_Importe._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2210  def_Importe._Editable = false;
2211  def_Importe._Error_Duplicados = "";
2212  def_Importe._Error_Validar_Dato = "";
2213  def_Importe._ExpandirPunto = false;
2214  def_Importe._FormatString = "";
2215  def_Importe._PermiteDuplicados = true;
2216  def_Importe._TipoColumna = gridColumnsTypes.Número;
2217  def_Importe._Titulo = "Importe";
2218  def_Importe._Updatable = true;
2219  def_Importe._Validar_Asignar_Cargando = false;
2220  def_Importe._Validar_Dato_BaseDatos = "";
2221  def_Importe._Validar_Dato_Campos = "";
2222  def_Importe._Validar_Dato_CampoTRel_Asignar = "";
2223  def_Importe._Validar_Dato_Clave = "";
2224  def_Importe._Validar_Dato_Tabla = "";
2225  def_Importe._Visible = true;
2226  def_Importe._Mascara = mascaraGranTotal;
2227 
2228  ewCampoTRel def_ImporteDiv = this._AddCampoTRel("_ImporteDiv", "Importediv");
2229  def_ImporteDiv._AnchoColumna = 7;
2230  def_ImporteDiv._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2231  def_ImporteDiv._Editable = false;
2232  def_ImporteDiv._Error_Duplicados = "";
2233  def_ImporteDiv._Error_Validar_Dato = "";
2234  def_ImporteDiv._ExpandirPunto = false;
2235  def_ImporteDiv._FormatString = "";
2236  def_ImporteDiv._PermiteDuplicados = true;
2237  def_ImporteDiv._TipoColumna = gridColumnsTypes.Número;
2238  def_ImporteDiv._Titulo = "ImporteDiv";
2239  def_ImporteDiv._Updatable = true;
2240  def_ImporteDiv._Validar_Asignar_Cargando = false;
2241  def_ImporteDiv._Validar_Dato_BaseDatos = "";
2242  def_ImporteDiv._Validar_Dato_Campos = "";
2243  def_ImporteDiv._Validar_Dato_CampoTRel_Asignar = "";
2244  def_ImporteDiv._Validar_Dato_Clave = "";
2245  def_ImporteDiv._Validar_Dato_Tabla = "";
2246  def_ImporteDiv._Visible = false;
2247  def_ImporteDiv._Mascara = mascaraGranTotal;
2248 
2249 
2250  ewCampoTRel def_Cambio = this._AddCampoTRel("_Cambio", "Cambio");
2251  def_Cambio._AnchoColumna = 7;
2252  def_Cambio._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2253  def_Cambio._Editable = false;
2254  def_Cambio._Error_Duplicados = "";
2255  def_Cambio._Error_Validar_Dato = "";
2256  def_Cambio._ExpandirPunto = false;
2257  def_Cambio._FormatString = "";
2258  def_Cambio._PermiteDuplicados = true;
2259  def_Cambio._TipoColumna = gridColumnsTypes.Número;
2260  def_Cambio._Titulo = "Cambio";
2261  def_Cambio._Updatable = true;
2262  def_Cambio._Validar_Asignar_Cargando = false;
2263  def_Cambio._Validar_Dato_BaseDatos = "";
2264  def_Cambio._Validar_Dato_Campos = "";
2265  def_Cambio._Validar_Dato_CampoTRel_Asignar = "";
2266  def_Cambio._Validar_Dato_Clave = "";
2267  def_Cambio._Validar_Dato_Tabla = "";
2268  def_Cambio._Visible = false;
2269  def_Cambio._Mascara = mascaraGranTotal;
2270 
2271  ewCampoTRel def_Divisa = this._AddCampoTRel("_Divisa", "Divisa");
2272  def_Divisa._AnchoColumna = 0;
2273  def_Divisa._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.Fill;
2274  def_Divisa._Editable = false;
2275  def_Divisa._Error_Duplicados = "";
2276  def_Divisa._Error_Validar_Dato = "";
2277  def_Divisa._ExpandirPunto = false;
2278  def_Divisa._FormatString = "";
2279  def_Divisa._PermiteDuplicados = true;
2280  def_Divisa._TipoColumna = gridColumnsTypes.Texto;
2281  def_Divisa._Titulo = "Divisa";
2282  def_Divisa._Updatable = true;
2283  def_Divisa._Validar_Asignar_Cargando = false;
2284  def_Divisa._Validar_Dato_BaseDatos = "";
2285  def_Divisa._Validar_Dato_Campos = "";
2286  def_Divisa._Validar_Dato_CampoTRel_Asignar = "";
2287  def_Divisa._Validar_Dato_Clave = "";
2288  def_Divisa._Validar_Dato_Tabla = "";
2289  def_Divisa._Visible = false;
2290 
2291 
2292  ewCampoTRel def_Concepto = this._AddCampoTRel("_Concepto", "Concepto");
2293  def_Concepto._AnchoColumna = 0;
2294  def_Concepto._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.Fill;
2295  def_Concepto._Editable = true;
2296  def_Concepto._Error_Duplicados = "";
2297  def_Concepto._Error_Validar_Dato = "";
2298  def_Concepto._ExpandirPunto = false;
2299  def_Concepto._FormatString = "";
2300  def_Concepto._PermiteDuplicados = true;
2301  def_Concepto._TipoColumna = gridColumnsTypes.Texto;
2302  def_Concepto._Titulo = "Concepto";
2303  def_Concepto._Updatable = true;
2304  def_Concepto._Validar_Asignar_Cargando = false;
2305  def_Concepto._Validar_Dato_BaseDatos = "";
2306  def_Concepto._Validar_Dato_Campos = "";
2307  def_Concepto._Validar_Dato_CampoTRel_Asignar = "";
2308  def_Concepto._Validar_Dato_Clave = "";
2309  def_Concepto._Validar_Dato_Tabla = "";
2310  def_Concepto._Visible = true;
2311 
2312 
2313  ewCampoTRel def_FecReme = this._AddCampoTRel("_FecReme", "Fecreme");
2314  def_FecReme._AnchoColumna = 6;
2315  def_FecReme._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.None;
2316  def_FecReme._Editable = false;
2317  def_FecReme._Error_Duplicados = "";
2318  def_FecReme._Error_Validar_Dato = "";
2319  def_FecReme._ExpandirPunto = false;
2320  def_FecReme._FormatString = "";
2321  def_FecReme._PermiteDuplicados = true;
2322  def_FecReme._TipoColumna = gridColumnsTypes.Fecha;
2323  def_FecReme._Titulo = "Fecha remesa";
2324  def_FecReme._Updatable = true;
2325  def_FecReme._Validar_Asignar_Cargando = false;
2326  def_FecReme._Validar_Dato_BaseDatos = "";
2327  def_FecReme._Validar_Dato_Campos = "";
2328  def_FecReme._Validar_Dato_CampoTRel_Asignar = "";
2329  def_FecReme._Validar_Dato_Clave = "";
2330  def_FecReme._Validar_Dato_Tabla = "";
2331  def_FecReme._Visible = false;
2332 
2333  ewCampoTRel def_NumBanco = this._AddCampoTRel("_NumBanco", "Num_Banco");
2334  def_NumBanco._AnchoColumna = 0;
2335  def_NumBanco._AutoModeSizeColumna = DataGridViewAutoSizeColumnMode.Fill;
2336  def_NumBanco._Editable = false;
2337  def_NumBanco._Error_Duplicados = "";
2338  def_NumBanco._Error_Validar_Dato = "";
2339  def_NumBanco._ExpandirPunto = false;
2340  def_NumBanco._FormatString = "";
2341  def_NumBanco._PermiteDuplicados = true;
2342  def_NumBanco._TipoColumna = gridColumnsTypes.Número;
2343  def_NumBanco._Titulo = "Num_Banco";
2344  def_NumBanco._Updatable = true;
2345  def_NumBanco._Validar_Asignar_Cargando = false;
2346  def_NumBanco._Validar_Dato_BaseDatos = "";
2347  def_NumBanco._Validar_Dato_Campos = "";
2348  def_NumBanco._Validar_Dato_CampoTRel_Asignar = "";
2349  def_NumBanco._Validar_Dato_Clave = "";
2350  def_NumBanco._Validar_Dato_Tabla = "";
2351  def_NumBanco._Visible = false;
2352 
2353  // Task 155061. Añadir forma de pago
2354  this._AddCampoTRel("_TipoPag", "TipoPag", false, true, false);
2355 
2356  return;
2357  }
2358 
2359 
2360  #endregion MÉTODOS PRIVADOS
2361 
2362 
2363  #region MÉTODOS PUBLIC OVERRIDE SOBREESCRITOS DE EWMANTTREL
2364 
2365 
2369  public override void _Load()
2370  {
2371  RemesaBancariaPago document = (RemesaBancariaPago)this._ewMantePrincipal;
2372 
2373  this._Claves._Empresa._Valor = document._Empresa;
2374  this._Claves._Numero._Valor = Convert.ToInt32(document._Numero);
2375 
2376  this._isLoading = true;
2377 
2378  base._Load();
2379 
2380  this._isLoading = false;
2381  }
2382 
2383 
2394  public override bool _DeleteItem(RemesaBancariaDetallePrevis.Linea toItem)
2395  {
2396  bool deleted = false;
2397 
2398  deleted = base._DeleteItem(toItem);
2399 
2400  if (deleted)
2401  {
2402  if (toItem.Fila_Plena())
2403  {
2404  // Actualizo la bd. para que puedan añadir el pagaré de nuevo, si lo desean.
2405  //
2406  string sql = "Update " + DB.SQLDatabase("comunes", "previs") + " " +
2407  "set remesa=0, fecreme=null " +
2408  "Where empresa=" + DB.SQLString(toItem._Empresa) + " and " +
2409  "proveedor=" + DB.SQLString(toItem._Cuenta) + " and " +
2410  "factura=" + DB.SQLString(toItem._Factura) + " and " +
2411  "numereb=" + DB.SQLString(toItem._Orden) + " and " +
2412  "pendiente=" + DB.SQLString(toItem._Pendiente) + " and " +
2413  "periodo=" + DB.SQLString(toItem._Periodo);
2414  DB.SQLExec(sql);
2415  }
2416 
2417  // Refrescar los totales de la remesa.
2418  //
2419  this._oRemesa._Totalizar();
2420  }
2421 
2422  return deleted;
2423  }
2424 
2425 
2438  public override Boolean _SaveItem(RemesaBancariaDetallePrevis.Linea toItem)
2439  {
2440  bool lbRetorn = true;
2441  string sql = "";
2442 
2443  sql = "Update " + DB.SQLDatabase("comunes", "previs") + " " +
2444  "set remesa=" +DB.SQLString(toItem._Numero)+", concepto="+DB.SQLString(toItem._Concepto)+" "+
2445  "Where empresa=" + DB.SQLString(toItem._Empresa) + " and " +
2446  "proveedor=" + DB.SQLString(toItem._Cuenta) + " and " +
2447  "factura=" + DB.SQLString(toItem._Factura) + " and " +
2448  "numereb=" + DB.SQLString(toItem._Orden) + " and " +
2449  "pendiente=" + DB.SQLString(toItem._Pendiente) + " and " +
2450  "periodo=" + DB.SQLString(toItem._Periodo);
2451  lbRetorn = DB.SQLExec(sql);
2452 
2453  return lbRetorn;
2454  }
2455 
2456 
2457  #endregion MÉTODOS PUBLIC OVERRIDE SOBREESCRITOS DE EWMANTTREL
2458 
2459 
2460  #region MÉTODOS PROTECTED OVERRIDE SOBREESCRITOS DE EWMANTETREL
2461 
2462 
2475  protected override bool _BorrarRegistro(DataRow dataroweliminar)
2476  {
2477  bool lbRetorn = true;
2478  string sql = "";
2479 
2480  sql = "Update " + DB.SQLDatabase("comunes", "previs") +" "+
2481  "set remesa=0 "+
2482  "Where empresa=" + DB.SQLString(Convert.ToString(dataroweliminar["empresa"])) + " and " +
2483  "proveedor=" + DB.SQLString(Convert.ToString(dataroweliminar["proveedor"])) + " and " +
2484  "factura=" + DB.SQLString(Convert.ToString(dataroweliminar["factura"])) + " and " +
2485  "numereb=" + DB.SQLString(Convert.ToInt32(dataroweliminar["numereb"])) + " and " +
2486  "pendiente=" + DB.SQLString(Convert.ToInt32(dataroweliminar["pendiente"])) + " and " +
2487  "periodo=" + DB.SQLString(Convert.ToInt32(dataroweliminar["periodo"])); ;
2488  lbRetorn = DB.SQLExec(sql);
2489 
2490  return lbRetorn;
2491  }
2492 
2493 
2506  protected override bool _BorrarRegistro(RemesaBancariaDetallePrevis.Linea loItem)
2507  {
2508  bool lbRetorn = true;
2509  string sql = "";
2510 
2511  sql = "Update " + DB.SQLDatabase("comunes", "previs") + " " +
2512  "set remesa=0 " +
2513  "Where empresa=" + DB.SQLString(loItem._Empresa) + " and " +
2514  "proveedor=" + DB.SQLString(loItem._Cuenta) + " and " +
2515  "factura=" + DB.SQLString(loItem._Factura) + " and " +
2516  "numereb=" + DB.SQLString(loItem._Orden) + " and " +
2517  "pendiente=" + DB.SQLString(loItem._Pendiente) + " and " +
2518  "periodo=" + DB.SQLString(loItem._Periodo);
2519  lbRetorn = DB.SQLExec(sql);
2520 
2521  return lbRetorn;
2522  }
2523 
2524 
2537  protected override bool _BorrarTodosRegistros()
2538  {
2539  bool llOk = true;
2540  string lcSql = "";
2541 
2542  try
2543  {
2544  lcSql = "UPDATE " + DB.SQLDatabase("COMUNES", "PREVIS") + " " +
2545  "SET REMESA=0 " +
2546  "WHERE EMPRESA=" + DB.SQLString(this._Claves._Empresa._Valor) + " AND " +
2547  "REMESA=" + Convert.ToString(this._Claves._Numero._Valor).Trim();
2548  llOk = DB.SQLExec(lcSql);
2549  }
2550  catch (Exception e)
2551  {
2552  DB.Registrar_Error(e);
2553  this._oRemesa._Error_Message = e.Message;
2554  llOk = false;
2555  }
2556 
2557  return llOk;
2558  }
2559 
2560 
2561  #endregion MÉTODOS PROTECTED OVERRIDE SOBREESCRITOS DE EWMANTETREL
2562 
2563 
2567  public class Clave : IClaves
2568  {
2572  public ClaveTRel _Empresa { get; set; }
2573 
2574 
2578  public ClaveTRel _Numero { get; set; }
2579 
2580 
2584  public ClaveTRel _Periodo { get; set; }
2585 
2586 
2590  public ClaveTRel _Cuenta { get; set; }
2591 
2592 
2596  public ClaveTRel _Factura { get; set; }
2597 
2598 
2602  public ClaveTRel _Orden { get; set; }
2603 
2604 
2608  public ClaveTRel _Pendiente { get; set; }
2609 
2610 
2614  public ClaveTRel _Emision { get; set; }
2615 
2616 
2620  public Clave()
2621  {
2622  // Definición de las propiedades de cada una de les claves
2623 
2624  // Empresa de la remesa.
2625  //
2626  this._Empresa = new ClaveTRel();
2627  this._Empresa._EsFiltro = true;
2628  this._Empresa._EsCampoLinea = false;
2629 
2630 
2631  // Número de la remesa.
2632  //
2633  this._Numero = new ClaveTRel();
2634  this._Numero._EsFiltro = true;
2635  this._Numero._EsCampoLinea = false;
2636 
2637 
2638  // Campo Periodo de la previsión incorporada a la remesa.
2639  //
2640  this._Periodo = new ClaveTRel();
2641  this._Periodo._EsFiltro = false;
2642  this._Periodo._EsCampoLinea = false;
2643 
2644 
2645  // Campo Proveedor de la previsión incorporada a la remesa.
2646  //
2647  this._Cuenta = new ClaveTRel();
2648  this._Cuenta._EsFiltro = false;
2649  this._Cuenta._EsCampoLinea = false;
2650 
2651 
2652  // Campo Factura de la previsión incorporada a la remesa.
2653  //
2654  this._Factura = new ClaveTRel();
2655  this._Factura._EsFiltro = false;
2656  this._Factura._EsCampoLinea = false;
2657 
2658 
2659  // Campo Orden de la previsión incorporada a la remesa.
2660  //
2661  this._Orden = new ClaveTRel();
2662  this._Orden._EsFiltro = false;
2663  this._Orden._EsCampoLinea = false;
2664 
2665 
2666  // Campo Pendiente de la previsión incorporada a la remesa.
2667  //
2668  this._Pendiente = new ClaveTRel();
2669  this._Pendiente._EsFiltro = false;
2670  this._Pendiente._EsCampoLinea = false;
2671 
2672 
2673  // Campo Fecha Emision de la previsión incorporada a la remesa.
2674  //
2675  this._Emision = new ClaveTRel();
2676  this._Emision._EsFiltro = false;
2677  this._Emision._EsCampoLinea = false;
2678 
2679  return;
2680  }
2681  }
2682 
2683 
2688  {
2692  [ReportProperty("Empresa", "", "Empresa:")]
2693  public string _Empresa
2694  {
2695  get
2696  {
2697  return this._cEmpresa;
2698  }
2699  set
2700  {
2701  this._cEmpresa = value;
2702  }
2703  }
2707  private string _cEmpresa = "";
2708 
2709 
2726  [ReportProperty("Numero", "", "Nº Remesa:")]
2727  public int _Numero
2728  {
2729  get
2730  {
2731  return this._cNumero;
2732  }
2733  set
2734  {
2735  this._cNumero = value;
2736  }
2737  }
2741  private int _cNumero = 0;
2742 
2743 
2747  [ReportProperty("Periodo", "", "Periodo:")]
2748  public int _Periodo
2749  {
2750  get
2751  {
2752  return this._nPeriodo;
2753  }
2754  set
2755  {
2756  this._nPeriodo = value;
2757  }
2758  }
2762  private int _nPeriodo = 0;
2763 
2764 
2768  [ReportProperty("FecEmision", "dd/MM/yyyy", "Fecha emisión:")]
2769  public DateTime? _Emision
2770  {
2771  get
2772  {
2773  return this._dEmision;
2774  }
2775  set
2776  {
2777  this._dEmision = value;
2778  }
2779  }
2783  private DateTime?_dEmision = DateTime.Today;
2784 
2785 
2789  [ReportProperty("Factura", "", "Factura:")]
2790  public string _Factura
2791  {
2792  get
2793  {
2794  return this._cFactura;
2795  }
2796  set
2797  {
2798  int lnLenFacturaCompra = Convert.ToInt32(EW_GLOBAL._GetLenCampo(KeyDiccionarioLenCampos.wn_factcompra));
2799  string lcValorAnterior = this._cFactura;
2800 
2801  if (value == null)
2802  value = new string(' ', lnLenFacturaCompra);
2803 
2804  value = value.Trim().PadLeft(lnLenFacturaCompra,' ');
2805 
2806  if (value.Trim() != lcValorAnterior.Trim())
2807  {
2808  if (this._oParent._isLoading)
2809  {
2810  this._cFactura = value;
2811  }
2812  else
2813  {
2814  if (!string.IsNullOrWhiteSpace(value) && this._nOrden != 0 && !string.IsNullOrWhiteSpace(this._cCuenta))
2815  {
2816  // Si tenemos factura, orden y códig proveedor hemos de validar que exista la previsión, que esté pendiente, y que no esté añadida ya a la remesa
2817  //
2818  PrevisionPago loPrevisionPago;
2819  bool llOk = this.validarPrevisionPago(value, this._nOrden, this._cCuenta, out loPrevisionPago);
2820  if (llOk)
2821  {
2822  this._cFactura = value;
2823  this.rellenarLineaDatosPrevisionPago(loPrevisionPago);
2824  }
2825  }
2826  else
2827  this._cFactura = value;
2828  }
2829  }
2830  }
2831  }
2835  private string _cFactura = "";
2836 
2840  [ReportProperty("Orden", "", "Orden:")]
2841  public Int32 _Orden
2842  {
2843  get
2844  {
2845  return this._nOrden;
2846  }
2847  set
2848  {
2849  int lnValorAnterior = this._nOrden;
2850 
2851  if (value != lnValorAnterior)
2852  {
2853  if (this._oParent._isLoading)
2854  {
2855  this._nOrden = value;
2856  }
2857  else
2858  {
2859  if (!string.IsNullOrWhiteSpace(this._cFactura) && value != 0 && !string.IsNullOrWhiteSpace(this._cCuenta))
2860  {
2861  // Si tenemos factura, orden y código de proveedor hemos de validar que exista la previsión, que esté pendiente, y que no esté añadida ya a la remesa
2862  //
2863  PrevisionPago loPrevisionPago;
2864  bool llOk = this.validarPrevisionPago(this._cFactura, value, this._cCuenta, out loPrevisionPago);
2865  if (llOk)
2866  {
2867  this._nOrden = value;
2868  this.rellenarLineaDatosPrevisionPago(loPrevisionPago);
2869  }
2870  }
2871  else
2872  this._nOrden = value;
2873  }
2874  }
2875  }
2876  }
2880  private Int32 _nOrden = 0;
2881 
2882 
2886  [ReportProperty("Pendiente", "", "Pendiente:")]
2887  public Int32 _Pendiente
2888  {
2889  get
2890  {
2891  return this._nPendiente;
2892  }
2893  set
2894  {
2895  this._nPendiente = value;
2896  }
2897  }
2901  private Int32 _nPendiente = 0;
2902 
2903 
2907  [ReportProperty("Cuenta", "", "Cuenta:")]
2908  public string _Cuenta
2909  {
2910  get
2911  {
2912  return this._cCuenta;
2913  }
2914  set
2915  {
2916  string lcValorAnterior = this._cCuenta;
2917 
2918  if (value == null)
2919  value = "";
2920 
2921  value = FUNCTIONS._Punto_Por_Ceros(value);
2922 
2923  if (value.Trim() != lcValorAnterior.Trim())
2924  {
2925  if (this._oParent != null)
2926  {
2927  if (this._oParent.CamposTRel_Validar_Valor("_Cuenta", value, this))
2928  value = this._cCuenta;
2929  }
2930 
2931  if (this._oParent._isLoading)
2932  {
2933  this._cCuenta = value;
2934  }
2935  else
2936  {
2937  if (!string.IsNullOrWhiteSpace(this._cFactura) && this._nOrden != 0 && !string.IsNullOrWhiteSpace(value) )
2938  {
2939  // Si tenemos factura, orden y código de proveedor hemos de validar que exista la previsión, que esté pendiente, y que no esté añadida ya a la remesa
2940  //
2941  PrevisionPago loPrevisionPago;
2942  bool llOk = this.validarPrevisionPago(this._cFactura, this._nOrden, value, out loPrevisionPago);
2943  if (llOk)
2944  {
2945  this._cCuenta = value;
2946  this.rellenarLineaDatosPrevisionPago(loPrevisionPago);
2947  }
2948  else
2949  {
2950  // Quito el nombre de la cuenta que habrá puesto al validar el código de cuenta.
2951  //
2952  this._NombreCuenta = "";
2953  }
2954  }
2955  else
2956  this._cCuenta = value;
2957  }
2958 
2959  }
2960  }
2961  }
2965  private string _cCuenta = "";
2966 
2967 
2971  [ReportProperty("Nombrecuenta", "", "Nombre:")]
2972  public string _NombreCuenta
2973  {
2974  get
2975  {
2976  return this._cNombrecuenta;
2977  }
2978  set
2979  {
2980  this._cNombrecuenta = value;
2981  }
2982  }
2986  private string _cNombrecuenta = "";
2987 
2988 
2992  [ReportProperty("Vencim", "dd/MM/yyyy", "Vencimiento:")]
2993  public DateTime? _Vencim
2994  {
2995  get
2996  {
2997  return this._dVencim;
2998  }
2999  set
3000  {
3001  this._dVencim = value;
3002  }
3003  }
3007  private DateTime? _dVencim = DateTime.Today;
3008 
3009 
3013  [ReportProperty("Importe", "", "Importe:")]
3014  public decimal _Importe
3015  {
3016  get
3017  {
3018  return this._nImporte;
3019  }
3020  set
3021  {
3022  this._nImporte = value;
3023  }
3024  }
3028  private decimal _nImporte = 0;
3029 
3030 
3031 
3035  [ReportProperty("ImporteDiv", "", "Importe (Div):")]
3036  public decimal _ImporteDiv
3037  {
3038  get
3039  {
3040  return this._nImporteDiv;
3041  }
3042  set
3043  {
3044  this._nImporteDiv = value;
3045  }
3046  }
3050  private decimal _nImporteDiv = 0;
3051 
3052 
3056  [ReportProperty("Cambio", "", "Cambio:")]
3057  public decimal _Cambio
3058  {
3059  get
3060  {
3061  return this._nCambio;
3062  }
3063  set
3064  {
3065  this._nCambio = value;
3066  }
3067  }
3071  private decimal _nCambio = 0;
3072 
3073 
3077  [ReportProperty("Divisa", "", "Divisa:")]
3078  public string _Divisa
3079  {
3080  get
3081  {
3082  return this._cDivisa;
3083  }
3084  set
3085  {
3086  this._cDivisa = value;
3087  }
3088  }
3092  private string _cDivisa = "";
3093 
3094 
3098  [ReportProperty("Concepto", "", "Concepto:")]
3099  public string _Concepto
3100  {
3101  get
3102  {
3103  return this._cConcepto;
3104  }
3105  set
3106  {
3107  this._cConcepto = value;
3108  }
3109  }
3113  private string _cConcepto = "";
3114 
3115  // Task 155061
3119  [ReportProperty("TipoPag", "", "TipoPag:")]
3120  public string _TipoPag
3121  {
3122  get
3123  {
3124  return this._cTipoPag;
3125  }
3126  set
3127  {
3128  this._cTipoPag = value;
3129  }
3130  }
3131  private string _cTipoPag = "";
3132 
3133  // Task 155061
3137  [ReportProperty("NumeReb", "", "NumeReb:")]
3138  public int _NumeReb
3139  {
3140  get
3141  {
3142  return this._nNumeReb;
3143  }
3144  set
3145  {
3146  this._nNumeReb = value;
3147  }
3148  }
3149  private int _nNumeReb = 0;
3150 
3151  private Int32 _nNumBanco = 99;
3155  public Int32 _NumBanco
3156  {
3157  get
3158  {
3159  return this._nNumBanco;
3160  }
3161  set
3162  {
3163  this._nNumBanco = value;
3164  }
3165  }
3166 
3170  [ReportProperty("BANCO", "", "Cuenta bancaria:")]
3171  public String _CuentaBancaria
3172  {
3173  get
3174  {
3175  String lcSql;
3176  String lcCuenta = "";
3177  DataTable loDt = new DataTable();
3178  Boolean lbOcultar;
3179 
3180  if (_NumBanco != 99)
3181  {
3182  lcSql = String.Format("SELECT * FROM {0} WHERE CODIGO = {1} AND PROVEEDOR = {2}", DB.SQLDatabase("GESTION", "BANC_PRO"), _NumBanco, DB.SQLString(_Cuenta));
3183  DB.SQLExec(lcSql, ref loDt);
3184 
3185  if (loDt.Rows.Count == 0)
3186  {
3187  lcSql = String.Format("SELECT * FROM {0} WHERE CODIGO = {1} AND CUENTA = {2}", DB.SQLDatabase("GESTION", "BANC_CUE"), _NumBanco, DB.SQLString(_Cuenta));
3188  DB.SQLExec(lcSql, ref loDt);
3189  }
3190 
3191  // Si tenemos una cuenta de anticipos 460 vamos a consultar la información del IBAN en la cuenta del trabajador que esté relacionado
3192  // La función CONTABILIDAD._DigitosNivel3CuentaAnticipoTrabajador devuelve en blanco si está marcado como ficha proveedor la cuenta de Anticipo de trabajador 460. En tal caso se trata como proveedor.
3193  // Realizamos un LEFT JOIN, se puede dar el caso de tener 2 cuentas 465 con la misma 460 y que no tengamos registro en la tabla BANC_CUE
3194  if (loDt.Rows.Count == 0 && !string.IsNullOrWhiteSpace(_Cuenta) && CONTABILIDAD._EsAnticipoTrabajador(_Cuenta) && !string.IsNullOrWhiteSpace(CONTABILIDAD._DigitosNivel3CuentaAnticipoTrabajador()))
3195  {
3196  DataTable ldtBancoAnticipoTrabajador = new DataTable();
3197 
3198  bool llOk = DB.SQLExec("SELECT b.banco, b.ctabanco, b.ctasucur, b.digcon, b.ctacuenta, b.iban, b.cuentaiban, b.orden, b.swift ,b.tipocta " +
3199  $"FROM {DB.SQLDatabase("GESTION", "CUENTAS")} c LEFT JOIN {DB.SQLDatabase("GESTION", "BANC_CUE")} b ON c.codigo = b.cuenta " +
3200  $"WHERE c.anticiprem = {DB.SQLString(_Cuenta)}", ref ldtBancoAnticipoTrabajador);
3201 
3202  if (llOk && ldtBancoAnticipoTrabajador != null && ldtBancoAnticipoTrabajador.Rows.Count == 1)
3203  loDt = ldtBancoAnticipoTrabajador.Copy();
3204 
3205  FUNCTIONS._DisposeDatatable(ref ldtBancoAnticipoTrabajador);
3206  }
3207 
3208  if (loDt.Rows.Count > 0)
3209  {
3210  lbOcultar = !usuario.Usuario._This._Opcesp("0084");
3211  lcCuenta = functions.FUNCTIONS._Formatear_Cuenta_Bancaria(Convert.ToString(loDt.Rows[0]["tipocta"]), Convert.ToString(loDt.Rows[0]["iban"]), Convert.ToString(loDt.Rows[0]["cuentaiban"]).Trim(), lbOcultar);
3212  }
3213  }
3214  return lcCuenta;
3215  }
3216  }
3217 
3221  [ReportProperty("Fecreme", "dd/MM/yyyy", "Fecha remesa:")]
3222  public DateTime? _FecReme
3223  {
3224  get
3225  {
3226  return this._dFecReme;
3227  }
3228  set
3229  {
3230  this._dFecReme = value;
3231  }
3232  }
3236  private DateTime? _dFecReme = DateTime.Today;
3237 
3238 
3242  public dynamic _Parent
3243  {
3244  get { return this._oParent; }
3245  set { this._oParent = (RemesaBancariaDetallePrevis)value; }
3246  }
3251 
3252 
3256  public RemesaBancariaPago _oRemesa
3257  {
3258  get { return this._oParent._oRemesa; }
3259  }
3260 
3261 
3265  public Linea()
3266  {
3267 
3268  }
3269 
3270 
3275  public bool Fila_Plena()
3276  {
3277  bool lbFilaPlena = true;
3278 
3279  lbFilaPlena = !string.IsNullOrWhiteSpace(this._Factura) && this._Orden != 0 &&
3280  !string.IsNullOrWhiteSpace(this._Cuenta);
3281 
3282  return lbFilaPlena;
3283  }
3284 
3285 
3294  private bool validarPrevisionPago(string tcFactura, int tnOrden, string tcProveedor, out PrevisionPago toPrevisionPago)
3295  {
3296  string lcEmpresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
3297  toPrevisionPago = new PrevisionPago();
3298 
3299 
3300  // Busco todas las previsiones con idéntico nº de factura, orden y proveedor, podría darse el caso de que hubiera
3301  // más de una p.e. al pertenecer a diferentes ejercicios, en ese caso el usuario deberá seleccionar cual
3302  // quiere incorporar a la remesa.
3303  //
3304  DataTable ldtPrevisionesFacturaOrden = CONTABILIDAD._PrevisionesPagoFacturaOrden(lcEmpresa, tcProveedor, tcFactura, tnOrden, false);
3305  if (ldtPrevisionesFacturaOrden.Rows.Count == 0)
3306  {
3307  // No existe ninguna previsión de pago con este número de factura, orden y proveedor, ni pendiente ni pagada,
3308  // ni en el ejercicio activo ni en cualquier otro ejercicio.
3309  //
3310  // Informar de que la previsión NO EXISTE.
3311  //
3312  this._oRemesa._Error_Message_LineaRemesa = "La previsión de pago introducida no existe.";
3313  return false;
3314  }
3315 
3316 
3317  // Me quedo con las previsiones pendientes de pago.
3318  //
3319  DataView ldviewPrevPendi = ldtPrevisionesFacturaOrden.DefaultView;
3320  ldviewPrevPendi.RowFilter = "remesa=0 and asi='' and pagada<>'S'";
3321  DataTable ldtPrevisionesPendientes = ldviewPrevPendi.ToTable();
3322  if (ldtPrevisionesPendientes.Rows.Count == 0 && ldtPrevisionesFacturaOrden.Rows.Count > 0)
3323  {
3324  // La previsión introducida ya está pagada. Puede que hubiera más de una previsión con este número
3325  // de factura, orden y proveedor, en diferentes ejercicios, pero todas están pagadas.
3326  //
3327  // Informar de que la previsión ya está pagada.
3328  //
3329  this._oRemesa._Error_Message_LineaRemesa = "La previsión de pago introducida ya está remesada o pagada.";
3330  return false;
3331  }
3332 
3333  int lnPeriodo = 0, lnPendiente = 0;
3334  if (ldtPrevisionesPendientes.Rows.Count > 1)
3335  {
3336  if (this._oRemesa._LinkForm || this._oRemesa._lLinkadoFormulario)
3337  {
3338  // Se ha detectado más de una previsión con este nº de factura y orden, probablemente de diferentes
3339  // ejercicios, se solicitará al usuario que escoja una.
3340  //
3341  ldtPrevisionesPendientes.Columns["empresa"].ExtendedProperties.Add("NoVisible", true);
3342  ldtPrevisionesPendientes.Columns["pendiente"].ExtendedProperties.Add("NoVisible", true);
3343  ldtPrevisionesPendientes.Columns["importediv"].ExtendedProperties.Add("NoVisible", true);
3344  ldtPrevisionesPendientes.Columns["remesa"].ExtendedProperties.Add("NoVisible", true);
3345  ldtPrevisionesPendientes.Columns["asi"].ExtendedProperties.Add("NoVisible", true);
3346  ldtPrevisionesPendientes.Columns["pagada"].ExtendedProperties.Add("NoVisible", true);
3347 
3348  ldtPrevisionesPendientes.Columns["numereb"].Caption = "Orden";
3349  ldtPrevisionesPendientes.Columns["emision"].Caption = "Emisión";
3350  ldtPrevisionesPendientes.Columns["vencim"].Caption = "Vencimiento";
3351 
3352  formul.Forms.Seleccionar loFormSeleccionar = new formul.Forms.Seleccionar();
3353  loFormSeleccionar._Boto_Aceptar = true;
3354  loFormSeleccionar.MinimumSize = new System.Drawing.Size(400, 250);
3355 
3356  // Pongo la altura máxima para que si la lista es muy extensa no se salga de la pantalla y los dos botones no queden ocultos.
3357  //
3358  loFormSeleccionar.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height - 100);
3359 
3360  loFormSeleccionar._Ajustar_Alto_A_Registros = true;
3361  loFormSeleccionar._HeightMin = 250;
3362  loFormSeleccionar._Texto_Cancelar = "&Salir";
3363  loFormSeleccionar._ReadOnly = true;
3364  loFormSeleccionar._Solo_lectura = true;
3365  loFormSeleccionar._Redimensionable = false;
3366  loFormSeleccionar._MultipleSeleccion = true;
3367  loFormSeleccionar._Titulo = "Previsiones de pago pendientes con idéntico nº de factura y orden";
3368  loFormSeleccionar._Texto_Aceptar = "S&eleccionar";
3369  loFormSeleccionar._DataTable = ldtPrevisionesPendientes;
3370 
3371  bool llSeleccionada = false, llSalir = false;
3372  do
3373  {
3374  loFormSeleccionar._ShowDialog();
3375  if (DialogResult.OK == loFormSeleccionar.DialogResult && loFormSeleccionar._DataRowSelect != null)
3376  {
3377  lnPeriodo = Convert.ToInt32(loFormSeleccionar._DataRowSelect["periodo"]);
3378  lnPendiente = Convert.ToInt32(loFormSeleccionar._DataRowSelect["pendiente"]);
3379  llSeleccionada = true;
3380  }
3381  else
3382  {
3383  llSalir = true;
3384  }
3385  }
3386  while (!llSeleccionada && !llSalir);
3387 
3388  if (!llSeleccionada)
3389  {
3390  // No se ha seleccionado ninguna prevision, salimos.
3391  return false;
3392  }
3393  }
3394  else
3395  {
3396  // Si no trabajo contra formulario y tenemos más de una previsión el mismo número de factura
3397  // y orden, selecciono de forma automática la primera.
3398  //
3399  lnPeriodo = Convert.ToInt32(ldtPrevisionesPendientes.Rows[0]["periodo"]);
3400  lnPendiente = Convert.ToInt32(ldtPrevisionesPendientes.Rows[0]["pendiente"]);
3401  }
3402  }
3403  else
3404  {
3405  // Se detectó una única previsión de pago pendiente.
3406  //
3407  lnPeriodo = Convert.ToInt32(ldtPrevisionesPendientes.Rows[0]["periodo"]);
3408  lnPendiente = Convert.ToInt32(ldtPrevisionesPendientes.Rows[0]["pendiente"]);
3409  }
3410 
3411 
3412  // Caso de que la remesa sea de proveedores SEPA verificaremos que el proveedor de la previsión de pago tenga marcado en ficha
3413  // "Gestión de SEPA".
3414  //
3415  if (this._oRemesa._EsquemaSepa != TipoEsquemaRemesaSepaPagos.Ninguno)
3416  {
3417  Proveedor loProv = new Proveedor();
3418  loProv._Codigo = tcProveedor;
3419  if (loProv._Estado == _EstadosMantenimiento.MostrandoRegistro)
3420  {
3421  if (!loProv._CSB_Sepa)
3422  {
3423  // La previsión seleccionada no tiene mandato SEPA y la remesa es SEPA, no se puede agregar.
3424  //
3425  this._oRemesa._Error_Message_LineaRemesa = "La previsión de pago introducida corresponde a un proveedor ('"+ tcProveedor + "') que no tiene marcado en su ficha 'Gestión de SEPA', en cambio, "+
3426  "la remesa es de tipo SEPA. No se puede agregar la previsión de pago a la remesa.";
3427  return false;
3428  }
3429  }
3430  }
3431 
3432  // Verificar que la previsión de pago no esté agregada ya a la remesa.
3433  //
3434  Dictionary<string, object> loDicBusqueda = new Dictionary<string, object>();
3435  loDicBusqueda["_Empresa"] = lcEmpresa;
3436  loDicBusqueda["_Periodo"] = lnPeriodo;
3437  loDicBusqueda["_Cuenta"] = tcProveedor;
3438  loDicBusqueda["_Factura"] = tcFactura;
3439  loDicBusqueda["_Orden"] = tnOrden;
3440  loDicBusqueda["_Pendiente"] = lnPendiente;
3441 
3442  RemesaBancariaDetallePrevis.Linea loLinea = this._oParent._GetItem(loDicBusqueda);
3443  if (loLinea != null)
3444  {
3445  this._oRemesa._Error_Message_LineaRemesa = "La previsión de pago introducida ya está incorporada a la remesa.";
3446  // La previsión ya está agregada a la remesa.
3447  return false;
3448  }
3449  else
3450  {
3451  // Se puede agregar la previsión a la remesa, preparo el objeto PrevisionPago que devolverá al origen
3452  // de la llamada.
3453  //
3454  toPrevisionPago._Empresa = lcEmpresa;
3455  toPrevisionPago._Ejercicio = lnPeriodo;
3456  toPrevisionPago._Proveedor = tcProveedor;
3457  toPrevisionPago._Factura = tcFactura;
3458  toPrevisionPago._Numereb = tnOrden;
3459  toPrevisionPago._Pendiente = lnPendiente;
3460  toPrevisionPago._Load();
3461 
3462 
3463  // Task 180446 - En un tipo de esquema diferente de ninguno, no dejar entrar previsiones en negativo.
3464  if (this._oRemesa._EsquemaSepa != TipoEsquemaRemesaSepaPagos.Ninguno && toPrevisionPago._Importe < 0)
3465  {
3466  this._oRemesa._Error_Message_LineaRemesa = "No es posible incluir previsiones con signo negativo en los ficheros SEPA, " +
3467  "utilice el tipo de esquema 'Ninguno' para gestionar remesas sin fichero para gestión interna.";
3468  return false;
3469  }
3470 
3471  // Hasta ahora se permitía entrada de previsiones en divisa diferente de la moneda de la empresa y se mostraban
3472  // en un color diferente. A partir de esta tarea 197214 ya no se permite su entrada.
3473  //
3474  if (!string.IsNullOrWhiteSpace(toPrevisionPago._Divisa) && toPrevisionPago._Divisa != EW_GLOBAL._Empresa._Moneda)
3475  {
3476  Divisa loDivisaEmpresa = new Divisa(EW_GLOBAL._Empresa._Moneda);
3477  string lcNombreMonedaEmpresa = loDivisaEmpresa._Nombre.Trim();
3478  lcNombreMonedaEmpresa = !string.IsNullOrWhiteSpace(lcNombreMonedaEmpresa) ? lcNombreMonedaEmpresa : loDivisaEmpresa._NombreMoneda.Trim();
3479  lcNombreMonedaEmpresa = !string.IsNullOrWhiteSpace(lcNombreMonedaEmpresa) ? lcNombreMonedaEmpresa : loDivisaEmpresa._Abrev.Trim();
3480  this._oRemesa._Error_Message_LineaRemesa = "No se puede añadir la previsión indicada a la remesa. Solo se pueden añadir previsiones de divisa " + lcNombreMonedaEmpresa;
3481  loDivisaEmpresa = null;
3482  return false;
3483  }
3484 
3485 
3486  // Si la previsión está incluida en un pagaré no permito remesarla.
3487  //
3488  if (!string.IsNullOrWhiteSpace(toPrevisionPago._Num_Pag))
3489  {
3490  this._oRemesa._Error_Message_LineaRemesa = "La previsión de pago introducida ya está incluida en un pagaré (" + toPrevisionPago._Num_Pag.Trim() + ")." + Environment.NewLine + Environment.NewLine +
3491  "Para gestionar el pago deberá hacerlo desde el pagaré.";
3492  return false;
3493  }
3494 
3495  // Si la previsión está incluida en una agrupación no permito remesarla.
3496  //
3497  if (!string.IsNullOrWhiteSpace(toPrevisionPago._Refundir))
3498  {
3499  this._oRemesa._Error_Message_LineaRemesa = "La previsión de pago introducida está incluida en una agrupación de previsiones (" + toPrevisionPago._Refundir.Trim() + ")." + Environment.NewLine + Environment.NewLine +
3500  "No se puede agregar esta previsión.";
3501  return false;
3502  }
3503 
3504  // Antes de añadir la previsión de pago a la remesa reviso si la cuenta del banco tiene declarado límite de crédito.
3505  // Avisaremos caso de que la remesa vaya a sobrepasar este importe al añadir la previsión y el usuario decidirá
3506  // si aún así continua añadiendo la previsión o no.
3507  //
3508  bool llContinuar = this._oRemesa._RevisarCreditoEntidad(-this._Importe + toPrevisionPago._Importe, true);
3509  if (!llContinuar)
3510  return false;
3511  }
3512 
3513  return true;
3514  }
3515 
3516 
3521  private void rellenarLineaDatosPrevisionPago(PrevisionPago toPrevisionPago)
3522  {
3523  this._Periodo = toPrevisionPago._Ejercicio;
3524  this._Emision = toPrevisionPago._Fecha_Emision;
3525 
3526  this._Pendiente = toPrevisionPago._Pendiente;
3527 
3528  this._Vencim = toPrevisionPago._Fecha_Vencim;
3529  this._Concepto = toPrevisionPago._Concepto;
3530  this._Importe = toPrevisionPago._Importe;
3531  this._ImporteDiv = toPrevisionPago._ImporteDiv;
3532  this._Divisa = toPrevisionPago._Divisa;
3533  this._Cambio = toPrevisionPago._Cambio;
3534  this._FecReme = toPrevisionPago._Fecha_Remesa;
3535  this._NumBanco = toPrevisionPago._Num_Banco;
3536 
3537  this._oRemesa._Totalizar();
3538 
3539  // Guardo inmediatamente el registro en la base de datos para que actualice el nº de remesa en la previsión.
3540  //
3541  this._oParent._SaveItem(this);
3542 
3543  return;
3544  }
3545  }
3546  }
3547  }
3548 
3549 
3554  {
3555  #region CONSTRUCTORES
3556 
3557 
3561  public DocPrintRemesaBancariaPago(IDocumentoImprimible loDocumentoImprimible)
3562  : base(loDocumentoImprimible)
3563  {
3564  // Rellenar los parámetros de configuración que son específicos sólamente de impresión de remesa bancaria de pago con su valor por defecto.
3565  //
3566  this.configuracionInicialImpRemPago();
3567  }
3568 
3569 
3570  #endregion CONSTRUCTORES
3571 
3572 
3573  #region MÉTODOS PRIVADOS
3574 
3578  public override UserControl _UserControlAdicional
3579  {
3580  get
3581  {
3582  UserControls.OpcionesImpresionRemesa loUserControl = (UserControls.OpcionesImpresionRemesa)base._UserControlAdicional;
3583  loUserControl._TipoPagoCobro = UserControls.OpcionesImpresionRemesa.TipoPagoCobro.Pago;
3584 
3585  return loUserControl;
3586  }
3587  set
3588  {
3589  base._UserControlAdicional = value;
3590  }
3591  }
3592 
3596  private void configuracionInicialImpRemPago()
3597  {
3598  return;
3599  }
3600 
3601 
3602  #endregion MÉTODOS PRIVADOS
3603  }
3604 }
Definición de atributos para el report
ewMascara _Mascara
Máscara para columnas numéricas
sage.ew.botones.btMante _Mante
Mantenimiento para la columna del grid o campo enlazado
Campos clave para registros únicos y carga de registros
bool _PermiteDuplicados
Indica si se permiten valores duplicados comparando el campo con todos los registros cargados ...
string _Validar_Dato_Clave
Clave por la cual se buscará el valor a la tabla de validación
FormaContabilRemesaPago
Enumeración para los diferentes criterios de contabilización de una remesa bancaria de pago...
RemesaBancariaDetallePrevis _oParent
Objeto padre a la instancia.
RemesaBancariaDetallePrevis()
Inicializa una nueva intancia de la clase.
Object _Grid
ewgrid o Mantegrid enlazado a Items
bool _ExpandirPunto
Introduce 0 en la posición del . hasta la longitud del campo
RemesaBancariaPago()
Inicializa una nueva instancia de la clase
Clase de negocio base para remesa bancaria.
bool _AddPrevisiones(DataRow[] taDataRowsPrevis, out DataRow[] toDataRowsPrevisNoAnadidas, bool tlSave=false)
Añade a una remesa de pago una lista de previsiones de pago recibida en forma de array de DataRows...
Definición de los objetos campo para las tablas relacionadas
string _Empresa
Código de empresa.
string _Validar_Dato_BaseDatos
Base de datos donde se validará si el dato existe
string _Proveedor
Código de proveedor Contable
Objeto DocPrint específico para remesa bancaria de pago.
Browser, basat en sage.ew.objetos.ewbutton
override void _Show()
Mostrar el formulario de remesa bancaria de pago con los datos del objeto de negocio RemesaBancariaPa...
int _Numero
Número de asiento.
Definition: Asientos.cs:650
bool _isLoading
Flag que utilizaremos si estamos dentro de una operación _Load() del ManteTRel o dentro de una operac...
BindingList< _LinTRel > _Items
Lista bindable de todos los items de la tabla relacionada
_LinTRel _NewItem(int tnInsertLinea=-1)
Añade un nuevo item a la colección Items y rellena los valores de la claves
Clase utilizada para realizar asientos contables.
Definition: Asientos.cs:36
Clase de negocio Proveedor
Definition: Proveedor.cs:33
bool Fila_Plena()
Devuelve true si la línea está completa, false si falta declarar algún campo.
decimal _AnchoColumna
Permite indicar el ancho en carácteres estándar &#39;A&#39; que va a tener al columna en el grid...
new void _ShowDialog()
Método que se dispara cuando hay que mostrar el formulario asociado
KeyDiccionarioLenCampos
Clave del diccionario LenCampos
Definition: Diccionarios.cs:11
override void apuntarARemesaTipoDocumento(TipoDocumentoRemesa teTipoDocumentoRemesa)
Acciones a realizar al cargar una remesa de pago de un determinado tipo de documento. Actualmente solo se pueden hacer remesas de pago de previsiones, pero en previsión de que algún día puedan solicitar poder hacer remesas de pagarés de pago, lo dejamos preparado.
bool _AddPrevisiones(List< PrevisionPago > toLstPrevis, out List< PrevisionPago > tolstPrevisNoAnadidas, bool tlSave=false)
Añade a una remesa de pago existente una lista de previsiones de pago recibida en formato de lista de...
string _Validar_Dato_Tabla
Tabla donde se validará si el dato existe
_EstadosMantenimiento _Estado
Estado en que se encuentra el registro
Definition: clsEwBase.cs:2968
AsiRemAgruparPor
Diferentes opciones contabilizar una remesa de cobro o pago haciendo asiento por diferentes conceptos...
override bool _Comprobaciones_GenerarSepa()
Comprobaciones a realizar antes de generar fichero SEPA de una remesa de pago.
new string _Empresa
Empresa a la que pertenece la remesa.
Clase del objeto grid para Sage50
Definition: grid.cs:31
TipoDocumentoRemesa
Tipo de documento para remesas de cobro/pago: de previsiones o de pagarés.
Definition: contabilidad.cs:75
override List< string > obtenerListaAsis()
Obtener lista de ASIS detectados en las previsiones de pago de la remesa. Caso de tener activado el o...
DateTime _Fecha_Remesa
Fecha de remesa
override void Inicializar()
Métodoo para incializar el documento
sage.ew.botones.btBrowser _Browser
Browser para la columna del grid o campo enlazado
override bool _Save()
Método publico para guardar los datos de la previsión.
override bool _Contabilizar(Dictionary< string, object > toDicParametros)
Contabilizar remesa de pago.
bool _Editable
Indica si el campo será editable
DocPrintRemesaBancariaPago(IDocumentoImprimible loDocumentoImprimible)
Constructor
Definición de los objetos campo para las tablas relacionadas
void _Set_GridDetalleRemesaPrevisiones(objetos.UserControls.Mantegrid mantegrid)
Asignar el grid al mantetrel de detalle de remesa bancaria de previsiones.
DateTime _Fecha_Vencim
Fecha vencimiento de previsión
Clase para las previsiones de pago de proveedores
override bool _BorrarTodosRegistros()
Método llamado desde el borrado de remesa de pago. Elimina el campo REMESA de los registros de previs...
static bool _EsAnticipoTrabajador(string tcCodigo)
Comprueba si es una cuenta de anticipo de remuneración (trabajador)
bool _Save()
Método publico para guardar asientos.
Definition: Asientos.cs:1791
ewMascara _MascaraImporte
Máscara de importe
Definition: Divisa.cs:177
TipoRemesaBancaria
Tipos generales de remesa bancaria (remesa de cobro, remesa de pago).
Definition: contabilidad.cs:47
Objeto genérico DocPrint para remesa bancaria.
AsiRemCtaEfecDesc
Diferentes opciones contabilizar una remesa de cobro o pago por vencimientos en cuanta a utilizar o n...
virtual string _Nombre
Campo nombre del mantenimiento. En este hay que basar los demás campos en las clases heredadas ...
Definition: clsEwBase.cs:2655
bool _Visible
Indica si el campo serà visible cuando se enlaza a un grid
bool _Updatable
Indica si el campo se recupera y guarda en la tabla
gridColumnsTypes _TipoColumna
Tipo de columna para grid o tipo de control enlazado
Muestra el mantenimiento correspondiente a _Form con el registro correspondiente al _Codigo ...
override bool _BorrarRegistro(DataRow dataroweliminar)
Sobreescritura del método _BorrarRegistro de la clase base ewManteTRel el cual borra el registro reci...
Proporciona características adicionales de las máscaras de Eurowin
Definition: clsEwBase.cs:6212
override bool _BorrarRegistro(RemesaBancariaDetallePrevis.Linea loItem)
Sobreescritura del método _BorrarRegistro de la clase base ewManteTRel el cual borra el registro reci...
override bool actualizarCamposCobroPagoEnPrevisiones(string tcAsi, DateTime tdFechaAsiento, string tcCuentaContableBanco, DateTime? tdFechaDescuento=null, List< Tuple< int, string, int, int, int, string >> tlstPrevisiones=null)
Método llamado al finalizar la contabilización de una remesa de previsiones de pago en cualquier de s...
Definición de la interfície necesaria para las páginas(tabPage) a utilizar en formularios de tipo For...
Definition: IDocPrint.cs:16
Clase formulario para remesas bancarias de pago.
static string _DigitosNivel3CuentaAnticipoTrabajador()
Devuelve los dígitos de nivel 3 de la cuenta de anticipo de trabajador
string _FormatString
Máscara para columnas de tipo TextoFormateado
string _Validar_Dato_CampoTRel_Asignar
Destino del valor recuperado en la consulta de validación
override bool _DeleteItem(RemesaBancariaDetallePrevis.Linea toItem)
Sobreescritura del método _DeleteItem de la clase base ewManteTRel para que después de eliminar un re...
bool _CrearRemesaPrevisiones(ParamCreacionRemesaPago loParamCreaCnf, List< PrevisionPago > toLstPrevis, out List< PrevisionPago > tolstPrevisNoAnadidas, bool tlSave=true)
Crea una remesa de pago de previsiones a partir de una configuración de parámetros de cabecera de rem...
Interfaz para objetos línea
Definition: ILinTRel.cs:11
Clase de negocio para remesa bancaria de pago.
string _Factura
Número de factura
override bool _DesContabilizar()
Descontabilizar remesa de pago.
DateTime _Fecha_Pago
Fecha de pago
string _Validar_Dato_Campos
Campos que se recuperarán en la consulta de validación
string _Error_Duplicados
Mensaje de error que se mostrará al insertar un valor duplicado
Interfaz para la definición de las claves para tablas relacionadas
Definition: IClaves.cs:11
Clase de negocio para la DIVISA (Moneda)
Definition: Divisa.cs:76
string _NombreMoneda
Nombre de la moneda
Definition: Divisa.cs:538
string _Mensaje_Error
Mensaje de error
Definition: Asientos.cs:881
Clase para el acceso a las tablas relacionadas de los mantenimientos.
Definición de la interficie que deben cumplir los documentos de cualquier tipo para poder interactuar...
Definition: IDocPrint.cs:376
Clase para las lineas de la remesa de pago, serán las previsiones de pago incluidas en la remesa...
Interface para lineas de remesas de previsiones (válida para remesas de cobro y remesas de pago)...
bool _CSB_Sepa
Nos permitirá indicar si este proveedor trabajará con CSB / SEPA
Definition: Proveedor.cs:6624
RemesaBancariaPago _oRemesa
Objeto de negocio RemesaBancariaPago del cual cuelga el mantetrel de previsiones de pago de la remesa...
DateTime _Fecha_Emision
Fecha emisión de previsión
gridColumnsTypes
Definición de los tipos de columnas para los grids o campos enlazados
override bool generarAsientosPorConcepto(AsiRemAgruparPor teAsiRemAgruparPor, AsiRemCtaEfecDesc teAsiRemCtaEfecDesc, string tcCuentaContableBanco, string tcCuentaContablaEfecDescBanco, Dictionary< string, List< string >> toDicAsiEfecRemCta, ref string tcAsiRemesa)
Generar asientos por cada vencimiento o para cada proveedor según se informe por parámetro.
DataGridViewAutoSizeColumnMode _AutoModeSizeColumna
Permite indicar que la columna autoajuste su tamaño
bool _Delete(bool tlActivarValidaciones)
si se pasa un true al borrar realiza todas la validaciones del borrado como si estuvieras al formular...
Definition: Asientos.cs:2438
string _Titulo
Título para mostrar en el label asociado o en el encabezado de columna
TipoEsquemaRemesaSepaPagos
Tipos de esquema remesa SEPA para remesas de pago
override Boolean _SaveItem(RemesaBancariaDetallePrevis.Linea toItem)
Sobreescritura del método _SaveItem de la clase base ewManteTRel el cual inserta el registro recibido...
bool _CrearRemesaPrevisiones(ParamCreacionRemesaPago loParamCreaCnf, DataRow[] taDataRowsPrevis, out DataRow[] toDataRowsPrevisNoAnadidas, bool tlSave=true)
Crea una remesa de pago de previsiones a partir de una configuración de parámetros de cabecera de rem...
_LinTRel _GetItem(string tcCompareProperty, object toValueCompare)
Devuelve el objeto _LinTRel que corresponde con el valor de la propiedad
RemesaBancariaPago(int numero)
Inicializa una nueva instancia de la clase
override void _Load()
Realiza la carga de los datos de la previsión de pago.
Clase base para configuración de parámetros para crear una remesa de pago.
override string _Codigo
override de _Codigo para que en el Set podamos convertir el número que nos llega a código de cliente ...
Definition: Proveedor.cs:5395
bool _Validar_Asignar_Cargando
Indica si se buscará el dato en la tabla correspondiente mientras se ejecuta el _Load() ...
string _Divisa
Moneda de la previsión
Presenta un datagridview con botones añadir y borrar tipo Mantegrid de Eurowin
Definition: Mantegrid.cs:30
string _Error_Validar_Dato
Mensaje de error que se mostrará al insertar un dato no válido
String _Abrev
Abreviación
Definition: Divisa.cs:341
ewMascara mascaraGranTotal
Máscara de importe para columna importe de previsión/pagaré.
static DataTable _PrevisionesPagoFacturaOrden(string tcEmpresa, string tcProveedor, string tcFactura, int tnOrden, bool tlSoloPendientes=true)
Busca todos los registros de prevision de pago que pueda haber en los diferentes ejercicios cuyo prov...
_LinTRel _CurrentItem
Linea actual