Changes between Version 14 and Version 15 of WF/Tutorialdedesenvolvimentodeumprocessosimples


Ignore:
Timestamp:
03/19/08 16:22:42 (16 years ago)
Author:
viani
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • WF/Tutorialdedesenvolvimentodeumprocessosimples

    v14 v15  
    22[[WikiInclude(WF/tableofcontents)]] 
    33 
    4 Neste documento, será abordada uma estratégia para desenvolvimento de um processo de Workflow. Utilizando esta estratégia, será desenvolvido um processo simples. Ao final de cada seção, esta será exemplificada no processo que está sendo desenvolvido. 
     4Nesta sequência de documentos, será abordada uma estratégia para desenvolvimento de um processo de Workflow. Utilizando esta estratégia, será desenvolvido um processo simples. Cada etapa será exemplificada no processo que está sendo desenvolvido. 
    55 
    6 == Desenvolvimento de um Processo == 
     6O roteiro de desenvolvimento pode, grosseiramente, ser dividido em quatro etapas: 
    77 
    8 O processo de desenvolvimento pode, grosseiramente, ser dividido em três etapas: 
    9  
    10  1. Especificação 
    11  1. Projeto 
    12  1. Implementação 
    13  
    14 == Especificação == 
    15  
    16 Esta etapa é realizada através de reuniões como cliente que solicitou o processo de Workflow.Todos os dados relevantes ao processo devem ser documentados,conforme indicado no documento [wiki:WF/Documentacaominimadeprojeto Documentação mínima do Projeto]. Ao final desta etapa,o modo como o processo irá funcionar deve estar bem definido. 
    17  
    18 No nosso exemplo, devemos desenvolver um processo que gerencie "Solicitações". Antes de ser executada, a solicitação deve ser avaliada e aprovada por um distribuidor (pessoa que gerencia as solicitações). Dessa forma, temos dois caminhos distintos: 
    19  
    20  1. Caso a solicitação seja aprovada, ela vai para execução de um técnico que descreve o procedimento que foi feito para solucionar o problema. Ao final da execução, o solicitante recebe um e-mail passando informações sobre sua solicitação; 
    21  1. Caso a solicitação seja rejeitada, o solicitante recebe um e-mail informando sobre sua solicitação. 
    22  
    23 ---- 
    24  
    25 == Projeto == 
    26  
    27 Nesta etapa os dados obtidos na etapa de especificação são mapeados para a realidade do Workflow. E, é possível definir alguns dados sobre o processo, por exemplo: quantos perfis ele terá, o número de atividades, o relacionamento entre elas, etc. 
    28  
    29 No nosso exemplo podemos perceber claramente a existência de três perfis: 
    30  
    31  1. Solicitante: grupo de pessoas que podem fazer solicitações; 
    32  1. Distribuidor: grupo de pessoas que avaliam as solicitações; 
    33  1. Técnico: grupo de pessoas que executam as solicitações aprovadas. 
    34  
    35 As atividades são quatro: 
    36  
    37  1. Compor Solicitação: o perfil "solicitante" faz uma solicitação; 
    38  1. Avaliar: o perfil "distribuidor" avalia a solicitação; 
    39  1. Executar: o perfil "tecnico" executa as solicitações aprovadas; 
    40  1. Informar Resultado: o perfil "solicitante" vê as informações referentes à sua solicitação. 
    41  
    42 Possíveis caminhos de execução: 
    43  
    44  1. Compor Solicitação -> Avaliar (Aprovada) -> Executar -> Informar Resultado 
    45  1. Compor Solicitação -> Avaliar (Rejeitada) -> Informar Resultado 
    46  
    47 === Criação do Fluxo === 
    48  
    49 Um dos passos mais importantes no desenvolvimento de um processo de Workflow é definir o fluxo do processo. O fluxo consiste no relacionamento das atividades através de transições. É importante também, quando retratar o fluxo, informar os perfis relacionados a cada atividade. 
    50  
    51 O resultado da criação do fluxo é um dos mais importantes documentos para o processo de Workflow e que por si só é capaz de demonstrar o funcionamento de todo o sistema. 
    52  
    53 No nosso exemplo, foi criado o seguinte fluxo: 
    54  
    55 [[Image(htdocs:wf/images/tutorial_solicitacoes.png)]] 
    56  
    57 === Criação do Processo === 
    58  
    59 Uma vez definido o fluxo do processo, é possível mapeá-lo para a engine do Workflow que estamos utilizando. Após esta etapa, cada uma das atividades que compõem o processo podem ser codificadas, dando funcionalidade às mesmas. 
    60  
    61 No nosso exemplo, vamos desenvolver esta etapa na seguinte ordem: 
    62  
    63  1. Criar o Processo; 
    64  1. Criar as Atividades / Transições / Perfis; 
    65  1. Mapear os Perfis. 
    66  
    67 ==== Criar o processo ==== 
    68  
    69 Na interface de Administração de [wiki:WF/Processos Processos], preenchemos: 
    70  
    71 {{{ 
    72  
    73    Nome do processo: Solicitações 
    74  
    75    Descrição: Processo de gerenciamento de solicitações 
    76  
    77 }}} 
    78  
    79 Para os outros campos, utilizam-se os valores padrões. 
    80  
    81 Clicamos no botão "criar". 
    82  
    83 ==== Criar as atividades / Transições / Perfis ==== 
    84  
    85 Selecione a opção "Atividades". 
    86  
    87 Quando o processo é criado, duas atividades são criadas com ele: a atividade do tipo start e de nome "start" e a atividade do tipo end e de nome "end". 
    88  
    89 Selecionamos a atividade "start" e, mudamos / preenchemos os seguintes campos: 
    90  
    91 {{{ 
    92  
    93    Nome: Compor Solicitação 
    94  
    95    Descrição: Atividade para o solicitante compor uma solicitação 
    96  
    97    Interativa: marcar opção 
    98  
    99    Roteamento Automático: marcar opção 
    100  
    101    Adicionar perfil: 
    102  
    103     Nome: solicitante 
    104  
    105     Descrição: autorizados a compor solicitações 
    106  
    107 }}} 
    108  
    109 Clicamos em "salvar". 
    110  
    111 Selecionamos a atividade "end" e, mudamos / preenchemos os seguintes campos: 
    112  
    113 {{{ 
    114  
    115    Nome: Informar Resultado 
    116  
    117    Descrição: Atividade para informar o solicitante sobre sua solicitação 
    118  
    119    Interativa: marcar opção 
    120  
    121    Roteamento Automático: marcar opção 
    122  
    123    Usar perfis existentes: 
    124  
    125     Selecionar "solicitante" 
    126  
    127     Clicamos em "salvar". 
    128  
    129 }}} 
    130  
    131 Clicamos em "novo". 
    132  
    133 Preenchemos os seguintes campos: 
    134  
    135 {{{ 
    136  
    137    Nome: Executar 
    138  
    139    Descrição: Atividade para o técnico executar uma solicitação 
    140  
    141    Tipo: activity 
    142  
    143    Interativa: marcar opção 
    144  
    145    Roteamento Automático: marcar opção 
    146  
    147    Adicionar Transições: 
    148  
    149     Adicionar transições para: "Informar Resultado" 
    150  
    151    Adicionar perfil: 
    152  
    153     Nome: tecnico 
    154  
    155     Descrição: autorizados a executar solicitações 
    156  
    157 }}} 
    158  
    159 Clicamos em "salvar". 
    160  
    161 Clicamos em "novo". 
    162  
    163 Preenchemos os seguintes campos: 
    164  
    165 {{{ 
    166  
    167    Nome: Avaliar 
    168  
    169    Descrição: Atividade para o distribuidor avaliar uma solicitação 
    170  
    171    Tipo: switch 
    172  
    173    Interativa: marcar opção 
    174  
    175    Roteamento Automático: marcar opção 
    176  
    177    Adicionar Transições: 
    178  
    179     Adicionar transições de: "Compor Solicitação" 
    180  
    181     Adicionar transições para: "Executar" e "Informar Resultado" 
    182  
    183    Adicionar perfil: 
    184  
    185     Nome: distribuidor 
    186  
    187     Descrição: autorizados a avaliar solicitações 
    188  
    189 }}} 
    190  
    191 Clicamos em "salvar". 
    192  
    193 ==== Mapear os Perfis ==== 
    194  
    195 Clicamos em "Perfis" 
    196  
    197 Na área "Mapear usuários/grupos a perfis", selecionamos um dos perfis (no lado direito) e adicionamos os usuários que pertencem a este perfil. Depois, clicamos em "Mapear". 
    198  
    199 Para finalizar, basta repetir este mesmo passo para os outros dois perfis. 
    200  
    201 ---- 
    202  
    203 == Implementação == 
    204  
    205 Nesta etapa é feita a codificação das atividades que foram criadas na etapa anterior. Será utilizada a arquitetura [http://pt.wikipedia.org/wiki/MVC MVC (Model-View-Controller)]. Consulte o documento [wiki:WF/ArquiteturadeDesenvolvimento Arquitetura  de Desenvolvimento] para saber mais detalhes de como a mesma está implementada no Workflow do Expresso. 
    206  
    207 Insira os códigos, lista dos abaixo,nos respectivos arquivos. Utilize, para isso, o editor de códigos Php que já vem embutido no Workflow. (Veja o documento [wiki:WF/Edicaodecodigo Edição de Código]. 
    208  
    209 ==== Atividades ==== 
    210  
    211 '''Avaliar.php''' 
    212  
    213 {{{ 
    214  
    215 <?php 
    216  
    217 $application = new AvaliarController(new AvaliarModel($env), $env); 
    218 $application->run($_REQUEST['action']); 
    219  
    220 ?> 
    221  
    222 }}} 
    223  
    224  
    225 '''Compor_Solicitao.php''' 
    226  
    227 {{{ 
    228  
    229 <?php 
    230  
    231 $application = new ComporSolicitacaoController(new ComporSolicitacaoModel($env), $env); 
    232 $application->run($_REQUEST['action']); 
    233  
    234 ?> 
    235  
    236 }}} 
    237  
    238 '''Executar.php''' 
    239  
    240 {{{ 
    241  
    242 <?php 
    243  
    244 $application = new ExecutarController(new ExecutarModel($env), $env); 
    245 $application->run($_REQUEST['action']); 
    246  
    247 ?> 
    248  
    249 }}} 
    250  
    251 '''Informar_Resultado.php''' 
    252  
    253 {{{ 
    254  
    255 <?php 
    256  
    257 $application = new InformarResultadoController(new InformarResultadoModel($env), $env); 
    258 $application->run($_REQUEST['action']); 
    259  
    260 ?> 
    261  
    262 }}} 
    263  
    264 ==== Templates ==== 
    265  
    266 '''templates/Avaliar.tpl''' 
    267  
    268 {{{ 
    269  
    270 {include file="info_solicitacao.tpl"} 
    271  
    272 <br> 
    273 <input type="submit" name="action" value="Aprovar" /> 
    274 <input type="submit" name="action" value="Rejeitar" /> 
    275  
    276 }}} 
    277  
    278 '''templates/Compor_Solicitao.tpl''' 
    279  
    280 {{{ 
    281  
    282 <table> 
    283         <tr> 
    284                 <td><label>Título</label></td> 
    285                 <td><input type="text" name="titulo" value="{$titulo}" /></td> 
    286         </tr> 
    287         <tr> 
    288                 <td><label>Descrição</label></td> 
    289                 <td><textarea name="descricao">{$descricao}</textarea></td> 
    290         </tr> 
    291 </table> 
    292  
    293 <input type="submit" name="action" value="Enviar" /> 
    294  
    295 }}} 
    296  
    297 '''templates/Executar.tpl''' 
    298  
    299 {{{ 
    300  
    301 {include file="info_solicitacao.tpl"} 
    302  
    303 <br/> 
    304  
    305 <strong>Procedimento Executado:</strong><br/> 
    306 <textarea name="procedimento" cols="50" rows="7"></textarea><br/> 
    307 <input type="submit" name="action" value="Finalizar" /> 
    308  
    309 }}} 
    310  
    311 '''templates/Informar_Resultado.tpl''' 
    312  
    313 {{{ 
    314  
    315 {include file="info_solicitacao.tpl"} 
    316 <br/> 
    317 <table> 
    318         <tr> 
    319                 <td><strong>Mensagem</strong></td> 
    320                 <td>{$mensagem|nl2br}</td> 
    321         <tr> 
    322 </table> 
    323  
    324 <input type="submit" name="action" value="Encerrar" /> 
    325  
    326 }}} 
    327  
    328 '''templates/info_solicitacao.tpl''' 
    329  
    330 Por padrão, o Workflow cria um arquivo tpl para cada atividade interativa do processo. O arquivo info_solicitacao.tpl não corresponde a uma atividade, mas sim a um trecho de código que será incluído em outros arquivos tpl. Por isso, não estará na lista de arquivos já existentes, e deverá ser criado através da interface de código, aba templates, da seguinte maneira: 
    331  
    332   1 - Clique no botão 'Novo template'; 
    333  
    334   2 - Escolha a opção 'em_branco.tpl'; 
    335  
    336   3 - Informe o nome do arquivo e clique em OK 
    337  
    338   4 - Inclua o código abaixo 
    339  
    340 {{{ 
    341  
    342 <table> 
    343         <tr> 
    344                 <td><strong>Solicitante</strong></td> 
    345                 <td>{$solicitante_desc}</td> 
    346         </tr> 
    347         <tr> 
    348                 <td><strong>Data</strong></td> 
    349                 <td>{$data}</td> 
    350         </tr> 
    351         <tr> 
    352                 <td><strong>Título</strong></td> 
    353                 <td>{$titulo}</td> 
    354         </tr> 
    355         <tr> 
    356                 <td><strong>Descrição</strong></td> 
    357                 <td>{$descricao|nl2br}</td> 
    358         </tr> 
    359 </table> 
    360  
    361 }}} 
    362  
    363 ==== Includes ==== 
    364  
    365 Os próximos arquivos devem ser incluídos de forma semelhante como foi feito para o arquivo info_solicitação.tpl anteriormente, só que desta vez será usada a aba includes, da interface de código. Para cada arquivo a ser incluído, execute: 
    366  
    367   1 - Clique no botão 'Novo Include'; 
    368   2 - Escolha a opção 'em_branco.php'; 
    369   3 - Informe o nome do arquivo e clique em OK 
    370   4 - Inclua o código correspondente 
    371  
    372 '''class.avaliar.controller.inc.php''' 
    373  
    374 {{{ 
    375  
    376 <?php 
    377  
    378 class AvaliarController extends Controller 
    379  
    380 { 
    381         function __default () 
    382         { 
    383                 $this->model->defaultAction(); 
    384                 $this->loadViewVars(); 
    385                 $this->showForm($this->AVALIAR); 
    386         } 
    387  
    388         function aprovar() 
    389         { 
    390                 $this->model->aprovarAction(); 
    391         } 
    392  
    393         function rejeitar() 
    394         { 
    395                 $this->model->rejeitarAction(); 
    396         } 
    397  
    398         function run($action) 
    399         { 
    400                 $this->dispatch($action); 
    401         } 
    402  
    403 } 
    404  
    405 ?> 
    406  
    407 }}} 
    408  
    409 '''class.avaliar.model.inc.php''' 
    410  
    411 {{{ 
    412  
    413 <?php 
    414 class AvaliarModel extends Model 
    415 { 
    416         function defaultAction() 
    417         { 
    418                 $this->updateAttributes(); 
    419                 $this->addViewVar('titulo', $this->_titulo); 
    420                 $this->addViewVar('descricao', $this->_descricao); 
    421                 $this->addViewVar('data', $this->_data); 
    422                 $this->addViewVar('solicitante_desc', $this->_solicitante_desc); 
    423  
    424                 return true; 
    425  
    426         } 
    427  
    428         function aprovarAction() 
    429         { 
    430                 $this->instance->setNextActivity('Executar'); 
    431                 $this->commitInstance(); 
    432  
    433                 return true; 
    434  
    435         } 
    436  
    437         function rejeitarAction() 
    438         { 
    439                 $this->updateAttributes(); 
    440                 $this->instance->setNextActivity('Informar Resultado'); 
    441                 $this->instance->setNextUser($this->_solicitante); /* devolve a instância para o solicitante */ 
    442                 $this->_mensagem = "Sua solicitação foi rejeitada"; 
    443                 $this->updateInstance(); 
    444                 $this->commitInstance(); 
    445  
    446                 return true; 
    447  
    448         } 
    449  
    450 } 
    451  
    452 ?> 
    453  
    454 }}} 
    455  
    456 '''class.compor.solicitacao.controller.inc.php''' 
    457  
    458 {{{ 
    459  
    460 <?php 
    461  
    462 class ComporSolicitacaoController extends Controller 
    463 { 
    464         function __default () 
    465         { 
    466                 $this->model->defaultAction(); 
    467                 $this->loadViewVars(); 
    468                 $this->showForm($this->COMPOR_SOLICITACAO); 
    469         } 
    470  
    471         function enviar() 
    472         { 
    473                 $this->model->enviarAction(); 
    474                 $this->loadViewVars(); 
    475         } 
    476  
    477  
    478         function run($action) 
    479         { 
    480                 $this->dispatch($action); 
    481         } 
    482  
    483 } 
    484  
    485 ?> 
    486  
    487 }}} 
    488  
    489 '''class.compor.solicitacao.model.inc.php''' 
    490  
    491 {{{ 
    492  
    493 <?php 
    494 class ComporSolicitacaoModel extends Model 
    495 { 
    496         function defaultAction() 
    497         { 
    498                 return true; 
    499         } 
    500  
    501         function inputValidate($form) 
    502         { 
    503                 $msgerro = Array(); 
    504  
    505                 /* título não pode ser vazio */ 
    506  
    507                 if (isset($form['titulo']) && !empty($form['titulo'])) 
    508                         $this->_titulo = $form['titulo']; 
    509                 else 
    510                         $msgerro[] = 'É necessário fornecer um título'; 
    511  
    512  
    513                 if (isset($form['descricao']) && !empty($form['descricao'])) 
    514                         $this->_descricao = $form['descricao']; 
    515                 else 
    516                         $msgerro[] = 'É necessário fornecer uma descrição'; 
    517  
    518                 return $msgerro; 
    519  
    520         } 
    521  
    522         function enviarAction() 
    523         { 
    524                 /* se não houve erros */ 
    525                 if (count($this->activity->error = $this->inputValidate($this->request)) == 0) 
    526                 { 
    527  
    528                         $this->_solicitante = $this->getWfProperty('wf_user_id'); 
    529                         $this->_solicitante_desc = $this->getWfProperty('wf_user_cnname'); 
    530                         $this->_data = date('d/m/Y H\hi'); 
    531                         $this->updateInstance(); 
    532                         $this->commitInstance(); 
    533  
    534                 return true; 
    535                 } 
    536                 else 
    537  
    538                 { 
    539                         $this->addViewVar('titulo', $this->_titulo); 
    540                         $this->addViewVar('descricao', $this->_descricao); 
    541                         return false; 
    542  
    543                 } 
    544  
    545         } 
    546  
    547 } 
    548  
    549 ?> 
    550  
    551 }}} 
    552  
    553 '''class.controller.inc.php''' 
    554  
    555 {{{ 
    556  
    557 <?php 
    558  
    559 class Controller extends BaseController 
    560  
    561 { 
    562  
    563         var $COMPOR_SOLICITACAO = 'Compor_Solicitao.tpl'; 
    564         var $AVALIAR = 'Avaliar.tpl'; 
    565         var $EXECUTAR = 'Executar.tpl'; 
    566         var $INFORMAR_RESULTADO = 'Informar_Resultado.tpl'; 
    567  
    568         function Controller(&$model , &$env) 
    569         { 
    570  
    571                 $this->super(&$model , &$env); 
    572  
    573         } 
    574  
    575 } 
    576  
    577 ?> 
    578  
    579 }}} 
    580  
    581 '''class.executar.controller.inc.php''' 
    582  
    583 {{{ 
    584  
    585 <?php 
    586  
    587 class ExecutarController extends Controller 
    588 { 
    589         function __default () 
    590         { 
    591                 $this->model->defaultAction(); 
    592                 $this->loadViewVars(); 
    593                 $this->showForm($this->EXECUTAR); 
    594  
    595         } 
    596  
    597         function finalizar() 
    598         { 
    599                 $this->model->finalizarAction(); 
    600  
    601         } 
    602  
    603         function run($action) 
    604  
    605         { 
    606                 $this->dispatch($action); 
    607  
    608         } 
    609  
    610 } 
    611  
    612 ?> 
    613  
    614 }}} 
    615  
    616 '''class.executar.model.inc.php''' 
    617  
    618 {{{ 
    619  
    620 <?php 
    621  
    622 class ExecutarModel extends Model 
    623  
    624 { 
    625         function defaultAction() 
    626         { 
    627                 $this->updateAttributes(); 
    628                 $this->addViewVar('titulo', $this->_titulo); 
    629                 $this->addViewVar('descricao', $this->_descricao); 
    630                 $this->addViewVar('data', $this->_data); 
    631                 $this->addViewVar('solicitante_desc', $this->_solicitante_desc); 
    632  
    633  
    634                 return true; 
    635  
    636         } 
    637  
    638         function finalizarAction() 
    639         { 
    640                 $this->updateAttributes(); 
    641                 $this->_mensagem = "Sua solicitação foi atendida pelo técnico " 
    642                         . $this->getWfProperty('wf_user_cnname') 
    643                         . ".\n<strong>Procedimento executado:</strong>\n" . $this->request['procedimento']; 
    644                 $this->updateInstance(); 
    645                 $this->instance->setNextUser($this->_solicitante); /* devolve a instância para o solicitante */ 
    646                 $this->commitInstance(); 
    647  
    648                 return true; 
    649  
    650         } 
    651  
    652 } 
    653  
    654 ?> 
    655  
    656 }}} 
    657  
    658 '''class.informar.resultado.controller.inc.php''' 
    659  
    660 {{{ 
    661  
    662 <?php 
    663  
    664 class InformarResultadoController extends Controller 
    665 { 
    666         function __default () 
    667  
    668         { 
    669                 $this->model->defaultAction(); 
    670                 $this->loadViewVars(); 
    671                 $this->showForm($this->INFORMAR_RESULTADO); 
    672         } 
    673  
    674         function encerrar() 
    675         { 
    676                 $this->model->encerrarAction(); 
    677         } 
    678  
    679         function run($action) 
    680         { 
    681                 $this->dispatch($action); 
    682         } 
    683  
    684 } 
    685  
    686 ?> 
    687  
    688 }}} 
    689  
    690 '''class.informar.resultado.model.inc.php''' 
    691  
    692 {{{ 
    693  
    694 <?php 
    695 class InformarResultadoModel extends Model 
    696 { 
    697         function defaultAction() 
    698         { 
    699                 $this->updateAttributes(); 
    700                 $this->addViewVar('titulo', $this->_titulo); 
    701                 $this->addViewVar('descricao', $this->_descricao); 
    702                 $this->addViewVar('data', $this->_data); 
    703                 $this->addViewVar('solicitante_desc', $this->_solicitante_desc); 
    704                 $this->addViewVar('mensagem', $this->_mensagem); 
    705  
    706                 return true; 
    707         } 
    708  
    709         function encerrarAction() 
    710         { 
    711                 $this->commitInstance(); 
    712                 return true; 
    713         } 
    714  
    715 } 
    716  
    717 ?> 
    718  
    719 }}} 
    720  
    721 '''class.model.inc.php''' 
    722  
    723 {{{ 
    724  
    725 <?php 
    726 class Model extends BaseModel 
    727 { 
    728         var $_titulo; 
    729         var $_descricao; 
    730         var $_solicitante; 
    731         var $_solicitante_desc; 
    732         var $_data; 
    733         var $_mensagem; 
    734  
    735         function Model(&$env) 
    736         { 
    737                 $this->super(&$env); 
    738  
    739         } 
    740  
    741 } 
    742  
    743 ?> 
    744  
    745 }}} 
    746  
    747 '''shared.php''' 
    748  
    749 {{{ 
    750  
    751 <?php 
    752  
    753 //camada de controle do processo 
    754  
    755 wf_include('class.controller.inc.php'); 
    756 wf_include('class.compor.solicitacao.controller.inc.php'); 
    757 wf_include('class.avaliar.controller.inc.php'); 
    758 wf_include('class.executar.controller.inc.php'); 
    759 wf_include('class.informar.resultado.controller.inc.php'); 
    760  
    761 //camada da lógica de negócios 
    762  
    763 wf_include('class.model.inc.php'); 
    764 wf_include('class.compor.solicitacao.model.inc.php'); 
    765 wf_include('class.avaliar.model.inc.php'); 
    766 wf_include('class.executar.model.inc.php'); 
    767 wf_include('class.informar.resultado.model.inc.php'); 
    768  
    769 ?> 
    770  
    771 }}} 
    772  
    773 ==== Finalização ==== 
    774  
    775 Para finalizar o processo, é necessário compilá-lo e ativá-lo. Para isto,acessamos a interface de Administração de [wiki:WF/Processos Processos], abrimos o nosso processo e clicamos em "Compilação" e depois sem "ativar". Uma vez feito isso,o processo estará disponível aquem tem direito (os que estão nos perfis do processo). 
    776  
    777 Para colocar um ícone que representa o processo, basta inserir uma imagem de 32x32 pixels de nome "icon.png" no diretório resources do processo. 
     8 1. [wiki:WF/tutorialespecificacao] 
     9 1. [wiki:WF/tutorialprojeto] 
     10 1. [wiki:WF/tutorialimplementação] 
     11 1. [wiki:WF/tutorialfinalização]