Вы находитесь на странице: 1из 78

Workflow

Workflow

A automao de processos de negcio corresponde, em partes ou totalmente, s


informaes, documentos ou tarefas que so passadas de uma pessoa outra para
a realizao de uma ao que baseada em um conjunto de regras.
Atravs da implantao de uma ferramenta de Workflow nos processos crticos de
uma organizao, estes tornam-se mais geis e seguros, evitando o travamento
operacional do complexo fluxo existente entre os processos.
Principais benefcios:

Aumento da eficincia: automao de processos eliminam vrios passos


desnecessrios.
Melhor controle dos processos: melhora do gerenciamento dos processos
atravs da padronizao dos mtodos de trabalho.
Melhora nos servios ao cliente: consistncia nos processos leva a uma
maior previsibilidade e rapidez nos nveis de resposta ao cliente.
Flexibilidade: controle sobre os processos atravs de uma ferramenta
permite uma rpida mudana nos fluxos de acordo com a necessidade.

A ferramenta de Workflow existente no Protheus 8 permite o rpido alcance dos


benefcios acima citados, alm de:

Forte rastreabilidade dos processos: pode-se saber a atual situao de


qualquer processo atravs da consulta da rastreabilidade.
Transformao do sistema Protheus em ativo em vez de reativo: a
informao e a ao necessria a ser tomada levada ao usurio e no o
contrrio.
Controle de time-out dos processos: os processos nunca ficam parados
por falta de resposta de uma pessoa.
Qualquer processo existente pode ser automatizado atravs da
construo de um Workflow.

As aes a serem tomadas pelas pessoas em cobrana podem ser realizadas


atravs de quatro meios, evitando que um processo tenha seu ciclo interrompido
por falta de comunicao, so eles:

e-mail: os processos so respondidos atravs de um cliente de e-mail


homologado.
browser de internet: atravs do Internet Explorer, pode-se tomar a ao
pedida pelo processo.
Protheus: atravs do recurso de Messenger do Protheus, pode-se tomar
a ao pedida pelo processo.
Pontos de entrada: atravs de pontos de entradas existentes no sistema,
pode-se tomar a ao pedida pelo processo.

Fluxo operacional

Parmetros
O Workflow faz uso de uma srie de parmetros que determinam a maneira como
ele se comportar perante alguns pontos estratgicos na execuo dos fluxos de
processo. O acesso janela de parmetros est disponvel na opo do menu do
configurador Ambiente | Workflow | Parmetros WF

Opo

Item

Correio
Parmetro

Conta
Caixa de
correio

Composio da
mensagem

MV_WFMLBOX
Envia figura do
html como anexo
da mensagem
Envia html no
corpo da
mensagem

Descrio
Caixa de correio a ser
utilizada pelo workflow para o
envio e recebimento de
mensagens.
Recurso ainda no disponvel.

MV_WFIMAGE

MV_WFHTML

Envio automtico
MV_WFSNDAU
Usa Java Script
MV_WFJAVAS

Selecionando esta opo, o


html passara a fazer parte do
corpo da mensagem. O
contrrio, ir como anexo.
Aps a criao do processo, o
workflow enviar a
mensagem imediatamente.
No html, o Workflow
adicionar rotinas semiprontas em Java script.

Opo

Item
Execuo(es) de
retorno(s)
simultneos de
processos.

Execuo de
retornos

Processos
Parmetro

MV_WFMAXJB

Reativar
processos
automaticamente
MV_WFREACT
Tratamento de
erros
Usar TRANSAAO
na execuo de
funes de
RETORNO e
TIMEOUTs

Descrio
Define a quantidade de
processos de retorno que
podero ser executados por
vez.

MV_WFTRANS

Esteja atento ao
nmero de licenas
disponveis e
capacidade de
processamento da
mquina. A
quantidade
influenciar na
performance do
servidor.
Caso esta opo seja
selecionada, ocorrer erro na
execuo de retornos. O
Workflow reativar o
processo imediatamente para
ser executado de novo. Caso
contrrio, ser reativado
somente quando o
Scheduler for reiniciado.
Habilita o recurso de
transao com a finalidade de
conservar a integridade dos
dados em caso de falha de
execuo.

Opo

Item
Endereo

E-mail do
administrador

Enviar
notificao

Notificao
Parmetro

MV_WFADMIN

Quando ocorrer
erro ao executar
funes
Retorno e
Timeout.
Ao reativar
processos
pendentes.

Ao receber
mensagens no
reconhecidas.

MV_WFNF001

MV_WFNF002

MV_WFNF003

Descrio
Endereo eletrnico do
administrador (es) do
sistema. Separe entre ;
(ponto-e-vrgula) caso deseje
informar mais do que um
endereo. Exemplo:
Adm1@prov.com.br;
adm2@prov.com.br
Notificar por e-mail a lista de
endereos dos
administradores sobre o erro
ocorrido.
Notificar por e-mail a lista de
endereos dos
administradores no momento
em que forem reativados os
processos que ocorreram
erro.
Notificar por e-mail a lista de
endereos dos
administradores sobre as
mensagens no reconhecidas
pelo Workflow.

Opo

Item
Caminho

Messenger
Parmetro
MV_WFBROWS

Browser
Internet

Servidor
MV_WFBRWSR

Caminho
Diretrio HTTP

Habilitar

MV_WFDHTTP

Habilitar Messenger
automaticamente.
(prximo logon)

MV_WFMESSE

Descrio
Arquivo executvel do
browser Internet que dever
estar no path da estao.
IP ou Nomed PIPE do
servidor Protheus para uso
do servio http. Adicione :
+ a porta, caso seja diferente
do padro.
Diretrio de trabalho do
servio http. Verifique o
identificador Path= na
seo [HTTP] do arquivo
mp8Srv.ini para obter o
diretrio de trabalho.
O messenger ser executado
automaticamente no prximo
login de qualquer ambiente
Protheus.

Configurao

1. Requisitos
Software: o Workflow, que uma ferramenta embutida dentro do Server
do Protheus, no necessita de instalao prpria, apenas configuraes.
Toda configurao se d atravs do ambiente Configurador do Protheus.
Servidor de e-mail (quando necessrio para os processos): o
Workflow necessita obter acesso a algum servidor de e-mail, caso se deseje
utilizar e-mails como forma de comunicao. Esse servidor pode estar em
um provedor remoto, acessado atravs de um proxy server ou atravs de
uma linha discada (totalmente no recomendvel), caso se queira enviar emails para fora da sua empresa. Se a troca de e-mails for interna, poder
ser utilizado um Exchange Server, Lotus Domino Server ou outro servidor de
e-mail interno. O nico requisito imprescindvel que esses servidores
trabalhem com protocolos SMTP e POP3 ou IMAPI.
Conta de e-mail: caso utilize-se a opo de e-mail, o Workflow necessita
que seja criada uma conta de e-mail especificamente para ele. Isto , no
poder ser utilizada para mais nenhum fim. Para cada empresa do sistema,
dever ser criada uma conta especfica. Pea para o seu provedor criar esta
nova conta. Sugerimos com o nome da conta Workflow.
Exemplo: workflow@suaempresa.com.br
Clientes de e-mail: para recebimento dos e-mails gerados a partir do
Workflow, so utilizados os clientes de e-mails que devem ser aptos a
responder os e-mails gerados pelo Workflow, gerando arquivos de retorno
chamados octetos.
Para saber se o cliente de e-mail compatvel com o Workflow, ele dever
automaticamente gerar um e-mail de sada enviado para a conta do
Workflow com um arquivo do tipo postdata atachado, quando houver a
resposta do e-mail pelo usurio.
Os seguintes clientes de e-mail funcionam com o Workflow: OutLook Express
4.01, OutLook Express 5.5x, OutLook Express 6.0 e OutLook 2000 e XP,
Lotus Notes 5.x. Outros clientes de e-mail podem no funcionar,
principalmente os webmails. Portanto, garanta que as pessoas que iro
receber e responder os e-mails tenham os clientes acima instalados em suas
estaes. Quando no houver a certeza de que todos conseguiro responder
os e-mails e possuir os clientes de e-mail homologados, use a opo de
Workflow sem uso de e-mails, conforme ser descrito nesta apostila. As
opes de execuo de Java Script e Cookies devero estar liberadas.
Servidor do Protheus: necessrio que o Workflow execute em um Server
do Protheus exclusivo para ele, ou seja, deve haver um binrio somente
para o Workflow.
Memria do servidor: o servidor no qual ser executado o Workflow deve
possuir memria suficiente para que se processem vrios retornos ao
mesmo tempo. O mnimo recomendado de 512 MB de memria RAM para
processar cinco retornos por vez. Um nmero maior do que isso,
provavelmente necessitar de mais memria.

2. Correio Eletrnico

2.1. Protocolo
O Workflow faz uso do recurso de envio e recebimento de mensagens
eletrnicas (e-mails). Para que esse procedimento seja possvel,
devemos configurar que tipo de protocolo de recebimento o Protheus
dever usar.
Se omitido, o padro assumido ser POP3. Caso necessite mudar,
localize a seo [Mail] no arquivo mp8srv.ini e altere para o protocolo
utilizado.
Protocolos atualmente homologados:

POP3

IMAP

Exemplo:
[Mail]
Protocol=IMAP
Folder=inbox

Ateno: O protocolo MAPI no suportado pelo Protheus.

2.2. Contas de e-mail


Atravs do cadastro de contas de e-mails, possvel realizar o envio e
recebimentos de mensagens. Para acessar o cadastro de e-mails,
selecione a seguinte opo de menu do configurador:

10

Aps a realizao do cadastro de uma conta de e-mail, possvel realizar


algumas operaes extras como:

Enviar: esta opo executar o envio de todas as mensagens


contidas na pasta outbox (caixa de sada).

Enviar Todos: esta opo realizar a mesma operao do item


