WORKFLOW CLÁSSICO: Biblioteca de funções SPEL - 2016-08-23
WORKFLOW CLÁSSICO: Biblioteca de funções SPEL
Preparei uma coletânea de funções SPEL desenvolvidas por mim (Daniel Bighelini) que podem ser muito úteis em ações e condições de macro em tarefas de fluxo de trabalho para todos os objetos na ferramenta SDM.
Todas estas funções estão bem documentadas, são funções inteligentes pois se adaptam ao tipo de objeto envolvido e possuem exemplos de utilização no próprio código.
Todas elas podem ser utilizadas para qualquer tipo de objeto (Incidentes, Problemas, Solicitações, Ocorrências e Requisições de mudança).
I have prepared a collection of SPEL functions developed by me (Daniel Bighelini) that can be very useful in macro actions and conditions in workflow tasks for all objects in the SDM tool.
All these functions are well documented, they are intelligent functions because they adapt to the type of object involved and have examples of use in the code itself.
All of them can be used for any type of object (Incidents, Problems, Requests, Occurrences and Requests for change).
z_armazena_propriedade
z_consulta_propriedade
z_altera_valor
z_consulta_valor
z_randomize
z_consulta_producer
z_consulta_tipo_atributo
z_identifica_usuario_logado
z_consulta_factory_info
z_notifica_contato
z_replace_doublebyte
z_replace_doublebyte_utf8
z_contain_doublebyte
z_contain_doublebyte_utf8
z_bloco_fim
z_bloco_inicio
Se alguém achar algum bug, ganha um prêmio.
Divirtam-se!
z_bloco_fim(int zi_depurar, string zs_metodo)
{
if (zi_depurar > 0) {
logf(SIGNIFICANT, "=============================================================");
logf(SIGNIFICANT, "%s Fim : %s", zs_metodo, now());
logf(SIGNIFICANT, "=============================================================");
}
}
z_bloco_inicio(int zi_depurar, string zs_metodo)
{
if (zi_depurar > 0) {
logf(SIGNIFICANT, "=============================================================");
logf(SIGNIFICANT, "%s Inicio : %s", zs_metodo, now());
logf(SIGNIFICANT, "%s Usuario: '%s'", zs_metodo, thread_userid());
if (!is_empty(event())) logf(SIGNIFICANT, "%s Evento : '%s'", zs_metodo, event());
if (!is_empty(class())) logf(SIGNIFICANT, "%s Classe : '%s'", zs_metodo, class());
logf(SIGNIFICANT, "=============================================================");
}
}
string z_armazena_propriedade(string zs_persid, int zi_depurar, string zs_metodo, int zi_sequencia, string zs_rotulo, string zs_valor)
{
int zi_i;
string zs_msg;
zs_metodo += ' z_armazena_propriedade - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
logf(SIGNIFICANT, "%s '%s'", zs_metodo, zs_persid);
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Identificando 'producer' do objeto '%s'...", zs_metodo, zs_persid);
string zs_producer;
zs_producer = substr(zs_persid, 0, sindex(zs_persid,":"));
if (sindex(zs_persid, ":") == -1) {
zs_msg = format("%s ERRO ao identificar o producer do objeto '%s': %s", zs_metodo, zs_persid, sindex(zs_persid,":"));
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Producer do objeto '%s': '%s'", zs_metodo, zs_persid, zs_producer);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Identificando 'id' do objeto '%s'...", zs_metodo, zs_persid);
int zi_id;
zi_id = (int) substr(zs_persid, sindex(zs_persid,":") + 1);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s ID do objeto '%s': '%s'", zs_metodo, zs_persid, zi_id);
string zs_obj_id, zs_prp_factory;
if (zs_producer == "chg") {
zs_prp_factory = "prp";
zs_obj_id = format("object_id=%s", zi_id);
} else if (zs_producer == "iss") {
zs_prp_factory = "iss_prp";
zs_obj_id = format("owning_iss='iss:%s'", zi_id);
} else if (zs_producer == "cr") {
zs_prp_factory = "cr_prp";
zs_obj_id = format("owning_cr='cr:%s", zi_id);
} else {
zs_msg = format("%s ERRO ao identificar o objeto '%s'.", zs_metodo, zs_persid);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
string zs_obj_prp;
if (is_null(zi_sequencia) || zi_sequencia == 0) {
zs_obj_prp = format("label='%s'", zs_rotulo);
} else {
zs_obj_prp = format("sequence=%s", zi_sequencia);
}
string zs_clausula;
zs_clausula = format("%s AND %s", zs_obj_id, zs_obj_prp);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Clausula where utilizada: '%s'", zs_metodo, zs_clausula);
send_wait(0, top_object(), "call_attr", zs_prp_factory, "sync_fetch", "STATIC", zs_clausula, -1, 0);
if (msg_error()) {
zs_msg = format("%s ERRO ao definir a lista de valores: %s", zs_metodo, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
object zo_list_prp;
int zi_count_list;
zo_list_prp = msg[0];
zi_count_list = msg[1];
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Armazenando propriedade '%s' no objeto '%s'...", zs_metodo, zs_obj_prp, zs_persid);
if(zi_count_list>0) {
send_wait(0, zo_list_prp, "dob_by_index", "DEFAULT", 0 , 0);
if (msg_error()) {
zs_msg = format("%s ERRO ao instanciar objeto: '%s'", zs_metodo, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
object zo_prp;
zo_prp = msg[0];
string zs_resultado;
zs_resultado = z_altera_valor(zo_prp.persistent_id, zi_depurar, zs_metodo, 'value', zs_valor);
if (sindex(zs_resultado, " ERRO ") >= 0) {
zs_msg = format("%s %s", zs_metodo, zs_resultado);
logf(ERROR, "%s", zs_msg);
}
z_bloco_fim(zi_depurar, zs_metodo);
return "OK";
} else {
zs_msg = format("%s AVISO: Nenhuma propriedade foi localizada no objeto '%s' com a clausula de procura '%s'.", zs_metodo, zs_persid, zs_clausula);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
z_bloco_fim(zi_depurar, zs_metodo);
return;
}
string z_consulta_propriedade(string zs_persid, int zi_depurar, string zs_metodo, int zi_sequencia, string zs_rotulo)
{
int zi_i;
string zs_msg;
zs_metodo = zs_metodo + ' z_consulta_propriedade - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
logf(SIGNIFICANT, "%s '%s'", zs_metodo, zs_persid);
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Identificando 'producer' do objeto '%s'...", zs_metodo, zs_persid);
string zs_producer;
zs_producer = substr(zs_persid, 0, sindex(zs_persid,":"));
if (sindex(zs_persid, ":") == -1) {
zs_msg = format("%s ERRO ao identificar o producer do objeto '%s': %s", zs_metodo, zs_persid, sindex(zs_persid,":"));
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Producer do objeto '%s': '%s'", zs_metodo, zs_persid, zs_producer);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Identificando 'id' do objeto '%s'...", zs_metodo, zs_persid);
int zi_id;
zi_id = (int) substr(zs_persid, sindex(zs_persid,":") + 1);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s ID do objeto '%s': '%s'", zs_metodo, zs_persid, zi_id);
string zs_obj_id, zs_prp_factory;
if (zs_producer == "chg") {
zs_prp_factory = "prp";
zs_obj_id = format("object_id=%s", zi_id);
} else if (zs_producer == "iss") {
zs_prp_factory = "iss_prp";
zs_obj_id = format("owning_iss='iss:%s'", zi_id);
} else if (zs_producer == "cr") {
zs_prp_factory = "cr_prp";
zs_obj_id = format("owning_cr='cr:%s", zi_id);
} else {
zs_msg = format("%s ERRO ao identificar o objeto '%s'.", zs_metodo, zs_persid);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
string zs_obj_prp;
if (is_null(zi_sequencia) || zi_sequencia == 0) {
zs_obj_prp = format("label='%s'", zs_rotulo);
} else {
zs_obj_prp = format("sequence=%s", zi_sequencia);
}
string zs_clausula;
zs_clausula = format("%s AND %s", zs_obj_id, zs_obj_prp);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Clausula where utilizada: '%s'", zs_metodo, zs_clausula);
string zs_resultado;
zs_resultado = z_consulta_registro(zs_prp_factory, zi_depurar, zs_metodo, zs_clausula, "value");
if (sindex(zs_resultado, " ERRO ") >= 0) {
zs_msg = format("%s %s", zs_metodo, zs_resultado);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return;
}
z_bloco_fim(zi_depurar, zs_metodo);
return zs_resultado;
}
string z_altera_valor(...)
{
string zs_persid, zs_metodo;
int zi_depurar;
int zi_h, zi_i, zi_tempo_atraso, zi_tempo_atraso_padrao, zi_tempo_limite, zi_tentativas_limite, zi_tentativas, zi_fator, zi_errors;
string zs_msg, zs_msg_return;
zs_persid = (string) argv[0];
zi_depurar = (int) argv[1];
zs_metodo = (string) argv[2] + ' z_altera_valor - ';
zi_tempo_atraso_padrao = 10;
zi_tempo_atraso = zi_tempo_atraso_padrao;
zi_tempo_limite = 5120;
zi_tentativas_limite = 10;
zi_tentativas = 0;
zi_fator = 2;
zi_errors = 0;
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i++) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
logf(SIGNIFICANT, "%s '%s'", zs_metodo, zs_persid);
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Identificando 'producer' do objeto '%s'...", zs_metodo, zs_persid);
string zs_producer;
zs_producer = substr(zs_persid, 0, sindex(zs_persid, ":"));
if (sindex(zs_persid, ":") == -1) {
zs_msg = format("%s ERRO ao identificar o producer do objeto '%s': %s", zs_metodo, zs_persid, sindex(zs_persid,":"));
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Producer do objeto '%s': '%s'", zs_metodo, zs_persid, zs_producer);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s INSTANCIANDO objeto '%s'...", zs_metodo, zs_persid);
send_wait(0, top_object(), "call_attr", zs_producer, "dob_by_persid", 0, zs_persid);
if (msg_error()) {
zs_msg = format("%s ERRO ao instanciar o objeto '%s': %s", zs_metodo, zs_persid, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
object zo_objeto;
zo_objeto = msg[0];
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Objeto '%s' instanciado: '%s'", zs_metodo, zs_persid, (string) zo_objeto);
int zi_atributos_alterados;
zi_atributos_alterados = 0;
int zi_count_atributos;
zi_count_atributos = argc;
string zs_method_triggers, zs_value;
zs_method_triggers = "SURE_SET";
for (zi_h=3; zi_h<zi_count_atributos; zi_h+=2) {
if (argv[zi_h] == "SUPPRESS_TRIGGERS" && argv[zi_h+1] == "TRUE") {
zs_method_triggers = "SUPPRESS_TRIGGERS";
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Metodo '%s' ATIVADO.", zs_metodo, zs_method_triggers);
} else {
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s CONSULTANDO o valor atual do atributo '%s' no objeto '%s'...", zs_metodo, argv[zi_h], zs_persid);
send_wait(0, zo_objeto, "call_attr", argv[zi_h], "get_val");
if (msg_error()) {
zs_msg = format("%s ERRO ao consultar o atributo '%s' do objeto '%s': %s", zs_metodo, argv[zi_h], zs_persid, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
zs_value = (string) msg[0];
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Valor atual do atributo '%s' do objeto '%s': '%s'", zs_metodo, argv[zi_h], zs_persid, msg[0]);
if (msg[0] != argv[zi_h+1] || (is_null(msg[0]) && !is_null(argv[zi_h+1])) || (!is_null(msg[0]) && is_null(argv[zi_h+1]))) {
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s O valor atual do atributo '%s' ('%s') no objeto '%s' eh DIFERENTE do novo valor informado ('%s'). Continuando...", zs_metodo, argv[zi_h], msg[0], zs_persid, argv[zi_h+1]);
zi_atributos_alterados++;
if (zi_atributos_alterados == 1) {
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Instanciando Group leader...", zs_metodo);
send_wait(0, top_object(), "get_co_group");
if (msg_error()) {
zs_msg = format("%s ERRO ao instanciar GL: '%s'", zs_metodo, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
object zo_group_leader;
zo_group_leader = msg[0];
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Group leader: '%s'", zs_metodo, (string) msg[0]);
while(zi_tentativas < zi_tentativas_limite && zi_tempo_atraso <= zi_tempo_limite) {
zi_tentativas++;
zi_tempo_atraso = zi_tempo_atraso * zi_fator;
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s BLOQUEANDO o objeto '%s'...", zs_metodo, zs_persid);
send_wait(0, zo_group_leader, "checkout", zo_objeto);
zs_msg_return = msg[0];
if (msg_error()) {
zi_errors++;
for (zi_i=0, zs_msg_return=""; zi_i<msg_length(); zi_i++) { if (zi_i==0) { zs_msg_return = format("%s", msg[zi_i]); } else if (!is_null(msg[zi_i])) { zs_msg_return += format(": %s", msg[zi_i]); } }
zs_msg = format("%s ERRO na %da tentativa de bloquear o objeto '%s': '%s'", zs_metodo, zi_tentativas, zs_persid, zs_msg_return);
logf(ERROR, "%s", zs_msg);
if (zi_tentativas == zi_tentativas_limite) {
return zs_msg;
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Aguardando %d segundos para tentar bloquear o objeto '%s' novamente...", zs_metodo, zi_tempo_atraso, zs_persid);
sleep(zi_tempo_atraso);
} else {
if (zi_depurar >= 1 || zi_errors > 0) logf(SIGNIFICANT, "%s Resultado do CHECKOUT no objeto '%s': '%s'", zs_metodo, zs_persid, zs_msg_return);
zi_tentativas = 0;
zi_tempo_atraso = zi_tempo_atraso_padrao;
break;
}
}
}
if (zi_tempo_atraso > zi_tempo_limite) {
zs_msg = format("%s ERRO na %da tentativa de bloquear o objeto '%s': TEMPO LIMITE atingido (%d).", zs_metodo, zi_tentativas, zs_persid, zi_tempo_limite);
logf(FATAL, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_errors > 0) {
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s AVISO: Ocorreram %d erros. Realizando verificacoes adicionais...", zs_metodo, zi_errors);
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s CONSULTANDO o valor atual do atributo '%s' no objeto '%s'...", zs_metodo, argv[zi_h], zs_persid);
send_wait(0, zo_objeto, "call_attr", argv[zi_h], "get_val");
if (msg_error()) {
zs_msg = format("%s ERRO ao consultar o atributo '%s' do objeto '%s': %s", zs_metodo, argv[zi_h], zs_persid, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if ((string) msg[0] != zs_value) {
logf(ERROR, "%s ERRO: O valor atual do atributo '%s' do objeto '%s' nao coincide com o valor inicial '%s' consultado anteriormente: Encerrando metodo...", zs_metodo, argv[zi_h], zs_persid, zs_value);
logf(ERROR, "%s DESBLOQUEANDO o objeto '%s' devido a %d erros ocorridos...", zs_metodo, zs_persid, zi_errors);
send_wait(0, zo_group_leader, "uncheck", zo_objeto);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s PERSISTINDO valor '%s' no atributo '%s' do objeto '%s'...", zs_metodo, argv[zi_h+1], argv[zi_h], zs_persid);
send_wait(0, zo_objeto, "call_attr", argv[zi_h], "set_val", argv[zi_h+1], zs_method_triggers);
if (msg_error()) {
zs_msg = format("%s ERRO ao persistir o valor '%s' no atributo '%s' do objeto '%s': '%s'", zs_metodo, argv[zi_h+1], argv[zi_h], zs_persid, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Resultado da alteracao do atributo '%s' no objeto '%s': '%s'", zs_metodo, argv[zi_h], zs_persid, (string) msg[0]);
} else {
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s O valor atual do atributo '%s' ('%s') no objeto '%s' eh IGUAL ao novo valor informado ('%s'). Ignorando alteracao...", zs_metodo, argv[zi_h], msg[0], zs_persid, argv[zi_h+1]);
}
}
}
if (zi_atributos_alterados > 0) {
while(zi_tentativas < zi_tentativas_limite && zi_tempo_atraso <= zi_tempo_limite) {
zi_tentativas++;
zi_tempo_atraso = zi_tempo_atraso * zi_fator;
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s DESBLOQUEANDO o objeto '%s'...", zs_metodo, zs_persid);
send_wait(0, zo_group_leader, "checkin", zo_objeto);
zs_msg_return = msg[0];
if (msg_error()) {
zi_errors++;
for (zi_i=0, zs_msg_return=""; zi_i<msg_length(); zi_i++) { if (zi_i==0) { zs_msg_return = format("%s", msg[zi_i]); } else if (!is_null(msg[zi_i])) { zs_msg_return += format(": %s", msg[zi_i]); } }
zs_msg = format("%s ERRO na %da tentativa de desbloquear o objeto '%s': '%s'", zs_metodo, zi_tentativas, zs_persid, zs_msg_return);
logf(ERROR, "%s", zs_msg);
if (zi_tentativas == zi_tentativas_limite) {
logf(ERROR, "%s DESBLOQUEANDO o objeto '%s' devido a %d erros ocorridos...", zs_metodo, zs_persid, zi_errors);
send_wait(0, zo_group_leader, "uncheck", zo_objeto);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Aguardando %d segundos para tentar desbloquear o objeto '%s' novamente...", zs_metodo, zi_tempo_atraso, zs_persid);
sleep(zi_tempo_atraso);
} else {
if (zi_depurar >= 1 || zi_errors > 0) logf(SIGNIFICANT, "%s Resultado do CHECKIN no objeto '%s': '%s'", zs_metodo, zs_persid, zs_msg_return);
zi_tentativas = 0;
zi_tempo_atraso = zi_tempo_atraso_padrao;
break;
}
}
} else {
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s AVISO: Nao foi necessario nenhuma alteracao de atributo no objeto '%s'. Encerrando metodo...", zs_metodo, zs_persid);
}
if (zi_depurar >= 1) {
if (zs_method_triggers == "SURE_SET") {
logf(SIGNIFICANT, "%s Quantidade de atributos INFORMADOS: %d", zs_metodo, (zi_count_atributos-3)/2);
} else {
logf(SIGNIFICANT, "%s Quantidade de atributos INFORMADOS: %d", zs_metodo, (zi_count_atributos-5)/2);
}
logf(SIGNIFICANT, "%s Quantidade de atributos ALTERADOS : %d", zs_metodo, zi_atributos_alterados);
if (zi_errors > 0) {
logf(SIGNIFICANT, "%s Quantidade de ERROS ocorridos : %d", zs_metodo, zi_errors);
}
}
z_bloco_fim(zi_depurar, zs_metodo);
return "OK";
}
int z_randomize(...) {
string zs_metodo;
int zi_size, zi_i, zi_depurar;
if (argc>0) zi_size = (int) argv[0];
if (argc>1) zi_depurar = (int) argv[1];
if (argc>2) zs_metodo = (string) argv[2];
if (is_null(zi_size) || zi_size == 0) zi_size = 1;
if (is_null(zi_depurar)) zi_depurar = 0;
if (is_null(zs_metodo)) { zs_metodo = 'z_randomize - '; } else { zs_metodo += ' z_randomize - '; }
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
int zi_number_in, zi_number_out, zi_number_compl;
int zi_start, zi_count, zi_limit_loop, zi_limit_int, zi_limit_size;
string zs_number_in;
zi_count = 0;
zi_limit_loop = 500;
zi_limit_int = 2147483647;
zi_limit_size = 10;
zi_number_in = (int) thread_object_ptr();
zi_number_out = 0;
if (zi_size > zi_limit_size) {
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s AVISO: A quantidade de digitos informada (%d) NAO eh permitida. Redefinindo o parametro para o valor %d...", zs_metodo, zi_size, zi_limit_size));
zi_size = 10;
}
if (zi_size > strlen((string) zi_number_in)) {
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s AVISO: A quantidade de digitos informada (%d) nao eh possivel em relacao ao numero gerado (%d). Complementando numero...", zs_metodo, zi_size, zi_number_in));
zi_number_compl = (int) substr((string) zi_number_in, 0, zi_size - strlen((string) zi_number_in));
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s AVISO: Complemento: %d", zs_metodo, zi_number_compl));
zi_number_in = (int) format("%d%d", zi_number_in, zi_number_compl);
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s AVISO: Numero inicial complementado: %d", zs_metodo, zi_number_in));
}
while (strlen((string) zi_number_out) != zi_size && zi_count <= zi_limit_loop || zi_number_out == 0) {
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s Calculando...", zs_metodo));
zi_count += 1;
zi_number_in += zi_count;
zs_number_in = (string) zi_number_in;
zi_start = strlen(zs_number_in) - zi_size;
zi_number_out = (int) substr(zs_number_in, zi_start, zi_size);
}
if (strlen((string) zi_number_out) != zi_size) {
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s AVISO: O limite de tentativas foi ultrapassado (%d). Complementando o numero com o primeiro digito...", zs_metodo, zi_limit_loop));
zi_number_out = (int) format("%d%d", zi_number_in, (int) substr(zs_number_in, 0, 1));
}
if (zi_number_out < 0) {
if ( zi_depurar>=1 ) logf(SIGNIFICANT, format("%s AVISO: O numero eh invalido pois ultrapassou o limite da variavel (%d). Redefinindo...", zs_metodo, zi_limit_int));
zi_number_out = zi_limit_int - zi_number_compl;
}
if ( zi_depurar>=1 ) {
logf(SIGNIFICANT, format("%s Tentativas necessarias : %d", zs_metodo, zi_count));
logf(SIGNIFICANT, format("%s Numero de entrada : %d", zs_metodo, zi_number_in));
logf(SIGNIFICANT, format("%s Quantidade de digitos : %s", zs_metodo, zi_size));
logf(SIGNIFICANT, format("%s Numero de saida : %s", zs_metodo, zi_number_out));
}
z_bloco_fim(zi_depurar, zs_metodo);
return zi_number_out;
}
string z_consulta_producer(string zs_persid, int zi_depurar, string zs_metodo)
{
int zi_i;
zs_metodo += ' z_consulta_producer - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
if (zi_depurar >= 3) logf(SIGNIFICANT, "%s Identificando 'producer' do objeto '%s'...", zs_metodo, zs_persid);
string zs_producer;
zs_producer = substr(zs_persid, 0, sindex(zs_persid, ":"));
if (sindex(zs_persid, ":") == -1) {
string zs_msg;
zs_msg = format("%s ERRO ao identificar o producer do objeto '%s': %s", zs_metodo, zs_persid, sindex(zs_persid, ":"));
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 3) logf(SIGNIFICANT, "%s Producer do objeto '%s': '%s'", zs_metodo, zs_persid, zs_producer);
return zs_producer;
}
string z_consulta_tipo_atributo(string zs_producer, string zs_attribute, int zi_depurar, string zs_metodo)
{
int zi_i;
zs_metodo += ' z_consulta_tipo_atributo - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Consultando o tipo de dado do atributo '%s' do producer '%s'...", zs_metodo, zs_attribute, zs_producer);
send_wait(0, top_object(), "call_attr", zs_producer, "dob_attr_type_info", zs_attribute);
if (msg_error()) {
string zs_msg;
zs_msg = format("%s ERRO ao consultar o tipo de dado armazenado no atributo '%s' do producer '%s': %s", zs_metodo, zs_attribute, zs_producer, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
int zi_count_list;
zi_count_list = msg_length();
string zs_attribute_type;
zs_attribute_type = "";
for (zi_i=0; zi_i<zi_count_list; zi_i++) {
if (zi_depurar >= 3) logf(SIGNIFICANT, "%s msg[%s] = %s", zs_metodo, zi_i, msg[zi_i]);
zs_attribute_type += (string) msg[zi_i] + "@;@";
}
z_bloco_fim(zi_depurar, zs_metodo);
return zs_attribute_type;
}
string z_consulta_valor(string zs_persid, string zs_attribute, int zi_depurar, string zs_metodo)
{
int zi_i;
zs_metodo += ' z_consulta_valor - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
logf(SIGNIFICANT, "%s '%s'", zs_metodo, zs_persid);
}
if (zi_depurar >= 3) logf(SIGNIFICANT, "%s Identificando 'producer' do objeto '%s'...", zs_metodo, zs_persid);
string zs_producer;
zs_producer = z_consulta_producer(zs_persid, zi_depurar, zs_metodo);
if (zi_depurar >= 3) logf(SIGNIFICANT, "%s Consultando o atributo '%s' do objeto '%s' do producer '%s'...", zs_metodo, zs_attribute, zs_persid, zs_producer);
send_wait(0, top_object(), "call_attr", zs_producer, "val_by_key", "persistent_id", zs_persid, (int) 1, zs_attribute);
if (msg_error()) {
string zs_msg;
zs_msg = format("%s ERRO ao consultar o atributo '%s' do objeto '%s' do producer '%s': %s", zs_metodo, zs_attribute, zs_persid, zs_producer, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 2) logf(SIGNIFICANT, "%s Valor do atributo '%s' do objeto '%s': '%s'", zs_metodo, zs_attribute, zs_persid, msg[1]);
return (string) msg[1];
}
uuid z_identifica_usuario_logado(int zi_depurar, string zs_metodo)
{
int zi_i;
zs_metodo += ' z_identifica_usuario_logado - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Identificando usuario logado...", zs_metodo);
send_wait(0, top_object(), "call_attr", "cnt", "current_user_id");
if (msg_error()) {
logf(ERROR, "%s ERRO ao identificar usuario logado: '%s'", msg[0]);
z_bloco_fim(zi_depurar, zs_metodo);
return;
}
uuid zu_login_userid;
zu_login_userid = msg[0];
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Usuario logado: %s", zs_metodo, zu_login_userid);
z_bloco_fim(zi_depurar, zs_metodo);
return zu_login_userid;
}
string z_consulta_factory_info(string zs_factory, string zs_info, int zi_depurar, string zs_metodo)
{
int zi_i;
string zs_msg;
zs_metodo += ' z_consulta_factory_info - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
string zs_info_value, zs_factory_attributes;
zs_factory_attributes = '';
if (zs_info == "Attributes==ALL") {
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Identificando a lista de atributos da factory '%s'...", zs_metodo, zs_factory);
send_wait(0, top_object(), "call_attr", zs_factory, "dob_attr_list");
if (msg_error()) {
zs_msg = format("%s ERRO ao obter a lista de atributos da factory '%s': '%s'", zs_metodo, zs_factory, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (msg_length() > 1) {
for (zi_i=1; zi_i<msg_length(); zi_i++) {
zs_factory_attributes += msg[zi_i] + '; ';
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Lista de atributos da factory '%s': %s", zs_metodo, zs_factory, zs_factory_attributes);
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Numero de atributos encontrados na factory '%s': %s", zs_metodo, zs_factory, msg_length()-1);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_factory_attributes;
} else if (zs_info == "Attributes==REQUIRED") {
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Identificando a lista de atributos OBRIGATORIOS da factory '%s'...", zs_metodo, zs_factory);
send_wait(0, top_object(), "call_attr", zs_factory, "dob_attr_list", "type_info", "extended");
if (msg_error()) {
zs_msg = format("%s ERRO ao obter a lista de atributos OBRIGATORIOS da factory '%s': '%s'", zs_metodo, zs_factory, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
zi_i = 1;
string zs_attr_name, zs_attr_type, zs_attr_required, zs_attr_on_new;
while (zi_i < msg_length()) {
zs_attr_name = msg[zi_i];
zs_attr_type = msg[zi_i+1];
zs_attr_required = "";
zs_attr_on_new = "";
if (zs_attr_type == "VALUE") {
zs_attr_required = msg[zi_i+5];
zs_attr_on_new = msg[zi_i+9];
zi_i += 19;
} else if (zs_attr_type == "SREL") {
zs_attr_required = msg[zi_i+5];
zs_attr_on_new = msg[zi_i+10];
zi_i += 20;
} else if (zs_attr_type == "QREL") {
zi_i += 13;
} else if (zs_attr_type == "LREL") {
zi_i += 7;
}
if (zs_attr_required == "Required" && strlen(zs_attr_on_new) == 0) zs_factory_attributes += zs_attr_name + '; ';
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Lista de atributos OBRIGATORIOS da factory '%s': %s", zs_metodo, zs_factory, zs_factory_attributes);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_factory_attributes;
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Consultando factory '%s'...", zs_metodo, zs_factory);
send_wait(0, top_object(), "attr_type_info", zs_factory, "extended");
if (msg_error() || msg_length() < 15) {
zs_msg = format("%s ERRO ao consultar a factory '%s': %s", zs_metodo, zs_factory, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zs_info == "ALL") {
for (zi_i = 0; zi_i < msg_length(); zi_i++) {
zs_info_value += (string) msg[zi_i] + "@;@";
}
} else if (zs_info == "Producers") {
send_wait(0, top_object(), "call_attr", zs_factory, "attr_list");
int zi_count;
zi_count = msg[0];
for (zi_i = 0; zi_i < zi_count; zi_i++) {
zs_info_value += (string) msg[zi_i+1] + " ";
}
} else if (zs_info == "Rel Attr") {
zs_info_value = msg[3];
} else if (zs_info == "Common Name") {
zs_info_value = msg[4];
} else if (zs_info == "Func Group") {
zs_info_value = msg[5];
} else if (zs_info == "Display Name") {
zs_info_value = msg[6];
} else if (zs_info == "UI_INFO") {
zs_info_value = msg[7];
} else if (zs_info == "Display Group") {
zs_info_value = msg[9];
} else if (zs_info == "REST Operations") {
zs_info_value = msg[10];
} else if (zs_info == "Triggers") {
zs_info_value = msg[11];
} else if (zs_info == "Methods") {
zs_info_value = msg[12];
} else if (zs_info == "Schema Name") {
zs_info_value = msg[13];
} else if (zs_info == "DBMS Name") {
zs_info_value = msg[14];
} else if (zs_info == "Tenancy") {
zs_info_value = msg[16];
} else if (zs_info == "Base Object") {
zs_info_value = msg[17];
} else {
zs_msg = format("%s ERRO ao identificar a informacao da factory '%s'. O parametro '%s' NAO existe.", zs_metodo, zs_factory, zs_info);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s '%s' da factory '%s': '%s'", zs_metodo, zs_info, zs_factory, zs_info_value);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_info_value;
}
string z_notifica_contato(int zi_depurar, string zs_metodo, string zs_rcpt, int zi_evt_level, string zs_subject, string zs_body, string zs_persid, string zs_body_html)
{
string zs_msg;
int zi_i;
zs_metodo = 'z_notifica_contato - ';
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
logf(SIGNIFICANT, "%s '%s'", zs_metodo, zs_rcpt);
}
int zi_trans_pt;
if (sindex(zs_persid, "chg:") > -1 || sindex(zs_persid, "iss:") > -1) {
zi_trans_pt = 29;
} else if (sindex(zs_persid, "cr:") > -1 || sindex(zs_persid, "iss:") > -1) {
zi_trans_pt = 28;
} else {
zi_trans_pt = 0;
}
if (is_empty(zi_evt_level)) {
zi_evt_level = 2;
}
int zi_is_internal;
zi_is_internal = 0;
if (is_empty(zs_rcpt)) {
zs_msg = format("%s ERRO ao identificar contato. O destinatario NAO foi informado e esta VAZIO.", zs_metodo);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return;
} else if (sindex(zs_rcpt, ":") == -1) {
string zs_rcpt_persid;
zs_rcpt_persid = expand(format("&{%s = cnt.last_name->persistent_id}", zs_rcpt));
if (is_empty(zs_rcpt_persid)) {
zs_msg = format("%s ERRO ao identificar persistent_id do contato '%s'.", zs_metodo, zs_rcpt);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return;
}
zs_rcpt = zs_rcpt_persid;
} else {
zs_rcpt = zs_rcpt;
}
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Destinatarios: '%s'", zs_metodo, zs_rcpt);
if (zi_depurar >= 1) logf(SIGNIFICANT, "%s Enviando mensagem para os destinatarios '%s'...", zs_metodo, zs_rcpt);
send_wait(0, top_object(), "call_attr", "cnt", "notify_list", zs_rcpt, zi_evt_level, zs_subject, zs_body, "", zi_trans_pt, zs_persid, zi_is_internal, 0, zs_body_html);
if (msg_error()) {
zs_msg = format("%s ERRO ao enviar mensagem: %s", zs_metodo, msg[0]);
logf(ERROR, "%s", zs_msg);
z_bloco_fim(zi_depurar, zs_metodo);
return zs_msg;
}
z_bloco_fim(zi_depurar, zs_metodo);
}
string z_replace_doublebyte (string str, string zs_metodo, int zi_depurar)
{
int zi_i;
zs_metodo += " z_replace_doublebyte";
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
if (zi_depurar > 0) logf(SIGNIFICANT, "%s ENTRADA = '%s'", zs_metodo, str);
string n;
n = str;
n = gsub(n, '[\164-\191]', '?');
n = gsub(n, '[\192-\198]', 'A');
n = gsub(n, '[\199]', 'C');
n = gsub(n, '[\200-\203]', 'E');
n = gsub(n, '[\204-\207]', 'I');
n = gsub(n, '[\208]', 'D');
n = gsub(n, '[\209]', 'N');
n = gsub(n, '[\210-\214]', 'O');
n = gsub(n, '[\215]', 'x');
n = gsub(n, '[\216]', '0');
n = gsub(n, '[\217-\220]', 'U');
n = gsub(n, '[\221]', 'Y');
n = gsub(n, '[\222|\254]', 'p');
n = gsub(n, '[\223]', 'B');
n = gsub(n, '[\224-\230]', 'a');
n = gsub(n, '[\231]', 'c');
n = gsub(n, '[\232-\235]', 'e');
n = gsub(n, '[\236-\239]', 'i');
n = gsub(n, '[\241]', 'n');
n = gsub(n, '[\240|\242-\246]', 'o');
n = gsub(n, '[\247]', '/');
n = gsub(n, '[\248]', '0');
n = gsub(n, '[\249-\252]', 'u');
n = gsub(n, '[\253|\255]', 'y');
if (zi_depurar > 0) logf(SIGNIFICANT, "%s SAIDA = '%s'", zs_metodo, n);
return n;
}
string z_replace_doublebyte_utf8 (string str, string zs_metodo, int zi_depurar)
{
int zi_i;
zs_metodo += " z_replace_doublebyte_utf8";
if ( zi_depurar>=1 ) {
z_bloco_inicio(zi_depurar, zs_metodo);
logf(SIGNIFICANT, "%s Quant. de argumentos : %d", zs_metodo, argc);
for (zi_i=0; zi_i<argc; zi_i+=1) {
logf(SIGNIFICANT, "%s ARG #%s : %s", zs_metodo, zi_i, argv[zi_i]);
}
} else {
}
if (zi_depurar > 0) logf(SIGNIFICANT, "%s ENTRADA = '%s'", zs_metodo, str);
string n;
n = str;
n = gsub(n, '\194[\1-\255]', '?');
n = gsub(n, '\198[\1-\255]', '?');
n = gsub(n, '\195[\1-\127]', '?');
n = gsub(n, '\195[\128-\134]', 'A');
n = gsub(n, '\195[\135]', 'C');
n = gsub(n, '\195[\136-\139]', 'E');
n = gsub(n, '\195[\140-\143]', 'I');
n = gsub(n, '\195[\144]', 'D');
n = gsub(n, '\195[\145]', 'N');
n = gsub(n, '\195[\146-\150]', 'O');
n = gsub(n, '\195[\151]', 'X');
n = gsub(n, '\195[\152]', '0');
n = gsub(n, '\195[\153-\156]', 'U');
n = gsub(n, '\195[\157]', 'Y');
n = gsub(n, '\195[\158|\190]', 'p');
n = gsub(n, '\195[\159]', 'B');
n = gsub(n, '\195[\160-\166]', 'a');
n = gsub(n, '\195[\167]', 'c');
n = gsub(n, '\195[\168-\171]', 'e');
n = gsub(n, '\195[\172-\175]', 'i');
n = gsub(n, '\195[\177]', 'n');
n = gsub(n, '\195[\176|\178-\182]', 'o');
n = gsub(n, '\195[\183]', '/');
n = gsub(n, '\195[\184]', '0');
n = gsub(n, '\195[\185-\188]', 'u');
n = gsub(n, '\195[\189|\191]', 'y');
if (zi_depurar > 0) logf(SIGNIFICANT, "%s SAIDA = '%s'", zs_metodo, n);
return n;
}
int z_contain_doublebyte (string str) {
string zs_metodo;
int zi_depurar;
zi_depurar = 0;
zs_metodo = "z_contain_doublebyte";
if (zi_depurar > 0) logf(SIGNIFICANT, "%s %d", zs_metodo, sindex(str, '[\160-\255]') > -1 ? 1 : 0);
if (sindex(str, '[\160-\255]') > -1) {
return 1;
} else {
return 0;
}
}
int z_contain_doublebyte_utf8 (string str) {
string zs_metodo;
int zi_depurar;
zi_depurar = 0;
zs_metodo = "z_contain_doublebyte_utf8";
if (zi_depurar > 0) logf(SIGNIFICANT, "%s %d", zs_metodo, sindex(str, '\195[\1|\191]') > -1 ? 1 : 0);
if (sindex(str, '\195[\1|\191]') > -1) {
return 1;
} else {
return 0;
}
}
publish originally: Agosto 23 de 2016
From: CA SDM Brasil
criada Por: Daniel Bighelini
CA SDM Brasil Sumário - Índice