Fabricacion.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Data;
4 using System.Drawing;
5 using System.Linq;
6 using System.Text;
7 using sage.ew.db;
8 using sage.ew.ewbase;
9 using sage.ew.formul;
10 using sage.ew.functions;
11 using sage.ew.global;
12 using sage.ew.interficies;
13 using sage.ew.objetos;
14 using Sage.ES.S50.Addons;
16 using Sage.ES.S50.Fabricacion;
17 
18 namespace Sage.ES.S50.AddonsVirtuales
19 {
23  public partial class Fabricacion : ModuloVirtual
24  {
25  #region VARIABLES PRIVADAS
26 
30  private string _NombreVariable = "WL_PROTRAN";
31 
32  private _ExtensionMante _oExtensionManteEmpresa;
33  private S50.Fabricacion.Negocio.Clases.fabricacionConfig _oConfiguracion;
34 
35  private bool _lConPartes = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_PCostes"));
36 
37  #endregion VARIABLES PRIVADAS
38 
39  #region PROPIEDADES
40 
41 
45  public S50.Fabricacion.Negocio.Clases.fabricacionConfig _Configuracion
46  {
47  get
48  {
49  if (_oConfiguracion == null)
50  _oConfiguracion = new S50.Fabricacion.Negocio.Clases.fabricacionConfig(); // No es necesario realizar un _Load, luego se realiza en el momento de cargar la empresa
51 
52  return _oConfiguracion;
53  }
54  }
55 
59  public override string Firma { get; set; }
60 
64  public bool _BajaSuscripcion
65  {
66  get { return LICENCIAS._BajaSuscripcion("FABRICA"); }
67  }
68 
69  #endregion PROPIEDADES
70 
71  #region CONSTRUCTORES
72 
76  public Fabricacion()
77  {
78  // Tarea 169200
79  // NOTA: Aunque el campo PCOSTES por la tabla tenga el valor por defecto “.T.” internamente se debe tratar con una variable global y para la versión 50.7700 estará desactivada.
80  // A partir de versiones posteriores ya funcionará según el valor de la configuración del add - on.En la configuración de empresa se dejará invisible este campo.
81  string _lcEmpresa = EW_GLOBAL._GetVariable("wc_empresa").ToString().Trim();
82  bool showPCostes = Convert.ToBoolean(DB.SQLValor("empresa", "codigo", _lcEmpresa, "pcostes", "GESTION"));
83 
84 
85  EW_GLOBAL.ValorEnClave_VarGlob("wl_PCostes", showPCostes);
86 
87  // Asignar los tipos para la configuración del módulo
88  Id = 30;
89  Nombre = "FABRICA";
90  Revision = 1;
91  Nombre2 = "Fabricación";
92  Activo = true;
93  Libreria = "Sage.50";
94  Clase = "Fabricacion";
95  Visible = Convert.ToBoolean(EW_GLOBAL._GetVariable(_NombreVariable)) && !_EsAsesorSoloConta();
96  Instalado = true;
97  Tipo = 2;
98  Solucion = 2;
99  SmallProf = 0;
100  Descripcion = "Gestión de procesos de producción, transformación y partes de coste";
101  Observaciones = "Permite el uso de componentes, imputación de costes, control de estados, actualización de costes, cálculos de consumo y ratios, y listados para seguimiento y análisis.";
102 
103  _UrlAyudaAddon = "https://sage50c.sage.es/help50c/Content/ADDONS/Fabricacion/guia-uso-addon-fabricacion.htm";
104 
105  UserControlConfigType = typeof(S50.Fabricacion.Visual.UserControls.EmpresaPaginaModulosFabricacion);
106  ModuloConfigType = typeof(S50.Fabricacion.Negocio.Clases.fabricacionConfig);
107  }
108 
109 
110 
111  #endregion CONSTRUCTORES
112 
113  #region MÉTODOS PROTECTED OVERRIDE
114 
119  protected override bool Condition()
120  {
121  return Convert.ToBoolean(EW_GLOBAL._GetVariable(_NombreVariable)) && !_EsAsesorSoloConta();
122  }
123 
124  #endregion MÉTODOS PROTECTED OVERRIDE
125 
126  #region MÉTODOS PÚBLICOS OVERRIDE
127 
128 
136  public override object _GetListaPrevia(string tcClass, Type oTipoObjeto, string tcPantalla)
137  {
138  switch (tcClass)
139  {
140  case "Sage.ES.S50.Fabricacion.Visual.Forms.frmAlbaranProduccion":
141  return new Sage.ES.S50.Fabricacion.Visual.UserControls.ListasPreviasDocsAlbaranProduccion(tcClass, oTipoObjeto, tcPantalla);
142  case "Sage.ES.S50.Fabricacion.Visual.Forms.frmAlbaranTransformacion":
143  return new Sage.ES.S50.Fabricacion.Visual.UserControls.ListasPreviasDocsAlbaranTransformacion(tcClass, oTipoObjeto, tcPantalla);
144  default:
145  return null;
146  }
147  }
148 
149 
150 
155  public override IBrowserPropiedadesExtendidas _BindBrowser(string browsertabla)
156  {
157  return base._BindBrowser(browsertabla);
158  }
159 
166  public override object _Extension(string _key, sage.ew.interficies.IMante _mantePrincipal)
167  {
168  // Ya se ha definido una extensión del mantenimiento de empresa para la configuración del módulo.
169  // Se instancia en la base y se recoge en loInstancia.
170  // La clase de negocio es classConfig.cs y la parte visual usercontrolConfig.cs.
171 
172  object loInstancia = base._Extension(_key, _mantePrincipal);
173 
174  _key = _key.ToLower().Trim();
175 
176  switch (_key)
177  {
178 
179  case "produc":
180  {
181  if (_lConPartes)
182  loInstancia = new S50.Fabricacion.Negocio.Mantes.ExtensionProduccionPartes(_mantePrincipal);
183  }
184  break;
185 
186  case "transform":
187  {
188  if (_lConPartes)
189  loInstancia = new S50.Fabricacion.Negocio.Mantes.ExtensionTransformacionPartes(_mantePrincipal);
190  }
191  break;
192 
193  default:
194  break;
195  }
196 
197  return loInstancia;
198  }
199 
207  public override object _ExtensionManteTRel(string _key, sage.ew.interficies.IManteTRel _manteTRelPrincipal, int _ordenAddon)
208  {
209  object loInstancia = null;
210 
211  _key = _key.ToLower().Trim();
212 
213  switch (_key)
214  {
215  default:
216  break;
217  }
218 
219  return loInstancia;
220  }
221 
227  public override void _BindForm(string _nombreForm, IFormBase _formBase)
228  {
229  base._BindForm(_nombreForm, _formBase);
230 
231  _nombreForm = _nombreForm.ToLower().Trim();
232 
233  // Puede que el formulario sea el FormMante base. En ese caso, utilizamos el nombre de _Pantalla
234  if (_nombreForm == "formmante")
235  {
236  _nombreForm = _formBase._Pantalla.ToLower().Trim();
237  }
238 
239  switch (_nombreForm)
240  {
241  case "frmalbaranproduccion":
242  S50.Fabricacion.Negocio.Mantes.FormExtensionProduccionPartes formmanteext_producPartes = new S50.Fabricacion.Negocio.Mantes.FormExtensionProduccionPartes((FormBaseDocumento)_formBase, this);
243  break;
244 
245  case "frmalbarantransformacion":
246  S50.Fabricacion.Negocio.Mantes.FormExtensionTransformacionPartes formmanteext_transPartes = new S50.Fabricacion.Negocio.Mantes.FormExtensionTransformacionPartes((FormBaseDocumento)_formBase, this);
247  break;
248  default:
249  break;
250  }
251  }
252 
257  public override bool _Load()
258  {
259  // Utilizamos la variable del antiguo módulo de producción, para la nueva funcionalidad en el detalle de la producción
260  EW_GLOBAL.ValorEnClave_VarGlob("wl_ewproduc", true);
261 
262  //if (_GetVariable())
263  //{
264  // Insertar_Registro_Tabla_Programs();
265  //}
266 
267  //_ActualizarCamposProduccion();
268 
269  //Nuevo bug 170388. Quitar del _load cuando salga la 7710 y dejar solo en el _install y en el _update
270  //var configFabrica = new Sage.ES.S50.Fabricacion.Negocio.Clases.fabricacionConfig();
271  //configFabrica._CreateDefaultTemplates();
272 
273  return base._Load();
274  }
275 
280  public override bool _Unload()
281  {
282  return base._Unload();
283  }
284 
289  public override bool _Update()
290  {
291  // Utilizamos la variable del antiguo módulo de producción, para la nueva funcionalidad en el detalle de la producción
292  EW_GLOBAL.ValorEnClave_VarGlob("wl_ewproduc", true);
293 
294  if (_GetVariable())
295  {
296  Insertar_Registro_Tabla_Programs();
297  }
298 
299  _ActualizarCamposProduccion();
300  _ActualizarSeccion();
301 
302  //Nuevo bug 170388. Quitar del _load cuando salga la 7710 y dejar solo en el _install y en el _update
303  //var configFabrica = new Sage.ES.S50.Fabricacion.Negocio.Clases.fabricacionConfig();
304  //configFabrica._CreateDefaultTemplates();
305 
306  return base._Update();
307  }
308 
314  public override bool _Desinstalar(TipoExecute tcExecute)
315  {
316  // Si desactivamos trabajar con fabricación ...
317  bool llOk = true;
318 
319  if (llOk = base._Desinstalar(tcExecute))
320  {
321  if (tcExecute == TipoExecute.After)
322  {
323  // Eliminar registro de GESTION!PROGRAMS para que no muestre el menú FABRICACIÓN
324  string lcSql = "DELETE FROM " + DB.SQLDatabase("GESTION", "PROGRAMS") + " WHERE UPPER(NOMBRE)='FABRICACIÓN'";
325  DB.SQLExec(lcSql);
326 
327  llOk = _SetVariable(false);
328  }
329  }
330 
331  return llOk;
332  }
333 
339  public override bool _Instalar(TipoExecute tcExecute)
340  {
341  // Activamos trabajar con fabricación ...
342  bool llOk = true;
343 
344  if (llOk = base._Instalar(tcExecute))
345  {
346  if (tcExecute == TipoExecute.After)
347  {
348  Insertar_Registro_Tabla_Programs();
349 
350  //Nuevo bug 170388. Quitar del _load cuando salga la 7710 y dejar solo en el _install y en el _update
351  var configFabrica = new Sage.ES.S50.Fabricacion.Negocio.Clases.fabricacionConfig();
352  configFabrica._CreateDefaultTemplates();
353 
354  _SetVariable(true);
355  }
356  }
357 
358  return llOk;
359  }
360 
366  public override bool GetActivoGrupos(List<string> tlstGrupos)
367  {
368  DataTable ldtTemp = new DataTable();
369 
370  // Montar instrucción sql para consultar a los grupos
371  String lcSql = "";
372  foreach (string lcGrupo in tlstGrupos)
373  {
374  // Obtener modulos del grupo actual
375  string lcComunes = "COMU" + lcGrupo;
376  lcSql += !string.IsNullOrWhiteSpace(lcSql) ? " UNION " : "";
377  lcSql += $@"
378  SELECT codigo FROM {DB.SQLDatabase("COMUNES", "OPCFLAG")} o
379  LEFT JOIN { DB.SQLDatabase("COMUNES", "OPCEMP")} c ON o.codigo = c.tipo_opc
380  WHERE lower(o.VARIABLE) = { DB.SQLString(_NombreVariable.ToLower())} and c.estado = { DB.SQLTrue()} ";
381  }
382 
383  if (!string.IsNullOrWhiteSpace(lcSql))
384  DB.SQLExec(lcSql, ref ldtTemp);
385 
386  bool llOk = (ldtTemp != null && ldtTemp.Rows.Count > 0);
387 
388  FUNCTIONS._DisposeDatatable(ldtTemp);
389 
390  return llOk;
391  }
392 
399  public override bool _Apertura(string tcEjerAnt, string tcEjerActual)
400  {
401  return base._Apertura(tcEjerAnt, tcEjerActual);
402  }
403 
404  #endregion MÉTODOS PÚBLICOS OVERRIDE
405 
406  #region MÉTODOS PRIVADOS
407 
408  private void Insertar_Registro_Tabla_Programs()
409  {
410  string lcSql = string.Empty;
411  DataTable ldtPrograms = new DataTable();
412  DB.SQLExec("select * from " + DB.SQLDatabase("GESTION", "PROGRAMS") + " WHERE UPPER(NOMBRE)='FABRICACIÓN'", ref ldtPrograms);
413  if (ldtPrograms.Rows.Count == 0)
414  {
415  // Si no encuentro el registro de FABRICACIÓN en la tabla PROGRAMS lo inserto.
416  DB.SQLExec("select max(numero) as max from " + DB.SQLDatabase("GESTION", "PROGRAMS"), ref ldtPrograms);
417  Int64 lnNum = Convert.ToInt64(ldtPrograms.Rows[0]["max"]) + 1;
418 
419  lcSql = "INSERT INTO " + DB.SQLDatabase("GESTION", "PROGRAMS") + " (Nombre,Comando,numero,Exe) " +
420  "VALUES ('Fabricación','FPRINCIPAL.MMENU.CANVIARMENUS(" + lnNum.ToString().Trim() + ",''FABRICACION'',''FABRICACION'',''FABRICACION.hlp'')'," + lnNum.ToString().Trim() + ",'')";
421  DB.SQLExec(lcSql);
422  }
423  }
424 
425  private bool _SetVariable(bool tlActivar)
426  {
427  if (EW_GLOBAL._Empresa._SetOpcEmp("10009", tlActivar))
428  {
429  EW_GLOBAL.ValorEnClave_VarGlob(_NombreVariable, tlActivar);
430  EW_GLOBAL.ValorEnClave_VarGlob("wl_ewproduc", tlActivar);
431  return true;
432  }
433 
434  return false;
435  }
436 
437  private bool _GetVariable()
438  {
439  return Convert.ToBoolean(EW_GLOBAL._GetVariable(_NombreVariable)) && !_EsAsesorSoloConta();
440  }
441 
442  private bool _EsAsesorSoloConta()
443  {
444  int lnAsesorContable = Convert.ToInt32(EW_GLOBAL._GetVariable("wn_AsesorContable"));
445 
446  if (lnAsesorContable > 0 || EW_GLOBAL._Solucion <= 1)
447  return true;
448  else
449  return false;
450  }
451 
452  private void _ActualizarSeccion()
453  {
454  string lcSql = $@"UPDATE {DB.SQLDatabase("GESTION","tipo_cost")} SET seccion = LTRIM(seccion)";
455 
456  DB.SQLExec(lcSql);
457  }
458 
459  private void _ActualizarCamposProduccion()
460  {
461  bool _llPeso = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_Peso"));
462 
463  DataTable data = new DataTable();
464  DataTable datadetalle = new DataTable();
465  Dictionary<string, object> articulo = new Dictionary<string, object>();
466 
467 
468  decimal lnPorcentaje_Coste_Estructural = 0;
469 
470  decimal lnTotal_Componentes = 0M;
471  decimal lnTotal_Coste_Estructural = 0M;
472  decimal lnTotal_Coste = 0M;
473 
474  decimal lnCoste_Unitario_Componentes = 0M;
475  decimal lnCoste_Unitario_Estructural = 0M;
476  decimal lnCoste_Unitario = 0M;
477 
478  string lcSql = " Select empresa, numero, articulo, entrada, peso From " + DB.SQLDatabase("GESTION", "C_PROD") + " Where TotalCoste = 0 ";
479  DB.SQLExec(lcSql, ref data);
480 
481  foreach (DataRow cabecera in data.Rows)
482  {
483  lcSql = " Select * From " + DB.SQLDatabase("GESTION", "D_PROD") +
484  " Where empresa = " + DB.SQLString(cabecera.Field<string>("empresa")) +
485  " And numero = " + DB.SQLString(cabecera.Field<string>("numero"));
486  DB.SQLExec(lcSql, ref datadetalle);
487 
488  lnPorcentaje_Coste_Estructural = Convert.ToDecimal(DB.SQLValor("EMPRESA", "CODIGO", cabecera.Field<string>("empresa"), "PORESTRUP", "GESTION"));
489 
490  lnCoste_Unitario_Componentes = 0M;
491  lnCoste_Unitario_Estructural = 0M;
492  lnCoste_Unitario = 0M;
493 
494  lnTotal_Componentes = 0M;
495  lnTotal_Coste_Estructural = 0M;
496  lnTotal_Coste = 0M;
497 
498  foreach (DataRow detalle in datadetalle.Rows)
499  {
500  // Si el articulo es una línea de escandallo del producto a producir y tiene seleccionado el campo: No actualizar coste principal,
501  // esta línea no se tendrá en cuenta para el cálculo del coste de componentes.
502  string[] campos = new string[] { "ARTICULO", "COMPONENTE" };
503  string[] valores = new string[] { cabecera.Field<string>("articulo"), detalle.Field<string>("articulo") };
504 
505  bool llNoActualizarCostePrincipal = Convert.ToBoolean(DB.SQLValor("ESCANDAL", campos, valores, "NOACTCOSTP", "GESTION"));
506  if (!llNoActualizarCostePrincipal)
507  {
508  articulo = DB.SQLREGValor("ARTICULO", "CODIGO", detalle.Field<string>("articulo"), "GESTION");
509 
510  if (_llPeso && !string.IsNullOrWhiteSpace(Convert.ToString(articulo["peso"])) && Convert.ToString(articulo["peso"]) != "0")
511  {
512  // Si el artículo de la línea trabaja con peso, entonces tomar el valor d_prod.coste* d_prod.Peso
513  lnTotal_Componentes += detalle.Field<decimal>("Coste") * detalle.Field<decimal>("Peso");
514  }
515  else
516  {
517  // Si el artículo de la línea No trabaja peso, entonces tomar el valor d_prod.coste* d_prod.salida
518  lnTotal_Componentes += detalle.Field<decimal>("Coste") * detalle.Field<decimal>("Salida");
519  }
520  }
521  }
522 
523  lnTotal_Coste_Estructural = lnTotal_Componentes * (lnPorcentaje_Coste_Estructural / 100);
524  lnTotal_Coste = lnTotal_Componentes + lnTotal_Coste_Estructural;
525 
526  articulo = DB.SQLREGValor("ARTICULO", "CODIGO", cabecera.Field<string>("articulo"), "GESTION");
527 
528  if (_llPeso && !string.IsNullOrWhiteSpace(Convert.ToString(articulo["peso"])) && Convert.ToString(articulo["peso"]) != "0")
529  {
530  if (cabecera.Field<decimal>("Peso") != 0)
531  {
532  // Si el articulo a producir trabaja con peso, dividir el resultado anterior por c_Prod.peso
533  lnCoste_Unitario_Componentes = lnTotal_Componentes / cabecera.Field<decimal>("Peso");
534 
535 
536  lnCoste_Unitario_Estructural = lnTotal_Coste_Estructural / cabecera.Field<decimal>("Peso");
537  }
538  }
539  else
540  {
541  if (cabecera.Field<decimal>("Entrada") != 0)
542  {
543  // Si el articulo a producir trabaja sin peso, dividirlo por c_Prod.entrada
544  lnCoste_Unitario_Componentes = lnTotal_Componentes / cabecera.Field<decimal>("Entrada");
545 
546 
547  lnCoste_Unitario_Estructural = lnTotal_Coste_Estructural / cabecera.Field<decimal>("Entrada");
548  }
549  }
550 
551  lnCoste_Unitario = lnCoste_Unitario_Componentes + lnCoste_Unitario_Estructural;
552 
553  lcSql = " UPDATE " + DB.SQLDatabase("GESTION","C_PROD") +
554  " SET PMCOM = " + DB.SQLString(lnCoste_Unitario) + ", " +
555  " Componunit = " + DB.SQLString(lnCoste_Unitario_Componentes) + ", " +
556  " Estrucunit = " + DB.SQLString(lnCoste_Unitario_Estructural) + ", " +
557  " Totalcoste = " + DB.SQLString(lnTotal_Coste) + ", " +
558  " Totalestru = " + DB.SQLString(lnTotal_Coste_Estructural) + ", " +
559  " Totalcompo = " + DB.SQLString(lnTotal_Componentes) + ", " +
560  " Porc_estru = " + DB.SQLString(lnPorcentaje_Coste_Estructural) + " " +
561  " Where empresa = " + DB.SQLString(cabecera.Field<string>("empresa")) +
562  " And numero = " + DB.SQLString(cabecera.Field<string>("numero"));
563  DB.SQLExec(lcSql);
564  }
565  }
566 
567  #endregion MÉTODOS PRIVADOS
568  }
569 }
override bool _Unload()
Se ejecutará este método cuando se cierre eurowin
Definition: Fabricacion.cs:280
Nueva interficie madre de IMantes y de la que colgara ewMante. Propiedades: _Codigo, _Nombre, _Error_Message. Metodos: _New, Save, _Delete, _Load, _Existe_Registro, _Clonar
Definition: IMantes.cs:17
Clase base para el módulo fabricacion
Definition: Fabricacion.cs:23
Formulario base de documentos de stock y de asientos contables
string _Pantalla
Nombre del formulario equivalente de Eurowin para bloqueos por usuario.
Definition: IFormBase.cs:59
Clase de negocio para la configuración del addon de fabricación
Definition: classConfig.cs:14
override object _Extension(string _key, sage.ew.interficies.IMante _mantePrincipal)
Método para obtener las instancias de clases de extensiones desde los documentos y mantenimientos ...
Definition: Fabricacion.cs:166
Interficie para las extensiones de los browser
override bool Condition()
Condición de activación del addon
Definition: Fabricacion.cs:119
override bool _Load()
Se ejecutará este método cuando se cargue el módulo
Definition: Fabricacion.cs:257
Clase base para las extensiones de los mantenimientos
Interface para formularios que deriven de FormBase
Definition: IFormBase.cs:12
bool _CreateDefaultTemplates()
Crear registros por defecto de modelos para el Addon Virtual
Definition: classConfig.cs:115
override void _BindForm(string _nombreForm, IFormBase _formBase)
Vincula los formularios de la aplicación con los del addon
Definition: Fabricacion.cs:227
override object _GetListaPrevia(string tcClass, Type oTipoObjeto, string tcPantalla)
Devuelve la lista prévia del documento
Definition: Fabricacion.cs:136
override bool _Update()
Se ejecutará este método cuando se actualize el módulo via FTP
Definition: Fabricacion.cs:289
override bool _Apertura(string tcEjerAnt, string tcEjerActual)
Método para realizar apertura un addon
Definition: Fabricacion.cs:399
override IBrowserPropiedadesExtendidas _BindBrowser(string browsertabla)
Permite extender el browser
Definition: Fabricacion.cs:155
TipoExecute
Tipos de ejecución de los métodos
Definition: IDocModulos.cs:16
Interficie con las operaciones básicas de los ManteTRel
Definition: IMantes.cs:474
override bool _Instalar(TipoExecute tcExecute)
Método para instalar un addon
Definition: Fabricacion.cs:339
override bool GetActivoGrupos(List< string > tlstGrupos)
Nos indica si el addon virtual está activa en algun de los grupos de empresa
Definition: Fabricacion.cs:366
override bool _Desinstalar(TipoExecute tcExecute)
Método para desinstalar un addon
Definition: Fabricacion.cs:314
Fabricacion()
Inicializa una nueva instancia de la classe
Definition: Fabricacion.cs:76
override object _ExtensionManteTRel(string _key, sage.ew.interficies.IManteTRel _manteTRelPrincipal, int _ordenAddon)
Método para obtener las instancias de clases de extensiones de mantenimientos de tablas relacionadas ...
Definition: Fabricacion.cs:207