anterior; entretanto, efetuar o envio de todas as mensagens
para todas as contas cadastradas.

Receber: esta opo executar o recebimento de todas as


mensagens contidas no servidor de e-mail especificado no
cadastro para a pasta inbox (caixa de entrada).

Receber todos: esta opo realizar a mesma operao do


item anterior. Contudo, realizar para todas as contas
cadastradas.

11

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 necessrios devero fazer parte do
preenchimento do cadastro.

Caixa de Correio
Opo

Item

Nome

Descrio
Nome da caixa de correio. Esse
nome ser usado para criar a pasta,
em que sero identificadas as
mensagens pertinentes a cada conta.
Tempo mximo (em segundos) de
espera para conexo com o servidor
de e-mails, tanto no envio como
recebimento
de
mensagens.
O
tempo padro 60 segundos.
Nome do remetente da mensagem.

Endereo

Endereo eletrnico.

Incluir esta conta ao


enviar e receber e-mails

Esta opo habilita o uso da conta


para enviar e receber mensagem.

Correio

Correio

Remetente

Habilitar

Tempo Espera

12

Receber mensagens
Opo

Item
Nome

Servidor (POP3
ou IMAP)

Login

Descrio
IP ou Named Pipe do servidor. Ser
exibido conforme o tipo utilizado na
seo [Mail] no arquivo
mp8srv.ini

Porta

Porta de acesso dependendo do tipo.


POP3 = 110; IMAP = 143 (defaults).

Conta

Nome da conta.

Senha

Senha de acesso conta.

13

Enviar mensagens
Opo

Item
Nome

Servidor SMTP

Porta
Usurio

Autenticao
Senha

Descrio
IP ou Named Pipe do servidor SMTP.
Porta de acesso. Valor padro: 25.
Nome do usurio para autenticao.
Alguns servidores exigem esta
informao para envio de e-mails.
Senha de acesso para autenticao.

* Os campos para autenticao de envio somente devero ser preenchidos


caso sejam obrigatrios, conforme a regra de segurana estabelecida pela
empresa. Consulte o administrador do servidor de mensagens para obter as
informaes necessrias para os preenchimentos dos campos Usurio e Senha.

14

Conexo
Opo

Tipo

Item

Descrio

LAN

Utiliza a conexo j estabelecida pelo


usurio em uma intranet.

DIAL-Up

Utiliza o recurso de discagem atravs


de uma linha telefnica (no
recomendvel). Somente funciona
em estaes e servidores Windows.
Lista de conexes disponveis do tipo
Dial-up, obtidas a partir do cadastro
de conexes dial-up criado
previamente no Microsoft Windows.

*Conexes

Conta

Nome da conta (usurio) de acesso


ao provedor internet.

Senha

Senha de acesso conta no


provedor.

Telefone

Nmero da linha de acesso ao


provedor internet.

Discagem

* Os campos Conta, Senha e Telefone so obtidos automaticamente a partir da


seleo da lista de conexes disponveis no campo Conexes:. Esses campos
so meramente informativos, j que foram obtidos atravs da conexo criada
previamente no Windows. Veja no manual do Microsoft Windows como criar
conexes dial-up.

15

Estrutura de diretrio de mensagens


A partir da verso 8.11, a estrutura de diretrios de armazenamento de mensagens
mudou. A pasta Workflow passou a ser o Root por questes de organizao
de acesso aos respectivos arquivos de controle e mensagens a cada empresa.

Estrutura de diretrios
Pastas

Descrio
Pasta principal da estrutura de diretrios do
Workflow. Esta pasta til para armazenar os html
e arquivos comuns entre as empresas.
Pasta individual de trabalho para cada empresa.

Mail

Process

Tasks

Esta pasta contm a estrutura de


diretrios para uso exclusivo de
armazenamento
de
mensagens
enviadas e recebidas para cada caixa
de correio existente.
Contm arquivos de controle criados
pelo Workflow para gerar e manipular
processos.
Contm temporariamente arquivos de
agendamento de rotinas utilizados
para serem inseridos dentro da tabela
SXM (scheduler).

16

Temp

Diretrio temporrio de trabalho.

A partir da pasta Mail, sero 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
no sejam relacionadas aos processos
de Workflow, sero 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 sero
armazenadas nessa pasta (mensagens
recebidas em duplicidade)
Esta uma pasta comum entre as
caixas de correio existentes. Ela
Inbox
responsvel pelo armazenamento de
mensagens recebidas.
Esta uma pasta comum entre as
caixas de correio existentes, sendo
responsvel pelo armazenamento de
Outbox
mensagens que devero ser enviadas.
Caso ocorra erro durante o envio das
mensagens, elas sero armazenadas
na sub-pasta Erro.
Esta uma pasta comum entre as
caixas de correio existentes, sendo
Sent
responsvel pelo armazenamento das
mensagens enviadas.

17

3. Scheduler

O Scheduler (agenda) uma ferramenta responsvel pela execuo das


funes de usurios ou funes padronizadas do sistema (chamaremos de
Jobs), em determinados horrios especficos entre um intervalo de tempo,
sem que haja a interveno do usurio. Para que essa ferramenta esteja
habilitada a realizar execues dos jobs, necessrio que ela esteja ativada
no servidor do Protheus.

3.1. Ativao
Para que os jobs sejam executados nos horrios pr-determinados,
importante que aps a carga do servidor do Protheus, o Scheduler seja
executado. Dessa forma, ele poder verificar a cada minuto se h jobs a
serem executados.
Essa ativao ocorre a partir do recurso disponvel na seo [OnStart]
contido no arquivo mp8srv.ini. Exemplo a ser adicionado ao arquivo
MP8SRV.INI:
[ONSTART]
Jobs=Scheduler
[Scheduler]
Main=WFONSTART
Environment=EnvTOP
A funo WFOnStart responsvel pela carga inicial do Scheduler e
requer
informaes
contidas
no
arquivo
auxiliar
chamado
Scheduler.wf, localizado no diretrio system do Protheus. O contedo
desse arquivo servir para obter a lista de parmetros necessria para
executar o Scheduler.
Caso o arquivo no exista, ser criado automaticamente com o seguinte
contedo padro: 99,01,ENVTOP,T,MOD.
1.
2.
3.
4.

99 cdigo da empresa.
01 cdigo da filial.
ENVTOP ambiente no qual ser executado o Scheduler.
T Valor lgico (True ou False). True, Indicar que realizar
reativao dos processos nas tabelas do Workflow.
5. MOD Nome do ambiente do qual o Workflow obter licenas.
A partir da verso 8.11 do Protheus, passou-se a aceitar os parmetros
passados atravs da prpria seo sem a necessidade de utilizar o
arquivo auxiliar Scheduler.wf, apenas acrescentando as seguintes
linhas:

18

Exemplo:
[Scheduler]
Main=WFOnStart
Environment=ENVTOP
nParams=5
Parm1=99
Parm2=01
Parm3=ENVTOP
Parm4=T
Parm5=TMK

3.2. Agendando
Atravs do configurador, possvel acessar a janela de cadastro de jobs
a serem executados pelo Scheduler. Basta que se selecione a opo de
menu correspondente figura abaixo:

Selecione: Processos Especiais.

19

Janela de cadastro de jobs

20

Scheduler Processos Especiais


Agrupamento

Campos
Cdigo

Descrio

Identificao

Nome

Nome simplificado.

Descrio

Descrio do job.

Diria

Executa diariamente entre os horrios inicial e


final a cada intervalo de tempo.
Executa nos dias selecionados da semana
(domingo, segunda, tera, quarta, quinta, sexta
e sbado), entre os horrios inicial e final a cada
intervalo de tempo.
Executa nos meses selecionados do ano (janeiro
a dezembro), entre os horrios inicial e final a
cada intervalo de tempo.
Data inicial que passar a vigorar a execuo.
Horrio inicial de execuo.
Dia limite de execuo.
Horrio limite de execuo.
Intervalo de tempo a cada execuo entre o
horrio inicial e final.
Funo de usurio ou funo interna do Protheus
a ser executado. Os parmetros passados para
esta funo devero ser sempre tratados como
um array.
Ambiente em que o job ser executado.

Semanal
Freqncia
Mensal

Perodo Inicial
Perodo Final
Perodo

Data Incio
Hora Incio
Data final
Hora final
Intervalo
Ao

Job
Environment

Ambiente

Cdigo nico identificador do job.

3.3. Agendar recebimento de mensagens do Workflow


Para que o Workflow possa receber as mensagens e executar os retornos
de processos, necessrio cadastrar no Scheduler a funo
WFReturn(Cdigo_Empresa, Cdigo_Filial).
A funo WFReturn responsvel por:

baixar (download) todas as mensagens contidas na caixa postal


de mensagens do correio eletrnico do Workflow e gravar na
pasta Inbox (veja acima estrutura de diretrios para
melhor esclarecimento);

separar as mensagens reconhecidas (retornos de aprovao


etc.) pelo Workflow e mover para a pasta Process;

separar as mensagens no reconhecidas (spam etc.) pelo


Workflow e mover para a pasta Archive. Em seguida, notificar
lista de e-mails de administradores informados no cadastro de
parmetros do Workflow;

executar cada um dos retornos de processos.

Exemplo:
WFReturn( 99, 01 )

21

3.4. Agendar envio de mensagens do Workflow


Apesar de ter a opo Enviar Automaticamente disponvel no cadastro
de parmetros do Workflow, importante saber que nem sempre possvel
enviar as mensagens em um determinado momento. Podero ocorrer alguns
problemas que podem acarretar fila de espera e, com isso, crescer o
nmero de processos parados. Entre os problemas mais comuns est a
perda da comunicao com o servidor de e-mail.
Para evitar tais problemas, interessante agendar a funo WFSendMail
(Cdigo_Empresa, Cdigo_Filial) da mesma forma que a funo
WFReturn. Assim, haver a garantia de que a qualquer momento as
mensagens que, eventualmente, tenham ficado na fila de espera sero
enviadas.
A funo WFSendMail responsvel por:

