clsAlmacen.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data;
6 using System.ComponentModel;
7 
8 using sage.ew.global;
9 using sage.ew.db;
10 using sage.ew.ewbase;
11 using sage.ew.contabilidad;
12 using sage.ew.interficies;
13 using sage.ew.functions;
14 using System.Windows.Forms;
17 using sage.ew.objetos;
19 
20 namespace sage.ew.articulo
21 {
26  {
27  #region PROPIEDADES PUBLICAS
28 
32  public bool _CentralERP
33  {
34  get
35  {
36  if (_lisCampos.ContainsKey("CENTRALERP"))
37  return Convert.ToBoolean(_lisCampos["CENTRALERP"]._NewVal);
38  else
39  return false;
40  }
41  set
42  {
43  if (_lisCampos.ContainsKey("CENTRALERP"))
44  {
45  _lisCampos["CENTRALERP"]._NewVal = value;
46 
47  _Exportar_Null();
48  }
49  }
50  }
51 
55  public string _Cliente
56  {
57  get
58  {
59  if (_lisCampos.ContainsKey("CLIENTE"))
60  {
61  return _lisCampos["CLIENTE"]._NewVal.ToString();
62  }
63  else
64  {
65  return String.Empty;
66  }
67  }
68  set
69  {
70  if (_lisCampos.ContainsKey("CLIENTE"))
71  {
72  _lisCampos["CLIENTE"]._NewVal = value;
73  }
74  }
75  }
76 
80  public string _CuentaSecundaria
81  {
82  get { return Convert.ToString(_Campo("SECUN")); }
83  set { this._Campo("SECUN", value); }
84  }
85 
89  public AlmacenPlanes _AlmacenPlanes
90  {
91  get
92  {
93  if (_oAlmacenPlanes == null)
94  {
95  _oAlmacenPlanes = new AlmacenPlanes(_Codigo);
96 
97  _AddManteTRel(_oAlmacenPlanes);
98 
99  _oAlmacenPlanes._Load();
100  }
101  return _oAlmacenPlanes;
102  }
103  }
104  private AlmacenPlanes _oAlmacenPlanes;
105 
106  #endregion PROPIEDADES PUBLICAS
107 
108  #region CONSTRUCTORS
109 
113  public Almacen()
114  {
115  // Asignamos las propiedades para Almacenes
116  this._Clave = "Codigo";
117  this._DataBase = "Gestion";
118  this._Tabla = "Almacen";
119  this._Pantalla = "ALMACEN"; //Para determinar si es de solo lectura
120  this._TituloMantenimiento = "Mantenimiento de almacenes";
121 
122  this._FormManteBaseType = typeof(Forms.frmAlmacen);
123  }
124 
129  public Almacen(string tcCodigo)
130  {
131  // Asignamos las propiedades para Almacenes
132  this._Clave = "Codigo";
133  this._DataBase = "Gestion";
134  this._Tabla = "Almacen";
135  this._Pantalla = "ALMACEN"; //Para determinar si es de solo lectura
136  this._TituloMantenimiento = "Mantenimiento de almacenes";
137 
138  this._FormManteBaseType = typeof(Forms.frmAlmacen);
139 
140  this._Codigo = tcCodigo;
141  this._Load();
142  }
143 
144  #endregion CONSTRUCTORS
145 
146 
147  #region METODOS PUBLICOS
148 
153  public override bool _Delete()
154  {
155  bool llOk = true;
156  List<string> loList = new List<string>();
157 
158  // Taules de GESTION
159  loList.Clear();
160  loList.Add("STOCKS");
161  loList.Add("STOCKINI");
162  loList.Add("REGULARI");
163  loList.Add("C_PEDIVE");
164  loList.Add("C_ALBVEN");
165  loList.Add("C_ALBDEP");
166  loList.Add("D_ALBVEN");
167  loList.Add("C_ALBARE");
168  loList.Add("C_ALBCOM");
169  loList.Add("C_PEDICO");
170  loList.Add("D_ALBCOM");
171  loList.Add("EMPRESA");
172  loList.Add("C_TRANS");
173  loList.Add("D_TRANS");
174  loList.Add("C_PROD");
175  loList.Add("D_PROD");
176 
177  llOk = llOk && !_Existen_Registros("GESTION", loList, "ALMACEN");
178 
179 
180  // Taules de COMUNES
181  loList.Clear();
182  loList.Add("COMPRAS");
183  loList.Add("MODELO");
184  loList.Add("MOVSERIE");
185  loList.Add("RECOMPRAS");
186 
187  llOk = llOk && !_Existen_Registros("COMUNES", loList, "ALMACEN");
188 
189 
190  if (llOk)
191  {
192  // Cargar el mantetrel para borrar los datos relacionados correctamente (desde negocio o listas previas)
193  AlmacenPlanes loAlm = _AlmacenPlanes;
194 
195  UltimoCosteDto oUltimoCoste = new UltimoCosteDto
196  {
197  _Almacen = _Codigo,
198  };
199  UltimosCostesDA loUltCos = new UltimosCostesDA();
200  loUltCos.EliminarUltimoCoste(oUltimoCoste, true);
201 
202  return base._Delete();
203  }
204  else
205  this._Error_Message = "Este código de almacén está siendo utilizado por el programa. No se puede borrar el código de almacén.";
206 
207  return llOk;
208  }
209 
216  public override void _Evento_ShowGrafica_before(object sender, ref formul.Forms.FormListado toForm, ref bool tlOk)
217  {
218  ((txtbox.UserControls.txtAlmacenDesdeHasta)toForm._Filtros["txtAlmacenDesdeHasta"])._SetValorUnico(this._Codigo);
219  }
220 
224  public override void _Load()
225  {
226  base._Load();
227 
228  if (_oAlmacenPlanes != null && Convert.ToString(_oAlmacenPlanes._Claves._Almacen._Valor) != this._Codigo)
229  {
230  if (_oAlmacenPlanes._Grid != null)
231  {
232  _oAlmacenPlanes._Claves._Almacen._Valor = this._Codigo;
233  _oAlmacenPlanes._Load();
234  }
235  else
236  {
237  _oAlmacenPlanes = null;
238  }
239  }
240  }
241 
242 
247  public override bool _Save()
248  {
249  bool lbOk;
250 
251  // Si s'han inclós secundarias, activo el camp
252  if (_AlmacenPlanes._Items.Count > 0)
253  {
254 
255  if (Convert.ToBoolean(global.EW_GLOBAL._GetVariable("wl_distsec")))
256  {
257  // Comprovar el total de porcentaje
258  string lcPlan;
259  if (!_AlmacenPlanes._TotalPorcentajes(out lcPlan))
260  {
261  _Error_Message = "La suma del porcentaje del plan analítico " + lcPlan + " debe ser 100.";
262  return false;
263  }
264  }
265  }
266 
267  lbOk = base._Save();
268 
269  return lbOk;
270  }
271 
277  {
278  if (this._AlmacenPlanes != null)
279  {
280  DataTable ldtItems = this._AlmacenPlanes._ToDataTable();
281 
282  var duplicates = ldtItems.AsEnumerable().GroupBy(i => new { Secnivel1 = i.Field<string>("_Secundaria").Trim(), Secnivel2 = i.Field<string>("_Secnivel2").Trim(), Plancont = i.Field<string>("_Plancont").Trim() }).Where(g => g.Count() > 1).Select(g => new { g.Key.Secnivel1, g.Key.Secnivel2, g.Key.Plancont }).ToList();
283 
284  if (duplicates.Count > 0)
285  return true;
286  else
287  return false;
288  }
289  else
290  return false;
291 
292  }
293 
299  {
300  if (this._AlmacenPlanes != null)
301  {
302  DataTable ldtItems = this._AlmacenPlanes._ToDataTable();
303  DataRow[] result = ldtItems.Select("_Secundaria = '' AND _Secnivel2 = '' AND _Plancont <> ''");
304  if (result.Length > 0)
305  return true;
306  else
307  return false;
308  }
309  else
310  return false;
311  }
312 
319  public bool _Existen_Duplicados_Nivel1_Nivel2_Vacio(string tcNivel1, string tcPlan)
320  {
321  if (this._AlmacenPlanes != null)
322  {
323  var registros = this._AlmacenPlanes._Items.Where(x => x._Secundaria.Trim() == tcNivel1.Trim() && x._Plancont == tcPlan);
324 
325  var nivel2vacio = registros.Where(x => string.IsNullOrWhiteSpace(x._Secnivel2)).Count();
326  var nivel2lleno = registros.Where(x => !string.IsNullOrWhiteSpace(x._Secnivel2)).Count();
327 
328  if (nivel2vacio > 0 && nivel2lleno > 0)
329  return true;
330  else
331  return false;
332  }
333  else
334  return false;
335  }
336 
342  public bool ImportarPlanAnalitico(string tcPlan)
343  {
344  //Sino hay datos
345  if (String.IsNullOrEmpty(tcPlan))
346  {
347  _Error_Message = "El plan analítico orígen no puede estar en blanco.";
348  return false;
349  }
350 
351  PlanContable loPlan = new PlanContable(tcPlan);
352  loPlan._Load();
353  if (loPlan._Existe_Registro())
354  {
355  //recuperamos las cuentas del plan
356  var ctasPlanOrigen = loPlan._SecundariasPlan._Items.Where(loEle => loEle._PlanContable == tcPlan).ToList();
357 
358  if (!ctasPlanOrigen.Any())
359  {
360  _Error_Message = "No hay datos que copiar para este plan analítico.";
361  return false;
362  }
363 
364  //Po cada cuenta recuperada secundaria
365  foreach (sage.ew.contabilidad.PlanContable.SecundariasPlan.SecundariaPlan loSecundaria in ctasPlanOrigen)
366  {
367  //Determino si ya forma parte el plan y sus cuentas secundaria 1 y 2 de la cuenta contable destino
368  if (!_AlmacenPlanes._Items.Where(loEle => loEle._Plancont == loSecundaria._PlanContable &&
369  loEle._Secundaria == loSecundaria._Secundaria1 &&
370  loEle._Secnivel2 == loSecundaria._Secundaria2).Any())
371  {
372  //Sino forma parte, añado la nueva cuenta
373  AlmacenPlanes.AlmacenPlan loNewSecundaria = _AlmacenPlanes._NewItem();
374  loNewSecundaria._Plancont = loSecundaria._PlanContable;
375  loNewSecundaria._Secundaria = loSecundaria._Secundaria1;
376  loNewSecundaria._Secnivel2 = loSecundaria._Secundaria2;
377 
378  loNewSecundaria._CodAnalit = ((string.IsNullOrEmpty(loSecundaria._Secundaria2)) ? (loSecundaria._Secundaria1) : (loSecundaria._Secundaria1.ToString().Trim() + "." + loSecundaria._Secundaria2));
379  loNewSecundaria._NomAnalit = FUNCTIONS._AnalitNombre(loSecundaria._Secundaria1 + "." + loSecundaria._Secundaria2);
380  }
381  else
382  {
383  //Si pasa por aquí es que ya existe esa combinación de plancontable, nivel1 y nivel2
384  }
385  }
386 
387  // Repartir el porcentaje
388  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_repasi")) || Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_distsec")))
389  this._AlmacenPlanes._RepartirPorcentaje(tcPlan);
390  }
391  else
392  {
393  _Error_Message = "El plan analítico orígen no existe.";
394  return false;
395  }
396 
397  return true;
398  }
399 
404  public List<string> _Lista_Planes()
405  {
406  List<string> loListaPlanes = new List<string>();
407 
408  // Construyo una lista de todos los planes analíticos detectados en la cuenta contable.
409  var consultaplanes = from nivelesplanes in this._AlmacenPlanes._Items.AsEnumerable()
410  where !string.IsNullOrWhiteSpace(nivelesplanes._Plancont) && !string.IsNullOrWhiteSpace(nivelesplanes._Secundaria)
411  group nivelesplanes by nivelesplanes._Plancont
412  into n
413  select n.Key;
414 
415  loListaPlanes = consultaplanes.ToList();
416 
417  return loListaPlanes;
418  }
419 
420 
425  public DataTable _DtPlanes()
426  {
427  DataTable ldtPlanes = new DataTable();
428  ldtPlanes.Columns.Add("codigo", typeof(string));
429  ldtPlanes.Columns.Add("nombre", typeof(string));
430 
431  // Construyo una lista de todos los planes analíticos detectados en la cuenta contable.
432  var consulta = (from nivelesplanes in this._AlmacenPlanes._Items.AsEnumerable()
433  where !string.IsNullOrWhiteSpace(nivelesplanes._Plancont)
434  group nivelesplanes by
435  new
436  {
437  codigo = nivelesplanes._Plancont,
438  nombre = nivelesplanes._NombrePlan
439  }
440  into g
441  select new
442  {
443  codigo = g.Key.codigo,
444  nombre = g.Key.nombre
445  }).OrderBy(c => c.codigo);
446 
447  foreach (var reg in consulta)
448  {
449  DataRow loRow = ldtPlanes.NewRow();
450  loRow["codigo"] = reg.codigo;
451  loRow["nombre"] = reg.nombre;
452  ldtPlanes.Rows.Add(loRow);
453  }
454 
455  return ldtPlanes;
456  }
457 
463  public DataTable _DtNiveles1Plan(string tcPlan)
464  {
465  DataTable ldtNiveles1Plan = new DataTable();
466  ldtNiveles1Plan.Columns.Add("codigo", typeof(string));
467  ldtNiveles1Plan.Columns.Add("nombre", typeof(string));
468 
469  // Construyo una lista de todos los planes analíticos detectados en la cuenta contable.
470  var consulta = (from nivelesplanes in this._AlmacenPlanes._Items.AsEnumerable()
471  where nivelesplanes._Plancont == tcPlan && !string.IsNullOrWhiteSpace(nivelesplanes._Secundaria)
472  group nivelesplanes by
473  new
474  {
475  codigo = nivelesplanes._Secundaria,
476  nombre = nivelesplanes._Nombre
477  }
478  into g
479  select new
480  {
481  codigo = g.Key.codigo,
482  nombre = g.Key.nombre
483  }).OrderBy(c => c.codigo);
484 
485  foreach (var reg in consulta)
486  {
487  DataRow loRow = ldtNiveles1Plan.NewRow();
488  loRow["codigo"] = reg.codigo;
489  loRow["nombre"] = reg.nombre;
490  ldtNiveles1Plan.Rows.Add(loRow);
491  }
492 
493  return ldtNiveles1Plan;
494  }
495 
503  public DataTable _DtNiveles2Plan(string tcPlan, string tcCuentaNiv1 = "")
504  {
505  DataTable ldtNiveles2Plan = new DataTable();
506  ldtNiveles2Plan.Columns.Add("codigo", typeof(string));
507  ldtNiveles2Plan.Columns.Add("nombre", typeof(string));
508 
509  // Construyo una lista de todos las cuentas de nivel 2 detectados en la cuenta-plan
510  var consulta = (from nivelesplanes in this._AlmacenPlanes._Items.AsEnumerable()
511  where nivelesplanes._Plancont == tcPlan && !string.IsNullOrWhiteSpace(nivelesplanes._Secundaria)
512  && !string.IsNullOrWhiteSpace(nivelesplanes._Secnivel2)
513  && (!string.IsNullOrWhiteSpace(tcCuentaNiv1) ? nivelesplanes._Secundaria == tcCuentaNiv1 : true)
514  group nivelesplanes by
515  new
516  {
517  codigo = nivelesplanes._Secnivel2,
518  nombre = nivelesplanes._Nombre2
519  }
520  into g
521  select new
522  {
523  codigo = g.Key.codigo,
524  nombre = g.Key.nombre
525  }).OrderBy(c => c.codigo);
526 
527  foreach (var reg in consulta)
528  {
529  DataRow loRow = ldtNiveles2Plan.NewRow();
530  loRow["codigo"] = reg.codigo;
531  loRow["nombre"] = reg.nombre;
532  ldtNiveles2Plan.Rows.Add(loRow);
533  }
534 
535  return ldtNiveles2Plan;
536  }
537 
538  #endregion METODOS PUBLICOS
539 
544  public static Dictionary<string,string> ObtenerTodosLosAlmacenes()
545  {
546  Dictionary<string, string> diccAlmacenes = new Dictionary<string, string>();
547  DataTable dtAlmacenes = new DataTable();
548 
549  string lcSql = $"SELECT CODIGO, NOMBRE FROM {DB.SQLDatabase("GESTION","ALMACEN")} ORDER BY CODIGO ASC ";
550  if(DB.SQLExec(lcSql, ref dtAlmacenes) && dtAlmacenes.Rows.Count > 0)
551  {
552  foreach (DataRow row in dtAlmacenes.Rows)
553  {
554  diccAlmacenes.Add(Convert.ToString(row["CODIGO"]).TrimEnd(), Convert.ToString(row["NOMBRE"]).TrimEnd());
555  }
556  }
557  return diccAlmacenes;
558  }
559 
563  public class AlmacenPlanes : ewManteTRel<AlmacenPlanes.AlmacenPlan, AlmacenPlanes.Clave>
564  {
568  ewMascara _oMascaraTPC = new ewMascara(EW_GLOBAL._GetMascara(KeyDiccionarioMascara.wc_tpc));
569 
570  string _cEmpresa = Convert.ToString(EW_GLOBAL._GetVariable("wc_empresa"));
571 
572 
573 
577  public AlmacenPlanes()
578  {
579  CrearEstructura();
580  }
581 
585  public AlmacenPlanes(string tcCodigoArticulo)
586  {
587  CrearEstructura();
588 
589  this._Claves._Almacen._Valor = tcCodigoArticulo;
590  }
591 
592  private void CrearEstructura()
593  {
594  // Definir la base
595  _DataBase = "Gestion";
596  _Tabla = "Alma_anali";
597  _Condicion = "";
598 
599  bool lbImputarpor = (EW_GLOBAL._Empresa._ImputarPor == 0 ? true : false);
600 
601  //PE-97774
602  ewCampoTRel.Editable loEditable = Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_hera")) ? ewCampoTRel.Editable.No : ewCampoTRel.Editable.Si;
603 
604  // Omplim els camps i relació de propietats
605  _AddCampoTRel("_Almacen", "Almacen", ewCampoTRel.Visible.No, ewCampoTRel.Updatable.Si, ewCampoTRel.Editable.No);
606 
607 
608  ewCampoTRel _Def_PlanCont = _AddCampoTRel("_Plancont", "Plancont", ewCampoTRel.Visible.Si, ewCampoTRel.Updatable.Si, ewCampoTRel.Editable.Si, "Plan");
609  {
610  // Validacions
611  _Def_PlanCont._Validar_Dato_BaseDatos = "Gestion";
612  _Def_PlanCont._Validar_Dato_Tabla = "Plans";
613  _Def_PlanCont._Validar_Dato_Clave = "Codigo";
614  _Def_PlanCont._Validar_Dato_Campos = "Nombre";
615  _Def_PlanCont._Validar_Dato_CampoTRel_Asignar = "_NombrePlan";
616  _Def_PlanCont._Error_Validar_Dato = "El plan analítico indicado no existe.";
617  _Def_PlanCont._PermiteDuplicados = true;
618  _Def_PlanCont._Validar_Asignar_Cargando = true;
619 
620  // Configurar el browser
621  _Def_PlanCont._Browser = new sage.ew.botones.btBrowPlanes();
622 
623  // Configurar el manteniment
624  _Def_PlanCont._Mante = new sage.ew.botones.btMantePlanes();
625 
626  // PE-105465. Rellenar con ceros
627  _Def_PlanCont._Relleno = '0';
628  }
629 
630  _AddCampoTRel("_NombrePlan", "", ewCampoTRel.Visible.Si, ewCampoTRel.Updatable.No, ewCampoTRel.Editable.No, "Nombre");
631 
632  // Codigo de la secundaria
633  ewCampoTRel _Def_Columna = _AddCampoTRel("_Secundaria", "Secnivel1", ewCampoTRel.Visible.Si, ewCampoTRel.Updatable.Si, ewCampoTRel.Editable.Si, "C.NA1");
634  {
635  // Validacions
636  _Def_Columna._Validar_Dato_BaseDatos = "Gestion";
637  _Def_Columna._Validar_Dato_Tabla = "Secundar";
638  _Def_Columna._Validar_Dato_Clave = "Codigo";
639  _Def_Columna._Validar_Dato_Campos = "Nombre";
640  _Def_Columna._Validar_Dato_CampoTRel_Asignar = "_Nombre";
641  _Def_Columna._Error_Validar_Dato = (lbImputarpor ? "El código" : "El nivel ") + " analítico indicado no existe.";
642  _Def_Columna._PermiteDuplicados = true;
643  _Def_Columna._Validar_Asignar_Cargando = true;
644 
645  // Configurar el browser
646  _Def_Columna._Browser = new sage.ew.botones.btBrowSecundar
647  {
648  _Condicion = " nivel = 1"
649  };
650 
651  // Configurar el manteniment
652  _Def_Columna._Mante = new sage.ew.botones.btManteSecundar();
653 
654  //Task 148792 => Suprimir relleno de 0's
655  // PE-105465. Rellenar con ceros
656  //_Def_Columna._Relleno = '0';
657  }
658 
659  // Nombre de la secundaria
660  _Def_Columna = _AddCampoTRel("_Nombre", "", ewCampoTRel.Visible.Si, ewCampoTRel.Updatable.No, ewCampoTRel.Editable.No, "Nombre");
661 
662 
663  bool lbColPorcentajeVisible = Convert.ToBoolean(EW_GLOBAL._GetVariable("Wl_DistSec"));
664  bool lbColNivel2Visible = !Convert.ToBoolean(EW_GLOBAL._GetVariable("Wl_Secunico"));
665 
666  //Porcentaje nivel1
667  _Def_Columna = _AddCampoTRel("_Porcentaje1", "", !lbImputarpor && lbColPorcentajeVisible && lbColNivel2Visible, false, false, "%C.NA1", gridColumnsTypes.Número, new ewMascara("999.99"));
668  {
669  _Def_Columna._Mascara._Rango_Min = 0.00M;
670  }
671 
672  // Codigo de la secundaria de nivel 2
673  _Def_Columna = _AddCampoTRel("_Secnivel2", "Secnivel2", lbColNivel2Visible, true, true, "C.NA2");
674  {
675  // Validacions
676  _Def_Columna._Validar_Dato_BaseDatos = "Gestion";
677  _Def_Columna._Validar_Dato_Tabla = "Secundar";
678  _Def_Columna._Validar_Dato_Clave = "Codigo";
679  _Def_Columna._Validar_Dato_Campos = "Nombre";
680  _Def_Columna._Validar_Dato_CampoTRel_Asignar = "_Nombre2";
681  _Def_Columna._Error_Validar_Dato = (lbImputarpor ? "El código" : "El nivel ") + " analítico indicado no existe.";
682  _Def_Columna._PermiteDuplicados = true;
683  _Def_Columna._Validar_Asignar_Cargando = true;
684 
685  // Configurar el browser
686  _Def_Columna._Browser = new sage.ew.botones.btBrowSecundar
687  {
688  _Condicion = " nivel = 2"
689  };
690 
691  // Configurar el manteniment
692  _Def_Columna._Mante = new sage.ew.botones.btManteSecundar();
693 
694  //Task 148792 => Suprimir relleno de 0's
695  // PE-105465. Rellenar con ceros
696  //_Def_Columna._Relleno = '0';
697  }
698 
699  // Nombre de la secundaria
700  _Def_Columna = _AddCampoTRel("_Nombre2", "", lbColNivel2Visible, false, false, "Nombre");
701 
703  _Def_Columna = _AddCampoTRel("_CodAnalit", "", lbImputarpor, false, true, "Código analítico");
704  {
705  // Configurar el browser
706  _Def_Columna._Browser = new sage.ew.botones.btBrowSecundar();
707  }
708 
710  _Def_Columna = _AddCampoTRel("_NomAnalit", "", lbImputarpor, false, false, "Nombre");
711 
712  // Columna de porcentaje
713  _Def_Columna = _AddCampoTRel("_Porcentaje", "Porcentaje", lbColPorcentajeVisible, true, true, (lbImputarpor ? "%Código analítico" : (lbColNivel2Visible ? "%C.NA2" : "%C.NA1")), gridColumnsTypes.Número, new ewMascara("999.99"));
714  {
715  _Def_Columna._Mascara._Rango_Min = 0.00M;
716  }
717  }
718 
722  public void _RepartirPorcentaje(string tcPlanCont = "")
723  {
724  List<AlmacenPlanes.AlmacenPlan> loListaOrdenada;
725  if (string.IsNullOrWhiteSpace(tcPlanCont)) //Bug 113210: Si nos viene el parámetro con el plan, filtramos por dicho plan
726  loListaOrdenada = _Items.OrderBy(x => x._Plancont).ThenBy(n => n._Secundaria).ToList();
727  else
728  loListaOrdenada = _Items.Where(y => y._Plancont == tcPlanCont).OrderBy(x => x._Plancont).ThenBy(n => n._Secundaria).ToList();
729 
730  //Montamos bucle por el número de planes distintos que hay en el grid para tener un 100% en cada plan
731  foreach (var line in loListaOrdenada.GroupBy(info => info._Plancont)
732  .Select(group => new
733  {
734  Plancont = group.Key,
735  Count = group.Count()
736  })
737  .OrderBy(x => x.Plancont))
738  {
739  //Lista filtrada sólo por plan
740  List<AlmacenPlanes.AlmacenPlan> loListaFiltrada = _Items.Where(x => x._Plancont == line.Plancont).ToList();
741 
742  //Agrupamos por el nivel1 (_Secundaria) para repartir el % equitativamente para todo el nivel1 (independientemente del nivel2 que tenga cada uno)
743  var agrupacionNivel1 = loListaFiltrada.GroupBy(info => info._Secundaria)
744  .Select(group => new
745  {
746  Nivel1 = group.Key,
747  Count = group.Count()
748  })
749  .OrderBy(x => x.Nivel1);
750 
751  decimal lnDecimal = 100;
752  decimal lnPercent = _oMascaraTPC.Redondeo(lnDecimal / agrupacionNivel1.Count());
753  decimal lnResto = lnDecimal - agrupacionNivel1.Count() * lnPercent;
754  int lnX = 1;
755  foreach (var lineNivel in agrupacionNivel1)
756  {
757  //para cada nivel 1 recorremos sus registros de nivel 2 si tiene más de uno desglosamos de nuevo el tpc equitativamente entre los
758  //registros de nivel2 para cada nivel1, partiendo del % de nivel1 ya calculado
759  decimal lnPercentNivel1 = lnPercent;
760  if (lnX == agrupacionNivel1.Count())
761  lnPercentNivel1 = lnPercent + lnResto;
762 
763  //Lista filtrada por plan y nivel1 (ordenada por nivel2)
764  List<AlmacenPlanes.AlmacenPlan> loListaFiltradaNivel1 = _Items.Where(x => x._Plancont == line.Plancont && x._Secundaria == lineNivel.Nivel1)
765  .OrderBy(x => x._Secnivel2)
766  .ToList();
767  decimal lnPercentNivel2 = _oMascaraTPC.Redondeo(lnPercentNivel1 / lineNivel.Count);
768  decimal lnRestoNivel2 = lnPercentNivel1 - lineNivel.Count * lnPercentNivel2;
769 
770  //Asignación final de porcentaje al registro
771  int lnY = 1;
772  foreach (AlmacenPlanes.AlmacenPlan loSecundaria in loListaFiltradaNivel1)
773  {
774  if (loSecundaria.Fila_Plena())
775  {
776  if (lnY == loListaFiltradaNivel1.Count)
777  loSecundaria._Porcentaje = lnPercentNivel2 + lnRestoNivel2;
778  else
779  loSecundaria._Porcentaje = lnPercentNivel2;
780  }
781  lnY++;
782  }
783  lnX++;
784  }
785  }
786  }
787 
791  public void _InsertarTodas()
792  {
793  // Eliminem les línies actual (no de la taula)
794  _Items.Clear();
795 
796  // Agafem totes les secundaries
797  using (_Vista V_PLANES = new _Vista("GESTION", "PLAN_D", new Dictionary<string, object>() { { "Plancont", "%" } }, false, true))
798  {
799  foreach (DataRow ldtPlan in V_PLANES._DataTable.Rows)
800  {
801  AlmacenPlanes.AlmacenPlan loSecund = this._NewItem();
802  loSecund._Plancont = ldtPlan["Plancont"].ToString();
803  loSecund._Secundaria = ldtPlan["Secnivel1"].ToString();
804  loSecund._Secnivel2 = ldtPlan["Secnivel2"].ToString();
805 
806 
807  loSecund._CodAnalit = ((string.IsNullOrEmpty(loSecund._Secnivel2)) ? (loSecund._Secundaria) : (loSecund._Secundaria.ToString().Trim() + "." + loSecund._Secnivel2));
808  loSecund._NomAnalit = FUNCTIONS._AnalitNombre(loSecund._Secundaria + "." + loSecund._Secnivel2);
809  }
810  }
811 
812  // Repartir el porcentaje
813  if (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_repasi")) || Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_distsec")))
814  this._RepartirPorcentaje();
815  }
816 
820  public void _BorrarTodas()
821  {
822  // Eliminem les línies actual (no de la taula)
823  _Items.Clear();
824  }
825 
830  public bool _TotalPorcentajes(out string tcPlan)
831  {
832  bool lbTotalOk = true;
833  tcPlan = string.Empty;
834 
835  Dictionary<string, decimal> lnPorcentajePlan = new Dictionary<string, decimal>();
836  //Obtenemos una lista ordenada por plan contable
837  List<AlmacenPlanes.AlmacenPlan> loListaOrdenada = _Items.OrderBy(x => x._Plancont).ToList();
838 
839  foreach (AlmacenPlanes.AlmacenPlan loSecundaria in loListaOrdenada)
840  {
841  if (loSecundaria.Fila_Plena())
842  {
843  if (lnPorcentajePlan.ContainsKey(loSecundaria._Plancont))
844  lnPorcentajePlan[loSecundaria._Plancont] += loSecundaria._Porcentaje;
845  else
846  lnPorcentajePlan.Add(loSecundaria._Plancont, loSecundaria._Porcentaje);
847  }
848  }
849 
850  //Iteramos cada Plan y su porcentaje acumulado
851  foreach (KeyValuePair<string, decimal> lnPorcen in lnPorcentajePlan)
852  {
853  if (lnPorcen.Value != 100M)
854  {
855  lbTotalOk = false;
856  tcPlan = lnPorcen.Key;
857  break;
858  }
859  }
860 
861  return lbTotalOk;
862 
863  }
864 
870  public string _DefinicionPlanAnalitico(string tcCodigo)
871  {
872  if (string.IsNullOrWhiteSpace(tcCodigo))
873  return string.Empty;
874 
875  string lcDescripcionPlan = string.Empty;
876 
877  lcDescripcionPlan = Convert.ToString(DB.SQLValor("PLANS", "CODIGO", tcCodigo, "NOMBRE")).Trim();
878 
879  return "Listado de códigos analíticos del plan " + lcDescripcionPlan;
880  }
881 
882 
891  public void _CalcularTotalPorcentajesLinea(ref string tcPlan, ref string tcNivel1, ref string tcNivel2, out decimal tpcPlan, out decimal tpcNivel1)
892  {
893  Int32 lnLen = Convert.ToInt32(EW_GLOBAL._GetLenCampo(KeyDiccionarioLenCampos.wn_secundarias));
894 
895  tpcPlan = 0.0M;
896  tpcNivel1 = 0.0M;
897  string lcPlan = tcPlan.Trim();
898  string lcNivel1 = tcNivel1.Trim();
899  string lcNivel2 = tcNivel2.Trim();
900 
901  if (!this._bIsLoading) //Bug 105927: En el momento de estar cargando no calculamos el porcentaje, sólo cuando estamos desplazando por las filas
902  {
903  DataTable ldtSecundarias = this._ToDataTable();
904 
905  var groupedDataPlan = (from b in ldtSecundarias.AsEnumerable()
906  where b.Field<string>("_Plancont").Trim() == lcPlan
907  group b by b.Field<string>("_Plancont").Trim()
908  into g
909  select new
910  {
911  Plancont = g.Key,
912  Percent = g.Sum(x => x.Field<decimal>("_Porcentaje"))
913  })
914  .ToList();
915 
916  if (groupedDataPlan != null && groupedDataPlan.Count > 0)
917  {
918  tpcPlan = Convert.ToDecimal(groupedDataPlan[0].Percent);
919  }
920 
921 
922  var groupedDataNivel1 = (from b in ldtSecundarias.AsEnumerable()
923  where b.Field<string>("_Plancont").Trim() == lcPlan &&
924  ((EW_GLOBAL._Empresa._ImputarPor == 0) ?
925  b.Field<string>("_Secundaria").Trim() == lcNivel1 &&
926  b.Field<string>("_Secnivel2").Trim() == lcNivel2
927  :
928  b.Field<string>("_Secundaria").Trim() == lcNivel1)
929  group b by new
930  {
931  c1 = b.Field<string>("_Plancont").Trim(),
932  c2 = b.Field<string>("_Secundaria").Trim(),
933  }
934  into g
935  select new
936  {
937  Plancont = g.Key.c1,
938  Nivel1 = g.Key.c2,
939  Percent = g.Sum(x => x.Field<decimal>("_Porcentaje"))
940  })
941  .ToList();
942 
943  if (groupedDataNivel1 != null && groupedDataNivel1.Count > 0)
944  {
945  tpcNivel1 = Convert.ToDecimal(groupedDataNivel1[0].Percent);
946  }
947  }
948  else //Bug 105927: En el caso de no estar en una fila seleccionada por estar en el loading del grid entonces tampoco mostramos el valor de plan y nivel
949  {
950  tcPlan = "--";
951  tcNivel1 = "--";
952  }
953 
954  }
955 
959  public class Clave : IClaves
960  {
964  public ClaveTRel _Almacen { get; set; }
965 
969  public ClaveTRel _Plancont { get; set; }
970 
974  public ClaveTRel _Secundaria { get; set; }
975 
979  public ClaveTRel _Secnivel2 { get; set; }
980 
984  public Clave()
985  {
986  // Definim les propietats de cada una de les claus
987  _Almacen = new ClaveTRel();
988  _Almacen._EsFiltro = true; // Actuarà com a filtre per recuperar els registres
989 
990  _Plancont = new ClaveTRel();
991  _Plancont._EsFiltro = false;
992 
993  _Secundaria = new ClaveTRel();
994  _Secundaria._EsFiltro = false;
995 
996  _Secnivel2 = new ClaveTRel();
997  _Secnivel2._EsFiltro = false;
998 
999  // i posem valors per defecte
1000  _Almacen._Valor = "";
1001  _Plancont._Valor = "";
1002  _Secundaria._Valor = "";
1003  _Secnivel2._Valor = "";
1004 
1005  // Per defecte, totes les ClaveTRel son EsClave = true
1006  }
1007  }
1008 
1013  {
1014 
1015  //PE-98248
1016  private bool _lHera = Convert.ToBoolean(ew.global.EW_GLOBAL._GetVariable("wl_hera"));
1017  private bool _lSoloNivelesDefinidos = (Convert.ToBoolean(EW_GLOBAL._GetVariable("wl_solonivdef")));
1018 
1022  public string _Almacen
1023  {
1024  get { return _cAlmacen; }
1025  set { _cAlmacen = value; }
1026  }
1027  private string _cAlmacen = "";
1028 
1032  public string _Nombre
1033  {
1034  get
1035  {
1036  return _cNombre.Trim();
1037  }
1038  set
1039  {
1040  _cNombre = value;
1041  }
1042  }
1043  private string _cNombre = "";
1044 
1045 
1049  public string _Secundaria
1050  {
1051  get { return _cSecnivel1; }
1052  set
1053  {
1054  if (_cSecnivel1 != value)
1055  {
1056  // Comprovacions codi postal
1057  if (loParent != null)
1058  {
1059  // PE-105465. Hay que recoger el nuevo valor por si se han añadido 0s
1060  object newValor = value;
1061  if (newValor != null && !string.IsNullOrWhiteSpace(value)) //Bug 105422
1062  {
1063  //Task 111764
1064  _AsignarPlanAnalitico();
1065 
1066  //Task 111764
1067  if (!SecundariaValida(value, "2", _Plancont))
1068  return;
1069 
1070  CuentaSecundaria loSec = new CuentaSecundaria(value);
1071  string oldNombre = _Nombre;
1072  if (loParent.CamposTRel_Validar_Valor("_Secundaria", value, this, out newValor))
1073  {
1074  value = _cSecnivel1;
1075 
1076  if (EW_GLOBAL._Empresa._ImputarPor == 0)
1077  {
1078  if (string.IsNullOrWhiteSpace(_cSecnivel1))
1079  {
1080  _cSecnivel2 = string.Empty;
1081  _cNombre2 = string.Empty;
1082  }
1083  }
1084  }
1085  else if (loSec._NivelCuenta != CuentaSecundaria.NivelCuenta.Nivel1)
1086  {
1087  value = _cSecnivel1;
1088  loParent._ManteGrid._Show_Error_Message((EW_GLOBAL._Empresa._ImputarPor == 0 ? "El código analítico indicado no existe." : "La cuenta introducida no es de nivel 1."));
1089  _Nombre = oldNombre;
1090  }
1091  else if (_lSoloNivelesDefinidos && !loParent._bIsLoading && !string.IsNullOrWhiteSpace(value) && !CONTABILIDAD._ExisteNivelAnaliticoPlan(_Plancont, CuentaSecundaria.NivelCuenta.Nivel1, value))
1092  {
1093  value = _cSecnivel1;
1094  loParent._ManteGrid._Show_Error_Message((EW_GLOBAL._Empresa._ImputarPor == 0 ? "El código" : "El nivel ") + value + " introducido no está definido en el plan analítico " + _Plancont.Trim() + ".");
1095  _Nombre = oldNombre;
1096  }
1097  else
1098  {
1099  value = newValor.ToString();
1100  }
1101 
1102 
1103  if (_CodAnalit.Contains("."))
1104  {
1105  //int lnPos = _cCodAnalit.IndexOf(".");
1106  //string cSecun2 = _cCodAnalit.Substring(lnPos + 1);
1107  _cCodAnalit = (!string.IsNullOrWhiteSpace(value) ? value + "." + _Secnivel2 : string.Empty) ;
1108  }
1109  else
1110  {
1111  _cCodAnalit = value;
1112  }
1113  _cNomAnalit = FUNCTIONS._AnalitNombre(_cCodAnalit);
1114  }
1115  else
1116  {
1117  value = "";
1118  _Nombre = "";
1119  }
1120  }
1121  }
1122 
1123  if (_cSecnivel1 != value)
1124  {
1125  _cSecnivel1 = value;
1126  loParent._Exportar_Null();
1127  }
1128  }
1129  }
1130  private string _cSecnivel1 = "";
1131 
1132 
1136  public decimal _Porcentaje
1137  {
1138  get { return _nPorcentaje; }
1139  set
1140  {
1141  if (value != _nPorcentaje)
1142  {
1143  _nPorcentaje = value;
1144  loParent._Exportar_Null();
1145  }
1146  }
1147  }
1148  private decimal _nPorcentaje = 0;
1149 
1150 
1151  private decimal _nPorcentaje1 = 0;
1155  public decimal _Porcentaje1
1156  {
1157  get
1158  {
1159  AlmacenPlanes loSecundarias = (AlmacenPlanes)this._Parent;
1160  var registros = loSecundarias._Items.Where(x => x._Secundaria.Trim() == _Secundaria.Trim() && x._Plancont == _Plancont);
1161  _nPorcentaje1 = 0;
1162  foreach (AlmacenPlanes.AlmacenPlan ldr in registros)
1163  {
1164  _nPorcentaje1 += ldr._Porcentaje;
1165  }
1166 
1167  return _nPorcentaje1;
1168  }
1169  set
1170  {
1171  if (value != _nPorcentaje1)
1172  {
1173  _nPorcentaje1 = value;
1174  }
1175  }
1176  }
1177 
1181  public string _Secnivel2
1182  {
1183  get { return _cSecnivel2; }
1184  set
1185  {
1186  if (_cSecnivel2 != value)
1187  {
1188  // Comprovacions
1189  if (loParent != null)
1190  {
1191  // PE-105465. Hay que recoger el nuevo valor por si se han añadido 0s
1192  object newValor = value;
1193  if (newValor != null && !string.IsNullOrWhiteSpace(value)) //Bug 105422
1194  {
1195  //Task 111764
1196  if (EW_GLOBAL._Empresa._ImputarPor == 1)
1197  _AsignarCuentaNivel1YPlan();
1198 
1199  if (!Secnivel2Valida(value))
1200  return;
1201 
1202  CuentaSecundaria loSec = new CuentaSecundaria(value);
1203  string oldNombre = _Nombre2;
1204  if (loParent.CamposTRel_Validar_Valor("_Secnivel2", value, this, out newValor))
1205  {
1206  value = _cSecnivel2;
1207 
1208  if (EW_GLOBAL._Empresa._ImputarPor == 0)
1209  {
1210  if (string.IsNullOrWhiteSpace(_cSecnivel2))
1211  {
1212  _cSecnivel1 = string.Empty;
1213  _cNombre = string.Empty;
1214  }
1215  }
1216  }
1217  else if (loSec._NivelCuenta != CuentaSecundaria.NivelCuenta.Nivel2)
1218  {
1219  value = _cSecnivel2;
1220 
1221  if (EW_GLOBAL._Empresa._ImputarPor == 0)
1222  {
1223  if (string.IsNullOrWhiteSpace(_cSecnivel2))
1224  {
1225  _cSecnivel1 = string.Empty;
1226  _cNombre = string.Empty;
1227  }
1228  }
1229 
1230  loParent._ManteGrid._Show_Error_Message((EW_GLOBAL._Empresa._ImputarPor == 0 ? "El código analítico indicado no existe." : "La cuenta introducida no es de nivel 2."));
1231  _Nombre2 = oldNombre;
1232  }
1233  else if (_lSoloNivelesDefinidos && !loParent._bIsLoading && !string.IsNullOrWhiteSpace(value) && !CONTABILIDAD._ExisteNivelAnaliticoPlan(_Plancont, CuentaSecundaria.NivelCuenta.Nivel2, value))
1234  {
1235  loParent._ManteGrid._Show_Error_Message((EW_GLOBAL._Empresa._ImputarPor == 0 ? "El código" : "El nivel ") + value + " introducido no está definido en el plan analítico " + _Plancont.Trim() + ".");
1236  value = _cSecnivel2;
1237  _Nombre2 = oldNombre;
1238  }
1239  else
1240  {
1241  value = newValor.ToString();
1242  }
1243 
1244  _cCodAnalit = (!string.IsNullOrEmpty(value) ? _Secundaria.ToString().Trim() + "." + value : _Secundaria.ToString());
1245  _cNomAnalit = FUNCTIONS._AnalitNombre(_cCodAnalit);
1246  }
1247  else
1248  {
1249  value = "";
1250  _Nombre2 = "";
1251  }
1252  }
1253  }
1254 
1255  if (_cSecnivel2 != value)
1256  {
1257  _cSecnivel2 = value;
1258  loParent._Exportar_Null();
1259  }
1260  }
1261  }
1262  private string _cSecnivel2 = "";
1263 
1264 
1268  public string _Nombre2
1269  {
1270  get { return _cNombre2.Trim(); }
1271  set { _cNombre2 = value; }
1272  }
1273  private string _cNombre2 = "";
1274 
1275 
1279  public string _Plancont
1280  {
1281  get { return _cPlancont; }
1282  set
1283  {
1284  // Comprovacions
1285  if (loParent != null)
1286  {
1287  object newValor = value;
1288  if (newValor != null && !string.IsNullOrWhiteSpace(value))
1289  {
1290  string oldNombre = _NombrePlan;
1291  if (loParent.CamposTRel_Validar_Valor("_Plancont", value, this, out newValor))
1292  {
1293  value = _cPlancont;
1294  _NombrePlan = oldNombre;
1295  }
1296  else
1297  {
1298  value = newValor.ToString();
1299  }
1300  }
1301  else
1302  {
1303  value = "";
1304  _NombrePlan = "";
1305  }
1306  }
1307 
1308  if (value != _cPlancont)
1309  {
1310  _cPlancont = value;
1311  loParent._Exportar_Null();
1312  if (!string.IsNullOrWhiteSpace(_cPlancont))
1313  {
1314  loParent._ListDefCampos["_Secundaria"]._Browser._Condicion = " nivel = 1 ";
1315  loParent._ListDefCampos["_Secnivel2"]._Browser._Condicion = " nivel = 2 ";
1316  }
1317  }
1318  }
1319  }
1320  private string _cPlancont = "";
1321 
1322 
1326  public string _NombrePlan
1327  {
1328  get { return _cNombrePlan.Trim(); }
1329  set { _cNombrePlan = value; }
1330  }
1331  private string _cNombrePlan = "";
1332 
1333 
1337  public string _CodAnalit
1338  {
1339  get { return _cCodAnalit.Trim(); }
1340  set { _cCodAnalit = value; }
1341  }
1342  private string _cCodAnalit = "";
1343 
1344 
1348  public string _NomAnalit
1349  {
1350  get { return _cNomAnalit.Trim(); }
1351  set { _cNomAnalit = value; }
1352  }
1353  private string _cNomAnalit = "";
1354 
1355 
1359  public bool _PrimeraSecundaria
1360  {
1361  get
1362  {
1363  bool lbPrimeraSecundaria;
1364  AlmacenPlanes loParent = (AlmacenPlanes)_Parent;
1365  if (loParent._Items.Count > 0)
1366  lbPrimeraSecundaria = (loParent._Items.Where(lin => lin._Plancont == _Plancont && lin._Secundaria.Trim() == _Secundaria.Trim()).ToList().IndexOf(this) == 0);
1367  else if (string.IsNullOrWhiteSpace(_Secundaria))
1368  lbPrimeraSecundaria = true;
1369  else lbPrimeraSecundaria = false;
1370 
1371  return lbPrimeraSecundaria;
1372  }
1373  }
1374 
1378  public bool _PrimerPlan
1379  {
1380  get
1381  {
1382  bool lbPrimerPlan;
1383  AlmacenPlanes loParent = (AlmacenPlanes)_Parent;
1384  if (loParent._Items.Count > 0)
1385  lbPrimerPlan = (loParent._Items.Where(lin => lin._Plancont == _Plancont).ToList().IndexOf(this) == 0);
1386  else if (string.IsNullOrWhiteSpace(_Plancont))
1387  lbPrimerPlan = true;
1388  else
1389  lbPrimerPlan = false;
1390 
1391  return lbPrimerPlan;
1392  }
1393  }
1394 
1395  private AlmacenPlanes loParent;
1399  public object _Parent
1400  {
1401  get { return loParent; }
1402  set { loParent = (AlmacenPlanes)value; }
1403  }
1404 
1408  public AlmacenPlan()
1409  {
1410 
1411  }
1412 
1420  private bool SecundariaValida(string tcSecundaria, string tcNivell, string tcCuenta = "")
1421  {
1422  if (string.IsNullOrWhiteSpace(tcSecundaria) && _PrimeraSecundaria)
1423  {
1424  if (tcNivell == "2" && tcSecundaria.Trim() != Convert.ToString(_Secundaria).Trim() &&
1425  loParent._Items.Where(lin => lin._Plancont == _Plancont && !lin._PrimerPlan).ToList().Count > 0)
1426  {
1427  FUNCTIONS._MessageBox("No está permitida la eliminación, existen cuentas de nivel 1, 2 asociadas al mismo plan contable " + _Plancont.Trim(), "Planes analíticos", MessageBoxButtons.OK, MessageBoxIcon.Stop);
1428  return false;
1429  }
1430  }
1431 
1432  string lcCuenta = tcNivell == "1" ? Convert.ToString(_Plancont) : Convert.ToString(_Secundaria).Trim();
1433  if (string.IsNullOrWhiteSpace(tcSecundaria) || tcSecundaria.Trim() == lcCuenta.Trim())
1434  return true;
1435 
1436  return true;
1437  }
1438 
1442  protected internal void _AsignarPlanAnalitico()
1443  {
1444  //comprovem si la _Plancont està buida, si es aixi assignem la compta de l'anterior
1445 
1446  if (string.IsNullOrWhiteSpace(_Plancont) && _PrimerPlan)
1447  {
1448  int lnPos = loParent._Items.IndexOf(this);
1449  if (lnPos > 0)
1450  {
1451  AlmacenPlan loAnterior = loParent._Items[lnPos - 1];
1452  if (!string.IsNullOrWhiteSpace(loAnterior._cSecnivel1))
1453  {
1454  _cPlancont = loAnterior._Plancont;
1455  }
1456  loAnterior = null;
1457  }
1458  }
1459  }
1460 
1464  protected internal void _AsignarCuentaNivel1YPlan()
1465  {
1466  if (string.IsNullOrWhiteSpace(_Plancont) && string.IsNullOrWhiteSpace(_Secundaria) && _PrimeraSecundaria)
1467  {
1468  int lnPos = loParent._Items.IndexOf(this);
1469  if (lnPos > 0)
1470  {
1471  AlmacenPlan loAnterior = loParent._Items[lnPos - 1];
1472  if (!string.IsNullOrWhiteSpace(loAnterior._cSecnivel1) && !string.IsNullOrWhiteSpace(loAnterior._cSecnivel2))
1473  {
1474  _cPlancont = loAnterior._Plancont;
1475  _cSecnivel1 = loAnterior._Secundaria;
1476  }
1477  loAnterior = null;
1478  }
1479  }
1480  }
1481 
1487  private bool Secnivel2Valida(string tcSecundaria)
1488  {
1489  if (string.IsNullOrWhiteSpace(_Plancont) && string.IsNullOrWhiteSpace(_Secundaria) && _PrimeraSecundaria)
1490  {
1491  int lnPos = loParent._Items.IndexOf(this);
1492  if (lnPos > 0)
1493  {
1494  AlmacenPlan loAnterior = loParent._Items[lnPos - 1];
1495  if (!string.IsNullOrWhiteSpace(loAnterior._cSecnivel1) && string.IsNullOrWhiteSpace(loAnterior._cSecnivel2))
1496  {
1497  FUNCTIONS._MessageBox("No está permitida la inserción de una cuenta de nivel 2 ya que existe un registro sin nivel 2 para el mismo plan y cuenta de nivel 1", "Planes analíticos", MessageBoxButtons.OK, MessageBoxIcon.Stop);
1498  return false;
1499  }
1500  loAnterior = null;
1501  }
1502  }
1503 
1504 
1505  return true;
1506  }
1507 
1512  public bool Fila_Plena()
1513  {
1514  bool lbFilaPlena;
1515 
1516  lbFilaPlena = !(string.IsNullOrWhiteSpace(_Plancont)) && !(string.IsNullOrWhiteSpace(_Secundaria)); //Comprobar también el _Plancont para la fila plena
1517 
1518  return lbFilaPlena;
1519  }
1520  }
1521  }
1522  }
1523 }
void _CalcularTotalPorcentajesLinea(ref string tcPlan, ref string tcNivel1, ref string tcNivel2, out decimal tpcPlan, out decimal tpcNivel1)
Calcular el total de porcentajes de la linea para mostrar en la parte inferior del formulario ...
Definition: clsAlmacen.cs:891
AlmacenPlanes(string tcCodigoArticulo)
Inicializa una nueva intancia de la clase
Definition: clsAlmacen.cs:585
Clase de negocio base para mantenimientos
Definition: clsEwBase.cs:1643
ewMascara _Mascara
Máscara para columnas numéricas
sage.ew.botones.btMante _Mante
Mantenimiento para la columna del grid o campo enlazado
AlmacenPlanes()
Inicializa una nueva intancia de la clase
Definition: clsAlmacen.cs:577
Objeto para la consulta, edición y actualización de datos de tablas (simula vistas de Fox) ...
Definition: Vista.cs:13
bool _PermiteDuplicados
Indica si se permiten valores duplicados comparando el campo con todos los registros cargados ...
string _Validar_Dato_Clave
Clave por la cual se buscará el valor a la tabla de validación
DataTable _DataTable
DataTable con los datos recuperdos
Definition: Vista.cs:25
bool _Existen_Duplicados_Secundarias()
PE-105666: Comprobar si existen duplicados en las lineas
Definition: clsAlmacen.cs:276
bool Fila_Plena()
Devuelve si la línea está completa
Definition: clsAlmacen.cs:1512
override bool _Delete()
Borra la familia cargada
Definition: clsAlmacen.cs:153
Definición de los objetos campo para las tablas relacionadas
override void _Load()
Load
Definition: clsAlmacen.cs:224
PE-105666: Botón para el mantenimiento de planes analíticos
Clase de acceso a datos de los últimos costes (sólo para gestionar datos de tabla art_ultcos) ...
string _Validar_Dato_BaseDatos
Base de datos donde se validará si el dato existe
Muestra el browser de cuentas secundarias
Mostra el manteniment de comptes secundaries carregant el registre corresponent al _Codigo ...
Clave()
Inicializa una nueva intancia de la clase
Definition: clsAlmacen.cs:984
Task 111763: Interfaz que implementaran las clases de negocio que se utilicen en el user control de g...
BindingList< _LinTRel > _Items
Lista bindable de todos los items de la tabla relacionada
KeyDiccionarioMascara
Clave para diccionario de máscaras
Mantenimiento para "Cuentas secundarias" PE-100803
NivelCuenta _NivelCuenta
PE-105666: Ahora la cuenta secundaria puede ser de nivel 1 o 2. Nuevo campo
DataTable _DtNiveles1Plan(string tcPlan)
Devuelve un DataTable con los códigos de cuenta analíticas de nivel 1 que tiene el almacén en el plan...
Definition: clsAlmacen.cs:463
KeyDiccionarioLenCampos
Clave del diccionario LenCampos
Definition: Diccionarios.cs:11
string _DefinicionPlanAnalitico(string tcCodigo)
Definición planes analíticos
Definition: clsAlmacen.cs:870
string _Validar_Dato_Tabla
Tabla donde se validará si el dato existe
static Dictionary< string, string > ObtenerTodosLosAlmacenes()
Método que nos devuelve un diccionario con todos los almacenes
Definition: clsAlmacen.cs:544
void _BorrarTodas()
Borra todas las secundarias
Definition: clsAlmacen.cs:820
Campos clave para recuperar las tallas de los artículos
Definition: clsAlmacen.cs:959
bool EliminarUltimoCoste(string articulo)
Elimina de la tabla art_ultcos (últimos costes) tantos registros cómo almacenes, tallas y colores ten...
void _InsertarTodas()
Inserta todas las secundarias
Definition: clsAlmacen.cs:791
sage.ew.botones.btBrowser _Browser
Browser para la columna del grid o campo enlazado
virtual bool _Existe_Registro()
Nos indica si existe el registro en la Base de Datos
Definition: clsEwBase.cs:3649
SecundariasPlan _SecundariasPlan
Enlace con la tabla relacionada Secundar
Definición de los objetos campo para las tablas relacionadas
Updatable
Actualizable. Existe el campo en la tabla.
DataTable _DtPlanes()
Devuelve un DataTable con los códigos de planes analíticos que tiene definidos el almacén...
Definition: clsAlmacen.cs:425
static bool _ExisteNivelAnaliticoPlan(string tcPlan, CuentaSecundaria.NivelCuenta toNivel, string tcCodigoNivel)
Valida si existe el nivel analítico en el plan en la tabla PLAN_D para gestionar que únicamente permi...
void _Load(string tcGuid_Id)
Aquest mètode ens carregarà el registre que tingui associat aquest Guid
Definition: clsEwBase.cs:3921
bool _TotalPorcentajes(out string tcPlan)
Calcula la suma dels percentatjes
Definition: clsAlmacen.cs:830
PE-105666: Browser de planes contables
Proporciona características adicionales de las máscaras de Eurowin
Definition: clsEwBase.cs:6212
Editable
Premitirá modificar su valor
List< string > _Lista_Planes()
Devuelve en una lista de strings los códigos de los planes analíticos detectados en el almacén...
Definition: clsAlmacen.cs:404
PE-96306 Clase utilizada para consultar los datos de nivel 1
Definition: Nivel1.cs:14
string _Validar_Dato_CampoTRel_Asignar
Destino del valor recuperado en la consulta de validación
Clase para gestionar los planes analíticos del almacén
Definition: clsAlmacen.cs:563
Clase para gestionar las secundarias de un plan contable
Interfaz para objetos línea
Definition: ILinTRel.cs:11
Definir la estructura de las líneas de los colores de artículos
Definition: clsAlmacen.cs:1012
bool _Existen_Duplicados_Nivel1_Nivel2_Vacio(string tcNivel1, string tcPlan)
Bug 107377
Definition: clsAlmacen.cs:319
decimal Redondeo(decimal tnImporte)
Aplica el redondeo segun los decimales de la moneda
Definition: clsEwBase.cs:6296
decimal _Rango_Min
Valor mínimo según la máscara. Es la máscara de VFP convertida a decimal y en negativo ...
Definition: clsEwBase.cs:6250
string _Validar_Dato_Campos
Campos que se recuperarán en la consulta de validación
DataTable _DtNiveles2Plan(string tcPlan, string tcCuentaNiv1="")
Devuelve un DataTable con los códigos de cuenta analíticas de nivel 2 que tiene el almacén en el plan...
Definition: clsAlmacen.cs:503
Interfaz para la definición de las claves para tablas relacionadas
Definition: IClaves.cs:11
Clase para el acceso a las tablas relacionadas de los mantenimientos.
Task 111764: Interfaz que implementaran las clases basadas en ILinTRel que tengan los campos _Plancon...
gridColumnsTypes
Definición de los tipos de columnas para los grids o campos enlazados
Definir la estructura de las definiciones por idioma de artículos
char _Relleno
Introduce tantos carácteres al inicio del campo hasta la longitud del campo
Almacen()
Constructor vacío
Definition: clsAlmacen.cs:113
AlmacenPlan()
Inicializa una nueva intancia de la clase
Definition: clsAlmacen.cs:1408
Visible
Visible en el grid
bool _Existen_Vacios_Secundarias()
Bug 106200
Definition: clsAlmacen.cs:298
PE-105666: Mantenimiento de planes contables
Definition: PlanContable.cs:59
string _Plancont
PE-105666: Código de plan contable
Definition: clsAlmacen.cs:1280
bool _Validar_Asignar_Cargando
Indica si se buscará el dato en la tabla correspondiente mientras se ejecuta el _Load() ...
override void _Evento_ShowGrafica_before(object sender, ref formul.Forms.FormListado toForm, ref bool tlOk)
Filtros de la gráfica
Definition: clsAlmacen.cs:216
string _Error_Validar_Dato
Mensaje de error que se mostrará al insertar un dato no válido
override bool _Save()
Guarda el registro actual
Definition: clsAlmacen.cs:247
void _RepartirPorcentaje(string tcPlanCont="")
Task 105843: Reparto de % en planes analíticos equitativamente segun nivel1 y a continuación según ni...
Definition: clsAlmacen.cs:722
bool ImportarPlanAnalitico(string tcPlan)
A partir de un plan analítico, obtenemos todas las secundarias y las combinamos con las secundarias d...
Definition: clsAlmacen.cs:342
Almacen(string tcCodigo)
Constructor con código
Definition: clsAlmacen.cs:129