Extraño problema de validación en bootstrap. (MVC - C#)

_V

The Hateful Wish
Se incorporó
11 Abril 2008
Mensajes
2.666
Tengo un formulario que hace un calculo de producción dependiendo de lo que se ingrese en la fecha / hora / turnos / dias. Tiene un ajax que calcula automáticamente los otros campos si se mueve el primero.
Este formulario corresponde a la actualización, y es una copia exacta del que crea (salvo por algunos campos críticos desactivados), sin embargo al momento de hacer submit para guardar el cambio se manda un validación totalmente estupida y que en realidad no está especificada en ninguna parte.

Bueno, he buscado bastante y la verdad es que no encuentro que puede estar causando esta validación al vuelo que no sirve de nada.

No tengo validaciones directas en las propiedades del objeto ya que el comportamiento a veces es medio aleatorio, sin embargo se validan al momento del post en el controlador.

Este es el código de la ventana y del form:

Código:
@model Productiva.Models.CalendarioMaq
@{
    ViewBag.Title = "Editando Planificación de producción";
    Layout = "~/Views/Comun/Base.cshtml";
}    
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    //Ocultos
    @Html.HiddenFor(Model => Model.FCancel);
    @Html.HiddenFor(Model => Model.UserSign);
    @Html.HiddenFor(Model => Model.UserSign2);
    @Html.HiddenFor(Model => Model.Cancelado);
    @Html.HiddenFor(Model => Model.FInicio);
    @Html.HiddenFor(Model => Model.Ftermino);
    @Html.HiddenFor(Model => Model.Estado);
    @Html.HiddenFor(Model => Model.MqIdTem);
    @Html.HiddenFor(Model => Model.IDSiguiente);
    <div class="form-group">
        <h4 class="card-title mt-2">Selección de máquina y producto.</h4>
        <label for="Entry mt-3">ID Interno del evento</label>
        @Html.TextBoxFor(Model => Model.ID, new { @class = "form-control", @type = "number", @readOnly = "readonly" })
        <small id="Entry" class="form-text text-muted">Correlativo interno.</small>
        <label for="CausaActivo">Máquina</label>
        @Html.DropDownListFor(Model => Model.Mq.IdMaq, new SelectList(ViewBag.MaquinasList, "Value", "Text", Model.Mq.IdMaq), new { @class = "form-control", @id = "MaqPlan", @disabled = "disabled" })
        <small id="CausaActivoTip" class="form-text text-muted">Seleccione Máquina del listado.</small>
        <label for="CausaActivo">Artículo</label>
        <div class="row">
            <div class="col-8">
                <label for="Complejidad">Seleccione Producto</label>
                @Html.DropDownListFor(Model => Model.ItemCode, new SelectList(ViewBag.ItemsDisponibles, "Value", "Text", Model.ItemCode), new { @class = "form-control", @id = "ItemCodeSel", @disabled = "disabled" })
                <small id="ComplejidadTip" class="form-text text-muted">Código SAP del producto</small>
            </div>
            <div class="col">
                <label for="NombreFicha">Peso (Kilos)</label>
                @Html.TextBoxFor(Model => Model.PesoItem, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "PesoItem" })
                <small id="NombreFichaTip" class="form-text text-muted">Nombre del producto (recuperado)</small>
            </div>
            <div class="col">
                <label for="NombreFicha"></label>
                <a href="@Url.Action("PlanificarSinStd", "CalendarioMaq", new { Maquina = Model.Mq.IdMaq})" class="btn btn-warning btn-block">El Producto no tiene Estandar</a>
                <small id="NombreFichaTip" class="form-text text-muted"></small>
            </div>
        </div>
        <label for="Fecha mt-3">Rango de fechas:</label>
        <div class="row">
            <div class="col">
                <label for="FechaIni">Fecha Inicio</label>
                @Html.TextBoxFor(Model => Model.FechaIni, new { @class = "form-control", @type = "Date", @id = "FechaIni" })
                <small id="HoraIniTip" class="form-text text-muted">Fecha de inicio producción</small>
            </div>
            <div class="col-2">
                <label for="HoraIni">Hora Inicio</label>
                @Html.TextBoxFor(Model => Model.HoraIni, new { @class = "form-control", @type = "time", @id = "HIni" })
            </div>
        </div>
        <div class="row">
            <div class="col">
                <label for="FechaTerm">Fecha Termino</label>
                @Html.TextBoxFor(Model => Model.FechaTer, new { @class = "form-control", @type = "Date", @id = "FechaTer" })
                <small id="FechaTerm" class="form-text text-muted">Fecha de termino producción</small>
            </div>
            <div class="col-2">
                <label for="HoraTer">Hora Termino</label>
                @Html.TextBoxFor(Model => Model.HoraTer, new { @class = "form-control", @type = "time", @id = "HTer" })
            </div>
        </div>
        <label for="Plan">Cantidad a planificar</label>
        @Html.TextBoxFor(Model => Model.Planeado, new { @class = "form-control", @type = "number", @id = "PlanificadoCant" })
        <small id="Plantip" class="form-text text-muted">Cantidad a producir</small>
        <div class="row">
            <div class="col">
                <label for="DiasProd">Dias de producción</label>
                @Html.TextBoxFor(Model => Model.Dias, new { @class = "form-control", @type = "number", @id = "DiasProduccion", @step = "0.1" })
                <small id="DiasProd" class="form-text text-muted">Dias de producción entre ambas fechas seleccionadas</small>
            </div>
            <div class="col">
                <label for="TurnosProd">Turnos de Producción</label>
                @Html.TextBoxFor(Model => Model.Turnos, new { @class = "form-control", @type = "number", @id = "TurnosProduccion", @step = "0.1" })
                <small id="TurnosProd" class="form-text text-muted">Turnos en producción (Defecto y mínimo 6)</small>
            </div>
            <div class="col">
                <label for="VentanaCambio">Ventana de Cambio</label>
                @Html.TextBoxFor(Model => Model.VentanaDeCambio, new { @class = "form-control", @type = "number", @id = "VentanaCambio" })
                <small id="VentanaCmbio" class="form-text text-muted">Tiempo en minutos que tomará el cambio, si aplica.</small>
            </div>
        </div>
        <h4 class="card-title mt-2">Datos de Planificación</h4>
        <div class="row">
            <div class="col">
                <label for="ProyMensualPLN">Proyeccion Mensual</label>
                @Html.TextBoxFor(Model => Model.Proyeccion, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "ProyeccionPlan" })
                <small id="ProyMensualPLN" class="form-text text-muted">Unidades proyectadas de venta este mes segun ventas</small>
            </div>
            <div class="col">
                <label for="ProyMensualPLN">Mes Anterior SAP</label>
                @Html.TextBoxFor(Model => Model.ProyeccionSBO, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "ProyeccionSBO" })
                <small id="ProyMensualPLN" class="form-text text-muted">Venta del mes anterior en SAP</small>
            </div>
        </div>
        <div class="row">
            <div class="col">
                <label for="VentaSegPlan">Venta Proyectada</label>
                @Html.TextBoxFor(Model => Model.Diario, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "DiarioProy", @step = "0.001" })
                <small id="VentaSegPlan" class="form-text text-muted">Venta diaria segun planificación anual</small>
            </div>
            <div class="col">
                <label for="VentaSegSBO">Ultimo Mes SBO</label>
                @Html.TextBoxFor(Model => Model.DiarioSBO, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "DiarioSBO", @step = "0.001" })
                <small id="VentaSegSBOn" class="form-text text-muted">Venta diaria segun calculo del ultimo mes</small>
            </div>
            <div class="col">
                <label for="Desviacion">Desviación</label>
                @Html.TextBoxFor(Model => Model.Desviacion, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "DesviacionPlan", @step = "0.001" })
                <small id="Desviacion" class="form-text text-muted">Desviación entre el planificado y la venta del ultimo mes</small>
            </div>
        </div>
        <p>
            <button type="button" class="btn btn-info btn-lg btn-block mt-2" data-toggle="collapse" data-target="#DetallesPlanificacion" aria-expanded="false" aria-controls="ItemFinder">
                Detalles de planificación
            </button>
        </p>
        <div class="collapse " id="DetallesPlanificacion">
            <div class="row">
                <div class="col">
                    <label for="UnTurno">Cavidades</label>
                    @Html.TextBoxFor(Model => Model.CavidadesReales, new { @class = "form-control", @type = "number", @id = "CavMolde" })
                    <small id="UnTurno" class="form-text text-muted">Cavidades en el molde</small>
                </div>
                <div class="col">
                    <label for="UnTurno">Unidades Turno</label>
                    @Html.TextBoxFor(Model => Model.UnidadesTurno, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "UnidTurno" })
                    <small id="UnTurno" class="form-text text-muted">Unidades producidas en un turno de 8 horas</small>
                </div>
                <div class="col">
                    <label for="KilosP">Kilos Programa</label>
                    @Html.TextBoxFor(Model => Model.KilosPrograma, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "KilosProg", @step = "0.001" })
                    <small id="KilosP" class="form-text text-muted">Total de kilos de las unidades a producir</small>
                </div>
            </div>
            <div class="row">
                <div class="col">
                    <label for="Stock">Stock PT10</label>
                    @Html.TextBoxFor(Model => Model.Stock, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "StockPlan" })
                    <small id="Stock" class="form-text text-muted">Stock Actual en Bodega (Fisico + Solicitado) - Comprometido</small>
                </div>
                <div class="col">
                    <label for="CapBodega">Capacidad Actual</label>
                    @Html.TextBoxFor(Model => Model.CapacidadBodegaActual, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "CapBodegaActual", @step = "0.001" })
                    <small id="CapBodega" class="form-text text-muted">Capacidad de la bodega en dias de venta antes de la producción, segun planificación</small>
                </div>
                <div class="col">
                    <label for="DiasVenta">Capacidad Final</label>
                    @Html.TextBoxFor(Model => Model.CapacidadBodegaFinalProd, new { @class = "form-control", @type = "number", @readOnly = "readonly", @id = "CapBodegaFinProd", @step = "0.001" })
                    <small id="DiasVenta" class="form-text text-muted">Dias de venta con despues de finalizar la producción, restando los dias ocupados en producir</small>
                </div>
            </div>
        </div>
        <hr />
        <h4 class="card-title mt-2">Comentarios</h4>
        <label for="Descripcion">Comentario para el cambio</label>
        @Html.TextAreaFor(Model => Model.Comentario, new { @class = "form-control", @type = "text" })
        <small id="Descripcion" class="form-text text-muted mb-2">Pequeña descripción para el evento (Opcional).</small>
        <a href="javascript:history.back()" class="btn btn-warning">Volver</a>
        <input type="submit" class="btn btn-success" value="Guardar" />
        @if (ViewData.ModelState.Any(x => x.Value.Errors.Any()))
        {
            <h6 class="card-title">Se han encontrado los siguientes errores:</h6>
            <div class="list-group md-2">
                @foreach (var modelError in Html.ViewData.ModelState.SelectMany(keyValuePair => keyValuePair.Value.Errors))
                {
                    <a href="#" class="list-group-item list-group-item-action list-group-item-danger">@modelError.ErrorMessage</a>
                }
            </div>
            <hr />
        }
    </div>
}

