public JsonResult GuardarMaterial(Material model)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new MantenimientoServiceClient())
                {
                    if (model.Id == 0)
                    {
                        response.Data = service.GuardarMaterial(model);
                    }
                    else
                    {
                        response.Data = service.ActualizarMaterial(model);
                    }
                }

                response.Success = true;
            }
            catch (Exception ex)
            {
                LogError(ex);
                response.Message = ex.Message;
            }
            return Json(response);
        }
        public JsonResult EliminarMaterial(int id)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new MantenimientoServiceClient())
                {
                    response.Data = service.EliminarMaterial(id);
                }

                response.Success = true;
            }
            catch (Exception ex)
            {
                LogError(ex);
                response.Message = ex.Message;
            }
            return Json(response);
        }
        public JsonResult AprobarOrdenProduccionMasivo(List<int> ordenesProduccion)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new ProduccionServiceClient())
                {
                    service.AprobarMasivoOrdenesProduccion(ordenesProduccion);
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult ActualizarEstadoSecuencia(int idMaquina, string estado)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new ProduccionServiceClient())
                {
                    service.ActualizarEstadoOrdenProduccionSecuencia(OrdenProduccionActual.Id, idMaquina, estado);
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult AprobarOrdenProduccionIndividual(int id)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new ProduccionServiceClient())
                {
                    service.AprobarIndividualOrdenProduccion(id);
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult BuscarMaquina(string descripcion, string tipo, string pld, string configuracion)
        {
            var response = new JsonResponse();
            try
            {
                IList<Maquina> maquinas;
                using (var service = new ProduccionServiceClient())
                {
                    maquinas = service.ListarMaquinaPorBusqueda(descripcion, tipo, pld, configuracion);
                }

                response.Data = maquinas;
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult BuscarMaterial(string codigo, string descripcion, int tipo, int min, int max, int estado)
        {
            var response = new JsonResponse();
            try
            {
                IList<Material> materiales;
                using (var service = new MantenimientoServiceClient())
                {
                    materiales = service.ListarMateriales(codigo, descripcion, tipo, min, max, estado);
                }

                response.Data = materiales;
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult ValidarHorarioMaquina(int idMaquina, string fechaInicio, string fechaFin)
        {
            var response = new JsonResponse();
            try
            {
                var f1 = Utils.ConvertDate(fechaInicio, "dd/MM/yyyy HH:mm").Value;
                var f2 = Utils.ConvertDate(fechaFin, "dd/MM/yyyy HH:mm").Value;

                var cantidad = 0;
                using (var service = new ProduccionServiceClient())
                {
                    cantidad = service.ValidarHorarioOrdenProduccionSecuencia(idMaquina, f1, f2);
                }

                response.Data = cantidad;
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult ObtenerOrdenProduccion(string numero)
        {
            var response = new JsonResponse();
            try
            {
                response.Data = OrdenProduccionPorNumero(numero);
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult RechazarOrdenProduccion(int id, string motivo)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new ProduccionServiceClient())
                {
                    service.RechazarOrdenProduccion(id, motivo);
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult GuardarPrograma(ProgramaModel model)
        {
            var response = new JsonResponse();
            try
            {
                var fechaInicio = Utils.ConvertDate(model.FechaInicioStr, "dd/MM/yyyy");
                var fechaFin = Utils.ConvertDate(model.FechaFinStr, "dd/MM/yyyy");

                var programa = new Programa
                {
                    Id = model.Id,
                    Numero = model.Numero,
                    FechaInicio = fechaInicio.Value,
                    FechaFin = fechaFin.Value,
                    CantidadOV = model.CantidadOV,
                    Estado = model.Estado,
                    IdPlan = model.IdPlan,
                    OrdenesVenta = new List<OrdenVenta>()
                };

                foreach (var ordenVenta in model.OrdenesVenta)
                {
                    programa.OrdenesVenta.Add(ordenVenta);
                }

                using (var service = new ProduccionServiceClient())
                {
                    response.Data = service.GuardarPrograma(programa);
                }

                response.Success = true;
            }
            catch (Exception ex)
            {
                LogError(ex);
                response.Message = ex.Message;
            }
            return Json(response);
        }
        public JsonResult CrearCarpetasArcivosPLC()
        {
            var response = new JsonResponse();
            try
            {
                foreach (var secuencia in OrdenProduccionActual.Secuencia)
                {
                    var directorio = string.Format(@"C:\MetalForming\{0}\{1}", OrdenProduccionActual.Numero, secuencia.PLC);

                    Directory.CreateDirectory(directorio);

                    var archivo = Path.Combine(directorio, "plc.txt");

                    if (System.IO.File.Exists(archivo))
                        System.IO.File.Delete(archivo);

                    var file = System.IO.File.Create(archivo);
                    file.Close();
                    file.Dispose();
                }

                using (var service = new ProduccionServiceClient())
                {
                    service.ActualizarEstadoOrdenProduccion(OrdenProduccionActual.Id, Constantes.EstadoOrdenPoduccion.Conformado);
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult GuardarAsignaciones(AsignarOrdenVentaModel model)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new ProduccionServiceClient())
                {
                    service.GuardarAsignacionesOrdeneVenta(
                        model.OrdenesVenta.Select(p => p.Id).ToList(),
                        model.AsistentePlaneamiento.Select(p => new Usuario
                        {
                            Id = p.Id,
                            CantidadOV = p.CantidadOV

                        }).ToList());
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult GenerarArchivoPrueba(int idMaquina, int numero)
        {
            var response = new JsonResponse();
            try
            {
                var maquinaActual = OrdenProduccionActual.Secuencia.FirstOrDefault(p => p.IdMaquina == idMaquina);

                var archivo = string.Format(@"C:\MetalForming\{0}\{1}\plc.txt", OrdenProduccionActual.Numero, maquinaActual.PLC);

                var texto = System.IO.File.ReadAllText(archivo);
                var lineas = texto.Split('\n');

                var fechaInicioProduccion = lineas[1].Replace("#FechaInicioProduccion:", "").Replace("\r", "");

                var noCiclos = lineas[6].Replace("#NoCiclos:", "").Replace("\r", "");
                if (string.IsNullOrEmpty(noCiclos))
                    noCiclos = "1";
                else
                    noCiclos = (Convert.ToInt32(noCiclos) + 1).ToString();

                switch (numero)
                {
                    case 1: //Generar siguiente ciclo
                        {
                            var builder = new StringBuilder();
                            builder.AppendLine("#Maquina:" + maquinaActual.DescripcionMaquina);
                            builder.AppendLine("#FechaInicioProduccion:" + fechaInicioProduccion);
                            builder.AppendLine("#FechaFinProduccion:");
                            builder.AppendLine("#Longitud:" + maquinaActual.Longitud);
                            builder.AppendLine("#Espesor:" + maquinaActual.Espesor);
                            builder.AppendLine("#Ciclo:" + maquinaActual.Ciclo);
                            builder.AppendLine("#NoCiclos:" + noCiclos);
                            builder.AppendLine("#MotivosDeParada:");
                            builder.AppendLine("#TiempoParada:");
                            builder.AppendLine("#TiempoProduccion:");
                            builder.AppendLine("#UnidadesAProducir:" + OrdenProduccionActual.CantidadProducto);
                            builder.AppendLine("#UnidadesProducidas:");
                            builder.AppendLine("#UnidadesDefectuosas:");

                            System.IO.File.WriteAllText(archivo, builder.ToString());
                        }
                        break;
                    case 2: //Generar error
                        {
                            var builder = new StringBuilder();
                            builder.AppendLine("#Maquina:" + maquinaActual.DescripcionMaquina);
                            builder.AppendLine("#FechaInicioProduccion:" + fechaInicioProduccion);
                            builder.AppendLine("#FechaFinProduccion:");
                            builder.AppendLine("#Longitud:" + maquinaActual.Longitud);
                            builder.AppendLine("#Espesor:" + maquinaActual.Espesor);
                            builder.AppendLine("#Ciclo:" + maquinaActual.Ciclo);
                            builder.AppendLine("#NoCiclos:" + noCiclos);
                            builder.AppendLine("#MotivosDeParada:1");
                            builder.AppendLine("#TiempoParada:");
                            builder.AppendLine("#TiempoProduccion:");
                            builder.AppendLine("#UnidadesAProducir:" + OrdenProduccionActual.CantidadProducto);
                            builder.AppendLine("#UnidadesProducidas:");
                            builder.AppendLine("#UnidadesDefectuosas:");

                            System.IO.File.WriteAllText(archivo, builder.ToString());
                        }
                        break;
                    case 3: //Generar error corregido
                        {
                            var builder = new StringBuilder();
                            builder.AppendLine("#Maquina:" + maquinaActual.DescripcionMaquina);
                            builder.AppendLine("#FechaInicioProduccion:" + fechaInicioProduccion);
                            builder.AppendLine("#FechaFinProduccion:");
                            builder.AppendLine("#Longitud:" + maquinaActual.Longitud);
                            builder.AppendLine("#Espesor:" + maquinaActual.Espesor);
                            builder.AppendLine("#Ciclo:" + maquinaActual.Ciclo);
                            builder.AppendLine("#NoCiclos:" + noCiclos);
                            builder.AppendLine("#MotivosDeParada:1");
                            builder.AppendLine("#TiempoParada:150");
                            builder.AppendLine("#TiempoProduccion:");
                            builder.AppendLine("#UnidadesAProducir:" + OrdenProduccionActual.CantidadProducto);
                            builder.AppendLine("#UnidadesProducidas:");
                            builder.AppendLine("#UnidadesDefectuosas:");

                            System.IO.File.WriteAllText(archivo, builder.ToString());
                        }
                        break;
                    case 4: //Generar termino
                        {
                            var motivosDeParada = lineas[7].Replace("#MotivosDeParada:", "").Replace("\r", "");
                            var tiempoParada = lineas[8].Replace("#TiempoParada:", "").Replace("\r", "");

                            var builder = new StringBuilder();
                            builder.AppendLine("#Maquina:" + maquinaActual.DescripcionMaquina);
                            builder.AppendLine("#FechaInicioProduccion:" + fechaInicioProduccion);
                            builder.AppendLine("#FechaFinProduccion:");
                            builder.AppendLine("#Longitud:" + maquinaActual.Longitud);
                            builder.AppendLine("#Espesor:" + maquinaActual.Espesor);
                            builder.AppendLine("#Ciclo:" + maquinaActual.Ciclo);
                            builder.AppendLine("#NoCiclos:" + noCiclos);
                            builder.AppendLine("#MotivosDeParada:" + motivosDeParada);
                            builder.AppendLine("#TiempoParada:" + tiempoParada);
                            builder.AppendLine("#TiempoProduccion:");
                            builder.AppendLine("#UnidadesAProducir:" + OrdenProduccionActual.CantidadProducto);
                            builder.AppendLine("#UnidadesProducidas:" + OrdenProduccionActual.CantidadProducto);
                            builder.AppendLine("#UnidadesDefectuosas:10");

                            System.IO.File.WriteAllText(archivo, builder.ToString());
                        }
                        break;
                    default:
                        break;
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult ObtenerMaquina(int idMaquina)
        {
            var response = new JsonResponse();
            try
            {
                Maquina maquina;
                using (var service = new ProduccionServiceClient())
                {
                    maquina = service.ObtenerMaquinaPorID(idMaquina);
                }

                response.Data = maquina;
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult IniciarProceso(int idMaquina)
        {
            var response = new JsonResponse();
            try
            {
                var maquinaActual = OrdenProduccionActual.Secuencia.FirstOrDefault(p => p.IdMaquina == idMaquina);

                var archivo = string.Format(@"C:\MetalForming\{0}\{1}\plc.txt", OrdenProduccionActual.Numero, maquinaActual.PLC);

                using (var stream = new FileStream(archivo, FileMode.Open, FileAccess.Write))
                {
                    using (var writer = new StreamWriter(stream))
                    {
                        writer.WriteLine("#Maquina:" + maquinaActual.DescripcionMaquina);
                        writer.WriteLine("#FechaInicioProduccion:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm"));
                        writer.WriteLine("#FechaFinProduccion:");
                        writer.WriteLine("#Longitud:" + maquinaActual.Longitud);
                        writer.WriteLine("#Espesor:" + maquinaActual.Espesor);
                        writer.WriteLine("#Ciclo:" + maquinaActual.Ciclo);
                        writer.WriteLine("#NoCiclos:");
                        writer.WriteLine("#MotivosDeParada:");
                        writer.WriteLine("#TiempoParada:");
                        writer.WriteLine("#TiempoProduccion:");
                        writer.WriteLine("#UnidadesAProducir:" + OrdenProduccionActual.CantidadProducto);
                        writer.WriteLine("#UnidadesProducidas:");
                        writer.WriteLine("#UnidadesDefectuosas:");
                    }
                }

                using (var service = new ProduccionServiceClient())
                {
                    service.ActualizarEstadoOrdenProduccionSecuencia(OrdenProduccionActual.Id, idMaquina, Constantes.EstadoProcesoMaquina.EnProceso);
                }

                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult LeerArchivo(int idMaquina)
        {
            var response = new JsonResponse();
            try
            {
                var maquinaActual = OrdenProduccionActual.Secuencia.FirstOrDefault(p => p.IdMaquina == idMaquina);

                var archivo = string.Format(@"C:\MetalForming\{0}\{1}\plc.txt", OrdenProduccionActual.Numero, maquinaActual.PLC);

                var texto = System.IO.File.ReadAllText(archivo);
                var lineas = texto.Split('\n');

                var model = new DatosArchivoModel
                {
                    Maquina = lineas[0].Replace("#Maquina:", "").Replace("\r", ""),
                    FechaInicioProduccion = lineas[1].Replace("#FechaInicioProduccion:", "").Replace("\r", ""),
                    FechaFinProduccion = lineas[2].Replace("#FechaFinProduccion:", "").Replace("\r", ""),
                    Longitud = lineas[3].Replace("#Longitud:", "").Replace("\r", ""),
                    Espesor = lineas[4].Replace("#Espesor:", "").Replace("\r", ""),
                    Ciclo = lineas[5].Replace("#Ciclo:", "").Replace("\r", ""),
                    NoCiclos = lineas[6].Replace("#NoCiclos:", "").Replace("\r", ""),
                    MotivosDeParada = lineas[7].Replace("#MotivosDeParada:", "").Replace("\r", ""),
                    TiempoParada = lineas[8].Replace("#TiempoParada:", "").Replace("\r", ""),
                    TiempoProduccion = lineas[9].Replace("#TiempoProduccion:", "").Replace("\r", ""),
                    UnidadesAProducidas = lineas[10].Replace("#UnidadesAProducir:", "").Replace("\r", ""),
                    UnidadesProducidas = lineas[11].Replace("#UnidadesProducidas:", "").Replace("\r", ""),
                    UnidadesDefectuosas = lineas[12].Replace("#UnidadesDefectuosas:", "").Replace("\r", ""),
                    Paradas = new List<ParadaModel>()
                };

                model.MotivosDeParada = string.IsNullOrEmpty(model.MotivosDeParada) ? "" : model.MotivosDeParada;
                model.TiempoParada = string.IsNullOrEmpty(model.TiempoParada) ? "" : model.TiempoParada;

                var motivos = model.MotivosDeParada.Split(',').Where(p => !string.IsNullOrEmpty(p)).ToList();
                var tiempos = model.TiempoParada.Split(',').Where(p => !string.IsNullOrEmpty(p)).ToList();

                for (int i = 0; i < motivos.Count; i++)
                {
                    //Obtener el valor de la constante de manera dinamica
                    var constante = typeof(Constantes.MotivosDeParada).GetFields().First(f => f.Name.Equals("Motivo" + motivos.ElementAtOrDefault(i)));
                    if (constante == null)
                    {
                        model.Paradas.Add(new ParadaModel
                        {
                            Motivo = motivos.ElementAtOrDefault(i),
                            Mensaje = string.Empty,
                            Tiempo = tiempos.ElementAtOrDefault(i)
                        });
                    }
                    else
                    {
                        model.Paradas.Add(new ParadaModel
                        {
                            Motivo = motivos.ElementAtOrDefault(i),
                            Mensaje = constante.GetRawConstantValue().ToString(),
                            Tiempo = tiempos.ElementAtOrDefault(i)
                        });
                    }
                }

                response.Data = model;
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult Guardar(OrdenProduccionModel model)
        {
            var response = new JsonResponse();
            try
            {
                var ordenProduccion = new OrdenProduccion
                {
                    CantidadProducto = model.CantidadProducto,
                    TomarStock = model.TomarStock,
                    Estado = "Pendiente",
                    OrdenVenta = new OrdenVenta
                    {
                        Id = model.IdOrdenVenta,
                        Producto = new Producto { Id = model.IdProducto }
                    },
                    Materiales = new List<OrdenProduccionMaterial>(),
                    Secuencia = new List<OrdenProduccionSecuencia>()
                };

                foreach (var material in model.Materiales)
                {
                    ordenProduccion.Materiales.Add(new OrdenProduccionMaterial
                    {
                        Comprar = material.Comprar,
                        Requerido = material.Requerido,
                        Material = new Material {Id = material.IdMaterial}
                    });
                }

                foreach (var secuencia in model.Secuencia)
                {
                    var fechaInicio = Utils.ConvertDate(secuencia.FechaInicioStr, "dd/MM/yyyy HH:mm");
                    var fechaFin = Utils.ConvertDate(secuencia.FechaFinStr, "dd/MM/yyyy HH:mm");

                    ordenProduccion.Secuencia.Add(new OrdenProduccionSecuencia
                    {
                        Secuencia = secuencia.Secuencia,
                        Maquina = new Maquina {Id = secuencia.IdMaquina},
                        FechaInicio = fechaInicio.Value,
                        FechaFin = fechaFin.Value
                    });
                }

                var idOrdenProduccion = 0;
                using (var service = new ProduccionServiceClient())
                {
                    idOrdenProduccion = service.RegistrarOrdenProduccion(ordenProduccion);
                }

                response.Data = idOrdenProduccion;
                response.Success = true;
                response.Message = "Ok";
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;

                LogError(ex);
            }
            return Json(response);
        }
        public JsonResult FinalizarPrograma(int idPrograma, string motivo)
        {
            var response = new JsonResponse();
            try
            {
                using (var service = new ProduccionServiceClient())
                {
                    service.FinalizarPrograma(idPrograma, motivo);
                }

                response.Success = true;
            }
            catch (Exception ex)
            {
                LogError(ex);
                response.Message = ex.Message;
            }
            return Json(response);
        }