frmDocumentosPorProveedor.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Data;
4 using System.Drawing;
5 using System.Linq;
6 using System.Windows.Forms;
7 using System.Globalization;
8 using sage.ew.formul.Forms;
9 using sage.ew.listados.Clases;
10 using sage.ew.global;
11 using sage.ew.ewbase;
12 using sage.ew.empresa;
13 using sage.ew.objetos;
14 using sage.ew.db;
15 using sage.ew.docsven;
16 using sage.ew.interficies;
17 using sage.ew.functions;
18 using sage.ew.ewbase.Clases;
20 
21 namespace sage.ew.docscompra.Forms
22 {
27  {
28  #region propiedades
29 
33  public dynamic _DocumentoOrigen = null;
34 
35  private string _UltimoDocumentoSeleccionado = string.Empty;
36 
37  // Obtenemos variables de configuración
38  private bool _lColor = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_color"));
39  private bool _lPeso = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_Peso"));
40  private bool _lCajas = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_Cajas"));
41  private bool _lObra = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_obra"));
42  private bool _lHera = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_hera"));
43 
44  // Máscaras de columnas
45  ewMascara _oMascaraImport = new ewMascara(KeyDiccionarioMascara.wc_total);
46  ewMascara _oMascaraPrecio = new ewMascara(KeyDiccionarioMascara.wc_precioven);
47  ewMascara _oMascaraPorcent = new ewMascara(KeyDiccionarioMascara.wc_tpc);
48  ewMascara _oMascaraUnidades = new ewMascara(KeyDiccionarioMascara.wc_unidades);
49  ewMascara _oMascaraPeso = new ewMascara(KeyDiccionarioMascara.wc_mascarapeso);
50  ewMascara _oMascaraCajas = new ewMascara("999,999");
51 
52  //PE-102176 Descripción cajas
53  string _cDesCajas = (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_hera")) && Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_cajas"))) ?
54  "Nº Agrup." : Convert.ToString(EW_GLOBAL._GetVariable("wc_descajas","Cajas")).Trim();
55  //PE-102176 Descripción unidades
56  string _cDesUnidades = Convert.ToString(EW_GLOBAL._GetVariable("wc_desunidades")).Trim();
57 
58 
62  public string _Empresa = string.Empty;
63 
67  public string _Numero = string.Empty;
68 
72  public string _Factura = string.Empty;
73 
74  //Vinculo a la base para que aplique configuración de divisa
78  public Listados _Cabeceras
79  {
80  get { return _Listado; }
81  set { _Listado = value; }
82  }
83 
84  //Vinculo a la base para que aplique configuración de divisa
88  public Listados _Detalles
89  {
90  get { return _ListadoDetalle; }
91  set { _ListadoDetalle = value; }
92  }
93 
97  protected bool _lSeleccion_Multiple = false;
98  private bool _lMarcarDesmarcar = true; //Prefijamos para que marque
99  private string _cNomColSeleccionar = "Sel.";
100 
104  public List<object> _Seleccion_Multiple_Lista
105  {
106  get { return _lis_Seleccion_Multiple_Resultados; }
107  }
108  private List<object> _lis_Seleccion_Multiple_Resultados = new List<object>();
109 
113  public List<string> _Seleccion_Multiple_Campos
114  {
115  set
116  {
117  _lis_Seleccion_Multiple_Campos = value;
118  if (value != null) _Activar_Seleccion_Multiple();
119  }
120  }
124  protected List<string> _lis_Seleccion_Multiple_Campos = new List<string>();
125 
126  //Task 150273
130  public bool ModoCapturaParaTraspaso { get; set; } = false;
131  private bool _lMarcarDesmarcarDetalle = true; //Prefijamos para que marque
135  public eTipoDocumento TipoDeDocumentoCapturable { get; set; } = eTipoDocumento.Indeterminado;
136 
137  private bool ConfigurandoControles
138  {
139  get { return _configurandoControles; }
140  set
141  {
142  _configurandoControles = value;
143  if (!_configurandoControles && _recargaDatosRequerida) //Evaluo si durante las operaciones de configuración se han modificado datos que requieren recargar
144  {
145  _recargaDatosRequerida = false;
146  _Refrescar_Datos();
147  }
148  }
149  }
150  private bool _configurandoControles = false; //No usar la privada
151  private bool _recargaDatosRequerida = false;
152 
153  #endregion propiedades
154 
155  #region constructores
156 
161  {
162  _Init();
163  }
164 
170  {
171  //Los detalles provienen del mismo listado del que se sacan las cabeceras
172  _Init(loList, (Listados)Activator.CreateInstance(loList.GetType()));
173  }
174 
180  public frmDocumentosPorProveedor(Listados loCabeceras, Listados loDetalles)
181  {
182  //Los detalles y la cabecera son dos listados diferentes
183  _Init(loCabeceras, loDetalles);
184  }
185 
191  private void _Init(Listados toCabecera = null, Listados toDetalle = null)
192  {
193  InitializeComponent();
194 
195  if (DesignMode)
196  return;
197 
198  _Empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
199  btImprimir1._Click_Before += new botones.Clases.btImprimir._Click_Before_Handler(BtImprimir1__Click_Before);
200  if(toCabecera != null)
201  _Cabeceras = toCabecera;
202  if(toDetalle != null)
203  _Detalles = toDetalle;
204 
205  _MostrarCrearAccesoDirecto = false;
206  _MostrarAccesoFavoritos = false;
207 
208  ConfigurarControlesHeredados();
209 
210  ewImgInfoLineasSeleccionables.Image = sage.ew.images.Properties.Resources.info_16;
211  }
212 
216  private void ConfigurarControlesHeredados()
217  {
218  //Task 105512 Ajustes de los controles heredados
219  _oTablePpal.Width = _CalcularAnchoControlCabecera();
220 
221  //No filtramos por artículo
222  _FiltrarArticulo = false;
223 
224  //habilito el botón refrescar
225  //btRefrescar.Visible = true;
226 
227  //Filtros verticales
228  _oFiltroVertical.Controls.Add(panelCancel);
229  _oFiltroVertical.Controls.Add(panelFacturados);
230  _oFiltroVertical.Controls.Add(panelTrasp);
231 
232  //Filtro horizontal
233  _oFiltroHorizontal.Controls.Add(panelComentarios);
234 
235  //Determino el tamaño para los datos
236  scDatos.Location = _CalcularLocationDatos();
237  scDatos.Height = _CalcularAlturaDisponible();
238  }
239 
244  protected override Point _CalcularLocationDatos()
245  {
246  return new Point (base._CalcularLocationDatos().X, base._CalcularLocationDatos().Y - 28); //Se produce algú tipo de resize no contemplado
247  }
248 
249  #endregion constructores
250 
251  #region métodos
252 
258  void ChkComentarios_CheckedChanged(object sender, EventArgs e)
259  {
260  if (updatingCheckComentarios == true)
261  return;
262 
263  updatingCheckComentarios = true;
264 
265  if (ModoCapturaParaTraspaso && !chkComentarios.Checked)
266  {
267  chkComentarios.Checked = true;
268  string mensaje = "Para operaciones de traspaso es necesario tener visibles los comentarios.";
269  _MessageBox(mensaje, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.None);
270  }
271 
272  _lLastSelectedIndex = 0;
273  if (ewgridDatos.SelectedRows.Count > 0)
274  _lLastSelectedIndex = ewgridDatos.SelectedRows[0].Index;
275 
276  _Refrescar_Detalle();
277 
278  updatingCheckComentarios = false;
279  }
280 
281  private bool updatingCheckComentarios = false;
282 
286  private void _Activar_Seleccion_Multiple()
287  {
288  //Activo variable de control
289  _lSeleccion_Multiple = true;
290 
291  //Ajusto el botón
292  btNavegar.Text = "Capturar documentos";
293  btNavegar.TextImageRelation = TextImageRelation.ImageBeforeText;
294  btNavegar.TextAlign = ContentAlignment.MiddleCenter;
295  }
296 
300  protected override void _Cargar_Datos()
301  {
302  base._Cargar_Datos();
303 
304  if (!DesignMode)
305  _Refrescar_Datos();
306  }
307 
312  private Listados GetListadosInstance(bool tlCabeceras = true)
313  {
314  Type loType = null;
315  if(tlCabeceras)
316  loType = _Cabeceras.GetType();
317  else
318  loType = _Detalles.GetType();
319  Listados loLis = (Listados)Activator.CreateInstance(loType);
320  return loLis;
321  }
322 
328  private void FrmDocumentosPorProveedor_Shown(object sender, EventArgs e)
329  {
330  ConfigurandoControles = true;
331 
332  // Inicializar grid principal
333  ewgridDatos.Parent = scDatos.Panel1;
334  ewgridDatos.Top = lbDocumentos.Top + 20;
335  ewgridDatos.Left = ewgridDetalle.Left;
336  ewgridDatos.Size = ewgridDetalle.Size;
337  ewgridDatos.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
338  ewgridDatos.ReadOnly = true;
339  ewgridDatos.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
340  ewgridDatos.RowHeadersWidth = 24;
341  ewgridDatos.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
342  ewgridDatos.SelectionChanged += new EventHandler(EwgridDatos_SelectionChanged);
343  ewgridDatos.CellMouseDoubleClick += new DataGridViewCellMouseEventHandler(EwgridDatos_CellMouseDoubleClick);
344  ewgridDatos.AllowUserToAddRows = false;
345  ewgridDatos.AllowUserToDeleteRows = false;
346 
347  // Inicializar grid detalle
348  ewgridDetalle.Parent = scDatos.Panel2;
349  ewgridDetalle.Top = lbDetalle.Top + 20;
350  ewgridDetalle.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
351  ewgridDetalle.ReadOnly = true;
352  ewgridDetalle.RowHeadersWidth = 24;
353  ewgridDetalle.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
354  ewgridDetalle.AllowUserToAddRows = false;
355  ewgridDetalle.AllowUserToDeleteRows = false;
356 
357  // Otras
358  txtImporte.ReadOnly = true;
359  btNavegar.Image = images.Properties.Resources.doc_navigate;
360  btNavegar.ImageAlign = ContentAlignment.MiddleLeft;
361  btListar.Image = images.Properties.Resources.reports;
362  btListar.ImageAlign = ContentAlignment.MiddleLeft;
363 
364  //Defino la columna de selección
365  if (_lSeleccion_Multiple || ModoCapturaParaTraspaso)
366  {
367  ewgridDatos.Columns[_cNomColSeleccionar].ReadOnly = false;
368  ewgridDatos.MultiSelect = true;
369  ewgridDatos.CellClick += new DataGridViewCellEventHandler(Evento_ewgridDatos_CellClick);
370  ewgridDatos.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(Evento_ewgridDatos_ColumnHeaderMouseClick);
371 
372  if(ModoCapturaParaTraspaso) //También hay seleccioón lineas
373  {
374  if (!chkComentarios.Checked) { chkComentarios.Checked = true; } //Bug 153804 => Asignación sin cambio de valor hacia saltar un refresco de datos
375  ewgridDatos.CellValueChanged += EwgridDatos_CellValueChanged;
376  ewgridDetalle.Columns[_cNomColSeleccionar].ReadOnly = false;
377  ewgridDetalle.MultiSelect = true;
378  ewgridDetalle.CellClick += new DataGridViewCellEventHandler(Evento_ewgridDetalle_CellClick);
379  ewgridDetalle.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(Evento_ewgridDetalle_ColumnHeaderMouseClick);
380  }
381  }
382 
383  // Inicializar proveedor
384  if (!string.IsNullOrWhiteSpace(_Proveedor))
385  {
386  _Refrescar_Datos();
387  }
388  else
389  _Configurar_Grid(); //Bug
390 
391  txtProveedor._setTxtBoxFocus(); //Bug 112527
392 
393  //Fuerzo que me indique el símbolo actual (el cambio por evento no se dispara antes de que el formulario sea visible)
394  ActualizarEtiquetaSimboloDivisa();
395 
396  //Task 150273 => Cambios para el modo de captura de datos
397  InicializarModoCapturaParaTraspaso();
398 
399  ConfigurandoControles = false;
400  }
401 
405  protected virtual void _Refrescar_Datos()
406  {
407  if (_Cabeceras == null)
408  return;
409 
410  if (ConfigurandoControles)
411  {
412  _recargaDatosRequerida = true;
413  return;
414  }
415 
416  _cargandoCabeceras = true;
417 
418  DataTable ldtDatos = new DataTable();
419 
421 
422  // Cargamos las opciones especificas del formulario
423  _Listado = _Refrescar_Datos_Cargar_Opciones_Listado();
424 
425  // Preparar filtros principales
426  if (!String.IsNullOrEmpty(_Proveedor)) //Bug 152566 => Ha de tener valor o se forzaba un filtrado con código de proveedor en blanco => nadie cumplia el filtro
427  {
428  _Listado._Filtros.Add("ProveedorUnico", _Proveedor);
429  }
430 
431  // Obtener información principal
432  ldtDatos = _Listado._DataTable();
433 
434  if (ldtDatos == null)
435  return;
436 
437  //Elimino las filas de acumulado
438  _SuprimirDatos(ref ldtDatos);
439  SuprimirLineasBold(ldtDatos);
440  SuprimirCampos(ldtDatos);
441 
442  //Inserto columna de selección
443  if (_lSeleccion_Multiple || ModoCapturaParaTraspaso)
444  {
445  CrearColumnaDeSeleccion(ldtDatos);
446  }
447 
448  // Ordenar información
449  ldtDatos.DefaultView.Sort = "fecha DESC, documento DESC";
450 
451  //Filtrar resultados Bug 109818 - s'ha mogut de lloc ja que calculava l'import dels documents abans de filtrar-los
452  ldtDatos = _FiltrarDataTableCabeceras(ldtDatos);
453 
454  // Asignar datos obtenidos al grid
455  ewgridDatos.DataSource = ldtDatos;
456 
457  //Bug 152259 => Refactorizo
458  CalcularCasillaImporte(ldtDatos);
459 
460  // Configuración del grid
461  _Configurar_Grid();
462 
463  GestionarRecuperacionDeCabecerasSeleccionadas();
464 
465  _Refrescar_Detalle();
466 
467  _cargandoCabeceras = false;
468  }
469 
474  protected virtual void _SuprimirDatos(ref DataTable tdtDatos)
475  {
476  }
477 
478  private void CalcularCasillaImporte(DataTable ldtDatos)
479  {
480  // Calcular total importe
481  decimal lnImporteTotal = decimal.Zero;
482  if (!ModoCapturaParaTraspaso) //Para operativa corriente calculo
483  {
484  //Bug 109093 Selección de columna para el acumulado
485  string nombreCamporImporte = DeterminarNombreDelCampoImporteCabeceras(ldtDatos);
486  lnImporteTotal = ldtDatos.AsEnumerable().Select(r => Convert.ToDecimal(!r.IsNull(nombreCamporImporte) ? r.Field<decimal>(nombreCamporImporte) : 0)).Sum();
487  }
488  EstablecerValorCasillaImporte(lnImporteTotal);
489  }
490 
491  private void EstablecerValorCasillaImporte(decimal valor)
492  {
493  // Calcular total importe
494  if (_FiltrarDivisa && _Listado._DivisaConfig._DivisaTodas)
495  txtImporte.Text = "";
496  else
497  {
498  txtImporte.Text = valor.ToString(_Listado._DivisaConfig._DivisaMascaraImporte); //Task 105512 que adapte la máscara.
499  }
500  }
501 
502  private string DeterminarNombreDelCampoImporteCabeceras(DataTable datos)
503  {
504  //Paso el listado de cabeceras y los datos recibidos
505  return DeterminarNombreDelCampoImporte_Impl(_Listado, datos);
506  }
507 
508  private string DeterminarNombreDelCampoImporteDetalle()
509  {
510  //Paso el listado del detalle y los datos asociados al grid
511  DataTable datos = (DataTable)ewgridDetalle.DataSource;
512  return DeterminarNombreDelCampoImporte_Impl(_Detalles, datos);
513  }
514 
515  private string DeterminarNombreDelCampoImporte_Impl(Listados listado, DataTable datos)
516  {
517  string nombreCamporImporte = listado._DivisaConfig._DivisaEspecifica == true ? "divisa_importe" : "importe";
518  if (!datos.Columns.Contains(nombreCamporImporte)) //Especifica de empresa, no trae columnas de divisa
519  nombreCamporImporte = "importe";
520  return nombreCamporImporte;
521  }
522 
523  private void ActualizarImporteSeleccionado()
524  {
525  decimal acumulado = decimal.Zero;
526  foreach (var item in dicDetallesSeleccionados)
527  {
528  acumulado += item.Value.Importe;
529  }
530  EstablecerValorCasillaImporte(acumulado);
531  }
532 
533  private bool _cargandoCabeceras = false;
534 
535  private void CrearColumnaDeSeleccion(DataTable ldtDatos)
536  {
537  using (DataColumn ldtColumnaSel = new DataColumn())
538  {
539  //datagridviewc
540 
541  ldtColumnaSel.DataType = Type.GetType("System.Boolean");
542  ldtColumnaSel.AllowDBNull = false;
543  ldtColumnaSel.Caption = _cNomColSeleccionar;
544  ldtColumnaSel.ColumnName = _cNomColSeleccionar;
545  ldtColumnaSel.DefaultValue = false;
546  ldtDatos.Columns.Add(ldtColumnaSel);
547  ldtDatos.Columns[ldtDatos.Columns.Count - 1].SetOrdinal(0);
548  }
549  }
550 
551  private void SuprimirCampos(DataTable ldtDatos)
552  {
553  List<string> llisExcluidas = new List<string>() { "EJERCICIO", "multiejercicio", "empresa" };
554  foreach (string lcNomCol in llisExcluidas)
555  {
556  if (ldtDatos.Columns.Contains(lcNomCol)) ldtDatos.Columns.Remove(lcNomCol);
557  }
558  }
559 
564  private void SuprimirLineasBold(DataTable tdtDatos)
565  {
566  //Limpio los resultados => Elimino filas de totales y columna bold
567  if (tdtDatos.Columns.Contains("bold")) //Si tengo columna bold, elimino sus filas
568  {
569  for (int lnIndex = tdtDatos.Rows.Count - 1; lnIndex >= 0; lnIndex--)
570  {
571  if (tdtDatos.Columns.Contains("bold") && tdtDatos.Rows[lnIndex]["bold"] != DBNull.Value && Convert.ToBoolean(tdtDatos.Rows[lnIndex]["bold"])) //Si esta marcada como bold
572  {
573  tdtDatos.Rows[lnIndex].Delete();
574  }
575  }
576  }
577 
578  if (tdtDatos.Columns.Contains("bold")) tdtDatos.Columns.Remove("bold");
579  }
580 
587  protected virtual DataTable _FiltrarDataTableCabeceras(DataTable toDatos)
588  {
589  return toDatos;
590  }
591 
597  void BtImprimir1__Click_Before(ref bool tlOk)
598  {
599  Listados loLis = this._Refrescar_Datos_Cargar_Opciones_Listado();
600 
601  _AplicarConfiguracionDivisa(loLis); //Task 107788
602 
603  loLis._Filtros.Add("ProveedorUnico", _Proveedor);
604  if (!loLis._Opciones.ContainsKey("lMostrarlineas"))
605  loLis._Opciones.Add("lMostrarlineas", true);
606  else
607  loLis._Opciones["lMostrarlineas"] = true;
608  loLis._Opciones.Add("lImpresion", true);
609  if (!loLis._Filtros.ContainsKey("ComentariosUnico"))
610  loLis._Filtros.Add("ComentariosUnico", chkComentarios.Checked);
611  else
612  loLis._Filtros["ComentariosUnico"] = chkComentarios.Checked;
613 
614  Proveedor loProveedor = new Proveedor(_Proveedor);
615  loProveedor._Load();
616 
617  btImprimir1._Filtros.Clear();
618  btImprimir1._Filtros.Add("TituloDocumentoCompra", Text.ToUpper());
619  btImprimir1._Filtros.Add("Ejercicio", DB.Ejercicio_EW);
620  btImprimir1._Filtros.Add("Proveedor", String.Format("{0} - {1}", _Proveedor, loProveedor._Nombre));
621  btImprimir1._Filtros.Add("Empresa", String.Format("{0} - {1}", _Empresa, Empresa._GetNombreEmpresa(_Empresa)));
622 
623  _SetFiltrosReportDivisa();
624 
625  //Comprobar tambien la variable cajas para mostrar o no las columnas agrupaciones
626  btImprimir1._Filtros.Add("TituloCajas", Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_hera")) && Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_cajas")) ? "Nº agrup." : "Cajas");
627 
628  //Total documento
629  btImprimir1._Filtros.Add("wc_TotalDocumento", txtImporte.Text);
630 
631  //Execució per defecte : Recuperamos los datos
632  //btImprimir1._DataTable = loLis._DataTable();
633  btImprimir1._DataTable = _Refrescar_Datos_ExecuteListado(loLis);
634 
635  //Report generic : Cambiem el nom de l'origen de dades pel report i recuperem el Datatable generic
636  listados.Listados.DocumentosProveedor loTmp = new listados.Listados.DocumentosProveedor();
637  if (loTmp._ReportFile == loLis._ReportFile)
638  {
639  btImprimir1._DataTable.TableName = btImprimir1._Title = "Documentos por proveedor";
640  }
641 
642  DataTable ldtDatos;
643  if (loLis is listados.Listados.DocumentosProveedor) //Facturas cumple por herencia y tambien hay que ejecutar
644  ldtDatos = ((listados.Listados.DocumentosProveedor)loLis)._ExecuteReport();
645  else
646  ldtDatos = _Listado._Execute(loLis._Filtros);
647 
648 
649  //Asignem el nom del report
650  if(!string.IsNullOrWhiteSpace(loLis._ReportFile))
651  btImprimir1._Report = loLis._ReportFile;
652 
653  btImprimir1._DataTable = _SuprimirColumnas(ldtDatos.DefaultView.ToTable(), _Listado);
654  }
655 
662  protected virtual DataTable _Refrescar_Datos_ExecuteListado(Listados toLis)
663  {
664  return toLis._Execute();
665  }
666 
672  {
673  if (toList == null)
674  toList = this.GetListadosInstance(tlCabeceras: true);
675  return toList;
676  }
677 
681  protected internal void _Refrescar_Detalle()
682  {
683  DataTable ldtDatos = (DataTable)ewgridDatos.DataSource;
684  int lnRowAct;
685  string lcNumero = "";
687  if (ldtDatos.Rows.Count > 0)
688  {
689  lnRowAct = ewgridDatos.CurrentCell.RowIndex;
690  lcNumero = ewgridDatos["Documento", lnRowAct].Value.ToString();
691  }
692 
693  _Refrescar_Detalle(lcNumero);
694 
695  //Seleccionem el registre que correspongui
696  if (ewgridDatos.Rows.Count > 0)
697  {
698  ewgridDatos.ClearSelection();
699  if (_lLastSelectedIndex >= 0 && ldtDatos.Rows.Count > _lLastSelectedIndex)
700  ewgridDatos.Rows[_lLastSelectedIndex].Selected = true;
701  else
702  ewgridDatos.Rows[0].Selected = true;
703  }
704  }
705 
709  private void _Refrescar_Detalle(string tcNumero)
710  {
711  DataTable ldtDatosDet = new DataTable();
712 
713  //Cargamos las opciones especificas del listado de detalles
714  _ListadoDetalle = _Refrescar_Detalle_Cargar_Opciones_Listado();
715 
716  // Preparar filtros genéricos detalle
717  _ListadoDetalle._Filtros.Add("NumeroUnico", tcNumero);
718  _ListadoDetalle._Filtros.Add("ComentariosUnico", chkComentarios.Checked);
719  if (!string.IsNullOrWhiteSpace(_Proveedor)) //Bug 152566 => Ha de tener valor o se forzaba un filtrado con código de proveedor en blanco => nadie cumplia el filtro
720  {
721  _ListadoDetalle._Filtros.Add("ProveedorUnico", _Proveedor);
722  }
723 
724  // Obtener información detalle
725  ldtDatosDet = _ListadoDetalle._DataTable();
726 
727  //Inserto columna de selección
728  if (ModoCapturaParaTraspaso)
729  {
730  CrearColumnaDeSeleccion(ldtDatosDet); //Añado columna de selección al grid de detalle
731  }
732 
733  //Limpio los resultados => Elimino filas de totales y columna bold
734  if (ldtDatosDet.Columns.Contains("bold")) //Si tengo columna bold, elimino sus filas
735  {
736  for (int lnIndex = ldtDatosDet.Rows.Count -1; lnIndex >= 0; lnIndex--)
737  {
738  if (ldtDatosDet.Rows[lnIndex]["bold"] != DBNull.Value && //La columna no es null
739  Convert.ToBoolean(ldtDatosDet.Rows[lnIndex]["bold"])) //Si esta marcada como bold
740  {
741  ldtDatosDet.Rows[lnIndex].Delete();
742  }
743  }
744  }
745 
746  List<string> llisExcluidas = new List<string>() { "bold", "titulo", "titulo1", "titulo2", "titulo3", "titulo4", "codtitulo", "codtitulo1", "codtitulo2", "codtitulo3", "codtitulo4", "codtitulo5", "divisa", "empresa", "EJERCICIO", "multiejercicio" }; //Task 107788 Los listados con detalle no deben tener columna divisa
747  foreach (string lcNomCol in llisExcluidas)
748  {
749  if (ldtDatosDet.Columns.Contains(lcNomCol)) ldtDatosDet.Columns.Remove(lcNomCol);
750  }
751 
752  if (ldtDatosDet == null)
753  return;
754 
755  // Asignar datos obtenidos al grid
756  ewgridDetalle.DataSource = ldtDatosDet;
757 
758  // Configuración del grid
759  _Configurar_Grid_Detalle();
760 
761  //Refrescar valor del campo traspasado
762  if (ewgridDetalle.Columns.Contains("servidas") && ewgridDetalle.Columns.Contains("traspasado"))
763  {
764  foreach (DataGridViewRow row in ewgridDetalle.Rows)
765  {
766  if (!string.IsNullOrWhiteSpace(Convert.ToString(row.Cells["tipo_iva"].Value)) && (Convert.ToDecimal(row.Cells["unidades"].Value) - Convert.ToDecimal(row.Cells["servidas"].Value) == 0))
767  row.Cells["traspasado"].Value = true;
768  }
769  }
770 
771  GestionarRecuperacionDeDetallesSeleccionados();
772  }
773 
781  {
782  if (toList == null)
783  toList = GetListadosInstance(tlCabeceras: false);
784  return toList;
785  }
786 
790  private void _Configurar_Grid()
791  {
792  // Columnas configurables
793  if (ewgridDatos.Columns.Contains("obra"))
794  ewgridDatos.Columns["obra"].Visible = _lObra;
795 
796  if (ModoCapturaParaTraspaso)
797  ewgridDatos.Columns[_cNomColSeleccionar].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
798 
799  _ConfigurarGridDivisa(_Listado, ref ewgridDatos);
800 
801  // Máscaras de columnas
802  _ConfigurarColumnaNumerica("importe", _oMascaraImport._Mascara_Net, ref ewgridDatos);
803 
804  _Nombre_Columnas(ref ewgridDatos);
805 
806  ewgridDatos.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
807 
808  }
809 
814  protected virtual void _Nombre_Columnas(ref ewgrid toGrid)
815  {
816  //Traduccions genérica
817  foreach (DataGridViewColumn ldc in toGrid.Columns)
818  {
819  toGrid.Columns[ldc.Name].HeaderText = sage.ew.functions.Translate._This._Get(ldc.Name);
820  }
821 
822  if (toGrid.Columns.Contains("nombre_proveedor"))
823  {
824  toGrid.Columns["nombre_proveedor"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
825  toGrid.Columns["nombre_proveedor"].MinimumWidth = 100;
826  toGrid.Columns["nombre_proveedor"].HeaderText = "Nombre proveedor";
827  }
828  if (toGrid.Columns.Contains("f_entreg"))
829  {
830  toGrid.Columns["f_entreg"].HeaderText = "Entrega";
831  }
832 
833  //Task 107788 Tratamiento captions divisa (pq utiliza el grid y no el gridviewlist)
834  if (toGrid.Columns.Contains("divisa_precio") && _Listado != null)
835  {
836  toGrid.Columns["divisa_precio"].HeaderText = "Precio (" + _Listado._DivisaConfig.ObtenerSimboloDivisa()+")";
837  toGrid.Columns["divisa_precio"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
838  }
839 
840  if (toGrid.Columns.Contains("divisa_importe") && _Listado != null)
841  {
842  toGrid.Columns["divisa_importe"].HeaderText = "Importe (" + _Listado._DivisaConfig.ObtenerSimboloDivisa()+")";
843  toGrid.Columns["divisa_importe"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
844  }
845 
846  if (toGrid.Columns.Contains("divisa_total") && _Listado != null)
847  {
848  toGrid.Columns["divisa_total"].HeaderText = "Total (" + _Listado._DivisaConfig.ObtenerSimboloDivisa()+")";
849  toGrid.Columns["divisa_total"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
850  }
851 
852  // Primera letra en mayúscula en la cabecera de las columnas
853  foreach (DataGridViewColumn ldcCololumna in toGrid.Columns)
854  {
855  ldcCololumna.HeaderText = ldcCololumna.HeaderText.Replace('_', ' '); //Cambio _ por espacios
856  ldcCololumna.HeaderText = ldcCololumna.HeaderText.Replace("albaran","albarán"); //Acentuo albarán
857  ldcCololumna.HeaderText = ldcCololumna.HeaderText.Replace("definicion", "definición"); //Acentuo definición
858  ldcCololumna.HeaderText = ldcCololumna.HeaderText.Replace("articulo", "artículo"); //Acentuo artículo
859  ldcCololumna.HeaderText = ldcCololumna.HeaderText.Replace("linia", "línea"); //Cambio y acentuo línea
860  ldcCololumna.HeaderText = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(ldcCololumna.HeaderText).Trim();
861  }
862  }
863 
869  void Evento_ewgridDatos_CellClick(object sender, DataGridViewCellEventArgs e)
870  {
871  if (e.RowIndex >= 0)
872  {
873  if (e.ColumnIndex == ewgridDatos.Columns[_cNomColSeleccionar].Index)
874  {
875  if (IsValidCabecera(e.RowIndex))
876  {
877  bool llNouEstat = !(bool)ewgridDatos[e.ColumnIndex, e.RowIndex].Value;
878  ewgridDatos[e.ColumnIndex, e.RowIndex].Value = llNouEstat;
879  GestionarCabecerasSeleccionadas(((DataRowView)ewgridDatos.Rows[e.RowIndex].DataBoundItem).Row, llNouEstat);
880  }
881  else
882  {
883  //Notificar motivo de la invalidez del registro
884  _MessageBox(MotivoCabeceraInvalida, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.None);
885  }
886  }
887  }
888  }
889 
890  void Evento_ewgridDatos_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
891  {
892  if (ModoCapturaParaTraspaso)
893  return; //No soportamos esta operativa => falla el marcado de detalles no cargados
894 
895  if (e.ColumnIndex == ewgridDatos.Columns[_cNomColSeleccionar].Index)
896  {
897  ewgridDatos.SelectionChanged -= new EventHandler(EwgridDatos_SelectionChanged);
898 
899  MarcarDesmarcarTodoElGridDeDatos(_lMarcarDesmarcar);
900 
901  //Cambio el valor de _lMarcarDesmarcar
902  _lMarcarDesmarcar = !_lMarcarDesmarcar;
903  }
904  }
905 
906  private void EwgridDatos_CellValueChanged(object sender, DataGridViewCellEventArgs e)
907  {
908  if (sender == null || !ewgridDatos.Columns.Contains(_cNomColSeleccionar) || e.ColumnIndex < 0 || e.RowIndex < 0 || _cargandoCabeceras)
909  return;
910 
911  if (e.ColumnIndex == ewgridDatos.Columns[_cNomColSeleccionar].Index) //Si es la columna de selección
912  {
913  bool valor = Convert.ToBoolean(ewgridDatos[e.ColumnIndex, e.RowIndex].Value);
914  if (!_marcandoDesdeDetalle) //Sino estoy marcando desde el propio detalle
915  {
916  MarcarDesmarcarTodoElGridDeDetalle(valor); //Marco su detalle
917  }
918  }
919  }
920 
926  void Evento_ewgridDetalle_CellClick(object sender, DataGridViewCellEventArgs e)
927  {
928  if (e.RowIndex >= 0)
929  {
930  if (e.ColumnIndex == ewgridDetalle.Columns[_cNomColSeleccionar].Index)
931  {
932  if (IsValidDetalle(e.RowIndex))
933  {
934  bool llNouEstat = !(bool)ewgridDetalle[e.ColumnIndex, e.RowIndex].Value;
935  MarcarFilaDeDetalle(e.ColumnIndex, e.RowIndex, llNouEstat);
936  }
937  else
938  {
939  //Notificar condiciones de invalidez
940  _MessageBox(MotivoDetalleInvalido, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.None);
941  }
942  }
943  }
944  }
945 
946  void Evento_ewgridDetalle_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
947  {
948  if (e.ColumnIndex == ewgridDetalle.Columns[_cNomColSeleccionar].Index)
949  {
950  MarcarDesmarcarTodoElGridDeDetalle(_lMarcarDesmarcarDetalle);
951 
952  //Cambio el valor de _lMarcarDesmarcarDetalle
953  _lMarcarDesmarcarDetalle = !_lMarcarDesmarcarDetalle;
954  }
955  }
956 
957 
958  private void MarcarDesmarcarTodoElGridDeDatos(bool valor)
959  {
960  if (ewgridDatos != null && ewgridDatos.Rows.Count > 0)
961  {
962  int colSeleccionarIndex = ewgridDatos.Columns[_cNomColSeleccionar].Index;
963  for (int rowIndex = 0; rowIndex < ewgridDatos.Rows.Count; rowIndex++)
964  {
965  if (valor && !IsValidCabecera(rowIndex)) //Si trato de marcar y no es válido me lo salto
966  continue;
967  ewgridDatos[colSeleccionarIndex, rowIndex].Value = valor;
968  }
969  }
970  }
971 
972  private void MarcarDesmarcarTodoElGridDeDetalle(bool valor)
973  {
974  if (ewgridDetalle != null && ewgridDetalle.Rows.Count > 0)
975  {
976  int colSeleccionarIndex = ewgridDetalle.Columns[_cNomColSeleccionar].Index;
977  for (int rowIndex = 0; rowIndex < ewgridDetalle.Rows.Count; rowIndex++)
978  {
979  if (valor && !IsValidDetalle(rowIndex)) //Si trato de marcar y no es válido me lo salto => Sin mensajes para el proceso masivo
980  continue;
981  MarcarFilaDeDetalle(colSeleccionarIndex, rowIndex, valor);
982  }
983  }
984  }
985 
986 
987  private void MarcarFilaDeDetalle(int colIndex, int rowIndex, bool valor)
988  {
989  if (ModoCapturaParaTraspaso && EsUnEscandallo(ewgridDetalle.Rows[rowIndex]))
990  {
991  string escandal = Convert.ToString(ewgridDetalle[ewgridDetalle.Columns["escandal"].Index, rowIndex].Value).TrimEnd();
992  if (!escandal.EndsWith("LIN"))
993  {
994  var escandallos = ((DataTable)ewgridDetalle.DataSource).AsEnumerable().Cast<DataRow>().Where(r => r.Field<string>("escandal").StartsWith(escandal)).ToList();
995  if (escandallos.Any())
996  {
997  foreach (DataGridViewRow rowView in ewgridDetalle.Rows)
998  {
999  foreach (DataRow escandallosRow in escandallos)
1000  {
1001  if (((DataRowView)rowView.DataBoundItem).Row == escandallosRow)
1002  {
1003  rowView.Cells[_cNomColSeleccionar].Value = valor;
1004  GestionarDetallesSeleccionados(escandallosRow, valor);
1005  break; //No sigo buscando
1006  }
1007  }
1008  }
1009  }
1010  }
1011  }
1012  else
1013  {
1014  ewgridDetalle[colIndex, rowIndex].Value = valor;
1015  GestionarDetallesSeleccionados(((DataRowView)ewgridDetalle.Rows[rowIndex].DataBoundItem).Row, valor);
1016  }
1017 
1018  //Bug 152230 => Evaluo la cabecera
1019  EvaluarMarcarFilaCabecera();
1020  //Bug 152259 => Importe incremental
1021  ActualizarImporteSeleccionado();
1022  }
1023 
1024  private void EvaluarMarcarFilaCabecera()
1025  {
1026  _marcandoDesdeDetalle = true; //Marco que el cambio de valor lo provoca el detalle
1027 
1028  //Determino si hay alguna línea de detalle marcada
1029  bool algunoMarcado = false;
1030  foreach (DataGridViewRow rowView in ewgridDetalle.Rows)
1031  {
1032  bool rowSeleccionado = Convert.ToBoolean(rowView.Cells[_cNomColSeleccionar].Value);
1033  if(rowSeleccionado)
1034  {
1035  algunoMarcado = true;
1036  break;
1037  }
1038  }
1039 
1040  //Actualizo el valor de cabecera si es necesario
1041  int colSeleccionarIndex = ewgridDatos.Columns[_cNomColSeleccionar].Index;
1042  bool valorActualCabecera = Convert.ToBoolean(ewgridDatos[colSeleccionarIndex, ewgridDatos.CurrentRow.Index].Value);
1043  if (valorActualCabecera != algunoMarcado)
1044  {
1045  ewgridDatos[colSeleccionarIndex, ewgridDatos.CurrentRow.Index].Value = algunoMarcado;
1046  GestionarCabecerasSeleccionadas(((DataRowView)ewgridDatos.CurrentRow.DataBoundItem).Row, algunoMarcado);
1047  }
1048 
1049  _marcandoDesdeDetalle = false;
1050  }
1051 
1052  private bool _marcandoDesdeDetalle = false;
1053 
1054  void GestionarDetallesSeleccionados(DataRow row, bool seleccionado)
1055  {
1056  if (!ModoCapturaParaTraspaso) return;
1057 
1058  LineaDetalleId detalleId = new LineaDetalleId(row, DeterminarNombreDelCampoImporteDetalle());
1059  string itemKey = detalleId.GetKeyLinea();
1060  if (seleccionado)
1061  {
1062  if (dicDetallesSeleccionados.ContainsKey(itemKey))
1063  dicDetallesSeleccionados[itemKey] = detalleId;
1064  else
1065  dicDetallesSeleccionados.Add(itemKey, detalleId);
1066  }
1067  else
1068  {
1069  if (dicDetallesSeleccionados.ContainsKey(itemKey))
1070  dicDetallesSeleccionados.Remove(itemKey);
1071  }
1072  }
1073 
1074  void GestionarCabecerasSeleccionadas(DataRow row, bool seleccionado)
1075  {
1076  if (!ModoCapturaParaTraspaso) return;
1077 
1078  LineaCabeceraId cabeceraId = new LineaCabeceraId(row);
1079  string itemKey = cabeceraId.GetKeyDocumento();
1080  if (seleccionado)
1081  {
1082  if (dicCabecerasSeleccionadas.ContainsKey(itemKey))
1083  dicCabecerasSeleccionadas[itemKey] = cabeceraId;
1084  else
1085  dicCabecerasSeleccionadas.Add(itemKey, cabeceraId);
1086  }
1087  else
1088  {
1089  if (dicCabecerasSeleccionadas.ContainsKey(itemKey))
1090  dicCabecerasSeleccionadas.Remove(itemKey);
1091  }
1092  }
1093 
1094  void GestionarRecuperacionDeDetallesSeleccionados()
1095  {
1096  if (!ModoCapturaParaTraspaso) return;
1097 
1098  //Debe recuperar los valores del campo 'Sel.' si había alguno
1099  if(dicDetallesSeleccionados.Count > 0 && ewgridDetalle.DataSource != null && ewgridDetalle.Rows.Count > 0)
1100  {
1101  var row = ((DataRowView)ewgridDetalle.Rows[0].DataBoundItem).Row; //Todo el detalle pertenece al mismo documento
1102  LineaDetalleId cabeceraBuscada = new LineaDetalleId(row);
1103  var seleccionadosDelMismoDocumento = dicDetallesSeleccionados.Values.Where(v => v.GetKeyDocumento() == cabeceraBuscada.GetKeyDocumento()).ToList();
1104  if(seleccionadosDelMismoDocumento.Any())
1105  {
1106  foreach (DataGridViewRow rowGridView in ewgridDetalle.Rows)
1107  {
1108  DataRowView rowView = (DataRowView)rowGridView.DataBoundItem;
1109  string key = LineaDetalleId.GetKeyLinea(rowView);
1110  if(seleccionadosDelMismoDocumento.Where(s => s.GetKeyLinea() == key).Any())
1111  {
1112  ewgridDetalle[_cNomColSeleccionar, ewgridDetalle.Rows.IndexOf(rowGridView)].Value = true;
1113  }
1114  }
1115  }
1116  }
1117  }
1118 
1119  void GestionarRecuperacionDeCabecerasSeleccionadas()
1120  {
1121  if (!ModoCapturaParaTraspaso) return;
1122 
1123  //Debe recuperar los valores del campo 'Sel.' si había alguno
1124  if (dicCabecerasSeleccionadas.Count > 0 && ewgridDatos.DataSource != null && ewgridDatos.Rows.Count > 0)
1125  {
1126  foreach (DataGridViewRow rowGridView in ewgridDatos.Rows) //Por cada row de cabeceras
1127  {
1128  DataRowView rowView = (DataRowView)rowGridView.DataBoundItem;
1129  string key = LineaCabeceraId.GetKeyDocumento(rowView);
1130  var seleccionadosDelMismoDocumento = dicCabecerasSeleccionadas.Values.Where(v => v.GetKeyDocumento() == key).ToList();
1131  if (seleccionadosDelMismoDocumento.Any())
1132  {
1133  ewgridDatos[_cNomColSeleccionar, ewgridDatos.Rows.IndexOf(rowGridView)].Value = true;
1134  }
1135  }
1136  }
1137  }
1138 
1139  Dictionary<string, LineaCabeceraId> dicCabecerasSeleccionadas = new Dictionary<string, LineaCabeceraId>();
1140  Dictionary<string, LineaDetalleId> dicDetallesSeleccionados = new Dictionary<string, LineaDetalleId>();
1141 
1142  class LineaCabeceraId : IComparable<LineaCabeceraId> //, IEquatable<LineaDetalleId>
1143  {
1144  readonly string _empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
1145  string _documento = string.Empty;
1146  string _proveedor = string.Empty;
1147 
1148  public LineaCabeceraId(DataRow row)
1149  {
1150  _documento = row.Field<string>("documento");
1151  _proveedor = row.Field<string>("proveedor");
1152  }
1153 
1154  public int CompareTo(LineaCabeceraId other)
1155  {
1156  if (other == null)
1157  return 1;
1158 
1159  int comparacionEmpresa = _empresa.CompareTo(other._empresa);
1160  if (comparacionEmpresa == 0)
1161  {
1162  int comparacionProveedor = _proveedor.CompareTo(other._proveedor);
1163  if (comparacionProveedor == 0)
1164  {
1165  return _documento.CompareTo(other._documento);
1166  }
1167  else
1168  return comparacionProveedor;
1169  }
1170  else
1171  return comparacionEmpresa;
1172  }
1173 
1174  public string GetKeyDocumento()
1175  {
1176  return $"--||{_empresa}||{_proveedor}||{_documento}||--";
1177  }
1178 
1179  public static string GetKeyDocumento(DataRowView rowView)
1180  {
1181  string empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
1182  string proveedor = rowView.Row.Field<string>("proveedor");
1183  string documento = rowView.Row.Field<string>("documento");
1184  return $"--||{empresa}||{proveedor}||{documento}||--";
1185  }
1186 
1187  public string GetEmpresa()
1188  {
1189  return _empresa;
1190  }
1191 
1192  public string GetProveedor()
1193  {
1194  return _proveedor;
1195  }
1196 
1197  public string GetDocumento()
1198  {
1199  return _documento;
1200  }
1201  }
1202 
1203  class LineaDetalleId : IComparable<LineaDetalleId> //, IEquatable<LineaDetalleId>
1204  {
1205  readonly string _empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
1206  string _documento = string.Empty;
1207  string _proveedor = string.Empty;
1208  //string _linia = string.Empty;
1209  int _linia = 0;
1210 
1211  //Bug 152259 => Importe incremental
1212  public decimal Importe = decimal.Zero;
1213 
1214  public LineaDetalleId(DataRow row, string campoImporte = "")
1215  {
1216  _documento = row.Field<string>("documento");
1217  _proveedor = row.Field<string>("proveedor");
1218  //_linia = row.Field<string>("linia");
1219  _linia = row.Field<int>("linia");
1220 
1221  if (!string.IsNullOrWhiteSpace(campoImporte))
1222  Importe = row.Field<decimal>(campoImporte);
1223  }
1224 
1225  public int CompareTo(LineaDetalleId other)
1226  {
1227  if (other == null)
1228  return 1;
1229 
1230  int comparacionEmpresa = _empresa.CompareTo(other._empresa);
1231  if (comparacionEmpresa == 0)
1232  {
1233  int comparacionProveedor = _proveedor.CompareTo(other._proveedor);
1234  if (comparacionProveedor == 0)
1235  {
1236  int comparacionDocumento = _documento.CompareTo(other._documento);
1237  if (comparacionDocumento == 0)
1238  {
1239  return _linia.CompareTo(other._linia);
1240  }
1241  else
1242  return comparacionDocumento;
1243  }
1244  else
1245  return comparacionProveedor;
1246  }
1247  else
1248  return comparacionEmpresa;
1249  }
1250 
1251  public string GetKeyDocumento()
1252  {
1253  return $"--||{_empresa}||{_proveedor}||{_documento}||--";
1254  }
1255 
1256  public string GetKeyLinea()
1257  {
1258  return $"--||{_empresa}||{_proveedor}||{_documento}||{_linia.ToString()}||--";
1259  }
1260 
1261  public static string GetKeyDocumento(DataRowView rowView)
1262  {
1263  string empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
1264  string proveedor = rowView.Row.Field<string>("proveedor");
1265  string documento = rowView.Row.Field<string>("documento");
1266  return $"--||{empresa}||{proveedor}||{documento}||--";
1267  }
1268 
1269  public static string GetKeyLinea(DataRowView rowView)
1270  {
1271  string empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
1272  string proveedor = rowView.Row.Field<string>("proveedor");
1273  string documento = rowView.Row.Field<string>("documento");
1274  string linia = rowView.Row.Field<int>("linia").ToString();
1275  //string linia = rowView.Row.Field<string>("linia");
1276  return $"--||{empresa}||{proveedor}||{documento}||{linia}||--";
1277  }
1278 
1279  public string GetEmpresa()
1280  {
1281  return _empresa;
1282  }
1283 
1284  public string GetProveedor()
1285  {
1286  return _proveedor;
1287  }
1288 
1289  public string GetDocumento()
1290  {
1291  return _documento;
1292  }
1293 
1294  public int GetLinia()
1295  {
1296  return _linia;
1297  }
1298  }
1299 
1300  private bool IsValidCabecera(int indexRow)
1301  {
1302  MotivoCabeceraInvalida = string.Empty;
1303 
1304  if (!ModoCapturaParaTraspaso)
1305  return true;
1306 
1307  bool esValido = true;
1308  if(ewgridDatos.Columns.Contains("cancelado") && Convert.ToBoolean(ewgridDatos[ewgridDatos.Columns["cancelado"].Index, indexRow].Value) == true)
1309  {
1310  MotivoCabeceraInvalida = "No se pueden seleccionar documentos cancelados.";
1311  esValido = false;
1312  }
1313  if (ewgridDatos.Columns.Contains("traspasado") && Convert.ToBoolean(ewgridDatos[ewgridDatos.Columns["traspasado"].Index, indexRow].Value) == true)
1314  {
1315  MotivoCabeceraInvalida = "No se pueden seleccionar documentos traspasados.";
1316  esValido = false;
1317  }
1318  return esValido;
1319  }
1320 
1321  string MotivoCabeceraInvalida = string.Empty;
1322  string MotivoDetalleInvalido = string.Empty;
1323 
1324  private bool IsValidDetalle(int indexRow)
1325  {
1326  MotivoDetalleInvalido = string.Empty; ;
1327 
1328  if (!ModoCapturaParaTraspaso)
1329  return true;
1330 
1331  bool esValido = true;
1332  if (ewgridDetalle.Columns.Contains("cancelado") && Convert.ToBoolean(ewgridDetalle[ewgridDetalle.Columns["cancelado"].Index, indexRow].Value) == true)
1333  {
1334  MotivoDetalleInvalido = "No se pueden seleccionar líneas canceladas.";
1335  esValido = false;
1336  }
1337  //Bug 152280 => Valido que el documento general (cabeceras) no esté cancelado
1338  if (ewgridDatos.Columns.Contains("cancelado") && Convert.ToBoolean(ewgridDatos[ewgridDatos.Columns["cancelado"].Index, ewgridDatos.CurrentRow.Index].Value) == true)
1339  {
1340  MotivoDetalleInvalido = "No se pueden seleccionar lineas que pertenecen a documentos cancelados.";
1341  esValido = false;
1342  }
1343 
1344  if (ewgridDetalle.Columns.Contains("traspasado") && Convert.ToBoolean(ewgridDetalle[ewgridDetalle.Columns["traspasado"].Index, indexRow].Value) == true)
1345  {
1346  MotivoDetalleInvalido = "No se pueden seleccionar líneas traspasadas.";
1347  esValido = false;
1348  }
1349  //Bug 152394 => Valido que el documento general (cabeceras) no esté traspasado (marcado como tal)
1350  if (ewgridDatos.Columns.Contains("traspasado") && Convert.ToBoolean(ewgridDatos[ewgridDatos.Columns["traspasado"].Index, ewgridDatos.CurrentRow.Index].Value) == true)
1351  {
1352  MotivoDetalleInvalido = "No se pueden seleccionar lineas que pertenecen a documentos traspasados.";
1353  esValido = false;
1354  }
1355 
1356 
1357  if (ewgridDetalle.Columns.Contains("servidas") && Convert.ToDecimal(ewgridDetalle[ewgridDetalle.Columns["servidas"].Index, indexRow].Value) != decimal.Zero)
1358  {
1359  MotivoDetalleInvalido = "No se pueden seleccionar líneas con unidades servidas.";
1360  esValido = false;
1361  }
1362  if (ewgridDetalle.Columns.Contains("escandal") && !String.IsNullOrWhiteSpace(Convert.ToString(ewgridDetalle[ewgridDetalle.Columns["escandal"].Index, indexRow].Value)))
1363  {
1364  //Evaluación de escandallos
1365  string escandal = Convert.ToString(ewgridDetalle[ewgridDetalle.Columns["escandal"].Index, indexRow].Value).TrimEnd();
1366  if(escandal.EndsWith("LIN")) //Es línea => Manda el padre... no es válido
1367  {
1368  MotivoDetalleInvalido = "No se pueden seleccionar individualmente líneas de componentes.";
1369  esValido = false;
1370  }
1371  }
1372 
1373  return esValido;
1374  }
1375 
1376  private bool EsUnEscandallo(DataGridViewRow row)
1377  {
1378  if (ewgridDetalle.Columns.Contains("escandal") && !String.IsNullOrWhiteSpace(Convert.ToString(row.Cells["escandal"].Value)))
1379  {
1380  string escandal = Convert.ToString(row.Cells["escandal"].Value);
1381  if (escandal.ToUpper().EndsWith("TYC")) //No es un escandallo de bloque
1382  {
1383  return false;
1384  }
1385  return true;
1386  }
1387  else
1388  return false;
1389  }
1390 
1391  private bool EsEscandalloDeDefinicionAmpliada(string tcEscandal)
1392  {
1393  //Empiezan o acaban en AMP
1394  return tcEscandal.ToUpper().EndsWith("AMP") || tcEscandal.ToUpper().StartsWith("AMP");
1395  }
1396 
1400  private void _Configurar_Grid_Detalle()
1401  {
1402  bool llPaso = false;
1403 
1404  if (ewgridDetalle.Columns.Contains("talla")) ewgridDetalle.Columns["talla"].Visible = _lColor;
1405  if (ewgridDetalle.Columns.Contains("color")) ewgridDetalle.Columns["color"].Visible = _lColor;
1406  if (ewgridDetalle.Columns.Contains("cajas")) ewgridDetalle.Columns["cajas"].Visible = _lCajas;
1407  if (ewgridDetalle.Columns.Contains("peso")) ewgridDetalle.Columns["peso"].Visible = _lPeso;
1408 
1409  if (ewgridDetalle.Columns.Contains("nombre_articulo"))
1410  {
1411  //Task 107788 Se observa que hay dos columnas definición. Se opta solución hibrida. Si ha columna definición especifica se oculta la de artículo, sino asume su rol
1412  //Customer Change Request 104943 : la columna con el nombre de arículo debe verse
1413  if(ewgridDetalle.Columns.Contains("definicion"))
1414  ewgridDetalle.Columns["nombre_articulo"].Visible = false;
1415  else
1416  ewgridDetalle.Columns["nombre_articulo"].HeaderText = "Definición";
1417  }
1418 
1419  //Task 105512 Supresión de código repetido
1420  // Ocultamos columnas que no interesan
1421  List<string> lisColumnasInvisibles = new List<string>() { "proveedor", "nombre_proveedor", "tipo_iva", "preciodiv", "importediv", "importeiva", "importepte", "refercli",
1422  "familia", "subfamilia", "cajaserv", "pendientes", "escandal", "linia" };
1423  CambiarVisibilidadColumnas(lisColumnasInvisibles, false, ref ewgridDetalle);
1424 
1425  if (ModoCapturaParaTraspaso)
1426  ewgridDetalle.Columns[_cNomColSeleccionar].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
1427 
1428  _ConfigurarGridDivisa(_ListadoDetalle, ref ewgridDetalle); //Task 107003 //Task 105512 Método centralizado
1429 
1430  if (ewgridDetalle.Columns.Contains("definicion"))
1431  {
1432  ewgridDetalle.Columns["definicion"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
1433  ewgridDetalle.Columns["definicion"].MinimumWidth = 80;
1434  llPaso = true;
1435  }
1436 
1437  if (ewgridDetalle.Columns.Contains("nombre_articulo"))
1438  {
1439  ewgridDetalle.Columns["nombre_articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
1440  ewgridDetalle.Columns["nombre_articulo"].MinimumWidth = 80;
1441  llPaso = true;
1442  }
1443 
1444  //Task 105512 Supresión de código repetido
1445  _ConfigurarColumnaNumerica("peso", _oMascaraPeso._Mascara_Net, ref ewgridDetalle);
1446  _ConfigurarColumnaNumerica("unidades", _oMascaraUnidades._Mascara_Net, ref ewgridDetalle, _cDesUnidades);
1447  _ConfigurarColumnaNumerica("servidas", _oMascaraUnidades._Mascara_Net, ref ewgridDetalle);
1448  _ConfigurarColumnaNumerica("precio", _oMascaraPrecio._Mascara_Net, ref ewgridDetalle);
1449  _ConfigurarColumnaNumerica("dto1", _oMascaraPorcent._Mascara_Net, ref ewgridDetalle);
1450  _ConfigurarColumnaNumerica("dto2", _oMascaraPorcent._Mascara_Net, ref ewgridDetalle);
1451  _ConfigurarColumnaNumerica("importe", _oMascaraImport._Mascara_Net, ref ewgridDetalle);
1452  _ConfigurarColumnaNumerica("cajas", _oMascaraCajas._Mascara_Net, ref ewgridDetalle, _cDesCajas, false);
1453 
1454  //Se trata de ajustar campos que no requieren mucho espacio
1455  if (ewgridDetalle.Columns.Contains("documento"))
1456  {
1457  ewgridDetalle.Columns["documento"].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
1458  ewgridDetalle.Columns["documento"].Width = 80;
1459  }
1460 
1461  if(!llPaso)
1462  ewgridDetalle.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
1463  else
1464  ewgridDetalle.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
1465 
1466  // Arreglo un poco los nombres de las columnas
1467  _Nombre_Columnas(ref ewgridDetalle);
1468 
1469  ewgridDetalle.AutoSizeColumnsMode = ewgridDetalle.Rows.Count > 0 ? DataGridViewAutoSizeColumnsMode.Fill : DataGridViewAutoSizeColumnsMode.DisplayedCells;
1470 
1471  //Nuevo check de Traspasado en el detalle (unidades - servidas = 0)
1472  if (!ewgridDetalle.Columns.Contains("traspasado"))
1473  {
1474  DataGridViewCheckBoxColumn CBColumn = new DataGridViewCheckBoxColumn
1475  {
1476  Name = "traspasado",
1477  HeaderText = "Traspasado",
1478  FalseValue = "0",
1479  TrueValue = "1"
1480  };
1481  if (ewgridDetalle.Columns.Contains("servidas"))
1482  {
1483  ewgridDetalle.Columns.Insert(ewgridDetalle.Columns["servidas"].Index + 1, CBColumn);
1484  ewgridDetalle.Columns["traspasado"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
1485  }
1486  }
1487 
1488  //Quan hi ha 0 no mostra res i treu els espais per darrera
1489  ewgridDetalle.CellFormatting += new DataGridViewCellFormattingEventHandler(ExtensionesGrids.__Grid_CellFormatting);
1490  }
1491 
1492  //Task 105512 Supresión de código repetido
1499  private void CambiarVisibilidadColumnas(IEnumerable<string> tlisColumnas, bool tlVisible, ref ewgrid toGrid)
1500  {
1501  foreach (var nombreColumna in tlisColumnas) //Recorro la lista
1502  {
1503  if (toGrid.Columns.Contains(nombreColumna))
1504  toGrid.Columns[nombreColumna].Visible = tlVisible;
1505  }
1506  }
1507 
1511  protected override void OnRefrescarClick()
1512  {
1513  base.OnRefrescarClick();
1514 
1515  _Refrescar_Datos();
1516  }
1517 
1523  private void EwgridDatos_SelectionChanged(object sender, EventArgs e)
1524  {
1525  if (ewgridDatos.CurrentCell == null)
1526  return;
1527  int lnRowAct = 0;
1528  string lcNumero = "";
1529 
1530  if (ewgridDatos.SelectedRows.Count > 0)
1531  lnRowAct = ewgridDatos.SelectedRows[0].Index;
1532  else
1533  lnRowAct = ewgridDatos.CurrentCell.RowIndex;
1534 
1535  lcNumero = ewgridDatos["Documento", lnRowAct].Value.ToString();
1536  if (_UltimoDocumentoSeleccionado != lcNumero)
1537  {
1538  _UltimoDocumentoSeleccionado = lcNumero;
1539  _Refrescar_Detalle(lcNumero);
1540  }
1541  }
1542 
1549  void EwgridDatos_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
1550  {
1551  if (ModoCapturaParaTraspaso)
1552  NavegarDocumento(e.RowIndex);
1553  else
1554  BtNavegar_Click(null, null);
1555  }
1556 
1557  private void LbDetalle_Click(object sender, EventArgs e)
1558  {
1559  scDatos.Panel1Collapsed = !scDatos.Panel1Collapsed;
1560  toolTipEW.SetToolTip(lbDetalle, (scDatos.Panel1Collapsed ? "Minimizar" : "Maximizar") + " detalle");
1561  }
1562 
1563  private void LbDocumentos_Click(object sender, EventArgs e)
1564  {
1565  scDatos.Panel2Collapsed = !scDatos.Panel2Collapsed;
1566  toolTipEW.SetToolTip(lbDocumentos, (scDatos.Panel2Collapsed ? "Minimizar" : "Maximizar") + " documentos");
1567  }
1568 
1574  private void ScDatos_Paint(object sender, PaintEventArgs e)
1575  {
1576  if (sender is SplitContainer scSplit)
1577  {
1578  Pen loPen = new Pen(Color.DimGray, 30);
1579 
1580  int lnTop = 5;
1581  int lnBottom = scSplit.Height - 10;
1582  int lnLeft = scSplit.Width / 2;
1583 
1584  e.Graphics.DrawLine(loPen, lnLeft, lnTop, lnLeft, lnBottom);
1585  }
1586  }
1587 
1593  protected virtual void BtNavegar_Click(object sender, EventArgs e)
1594  {
1595  //Si tengo activa la selección múltiple con una lista de campos (no null) que tiene elementos
1596  if (_lSeleccion_Multiple && _lis_Seleccion_Multiple_Campos != null && _lis_Seleccion_Multiple_Campos.Count > 0)
1597  {
1598  IEnumerable<DataGridViewRow> ldgrRowsSeleccionats =
1599  from DataGridViewRow ldgrRow in ewgridDatos.Rows
1600  where (bool)ldgrRow.Cells[_cNomColSeleccionar].Value == true
1601  select ldgrRow;
1602 
1603  //Recorro los elementos seleccionados
1604  foreach (DataGridViewRow ldgrRow in ldgrRowsSeleccionats)
1605  {
1606  //Declaro un array para contener los campos
1607  Dictionary<string, object> ldicCampos = new Dictionary<string,object>();
1608  //object[] laElemento = new object[_lis_Seleccion_Multiple_Campos.Count];
1609  int lnIndex = 0;
1610  foreach (string lcNombreCampo in _lis_Seleccion_Multiple_Campos) //Recorro todos los campos
1611  {
1612  if (ewgridDatos.Columns.Contains(lcNombreCampo)) //Si existe el campo
1613  {
1614  ldicCampos.Add(lcNombreCampo, ewgridDatos[lcNombreCampo, ldgrRow.Index].Value);
1615  //laElemento[lnIndex] = ewgridDatos[lcNombreCampo, ldgrRow.Index].Value;
1616  }
1617  else
1618  {
1619  ldicCampos.Add(lcNombreCampo, null);
1620  //laElemento[lnIndex] = string.Empty;
1621  }
1622  lnIndex++;
1623  }
1624 
1625  _lis_Seleccion_Multiple_Resultados.Add(ldicCampos);
1626  }
1627 
1628  btSalir1.PerformClick();
1629  }
1630  else
1631  {
1632  if (ewgridDatos.CurrentCell == null)
1633  {
1634  _MessageBox("Debe seleccionar el documento al que desea navegar.", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, DialogResult.OK);
1635  return;
1636  }
1637 
1638  // Obtener documento
1639  int lnRowAct = ewgridDatos.CurrentCell.RowIndex;
1640 
1641  if (ModoCapturaParaTraspaso)
1642  NavegarDocumento(lnRowAct);
1643  else
1644  {
1645  _Numero = ewgridDatos["Documento", lnRowAct].Value.ToString();
1646 
1647  if (ewgridDatos.Columns.Contains("Factura"))
1648  _Factura = ewgridDatos["Factura", lnRowAct].Value.ToString();
1649  else if (_Cabeceras is listados.Listados.FacturasProveedor)
1650  _Factura = _Numero;
1651 
1652  if (string.IsNullOrWhiteSpace(_Numero))
1653  return;
1654 
1655  //CCR 157238 => Ver documento sin proveedor filtrado
1656  if(String.IsNullOrWhiteSpace(_Proveedor) && ewgridDatos.Columns.Contains("Proveedor"))
1657  {
1658  //Asigno el proveedor. Esta asignación no elude las validaciones de divisa asociadas. Se ejecutan de igual forma
1659  _Proveedor = ewgridDatos["Proveedor", lnRowAct].Value.ToString();
1660  }
1661 
1662  btSalir1.PerformClick();
1663  }
1664  }
1665  }
1666 
1667 
1668 
1675  protected virtual void btCapturar_Click(object sender, EventArgs e)
1676  {
1677  //TODO : Que fem en aquest cas?
1678  //throw new Exception("Se debe implementar la accion de aceptacion del formulario");
1679  return;
1680  }
1681 
1687  private void EwgridDetalle_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
1688  {
1689  string lcDefinicion = ewgridDetalle.Columns.Contains("definicion") ? ewgridDetalle["definicion", e.RowIndex].Value.ToString() : String.Empty;
1690  string lcTipoIva = ewgridDetalle.Columns.Contains("tipo_iva") ? ewgridDetalle["tipo_iva", e.RowIndex].Value.ToString() : String.Empty;
1691 
1692  if (!string.IsNullOrWhiteSpace(lcDefinicion) && string.IsNullOrWhiteSpace(lcTipoIva))
1693  {
1694  Font loFont;
1695  loFont = new Font(ewgridDetalle.DefaultCellStyle.Font, FontStyle.Italic);
1696 
1697  ewgridDetalle.Rows[e.RowIndex].Cells["Definicion"].Style.Font = loFont;
1698  ewgridDetalle.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Blue;
1699  }
1700  }
1701 
1706  protected void _ShowTraspasados(bool tlShow = true)
1707  {
1708  panelTrasp.Visible = tlShow;
1709  }
1710 
1715  protected void _ShowCancelados(bool tlShow = true)
1716  {
1717  panelCancel.Visible = tlShow;
1718  }
1719 
1724  protected void _ShowFacturados(bool tlShow = true)
1725  {
1726  panelFacturados.Visible = tlShow;
1727  }
1728 
1729 
1730  #endregion métodos
1731 
1738  private void Generic_CheckedChanged(object sender, EventArgs e)
1739  {
1740  if (sender is ewradiobutton && (sender as ewradiobutton).Checked)
1741  {
1742  _lLastSelectedIndex = 0;
1743  _Refrescar_Datos();
1744  }
1745  }
1746 
1750  protected override void OnDivisaChanged()
1751  {
1752  base.OnDivisaChanged();
1753 
1754  ActualizarEtiquetaSimboloDivisa();
1755  }
1756 
1760  private void ActualizarEtiquetaSimboloDivisa()
1761  {
1762  if (_FiltrarDivisa && !Divisa._EsDivisaEmpresa(_Divisa))
1763  lblSimboloDivisa.Text = _ObtenerSimboloDivisa();
1764  else
1765  lblSimboloDivisa.Text = "";
1766  }
1767 
1768  private void InicializarModoCapturaParaTraspaso()
1769  {
1770  if (DesignMode) //En modo diseño no oculto nada
1771  return;
1772 
1773  if(ModoCapturaParaTraspaso)
1774  {
1775  PanelCapturaParaTraspaso.Visible = true;
1776  PanelCapturaParaTraspasoInfo.Visible = true;
1777  PanelCapturaParaTraspasoInfo.Location = new Point(PanelCapturaParaTraspasoInfo.Location.X, (scDatos.Location.Y + scDatos.Height + 3)); //Afino un poco el posicionamiento
1778  _lSeleccion_Multiple = false; //Son bastante incompatibles
1779  btSalir1.Text = @"&Cancelar";
1780  btSalir1.Size = new Size(120, btSalir1.Height); //Me cambian el tamaño... lo corrijo
1781 
1782  //Traspaso => botón verde => Le cargo el estilo de un btDocAceptar
1783  if (!DesignMode)
1784  {
1785  btCapturarParaTraspaso._PropiedadesDeEstilos = new ewbuttonEstilosBase(btCapturarParaTraspaso);
1786  btCapturarParaTraspaso._PropiedadesDeEstilos._CargarEstilo("sage.ew.botones.btDocAceptar");
1787  }
1788 
1789  //Prefijamos Pendientes no canceldos
1790  rbTrasp1.Checked = true;
1791  if (!LosDocumentosOrigenSonDepositos())
1792  rbCancel1.Checked = true; //No cancelados
1793 
1794  //Botones normales que no han de aparecer
1795  btListar.Visible = false;
1796  btImprimir1.Visible = false;
1797 
1798  }
1799  else
1800  {
1801  PanelCapturaParaTraspaso.Visible = false;
1802  PanelCapturaParaTraspasoInfo.Visible = false;
1803  btSalir1.Text = @"&Salir";
1804  btSalir1.Size = new Size(120, btSalir1.Height); //Me cambian el tamaño... lo corrijo
1805  }
1806  }
1807 
1808  private void BtCapturarParaTraspaso_Click(object sender, EventArgs e)
1809  {
1810  if(_DocumentoOrigen._EnUso)
1811  {
1812  NotificarAlUsuario("No se permite traspasar líneas a un documento en uso.");
1813  return;
1814  }
1815 
1816  if (dicDetallesSeleccionados.Count > 0)
1817  {
1818  var linkForm = _DocumentoOrigen._oForm;
1819  _DocumentoOrigen._oForm = null;
1820 
1821  bool ejecutado = EjecutarCapturaParaTraspaso(); //Bug 152437 => Encapsulo la ejecución para poder restablecer el vículo con _oForm sea cual sea el resultado
1822 
1823  _DocumentoOrigen._oForm = linkForm;
1824 
1825  _Numero = _DocumentoOrigen._Numero;
1826  _Proveedor = _DocumentoOrigen._Cabecera._Proveedor;
1827 
1828  if (ejecutado)
1829  {
1830  Close();
1831  }
1832  }
1833  else
1834  {
1835  //Notificar falta de selección
1836  NotificarAlUsuario("No se han seleccionado líneas para la operación de traspaso");
1837  }
1838  }
1839 
1844  private bool EjecutarCapturaParaTraspaso()
1845  {
1846  Queue<LineaDetalleId> documentosDistintos = ObtenerIdsDeDocumentosOrigen(); //Obtengo los documentos de los que voy a traspasar líneas
1847 
1848  _UsarDivisa = TrabajarTraspasoConDivisa(); //Determino si trabajamos con divisa
1849 
1850  if (!TengoDocumentoDestino() || !TengoDestinatario()) //Destinatario => el cliente o proveedor del documento destino
1851  {
1852  //Recupero los datos necesarios del primer documento
1853  LineaDetalleId primerDocumento = documentosDistintos.Peek();
1854  if (!EstablecerDatosDestinoDesdePrimerElemento(primerDocumento))
1855  {
1856  string mensajeError = "No se ha podido crear el documento destino.";
1857  if (!string.IsNullOrWhiteSpace(_DocumentoOrigen._Mensaje_Error))
1858  mensajeError = _DocumentoOrigen._Mensaje_Error;
1859  NotificarAlUsuario(mensajeError);
1860  return false;
1861  }
1862  }
1863  else
1864  {
1865  //Valido que sea válido => Facturados no lo son
1866  if (!string.IsNullOrWhiteSpace(_DocumentoOrigen._Cabecera._Factura))
1867  {
1868  NotificarAlUsuario("No se permite traspasar líneas a un documento ya facturado");
1869  return false;
1870  }
1871  }
1872 
1873  //Valido el Solo_Lectura => En este punto si es necesario ya ha intanciado un documento y es mensaje es mas fiable (incluye control de meses cerrados)
1874  if (_DocumentoOrigen._Solo_Lectura)
1875  {
1876  string mensajeError = "No se permite traspasar líneas a un documento de sólo lectura.";
1877  if (!string.IsNullOrWhiteSpace(_DocumentoOrigen._Mensaje_Error))
1878  mensajeError = _DocumentoOrigen._Mensaje_Error;
1879  NotificarAlUsuario(mensajeError);
1880  return false;
1881  }
1882 
1883  List<dynamic> documentosOrigen = new List<dynamic>();
1884  while (documentosDistintos.Count > 0)
1885  {
1886  LineaDetalleId idDocumentoOrigen = documentosDistintos.Dequeue();
1887  documentosOrigen.Add(PrepararDocumentoOrigenTraspasoLineas(idDocumentoOrigen));
1888  }
1889 
1890  //Bug 153724 => Control de divisas cruzadas
1891  if (documentosOrigen.Any())
1892  {
1893  string divisaDocumentos = documentosOrigen.First()._Cabecera._Divisa;
1894  string divisaDestino = _DocumentoOrigen._Cabecera._Divisa;
1895  if (!divisaDestino.Equals(divisaDocumentos))
1896  {
1897  NotificarAlUsuario("El documento destino tiene una divisa distinta. " + Environment.NewLine + "Este tipo de traspasos no están permitidos.");
1898  return false;
1899  }
1900  }
1901 
1902  if (LosDocumentosOrigenContienenDocumentosEnUso(documentosOrigen, out string documentosEnUso))
1903  {
1904  string mensaje = "No se permite traspasar desde documentos en uso. " + Environment.NewLine + "Documentos en uso:" + Environment.NewLine + documentosEnUso;
1905  NotificarAlUsuario(mensaje);
1906  return false;
1907  }
1908 
1909  //Control de obras
1910  GestionDeObras(documentosOrigen);
1911 
1912  //Bug 152376 => Control de observaciones
1913  GestionDeObservaciones(documentosOrigen);
1914 
1915  //Bug 152253 => Refinamiento de mensaje de error para distintos proveedores
1916  if (!documentosOrigen.All(d => ValidarMismoProveedor(d, _DocumentoOrigen)))
1917  {
1918  NotificarAlUsuario("No se permite traspasar líneas de distintos proveedores a un mismo documento");
1919  return false;
1920  }
1921 
1922 
1923  if (documentosOrigen.All(d => ValidarCompatibilidadOrigenDestino(d, _DocumentoOrigen)))
1924  {
1925  documentosOrigen.ForEach(d => EjecutarTraspsasoDocumento(d));
1926 
1927  //Bug 152376 => Control de observaciones
1928  AsignarObservaciones();
1929 
1930  _DocumentoOrigen._SaveData();
1931  }
1932 
1933  return true;
1934  }
1935 
1936  private bool LosDocumentosOrigenContienenDocumentosEnUso(List<dynamic> documentosOrigen, out string documentosEnUso)
1937  {
1938  documentosEnUso = string.Empty;
1939 
1940  var enUso = documentosOrigen.Where(d => EnUso.EstaEnUsoElDocumento(d) == true).ToList();
1941  if (enUso.Any())
1942  {
1943  string detalleDocumentosEnUso = string.Empty;
1944  enUso.ForEach(d => detalleDocumentosEnUso += $"Proveedor {d._Cabecera._Proveedor} - '{d._Numero}' {Environment.NewLine}");
1945  documentosEnUso = detalleDocumentosEnUso;
1946  return true;
1947  }
1948 
1949  return false;
1950  }
1951 
1952  private void NotificarAlUsuario(string mensaje)
1953  {
1954  _MessageBox(mensaje, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.None);
1955  }
1956 
1957  void EjecutarTraspsasoDocumento(dynamic documentoOrigen)
1958  {
1959  Dictionary<string, object> loDicParamTraspaso = new Dictionary<string, object>();
1960 
1961  // Nº de documento destino generado (formato proveedor+numero)
1962  string lcNumDocDestino = string.Empty;
1963 
1964  // Parámetros fijos, siempre se pasarán
1965  loDicParamTraspaso.Add("fecha", DateTime.Today);
1966  loDicParamTraspaso.Add("proveedor", _DocumentoOrigen._Cabecera._Proveedor);
1967 
1968  //Obtengo la configuración de traspaso
1969  ConfiguradorTraspasoAlbaran configuradorTraspaso = documentoOrigen._Obtener_Config_Traspaso_DocDestino(ConfiguradorTraspasoAlbaran._DestinosTraspaso.albaran);
1970 
1971  if (configuradorTraspaso._Control_Operario)
1972  {
1973  string operario = _DocumentoOrigen._Cabecera._Operario;
1974  if (string.IsNullOrWhiteSpace(operario)) //Sino hay destino, tomo el del documento
1975  {
1976  operario = documentoOrigen._Cabecera._Operario;
1977  _DocumentoOrigen._Cabecera._Operario = operario; //Me guardo el valor
1978  }
1979 
1980  loDicParamTraspaso.Add("operario", documentoOrigen._Cabecera._Operario);
1981  }
1982 
1983  if (configuradorTraspaso._Control_Obra && //Gestiona obras
1984  _traspasarObra && //Se ha de traspasar (logica propia)
1985  DocumentoConObra(documentoOrigen) && //El documento que estoy procesando tiene obra
1986  !_obraTraspasada) //No la he asignado previamente
1987  {
1988  loDicParamTraspaso.Add("obra", _DocumentoOrigen._Cabecera._Obra = documentoOrigen._Cabecera._Obra);
1989  _obraTraspasada = true;
1990  }
1991 
1992  if (configuradorTraspaso._Control_FormaPago)
1993  {
1994  //Bug 152404 => Manda la del documento destino (si la hay)
1995  string formaDePago = _DocumentoOrigen._Cabecera._FormaPago;
1996 
1997  if (string.IsNullOrWhiteSpace(formaDePago)) //Sino hay
1998  {
1999  formaDePago = documentoOrigen._Cabecera._FormaPago;
2000  _DocumentoOrigen._Cabecera._FormaPago = formaDePago; //Me guardo el valor
2001  }
2002 
2003  loDicParamTraspaso.Add("formapago", formaDePago);
2004  }
2005 
2006  if (configuradorTraspaso._Control_Almacen)
2007  loDicParamTraspaso.Add("almacen", _DocumentoOrigen._Cabecera._Almacen); //Prevalece destino
2008 
2009  loDicParamTraspaso.Add("numero", _DocumentoOrigen._Numero);
2010 
2011  if (_UsarDivisa)
2012  {
2013  loDicParamTraspaso.Add("divisa", DivisaDocumento());
2014  loDicParamTraspaso.Add("cambio", _DocumentoOrigen._Cabecera._Cambio); //Nada de mezclar cambios
2015  loDicParamTraspaso.Add("actualizarcambio", false); //Puede haber N documentos con N cambios
2016  }
2017 
2018  loDicParamTraspaso.Add("docudestino", _DocumentoOrigen);
2019 
2020  TratamientoExtensiones(documentoOrigen);
2021 
2022  lcNumDocDestino = documentoOrigen._To_Albaran(loDicParamTraspaso);
2023  }
2024 
2025  private void TratamientoExtensiones(dynamic documentoOrigen)
2026  {
2027  foreach (dynamic linea in documentoOrigen._Lineas)
2028  {
2029  if (linea._TraspasarLinea)
2030  {
2031  decimal lnMaxUdsTraspaso = linea._Unidades;
2032  linea._Traspaso = lnMaxUdsTraspaso;
2033 
2034  ExtensionesTraspasoAutomatico(linea, ((ewDocCompraALBARAN)_DocumentoOrigen)._Cabecera._Almacen, ((ewDocCompraALBARAN)_DocumentoOrigen)._Fecha, ref lnMaxUdsTraspaso);
2035 
2036  if (lnMaxUdsTraspaso != linea._Unidades)
2037  {
2038  ExtensionesCancelar(linea);
2039  linea._Traspaso = 0M;
2040  linea._TraspasarLinea = false;
2041 
2042  _MessageBox("Sólo se permite traspasar las líneas informadas en su totalidad.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.None);
2043  }
2044 
2045  }
2046  }
2047  }
2048 
2052  private void ExtensionesCancelar(IDocCompraLin toLinea)
2053  {
2054  if (toLinea._oArticulo._Con_Lotes(toLinea._Fecha) || toLinea._oArticulo._UsaSeries) //Linea con extensión
2055  {
2056  if (toLinea is ewDocCompraLinDEPOSITO || toLinea is ewDocCompraLinPEDIDO || toLinea is ewDocCompraLinPROPUESTA)
2057  {
2058  (new TraspasoComprasExtendido(toLinea))._CancelarTraspaso(toLinea);
2059  }
2060  }
2061  }
2062 
2070  private void ExtensionesTraspasoAutomatico(IDocCompraLin toLinea, string tcAlmacen, DateTime tdFecha, ref decimal toValor)
2071  {
2072  if (string.IsNullOrWhiteSpace(toLinea._TipoIva)) return;
2073 
2074  toValor = toLinea.__TraspasoAutomatico_Extendido_Compras(new ParametrosTraspasosExtendidos(toValor, tcAlmacen, tdFecha, eTipoDocumento.AlbaranCompra));
2075  }
2076 
2077  private bool ValidarMismoProveedor(dynamic documentoOrigen, dynamic documentoDestino)
2078  {
2079  return documentoOrigen._Cabecera._Proveedor.TrimEnd() == _DocumentoOrigen._Cabecera._Proveedor.TrimEnd();
2080  }
2081 
2082  private bool ValidarCompatibilidadOrigenDestino(dynamic documentoOrigen, dynamic documentoDestino)
2083  {
2084  Dictionary<string, object> loDicResultado = new Dictionary<string, object>();
2085  bool ejecucionCorrecta = false;
2086  string mensajeDeError = "";
2087 
2088  // Se llama al método que tendrá la clase de negocio de documento origen en el que estemos (pedido compra, deposito compra, propuetas compra) para que
2089  // haga las comprobaciones que correspondan para verificar que tanto el documento origen como el destino son compatibles, es decir, identico proveedor, pronto pago, etc.
2090  loDicResultado = documentoOrigen._Traspaso_DocDestino_Existente_Compatible(documentoDestino);
2091 
2092  ejecucionCorrecta = Convert.ToBoolean(loDicResultado["ok"]);
2093 
2094  if (!ejecucionCorrecta)
2095  {
2096  mensajeDeError = Convert.ToString(loDicResultado["mensajeerror"]);
2097  NotificarAlUsuario(mensajeDeError);
2098  }
2099  return ejecucionCorrecta;
2100  }
2101 
2102  private bool EstablecerDatosDestinoDesdePrimerElemento(LineaDetalleId primerDocumento)
2103  {
2104  bool documentoDestinoDeNuevaCreacion = false; //Bug 152577 => Marca de si el documento destino me llega instaciado o no
2105 
2106  if (_DocumentoOrigen == null)
2107  _DocumentoOrigen = new ewDocCompraALBARAN();
2108 
2109  dynamic documentoOrigenTraspaso = CargarDocumento(primerDocumento);
2110 
2111  if (string.IsNullOrWhiteSpace(_DocumentoOrigen._Numero))
2112  {
2113  CrearDocumento(documentoOrigenTraspaso);
2114  documentoDestinoDeNuevaCreacion = true; //Marco que no disponia de documento orígen
2115  }
2116 
2117 
2118  //Obtengo la configuración de traspaso
2119  ConfiguradorTraspasoAlbaran configuradorTraspaso = documentoOrigenTraspaso._Obtener_Config_Traspaso_DocDestino(ConfiguradorTraspasoAlbaran._DestinosTraspaso.albaran);
2120 
2121  _DocumentoOrigen._Cabecera._Proveedor = documentoOrigenTraspaso._Cabecera._Proveedor;
2122 
2123  if (configuradorTraspaso._Control_Operario)
2124  {
2125  string operarioDestino = documentoDestinoDeNuevaCreacion ? "" : _DocumentoOrigen._Cabecera._Operario; //Bug 152518 => Si tengo documento origen (real) lo asigno sino lo ignoro
2126  if (string.IsNullOrWhiteSpace(operarioDestino))
2127  {
2128  string operario = documentoOrigenTraspaso._Cabecera._Operario;
2129  if (string.IsNullOrWhiteSpace(operario))
2130  operario = Convert.ToString(EW_GLOBAL._GetVariable("wc_OperarioTPV")); //Si por lo que sea el documento origen no tiene tomo el por defecto de la empresa
2131  _DocumentoOrigen._Cabecera._Operario = operario;
2132  }
2133  }
2134 
2135  if (configuradorTraspaso._Control_Obra)
2136  _DocumentoOrigen._Cabecera._Obra = documentoOrigenTraspaso._Cabecera._Obra;
2137 
2138  if (configuradorTraspaso._Control_FormaPago)
2139  {
2140  string formaDePago = documentoOrigenTraspaso._Cabecera._FormaPago;
2141  if(string.IsNullOrWhiteSpace(formaDePago)) //Bug 152577
2142  {
2143  //No tengo forma de pago del documento origen, trato de obtenerla del proveedor
2144  formaDePago = ((ewDocCompraALBARAN)_DocumentoOrigen)._Cabecera._oProv._FormaPago;
2145  }
2146  _DocumentoOrigen._Cabecera._FormaPago = formaDePago;
2147  }
2148 
2149  if (configuradorTraspaso._Control_Almacen)
2150  {
2151  string almacenDestino = documentoDestinoDeNuevaCreacion ? "" : _DocumentoOrigen._Cabecera._Almacen; //Bug 152577 => Si tengo documento origen (real) lo asigno sino lo ignoro
2152  if (string.IsNullOrWhiteSpace(almacenDestino))
2153  {
2154  string almacen = documentoOrigenTraspaso._Cabecera._Almacen;
2155  if (string.IsNullOrWhiteSpace(almacen))
2156  almacen = Convert.ToString(EW_GLOBAL._GetVariable("wc_almacen")); //Si por lo que sea el documento origen no tiene (pe. propuestas) tomo el por defecto de la empresa
2157  _DocumentoOrigen._Cabecera._Almacen = almacen;
2158  }
2159  }
2160 
2161  return true;
2162  }
2163 
2164  private void CrearDocumento(dynamic documentoOrigenTraspaso)
2165  {
2166  string empresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
2167  string proveedor = documentoOrigenTraspaso._Cabecera._Proveedor;
2168  ((ewDocCompraALBARAN)_DocumentoOrigen)._New(empresa, tcProveedor: proveedor); //Aplantillo para no entrar por dynamic que deja el stackTrace mal (se usa para determinar el usuario)
2169  }
2170 
2171  private Queue<LineaDetalleId> ObtenerIdsDeDocumentosOrigen()
2172  {
2173  //Obtengo los documentos de los que voy a traspasar líneas
2174  Queue<LineaDetalleId> documentosDistintos = new Queue<LineaDetalleId>();
2175  LineaDetalleId oldLinea = null;
2176  foreach (var currentLinea in dicDetallesSeleccionados.Values)
2177  {
2178  if (oldLinea == null || currentLinea.GetKeyDocumento() != oldLinea.GetKeyDocumento())
2179  {
2180  documentosDistintos.Enqueue(currentLinea);
2181  oldLinea = currentLinea;
2182  }
2183  }
2184  return documentosDistintos;
2185  }
2186 
2187  private dynamic PrepararDocumentoOrigenTraspasoLineas(LineaDetalleId idDeDocumento)
2188  {
2189  //Recupero las líneas seleccionadas del documento.
2190  var lineas = dicDetallesSeleccionados.Values.Where(l => l.GetDocumento() == idDeDocumento.GetDocumento()).ToList();
2191 
2192  dynamic documentoOrigen = CargarDocumento(idDeDocumento);
2193  //Obtengo la configuración de traspaso necesaria para el documento destino
2194  ConfiguradorTraspasoAlbaran configuradorTraspaso = documentoOrigen._Obtener_Config_Traspaso_DocDestino(ConfiguradorTraspasoAlbaran._DestinosTraspaso.albaran);
2195 
2196  if (lineas.Any()) //Configura las líneas
2197  {
2198  lineas.ForEach(l =>
2199  {
2200  int numeroDeLinea = l.GetLinia(); //Obtengo el número de linea
2201  var linea = ObtenerLinea(documentoOrigen, numeroDeLinea);
2202  linea._Traspasar_Unidades = linea._Unidades;
2203  linea._Traspasar_Cajas = linea._Cajas;
2204  linea._Traspasar_Peso = linea._Peso;
2205  linea._Traspasar_Extensiones = null; //Asigno Null y luego proceso extensiones
2206  if (LosDocumentosOrigenSonDepositos()) //Sólo en depósitos gestiono series y lotes origen
2207  {
2208  ((IDocCompraLin)linea).__TraspasoAutomatico_Extendido_Compras(new ParametrosTraspasosExtendidos(linea._Unidades,
2209  linea._Almacen,
2210  DateTime.Today,
2211  eTipoDocumento.AlbaranCompra,
2212  tlFormularioPadreVisible: false));
2213  }
2214  linea._TraspasarLinea = true;
2215  });
2216  }
2217  else
2218  {
2219  //Ha de encontrar lineas si o sí
2220  throw new NotImplementedException();
2221  }
2222 
2223  return documentoOrigen; //Devolvemos el documento origen configurado
2224  }
2225 
2226  dynamic ObtenerLinea(dynamic documento, int numero)
2227  {
2228  foreach (var linea in documento._Lineas)
2229  {
2230  if (linea._Linea == numero)
2231  return linea;
2232  }
2233  return null;
2234  }
2235 
2240  private string DivisaDocumento()
2241  {
2242  if (_DocumentoOrigen != null)
2243  return _DocumentoOrigen._Cabecera._Divisa;
2244  else
2245  return ((Divisa)EW_GLOBAL._Moneda)._Codigo; //La de la empresa
2246  }
2247 
2252  private bool TrabajarTraspasoConDivisa()
2253  {
2254  string nombreOpcFlag = _DocumentoOrigen._TipoDocumentoGeneral != eTipoDocumentoGeneral.Compras ? "wl_divisaventa" : "wl_divisacompra";
2255  if (Convert.ToBoolean(EW_GLOBAL._GetVariable(nombreOpcFlag, false)) == true)
2256  {
2257  return DivisaDocumento() != ((Divisa)EW_GLOBAL._Moneda)._Codigo;
2258  }
2259  return false;
2260  }
2261 
2265  private bool _UsarDivisa = false;
2266 
2267  private dynamic CargarDocumento(LineaDetalleId linea)
2268  {
2269  //Obtien una instancia del documento por tipo
2270  dynamic documento = GetNewInstanciaDocumento();
2271 
2272  documento._Load(linea.GetEmpresa(), linea.GetDocumento(), linea.GetProveedor());
2273  return documento;
2274  }
2275 
2276  private dynamic CargarDocumento(LineaCabeceraId linea)
2277  {
2278  //Obtien una instancia del documento por tipo
2279  dynamic documento = GetNewInstanciaDocumento();
2280 
2281  documento._Load(linea.GetEmpresa(), linea.GetDocumento(), linea.GetProveedor());
2282  return documento;
2283  }
2284 
2285  private dynamic GetNewInstanciaDocumento()
2286  {
2287  dynamic documento;
2288 
2289  switch (TipoDeDocumentoCapturable)
2290  {
2291  case eTipoDocumento.PedidoCompra:
2292  documento = new ewDocCompraPEDIDO();
2293  break;
2294  case eTipoDocumento.PropuestaCompra:
2295  documento = new ewDocCompraPROPUESTA();
2296  break;
2297  case eTipoDocumento.DepositoCompra:
2298  documento = new ewDocCompraDEPOSITO();
2299  break;
2300  default:
2301  throw new NotSupportedException("Tipo de líneas a capturar no soportadas");
2302  //break;
2303  }
2304  return documento;
2305  }
2306 
2307  private void NavegarDocumento(int index)
2308  {
2309  if (index < 0)
2310  return;
2311 
2312  LineaCabeceraId cabecera = new LineaCabeceraId(((DataRowView)ewgridDatos.Rows[index].DataBoundItem).Row);
2313  CargarDocumento(cabecera)._Show();
2314  }
2315 
2316  private bool TengoDocumentoDestino()
2317  {
2318  return (_DocumentoOrigen != null && !string.IsNullOrWhiteSpace(_DocumentoOrigen._Numero));
2319  }
2320 
2321  private bool TengoDestinatario()
2322  {
2323  return (_DocumentoOrigen != null && !string.IsNullOrWhiteSpace(_DocumentoOrigen._Cabecera._Proveedor));
2324  }
2325 
2326  private bool LosDocumentosOrigenSonDepositos()
2327  {
2328  return (TipoDeDocumentoCapturable == eTipoDocumento.DepositoCompra) || (TipoDeDocumentoCapturable == eTipoDocumento.DepositoVenta);
2329  }
2330 
2331  #region Gestión de obras
2332 
2333  private bool _traspasarObra = false;
2334  private bool _obraTraspasada = false;
2335 
2336  private void GestionDeObras(List<dynamic> documentosOrigen)
2337  {
2338  //Manda destino
2339  bool obraEnDestino = DocumentoConObra(_DocumentoOrigen); //Debe conservar destino
2340  if (obraEnDestino)
2341  {
2342  _traspasarObra = false;
2343  return;
2344  }
2345 
2346  //Evaluo origen
2347  int conObras = documentosOrigen.Where(d => DocumentoConObra(d)).ToList().Count;
2348 
2349  //Ningún origen con obra => acabo
2350  if (conObras == 0)
2351  {
2352  _traspasarObra = false;
2353  return;
2354  }
2355 
2356  //Hay obras oríen pero no destino => que tome la primera
2357  _traspasarObra = true;
2358  }
2359 
2360  private bool DocumentoConObra(dynamic documento)
2361  {
2362  return !string.IsNullOrWhiteSpace(documento._Cabecera._Obra);
2363  }
2364 
2365  #endregion Gestión de obras
2366 
2367  #region Gestión de observaciones
2368 
2369  private bool _traspasarObservaciones = false;
2370  private string _observacionesConcatenadas = string.Empty;
2371 
2372  private void GestionDeObservaciones(List<dynamic> documentosOrigen)
2373  {
2374  //Inicializo para no gestionar
2375  _traspasarObservaciones = false;
2376  _observacionesConcatenadas = string.Empty;
2377 
2378  //Manda destino
2379  bool observacionesEnDestino = DocumentoConObservaciones(_DocumentoOrigen); //Debe conservar destino
2380  if (observacionesEnDestino)
2381  {
2382  _traspasarObservaciones = false;
2383  return;
2384  }
2385 
2386  //Evaluo origen
2387  var conObservaciones = documentosOrigen.Where(d => DocumentoConObservaciones(d)).ToList();
2388 
2389  //Ningún origen con observaciones => acabo
2390  if (conObservaciones.Any())
2391  {
2392  //Hay observaciones oríen pero no destino
2393  _traspasarObservaciones = true;
2394 
2395  //Si solo hay una => Asigno tal como viene, sin tratamiento rtf
2396  if (conObservaciones.Count == 1)
2397  {
2398  _observacionesConcatenadas = GetObservacionesDocumento(conObservaciones.First());
2399  }
2400  else
2401  {
2402  conObservaciones.ForEach(d => _observacionesConcatenadas += GetObservacionesDocumentoConTratamientoRTF(d));
2403  }
2404  }
2405  else
2406  {
2407  _traspasarObservaciones = false;
2408  }
2409  }
2410 
2411  private void AsignarObservaciones()
2412  {
2413  if (_traspasarObservaciones) //Si se ha determinado que hay que traspasar las observaciones
2414  {
2415  _DocumentoOrigen._Cabecera._Observacio = _observacionesConcatenadas;
2416  }
2417  }
2418 
2419  private string GetObservacionesDocumento(dynamic documento)
2420  {
2421  return documento._Cabecera._Observacio + Environment.NewLine;
2422  }
2423 
2424  private string GetObservacionesDocumentoConTratamientoRTF(dynamic documento)
2425  {
2426  string observacion = documento._Cabecera._Observacio;
2427 
2428  if (observacion.Contains(@"\rtf"))
2429  {
2430  RichTextBox controlRtf = new RichTextBox
2431  {
2432  Rtf = observacion //Recupero el RTF
2433  };
2434  observacion = controlRtf.Text; //Lo volco a texto plano
2435  }
2436 
2437  return (observacion + Environment.NewLine);
2438  }
2439 
2440  private bool DocumentoConObservaciones(dynamic documento)
2441  {
2442  return !string.IsNullOrWhiteSpace(documento._Cabecera._Observacio);
2443  }
2444 
2445  #endregion Gestión de observaciones
2446  }
2447 }
Parametros de traspaso extendidos (compras y ventas)
override string Text
Obtiene o establece el texto que se mostrará en el control
Classe empresa basada en sage.ew.ewmante
Definition: clsEmpresa.cs:48
override string _Nombre
Nombre del proveedor a partir del campo NOMBRE de la tabla PROVEED de la base de datos de GESTION de ...
Definition: Proveedor.cs:5414
Clase sage.ew.objetos.ewradiobutton
string _Proveedor
Código de proveedor
string _Get(string tcId, string tcDefaultValue="")
Devuelve la traducción de un string
Definition: Translate.cs:93
void _ShowCancelados(bool tlShow=true)
Muestra u oculta el label y los radios de la opción "Cancelados" segun tlShow
static bool _EsDivisaEmpresa(string tcCodigoDivisa)
Método que informa de si es la misma divisa que la empresa
Definition: Divisa.cs:1671
virtual void _Nombre_Columnas(ref ewgrid toGrid)
Establece el nombre de las columnas
Dictionary< string, object > _Filtros
Diccionario con los filtros que espera el método _DataTable Esta propiedad se actualizará a partir de...
Clase derivada de FormSalirProveedorArticulo para la presentación de datos de documentos de compra po...
bool _Control_Obra
Si se permite la declaración de obra (caso de estar activado el opcflag de trabajar con obras) para p...
Clase parcial para listados, en esta definición se especificarán los métodos comunes para las demás c...
Definition: _clsListados.cs:61
static string _GetNombreEmpresa(string tcCodigoEmpresa="")
Obtiene el nombre de la empresa
virtual void btCapturar_Click(object sender, EventArgs e)
Listado de documentos. Se debe implementar la accion de aceptacion del formulario en cada formulario ...
static System.Drawing.Bitmap info_16
Busca un recurso adaptado de tipo System.Drawing.Bitmap.
Casilla numérica para mostrar el importe de los artículos
override void _Load()
Load del proveedor
Definition: Proveedor.cs:7998
bool _Control_FormaPago
Si se permite la declaración de forma de pago para poner en el documento destino
override void OnDivisaChanged()
Override del cambio de divisa
Clase de recurso fuertemente tipado, para buscar cadenas traducidas, etc.
KeyDiccionarioMascara
Clave para diccionario de máscaras
Clase de negocio Proveedor
Definition: Proveedor.cs:33
virtual DataTable _Refrescar_Datos_ExecuteListado(Listados toLis)
Devuelve el datatable de resultados formateado Este metodo se usa para formatear los resultados del l...
frmDocumentosPorProveedor(Listados loCabeceras, Listados loDetalles)
Consteructor con cabeceras y detalles como parametros
void _ShowFacturados(bool tlShow=true)
Muestra u oculta el label y los radios de la opción "Tipo de documentos" segun tlShow ...
Clase del objeto grid para Sage50
Definition: grid.cs:31
Clase para aplicar estilos a los ewlabel
Definition: clsEstilos.cs:752
virtual String _ReportFile
Nombre del fichero para el report
static bool EstaEnUsoElDocumento(dynamic documento)
Método que a partir de un documento tipado determina si esta en uso
Definition: EnUso.cs:267
eTipoDocumentoGeneral
Enumeración pública para definir las diferentes categorias que tenemos de documentos (ventas...
Definition: General.cs:13
override Point _CalcularLocationDatos()
Override del cálculo para resolver un desplazamiento
Clase de traducción de strings según idioma
Definition: Translate.cs:13
virtual DataTable _FiltrarDataTableCabeceras(DataTable toDatos)
Método virtual que nos servira para filtrar datos del datatable de cabeceras antes de asignarlas a la...
bool _Control_Operario
Si se permite la declaración de operario para poner en el documento destino
_DestinosTraspaso
Posibles documentos destino de traspaso tanto para ventas como para compras.
override void _Cargar_Datos()
Sobreescrivir el método para que además de las acciones de la base también ejecute el método _Refresc...
virtual Listados _Refrescar_Datos_Cargar_Opciones_Listado(Listados toList=null)
Metodo para cargar opciones especificas para el listado de cabeceras de cada tipo. Este metodo debe definirse en los formularios hijo de este formulario
virtual Listados _Refrescar_Detalle_Cargar_Opciones_Listado(Listados toList=null)
Método para cargar opciones especificas para el listado de detalles de cada tipo / cabecera seleccion...
Clase para configurar los parametros para realizar traspaso del documento origen (ventas/compras: ped...
virtual void _SuprimirDatos(ref DataTable tdtDatos)
Para suprimir la información en el listado
DataTable _Execute()
Ejecución del listado. Internamente llamara a _DataTable() que nos devolvera los datos, _SetColumnCaptions que nos establecera los nombres a mostrar de las columnas del listado y a _SetColumnMasks que establecera la mascara de las columnas que lo requieran
frmDocumentosPorProveedor(Listados loList)
Contructor con un solo listado como parametro que se utilizara como cabeceras y detalles ...
virtual void _Refrescar_Datos()
Método para refrescar los datos del grid según lo filtros seleccionados.
virtual void BtNavegar_Click(object sender, EventArgs e)
Botón de navegación
Proporciona características adicionales de las máscaras de Eurowin
Definition: clsEwBase.cs:6212
eTipoDocumento
Detalle los tipos de documento posibles de ventas y compras
Definition: docsvenenum.cs:32
Articulo _oArticulo
Objeto articulo
Dictionary< string, object > _Opciones
Diccionario con las posibles opciones que se pueda presentar el resultado de un listado Esta propieda...
new bool ReadOnly
Controla si se puede cambiar el texto en el control de edición. PE-76532 Si es de solo lectura se blo...
string _Mascara_Net
Máscara convertida en formato .Net
Definition: clsEwBase.cs:6235
Clase de negocio para la DIVISA (Moneda)
Definition: Divisa.cs:76
override void OnRefrescarClick()
Respuesta al evento de la base de click sobre el botón de refresco
void _ShowTraspasados(bool tlShow=true)
Muestra u oculta el label y los radios de la opción "Traspasados" segun tlShow
static sage.ew.functions.Translate _This
Instancia estática del objeto Translate
Definition: Translate.cs:23
bool _Control_Almacen
Si se permite la declaración de almacén para poner en el documento destino
Clase EnUso. PE-103176 Centralización de código para la gestión del KeyCopy de las clases que lo requ...
Definition: EnUso.cs:18