/// <summary>
        /// Cria todas as restrições relativas às horas regulares de trabalho disponíveis
        /// </summary>
        /// <param name="entrada">Instância de <see cref="EntradaViewModel"/> contendo os dados informados na planilha de dados</param>
        private void CriaRestricaoHE(EntradaViewModel entrada)
        {
            foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
            {
                var diaSemanaEnum = (DiaDaSemana)diaSemana;

                var expressaoLinear = new GRBLinExpr();

                var cargaHorariaExtraDisponivelDiaria = entrada.CargaHorariaExtraDisponivel[diaSemanaEnum];

                entrada.Produtos.ForEach(produto =>
                {
                    var taxaProducao    = produto.GetTaxaUnidadeHora();
                    var variavelProduto = _varArray[produto.GetNomeVariavel(diaSemanaEnum, true)];

                    expressaoLinear.AddTerm(taxaProducao, variavelProduto);
                });

                _grbModel.AddConstr(
                    expressaoLinear,
                    GRB.LESS_EQUAL,
                    cargaHorariaExtraDisponivelDiaria,
                    $"HorasExtrasDisponiveis[{diaSemana}]"
                    );
            }
        }
        public async Task <IActionResult> CreateGeneric(EntradaViewModel vm, long empresaId)
        {
            try
            {
                ViewBag.EmpresaId = empresaId;
                ViewBag.EventoId  = vm.EventoId;
                if (!ModelState.IsValid)
                {
                    throw new Exception("Error de validacion no controlado");
                }

                var entradaDto = new EntradaDto()
                {
                    EventoId      = vm.EventoId,
                    ClienteId     = null,
                    Precio        = vm.Precio,
                    TipoEntradaId = vm.TipoEntradaId
                };

                await _entradaServicio.Insertar(entradaDto);

                return(RedirectToAction("ListGeneric", new { eventoId = entradaDto.EventoId, empresaId }));
            }
            catch (Exception)
            {
                return(View(vm));
            }
        }
        public async Task <IActionResult> Details(long id, long eventoId)
        {
            try
            {
                var entrada = (EntradaDto)await _entradaServicio.Obtener(id);

                var model = new EntradaViewModel()
                {
                    Id            = entrada.Id,
                    EstaEliminado = entrada.EliminadoStr,
                    EventoId      = entrada.EventoId,
                    ClienteId     = entrada.ClienteId.Value,
                    Precio        = entrada.Precio,
                    TipoEntradaId = entrada.TipoEntradaId,
                    Evento        = await _helperEvento.Obtener(entrada.EventoId),
                    Cliente       = await _helperCliente.Obtener(entrada.ClienteId.Value),
                    TipoEntrada   = await _helperTipoEntrada.Obtener(entrada.TipoEntradaId)
                };

                return(new ViewAsPdf("PDF", model));
            }
            catch (Exception)
            {
                return(RedirectToAction("List", new { eventoId }));
            }
        }
        /// <summary>
        /// Cria todas as restrições relativas às demandas mínimas de cada produto por dia
        /// </summary>
        /// <param name="entrada">Instância de <see cref="EntradaViewModel"/> contendo os dados informados na planilha de dados</param>
        private void CriaRestricaoDemandaMinima(EntradaViewModel entrada)
        {
            entrada.Produtos.ForEach(item =>
            {
                foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
                {
                    GRBLinExpr qtdeProdutoExcessoDiaAnterior;
                    var diaSemanaEnum = (DiaDaSemana)diaSemana;

                    var qtdeProdutoHR      = _varArray[item.GetNomeVariavel(diaSemanaEnum)];
                    var qtdeProdutoHE      = _varArray[item.GetNomeVariavel(diaSemanaEnum, true)];
                    var qtdeProdutoExcesso = _varArray[item.GetNomeVariavel(diaSemanaEnum, isExcesso: true)];
                    var demandaProdutoDia  = item.Demanda[diaSemanaEnum];
                    var diaAnteriorEnum    = EnumHelper.DiaAnterior(diaSemanaEnum);

                    if (diaSemanaEnum == DiaDaSemana.Segunda)
                    {
                        qtdeProdutoExcessoDiaAnterior = 0;
                    }
                    else
                    {
                        qtdeProdutoExcessoDiaAnterior = _varArray[item.GetNomeVariavel(diaAnteriorEnum, isExcesso: true)];
                    }

                    _grbModel.AddConstr(
                        qtdeProdutoExcessoDiaAnterior + qtdeProdutoHE + qtdeProdutoHR - qtdeProdutoExcesso,
                        GRB.GREATER_EQUAL,
                        demandaProdutoDia,
                        $"DemandaMinima[{item.Nome}][{diaSemanaEnum}]"
                        );
                }
            });
        }
        public async Task <IActionResult> EditGeneric(long id, long eventoId, long empresaId)
        {
            var dto = (EntradaDto)await _entradaServicio.Obtener(id);

            if (dto == null)
            {
                return(RedirectToAction("ListGeneric", new { eventoId, empresaId }));
            }

            if (dto.ClienteId != null)
            {
                return(RedirectToAction("ListGeneric", new { eventoId, empresaId }));
            }

            var model = new EntradaViewModel()
            {
                Id            = dto.Id,
                EstaEliminado = dto.EliminadoStr,
                EventoId      = dto.EventoId,
                ClienteId     = null,
                Precio        = dto.Precio,
                TipoEntradaId = dto.TipoEntradaId,
                TiposEntradas = await _helperTipoEntrada.PoblarSelect(empresaId)
            };

            ViewBag.EmpresaId = empresaId;
            return(View(model));
        }