enviar cada uma das mensagens contidas na pasta Outbox


(caixa de sada);

mover para a pasta Sent (itens enviados) as mensagens que


foram enviadas com sucesso;

mover para a pasta Outbox\Error as mensagens que tiveram


problemas durante o envio. Caso queira reenvi-las, basta movlas para a pasta Outbox (caixa de sada).

Exemplo:
WFSendMail( 99, 01 )

22

Requisitos para Desenvolvimento

Para construir um processo de Workflow que automatize de forma correta, so


necessrios quatro requisitos fundamentais:
1. conhecer o sistema de ERP como um todo, inclusive tecnicamente. Isso
corresponde a conhecer todos os recursos de configurao e
programao do Protheus, bem como suas tabelas e respectivos
relacionamentos;
2. saber programar
conhecimento

em linguagem ADVPL,
em
objetos

nvel
e

avanado, com
classes;

3. conhecimento em linguagem HTML, para construo de pginas, alm de


saber programar em Java Script, para refinamento e validao das
pginas;
4. software e hardware necessrios.

Cadastros
Alm dos cadastros de parmetros do Workflow e de e-mails, j mostrados
anteriormente, existem outros cadastros que auxiliam no processo do Workflow que
sero aqui descritos.
1. Processos Workflow
O cadastro de processos do Workflow, apesar de no ser obrigatrio, tem a
importncia de amarrar a seqncia de passos de um fluxo de processo para
ser visualizado a partir da janela de consulta da rastreabilidade.
Exemplo de processos a serem cadastrados:

Aprovao de solicitao de compras.

Aprovao de pedido de compras.

Cotao de preos.

Liberao de crdito.

Esse cadastro encontra-se no ambiente Configurador. Observe as telas:

23

24

Cadastro de Processos
Agrupamento
Codificao
Informativo
Pesquisa
genrica
Visio

Campos
Cdigo

Descrio

Nome

Nome do processo.

Tabelas

Especificaes das tabelas utilizadas para


execuo do processo.
Cdigo da pesquisa padro utilizada para
localizar um determinado processo.
Arquivo visio document (fluxo do processo
desenhado a partir do Microsoft Visio).

Pesquisa
Padro
Arquivo .vsd

Cdigo nico identificador.

2. Status Workflow
O cadastro de Status o complemento do cadastro de processo. Atravs dele,
determina-se cada etapa que se realizar em um fluxo de processo, sendo
muito til para determinar pontos de rastreabilidade dentro de um grande
processo.

25

26

Cadastro de Status
Agrupamento

Campos
Cd
Processo
Cd Status

Codificao

Informativo

Descrio
Tempo
mdio

Descrio
Cdigo do processo.
Cdigo do status de processo. Esse cdigo deve
ser um valor numrico acima de 999. A faixa de
valores entre 0 e 999 est reservada ao
Workflow.
Descrio do Status do processo.
Tempo mdio de execuo deste status. Este
tempo calculado pelo sistema.

27

3. E-mails substitutos
O cadastro de e-mails substitutos um recurso disponvel no Workflow que tem
por finalidade delegar para um outro endereo eletrnico todas as mensagens
dirigidas a um determinado participante por um perodo de tempo estipulado.
Esse recurso importante quando se tratar de eventuais problemas em que um
dos participantes do fluxo do processo permanea ausente por motivos diversos
(frias, afastamento etc.).

28

Cadastro de e-mails substitutos


Agrupamento
Endereo
eletrnico

Perodo

Campos
Do e-mail
Para o email
Data incio
Data final
Dias

Descrio
Endereo
eletrnico
do
participante
que
permanecer ausente por um perodo de tempo.
Endereo eletrnico do participante que ficar
responsvel por receber as mensagens.
Data inicial em que passar a vigorar a
substituio dos e-mails.
Data final do perodo.
Clculo de dias entre a data inicial e final.

29

Html Modelo Workflow


O Workflow faz uso de formulrios html para realizar interaes entre o(s)
participante(s) e o sistema ERP. Alm de inform-los, possvel responder
determinadas requisies atravs do recurso Post message oferecido pelos
navegadores internet. Os formulrios desenhados e utilizados para interagir com os
participantes, so denominados modelos (templates) e devero estar disponveis
em algum diretrio abaixo do rootpath do Protheus. Ao ser utilizado algum desses
modelos nos processos de Workflow, apenas a cpia do modelo ser modificado.
necessrio bons conhecimentos de programao HTML e Java Script para a
construo de pginas no Workflow.
1. Post message
O recurso Post message, nas pginas html a partir dos navegadores internet,
permite que as respostas sejam enviadas ao Workflow via correio eletrnico (email) ou servio http. Para que isso seja possvel necessrio incluir o tag
<form action=mailto:%WFMailTo% method=post> nos formulrios
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>Aprovao de Pedido de Compra</title>
</head>
<body bgcolor="#FFFFFF">
<form action="mailto:%WFMailTo%" method="POST" name ="FormPedComp">
...
</form>
</body>
</html>

30

2. Macro substituio
Esta rotina consiste na substituio de todas as palavras encontradas nos
formulrios html que estiverem entre % ou !. Essa palavra-chave ter seu
contedo modificado por outra informao durante a execuo do processo.
Observe um formulrio modelo de aprovao de pedido de compras com suas
respectivas palavras-chaves (macros):

%macro% - Toda palavra encontrada entre este sinal (%), alm da


substituio do contedo por outra informao, tambm haver a necessidade
de incluir no formulrio (cpia do modelo) as linhas de tags <input
type=hidden...> para cada palavra-chave (macro) encontrada.
Exemplo:
<input
<input
<input
<input
<input

type=hidden
type=hidden
type=hidden
type=hidden
type=hidden

name="EMISSAO" value="01/04/05">
name="FORNECEDOR" value="100100">
name="LB_NOME" value="RM SUPRIMENTOS INFO LTDA">
name="LB_COND" value="30D">
name="PEDIDO" value="000003">

importante saber que o uso desse smbolo necessrio somente para campos
editveis que esperam modificaes de seus contedos e que sero tratados no
retorno das mensagens. Use este smbolo nos controles do tipo TextField,
TextArea, Radio Button, Combo Box e Check Box.
TextField:
<input type="text" size="13" name="T7" value=%quantidade%>
TextArea:

31

<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">No.
Combo Box:
<select
name="list"
</select>

size="1"><option

selected>%itens%</option>

Check Box:
<input type="checkbox" name="checkbox" value="%item1%">Item 1
!macro! Toda palavra encontrada entre este sinal (!) ter somente seu
contedo substitudo. No ser includo <input hidden...> no html para essas
palavras-chaves. Utilize-o em texto fixo.
Exemplo: ttulos, mensagens, cabealhos e rodaps.

3. Tabelas
As tabelas so identificadas pelo Workflow atravs do nome que precede o
ponto (.) nas palavras-chaves. Contudo, essas palavras-chaves devem
realmente pertencer a uma tabela (tag <table>...</table>) do formulrio html.
Veja em itens do html da aprovao do pedido de compras que h algumas
palavras-chaves com o nome precedido da palavra produto.. Neste caso, o
Workflow ir referir-se a essa tabela pelo nome de produto (sem o ponto).
Poder conter vrias tabelas em um html que o Workflow saber identificar
atravs do nome.

32

Criando um processo em ADVPL - Funes


No existem processos de Workflow nativos dentro do Protheus, sendo necessria a
construo de acordo com a necessidade.
Um processo

de Workflow poder ser iniciado a partir de uma destas opes:


pontos de entrada;
item de menu de qualquer ambiente;
job agendado atravs do Scheduler;
manualmente atravs do remote.

A opo mais utilizada o ponto de entrada. Se for realizado um pedido de


compras, por exemplo, automaticamente gerada uma aprovao para os itens do
pedido e enviado para um aprovador. Qualquer ponto de entrada do sistema pode
ser utilizado.
Para ser iniciado o processo em qualquer das opes escolhidas, ser necessrio
fazer uso do cdigo fonte Advpl para determinar a forma como ir proceder a
execuo do fluxo do processo.
Na maior parte, o Workflow baseia-se, no uso de classes referenciadas aos objetos,
que se tornam a ponte de acesso para uso de seus mtodos e propriedades. A
principal classe do Workflow a TWFProcess, o que veremos a seguir (
necessrio conhecimento de programao orientada a objetos).

Classe TWFProcess
A classe TWFProcess responsvel pela criao e gerenciamento do processo.
Como toda classe, a TWFProcess dividida em mtodos e propriedades. Veremos
alguns dos principais mtodos e propriedades que iremos usar para criao de um
processo.

Mtodos
:New(<cCodProc>,<cDescr>,<cProcID>)
O mtodo New() responsvel pela criao e inicializao da classe WFProcess.
Parmetros:
1. cCodProc: este parmetro recebe o cdigo do processo usado em Cadastro
de Processos.
2. cDescr: este parmetro recebe a descrio do processo que est sendo
criado no momento. Se no for informado, ser usada a descrio contida no
cadastro de processo, localizada atravs do parmetro anterior cCodProc.
3. cProcID: este parmetro recebe o ID do processo criado anteriormente.
Normalmente, utilizado para reconstruir um processo anterior, dando
seqncia a ele.
Exemplo:
oP := TWFProcess():New("PEDCOM","Aprovacao do Pedido de Compras")

33

:NewTask(<cDescr>,<cArqHtml>,<lCopiar>)
Este mtodo responsvel por criar a seqncia de tarefas a serem executadas
e identificar qual html ser utilizado pelo processo.
Parmetros:
1. cDescr: este parmetro recebe a descrio da tarefa.
2. cArqHtml:
processo.

recebe o caminho e o nome do arquivo html que far uso no

