= Versão Experimental - Flumen = Em paralelo ao desenvolvimento normal do módulo workflow, encontra-se em construção uma nova versão experimental, com o objetivo de reestruturar o módulo e introduzir melhorias significativas. O codinome desta versão é "Flumen". O código fonte está disponível na área [browser:sandbox/workflow sandbox do Svn], e está estruturado desta forma: {{{ sandbox | + - workflow | + - trunk | + - branches | + ticket # }}} O ramo trunk é destinado para a versão em desenvolvimento consolidada, isto é, o código existente no trunk deve ser funcional, podendo ser baixado e executado, com o mínimo de problemas. O ramo branches é destinado para as versões em desenvolvimento, associadas a tickets do Trac. Cada novo experimento deve estar registrado em um ticket associado ao milestone "!SandBox - Workflow". O ciclo de vida de uma implementação no Flumen deve ser: * Criar um ticket no Trac para descrever e discutir a nova implementação; * Associar o ticket ao milestone "!SandBox - Workflow"; * Criar um branch a partir do trunk e nomeá-lo com o número do ticket; * Desenvolver as modificações no branch e testar; * Quando estiverem concluídas, fazer o merge com trunk e testar; * Fechar o ticket. Caso o assunto de um ticket seja de fácil implementação, é opcional criar o branch para ele, podendo a implementação ser feita diretamente no trunk. Não é recomendado ter mais de um ticket por branch. É preferível ter sempre a associação 1:1 de um ticket ao seu próprio branch. Caso alguma implementação no Flumem possa ser aproveitada de imediato no módulo oficial, nada impede que seja transferida, desde que bem testada e não comprometa o funcionamento do módulo e processos. Mais abaixo segue o levantamento de requisitos desejáveis para a nova versão. == Requisitos para o Módulo == * Definir uma nova árvore de diretórios para o módulo que contemple: * Isolar o código acessível pelo Expresso (inc); * Separar o código interno do módulo (lib); * Separar o código de terceiros (php e js); * Prever local para o código das organizações: hooks, plugins, especializações de classes, templates. * Revisar o código do engine * Remover métodos desnecessários; * Encapsular as classes e atributos, segundo orientação por objetos (private, public, protected); * Remover o design pattern Observer; * Transferir para o módulo as classes que são de estrutura dos processos e deixar no engine apenas as funcionalidades relativas ao andamento das instâncias; * Eliminar a sobrecarga de métodos do engine que está sendo feita na pasta inc do workflow. Por exemplo a classe workflow_processomanager; * Eliminar o parâmetro link do banco de dados passado na construção da classe; * Documentar o engine com um diagrama de classes e um diagrama entidade-relacionamento; * Verificar se é possível documentar o engine com algum diagrama comportamental. * Criar uma nova factory estática para o workflow * Fazer o registro das classes que podem ser utilizadas; * Avaliar o design pattern registry e ver como pode ser aproveitado; * Encapsular objetos do array $Globals; * Criar um cache na factory; * Avaliar como pode ser feito um cache de objetos que perdure após um recarregamento da página, por exemplo utilizando sessão ou memcache; * Definir um hook para implementar o cache personalizado de um organização. Se inexistente, usa o padrão do workflow; * Aproveitar esta factory também para os processos, e prover uma forma de isolar as classes que são do módulo. Uma possibilidade seria criar uma factory abstrata e uma especialização para o workflow e outra para os processos; * Verificar se é possível utilizar o autoload para identicar a localização dos arquivos fontes; * Reorganizar o código do workflow utilizando plugins * Definir uma estrutura de plugins que possibilite a separação do núcleo do workflow e suas funcionalidades periféricas; * Entende-se por núcleo do workflow toda a estrutura responsável pela execução de atividades, controle do fluxo dos processos, controle de plugins e segurança; * Cada plugin deve ter um identificador único que será cadastrado no banco de dados e que possibilite a sua habilitação ou desabilitação; * No banco de dados devem ser inseridos dados como: o identificador, localização do arquivo da controller, nome da classe e status; * Os plugins devem estender uma classe geral que defina métodos padrão para registro, instanciação e execução daqueles; * Em determinados lugares dentro do módulo devem ser definidos hooks. Ex. Menu lateral de administração, aba na interface de usuário, etc.; * Deve-se criar uma estrutura padrão para os plugins que siga o design pattern MVC; * Deve existir algum controle de acesso para liberar os plugins para usuários; * Possibilitar aninhamento de plugins. * Pesquisar e implantar uma ferramenta para design dos fluxos dos processos * Atualmente os processos são cadastrados através de formulários, onde o desenvolvedor informa as atividades, transições, perfis, etc. Depois pode exibir um gráfico do processo. A proposta é encontrar uma ferramenta que faça o contrário: desenhe o fluxo e este sirva de entrada para registrar a estrutura do processo. Possivelmente o fluxo será descrito em uma linguagem de definição que pode ser lida pelo módulo workflow, ou então a nova ferramenta poderia acessar diretamente o banco de dados; * Reformular a interface administrativa para que as operações possam ser feitas sobre a imagem do processo. Por exemplo, clicando sobre ícone de uma atividade tem-se acesso às suas propriedades e perfis; * Impedir que modificações sejam feitas no fluxo quando existirem instâncias dependentes das atividades. * Implantar um gerador de código * Com este novo recurso, quando o gráfico do processo estiver concluído, será gerado o código básico para que o processo funcione. Assim sendo, o desenvolvedor ficaria com a tarefa de preencher lacunas no código, como por exemplo os formulários e métodos associados aos botões. * Criar um mecanismo autenticado para inclusão de instâncias * Com esta funcionalidade, sistemas externos poderão iniciar instâncias no workflow, sem passar pelas atividades Start dos processos; * Considerar o uso de web-service autenticado; * Considerar a possibilidade de uso de certificado. * Criar boletins para processos * Implementar uma área, em cada processo, para divulgar as novidades, melhorias e correções. Isso é útil para os usuários acompanharem a evolução dos processos. * Avaliar as bibliotedas de javascript utilizadas no Expresso e escolher aquelas que serão as oficiais * Dentre as bibliotecas existentes, que sejam de mesma natureza, optar por uma delas e modificar o código do módulo. * Substituir o conector Ajax * Trocar o atual conector Ajax (connector.js / controller.php) usado na interface do módulo, pelo framework nanoAjax, que já é utilizado nos processos. Substituir todas as chamadas do antigo conector pelo novo. * Criar um controle de tempo de execução para atividades * Implementar uma nova funcionalidade para atividades em que possa ser definido um tempo máximo de permanência da mesma com o usuário que detém a posse; * Criar um job genérico que rode diariamente e selecione as atividades que expiraram os prazos, e de alguma forma comunicar o usuário ou um administrador designado; * Se ficar inviável criar o job, porque o atual modelo exige configuração do cron do servidor, criar ao menos um página que mostre o resultado das pesquisas com opção de envio de email. * Prover uma auditoria de queries executadas nas tabelas do módulo Workflow. * Quando alguma alteração nos dados do processo for realizada, na interface de administração, registrar o evento em banco de dados para se ter um histórico dos acontecimentos. Por exemplo, ativação/desativação de processo, alteração de parâmetros, etc; * Verificar a possibilidade de executar triggers nas tabelas do módulo Workflow, para logar a atividade sql. Cuidar para não impactar na performance geral do banco; * Outra abordagem pode ser inserção de código nos principais eventos administrativos, para logar as modificações; * Criar atributos de configuração para processos que possam ser acessados na execução das atividades. * Modificar o template padrão de processos para: * Definir um hook para personilizar o template de processos por organização; * Criar parâmetros para incluir as bibliotecas de javascript. * Implantar uma ferramenta de automação de testes e deploy * Considerar a experiência do Serpro-BA com os softwares phpunit, phpdocumentor, codesniffer, ant, hudson (integração contínua); * Verificar a possibilidade de expandir as funcionalidades do Processo de Transferência; == Requisitos para o MVC == * Definir uma nova estrutura de diretórios para os processos * Considerar a experiência do Serpro-BA; * Analisar a estrutura de outros frameworks como o Cake e Simphony; * Prever áreas para: * Model-View-Controller; * Ajax; * Templates; * Js; * Imagens; * Jobs; * Classes de Negócio; * Config; * Facade (opcional); * Dao; * Log. * Isolar os dados variáveis como log, documentação, compiled, smarty, graph, para facilitar a automação de deploy e a integração com IDEs. * Criar um novo modelo de execução de atividades * Criar uma classe base para execução de atividades, contendo métodos básicos como inicialização, finalização, cancelamento, execução, continuação de uma instância, execução de ajax, comunicação com o engine e outros que um estudo mais detalhado venha a revelar; * Incluir também objetos para as classes já existentes hoje como regex, factory, validações; * O desenvolvedor irá criar uma classe para cada uma de suas atividades, que estenderá a superclasse e que contenha atributos do tipo objeto para as classes controller e model da atividade; * Implementar um método run que possa ser executado para iniciar a atividade. Continuarão a existir as classes de controller e model da atividade, em separado. Continuarão a existir as classes basecontroller e basemodel; * O desenvolvedor poderá sobrescrever os métodos de evento da superclasse: inicialização, finalização, cancelamento, transição. Em especial a transição pode servir ao desenvolvedor para obter o id da instância, após o encerramento de uma atividade start; * Criar uma nova classe run_activity, que será responsável por instanciar a classe da atividade e executá-la. Usar uma função global para obter este objeto, de modo a garantir que somente o código da classe seja carregado; * Criar um mecanismo que impeça o código do usuário criar objetos das classes do módulo e do engine. Como sugestão poderia ser uma análise no call_back procurando a origem da instanciação; * Acomodar os processamentos pré e pós execução das atividades (agente de correio) em outro local do código; * Criar uma camada de visualização para encapsular o gerador de templates Smarty * Criar componentes para os diversos elementos de formulário, como textarea, inputs, etc; * Implementar o conceito de container, que agrega componentes em uma mesma linha do template; * Criar componente de ocultação e um array de botões submit; * Criar um controle de acesso por componente, para ocultar elementos que não estejam disponíveis para um usuário; * Prever também o encapsulamento dos plugins smarty criados para o workflow (select users, etc); * Esta camada será representada pela classe baseview, que terá atributos para os componentes adicionados ao objeto view; * O submit fará uma chamada ao dispatch. O dispatch fará a verificação prévia de campos obrigatórios. Caso não tenha erros irá chamar o método de validação em php, via ajax. Caso sem erros, será montado o array request na model; * Carregar no template os arquivos javascript indicados pelo desenvolvedor. Possibilitar associar funções javascript aos componentes; * O objeto view deverá carregar os dados preparados na camada model e mesclar no template; * A criação do objeto smarty ficará ao encargo da camada view.