예제 #1
0
        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);
        }
예제 #3
0
        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();
            }
        }