예제 #6
0
        public EntradasView()
        {
            InitializeComponent();
            DataContext = new EntradaViewModel();

            entradas = evm.context.context.entrada.ToList();
        }
        /// <summary>
        /// Gera a saída do problema para escrita na planilha
        /// </summary>
        /// <param name="entrada">Instância de <see cref="EntradaViewModel"/> contendo os dados informados na planilha de dados</param>
        /// <returns>Instancia de <see cref="SaidaViewModel"/> com a quantidade de produção diária para atender a demanda</returns>
        private SaidaViewModel GeraSaidaViewModel(EntradaViewModel entrada)
        {
            var saidaViewModel = new SaidaViewModel
            {
                Produtos = entrada.Produtos
            };

            saidaViewModel.Produtos.ForEach(produto =>
            {
                foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
                {
                    var diaSemanaEnum = (DiaDaSemana)diaSemana;

                    var producaoHR = Convert.ToInt32(_grbModel.GetVarByName(produto.GetNomeVariavel(diaSemanaEnum)).X);
                    var producaoHE = Convert.ToInt32(_grbModel.GetVarByName(produto.GetNomeVariavel(diaSemanaEnum, true)).X);
                    var excesso    = Convert.ToInt32(_grbModel.GetVarByName(produto.GetNomeVariavel(diaSemanaEnum, isExcesso: true)).X);

                    if (producaoHE > 0)
                    {
                        saidaViewModel.TeveHoraExtra[diaSemanaEnum] = true;
                    }

                    produto.Producao[diaSemanaEnum] = producaoHR + producaoHE;
                    produto.Excesso[diaSemanaEnum]  = excesso;
                }
            });

            return(saidaViewModel);
        }
예제 #8
0
 public ActionResult Create(EntradaViewModel entradaViewModel)
 {
     try
     {
         entradaViewModel = _entradaServicoAplicacao.Adicionar(entradaViewModel);
         return(RedirectToAction("Details", new { id = entradaViewModel.Id }));
     }
     catch
     {
         return(View());
     }
 }
예제 #9
0
        public IActionResult Index()
        {
            var marcas  = marcaRepositorio.Listar();
            var modelos = modeloRepositorio.Listar();

            EntradaViewModel entrada = new EntradaViewModel();

            entrada.Marcas  = marcas;
            entrada.Modelos = modelos;

            return(View(entrada));
        }
예제 #10
0
 public ActionResult Delete(EntradaViewModel entradaViewModel)
 {
     try
     {
         _entradaServicoAplicacao.Excluir(entradaViewModel.Id);
         return(RedirectToAction(nameof(Index)));
     }
     catch
     {
         return(View());
     }
 }
