public List <TransformacioneslotesLinModel> GenerarLineasSinStock(List <TransformacioneslotesLinModel> listado, TransformacioneslotesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId) { var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var monedasService = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService; var monedasObj = monedasService.get(model.Fkmonedas) as MonedasModel; var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(model.Fkarticulos)) as FamiliasproductosModel; var ancho = model.Ancho; var largo = model.Largo; var grueso = model.Grueso; if (model.Modificarmedidas) { ancho = model.Ancho; largo = model.Largo; grueso = model.Grueso; } else { ancho = articuloObj.Ancho.Value; largo = articuloObj.Largo.Value; grueso = articuloObj.Grueso.Value; } var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; var metros = UnidadesService.CalculaResultado(unidadesObj, model.Cantidad, largo, ancho, grueso, model.Metros); model.Metros = metros; listado.Add(new TransformacioneslotesLinModel() { Id = maxId++, Fkarticulos = model.Fkarticulos, Descripcion = articuloObj.Descripcion, Cantidad = model.Cantidad, Largo = largo, Ancho = ancho, Grueso = grueso, Fkunidades = articuloObj.Fkunidades, Metros = metros, Decimalesmedidas = unidadesObj.Decimalestotales, Decimalesmonedas = monedasObj.Decimales, Canal = model.Canal, } ); return(listado); }
private ReservasstockLinVistaModel GenerarModeloLin(ReservasstockModel albaranObj, string lote) { var serviceStock = new StockactualService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var obj = serviceStock.GetArticuloPorLoteOCodigo(lote, albaranObj.Fkalmacen, albaranObj.Empresa) as MovimientosstockModel; if (obj != null) { var fkarticulos = obj.Fkarticulos; var articulosObj = articulosService.GetArticulo(fkarticulos, albaranObj.Fkclientes, albaranObj.Fkmonedas.ToString(), albaranObj.Fkregimeniva, TipoFlujo.Venta); var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(fkarticulos)) as FamiliasproductosModel; var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; var metros = UnidadesService.CalculaResultado(unidadesObj, obj.Cantidad, obj.Largo, obj.Ancho, obj.Grueso, obj.Metros); obj.Metros = metros; return(new ReservasstockLinVistaModel() { Modificarmedidas = false, Lote = lote, Decimalesmonedas = albaranObj.Decimalesmonedas, Descuentocomercial = albaranObj.Porcentajedescuentocomercialcadena, Descuentoprontopago = albaranObj.Porcentajedescuentoprontopagocadena, Fkcuenta = albaranObj.Fkclientes, Fkmonedas = albaranObj.Fkmonedas.ToString(), Flujo = TipoFlujo.Venta, Fkregimeniva = albaranObj.Fkregimeniva, Portes = albaranObj.Costeportes.ToString(), Fkalmacen = albaranObj.Fkalmacen, Descuento = 0, Precio = articulosObj.Precio ?? 0, Fkarticulos = fkarticulos, Lineas = new List <MovimientosstockModel>(new[] { obj }) }); } return(new ReservasstockLinVistaModel() { Fkmonedas = albaranObj.Fkmonedas.ToString() }); }
public List <ReservasstockLinModel> CrearNuevasLineas(List <ReservasstockLinModel> listado, ReservasstockLinVistaModel model) { var stockactualService = new StockactualService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var tiposivaService = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService; var monedasService = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService; var monedasObj = monedasService.get(model.Fkmonedas) as MonedasModel; var maxId = listado.Any() ? listado.Max(f => f.Id) + 1 : 1; foreach (var linea in model.Lineas) { if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid))) { var articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo); var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel; var ancho = linea.Ancho; var largo = linea.Largo; var grueso = linea.Grueso; if (model.Modificarmedidas) { ancho = model.Ancho; largo = model.Largo; grueso = model.Grueso; } else { var item = familiaObj.Gestionstock ? stockactualService.GetArticuloPorLoteOCodigo( string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen, Empresa) as MovimientosstockModel : null; ancho = item?.Ancho ?? linea.Ancho; largo = item?.Largo ?? linea.Largo; grueso = item?.Grueso ?? linea.Grueso; } var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; var tiposivaObj = tiposivaService.get(articuloObj.Fktiposiva) as TiposIvaModel; var metros = UnidadesService.CalculaResultado(unidadesObj, linea.Cantidad, largo, ancho, grueso, model.Metros); linea.Metros = metros; var bruto = linea.Metros * model.Precio; var importedescuento = Math.Round(((bruto) * model.Descuento / 100.0), model.Decimalesmonedas); var total = bruto - importedescuento; listado.Add(new ReservasstockLinModel() { Id = maxId++, Fkarticulos = linea.Fkarticulos, Descripcion = articuloObj.Descripcion, Lote = linea.Lote, Tabla = Funciones.Qint(linea.Loteid), Tblnum = Funciones.Qint(linea.Loteid), Cantidad = linea.Cantidad, Largo = largo, Ancho = ancho, Grueso = grueso, Fkunidades = articuloObj.Fkunidades, Metros = metros, Precio = model.Precio, Porcentajedescuento = model.Descuento, Importedescuento = importedescuento, Importe = total, Decimalesmedidas = unidadesObj.Decimalestotales, Decimalesmonedas = monedasObj.Decimales, Fktiposiva = tiposivaObj.Id, Porcentajeiva = tiposivaObj.PorcentajeIva, Porcentajerecargoequivalencia = tiposivaObj.PorcentajeRecargoEquivalencia, Bundle = model.Tipopieza == TipoPieza.Bundle ? model.Lote.Replace(linea.Lote, string.Empty) : string.Empty, Caja = model.Caja, Canal = model.Canal } ); } } ValidarKit(listado, model); return(listado); }
public List <ImputacionCostesLinModel> CrearLineasLotes(List <ImputacionCostesLinModel> listado, ImputacionCostesLinVistaModel model) { var stockactualService = new StockactualService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var tiposivaService = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService; var maxId = listado.Any() ? listado.Max(f => f.Id) + 1 : 1; foreach (var linea in model.Lineas) { if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid))) { var articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo); var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel; var ancho = linea.Anchoentrada; var largo = linea.Largoentrada; var grueso = linea.Gruesoentrada; //if (model.Modificarmedidas) //{ // ancho = model.Ancho; // largo = model.Largo; // grueso = model.Grueso; //} //else //{ // var item = familiaObj.Gestionstock // ? stockactualService.GetArticuloPorLoteOCodigoHistorico( // string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen, // Empresa) as MovimientosstockModel : null; // ancho = item?.Ancho ?? linea.Anchoentrada; // largo = item?.Largo ?? linea.Largoentrada; // grueso = item?.Grueso ?? linea.Gruesoentrada; //} var metros = linea.MetrosEntrada; var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; ////lotes en stock historico //if(linea.Cantidad==0 && linea.Metros>0) //{ // linea.Metros = linea.Metros; //} //else //{ // var metros = UnidadesService.CalculaResultado(unidadesObj, linea.Cantidad, largo, ancho, grueso, linea.MetrosEntrada); // linea.Metros = metros; //} listado.Add(new ImputacionCostesLinModel(_context) { Id = maxId++, Fkarticulos = linea.Fkarticulos, Descripcion = articuloObj.Descripcion, Lote = linea.Lote, Tabla = Funciones.Qint(linea.Loteid), Cantidad = linea.Cantidadentrada, Largo = largo, Ancho = ancho, Grueso = grueso, Fkunidades = articuloObj.Fkunidades, Metros = metros, Precio = model.Precio, Decimalesmedidas = unidadesObj.Decimalestotales, Decimalesmonedas = 0, Canal = model.Canal } ); } } ValidarKit(listado, model); return(listado); }
private void ModificarLotesLineas(TraspasosalmacenModel model) { var familiaService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db); var contadorlotesService = FService.Instance.GetService(typeof(ContadoresLotesModel), _context, _db) as ContadoresLotesService; var vectoridentificadorlotes = new Dictionary <string, StLote>(); var vecetorincrementocontadores = new Dictionary <string, int>(); foreach (var item in model.Lineas) { if (item.Nueva && string.IsNullOrEmpty(item.Loteautomaticoid)) { if (_db.Stockactual.Any(f => f.empresa == model.Empresa && f.lote == item.Lote && f.loteid == item.Tabla.ToString())) { throw new ValidationException(string.Format("El Lote: {0}.{1} ya existe en el Stock", item.Lote, item.Tabla)); } } else if (item.Nueva && !string.IsNullOrEmpty(item.Loteautomaticoid)) { var familiaObj = familiaService.get(ArticulosService.GetCodigoFamilia(item.Fkarticulos)) as FamiliasproductosModel; if (familiaObj.Tipogestionlotes > Tipogestionlotes.Singestion) { if (!vecetorincrementocontadores.ContainsKey(familiaObj.Fkcontador)) { vecetorincrementocontadores.Add(familiaObj.Fkcontador, 0); } var loteObj = contadorlotesService.get(familiaObj.Fkcontador) as ContadoresLotesModel; var objlote = new StLote(); if (vectoridentificadorlotes.ContainsKey(item.Loteautomaticoid)) { objlote = vectoridentificadorlotes[item.Loteautomaticoid]; } else { var incremento = vecetorincrementocontadores[familiaObj.Fkcontador]; objlote = new StLote() { Lote = contadorlotesService.CreateLoteId(loteObj, ref incremento), Numero = 0 }; vecetorincrementocontadores[familiaObj.Fkcontador] = incremento; } if (familiaObj.Tipofamilia != TipoFamilia.Tabla) { objlote.Numero = 0; } else { objlote.Numero++; } if (vectoridentificadorlotes.ContainsKey(item.Loteautomaticoid)) { vectoridentificadorlotes.Remove(item.Loteautomaticoid); } item.Lote = objlote.Lote; item.Tabla = objlote.Numero; item.Tblnum = objlote.Numero; vectoridentificadorlotes.Add(item.Loteautomaticoid, objlote); } } } }
private void GenerarMovimientosLineasCostes(IEnumerable <TransformacioneslotesLinModel> lineas, TransformacioneslotesModel nuevo, TipoOperacionService movimiento, TrabajosModel trabajosObj, bool finalizarstock = false) { var movimientosStockService = new MovimientosstockService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var serializer = new Serializer <TransformacioneslotesDiarioStockSerializable>(); var vectorArticulos = new Hashtable(); var operacion = 1; if (movimiento == TipoOperacionService.EliminarCostes) { operacion = -1; } foreach (var linea in lineas) { var codigoarticulonuevo = linea.Fkarticulos; if (!string.IsNullOrEmpty(trabajosObj.Fkacabadofinal)) { codigoarticulonuevo = string.Format("{0}{1}{2}{3}{4}", ArticulosService.GetCodigoFamilia(linea.Fkarticulos), ArticulosService.GetCodigoMaterial(linea.Fkarticulos), ArticulosService.GetCodigoCaracteristica(linea.Fkarticulos), ArticulosService.GetCodigoGrosor(linea.Fkarticulos), trabajosObj.Fkacabadofinal); if (!articulosService.exists(codigoarticulonuevo)) { throw new Exception(string.Format("El articulo {0} no existe", codigoarticulonuevo)); } } ArticulosModel articuloObj; if (vectorArticulos.ContainsKey(linea.Fkarticulos)) { articuloObj = vectorArticulos[linea.Fkarticulos] as ArticulosModel; } else { articuloObj = articulosService.get(linea.Fkarticulos) as ArticulosModel; vectorArticulos.Add(linea.Fkarticulos, articuloObj); } var aux = Funciones.ConverterGeneric <TransformacionesloteslinSerialized>(linea); if (articuloObj?.Gestionstock ?? false) { var model = new MovimientosstockModel { Empresa = nuevo.Empresa, Fkalmacenes = nuevo.Fkalmacen.ToString(), Fkalmaceneszona = Funciones.Qint(nuevo.Fkzonas), Fkarticulos = codigoarticulonuevo, //linea.Fkarticulos, Referenciaproveedor = "", Fkcontadorlote = linea.Fkcontadoreslotes, Lote = linea.Lote, Loteid = (linea.Tabla ?? 0).ToString(), Tag = "", Fkunidadesmedida = linea.Fkunidades, //Cantidad = 0, //Largo = linea.Largo ?? 0, //Ancho = linea.Ancho ?? 0, //Grueso = linea.Grueso ?? 0, //Metros = (linea.Metros ?? 0) * operacion, //Pesoneto = ((articuloObj.Kilosud ?? 0) * linea.Metros) * operacion, Documentomovimiento = serializer.GetXml( new TransformacioneslotesDiarioStockSerializable { Id = nuevo.Id ?? 0, Referencia = nuevo.Referencia, Fechadocumento = nuevo.Fechadocumento, Codigoproveedor = nuevo.Fkproveedores, Linea = aux }), //Fkusuarios = Usuarioid, //Tipooperacion = operacion, Costeadicionalmaterial = linea.Costeadicionalmaterial * operacion, Costeadicionalotro = linea.Costeadicionalotro * operacion, Costeadicionalvariable = linea.Costeadicionalvariable * operacion, Costeadicionalportes = linea.Costeadicionalportes * operacion, Tipodealmacenlote = linea.Tipodealmacenlote, Tipomovimiento = movimiento }; movimientosStockService.GenerarMovimiento(model, movimiento); } } }
private List <TransformacioneslotesLinModel> GenerarLineasConStock(List <TransformacioneslotesLinModel> listado, TransformacioneslotesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId) { var stockactualService = new StockactualService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var lotesService = new LotesService(_context); foreach (var linea in model.Lineas) { if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid))) { var stockObj = _db.Stockhistorico.Single( f => f.fkalmacenes == _context.Fkalmacen && f.empresa == _context.Empresa && f.lote == linea.Lote && f.loteid == linea.Loteid); var loteObj = lotesService.Get(stockObj.id.ToString()); articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo); var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel; var ancho = linea.Ancho; var largo = linea.Largo; var grueso = linea.Grueso; var item = familiaObj.Gestionstock ? stockactualService.GetArticuloPorLoteOCodigo( string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen, Empresa) as MovimientosstockModel : null; if (model.Modificarmedidas) { ancho = model.Ancho; largo = model.Largo; grueso = model.Grueso; } else { ancho = item?.Ancho ?? linea.Ancho; largo = item?.Largo ?? linea.Largo; grueso = item?.Grueso ?? linea.Grueso; } if (linea.Cantidad > item.Cantidad) { throw new ValidationException(string.Format("La cantidad indicada para el lote {0} es superior a la que hay en el stock actual", string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)))); } var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; var metros = UnidadesService.CalculaResultado(unidadesObj, articuloObj.Lotefraccionable ? model.Cantidad : linea.Cantidad, largo, ancho, grueso, model.Metros); linea.Metros = metros; listado.Add(new TransformacioneslotesLinModel() { Id = maxId++, Fkarticulos = linea.Fkarticulos, Descripcion = articuloObj.Descripcion, Lote = linea.Lote, Tabla = Funciones.Qint(linea.Loteid), Cantidad = articuloObj.Lotefraccionable ? model.Cantidad : linea.Cantidad, Largo = largo, Ancho = ancho, Grueso = grueso, Fkunidades = articuloObj.Fkunidades, Metros = metros, Decimalesmedidas = unidadesObj.Decimalestotales, Canal = model.Canal, Flagidentifier = Guid.NewGuid(), Precio = loteObj.Costenetocompra, Tipodealmacenlote = loteObj.Tipodealmacenlote } ); } } ValidarKit(listado, model); return(listado); }
private void ModificarLotesLineas(DivisionLotesModel model) { var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var familiaService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db); var contadorlotesService = FService.Instance.GetService(typeof(ContadoresLotesModel), _context, _db) as ContadoresLotesService; var vecetorincrementocontadores = new Dictionary <string, int>(); //Obtenemos el tipo de familia de la salida String excepcionesGeneradas = ""; int loteidMax = 0; var familiaObj = familiaService.get(ArticulosService.GetCodigoFamilia(model.LineasEntrada.First().Fkarticulos)) as FamiliasproductosModel; //OBTENEMOS CUAL ES EL ID MAX DE LA TABLA EN LA BASE DE DATOS if (familiaObj.Tipofamilia == TipoFamilia.Tabla) { //Maximo id tabla string lotehistorico = model.LineasEntrada.First().Lote ?? ""; List <String> lotesidString = _db.Stockhistorico.Where(f => f.empresa == model.Empresa && f.lote == lotehistorico).Select(f => f.loteid).ToList(); List <int> lotesidInt = new List <int>(); //Tenemos que pasar los string a Int porque no nos deja hacer converisones de datos en una consulta a la BD foreach (var lid in lotesidString) { int aux; if (int.TryParse(lid, out aux)) { lotesidInt.Add(aux); } } //Si ya hay una cantidad establecida, sacamos el maximo if (lotesidInt.Count > 0) { loteidMax = lotesidInt.Max(); } loteidMax++; } //PARA CADA UNA DE LAS ENTRADAS, LE VAMOS ASIGNANDO SU NUMERO DE TABLA CORRESPONDIENTE foreach (var item in model.LineasEntrada) { //Hay que generar el lote buscando el numero de la tabla mas alto en la bd if (!item.LoteAutomatico) { //Si es una tabla if (familiaObj.Tipofamilia == TipoFamilia.Tabla) { item.Lote = model.LineasSalida.First().Lote; //Mismo lote item.Tabla = loteidMax; //Distinto numero de tabla loteidMax++; } } //Bloques u otros if (item.LoteAutomatico) { //Si es un bloque if (familiaObj.Tipofamilia == TipoFamilia.Bloque || familiaObj.Tipofamilia == TipoFamilia.General) { if (!vecetorincrementocontadores.ContainsKey(familiaObj.Fkcontador)) { vecetorincrementocontadores.Add(familiaObj.Fkcontador, 0); } var loteObj = contadorlotesService.get(familiaObj.Fkcontador) as ContadoresLotesModel; //Bl var incremento = vecetorincrementocontadores[familiaObj.Fkcontador]; //190020 item.Lote = contadorlotesService.CreateLoteId(loteObj, ref incremento); //Bl-190020 vecetorincrementocontadores[familiaObj.Fkcontador] = incremento; item.Tabla = 0; } if (_db.Stockhistorico.Any(f => f.empresa == model.Empresa && f.lote == item.Lote && f.loteid == item.Tabla.ToString())) { excepcionesGeneradas += string.Format("El Lote: {0}.{1} ya existe en el Stock", item.Lote, item.Tabla); } } /* * //automatico * else * { * if (familiaObj.Tipofamilia == TipoFamilia.Tabla) * { * excepcionesGeneradas += " El tipo Tabla no puede generar lote automático"; * } * * else * { * if (familiaObj.Tipogestionlotes > Tipogestionlotes.Singestion) * { * if (!vecetorincrementocontadores.ContainsKey(familiaObj.Fkcontador)) * vecetorincrementocontadores.Add(familiaObj.Fkcontador, 0); * * var loteObj = contadorlotesService.get(familiaObj.Fkcontador) as ContadoresLotesModel; * * var incremento = vecetorincrementocontadores[familiaObj.Fkcontador]; * item.Lote = contadorlotesService.CreateLoteId(loteObj, ref incremento); * item.Tabla = 0; * * vecetorincrementocontadores[familiaObj.Fkcontador] = incremento; * } * } * } */ } if (!String.IsNullOrEmpty(excepcionesGeneradas)) { throw new ValidationException(excepcionesGeneradas); } }
private void GenerarMovimientosLineas(IEnumerable <TransformacioneslotesLinModel> lineas, TransformacioneslotesModel nuevo, TipoOperacionService movimiento, TrabajosModel trabajosObj, MaterialesModel materialesObj, bool finalizarstock = false) { var movimientosStockService = new MovimientosstockService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db); var serializer = new Serializer <TransformacioneslotesDiarioStockSerializable>(); var vectorArticulos = new Hashtable(); var operacion = 1; if (movimiento == TipoOperacionService.InsertarTransformacionloteStock) { operacion = -1; } //Rai // Ordenamos lineas por articulo y cantidad para procesar primero las positivas evitando error stock negativo no autorizado // (ya que se procesan las lineas antes existentes con cantidad negativa para quitarlas // y luego se añade las lineas de grid cantidad +) var mylineas = lineas.OrderBy(x => x.Fkarticulos).ThenByDescending(x => x.Cantidad).ToList(); foreach (var linea in mylineas) { //Rai -- sustituye el codigo del acabado y el codigo del material en caso de que sea necesario var codigoarticulonuevo = linea.Fkarticulos; var acabado = !string.IsNullOrEmpty(trabajosObj.Fkacabadofinal) ? trabajosObj.Fkacabadofinal : ArticulosService.GetCodigoAcabado(linea.Fkarticulos); var material = !string.IsNullOrEmpty(materialesObj.Id) ? materialesObj.Id : ArticulosService.GetCodigoMaterial(linea.Fkarticulos); codigoarticulonuevo = string.Format("{0}{1}{2}{3}{4}", ArticulosService.GetCodigoFamilia(linea.Fkarticulos), material, ArticulosService.GetCodigoCaracteristica(linea.Fkarticulos), ArticulosService.GetCodigoGrosor(linea.Fkarticulos), acabado); if (!articulosService.exists(codigoarticulonuevo)) { throw new Exception(string.Format("El articulo {0} no existe", codigoarticulonuevo)); } ArticulosModel articuloObj; if (vectorArticulos.ContainsKey(linea.Fkarticulos)) { articuloObj = vectorArticulos[linea.Fkarticulos] as ArticulosModel; } else { articuloObj = articulosService.get(linea.Fkarticulos) as ArticulosModel; vectorArticulos.Add(linea.Fkarticulos, articuloObj); } var aux = Funciones.ConverterGeneric <TransformacionesloteslinSerialized>(linea); if (articuloObj?.Gestionstock ?? false) { var model = new MovimientosstockModel { Empresa = nuevo.Empresa, Fkalmacenes = nuevo.Fkalmacen, Fkalmaceneszona = Funciones.Qint(nuevo.Fkzonas), Fkarticulos = codigoarticulonuevo, //linea.Fkarticulos Referenciaproveedor = "", Fkcontadorlote = linea.Fkcontadoreslotes, Lote = linea.Lote, Loteid = (linea.Tabla ?? 0).ToString(), Tag = "", Fkunidadesmedida = linea.Fkunidades, Largo = linea.Largo ?? 0, Ancho = linea.Ancho ?? 0, Grueso = linea.Grueso ?? 0, Documentomovimiento = serializer.GetXml( new TransformacioneslotesDiarioStockSerializable { Id = nuevo.Id.Value, Referencia = nuevo.Referencia, Fechadocumento = nuevo.Fechadocumento, Codigoproveedor = nuevo.Fkproveedores, Fkarticulosnuevo = codigoarticulonuevo, Linea = aux }), Fkusuarios = Usuarioid, //Tipooperacion = operacion, Cantidad = (linea.Cantidad ?? 0) * operacion, Metros = (linea.Metros ?? 0) * operacion, Costeadicionalmaterial = linea.Costeadicionalmaterial, Costeadicionalotro = linea.Costeadicionalotro, Costeadicionalvariable = linea.Costeadicionalvariable, Costeadicionalportes = linea.Costeadicionalportes, Tipomovimiento = movimiento }; var tipooperacion = finalizarstock ? TipoOperacionService.FinalizarTransformacionloteStock : linea.Nueva ? TipoOperacionService.InsertarTransformacionloteStock : TipoOperacionService.ActualizarTransformacionloteStock; var currentValidationService = _validationService as TransformacioneslotesValidation; if (currentValidationService.ModificarCostes) { tipooperacion = TipoOperacionService.ActualizarcosteTransformacionloteStock; } if (tipooperacion == TipoOperacionService.InsertarTransformacionloteStock) { model.Cantidad = -model.Cantidad; } movimientosStockService.GenerarMovimiento(model, tipooperacion); } } }
public List <DivisionLotesentradaLinModel> CrearUnaNuevaLineaEntrada(DivisionLotessalidaLinModel first, List <DivisionLotesentradaLinModel> listadoEntrada, double?cantidad) { //CODE DivisionLotesentradaLinModel d1 = new DivisionLotesentradaLinModel(); d1.Cantidad = 1; if (listadoEntrada?.Count == 0) { d1.Id = 1; } else { d1.Id = (listadoEntrada?.Max(l => l.Id) ?? 0) + 1; } //Obtenemos la familoa a la que pertenece ese articulo var familiaService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db); var familiaObj = familiaService.get(ArticulosService.GetCodigoFamilia(first.Fkarticulos)) as FamiliasproductosModel; //Si es una tabla, son metros cuadrados y el lote es el mismo pero la tabla es el maximo de la BD + 1 if (familiaObj.Tipofamilia == TipoFamilia.Tabla) { d1.Cantidad = cantidad; d1.Largo = first.Largo / 2; d1.Ancho = first.Ancho; d1.Grueso = first.Grueso; d1.Metros = d1.Ancho * d1.Largo * d1.Cantidad; d1.Lote = first.Lote; d1.LoteAutomatico = false; d1.Decimalesmonedas = first.Decimalesmonedas; d1.Decimalesmedidas = first.Decimalesmedidas; } //Si es un bloque, metros 3 y el lote es automatico else if (familiaObj.Tipofamilia == TipoFamilia.Bloque) { d1.Cantidad = cantidad; d1.Largo = first.Largo / 2; d1.Ancho = first.Ancho; d1.Grueso = first.Grueso; d1.Metros = d1.Ancho * d1.Largo * d1.Grueso * d1.Cantidad; d1.Tabla = 0; d1.Lote = "Lote " + ((listadoEntrada?.Count() ?? 0) + 1).ToString(); d1.LoteAutomatico = true; d1.Decimalesmonedas = first.Decimalesmonedas; d1.Decimalesmedidas = first.Decimalesmedidas; } //Si son losas else { d1.Cantidad = cantidad; d1.Largo = first.Largo; d1.Ancho = first.Ancho; d1.Grueso = first.Grueso; d1.Metros = d1.Largo * d1.Ancho * d1.Cantidad; d1.Tabla = 0; d1.Lote = "Lote " + ((listadoEntrada?.Count() ?? 0) + 1).ToString(); d1.LoteAutomatico = true; d1.Decimalesmonedas = first.Decimalesmonedas; d1.Decimalesmedidas = first.Decimalesmedidas; } d1.Fkarticulos = first.Fkarticulos; d1.Descripcion = first.Descripcion; d1.Tipodealmacenlote = first.Tipodealmacenlote; d1.Fkunidades = first.Fkunidades; d1.Canal = first.Canal; listadoEntrada.Add(d1); return(listadoEntrada); }
private List <AlbaranesLinModel> GenerarLineasConStock(List <AlbaranesLinModel> listado, AlbaranesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId) { var stockactualService = new StockactualService(_context, _db); var articulosService = FService.Instance.GetService(typeof(ArticulosModel), _context, _db) as ArticulosService; var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var tiposivaService = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService; var monedasService = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService; var monedasObj = monedasService.get(model.Fkmonedas) as MonedasModel; foreach (var linea in model.Lineas) { if (!listado.Any(f => f.Lote == linea.Lote && f.Tabla == Funciones.Qint(linea.Loteid))) { articuloObj = articulosService.GetArticulo(linea.Fkarticulos, model.Fkcuenta, model.Fkmonedas, model.Fkregimeniva, model.Flujo); var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(linea.Fkarticulos)) as FamiliasproductosModel; var ancho = linea.Ancho; var largo = linea.Largo; var grueso = linea.Grueso; var item = familiaObj.Gestionstock ? stockactualService.GetArticuloPorLoteOCodigo( string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)), model.Fkalmacen, Empresa) as MovimientosstockModel : null; if (model.Modificarmedidas) { ancho = model.Ancho; largo = model.Largo; grueso = model.Grueso; } else { ancho = item?.Ancho ?? linea.Ancho; largo = item?.Largo ?? linea.Largo; grueso = item?.Grueso ?? linea.Grueso; } if (linea.Cantidad > item.Cantidad) { throw new ValidationException(string.Format("La cantidad indicada para el lote {0} es superior a la que hay en el stock actual", string.Format("{0}{1}", linea.Lote, Funciones.RellenaCod(linea.Loteid, 3)))); } var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; var tiposivaObj = tiposivaService.get(articuloObj.Fktiposiva) as TiposIvaModel; var metros = UnidadesService.CalculaResultado(unidadesObj, articuloObj.Lotefraccionable ? model.Cantidad :linea.Cantidad, largo, ancho, grueso, model.Metros); linea.Metros = metros; var bruto = linea.Metros * model.Precio; var importedescuento = Math.Round(((bruto) * model.Descuento / 100.0), model.Decimalesmonedas); var total = bruto - importedescuento; listado.Add(new AlbaranesLinModel() { Nueva = true, Id = maxId++, Fkarticulos = linea.Fkarticulos, Descripcion = articuloObj.Descripcion, Lote = linea.Lote, Tabla = Funciones.Qint(linea.Loteid), Tblnum = Funciones.Qint(linea.Loteid), Cantidad = articuloObj.Lotefraccionable ? model.Cantidad : linea.Cantidad, Largo = largo, Ancho = ancho, Grueso = grueso, Fkunidades = articuloObj.Fkunidades, Metros = metros, Precio = model.Precio, Porcentajedescuento = model.Descuento, Importedescuento = importedescuento, Importe = total, Decimalesmedidas = unidadesObj.Decimalestotales, Decimalesmonedas = monedasObj.Decimales, Fktiposiva = tiposivaObj.Id, Porcentajeiva = tiposivaObj.PorcentajeIva, Porcentajerecargoequivalencia = tiposivaObj.PorcentajeRecargoEquivalencia, Bundle = model.Tipopieza == TipoPieza.Bundle ? model.Lote.Replace(linea.Lote, string.Empty) : string.Empty, Caja = model.Caja, Canal = model.Canal, Flagidentifier = Guid.NewGuid() } ); } } ValidarKit(listado, model); return(listado); }
public List <AlbaranesLinModel> GenerarLineasSinStock(List <AlbaranesLinModel> listado, AlbaranesLinVistaModel model, ArticulosDocumentosModel articuloObj, int maxId) { var familiasService = FService.Instance.GetService(typeof(FamiliasproductosModel), _context, _db) as FamiliasproductosService; var unidadesService = FService.Instance.GetService(typeof(UnidadesModel), _context, _db) as UnidadesService; var tiposivaService = FService.Instance.GetService(typeof(TiposIvaModel), _context, _db) as TiposivaService; var monedasService = FService.Instance.GetService(typeof(MonedasModel), _context, _db) as MonedasService; var monedasObj = monedasService.get(model.Fkmonedas) as MonedasModel; var familiaObj = familiasService.get(ArticulosService.GetCodigoFamilia(model.Fkarticulos)) as FamiliasproductosModel; var ancho = model.Ancho; var largo = model.Largo; var grueso = model.Grueso; if (model.Modificarmedidas) { ancho = model.Ancho; largo = model.Largo; grueso = model.Grueso; } else { ancho = articuloObj.Ancho.Value; largo = articuloObj.Largo.Value; grueso = articuloObj.Grueso.Value; } var unidadesObj = unidadesService.get(familiaObj.Fkunidadesmedida) as UnidadesModel; var tiposivaObj = tiposivaService.get(articuloObj.Fktiposiva) as TiposIvaModel; var metros = UnidadesService.CalculaResultado(unidadesObj, model.Cantidad, largo, ancho, grueso, model.Metros); model.Metros = metros; var bruto = model.Metros * model.Precio; var importedescuento = Math.Round(((bruto) * model.Descuento / 100.0), model.Decimalesmonedas); var total = bruto - importedescuento; listado.Add(new AlbaranesLinModel() { Nueva = true, Id = maxId++, Fkarticulos = model.Fkarticulos, Descripcion = articuloObj.Descripcion, Cantidad = model.Cantidad, Largo = largo, Ancho = ancho, Grueso = grueso, Fkunidades = articuloObj.Fkunidades, Metros = metros, Precio = model.Precio, Porcentajedescuento = model.Descuento, Importedescuento = importedescuento, Importe = total, Decimalesmedidas = unidadesObj.Decimalestotales, Decimalesmonedas = monedasObj.Decimales, Fktiposiva = tiposivaObj.Id, Porcentajeiva = tiposivaObj.PorcentajeIva, Porcentajerecargoequivalencia = tiposivaObj.PorcentajeRecargoEquivalencia, Canal = model.Canal } ); return(listado); }
public void ValidarDimensiones(string articulo, double?largo, double?ancho, double?grueso) { var familiacodigo = ArticulosService.GetCodigoFamilia(articulo); ValidarDimensiones(familiacodigo, largo, ancho, grueso, articulo); }
public static void GestionarLote(ArticulosModel articulo, FamiliasproductosModel familia, IEnumerable <IDocumentosLinModel> lineas, IDocumentoLinVistaModel linea, out string lote, out string loteautomaticoid, out int lotenuevocontador, out int?tabla) { lote = ""; loteautomaticoid = ""; lotenuevocontador = 0; tabla = null; if (articulo.Tipogestionlotes == Tipogestionlotes.Loteobligatorio || (articulo.Tipogestionlotes == Tipogestionlotes.Loteopcional && (linea.Loteautomatico || !string.IsNullOrEmpty(linea.Lote)))) { var contadorLotes = 1; //Si Lote automatico if (linea.Loteautomatico && string.IsNullOrEmpty(linea.Lote))//Lote automatico y es un nuevo lote { contadorLotes = lineas.Any(f => f.Lotenuevocontador > 0) ? lineas.Max(f => f.Lotenuevocontador) : 0; contadorLotes++; } else if (linea.Loteautomatico && !string.IsNullOrEmpty(linea.Lote))//Si el lote es automatico y ya existe { contadorLotes = lineas.First(f => (f.Loteautomaticoid?.ToLower() ?? string.Empty) == linea.Lote.ToLower()).Lotenuevocontador; } else if (!linea.Loteautomatico && !string.IsNullOrEmpty(linea.Lote)) //Si el lote es manual { contadorLotes = lineas.Any(f => f.Lote.ToLower() == linea.Lote.ToLower()) ? lineas.Max(f => f.Lotenuevocontador) : 0; //comprbamos que si el lote manual existe y asignamos el siguiente contador, sino usamos el 0 por defecto contadorLotes++; } else { throw new ValidationException(RAlbaranes.ErrorGestionLotes); } lote = linea.Loteautomatico ? RAlbaranes.Lote + (contadorLotes) : linea.Lote; loteautomaticoid = linea.Loteautomatico && string.IsNullOrEmpty(linea.Lote) ? Guid.NewGuid().ToString() : linea.Lote; var loteactual = linea.Loteautomatico ? loteautomaticoid : lote; //no se pueden duplicar lotes para elementos tipos tablas if (linea.Tipofamilia != TipoFamilia.Tabla && lineas.Any(f => f.Lote == loteactual || f.Loteautomaticoid == loteactual)) { throw new ValidationException(RAlbaranes.ErrorLoteRepetido); } if (!linea.Loteautomatico && lineas.Any(f => f.Lote == loteactual)) { //comprobar las condiciones var oldlinea = lineas.First(f => f.Lote == loteactual); var oldfamilia = ArticulosService.GetCodigoFamilia(oldlinea.Fkarticulos); var oldmaterial = ArticulosService.GetCodigoMaterial(oldlinea.Fkarticulos); var newfamilia = ArticulosService.GetCodigoFamilia(linea.Fkarticulos); var newmaterial = ArticulosService.GetCodigoMaterial(linea.Fkarticulos); if (oldfamilia != newfamilia || oldmaterial != newmaterial) { throw new ValidationException(string.Format("No se puede agregar el artículo al lote {0} porque las propiedades del lote no coinciden con las del artículo nuevo", loteactual)); } } loteautomaticoid = linea.Loteautomatico ? loteautomaticoid : string.Empty; lotenuevocontador = contadorLotes; if (familia.Tipofamilia == TipoFamilia.Tabla) { tabla = linea.Loteautomatico ? null : (int?) (lineas.Any() ? (lineas.Where(f => f.Lote == linea.Lote).Max(j => j.Tabla) + 1 ?? 1) : 1); } else if (!string.IsNullOrEmpty(lote)) { tabla = linea.Loteautomatico ? null : (int?)0; } } }