Esempio n. 1
0
        /// <summary>
        /// Controla el ciclo de vida del objeto.
        /// Determina la transición actual a partir del estado origen y del evento
        /// Si la condición de guarda retorna ok se puede ejecutar la acción
        /// 1/10/15 jcf Agrega try/catch
        /// </summary>
        /// <param name="evento"></param>
        /// <param name="docAnulado"></param>
        /// <param name="usuarioConAcceso"></param>
        /// <returns></returns>
        public bool Transiciona(int evento, int usuarioConAcceso)
        {
            iErr = 0;
            sMsj = string.Empty;
            bool guardaCondicion = false;

            try
            {
                var proximoPaso = _matrizTransiciones
                                  .Where(x => x.evento.Equals(evento))
                                  .Where(y => y.origen.Equals(_idxSingleStatus))
                                  .Select(y => y);

                if (proximoPaso.Count() > 0)
                {
                    //obtiene la transición actual
                    foreach (var tran in proximoPaso)
                    {
                        _currentTransition = tran;
                    }

                    //verifica la condición de guarda
                    guardaCondicion = _currentTransition.CondicionDeGuarda(_voidStts, usuarioConAcceso);
                    if (guardaCondicion)
                    {
                        char[] chBinStatus = _targetBinStatus.ToArray();
                        chBinStatus[_currentTransition.destino] = '1';
                        _targetBinStatus = new string(chBinStatus);

                        //Si la transición es a un subestado verificar que todos los subestados estén encendidos
                        if (_currentTransition.Tipo.Equals("sco"))
                        {
                            if (subEstadosEncendidos(_idxSingleStatus, _targetBinStatus, "sco"))
                            {
                                _idxSingleStatus = _currentTransition.destino;
                            }
                        }
                        else
                        {
                            _idxSingleStatus = _currentTransition.destino;
                        }
                    }
                    iErr = _currentTransition.iErr;
                    sMsj = _currentTransition.sMsj;
                }
                else
                {
                    iErr = -1;
                    sMsj = "Esta acción no corresponde (Evento: " + evento.ToString() + ")";
                }
                return(guardaCondicion);
            }
            catch (Exception tr)
            {
                iErr++;
                sMsj = _matrizTransiciones == null ? "No existe transición para este tipo de documento. " : "Excepción desconocida en la transición del evento ";
                sMsj = sMsj + evento.ToString() + " [binStatus: " + _binStatus.ToString() + " targetBinStatus: " + _targetBinStatus.ToString() + " idxSingleStatus: " + _idxSingleStatus.ToString() + " estadoInicial: " + estadoInicial.ToString() + " voidStts: " + _voidStts.ToString() + "] " + tr.Message;
                return(false);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Controla el ciclo de vida del objeto.
        /// Determina la transición actual a partir del estado origen y del evento
        /// Si la condición de guarda retorna ok se puede ejecutar la acción
        /// 1/10/15 jcf Agrega try/catch
        /// </summary>
        /// <param name="evento"></param>
        /// <param name="docAnulado"></param>
        /// <param name="usuarioConAcceso"></param>
        /// <returns></returns>
        public bool Transiciona(int evento, int usuarioConAcceso)
        {
            //iErr = 0;
            sMsj = string.Empty;
            bool guardaCondicion = false;

            try
            {
                var proximoPaso = _matrizTransiciones
                                  .Where(x => x.evento.Equals(evento))
                                  .Where(y => y.origen.Equals(_idxSingleStatus))
                                  .Select(y => y);

                if (proximoPaso.Count() > 0)
                {
                    //obtiene la transición actual
                    foreach (var tran in proximoPaso)
                    {
                        _currentTransition = tran;
                    }

                    //verifica la condición de guarda
                    guardaCondicion = _currentTransition.CondicionDeGuarda(evento, _voidStts, usuarioConAcceso);
                    if (guardaCondicion)
                    {
                        char[] chBinStatus = _targetBinStatus.ToArray();
                        chBinStatus[_currentTransition.destino] = '1';
                        _targetBinStatus = new string(chBinStatus);

                        //Si la transición es a un subestado verificar que todos los subestados estén encendidos
                        if (_currentTransition.Tipo.Equals("sco"))
                        {
                            if (subEstadosEncendidos(_idxSingleStatus, _targetBinStatus, "sco"))
                            {
                                _idxSingleStatus = _currentTransition.destino;
                            }
                        }
                        else
                        {
                            _idxSingleStatus = _currentTransition.destino;
                        }
                    }
                    //iErr = _currentTransition.iErr;
                    sMsj = _currentTransition.sMsj;
                }
                else
                {
                    throw new InvalidOperationException("El documento no debe cambiar del status " + _idxSingleStatus.ToString() + "-" + _Estados[_idxSingleStatus].Nombre + " a través de la opción que utilizó. [Evento: " + evento.ToString() + "] ");
                }
                return(guardaCondicion);
            }
            catch (ArgumentException ioe)
            {
                sMsj = ioe.Message + "[Evento: " + evento.ToString() + " binStatus: " + _binStatus.ToString() + " targetBinStatus: " + _targetBinStatus.ToString() + " idxSingleStatus: " + _idxSingleStatus.ToString() + " estadoInicial: " + estadoInicial.ToString() + " voidStts: " + _voidStts.ToString() + "] " + ioe.TargetSite.ToString();
                return(false);
            }
            catch (Exception tr)
            {
                sMsj = _matrizTransiciones == null ? "No existe transición para este tipo de documento. " : "Operación inválida. ";
                sMsj = sMsj + tr.Message + " [binStatus: " + _binStatus.ToString() + " targetBinStatus: " + _targetBinStatus.ToString() + " estadoInicial: " + estadoInicial.ToString() + " voidStts: " + _voidStts.ToString() + "] ";
                return(false);
            }
        }