txtClienteDocVen.cs
1 using sage.ew.cliente;
2 using sage.ew.formul;
3 using sage.ew.global;
5 using sage.ew.interficies;
6 using sage.ew.objetos;
8 using System;
9 using System.ComponentModel;
10 using System.Data;
11 using System.Drawing;
12 using System.Windows.Forms;
13 
14 namespace sage.ew.docsven.UserControls
15 {
16  #region Enumeraciones
17 
21  public enum eTipoCliente
22  {
26  Empty,
30  Cliente,
35  }
36 
37  #endregion
38 
42  public partial class txtClienteDocVen : UserControl, IObjetoDocumento, IObjetoRefresh
43  {
44  // Busquem les dades del client
45  private Cliente _oCliente = null; // Optimización Task 132237
46  private FuturoCliente _oFuturoCliente = null; // Optimización Task 132237
47  private string _cClienteAnterior = string.Empty; // Bug 133430
48  private const string lcFont = "Segoe UI, 9.5pt";
49  private eTipoCliente eEsFuturoCliente = eTipoCliente.Empty;
50 
51  // Flag que nos permitirá seleccionar el cif con el mouse, útil si es más largo de 9 dígitos pues no cabrá todo en la casilla,
52  // y permitirá seleccionarlo (ahora el cif es un campo de anchura configurable y permite ancho hasta 30).
53  private bool flagSelCif = false;
54 
55  private bool _lOnCreateControl = false; // Indica que ha pasado por el OnCreateControl
56 
57  private Form _oForm = null;
58 
59  private Form _Form
60  {
61  get
62  {
63  if (_oForm == null) _oForm = FindForm();
64 
65  return _oForm;
66  }
67  }
68 
69  //private bool _lFuturo = false;
70 
75  bool EsFuturoCliente
76  {
77  get
78  {
79  RefreshTipoCliente();
80 
81  return (eEsFuturoCliente == eTipoCliente.ClientePotencial);
82  }
83  }
84 
88  private void RefreshTipoCliente()
89  {
90  if (EsDocumentoPresupuesto)
91  {
92  eTipoCliente leTipoCliente = this._oDocumento._Cabecera._Futuro ? eTipoCliente.ClientePotencial : eTipoCliente.Cliente;
93 
94  if (eEsFuturoCliente == eTipoCliente.Empty || leTipoCliente != eEsFuturoCliente)
95  {
96  bool llEsFuturo = this._oDocumento._Cabecera._Futuro;
97  if (!llEsFuturo && string.IsNullOrWhiteSpace(this._oDocumento._Cabecera._Futuro_Cliente) && string.IsNullOrWhiteSpace(this._oDocumento._Cabecera._Cliente) && !EW_GLOBAL._EsAsesorContable) // En un asesor contable no tenemos futuros clientes
98  {
99  llEsFuturo = true;
100  leTipoCliente = eTipoCliente.ClientePotencial;
101  }
102  ConfigurarCliente(llEsFuturo);
103  eEsFuturoCliente = leTipoCliente;
104  }
105  }
106  else
107  {
108  eEsFuturoCliente = eTipoCliente.Cliente;
109  this.txtFuturoCliente1.Enabled = this.txtFuturoCliente1.Visible = false;
110  }
111  }
112 
113  private void SubscribirEventosFoco()
114  {
115  txtCliente1._GetTextBox().Click += new EventHandler(txtCliente_Click);
116  txtFuturoCliente1._GetTextBox().Click += new EventHandler(txtCliente_Click);
117  }
118 
119  private void txtCliente_Click(object sender, EventArgs e)
120  {
121  if (_Form != null && _Form.ActiveControl != this) _Form.ActiveControl = this;
122  }
123 
124  #region PROPIETATS PUBLIQUES i CAMPS
125 
126  // PARTE 87680. Aplicar estilos
127  private bool _lAplicarEstilos = true;
128 
132  [
133  Category("Varios_Apariencia"),
134  DefaultValue(true),
135  Description("Aplicar estilos visuales al control."),
136  DisplayName("Aplicar estilos")
137  ]
138  public bool _AplicarEstilos
139  {
140  get
141  {
142  return _lAplicarEstilos;
143  }
144  set
145  {
146  _lAplicarEstilos = value;
147 
148  this.txtCliente1._AplicarEstilos = _lAplicarEstilos;
149  this.txtFuturoCliente1._AplicarEstilos = _lAplicarEstilos;
150 
151  this.ewlabelCodigo._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
152  this.ewlabelNombre._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
153  this.ewlabelDireccion._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
154  this.ewlabelCPostal._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
155  this.ewlabelProvincia._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
156  this.ewlabelCIF._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
157  this.ewlabelPoblacion._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
158  this.ewlabelTelefono._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
159 
160  this.btTelefonos1._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
161  this.btDirecciones1._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
162  this.btObservaciones._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos; // PE-79824
163 
164  this.ewtextboxCIF._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
165  this.ewtextboxNombre._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
166  this.ewtextboxDireccion._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
167  this.ewtextboxCPostal._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
168  this.ewtextboxPoblacion._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
169  this.ewtextboxProvincia._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
170  this.ewtextboxTelefono._PropiedadesDeEstilos._AplicarEstilos = _lAplicarEstilos;
171  this.txtEmail1._AplicarEstilos = _lAplicarEstilos; // PE-93053
172  }
173  }
174  // FPARTE 87680. Aplicar estilos
175 
179  private bool _bReadOnly = false;
180 
184  public bool _ReadOnly
185  {
186  get { return _bReadOnly; }
187  set
188  {
189  // PE-80965. Antes había if (_bReadOnly != value) no permitiendo cambiar los valores de los controles si eran diferentes de _bReadOnly
190  _bReadOnly = value;
191 
192  string tcCodigo = txtCliente1._Codigo;
193 
194  if (EsFuturoCliente) //PE97257
195  tcCodigo = txtFuturoCliente1._Codigo;
196 
197 
198  this.txtCliente1._ReadOnly = _bReadOnly;
199  this.txtFuturoCliente1._ReadOnly = _bReadOnly;
200 
202  bool lbHiHaClient = !string.IsNullOrWhiteSpace(tcCodigo) || _bReadOnly;
203  ewtextboxCIF.ReadOnly = lbHiHaClient;
204  //ewtextboxDireccion.ReadOnly = lbHiHaClient; //PE-95014: la dirección no es editable si no hay cliente puesto
205  ewtextboxTelefono.ReadOnly = lbHiHaClient;
206  txtEmail1._ReadOnly = lbHiHaClient; // PE-93053
207 
208  if (EsFuturoCliente) //PE97257
209  btDirecciones1.Enabled = btObservaciones.Enabled = false; // PE-101270
210  //else //PE-102876: siempre activos, no dependiendo del readonly, igual que en compras
211  // btDirecciones1.Enabled = btTelefonos1.Enabled = btObserva.Enabled = !value; // PE-79824
212  }
213  }
214 
215  private bool _bBloqueado = false;
219  public bool _Bloqueado
220  {
221  get { return _bBloqueado; }
222  set
223  {
224  _bBloqueado = value;
225 
226  btDirecciones1.Enabled = !_Bloqueado;
227  }
228  }
229 
230  private bool _lTactil = false;
234  public bool _Tactil
235  {
236  get { return _lTactil; }
237  set
238  {
239  _lTactil = value;
240 
241  // PE-74329. Asignar a todos los ewtextbox la propiedad tàctil
242  this.txtCliente1._Tactil = value;
243  this.txtFuturoCliente1._Tactil = value;
244  this.ewtextboxCIF._Tactil = value;
245  this.ewtextboxTelefono._Tactil = value;
246  this.btTelefonos1._Tactil = value;
247  this.btDirecciones1._Tactil = value;
248  this.btObservaciones._Tactil = value; // PE-79824
249  this.txtEmail1._Tactil = value; // PE-93053
250  }
251  }
252 
253  private bool _lVisible_CIF = true;
257  public bool _Visible_CIF
258  {
259  get { return _lVisible_CIF; }
260  set
261  {
262  _lVisible_CIF = value;
263  ReordenarControls();
264  }
265  }
266 
267  private bool _lVisible_Direccion = true;
271  public bool _Visible_Direccion
272  {
273  get { return _lVisible_Direccion; }
274  set
275  {
276  _lVisible_Direccion = value;
277  ReordenarControls();
278  }
279  }
280 
281  private bool _lVisible_CPostal = true;
285  public bool _Visible_CPostal
286  {
287  get { return _lVisible_CPostal; }
288  set
289  {
290  _lVisible_CPostal = value;
291  ReordenarControls();
292  }
293  }
294 
295  private bool _lVisible_Poblacion = true;
299  public bool _Visible_Poblacion
300  {
301  get { return _lVisible_Poblacion; }
302  set
303  {
304  _lVisible_Poblacion = value;
305  ReordenarControls();
306  }
307  }
308 
309  private bool _lVisible_Provincia = true;
313  public bool _Visible_Provincia
314  {
315  get { return _lVisible_Provincia; }
316  set
317  {
318  _lVisible_Provincia = value;
319  ReordenarControls();
320  }
321  }
322 
323  private bool _lVisible_Telefono = true;
327  public bool _Visible_Telefono
328  {
329  get { return _lVisible_Telefono; }
330  set
331  {
332  _lVisible_Telefono = value;
333  ReordenarControls();
334  }
335  }
336 
337  private bool _lVisible_Email = false;
341  public bool _Visible_Email
342  {
343  get { return _lVisible_Email; }
344  set
345  {
346  _lVisible_Email = value;
347  ReordenarControls();
348  }
349  }
350 
351  private int _nSeparacion = 7 ;
355  [
356  Bindable(false),
357  Category("Varios_Apariencia"),
358  DefaultValue(typeof(int), "7"),
359  Description("Separación vertical entre los controles de texto."),
360  Localizable(false),
361  DisplayName("Separación vertical")
362  ]
363  public int _Separacion
364  {
365  get { return _nSeparacion; }
366  set
367  {
368  _nSeparacion = value;
369  ReordenarControls();
370  }
371  }
372 
373  private dynamic _oDocumento;
377  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
378  public dynamic _Documento
379  {
380  get { return _oDocumento; }
381  set
382  {
383  _oDocumento = value;
384 
385  if (_oDocumento == null)
386  return;
387 
388  btDirecciones1._Documento = value;
389 
390  if (EsDocumentoDatosCliente)
391  DocumentoDatosCliente();
392  else
393  btTelefonos1._Documento = value;
394 
395  if (!EsDocumentoPresupuesto) // || _lRefresh) // No realizamos la asignación al cliente
396  txtCliente1._Documento = value;
397 
398  if (EsDocumentoDatosCliente)
399  Refresh(); // Refrescamos la información del cliente
400  else
401  DocumentoFuturoCliente();
402 
403  AssingInstanciasClientes();
404  }
405  }
406 
410  private void DocumentoDatosCliente()
411  {
412  if (_oCliente == null)
413  {
414  _oCliente = new Cliente();
415 
416  txtCliente1._Browser_Click_After += new ewtxtcodlabel.Delegar_Browser_After(txtCliente1__Browser_Click_After);
417  txtCliente1._Codigo_Cambiado += TxtCliente_DocumentoDatosCliente_Codigo_Cambiado;
418  }
419  }
420 
426  private void TxtCliente_DocumentoDatosCliente_Codigo_Cambiado()
427  {
428  Refresh();
429  }
430 
434  private bool EsDocumentoDatosCliente
435  {
436  get { return _oDocumento != null && _oDocumento is IDocumentoDatosCliente; }
437  }
438 
443  private bool EsDocumentoPresupuesto
444  {
445  get { return _oDocumento != null && !EsDocumentoDatosCliente && _oDocumento._TipoDocumento == eTipoDocumento.PresupuestoVenta; }
446  }
447 
451  private void DocumentoFuturoCliente()
452  {
453  if (EsDocumentoPresupuesto)
454  txtFuturoCliente1._Documento = _oDocumento;
455  }
456 
460  private void AssingInstanciasClientes()
461  {
462  if (EsDocumentoDatosCliente)
463  _oCliente = new Cliente(_oDocumento._Cliente);
464  else
465  {
466  _oCliente = _oDocumento._Cabecera._oCliente;
467 
468  if (EsDocumentoPresupuesto)
469  _oFuturoCliente = _oDocumento._Cabecera._oFuturo_Cliente;
470  }
471  }
472 
476  [
477  Bindable(false),
478  Category("Varios_Apariencia"),
479  DefaultValue(typeof(Color), "Red"),
480  Description("Color de fondo para la etiqueta 'Cliente con oferta'."),
481  Localizable(false),
482  DisplayName("Color fondo oferta")
483  ]
484  public Color _ColorFondoOferta
485  {
486  get { return _oColorFondoOferta; }
487  set { _oColorFondoOferta = lblOfertas.BackColor = value; }
488  }
489  private Color _oColorFondoOferta = Color.Red; //Bug 116467
490 
491  private bool _bOferta = false;
495  public bool _Oferta
496  {
497  get { return _bOferta; }
498  set
499  {
500  _bOferta = value;
501  if (!string.IsNullOrWhiteSpace(_TextoOferta) && _TextoOferta.Trim() != "CLIENTE CON OFERTAS")
502  lblOfertas.Visible = true;
503  else
504  lblOfertas.Visible = _bOferta;
505 
506  }
507  }
508 
509  private string _cTextoOferta = "";
513  public string _TextoOferta
514  {
515  get
516  {
517  return _cTextoOferta;
518  }
519  set
520  {
521  if (string.IsNullOrWhiteSpace(value)) //Per defecte vull q hi hagi aquest valor
522  _cTextoOferta = " CLIENTE CON OFERTAS ";
523  else
524  _cTextoOferta = value;
525 
526  _ColorTitolOferta();
527  lblOfertas.Text = _cTextoOferta;
528  }
529  }
530 
531  private string _cToolTipOferta = "";
532  private ToolTip _ttOferta = new ToolTip(); //tooltip oferta
536  public string _ToolTipOferta
537  {
538  get
539  {
540  return _cToolTipOferta;
541  }
542  set
543  {
544  _cToolTipOferta = value;
545  _ttOferta.SetToolTip(lblOfertas, value);
546  if (!string.IsNullOrWhiteSpace(value))
547  _ttOferta.Active = true;
548  else
549  _ttOferta.Active = false;
550 
551  }
552  }
553 
554 
558  [
559  Bindable(false),
560  Category("Varios_Apariencia"),
561  DefaultValue(typeof(Color), "White"),
562  Description("Color de la fuente para la etiqueta 'Cliente con oferta'."),
563  Localizable(false),
564  DisplayName("Color fuente oferta")
565  ]
566  public Color _ColorFuenteOferta
567  {
568  get { return _oColorFuenteOferta; }
569  set { _oColorFuenteOferta = lblOfertas.ForeColor = value; }
570  }
571  private Color _oColorFuenteOferta = Color.White; //Bug 116467
572 
576  [
577  Bindable(false),
578  Category("Varios_Apariencia"),
579  DefaultValue(typeof(Color), "Control"),
580  Description("Color del fondo del control."),
581  Localizable(false),
582  DisplayName("Color Fondo")
583  ]
584  public Color _BackColor
585  {
586  get { return base.BackColor; }
587  set { base.BackColor = value; }
588  }
589 
590  // PARTE 98428
591  private int _nAltoTitulo = 16;
595  [
596  Bindable(false),
597  Category("Varios_Apariencia"),
598  DefaultValue(16),
599  Description("Alto del título."),
600  Localizable(false),
601  DisplayName("Alto título")
602  ]
603  public int _AltoTitulo
604  {
605  get
606  {
607  return _nAltoTitulo;
608  }
609  set
610  {
611  if (value <= 0)
612  value = _nAltoTitulo;
613  else
614  {
615  _nAltoTitulo = value;
616 
617  // Actualizamos las dimensiones de un par de controles
618  lblCliente.Size = new Size(lblCliente.Width, _nAltoTitulo);
619  lblOfertas.Size = new Size(lblOfertas.Width, _nAltoTitulo);
620 
621  ReordenarControls();
622  }
623  }
624  }
625  // FPARTE 98428
626 
627  private Font _oFuenteEtiquetas = (Font)EW_GLOBAL._GetVariable("wfnt_fuente"); // PARTE 98428
631  [
632  Bindable(false),
633  Category("Varios_Apariencia"),
634  DefaultValue(typeof(Font), lcFont),
635  Description("Fuente para etiquetas."),
636  Localizable(false),
637  DisplayName("Fuente etiquetas")
638  ]
639  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
640  public Font _FuenteEtiquetas
641  {
642  get
643  {
644  return _oFuenteEtiquetas;
645  }
646  set
647  {
648  _oFuenteEtiquetas = value;
649  base.Font = value;
650 
651  foreach (Control loCtrl in this.Controls)
652  {
653  if (loCtrl.GetType() == typeof(sage.ew.objetos.ewlabel))
654  {
655  loCtrl.Font = _oFuenteEtiquetas;
656  }
657  }
658 
659  ReordenarControls();
660  }
661  }
662 
663  private Font _oFuenteTitulo = (Font)EW_GLOBAL._GetVariable("wfnt_fuente"); // PARTE 98428
667  [
668  Bindable(false),
669  Category("Varios_Apariencia"),
670  DefaultValue(typeof(Font), lcFont),
671  Description("Fuente para el título."),
672  Localizable(false),
673  DisplayName("Fuente título")
674  ]
675  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
676  public Font _FuenteTitulo
677  {
678  get
679  {
680  return _oFuenteTitulo;
681  }
682  set
683  {
684  _oFuenteTitulo = value;
685 
686  lblCliente.Font = lblOfertas.Font = _oFuenteTitulo;
687  lblCliente.Height = lblOfertas.Height = _oFuenteTitulo.Height;
688 
689  lblOfertas.Font = new Font(lblOfertas.Font, FontStyle.Bold);
690 
691  ReordenarControls();
692  }
693  }
694 
695  private Font _oFuenteTextos = (Font)EW_GLOBAL._GetVariable("wfnt_fuente"); // PARTE 98428
699  [
700  Bindable(false),
701  Category("Varios_Apariencia"),
702  DefaultValue(typeof(Font), lcFont),
703  Description("Fuente para textos."),
704  Localizable(false),
705  DisplayName("Fuente textos")
706  ]
707  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
708  public Font _FuenteTextos
709  {
710  get
711  {
712  return _oFuenteTextos;
713  }
714  set
715  {
716  _oFuenteTextos = value;
717 
718  foreach (Control loCtrl in this.Controls)
719  {
720  if (loCtrl.GetType() == typeof(sage.ew.objetos.ewtextbox))
721  {
722  loCtrl.Font = _oFuenteTextos;
723  }
724  if (loCtrl.GetType() == typeof(sage.ew.txtbox.UserControls.ewtxtcodlabel))
725  {
727  lotxtcodlabel._Font = _oFuenteTextos;
728  }
729  }
730 
731  ReordenarControls();
732  }
733  }
734 
735  private Color _oColorFuenteEtiquetas = SystemColors.WindowText;
739  [
740  Bindable(false),
741  Category("Varios_Apariencia"),
742  DefaultValue(typeof(Color), "WindowText"),
743  Description("Color de la fuente para etiquetas."),
744  Localizable(false),
745  DisplayName("Color fuente etiquetas")
746  ]
747  public Color _ColorFuenteEtiquetas
748  {
749  get
750  {
751  return _oColorFuenteEtiquetas;
752  }
753  set
754  {
755  _oColorFuenteEtiquetas = value;
756 
757  foreach (Control loCtrl in this.Controls)
758  {
759  if (loCtrl.GetType() == typeof(sage.ew.objetos.ewlabel))
760  {
761  loCtrl.ForeColor = _oColorFuenteEtiquetas;
762  }
763  }
764  }
765  }
766 
770  [
771  Bindable(false),
772  Category("Varios_Apariencia"),
773  DefaultValue(typeof(Color), "White"),
774  Description("Color de la fuente del título."),
775  Localizable(false),
776  DisplayName("Color fuente título")
777  ]
778  public Color _ColorFuenteTitulo
779  {
780  get { return _oColorFuenteTitulo; }
781  set
782  {
783  _oColorFuenteTitulo = lblCliente.ForeColor = value;
784  }
785  }
786  private Color _oColorFuenteTitulo = Color.White; //Bug 116467
787 
791  [
792  Bindable(false),
793  Category("Varios_Apariencia"),
794  DefaultValue(typeof(Color), "Gray"),
795  Description("Color del fondo del título."),
796  Localizable(false),
797  DisplayName("Color fondo título")
798  ]
799  public Color _ColorFondoTitulo
800  {
801  get { return _oColorFondoTitulo; }
802  set
803  {
804  _oColorFondoTitulo = lblCliente.BackColor = value;
805  }
806  }
807  private Color _oColorFondoTitulo = Color.Gray; //Bug 116467
808 
809  private Keys? lastPressedKey = null;
810 
811  #endregion
812 
817  {
818  InitializeComponent();
819 
820  _ttOferta.SetToolTip(lblOfertas, "");
821 
822  // PE-78304
823  if (txtCliente1._Hera)
824  {
825  txtCliente1._Clave = "CLIENTEERP";
826  txtCliente1._Browser_Clave = "CLIENTEERP";
827  txtCliente1._Browser_Campos = "CLIENTEERP,NOMBRE";
828  }
829  // FI PE-78304
830 
831  // PE-68541. Pinto el label cliente
832  _ColorTitolOferta(false);
833 
834  // PARTE 98428. Asignamos la fuente de los controles
835  if (Convert.ToBoolean(sage.ew.global.EW_GLOBAL._GetVariable("wl_designmode", true)) == false)
836  this.SetFontControls();
837 
838  btObservaciones.Image = images.Properties.Resources.observa_datos_16x16; // PARTE 88921. 98428 Asociamos una imagen para que se presente en el diseñador
839 
840  //PE-94684, dar vida a los botones de direcciones y telefonos
841  btDirecciones1._oEntidad = this._oCliente;
842  btTelefonos1._oEntidad = this._oCliente;
843 
844  // PARTE 103197
845  if (!this.DesignMode)
846  {
847  this.txtCliente1._CaracterAncho = 'X';
848  this.txtFuturoCliente1._CaracterAncho = 'X';
849 
850  this.txtCliente1._btMante._Click_After += new botones.btMante._Click_After_Handler(_btMante__Click_After);
851  this.txtFuturoCliente1._btMante._Click_After += new botones.btMante._Click_After_Handler(_btMante__Click_After);
852 
853  // Bug 146963. Capturar evento Before_Extended para controlar casos especiales de códigos de cliente / futuro cliente
854  this.txtCliente1._Codigo_Cambiado_Before_Extended += new ewtxtcodlabel.Delegar_Codigo_Cambiado_Before_Extended(txtCliente1_Codigo_Cambiado_Before_Extended);
855 
856  AnchoNif();
857  }
858  }
859 
863  private void AnchoNif()
864  {
865  object loAnchoNif = null;
866 
867  try
868  {
869  loAnchoNif = EW_GLOBAL._GetLenCampo(KeyDiccionarioLenCampos.wn_cif);
870  }
871  catch (Exception)
872  {
873  }
874 
875  if (loAnchoNif != null)
876  ewtextboxCIF.MaxLength = Convert.ToInt32(loAnchoNif);
877  }
878 
882  protected override void OnCreateControl()
883  {
884  _lOnCreateControl = true;
885 
886  if (EsDocumentoPresupuesto) // Ahora podemos asignar la instancia del documento
887  txtCliente1._Documento = _oDocumento;
888 
889  RefreshTipoCliente();
890  ReordenarControls();
891 
892  //Al entrar el campo que establezca el foco del Form, ya que sino al utilizar el Enter, el foco puede estar en otro control y no funciona correctamente
893  SubscribirEventosFoco();
894 
895  base.OnCreateControl();
896  }
897 
898  #region MÈTODES PRIVATS
899 
906  private void txtCliente1_Codigo_Cambiado_Before_Extended(object sender, string tcValorCandidato, ref bool tlOk)
907  {
908  if (this._oDocumento != null && !EsDocumentoDatosCliente && this._oDocumento._TipoDocumento == eTipoDocumento.PresupuestoVenta &&
909  this._oDocumento._Cabecera._Futuro && !string.IsNullOrWhiteSpace(this._oDocumento._Cabecera._Futuro_Cliente))
910  {
911 
912  if (functions.FUNCTIONS._Es_Cliente(tcValorCandidato))
913  tlOk = true;
914  else
915  tlOk = false;
916  }
917  }
918 
919  // PARTE 98428
923  private void SetFontControls()
924  {
925  String lcFuente = ((Font)EW_GLOBAL._GetVariable("wfnt_fuente")).Name.ToString();
926 
927  if (!string.IsNullOrWhiteSpace(lcFuente))
928  {
929  // Textboxs
930  this.ewtextboxCIF.Font = new System.Drawing.Font(lcFuente, 9F);
931  this.ewtextboxTelefono.Font = new System.Drawing.Font(lcFuente, 9F);
932  this.ewtextboxProvincia.Font = new System.Drawing.Font(lcFuente, 9F);
933  this.ewtextboxPoblacion.Font = new System.Drawing.Font(lcFuente, 9F);
934  this.ewtextboxCPostal.Font = new System.Drawing.Font(lcFuente, 9F);
935  this.ewtextboxDireccion.Font = new System.Drawing.Font(lcFuente, 9F);
936  this.ewtextboxNombre.Font = new System.Drawing.Font(lcFuente, 9F);
937  this.txtEmail1._Font = new System.Drawing.Font(lcFuente, 9.5F);
938 
939  // Labels
940  this.ewlabelCIF.Font = new System.Drawing.Font(lcFuente, 9.5F);
941  this.ewlabelTelefono.Font = new System.Drawing.Font(lcFuente, 9.5F);
942  this.ewlabelPoblacion.Font = new System.Drawing.Font(lcFuente, 9.5F);
943  this.ewlabelCPostal.Font = new System.Drawing.Font(lcFuente, 9.5F);
944  this.ewlabelDireccion.Font = new System.Drawing.Font(lcFuente, 9.5F);
945  this.ewlabelNombre.Font = new System.Drawing.Font(lcFuente, 9.5F);
946  this.ewlabelCodigo.Font = new System.Drawing.Font(lcFuente, 9.5F);
947  this.ewlabelEmail.Font = new System.Drawing.Font(lcFuente, 9.5F);
948  //this.lblOfertas.Font = new System.Drawing.Font(lcFuente, 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
949 
950  // Botones
951  this.btTelefonos1.Font = new System.Drawing.Font(lcFuente, 9.5F);
952  this.btDirecciones1.Font = new System.Drawing.Font(lcFuente, 9.5F);
953  this.btObservaciones.Font = new System.Drawing.Font(lcFuente, 9.5F);
954  }
955  }
956  // FPARTE 98428
957 
958  void _btBrowser__Click_Before(ref bool tlOk)
959  {
960  txtCliente1__Delegar_ProcessCmdKey(ref tlOk, Keys.F4);
961  }
962 
963  void _btMante__Click_Before(ref bool tlOk)
964  {
965  txtCliente1__Delegar_ProcessCmdKey(ref tlOk, Keys.F5);
966  }
967 
968  void txtCliente1__Delegar_ProcessCmdKey(ref bool tlOk, Keys keyData)
969  {
970  //PE103102 guardem el document ja que permetia convertir el client sense tenir en compte q estavem entrant un document
971  if ((keyData == Keys.F4|| keyData == Keys.F5) && !_oDocumento._Documento_Vacio())
972  _oDocumento._Save();
973 
974  //On F4 y F5 : Browser y Mante
975  if (((keyData == Keys.F4) || (keyData == Keys.F5)) && !EW_GLOBAL._EsAsesorContable) // PE-102816, 104355 . En un asesor contable no tenemsos futuros clientes
976  {
977  //Menu contextual de Clientes / Futuros clientes
978  ewcontextmenustrip loMenuContextual = new ewcontextmenustrip();
979 
980  // Borramos las diferentes opciones
981  loMenuContextual.Items.Clear();
982 
983  // Agregamos la gráfica de ventas
984  loMenuContextual.Items.Add("Clientes");
985  loMenuContextual.Items[0].Name = "Clientes";
986  loMenuContextual.Items[0].Click += new System.EventHandler(this.loMenuItemCli_Click);
987  loMenuContextual.Items[0].Select(); // PE-104355
988 
989  // Agregamos la gráfica de compras
990  loMenuContextual.Items.Add("Clientes potenciales");
991  loMenuContextual.Items[1].Name = "FuturosClientes";
992  loMenuContextual.Items[1].Click += new System.EventHandler(this.loMenuItemFut_Click);
993 
994  // Vamos a presentar el menu
995  loMenuContextual.Show(PointToScreen(this.txtCliente1.Location));
996 
997 
998  tlOk = false;
999  this.lastPressedKey = keyData;
1000  }
1001  else
1002  {
1003  tlOk = true;
1004  this.lastPressedKey = null;
1005  }
1006  }
1007 
1016  private void _ShowCliente()
1017  {
1018  if (EsDocumentoPresupuesto && txtCliente1.Visible && !txtFuturoCliente1.Visible)
1019  return;
1020 
1021  this.lblCliente.Text = "Cliente:";
1022 
1023  this.txtCliente1.Focus(); //poso el foco pq com anem jugant amb client i futur client
1024  this.txtCliente1.BringToFront();
1025 
1026  this.txtFuturoCliente1.Enabled = this.txtFuturoCliente1.Visible = false;
1027  this.txtCliente1.Enabled = this.txtCliente1.Visible = true;
1028 
1029  //Habilitem botons
1030  btDirecciones1.Enabled = btTelefonos1.Enabled = btObservaciones.Enabled = true;
1031 
1033  //if (this.txtCliente1.Visible && (!string.IsNullOrWhiteSpace(this._oCliente._Codigo)) && SendKeysTabFocoCliente())
1034  //{
1035  // // Enviem el foco al seguent control
1036  // //SendKeys.Send("{TAB}");
1037  //}
1038  }
1039 
1040 
1041  private void _ShowFuturoCliente()
1042  {
1043  this.lblCliente.Text = "Cliente potencial:";
1044 
1045  this.txtFuturoCliente1.Focus(); //poso el foco pq com anem jugant amb client i futur client
1046  this.txtFuturoCliente1.BringToFront();
1047 
1048  this.txtCliente1.Enabled = this.txtCliente1.Visible = false;
1049  this.txtFuturoCliente1.Enabled = this.txtFuturoCliente1.Visible = true;
1050 
1051  // PE-101270. Revisar estado de botones para clientes potenciales.
1052  btObservaciones.Enabled = false; // Sólo tienen observaciones para comunicados, no es necesario
1053  btDirecciones1.Enabled = false; // Sólo tienen una dirección, no es necesario
1054  //btTelefonos1.Enabled = true; // PE-101911. No se debe poder modificar
1055 
1056  // PE-101911. Si se muestra el control y el objeto tiene datos, forzamos un TAB
1057  if (this.txtFuturoCliente1.Visible && (!string.IsNullOrWhiteSpace(this._oFuturoCliente._Codigo)) && SendKeysTabFocoCliente())
1058  {
1059  // Enviem el foco al seguent control
1060  SendKeys.Send("{TAB}");
1061  }
1062  }
1063 
1068  private bool SendKeysTabFocoCliente()
1069  {
1070  if (EsDocumentoPresupuesto)
1071  return !string.IsNullOrWhiteSpace(_oDocumento._Numero);
1072  else
1073  return true;
1074  }
1075 
1081  void loMenuItemFut_Click(object sender, EventArgs e)
1082  {
1083  if (this.lastPressedKey == null)
1084  return;
1085 
1086  if (!_oDocumento._Documento_Vacio())
1087  _oDocumento._Save();
1088 
1089  this.txtFuturoCliente1.Enabled = this.txtFuturoCliente1.Visible = true;
1090 
1091  //if (!EsFuturoCliente)
1092  // this.txtCliente1.BringToFront();
1093 
1094  switch (this.lastPressedKey)
1095  {
1096  //Browser
1097  case Keys.F4:
1098  this.txtFuturoCliente1._btBrowser._Click_Before -= new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1099  txtFuturoCliente1._Browser_Click_After += new ewtxtcodlabel.Delegar_Browser_After(txtFuturoCliente1__Browser_Click_After);
1100  this.txtFuturoCliente1._btBrowser.PerformClick();
1101  this.txtFuturoCliente1._btBrowser._Click_Before += new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1102  txtFuturoCliente1._Browser_Click_After -= new ewtxtcodlabel.Delegar_Browser_After(txtFuturoCliente1__Browser_Click_After);
1103 
1104  break;
1105 
1106  //Mante
1107  case Keys.F5:
1108  this.txtFuturoCliente1._btMante._Click_Before -= new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1109  this.txtFuturoCliente1._btMante.PerformClick();
1110  this.txtFuturoCliente1._btMante._Click_Before += new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1111 
1112  //PE101264 - pot ser que no hi hagi linies pero q converteixi el futur client a client
1113  //com encara no esta guardada la capsalera pq no hi ha linies aleshores fem comprovació
1114  string lcCliente = this.txtFuturoCliente1._GetTextBox().Text;
1115 
1116  if (_oDocumento._Documento_Vacio() && !string.IsNullOrWhiteSpace(lcCliente))
1117  {
1118  using (FuturoCliente loCliPotTemp = new FuturoCliente(lcCliente))
1119  {
1120  if (!loCliPotTemp._Existe_Registro())
1121  {
1122  this._oFuturoCliente._Codigo = "";
1123  this.txtFuturoCliente1._GetTextBox().Text = this._oFuturoCliente._Codigo;
1124  this._ShowCliente();
1125  }
1126  }
1127  }
1128 
1129  break;
1130  }
1131 
1132  //ho restauro
1133  //if (!EsFuturoCliente)
1134  // this.txtFuturoCliente1.Enabled = this.txtFuturoCliente1.Visible = false;
1135 
1136  this.lastPressedKey = null;
1137  }
1138 
1139  void _btMante__Click_After()
1140  {
1141  if (EsDocumentoDatosCliente)
1142  Refresh(_oDocumento._Cliente);
1143  else
1144  {
1145  if (!this.EsFuturoCliente)
1146  {
1147  if (_oCliente != null) _oCliente._Reload();
1148  this.Refresh(!this.txtCliente1._Hera ? this._oDocumento._Cabecera._Cliente : this._oDocumento._Cabecera._ClienteERP, true);
1149  }
1150  else
1151  this.Refresh(this._oDocumento._Cabecera._Futuro_Cliente);
1152  }
1153  }
1154 
1155 
1156  void txtFuturoCliente1__Browser_Click_After(bool tlAceptar)
1157  {
1158  Refrescar_Informacion();
1159  }
1160 
1166  void loMenuItemCli_Click(object sender, EventArgs e)
1167  {
1168  if (this.lastPressedKey == null)
1169  return;
1170 
1171  if (!_oDocumento._Documento_Vacio())
1172  _oDocumento._Save();
1173 
1174  this.txtCliente1.Enabled = this.txtCliente1.Visible = true;
1175 
1176  //if (EsFuturoCliente)
1177  // this.txtFuturoCliente1.BringToFront();
1178 
1179  switch (this.lastPressedKey)
1180  {
1181  //Browser
1182  case Keys.F4:
1183  this.txtCliente1._btBrowser._Click_Before -= new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1184  this.txtCliente1._Browser_Click_After += new ewtxtcodlabel.Delegar_Browser_After(txtCliente1__Browser_Click_After);
1185  this.txtCliente1._btBrowser.PerformClick();
1186  this.txtCliente1._btBrowser._Click_Before += new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1187  this.txtCliente1._Browser_Click_After -= new ewtxtcodlabel.Delegar_Browser_After(txtCliente1__Browser_Click_After);
1188 
1189  break;
1190 
1191  //Mante
1192  case Keys.F5:
1193  this.txtCliente1._btMante._Click_Before -= new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1194  this.txtCliente1._btMante.PerformClick();
1195  this.txtCliente1._btMante._Click_Before += new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1196 
1197  break;
1198  }
1199 
1200  //ho restauro
1201  //if (EsFuturoCliente)
1202  // this.txtCliente1.Enabled = this.txtCliente1.Visible = false;
1203 
1204 
1205  this.lastPressedKey = null;
1206  }
1207 
1212  void txtCliente1__Browser_Click_After(bool tlAceptar)
1213  {
1214  Refrescar_Informacion();
1215  }
1216 
1220  private void SubscripcionEventosCliente()
1221  {
1222  if (eEsFuturoCliente == eTipoCliente.Empty)
1223  {
1224  txtCliente1._Codigo_Cambiado -= new ewtxtcodlabel.Delegar_Codigo_Cambiado(txtCliente1__Codigo_Cambiado);
1225  txtFuturoCliente1._Codigo_Cambiado -= new ewtxtcodlabel.Delegar_Codigo_Cambiado(txtFuturoCliente1__Codigo_Cambiado);
1226  txtCliente1._Codigo_Cambiado += new ewtxtcodlabel.Delegar_Codigo_Cambiado(txtCliente1__Codigo_Cambiado);
1227  txtFuturoCliente1._Codigo_Cambiado += new ewtxtcodlabel.Delegar_Codigo_Cambiado(txtFuturoCliente1__Codigo_Cambiado);
1228 
1229  txtFuturoCliente1._Codigo_Cambiado_Before -= new ewtxtcodlabel.Delegar_Codigo_Cambiado_Before(txtFuturoCliente1__Codigo_Cambiado_Before);
1230  txtFuturoCliente1._Codigo_Cambiado_Before += new ewtxtcodlabel.Delegar_Codigo_Cambiado_Before(txtFuturoCliente1__Codigo_Cambiado_Before);
1231 
1232  if (!EW_GLOBAL._EsAsesorContable) // En un asesor contable no tenemos futuroscliente no es necesario gestionar el F4 y F5 de clientes
1233  {
1234  txtCliente1._Delegar_ProcessCmdKey -= new txtbox.UserControls.txtCliente.Delegar_ProcessCmdKey(txtCliente1__Delegar_ProcessCmdKey);
1235  txtFuturoCliente1._Delegar_ProcessCmdKey -= new txtbox.UserControls.txtFuturoCliente.Delegar_ProcessCmdKey(txtCliente1__Delegar_ProcessCmdKey);
1236  txtCliente1._Delegar_ProcessCmdKey += new txtbox.UserControls.txtCliente.Delegar_ProcessCmdKey(txtCliente1__Delegar_ProcessCmdKey);
1237  txtFuturoCliente1._Delegar_ProcessCmdKey += new txtbox.UserControls.txtFuturoCliente.Delegar_ProcessCmdKey(txtCliente1__Delegar_ProcessCmdKey);
1238  }
1239 
1240  txtCliente1._btBrowser._Click_Before -= new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1241  txtFuturoCliente1._btBrowser._Click_Before -= new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1242  txtCliente1._btBrowser._Click_Before += new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1243  txtFuturoCliente1._btBrowser._Click_Before += new botones.btBrowser._Click_Before_Handler(_btBrowser__Click_Before);
1244 
1245  txtCliente1._btMante._Click_Before -= new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1246  txtFuturoCliente1._btMante._Click_Before -= new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1247  txtCliente1._btMante._Click_Before += new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1248  txtFuturoCliente1._btMante._Click_Before += new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
1249 
1250  txtCliente1._GetTextBox().Leave -= new EventHandler(txtClienteDocVen_Leave);
1251  txtCliente1._GetTextBox().Enter -= new EventHandler(txtClienteDocVen_Enter);
1252  txtFuturoCliente1._GetTextBox().Leave -= new EventHandler(txtFuturoCliente1_Leave);
1253  txtFuturoCliente1._GetTextBox().Enter -= new EventHandler(txtFuturoCliente1_Enter);
1254  txtCliente1._GetTextBox().Leave += new EventHandler(txtClienteDocVen_Leave);
1255  txtCliente1._GetTextBox().Enter += new EventHandler(txtClienteDocVen_Enter); // PE-101911. Capturar el valor inicial para comparar al Leave
1256  txtFuturoCliente1._GetTextBox().Leave += new EventHandler(txtFuturoCliente1_Leave);
1257  txtFuturoCliente1._GetTextBox().Enter += new EventHandler(txtFuturoCliente1_Enter); // PE-101911. Capturar el valor inicial para comparar al Leave
1258  }
1259  }
1260 
1264  private void ClearDataBindings()
1265  {
1266  txtCliente1.DataBindings.Clear();
1267  txtFuturoCliente1.DataBindings.Clear();
1268  }
1269 
1275  private void DataBindingsFuturoCliente()
1276  {
1277  // Bug 136108. Al asignar el binding a _Codigo dispara _Codigo_Cambiado() que a la vez hace una llamada recursiva a DataBindingsCliente(). Esto hace que se asigne 2 veces el binding.
1278  if (evitarbinding || (!_lOnCreateControl && EsDocumentoPresupuesto))
1279  return;
1280 
1281  evitarbinding = true;
1282 
1283  ClearDataBindings();
1284 
1285  txtFuturoCliente1.DataBindings.Add("_Codigo", _oDocumento._Cabecera, "_Futuro_Cliente");
1286 
1287  evitarbinding = false;
1288  }
1289 
1295  private void DataBindingsCliente()
1296  {
1297  // Bug 136108. Al asignar el binding a _Codigo dispara _Codigo_Cambiado() que a la vez hace una llamada recursiva a DataBindingsCliente(). Esto hace que se asigne 2 veces el binding.
1298  if (evitarbinding || (!_lOnCreateControl && EsDocumentoPresupuesto))
1299  return;
1300 
1301  evitarbinding = true;
1302 
1303  ClearDataBindings();
1304 
1305  if (EsDocumentoDatosCliente)
1306  txtCliente1.DataBindings.Add("_Codigo", _oDocumento, "_Cliente");
1307  else
1308  {
1309  if (txtCliente1._Hera)
1310  txtCliente1.DataBindings.Add("_Codigo", _oDocumento._Cabecera, "_ClienteERP");
1311  else
1312  txtCliente1.DataBindings.Add("_Codigo", _oDocumento._Cabecera, "_Cliente");
1313  }
1314 
1315  evitarbinding = false;
1316  }
1317  private bool evitarbinding = false;
1318 
1324  private void ConfigurarCliente(bool tlEsFuturoCliente = false)
1325  {
1326  SubscripcionEventosCliente();
1327 
1328  if (tlEsFuturoCliente) //Binding de futuro cliente
1329  {
1330  DataBindingsFuturoCliente();
1331  _ShowFuturoCliente(); //Canviem l'entorn a futur client
1332  }
1333  else
1334  {
1335  DataBindingsCliente();
1336  _ShowCliente(); //Canviem l'entorn a client
1337  }
1338  }
1339 
1344  private void ReordenarControls(int tnSeparacion = 0)
1345  {
1346  if (Created)
1347  {
1348  int lnTop;
1349  int lnSeparacion = tnSeparacion > 0 ? tnSeparacion : _nSeparacion; // PARTE 101784
1350 
1351  // PARTE 103197. Realizamos un pequeño control, a resoluciones pequeñas de 1024 no cabe el cliente
1352  int lnSizeCif = (this.Width < 340) ? 75 : 90;
1353 
1354  if (ewtextboxCIF.Width != lnSizeCif)
1355  ewtextboxCIF.Width = lnSizeCif; // El Size original es de 90,23
1356  // FPARTE 103197
1357 
1358  // Codi
1359  ewlabelCodigo.Top = lnSeparacion + lblCliente.Height + 4;
1360  txtCliente1.Top = lnSeparacion + lblCliente.Height;
1361  txtCliente1._Esconder_Label = true; // PE-79609
1362  txtCliente1.Width = ewlabelCIF.Left - txtCliente1.Left; // PE-79609
1363 
1364  //PE97257 - futur client
1365  txtFuturoCliente1.Top = txtCliente1.Top;
1366  txtFuturoCliente1._Esconder_Label = true;
1367  txtFuturoCliente1.Width = txtCliente1.Width;
1368 
1369 
1370  // CIF. Si no s'ha de mostrar el CIF no cal reposicionar res.
1371  ewtextboxCIF.Visible = _lVisible_CIF;
1372  ewlabelCIF.Visible = _lVisible_CIF;
1373  ewtextboxCIF.Top = lnSeparacion + lblCliente.Height;
1374  ewlabelCIF.Top = lnSeparacion + lblCliente.Height + 4;
1375  ewtextboxCIF.Left = this.ClientSize.Width - ewtextboxCIF.Width - 5;
1376  ewlabelCIF.Left = ewtextboxCIF.Left - ewlabelCIF.Width - 5;
1377  lnTop = ewtextboxCIF.Top + ewtextboxCIF.Height + lnSeparacion;
1378 
1379  // Nom
1380  ewlabelNombre.Top = lnTop + 4;
1381  ewtextboxNombre.Top = lnTop;
1382  btObservaciones.Top = lnTop; // PE-79824
1383  lnTop = ewtextboxNombre.Top + ewtextboxNombre.Height + lnSeparacion;
1384 
1385  // Dirección. Tampoc no caldrà redimensionar
1386  btDirecciones1.Visible = _lVisible_Direccion;
1387  ewlabelDireccion.Visible = _lVisible_Direccion;
1388  ewtextboxDireccion.Visible = _lVisible_Direccion;
1389  btDirecciones1.Top = lnTop;
1390  ewlabelDireccion.Top = lnTop + 4;
1391  ewtextboxDireccion.Top = lnTop;
1392  if (_lVisible_Direccion)
1393  lnTop = ewtextboxDireccion.Top + ewtextboxDireccion.Height + lnSeparacion;
1394 
1395  // Codi postal
1396  ewlabelCPostal.Visible = _lVisible_CPostal;
1397  ewtextboxCPostal.Visible = _lVisible_CPostal;
1398  ewlabelCPostal.Top = lnTop + 4;
1399  ewtextboxCPostal.Top = lnTop;
1400  if (!_lVisible_CPostal)
1401  {
1402  // Poso el label població al lloc del de codi postal i el textbox també
1403  ewlabelPoblacion.Left = ewlabelCPostal.Left;
1404  ewtextboxPoblacion.Left = ewtextboxCPostal.Left;
1405  }
1406  else
1407  {
1408  // Restauro la posició de la població
1409  ewlabelPoblacion.Left = ewtextboxCPostal.Left + ewtextboxCPostal.Width + 9;
1410  ewtextboxPoblacion.Left = ewlabelPoblacion.Left + ewlabelPoblacion.Width + 3;
1411  }
1412  ewtextboxPoblacion.Width = this.ClientSize.Width - ewtextboxPoblacion.Left - 5;
1413 
1414  // Població
1415  ewlabelPoblacion.Visible = _lVisible_Poblacion;
1416  ewtextboxPoblacion.Visible = _lVisible_Poblacion;
1417  ewlabelPoblacion.Top = lnTop + 4;
1418  ewtextboxPoblacion.Top = lnTop;
1419  if (_lVisible_Poblacion || _lVisible_CPostal)
1420  lnTop = lnTop + ewtextboxPoblacion.Height + lnSeparacion;
1421 
1422  // Provincia
1423  ewlabelProvincia.Visible = _lVisible_Provincia;
1424  ewtextboxProvincia.Visible = _lVisible_Provincia;
1425  ewlabelProvincia.Top = lnTop + 4;
1426  ewtextboxProvincia.Top = lnTop;
1427  if (!_lVisible_Provincia)
1428  {
1429  // Poso el label població al lloc del de codi postal i el textbox també
1430  ewlabelTelefono.Left = ewlabelProvincia.Left;
1431  ewtextboxTelefono.Left = ewtextboxProvincia.Left;
1432  // ewtextboxTelefono.Width = btTelefonos1.Left - ewtextboxTelefono.Left - 4; // PARTE 98428
1433  }
1434  else
1435  {
1436  // Restauro la posició de la població
1437  ewtextboxTelefono.Left = ClientSize.Width / 3 * 2;
1438  // ewtextboxTelefono.Width = ClientSize.Width - btTelefonos1.Width - ewtextboxTelefono.Left - 10; // PARTE 98428
1439  ewlabelTelefono.Left = ewtextboxTelefono.Left - ewlabelTelefono.Width - 2;
1440  ewtextboxProvincia.Width = ewlabelTelefono.Left - ewtextboxProvincia.Left - 10;
1441  }
1442 
1443  // PARTE 98428. Recolocamos el teléfono
1444  ewtextboxTelefono.Width = btTelefonos1.Left - ewtextboxTelefono.Left - 4;
1445 
1446  // Telèfon
1447  ewlabelTelefono.Visible = _lVisible_Telefono;
1448  ewtextboxTelefono.Visible = _lVisible_Telefono;
1449  btTelefonos1.Visible = _lVisible_Telefono;
1450  ewlabelTelefono.Top = lnTop + 4;
1451  ewtextboxTelefono.Top = lnTop;
1452  btTelefonos1.Top = lnTop;
1453  if (!_lVisible_Telefono)
1454  ewtextboxProvincia.Width = this.ClientSize.Width - ewtextboxProvincia.Left - 5;
1455 
1456  if (_lVisible_Provincia || _lVisible_Telefono)
1457  lnTop = lnTop + ewtextboxProvincia.Height + lnSeparacion;
1458 
1459  // eMail (PE-93053)
1460  ewlabelEmail.Visible = _lVisible_Email;
1461  txtEmail1.Visible = _lVisible_Email;
1462  ewlabelEmail.Top = lnTop + 4;
1463  txtEmail1.Top = lnTop;
1464  txtEmail1.Width = (this.Width - txtEmail1.Left); // PARTE 101784. Antes restaba 6
1465  if (_lVisible_Email)
1466  lnTop = lnTop + txtEmail1.Height + lnSeparacion;
1467 
1468  // PARTE 101784. Si estamos en la edición del perfil podemos asignar lo que el usuario crea conveniente
1469  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")) && !Convert.ToBoolean(EW_GLOBAL._EdicionPerfiles))
1470  {
1471  // TODO: En una versión posterior se debería de revisar para añadir otro control contenedor y no realizar el cálculo de la posición de cada control ...
1472  if ((tnSeparacion == 0) && lnTop > this.Height) // Dejamos una margen de 5 píxeles
1473  {
1474  // Tenemos 6 opciones posibles de ser visibles
1475  int lnOpciones = 2 + (_lVisible_Direccion ? 1 : 0) + ((_lVisible_Poblacion || _lVisible_CPostal) ? 1 : 0) + ((_lVisible_Provincia || _lVisible_Telefono) ? 1 : 0) + (_lVisible_Email ? 1 : 0);
1476 
1477  // Calculamos la diferencia de la separacion
1478  int lnDifSeparacion = ((lnTop - this.Height) / lnOpciones) + 1;
1479 
1480  if (lnDifSeparacion >= _nSeparacion) // No podemos tener una separación negativa o se solaparan los controles del Usercontrol, esto no lo podemos permitir
1481  lnDifSeparacion = _nSeparacion - 1;
1482 
1483  this.ReordenarControls(_nSeparacion - lnDifSeparacion);
1484  }
1485  }
1486  else
1487  {
1488  this.Height = lnTop;
1489  }
1490  }
1491  // FPARTE 101784
1492  }
1493 
1498  public void _Refresh()
1499  {
1500  Refresh();
1501  }
1502 
1506  private void Refresh(string tcCliente = "", bool tlReload = false)
1507  {
1508  if (!EsFuturoCliente) //PE97257
1509  {
1510  this._RefreshClient(tcCliente, tlReload);
1511 
1512  //Refresh contactes skype
1513  this.btTelefonos1._oEntidad = this._oCliente;
1514  this.btTelefonos1.Enabled = true;
1515  }
1516  else
1517  {
1518  this._RefreshFutClient(tcCliente);
1519 
1520  //Refresquem els contactes
1521  this.btTelefonos1._oEntidad = this._oFuturoCliente;
1522  this.btTelefonos1.Enabled = true;
1523  }
1524 
1525  //PE-102876: Si tenemos codigo de cliente, habilitamos los botones igual que en compras
1526  if (!string.IsNullOrWhiteSpace(_oCliente._Codigo))
1527  {
1528  this.btObservaciones.Enabled = true;
1529  this.btDirecciones1.Enabled = true;
1530  this.btTelefonos1.Enabled = true;
1531  }
1532 
1533  if (this.ParentForm != null)
1534  {
1535  // PE-74827
1536  // dynamic por que este control puede estar en formulario de mas de un tipo (formbase, formsatellite, formdialog, frmgestionperfil, ...) y aqui no sabemos
1537  // en qué tipo de formulario estamos, por tanto, para que funcione para todos hacemos ésto.
1538  // Lo normal será que estemos en un frmgestionperfil
1539  dynamic loForm = this.ParentForm;
1540 
1541  // Aqui dentro del método se hace todo, se revisa el _ReadOnly del formulario, y si es un frmgestionperfil además también se mira el _Documento, si está vacío, si está en uso, etc.
1542  bool llReadOnly = loForm._Controles_En_Formulario_De_Solo_Lectura();
1543 
1544  this._ReadOnly = llReadOnly;
1545 
1546  }
1547  }
1548 
1549 
1550  private void _RefreshClient(string tcCliente = "", bool tlReload = false)
1551  {
1552  bool llMismoCliente = true;
1553  bool lbCarregarEnvCli = false;
1554 
1555  //PE100191 - ho he de fer pq si introdueixes un client potencial, fas nuevo et prepara per un client normal i llavors no et refrescava el potencial
1556  if (!string.IsNullOrWhiteSpace(this.txtFuturoCliente1._Codigo) && string.IsNullOrWhiteSpace(tcCliente))
1557  _RefreshFutClient(tcCliente);
1558 
1559  // Sino nos llega cliente, lo intentamos obtener de la cabecera del documento
1560  if (string.IsNullOrWhiteSpace(tcCliente))
1561  {
1562  if (EsDocumentoDatosCliente)
1563  tcCliente = _oDocumento._Cliente;
1564  else
1565  {
1566  // PE-78304
1567  // Agafem el codi del client del document
1568  if (this.txtCliente1._Hera)
1569  tcCliente = _oDocumento._Cabecera._ClienteERP;
1570  else
1571  tcCliente = _oDocumento._Cabecera._Cliente;
1572  }
1573  // FI PE-78304
1574  }
1575 
1576  // Si aún no tenemos cliente, lo intentamos obtener del txtcodlabel asociado. Optimización Task 132237
1577  if (string.IsNullOrWhiteSpace(tcCliente) && !string.IsNullOrWhiteSpace(txtCliente1._Codigo))
1578  {
1579  tcCliente = txtCliente1._Codigo;
1580  llMismoCliente = false;
1581  }
1582 
1583  // Si aún no tenemos cliente o estamos descargando el documento, vaciar los datos mostrados y no hacer nada más. Optimización Task 132237
1584  if (string.IsNullOrWhiteSpace(tcCliente) || (!EsDocumentoDatosCliente && _Documento._DescarregantDocument))
1585  {
1586  _Vaciar();
1587  return;
1588  }
1589 
1590  if (EsDocumentoDatosCliente)
1591  {
1592  if (_Documento._Env_cli != 0)
1593  lbCarregarEnvCli = true;
1594  }
1595  else
1596  {
1597  // Carreguem l'adreça del document
1598  if (_Documento._Cabecera._Env_cli != 0)
1599  lbCarregarEnvCli = true;
1600  }
1601 
1602  //Bug 116467 Sino hay cliente reinicio possibles valores preexistente
1603  if (string.IsNullOrWhiteSpace(tcCliente))
1604  {
1605  _Oferta = false;
1606  _ColorTitolOferta(false);
1607  }
1608 
1609  // Refresquem el txtCodLabel Cliente
1610  if (txtCliente1._Codigo != tcCliente)
1611  txtCliente1._Codigo = tcCliente;
1612 
1613  // PE-78304
1614  if (this.txtCliente1._Hera)
1615  {
1616  // Sólo refrescar datos si se cambia de cliente. Optimización Task 132237
1617  string lcCodEquiv = _oCliente._Codigo_Equivalente_EW(tcCliente); // PARTE 106613
1618  if (_oCliente._Codigo != lcCodEquiv)
1619  {
1620  _oCliente._Codigo = lcCodEquiv;
1621  llMismoCliente = false;
1622  }
1623  }
1624  else
1625  {
1626  // Sólo refrescar datos si se cambia de cliente. Optimización Task 132237
1627  if (_oCliente._Codigo != tcCliente)
1628  {
1629  _oCliente._Codigo = tcCliente;
1630  llMismoCliente = false;
1631  }
1632  }
1633  // PE-78304
1634 
1635  // Comprobar si la información del cliente está vacía, hay algún caso en algún documento que no se ha cargado, forzamos a refrescar datos. Optimización Task 132237
1636  if (string.IsNullOrWhiteSpace(ewtextboxNombre.Text))
1637  llMismoCliente = false;
1638 
1639  // Bug 133430
1640  bool llContado = !EsDocumentoDatosCliente && _oCliente._Es_Contado() && _Documento != null && _Documento._Cabecera != null && _Documento._Cabecera._DatosContado != null && _Documento._Cabecera._DatosContado._Existe;
1641 
1642  // Sino se ha cambiado el cliente, no es necesario refrescar nada. Optimización Task 132237
1643  if (llMismoCliente && _cClienteAnterior == _oCliente._Codigo && !llContado && !tlReload) // Certificamos que el cliente es el mismo de último refresco
1644  return;
1645  // Bug 133430
1646 
1647  _cClienteAnterior = _oCliente._Codigo; // Bug 133430. Certificamos que el cliente es el mismo de último refresco
1648 
1649  // PE-74777
1650  // Rrefrescar datos de contado
1651  if (llContado) // Bug 133430
1652  {
1653  ewtextboxCIF.Text = _Documento._Cabecera._DatosContado._Cif;
1654  ewtextboxNombre.Text = _Documento._Cabecera._DatosContado._Nombre;
1655  ewtextboxDireccion.Text = _Documento._Cabecera._DatosContado._Direccion;
1656  ewtextboxCPostal.Text = _Documento._Cabecera._DatosContado._CodPost;
1657  ewtextboxPoblacion.Text = _Documento._Cabecera._DatosContado._Poblacion;
1658  ewtextboxProvincia.Text = _Documento._Cabecera._DatosContado._Provincia;
1659  ewtextboxTelefono.Text = _Documento._Cabecera._DatosContado._Telefono;
1660  txtEmail1._Web = _Documento._Cabecera._DatosContado._Email; // PE-93053
1661  }
1662  else
1663  {
1664  // Mostrem les dades de la taula clientes
1665  ewtextboxCIF.Text = _oCliente._NIF;
1666  ewtextboxNombre.Text = _oCliente._Nombre;
1667 
1668  if (lbCarregarEnvCli)
1669  {
1670  int lnEnv_cli = Env_cli_Documento();
1671 
1672  // Carreguem l'adreça de Env_Cli
1673  lbCarregarEnvCli = CarregaEnvCli(lnEnv_cli);
1674 
1675  if (string.IsNullOrWhiteSpace(ewtextboxTelefono.Text))
1676  {
1677  // PE-95052. Si no hi havia telèfon a l'adreça, Mostrem les dades de la taula telf_cli
1678  ewtextboxTelefono.Text = _oCliente._TelefonoPredeterminado();
1679  }
1680  }
1681 
1682  if (!lbCarregarEnvCli)
1683  {
1684  // Carreguem l'adreça del client
1685  ewtextboxDireccion.Text = _oCliente._Direccion;
1686  ewtextboxCPostal.Text = _oCliente._CodPost;
1687  ewtextboxPoblacion.Text = _oCliente._Poblacion;
1688  ewtextboxProvincia.Text = _oCliente._Provincia;
1689 
1690  // Mostrem les dades de la taula telf_cli
1691  ewtextboxTelefono.Text = _oCliente._TelefonoPredeterminado();
1692  }
1693 
1694  // Mostrar email del cliente (PE-93053)
1695  txtEmail1._Web = _oCliente._Email;
1696  }
1697  // FI PE-74777
1698 
1699  _RefreshOferta();
1700  }
1701 
1706  private int Env_cli_Documento()
1707  {
1708  int lnEnv_cli = 0;
1709 
1710  if (EsDocumentoDatosCliente)
1711  lnEnv_cli = _Documento._Env_cli;
1712  else
1713  lnEnv_cli = _Documento._Cabecera._Env_cli;
1714 
1715  return lnEnv_cli;
1716  }
1717 
1721  public void _RefreshOferta()
1722  {
1723  // PE-68541. Refrescar Oferta
1724  bool lbOferta = _oCliente._Oferta;
1725  _Oferta = lbOferta;
1726  _ColorTitolOferta(lbOferta);
1727 
1728  // Icono de observaciones (PE-79824)
1729  string lcObserva = _oCliente._Observaciones.Trim();
1730  if (!string.IsNullOrWhiteSpace(lcObserva))
1731  btObservaciones.Image = images.Properties.Resources.observa_con_datos_16x16; // PARTE 98428
1732  else
1733  btObservaciones.Image = images.Properties.Resources.observa_datos_16x16; // PARTE 98428
1734  }
1735 
1736 
1737  private void _RefreshFutClient(string tcCliente = "")
1738  {
1739  if (string.IsNullOrWhiteSpace(tcCliente))
1740  // Agafem el codi del futur client del document
1741 
1742  tcCliente = _oDocumento._Cabecera._Futuro_Cliente;
1743 
1744  // Refresquem el txtCodLabel de Futuro Cliente
1745  if (this.txtFuturoCliente1._Codigo != tcCliente)
1746  this.txtFuturoCliente1._Codigo = tcCliente;
1747 
1748  this._oFuturoCliente._Codigo = tcCliente;
1749 
1750  //Refresquem les dades del futur client al nostre usercontrol
1751  this._oFuturoCliente._Refresh();
1752  if (this._Documento != null && this._Documento._Cabecera._oFuturo_Cliente != null)
1753  this._Documento._Cabecera._oFuturo_Cliente._Refresh();
1754 
1755  // Refrescar datos
1756  ewtextboxCIF.Text = Convert.ToString(this._oFuturoCliente._Campo("cif"));
1757  ewtextboxNombre.Text = this._oFuturoCliente._Nombre;
1758  ewtextboxDireccion.Text = Convert.ToString(this._oFuturoCliente._Campo("direccion"));
1759  ewtextboxCPostal.Text = Convert.ToString(this._oFuturoCliente._Campo("codpost"));
1760  ewtextboxPoblacion.Text = Convert.ToString(this._oFuturoCliente._Campo("poblacion"));
1761  ewtextboxProvincia.Text = Convert.ToString(this._oFuturoCliente._Campo("provincia"));
1762  ewtextboxTelefono.Text = Convert.ToString(this._oFuturoCliente._Campo("telefono"));
1763  txtEmail1._Web = Convert.ToString(this._oFuturoCliente._Campo("email"));
1764 
1765  //Refrescar Oferta -> futurs clients no en tenen
1766  bool lbOferta = false;
1767  _Oferta = lbOferta;
1768  _ColorTitolOferta(lbOferta);
1769  }
1770 
1775  private void _ColorTitolOferta(bool tbOferta = false)
1776  {
1777  if (tbOferta || (!string.IsNullOrWhiteSpace(_TextoOferta) && _TextoOferta.Trim() != "CLIENTE CON OFERTAS"))
1778  {
1779  //Bug 116467
1780  this.lblCliente.ForeColor = _ColorFuenteOferta; // lblOfertas.ForeColor;
1781  this.lblCliente.BackColor = _ColorFondoOferta; //lblOfertas.BackColor;
1782  }
1783  else
1784  {
1785  this.lblCliente.ForeColor = _ColorFuenteTitulo;
1786  this.lblCliente.BackColor = _ColorFondoTitulo;
1787  }
1788  }
1789 
1790  #endregion
1791 
1792 
1793  #region EVENTS
1794  private void txtClienteDocVen_SizeChanged(object sender, EventArgs e)
1795  {
1796  ReordenarControls();
1797  }
1798  #endregion
1799 
1800  private void btDirecciones1__Click_Before(ref Boolean tlOk)
1801  {
1802  if (this._Documento == null)
1803  tlOk = false;
1804  }
1805 
1806  private void btDirecciones1__Click_After(DataRow toRowSel)
1807  {
1808  if (toRowSel == null)
1809  return;
1810 
1811  if (EsDocumentoDatosCliente)
1812  _Documento._Env_cli = Convert.ToInt16(toRowSel["linea"]);
1813  else
1814  _Documento._Cabecera._Env_cli = Convert.ToInt16(toRowSel["linea"]);
1815 
1816  CarregaEnvCli(toRowSel);
1817  }
1818 
1819  private void CarregaEnvCli(DataRow toRowEnvCli)
1820  {
1821  // Assigno la línia al document
1822  ewtextboxDireccion.Text = toRowEnvCli["direccion"] as string;
1823  ewtextboxCPostal.Text = toRowEnvCli["codpos"] as string;
1824  ewtextboxPoblacion.Text = toRowEnvCli["poblacion"] as string;
1825  ewtextboxProvincia.Text = toRowEnvCli["provincia"] as string;
1826 
1827  // PE-95052. Si en la dirección hay teléfono, lo asignamos
1828  string lcTelefono = toRowEnvCli["telefono"].ToString();
1829  if (!string.IsNullOrWhiteSpace(lcTelefono))
1830  ewtextboxTelefono.Text = lcTelefono;
1831  else
1832  ewtextboxTelefono.Text = _oCliente._TelefonoPredeterminado();
1833 
1834  //PE-87027
1835  if(Convert.ToBoolean(EW_GLOBAL._GetVariable("WL_SOLCODPOST")) && !EsDocumentoDatosCliente)
1836  {
1837  String lcCodPost = Convert.ToString(toRowEnvCli["codpos"]).Trim();
1838  if (!String.IsNullOrEmpty(lcCodPost) && _oDocumento != null && _oDocumento._Cabecera != null ) _oDocumento._Cabecera._CPostal = lcCodPost;
1839  }
1840 
1841  }
1842 
1843  private bool CarregaEnvCli(int tnLinia)
1844  {
1845  string lcCliente = "";
1846 
1847  // PE-78304
1848  if (txtCliente1._Hera)
1849  {
1850  Cliente loCli = new Cliente();
1851  loCli._ClienteERP = txtCliente1._Codigo;
1852  lcCliente = loCli._Codigo_Equivalente_EW(txtCliente1._Codigo); // PARTE 106613
1853  }
1854  else
1855  lcCliente = txtCliente1._Codigo;
1856  // FI PE-78304
1857 
1858  // Busco l'adreça d'enviament
1859  DataTable ldtEnvCli = new DataTable();
1860  db.DB.SQLExec(" Select * " +
1861  " From " + db.DB.SQLDatabase("Env_Cli") +
1862  " Where Cliente=" + db.DB.SQLString(lcCliente) +
1863  " And Linea=" + db.DB.SQLString(tnLinia), ref ldtEnvCli);
1864  if (ldtEnvCli != null && ldtEnvCli.Rows.Count > 0)
1865  {
1866  CarregaEnvCli(ldtEnvCli.Rows[0]);
1867  return true;
1868  }
1869  else
1870  return false;
1871  }
1872 
1873  private void btTelefonos1__Click_Before(ref bool tlOk)
1874  {
1875  if (this._Documento == null)
1876  tlOk = false;
1877  }
1878 
1879 
1883  private void txtCliente1__Codigo_Cambiado()
1884  {
1885  if (!string.IsNullOrWhiteSpace(this.txtCliente1._Codigo))
1886  {
1887  if (!EsFuturoCliente)
1888  {
1889  this.txtFuturoCliente1._Codigo = "";
1890 
1891  if (EsDocumentoPresupuesto)
1892  _oDocumento._Cabecera._Futuro_Cliente = "";
1893  }
1894  }
1895  }
1896 
1900  private void txtFuturoCliente1__Codigo_Cambiado()
1901  {
1902  if (!string.IsNullOrWhiteSpace(this.txtFuturoCliente1._Codigo))
1903  this.txtCliente1._Codigo = "";
1904  }
1905 
1911  private bool _ValidarDocumento(ref bool tlOk)
1912  {
1913  //Validamos que haya número de documento
1914  if (tlOk && (_oDocumento == null || string.IsNullOrWhiteSpace(_oDocumento._Numero)))
1915  {
1916  functions.FUNCTIONS._MessageBox("Para poder entrar el código de cliente debe haber entrado el número de documento.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, (FormBase)this.FindForm());
1917  tlOk = false;
1918  }
1919  return tlOk;
1920  }
1921 
1922  // PE-101911. Capturar el valor inicial para comparar al Leave
1923  void txtClienteDocVen_Enter(object sender, EventArgs e)
1924  {
1925  txtCliente1._GetTextBox().Tag = txtCliente1._GetTextBox().Text;
1926  }
1927 
1935  void txtClienteDocVen_Leave(object sender, EventArgs e)
1936  {
1937  // PE-101911. Si no se ha cambiado nada, no validar. A veces se queda en un bucle y no hay forma de salir del formulario
1938  if(txtCliente1._GetTextBox().Text != txtCliente1._GetTextBox().Tag.ToString())
1939  this.Refrescar_Informacion_Cliente();
1940  }
1941 
1942  // PE-101911. Capturar el valor inicial para comparar al Leave
1943  void txtFuturoCliente1_Enter(object sender, EventArgs e)
1944  {
1945  txtFuturoCliente1._GetTextBox().Tag = txtFuturoCliente1._GetTextBox().Text;
1946  }
1947 
1953  void txtFuturoCliente1_Leave(object sender, EventArgs e)
1954  {
1955  // PE-101911. Si no se ha cambiado nada, no validar. A veces se queda en un bucle y no hay forma de salir del formulario
1956  if (txtFuturoCliente1._GetTextBox().Text != txtFuturoCliente1._GetTextBox().Tag.ToString())
1957  this.Refrescar_Informacion_Cliente_Potencial();
1958  }
1959 
1966  private void txtCliente1__Codigo_Cambiado_Before(ref bool tlOk)
1967  {
1968  this.flagSelCif = false;
1969  this._ValidarDocumento(ref tlOk);
1970  }
1971 
1978  private void txtFuturoCliente1__Codigo_Cambiado_Before(ref bool tlOk)
1979  {
1980  this.flagSelCif = false;
1981  //Validem documentf
1982  this._ValidarDocumento(ref tlOk);
1983  }
1984 
1985  private void ewtextboxCIF_TextChanged(object sender, EventArgs e)
1986  {
1987  this.flagSelCif = false;
1988  }
1989 
1990 
1991  private void ewtextboxCIF_Enter(object sender, EventArgs e)
1992  {
1993  ewtextboxCIF.Tag = ewtextboxCIF.Text;
1994 
1995  // PE-101911. Puede que sea un futuro cliente
1996  string lcCodigo = txtCliente1._Codigo;
1997  if (EsFuturoCliente) //PE97257
1998  lcCodigo = txtFuturoCliente1._Codigo;
1999 
2000  // Si no hi ha codi de client, habilitem el CIF
2001  if (!string.IsNullOrWhiteSpace(lcCodigo) && this.flagSelCif == false)
2002  {
2003  // Enviem el foco al seguent control
2004  SendKeys.Send("{TAB}");
2005 
2006  this.flagSelCif = true;
2007  }
2008  }
2009 
2010  private void ewtextboxCIF_Leave(object sender, EventArgs e)
2011  {
2012  // Caso de que el CIF ocupe mas de 15 no cabe en el control y al quedar automaticamente seleccionado si no se
2013  // deselecciona queda visible la parte de la derech.
2014  ewtextboxCIF.Select(0, 0);
2015 
2016  if (ewtextboxCIF.Tag.ToString() == ewtextboxCIF.Text)
2017  return;
2018 
2019  bool llPresentarCif = false;
2020 
2021  if (EsDocumentoDatosCliente || _oDocumento._TipoDocumento != eTipoDocumento.PresupuestoVenta)
2022  llPresentarCif = string.IsNullOrWhiteSpace(txtCliente1._Codigo) && !string.IsNullOrWhiteSpace(ewtextboxCIF.Text);
2023  else
2024  llPresentarCif = (string.IsNullOrWhiteSpace(txtCliente1._Codigo) || string.IsNullOrWhiteSpace(txtFuturoCliente1._Codigo)) && !string.IsNullOrWhiteSpace(ewtextboxCIF.Text);
2025 
2026  // Si no hi ha client
2027  if (llPresentarCif)
2028  {
2029  // Busquem el codi del client
2030  DataTable ldtClientes = new DataTable();
2031  DataRow ldrSel = null;
2032  string lcCif = ewtextboxCIF.Text.Trim();
2033 
2034  if (EsDocumentoDatosCliente || _oDocumento._TipoDocumento != eTipoDocumento.PresupuestoVenta || EW_GLOBAL._EsAsesorContable) // En un asesor contable no tenemos futuros cliente, realizaremos la misma consulta que en el resto de documentos
2035  db.DB.SQLExec(" Select codigo,nombre,cif, 0 as futuro " +
2036  " From " + db.DB.SQLDatabase("clientes") +
2037  " Where upper(CIF) Like '" + lcCif.ToUpper() + "%'"
2038  , ref ldtClientes);
2039  else
2040  db.DB.SQLExec(" Select codigo,nombre,cif, 0 as futuro " +
2041  " From " + db.DB.SQLDatabase("clientes") +
2042  " Where upper(CIF) Like '" + lcCif.ToUpper() + "%'" +
2043  " union all " +
2044  " Select str(codigo) as codigo, nombre, cif, 1 as futuro " +
2045  " From " + db.DB.SQLDatabase("prclient") +
2046  " Where upper(CIF) Like '" + lcCif.ToUpper() + "%'"
2047  , ref ldtClientes);
2048 
2049  if (ldtClientes != null && ldtClientes.Rows.Count > 0)
2050  {
2051  // Si el código és el de un cliente, se utiliza directamente.
2052  if (ldtClientes.Rows.Count == 1 && ldtClientes.Rows[0].Field<string>("cif").Trim() == lcCif)
2053  {
2054  // S'ha seleccionat un client
2055  if (EsDocumentoDatosCliente)
2056  _oDocumento._Cliente = ldtClientes.Rows[0].Field<string>("codigo");
2057  else
2058  {
2059  if (_oDocumento._TipoDocumento != eTipoDocumento.PresupuestoVenta)
2060  _oDocumento._Cabecera._Cliente = ldtClientes.Rows[0].Field<string>("codigo");
2061  else
2062  {
2063  _oDocumento._Cabecera._Futuro = Convert.ToBoolean(ldtClientes.Rows[0]["futuro"]);
2064  if (Convert.ToBoolean(ldtClientes.Rows[0]["futuro"]))
2065  _oDocumento._Cabecera._Futuro_Cliente = ldtClientes.Rows[0]["codigo"].ToString();
2066  else
2067  _oDocumento._Cabecera._Cliente = ldtClientes.Rows[0]["codigo"].ToString();
2068  }
2069  }
2070  _Refresh();
2071  }
2072  else
2073  {
2074  // Mostrar formulario de selección
2075  formul.Forms.Seleccionar frmSel = new formul.Forms.Seleccionar();
2076  frmSel._DataTable = ldtClientes;
2077  frmSel._Titulo = "Clientes relacionados con el CIF " + lcCif;
2078  frmSel.Height = 500;
2079  frmSel.Width = 600;
2080 
2081  if (_Tactil)
2082  frmSel._TipoFormulario = formul._TiposFormulario.Tactil;
2083 
2084  if (ldtClientes.Rows.Count == 0)
2085  frmSel._Boto_Aceptar = false;
2086 
2087 
2088  frmSel._DataTable.Columns["cif"].Caption = "CIF";
2089  frmSel._DataTable.Columns["cif"].ExtendedProperties["Mayusc"] = true;
2090  frmSel._DataTable.Columns["futuro"].ExtendedProperties["NoVisible"] = true;
2091 
2092  frmSel._ShowDialog(); //Bug 114218 Cambiar .ShowDialog() por ._ShowDialog()
2093  if (frmSel.DialogResult == DialogResult.OK)
2094  {
2095  ldrSel = frmSel._DataRowSelect;
2096  }
2097 
2098  frmSel = null;
2099 
2100  if (ldrSel != null)
2101  {
2102  if (EsDocumentoDatosCliente)
2103  _oDocumento._Cliente = Convert.ToString(ldrSel["codigo"]);
2104  else
2105  {
2106  // S'ha seleccionat un client
2107  if (_oDocumento._TipoDocumento != eTipoDocumento.PresupuestoVenta)
2108  _oDocumento._Cabecera._Cliente = Convert.ToString(ldrSel["codigo"]);
2109  else
2110  {
2111  _oDocumento._Cabecera._Futuro = Convert.ToBoolean(ldrSel["futuro"]);
2112  if (Convert.ToBoolean(ldrSel["futuro"]))
2113  _oDocumento._Cabecera._Futuro_Cliente = Convert.ToString(ldrSel["codigo"]);
2114  else
2115  _oDocumento._Cabecera._Cliente = Convert.ToString(ldrSel["codigo"]);
2116  }
2117  }
2118  _Refresh();
2119  }
2120  else
2121  {
2122  ewtextboxCIF.Text = "";
2123  ewtextboxCIF.Focus();
2124  }
2125  }
2126  }
2127  else
2128  {
2129  //PE-95014: Si no se encuentra el NIF entonces mostramos un MessageBox
2130  sage.ew.functions.FUNCTIONS._MessageBox("No existe ningún cliente que contenga este CIF.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK);
2131  ewtextboxCIF.Text = "";
2132  }
2133  }
2134  }
2135 
2136  private void ewtextboxTelefono_Enter(object sender, EventArgs e)
2137  {
2138  ewtextboxTelefono.Tag = ewtextboxTelefono.Text;
2139 
2140  // PE-101911. Puede que sea un futuro cliente
2141  string lcCodigo = CodigoCliente();
2142 
2143  // Si no hi ha codi de client, habilitem el CIF
2144  if (!string.IsNullOrWhiteSpace(lcCodigo))
2145  // Enviem el foco al seguent control
2146  SendKeys.Send("{TAB}");
2147  }
2148 
2154  private string CodigoCliente()
2155  {
2156  if (EsFuturoCliente) //PE97257
2157  return txtFuturoCliente1._Codigo;
2158  else
2159  return txtCliente1._Codigo;
2160  }
2161 
2168  private DataTable ConsultarTelefonosCliente(string tcTelefono)
2169  {
2170  DataTable ldtClientes = new DataTable();
2171  string lcSql;
2172 
2173  if (EsDocumentoDatosCliente || _oDocumento._TipoDocumento != eTipoDocumento.PresupuestoVenta || EW_GLOBAL._EsAsesorContable) // En un asesor contable no tenemos futuros clientes
2174  lcSql = " Select c.codigo,c.nombre,t.telefono,t.observa as texto, 0 as futuro " +
2175  " From " + db.DB.SQLDatabase("clientes") + " c " +
2176  " Inner Join " + db.DB.SQLDatabase("contlf_cli") + " t On c.codigo = t.cliente " +
2177  " Where t.telefono Like '" + tcTelefono + "%'";
2178  else
2179  {
2180  lcSql = " Select c.codigo,c.nombre,t.telefono,t.observa as texto, 0 as futuro " +
2181  " From " + db.DB.SQLDatabase("clientes") + " c " +
2182  " Inner Join " + db.DB.SQLDatabase("contlf_cli") + " t On c.codigo = t.cliente " +
2183  " Where t.telefono Like '" + tcTelefono + "%'" +
2184  " union all " +
2185  " Select str(codigo) as codigo, nombre, telefono,'Teléfono' as texto, 1 as futuro " +
2186  " From " + db.DB.SQLDatabase("prclient") +
2187  " Where telefono Like '" + tcTelefono + "%'";
2188  }
2189 
2190  db.DB.SQLExec(lcSql, ref ldtClientes);
2191 
2192  return ldtClientes;
2193  }
2194 
2200  private void AsignarClienteDocumento(string tcCliente, bool tlFuturo)
2201  {
2202  if (EsDocumentoDatosCliente)
2203  _oDocumento._Cliente = tcCliente;
2204  else
2205  {
2206  if (_oDocumento._TipoDocumento != eTipoDocumento.PresupuestoVenta)
2207  _oDocumento._Cabecera._Cliente = tcCliente;
2208  else
2209  {
2210  _oDocumento._Cabecera._Futuro = tlFuturo;
2211 
2212  if (tlFuturo)
2213  _oDocumento._Cabecera._Futuro_Cliente = tcCliente;
2214  else
2215  _oDocumento._Cabecera._Cliente = tcCliente;
2216  }
2217  }
2218 
2219  _Refresh();
2220  }
2221 
2227  private void ewtextboxTelefono_Leave(object sender, EventArgs e)
2228  {
2229  if (ewtextboxTelefono.Tag.ToString() == ewtextboxTelefono.Text)
2230  {
2231  // Anteriormente se realizaba un return, pero para poder pasar el foco al siguiente control si se ha pulsado enter no queda más remedio...
2232  if (string.IsNullOrWhiteSpace(CodigoCliente())) // Si no hay código de cliente en el GotFocus del teléfono no habrá realizado el SendKeys --> Tab y no pasará el foco al siguiente control si hemos pulsado enter
2233  SendKeys.Send("{TAB}");
2234  }
2235  else
2236  {
2237  // Si no hi ha client
2238  if (string.IsNullOrWhiteSpace(txtCliente1._Codigo) && !string.IsNullOrWhiteSpace(ewtextboxTelefono.Text))
2239  {
2240  // Busquem el codi del client
2241  string lcTelefon = ewtextboxTelefono.Text.Trim();
2242  DataTable ldtClientes = ConsultarTelefonosCliente(lcTelefon);
2243  DataRow ldrSel = null;
2244 
2245  if (ldtClientes != null && ldtClientes.Rows.Count > 0)
2246  {
2247  // Si el código és el de un cliente, se utiliza directamente.
2248  if (ldtClientes.Rows.Count == 1 && ldtClientes.Rows[0].Field<string>("telefono").Trim() == lcTelefon)
2249  AsignarClienteDocumento(ldtClientes.Rows[0].Field<string>("codigo"), Convert.ToBoolean(ldtClientes.Rows[0]["futuro"]));
2250  else
2251  {
2252  // Mostrar formulario de selección
2253  formul.Forms.Seleccionar frmSel = new formul.Forms.Seleccionar();
2254  frmSel._DataTable = ldtClientes;
2255  frmSel._Titulo = "Clientes relacionados con el teléfono " + lcTelefon;
2256  frmSel.Height = 500;
2257  frmSel.Width = 600;
2258 
2259  if (_Tactil)
2260  frmSel._TipoFormulario = formul._TiposFormulario.Tactil;
2261 
2262  frmSel._DataTable.Columns["futuro"].ExtendedProperties["NoVisible"] = true;
2263 
2264  frmSel._ShowDialog(); //Bug 114218 Cambiar .ShowDialog() por ._ShowDialog()
2265  if (frmSel.DialogResult == DialogResult.OK)
2266  ldrSel = frmSel._DataRowSelect;
2267 
2268  frmSel = null;
2269 
2270  if (ldrSel != null)
2271  AsignarClienteDocumento(Convert.ToString(ldrSel["codigo"]), Convert.ToBoolean(ldrSel["futuro"]));
2272  else
2273  PasarFocoTelefono();
2274  }
2275  }
2276  else
2277  {
2278  //PE-95014: En caso que no exista el teléfono mostrar un mensaje
2279  functions.FUNCTIONS._MessageBox("No existe ningún cliente que contenga este Teléfono", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, DialogResult.OK);
2280  ewtextboxTelefono.Tag = "";
2281  PasarFocoTelefono();
2282  }
2283  }
2284  }
2285  }
2286 
2290  private void PasarFocoTelefono()
2291  {
2292  ewtextboxTelefono.Text = "";
2293  ewtextboxTelefono.Focus();
2294  }
2295 
2301  private void btObserva_Click(object sender, EventArgs e)
2302  {
2303  if (_oCliente == null || !_oCliente._Show_Observaciones())
2304  functions.FUNCTIONS._MessageBox("El cliente no tiene observaciones asignadas.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, (FormBase)this.FindForm());
2305  }
2306 
2310  private void Refrescar_Informacion()
2311  {
2312  if (EsFuturoCliente)
2313  Refrescar_Informacion_Cliente_Potencial();
2314  else
2315  Refrescar_Informacion_Cliente();
2316  }
2317 
2323  private void Refrescar_Informacion_Cliente(string tcCliente)
2324  {
2325  this.txtCliente1._GetTextBox().Text = this._oCliente._Codigo;
2326 
2327  if (!string.IsNullOrWhiteSpace(tcCliente))
2328  {
2329  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
2330  {
2331  this.txtCliente1._btMante._Click_Before -= new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
2332  if (this.txtCliente1._Existe_Codigo(ref tcCliente))
2333  {
2334  this._oCliente._Codigo = tcCliente;
2335  this.txtCliente1._GetTextBox().Text = tcCliente;
2336 
2337  if (EsDocumentoDatosCliente)
2338  this._oDocumento._Cliente = tcCliente;
2339  else
2340  {
2341  this._oFuturoCliente._Codigo = "";
2342  this.txtFuturoCliente1._GetTextBox().Text = "";
2343 
2344  this._oDocumento._Cabecera._Futuro_Cliente = "";
2345  this._oDocumento._Cabecera._Futuro = false;
2346  this._oDocumento._Cabecera._Cliente = tcCliente;
2347  }
2348 
2349  this._ShowCliente();
2350  }
2351  this.txtCliente1._btMante._Click_Before += new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
2352  }
2353  else
2354  {
2355  functions.FUNCTIONS._MessageBox(this.txtCliente1._Mensaje_No_Existe, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, DialogResult.OK);
2356  }
2357  }
2358  this._ShowCliente();
2359  }
2360 
2364  private void Refrescar_Informacion_Cliente()
2365  {
2366  bool llOk = true;
2367  if (this._ValidarDocumento(ref llOk))
2368  {
2369  //Comprobem el codi de client
2370  string lcCliente = this.txtCliente1._GetTextBox().Text;
2371 
2372  if (!string.IsNullOrWhiteSpace(lcCliente))
2373  {
2374  lcCliente = functions.FUNCTIONS._Punto_Por_Ceros(lcCliente);
2375 
2376  using (Cliente loCliTemp = new Cliente(lcCliente))
2377  {
2378  if (!loCliTemp._Existe_Registro())
2379  {
2380  if (EsDocumentoDatosCliente)
2381  Refrescar_Informacion_Cliente(lcCliente);
2382  else
2383  {
2384 
2385  //comprovem si es un client potencial
2386  using (FuturoCliente loFutCliTemp = new FuturoCliente(lcCliente))
2387  {
2388  if (loFutCliTemp._Existe_Registro())
2389  {
2390  _oDocumento._Cabecera._oCli = new Cliente();
2391  this.txtCliente1._GetTextBox().Text = "";
2392 
2393  _oDocumento._Cabecera._Futuro = true;
2394  _oFuturoCliente._Codigo = loFutCliTemp._Codigo;
2395  txtFuturoCliente1._GetTextBox().Text = loFutCliTemp._Codigo;
2396  this._oDocumento._Cabecera._Futuro_Cliente = loFutCliTemp._Codigo;
2397 
2398  //Refresquem
2399  this._ShowFuturoCliente();
2400  this.Refresh(this._oFuturoCliente._Codigo);
2401  }
2402  else
2403  Refrescar_Informacion_Cliente(lcCliente);
2404  }
2405  }
2406  }
2407  else
2408  {
2409  if (EsDocumentoDatosCliente) // Se ha de refrescar la información del cliente seleccionado, nadie va a lanzar luego el _Refresh
2410  _RefreshClient(lcCliente);
2411 
2412  txtFuturoCliente1._GetTextBox().Text = "";
2413  }
2414  }
2415  }
2416  }
2417  }
2418 
2419 
2423  private void Refrescar_Informacion_Cliente_Potencial()
2424  {
2425  bool llOk = true;
2426  if (this._ValidarDocumento(ref llOk))
2427  {
2428  string lcCliente = this.txtFuturoCliente1._GetTextBox().Text;
2429 
2430  using (FuturoCliente loCliPotTemp = new FuturoCliente(lcCliente))
2431  {
2432  if (!loCliPotTemp._Existe_Registro())
2433  {
2434  //Comprobem clients
2435  lcCliente = sage.ew.functions.FUNCTIONS._Punto_Por_Ceros(lcCliente);
2436  using (Cliente loCliTemp = new Cliente(lcCliente))
2437  {
2438  if (loCliTemp._Existe_Registro())
2439  {
2440  this._oDocumento._Cabecera._Futuro_Cliente = "";
2441  this._oDocumento._Cabecera._Futuro = false; //si no es futur client ho desactivo tot ja q per defecte sempre presenta el client
2442  this._oDocumento._Cabecera._oFuturo_Cliente = new FuturoCliente();
2443  this.txtFuturoCliente1._GetTextBox().Text = "";
2444 
2445  this._oCliente._Codigo = loCliTemp._Codigo;
2446  this.txtCliente1._GetTextBox().Text = loCliTemp._Codigo;
2447  this._oDocumento._Cabecera._Cliente = loCliTemp._Codigo;
2448 
2449  this._ShowCliente(); //Refresquem
2450  this.Refresh(this._oDocumento._Cabecera._Cliente); //Bug 115762: el cliente a pasar en el Refresh es el de la cabecera del documento
2451  }
2452  else
2453  {
2454  this.txtFuturoCliente1._GetTextBox().Text = this._oFuturoCliente._Codigo;
2455  if (!string.IsNullOrWhiteSpace(lcCliente))
2456  {
2457  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_sage50")))
2458  {
2459  this.txtFuturoCliente1._btMante._Click_Before -= new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
2460  if(this.txtFuturoCliente1._Existe_Codigo(ref lcCliente))
2461  {
2462  this._oCliente._Codigo = "";
2463  this._oFuturoCliente._Codigo = lcCliente;
2464  this.txtFuturoCliente1._GetTextBox().Text = lcCliente;
2465  this._oDocumento._Cabecera._Futuro_Cliente = lcCliente;
2466  this._oDocumento._Cabecera._Futuro = true;
2467  this._ShowFuturoCliente();
2468  }
2469  this.txtFuturoCliente1._btMante._Click_Before += new botones.btMante._Click_Before_Handler(_btMante__Click_Before);
2470  }
2471  else
2472  {
2473  functions.FUNCTIONS._MessageBox(this.txtFuturoCliente1._Mensaje_No_Existe, MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, DialogResult.OK);
2474  }
2475  }
2476 
2477  //if (string.IsNullOrWhiteSpace(this._oFuturoCliente._Codigo))
2478  // this._ShowCliente();
2479  }
2480  }
2481  }
2482  }
2483  }
2484  }
2485 
2489  private void _Vaciar()
2490  {
2491  txtCliente1._Codigo = "";
2492  ewtextboxCIF.Text = "";
2493  ewtextboxNombre.Text = "";
2494  ewtextboxDireccion.Text = "";
2495  ewtextboxCPostal.Text = "";
2496  ewtextboxPoblacion.Text = "";
2497  ewtextboxProvincia.Text = "";
2498  ewtextboxTelefono.Text = "";
2499  txtEmail1._Web = "";
2500 
2501  _TextoOferta = "";
2502 
2503  if(this._oCliente is Cliente) this._oCliente._Codigo = "";
2504  if(this._oFuturoCliente is FuturoCliente) this._oFuturoCliente._Codigo = "";
2505 
2506  if (_Oferta) // Bug 133430
2507  {
2508  _Oferta = false;
2509  _ColorTitolOferta(false);
2510  }
2511  }
2512  }
2513 }
Clase de negocio para Futuros Clientes
virtual void _Reload()
Metodo _Reload de la clase base de los mantenimientos Suponiendo que se haya definido el código del m...
Definition: clsEwBase.cs:4068
string _Observaciones
Observaciones
override object _Campo(string tcNombreCampo)
Override del metodo _Campo para los mantenimientos
Definition: clsEwBase.cs:3443
delegate void Delegar_Browser_After(bool tlAceptar)
Definición del delegado para el evento After en el click del browser
string _TelefonoPredeterminado()
Devuelve el teléfono predeterminado del cliente
override string _Codigo
PE-102491: override de _Codigo para que en el Set podamos convertir el número que nos llega a código ...
string _Provincia
Provincia del cliente
void _RefreshOferta()
Refrescamos la imagen de la oferta
override String _Codigo
Get o set del código del futuro cliente
override string _Nombre
Nombre del cliente a partir del campo NOMBRE de la tabla CLIENTES de la base de datos de GESTION de E...
string _CodPost
Código postal del cliente
override void _Refresh()
Capturamos el _Refresh para refrescar el formulario asociado
Definition: clsEwBase.cs:4757
KeyDiccionarioLenCampos
Clave del diccionario LenCampos
Definition: Diccionarios.cs:11
Clase sage.ew.objetos.ewlabel
Clase sage.ew.objetos.ewtextbox
Interfaz utilizada en los controles que se añaden en los perfiles
delegate void Delegar_Codigo_Cambiado()
Definición del delegado para el evento que se disparará al cambiar el código
Clase EW_GLOBAL para gestionar las variables públicas de Eurowin, variables de empresa, variables de anchuras de campo, variables de mascaras, etc.
Definition: EW_GLOBAL.cs:46
virtual bool _Existe_Registro()
Nos indica si existe el registro en la Base de Datos
Definition: clsEwBase.cs:3649
override string _Nombre
Nombre del futuro cliente a partir del campo NOMBRE de la tabla PRCLIENT de la base de datos de GESTI...
Clase para uso de funciones genéricas
Definition: functions.cs:146
txtClienteDocVen()
Inicializa una nueva instancia de la clase txtClienteDocVen
string _Direccion
Dirección del cliente
string _Poblacion
Población del cliente
delegate void Delegar_Codigo_Cambiado_Before(ref bool tlOk)
Definición del delegado para el evento que se disparará antes de cambiar el código ...
Font _Font
Fuente a utilizar en cualquier texto dentro del txtcodlabel
bool _Show_Observaciones()
Método para mostrar las observaciones del cliente (PE-79824)
Formulario base de Eurowin
Definition: clsFormul.cs:400
eTipoDocumento
Detalle los tipos de documento posibles de ventas y compras
Definition: docsvenenum.cs:32
void _Refresh()
Mostrem les dades del client Para que cumpla la interfaz "IObjetoRefresh"
override void OnCreateControl()
w10 Se mueve la reondnacion para que la haga al estar creado el objeto
bool _Oferta
Aplicar ofertas al cliente.
string _NIF
CIF del cliente
bool _Es_Contado()
Devuelve si el cliente marcado como de solicitud de datos al contado
Al volver de la web del Compliance en algunos casos es necesario realizar el refresco de los parámetr...
String _ClienteERP
PE-106179
string _Codigo_Equivalente_EW(string tcClienteERP)
Nos devolverá el código de cliente Eurowin equivalente para el cliente ERP actual (PE-78304) ...
string _Email
Email predeterminado de la ficha del cliente
Interfaz para refrescar los controles de los perfiles
Interfaz para utilizar en los formularios basados en FormBaseDocumento
Clase base para controles de tipo txtcodlabelf
delegate void Delegar_Codigo_Cambiado_Before_Extended(object sender, string tcValorCandidato, ref bool tlOk)
Definición del delegado para el evento que se disparará antes de cambiar el código. Incluye objeto sender y valor candidato
Cliente potencial (para el presupuesto de venta)