3. lCopiar: este parmetro, do tipo lgico, responsvel 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" )

Formatted: Portuguese (Brazil)

:AttachFile(<cArquivo>)
Este mtodo responsvel pela incluso de arquivos anexos mensagem.
Esses arquivos devero estar abaixo do root path do Protheus.
Parmetros:
1. cArquivo: caminho e nome do arquivo a ser anexo mensagem.
Exemplo:
oP:AttachFile(\Workflow\teste.txt)
:Start(<cHtmlCopiarPara>) -> cProcessKey
Este mtodo responsvel por construir todo o processo, gravar os registros
nas tabelas do Workflow e enviar a mensagem para os destinatrios. O valor de
retorno uma chave composta pela codificao ProcessID + TaskID e nmeros
aleatrios, no total de 17 algarismos em hexadecimal.
Parmetros:
1. cHtmlCopiarPara: Caminho em que o Workflow dever realizar uma cpia
do html final.
Exemplo:
cID := oP:Start(\Workflow\copia)
if file( \Workflow\copia\ + cID)
conout(Arquivo copiado com sucesso.)
endif
:Finish()
Este mtodo responsvel por finalizar o processo. Aps a finalizao, ele no
estar mais disponvel para execues do tipo retorno e timeout.
Exemplo:
oP:Finish()
:Track(<cCodStatus>,<cDescr>,<cUsuario>)
Este mtodo responsvel por incluir as descries dos passos seguidos pelo
fluxo do processo e apresent-los na consulta da rastreabilidade.

34

Parmetros:
1. cCodStatus: cdigo do status do processo.
2. cDescr: descrio do passo ocorrido.
3. cUsuario: nome do usurio 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 endereo dos destinatrios. Poder ser informado
mais que um destinatrio ao mesmo tempo. Basta incluir um ponto-e-vrgula ;
entre eles. Se for informada uma palavra qualquer que no seja um endereo
de e-mail vlido, o Workflow ir considerar que se trata de um diretrio 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 contm o nome da funo que ser executada no momento
em que o Workflow receber a mensagem de resposta de um dos destinatrios
via e-mail ou servio http.
Exemplo:
oP:bReturn := U_Retorno
:bTimeOut
Esta propriedade recebe um array de timeouts contendo nomes das funes e
tempo de espera. Caso o tempo seja alcanado, sero executadas as funes
mencionadas no 1 item do array. Podero ser especificados mais do que um
array de timeouts.
{ { <cFuncao>, <nDias>, <nHoras>, <nMinutos> }, { ... } }

35

Exemplo:
oP:bTimeOut := { { TimeOut1, 0, 5, 30 } }
ou
oP:bTimeOut := { { TimeOut1, 0, 5, 30 }, { TimeOut2, 1, 10, 0 } }
:fProcessID
Esta propriedade fornece o nmero ID do processo.
Exemplo:
cProcID := oP:fProcessID
:fTaskID
Esta propriedade fornece o nmero ID da tarefa criada para um determinado
processo, atravs do mtodo :NewTask().
Exemplo:
oP:NewTask( "100100", "\Workflow\WFW120p.htm" )
cTaskID := oP:fTaskID
:oHTML
Esta propriedade responsvel pelo tratamento das palavras-chaves no html
mencionado no mtodo :NewTask(). Esse objeto uma referncia da classe
TWFHtml() e disponibiliza dois dos mtodos mais importantes :RetByName() e
ValByName().
:oHTML:RetByName( <cNome da macro> )
Esta propriedade tem como objetivo obter o contedo da macro quando as
respostas retornarem para o Workflow. O mtodo somente dever ser usado na
funo de retorno.
Exemplo:
cNome := oP:oHtml:RetByName( Nome )
Em uma tabela:
aCodigo := oP:oHtml:RetByName( produto.Codigo )
:oHTML:ValByName(<cMacro>,<uConteudo>)
Este mtodo 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 funo de timeouts, em que o uso
necessrio por motivo de no haver recebido resposta.
Parmetros:
1. cMacro: nome da macro (palavra-chave) encontrada no html e identificada
entre os smbolos % e !.

36

2. uConteudo: valor a ser atribudo macro.


Exemplo:
Assinalando um valor:
oP:oHtml:ValByName( Nome, Aluno1 )
Usando na funo de timeout:
cNome := oP:oHtml:ValByName( Nome )
Atribuindo um valor a uma tabela:
AAdd( oP:oHtml:ValByName( produto.codigo ), SB1->SB1_COD )

37

Case Atualizao do preo de venda de produto


A partir do ponto de entrada (MT010INC) no cadastro de produtos, criaremos um
processo de Workflow que enviar um html via e-mail para um destinatrio que
dever atualizar o preo de venda do produto e, em seguida, enviar a resposta para
ser atualizada na base de dados do Protheus. Esse ponto de entrada ser
executado aps a incluso de um novo produto.
Conforme os passos descritos abaixo, realizaremos um cadastro de processos e de
status para futuras pesquisas com o uso da rastreabilidade de processos.
Criaremos, tambm, um html e um arquivo de programa para descrevermos o fluxo
do processo em cdigo Advpl, usando as classes e as funes de Workflow.
PASSO 1 Criar novo campo no SB1
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.
Definio do campo B1_WFID: tipo Caracter; tamanho 7; decimais 0
PASSO 2 Pesquisa padro SXB
Crie uma pesquisa SXB com o nome WFSB1 que faa referncia tabela SB1 e
retorne o contedo do campo B1_WFID.
PASSO 3 - Cadastro de Processos
A partir do configurador, selecione a opo de menu Ambiente | Workflow |
Processos Workflow e crie um novo processo conforme o contedo dos campos
apresentados na tabela abaixo:
Cdigo
ATUAPV

Descrio
ATUALIZACAO DO PRECO DE VENDA

Pesq Padro
WFSB1 - Produto

PASSO 4 Cadastro de Status


Ainda no configurador, selecione a opo de menu Ambiente | Workflow |
Status Workflow e cadastre alguns status para o processo mencionado,
conforme o contedo dos campos apresentados abaixo:
Cd Processo
ATUAPV
ATUAPV
ATUAPV
ATUAPV
ATUAPV
ATUAPV
ATUAPV
ATUAPV
ATUAPV

Cd Status
100100
100200
100300
100400
100500
100600
100700
100800
100900

Descrio
INICIANDO
GERANDO PROCESSO PARA ENVIO
ENVIANDO MENSAGEM
AGUARDANDO RETORNO
ATUALIZANDO PRECO DE VENDA
TIMEOUT
REENVIANDO A MENSAGEM
FINALIZANDO
ERRO DE EXECUO

38

PASSO 5 Criar html modelo para o processo


Crie um html modelo, chamado ATUAPV.HTM, no diretrio \WORKFLOW (abaixo do
rootpath) que ser utilizado no e-mail para que o destinatrio altere o valor do
preo de venda do produto e envie a resposta atravs do boto Enviar.

Cdigo fonte:
<html><head><title>Atualizao preco de venda</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body><form action="mailto:%WFMailTo%" method="post"
name="form1">
<table width="100%" height="130" border="1" bordercolor="#66CCFF" >
<tr bordercolor="#DFEFFF">
<td height="71" colspan="4" bgcolor="#DFEFFF">
<p align="center"><strong><font color="#3333FF" size="4" face="Verdana,
Arial, Helvetica, sans-serif">Atualiza&ccedil;&atilde;o do Pre&ccedil;o de
Venda</font></strong></p>
</td></tr><tr bordercolor="#66CCFF">
<td height="20" bgcolor="#DFEFFF">
<font size="1">C&oacute;digo:</font></td>
<td bgcolor="#DFEFFF"><font size="1">Descri&ccedil;&atilde;o:</font></td>
<td bgcolor="#DFEFFF"><font size="1">Pre&ccedil;o de venda R$:</font>
</td>
</tr>
<tr bordercolor="#66CCFF">
<td width="17%" height="28"><strong>!B1_COD!</strong></td>
<td width="53%">!B1_DESC!</td>

39

<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>
PASSO 6 Criar processo de Workflow a partir do ponto de entrada
No IDE, geraremos um arquivo de programa chamado ATUAPV.PRW onde ser
criada a funo representativa do ponto de entrada MT010INC, em que
descreveremos o fluxo do processo com o uso das classes e funes do Workflow.
Essa funo (ponto de entrada) ser executada a partir do momento em que for
pressionado o boto OK, na confirmao da incluso dos dados do produto na
tabela SB1.
ATUAPV.PRW
#INCLUDE PROTHEUS.CH
/*
// MT010INC - Corresponde ao ponto de entrada do sistema que somente
//
ser executado na incluso de novos produtos.
*/
User Function MT010INC(nOpcao,oProcess)
// Inicialmente, os parmetros nOpcao e oProcess estaro com valores iguais a NIL.
// se nOpcao for NIL, ter o seu valor inicial igual a 0 (zero).
default nOpcao := 0
do case
case nOpcao == 0
U_APVInicio()
case nOpcao == 1
U_APVRetorno(oProcess)
case nOpcao == 2
U_APVTimeOut(oProcess)
endcase
Return
/*
// APVInicio - Esta funo responsvel por iniciar a criao do processo e por
//
enviar a mensagem para o destinatrio.
*/
User Function APVInicio(oProcess)
Local nDias := 0, nHoras := 0, nMinutos := 10
Local cCodProcesso, cCodStatus, cHtmlModelo
Local cUsuarioProtheus, cCodProduto, cTexto, cAssunto
cCodProduto := SB1->B1_COD
// Cdigo extrado do cadastro de processos.
cCodProcesso := "ATUAPV"

40

// Arquivo html template utilizado para montagem da aprovao