예제 #11
0
 public ActionResult Edit(EntradaViewModel entradaViewModel)
 {
     try
     {
         _entradaServicoAplicacao.Atualizar(entradaViewModel);
         return(RedirectToAction("Details", new { id = entradaViewModel.Id }));
     }
     catch
     {
         return(View());
     }
 }
예제 #12
0
 public EntradaViewModel Adicionar(EntradaViewModel entradaViewModel)
 {
     try
     {
         //var produto = _mapper.Map<Produto>(produtoViewModel);
         var entrada = new Entrada();
         _mapper.Map(entradaViewModel, entrada);
         _entradaServicoDominio.Adicionar(entrada);
         return(_mapper.Map(entrada, entradaViewModel));
     }
     catch (Exception e)
     {
         throw e;
     }
 }
        /// <summary>
        /// Cria todas as variáveis do problema, que são a quantidade de produto que deve ser feita por dia, tanto em horas
        /// regulares quanto em horas extra
        /// </summary>
        /// <param name="entrada">Instância de <see cref="EntradaViewModel"/> contendo os dados informados na planilha de dados</param>
        void CriaVariaveis(EntradaViewModel entrada)
        {
            entrada.Produtos.ForEach(item => {
                foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
                {
                    var produtoHR      = item.GetNomeVariavel((DiaDaSemana)diaSemana, false);
                    var produtoHE      = item.GetNomeVariavel((DiaDaSemana)diaSemana, true);
                    var produtoExcesso = item.GetNomeVariavel((DiaDaSemana)diaSemana, isExcesso: true);

                    _varArray.Add(produtoHR, _grbModel.AddVar(0, double.MaxValue, 1, GRB.CONTINUOUS, produtoHR));
                    _varArray.Add(produtoHE, _grbModel.AddVar(0, double.MaxValue, 1, GRB.CONTINUOUS, produtoHE));
                    _varArray.Add(produtoExcesso, _grbModel.AddVar(0, double.MaxValue, 1, GRB.CONTINUOUS, produtoExcesso));
                }
            });
        }
        public async Task <IActionResult> CreateGeneric(long eventoId, long empresaId)
        {
            ViewBag.EventoId  = eventoId;
            ViewBag.EmpresaId = empresaId;

            var tipos = await _helperTipoEntrada.PoblarSelect(empresaId);

            // poblar el combo de tipo entrada
            var model = new EntradaViewModel()
            {
                EventoId      = eventoId,
                TiposEntradas = tipos
            };

            return(View(model));
        }
예제 #15
0
        //Entradas

        /// <summary>
        /// Convertir clase EntradaviewModel a Entrada.
        /// </summary>
        /// <param name="entradaViewModel"></param>
        /// <param name="isNew"></param>
        /// <returns></returns>
        public async Task <Entrada> ToEntradaAsync(EntradaViewModel entradaViewModel, bool isNew)
        {
            return(new Entrada()
            {
                Aplicado = entradaViewModel.Aplicado,
                EntradaID = isNew ? Guid.NewGuid() : entradaViewModel.EntradaID,
                Fecha = entradaViewModel.Fecha,
                FechaActualizacion = DateTime.Now,
                FechaCreacion = isNew ? DateTime.Now : entradaViewModel.FechaCreacion,
                Folio = entradaViewModel.Folio.Trim().ToUpper(),
                Observaciones = entradaViewModel.Observaciones == null ? "" : entradaViewModel.Observaciones.Trim().ToUpper(),
                ProveedorID = entradaViewModel.ProveedorID,
                UsuarioID = entradaViewModel.UsuarioID,
                Proveedores = await _getHelper.GetProveedorByIdAsync((Guid)entradaViewModel.ProveedorID)
            });
        }
        /// <summary>
        /// Executa os passos da criação e resolução do modelo
        /// </summary>
        /// <param name="entrada">Instância de <see cref="EntradaViewModel"/> contendo os dados informados na planilha de dados</param>
        /// <returns>Instancia de <see cref="SaidaViewModel"/> com a quantidade de produção diária para atender a demanda</returns>
        public SaidaViewModel Run(EntradaViewModel entrada)
        {
            CriaVariaveis(entrada);

            CriaFuncaoObjetivo(entrada);

            CriaRestricaoHR(entrada);

            CriaRestricaoHE(entrada);

            CriaRestricaoDemandaMinima(entrada);

            OtimizaModelo();

            return(GeraSaidaViewModel(entrada));
        }
