JOÃO GARIBALDI NETO REENGENHARIA DO SISTEMA DE ADMINISTRAÇÃO DE ALMOXARIFADO DO TRIBUNAL DE CONTAS DO ESTADO DO TOCANTINS UTILIZANDO PHP 5 E ORIENTAÇÃO A OBJETO PALMAS 2006 JOÃO GARIBALDI NETO REENGENHARIA DO SISTEMA DE ADMINISTRAÇÃO DE ALMOXARIFADO DO TRIBUNAL DE CONTAS DO ESTADO DO TOCANTINS UTILIZANDO PHP 5 E ORIENTAÇÃO A OBJETO “Trabalho apresentado com requisito da disciplina Prática de Sistemas de Informação (Estágio) do curso de Sistemas de Informação, orientada pelo Profº. Fernando Luiz de Oliveira”. PALMAS 2006 SUMÁRIO 1. INTRODUÇÃO............................................................................................................... 8 2. REVISÃO DE LITERATURA ....................................................................................... 9 2.1. Administração de almoxarifado................................................................................... 9 2.2. As 4 atribuições básicas do Almoxarifado ................................................................ 10 2.2.1. Recebimento .......................................................................................................... 10 2.2.2. Guarda de Materiais............................................................................................... 11 2.2.3. Controle de Materiais ............................................................................................ 11 2.2.4. Entrega de Materiais.............................................................................................. 12 2.3. Programação Orientada a Objeto............................................................................... 12 2.3.1. Classes e Objetos ................................................................................................... 13 2.3.2. Abstração ............................................................................................................... 13 2.3.3. Encapsulamento..................................................................................................... 14 2.3.4. Herança.................................................................................................................. 16 2.3.5. Polimorfismo ......................................................................................................... 17 2.3.6. Interfaces ............................................................................................................... 17 3. MATERIAIS E MÉTODOS.......................................................................................... 19 3.1. Estrutura física e lógica ............................................................................................. 19 3.2. Métodos aplicados ..................................................................................................... 19 4. RESULTADOS E DISCUSSÃO .................................................................................. 20 4.1. Diagramas de casos de uso ........................................................................................ 20 4.2. Casos de Uso Reais ................................................................................................... 21 4.2.1. Logar...................................................................................................................... 21 4.2.2. Incluir Classe de Produto....................................................................................... 22 4.2.3. Consultar Classe de Produto.................................................................................. 23 4.2.4. Alterar Classe de Produto ...................................................................................... 24 4.2.5. Excluir Classe de Produto ..................................................................................... 24 4.2.6. Incluir Grupo de Produtos ..................................................................................... 25 4.2.7. Consultar Grupos de Produto ................................................................................ 26 4.2.8. Alterar Grupos de Produto..................................................................................... 26 4.2.9. Excluir Grupos de Produto ................................................................................... 26 4.2.10. Incluir Unidades de Produto .................................................................................. 27 4.2.11. Consultar Unidades de Produto ............................................................................. 28 4.2.12. Alterar Unidades de Produto ................................................................................. 28 4.2.13. Excluir Unidades de Produto................................................................................. 28 4.2.14. Incluir Produto....................................................................................................... 29 4.2.15. Consultar Produto .................................................................................................. 30 4.2.16. Alterar Produto ...................................................................................................... 31 4.2.17. Excluir Produto...................................................................................................... 31 4.2.18. Incluir Fornecedores .............................................................................................. 32 4.2.19. Consultar Fornecedores ......................................................................................... 34 4.2.20. Alterar Fornecedores ............................................................................................. 34 4.2.21. Excluir Fornecedores............................................................................................. 34 4.2.22. Incluir Movimentação Externa (Compra De Materiais)........................................ 35 4.2.23. Consultar Movimentação Externa ......................................................................... 36 4.2.24. Alterar Movimentação Externa ............................................................................. 37 4.2.25. Excluir Movimentação Externa ............................................................................. 37 4.2.26. Incluir Itens da Movimentacao Externa................................................................. 38 4.2.27. Alterar Itens da Movimentação Externa................................................................ 39 4.2.28. Excluir Itens da Movimentação Externa ............................................................... 40 4.2.29. Incluir Movimentação Interna (Requisições de Materiais) ................................... 41 4.2.30. Consultar Movimentação Interna .......................................................................... 42 4.2.31. Alterar Movimentação Interna............................................................................... 43 4.2.32. Excluir Movimentação Interna .............................................................................. 43 4.2.33. Incluir Itens da Movimentação Interna.................................................................. 44 4.2.34. Alterar Itens da Movimentação Interna ................................................................. 45 4.2.35. Excluir Itens da Movimentação Interna ................................................................ 46 4.3. Diagrama de Classes do Projeto ................................................................................ 47 4.4. Modelo Relacional do Banco de Dados .................................................................... 48 4.5. Implementação do Sistema........................................................................................ 49 4.5.1. Cadastro de Unidades ............................................................................................ 49 4.5.2. Cadastro de Produtos ............................................................................................. 53 4.5.3. Cadastro de Classes ............................................................................................... 58 4.5.4. Cadastro de Grupos ............................................................................................... 62 4.5.5. Cadastro de Fornecedores...................................................................................... 66 4.5.6. Movimentação Externa.......................................................................................... 72 4.5.7. Itens de Moviementação Externa .......................................................................... 76 4.5.8. Movimentação Interna........................................................................................... 79 4.5.9. Itens de Movimentação Interna ............................................................................. 83 4.5.10. Classe DBConnector ............................................................................................. 87 4.5.11. Classe systemcomponents ..................................................................................... 88 4.5.12. Script SQL Banco de Dados.................................................................................. 88 5. CONSIDERAÇÕES FINAIS ........................................................................................ 91 6. REFERÊNCIAS BIBLIOGRÁFICAS .......................................................................... 92 LISTA DE FIGURAS Figura 1: Estrutura organizacional do Tribunal de Contas do Estado do Tocantins......... 10 Figura 2: Exemplo de abstração........................................................................................ 14 Figura 3: Exemplo de encapsulamento ............................................................................. 15 Figura 4: Exemplo de Herança.......................................................................................... 16 Figura 5: Diagrama de Casos de Uso................................................................................ 20 Figura 6: Caso de Uso Logar ............................................................................................ 21 Figura 7: Caso de uso logar com erro ............................................................................... 22 Figura 8: Caso de uso inclusão de classe de produto ........................................................ 23 Figura 9: Caso de uso inclusão de grupo de produto ........................................................ 25 Figura 10: Caso de uso inclusão de unidades de produto ............................................... 27 Figura 11: Caso de uso inclusão de produtos.................................................................. 30 Figura 12: Caso de uso inclusão de Fornecedores .......................................................... 33 Figura 13: Caso de uso inclusão de Movimentação Externa .......................................... 36 Figura 14: Caso de uso inclusão de Itens da Movimentação Externa............................. 39 Figura 15: Caso de uso inclusão de Movimentação Interna ........................................... 42 Figura 16: Caso de uso inclusão de Itens da Movimentação Interna.............................. 45 Figura 17: Diagrama de Classes em UML...................................................................... 47 Figura 18: Dicionário de Dados ...................................................................................... 48 RESUMO O presente trabalho tem por objetivo classificar e apresentar as operações básicas pertinentes a qualquer setor de almoxarifado eficiente de uma empresa ou órgão. Posteriormente, tendo como base o padrão da modelagem UML, será realizado e apresentado a reengenharia do setor de almoxarifado do Tribunal de Contas do Estado do Tocantins, readequando a implementação existente ao paradigma da programação orientada a objeto, que deverá atender rigorosamente a sistemática das operações propostas para um eficaz controle dos materiais de almoxarifado. Pela importância deste setor para o referido órgão público, foi desenvolvida uma solução informatizada, no padrão web, que viesse auxiliar e automatizar todas as atividades por este importante setor. Este trabalho foi desenvolvido no próprio Tribunal de Contas do Estado do Tocantins e teve como resultado um sistema de elevada qualidade no que se diz respeito aos aspectos de manutenção e suporte a softwares. O referido sistema já encontra-se em plena utilização no órgão supracitado, atendendo as exigências propostas por este trabalho. 8 1. INTRODUÇÃO O presente trabalho visa salientar a importância da utilização da tecnologia da informação no apoio as atividades pertinentes ao setor de almoxarifado do Tribunal de Contas do Estado do Tocantins. A priori, este trabalho mostrará o funcionamento básico de um setor de almoxarifado, tomando como exemplo o funcionamento do Tribunal de Contas do Estado do Tocantins, passando por todas as suas etapas de funcionamento. Em seguida, mostrará que o auxílio da tecnologia da informação é fundamental dentro deste setor. Isto porque a tecnologia agrega para o profissional responsável por este setor um substancial ganho de produtividade, contribuindo assim para um melhor desempenho dos trabalhos desenvolvidos dentro do órgão em questão, uma vez que a função primordial do almoxarife é dar apoio aos demais setores do órgão supracitado, no que diz respeito a suprimento do material de expediente. Por fim, será apresentada a reengenharia da implementação existente do Sistema de Administração de Almoxarifado, utilizando a linguagem de programação PHP 5, enfocando o paradigma da orientação a objetos, e todos os benefícios que a utilização desta técnica de programação traz para aqueles que se utilizam dela para desenvolver aplicações eficientes e fáceis de manutenir. 9 2. REVISÃO DE LITERATURA Para que os objetivos desse trabalho sejam alcançados, torna-se necessário fazer um levantamento bibliográfico sobre os conceitos que envolvem a administração de um almoxarifado, bem como os conceitos gerais relacionados ao paradigma da orientação a objetos. Esses conceitos, assim como outros necessários para a fundamentação desse trabalho, serão apresentados nas seções seguintes. 2.1. Administração de almoxarifado O funcionamento de toda e qualquer empresa depende, entre outras coisas, de que ela conte com material de trabalho em quantidade e qualidade suficientes para atender às suas necessidades. O setor que se encarrega do suprimento de materiais a todas as unidades da empresa é o almoxarifado. A função básica do almoxarifado no âmbito de uma empresa, em relação aos demais setores desta, é apoiá-los no que diz respeito a suprimento do material de expediente. O almoxarifado, de modo geral, no âmbito de uma empresa constitui um setor organizado para a execução de quatro atividades básicas: recebimento, guarda, controle e entrega de material (SENAC, p. 15, 1993). Neste trabalho será apresentada uma solução informatizada compreendendo todos os procedimentos acima descritos que compreendem a rotina normal de administração, bem como a rotina propriamente dita de um almoxarifado. Para que um sistema de administração de almoxarifado de fato atenda as necessidades tanto do almoxarife chefe, quanto aos anseios dos demais setores de uma empresa ou órgão público com excelência, é necessário que o desenvolvedor da solução informatizada conheça bem a sua organização. Dependendo do porte, da área de atividade em que atua e do tipo de trabalho desenvolvido, cada empresa ou órgão tem uma forma própria de se organizar e de localizar o almoxarifado em sua estrutura. No caso do Tribunal de Contas do Estado do Tocantins, este órgão segue a seguinte estrutura: 10 Figura 1: Estrutura organizacional do Tribunal de Contas do Estado do Tocantins Segundo SENAC (2003), dentro de um almoxarifado, podem existir também seções específicas para tratar de cada uma das atividades executadas (recebimento, guarda, controle e entrega). Cada uma dessas seções possui atribuições bem definidas, que serão detalhadas na seção subseqüente. 2.2. As quatro atribuições básicas do Almoxarifado 2.2.1. Recebimento No almoxarifado informatizado, o almoxarife, após conferir o material recebido, digitará no terminal de computador os dados constantes na Autorização de Fornecimento e na Nota Fiscal, assim como quaisquer outras observações, e o sistema automaticamente emitirá o respectivo aviso de recebimento e a nova ficha de prateleira, dando assim, entrada ao material de estoque (SENAC, p. 30, 1993). 11 2.2.2. Guarda de Materiais O processo de guarda é bastante simplificado no sistema de almoxarifado, pois todo o trabalho manual de lançamento nas Fichas de Prateleira ou de Identificação do Material é substituído pela impressão de uma nova Ficha para o material a ser estocado. Para isso, basta que o almoxarife digite os dados de entrada e dê o comando para que o computador imprima a nova ficha (SENAC, p.40, 1993). 2.2.3. Controle de Materiais O controle é o cérebro do almoxarifado, ou seja, trata-se da função mais importante deste setor de atividades. Todo material deve ser constantemente controlado; é necessário saber a quantidade de cada material existente, se o estoque está suficiente ou se é preciso reabastecê-lo (SENAC, p. 11, 1993). Esta é a atribuição mais delicada do almoxarifado, pois engloba o regime pelo qual o setor de almoxarifado de uma determinada empresa é submetido, por questões de política interna da própria empresa, bem como a disciplina e o bom senso do almoxarife encarregado. Por exemplo, na ocasião de um pedido de um material que não conste no estoque, o almoxarife encarregado deverá emitir uma nova Requisição de Compras, para o material solicitado. Após todo o processo administrativo natural referente a uma compra no âmbito de uma empresa, este funcionário fará o recebimento do material comprado, o cadastrará no sistema, digitando os dados pertinentes a este (especificação e quantidade). Realizado este processo, o referido material passa a existir e será passível de ser controlado pelo sistema, podendo assim ser registrado normalmente a saída do material, antes ausente, do estoque. Uma outra situação é que, no caso do estoque de um determinado material atingir o limite do estoque mínimo, o almoxarife encarregado deverá também emitir uma nova Requisição de Compras, para o material em questão. Nesta ocasião, o almoxarife encarregado necessita determinar os cálculos de ressuprimento não só para planejar a aquisição de novos estoques, como também para facilitar o controle, impedindo que haja estoque ocioso no almoxarifado, bem como evitar a repetição exagerada de Requisições de Compra para um mesmo produto. 12 2.2.4. Entrega de Materiais Autorizado pelo controle a liberar uma Requisição de Material, o almoxarife digita o código do material, a especificação, a quantidade pedida e o código do setor solicitante. O sistema então emite duas vias da ficha com os dados da Requisição de Material que servirá no ato da entrega ao departamento solicitante (SENAC, p. 1993). 2.3. Programação Orientada a Objeto A programação Orientada a Objetos surgiu como uma técnica de desenvolvimento de softwares, onde o foco maior é atribuído aos dados, que nada mais são do que objetos, modelando as características de objetos abstratos ou reais através de classes e objetos. Segundo MEILIR (1997, p. 60), o termo ‘orientação a objetos’ é intrinsecamente desprovido de significado, uma vez que os termos, vistos isoladamente, são poucos significativos. Por exemplo, o termo ‘objeto’ representa qualquer coisa que pode ser identificado por algum dos sentidos humano. Já o termo ‘orientado’ pode ser substituído por ‘dirigido’ ou ‘voltado a’, restando então o papel de moldar a expressão ‘orientado a objetos’ através de um adjetivo: ‘dirigido a qualquer coisa que se possa pensar’. Desta forma, a Programação Orientada a Objetos é na verdade um paradigma de programação para computadores que enfatiza aspectos relacionados a: objetos, classes, herança, encapsulamento, polimorfismo e mensagens. Estes aspectos da Orientação a Objetos serão detalhados nas seções seguintes. Existem outros aspetos importantes, porém os relacionados acima já servem como um bom exemplo, haja vista a incoerência encontrada na literatura voltada a Programação Orientada a Objeto sobre quais são as abstrações (aspectos) mais importantes envolvidas nesta teoria. 13 2.3.1. Classes e Objetos Objetos e classes são os dois principais conceitos de qualquer linguagem de programação Orientada a Objetos. A definição de classe descreve quais propriedades, atributos e métodos os objetos terão. Já a definição de um objeto é a de uma entidade que pode ser manipulada, ou seja, qualquer coisa que tenha significado e limites bem definidos é um objeto, podendo ter seu estado modificado através da invocação dos métodos das classes a que os mesmos pertencem. 2.3.2. Abstração Em termos de desenvolvimento de sistemas, abstração consiste em identificar os aspectos essenciais inerentes a uma entidade. Isto significa concentrar-se no que um objeto é e o quê ele fará antes de decidir como ele será implementado (RICARTE, 2001, p. 52). Assim, um desenvolvedor, ao abstrair um objeto do mundo real, deve atentar-se a qual conjunto de objetos do mundo real, no qual o mesmo está inserido, e quais são as características semelhantes deste objeto com os outros, descartando seus pontos desprezíveis, dando maior enfoque nos seus pontos essenciais. Desta forma, cada objeto que compõe um sistema é um modelo, um ator abstrato que pode apresentar variações em seu estado, comunicar-se com outros objetos, conforme as características abstraídas, tornando possível a implementação das classes, objetos, dos métodos e funções do sistema. 14 Figura 2: Exemplo de abstração No exemplo apresentado na Figura 2, o desenvolvedor teve a habilidade de classificar e categorizar os meios de transportes, de forma a agrupar todos aqueles com características comuns. Ou seja, o desenvolvedor captou os atributos e operações comuns aos objetos, e os agrupou nas classes e subclasses acima descritas. 2.3.3. Encapsulamento Encapsulamento permite ao desenvolvedor restringir os acessos às classes e as declarações de uma classe, utilizando-se de palavras reservadas denominadas qualificadores que são elas: public, private, protected. Caso haja omissão na declaração, o método ou a propriedade será declarada, por padrão em algumas linguagens, do tipo public, ou seja, os membros desta serão visíveis a todas as outras classes. No caso da declaração ser feita do tipo protected os membros 15 declarados nesta classe, serão visíveis somente para as classes e subclasses dentro do mesmo pacote. E, por último, caso a declaração seja feita do tipo private¸ os membros declarados nesta classe serão isolados, escondidos das demais, e somente poderão ser acessadas pela classe que as declarou. Essa prática é válida quando, o desenvolvedor necessita de que os atributos declarados em uma classe sejam apenas utilizados por ela. A idéia é simples, deve-se fornecer ao usuário, cliente de uma classe, o necessário, e somente o necessário para que ele tire proveito da funcionalidade desta classe. Os detalhes devem ser omitidos, somente a lista de operações a qual uma classe deve atender fica visível (CESTA, 1996, p. 56). <?php class ContaCorrente { protected $titularID; protected $agenciaID; protected $contaID; protected $saldo; public function __construct() { $this->titularID = NULL; $this->agenciaID = NULL; $this->contaID = NULL; $this->saldo = NULL; } } class ContaCorrenteEspecial extends ContaCorrente { protected $limite; function setLimiteConta($valorLimite){ $this->limite = $valorLimite; } ?> } Figura 3: Exemplo de encapsulamento A Figura 3 apresenta um breve exemplo do uso da técnica de encapsulamento, onde as variáveis definidas como do tipo protected, só poderão ser acessadas pela classe ContaCorrente ou por aquelas que estenderem-se a partir dela (suas subclasses), simplesmente pelo fato da mesma ter sido declarada como do tipo protected. Neste caso, a 16 classe ContaCorrenteEspecial (classe filha) além de ter acesso aos atributos próprios também herdará todos os atributos da classe ContaCorrente (classe pai). 2.3.4. Herança Herança é o mecanismo do paradigma de orientação a objetos que permite compartilhar atributos e operações entre classes, baseada em um relacionamento hierárquico. Uma classe pode ser definida de forma genérica e depois refinada sucessivamente em termos de subclasses ou classes derivadas. Cada subclasse incorpora, ou herda, todas as propriedades de sua superclasse (ou classe base) e adiciona suas propriedades únicas e particulares. As propriedades da classe base não precisam ser repetidas em cada classe derivada. Esta capacidade de fatorar as propriedades comuns de diversas classes em uma superclasse pode reduzir dramaticamente a repetição de código em um projeto ou programa, sendo esta uma das principais vantagens da abordagem de orientação a objetos (RICARTE, 2001, p. 61). Resumidamente, é o meio de se criar, especializar novas classes ou objetos aproveitando-se de outros objetos ou classes já implementadas anteriormente. Figura 4: Exemplo de Herança 17 Na Figura 4, tem-se o exemplo simples de um sistema bancário, onde através da superclasse Conta Bancária foi possível a definição de duas subclasses distintas (conta corrente e conta poupança) e que, além de herdar e compartilhar suas características com sua classe pai, podem também receber características particulares como saldo e limite. 2.3.5. Polimorfismo “A palavra polimorfismo advém da língua grega e significa muitas formas. A partir daí surge a idéia de permitir que o mesmo código seja utilizado de diferentes tipos, apresentando variados tipos de comportamentos, dependendo do tipo real de um objeto tendo como resultado, implementações mais generalizadas” (RICARTE, 2001, p. 52). Este conceito de programação orientado a objeto usado para denotar o suporte a utilização do mesmo identificador para métodos de classes distintas. Geralmente, empregase polimorfismo quando se é necessário o uso de nomes idênticos para tarefas similares em classes distintas. A utilização deste acaba tornando o código da aplicação, mais simples, claro e fácil de compreender, uma vez que, na sua ausência, o desenvolvedor necessitaria de criar uma lista, muitas vezes enorme de métodos, com diferentes nomes para cada um deles, porém com um comportamento bastante parecido, o que deixaria o código confuso e trabalhoso. Portanto, polimorfismo consiste na atribuição de comportamentos proprietários de uma classe a outra. 2.3.6. Interfaces As Interfaces permitem que o desenvolvedor necessite conhecer apenas um conjunto reduzido de conceitos e métodos, podendo desacoplar funcionalidades da abstração de uma classe (ZEND, 2006). 18 Interface é semelhante a uma classe, porém possuem um aspecto mais restritivo. Em interface todos os métodos são declarados juntamente com suas assinaturas (nome, parâmetros e tipo de retorno), porém não possuem implementação. 19 3. MATERIAIS E MÉTODOS Para o desenvolvimento desse trabalho, vários recursos foram utilizados: material bibliográfico, hardware e software, os quais serão citados a seguir. 3.1. ESTRUTURA FÍSICA E LÓGICA Para o desenvolvimento deste trabalho foi utilizado um microcomputador padrão IBM, composto por um processador Pentium® IV 3.0 GHz, com sistema operacional Slackware® Linux 10.2, sendo utilizado como software, o banco de dados MySql® 5.0 e o servidor WEB Apache®, com a extensão PHP 5. Foram utilizadas como ferramentas para o desenvolvimento do trabalho o Umbrello UML®, utilizada para desenvolver a modelagem do sistema, utilizando a linguagem UML, e o NVU®, utilizado para criação de páginas WEB, envolvendo design e programação. 3.2. MÉTODOS APLICADOS Foram realizados estudos a cerca da Engenharia de Softwares, aplicado ao desenvolvimento orientado a objetos, além de pesquisas sobre a linguagem de programação PHP em sua versão 5. Já para os requisitos do sistema foi realizado um levantamento das tarefas básicas de um almoxarifado para que o sistema fosse de fato concebido e atendendo as necessidades daquele setor. 20 4. RESULTADOS E DISCUSSÃO Para que o objetivo deste trabalho fosse alcançado diversos trabalhos foram desenvolvidos. Neste capítulo serão apresentados estes trabalhos, de forma seqüencial, levando ao fim ao objetivo conquistado. Nesta fase, encontram-se os diagramas de casos de uso, seguindo a modelagem em UML, os casos de uso reais, o diagrama de classe do sistema proposto, o modelo relacional do banco de dados, bem como a implementação das classes que compõe o referido sistema. 4.1. DIAGRAMAS DE CASOS DE USO Figura 5: Diagrama de Casos de Uso 21 4.2. Casos de Uso Reais 4.2.1. Logar Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O usuário acessa a área de login. 2. O sistema apresenta o formulário de login 3. O usuário preenche o formulário digitando os dados necessários nos campos Login e Senha conforme Figura 6. 4. O usuário possui a opção Logar, 5. O sistema faz a autenticação e redireciona representada pelo botão Logar conforme para sua área de trabalho Figura 6. Seqüências Alternativas: 5. Senha incorreta ou Usuário inválido: o sistema exibe uma mensagem informativa, conforme apresentado na Figura 7. Figura 6: Caso de Uso Logar 22 Figura 7: Caso de uso logar com erro 4.2.2. Incluir Classe de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir uma nova classe de produtos. inclusão da nova classe de produtos. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados Nome, Grupo e Natureza conforme Figura 8. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome exibe uma mensagem de confirmação do conforme Figura 8. cadastrado no rodapé da página. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro, informando ao usuário que os dados estão preenchidos de maneira incorreta. 23 Figura 8: Caso de uso inclusão de classe de produto 4.2.3. Consultar Classe de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar uma classe de produtos. consulta da classe de produtos. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 8. 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 8. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no rodapé da mesma página, informando ao usuário. 24 4.2.4. Alterar Classe de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma classe de produtos. cadastro de classe de produtos. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, conforme Figura 8. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 8. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.5. Excluir Classe de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma classe de produtos. cadastro de classe de produtos. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 8. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 8. rodapé da página. Seqüências Alternativas: 5. Usuário nao selecionou nenhuma caixa de seleção: O sistema exibe uma mensagem, informando ao usuário. 25 4.2.6. Incluir Grupo de Produtos Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir um novo grupo de produtos. inclusão de novo grupo de produtos. 3. O usuário preenche o formulário digitando/selecionando os dados necessários nos campos denominados Nome e Natureza conforme Figura 9. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome exibe uma mensagem de confirmação do conforme Figura 9. cadastrado no rodapé da página. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. Figura 9: Caso de uso inclusão de grupo de produto 26 4.2.7. Consultar Grupos de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar um grupo de produto. consulta de grupos de produtos. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 9. 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 9. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no rodapé da mesma página, informando ao usuário. 4.2.8. Alterar Grupos de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar um grupo de produtos. cadastro de grupo de produtos. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, conforme Figura 9. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 9. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.9. Excluir Grupos de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar um grupo de produtos. cadastro de grupo de produtos. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 9. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 9. rodapé da página. Seqüências Alternativas: 5. Usuário não selecionou nenhuma caixa de seleção: O 27 sistema exibe uma mensagem, informando ao usuário. 4.2.10. Incluir Unidades de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir uma nova unidade de produtos. inclusão da nova unidade de produtos. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados Código e Descrição conforme Figura 10. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome exibe uma mensagem de confirmação do conforme Figura 10. cadastrado no rodapé da página. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. Figura 10: Caso de uso inclusão de unidades de produto 28 4.2.11. Consultar Unidades de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar uma unidade de produto. consulta de unidade de produtos. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 10. 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 10. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no rodapé da mesma página, informando ao usuário. 4.2.12. Alterar Unidades de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma unidade de produtos. cadastro de unidade de produtos. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, conforme Figura 10. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 10. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.13. Excluir Unidades de Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma unidade de produtos. cadastro de unidades de produtos. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 10. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma 29 inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 10. rodapé da página. Seqüências Alternativas: 5. Usuário nao selecionou nenhuma caixa de seleção: O sistema exibe uma mensagem, informando ao usuário. 4.2.14. Incluir Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir um novo produto. inclusão do novo produto. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados Nome, Unidade, Classe e o Estoque Mínimo, conforme Figura 11. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme Figura 11. cadastrado no rodapé da página. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. 30 Figura 11: Caso de uso inclusão de produtos 4.2.15. Consultar Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar um produto. consulta de produtos. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 11. 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu 31 representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 11. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no rodapé da mesma página, informando ao usuário. 4.2.16. Alterar Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar um produto. cadastro de produtos. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, conforme Figura 11. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 11. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.17. Excluir Produto Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar produtos. cadastro de produtos. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 11. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 11. rodapé da página. Seqüências Alternativas: 5. Usuário não selecionou nenhuma caixa de seleção: O sistema exibe uma mensagem, informando ao usuário. 32 4.2.18. Incluir Fornecedores Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir um novo fornecedor. inclusão do novo Fornecedor. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados CNPJ, Razão Social, Nome Fantasia,Inscrição Estadual, Endereço, Bairro, Cidade, CEP, UF, Fone, Fax e Email, conforme Figura 12 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme Figura 12. cadastrado no rodapé da página. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. 33 Figura 12: Caso de uso inclusão de Fornecedores 34 4.2.19. Consultar Fornecedores Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar um fornecedor. consulta de fornecedores. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 12. 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 12. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no rodapé da mesma página, informando ao usuário. 4.2.20. Alterar Fornecedores Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar um fornecedor. cadastro de fornecedores. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de itens exibida neste formulário, conforme Figura 12. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 12. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.21. Excluir Fornecedores Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar fornecedores. cadastro de fornecedores. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 12. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no 35 mesmo nome conforme Figura 12. rodapé da página. Seqüências Alternativas: 5. Usuário não selecionou nenhuma caixa de seleção: O sistema exibe uma mensagem, informando ao usuário. 4.2.22. Incluir Movimentação Externa (Compra De Materiais) Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir uma movimentação externa. inclusão da movimentação externa. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados, Data, Número da Nota Fiscal, Número do Documento de Origem, Data Documento Origem, Nome da Transportadora (se houver) e selecionando o Fornecedor do Material adquirido conforme Figura 13. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme Figura 13. cadastrado no rodapé da página e direciona para o módulo de inclusão de itens de movimentação externa. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. 36 Figura 13: Caso de uso inclusão de Movimentação Externa 4.2.23. Consultar Movimentação Externa Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar uma entrada de material. consulta de entrada de materiais. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 13. 37 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 13. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no rodapé da mesma página, informando ao usuário. 4.2.24. Alterar Movimentação Externa Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma entrada de material. cadastro de entrada de material. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de itens exibida neste formulário, conforme Figura 13. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 13. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.25. Excluir Movimentação Externa Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma entrada de material. cadastro de entrada de material. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de itens exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 13. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 13. rodapé da página. Seqüências Alternativas: 5. Usuário não selecionou nenhuma caixa de seleção: O sistema exibe uma mensagem, informando ao usuário. 38 4.2.26. Incluir Itens da Movimentacao Externa Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir uma movimentação externa. inclusão da movimentação externa. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados, Data, Número da Nota Fiscal, Número do Documento de Origem, Data Documento Origem, Nome da Transportadora (se houver) e selecionando o Fornecedor do Material adquirido, conforme figura 13. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme figura 13. cadastrado no rodapé da página e direciona para o módulo de inclusão de itens de movimentação externa apresentando o respectivo formulário. 6. O usuário preenche o formulário informando os dados necessários nos campos denominados Produto, Quantidade Adquirida e Valor Unitário do Material Adquirido, conforme figura 14. 7. O usuário possui a opção Salvar, 8. O sistema faz a validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme figura 14. cadastrado no rodapé da página. Seqüências Alternativas: 8. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. 39 Figura 14: Caso de uso inclusão de Itens da Movimentação Externa 4.2.27. Alterar Itens da Movimentação Externa Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma entrada de material. cadastro de entrada de material. 3. O usuário seleciona a movimentação 4. o sistema apresenta o formulário de externa que deseja alterar seus itens. cadastro dos itens de entrada de material 5. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de itens exibida neste formulário, conforme Figura 40 14. 6. O usuário possui a opção Salvar (da parte inferior da tela), representada pelo botão de mesmo nome conforme Figura 14. 4.2.28. 7. O sistema realiza a atualização exibindo seu novo resultado de acordo com o(s) dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. Excluir Itens da Movimentação Externa Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma entrada de material. cadastro de entrada de material. 3. O usuário seleciona a movimentação 4. o sistema apresenta o formulário de externa que deseja alterar seus itens. cadastro dos itens de entrada de material 5. O usuário seleciona a(s) linha(s) escolhida(s), diretamente na lista de itens exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 14. 6. O usuário possui a opção Excluir (da parte 7. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 14. rodapé da página. 5. Usuário não selecionou nenhuma caixa de Seqüência Alternativa seleção: O sistema exibe uma mensagem, informando ao usuário. 41 4.2.29. Incluir Movimentação Interna (Requisições de Materiais) Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir uma movimentação interna. inclusão da movimentação interna. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados, Data da Solicitação e selecionando o Departamento e o Funcionário que originaram a Requisição de Material, conforme a figura 14. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme a figura 14. cadastrado no rodapé da página e direciona para o módulo de inclusão de items de movimentação interna. Seqüências Alternativas: 5. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. 42 Figura 15: Caso de uso inclusão de Movimentação Interna 4.2.30. Consultar Movimentação Interna Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a consultar uma saida de material. consulta de saida de materiais. 3. O usuário digita o dado desejado para a referida consulta no campo denominado Procurar conforme Figura 15. 4. O usuário possui a opção Pesquisar, 5. O sistema realiza a consulta exibindo seu representada pelo botão de mesmo nome resultado de acordo com o(s) dado(s) conforme Figura 15. informados pelo ator. Seqüências Alternativas: 5. Consulta retorna nulo: O sistema exibe uma mensagem no 43 rodapé da mesma página, informando ao usuário. 4.2.31. Alterar Movimentação Interna Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma saída de material. cadastro de saída de material. 3. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, conforme Figura 14. 4. O usuário possui a opção Salvar (da parte 5. O sistema realiza a atualização exibindo inferior da tela), representada pelo botão de seu novo resultado de acordo com o(s) mesmo nome conforme Figura 14. dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. 4.2.32. Excluir Movimentação Interna Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma saida de material. cadastro de saída de material. 3. O usuário seleciona o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 14. 4. O usuário possui a opção Excluir (da parte 5. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 14. rodapé da página. Seqüências Alternativas: 5. Usuário nao selecionou nenhuma caixa de seleção: O sistema exibe uma mensagem, informando ao usuário. 44 4.2.33. Incluir Itens da Movimentação Interna Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário para a incluir uma movimentação interna. inclusão da movimentação interna. 3. O usuário preenche o formulário digitando os dados necessários nos campos denominados, Data da Solicitação e selecionando o Departamento e o Funcionario que originaram a Requisicao de Material, conforme a figura 15. 4. O usuário possui a opção Salvar, 5. O sistema faz validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme a figura 15. cadastrado no rodapé da página e direciona para o módulo de inclusão de items de movimentação interna apresentando o respectivo formulário. 6. O usuário preeenche o formulário informando os dados necessários nos campos denominados Produto e Quantidade Solicitada do Material, conforme a figura 16. 7. O usuário possui a opção Salvar, 8. O sistema faz a validação dos dados e representada pelo botão de mesmo nome, exibe uma mensagem de confirmação do conforme a figura 16. cadastrado no rodapé da página. Seqüências Alternativas: 8. Dados cadastrais incorretos / em brancos: O sistema exibe uma mensagem de erro no rodapé da mesma página de cadastro informando ao usuário que os dados estão preenchidos de maneira incorreta. 8. Estoque Insuficiente: Sistema Exibe uma mensagem de erro no rodapé da mesma página informando ao usuário que a quantidade solicitada é superior a contida no estoque. 45 Figura 16: Caso de uso inclusão de Itens da Movimentação Interna 4.2.34. Alterar Itens da Movimentação Interna Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma saida de material. cadastro de saida de material. 3. O usuário seleciona a movimentação 4. O sistema apresenta o formulário de interna que deseja alterar seus items. cadastro dos itens de saída de material 5. O usuário altera o(s) dado(s) da(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, conforme Figura 16. 46 6. O usuário possui a opção Salvar (da parte inferior da tela), representada pelo botão de mesmo nome conforme Figura 16. 4.2.35. 7. O sistema realiza a atualização exibindo seu novo resultado de acordo com o(s) dado(s) informados pelo ator e exibe uma mensagem de confirmação da alteração no rodapé da página.. Excluir Itens da Movimentação Interna Seqüência Típica de Eventos Ação do Ator Resposta do Sistema 1. O ator escolhe a funcionalidade para 2. O sistema apresenta o formulário de cadastrar uma saida de material. cadastro de saida de material. 3. O usuário seleciona a movimentação 4. o sistema apresenta o formulario de interna que deseja alterar seus items. cadastro dos itens de saida de material 5. O usuário seleciona a(s) linha(s) escolhida(s), diretamente na lista de items exibida neste formulário, através das caixas de seleção desta lista, conforme Figura 16. 6. O usuário possui a opção Excluir (da parte 7. O sistema realiza a exclusão e exibe uma inferior da tela), representada pelo botão de mensagem de confirmação da exclusão no mesmo nome conforme Figura 16. rodapé da página. 5. Usuário nao selecionou nenhuma caixa de Seqüencia Alternativa seleção: O sistema exibe uma mensagem, informando ao usuário. 47 4.3. Diagrama de Classes do Projeto Figura 17: Diagrama de Classes em UML 48 4.4. Modelo Relacional do Banco de Dados Figura 18: Dicionário de Dados 49 4.5. Implementação do Sistema 4.5.1. Cadastro de Unidades <?php include("DBConnector.php"); class Unidade { private $Codigo; private $Nome; function __construct() { $this->Codigo = NULL; $this->Nome = NULL; } function setCodigo($codigo) { $this->Codigo = $codigo; } function getCodigo() { return $this->Codigo; } function setNome($nome) { $this->Nome = $nome; } function getNome() { return $this->Nome; } function incluirUnidade($cod, $nome) { $db = new DBConnector(); $this->setCodigo($cod); $this->setNome($nome); $sql = "INSERT INTO Unidade (UnidadeCodigo, UnidadeNome) VALUES ('".$this->getCodigo()."', '".$this->getNome()."')"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function incluirUnidade function atualizarUnidade($nomeUnd, $codUnid) { $db = new DBConnector(); $sql = "UPDATE Unidade SET UnidadeNome = '$nomeUnd' UnidadeCodigo = '$codUnid'"; $db->Manipulate_Data($sql); $db->DbDisconnect(); WHERE } // end of member function atualizarUnidade function excluirUnidade($codUnidade) { $db = new DBConnector(); $sql = "DELETE FROM Unidade $db->Manipulate_Data($sql); WHERE UnidadeCodigo = '$codUnidade'"; 50 $db->DbDisconnect(); } // end of member function excluirUnidade function buscarUnidade($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM Unidade WHERE UnidadeNome Like '".$unidNome."%' ORDER BY UnidadeNome"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmUnidades" method="post" action="atualizarUnidades.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> 51 <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { 52 echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } // end of member function buscarUnidade } // end of Unidade ?> <?php session_start(); require_once("../../includes/classes/unidade.php"); if ($_SERVER['REQUEST_METHOD'] =='POST') { $codUnid = strtoupper(trim($_POST['fldCodUnidade'])); $descUnid = strtoupper(trim($_POST['fldDescUnidade'])); } $unidade = new Unidade(); $unidade->incluirUnidade($codUnid, $descUnid); $_SESSION['mensagem']="Unidade Incluida com Sucesso"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/unidade.php"); for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; $unidade = new Unidade(); $unidade->excluirUnidade($indice); $cont++; } if ($cont > 0) $_SESSION['mensagem'] = "$cont registro(s) excluido(s) com Êxito!"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/unidade.php"); $cont = 0; for ($i=0; $i<count($_POST['fldUndCod']); $i++) 53 { $indice = $_POST['fldUndCod'][$i]; for ($j=0; $j<count($_POST['fldIndiceCod']); $j++) { if ($indice == $_POST['fldIndiceCod'][$j]) { $novoNome = trim(strtoupper($_POST['fldUnidDescr'][$j])); $unidade = new Unidade(); $unidade->atualizarUnidade($novoNome, $indice); $cont++; } } } if ($cont > 0) session_register('mensagem'); $_SESSION['mensagem'] = "$cont unidade(s) atualizada(s) com exito!!!"; header("Location: index.php?pagina=1"); ?> 4.5.2. Cadastro de Produtos <?php class Produto { private private private private private $Nome; $Classe; $Unidade; $EstoqueMin; $EstoqueAtual; function __construct() { $this->Nome = NULL; $this->Classe = NULL; $this->Unidade = NULL; $this->EstoqueMin = NULL; $this->EstoqueAtual = NULL; } function setNome($nome) { $this->Nome = $nome; } function getNome() { return $this->Nome; } function setClasse($classe) { $this->Classe = $classe; } function getClasse() { return $this->Classe; } function setUnidade($und) { $this->Unidade = $und; } function getUnidade() { 54 } return $this->Unidade; function setEstoqueMin($em) { $this->EstoqueMin = $em; } function getEstoqueMin() { return $this->EstoqueMin; } function setEstoqueAtual($ea) { $this->EstoqueAtual = $ea; } function getEstoqueAtual() { return $this->EstoqueAtual; } function incluirProduto($nome, $classe, $und, $ea, $em) { $db = new DBConnector(); $this->setNome($nome); $this->setClasse($classe); $this->setUnidade($und); $this->setEstoqueMin($em); $this->setEstoqueAtual($ea); $sql = "INSERT INTO Produto (Unidade_UnidadeCodigo, Classe_ClasseCodigo, ProdutoNome, ProdutoEstoqueMin, ProdutoEstoqueAtual) VALUES('".$this->getUnidade()."', ".$this->getClasse().", '".$this->getNome()."', ".$this->getEstoqueMin().", ".$this->getEstoqueAtual().")"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function incluirProduto function excluirProduto($codProd) { $db = new DBConnector(); $sql = "DELETE FROM Produto WHERE ProdutoCodigo = $codProd"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function excluirProduto function buscarProduto($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM Produto WHERE ProdutoNome Like '".$unidNome."%' ORDER BY ProdutoNome"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmProduto" method="post" action="atualizarProdutos.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... 55 else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['ProdutoCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['ProdutoCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['ProdutoCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['ProdutoCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['ProdutoCodigo'])?>')" value="<?=strtoupper(trim($linha['ProdutoNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> 56 <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } // end of member function buscarProduto function atualizarProduto($nome, $classe, $und, $ea, $em, $cod) { $db = new DBConnector(); $sql = "UPDATE Produto SET Unidade_UnidadeCodigo = '$und', Classe_ClasseCodigo = '$classe', ProdutoNome = '$nome', ProdutoEstoqueMin = $em, ProdutoEstoqueAtual = $ea WHERE ProdutoCodigo = $codUnid"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function atualizarProduto 57 } // end of Produto ?> <?php session_start(); require_once("../../includes/classes/produto.php"); if ($_SERVER['REQUEST_METHOD'] =='POST') { $nome = strtoupper(trim($_POST['fldNomeProd'])); $classe = $_POST['selClasse']; $und = $_POST['selUnid']; $ea = $_POST['fldProdEstAtual']; $em = $_POST['fldProdEstMin']; } $produto = new Produto(); $produto->incluirProduto($nome, $classe, $und, $ea, $em); $_SESSION['mensagem']="Produto Incluido com Sucesso"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/produto.php"); for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; $produto = new Produto(); $produto->excluirProduto($indice); $cont++; } if ($cont > 0) $_SESSION['mensagem'] = "$cont registro(s) excluido(s) com Êxito!"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/produto.php"); $cont = 0; for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; for ($j=0; $j<count($_POST['fldIndiceCod']); $j++) { if ($indice == $_POST['fldIndiceCod'][$j]) { $nome = trim(strtoupper($_POST['fldProdNome'][$j])); $classe = $_POST['selProdClasse'][$j]; $und = $_POST['selProdUnid'][$j]; $ea = $_POST['fldProdEstAt'][$j]; $em = $_POST['fldProdEstMin'][$j]; $produto = new Produto(); $produto->atualizarProduto($nome, $classe, $und, $ea, $em, $indice); $cont++; } } } if ($cont > 0) 58 session_register('mensagem'); $_SESSION['mensagem'] = "$cont produto(s) atualizado(s) com exito!!!"; header("Location: index.php?pagina=1"); ?> 4.5.3. Cadastro de Classes <?php class Classe { public $GrupoClasse; public $ClasseDescricao; public $ClasseNatureza; function __construct() { $this->GrupoClasse = NULL; $this->ClasseDescricao = NULL; $this->ClasseNatureza = NULL; } function setGrupoClasse($grupoClasse) { $this->GrupoClasse = $grupoClasse; } function setClasseDescr($classeDescr) { $this->ClasseDescricao = $classeDescr; } function setClasseNatureza($classeNat) { $this->ClasseNatureza = $classeNat; } function getGrupoClasse() { return $this->GrupoClasse; } function getClasseDescr() { return $this->ClasseDescricao; } function getClasseNatureza() { return $this->ClasseNatureza; } function incluirClasse($grupoClasse,$classeDescr, $classeNat) { $db = new Conexao(); $this->setGrupoClasse($grupoClasse); $this->setClasseDescr($classeDescr); $this->setClasseNatureza($classeNat); $query = "INSERT INTO Classe (ClasseNome, ClasseGrupoCd, ClasseGrupoNat) VALUES ('".$this->getClasseDescr()."', ".$this->getGrupoClasse().", ".$this>getClasseNatureza().")" ; $db->Manipular($sql); $db->Fechar(); } function excluirClasse($classeID) 59 { $db = new Conexao(); $sql = "DELETE FROM Classe WHERE ClasseCodigo=$classeID"; $db->Manipular($sql); $db->Fechar(); } function atualizarClasse($grupoClasse,$classeDescr, $classeNat, $classeID) { $db = new Conexao(); $this->setGrupoClasse($grupoClasse); $this->setClasseDescr($classeDescr); $this->setClasseNatureza($classeNat); $sql = "UPDATE Classe SET ClasseNome = '".$this->getClasseDescr()."' , ClasseGrupoCd = ".$this->getGrupoClasse().", ClasseGrupoNat = ".$this>getClasseNatureza()." WHERE ClasseCodigo = $classeID"; $db->Manipular($sql); $db->Fechar(); } function buscarClasse($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM Classe WHERE ClasseNome Like '".$unidNome."%' ORDER BY ClasseNome"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmClasse" method="post" action="atualizarClasses.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> 60 <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } 61 else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } } ?> <?php session_start(); require_once("../../includes/classes/classe.php"); if ($_SERVER['REQUEST_METHOD'] =='POST') { $nome = strtoupper(trim($_POST['fldNomeClasse'])); $grupo = $_POST['cmbGrupo']; $natur = $_POST['cmbNat']; } $classe = new Classe(); $classe->incluirClasse($nome, $grupo, $natur); $_SESSION['mensagem']="Classe Incluida com Sucesso"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/classe.php"); for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; $classe = new Classe(); $classe->excluirClasse($indice); 62 $cont++; } if ($cont > 0) $_SESSION['mensagem'] = "$cont registro(s) excluido(s) com Êxito!"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/classe.php"); $cont = 0; for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; for ($j=0; $j<count($_POST['fldIndiceCod']); $j++) { if ($indice == $_POST['fldIndiceCod'][$j]) { $grupoClasse = $_POST['selclassegrupo'][$j]; $classeDescr = trim(strtoupper($_POST['fldclasseDescr'][$j])); $classeNat = $_POST['selclassenat'][$j]; $classe = new Classe(); $classe->atualizarClasse($grupoClasse,$classeDescr, $classeNat, $indice); $cont++; } } } if ($cont > 0) session_register('mensagem'); $_SESSION['mensagem'] = "$cont classe(s) atualizada(s) com exito!!!"; header("Location: index.php?pagina=1"); ?> 4.5.4. Cadastro de Grupos <?php include("DBConnector.php"); class Grupo { public $GrupoNome; public $GrupoNatureza; function __construct() { $this->GrupoNome = NULL; $this->GrupoNatureza = NULL; } function setGrupoNome($grupoNome) { $this->GrupoNome = $grupoNome; } function setGrupoNatureza($grupoNatureza) { $this->GrupoNatureza = $grupoNatureza; } 63 function getGrupoNome() { return $this->GrupoNome; } function getGrupoNatureza() { return $this->GrupoNatureza; } function incluirGrupo($nome, $natureza) { $db = new DBConnector(); $this->setGrupoNome($nome); $this->setGrupoNatureza($natureza); $sql = "INSERT INTO Grupo (GrupoNatureza,GrupoNome) VALUES ('".$this>getGrupoNome()."', '".$this->getGrupoNatureza()."')"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } function excluirGrupo($codGrupo) { $db = new DBConnector(); $sql = "DELETE FROM Grupo WHERE GrupoCodigo = $codGrupo"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } function atualizarGrupo($grupoNome, $grupoNat, $codGrupo ) { $db = new DBConnector(); $sql = "UPDATE Grupo SET GrupoNome = '$grupoNome', GrupoNatureza = '$grupoNat' WHERE GrupoCodigo = $codGrupo"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } function buscarGrupo($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM Grupo WHERE GrupoNome Like '".$unidNome."%' ORDER BY GrupoNome"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmGrupos" method="post" action="atualizarGrupos.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } 64 $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } 65 else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } } ?> <?php session_start(); require_once("../../includes/classes/grupo.php"); if ($_SERVER['REQUEST_METHOD'] =='POST') { $nomeGrupo = strtoupper(trim($_POST['fldNomeGrupo'])); $natGrupo = $_POST['cmbNatGrupo']; } $grupo = new Grupo(); $grupo->incluirGrupo($nomeGrupo, $natGrupo); 66 $_SESSION['mensagem']="Grupo Incluido com Sucesso"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/grupo.php"); for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; $grupo = new Grupo(); $unidade->excluirGrupo($indice); $cont++; } if ($cont > 0) $_SESSION['mensagem'] = "$cont registro(s) excluido(s) com Êxito!"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/grupo.php"); $cont = 0; for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; for ($j=0; $j<count($_POST['fldIndiceCod']); $j++) { if ($indice == $_POST['fldIndiceCod'][$j]) { $novoNome = trim(strtoupper($_POST['fldUnidDescr'][$j])); $novaNat = $_POST['selNat'][$j]; $grupo = new Grupo(); $grupo->atualizarGrupo($novoNome, $novaNat, $indice); $cont++; } } } if ($cont > 0) session_register('mensagem'); $_SESSION['mensagem'] = "$cont grupo(s) atualizado(s) com exito!!!"; header("Location: index.php?pagina=1"); ?> 4.5.5. Cadastro de Fornecedores <?php include("DBConnector.php"); class Fornecedores { public public public public public public public $FornecedorCNPJ; $RazaoSocial; $NomeFantasia; $InscrEstadual; $Endereco; $Bairro; $Cidade; 67 public public public public public $CEP; $UF; $Fone; $Fax; $Email; function setFornecedorCNPJ($cnpj){ $this->FornecedorCNPJ = $cnpj; } function setRazaoSocial($razao){ $this->RazaoSocial = $razao; } function setNomeFantasia($nome){ $this->NomeFantasia = $nome; } function setInscrEstadual($inscrEst){ $this->InscrEstadual = $inscrEst; } function setEndereco($endereco){ $this->Endereco = $endereco; } function setBairro($bairro){ $this->Bairro = $bairro; } function setCidade($cidade){ $this->Cidade = $cidade; } function setCEP($cep){ $this->CEP = $cep; } function setUF($uf){ $this->UF = $uf; } function setFone($fone){ $this->Fone = $fone; } function setFax($fax){ $this->Fax = $fax; } function setEmail($mail){ $this->Email = $mail; } function getFornecedorCNPJ(){ return $this->FornecedorCNPJ; } function getRazaoSocial(){ return $this->RazaoSocial; } function getNomeFantasia(){ return $this->NomeFantasia; } function getInscrEstadual(){ return $this->InscrEstadual; } function getEndereco(){ return $this->Endereco; } function getBairro(){ return $this->Bairro; } function getCidade(){ return $this->Cidade; } function getCEP(){ return $this->CEP; 68 } function getUF(){ return $this->UF; } function getFone(){ return $this->Fone; } function getFax(){ return $this->Fax; } function getEmail(){ return $this->Email; } function incluirFornecedor($cnpj,$razao, $nome, $inscrEst,$endereco, $inscrEst, $endereco, $bairro, $cidade, $cep, $uf, $fone, $fax, $mail) { $db = new Conexao(); $this->setFornecedorCNPJ($cnpj); $this->setRazaoSocial($razao); $this->setNomeFantasia($nome); $this->setInscrEstadual($inscrEst); $this->setEndereco($endereco); $this->setBairro($bairro); $this->setCidade($cidade); $this->setCEP($cep); $this->setUF($uf); $this->setFone($fone); $this->setFax($fax); $this->setEmail($mail); $sql = "INSERT INTO Fornecedor (FornecedorCNPJ, FornecedorRazaoSocial, FornecedorNome, FornecedorInscrEstadual, FornecedorEndereco, FornecedorBairro, FornecedorCidade, FornecedorCEP, FornecedorUF, FornecedorFone, FornecedorFax, FornecedorEmail) VALUES('".$this->getFornecedorCNPJ()."','".$this>getRazaoSocial()."','".$this->getNomeFantasia()."','".$this>getInscrEstadual()."','".$this->getEndereco()."','".$this>getBairro()."','".$this->getCidade."','".$this->getCEP."','".$this>getUF()."','".$this->getFone()."','".$this->getFax()."','".$this>getEmail()."')"; $db->Manipular($sql); $db->Fechar(); } function excluirFornecedor($cnpj) { $db = new Conexao(); $sql = "DELETE FROM Fornecedor WHERE FornecedorCNPJ=$cnpj"; $db->Manipular($sql); $db->Fechar(); } function atualizarFornecedor($cnpj,$razao, $nome, $inscrEst,$endereco, $endereco, $bairro, $cidade, $cep, $uf, $fone, $fax, $mail) { $db = new Conexao(); $this->setRazaoSocial($razao); $this->setNomeFantasia($nome); $this->setInscrEstadual($inscrEst); $this->setEndereco($endereco); $this->setBairro($bairro); $this->setCidade($cidade); $this->setCEP($cep); $this->setUF($uf); $this->setFone($fone); 69 $this->setFax($fax); $this->setEmail($mail); $sql = "UPDATE Fornecedor SET FornecedorRazaoSocial = '".$this>getRazaoSocial()"', FornecedorNome = '".$this->getNome()"', FornecedorInscrEstadual = '".$this->getInscrEstadual()"', FornecedorEndereco = '".$this->getInscrEstadual()"', FornecedorBairro = '".$this->getInscrEstadual()"', FornecedorCidade = '".$this->getCidade()"', FornecedorCEP = '".$this->getCEP()"', FornecedorUF = '".$this->getUF()"', FornecedorFone = '".$this->getFone()"', FornecedorFax = '".$this->getFax()"', FornecedorEmail = '".$this->getEmail()"' WHERE FornecedorCNPJ = '$cnpj'"; $db->Manipular($sql); $db->Fechar(); } function buscarFornecedor($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM Fornecedor WHERE FornecedorRazaoSocial Like '".$unidNome."%' ORDER BY FornecedorRazaoSocial"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmFornecedores" method="post" action="atualizarFornecedores.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php 70 while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } 71 if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } } // end of Fornecedores ?> <?php session_start(); require_once("../../includes/classes/fornecedores.php"); if ($_SERVER['REQUEST_METHOD'] =='POST') { $cnpj = trim(strtoupper($_POST['fldforncnpj'])); $razao = trim(strtoupper($_POST['fldfornrazao'])); $nome = trim(strtoupper($_POST['fldfornnome'])); $inscrEst = trim(strtoupper($_POST['fldforninscEst'])); $endereco = trim(strtoupper($_POST['fldfornender'])); $bairro = trim(strtoupper($_POST['fldfornbairro'])); $cidade = trim(strtoupper($_POST['fldforncidade'])); $cep = trim(strtoupper($_POST['fldforncep'])); $uf = trim(strtoupper($_POST['fldfornuf'])); $fone = trim(strtoupper($_POST['fldfornfone'])); $fax = trim(strtoupper($_POST['fldfornfax'])); $mail = trim(strtoupper($_POST['fldfornmail'])); } $fornecedores = new Fornecedores(); $fornecedores->incluirFornecedor($cnpj,$razao, $nome, $inscrEst,$endereco, $inscrEst, $endereco, $bairro, $cidade, $cep, $uf, $fone, $fax, $mail); $_SESSION['mensagem']="Fornecedor Incluido com Sucesso"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/fornecedores.php"); for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; $fornecedores = new Fornecedores(); $fornecedores->excluirFornecedor($indice); $cont++; 72 } if ($cont > 0) $_SESSION['mensagem'] = "$cont registro(s) excluido(s) com Êxito!"; header("Location: index.php?pagina=1"); ?> <?php session_start(); require_once("../../includes/classes/fornecedores.php"); $cont = 0; for ($i=0; $i<count($_POST['fldUndCod']); $i++) { $indice = $_POST['fldUndCod'][$i]; for ($j=0; $j<count($_POST['fldIndiceCod']); $j++) { if ($indice == $_POST['fldIndiceCod'][$j]) { $razao = trim(strtoupper($_POST['fldfornrazao'][$j])); $nome = trim(strtoupper($_POST['fldfornnome'][$j])); $inscrEst = trim(strtoupper($_POST['fldforninscEst'][$j])); $endereco = trim(strtoupper($_POST['fldfornender'][$j])); $bairro = trim(strtoupper($_POST['fldfornbairro'][$j])); $cidade = trim(strtoupper($_POST['fldforncidade'][$j])); $cep = trim(strtoupper($_POST['fldforncep'][$j])); $uf = trim(strtoupper($_POST['fldfornuf'][$j])); $fone = trim(strtoupper($_POST['fldfornfone'][$j])); $fax = trim(strtoupper($_POST['fldfornfax'][$j])); $mail = trim(strtoupper($_POST['fldfornmail'][$j])); $fornecedores = new Fornecedores(); $fornecedores->atualizarFornecedor($indice,$razao, $nome, $inscrEst,$endereco, $endereco, $bairro, $cidade, $cep, $uf, $fone, $fax, $mail); $cont++; } } } if ($cont > 0) session_register('mensagem'); $_SESSION['mensagem'] = "$cont fornecedor(es) atualizado(s) com exito!!!"; header("Location: index.php?pagina=1"); ?> 4.5.6. Movimentação Externa <?php include("DBConnector.php"); class MovEx { public $FornecedorCodigo; public $Data; public $NotaFiscal; public $DocOrigem; public $Transportadora; function __construct() { $this->FornecedorCodigo = NULL; $this->Data = NULL; $this->NotaFiscal = NULL; $this->DocOrigem = NULL; $this->Transportadora = NULL; } 73 function setFornecedorCodigo($fornec) { $this->FornecedorCodigo = $fornec; } function setData($data){ $this->Data = $data; } function setNotaFiscal($NF){ $this->NotaFiscal = $NF; } function setDocOrigem($Doc){ $this->DocOrigem = $Doc; } function setTransportadora($transp){ $this->Transportadora = $transp; } function getFornecedorCodigo(){ return $this->FornecedorCodigo; } function getData(){ return $this->Data; } function getNotaFiscal(){ return $this->NotaFiscal; } function getDocOrigem(){ return $this->DocOrigem; } function getTransportadora(){ return $this->Transportadora; } function incluirME($fornec, $data, $NF, $Doc, $transp) { $db = new DBConnector(); $this->setFornecedorCodigo($fornec); $this->setData($data); $this->setNotaFiscal($NF){ $this->setDocOrigem($Doc); $this->setTransportadora($transp); $sql = "INSERT INTO MovEx (Fornecedor_FornecedorCNPJ, MovExData, MovExNumNotaFiscal, MovExDocOrigem, MovExTransportadora) VALUES('".$this>getFornecedorCodigo()."', '".$this->getData()."','".$this->getNotaFiscal()."', '".$this->getDocOrigem()."','".$this->getTransportadora()."')"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function incluirME function excluirME($codME) { $db = new DBConnector(); $sql = "DELETE FROM MovEx WHERE MovExCodigo = $codME"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function excluirME function buscarME($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); 74 $sql = "SELECT * FROM MovEx WHERE MovExCodigo Like '".$unidNome."%' ORDER BY MovExCodigo"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmmovEx" method="post" action="atualizarME.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" 75 value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php 76 } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } // end of member function buscarME function atualizarME($fornec, $data, $NF, $Doc, $transp, $codME) { $db = new DBConnector(); $sql = "UPDATE MovEx SET Fornecedor_FornecedorCNPJ = '$fornec', MovExData = '$data', MovExNumNotaFiscal = '$NF', MovExDocOrigem = '$Doc', MovExTransportadora = '$transp' WHERE = MovExCodigo = $codME"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function atualizarME } // end of MovEx ?> 4.5.7. Itens de Moviementação Externa <?php include("DBConnector.php"); class ItemMovEx { public $MovimExCodigo; public $ProdutoCodigo; public $QuantAdquirida; public $ValorUnitario; function __construct() { $this->MovimExCodigo = NULL; $this->ProdutoCodigo = NULL; $this->QuantAdquirida = 0; $this->ValorUnitario = 0; } function setMovimExCodigo($MECod){ $this->MovimExCodigo = $MECod; } function setProdutoCodigo($prod){ $this->ProdutoCodigo = $prod. } function setQuantAdquirida($qtde){ $this->QuantAdquirida = $qtde; } function setValorUnitario($vlrunit){ $this->ValorUnitario = $vlrunit; } function getMovimExCodigo(){ return $this->MovimExCodigo; } function getProdutoCodigo(){ return $this->ProdutoCodigo; } function getQuantAdquirida(){ return $this->QuantAdquirida; } function getValorUnitario(){ return $this->ValorUnitario; } 77 function incluirItemME($MIcod,$prod,$qtde,$vlrunit) { $db = new DBConnector(); $this->setMovimExCodigo($MIcod); $this->setProdutoCodigo($prod); $this->setQuantAdquirida($qtde); $this->setValorUnitario($vlrunit); $sql = "INSERT INTO ItemMovEx (MovEx_MovExCodigo, Produto_ProdutoCodigo, ItemMovExQtdAdq, ItemMovExValorUnit) VALUES(".$this->getMovimExCodigo().",".$this>getProdutoCodigo().",".$this->getQuantAdquirida().",".$this>getValorUnitario().")"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function incluirItemME function buscarItemME($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM ItemMovEx WHERE ItemMovExCodigo Like '".$unidNome."%' ORDER BY ItemMovExCodigo"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmMovItemEx" method="post" action="atualizaritemME.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php 78 while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } 79 if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } // end of member function buscarItemME function atualizarItemME($prod,$qtde,$vlrunit, $codME) { $db = new DBConnector(); $sql = "UPDATE ItemMovEx SET Produto_ProdutoCodigo = $prod, ItemMovExQtdAdq=$qtde, ItemMovExValorUnit=$vlrunit WHERE MovEx_MovExCodigo = $codME"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function atualizarItemME function excluirItemME($codItemME) { $db = new DBConnector(); $sql = "DELETE FROM ItemMovEx WHERE ItemMovExCodigo = $codItemME"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function excluirItemME } // end of ItemMovEx ?> 4.5.8. Movimentação Interna <?php include("DBConnector.php"); class MovInt { public public public public public public $DeptoCodigo; $FuncsMatr; $DataSolicitacao; $DataAtendimento; $FuncionarioAlmoxAtend; $FuncionarioAlmoxResposta; 80 function __construct() { $this->DeptoCodigo = NULL; $this->FuncsMatr = NULL; $this->DataSolicitacao = NULL; $this->DataAtendimento = NULL; $this->FuncionarioAlmoxAtend = NULL; $this->FuncionarioAlmoxResposta = NULL; } function setDeptoCodigo($depto){ $this->DeptoCodigo = $depto; } function setFuncsMatr($funcMatr){ $this->FuncsMatr = $funcMatr; } function setDataSolicitacao($dtSol){ $this->DataSolicitacao = $dtSol; } function setDataAtendimento($dtAtend){ $this->DataAtendimento = $dtAtend; } function setFuncionarioAlmoxAtend($funcAtend){ $this->FuncionarioAlmoxAtend = $funcAtend; } function setFuncionarioAlmoxResposta($resposta){ $this->FuncionarioAlmoxAtend = $resposta; } function getDeptoCodigo(){ return $this->DeptoCodigo; } function getFuncsMatr(){ return $this->FuncsMatr; } function getDataSolicitacao(){ return $this->DataSolicitacao; } function getDataAtendimento(){ return $this->DataAtendimento; } function getFuncionarioAlmoxAtend(){ return $this->FuncionarioAlmoxAtend; } function getFuncionarioAlmoxResposta(){ return $this->FuncionarioAlmoxResposta; } function incluirMI($depto,$funcMatr,$dtSol,$dtAtend,$funcAtend,$resposta) { $db = new DBConnector(); $this->setDeptoCodigo($depto); $this->setFuncsMatr($funcMatr); $this->setDataSolicitacao($dtSol); $this->setDataAtendimento($dtAtend); $this->setFuncionarioAlmoxAtend($funcAtend); $this->setFuncionarioAlmoxResposta($resposta); $sql = "INSERT INTO MovInt (Funcionario_FuncionarioMatricula, Departamento_DepartamentoCodigo, MovIntDataSolic, MovIntDataAtend, MovIntFuncAlmoxMatr, MovIntResposta) VALUES('".$this->getFuncsMatr()."', '".$this>getDeptoCodigo."','".$this->getDataSolicitacao()."','".$this>getDataAtendimento()."','".$this->getFuncionarioAlmoxAtend()."','".$this>getFuncionarioAlmoxResposta()."')"; 81 $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function incluirMI function excluirMI($codMI) { $db = new DBConnector(); $sql = "DELETE FROM MovInt WHERE MovIntCodigo = $codMI"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function excluirMI function atualizarMI($depto,$funcMatr,$dtSol,$dtAtend,$funcAtend,$resposta,$codMI) { $db = new DBConnector(); $sql = "UPDATE MovInt SET Funcionario_FuncionarioMatricula = '$funcMatr', Departamento_DepartamentoCodigo = '$depto', MovIntDataSolic = '$dtSol', MovIntDataAtend = '$dtAtend', MovIntFuncAlmoxMatr='$funcAtend', MovIntResposta = '$resposta' WHERE MovIntCodigo = $codMI"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function atualizarMI function buscarMI($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM MovInt WHERE MovIntCodigo Like '".$unidNome."%' ORDER BY MovIntCodigo"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmMovInt" method="post" action="atualizarMI.php"> <?php if ($quant <= $total_reg) { $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> 82 <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { 83 echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } // end of member function buscarMI } // end of MovInt ?> 4.5.9. Itens de Movimentação Interna <?php include("DBConnector.php"); class ItemMovInt { public public public public $MovimIntCodigo; $ProdutoCodigo; $QuantSolicitada; $QuantAtendida; function __construct() { $this->MovimIntCodigo = NULL; $this->ProdutoCodigo = NULL; $this->QuantSolicitada = 0; $this->QuantAtendida = 0; } function setMovimIntCodigo($MIcod){ $this->MovimIntCodigo = } function setProdutoCodigo($prod){ $MIcod; 84 $this->ProdutoCodigo = $prod; } function setQuantSolicitada($qtdeadq){ $this->QuantSolicitada = $qtdeadq; } function setQuantAtendida($qtdeAtend){ $this->QuantAtendida = $qtdeAtend; } function getMovimIntCodigo(){ return $this->MovimIntCodigo; } function getProdutoCodigo(){ return $this->ProdutoCodigo; } function getQuantSolicitada(){ return $this->QuantAdquirida; } function getQuantAtendida(){ return $this->ValorUnitario; } function incluirItemMI($MIcod,$prod,$qtdeadq,$qtdeAtend) { $db = new DBConnector(); $this->setMovimIntCodigo($MIcod); $this->setProdutoCodigo($prod); $this->setQuantSolicitada($qtdeadq); $this->setQuantAtendida($qtdeAtend); $sql = "INSERT INTO ItemMovInt (MovInt_MovIntCodigo, Produto_ProdutoCodigo, ItemMovIntQtdeSolic, ItemMovIntQtdeAtend) VALUES(".$this>getMovimExCodigo().",".$this->getProdutoCodigo().",".$this>getQuantSolicitada().",".$this->getQuantAtendida().")"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function incluirItemME function excluirItemMI($codItemMI) { $db = new DBConnector(); $sql = "DELETE FROM ItemMovInt $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function excluirItemME WHERE ItemMovIntCodigo = $codItemMI"; function buscarItemMI($unidNome, $qntporpag, $paginacao) { $cores = array("#e0f0fd", "#ffffff"); $i = 0; $db = new DBConnector(); $sql = "SELECT * FROM ItemMovInt WHERE ItemMovIntCodigo Like '".$unidNome."%' ORDER BY ItemMovIntCodigo"; $res=array($db->Execute_Query($sql)); $quant = $res[0][1]; $total_reg = $qntporpag; $pagina = $paginacao; if ($quant > 0 ){ ?> <form name="frmMovItemInt" method="post" action="atualizaritemMI.php"> <?php if ($quant <= $total_reg) { 85 $total_paginas = 1; } // mais de 10 registros com valor multiplo de 10.. if ($quant%$total_reg == 0) { $total_paginas = $quant / $total_reg; } // mais de 10 registros porem o valor nao e multiplo de 10... else { // como a divisao exata, teremos que subtrair a parte que n?o ? inteira e // acrescentar 1 pagina. $total_paginas = ($quant/$total_reg) (($quant%$total_reg)/$total_reg) + 1; } $linha_inicial = ($pagina - 1) * $total_reg; $linha_final = $linha_inicial + $total_reg - 1; // escrevendo os registros... // vamos usar um arcador para sabermos se estamos entre a linha final e a linha inicial... $marcador = 0; ?> <table align="center" border="0" width="650" cellspacing="2" bgcolor="#8dc6e4"> <tr> <td style="width: 20px;" valign="middle"> </td> <td style="width: 80px;" align="center" class="headerTable">Código</td> <td style="width: 500px;" class="headerTable"> Descrição</td> </tr> </table> <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <?php while($linha = $db->Get_Rows()) { if ($marcador >= $linha_inicial and $marcador <= $linha_final) { ?> <tr bgcolor="<?=$cores[$i%2]?>"> <td style="width: 20px;" align="center" valign="middle"> <input type="hidden" name="fldIndiceCod[]" value="<?=trim($linha['UnidadeCodigo'])?>"> <input name="fldUndCod[]" type="checkbox" value="<?=trim($linha['UnidadeCodigo'])?>" id="linha<?=trim($linha['UnidadeCodigo'])?>" /></td> <td style="width: 80px;" align="center"> <input name="fldUnidCod[]" type="text" title="Clique aqui para editar..." style="width: 70px; background-color:<?=$cores[$i%2]?>" value="<?=strtoupper(trim($linha['UnidadeCodigo']))?>" maxlength="3" class="inputsText" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" /></td> <td style="width: 500px;" align="left"> <input name="fldUnidDescr[]" type="text" title="Clique aqui para editar..." style="width: 480px; background-color:<?=$cores[$i%2]?>" onChange="check('linha<?=trim($linha['UnidadeCodigo'])?>')" value="<?=strtoupper(trim($linha['UnidadeNome']))?>" maxlength="30" class="inputsText" /></td> </tr> <?php } //incrementamos o marcador... $marcador = $marcador + 1; $i++; } ?></table> 86 <table align="center" border="0" width="650" bgcolor="#8dc6e4"> <tr> <td width="75" align="center"><input type="submit" name="btnSalvar" value="Salvar" ></td> <td width="75" align="center"><input type="button" name="btnExcluir" value="Excluir" onClick="removerUnidade()"></td> <td width="500" align="center"> <?php if ($pagina == 1) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><< ANTERIOR | </font> "; } else { echo "<a href=\"index.php?pagina=".($pagina 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\"><< anterior |</a> "; } $i = 1; while ($i <= $total_paginas) { if ($i == $pagina) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\"><b><u>$i</u></b></font> "; } else { echo " <a href=\"index.php?pagina=".$i."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">".$i."</a> "; } $i = $i + 1; } if ($pagina == $total_paginas) { echo "<font color=\"#FFFFFF\" face=\"Verdana\" size=\"1\">| PRÓXIMA >></font>\n"; } else { echo " <a href=\"index.php?pagina=".($pagina + 1)."&palavra=".$unidNome."&num=".$total_reg."\" class=\"headerTable\" target=\"_self\">| próxima >></a> \n"; } ?> </td> <td width="160" class="headerTable">Total de Páginas: <?=$total_paginas?></td> </tr> </table> <?php echo ("<div align=\"center\" class=\"msgAlerts\">".$_SESSION['mensagem']."</div>"); ?> </form> <?php } else { echo ("<font color=\"#ff0000\" size=\"2\"> Nenhum resultado encontrado para essa consulta!</font>"); } $db->Free_Result(); $db->DbDisconnect(); } // end of member function buscarItemME function atualizarItemMI($prod,$qtdeSol,$qtdeAtend, $codME) { 87 $db = new DBConnector(); $sql = "UPDATE ItemMovInt SET Produto_ProdutoCodigo = $prod, ItemMovIntQtdeSolic=$qtdeSol, ItemMovIntQtdeAtend=$qtdeAtend WHERE MovInt_MovIntCodigo = $codME"; $db->Manipulate_Data($sql); $db->DbDisconnect(); } // end of member function atualizarItemME } // end of ItemMovInt ?> 4.5.10. Classe DBConnector <?php require_once('systemcomponents.php'); class DBConnector extends systemcomponents { var var var var $link; $result; $lines; $erro; function DBConnector() { $settings = new systemcomponents(); $this->link = mysql_connect($settings->dbhost, $settings>dbusername, $settings->dbpasswd) or die ("Configuracao de BD errada (longin, senha, host) ". mysql_error($this->link)); mysql_select_db($settings->dbname) or die ("Banco de Dados Inexistente!"); } function Execute_Query($sql){ $this->result = mysql_query($sql,$this->link) or die ("Erro ao executar Consulta ". mysql_error($this->link)); $this->lines = mysql_num_rows($this->result); return array($this->result, $this->lines); } function Manipulate_Data($sql) { if (mysql_query($sql, $this->link)) { $this->lines = mysql_affected_rows($this->link); } return TRUE; } else { $this->erro = mysql_error($this->link); //return 0; return FALSE; } function Free_Result(){ mysql_free_result($this->result); } function Get_Rows(){ $this->lines = mysql_fetch_array($this->result); return $this->lines; } 88 // Fecha conexao function DbDisconnect(){ mysql_close($this->link); } } ?> 4.5.11. Classe systemcomponents <?php class systemcomponents { public $enterpriseName; public $systemName; public $footerName; public $dbhost; public $dbusername; public $dbpasswd; public $dbname; function __construct() { $this->enterpriseName = "Tribunal de Contas do Estado do Tocantins"; $this->systemName = "Sistema de Administração de Almoxarifado"; $this->footerName = date("Y")." TCE/TO - Todos os direitos reservados"; $this->dbhost = "localhost"; $this->dbusername = "root"; $this->dbpasswd = "1234"; $this->dbname = "almox"; } } ?> 4.5.12. Script SQL Banco de Dados CREATE TABLE Unidade ( UnidadeCodigo CHAR(3) NOT NULL AUTO_INCREMENT, UnidadeNome VARCHAR(100) NULL, PRIMARY KEY(UnidadeCodigo) ); CREATE TABLE Grupo ( GrupoCodigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, GrupoNatureza VARCHAR(100) NOT NULL, GrupoNome VARCHAR(100) NULL, PRIMARY KEY(GrupoCodigo, GrupoNatureza) ); CREATE TABLE Fornecedor ( FornecedorCNPJ CHAR(18) NOT NULL AUTO_INCREMENT, FornecedorRazaoSocial VARCHAR(100) NULL, FornecedorNome VARCHAR(100) NULL, FornecedorInscrEstadual VARCHAR(30) NULL, FornecedorEndereco VARCHAR(200) NULL, FornecedorBairro VARCHAR(80) NULL, FornecedorCidade VARCHAR(80) NULL, FornecedorCEP CHAR(10) NULL, FornecedorUF CHAR(2) NULL, 89 FornecedorFone CHAR(15) NULL, FornecedorFax CHAR(15) NULL, FornecedorEmail CHAR(80) NULL, PRIMARY KEY(FornecedorCNPJ) ); CREATE TABLE Departamento ( DepartamentoCodigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, DepartamentoNome CHAR(80) NULL, PRIMARY KEY(DepartamentoCodigo) ); CREATE TABLE MovEx ( MovExCodigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Fornecedor_FornecedorCNPJ CHAR(18) NOT NULL, MovExData DATE NULL, MovExNumNotaFiscal CHAR(25) NULL, MovExDocOrigem CHAR(25) NULL, MovExDataDocOrigem DATE NULL, MovExTransportadora VARCHAR(80) NULL, PRIMARY KEY(MovExCodigo), INDEX MovEx_FKIndex1(Fornecedor_FornecedorCNPJ), FOREIGN KEY(Fornecedor_FornecedorCNPJ) REFERENCES Fornecedor(FornecedorCNPJ) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE Classe ( ClasseCodigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Grupo_GrupoNatureza VARCHAR(100) NOT NULL, Grupo_GrupoCodigo INTEGER UNSIGNED NOT NULL, ClasseNome VARCHAR(50) NULL, PRIMARY KEY(ClasseCodigo), INDEX Classe_FKIndex1(Grupo_GrupoCodigo, Grupo_GrupoNatureza), FOREIGN KEY(Grupo_GrupoCodigo, Grupo_GrupoNatureza) REFERENCES Grupo(GrupoCodigo, GrupoNatureza) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE Funcionario ( FuncionarioMatricula INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Departamento_DepartamentoCodigo INTEGER UNSIGNED NOT NULL, FuncionarioNome CHAR(100) NULL, PRIMARY KEY(FuncionarioMatricula), INDEX Funcionario_FKIndex1(Departamento_DepartamentoCodigo), FOREIGN KEY(Departamento_DepartamentoCodigo) REFERENCES Departamento(DepartamentoCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE Produto ( ProdutoCodigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Unidade_UnidadeCodigo CHAR(3) NOT NULL, Classe_ClasseCodigo INTEGER UNSIGNED NOT NULL, ProdutoNome VARCHAR(100) NULL, ProdutoEstoqueMin INTEGER UNSIGNED NULL, ProdutoEstoqueAtual INTEGER UNSIGNED NULL, ProdutoDataUltMov DATE NULL, PRIMARY KEY(ProdutoCodigo), INDEX Produto_FKIndex1(Classe_ClasseCodigo), INDEX Produto_FKIndex2(Unidade_UnidadeCodigo), FOREIGN KEY(Classe_ClasseCodigo) REFERENCES Classe(ClasseCodigo) ON DELETE NO ACTION 90 ON UPDATE NO ACTION, FOREIGN KEY(Unidade_UnidadeCodigo) REFERENCES Unidade(UnidadeCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE MovInt ( MovIntCodigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Funcionario_FuncionarioMatricula INTEGER UNSIGNED NOT NULL, Departamento_DepartamentoCodigo INTEGER UNSIGNED NOT NULL, MovIntDataSolic DATE NULL, MovIntDataAtend DATE NULL, MovIntFuncAlmoxMatr INTEGER UNSIGNED NULL, MovIntResposta CHAR(100) NULL, PRIMARY KEY(MovIntCodigo), INDEX MovInt_FKIndex1(Departamento_DepartamentoCodigo), INDEX MovInt_FKIndex2(Funcionario_FuncionarioMatricula), FOREIGN KEY(Departamento_DepartamentoCodigo) REFERENCES Departamento(DepartamentoCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY(Funcionario_FuncionarioMatricula) REFERENCES Funcionario(FuncionarioMatricula) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE ItemMovEx ( MovEx_MovExCodigo INTEGER UNSIGNED NOT NULL, Produto_ProdutoCodigo INTEGER UNSIGNED NOT NULL, ItemMovExQtdAdq INTEGER UNSIGNED NOT NULL, ItemMovExValorUnit DECIMAL(10.5) NOT NULL, INDEX ItemMovEx_FKIndex1(MovEx_MovExCodigo), INDEX ItemMovEx_FKIndex2(Produto_ProdutoCodigo), FOREIGN KEY(MovEx_MovExCodigo) REFERENCES MovEx(MovExCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY(Produto_ProdutoCodigo) REFERENCES Produto(ProdutoCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE ItemMovInt ( MovInt_MovIntCodigo INTEGER UNSIGNED NOT NULL, Produto_ProdutoCodigo INTEGER UNSIGNED NOT NULL, ItemMovIntQtdeSolic INTEGER UNSIGNED NOT NULL, ItemMovIntQtdeAtend INTEGER UNSIGNED NOT NULL, INDEX ItemMovInt_FKIndex1(Produto_ProdutoCodigo), INDEX ItemMovInt_FKIndex2(MovInt_MovIntCodigo), FOREIGN KEY(Produto_ProdutoCodigo) REFERENCES Produto(ProdutoCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY(MovInt_MovIntCodigo) REFERENCES MovInt(MovIntCodigo) ON DELETE NO ACTION ON UPDATE NO ACTION ); 91 5. CONSIDERAÇÕES FINAIS Após seguir as recomendações preestabelecidas pela disciplina de Prática em Sistemas de Informação, concluiu-se este trabalho com a implementação do novo Sistema de Almoxarifado do Tribunal de Contas do Estado Tocantins. Este sistema já encontra-se em plena atividade dada a sua relevante importância, no que tange ao auxílio informatizado das atividades de administração dos materiais de consumo no âmbito deste órgão. Este sistema seguiu a risca o paradigma da Orientação a Objetos, tendo sua modelagem também seguindo os padrões da linguagem UML, sendo implementado com base na linguagem de programação PHP. Todos esses pontos aliados, convergiram na produção de um sistema que atende aos requisitos pré-estabelecidos, que tem como sua principal característica de qualidade a facilidade às eventuais manutenções, tanto para ajustes as possíveis falhas, quanto para a adição de novas funcionalidades, sendo que a presente documentação servirá também como importante ferramenta de auxílio ao desenvolvedor dessa tarefa. 92 6. REFERÊNCIAS BIBLIOGRÁFICAS SENAC. DN. Organizando o Almoxarifado. 2. ed. Rio de Janeiro, SENAC/DN/DFP, 1993. 2v. II. Conteúdo: v.1 Recebimento e guarda de material. – v2. Controle e entrega de Material. 71p. MEILIR (1997) PAGE-JONES, Meilir. O que todo programador deveria saber sobre projeto orientado a objetos. Makron Books: São Paulo, 1997. RICARTE (2001) RICARTE, Ivan L. Marques. Introdução a Orientação a Objetos. Campinas: Universidade Estadual de Campinas, jun. 2001. Disponível em <http://www.dca.fee.unicamp.br/courses/POOCPP/node3.html>. Acesso em 31/8/2006. CESTA (1996) CESTA, André Augusto. TUTORIAL: A linguagem de programação Java. Campinas: Universidade Estadual de Campinas, jun. 1996. Disponível em < http://www.ic.unicamp.br/~cmrubira/aacesta/java/javatut9.html >. Acesso em 31/08/2006. ZEND (2006) Classes e Objetos (PHP 5). Manual do PHP. Interfaces de Objetos: 2006. Disponível em <http://br2.php.net/manual/pt_BR/language.oop5.interfaces.php>. Acesso em: 31/08/2006