cHtmlModelo := "\Workflow\atuapv.htm"
// Assunto da mensagem
cAssunto := "Atualizao do preo de venda"
// Registre o nome do usurio corrente que est criando o processo:
cUsuarioProtheus:= SubStr(cUsuario,7,15)
// Inicialize a classe TWFProcess e assinale a varivel objeto oProcess:
oProcess := TWFProcess():New(cCodProcesso, cAssunto)
// Crie uma tarefa.
oProcess:NewTask(cTitulo, cHtmlModelo)
// Crie um texto que identifique as etapas do processo que foi realizado
// para futuras consultas na janela de rastreabilidade.
cTexto := "Iniciando a solicitao de " + cAssunto + " do produto: " + cCodProduto
// Informe o cdigo de status correspondente a essa etapa.
cCodStatus := "100100" // Cdigo do cadastro de status de processo.
// Repasse as informaes para o mtodo responsvel pela rastreabilidade.
oProcess:Track(cCodStatus, cTexto, cUsuarioProtheus) // Rastreabilidade
// Adicione informaces a serem includas na rastreabilidade.
cTexto := "Gerando solicitao para envio..."
cCodStatus := "100200"
oProcess:Track(cCodStatus, cTexto, cUsuarioProtheus)
// Assinale novos valores s macros existentes no html:
oProcess:oHtml:ValByName("B1_COD", cCodProduto)
oProcess:oHtml:ValByName("B1_DESC", SB1->B1_DESC)
oProcess:oHtml:ValByName("B1_PRV1", SB1->B1_PRV1)
// Repasse o texto do assunto criado para a propriedade especfica do processo.
oProcess:cSubject := cAssunto
// Informe o endereo eletrnico do destinatrio.
oProcess:cTo := "bi@microsiga.com.br"
// Utilize a funcao WFCodUser para obter o cdigo do usurio Protheus.
oProcess:UserSiga := WFCodUser("BI")
// Antes de assinalar o ID do processo no campo, verificado se realmente o
// campo existe na tabela SB1.
If SB1->(FieldPos("B1_WFID")) > 0
If RecLock("SB1",.f.)
SB1->B1_WFID := oProcess:fProcessID
MsUnLock()
EndIf
EndIf
// Informe o nome da funo de retorno a ser executada quando a mensagem de
// respostas retornar ao Workflow:
oProcess:bReturn := "U_MT010INC(1)"

41

// Informe o nome da funo do tipo timeout que ser executada se houver um


timeout
// ocorrido para esse processo. Neste exemplo, ela ser executada cinco minutos
aps o envio
// do e-mail para o destinatrio. Caso queira-se aumentar ou diminuir o tempo,
altere
// os valores das variveis: nDias, nHoras e nMinutos.
oProcess:bTimeOut := {"U_MT010INC(2)", nDias, nHoras, nMinutos}
// Adicione as informaces a serem includas na rastreabilidade
cTexto := "Enviando solicitao..."
cCodStatus := "100300"
oProcess:Track(cCodStatus, cTexto , cUsuarioProtheus)
// Aps ter repassado todas as informaces necessrias para o Workflow,
// execute o mtodo Start() para gerar todo o processo e enviar a mensagem
// ao destinatrio.
oProcess:Start()
// Adicione as informaces a serem includas na rastreabilidade
cTexto := "Aguarde retorno..."
cCodStatus := "100400"
oProcess:Track(cCodStatus, cTexto , cUsuarioProtheus) // Rastreabilidade
Return
/*
// APVRetorno - Esta funo executada no retorno da mensagem enviada
//
pelo destinatrio. O Workflow recria o processo em que
//
parou anteriormente na funo APVInicio e repassa a
//
varivel objeto oProcess por parmetro.
*/
User Function APVRetorno(oProcess)
Local nPrecoVenda
Local cCodProduto, cCodStatus, cTexto
// Obtenha o cdigo do produto a partir do html
cCodProduto := oProcess:oHtml:RetByName("B1_COD")
// Obtenha o novo preo de venda informado pelo destinatrio:
nPrecoVenda := Val(oProcess:oHtml:RetByName("B1_PRV1"))
dbSelectArea("SB1")
SB1->(dbSetOrder(1))
// Localize o produto cadastrado na tabela SB1
If SB1->(dbSeek(xFilial("SB1") + cCodProduto))
// Adicione as informaces a serem includas na rastreabilidade.
cTexto := "Atualizando o preo de venda..."
cCodStatus := "100500"
// Atravs do atributo :cRetFrom da classe twfprocess, possvel obter o endereo
// eletrnico de quem respondeu a mensagem. Obtenha-o para adicion-lo
rastreabilidade.
oProcess:Track(cCodStatus, cTexto, oProcess:cRetFrom)
// Atualize o preo de venda:

42

If RecLock( "SB1", .f. )