El objeto
Código:
    public class CalendarioMaq
    {
        public int ID { get; set; }
        public int IDSiguiente { get; set; }
        public Maquina Mq { get; set; }
        public string MqIdTem { get; set; } //temporal, el objeto dentro no sobrevive al post.
        public string ItemCode { get; set; }
        public string ItemName { get; set; }
        public DateTime FInicio { get; set; }
        public string FechaIni { get; set; }
        public string HoraIni { get; set; }
        public DateTime Ftermino { get; set; }
        public string FechaTer { get; set; }
        public string HoraTer { get; set; }
        public DateTime FCancel { get; set; }
        public double Dias { get; set; }
        public double Turnos { get; set; }
        public string Planta { get; set; }
        public string Estado { get; set; } //O: Abierto - C: Cerrado - T: cortado (Los cerrados no actualizan stock ni pendiente, las producciones se cierran automaticamente a la fecha de termino (que es planeada), a menos que haya una planificación posterior que corte la producción actual.
        public int Tipo { get; set; }
        public int VentanaDeCambio { get; set; } //Se agregará como ventana.
        public double Planeado { get; set; }
        public double Producido { get; set; }
        public double Pendiente { get; set; }
        public double Retenido { get; set; }
        public string Cancelado { get; set; }
        public double PesoItem { get; set; }
        public Estandar STD { get; set; }
        public double KilosPrograma { get; set; } //Kilos Planificados
        public int CavidadesReales { get; set; } //Se pueden corregir las cavidades.
        public double UnidadesTurno { get; set; } //Cantidad en unidades que se produce en un turno de 8 horas según STD.
        public double Proyeccion { get; set; } //Proyección segun ventas de lo que se venderá el mes.
        public double ProyeccionSBO { get; set; } //Proyección segun ventas de lo que se venderá el mes.
        public double Diario { get; set; } //Es lo que se proyecta como venta diaria.
        public double DiarioSBO { get; set; } //Es lo que se proyecta como venta diaria segun SAP.
        public double Desviacion { get; set; } //Desviacion de lo proyectado / Recuperado SBO.
        public double Stock { get; set; } //Stock En Bodega
        public double StockFin { get; set; } //Stock al final de la producción
        public double CapacidadBodegaActual { get; set; } //Es la capacidad de la bodega con el stock actual.
        public double CapacidadBodegaFinalProd { get; set; } //Es la capacidad de la bodega luego de finalizar la producción
        public string Comentario { get; set; } //Comentario en caso de cambio.
        public int UserSign { get; set; }
        public int UserSign2 { get; set; } 
        public bool Nuevo { get; set; }
        public string Planificacion { get; set; } //P producto //M Maquina //L Libre //S Sin STD.

        //Campos locales
        public double Comprometido { get; set; }
        public double Solicitado { get; set; }
        public CalendarioMaq EventoSobrepuesto { get; set; }

        public CalendarioMaq()
        {
            Bdto.CC_WEB_NewID(5, out int ID_);
            this.ID = ID_;
            this.STD = new Estandar();
            this.Mq = new Maquina();
            this.MqIdTem = "";
            this.FInicio = DateTime.Now;
            this.FechaIni = FInicio.ToString("yyyy-MM-dd");
            this.HoraIni = FInicio.ToString("HH:mm");
            this.Ftermino = DateTime.Now;
            this.FechaTer = Ftermino.ToString("yyyy-MM-dd");
            this.HoraTer = Ftermino.ToString("HH:mm");
            this.FCancel = DateTime.Now;
            this.Estado = "P";
            this.Tipo = 1;
            this.Planificacion = "";
            this.Cancelado = "N";
            //Fecha

        }

        public DataTable GetMoldes()
        {
            return Bdto.CC_WEB_RetornaMoldesPorMaquinaCombo(this.Mq.IdMaq);
        }

        public void GetMaquina()
        {
            this.Mq.Get();
            this.MqIdTem = this.Mq.IdMaq;
        }

        public void Save()
        {
            if(Bdto.CC_WEB_NuevoEventoCalendario(
                out int id_,
                this.Mq.IdMaq,
                this.ItemCode,
                this.ItemName,
                this.FInicio,
                this.Ftermino,
                this.FCancel,
                this.Dias,
                this.Turnos,
                this.Planta,
                this.Estado,
                this.Tipo,
                this.VentanaDeCambio,
                this.Planeado,
                this.Producido,
                this.Pendiente,
                this.Retenido,
                this.Cancelado,
                this.PesoItem,
                0,
                this.KilosPrograma,
                this.CavidadesReales,
                this.UnidadesTurno,
                this.Proyeccion,
                this.ProyeccionSBO,
                this.Diario,
                this.DiarioSBO,
                this.Desviacion,
                this.Stock,
                this.StockFin,
                this.CapacidadBodegaActual,
                this.CapacidadBodegaFinalProd,
                this.Comentario,
                this.UserSign,
                this.UserSign2) > 0)
            {
                this.ID = id_;
                //Recupero el ID Siguiente
                Bdto.CC_WEB_IdEventoSiguientePorIdEventoActual(this.ID, out int Siguiente);
                this.IDSiguiente = Siguiente;
                //Actualizo si hay otros eventos.
                this.PrepararSiguientes();
            }
        }

        public void Actualizar()
        {
            Bdto.CC_WEB_AlterEventoCalendario(
                this.ID,
                this.Mq.IdMaq,
                this.ItemCode,
                this.ItemName,
                this.FInicio,
                this.Ftermino,
                this.FCancel,
                this.Dias,
                this.Turnos,
                this.Planta,
                this.Estado,
                this.Tipo,
                this.VentanaDeCambio,
                this.Planeado,
                this.Producido,
                this.Pendiente,
                this.Retenido,
                this.Cancelado,
                this.PesoItem,
                0,
                this.KilosPrograma,
                this.CavidadesReales,
                this.UnidadesTurno,
                this.Proyeccion,
                this.ProyeccionSBO,
                this.Diario,
                this.DiarioSBO,
                this.Desviacion,
                this.Stock,
                this.StockFin,
                this.CapacidadBodegaActual,
                this.CapacidadBodegaFinalProd,
                this.Comentario,
                this.UserSign,
                this.UserSign2);
            //Actualizo si hay otros eventos.
            this.PrepararSiguientes();
        }

        public void SetAutoDate()
        {
            Bdto.CC_WEB_RecuperaFechaDisponibleMaquina(this.Mq.IdMaq, out DateTime FT);
            this.FInicio = FT;
            this.FechaIni = FInicio.ToString("yyyy-MM-dd");
            this.HoraIni = FInicio.ToString("HH:mm");
            this.Ftermino = FT;
            this.FechaTer = FInicio.ToString("yyyy-MM-dd");
            this.HoraTer = FInicio.ToString("HH:mm");
        }

        public void PrepararSiguientes()
        {
            CalendarioMaq EventoRevisado = new CalendarioMaq();
            //Lo que hará este procedimiento, es correr todos los eventos posteriores y cortar a la fecha los anteriores.
            //Eventos que terminan despues de la fecha de inicio - Se corta al tope.
            /*Eventos que comienzen o terminen antes de la fecha de termino y despues de la fecha de inicio + Eventos que comienzan antes de la fecha de termino, se juntan y mueven.
             *Recupero todo los eventos con estas características y los posteriores, armo un array con todos los eventos concatenados y que tengan una separación entre fechas inferior a lo que se deberá desplazar la primera fecha original.*/

            //Recupero posible evento que termina despues de la fecha de inicio, pero que comenzaron antes - Cortar.
            Bdto.CC_WEB_IDEvento_A_Fecha_De_Inicio(this.FInicio, this.MqIdTem, out int IDaCortar);
            try
            {
                //Si no encuentra nada, probablemente entregue nulo y este proceso fallará
                if (IDaCortar > -1)
                {
                    EventoRevisado.ID = IDaCortar;
                    EventoRevisado.Get(); //Recupero el evento.
                    EventoRevisado.FechaTer = this.FechaIni;
                    //tengo que cortar la cantidad a los dias - Mejor un proceso interno que haga el recalculo y llame al STD.
                    EventoRevisado.CortarAFechaNueva(this);
                    EventoRevisado.Actualizar();
                }
            }
            catch
            { }

            //Recupero el siguiente Evento Segun el ID
            EventoRevisado.ID = this.IDSiguiente;
            EventoRevisado.Get(); //Este ya va a tener guardado el siguiente ID
           
            if(this.Ftermino > EventoRevisado.FInicio)
            {
                //Lo muevo
                double Minutos = (EventoRevisado.FInicio - this.Ftermino).TotalMinutes;
                EventoRevisado.FInicio = EventoRevisado.FInicio.AddMinutes(Minutos + 5);
                EventoRevisado.Ftermino = EventoRevisado.Ftermino.AddMinutes(Minutos + 5);
                EventoRevisado.Comentario = "Evento ajustado automaticamente";
                //No cambio ni recalculo nada. Solo lo muevo.
                EventoRevisado.Actualizar();
            } 
        }

        private void CortarAFechaNueva(CalendarioMaq CMo)
        {
            //Recupero el STD.
            this.GetStdData();
            //Recalculo
            double Minutos;
            //Obtengo el total de minutos entre el inicio y el termino de la producción, restando el posible tiempo de armado
            Minutos = (this.Ftermino - this.FInicio).TotalMinutes;
            //Calculo tiempos de turno
            this.Turnos = Minutos / 480;
            this.Dias = Minutos / 1440;
            //Recalculo Unidades
            if(this.STD.Tipo == "IY")
            {
                this.Planeado = Math.Round(this.STD.UnTurno * this.Turnos, 0); //Productos a producir siempre en entero.
            }
            else
            {
                double ProductosHora = this.STD.StdValueEx / (this.PesoItem / 1000); //Divido los kilos por hora, por el peso de producto en kilos (en sap se guarda en gramos, de ahí el dividir por 1000)
                double UnTurno = ProductosHora * 8;
                this.Planeado = Math.Round(ProductosHora * this.Turnos, 0);
            }
            //Estado de productos al planificar (Actualizar)
            this.GetItemCalcDataNoStd(this.ItemCode, out string ItmNme, out double DiarioSBO_, out double DiarioPredic, out double MensProySAP, out double MensProyVta, out double Desv, out double Stk, out double Peso);

            this.CapacidadBodegaActual = this.Stock / DiarioSBO_;
            this.CapacidadBodegaFinalProd = (this.Stock + this.Planeado) / DiarioSBO_;
            this.DiarioSBO = DiarioSBO_;
            this.Comentario = string.Format("Producción cortada automáticamente por planificación de {0} unidades del producto {1}. Motivo: {2}", CMo.Planeado, CMo.ItemName, CMo.Comentario);
        }       

        public void Get()
        { 
            if(this.ID > 0)
            {
                Bdto.CC_WEB_RecuperaEventoCalendario(
                    this.ID,
                    out string idmq,
                    out string Itmcd,
                    out string ItmNme,
                    out DateTime Fini,
                    out DateTime Fter,
                    out DateTime FCan,
                    out double dias,
                    out double turn,
                    out string Pnta,
                    out string Estd,
                    out int tip,
                    out int Vent,
                    out double Pln,
                    out double Prd,
                    out double Pend,
                    out double Ret,
                    out string Can,
                    out double Pso,
                    out int IDMd,
                    out double KilP,
                    out int CavR,
                    out double UnTu,
                    out double Proy,
                    out double ProySbo,
                    out double Dro,
                    out double DroSbo,
                    out double Desvc,
                    out double Stok,
                    out double StkFn,
                    out double CapBga,
                    out double CapBgaFn,
                    out string Comen,
                    out int Usersn,
                    out int Usersn2);

                //Cargo los valores;
                this.Mq.IdMaq = idmq;
                this.Mq.Get();
                this.ItemCode = Itmcd;
                this.ItemName = ItmNme;
                this.FInicio = Fini;
                this.Ftermino = Fter;
                this.FCancel = FCan;
                this.Dias = dias;
                this.Turnos = turn;
                this.Planta = Pnta;
                this.Estado = Estd;
                this.Tipo = tip;
                this.VentanaDeCambio = Vent;
                this.Planeado = Pln;
                this.Producido = Prd;
                this.Pendiente = Pend;
                this.Retenido = Ret;
                this.Cancelado = Can;
                this.PesoItem = Pso;
                this.KilosPrograma = KilP;
                this.CavidadesReales = CavR;
                this.UnidadesTurno = UnTu;
                this.Proyeccion = Proy;
                this.ProyeccionSBO = ProySbo;
                this.Diario = Dro;
                this.DiarioSBO = DroSbo;
                this.Desviacion = Desvc;
                this.Stock = Stok;
                this.StockFin = StkFn;
                this.CapacidadBodegaActual = CapBga;
                this.CapacidadBodegaFinalProd = CapBgaFn;
                this.Comentario = Comen;
                this.UserSign = Usersn;
                this.UserSign2 = Usersn2;
            }

            this.FechaIni = FInicio.ToString("yyyy-MM-dd");
            this.HoraIni = FInicio.ToString("HH:mm");
            this.FechaTer = Ftermino.ToString("yyyy-MM-dd");
            this.HoraTer = Ftermino.ToString("HH:mm");
            //Recupero el ID Siguiente
            Bdto.CC_WEB_IdEventoSiguientePorIdEventoActual(this.ID, out int Siguiente);
            this.IDSiguiente = Siguiente;

        }

        public void GetStdData()
        {
            this.STD = new Estandar();
            STD.ItemCode = this.ItemCode;
            STD.Maquina = this.Mq.IdMaq;
            STD.GetByItemCode();
        }

        public void FormatFechas()
        {
            this.FechaIni = this.FechaIni + " " + this.HoraIni;
            this.FechaTer = this.FechaTer + " " + this.HoraTer;

            this.FInicio = DateTime.ParseExact(this.FechaIni, "yyyy-MM-dd HH:mm", System.Globalization.CultureInfo.InvariantCulture);
            this.Ftermino = DateTime.ParseExact(this.FechaTer, "yyyy-MM-dd HH:mm", System.Globalization.CultureInfo.InvariantCulture);
        }

        public void RedeemItemCodeData(string ItmCde, string IdMq, DateTime FechaIni, out int CavMolde, out double UnidadesStdTurno, out double ProyeccionTotal, out double ProyeccionCalculada, out double ProyDiario, out double DiarioCalc, out double Desviacion, out double Stock, out double CapBodega, out double Dias, out double Turnos, out double Planned, out double PesoItem)
        {
            //Cuando este puesto el codigo, la maquina, las cavidades (o el std), y la cantidad planificada, tengo que devolver la fecha de termino, el stock en bodega y todos los valores asociados, este es un json, no usa variables locales.
            this.STD = new Estandar();
            STD.ItemCode = ItmCde;
            STD.Maquina = IdMq;
            STD.GetByItemCode();

            CavMolde = 0;
            UnidadesStdTurno = 0;
            ProyeccionTotal = 0;
            ProyeccionCalculada = 0;
            Stock = 0;
            CapBodega = 0;
            Turnos = 6;
            Dias = (8*6)/24;
            PesoItem = 0;

            //Recupero los datos de venta, el stock de bodega, las unidades por turno, etc.
            Bdto.CC_WEB_DatosPlanificacionCalendario(ItmCde, out double pesoItm, FechaIni, out double Stock_, out double VentaD, out int dLab, out double Py);

            //Recupero el planificado mensual
            ProyeccionTotal = Py; //Test.
            ProyDiario = ProyeccionTotal / dLab;
            ProyDiario = Math.Round(ProyDiario, 2);
            DiarioCalc = VentaD;
            ProyeccionCalculada = Math.Round(DiarioCalc * dLab, 2);
            ProyeccionCalculada = Math.Round(ProyeccionCalculada, 2);
            Desviacion = (ProyeccionTotal / ProyeccionCalculada) * 100;
            if (Desviacion > 100)
            {
                Desviacion = Desviacion - 100;
            }
            else if (Desviacion == 100)
            {
                Desviacion = 0;
            }
            else
            {
                Desviacion = (100 - Desviacion) * -1;
            }

            Desviacion = Math.Round(Desviacion, 2);

            if (STD.Tipo == "IY")
            {
                CavMolde = this.STD.Cavs;
                UnidadesStdTurno = STD.UnTurno;
            }
            else
            {
                CavMolde = 0;
                UnidadesStdTurno = Math.Round((STD.StdValueEx * 8) / pesoItm, 0);
            }
            PesoItem = (pesoItm / 1000);

            Stock = Stock_;
            CapBodega = (Stock / DiarioCalc);
            CapBodega = Math.Round(CapBodega, 2);
            Planned = Math.Round(UnidadesStdTurno * Turnos, 0);
        }

        public void RedeemDataFromPlannedQty(double Peso, double UnTurno, double Planificado, double Stock, double VentaDia, DateTime FechaIni, out DateTime FechaTermino, out double KilosPrograma, out double CapBodegaFin, out double DiasProd, out double TurnosProd)
        {
            //Si el planificado viene en 0, no se calcula
            if (Planificado == 0)
            {
                KilosPrograma = 0;
                CapBodegaFin = Stock;
                DiasProd = 2; //Estandar
                TurnosProd = 6; //Estandar
                FechaTermino = FechaIni.AddDays(2);
            }
            else
            {
                //Cuando este puesto el codigo, la maquina, las cavidades (o el std), y la cantidad planificada, tengo que devolver la fecha de termino, el stock en bodega y todos los valores asociados, este es un json, no usa variables locales.
                KilosPrograma = (Planificado * Peso);
                KilosPrograma = Math.Round(KilosPrograma);
                //calculo de la fecha de termino estimada
                //Convierto las unidades a minutos:
                double UnxMinuto = UnTurno / 480;
                double Minutos = Planificado / UnxMinuto;
                FechaTermino = FechaIni.AddMinutes(Minutos);
                DiasProd = (FechaTermino - FechaIni).TotalDays;
                CapBodegaFin = ((Stock + Planificado) / VentaDia) - DiasProd;
                CapBodegaFin = Math.Round(CapBodegaFin, 2);
                TurnosProd = ((((FechaTermino - FechaIni).TotalDays) * 24) / 8);
                TurnosProd = Math.Round(TurnosProd); //no se cuentan los domingos
            }
        }

        public void RedeemDataFromTurnos(double Peso, double UnTurno, out double Planificado, double Stock, double VentaDia, DateTime FechaIni, out DateTime FechaTermino, out double KilosPrograma, out double CapBodegaFin, out double DiasProd, double TurnosProd)
        {
            //Si el planificado viene en 0, no se calcula
            if (TurnosProd == 0)
            {
                KilosPrograma = 0;
                CapBodegaFin = Stock;
                DiasProd = 0; //Estandar
                Planificado = 0; //Estandar
                FechaTermino = FechaIni;
            }
            else
            {
                Planificado = TurnosProd * UnTurno;
                Planificado = Math.Round(Planificado, 0);
                //Cuando este puesto el codigo, la maquina, las cavidades (o el std), y la cantidad planificada, tengo que devolver la fecha de termino, el stock en bodega y todos los valores asociados, este es un json, no usa variables locales.
                KilosPrograma = (Planificado * Peso);
                //calculo de la fecha de termino estimada
                //Convierto las unidades a minutos:
                double UnxMinuto = UnTurno / 480;
                double Minutos = Planificado / UnxMinuto;
                FechaTermino = FechaIni.AddMinutes(Minutos);
                CapBodegaFin = ((Stock + Planificado) / VentaDia) - (FechaTermino - FechaIni).TotalDays;
                CapBodegaFin = Math.Round(CapBodegaFin, 2);
                DiasProd = (FechaTermino - FechaIni).TotalDays;
            }
        }

        public void RedeemDataFromDias(double Peso, double UnTurno, out double Planificado, double Stock, double VentaDia, DateTime FechaIni, out DateTime FechaTermino, out double KilosPrograma, out double CapBodegaFin, double DiasProd, out double TurnosProd)
        {
            //Si el planificado viene en 0, no se calcula
            if (DiasProd == 0)
            {
                KilosPrograma = 0;
                CapBodegaFin = Stock;
                TurnosProd = 0; //Estandar
                Planificado = 0; //Estandar
                FechaTermino = FechaIni;
            }
            else
            {
                TurnosProd = DiasProd * 3;
                TurnosProd = Math.Round(TurnosProd);
                Planificado = TurnosProd * UnTurno;
                Planificado = Math.Round(Planificado, 0);
                //Cuando este puesto el codigo, la maquina, las cavidades (o el std), y la cantidad planificada, tengo que devolver la fecha de termino, el stock en bodega y todos los valores asociados, este es un json, no usa variables locales.
                KilosPrograma = (Planificado * Peso);
                //calculo de la fecha de termino estimada
                //Convierto las unidades a minutos:
                double UnxMinuto = UnTurno / 480;
                double Minutos = Planificado / UnxMinuto;
                FechaTermino = FechaIni.AddMinutes(Minutos);
                CapBodegaFin = ((Stock + Planificado) / VentaDia) - (FechaTermino - FechaIni).TotalDays;
                CapBodegaFin = Math.Round(CapBodegaFin, 2);
            }
        }

        public void RedeemDataFromFechaTermino(double Peso, double UnTurno, out double Planificado, double Stock, double VentaDia, DateTime FechaIni, DateTime FechaTermino, out double KilosPrograma, out double CapBodegaFin, out double DiasProd, out double TurnosProd)
        {
            //Si el planificado viene en 0, no se calcula
            if (FechaIni > FechaTermino)
            {
                KilosPrograma = 0;
                CapBodegaFin = Stock;
                TurnosProd = 0; //Estandar
                Planificado = 0; //Estandar
                DiasProd = 0;
            }
            else
            {
                DiasProd = (FechaTermino - FechaIni).TotalDays;
                DiasProd = Math.Round(DiasProd);
                TurnosProd = DiasProd * 3;
                TurnosProd = Math.Round(TurnosProd);
                Planificado = TurnosProd * UnTurno;
                Planificado = Math.Round(Planificado, 0);
                //Cuando este puesto el codigo, la maquina, las cavidades (o el std), y la cantidad planificada, tengo que devolver la fecha de termino, el stock en bodega y todos los valores asociados, este es un json, no usa variables locales.
                KilosPrograma = (Planificado * Peso);
                //calculo de la fecha de termino estimada
                //Convierto las unidades a minutos:
                double UnxMinuto = UnTurno / 480;
                double Minutos = Planificado / UnxMinuto;
                FechaTermino = FechaIni.AddMinutes(Minutos);
                CapBodegaFin = ((Stock + Planificado) / VentaDia) - (FechaTermino - FechaIni).TotalDays;
                CapBodegaFin = Math.Round(CapBodegaFin, 2);
            }
        }

        public void GetItemCalcDataNoStd(string ItemCode, out string ItemName, out double DiarioSAP, out double DiarioPredicho, out double MensualProyectadoSAP, out double MensualPredichoVenta, out double Desv, out double STK, out double Peso)
        {
            ItemName = Bdto.CC_WEB_GetItemName(ItemCode);

            if (ItemName != "")
            {
                Bdto.CC_WEB_DatosPlanificacionCalendario(ItemCode, out double pesoItm, DateTime.Now, out double Stock_, out double VentaDiariaSAP, out int DiasLaborales, out double ProyectadoVta);
                Peso = pesoItm;
                STK = Stock_;
                Desv = 0;

                MensualPredichoVenta = ProyectadoVta;
                DiarioPredicho = ProyectadoVta / DiasLaborales;
                DiarioPredicho = Math.Round(DiarioPredicho, 2);
                DiarioSAP = VentaDiariaSAP;
                MensualProyectadoSAP = Math.Round(DiarioSAP * DiasLaborales, 2);
                Desv = (MensualPredichoVenta / MensualProyectadoSAP) * 100;
                if (Desv > 100)
                {
                    Desv = Desv - 100;
                }
                else if (Desv == 100)
                {
                    Desv = 0;
                }
                else
                {
                    Desv = (100 - Desv) * -1;
                }

                Desv = Math.Round(Desv, 2);
            }
            else
            {
                ItemName = "Producto Inexistente";
                Peso = 0;
                STK = 0;
                Desv = 0;
                DiarioSAP = 0;
                MensualProyectadoSAP = 0;
                DiarioPredicho = 0;
                MensualPredichoVenta = 0;
            }

        }
    }

