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; } }
//********************************************************** 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; } }
/// <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); } }
/// <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; } }
/// <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); } }