DocumentosGestDoc.cs
1 # region Usings
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
8 using sage.ew.interficies;
9 using sage.ew.ewbase;
10 using System.Data;
11 using System.Drawing;
12 using System.Windows.Forms;
13 using sage.ew.objetos;
14 using sage.ew.functions;
15 using System.IO;
17 using sage.ew.formul;
18 # endregion Usings
19 
20 namespace sage.addons.gestdoc.Negocio.Clases
21 {
25  public partial class DocumentosGestDoc
26  {
27  # region Propiedades privadas
28  private ewcontextmenustrip _ewcontextmenustrip = null;
29  private string _cClase;
30  private string _cLibreria;
31  private string _cCarpeta;
32  private string _cValuekeys = string.Empty;
33  private IGestionDocumental _oEnlace = null;
34  # endregion Propiedades privadas
35 
36  # region Propiedades públicas
37  public dynamic _Documento = null;
41 
45  public string _Error_message;
46 
50  protected internal string _DescripcionDocEnlace = string.Empty;
51 
55  protected internal List<string> _DocumentosEnlace = new List<string>();
56  # endregion Propiedades públicas
57 
58  # region Eventos y delegados para refrescar el boón al volver de la gestión documental
59  public delegate void _BotonGestionDocumental_Handler();
63 
67  public event _BotonGestionDocumental_Handler _BotonGestionDocumental_Refresh;
68 
72  private void BotonGestionDocumental_Refresh()
73  {
74  if (_BotonGestionDocumental_Refresh != null) _BotonGestionDocumental_Refresh();
75  }
76  # endregion Eventos y delegados para refrescar el boón al volver de la gestión documental
77 
78  # region Constructor
79  public DocumentosGestDoc()
83  {
84  _ewcontextmenustrip = new ewcontextmenustrip();
85  }
86  # endregion Constructor
87 
88  # region Métodos protected internal
89  protected internal void _GestDoc_Click()
93  {
94  if (_ewcontextmenustrip.Items.Count > 0)
95  _ewcontextmenustrip.Items.Clear();
96 
97  DataTable ldtDocumentos = Documentos();
98 
99  bool llDocumentos = (ldtDocumentos != null && ldtDocumentos.Rows.Count > 0);
100 
101  if (llDocumentos)
102  {
103  AddDocumentosMenuContextual(ldtDocumentos);
104  _ewcontextmenustrip.Show(Cursor.Position.X, Cursor.Position.Y);
105  }
106  else
107  GestDocShow();
108  }
109 
114  protected internal bool _DocumentosGestionDocumental()
115  {
116  DataTable ldtDocumentos = Documentos();
117 
118  bool llDocumentos = (ldtDocumentos != null && ldtDocumentos.Rows.Count > 0);
119 
120  return llDocumentos;
121  }
122  # endregion Métodos protected internal
123 
124  # region Métodos privados
125  public bool ViewDocumento(int tnId)
131  {
132  bool llOk;
133  IDocumento loIDocumento = new Documento(tnId);
134 
135  llOk = (loIDocumento._Id > 0);
136  llOk = llOk && loIDocumento._View();
137 
138  if (!llOk)
139  _Error_message = loIDocumento._Error_message;
140 
141  return llOk;
142  }
143 
149  private bool ShowDocumento(int tnId)
150  {
151  bool llOk;
152  IDocumento loIDocumento = new Documento(tnId);
153 
154  llOk = (loIDocumento._Id > 0);
155 
156  if (llOk)
157  loIDocumento._Show();
158  else
159  _Error_message = loIDocumento._Error_message;
160 
161  return llOk;
162  }
163 
167  private void GestDocShow()
168  {
169  frmGestDoc lofrmGestDoc = new frmGestDoc();
170 
171  if (lofrmGestDoc != null)
172  {
173  if (_oEnlace != null && !string.IsNullOrWhiteSpace(_cValuekeys))
174  {
175  lofrmGestDoc._DescripcionDocEnlace = _DescripcionDocEnlace;
176  lofrmGestDoc._Enlace = _oEnlace;
177  lofrmGestDoc._DocumentosEnlace = _DocumentosEnlace;
178  }
179 
180  lofrmGestDoc._ShowDialog();
181  BotonGestionDocumental_Refresh();
182  }
183  }
184 
189  private IGestionDocumental EnlaceGestionDocumental()
190  {
191  if (_Documento == null)
192  return null;
193 
194  IGestionDocumental loEnlaceGestionDocumental = null;
195  eTipoDocumentoGestDoc loTipoDocumento = FunctionsGestDoc._TipoDocumento(_Documento);
196  bool llOk = false;
197 
198  switch (loTipoDocumento)
199  {
200  case eTipoDocumentoGestDoc.Stock:
201  llOk = EnlaceGestionDocumentalStocks();
202  break;
203  case eTipoDocumentoGestDoc.Venta:
204  case eTipoDocumentoGestDoc.Compra:
205  llOk = EnlaceGestionDocumentalVentasCompras();
206  break;
207  case eTipoDocumentoGestDoc.FacturaCompra:
208  llOk = EnlaceGestionDocumentalFacturaCompra();
209  break;
210  case eTipoDocumentoGestDoc.Asiento:
211  llOk = EnlaceGestionDocumentalAsientos();
212  break;
213  case eTipoDocumentoGestDoc.Mante:
214  llOk = true;
215  break;
216  case eTipoDocumentoGestDoc.Otro:
217  break;
218  default:
219  break;
220  }
221 
222  if (llOk)
223  loEnlaceGestionDocumental = (IGestionDocumental)_Documento;
224 
225  if (loEnlaceGestionDocumental != null)
226  LibreriaDocumento();
227 
228  return loEnlaceGestionDocumental;
229  }
230 
239  private void LibreriaDocumento()
240  {
241  if (_Documento != null)
242  {
243  string lcCarpeta = string.Empty;
244 
245  Type loType = _Documento.GetType();
246 
247  _cLibreria = Convert.ToString(loType.Module); // Module ---> sage.addons.gestoc.dll
248 
249  // En los asientos contables _Documento.GetType().Module devuelve sage.50.exe
250  // _Documento.GetType().Namespace devuelve sage.ew.contabilidad que es el Namespace donde coincidía con el nombre de la dll
251  if (_cLibreria == "sage.50.exe")
252  _cLibreria = Sage50Assembly(loType, Convert.ToString(loType.Namespace), ref lcCarpeta); // Le pasamos el NamesPace
253  else
254  {
255  _cLibreria = Path.GetFileNameWithoutExtension(_cLibreria);
256 
257  lcCarpeta = loType.Namespace; // Namespace ---> sage.addons.gestoc.Negocio.Mantes
258 
259  if (_cLibreria == lcCarpeta)
260  lcCarpeta = string.Empty;
261  else
262  lcCarpeta = lcCarpeta.Replace(_cLibreria + ".", ""); // Eliminamos la parte de la libreria "sage.addons.gestoc" me interesa únicamente "Negocio.Mantes" sin el punto
263  }
264 
265  _cCarpeta = lcCarpeta;
266  _cClase = loType.Name;
267  }
268  }
269 
279  private static string Sage50Assembly(Type toType, string tcLibreria,ref string tcCarperta)
280  {
281  List<string> ltsLibrerias = new List<string>() { "sage.ew.empresa", "Sage.ES.S50.Comunicados", "Sage.ES.S50.Fabricacion", "Sage.ES.S50.Fintech", "Sage.ES.S50.Modelos", "Sage.ES.S50.NuevoEjercicio,", "Sage.ES.S50.S50Update", "sage.ew.articulo", "sage.ew.botones", "sage.ew.cliente", "sage.ew.contabilidad", "sage.ew.docscompra", "sage.ew.docsven", "sage.ew.docventatpv", "sage.ew.ewbase", "sage.ew.formul", "sage.ew.functions", "sage.ew.global", "sage.ew.graficas", "sage.ew.listados", "sage.ew.lote", "sage.ew.o365", "sage.ew.objetos", "sage.ew.perfiles", "sage.ew.sepa", "sage.ew.serie", "sage.ew.stocks", "sage.ew.tpv", "sage.ew.txtbox", "sage.ew.usuario" };
282 
283  string lcLibreria = tcLibreria;
284 
285  var lstLibreria = ltsLibrerias.AsEnumerable().Where(l=> lcLibreria.StartsWith(l)).ToList();
286 
287  if (lstLibreria != null && lstLibreria.Count > 0)
288  {
289  lcLibreria = lstLibreria.First();
290 
291  if (tcLibreria.StartsWith($"{lcLibreria}."))
292  tcCarperta = tcLibreria.Replace($"{lcLibreria}.", "");
293  else
294  tcCarperta = tcLibreria.Replace($"{lcLibreria}", "");
295  }
296 
297  // Realizamos una gestión especial para la clase de empresa que estaba en ewbase
298  if (lcLibreria == "sage.ew.empresa" && Convert.ToString(toType.Name).ToLower() == "empresa")
299  {
300  lcLibreria = "sage.ew.ewbase";
301  tcCarperta = "sage.ew.empresa";
302  }
303 
304  return lcLibreria;
305  }
306 
311  private bool EnlaceGestionDocumentalStocks()
312  {
313  return (_Documento._DocumentLineas.Count > 0);
314  }
315 
320  private bool EnlaceGestionDocumentalMantenimientos()
321  {
322  return true; // TODO: gestionar previsiones
323  }
324 
329  private bool EnlaceGestionDocumentalFacturaCompra()
330  {
331  return (!string.IsNullOrWhiteSpace(_Documento._Numero) && !string.IsNullOrWhiteSpace(_Documento._Cabecera._Proveedor));
332  }
333 
338  private bool EnlaceGestionDocumentalAsientos()
339  {
340  return (_Documento._Numero > 0 && _Documento._Lineas.Count > 0);
341  }
342 
347  private bool EnlaceGestionDocumentalVentasCompras()
348  {
349  return (!string.IsNullOrWhiteSpace(_Documento._Numero) && _Documento._Lineas.Count > 0);
350  }
351 
356  private DataTable Documentos()
357  {
358  DataTable ldtDocumentos = new DataTable();
359  _oEnlace = EnlaceGestionDocumental();
360  _cValuekeys = string.Empty;
361 
362  if (_Documento != null && _oEnlace != null)
363  {
364  if (_oEnlace._Keys.Count == 0) // Si no tenemos claves podemos salir
365  return null;
366 
367  string lcValor = FunctionsGestDoc._ValueKeys(_oEnlace);
368 
369  if (string.IsNullOrWhiteSpace(lcValor)) // Si no tenemos cargado el mantenimiento/documento ya podemos salir
370  return null;
371 
372  int lnIdEnlace = IdEnlace(_oEnlace);
373 
374  if (lnIdEnlace > 0)
375  {
376  _cValuekeys = lcValor;
377 
378  if (_DocumentosEnlace.Count == 0) // Si tenemos documentos para subir mediante Drag & Drop no es necesario consultar los documentos
379  ldtDocumentos = FunctionsGestDoc._DocumentosEnlace(_oEnlace, lnIdEnlace, lcValor);
380  }
381  }
382 
383  return ldtDocumentos;
384  }
385 
391  private int IdEnlace(IGestionDocumental toEnlace) // , ewMante toewMante)
392  {
393  return FunctionsGestDoc._Enlace(toEnlace, _cLibreria, _cClase, _cCarpeta);
394  }
395 
400  private void AddDocumentosMenuContextual(DataTable tdtDocumentos)
401  {
402  Icon loIconSmall;
403  ToolStripItem[] loListDocs = new ToolStripItem[tdtDocumentos.Rows.Count];
404  int lnIndice = 0;
405 
406  foreach (DataRow ldrDocumento in tdtDocumentos.Rows)
407  {
408  loIconSmall = null;
409 
410  if (ldrDocumento["iconSmall"] != null)
411  loIconSmall = ((Icon)ldrDocumento["iconSmall"]);
412 
413  ToolStripItem loToolStripMenuItem = new ToolStripMenuItem();
414  loToolStripMenuItem.Text = Convert.ToString(ldrDocumento["titulo"]).Trim();
415  loToolStripMenuItem.Name = Convert.ToString(ldrDocumento["iddoc"]);
416  loToolStripMenuItem.MouseDown += new MouseEventHandler(ToolStripButtonDocumento_MouseDown);
417 
418  if (loIconSmall != null)
419  loToolStripMenuItem.Image = loIconSmall.ToBitmap();
420 
421  loListDocs[lnIndice] = loToolStripMenuItem;
422  lnIndice++;
423  }
424 
425  _ewcontextmenustrip.Items.AddRange(loListDocs);
426 
427  _ewcontextmenustrip.Items.Add(new ToolStripSeparator());
428 
429  _ewcontextmenustrip.Items.Add("Gestión documental");
430  _ewcontextmenustrip.Items[_ewcontextmenustrip.Items.Count - 1].Name = "gestdocumental";
431  _ewcontextmenustrip.Items[_ewcontextmenustrip.Items.Count - 1].Click += new EventHandler(ToolStripButtoNavigateGestDoc_Click);
432  }
433 
439  private void ToolStripButtoNavigateGestDoc_Click(object sender, EventArgs e)
440  {
441  GestDocShow();
442  }
443 
450  private void ToolStripButtonDocumento_MouseDown(object sender, MouseEventArgs e)
451  {
452  bool llOk = false;
453  int lnId = 0;
454  string lcMensajeError = string.Empty;
455 
456  try
457  {
458  lnId = Convert.ToInt32(((ToolStripItem)sender).Name);
459  }
460  catch (Exception)
461  {
462  lcMensajeError = "Se ha producido un error al abrir al documento.";
463  }
464 
465  if (lnId > 0 && string.IsNullOrWhiteSpace(lcMensajeError))
466  {
467  if (e.Button == MouseButtons.Right)
468  llOk = ShowDocumento(lnId);
469  else
470  llOk = ViewDocumento(lnId);
471 
472  if (!llOk)
473  lcMensajeError = _Error_message;
474  }
475 
476  if (!string.IsNullOrWhiteSpace(lcMensajeError))
477  FUNCTIONS._MessageBox(lcMensajeError, "Gestión documental", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
478  }
479  # endregion Métodos privados
480 
481  # region Métodos privados
482  public bool _DeleteDocumentos(IGestionDocumental toDocumento)
488  {
489  return FunctionsGestDoc._DeleteDocumentos(toDocumento);
490  }
491 
498  {
499  _Documento = toDocumento;
500 
501  try
502  {
503  FormBase loForm = ((dynamic)toDocumento)._FormDocumento;
504 
505  if (loForm != null)
506  {
507  Control[] loControls = loForm.Controls.Find("ButtonDocumentoGestDoc", true); // Tengamos o no documentos se ha de mirar si hay documentos
508 
509  if (loControls != null && loControls.Count() > 0)
510  {
511  ButtonDocumentoGestDoc _oButtonDocumentoGestDoc = (ButtonDocumentoGestDoc)loControls[0];
512  _oButtonDocumentoGestDoc._DocumentosGestionDocumental();
513  }
514  }
515  }
516  catch (Exception)
517  {
518  }
519  }
520 
526  {
527  _Documento = toDocumento;
528 
529  try
530  {
531  FormBase loForm = ((dynamic)toDocumento)._FormDocumento;
532 
533  if (loForm != null)
534  {
535  Control[] loControls = loForm.Controls.Find("ButtonDocumentoGestDoc", true); // Tengamos o no documentos se ha de mirar si hay documentos
536 
537  if (loControls != null && loControls.Count() > 0)
538  {
539  ButtonDocumentoGestDoc _oButtonDocumentoGestDoc = (ButtonDocumentoGestDoc)loControls[0];
540  _oButtonDocumentoGestDoc.Enabled = true;
541  }
542  }
543  }
544  catch (Exception)
545  {
546  }
547  }
548  # endregion Métodos privados
549  }
550 }
IGestionDocumental _Enlace
Instancia de la clase para poder vincular documentos a un mantenimiento, documento ...
Definition: frmGestDoc.cs:64
void _DocumentosGestionDocumental(IGestionDocumental toDocumento)
Consulta si hay documentos en la gestión documental del formulario, para cambiar de icono Utilizado e...
List< string > _DocumentosEnlace
Lista de los documentos de enlace
Definition: frmGestDoc.cs:45
DialogResult _Show()
Nos presenta el formulario asociado a este objeto
_BotonGestionDocumental_Handler _BotonGestionDocumental_Refresh
Desencadena el evento para poder refrescar el botón de la gestión documental
Interfaz IGestionDocumental para gestionar el enlace de la gestión documental con los diferentes docu...
Interfaz para el el Objeto Documento
Definition: IDocumento.cs:14
Es como el tipo de entrada asientos pero por negocio, sin formulario, pq quiero que me haga las propu...
string _Error_message
En caso que haya error en alguna ejecución, nos añadirá la descripción del error
Clase pública "DocumentosGestDoc" base para la gestión de los documentos a añadir en los mantenimient...
bool _View(int tnVersion=0)
Abrirá el documento en solo lectura en una carpeta temporal del Windows
string _DescripcionDocEnlace
Desacripción del documento enlace origen que se mostrará en el título de la pantalla de gestion docum...
Definition: frmGestDoc.cs:83
Formulario para mostrar la gestión documental en un determinado contexto.
Definition: frmGestDoc.cs:27
Botón de la gestión documentala para añadir en los documentos de ventas/compras/stocks y asientos ...
bool _DocumentosGestionDocumental(bool tlDefaultImage=false)
Consultamos si tenemos documentos relacionados con el mantenimiento
Formulario base de Eurowin
Definition: clsFormul.cs:400
eTipoDocumentoGestDoc
Enumeración para gestionar el tipo de documento
Definition: EnumGestDoc.cs:95
void _EnabledGestionDocumental(IGestionDocumental toDocumento)
Refresco del estado de enabled del control
Dictionary< string, string > _Keys
Relación entre los campos y las propiedades de la clase de negocio