예제 #17
0
        public async Task <EntradaViewModel> ObtenerEntrada(long id)
        {
            var e = (EntradaDto)await _entradaServicio.Obtener(id);

            var model = new EntradaViewModel()
            {
                Id            = e.Id,
                TipoEntradaId = e.TipoEntradaId,
                Precio        = e.Precio,
                EventoId      = e.EventoId,
                Evento        = await _helperEvento.Obtener(e.EventoId),
                TipoEntrada   = await _helperTipoEntrada.Obtener(e.TipoEntradaId),
                ClienteId     = e.ClienteId
            };

            return(model);
        }
예제 #18
0
        /// <summary>
        /// Carrega informações dos arquivo input.xlsx
        /// </summary>
        private static void CarregaInformacoes()
        {
            Console.WriteLine("Iniciando leitura dos dados");
            _entradaViewModel = new EntradaViewModel();

            using (var stream = File.Open(_inputPath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = ExcelReaderFactory.CreateReader(stream))
                {
                    var result = reader.AsDataSet();

                    LeDadosDaEquipe(result.Tables[0]);
                    LeDadosDosProdutos(result.Tables[0]);
                }
            }
            Console.WriteLine("Leitura dos dados encerrada");
        }
예제 #19
0
        void AddRestricaoDemandaMinima(EntradaViewModel entrada)
        {
            entrada.Produtos.ForEach(produto =>
            {
                foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
                {
                    var produtoHR = produto.GetNomeVariavel((DiaDaSemana)diaSemana, false);
                    var produtoHE = produto.GetNomeVariavel((DiaDaSemana)diaSemana, true);
                    var demanda   = produto.Demanda[(DiaDaSemana)diaSemana];
                    var equacao   = _cplex.Prod(
                        produto.GetTaxaUnidadeHora(),
                        _variaveis[0][_varArray[produtoHR]],
                        _variaveis[0][_varArray[produtoHE]]
                        );

                    var restricao = _cplex.AddGe(equacao, demanda, $"RestricaoProducaoMinima_{produto.GetNomeLimpo()}_{diaSemana}");
                    _restricoesList.Add(restricao);
                }
            });
        }
예제 #20
0
        public SaidaViewModel EncontrarMelhorOpcao(EntradaViewModel entrada)
        {
            var dia     = ObterDiaSemana(entrada.DataBanho);
            var diaUtil = _repositorio.ObterDiasUteis().Contains(dia);

            var valores          = CalcularPreco(entrada, diaUtil);
            var valoresOrdenados = valores.OrderBy(pb => pb.PrecoBanho).ToList();
            var saida            = new SaidaViewModel();

            if (valoresOrdenados[0].PrecoBanho != valoresOrdenados[1].PrecoBanho)
            {
                saida.Canil = valoresOrdenados[0].Nome;
                saida.Preco = valoresOrdenados[0].PrecoBanho;
            }
            if (valoresOrdenados[0].PrecoBanho == valoresOrdenados[1].PrecoBanho && valoresOrdenados[0].PrecoBanho != valoresOrdenados[2].PrecoBanho)
            {
                var duasMenoresDistancias = new List <double> {
                    valoresOrdenados[0].Distancia, valoresOrdenados[1].Distancia
                };
                var menorDistancia = duasMenoresDistancias.Min();

                var petShop = valores.FirstOrDefault(ps => ps.Distancia == menorDistancia);

                saida.Canil = petShop.Nome;
                saida.Preco = petShop.PrecoBanho;
            }
            if (valoresOrdenados[0].PrecoBanho == valoresOrdenados[1].PrecoBanho && valoresOrdenados[0].PrecoBanho == valoresOrdenados[2].PrecoBanho)
            {
                var distancas = new List <double> {
                    valoresOrdenados[0].Distancia, valoresOrdenados[1].Distancia, valoresOrdenados[2].Distancia
                };
                var menorDistancia = distancas.Min();

                var petShop = valores.FirstOrDefault(ps => ps.Distancia == menorDistancia);

                saida.Canil = petShop.Nome;
                saida.Preco = petShop.PrecoBanho;
            }

            return(saida);
        }
