public override void create(IModelView obj) { using (var tran = TransactionScopeBuilder.CreateTransactionObject()) { var model = obj as DivisionLotesModel; //Calculo id entradas int index = 1; foreach (var lin in model.LineasEntrada) { lin.Id = index; index++; } //Calculo id salidas index = 1; foreach (var lin in model.LineasSalida) { lin.Id = index; index++; } //Validacion previa para las salidas. var validacionPrevia = _validationService as DivisionLotesValidation; validacionPrevia.ValidarSalidas(model); validacionPrevia.ValidarEntradas(model); //Calculamos los lotes de las lineas generadas ModificarLotesLineas(model); //Costes de las entradas var lotesService = new LotesService(_context); CalcularPrecioPiezasEntrada(model.LineasEntrada, model.LineasSalida.Sum(f => lotesService.GetByReferencia(string.Format("{0}{1}", f.Lote, f.Tabla)).Costeneto) ?? 0); //Costes adicionales RepartirCostesLineas(model.LineasEntrada, model.Costes); //Creamos la referencia var contador = ServiceHelper.GetNextId <DivisionLotes>(_db, Empresa, model.Fkseries); var identificadorsegmento = ""; model.Referencia = ServiceHelper.GetReference <DivisionLotes>(_db, model.Empresa, model.Fkseries, contador, model.Fechadocumento.Value, out identificadorsegmento); model.Identificadorsegmento = identificadorsegmento; //Cuando se crea la Division de lotes, pasa de en curso a finalizado var estadosService = FService.Instance.GetService(typeof(EstadosModel), _context, _db) as EstadosService; var listestados = estadosService.GetStates(DocumentoEstado.DivisionesLotes); //Lista de estados var estado = listestados.First(f => f.Tipoestado == TipoEstado.Finalizado); model.Fkestados = estado.CampoId; //Llamamos al base base.create(obj); //Generamos movimientos de salida GenerarMovimientosLineasSalida(model.LineasSalida, model, TipoOperacionService.InsertarDivisionLotesSalidaStock); //Generamos movimientos de entrada GenerarMovimientosLineasEntrada(model.LineasEntrada.ToList(), model, TipoOperacionService.InsertarDivisionLotesEntradaStock); //Guardamos los cambios _db.SaveChanges(); tran.Complete(); } }
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); }
public override void create(IModelView obj) { using (var tran = Marfil.Inf.Genericos.Helper.TransactionScopeBuilder.CreateTransactionObject()) { var model = obj as AlbaranesModel; var validation = _validationService as AlbaranesValidation; validation.EjercicioId = EjercicioId; //Calculo ID var contador = ServiceHelper.GetNextId <Albaranes>(_db, Empresa, model.Fkseries); var identificadorsegmento = ""; model.Referencia = ServiceHelper.GetReference <Albaranes>(_db, model.Empresa, model.Fkseries, contador, model.Fechadocumento.Value, out identificadorsegmento); model.Identificadorsegmento = identificadorsegmento; DocumentosHelpers.GenerarCarpetaAsociada(model, TipoDocumentos.AlbaranesVentas, _context, _db); //Actualizar precios si estos son = 0 ApplicationHelper app = new ApplicationHelper(_context); if (app.GetListTiposAlbaranes().Where(f => f.EnumInterno == model.Tipoalbaran).Select(f => f.CosteAdq).SingleOrDefault()) { foreach (var l in model.Lineas) { if (l.Importe == null || l.Importe == 0) { var lotesService = new LotesService(_context); l.Precio = Math.Round((double)_db.Stockhistorico.Where(f => f.empresa == _context.Empresa && f.lote == l.Lote && f.loteid == l.Tabla.ToString() && f.fkarticulos == l.Fkarticulos) .Select(f => f.preciovaloracion + f.costeacicionalvariable / f.metrosentrada + f.costeadicionalmaterial / f.metrosentrada + f.costeadicionalotro / f.metrosentrada + f.costeadicionalportes / f.metrosentrada).SingleOrDefault(), 2); l.Importe = Math.Round((double)((decimal)l.Precio * (decimal)l.Metros), l.Decimalesmonedas ?? 2); } } } if (!string.IsNullOrWhiteSpace(model.Fkpedidos)) { foreach (var lineaAlbaran in model.Lineas) { if (lineaAlbaran.Precio == 0) { var idPedido = _db.Pedidos.Where(f => f.empresa == model.Empresa && f.referencia == model.Fkpedidos).Select(f => f.id).SingleOrDefault(); var lineasPedido = _db.PedidosLin.Where(f => f.empresa == model.Empresa && f.fkpedidos == idPedido); foreach (var lineaPedido in lineasPedido) { if (lineaAlbaran.Fkarticulos == lineaPedido.fkarticulos) { lineaAlbaran.Precio = lineaPedido.precio; lineaAlbaran.Importe = Math.Round((double)((lineaAlbaran.Metros * lineaAlbaran.Precio) - (lineaAlbaran.Metros * lineaAlbaran.Precio * (lineaAlbaran.Porcentajedescuento / 100))), 2); } } } } } //fin actualizar precios base.create(obj); ModificarCantidadesPedidasPedidos(obj as AlbaranesModel); ModificarMovimientosArticulos(obj as AlbaranesModel); _db.SaveChanges(); tran.Complete(); } }