Y este es el error al validar...

ErrorWeon.png


En ningun lado está especificado ese rango de valores :risas
A alguien le ha pasado algo asi?
 

svenkita

Miembro Activo
Se incorporó
20 Julio 2020
Mensajes
5
¿Eso es Razor MVC?
No conozco mucho realmente pero en tu código para el formulario tienes un atributo @step con un valor decimal
Quizás si lo modificas lo podrías arreglar?

<label for="TurnosProd">Turnos de Producción</label>
@Html.TextBoxFor(Model => Model.Turnos, new { @class = "form-control", @type = "number", @Id = "TurnosProduccion", @step = "0.1" })
<small id="TurnosProd" class="form-text text-muted">Turnos en producción (Defecto y mínimo 6)</small>
 
Upvote 0

MetalCOB

Miembro Regular
Se incorporó
2 Enero 2010
Mensajes
94
Necesitas poner decimales ?
Si es así no uses Number, lo más sano es que uses un inout de tipo text con alguna regex que te valide que cumple con los requisitos
 
Upvote 0

_V

The Hateful Wish
Se incorporó
11 Abril 2008
Mensajes
2.666
Ya, el error era una tontera.

Si el dato en la BD y que se carga en el objeto tiene más decimales que el campo step, se manda este taldo.
 
Upvote 0

_V

The Hateful Wish
Se incorporó
11 Abril 2008
Mensajes
2.666
Finalmente, esta fue la solución.

@Html.TextBoxFor(Model => Model.Turnos, new { @class = "form-control", @type = "number", @Id = "TurnosProduccion", @step = "Any" })

Así, no importa como venga el campo, mientras sea un número valido pasa.
 
Upvote 0
Subir