SB1->B1_PRV1 := nPrecoVenda
MsUnLock()
EndIf
Else
// Adicione as informaces a serem includas na rastreabilidade.
cTexto := "No foi possvel encontrar o produto: " + cCodProduto
cCodStatus := "100900"
oProcess:Track(cCodStatus, cTexto, oProcess:cRetFrom)
EndIf
// Adicione as informaces a serem includas na rastreabilidade.
cTexto := "Finalizando o processo..."
cCodStatus := "100800" // Cdigo do cadastro de status de processo
oProcess:Track(cCodStatus, cTexto, oProcess:cRetFrom) // Rastreabilidade
Return
/*
// APTimeOut - Esta funo ser executada a partir do Scheduler no tempo
//
estipulado pela propriedade :bTimeout da classe TWFProcess.
//
Caso o processo tenha sido respondido em tempo hbil, essa
//
execuo 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 := "Atualizao do preo de venda"
// Adicione as informaces a serem includas na rastreabilidade.
cTexto := "Executando TIMEOUT..."
cCodStatus := "100600"
// A funo APTimeOut executada, automaticamente, pelo sistema.
// Devido no haver usurio associado execuo, ser omitido o parmetro
// correspondente.
oProcess:Track(cCodStatus, cTexto) // Rastreabilidade
// Na execuo da funo de timeout, no se caracteriza retorno de mensagem.
// Neste caso, deve usar o mtodo :ValByName() no lugar do mtodo
:RetByName()
// para obter os valores contidos no html.
cCodProduto := oProcess:oHtml:ValByName("B1_COD")
// Finalize a tarefa anterior para no ficar pendente.
oProcess:Finish()
dbSelectArea("SB1")
SB1->(dbSetOrder(1))
// Localize o produto na tabela SB1:
If SB1->(dbSeek(xFilial("SB1") + cCodProduto))

43

// Crie uma nova tarefa, aproveitando o contedo do html preenchido


anteriormente
// com o uso do terceiro parmetro com o valor lgico igual a .T. (verdadeiro)
oProcess:NewTask(cTitulo, cHtmlModelo, .T.)
// Antes de assinalar o ID do processo no campo, verifique se realmente o campo
// existe na tabela SB1:
If SB1->(FieldPos("B1_WFID")) > 0
If RecLock("SB1",.f.)
SB1->B1_WFID := oProcess:fProcessID
MsUnLock()
EndIf
EndIf
// Acrescente a palavra "(REENVIO)" no incio do assunto da mensagem para
// reforar que houve um timeout executado.
If (Left(oProcess:cSubject,9) != "(REENVIO)")
oProcess:cSubject := "(REENVIO)" + oProcess:cSubject
EndIf
oProcess:cTo := "bi@microsiga.com.br"
// Utilize a funo WFCodUser para obter o cdigo do usurio Protheus.
oProcess:UserSiga := WFCodUser("BI")
// Redefina a funo de retorno a ser executada.
oProcess:bReturn := "U_MT010INC(1)"
// Redefina a funo de timeout a ser executada.
oProcess:bTimeOut := {"U_MT010INC(2)", nDias, nHoras, nMinutos}
// Adicione as informes a serem includas na rastreabilidade
cTexto := "Reenviando a solicitao..."
cCodStatus := "100700"
oProcess:Track(cCodStatus, cTexto)
// Inicie o processo
oProcess:Start()
Else
// Adicione as informaces a serem includas na rastreabilidade.
cTexto := "No foi possvel encontrar o produto: " + cCodProduto
cCodStatus := "100900" // Cdigo do cadastro de status de processo
oProcess:Track(cCodStatus, cTexto) // Rastreabilidade
EndIf
Return
PASSO 7 Compilar e executar o ambiente COMPRAS.
Aps compilar o programa ATUAPV.PRW, execute o ambiente de compras, selecione
a opo de menu Atualizaes | Cadastros | Produtos e inclua um novo
produto. Ao confirmar a gravao pressionando o boto Ok, ser enviado um email ao destinatrio contendo, no corpo o html, os dados do produto e o campo do
valor do preo de venda a ser alterado.

44

Ao receber o e-mail no cliente de e-mail, coloque o valor no campo Preo de Venda


R$ e clique em Enviar.
Garanta que o Scheduler esteja ativo e a funo de recebimento de mensagens do
Workflow esteja agendada (faa o agendamento de 1 em 1 minuto para que a
resposta seja quase prontamente processada). Passados alguns segundos, consulte
o cadastro do produto recm-includo e veja que o preo de venda foi atualizado
com o valor informado no e-mail.

45

PASSO 8 Consultas (Rastreabilidade de processo)


A qualquer momento, podero ser realizadas consultas na janela de rastreabilidade
para saber em que situao est um determinado processo. A partir da opo de
menu Miscelnea | Workflow | Rastreabilidade no prprio ambiente de
compras (ou qualquer outro), possvel realizar tais consultas.

No campo Pesq Padro:, selecione a pesquisa padro WFSB1 e, no campo


Processo:, pressione F3 para realizar a pesquisa da tabela SB1 (produtos). Ao
selecionar o produto, voc ter algumas informaes inerentes ao processo gerado
para o produto escolhido. Observe que todos os textos que inclumos atravs do
mtodo oprocess:track(...) sero vistos nesta janela.

46

PASSO 9 Consultas (Processo por usurios)


A qualquer momento, o usurio do sistema poder realizar consultas sobre
pendncias geradas pelo Workflow, simplesmente selecionando a opo de menu
Miscelnea | Workflow | Processos Usuarios disponvel nos ambientes.

Se o usurio atual for administrador, ele poder ver as pendncias geradas para
qualquer outro usurio cadastrado no sistema. Caso contrrio, somente visualizar
as pendncias relacionadas a ele prprio.

47

Integrao com o Microsoft Visio


Verso homologada:

Microsoft Office Visio 2003

Atravs do Microsoft Visio, possvel desenhar fluxos de processos que possam


interagir com o Workflow com o uso da rastreabilidade. Caso queira-se construir
um novo fluxo de processo no Visio e que venha interagir com o Workflow, basta
usar o stencil Workflow fornecido pela Microsiga. Esse stencil (veja lista de figuras
no canto esquerdo do Visio), contm shapes (desenhos) que em suas propriedades
foram configurados para interagir com o Workflow.
Caso queira-se incluir qualquer outro shape que no faa parte do stencil Workflow,
no h problemas. S no ser possvel interagir com o evento duplo click do
mouse para executar uma funo de usurio.

48

Aps criar o arquivo .vsd (visio document) relacionado ao processo, especifique-o


no cadastro de processo no campo Arquivo .vsd:.

Ao pressionar o boto Microsoft Visio, a partir do browser de cadastro de


processos, ser aberto o .vsd automaticamente pelo aplicativo Microsoft Visio.

49

O boto Visio template, localizado no browser de cadastro de processos,


responsvel por cadastrar as propriedades dos shapes na tabela WFCxxx (em que
xxx refere-se ao cdigo da empresa) do banco de dados no Protheus. Esse cadastro
faz- se necessrio para identificar e nomear cada um dos shapes contido no fluxo.
Os nomes associados aos shapes sero identificados nas linhas de programas
atravs do mtodo :Track(...) pertencente a classe TWFProcess().
Exemplo:
cCodigoStatus := 100400
cEmail := aprovador@dominio.com.br
cDescricao := Aprovao enviado para: + cEmail
cNomeUsuario := Subs(cUsuario,7,15)
cVisioShape := ENVIAR_SOLICITACAO
oProcess:Track( cCodigoStatus, cDescricao, cNomeUsuario, cVisioShape )
oProcess:cTo := cEmail
oProcess:Start()
Return nil

50

Aps pressionar o boto Visio template, o Microsoft Visio abrir o arquivo .vsd
relacionado ao processo e bastar pressionar duas vezes o boto do mouse (doubl
click) sobre cada shape para que a janela de cadastro de propriedades seja exibida.

Templates Propriedades dos shapes


Campo
Shape Id

Nome
Shape

Descr
Shape

Descrio
Cdigo interno
de controle do
Microsoft Visio.
Somente
leitura.
O prprio Visio
sugere um
nome para
este shape.
Porm, poder
ser modificado
para melhor
identific-lo no
programa.
Descrio do
passo a que
este shape
est associado
ao fluxo do
processo.

51

Templates - Propriedades dos Shapes


Campo
Dependnci
a

Ao

Descrio
Causa uma
dependncia
de execuo
desse shape
em relao ao
selecionado.
Neste caso, s
poder ser
executado se o
selecionado
estiver sido
executado
anteriormente.
Funo de
usurio a ser
executado,
caso seja
pressionado
duas vezes o
boto do
mouse (doubl
ckick).

Cada shape contido no stencil Workflow responsvel por um tipo de evento (ao)
a ser executado no Protheus. Alguns shapes possuem janelas padres de dilogo
aps serem selecionados com o duplo clique do mouse durante a apresentao do
fluxo de processo. Essas janelas s aparecero nos casos em que no for informada
a funo de usurio ao shape selecionado.
Observe os tipos de janelas padres existentes:

Propriedades
Shape

Janela de dilogo

Descrio

Realiza uma
nova pesquisa
de processo.

52

Apresenta a
data e a hora
em que foi
enviada a
mensagem ao
destinatrio e
a data e a hora
em que o
Workflow
recebeu a
resposta.

Apresenta
todos os
timeouts
relacionados
ao processo e
informa a
situao atual
de cada um
deles,
permitindo
alterar o
tempo de
execuo, bem
como remover
da lista de
execuo.

Possibilita a
finalizao do
processo atual.

53

Se o aplicativo Microsoft Visio for localizado no sistema operacional do usurio, o


boto Visio ser exibido na janela de rastreabilidade.

O Microsoft Visio exibir o fluxo do processo e colorir em verde o trajeto em que


foi executado pelo processo e o vermelho a situao inversa.

54

Realizando uma nova pesquisa ...

Verificando os timeouts associados ao processo...

55

Verificando o destinatrio...

Finalizando um processo a partir do Visio...

56

Exerccio Aprovao de Pedido de Compras


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 mtodo Track() da classe TWFProcesso com o uso dos shapes.
Passo 1 Criar um novo campo na tabela SC7 (pedido de compras)
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 cdigo do processo
relacionado ao pedido na janela de rastreabilidade.
Passo 2 Criar uma nova pesquisa padro no SXB
Crie uma nova pesquisa no SXB com o nome WFSC7 que faa referncia tabela
SC7 e retorne o contedo do campo C7_WFID.
Passo 3 Microsoft Visio Document (.vsd)
Crie um fluxo de processo de pedido de compras com o Microsoft Visio e grave na
pasta do Workflow com o nome PEDCOMPRAS.VSD.
Modelo exemplo:

57

Passo 4 Cadastro Visio Template


A partir do boto Visio Template no browser do cadastro de processos,
cadastre todos os shapes relacionados ao fluxo de processo.

Use para cada um dos shapes apresentados no fluxo os seguintes nomes e, em


seguida, confirme pressionando o boto OK:
Shape

Nome Shape
INICIO

INCLUSAO

ENVIAR

APROVADOR_A

TIMEOUT

58

TIMEOUTS

REENVIO

APROVADOR_B

RECEBE

APROVADO?

APROVA

NOTIFICACAO

SOLICITANTE

TERMINO
Passo 5 Cadastro de processos
A partir do configurador, selecione a opo de menu Ambiente | Workflow |
Processos Workflow e crie um novo processo, conforme o contedo dos campos
apresentados na tabela abaixo:
Campo
Cdigo
Descrio
Pesq Padro
Arquivo .vsd

Conteudo
PEDCOM
APROVACAO DE PEDIDO DE COMPRAS
WFSC7 - PEDIDO DE COMPRAS
C:\MP8\AP_DATA\WORKFLOW\PEDCOMPRAS.VSD

* O arquivo .vsd poder existir em outros lugares, basta informar o caminho e


nome do arquivo a ser usado.

59

PASSO 6 Cadastro de Status


Ainda no configurador, selecione a opo de menu Ambiente | Workflow |
Status Workflow e cadastre alguns status para o processo mencionado acima,
conforme o contedo dos campos apresentados abaixo:
Cd Processo
PEDCOM
PEDCOM
PEDCOM
PEDCOM
PEDCOM
PEDCOM
PEDCOM
PEDCOM
PEDCOM
PEDCOM

Cd Status
100100
100200
100300
100400
100500
100600
100700
100800
100900
101000

Descrio
INICIO
GERANDO A SOLICITACAO
ENVIANDO MENSAGEM
RECEBENDO APROVACAO
PEDIDO APROVADO
PEDIDO REPROVADO
ENVIANDO NOTIFICACAO
EXECUTANDO TIMEOUT
REENVIANDO SOLICITACAO
FINALIZANDO PROCESSO

PASSO 7 Criar dois htmls modelos para o processo


Criar dois htmls modelos chamado WFW120P1.htm (utilizado para aprovao) e
WFW120P2.htm (utilizado para notificao) no diretrio \WORKFLOW (abaixo do
rootpath do protheus).
WFW120p1.htm (modelo para aprovao do pedido)

60

Cdigo 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>Aprovao 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 Observao obrigatrio, favor informar o motivo da reprovao.");
}
else
{
AForm.submit();
alert("Sua mensagem foi enviada.");
}
}
</script><noscript>
<pre><font color="#FF0000" size="2"
face="Verdana"><b>%WFAvisoJS%</b></font></pre>
</noscript>
<form action="mailto:%WFMailTo%" method="POST"
name="FrontPage_Form1">
<h2><font color="#FF0000" face="Verdana"><b>Aprovao de
Pedido de Compra</b></font></h2>
<p><font color="#0000FF" face="Verdana"><b>Cabealho do
Pedido</b></font></p>
<table border="1" width="845">
<tr>
<td width="100" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Emisso</b></font></td>
<td width="460" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Fornecedor</b></font></td>
<td width="253" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Nome</b></font></td>
<td width="110" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Cond.Pagto</b></font></td>
<td width="110" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Nmero</b></font></td>
</tr>
<tr>
<td width="100"><font size="2" face="Arial">!emissao!</font></td>
<td width="460"><font size="2" face="Arial">!fornecedor!</font></td>
<td width="253"><font size="2" face="Arial">!lb_nome!</font></td>
<td width="110"><font size="2" face="Arial">!lb_cond!</font></td>
<td width="110"><font size="2" face="Arial">!pedido!</font></td>
</tr>

61

</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>Descrio</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>Preo</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>Condio 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>

62

<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>APROVAO:</strong></font></h4>
<p><input type="radio" checked name="%RBAPROVA%" value="Sim">
Sim.<br>
<input type="radio" name="%RBAPROVA%" value="Nao">
No. (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>
WFW120p2.htm (modelo para notificao)

63

Cdigo 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>Aprovao de Pedido de Compra</title>
</head>
<body bgcolor="#FFFFFF">
<form action="mailto:%WFMailTo%" method="POST"
name="FrontPage_Form1">
<h2><font color="#FF0000" face="Verdana"><b>!Titulo!</b></font></h2>
<p><font color="#0000FF" face="Verdana"><b>Cabealho do
Pedido</b></font></p>
<table border="1" width="845">
<tr>
<td width="100" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Emisso</b></font></td>
<td width="460" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Fornecedor</b></font></td>
<td width="253" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Nome</b></font></td>
<td width="110" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Cond.Pagto</b></font></td>
<td width="110" bgcolor="#99CCFF"><font size="2"
face="Verdana"><b>Nmero</b></font></td>
</tr>
<tr>
<td width="100"><font size="2" face="Arial">%emissao%</font></td>
<td width="460"><font size="2"
face="Arial">%fornecedor%</font></td>
<td width="253"><font size="2" face="Arial">%lb_nome%</font></td>
<td width="110"><font size="2" face="Arial">%lb_cond%</font></td>
<td width="110"><font size="2" face="Arial">%pedido%</font></td>
</tr>
</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>Descrio</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>Preo</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>

64

<td bgcolor="#01C5FE"><strong>Condio 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>

65

Passo 8 Criar um processo de Workflow a partir do ponto de entrada


A partir do IDE, crie um arquivo de programa chamado WFW120p1.prw e associe a
um de seus projeto. Abaixo, crie as seguintes linhas de programas que faro parte
do processo:
WFW120p.PRW
#INCLUDE PROTHEUS.CH
/*
// WFW120P Ponto de entrada do sistema do pedido de compras que ser
//
executado tanto na incluso como alterao do pedido de compras
//
a partir do boto OK.
*/
User Function WFW120p()
U_APCIniciar()
Return
/*
// APCIniciar Esta funo responsvel por iniciar a criao do processo e o
//
envio da mensagem para o destinatrio.
*/
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
// Obtenha o nmero do pedido:
cNumPed := SC7->C7_NUM
// Monte uma descrio para o assunto:
cAssunto := "Aprovacao do pedido de compras No: " + cNumPed
// Informe o caminho e o arquivo html que ser usado.
cArqHtml := "\Workflow\wfw120p1.htm"
// Obtenha o nome do usurio corrente:
cUsrCorrente := Subs(cUsuario,7,15)
// Informe a lista de destinatrios, separando-os entre ;
cDestinatario := aprovador@microsiga.com.br
// Inicialize a classe de processo:
oProcess := TWFProcess():New( "PEDCOM", cAssunto )
// Crie uma nova tarefa, informando o html template a ser utilizado:
oProcess:NewTask( "Aprovao do pedido", cArqHtml )
// Informe o nome do shape correspondente a este ponto do fluxo:
cShape := INICIO
// Informe o cdigo do status do processo correspondente a este ponto do fluxo.
cCodigoStatus := "100100"