예제 #21
0
        public List <PetShopViewModel> CalcularPreco(EntradaViewModel entrada, bool diaUtil)
        {
            var petShops = _repositorio.ObterPetShops();

            if (diaUtil)
            {
                foreach (var petShop in petShops)
                {
                    petShop.PrecoBanho = (entrada.QtdCaesGrandes * petShop.PrecoCaoGrandeDiaUtil) + (entrada.QtdCaesPequenos * petShop.PrecoCaoPequenoDiaUtil);
                }
            }
            else
            {
                foreach (var petShop in petShops)
                {
                    petShop.PrecoBanho = (entrada.QtdCaesGrandes * petShop.PrecoCaoGrandeFinalSemana) + (entrada.QtdCaesPequenos * petShop.PrecoCaoPequenoFinalSemana);
                }
            }

            return(petShops.ToList());
        }
예제 #22
0
        void CriaVariaveis(EntradaViewModel entrada)
        {
            entrada.Produtos.ForEach(item => {
                foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
                {
                    var produtoHR = item.GetNomeVariavel((DiaDaSemana)diaSemana, false);
                    var produtoHE = item.GetNomeVariavel((DiaDaSemana)diaSemana, true);

                    _varArray.Add(produtoHR, _varArray.Count);
                    _varArray.Add(produtoHE, _varArray.Count);
                }
            });

            var varArray = _cplex.NumVarArray(
                _varArray.Count,
                _varArray.Select(item => 0.0d).ToArray(),
                _varArray.Select(item => double.MaxValue).ToArray(),
                _varArray.Keys.ToArray()
                );

            _variaveis[1] = varArray;
        }
        /// <summary>
        /// Cria função objetivo
        /// </summary>
        /// <param name="entrada">Instância de <see cref="EntradaViewModel"/> contendo os dados informados na planilha de dados</param>
        private void CriaFuncaoObjetivo(EntradaViewModel entrada)
        {
            //Cria objeto de expressão linear para podermos gerar uma expressão linear de forma dinâmica
            var expressaoObjetivo = new GRBLinExpr();

            entrada.Produtos.ForEach(produto =>
            {
                var custoHR = produto.CustoRegular;
                var custoHE = produto.CustoHoraExtra;

                foreach (var diaSemana in Enum.GetValues(typeof(DiaDaSemana)))
                {
                    var diaSemanaEnum = (DiaDaSemana)diaSemana;

                    var qtdeProdutoHR = _varArray[produto.GetNomeVariavel(diaSemanaEnum)];
                    expressaoObjetivo.AddTerm(custoHR, qtdeProdutoHR);

                    var qtdeProdutoHE = _varArray[produto.GetNomeVariavel(diaSemanaEnum, true)];
                    expressaoObjetivo.AddTerm(custoHE, qtdeProdutoHE);
                }
            });

            _grbModel.SetObjective(expressaoObjetivo, GRB.MINIMIZE);
        }
예제 #24
0
 public void Run(EntradaViewModel entrada)
 {
     CriaVariaveis(entrada);
     AddRestricoes(entrada);
     //AddFuncaoObjetivo(entrada);
 }
예제 #25
0
 void AddFuncaoObjetivo(EntradaViewModel entrada)
 {
     double[] calculoFuncaoObjetivo = { };
     _cplex.AddMinimize(_cplex.ScalProd(_variaveis[1], calculoFuncaoObjetivo));
 }
예제 #26
0
        public void Atualizar(EntradaViewModel entradaViewModel)
        {
            var entrada = _mapper.Map <Entrada>(entradaViewModel);

            _entradaServicoDominio.Atualizar(entrada);
        }
예제 #27
0
        public IActionResult EncontrarMelhorOpcao([FromBody] EntradaViewModel entrada)
        {
            var saida = _encontraMelhorOpcaoServico.EncontrarMelhorOpcao(entrada);

            return(new OkObjectResult(new { message = "200 OK", saida }));
        }
예제 #28
0
 void AddRestricoes(EntradaViewModel entrada)
 {
     AddRestricaoDemandaMinima(entrada);
 }