Ejemplo n.º 1
0
        public Maquina(String tipoEstado, String claseMaquina)
        {
            try
            {
                if (tipoEstado.Equals("emisor"))
                {
                    _binStatus       = binStatusBaseEmisor;
                    _targetBinStatus = binStatusBaseEmisor;
                }

                if (tipoEstado.Equals("receptor"))
                {
                    _binStatus       = binStatusBaseReceptor;
                    _targetBinStatus = binStatusBaseReceptor;
                }

                _idxSingleStatus   = _binStatus.IndexOf('1');
                estadoInicial      = _idxSingleStatus;
                _currentTransition = new Transicion();
                _voidStts          = 0;

                InicializaTransicionesDe(claseMaquina);
            }
            catch (Exception)
            {
                throw;
            }
        }
Ejemplo n.º 2
0
        //**********************************************************

        public Maquina(string compoundedBinStatus, string idxSingleStatus, short voidStts, String tipoEstado, String claseMaquina)
        {
            try
            {
                _binStatus       = compoundedBinStatus;
                _targetBinStatus = compoundedBinStatus;
                _idxSingleStatus = Convert.ToInt32(idxSingleStatus);

                if (tipoEstado.Equals("emisor"))
                {
                    estadoInicial = binStatusBaseEmisor.IndexOf('1');
                }
                else
                {
                    estadoInicial = binStatusBaseReceptor.IndexOf('1');
                }

                _currentTransition = new Transicion();
                _voidStts          = voidStts;

                InicializaTransicionesDe(claseMaquina);
            }
            catch (Exception)
            {
                throw;
            }
        }
Ejemplo n.º 3
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);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Traducción en palabras del estado binario
        /// </summary>
        /// <param name="eBinario">Cadena de 12 bits de derecha a izquierda que indica los estados del documento.</param>
        /// <param name="compania">Parámetros de la compañía</param>
        /// <returns>Traducción del estado binario.</returns>
        public string EstadoEnPalabras(string eBinario)
        {
            try
            {
                Transicion parDondeInsertar = new Transicion();
                paresOrdenados = new List <Transicion>();
                idxEBinario    = new int[eBinario.Length];
                //obtiene todos los pares origen - destinos del estado binario
                for (int i = 0; i < eBinario.Length; i++)
                {
                    if (eBinario[i] == '1')
                    {
                        idxEBinario[i] = i;
                    }
                    else
                    {
                        idxEBinario[i] = -1;
                    }
                }
                var paresDesordenados = _matrizTransiciones
                                        .Where(x => idxEBinario.Contains(x.destino))
                                        .Select(x => x);

                paresOrdenados.Add(new Transicion(0, "", "std", -1, estadoInicial));  //estado inicial
                idxMaxLevel = 0;
                maxLevel    = 0;
                buscarSiguiente(estadoInicial, 0);

                //convierte los estados a palabras
                string enPalabras         = string.Empty;
                String descripcionEstados = String.Empty;
                int    anterior           = paresOrdenados[idxMaxLevel].destino;

                for (int ind = idxMaxLevel; ind >= 0; ind--)
                {
                    //No agregar palabras si es estado inicial y no tiene continuidad
                    if (paresOrdenados[ind].destino != estadoInicial && paresOrdenados[ind].destino == anterior)
                    {
                        descripcionEstados = paresOrdenados[ind].Tipo.Equals("sco") ? getDescripcionSubEstados(paresOrdenados[ind].origen, eBinario, "sco") : _Estados[paresOrdenados[ind].destino].Nombre.ToUpper();
                        enPalabras         = descripcionEstados + ". " + enPalabras;
                    }
                    anterior = paresOrdenados[ind].origen;
                }

                return(enPalabras);
            }
            catch (Exception)
            {
                throw;
            }
        }
Ejemplo n.º 5
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);
            }
        }