66

cDescricao := "Iniciando processo..."


// Repasse as informaes para o mtodo track() que registrar as informaes
// para a rastreabilidade e visio.
oProcess:Track( cCodigoStatus, cDescricao, cUsrCorrente, cShape )
// Informe a funo que dever ser executada quando as respostas chegarem
// ao Workflow.
oProcess:bReturn := "U_APCRetorno"
oProcess:cSubject := cAssunto
// Determine o tempo necessrio para executar o timeout. 5 minutos ser
// suficiente para respondermos o pedido. Caso contrrio, ser executado.
oProcess:bTimeOut := {{"U_APCTimeout(1)", nDias, nHoras, nMinutos }}
// Informe qual usurio do Protheus ser responsvel por esta tarefa.
// Dessa forma, ele poder ver a pendncia na consulta por usurio.
oProcess:UserSiga := WFCodUser( APROVADOR )
oHtml := oProcess:oHTML
// Crie novas informaes a serem passadas para o mtodo Track(), baseado
// no novo passo em que o fluxo se encontra.
cShape := INCLUSAO
cCodigoStatus := "100200"
cDescricao := "Gerando solicitao de aprovao de pedido de compras..."
oProcess:Track(cCodigoStatus, cDescricao, cUsrCorrente, cShape )
// Preencha os campos contidos no html com as informaes colhidas no
// banco de dados.
oHtml:ValByName( "EMISSAO", SC7->C7_EMISSAO )
oHtml:ValByName( "FORNECEDOR", SC7->C7_FORNECE )
dbSelectArea(SA2)
dbSetOrder(1)
dbSeek(xFilial(SA2) + SC7->C7_FORNECE)
oHtml:ValByName( "lb_nome", SA2->A2_NOME )
oHtml:ValByName( "lb_cond", SC7->C7_COND )
// Obtenha as condies de pagamento.
dbSelectArea(SE4)
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 )

67

// 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 )
// Grave o novo campo criado e o ID do processo juntamente com o ID da tarefa
// para ser obtida a partir da pesquisa padro na janela da rastreabilidade.
if RecLock("SC7",.f. )
C7_WFID := oProcess:fProcessID + oProcess:fTaskID
MsUnLock("SC7")
end
dbSkip()
Enddo
oHtml:ValByName("lbValor" , Transform( nTotal,'@E 99,999.99' ) )
oHtml:ValByName("lbFrete" , Transform( 0,'@E 99,999.99' ) )
oHtml:ValByName("lbTotal" , Transform( nTotal,'@E 99,999.99' ) )
oProcess:cTo := cDestinatario
// Finalize a primeira etapa do fluxo do processo, informando em que ponto o
// fluxo do processo foi executado e, posteriormente, repasse para o mtodo
track().
cShape := ENVIAR;APROVADOR_A
cCodigoStatus := 100300
cDescricao := "Enviando solicitacao para: " + cDestinatario
oProcess:Track( cCodigoStatus, cDescricao, cUsrCorrente, cShape )
// Neste ponto, o processo ser criado e ser enviada uma mensagem para a lista
// de destinatrios.
oProcess:Start()
Return

68

/*
// APCRetorno Esta funo responsvel por atualizar o pedido de compras
//
com as respostas vindas do aprovador.
*/
User Function APCRetorno(oProcess)
Local cFindKey, cAssunto, cNumPed, cShape, cCodigoStatus, cDescricao
// Obtenha o nmero do pedido:
cNumPed := oProcess:oHtml:RetByName(Pedido)
// Monte a lista de argumentos para ser passada para o mtodo track():
// Pode ser informado mais do que um nome de shape para uma mesma
// ao do fluxo. Basta inform-los utilizando o ; para identificar cada um deles.
cAssunto := Pedido de compras no: + cNumPed
cShape := RECEBE;REMETENTE;APROVADO?
cCodigoStatus := 100400
cDescricao := "Recebendo resultado aprovao..."
oProcess:Track( cCodigoStatus, cDescricao,,cShape )
// Verifique se a resposta diferente de SIM, ou seja, reprovado.
if Upper(oProcess:oHtml:RetByName(RBAPROVA)) <> SIM
dbSelectarea("SCR") // Posicione a liberao
dbSetorder(2)
If dbSeek( xFilial("SCR") + "PC" + cNumPed )
RecLock("SCR",.f.)
CR_DATALIB := dDataBase
CR_OBS := ""
CR_STATUS := "04" // Bloqueado
CR_OBS := oProcess:oHtml:RetByName('lbmotivo')
MsUnLock()
End
// Gere novas informaes a serem passadas para a rastreabilidade:
cCodigoStatus := 100600
cDescricao := cAssunto + REPROVADO
// Dessa vez, no informe nenhum shape associado reprovao por no
// haver nenhum shape relacionado reprovao.
oProcess:Track( cCodigoStatus, cDescricao )
// Execute a funo responsvel pela notificao ao usurio solicitante.
U_APCNotificar( oProcess, cDescricao )
return .t.
end
// 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 := ""

69

SCR->CR_STATUS := "03"
MsUnLock()
end
dbselectarea("SC7")
dbSetOrder(1)
cFindKey := xFilial("SC7") + cNumPed
dbSeek( cFindKey )
// Posiciona o Pedido
while !Eof() .and. ( C7_FILIAL + C7_NUM == cFindKey )
RecLock("SC7",.f.)
C7_CONAPRO := "L"
MsUnLock()
dbSkip()
end
cShape := APROVA
cCodigoStatus := 100500
cDescricao := cAssunto + APROVADO
oProcess:Track( cCodigoStatus, cDescricao,,cShape )
// Execute a funo responsvel pela notificao ao usurio solicitante.
U_APCNotificar( oProcess, cDescricao)
Return
/*
// APCNotificar Essa funo responsvel por notificar ao solicitante o
//
resultado da aprovao do pedido.
*/
User Function APCNotificar( oProcess, cDescricao )
Local oHtml
Local aValues := Array(17)
Local cNumPed, cShape, cCodigoStatus, cArqHtml
// Informe o 2 html para notificao que diferente do wfw120p1.htm
cArqHtml := "\Workflow\wfw120p2.htm"
// Gere informaes para a rastreabilidade:
cShape := NOTIFICACAO;SOLICITANTE
cCodigoStatus := 100700
oProcess:Track( cCodigoStatus, cDescricao,, cShape )
// Devido os htmls serem diferentes, no ser possvel usar o terceiro parmetro
// com o valor .T. no mtodo NewTask() da classe TWFProcess(). Neste caso,
// deve-se obter todas as informaes necessrias para montar o novo html
// para notificao ao solicitante.
oHtml := oProcess:oHtml
aValues[01]
aValues[02]
aValues[03]
aValues[04]
aValues[05]
aValues[06]
aValues[07]
aValues[08]
aValues[09]

:=
:=
:=
:=
:=
:=
:=
:=
:=

oHtml:ValByName("EMISSAO")
oHtml:ValByName("FORNECEDOR")
oHtml:ValByName("lb_nome")
oHtml:ValByName("lb_cond")
oHtml:ValByName("PEDIDO")
oHtml:ValByName("Produto.item")
oHtml:ValByName("Produto.codigo")
oHtml:ValByName("Produto.descricao")
oHtml:ValByName("Produto.quant")

