Escolar Documentos
Profissional Documentos
Cultura Documentos
Workflow
Principais benefícios:
Aumento da eficiência: automação de processos eliminam vários passos
desnecessários.
Melhor controle dos processos: melhora do gerenciamento dos processos
através da padronização dos métodos de trabalho.
Melhora nos serviços ao cliente: consistência nos processos leva a uma
maior previsibilidade e rapidez nos níveis de resposta ao cliente.
Flexibilidade: controle sobre os processos através de uma ferramenta
permite uma rápida mudança nos fluxos de acordo com a necessidade.
Fluxo operacional
2
3
Parâmetros
O Workflow faz uso de uma série de parâmetros que determinam a maneira como
ele se comportará perante alguns pontos estratégicos na execução dos fluxos de
processo. O acesso à janela de parâmetros está disponível na opção do menu do
configurador “Ambiente | Workflow | Parâmetros WF”
Correio
Opção Item Parâmetro Descrição
Conta Caixa de correio a ser
Caixa de utilizada pelo workflow para o
MV_WFMLBOX
correio envio e recebimento de
mensagens.
Envia figura do Recurso ainda não disponível.
html como anexo MV_WFIMAGE
da mensagem
Envia html no Selecionando esta opção, o
corpo da html passara a fazer parte do
MV_WFHTML
mensagem corpo da mensagem. O
Composição da
contrário, irá como anexo.
mensagem
Envio automático Após a criação do processo, o
MV_WFSNDAU workflow enviará a
mensagem imediatamente.
Usa Java Script No html, o Workflow
MV_WFJAVAS adicionará rotinas semi-
prontas em Java script.
4
Processos
Opção Item Parâmetro Descrição
Execução(ões) de Define a quantidade de
retorno(s) processos de retorno que
simultâneos de poderão ser executados por
processos. vez.
Esteja atento ao
número de licenças
Execução de disponíveis e à
MV_WFMAXJB
retornos capacidade de
processamento da
máquina. A
quantidade
influenciará na
performance do
servidor.
Reativar Caso esta opção seja
processos selecionada, ocorrerá erro na
automaticamente execução de retornos. O
Workflow reativará o
MV_WFREACT processo imediatamente para
ser executado de novo. Caso
Tratamento de contrário, será reativado
erros somente quando o
Scheduler for reiniciado.
Usar TRANSAÇAO Habilita o recurso de
na execução de transação com a finalidade de
funções de MV_WFTRANS conservar a integridade dos
“RETORNO” e dados em caso de falha de
“TIMEOUTs” execução.
5
Notificação
Opção Item Parâmetro Descrição
Endereço Endereço eletrônico do
administrador (es) do
sistema. Separe entre “;”
E-mail do (ponto-e-vírgula) caso deseje
MV_WFADMIN
administrador informar mais do que um
endereço. Exemplo:
Adm1@prov.com.br;
adm2@prov.com.br
Quando ocorrer Notificar por e-mail a lista de
erro ao executar endereços dos
funções MV_WFNF001 administradores sobre o erro
“Retorno” e ocorrido.
“Timeout”.
Ao reativar Notificar por e-mail a lista de
processos endereços dos
Enviar pendentes. administradores no momento
MV_WFNF002
notificação em que forem reativados os
processos que ocorreram
erro.
Ao receber Notificar por e-mail a lista de
mensagens não endereços dos
reconhecidas. MV_WFNF003 administradores sobre as
mensagens não reconhecidas
pelo Workflow.
6
Messenger
Opção Item Parâmetro Descrição
Caminho Arquivo executável do
MV_WFBROWS browser Internet que deverá
estar no path da estação.
Browser Servidor IP ou Nomed PIPE do
Internet servidor Protheus para uso
MV_WFBRWSR do serviço http. Adicione “:”
+ a porta, caso seja diferente
do padrão.
Caminho Diretório de trabalho do
serviço http. Verifique o
identificador “Path=” na
Diretório HTTP MV_WFDHTTP
seção “[HTTP]” do arquivo
mp8Srv.ini para obter o
diretório de trabalho.
Habilitar Messenger O messenger será executado
automaticamente. automaticamente no próximo
Habilitar MV_WFMESSE
(próximo logon) login de qualquer ambiente
Protheus.
7
Configuração
1. Requisitos
Software: o Workflow, que é uma ferramenta embutida dentro do Server
do Protheus, não necessita de instalação própria, apenas configurações.
Toda configuração se dá através do ambiente Configurador do Protheus.
Exemplo: workflow@suaempresa.com.br
8
2. Correio Eletrônico
2.1. Protocolo
O Workflow faz uso do recurso de envio e recebimento de mensagens
eletrônicas (e-mails). Para que esse procedimento seja possível,
devemos configurar que tipo de protocolo de recebimento o Protheus
deverá usar.
POP3
IMAP
Exemplo:
[Mail]
Protocol=IMAP
Folder=inbox
9
Após a realização do cadastro de uma conta de e-mail, é possível realizar
algumas operações extras como:
10
2.3. Cadastrar a conta de e-mail do Workflow
Para cada empresa do Protheus, deverá existir uma conta exclusiva para uso
do Workflow.
A seguir, veremos quais campos necessários deverão fazer parte do
preenchimento do cadastro.
Caixa de Correio
Opção Item Descrição
Correio Nome da caixa de correio. Esse
nome será usado para criar a pasta,
em que serão identificadas as
mensagens pertinentes a cada conta.
Correio Tempo Espera Tempo máximo (em segundos) de
espera para conexão com o servidor
de e-mails, tanto no envio como
recebimento de mensagens. O
tempo padrão é 60 segundos.
Nome Nome do remetente da mensagem.
Remetente
Endereço Endereço eletrônico.
11
Receber mensagens
Opção Item Descrição
Nome IP ou Named Pipe do servidor. Será
exibido conforme o tipo utilizado na
Servidor (POP3 seção “[Mail]” no arquivo
ou IMAP) mp8srv.ini
Porta Porta de acesso dependendo do tipo.
POP3 = 110; IMAP = 143 (defaults).
Conta Nome da conta.
Login
Senha Senha de acesso à conta.
12
Enviar mensagens
Opção Item Descrição
Nome
IP ou Named Pipe do servidor SMTP.
Servidor SMTP
Porta
Porta de acesso. Valor padrão: 25.
Usuário Nome do usuário para autenticação.
Alguns servidores exigem esta
Autenticação
informação para envio de e-mails.
Senha Senha de acesso para autenticação.
13
Conexão
Opção Item Descrição
LAN Utiliza a conexão já estabelecida pelo
usuário em uma intranet.
Tipo DIAL-Up Utiliza o recurso de discagem através
de uma linha telefônica (não
recomendável). Somente funciona
em estações e servidores Windows.
*Conexões Lista de conexões disponíveis do tipo
Dial-up, obtidas a partir do cadastro
de conexões dial-up criado
previamente no Microsoft Windows.
Conta Nome da conta (usuário) de acesso
Discagem ao provedor internet.
Senha Senha de acesso à conta no
provedor.
Telefone Número da linha de acesso ao
provedor internet.
14
Estrutura de diretório de mensagens
A partir da versão 8.11, a estrutura de diretórios de armazenamento de mensagens
mudou. A pasta “Workflow” passou a ser o “Root” por questões de organização
de acesso aos respectivos arquivos de controle e mensagens a cada empresa.
Estrutura de diretórios
Pastas Descrição
Pasta principal da estrutura de diretórios do
Workflow. Esta pasta é útil para armazenar os html
e arquivos comuns entre as empresas.
Pasta individual de trabalho para cada empresa.
15
Temp Diretório temporário de trabalho.
A partir da pasta Mail, serão criadas todas as caixas
de correio existentes no cadastro de contas de
correio do Workflow.
Esta pasta foi criada exclusivamente
para uso da caixa de correio do
Workflow. Todas as mensagens que
Archive não sejam relacionadas aos processos
de Workflow, serão armazenadas
nesta pasta.
Ex: Spam.
Esta pasta foi criada exclusivamente
para uso da caixa de correio do
Workflow. As mensagens recebidas e
Ignored
já identificadas anteriormente serão
armazenadas nessa pasta (mensagens
recebidas em duplicidade)
Esta é uma pasta comum entre as
caixas de correio existentes. Ela é
Inbox
responsável pelo armazenamento de
mensagens recebidas.
Esta é uma pasta comum entre as
caixas de correio existentes, sendo
responsável pelo armazenamento de
Outbox mensagens que deverão ser enviadas.
Caso ocorra erro durante o envio das
mensagens, elas serão armazenadas
na sub-pasta “Erro”.
Esta é uma pasta comum entre as
caixas de correio existentes, sendo
Sent
responsável pelo armazenamento das
mensagens enviadas.
16
3. Scheduler
3.1. Ativação
[ONSTART]
Jobs=Scheduler
[Scheduler]
Main=WFONSTART
Environment=EnvTOP
1. 99 – código da empresa.
2. 01 – código da filial.
3. ENVTOP – ambiente no qual será executado o Scheduler.
4. T – Valor lógico (True ou False). True, Indicará que realizará
reativação dos processos nas tabelas do Workflow.
5. MOD – Nome do ambiente do qual o Workflow obterá licenças.
17
Exemplo:
[Scheduler]
Main=WFOnStart
Environment=ENVTOP
nParams=5
Parm1=99
Parm2=01
Parm3=ENVTOP
Parm4=T
Parm5=TMK
3.2. Agendando
18
Janela de cadastro de jobs
19
Scheduler – Processos Especiais
Agrupamento Campos Descrição
Código Código único identificador do job.
Identificação Nome Nome simplificado.
Descrição Descrição do job.
Diária Executa diariamente entre os horários inicial e
final a cada intervalo de tempo.
Semanal Executa nos dias selecionados da semana
(domingo, segunda, terça, quarta, quinta, sexta
Freqüência e sábado), entre os horários inicial e final a cada
intervalo de tempo.
Mensal Executa nos meses selecionados do ano (janeiro
a dezembro), entre os horários inicial e final a
cada intervalo de tempo.
Data Início Data inicial que passará a vigorar a execução.
Período Inicial
Hora Início Horário inicial de execução.
Data final Dia limite de execução.
Período Final
Hora final Horário limite de execução.
Intervalo Intervalo de tempo a cada execução entre o
Período
horário inicial e final.
Ação Função de usuário ou função interna do Protheus
a ser executado. Os parâmetros passados para
Job
esta função deverão ser sempre tratados como
um array.
Environment Ambiente Ambiente em que o job será executado.
Exemplo:
20
3.4. Agendar envio de mensagens do Workflow
Exemplo:
21
Requisitos para Desenvolvimento
Cadastros
1. Processos Workflow
Cotação de preços.
Liberação de crédito.
22
23
Cadastro de Processos
Agrupamento Campos Descrição
Código Código único identificador.
Codificação
Nome Nome do processo.
Tabelas Especificações das tabelas utilizadas para
Informativo
execução do processo.
Pesquisa Pesquisa Código da pesquisa padrão utilizada para
genérica Padrão localizar um determinado processo.
Arquivo .vsd Arquivo visio document (fluxo do processo
Visio
desenhado a partir do Microsoft Visio).
2. Status Workflow
24
25
Cadastro de Status
Agrupamento Campos Descrição
Cód
Código do processo.
Processo
Cód Status Código do status de processo. Esse código deve
Codificação ser um valor numérico acima de 999. A faixa de
valores entre 0 e 999 está reservada ao
Workflow.
Descrição Descrição do Status do processo.
Tempo Tempo médio de execução deste status. Este
Informativo
médio tempo é calculado pelo sistema.
26
3. E-mails substitutos
27
Cadastro de e-mails substitutos
Agrupamento Campos Descrição
Do e-mail Endereço eletrônico do participante que
Endereço permanecerá ausente por um período de tempo.
eletrônico Para o e- Endereço eletrônico do participante que ficará
mail responsável por receber as mensagens.
Data início Data inicial em que passará a vigorar a
substituição dos e-mails.
Período
Data final Data final do período.
Dias Cálculo de dias entre a data inicial e final.
28
Html – Modelo Workflow
O Workflow faz uso de formulários html para realizar interações entre o(s)
participante(s) e o sistema ERP. Além de informá-los, é possível responder
determinadas requisições através do recurso “Post message” oferecido pelos
navegadores internet. Os formulários desenhados e utilizados para interagir com os
participantes, são denominados modelos (templates) e deverão estar disponíveis
em algum diretório abaixo do rootpath do Protheus. Ao ser utilizado algum desses
modelos nos processos de Workflow, apenas a cópia do modelo será modificado. É
necessário bons conhecimentos de programação HTML e Java Script para a
construção de páginas no Workflow.
1. Post message
O recurso “Post message”, nas páginas html a partir dos navegadores internet,
permite que as respostas sejam enviadas ao Workflow via correio eletrônico (e-
mail) ou serviço http. Para que isso seja possível é necessário incluir o tag
<form action=”mailto:%WFMailTo%” method=”post”> nos formulários
html.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Aprovação de Pedido de Compra</title>
</head>
<body bgcolor="#FFFFFF">
<form action="mailto:%WFMailTo%" method="POST" name ="FormPedComp">
...
</form>
</body>
</html>
29
2. Macro substituição
Exemplo:
É importante saber que o uso desse símbolo é necessário somente para campos
editáveis que esperam modificações de seus conteúdos e que serão tratados no
retorno das mensagens. Use este símbolo nos controles do tipo TextField,
TextArea, Radio Button, Combo Box e Check Box.
TextField:
<input type="text" size="13" name="T7" value=%quantidade%>
TextArea:
30
<textarea name="S1" rows="4" cols="74">%observacao%</textarea>
Radio Button:
<input type="radio" checked name="%aprovacao%" value="Sim">Sim.
<br>
<input type="radio" name="%aprovacao%" value="Nao">Não.
Combo Box:
<select name="list" size="1"><option selected>%itens%</option>
</select>
Check Box:
<input type="checkbox" name="checkbox" value="%item1%">Item 1
!macro! – Toda palavra encontrada entre este sinal (!) terá somente seu
conteúdo substituído. Não será incluído <input hidden...> no html para essas
palavras-chaves. Utilize-o em texto fixo.
3. Tabelas
31
Criando um processo em ADVPL - Funções
Para ser iniciado o processo em qualquer das opções escolhidas, será necessário
fazer uso do código fonte Advpl para determinar a forma como irá proceder a
execução do fluxo do processo.
Classe TWFProcess
Métodos
:New(<cCodProc>,<cDescr>,<cProcID>)
O método New() é responsável pela criação e inicialização da classe WFProcess.
Parâmetros:
1. cCodProc: este parâmetro recebe o código do processo usado em “Cadastro
de Processos”.
2. cDescr: este parâmetro recebe a descrição do processo que está sendo
criado no momento. Se não for informado, será usada a descrição contida no
cadastro de processo, localizada através do parâmetro anterior cCodProc.
3. cProcID: este parâmetro recebe o ID do processo criado anteriormente.
Normalmente, é utilizado para reconstruir um processo anterior, dando
seqüência a ele.
Exemplo:
oP := TWFProcess():New("PEDCOM","Aprovacao do Pedido de Compras")
32
:NewTask(<cDescr>,<cArqHtml>,<lCopiar>)
Este método é responsável por criar a seqüência de tarefas a serem executadas
e identificar qual html será utilizado pelo processo.
Parâmetros:
1. cDescr: este parâmetro recebe a descrição da tarefa.
2. cArqHtml: recebe o caminho e o nome do arquivo html que fará uso no
processo.
3. lCopiar: este parâmetro, do tipo lógico, é responsável por copiar todos os
campos utilizados em uma tarefa anterior, ou seja, para a tarefa que está
sendo criada no momento.
Exemplo:
oP:NewTask("Criando Aprovacao", "\Workflow\WFW120p.htm" )
:AttachFile(<cArquivo>)
Este método é responsável pela inclusão de arquivos anexos à mensagem.
Esses arquivos deverão estar abaixo do root path do Protheus.
Parâmetros:
1. cArquivo: caminho e nome do arquivo a ser anexo à mensagem.
Exemplo:
oP:AttachFile(“\Workflow\teste.txt”)
:Finish()
Este método é responsável por finalizar o processo. Após a finalização, ele não
estará mais disponível para execuções do tipo retorno e timeout.
Exemplo:
oP:Finish()
:Track(<cCodStatus>,<cDescr>,<cUsuario>)
Este método é responsável por incluir as descrições dos passos seguidos pelo
fluxo do processo e apresentá-los na consulta da rastreabilidade.
33
Parâmetros:
1. cCodStatus: código do status do processo.
2. cDescr: descrição do passo ocorrido.
3. cUsuario: nome do usuário a que se destinou a tarefa.
Exemplo:
oP:Track(“100200”, “Enviando o pedido para aprovacao”, “AprovadorA”)
Propriedades
:cTo, :cCC e :cBCC
Estas propriedades definem o endereço dos destinatários. Poderá ser informado
mais que um destinatário ao mesmo tempo. Basta incluir um ponto-e-vírgula “;”
entre eles. Se for informada uma palavra qualquer que não seja um endereço
de e-mail válido, o Workflow irá considerar que se trata de um diretório em que
o html gerado deverá ser gravado. Pode-se mesclar os tipos.
Exemplo:
oP:cTo := “aluno1@microsiga.com.br;aluno2@microsiga.com.br”
oP:cCC := “aluno3@microsiga.com.br;Aluno”
oP:cBCC := “aluno4@microsiga.com.br”
:cSubject
Esta propriedade define o assunto da mensagem.
Exemplo:
oP:cSubject := “Aprovado do pedido de compras no. 1028”
:cBody
Esta propriedade armazenará um texto que permanecerá no corpo da
mensagem. Caso seja utilizado, o html irá como anexo da mensagem.
Exemplo:
oP:cBody := “Testando...”
:bReturn
Esta propriedade contém o nome da função que será executada no momento
em que o Workflow receber a mensagem de resposta de um dos destinatários
via e-mail ou serviço http.
Exemplo:
oP:bReturn := “U_Retorno”
:bTimeOut
Esta propriedade recebe um array de timeouts contendo nomes das funções e
tempo de espera. Caso o tempo seja alcançado, serão executadas as funções
mencionadas no 1º item do array. Poderão ser especificados mais do que um
array de timeouts.
34
Exemplo:
oP:bTimeOut := { { “TimeOut1”, 0, 5, 30 } }
ou
oP:bTimeOut := { { “TimeOut1”, 0, 5, 30 }, { “TimeOut2”, 1, 10, 0 } }
:fProcessID
Esta propriedade fornece o número ID do processo.
Exemplo:
cProcID := oP:fProcessID
:fTaskID
Esta propriedade fornece o número ID da tarefa criada para um determinado
processo, através do método :NewTask().
Exemplo:
oP:NewTask( "100100", "\Workflow\WFW120p.htm" )
cTaskID := oP:fTaskID
:oHTML
Esta propriedade é responsável pelo tratamento das palavras-chaves no html
mencionado no método :NewTask(). Esse objeto é uma referência da classe
TWFHtml() e disponibiliza dois dos métodos mais importantes :RetByName() e
ValByName().
Exemplo:
cNome := oP:oHtml:RetByName( “Nome” )
Em uma tabela:
aCodigo := oP:oHtml:RetByName( “produto.Codigo” )
:oHTML:ValByName(<cMacro>,<uConteudo>)
Este método tem como objetivo atribuir ou obter um valor a uma “macro”
existente no html. Deverá ser usado somente no momento em que estiver
assinalando valores ao html ou na função de timeouts, em que o uso é
necessário por motivo de não haver recebido resposta.
Parâmetros:
1. cMacro: nome da macro (palavra-chave) encontrada no html e identificada
entre os símbolos “%” e “!”.
35
2. uConteudo: valor a ser atribuído à macro.
Exemplo:
Assinalando um valor:
oP:oHtml:ValByName( “Nome”, “Aluno1” )
36
Case – Atualização do preço de venda de produto
Crie um novo campo “B1_WFID” no SB1 para que possa ser gravado o ID do
processo de Workflow e ser utilizado em consultas na janela de rastreabilidade.
Crie uma pesquisa SXB com o nome “WFSB1” que faça referência à tabela SB1 e
retorne o conteúdo do campo B1_WFID.
37
PASSO 5 – Criar html modelo para o processo
Código fonte:
38
<td width="30%"><em><strong>
<input name="pvenda" type="math" id="pvenda"
value="%B1_PRV1%"></strong></em></td>
</tr>
</table><p>
<input type="submit" name="Submit" value="Enviar"></p>
</form>
</body>
</html>
ATUAPV.PRW
#INCLUDE “PROTHEUS.CH”
/*
// MT010INC - Corresponde ao ponto de entrada do sistema que somente
// será executado na inclusão de novos produtos.
*/
User Function MT010INC(nOpcao,oProcess)
do case
case nOpcao == 0
U_APVInicio()
case nOpcao == 1
U_APVRetorno(oProcess)
case nOpcao == 2
U_APVTimeOut(oProcess)
endcase
Return
/*
// APVInicio - Esta função é responsável por iniciar a criação do processo e por
// enviar a mensagem para o destinatário.
*/
User Function APVInicio(oProcess)
Local nDias := 0, nHoras := 0, nMinutos := 10
Local cCodProcesso, cCodStatus, cHtmlModelo
Local cUsuarioProtheus, cCodProduto, cTexto, cAssunto
cCodProduto := SB1->B1_COD
39
// Arquivo html template utilizado para montagem da aprovação
cHtmlModelo := "\Workflow\atuapv.htm"
// Assunto da mensagem
cAssunto := "Atualização do preço de venda"
40
// Informe o nome da função do tipo timeout que será executada se houver um
timeout
// ocorrido para esse processo. Neste exemplo, ela será executada cinco minutos
após o envio
// do e-mail para o destinatário. Caso queira-se aumentar ou diminuir o tempo,
altere
// os valores das variáveis: nDias, nHoras e nMinutos.
oProcess:bTimeOut := {"U_MT010INC(2)", nDias, nHoras, nMinutos}
/*
// APVRetorno - Esta função é executada no retorno da mensagem enviada
// pelo destinatário. O Workflow recria o processo em que
// parou anteriormente na função APVInicio e repassa a
// variável objeto oProcess por parâmetro.
*/
User Function APVRetorno(oProcess)
Local nPrecoVenda
Local cCodProduto, cCodStatus, cTexto
dbSelectArea("SB1")
SB1->(dbSetOrder(1))
41
If RecLock( "SB1", .f. )
SB1->B1_PRV1 := nPrecoVenda
MsUnLock()
EndIf
Else
// Adicione as informacões a serem incluídas na rastreabilidade.
cTexto := "Não foi possível encontrar o produto: " + cCodProduto
cCodStatus := "100900"
oProcess:Track(cCodStatus, cTexto, oProcess:cRetFrom)
EndIf
/*
// APTimeOut - Esta função será executada a partir do Scheduler no tempo
// estipulado pela propriedade :bTimeout da classe TWFProcess.
// Caso o processo tenha sido respondido em tempo hábil, essa
// execução será descartada automaticamente.
*/
User Function APTimeOut(oProcess)
Local nDias := 0, nHoras := 0, nMinutos := 10
Local cCodStatus, cHtmlModelo
Local cCodProduto, cTexto, cTitulo
cHtmlModelo := "\Workflow\atuapv.htm"
cTitulo := "Atualização do preço de venda"
dbSelectArea("SB1")
SB1->(dbSetOrder(1))
42
// Crie uma nova tarefa, aproveitando o conteúdo do html preenchido
anteriormente
// com o uso do terceiro parâmetro com o valor lógico igual a .T. (verdadeiro)
oProcess:NewTask(cTitulo, cHtmlModelo, .T.)
oProcess:cTo := "bi@microsiga.com.br"
// Inicie o processo
oProcess:Start()
Else
// Adicione as informacões a serem incluídas na rastreabilidade.
cTexto := "Não foi possível encontrar o produto: " + cCodProduto
cCodStatus := "100900" // Código do cadastro de status de processo
oProcess:Track(cCodStatus, cTexto) // Rastreabilidade
EndIf
Return
43
Ao receber o e-mail no cliente de e-mail, coloque o valor no campo ‘Preço de Venda
R$’ e clique em Enviar.
44
PASSO 8 – Consultas (Rastreabilidade de processo)
45
PASSO 9 – Consultas (Processo por usuários)
Se o usuário atual for administrador, ele poderá ver as pendências geradas para
qualquer outro usuário cadastrado no sistema. Caso contrário, somente visualizará
as pendências relacionadas a ele próprio.
46
Integração com o Microsoft Visio
Versão homologada: Microsoft Office Visio 2003
Caso queira-se incluir qualquer outro shape que não faça parte do stencil Workflow,
não há problemas. Só não será possível interagir com o evento duplo click do
mouse para executar uma função de usuário.
47
Após criar o arquivo .vsd (visio document) relacionado ao processo, especifique-o
no cadastro de processo no campo “Arquivo .vsd:”.
48
O botão “Visio template”, localizado no browser de cadastro de processos, é
responsável por cadastrar as propriedades dos shapes na tabela WFCxxx (em que
xxx refere-se ao código da empresa) do banco de dados no Protheus. Esse cadastro
faz- se necessário para identificar e nomear cada um dos shapes contido no fluxo.
Os nomes associados aos shapes serão identificados nas linhas de programas
através do método :Track(...) pertencente a classe TWFProcess().
Exemplo:
cCodigoStatus := “100400”
cEmail := “aprovador@dominio.com.br”
cDescricao := “Aprovação enviado para: “ + cEmail
cNomeUsuario := Subs(cUsuario,7,15)
cVisioShape := “ENVIAR_SOLICITACAO”
oProcess:Track( cCodigoStatus, cDescricao, cNomeUsuario, cVisioShape )
oProcess:cTo := cEmail
oProcess:Start()
Return nil
49
Após pressionar o botão “Visio template”, o Microsoft Visio abrirá o arquivo .vsd
relacionado ao processo e bastará pressionar duas vezes o botão do mouse (doublé
click) sobre cada shape para que a janela de cadastro de propriedades seja exibida.
50
Templates - Propriedades dos Shapes
Campo Descrição
Dependênci Causa uma
a dependência
de execução
desse shape
em relação ao
selecionado.
Neste caso, só
poderá ser
executado se o
selecionado
estiver sido
executado
anteriormente.
Ação Função de
usuário a ser
executado,
caso seja
pressionado
duas vezes o
botão do
mouse (doublé
ckick).
Cada shape contido no stencil Workflow é responsável por um tipo de evento (ação)
a ser executado no Protheus. Alguns shapes possuem janelas padrões de diálogo
após serem selecionados com o duplo clique do mouse durante a apresentação do
fluxo de processo. Essas janelas só aparecerão nos casos em que não for informada
a função de usuário ao shape selecionado.
Observe os tipos de janelas padrões existentes:
Propriedades
Shape Janela de diálogo Descrição
Realiza uma
nova pesquisa
de processo.
51
Apresenta a
data e a hora
em que foi
enviada a
mensagem ao
destinatário e
a data e a
hora em que o
Workflow
recebeu a
resposta.
Apresenta
todos os
timeouts
relacionados
ao processo e
informa a
situação atual
de cada um
deles,
permitindo
alterar o
tempo de
execução,
bem como
remover da
lista de
execução.
Possibilita a
finalização do
processo
atual.
52
Se o aplicativo Microsoft Visio for localizado no sistema operacional do usuário, o
botão “Visio” será exibido na janela de rastreabilidade.
53
Realizando uma nova pesquisa ...
54
Verificando o destinatário...
55
A partir do ponto de entrada (“WFW120P”), contido no cadastro de pedido de
compras no ambiente de compras, criaremos um processo de Workflow e usaremos
o método Track() da classe TWFProcesso com o uso dos shapes.
Crie um novo campo C7_WFID do tipo caracter e tamanho igual a 7 na tabela SC7
para usarmos em futuras pesquisas que possam nos trazer o código do processo
relacionado ao pedido na janela de rastreabilidade.
Crie uma nova pesquisa no SXB com o nome “WFSC7” que faça referência à tabela
SC7 e retorne o conteúdo do campo C7_WFID.
Modelo exemplo:
56
A partir do botão “Visio Template” no browser do cadastro de processos,
cadastre todos os shapes relacionados ao fluxo de processo.
INICIO
INCLUSAO
ENVIAR
APROVADOR_A
TIMEOUT
57
TIMEOUTS
REENVIO
APROVADOR_B
RECEBE
APROVADO?
APROVA
NOTIFICACAO
SOLICITANTE
TERMINO
Campo Conteudo
Código PEDCOM
Descrição APROVACAO DE PEDIDO DE COMPRAS
Pesq Padrão WFSC7 - PEDIDO DE COMPRAS
Arquivo .vsd C:\MP8\AP_DATA\WORKFLOW\PEDCOMPRAS.VSD
58
PASSO 6 – Cadastro de Status
59
Código fonte:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Aprovação de Pedido de Compra</title>
</head>
<body bgcolor="#FFFFFF">
<script language="JavaScript">
function ValidaObs(AForm)
{
if ((AForm.RBAPROVA[1].checked) && (AForm.LBMOTIVO.value == "Aa"))
{
alert("Campo Observação é obrigatório, favor informar o motivo da reprovação.");
}
else
{
AForm.submit();
alert("Sua mensagem foi enviada.");
}
}
</script><noscript>
60
</table><p><font color="#0000FF"
face="Verdana"><b>Itens</b></font></p>
<table border="1" width="846">
<tr>
<td width="65" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Item</b></font></td>
<td width="222" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Descrição</b></font></td>
<td width="99" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Quantidade</b></font></td>
<td width="32" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Unid</b></font></td>
<td width="99" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Preço</b></font></td>
<td width="43" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>total</b></font></td>
<td width="48" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Entrega</b></font></td>
<td bgcolor="#01C5FE"><strong>Condição de Pag.</strong></td>
</tr>
<tr>
<td width="50"><font size="2" face="Arial">!produto.item!</font></td>
<td width="222"><font size="2" face="Arial">!produto.codigo! - !
produto.descricao!</font></td>
<td width="99"><font size="2" face="Arial"><input
type="text" size="13" name="T7"
value=%produto.quant%></font></td>
61
<td width="155" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Total + IPI</b></font></td>
<td width="121"><input type="text" size="13"
name="T16" value=%lbtotal%></td>
</tr>
</table>
<h4><font color="#0000FF"
face="Verdana"><strong>APROVAÇÃO:</strong></font></h4>
<p><input type="radio" checked name="%RBAPROVA%" value="Sim">
Sim.<br>
<input type="radio" name="%RBAPROVA%" value="Nao">
Não. (Favor especificar motivo)<br>
<h4><font size="2" face="Arial">Motivo: <textarea name="S1"
rows="4" cols="74">%lbmotivo%</textarea></font><br>
</h4>
<p><input type="button" name="B1" value="Enviar"
onclick="ValidaObs(FrontPage_Form1)"> <input type="reset"
name="B2" value="Limpar"> </p>
</form>
</body>
</html>
62
Código fonte:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Aprovação de Pedido de Compra</title>
</head>
<body bgcolor="#FFFFFF">
63
<td bgcolor="#01C5FE"><strong>Condição de Pag.</strong></td>
</tr>
<tr>
<td width="50"><font size="2"
face="Arial">%produto.item%</font></td>
<td width="222"><font size="2" face="Arial">%produto.codigo%
- %produto.descricao%</font></td>
<td width="99"><font size="2" face="Arial"><input
type="text" size="13" name="T7"
value=%produto.quant%></font></td>
<td width="32"><font size="2"
face="Arial">%produto.unid%</font></td>
<td width="99"><font size="2" face="Arial"><input
type="text" size="13" name="T9"
value=%produto.preco%></font></td>
<td width="43"><font size="2" face="Arial"><input
type="text" size="5" name="T10"
value=%produto.total%></font></td>
<td width="48"><font size="2" face="Arial"><input
type="text" size="5" name="T11"
value=%produto.entrega%></font></td>
<td><select name="D1" size="1">
<option selected>%produto.condpag%</option>
</select></td>
</tr>
</table>
<table border="1" width="275">
<tr>
<td width="155" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Valor Total</b></font></td>
<td width="121"><input type="text" size="13"
name="T15" value=%lbvalor%></td>
</tr>
<tr>
<td width="155" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Valor Frete</b></font></td>
<td width="121"><input type="text" size="13"
name="T16" value=%lbfrete%></td>
</tr>
<tr>
<td width="155" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Total + IPI</b></font></td>
<td width="121"><input type="text" size="13"
name="T16" value=%lbtotal%></td>
</tr>
</table>
</form>
</body>
</html>
64
Passo 8 – Criar um processo de Workflow a partir do ponto de entrada
WFW120p.PRW
#INCLUDE “PROTHEUS.CH”
/*
// WFW120P – Ponto de entrada do sistema do pedido de compras que será
// executado tanto na inclusão como alteração do pedido de compras
// a partir do botão “OK”.
*/
User Function WFW120p()
U_APCIniciar()
Return
/*
// APCIniciar – Esta função é responsável por iniciar a criação do processo e o
// envio da mensagem para o destinatário.
*/
User Function APCIniciar()
Local oProcess, oHtml
Local cNumPed, cDestinatario, cShape, cArqHtml, cAssunto, cUsrCorrente
Local cCodigoStatus, cDescricao, cValor
Local aCond := {}
Local nTotal := 0, nDias := 0, nHoras := 0, nMinutos := 10
65
cDescricao := "Iniciando processo..."
dbSelectArea(”SA2”)
dbSetOrder(1)
dbSeek(xFilial(“SA2”) + SC7->C7_FORNECE)
oHtml:ValByName( "lb_nome", SA2->A2_NOME )
oHtml:ValByName( "lb_cond", SC7->C7_COND )
If dbSeek(xFilial(“SE4”))
While !Eof() .and. xFilial(“SE4”) == SE4->E4_FILIAL
AAdd(aCond, "'" + SE4->E4_DESCRI + "'" )
dbSkip()
end
end
dbSelectArea(“SB1”)
dbSetOrder(1)
dbSelectArea(“SC7”)
oHtml:ValByName( "PEDIDO", SC7->C7_NUM )
cNum := SC7->C7_NUM
dbSetOrder(1)
dbSeek(xFilial(“SC7”) + cNum )
66
// Preencha a tabela do html chamada “produto.” com seus respectivos campos.
While !Eof() .and. ( C7_NUM == cNum )
SB1->( dbSeek( xFilial(“SB1”) + SC7->C7_PRODUTO ) )
nTotal := nTotal + C7_TOTAL
AAdd( ( oHtml:ValByName( "produto.item" )),C7_ITEM )
AAdd( ( oHtml:ValByName( "produto.codigo" )),C7_PRODUTO )
AAdd( ( oHtml:ValByName( "produto.descricao" )),SB1->B1_DESC )
cValor := Transform( C7_QUANT,'@E 99,999.99' )
AAdd( ( oHtml:ValByName( "produto.quant" )), cValor)
cValor := Transform( C7_PRECO,'@E 99,999.99' )
AAdd( ( oHtml:ValByName( "produto.preco" )), cValor)
cValor := Transform( C7_TOTAL,'@E 99,999.99' )
AAdd( ( oHtml:ValByName( "produto.total" )), cValor)
AAdd( ( oHtml:ValByName( "produto.unid" )),SB1->B1_UM )
AAdd( ( oHtml:ValByName( "produto.entrega" )), '0' )
AAdd( ( oHtml:ValByName( "produto.condPag" )),aCond )
dbSkip()
Enddo
// Neste ponto, o processo será criado e será enviada uma mensagem para a lista
// de destinatários.
oProcess:Start()
Return
67
/*
// APCRetorno – Esta função é responsável por atualizar o pedido de compras
// com as respostas vindas do aprovador.
*/
User Function APCRetorno(oProcess)
Local cFindKey, cAssunto, cNumPed, cShape, cCodigoStatus, cDescricao
// Dessa vez, não informe nenhum shape associado à reprovação por não
// haver nenhum shape relacionado à reprovação.
oProcess:Track( cCodigoStatus, cDescricao )
// Libere o pedido:
dbSelectArea("SCR")
dbSetOrder(2)
cFindKey := xFilial("SCR") + "PC" + cNumPed
If dbSeek( cFindKey )
RecLock("SCR",.f.)
SCR->CR_DATALIB := dDataBase
SCR->CR_OBS := ""
68
SCR->CR_STATUS := "03"
MsUnLock()
end
dbselectarea("SC7")
dbSetOrder(1)
cFindKey := xFilial("SC7") + cNumPed
dbSeek( cFindKey ) // Posiciona o Pedido
cShape := “APROVA”
cCodigoStatus := “100500”
cDescricao := cAssunto + “ – APROVADO”
oProcess:Track( cCodigoStatus, cDescricao,,cShape )
// Execute a função responsável pela notificação ao usuário solicitante.
U_APCNotificar( oProcess, cDescricao)
Return
/*
// APCNotificar – Essa função é responsável por notificar ao solicitante o
// resultado da aprovação do pedido.
*/
User Function APCNotificar( oProcess, cDescricao )
Local oHtml
Local aValues := Array(17)
Local cNumPed, cShape, cCodigoStatus, cArqHtml
// Devido os htmls serem diferentes, não será possível usar o terceiro parâmetro
// com o valor .T. no método NewTask() da classe TWFProcess(). Neste caso,
// deve-se obter todas as informações necessárias para montar o novo html
// para notificação ao solicitante.
oHtml := oProcess:oHtml
aValues[01] := oHtml:ValByName("EMISSAO")
aValues[02] := oHtml:ValByName("FORNECEDOR")
aValues[03] := oHtml:ValByName("lb_nome")
aValues[04] := oHtml:ValByName("lb_cond")
aValues[05] := oHtml:ValByName("PEDIDO")
aValues[06] := oHtml:ValByName("Produto.item")
aValues[07] := oHtml:ValByName("Produto.codigo")
aValues[08] := oHtml:ValByName("Produto.descricao")
aValues[09] := oHtml:ValByName("Produto.quant")
69
aValues[10] := oHtml:ValByName("Produto.preco")
aValues[11] := oHtml:ValByName("Produto.total")
aValues[12] := oHtml:ValByName("Produto.unid")
aValues[13] := oHtml:ValByName("Produto.entrega")
aValues[14] := oHtml:ValByName("Produto.condPag")
aValues[15] := oHtml:ValByName("lbValor")
aValues[16] := oHtml:ValByName("lbFrete")
aValues[17] := oHtml:ValByName("lbTotal")
// Como não houve informações geradas para essa tarefa nos campos bReturn
// e bTimeout, esse processo será finalizado automaticamente. De qualquer
// forma, informe, na rastreabilidades sobre esse passo alcançado no fluxo.
cShape := “TERMINO”
cCodigoStatus := “101000”
cDescricao := "Termino do processo"
oProcess:Track( cCodigoStatus, cDescricao,, cShape )
Return
/*
// APCTimeout – Esta função é responsável pela execução do timeout
// do processo.
*/
User Function APCTimeOut( nVezes, oProcess )
Local nDias := 0, nHoras := 0, nMinutos := 10
70
Local cNumPed, cShape, cCodigoStatus, cDescricao, cArqHtml
// Informe o html:
cArqHtml := "\Workflow\wfw120p1.htm"
// Verifique o número de vezes que o timeout foi executado para este processo.
If ( nVezes == 1 )
// Desta vez, informe ao timeout que ser for executado, será pela segunda vez.
oProcess:bTimeOut := {{"U_APCTimeout(2)", nDias, nHoras, nMinutos }}
Return
71
PASSO 9 – Compilar e executar o módulo de compras
72
processo gerado para o produto escolhido. Observe que todos os textos que
incluímos através do método oprocess:track(...) serão vistos nesta janela.
73
PASSO 11 – Consultas (Processo por usuários)
Se o usuário atual for administrador, ele poderá ver as pendências geradas para
qualquer outro usuário cadastrado no sistema. Caso contrário, somente poderá ver
as pendências relacionadas a ele mesmo.
74
Glossário
75
Autenticação SMTP: validação de usuário e senha no servidor de e-mail
para envio de mensagens.
76
Workflow: automação do fluxo de processo.
77