Changes between Initial Version and Version 1 of WF/Tutorialdedesenvolvimentodeumprocessosimples


Ignore:
Timestamp:
07/24/07 15:01:41 (17 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • WF/Tutorialdedesenvolvimentodeumprocessosimples

    v1 v1  
     1Neste 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. 
     2  
     3 
     4= Desenvolvimento de um Processo = 
     5 
     6O processo de desenvolvimento pode, grosseiramente, ser dividido em três etapas: 
     7 
     8 1. Especificação 
     9 1. Projeto 
     10 1. Implementação 
     11 
     12 
     13== Especificação == 
     14 
     15Esta 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_Documentaçãomínimadeprojeto Documentação mínima do Projeto] 
     16.Ao final desta etapa,o modo como o processo irá funcionar deve estar bem definido. 
     17 
     18 
     19 
     20=== Exemplo === 
     21 
     22No 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: 
     23 
     24 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; 
     25 1. Caso a solicitação seja rejeitada, o solicitante recebe um e-mail informando sobre sua solicitação. 
     26 
     27---- 
     28 
     29== Projeto == 
     30 
     31Nesta 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. 
     32 
     33 
     34 
     35=== Exemplo === 
     36 
     37No nosso exemplo podemos perceber claramente a existência de três perfis: 
     38 
     39 1. Solicitante: grupo de pessoas que podem fazer solicitações; 
     40 1. Distribuidor: grupo de pessoas que avaliam as solicitações; 
     41 1. Técnico: grupo de pessoas que executam as solicitações aprovadas. 
     42 
     43 
     44 
     45As atividades são quatro: 
     46 
     47 1. Compor Solicitação: o perfil "solicitante" faz uma solicitação; 
     48 1. Avaliar: o perfil "distribuidor" avalia a solicitação; 
     49 1. Executar: o perfil "tecnico" executa as solicitações aprovadas; 
     50 1. Informar Resultado: o perfil "solicitante" vê as informações referentes à sua solicitação. 
     51 
     52Possíveis caminhos de execução: 
     53 
     54 1. Compor Solicitação -> Avaliar (Aprovada) -> Executar -> Informar Resultado 
     55 1. Compor Solicitação -> Avaliar (Rejeitada) -> Informar Resultado 
     56 
     57 
     58=== Criação do Fluxo === 
     59 
     60Um 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. 
     61 
     62 
     63O 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. 
     64 
     65 
     66 
     67=== Exemplo === 
     68 
     69No nosso exemplo, foi criado o seguinte fluxo: 
     70 
     71[[Image(http://doc.workflow.celepar.parana/wiki/tutorial_solicitacoes.png)]] 
     72 
     73 
     74 
     75=== Criação do Processo === 
     76 
     77Uma 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. 
     78 
     79 
     80 
     81=== Exemplo === 
     82 
     83No nosso exemplo, vamos desenvolver esta etapa na seguinte ordem: 
     84 
     85 1. Criar o Processo; 
     86 1. Criar as Atividades / Transições / Perfis; 
     87 1. Mapear os Perfis. 
     88 
     89 
     90 
     91==== Criar o processo ==== 
     92 
     93Na interface de Administração de [wiki:WF_Processos Processos], preenchemos: 
     94 
     95   Nome do processo: Solicitações 
     96 
     97   Descrição: Processo de gerenciamento de solicitações 
     98 
     99Para os outros campos, utilizam-se os valores padrões. 
     100 
     101Clicamos no botão "criar". 
     102 
     103 
     104 
     105==== Criar as atividades / Transições / Perfis ==== 
     106 
     107Selecione a opção "Atividades". 
     108 
     109Quando 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". 
     110 
     111 
     112 
     113Selecionamos a atividade "start" e, mudamos / preenchemos os seguintes campos: 
     114 
     115   Nome: Compor Solicitação 
     116 
     117   Descrição: Atividade para o solicitante compor uma solicitação 
     118 
     119   Interativa: marcar opção 
     120 
     121   Roteamento Automático: marcar opção 
     122 
     123   '''Adicionar perfil''' 
     124 
     125   Nome: solicitante 
     126 
     127   Descrição: autorizados a compor solicitações 
     128 
     129   Clicamos em "salvar". 
     130 
     131 
     132 
     133Selecionamos a atividade "end" e, mudamos / preenchemos os seguintes campos: 
     134 
     135   Nome: Informar Resultado 
     136 
     137   Descrição: Atividade para informar o solicitante sobre sua solicitação 
     138 
     139   Interativa: marcar opção 
     140 
     141   Roteamento Automático: marcar opção 
     142 
     143   '''Usar perfis existentes''' 
     144 
     145   Selecionar "solicitante" 
     146 
     147   Clicamos em "salvar". 
     148 
     149 
     150 
     151Clicamos em "novo". 
     152 
     153Preenchemos os seguintes campos: 
     154 
     155   Nome: Executar 
     156 
     157   Descrição: Atividade para o técnico executar uma solicitação 
     158 
     159   Tipo: activity 
     160 
     161   Interativa: marcar opção 
     162 
     163   Roteamento Automático: marcar opção 
     164 
     165   '''Adicionar Transições''' 
     166 
     167:   Adicionar transições para: "Informar Resultado" 
     168 
     169   '''Adicionar perfil''' 
     170 
     171:   Nome: tecnico 
     172 
     173:   Descrição: autorizados a executar solicitações 
     174 
     175Clicamos em "salvar". 
     176 
     177 
     178 
     179Clicamos em "novo". 
     180 
     181Preenchemos os seguintes campos: 
     182 
     183   Nome: Avaliar 
     184 
     185   Descrição: Atividade para o distribuidor avaliar uma solicitação 
     186 
     187   Tipo: switch 
     188 
     189   Interativa: marcar opção 
     190 
     191   Roteamento Automático: marcar opção 
     192 
     193   '''Adicionar Transições''' 
     194 
     195:   Adicionar transições de: "Compor Solicitação" 
     196 
     197:   Adicionar transições para: "Executar" e "Informar Resultado" 
     198 
     199   '''Adicionar perfil''' 
     200 
     201:   Nome: distribuidor 
     202 
     203:   Descrição: autorizados a avaliar solicitações 
     204 
     205Clicamos em "salvar". 
     206 
     207 
     208 
     209==== Mapear os Perfis ==== 
     210 
     211Clicamos em "Perfis" 
     212 
     213Na á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". 
     214 
     215Para finalizar, basta repetir este mesmo passo para os outros dois perfis. 
     216 
     217---- 
     218 
     219 
     220 
     221== Implementação == 
     222 
     223Nestaetapaéfeitaacodificaçãodasatividadesqueforamcriadasnaetapaanterior.Seráutilizadaaarquitetura[http://pt.wikipedia.org/wiki/MVCMVC](''Model-View-Controller'').Consulteodocumento[wiki:WF_MetodologiadeDesenvolvimento] 
     224parasabermaisdetalhesdecomoaarquiteturaMVCestáimplementadanoWorkflowdoExpresso. 
     225 
     226 
     227 
     228=== Exemplo === 
     229 
     230Insiraoscódigos,listadosabaixo,nosrespectivosarquivos.Utilize,paraisso,oeditordecódigosPhpquejávemembutidonoWorkflow.(Vejaodocumento[wiki:WF_Ediçãodecódigo)] 
     231. 
     232 
     233 
     234 
     235==== Atividades ==== 
     236 
     237'''Avaliar.php''' 
     238 
     239{{{ 
     240 
     241<?php 
     242 
     243$application = new AvaliarController(new AvaliarModel($env), $env); 
     244 
     245$application->run($_REQUEST['action']); 
     246 
     247?> 
     248 
     249}}} 
     250 
     251 
     252 
     253'''Compor_Solicitao.php''' 
     254 
     255{{{ 
     256 
     257<?php 
     258 
     259$application = new ComporSolicitacaoController(new ComporSolicitacaoModel($env), $env); 
     260 
     261$application->run($_REQUEST['action']); 
     262 
     263?> 
     264 
     265}}} 
     266 
     267 
     268 
     269'''Executar.php''' 
     270 
     271{{{ 
     272 
     273<?php 
     274 
     275$application = new ExecutarController(new ExecutarModel($env), $env); 
     276 
     277$application->run($_REQUEST['action']); 
     278 
     279?> 
     280 
     281}}} 
     282 
     283 
     284 
     285'''Informar_Resultado.php''' 
     286 
     287{{{ 
     288 
     289<?php 
     290 
     291$application = new InformarResultadoController(new InformarResultadoModel($env), $env); 
     292 
     293$application->run($_REQUEST['action']); 
     294 
     295?> 
     296 
     297}}} 
     298 
     299 
     300 
     301 
     302 
     303==== Templates ==== 
     304 
     305'''templates/Avaliar.tpl''' 
     306 
     307{{{ 
     308 
     309{include file="info_solicitacao.tpl"} 
     310 
     311<br> 
     312 
     313<input type="submit" name="action" value="Aprovar" /> 
     314 
     315<input type="submit" name="action" value="Rejeitar" /> 
     316 
     317}}} 
     318 
     319 
     320 
     321'''templates/Compor_Solicitao.tpl''' 
     322 
     323{{{ 
     324 
     325<table> 
     326 
     327        <tr> 
     328 
     329                <td><label>Título</label></td> 
     330 
     331                <td><input type="text" name="titulo" value="{$titulo}" /></td> 
     332 
     333        </tr> 
     334 
     335        <tr> 
     336 
     337                <td><label>Descrição</label></td> 
     338 
     339                <td><textarea name="descricao">{$descricao}</textarea></td> 
     340 
     341        </tr> 
     342 
     343</table> 
     344 
     345<input type="submit" name="action" value="Enviar" /> 
     346 
     347}}} 
     348 
     349 
     350 
     351'''templates/Executar.tpl''' 
     352 
     353{{{ 
     354 
     355{include file="info_solicitacao.tpl"} 
     356 
     357<br/> 
     358 
     359<strong>Procedimento Executado:</strong><br/> 
     360 
     361<textarea name="procedimento" cols="50" rows="7"></textarea><br/> 
     362 
     363<input type="submit" name="action" value="Finalizar" /> 
     364 
     365}}} 
     366 
     367 
     368 
     369'''templates/Informar_Resultado.tpl''' 
     370 
     371{{{ 
     372 
     373{include file="info_solicitacao.tpl"} 
     374 
     375<br/> 
     376 
     377<table> 
     378 
     379        <tr> 
     380 
     381                <td><strong>Mensagem</strong></td> 
     382 
     383                <td>{$mensagem|nl2br}</td> 
     384 
     385        <tr> 
     386 
     387</table> 
     388 
     389<input type="submit" name="action" value="Encerrar" /> 
     390 
     391}}} 
     392 
     393 
     394 
     395'''templates/info_solicitacao.tpl''' 
     396 
     397 
     398 
     399Por 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: 
     400 
     401:1 - Clique no botão 'Novo template'; 
     402 
     403:2 - Escolha a opção 'em_branco.tpl'; 
     404 
     405:3 - Informe o nome do arquivo e clique em OK 
     406 
     407:4 - Inclua o código abaixo 
     408 
     409{{{ 
     410 
     411<table> 
     412 
     413        <tr> 
     414 
     415                <td><strong>Solicitante</strong></td> 
     416 
     417                <td>{$solicitante_desc}</td> 
     418 
     419        </tr> 
     420 
     421        <tr> 
     422 
     423                <td><strong>Data</strong></td> 
     424 
     425                <td>{$data}</td> 
     426 
     427        </tr> 
     428 
     429        <tr> 
     430 
     431                <td><strong>Título</strong></td> 
     432 
     433                <td>{$titulo}</td> 
     434 
     435        </tr> 
     436 
     437        <tr> 
     438 
     439                <td><strong>Descrição</strong></td> 
     440 
     441                <td>{$descricao|nl2br}</td> 
     442 
     443        </tr> 
     444 
     445</table> 
     446 
     447}}} 
     448 
     449 
     450 
     451 
     452 
     453==== Includes ==== 
     454 
     455 
     456 
     457Os 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: 
     458 
     459:1 - Clique no botão 'Novo Include'; 
     460 
     461:2 - Escolha a opção 'em_branco.php'; 
     462 
     463:3 - Informe o nome do arquivo e clique em OK 
     464 
     465:4 - Inclua o código correspondente 
     466 
     467 
     468 
     469'''class.avaliar.controller.inc.php''' 
     470 
     471{{{ 
     472 
     473<?php 
     474 
     475class AvaliarController extends Controller 
     476 
     477{ 
     478 
     479        function __default () 
     480 
     481        { 
     482 
     483                $this->model->defaultAction(); 
     484 
     485                $this->loadViewVars(); 
     486 
     487                $this->showForm($this->AVALIAR); 
     488 
     489        } 
     490 
     491 
     492 
     493        function aprovar() 
     494 
     495        { 
     496 
     497                $this->model->aprovarAction(); 
     498 
     499        } 
     500 
     501 
     502 
     503        function rejeitar() 
     504 
     505        { 
     506 
     507                $this->model->rejeitarAction(); 
     508 
     509        } 
     510 
     511 
     512 
     513        function run($action) 
     514 
     515        { 
     516 
     517                $this->dispatch($action); 
     518 
     519        } 
     520 
     521} 
     522 
     523?> 
     524 
     525}}} 
     526 
     527 
     528 
     529'''class.avaliar.model.inc.php''' 
     530 
     531{{{ 
     532 
     533<?php 
     534 
     535class AvaliarModel extends Model 
     536 
     537{ 
     538 
     539        function defaultAction() 
     540 
     541        { 
     542 
     543                $this->updateAttributes(); 
     544 
     545                $this->addViewVar('titulo', $this->_titulo); 
     546 
     547                $this->addViewVar('descricao', $this->_descricao); 
     548 
     549                $this->addViewVar('data', $this->_data); 
     550 
     551                $this->addViewVar('solicitante_desc', $this->_solicitante_desc); 
     552 
     553 
     554 
     555                return true; 
     556 
     557        } 
     558 
     559 
     560 
     561        function aprovarAction() 
     562 
     563        { 
     564 
     565                $this->instance->setNextActivity('Executar'); 
     566 
     567                $this->commitInstance(); 
     568 
     569 
     570 
     571                return true; 
     572 
     573        } 
     574 
     575 
     576 
     577        function rejeitarAction() 
     578 
     579        { 
     580 
     581                $this->updateAttributes(); 
     582 
     583                $this->instance->setNextActivity('Informar Resultado'); 
     584 
     585                $this->instance->setNextUser($this->_solicitante); /* devolve a instância para o solicitante */ 
     586 
     587                $this->_mensagem = "Sua solicitação foi rejeitada"; 
     588 
     589                $this->updateInstance(); 
     590 
     591                $this->commitInstance(); 
     592 
     593 
     594 
     595                return true; 
     596 
     597        } 
     598 
     599} 
     600 
     601?> 
     602 
     603}}} 
     604 
     605 
     606 
     607'''class.compor.solicitacao.controller.inc.php''' 
     608 
     609{{{ 
     610 
     611<?php 
     612 
     613class ComporSolicitacaoController extends Controller 
     614 
     615{ 
     616 
     617        function __default () 
     618 
     619        { 
     620 
     621                $this->model->defaultAction(); 
     622 
     623                $this->loadViewVars(); 
     624 
     625                $this->showForm($this->COMPOR_SOLICITACAO); 
     626 
     627        } 
     628 
     629 
     630 
     631        function enviar() 
     632 
     633        { 
     634 
     635                $this->model->enviarAction(); 
     636 
     637                $this->loadViewVars(); 
     638 
     639        } 
     640 
     641 
     642 
     643        function run($action) 
     644 
     645        { 
     646 
     647                $this->dispatch($action); 
     648 
     649        } 
     650 
     651} 
     652 
     653?> 
     654 
     655}}} 
     656 
     657 
     658 
     659'''class.compor.solicitacao.model.inc.php''' 
     660 
     661{{{ 
     662 
     663<?php 
     664 
     665class ComporSolicitacaoModel extends Model 
     666 
     667{ 
     668 
     669        function defaultAction() 
     670 
     671        { 
     672 
     673                return true; 
     674 
     675        } 
     676 
     677 
     678 
     679        function inputValidate($form) 
     680 
     681        { 
     682 
     683                $msgerro = Array(); 
     684 
     685 
     686 
     687                /* título não pode ser vazio */ 
     688 
     689                if (isset($form['titulo']) && !empty($form['titulo'])) 
     690 
     691                        $this->_titulo = $form['titulo']; 
     692 
     693                else 
     694 
     695                        $msgerro[] = 'É necessário fornecer um título'; 
     696 
     697 
     698 
     699                if (isset($form['descricao']) && !empty($form['descricao'])) 
     700 
     701                        $this->_descricao = $form['descricao']; 
     702 
     703                else 
     704 
     705                        $msgerro[] = 'É necessário fornecer uma descrição'; 
     706 
     707 
     708 
     709                return $msgerro; 
     710 
     711        } 
     712 
     713 
     714 
     715        function enviarAction() 
     716 
     717        { 
     718 
     719                /* se não houve erros */ 
     720 
     721                if (count($this->activity->error = $this->inputValidate($this->request)) == 0) 
     722 
     723                { 
     724 
     725                        $this->_solicitante = $this->getWfProperty('wf_user_id'); 
     726 
     727                        $this->_solicitante_desc = $this->getWfProperty('wf_user_cnname'); 
     728 
     729                        $this->_data = date('d/m/Y Hhi'); 
     730 
     731                        $this->updateInstance(); 
     732 
     733                        $this->commitInstance(); 
     734 
     735                        return true; 
     736 
     737                } 
     738 
     739                else 
     740 
     741                { 
     742 
     743                        $this->addViewVar('titulo', $this->_titulo); 
     744 
     745                        $this->addViewVar('descricao', $this->_descricao); 
     746 
     747                        return false; 
     748 
     749                } 
     750 
     751        } 
     752 
     753} 
     754 
     755?> 
     756 
     757}}} 
     758 
     759 
     760 
     761'''class.controller.inc.php''' 
     762 
     763{{{ 
     764 
     765<?php 
     766 
     767class Controller extends BaseController 
     768 
     769{ 
     770 
     771        var $COMPOR_SOLICITACAO = 'Compor_Solicitao.tpl'; 
     772 
     773        var $AVALIAR = 'Avaliar.tpl'; 
     774 
     775        var $EXECUTAR = 'Executar.tpl'; 
     776 
     777        var $INFORMAR_RESULTADO = 'Informar_Resultado.tpl'; 
     778 
     779 
     780 
     781        function Controller(&$model , &$env) 
     782 
     783        { 
     784 
     785                $this->super(&$model , &$env); 
     786 
     787        } 
     788 
     789} 
     790 
     791?> 
     792 
     793}}} 
     794 
     795 
     796 
     797'''class.executar.controller.inc.php''' 
     798 
     799{{{ 
     800 
     801<?php 
     802 
     803class ExecutarController extends Controller 
     804 
     805{ 
     806 
     807        function __default () 
     808 
     809        { 
     810 
     811                $this->model->defaultAction(); 
     812 
     813                $this->loadViewVars(); 
     814 
     815                $this->showForm($this->EXECUTAR); 
     816 
     817        } 
     818 
     819 
     820 
     821        function finalizar() 
     822 
     823        { 
     824 
     825                $this->model->finalizarAction(); 
     826 
     827        } 
     828 
     829 
     830 
     831        function run($action) 
     832 
     833        { 
     834 
     835                $this->dispatch($action); 
     836 
     837        } 
     838 
     839} 
     840 
     841?> 
     842 
     843}}} 
     844 
     845 
     846 
     847'''class.executar.model.inc.php''' 
     848 
     849{{{ 
     850 
     851<?php 
     852 
     853class ExecutarModel extends Model 
     854 
     855{ 
     856 
     857        function defaultAction() 
     858 
     859        { 
     860 
     861                $this->updateAttributes(); 
     862 
     863                $this->addViewVar('titulo', $this->_titulo); 
     864 
     865                $this->addViewVar('descricao', $this->_descricao); 
     866 
     867                $this->addViewVar('data', $this->_data); 
     868 
     869                $this->addViewVar('solicitante_desc', $this->_solicitante_desc); 
     870 
     871 
     872 
     873                return true; 
     874 
     875        } 
     876 
     877 
     878 
     879        function finalizarAction() 
     880 
     881        { 
     882 
     883                $this->updateAttributes(); 
     884 
     885                $this->_mensagem = "Sua solicitação foi atendida pelo técnico " 
     886 
     887                        . $this->getWfProperty('wf_user_cnname') 
     888 
     889                        . ". 
     890<strong>Procedimento executado:</strong> 
     891" . $this->request['procedimento']; 
     892 
     893                $this->updateInstance(); 
     894 
     895                $this->instance->setNextUser($this->_solicitante); /* devolve a instância para o solicitante */ 
     896 
     897                $this->commitInstance(); 
     898 
     899 
     900 
     901                return true; 
     902 
     903        } 
     904 
     905} 
     906 
     907?> 
     908 
     909}}} 
     910 
     911 
     912 
     913'''class.informar.resultado.controller.inc.php''' 
     914 
     915{{{ 
     916 
     917<?php 
     918 
     919class InformarResultadoController extends Controller 
     920 
     921{ 
     922 
     923        function __default () 
     924 
     925        { 
     926 
     927                $this->model->defaultAction(); 
     928 
     929                $this->loadViewVars(); 
     930 
     931                $this->showForm($this->INFORMAR_RESULTADO); 
     932 
     933        } 
     934 
     935 
     936 
     937        function encerrar() 
     938 
     939        { 
     940 
     941                $this->model->encerrarAction(); 
     942 
     943        } 
     944 
     945 
     946 
     947        function run($action) 
     948 
     949        { 
     950 
     951                $this->dispatch($action); 
     952 
     953        } 
     954 
     955} 
     956 
     957?> 
     958 
     959}}} 
     960 
     961 
     962 
     963'''class.informar.resultado.model.inc.php''' 
     964 
     965{{{ 
     966 
     967<?php 
     968 
     969class InformarResultadoModel extends Model 
     970 
     971{ 
     972 
     973        function defaultAction() 
     974 
     975        { 
     976 
     977                $this->updateAttributes(); 
     978 
     979                $this->addViewVar('titulo', $this->_titulo); 
     980 
     981                $this->addViewVar('descricao', $this->_descricao); 
     982 
     983                $this->addViewVar('data', $this->_data); 
     984 
     985                $this->addViewVar('solicitante_desc', $this->_solicitante_desc); 
     986 
     987                $this->addViewVar('mensagem', $this->_mensagem); 
     988 
     989 
     990 
     991                return true; 
     992 
     993        } 
     994 
     995 
     996 
     997        function encerrarAction() 
     998 
     999        { 
     1000 
     1001                $this->commitInstance(); 
     1002 
     1003 
     1004 
     1005                return true; 
     1006 
     1007        } 
     1008 
     1009} 
     1010 
     1011?> 
     1012 
     1013}}} 
     1014 
     1015 
     1016 
     1017'''class.model.inc.php''' 
     1018 
     1019{{{ 
     1020 
     1021<?php 
     1022 
     1023class Model extends BaseModel 
     1024 
     1025{ 
     1026 
     1027        var $_titulo; 
     1028 
     1029        var $_descricao; 
     1030 
     1031        var $_solicitante; 
     1032 
     1033        var $_solicitante_desc; 
     1034 
     1035        var $_data; 
     1036 
     1037        var $_mensagem; 
     1038 
     1039 
     1040 
     1041        function Model(&$env) 
     1042 
     1043        { 
     1044 
     1045                $this->super(&$env); 
     1046 
     1047        } 
     1048 
     1049} 
     1050 
     1051?> 
     1052 
     1053}}} 
     1054 
     1055 
     1056 
     1057'''shared.php''' 
     1058 
     1059{{{ 
     1060 
     1061<?php 
     1062 
     1063//camada de controle do processo 
     1064 
     1065wf_include('class.controller.inc.php'); 
     1066 
     1067wf_include('class.compor.solicitacao.controller.inc.php'); 
     1068 
     1069wf_include('class.avaliar.controller.inc.php'); 
     1070 
     1071wf_include('class.executar.controller.inc.php'); 
     1072 
     1073wf_include('class.informar.resultado.controller.inc.php'); 
     1074 
     1075 
     1076 
     1077//camada da lógica de negócios 
     1078 
     1079wf_include('class.model.inc.php'); 
     1080 
     1081wf_include('class.compor.solicitacao.model.inc.php'); 
     1082 
     1083wf_include('class.avaliar.model.inc.php'); 
     1084 
     1085wf_include('class.executar.model.inc.php'); 
     1086 
     1087wf_include('class.informar.resultado.model.inc.php'); 
     1088 
     1089?> 
     1090 
     1091}}} 
     1092 
     1093 
     1094 
     1095 
     1096 
     1097==== Finalização ==== 
     1098 
     1099Para finalizar o processo,é necessário compilá-lo e ativá-lo.Para isto,acessamos a interface de Administração de [wiki:WF_Processos Processos] 
     1100,abrimos o nosso processo e clicamos em "Compilação" e depoi sem "ativar".Uma vez feito isso,o processo estará disponível aquem tem direito(os que estão nos perfis do processo). 
     1101 
     1102Para colocar um ícone que representa o processo, basta inserir uma imagem de 32x32 pixels de nome "icon.png" no diretório resources do processo.