70

aValues[10]
aValues[11]
aValues[12]
aValues[13]
aValues[14]
aValues[15]
aValues[16]
aValues[17]

:=
:=
:=
:=
:=
:=
:=
:=

oHtml:ValByName("Produto.preco")
oHtml:ValByName("Produto.total")
oHtml:ValByName("Produto.unid")
oHtml:ValByName("Produto.entrega")
oHtml:ValByName("Produto.condPag")
oHtml:ValByName("lbValor")
oHtml:ValByName("lbFrete")
oHtml:ValByName("lbTotal")

// Aps obter as informaes desejadas, crie uma nova tarefa:


oProcess:NewTask("Resultado da Aprovao", cArqHtml )
oHtml := oProcess:oHtml
// Repasse as informaes do outro html para esse novo.
oHtml:ValByName("EMISSAO", aValues[01] )
oHtml:ValByName("FORNECEDOR", aValues[02] )
oHtml:ValByName("lb_nome", aValues[03] )
oHtml:ValByName("lb_cond", aValues[04] )
oHtml:ValByName("PEDIDO", aValues[05] )
AEval( aValues[06],{ |x| AAdd( oHtml:ValByName( "produto.item" ), x ) } )
AEval( aValues[07],{ |x| AAdd( oHtml:ValByName( "produto.codigo" ), x ) } )
AEval( aValues[08],{ |x| AAdd( oHtml:ValByName( "produto.descricao" ), x ) } )
AEval( aValues[09],{ |x| AAdd( oHtml:ValByName( "produto.quant" ), x ) } )
AEval( aValues[10],{ |x| AAdd( oHtml:ValByName( "produto.preco" ), x ) } )
AEval( aValues[11],{ |x| AAdd( oHtml:ValByName( "produto.total" ), x ) } )
AEval( aValues[12],{ |x| AAdd( oHtml:ValByName( "produto.unid" ), x ) } )
AEval( aValues[13],{ |x| AAdd( oHtml:ValByName( "produto.entrega" ), x ) } )
AEval( aValues[14],{ |x| AAdd( oHtml:ValByName( "produto.condPag" ), x ) } )
oHtml:ValByName( "lbValor", aValues[15])
oHtml:ValByName( "lbFrete", aValues[16])
oHtml:ValByName( "lbTotal", aValues[17])
oHtml:ValByName( "Titulo", cDescricao )
// Informe o endereo eletrnico do solicitante. Esta informao pode estar
// armazenada em um campo na tabela SC7, por exemplo:
oProcess:cTo := solicitante@microsiga.com.br
oProcess:cSubject := "Retorno da Aprovacao do Pedido de Compras"
// Envie a mensagem para o solicitante:
oProcess:Start()
// Como no houve informaes geradas para essa tarefa nos campos bReturn
// e bTimeout, esse processo ser finalizado automaticamente. De qualquer
// forma, informe, na rastreabilidades sobre esse passo alcanado no fluxo.
cShape := TERMINO
cCodigoStatus := 101000
cDescricao := "Termino do processo"
oProcess:Track( cCodigoStatus, cDescricao,, cShape )
Return
/*
// APCTimeout Esta funo responsvel pela execuo do timeout
//
do processo.
*/
User Function APCTimeOut( nVezes, oProcess )
Local nDias := 0, nHoras := 0, nMinutos := 10

71

Local cNumPed, cShape, cCodigoStatus, cDescricao, cArqHtml


// Informe o html:
cArqHtml := "\Workflow\wfw120p1.htm"
// Obtenha o nmero do pedido:
// Veja que o mtodo Valbyname() deve ser usado na funo de timeout.
cNumPed := oProcess:oHtml:ValByName(Pedido)
// Verifique o nmero de vezes que o timeout foi executado para este processo.
If ( nVezes == 1 )
// Se for a primeira vez, finalize a tarefa anterior.
oProcess:Finish()
// Crie uma nova tarefa de reenvio, aproveitando as mesmas informaes do
// html preenchido anteriormente atravs do terceiro parmetro do mtodo
// NewTask(), usando o valor .T. (verdadeiro).
oProcess:NewTask("Reenvio de aprovao", cArqHtml, .t. )
// Determine uma nova informao a ser gravada na rastreabilidade.
cShape := TIMEOUT
cCodigoStatus := 100800
cDescricao := "Executando timeout"
oProcess:Track( cCodigoStatus, cDescricao,, cShape )
oProcess:cTo := "aprovador@microsiga.com.br"
oProcess:bReturn := "U_APCRetorno"
// Desta vez, informe ao timeout que ser for executado, ser pela segunda vez.
oProcess:bTimeOut := {{"U_APCTimeout(2)", nDias, nHoras, nMinutos }}
// Incremente o assunto da mensagem para ficar ressaltado que se trata
// de um reenvio indicando o timeout.
oProcess:cSubject := "(Timeout)" + oProcess:cSubject
// Prepare novas informaes a serem inseridas na rastreabilidade.
cShape := REENVIO;APROVADOR_B
cCodigoStatus := 100900
cDescricao := "Reenviando aprovacao do pedido de compras no. " + cNumPed
oProcess:Track( cCodigoStatus, cDescricao,, cShape )
// Gere o processo e envie a mensagem.
oProcess:Start()
else
// Envie uma notificao ao usurio, indicando que o processo foi descartado.
cDescricao := Pedido de compras no. + cNumPed + no foi atendido.
U_APCNotificar(oProcess, cDescricao )
end
Return

72

PASSO 9 Compilar e executar o mdulo de compras


Aps compilar o programa WFW120P.PRW, execute o ambiente de compras,
selecione a opo de menu Atualizaes | Pedidos | Pedidos de Compras e
inclua um novo pedido. Ao confirmar a gravao pressionando o boto Ok, ser
enviado um e-mail ao aprovador.

Garanta que o Scheduler esteja ativo e a funo de recebimento de mensagens do


Workflow esteja agendada (faa o agendamento de 1 em 1 minuto para que essa
resposta seja quase prontamente processada ). Passados alguns minutos aps
responder o e-mail (1 a 2 minutos no mximo), verifique se o pedido foi ou no
aprovado.
PASSO 10 Consultas (rastreabilidade de processo)
A qualquer momento, podero ser realizadas consultas na janela de rastreabilidade
para saber a situao em que se encontra um determinado processo. A partir da
opo de menu Miscelnea | Workflow | Rastreabilidade, no prprio
ambiente de compras( ou qualquer outro ), possvel realizar tais consultas.

No campo Pesq Padro:, selecione a pesquisa padro WFSC7 e, no campo


Processo:, pressione F3 para realizar a pesquisa da tabela SC7 (pedido de
compras). Ao selecionar o pedido, voc ter algumas informaes inerentes ao

73

processo gerado para o produto escolhido. Observe que todos os textos que
inclumos atravs do mtodo oprocess:track(...) sero vistos nesta janela.

Iniciar o navegador Internet Explorer.lnk

74

PASSO 11 Consultas (Processo por usurios)


A qualquer momento, o usurio do sistema poder realizar consultas sobre
pendncias geradas pelo Workflow, simplesmente selecionando a opo de menu
Miscelnea | Workflow | Processos Usuarios disponvel nos ambientes.

Se o usurio atual for administrador, ele poder ver as pendncias geradas para
qualquer outro usurio cadastrado no sistema. Caso contrrio, somente poder ver
as pendncias relacionadas a ele mesmo.

75

76

Glossrio

Autenticao SMTP: validao de usurio e senha no servidor de e-mail


para envio de mensagens.
Browser internet: programa que permite navegar nas pginas disponveis
na internet. O Internet Explorer um exemplo de browser.
Caixa de correio: nome dado a um diretrio em que sero armazenadas
todas as mensagens recebidas, a enviar, enviadas etc. Em agrupamento de
pastas nomeadas inbox, outbox, sent etc. pertencentes a uma determinada
conta de e-mail.
Cliente de e-mail: sofware de controle de e-mails pelo usurio final.
Exemplos: OutLook Express e OutLook XP.
Conta de e-mail: endereo de e-mail existente em um servidor de e-mail.
Cookies: arquivos gravados na estao do usurio, pelos diversos sites,
para leitura de informaes daquela estao.
Html (Hyper Text Mark-up Language): um arquivo no formato texto
que contm diversos tipos de comando que controlam a apresentao visual
no browser internet.
Java Script: linguagem contida nos HTMLs, permitindo validaes e aes
diversas.
Messenger do Protheus: recurso disponvel no Protheus que serve para
avisar aos usurios de algum processo ou mensagem de Workflow que
esteja disponvel no aguardo de uma ao a ser tomada.
Processo: conjunto de tarefas a serem executadas, baseadas em uma
regra de negcio que determina um ou mais caminhos a serem seguidos
denominados fluxo.
Protocolo POP3 ou IMAP: recurso disponvel pelos servidores de e-mails
para permitir o acesso caixa de correio (leitura).
Protocolo SMTP: recurso disponvel pelos servidores de e-mails para o
envio de mensagens atravs de uma conta de e-mail.
Rastreabilidade: recurso necessrio para localizar e identificar as
propriedades (status, descrio, data, participante etc.) de um determinado
processo de Workflow.
Retorno: conjunto de respostas obtidas por e-mail ou pela postagem de um
html via browser internet, atravs do servio http que sero usados para
realizar atualizaes na base de dados do Protheus.
Servio http: servio utilizado pelos servidores internet que disponibiliza
aos usurios o acesso internet.
Servidor de e-mail: software de controle de envios e recebimento de emails. Exemplos: Exchange e Domino.

77

Timeout: tempo fora do prazo limite (tempo excedido). Procedimento a ser


executado aps o tempo limite esperado por uma ao a ser tomada por um
participante na trajetria de um fluxo de processo.
Workflow: automao do fluxo de processo.

78

Вам также может понравиться