UNIVERSIDADE DO OESTE DE SANTA CATARINA – UNOESC CAMPUS DE VIDEIRA
ÁREA DE CIÊNCIAS EXATAS E DA TERRA CURSO DE CIÊNCA DA COMPUTAÇÃO
DESENVOLVIMENTO DE SISTEMA WEB PARA GERENCIAMENTO D E VENDAS DO SETOR DE BEBIDAS
DIEGO DE COSTA
Orientador:
HERCULANO HAYMUSSI DE BIASI
VIDEIRA – SC 2011
1
DIEGO DE COSTA
DESENVOLVIMENTO DE SISTEMA WEB PARA GERENCIAMENTO D E VENDAS DO SETOR DE BEBIDAS
Trabalho de conclusão de curso
apresentado ao Curso de Ciência da
Computação da Universidade do Oeste
de Santa Catarina como requisito parcial
para a disciplina de TCC III para obtenção
do titulo de Bacharel em Ciência da
Computação
Orientador: Herculano Haymussi De Biasi
VIDEIRA – SC 2011
2
DIEGO DE COSTA
DESENVOLVIMENTO DE SISTEMA WEB PARA GERENCIAMENTO D E VENDAS DO SETOR DE BEBIDAS
Trabalho de Conclusão de Curso apresentado ao
Curso de Ciência da Computação da Universidade
do Oeste de Santa Catarina – UNOESC, Campus
de Videira (SC), como parte dos requisitos para
obtenção do título de Bacharel em Ciência da
Computação.
Aprovado em ___________________
BANCA EXAMINADORA
______________________________________________________ Prof. Herculano Haymussi De Biasi Professor Orientador Universidade do Oeste de Santa Catarina ______________________________________________________ Prof. Professor Membro da Banca Examinadora Universidade do Oeste de Santa Catarina ______________________________________________________ Prof. Professor Membro da Banca Examinadora Universidade do Oeste de Santa Catarina
3
Dedico este trabalho aos meus pais, pelo
continuo apoio e dedicação aos
conhecimentos e estudos.
4
AGRADECIMENTOS
A Deus por me proporcionar aptidão para concluir este trabalho.
A minha família, fonte de minha ideologia.
Ao professor Herculano, pela sua orientação.
À professora Lilian, por compartilhar seus conhecimentos.
Ao meu amigo Alessandro Panaccione, por seu apoio e ajuda.
A todos que, de uma forma ou outra, colaboraram para que este trabalho fosse
realizado.
5
RESUMO
Uma aplicação desenvolvida para a arquitetura web (World Wide Web) através de
solicitações entre cliente e servidor, representa um novo conceito baseado em
acessibilidade e portabilidade, permitindo acessos simultâneos de usuários
geograficamente distantes. A análise dos processos de vendas da empresa de
bebidas foi realizada através de diagramas, determinando e orientando a criação do
sistema. O aplicativo automatiza os processos de emissão de pedidos por
representantes, e a administração da informação gerada na indústria como emissão
de ordens e relatórios de vendas, permitindo o acesso do usuário de qualquer local e
região. Apresentar problemas de comunicação entre processos e setores, para criar
e definir o modelo de caso de uso, a usabilidade e seus módulos. O projeto cria um
sistema robusto e seguro, que consegue aceitar uma grande quantidade de usuários
conectados com uma taxa significativa de transferência entre cliente e servidor. As
informações são comutadas entre o navegador do dispositivo do usuário e o servidor
que deve interpretar os dados, incluindo e selecionando a informação disponível no
banco de dados. Utilizando tecnologias como a linguagem PHP e banco de dados
MySQL é possível garantir todos os requisitos técnicos exigidos para a sua
construção e desenvolvimento. O desempenho da comunicação entre cliente e
servidor pode ser complementado utilizando o método Ajax, esta metodologia
permite que a resposta seja mostrada no navegador sem a necessidade que a
página seja reprocessada. Os módulos da aplicação são capazes de realizar
funções de envio de e-mails, geração de documentos, tratamento de sessões, entre
outras. A validação dos formulários pode ser realizada no próprio navegador do
cliente, otimizando o desempenho, não necessitando aguardar uma resposta do
servidor. Buscou-se analisar as características ideais para o banco de dados e
servidor web, garantindo que a aplicação seja confiável e ativa.
Palavras chave: Web. PHP. MySQL. Automatização.
6
ABSTRACT
An application developed for the architecture web (World Wide Web) through
requirements between client and provider, represents a new concept based on
accessibility and portability, allowing accesses from users at the same time. The
analysis of the processes of sales of the company of drink was realized through
diagrams, determining and giving orientation to the creation of the system. The
applicative automatizes the processes of demand emission by representatives, and
the administration of the information created in the company such as the demand
emission and sales reports, allowing the user’s access of any place and region. To
present problems of communication between processes and departments, to create
and to define the usage case model, defining its usage and its modules. The project
must create a robust system, safe that can accept a great quantity of connected
users, a meaningful rate of transference between client and provider is essential. The
pieces of information are commutated between the browser of the user and the
provider that has to interpret the data. Using technologies as the PHP language and
MySQL data bank is possible to guarantee all the technical requirements demanded
for its constructions and development. The performance of the communication
between client and provider can be complemented using the Ajax Method; this
methodology allows the answer to be showed in the browser without the need of the
page being reprocessed. The modules of the application are able to fulfill functions of
sending of e-mails, documentation creation, sections treatment, and the like. The
validation of the forms can be realized from the browser itself, optimizing the
performance, not being necessary to wait for an answer from the provider. The ideal
characteristics were searched for the data bank and web provider, guaranteeing the
application to be reliable and active.
Key words: Web. PHP. MySQL. Automatization
7
SUMÁRIO
1 INTRODUCÃO ....................................................................................................... 10
1.1 OBJETIVO GERAL .......................................................................................... ...11
1.2 OBJETIVOS ESPECÍFICOS ............................................................................... 11
1.3 JUSTIFICATIVA ................................................................................................... 11
2 DESENVOLVIMENTO ............................................................................................ 13
2.1 BUSINESS TO BUSINESS (B2B) ....................................................................... 13
2.2 APLICAÇÃO WEB ............................................................................................... 14
2.3 PROTOCOLO HTTP ........................................................................................... 15
2.3.1 Common Gateway Interface (CGI)............... .................................................. 16
2.3.2 Métodos GET e POST .......................... ........................................................... 17
2.4 LINGUAGEM DE MARCAÇÃO DE HIPERTEXTO (HTML) ................................ 18
2.5 CASCADING STYLE SHEETS (CSS) ................................................................. 19
2.6 LINGUAGEM PHP .............................................................................................. 19
2.6.1 História .................................... ........................................................................ 20
2.6.2 Características ............................. ................................................................... 21
2.6.3 Envio de e-mails ............................ ................................................................. 22
2.6.4 Biblioteca FPDF ............................. ................................................................. 23
2.6.5 Sessões ..................................... ...................................................................... 24
2.6.5.1 Sessão .......................................................................................................... 24
2.6.5.2 Cookies ......................................................................................................... 25
2.6.6 Segurança ................................... .................................................................... 26
2.6.6.1 Message Digest Cinco (MD5) ........................................................................ 26
2.6.6.2 Injeção de SQL .............................................................................................. 27
2.7 BANCO DE DADOS MYSQL .............................................................................. 27
2.7.1 Tipos de tabela ............................. .................................................................. 28
8
2.7.2 Integridade referencial ..................... .............................................................. 30
2.7.3 Suporte a transações ........................ ............................................................. 31
2.7.4 phpMyAdmin .................................. ................................................................. 31
2.8 AJAX.................................................................................................................... 32
2.8.1 XML .................................................................................................................. 34
2.8.2 JavaScript .................................. ..................................................................... 34
2.8.3 Modelo de Objetos de Documentos (DOM) ....... ........................................... 35
2.8.4 Requisição XMLHttp........................... ............................................................ 35
2.9 SERVIDOR WEB................................................................................................. 36
2.9.1 Servidor Apache ............................. ................................................................ 36
2.9.2 XAMPP ............................................................................................................. 37
2.9.3 Microsoft Internet Information Services (IIS) ............................................... 38
2.10 ADOBE DREAMWEAVER ................................................................................. 38
2.10.1 Desenvolvimento de Formulários ............. .................................................. 39
2.10.2 Spry ....................................... ........................................................................ 39
2.11 METODOLOGIA ................................................................................................ 40
2.11.1 Análise de Requisitos ...................... ............................................................ 40
2.11.2 Caso de uso e diagrama de seqüência ........ ............................................... 41
2.11.3 Diagrama de classes ........................ ............................................................ 42
2.11.4 Arquitetura geral .......................... ................................................................. 43
2.11.5 Arquivo de configuração .................... .......................................................... 44
2.11.6 Conexão com o banco de dados ............... .................................................. 45
2.11.7 Autenticação de usuário .................... .......................................................... 46
2.11.8 Cadastros .................................. .................................................................... 47
2.11.9 Inclusão de pedidos ........................ ............................................................. 48
2.11.10 Inclusão e baixa de ordens de carregamento .......................................... 49
2.11.11 Relatórios ................................ .................................................................... 49
9
2.11.12 Logoff .................................... ...................................................................... 50
2.11.13 Tratamento e conversão de dados ........... ................................................. 51
2.11.14 Confirmações e avisos em JavaScript ....... .............................................. 53
2.11.15 Envio automático de e-mails ............... ...................................................... 54
2.11.16 Menus e departamentos ..................... ........................................................ 55
3 CONCLUSÃO ....................................... ................................................................. 57
REFERÊNCIAS ......................................................................................................... 59
APÊNDICES ............................................................................................................. 63
APÊNDICE A – Diagrama de sequência ................................................................... 64
APÊNDICE B – Diagrama de classes ....................................................................... 65
APÊNDICE C – Código HTML do formulário para a autenticação do usuário ........... 66
APÊNDICE D – Código PHP utilizado para cadastro ................................................ 67
APÊNDICE E – Código de inclusão de pedidos ........................................................ 69
APÊNDICE F – Código de inclusão e baixas de ordens ........................................... 71
APÊNDICE G – Verificação de departamento e usuário logado ............................... 73
APÊNDICE H – Sintaxe SQL para criação das tabelas do banco de dados ............. 75
ANEXOS ................................................................................................................... 77
ANEXO A – Código JavaScript para validação de CNPJ e CPF ............................... 78
10
1 INTRODUCÃO
A automatização dos processos de vendas é importante para a determinação
de resultados e qualidade das informações. Analisar os problemas de gerenciamento
de vendas e logística de carregamento em uma empresa no setor de bebidas é a
etapa inicial para determinação das características funcionais para o
desenvolvimento do sistema que deve auxiliar o gerenciamento comercial. Utilizar
diagramas facilita a visualização dos requisitos que o aplicativo deve possuir,
ajudando o desenvolvimento, a documentação e a concepção de novas versões.
Através dos diagramas é possível determinar as tabelas a serem criadas no
MySQL, este banco de dados é utilizado por grandes portais pelo mundo inteiro,
demonstra uma grande estabilidade e desempenho para web, não necessitando de
muitos recursos de hardware no servidor onde se encontra.
Para atender todas as condições necessárias, proposta pelos objetivos
funcionais é utilizado um browser como uma ferramenta para execução de software,
criando diversos benefícios na facilidade de utilização e na disponibilidade do
sistema. Para maximizar o desenvolvimento e o desempenho proposto, é utilizada a
linguagem PHP (PHP: Hypertext Preprocessor) que possui uma grande quantidade
de extensões e bibliotecas disponíveis para criar um portal seguro e funcional,
permitindo uma vasta diversidade de mecanismos para gerenciar os dados
armazenados, inclusões e tratamentos.
Cada página de código PHP é responsável por realizar uma função, em uma
tela em especifico, dentro de um modulo responsável por determinada entidade,
como por exemplo, cliente e pedido. Os acessos a esses módulos e funções são
gerenciados conforme o departamento cadastrado no usuário. Desta maneira é
criado níveis de acessos aos dados, onde são disponibilizados conforme a
necessidade do processo em um determinado setor. A informação fica protegida de
vazamentos, totalmente direcionada e simplificada ao utilizador.
A compatibilidade entre as definições técnicas de linguagem e banco de
dados deve ser garantida na utilização de um servidor web que suporte gerenciar a
execução do PHP, sua comunicação com o banco de dados e o processamento de
entrada e saída de informações gerada com a comunicação aos navegadores dos
11
usuários. Um período de testes e homologação do sistema garante uma qualidade
superior na sua operacionalidade, superando dificuldades primárias de consertos de
erros com a verificação na compatibilidade da estrutura disponível. É indispensável
propostas de testes locais no computador do programador e homologação no
servidor da empresa.
1.1 OBJETIVO GERAL
Desenvolver um sistema web para gerenciamento de vendas do setor de
bebidas.
1.2 OBJETIVOS ESPECÍFICOS
• Analisar possível automatização entre os processos de venda de bebidas;
• Pesquisar definições de sistema web;
• Desenvolver a aplicação com linguagem PHP;
• Melhorar os processos utilizando validações em JavaScript;
• Crias as tabelas e conexão com banco de dados MySQL;
• Determinar os benefícios de um sistema automatizado;
1.3 JUSTIFICATIVA
Uma aplicação web é interpretada por navegadores de varias plataformas,
garantindo uma grande compatibilidade com todos os usuários do sistema que estão
localizados por todo país, independente se estes usam um computador com sistema
operacional específico ou algum laptop e celular. Só haverá a necessidade de
12
conexão com a internet, a qual hoje existe a disponibilidade em diversas formas e
em quase qualquer lugar.
Um procedimento padrão de envio de pedidos será criado, eliminando
problemas de formatos de arquivos incompatíveis com o da empresa, e o envio
informal de pedidos por meio de telefone e fax. A soma de resultados totais de
impostos e mercadoria é de forma automatizada, criando um conjunto de dados
comercias consistente.
O sistema exige do usuário a inserção de todas as informações necessárias
para garantir a qualidade dos processos, e não ocasionar problemas na entrega da
mercadoria, cobrança, nota fiscal incorreta ou qualquer outro. Facilitando a criação
de ordens a partir dos pedidos lançados, evitando desperdício de tempo em
digitação duplicada das informações, deixando os processos de venda,
carregamento e entrega mais ágil.
Opções de relatórios gerenciais com dados precisos para a diretoria, relatório
de venda por estado, representante, produto e muitos outros que podem ser
incluídos no aplicativo conforme a necessidade da empresa.
O desenvolvimento desse aplicativo irá fornecer uma melhor condição de
trabalho a todos os usuários, que poderão se concentrar em atender a demanda de
pedidos, sendo que os dados processados serão preservados e utilizados de forma
eficiente, sem conferencias manuais adicionais, diferente do que se faz em envio e
recebimento de planilhas ou conversas por telefone.
A emissão on-line e a visualização de pedidos e ordens internas da empresa
vão garantir uma grande economia em papel, visto que não é preciso imprimir as
folhas para serem encaminhadas entre os departamentos, com isso contribuindo
com o meio ambiente na redução do desmatamento para fabricação de papel.
Fica claro que a centralização das informações da empresa em uma
arquitetura web facilita a integração entre diversos setores, criando um padrão
acessível.
13
2 DESENVOLVIMENTO
As informações trocadas e armazenadas entre a empresa e seus clientes e
parceiros é de grande valor para o gerenciamento e a sobrevivência no mercado.
Segundo Stallings (2003, p. 5):
Uma empresa sobrevive e prospera com informações: as informações dentro da organização e as informações trocadas com fornecedores, cliente e agências reguladoras. Além do mais, a informação precisa ser consistente, acessível e estar no local certo.
A utilização de um software para gerenciamento de informação é
constantemente utilizada por conseguir uma ótima organização e acessibilidade. A
construção de sistemas on-line ou portais amplia as possibilidades de gestão. Um
portal sendo o centro de integração entre informações e sistemas, aumenta a
acessibilidade aos dados que estão arquivados, ao alcance em qualquer ponto de
internet, agilizando as tomadas de decisões e o tempo. É essencial construir um
sistema robusto, seguro, que consiga aceitar uma grande quantidade de usuários
conectados, com uma taxa significativa de transferência entre cliente e servidor.
Em qualquer conteúdo web, o código fonte é dividido em dois conceitos, a
página do servidor que possui scripts interagindo entre si, somente no servidor e
totalmente invisível para o browser (navegador) do cliente, que só recebe conteúdo
através de um protocolo específico. As paginas do cliente escritas por uma
linguagem que o navegador interpreta, possibilitando a interação do usuário. Esses
conceitos trabalham sempre junto em uma aplicação web.
2.1 BUSINESS TO BUSINESS (B2B)
O B2B é o processo eletrônico de negócios entre as empresas para compras
e vendas. As transações comerciais são realizadas totalmente através de softwares
substituindo processos físicos. Conforme McLean, Turban, Wetherbe (2002, p. 175)
descreve:
14
Nas aplicações B2B os compradores e os vendedores são empresas. O B2B representa a maior parte do volume do comercio eletrônico, cobrindo um largo espectro de aplicações quer permitem a uma empresa ou a um setor econômico estabelecer relacionamentos eletrônicos com seus distribuidores, revendedores, fornecedores, clientes e outros parceiros.
Através da internet é possível a troca do grande volume de informações
criada pelas transações, garantindo dados em tempo real para a organização e
eficiência interna da empresa. Com a acessibilidade criada pela internet é possível
aumentar a quantidade de entidades envolvidas no aplicativo garantindo
interconexões entre diversos servidores, descentralizando ou centralizando a
informação, garantindo compatibilidades entre filiais ou empresas. A compatibilidade
entre entidades de negócios assegura a automatização de qualquer operação,
possibilitando uma quantidade expressiva de transações. Como o controle eletrônico
comercial é padronizado gera resultados de conhecimento com base de informação
precisa.
Os aplicativos de B2B permitem que a empresa possa atender uma grande
demanda de clientes e parceiros, disponibilizando diversos dados sobre suas
compras a qualquer hora. O limite operacional se concentra somente em
investimentos físicos e virtuais na área de tecnologia da informação.
2.2 APLICAÇÃO WEB
Aplicação web é qualquer sistema executado através de um navegador, seja
na internet ou em redes privadas, localizado em um servidor web, as quais
transferem dados da maneira cliente e servidor (TURBAN; MCLEAN; WETHERBE,
2002).
O navegador solicita ou envia informações a ser processada no servidor, este
devolve ao cliente onde o navegador imprime o resultado, se difere de um site, pois
existe um nível significativo de regras e interações das informações entre os lados
de servidor e cliente. O usuário do sistema web pode utilizar o sistema de qualquer
local que possua conexão com a internet, não existe a necessidade que ele possua
o conhecimento de onde a aplicação e o banco de dados estão armazenados, pois
15
esta pode estar em qualquer servidor ou data center, em qualquer local do planeta.
A simplicidade da atualização e manutenção nas aplicações web representa uma de
suas principias características, visto que é necessário aplicar as mudanças somente
nos servidores onde o código fonte está localizado, no próximo acesso que o usuário
realizará, já estará acessando a versão atualizada do sistema. Existem diversas
linguagens para web, onde pode ser construídos sistemas de diversos interesses,
em quase qualquer plataforma.
2.3 PROTOCOLO HTTP
Gourley e Totty (2002) definem o Hypertext Transfer Protocol (HTTP) como
uma metodologia de comunicação utilizada para troca de dados entre o navegador e
o servidor web. Este protocolo é utilizado quando algo é digitado na barra de
endereços do navegador, seja ela uma aplicação ou um site, a transferência da
página até a plataforma do cliente e suas respostas ao servidor web são realizadas
com este protocolo. A comunicação HTTP entre o cliente e servidor é feita através de
mensagens. O cliente envia mensagens de requisição e o servidor envia uma
mensagem de resposta para o cliente.
As mensagens enviadas e recebidas são compostas por cabeçalho e corpo.
O cabeçalho contém informações especificas de configuração de servidor ou de
cliente, e o corpo da mensagem contém os dados que serão tratados pelo Hypertext
Markup Language (HTML) como texto, imagem ou até mesmo um arquivo para
download.
O protocolo utiliza alguns métodos para transferências de informações entre
cliente e servidor, esses métodos são utilizados como padrões por diversas
linguagens e por códigos HTML para envio de formulários ao servidor.
16
2.3.1 Common Gateway Interface (CGI)
Common Gateway Interface (CGI) é uma tecnologia utilizada nos servidores
web para tornar a aplicação interativa. Essa tecnologia permite que o browser do
cliente passe parâmetros para serem processados no servidor. Os scripts CGI geram
as paginas com base das variáveis enviadas pelo cliente. São ativados pelo HTML,
que informa o método utilizado para envio dos parâmetros.
Um servidor web pode ser configurado para aumentar o nível de interatividade
com o cliente como afirma Della Valle e Ulbrich (2005, p. 201):
Os servidores HTTP podem ser amplamente estendidos com a adoção de mecanismos que permitam o chamado conteúdo dinâmico, uma tecnologia que possibilita a montagem de paginas personalizadas e de conteúdo variável para cada visitante e acesso.
A personalização do conteúdo e da informação é a principal característica de
um script CGI, isso permite que a aplicação web aumente sua habilidade de
compreensão do usuário.
A interface criada é responsável por um ciclo de solicitações feitas pelo
cliente, com o acesso ao conteúdo HTML, que se encontra no servidor e o envio de
dados com um retorno, garantindo a interatividade com o usuário. O fluxograma
abaixo retrata os principais procedimentos que o CGI é incumbido de interagir para
garantir o processamento e comunicação.
17
Fluxograma 1: Common Gateway Interface Fonte: Otsuka L. (1999)
Através de uma Uniform Resource Locator (URL), é solicitado ao servidor web
e ao CGI para que disponibilizem o conteúdo para ser tratado e formatado pelo
browser do cliente. Com esse conteúdo, o navegador poderá enviar e receber dados
previstos no código HTML. Enquanto que o CGI ficará responsável para encaminhar
ou receber as informações do aplicativo correto, contido no servidor.
2.3.2 Métodos GET e POST
O método GET é uma forma de transmitir dados através do protocolo HTTP.
Com a utilização deste procedimento, os parâmetros e variáveis são introduzidas em
forma de string na URL de destino. A URL é formada pela página de destino, um
ponto de interrogação (“?”), que delimita o começo dos dados, o nome da variável, o
conteúdo da variável e demais dados, normalmente separadas por caracteres
especiais como símbolos comercial ("&"). Todo o endereço e os dados podem ser
observados na barra de endereços do navegador apos o envio a página de destino
(MUTO, 2006).
18
Diferente do método GET, a metodologia POST não informa o nome e o valor
das variáveis pela URL. Os dados são enviados diretamente por uma mensagem do
protocolo HTTP, utilizando este método o nome das variáveis que serão tratadas no
servidor ficam invisíveis para o usuário, impossibilitando um possível ataque
informando variáveis ou valores manualmente. O POST é uma solução muito
utilizada para envio de formulários HTML com diversas informações.
Para recepção dos dados no script do servidor algumas linguagens criam um
array diferente para cada método, que pode ser consultado por outras funções.
2.4 LINGUAGEM DE MARCAÇÃO DE HIPERTEXTO (HTML)
A linguagem HTML é utilizada para produzir paginas web. São interpretados
por navegadores para gerar paginas estáticas. Foi criada em 1990 por Tim Berns-
Lee com a finalidade de tornar possível o acesso e a troca de informações entre
seus colegas. Com a disseminação do padrão HTML em toda internet, em 1994 foi
criado a World Wide Web Consortium (W3C), o consórcio internacional da internet,
que tinha como objetivo a padronização e manutenção do HTML, entre outras
linguagens criadas posteriormente (LOGMAN, 1998).
O arquivo com extensão “.html”.ou “.htm” fica armazenado no servidor web, o
navegador do cliente solicita o conteúdo, realizando o download do arquivo HTML.
Com o arquivo na plataforma do cliente, o navegador interpreta e mostra seu
conteúdo formatado.
Um código HTML é formado por tags, as quais possuem comandos dentro
dos símbolos menor que “<” e maior que “>”. Essas tags dividem o conteúdo
permitindo uma formatação específica. Alguns elementos como imagens, animações
e a linguagem JavaScript podem ser adicionadas entre os códigos HTML.
19
2.5 CASCADING STYLE SHEETS (CSS)
CSS é uma linguagem para construção de aparência em documentos escritos
em linguagem de marcação. Foi desenvolvido pela W3C com o objetivo de
padronizar a customização de conteúdo web. Remoaldo (2008) afirma que o estilo e
características visuais de uma página devem ser completamente descritos na
linguagem CSS. A linguagem deve ser incorporado ao HTML, diretamente ou
através de um link para um arquivo “.css”.
A utilização de formatação através de códigos CSS facilita o desenvolvimento,
reduzindo a quantidade instruções. Conforme Somera (2006 p. 10):
A linguagem HTML também pode ser usada para definir o layout de web sites. Contudo, a CSS proporciona mais opções, é mais precisa e sofisticada, alem de ser suportada pela maioria dos navegadores atuais. A principal diferença entre HTML e CSS é que o primeiro é usado para formatar conteúdos e o segundo para conteúdos já estruturados.
O CSS permite um controle de layout de vários documentos HTML, com um
simples arquivo, facilitando sua manutenção. No caso de portais e aplicativos de
grande porte, é muito difícil garantir a mesma formatação configurada em todas as
paginas. Com a utilização de um arquivo CSS é possível definir blocos, com uma
configuração padrão para ser utilizado em todas as paginas. Com qualquer
modificação do layout no arquivo CSS, as paginas serão modificadas
automaticamente.
2.6 LINGUAGEM PHP
O PHP (PHP Hypertext Preprocessor) é uma linguagem para criação de
scripts executados no servidor, foi projetada especificamente para web. Pode ser
embutido em um código HTML, quando este código executar em um cliente, é
solicitado algo ao servidor web, o PHP irá executar e retornar as informações para o
navegador. Por ser interpretado no servidor, o usuário só conseguirá ler as tags em
HTML e não o código em PHP. Essa solução apresenta ser veloz e multiplataforma.
20
A sua capacidade é muitas vezes colocada a prova em sites e portais com milhões
de acessos. Por ser de código-fonte aberto, pode ser usado, modificado e
redistribuído com novos módulos sem nenhuma restrição (MELO; NASCIMENTO,
2007).
As variáveis são verificadas dinamicamente pela linguagem, ou seja, é
possível armazenar diversos tipos de dados durante a existência da variável, sem a
necessidade de declarar seu tipo na criação. Quando o PHP for interpretado, é
identificado o conteúdo, verificando em tempo de execução
2.6.1 História
Foi criada em 1994 por Rasmus Lerdof, como um pacote CGI para sua
página pessoal, que até aquele momento era utilizado um conjunto de scripts Perl. O
autor Muto (2006), afirma que a primeira versão do PHP, ainda com nome de
PHP/FI, já possuía um interpretador conhecido como FI (Form Interpreter) e várias
características encontradas até nas versões dos dias atuais, como interpretação
automática de variáveis vindas de formulário, sintaxe embutida no HTML e suporte
ao banco de dados MySQL.
Após a construção e a disponibilização das primeiras versões da linguagem, o
PHP recebeu apoio da comunidade livre, de acordo com Melo e Nascimento (2007
p. 21): “Assim como ocorreu com o sistema operacional Linux, diversos entusiastas
do software livre tomaram conhecimento do pacote PHP/FI, os quais passaram a
contribuir e acrescentar suas idéias ao mesmo”. A acessibilidade ao código-fonte,
concedido pelo autor ajudou para popularização global do PHP.
Entre os anos de 1996 e 1997 a linguagem já era utilizada em cerca de
quinze mil sites espalhados em vários servidores (MORAZ, 2005).
De acordo com o PHP Group (2010), a versão três desenvolvida por Andi
Gutmans e Zeev Suraski, já existia a possibilidade de criar códigos orientados a
objetos e herança, adaptação da linguagem para novos protocolos da internet e
suporte para a maioria dos bancos de dados. O PHP três foi à primeira versão a
possibilitar a utilização de extensões, que por sua vez atraiu diversos programadores
para o desenvolvimento de módulos. Renomeada para PHP: Hypertext
21
Preprocessor, conforme a atribuição de nomes recursiva do GNU (GNU = GNU’s Not
Unix), foi lançada em 1998, e no final do mesmo ano já contava com instalação em
10% dos servidores web.
Na sua quarta versão foi aprimorado para cobrir diversas necessidades e
solucionar alguns inconvenientes que apresentavam em sua versão anterior. A
característica mais significativa para a versão quatro é sua rapidez que foi concebido
através da mudança de seu motor, no PHP quatro o código é compilado e depois
executado, enquanto que antes era compilado e executado ao mesmo tempo. Com
uma independência maior do servidor web, a linguagem se tornou mais portável e
dinamicamente mais interpretada por outros sistemas operacionais diversos. A
versão cinco lançada em 2004 contava com diversas funcionalidades novas, como
um melhor gerenciamento da memória e a utilização de ponteiros no código,
eliminando a necessidade de copia de objetos que era necessária na versão número
quatro. Introduzindo o conceito de handlers, ou seja, apontadores, foi possível a
implementação de somente um objeto, e a necessidade de copiar somente o
ponteiro, sendo assim quando o objeto sofrer alguma mudança, está se aplicará em
todo lugar onde contenha a instância do ponteiro. O novo suporte ao banco de
dados MySQL foi melhorado. Souza (2007) descreve que com a versão cinco do
PHP houve a inclusão da interpretação de comandos SQL (Structured Query
Language) via extensão MySQLi que permitiu ao PHP, a compatibilidade com novas
funcionalidades disponibilizadas pela versão 4.1 do banco de dados.
2.6.2 Características
A linguagem PHP tem como escopo principal, o desenvolvimento web, ainda
que exista projeto para a utilização em programação fixa, ou seja, desktop. Sua
sintaxe e funções muito parecidas com C e C++ permitem que programadores
consigam adaptarem-se com essa linguagem mais rapidamente, graças a sua
simplicidade. Seu objetivo é a criação de sistemas que possibilitam a geração de
conteúdo dinâmico para paginas da internet, onde o usuário possa interagir de uma
22
forma onde suas ações façam surgir efeitos na aplicação, ou seja, a inserção de
informações possa trazer um feedback para o cliente.
A identificação feita pelo servidor para detectar o inicio do código PHP que
está embutido no HTML é procurando pelo conjunto de caracteres “<?php” e “?>”,
qualquer comando que estiver entre essas tags será interpretada pelo servidor e seu
código não será enviado para o cliente. Os arquivos que contenham instruções PHP,
devem possuir em sua extensão a sigla “.php” (WELLING; THOMSON, 2003).
De acordo Ferreira (2010), o PHP é totalmente modularizado, a sua alteração
é possível com a instalação de novos módulos, tendo a finalidade de aumentar as
suas funções. Possui extensões para acesso a banco de dados MySQL,
PostgreSQL e Oracle. Extensão para criação de PDF (Portable Document Format),
entre muitas outras, que contribuem na construção de um sistema com esta
linguagem. A manipulação de arquivos com a linguagem possibilita a criação de
sistemas dinâmicos de discos virtuais on-line para que os usuários possam alterar,
excluir, realizar upload ou download de qualquer arquivo através da aplicação.
Possui suporte nativo para diversos protocolos, podendo expandir ainda mais a
quantidade utilizando bibliotecas de terceiros.
2.6.3 Envio de e-mails
A linguagem PHP permite o envio de e-mails através da função mail. Esta
função pode operar automaticamente se for configurada para tal, enviando
informações definidas em variáveis que podem ser preenchidas com valores do
banco de dados ou de formulários. Conforme Muto A. (2006 p. 184):
Uma das grandes vantagens da linguagem PHP é a possibilidade de mandarmos e-mails pela própria pagina do navegador. É um recurso muito útil quando desejamos enviar dados de confirmação de um pedido a um cliente, notificação de inclusão em algumas lista de discussão, construção de Web Mails, etc.
O envio de e-mails através do script PHP, permite um nível de interação maior
com o usuário do sistema, que pode ser avisado por e-mail caso haja alguma nova
inclusão de dados no aplicativo. Esta função permite que o cliente não precise entrar
23
no portal para conferir se existe alguma mudança em informações que sejam
relevantes para ele.
Muto (2006) afirma que com a função mail, é possível enviar e-mails apenas
informando textos em suas variáveis ou incluindo códigos HTML, que serão
interpretados no browser ou no gerenciador de e-mail. São definidos quatro variáveis
para enviar um e-mail, são elas:
a) Destinatário, que deve conter o e-mail para quem a mensagem é enviada.
b) Título, contendo o assunto.
c) Mensagem, o conteúdo do e-mail.
d) Header, cabeçalho contendo informações adicionais como especificações
para HTML.
Utilizando conteúdo HTML é possível a inclusão de imagens, criando uma
referencia no código para onde a imagem está localizada, ou seja, em seu local de
hospedagem.
2.6.4 Biblioteca FPDF
A biblioteca FPDF, é uma classe da linguagem PHP, que permite gerar
arquivos PDF. De acordo com Antunes Lamim (2010), o FPDF é uma biblioteca
flexível, sendo possível modificar unidades de medida, formato da pagina, margens,
cabeçalhos, cores, quebra de linhas entre outras opções que permitem a
modificação do conteúdo gerado.
Compatível com a versão cinco e quatro da linguagem PHP, o FPDF não
utiliza a biblioteca padrão da linguagem, PDFlib, que já vem embutida no servidor
web, isso compromete um pouco na performance em gerar o documento. Mas o
nível de personalização que o FPDF permite, e sua facilidade de documentação no
site do criador e em toda comunidade livre, contribui por sua utilização em
aplicativos que precisam gerar arquivos com informações provenientes de consultas
a banco de dados ou preenchimento de formulários (PLATHEY, 2008).
24
2.6.5 Sessões
O PHP Group (2010), mantedor oficial do projeto da linguagem PHP, define as
sessões como uma maneira de preservar dados subseqüentes, permitindo a
construção de aplicações personalizadas. Os dados criados são exclusivos para um
único acesso, são considerados como parâmetros validos para conceder acessos e
modificações especiais.
2.6.5.1 Sessão
O método sessão na linguagem PHP existe para preservar dados específicos
até o usuário fechar seu navegador ou a sessão expirar, seja por inatividade ou por
comando do aplicativo.
Segundo Muto A. (2006 p. 158):
[...] a nível de programação, uma sessão é uma pequena porção em que pode se guardar todos os tipos de variáveis e valores. Esta pequena porção conhecida como objeto sessão, possui uma identificação [...] que é automaticamente enviada ao usuário quando a sessão é iniciada [...]
Para cada sessão criada por cliente, um arquivo é criado no servidor com o
mesmo nome da identificação enviada ao navegador. Este arquivo só existe
enquanto a sessão não expirar ou for destruída. A administração de sessões no
servidor permite uma flexibilidade para o aplicativo ser mutável pelas determinações
das variáveis, em um sistema com usuário e senha, as informações referentes ao
cliente pode determinar seu interesse, ou quais informações o usuário poderá
acessar.
A sessão é um recurso limitado do servidor, pois geralmente está ligado
diretamente à memória, sendo assim não é recomendado que se utilize para guardar
informações que não são necessárias para um usuário em especifico.
25
Conforme Muto (2006) descreve, as principais funções para tratamento de
variáveis de sessão são capazes de realizar operações para serem inicializadas,
registradas, editadas, destruídas e consultadas, retornando seus valores.
2.6.5.2 Cookies
Os cookies são fragmentos de textos enviados ao browser do cliente, durante
um período de tempo definido, armazenando variáveis distintas. (MUTO, 2006).
Com os cookies é possível criar personalização customizada para os
usuários, cestas de compras em um e-commerce, autenticação em sistemas, entre
outras possibilidades, resgatando informações e dados do cliente, conforme Muto
(2006 p. 152) afirma:
Através de cookies podemos deixar informações (variáveis) armazenadas na maquina do usuário e resgatá-las, quando o usuário acessar o navegador, a qualquer momento, desde que o tempo de expiração não tenho sido ultrapassado.
Armazenar certas variáveis no navegador do cliente permite que a
exclusividade de uma modificação no aplicativo web não seja perdida quando a
página for fechada. Quando o usuário acessar novamente o aplicativo irá verificar
em seu cookie quais são seus parâmetros de configuração.
O PHP Group (2010) define seis variáveis em um cookie, são elas:
a) name, define o nome do cookie;
b) value, o valor da variável passado no parâmetro name;
c) expiration, determina um tempo que estará acessível;
d) domain, armazena qual o domínio ou host valido;
e) path, determina para quais os diretórios o cookie é valido;
f) security, se o valor desta variável for “1”, o cookie será transmitido pelo
Hypertext Transfer Protocol secure (HTTPS).
26
Se porventura alguns valores, de algumas variáveis não forem preenchidas,
assumem valores padrões, no caso da expiration, o cookie encarrega-se de expirar
quando o usuário fechar o browser.
2.6.6 Segurança
A segurança lógica em uma aplicação web é indispensável, mesmo
conectado em uma rede mundial, os dados devem estar íntegros garantindo sua
confidencialidade, conforme descreve Figueiredo (1999 p. 1):
Com o rápido crescimento da web e com a diversificação de sua utilização, a segurança se tornou um ponto de importância crucial, principalmente para quem tem a web como um dos principais apêlos comerciais.
Utilizando métodos de criptografia de senhas, tratamentos de dados de
formulários e verificações de existência de sessão, contribuem para que o aplicativo
se torne confiável.
2.6.6.1 Message Digest Cinco (MD5)
O método Message Digest (MD) utiliza um algoritmo hash para criar uma
síntese de tamanho fixo, com base em um valor de tamanho máximo de duzentos e
cinqüenta e cinco caracteres. A função denominada MD5, produz um valor de 120
bits de tamanho, contendo uma string alfanumérica. (FOROUZAN, 2004)
Este algoritmo é unidirecional, ou seja, não é possível que o valor convertido
seja transformado novamente no texto de origem. A função MD5 pode ser utilizada
para gravar o resultado da operação com base em um valor de uma senha, ou seja,
codificá-la. Deste modo a informação será preservada, pois não será armazenado
seu valor oficial. Usuários que possuem acesso ao banco de dados não conseguem
visualizar a senha real. A sintaxe utilizada para a criptografia MD5 no PHP é muito
simples, só é necessário realizar a função “md5()”, e informar a variável a ser
27
calculada. Para certificar se a senha esta correta no momento do acesso é feito
novamente a codificação e o resultado é comparado com o existente no banco de
dados.
2.6.6.2 Injeção de SQL
A injeção de SQL é um dos métodos utilizados para invasão em aplicativos
web, onde o acesso é limitado por inserção de senhas. A maioria das aplicações
utiliza banco de dados, onde são enviados sintaxes pelo script do servidor, a qual
recebe seus parâmetros da linguagem HTML.
Segundo Santos (2008 p.133):
Falhas de injeção acontecem quando os dados que o usuário dá de entrada são enviados como parte de um comando ou consulta. Os atacantes confundem o interpretador para o mesmo executar comandos manipulados enviado dados modificados. As falhas de injeção habilitam o atacante a criar, ler, atualizar ou apagar arbitrariamente qualquer dado disponível para a aplicação.
As variáveis enviadas pelo formulário do HTML ao servidor, para tratamento
em uma consulta ao banco de dados, representam um risco em manipulação de um
comando, para que a resposta seja afirmativa de qualquer maneira, concedendo
acessos indevidos, visualização de informações ou exclusão de dados.
O tratamento em funções específicas no script PHP, para detectar conteúdo
em dados recebidos pelo cliente soluciona grande parte dos problemas de injeção
de SQL. É importante a validação de dados recebidos, antes que sejam enviados
para uma sintaxe do banco de dados.
2.7 BANCO DE DADOS MYSQL
MySQL é um sistema gerenciador de banco de dados (SGBD) relacional,
existindo uma versão com licença comercial e outra de código aberto com licença
General Public License (GPL). Foi desenvolvido por vários anos, pelos
28
programadores Davi Axmark, Allan Larsson e Michael Widenius. MySQL foi
publicado em 1996, posteriormente adquirido pela Sun Microsystems, e em abril de
2009 pela Oracle, hoje já possui 10 milhões de instalações pelo mundo, incluindo
empresas do setor privado, entidades do governo e laboratórios de pesquisas
espaciais (STROPARO, 2010).
Este banco de dados tem como principal característica sua velocidade. Um
banco de dados permite armazenar e consultar os dados armazenados. O serviço
MySQL controla o acesso a estes dados, permitindo que vários usuários, consigam
incluir ou consultar grandes quantidades de informações ao mesmo tempo. O
MySQL é multiusuário e multitarefa, utiliza linguagem padrão Structured Query
Language (SQL).
Com a imensa facilidade de integração do MySQL com várias linguagens, a
sua utilização para web em portais imensos com missão critica, ou simples sites com
poucos acessos tornam-se uma solução viável e muito confiável.
Para Videiro (2008) o desempenho deste banco colabora na sua grande fama,
sendo considerado por grandes empresas o banco de dados mais popular existente.
Sua imensa compatibilidade e fácil integração com a linguagem PHP, tornam
o banco de dados MySQL um dos mais utilizados. Dentre as principais
características deste SGBD são a sua portabilidade, suportando qualquer plataforma
atual, compatibilidade com diversas linguagens, estabilidade e desempenho nas
transações de dados, exigindo muito pouco do hardware onde está hospedado.
2.7.1 Tipos de tabela
O MySQL possui diversos tipos de tabelas, divididos em dois grupos, tabelas
transacionais e não transacionais. A diferença entre elas consiste que no primeiro
grupo as tabelas possuem maior confiabilidade e segurança, ou seja, se o hardware
do servidor que hospeda o banco de dados falhar, provocando uma parada bruta, é
possível recuperar as informações através de um backup e o log de transição. Com
uma tabela transacional é possível combinar diversas instruções e processá-las
todas com um só comando (MUTO, 2006).
29
As tabelas não transacionais são muito mais rápidas, não tendo nenhuma
sobrecarga de transação, ocupam menos espaço em disco e usam menos memória
para atualizações de dados.
Para Muto A. (2006 p.198):
Um banco de dados pode conter tabelas de diferentes tipos, ou seja, pode-se desenvolver uma aplicação tranquilamente utilizando os vários tipos de tabelas disponíveis, aproveitando dessa forma o melhor de dois mundos.
As opções e vantagens garantidas pelo MySQL, conseguem atender diversas
exigências das aplicações, que podem precisar de desempenho extremo ou garantia
e confiabilidade. Mesmo trabalhando com tabelas transacionais a performance
obtida é superior a de qualquer outro banco de dados.
Muto (2006) descreve que as tabelas do tipo MyISAM, é o padrão utilizado,
tem seus índices em um arquivo com extensão ‘.MYI’ (MYIndex), e os dados em um
arquivo ‘.MYD’ (MYData). MyISAM suporta diversos itens como:
a) suporte a campos VARCHAR de tamanho fixo ou dinâmico;
b) campos VARCHAR e CHAR podem ser maiores que 64 Kbytes (KB);
c) valores NULL são permitidos em colunas indexadas;
d) colunas BLOB e TEXT podem ser indexadas;
e) as tabelas MyISAM podem ser estáticas, dinâmicas e compactadas, os
dois primeiros são escolhidos automaticamente, e o terceiro pode ser criado
com uma ferramenta.
HEAP são tipos de tabelas que fazem parte do grupo das não transacionas tal
como o MyISAM, mas seus índices são armazenados na memória, isso as torna
muito mais rápidas e vulneráveis, pois se o MySQL falhar os dados armazenados
nesse tipo de tabela serão perdidos.
O tipo transacional InnoDB foi desenvolvido para obter o máximo de
performance ao processar um grande volume de dados, é usado largamente em
sites que possuem banco de dados superiores a um Terra byte (TB). As tabelas
podem ser de qualquer tamanho, mesmo em sistemas operacionais onde o tamanho
do arquivo é limitado, pois um espaço da tabela pode consistir em diversos arquivos.
Mesmo sendo transacional, e possuir um mecanismo de armazenamento seguro, foi
30
desenvolvido para eficiência em nível de central processing unit (CPU). Possui sua
própria área de buffer para armazenar dados e índices na memória principal (MUTO,
2006).
BerkeleyDB (BDB) é mais um tipo de tabelas existente no MySQL, possuem
diversos recursos de um ambiente transacional. Possuem uma maior chance de
sobrevivência a falhas e são capazes de realizar operações COMMIT e ROLLBACK.
2.7.2 Integridade referencial
Integridade referencial é um método utilizado nos banco de dados para
garantir que os dados não possam ser excluídos quando houver relacionamentos de
níveis hierárquicos nas tabelas, evitando assim que a informação seja corrompida.
Através das chaves estrangeiras é possível identificar se a informação é dependente
de outra tabela.
Segundo Duarte (2006):
Existem determinados recursos do SGBD (Sistema Gerenciador de Banco de Dados) que estão diretamente relacionados ao tipo de tabela escolhido, tais como, controle de transação, níveis de lock e integridade referencial.
Para utilizar a integridade referencial no MySQL é necessário criar tabelas do
tipo InnoDB. Este tipo de tabela é possível criar restrições de integridades incluindo
a diretriva constraint na chave estrangeira de uma tabela.
O MySQL permite incluir restrições de integridade dos tipos cascade, restrict,
set null e set default. No primeiro caso, ao se remover um registro da tabela
referenciada pela chave estrangeira, os registros relacionados com aquele removido
serão eliminados em todas as tabelas relacionadas. O restrict não permite nenhuma
remoção de registros que possuam relacionamentos em outras tabelas. Os dois
últimos atribuem os valores default ou null para as chaves estrangeiras cujos
registros relacionados foram excluídos (DUARTE, 2006).
31
2.7.3 Suporte a transações
As transações simples em qualquer banco de dados são interpretadas
imediatamente, ou seja, após executado a sintaxe os dados são inseridos, editados,
consultados ou excluídos. O suporte de transações são delimitadores que indicam o
início e o fim de uma sintaxe, onde a execução do comando no MySQL é realizada
ou abortada somente quando o delimitador final é interpretado. (MADEIRA, 2004).
O comando que indica o início da diretiva SQL é start transaction. O conteúdo
da sintaxe só é aplicado no banco de dados se for finalizado com o comando
commit, caso não seja incluído nenhuma instrução de delimitador no final, a
operação ficará pendente. A sintaxe pode ser cancelada com algum mau
comportamento do software, que utilizará meios de tratamento de erros incluindo o
comando rollback como delimitador final, dessa forma todo o SQL da transação não
será interpretado pelo banco de dados.
2.7.4 phpMyAdmin
O software phpMyAdmin foi desenvolvido em linguagem PHP com uma
interface web para navegador, com este aplicativo é possível criar e remover banco
de dados, tabelas e campos, enfim, qualquer operação necessária para manipulação
e configuração do banco de dados MySQL. O software em si, é um conjunto de
ficheiros em PHP, isso permite que seja multiplataforma, necessitando apenas de um
servidor web que seja compatível com a versão do PHP a qual o phpMyAdmin foi
construído. Suas atualizações e desenvolvimento são criados por toda a
comunidade de software livre mundial, garantindo que esteja disponível em setenta
e duas linguagens (PHPMYADMIN DEVEL TEAM, 2003)
Atualmente o phpMyAdmin é amplamente utilizado em diversos servidores
pelo mundo, por ser de fácil integração e compatibilidade, concedendo acesso para
que administradores de banco de dados possam realizar qualquer operação
remotamente em qualquer plataforma que possua um browser e conexão a internet.
32
2.8 AJAX
Ajax é o uso das tecnologias XML (eXtensible Markup Language) e
JavaScript, através de processos assíncronos e síncronos. O objetivo do Ajax é
evitar que a cada solicitação enviada pelo cliente ao servidor, não seja necessário
carregar toda a pagina (MORONI, 2007).
A metodologia proposta pelo Ajax, cria paginas web mais interativas e
rápidas, pois o trafego de dados é menor, visto que não existe a necessidade de
solicitar novamente uma página ao servidor e carregá-la no browser.
De acordo com Majer (2010, p. 2):
Um dos grandes problemas do HTML (e seus derivados PHP, ASP, ASP.NET, etc.) é o fato de que ao precisar acessar alguma informação (muitas vezes em função de uma interação com o usuário), numa determinada página, esta informação só pode ser recuperada através de uma chamada à outra página. Isto faz com que o processo seja lento e tedioso.
A criação de um objeto Ajax, tem como proposta solucionar uma grande parte
dos problemas atuais das linguagens web, permitindo que ele acesse as
informações de outra paginas, ou de um banco de dados, sem sair da página onde
se encontra. Garantindo não só um desempenho melhor durante a transição das
informações, como uma melhor experiência para o usuário.
Todas as requisições ao servidor são feitas através do objeto criado em
JavaScript com Ajax. O objeto faz a comunicação entre a interface HTML e o
servidor, no modo clássico a solicitação e a resposta são enviadas direto pelo
HTML. O esquema abaixo visualiza as duas arquiteturas comparando as camadas
onde os dados transitam.
Esquema 1: Fonte: Paiva (2005
As requisições HTTP da metodologia Ajax,
síncronas, em uma seqüência assíncrona, não existe a necessidade
imediata do servidor para que
preenchimento de outro formulário, ou a pá
poderá continuar interagindo com a página, e quando as informações de uma ação
chegar, um método irá tratar estas informações,
necessidade. No modo síncrono, a aplicação só tomará
resposta da anterior, deste modo as respostas e req
(PAIVA, 2005).
1: Comparativo entre a arquitetura clássica e a AJAX(2005 p. 4)
As requisições HTTP da metodologia Ajax, podem ser assíncronas e
seqüência assíncrona, não existe a necessidade
imediata do servidor para que possa continuar uma determinada ação, como o
nto de outro formulário, ou a página acabar de carregar. O usuário
poderá continuar interagindo com a página, e quando as informações de uma ação
o irá tratar estas informações, imprimir algo na pagina se houver a
necessidade. No modo síncrono, a aplicação só tomará outra ação quando obtiver a
, deste modo as respostas e requisições se tornam seqüenciais
33
Comparativo entre a arquitetura clássica e a AJAX
podem ser assíncronas e
seqüência assíncrona, não existe a necessidade da resposta
possa continuar uma determinada ação, como o
gina acabar de carregar. O usuário
poderá continuar interagindo com a página, e quando as informações de uma ação
r algo na pagina se houver a
ação quando obtiver a
uisições se tornam seqüenciais
34
2.8.1 XML
O XML significa linguagem de marcação extensível, foi criada pela World
Wide Web Consortium (W3C), tendo como principal objetivo da concepção a
necessidade de criar um padrão que poderia ser lido por diversos linguagens,
inclusive HTML. Sua estrutura é dividida entre tags de modo hierárquico, por ser
baseado em arquivo de texto, permite consultas e gravação em diversos banco de
dados, independente de qualquer plataforma (World Wide Web Consortium, 2006).
O arquivo XML possui um alto nível de legibilidade, permitindo que
computadores e humanos interpretem seu conteúdo facilmente, pode ser validado
utilizando arquivos de definição de tipo de documento. O XML armazena somente o
conteúdo, informações sobre estilos e formatações são utilizados em arquivos
separados, podendo ser HTML ou CSS.
2.8.2 JavaScript
A linguagem de programação JavaScript foi criada em 1995 por Brendan Eich,
enquanto era funcionário da Netscape. No começo chamava-se LiveScript, através
de um acordo entre a Netscape e a Sun, a linguagem passou a se chamar
JavaScript (AURELIO, 2004).
É interpretada por navegadores, sendo utilizada amplamente para validação
de formulários, animações e demais interações, é possível criar funções dentro de
uma estrutura HTML, possui um desempenho de resposta muito rápido, devido que
o JavaScript é carregado juntamente com o HTML, não dependendo de uma
resposta do servidor para uma determinada entrada de dados.
Conforme Triacca (2007), no começo a linguagem possuía diversos
problemas de compatibilidade entre navegadores. A Microsoft foi obrigada a criar
outra linguagem compatível, pois a Netscape não licenciou o JavaScript para o
browser Internet Explorer. Com duas linguagens diferentes, desenvolvedores de
paginas web tiveram que criar scripts diferentes para cada navegador, necessitando
em uma detecção de browser na hora de executar a pagina no cliente.
35
2.8.3 Modelo de Objetos de Documentos (DOM)
O Modelo de Objetos de Documentos (DOM) é uma especificação da W3C de
forma totalmente neutra, sem nenhuma especificação de linguagem ou plataforma,
criada juntamente com o HTML quatro. Esse conceito mostra uma estrutura
hierárquica onde é possível alterar dinamicamente o estilo e o conteúdo de um site
ou uma pagina, através de uma entrada de dados pelo usuário ou de forma
automática (FLANAGAN, 2002).
A principal função do DOM em um browser é a representação de métodos,
onde uma linguagem possa exibir documentos em HTML, XML ou qualquer
linguagem de marcação. Quando o documento estiver carregado, é possível
manipulá-los através de uma estrutura de árvore.
2.8.4 Requisição XMLHttp
Conforme Moroni (2007), o XMLHttpRequest é um objeto na linguagem
JavaScript, utilizado para criar uma conexão entre a página e o servidor da aplicação
web. Com esse objeto, é possível detectar o browser do cliente, antes de qualquer
operação do Ajax.
A detecção é necessária devido que alguns navegadores utilizam o objeto
JavaScript nativamente, como Mozilla, Opera e Safari, já o Internet Explorer através
do objeto Active X. É necessária a construção de funções para tratamento antes da
criação do objeto, já que a W3C não especifica o padrão para a utilização do
XMLHttpRequest, sendo assim, cada navegador pode implementar de diversas
maneiras diferentes.
Utilizando métodos especificados no DOM, é possível enviar e receber dados
entre a página e o script do servidor.
36
2.9 SERVIDOR WEB
Servidor web é o software instalado em um computador conectado a internet
ou em uma intranet, este computador possui hardware superior aos computadores
pessoais. O software é responsável em aceitar pedidos através do protocolo HTTP,
ele gerencia e armazena conteúdos de sites ou aplicativos web. Um servidor web
pode armazenar somente um site, ou milhares deles, o conteúdo de um site é
acessado através dos domínios que estão associados ao Internet Protocol (IP) do
servidor (STEVENS; FENNER; RUDOFF, 2004).
Os pedidos para visualização e download dos códigos HTML, imagens, sons
ou qualquer outro são feitos através dos navegadores instalados nas plataformas
dos clientes. Com a utilização de linguagens especificas para serem processadas e
executadas nos servidores, é possível uma interação com os clientes, como envio
de formulário, gravação e leitura de banco de dados.
Estes tipos de servidores devem estar ligados dia e noite para garantir a
disponibilidade do conteúdo armazenado, ou seja, que em qualquer momento possa
atender as solicitações dos usuários. Alguns servidores são configurados para
garantir milhares de acessos simultâneos que podem ocorrer em um site ou
aplicativo de grande porte, utilizando técnicas de redundância de link da internet,
energia elétrica, entre outras que visam a integrabilidade destes servidores.
2.9.1 Servidor Apache
O software Apache é um servidor web livre, e a sua utilização está presente
em mais de 50% de todos os servidores do mundo. Foi criado em 1995, por Rob Mc
Cool, funcionário da National Center for Super Computing Applications (NCSA). Com
saída de Rob da NCSA, várias pessoas começaram a adaptar o software as suas
necessidades. Brian Behlendorf e Cliff Skolnick foram os responsáveis pela
continuação do projeto, criaram a Fundação Apache com mais oito pessoas. A
fundação passou a controlar e disponibilizar patches com adição de recursos
(ALECRIM, 2006).
37
A origem do nome Apache é baseado em uma tribo de índios americanos que
detinham de grandes estratégias e resistências em combate.
O servidor é compatível com o protocolo HTTP, existindo versões para
diversas plataformas. Composto por módulos que realizam as mais variadas funções
e recursos, como compatibilidade com PHP, Python, módulo de criptografia através
de camada SSL entre outros. Conforme Coar e Bowen (2008, XI):
O pacote básico distribuído pela Apache Software Foundation é razoavelmente abrangente e bastante poderoso, e foi feito um grande esforço por parte dos programadores para evitar que o software sofresse do problema de ter muitos recursos que ninguém usa. Um aspecto do pacote o torna especialmente interessante: ele inclui estensibilidade por padrão.
A estensibilidade por padrão, garante uma grande compatibilidade com novos
módulos, permitindo ao servidor Apache tornar-se mais competitivo com relação a
diversos recursos implementados por programadores de todo o mundo. Por ser um
software livre, continua sendo melhorado por diversas pessoas voluntárias,
garantindo sua inovação em manter novas versões com desempenho para os
servidores.
O Apache é capaz de executar códigos em diversas linguagens como PHP,
Perl, Shell Script e Active Server Pages (ASP). Pode ser configurado como servidor
HTTP ou FTP. Sua compatibilidade com o banco de dados MySQL, garante a
utilização do conjunto PHP e MySQL, utilizado por milhares de sites e aplicações.
2.9.2 XAMPP
A fundação Apache Friends é um projeto sem fins lucrativos que visa
promover o servidor Apache, fundada em 2002 por Kai 'Oswald' Seidler e Kay
Vogelgesang. Sua principal contribuição é a criação do XAMPP, um conjunto de
softwares para servidor web, incluindo MySQL, Apache, PHP, FileZilla entre outros.
Seu nome é um acrônimo que significa os principais softwares embutidos, a letra “x”
significa o sistema operacional, é multiplataforma, a letra “a” de Apache, “m” de
MySQL, e duas vezes a letra “p”, que significam PHP e PERL (APACHE FRIENDS,
2009).
38
A principal característica do software, é sua facilidade de instalação e
configuração, por esse principio é muito utilizada em computadores locais para
testes de sites e aplicativos, sem a necessidade de upload em um servidor na
internet.
2.9.3 Microsoft Internet Information Services (IIS)
O Microsoft IIS (Internet Information Services) é um servidor de internet ou
intranet, utilizado essencialmente nos sistemas operacionais Windows, sendo o
segundo servidor web mais utilizado no mundo. A primeira versão do ISS foi
disponibilizada em 1996. Em sua versão atual, está mais integrado ao sistema
operacional, garantindo estabilidade e segurança (RODRIGUES DE FREITAS,
2006).
É utilizada a tecnologia proprietária ASP para ser interpretada no IIS, esta
linguagem igualmente ao PHP é capaz de gerar paginas HTML dinamicamente.
Através da inclusão de módulos de terceiros é possível adicionar funcionalidades
para executar outras linguagens. Suporta quase todos os principais protocolos
existentes, incluindo HTTP, FTP e SMTP.
As primeiras versões deste servidor careciam de segurança. A Microsoft
incorporou diversas características adicionais nas versões mais novas de seu
servidor web, diminuindo consideravelmente as vulnerabilidades. Ainda é possível
adicionar ferramentas de segurança de terceiros, criando uma camada adicional de
proteção.
2.10 ADOBE DREAMWEAVER
Segundo Remoaldo (2008), o Adobe Dreamweaver é um software para
desenvolvimentos de sites e aplicativos para web, possui um editor HTML e suporte
para tecnologias PHP, Ajax, ASP, JSP entre outras.
39
Conta com uma interface que auxilia o desenvolvimento de código,
reconhecendo padrões de comandos. No seu método de design é possível criar
campos e botões de uma maneira simples e intuitiva. Com a opção preview, é
possível executar o código digitado chamando o navegador padrão ou outro, para ler
o arquivo salvo, este botão se torna acessível e prático para que se possa verificar a
compatibilidade.
2.10.1 Desenvolvimento de Formulários
O Dreamweaver possui um menu exclusivo para criação de formulários,
permitindo a inclusão de campos, checkbox, botões e menus variados. A criação
automática de formulários facilita o desenvolvimento do layout da aplicação,
permitindo que o desenvolvedor da aplicação concentre seus maiores esforços no
código da linguagem do servidor.
Gerar formulários automaticamente garante uma compatibilidade do código
com diversos navegadores, visto que o Dreamweaver utiliza os padrões definidos
pela W3C.
2.10.2 Spry
Spry é um framework integrado ao Adobe Dreamweaver, a partir da versão
CS3. São bibliotecas no formato JavaScript e CSS, permitindo a criação de
conteúdo dinâmico e rico visualmente, criando elementos interativas, comunicação e
leitura de arquivos XML. Utilizando a tecnologia Ajax é possível criar diversas
validações para campos de formulário, menus customizáveis, painéis entre outros. O
gerenciamento é realizado totalmente no Dreamweaver, na aba propriedades,
otimizamdo o desenvolvimento. O arquivo gerado em JavaScript é responsável por
qualquer ação, comportamento e interatividade, e o CSS se encarrega dos estilos de
cor, fontes e tamanhos (VIEIRA, 2007).
40
A validação dos campos é realizada totalmente por código JavaScript,
permitindo uma reposta rápida, antes mesmo de o formulário ser enviado, pois as
instruções são baixadas na plataforma do usuário, ou seja, o processamento de
validação é feito localmente, assim não existe a necessidade de esperar uma
resposta do servidor.
O Spry pode ser utilizado com qualquer tecnologia de script para servidor,
pois ele está no front-end de uma aplicação integrado ao HTML.
2.11 METODOLOGIA
O projeto do aplicativo utiliza-se da fundamentação teórica para definição de
seus funcionamentos e requisitos técnicos. O código fonte é dividido em arquivos
PHP, onde cada um é responsável por um módulo.
2.11.1 Análise de Requisitos
A definição das características do aplicativo deve ser analisada conforme a
estrutura da empresa. Satisfazendo as necessidades dos usuários, automatizando
as atividades. Para determinar como o software deve acatar os processos, é
realizado a análise de requisitos da aplicação. Seguem em tópicos os requisitos do
aplicativo em questão:
• O aplicativo deve permitir a inclusão de pedidos com informações de clientes
e produtos pré-cadastrados;
• A soma de totais de impostos e produtos em um pedido deverá ser
automática;
• Deverá haver uma validação de CPF e CNPJ no cadastro de clientes;
• Cadastro de usuário em quatro departamentos: representante, faturamento,
41
produção, administrador;
• Emissão de relatórios de vendas em PDF;
• Criação de ordens de carregamento com a seleção de um ou vários pedidos;
• O aplicativo deverá ser acessível de qualquer local com internet.
2.11.2 Caso de uso e diagrama de seqüência
Utilizando um diagrama de caso de uso, é possível visualizar as funções
exercidas por cada ator. Os atores são representados por usuários de cada
departamento, onde cada departamento realiza diversas atividades previstas e
algumas vezes exclusivas. O esquema demonstra as operações padrões realizadas,
instruindo no desenvolvimento do aplicativo, a fim de atender as especificações.
Esta representação visual ajuda o entendimento das possibilidades que o
usuário possui em relação ao software, compreendendo de um modo geral, as suas
ações, comportamento e interações.
O diagrama de seqüência, conforme presente no Apêndice A, descreve os
passos necessários para a utilização das funções presentes no aplicativo. Diversas
informações devem ser cadastradas anteriormente, liberando a utilização de outros
módulos.
Esquema 2: Caso de uso Fonte: o autor
2.11.3 Diagrama de classes
O diagrama de classes permite visualizar as dependências entre os diversos
módulos e objetos, possibilitando um conhecimento antecipado das interações sobre
as variáveis e funções b
características que o diagrama deve representar:
Caso de uso
2.11.3 Diagrama de classes
O diagrama de classes permite visualizar as dependências entre os diversos
, possibilitando um conhecimento antecipado das interações sobre
as variáveis e funções básicas tratadas no aplicativo. Fowler (2005) descreve as
características que o diagrama deve representar:
42
O diagrama de classes permite visualizar as dependências entre os diversos
, possibilitando um conhecimento antecipado das interações sobre
Fowler (2005) descreve as
43
Um diagrama de classes descreve o tipo de objetos presentes no sistema e os vários tipos de relacionamento estáticos existentes entre eles. Os diagramas de classes também mostram as propriedades e as operações de uma classe, e as restrições que se aplicam à maneira como os objetos estão conectados.
Diagramas de classes devem ser claros e objetivos, facilitando a sua
compreensão. O Anexo B contém o diagrama de classes dos principais objetos
propostos pelo aplicativo, seus atributos e operações. São diversos tipos de
relacionamentos utilizados para determinar as relações entre os objetos, que podem
ser múltiplas ou únicas.
2.11.4 Arquitetura geral
O aplicativo deve ser executado simultaneamente entre o cliente e o servidor
web. Através do browser, é solicitado todo código HTML e JavaScript para ser
processado, o navegador se comunica com o servidor, enviando e recebendo
diversos valores. O código PHP é interpretado, realizando operações de inserções
ou consultas no banco de dados. O esquema abaixo demonstra as relações entre as
arquiteturas:
44
Esquema 3: Arquitetura Geral Fonte: o autor
2.11.5 Arquivo de configuração
O arquivo “config.php” possui os valores essências que devem ser preenchidos
para o funcionamento global do aplicação. Este repositório deve ser configurado
durante o processo de instalação. Seu conteúdo deve ser protegido pelo servidor
web, evitando acessos indevidos.
É formado inteiramente por variáveis declaradas que são utilizadas por
diversas paginas, para realizar funções de conexão ao banco de dados, envio de e-
mails e parâmetros de emissão de relatórios.
<?php $local_database = "localhost"; $database = "projeto"; $usuario_database = "root"; $senha_database = ""; $e_mailremetente = "[email protected]"; $e_maildestinatario = "[email protected]";
45
//Configuração de relatórios $fonte = 'Arial'; $tamanho = '10'; ?>
2.11.6 Conexão com o banco de dados
Qualquer página PHP que utilize uma sintaxe de SQL para fazer qualquer
operação com o MySQL, deve possuir as funções nativas da linguagem para criar a
conexão com o banco de dados. O código descrito possui a função para conexão
com o MySQL e outra para selecionar a base de dados. É incluído tratamento em
caso de erro através do try e catch, que realiza a tentativa de conexão, e em caso de
falha exibe a mensagem de erro.
<?php include ("config.php"); try{ if(!$db = mysql_connect("$local_database","$usuario_database","$senha_database")){ throw new Exception("Erro ao estabelecer conexão! ".mysql_errno()." - ".mysql_error()); }else{ try{ if(!mysql_select_db("$database",$db)){ throw new Exception("Erro ao selecionar o banco de dados! ".mysql_errno()." - ".mysql_error()); } }catch(Exception $e){ echo $e->getMessage(); } } }catch(Exception $e){ echo $e->getMessage(); } ?>
As variáveis $local_database, $usuario_database, $senha_database e
$database, possuem a localização do banco de dados através de Internet Protocol
(IP) ou endereço HTTP, login, senha e nome da base respectivamente.
46
2.11.7 Autenticação de usuário
Para acessar o aplicativo, o usuário deverá ser autenticado digitando login,
senha e escolhendo o departamento que pertence. Os departamentos padrões do
sistema são divididos em representante, faturamento, produção e administrador. O
usuário só poderá acessar o conteúdo determinado para a sua repartição, contendo
as suas funções utilizadas. O código HTML presente no apêndice C, contém o
formulário com os campos que devem ser preenchidos pelo usuário na sua
autenticação.
Após a validação, os dados de login e departamento são incluídos em
variáveis de sessão, ficando disponíveis para uso em rotinas de inclusão de pedidos
e geração de relatórios. O código para verificação de autenticidade é feito em PHP
conforme detalhado abaixo:
<? $login = $_POST['login']; $senha = $_POST['senha']; $departamento = $_POST['dpto']; include "conexao.php"; $sql = mysql_query("SELECT * FROM usuario WHERE login = '$login'"); $cont = mysql_num_rows($sql); while($linha = mysql_fetch_array($sql)){ $senha_db = $linha['senha']; $departamento_db = $linha['departamento']; } if($cont == 0){ echo " <META HTTP-EQUIV=REFRESH CONTENT='0; URL=../login.php'> <script type=\"text/javascript\"> alert(\"O nome de usuario nao corresponde.\"); </script>"; }else{ if($senha_db != md5($senha)){//confere senha echo " <META HTTP-EQUIV=REFRESH CONTENT='0; URL=../login.php'> <script type=\"text/javascript\"> alert(\"A senha nao corresponde.\"); </script>"; }else{ if($departamento_db != $departamento){//departamento echo " <META HTTP-EQUIV=REFRESH CONTENT='0; URL=../login.php'> <script type=\"text/javascript\"> alert(\"Departamento incorreto.\");
47
</script>"; } else{ session_start(); $_SESSION['login_usuario'] = $login; $_SESSION['senha_usuario'] = $senha; $_SESSION['departamento_usuario'] = $departamento; header('Location: ../index.php'); } }mysql_close($db);?>
A função include importa dados para a conexão realizada entre a linguagem e
o MySQL.Torna-se essencial a utilização de variáveis referente a conexão, em toda
página que existe a necessidades de transição de informação com o banco de
dados. O código de validação de usuário possui uma sintaxe de consulta, para
verificar a autenticidade das informações inseridas.
É utilizada a função md5() para converter o valor da senha digitada pelo
usuário, utilizando um algoritmo hash nativo da linguagem PHP. Com o valor
convertido é possível a comparação com a informação presente no banco de dados,
que já fora convertido no ato de cadastramento do usuário com sua senha.
Através de alertas em JavaScript, o usuário é informado caso os dados
inseridos estejam incorretos. Se a informação estiver correta, as variáveis de sessão
são criadas, e o usuário é redirecionado para a página contendo o menu com as
opções especificas para seu departamento.
2.11.8 Cadastros
O cadastro de informações sobre mercadorias e clientes é essencial para a
utilização de todas as funcionalidades de rotinas previstas no aplicativo. O
departamento de faturamento e administração é responsável sobre o cadastro de
produtos, bem como seus dados técnicos, como por exemplo, o campo peso que é
utilizado para emissão de uma ordem de carregamento e impostos freqüentemente
devem influenciar o valor total de um pedido. Somente após o cadastro, o produto
será liberado para ser utilizado com um item de venda ou para composição de um
resultado de relatório.
48
O representante cadastrará os dados do cliente no ato de sua primeira
compra. Para evitar a inclusão de Cadastro Nacional de Pessoa Jurídica (CNPJ) e
Cadastro de Pessoa Física (CPF) incorretos, é utilizado uma função em JavaScript
capaz de verificar a autenticidade do código, realizando diversas operações e
comparando o resultado com os últimos algarismos inseridos. Caso a informação
cadastrada não seja válida, o usuário será alertado antes de continuar preenchendo
os demais campos. A tela para cadastro de cliente exige a inserção de todos os
parâmetros necessários para a emissão de pedido e emissão de nota fiscal por
software de terceiro.
Após os dados serem digitados no formulário da página, são enviados ao
servidor através do método POST, onde um arquivo PHP será o responsável de
receber as variáveis e fazer o tratamento da conversão do padrão de datas e
números decimais, conforme o modelo requisitado do banco de dados. Com as
informações armazenadas em objetos locais é realizado a inserção no MySQL.
Através do apêndice D, é possível visualizar o código utilizado para os cadastros.
2.11.9 Inclusão de pedidos
Na inclusão de pedidos o usuário irá selecionar um cliente cadastrado através
de uma busca por sua razão social. Com o cliente selecionada é habilitado a opção
de busca e escolha de produtos, onde devem ser informados a quantidade e o
preço. As informações referentes à cliente e totais do pedido serão armazenadas
em variáveis de session juntamente com um array de sessão para os itens. Após
clicar em confirmar pedido, os dados da sessão serão armazenados no banco de
dados e as variáveis são limpas.
O código do apêndice E, recebe todas as variáveis de pedido e itens,
realizando o tratamento e incluindo na sessão durante o processo. No final é
enviado por parâmetro a função “confirmar” que é responsável em armazenar os
dados.
49
2.11.10 Inclusão e baixa de ordens de carregamento
Com um ou mais pedidos cadastrados é possível a inclusão de ordens de
carregamentos internas. O departamento de faturamento poderá compor a ordem
informando a transportadora, nome do motorista e previsão de carregamento.
A ordem será visualizada pela plataforma de carregamento, que contará com
os resultados das quantidades e o peso para do montante da mercadoria. Na
finalização da carga deverá ser feita sua baixa, registrando no banco de dados que
os pedidos já foram carregados.
O código fonte presente do apêndice F, é divido em duas funções, uma que
deve compor a ordem e outra responsável pela baixa:
2.11.11 Relatórios
É enorme a quantidade de opções de relatórios pré-definidos possíveis no
desenvolvimento, informações de diversas tabelas são juntadas e confrontadas. Os
usuários somente deverão informar as variáveis de uma consulta como data, cliente
ou produto.
Os relatórios são gerados em Portable Document Format (PDF). O sistema
utiliza a biblioteca FPDF para converter os resultados do banco de dados em um
arquivo PDF, é possível a configuração de fontes, tamanho, colunas e até inclusão
de imagens. O código abaixo gera um relatório com o cadastro de todos os clientes
inclusos no aplicativo.
<?php Include define('FPDF_FONTPATH', 'fpdf/font/'); require('fpdf/fpdf.php'); include("conexao.php"); $busca = mysql_query("SELECT id_cliente, nome, endereco, uf FROM cliente"); $pdf = new FPDF(); $pdf->Open(); $pdf->AddPage(); $pdf->SetFont('Arial', 'B', 10); $pdf->Cell(40, 5, 'CNPJ / CPF'); $pdf->SetX(35);
50
$pdf->Cell(135, 5, 'Nome'); $pdf->SetX(90); $pdf->Cell(135, 5, 'Endereco'); $pdf->SetX(150); $pdf->Cell(40, 5, 'UF'); while ($resultado = mysql_fetch_array($busca)) { $pdf->ln(); $pdf->Cell(40, 5, $resultado['id_cliente']); $pdf->SetX(35); $pdf->Cell(135, 5, $resultado['nome']); $pdf->SetX(90); $pdf->Cell(135, 5, $resultado['endereco']); $pdf->SetX(150); $pdf->Cell(40, 5, $resultado['uf']); } $pdf->Output(); ?>
2.11.12 Logoff
Para garantir a segurança na utilização do aplicativo é necessário dispor de
mecanismos para realizar o logoff do usuário, destruindo as informações de sessão
pertinentes. Em toda página se encontra a opção de logout ao lado do menu,
quando clicado nesta opção o usuário será redirecionado na pagina inicial, para uma
nova autenticação.
O código utilizado abaixo recebe o parâmetro “sair”, destruindo as variáveis
de sessão login e senha. É utilizada uma função para imprimir o nome do usuário ao
lado da opção de logout.
<?php include "conexao.php"; $sair = $_GET['sair']; session_start(); if (isset($_SESSION['ultima_acao']) && (time() - $_SESSION['ultima_acao'] > 300)) { session_destroy(); session_unset(); } $_SESSION['ultima_acao'] = time(); $sql_nome = mysql_query("SELECT nome FROM usuario WHERE login = '$login_usuario'"); while($linha = mysql_fetch_array($sql_nome)){ $nome_dousuario = $linha['nome']; } if ($_GET['sair']== "sair"){ unset($_SESSION["login_usuario"]); unset($_SESSION["senha_usuario"]); header("Location: ../login.php"); }
51
?>
A função “time()” recupera a hora atual, comparando-a com o horário da
ultima ação do usuário no sistema, se for menor que trezentos segundos, ou cinco
minutos, as sessões são destruídas, exigindo um novo login. Esta estrutura de
tempo limite sem ação permite uma garantia para quando o usuário esquecer o
sistema autenticado não possa ser utilizado por outra pessoa não autorizada,
enquanto sua ausência no computador.
2.11.13 Tratamento e conversão de dados
Algumas informações digitadas pelos usuários necessitam ser tratadas,
convertendo alguns detalhes em sua orientação e organização. Dados como códigos
cadastrais, datas e números decimais precisam ser convertidos entre o padrão
apresentando ao usuário com o que é gravado no banco de dados.
Durante vários anos, a comunidade de código aberto criou vários scripts em
diversas linguagens para a conversão entre dados com padrões diferentes. O
algoritmo abaixo é capaz de detectar o padrão de data contido na variável, e
converter o dado para gravar no banco de dados MySQL ou apresentar na tela para
o usuário. O código foi escrito em linguagem PHP e criado por Marcelo Bento da
Rocha (2010 p. 1)
<?php /** * @param $data * @return $data */ Marcelo Bento da Rocha function converterData($data) { if(substr($data,2,1) == "/") { $dd = substr($data, 0,2); $mm = substr($data, 3,2); $aa = substr($data, 6,4); $time = substr($data, 11,8); if($time != "") $data = $aa."-".$mm."-".$dd." ".$time; else $data = $aa."-".$mm."-".$dd; }
52
else { $dd = substr($data, 8,2); $mm = substr($data, 5,2); $aa = substr($data, 0,4); $time = substr($data, 11,8); if($time != "") $data = $dd."/".$mm."/".$aa." ".$time; else $data = $dd."/".$mm."/".$aa; } if($data=='//') { $data = ''; } return $data; }
Os valores decimais conforme o padrão português brasileiro é utilizado vírgula
entre os algarismos de unidades e décimas, mas o padrão exigido por muito banco
de dados, como é o caso do MySQL, é o americano onde é utilizado ponto no lugar
da virgula. O PHP possui uma função nativa chamada “str_replace”, ela é capaz de
percorrer todo o conteúdo da variável, buscando o algarismo a ser alterado. Para
isso é necessário informar o valor a ser procurado, e para qual deve ser convertido.
A função pode ser demonstrada abaixo, com o valor de uma variável digitada pelo
usuário que deve ser convertida antes da gravação no banco de dados.
<?php $ipi = str_replace(",", ".", $ipi); ?>
O valor da chave primária no cadastro de clientes é o CNPJ ou CPF,
conforme padronizado, este código possui pontos e barras que dividem parte dos
algarismos. Para isso é utilizado uma máscara no campo em que o usuário digita a
informação, completando automaticamente as divisões necessárias, tornando-o
legível para conferência. É possível validar os números digitados comparando
resultados dos algarismos com o código verificador, se o valor informado não estiver
correto é executada uma caixa de dialogo informando o erro.
Para essas funções é utilizada um script livre e aberto em linguagem
JavaScript, presente no anexo A, o código foi escrito por Leandro Alexandre (2009 p.
2).
53
2.11.14 Confirmações e avisos em JavaScript
A linguagem JavaScript permite criar caixas de diálogos geradas no meio da
tela, requisitando que o usuário leia a mensagem interagindo com os botões
apresentados. A função “alert()” recebe uma mensagem que será exibida na tela
requisitando a confirmação do usuário para que ela seja fechada. O código abaixo é
utilizado após a inserção de um pedido no aplicativo, ele deve informar o número do
pedido gerado.
<script LANGUAGE=\"Javascript\"> alert(\"Pedido cadastrado - Numero: $numero_pedido\"); </script>
A função “alert” no caso citado acima fica encapsulada dentro do código PHP
para que seja possível preencher a variável “$numero_pedido” com o código do
último pedido cadastrado.
É utilizada uma caixa de diálogo que requisita uma confirmação do usuário
antes de realizar uma determinada ação. A função “confirm()” gera uma mensagem
com dois botões: um “OK” e outro “CANCELAR”. Dependendo da escolha do usuário
o script retorna “true” ou “false”, estes valores são utilizados para confirmar uma
execução do código PHP ou cancelá-la. O script abaixo é utilizado para a
confirmação na exclusão de qualquer registro nos módulos de cadastros.
function show_confirm(pagina,funcao,id,retorno) { var id var retorno var r=confirm("Aperte OK para deletar"); if (r==true) { window.location=pagina+"?funcao="+funcao+"&id="+id+"&retorno="+retorno; } else { window.location=retorno; } }
54
A função “show_confirm(“) recebe diversas variáveis que armazenam o local
de onde foi chamada, permitindo que ela seja utilizada por varias paginas,
retornando para seu local correto após a interação com o usuário.
2.11.15 Envio automático de e-mails
Com a inclusão de um pedido no sistema é possível enviar informações como
número do pedido e razão social do cliente para outro arquivo PHP, que será
responsável por enviar um aviso para o e-mail do departamento de faturamento.
Segue abaixo um exemplo de código utilizado, a qual detecta o sistema operacional
utilizado no servidor para determinar configurações de cabeçalho, antes do envio do
e-mail.
<?php include "../config.php"; $emailsender = "$e_mailremetente"; /* Verifica qual é o sistema operacional do servidor para ajustar o cabeçalho de forma correta. */ if(PATH_SEPARATOR == ";") $quebra_linha = "\r\n"; //Se for Windows else $quebra_linha = "\n"; //Se "não for Windows" // Passando os dados obtidos pelo formulário para as variáveis abaixo $nomeremetente = "Sistema gerenciador de vendas de Bebidas"; $emailremetente = "$e_mailremetente"; $emaildestinatario = "$e_maildestinatario"; $comcopia = ""; $assunto = "Novo pedido adicionado"; $n_pedido = $numero_pedido= $_POST['n_pedido']; $mensagemHTML = '<P></P> <P>Um novo pedido foi adicionado número</P> <p><b><i>'.$n_pedido.'</i></b></p> <hr>'; $headers = "MIME-Version: 1.1" .$quebra_linha; $headers .= "Content-type: text/html; charset=iso-8859-1" .$quebra_linha; $headers .= "From: " . $emailsender.$quebra_linha; $headers .= "Cc: " . $comcopia . $quebra_linha; $headers .= "Bcc: " . $comcopiaoculta . $quebra_linha; $headers .= "Reply-To: " . $emailremetente . $quebra_linha; if(!mail($emaildestinatario, $assunto, $mensagemHTML, $headers ,"-r".$emailsender)){ $headers .= "Return-Path: " . $emailsender . $quebra_linha; mail($emaildestinatario, $assunto, $mensagemHTML, $headers ); } ?>
55
2.11.16 Menus e departamentos
O aplicativo possui um menu personalizado para cada departamento,
habilitando funções específicas a cada repartição. É realizado um rastreamento da
sessão criada a partir do login, para determinar qual departamento o usuário
pertence. A função “switch()” do código abaixo, identifica que valor possui a variável,
encaminhando um “include” para cada tipo de usuário.
<script src="menu/js/menu.js" type="text/javascript"></script> <link href="menu/css/menu.css" rel="stylesheet" type="text/css" /> <link href="menu/css/pagina.css" rel="stylesheet" type="text/css" /> <?php session_start(); $departamento_usuario = $_SESSION["departamento_usuario"]; switch ($departamento_usuario) { case 1: include "representante.php"; break; case 2: include "faturamento.php"; break; case 3: include "producao.php"; break; case 4: include "admin.php"; break; } ?>
Para evitar que um usuário consiga acessar uma página responsável por um
modulo não pertencente ao departamento a qual é registrado, é utilizadas funções
de verificação de setor, sendo assim o usuário será alertado por um diálogo
avisando que o acesso não está autorizado, caso esteja tentando acessar
manualmente um local não permitido.
A figura abaixo representa o aplicativo sendo executado através de um
navegador, com o menu do usuário administrador e a página de cadastro de
clientes.
56
Figura 1: Tela do aplicativo com cadastro de clientes Fonte: o autor
Em toda página se encontra uma ou mais chamadas de funções para
bloquear acesso a um departamento especifico. Esta função verifica a sessão do
usuário, identificando em qual repartição pertence. O arquivo de verificação também
possui um script global para ser executada sempre quando for abrangido, esse
código verifica se o usuário realmente realizou o login antes de obter qualquer
conteúdo do aplicativo. O código do apêndice G é executado sempre que incluído
em outra página, e suas funções quando são chamadas especificamente.
57
3 CONCLUSÃO
A qualidade das informações inseridas no sistema são essências para a
tomada de decisões e organização gerencial da empresa. É importante que o
software exija aos usuários operacionais, a inserção de todas as informações
necessárias para poder automatizar um determinado processo de lançamentos de
pedidos, ordens de vendas ou especificação de carregamento. O gerenciamento de
conhecimento é gerado através da utilização de emissões de relatórios com dados
concisos. Este sistema deve estar disponível para acesso em qualquer lugar, visto a
necessidade de usuários remotos pelo país inteiro, sendo assim é interessante, não
criar mecanismos que possam proibir o acesso de uma determinada faixa de
localização. Para garantir a eficácia do conjunto do software é necessária a
utilização de treinamento ao usuário remoto e local.
A criação dos diagramas para determinar processos e rotinas em que o
sistema deverá cumprir, moldam um padrão, que ajudam na sua construção e
expansão de seus módulos. A cada atualização, com a implementação de novas
funções, deverá ser realizada uma nova análise para que o contexto proposto não
seja afetado em sua estrutura principal, garantindo que o aplicativo somente deve
ser melhorado quando adicionado mecanismos úteis ao objetivo.
A criação de um sistema a partir de uma linguagem confiável e robusta foi de
grande importância para atingir o objetivo planejado. O PHP é mundialmente
conhecido por ser uma linguagem legível, que ao mesmo tempo consegue construir
projetos complexos, com ambiente de missão critica. Validações locais garantem um
grande nível de interação com o usuário, permitindo que o desempenho do aplicativo
seja melhorado, dividindo serviços de carga de dados entre o servidor e a plataforma
do cliente.
O banco de dados MySQL que é totalmente compatível com a linguagem
PHP, tem como principal característica sua velocidade, é utilizado quase
essencialmente para web, já que conta um desempenho superior para este nicho.
Pode-se dizer que utilizar a internet como um meio para disponibilizar o
acesso a um sistema portátil, representa uma grande facilidade de concentração e
disponibilização das informações, onde usuários de vários departamentos podem
58
usufruir de sistema útil, tanto para vendedores quanto gerenciadores, organizando
os dados conforme as necessidades que os departamentos especificam.
Para ampliação do projeto no futuro é necessário utilizar a informação gerada
pelo aplicativo de uma forma mais integrada com toda a empresa, é possível que
seja implementado mecanismos de integração com outros aplicativos locais ou
remotos, a fim de aproveitar os dados para serem utilizado em operações fiscais e
administrativas. Essa integração pode ser gerada, permitindo acessos simultâneos
de outros aplicativos ao banco de dados, onde poderão resgatar dados para
emissão de uma nota fiscal ou lançamentos na contabilidade. Para garantir uma total
automatização de todos os procedimentos decorrentes da vendas de bebidas é
necessária uma grande integração com mais de um aplicativo.
59
REFERÊNCIAS
ALECRIM, Emerson. Conhecendo o Servidor Apache .2006. Disponível em: <http://www.infowester.com/servapach.php>. Acesso em: 21 ago. 2010.
ALEXANDRE, Leandro. Validação de CPF e CNPJ no mesmo campo em JavaScript . 2009. Disponível em:<http://www.vivaolinux.com.br/script/Validacao-de-CPF-e-CNPJ-no-mesmo-campo-em-javascript>. Acesso em: 01 abr. 2011. ANTUNES LAMIM, Jonatham. Gerando PDFs com PHP e a classe FPD . 2010. Disponível em: <http://www.oficinadanet.com.br/artigo/php/gerando_pdfs_com_php_e_a_classe_fpdf_instalacao_e_primeiras_linhas_de_codigo>. Acesso em: 23 out. 2010. APACHE FRIENDS. XAMPP.2009. Disponível em: <http://www.apachefriends.org/pt_br/xampp.html>. Acesso em: 10 out. 2010. AURELIO, Dorival Eloy. JavaScript . 2004. Disponível em: <http://orbita.starmedia.com/~edaurelio/javascript.htm>. Acesso em: 23 out. 2010. BENTO, Marcelo; Convertendo data com PHP . 2009. Disponível em: <http://www.marcelobento.com.br/tag/converter-data/>. Acesso em: 25 abr. 2011 COAR, Ken; BOWEN, Rich. Apache Guia Prático . Rio de Janeiro: Alta Books, 2008. 272 p. DELLA VALLE, James; ULBRICH, Henrique Cesar. Universidade Hacker . 5. ed. São Paulo: Digerati Books, 2006. 352 p. DUARTE, Eber; Implementando Integridade Referencial no MySQL 2006. Disponível em: <http://www.devmedia.com.br/post-1996-Implementando-Integridade-Referencial-no-MySQL.html>. Acesso em: 12 abr. 2011. FERREIRA, Felipe. Linguagem PHP – Vantagens e Aplicações . 2010. Disponível em: <http://www.artigonal.com/internet-artigos/linguagem-php-vantagens-e-aplicacoes-1788643.html>. Acesso em: 23 out. 2010.
60
FIGUEIREDO, Antonio. Administração de sistemas e segurança . 1999. Disponível em: <http://www.ccuec.unicamp.br/revista/infotec/admsis/admsis6-1.html>. Acesso em: 25 out. 2010. FLANAGAN, David. JavaScript: O Guia Definitivo . 4 ed. São Paulo: Artmed, 2002. 816 p. FOROUZAN, A. Behrouz. Comunicação de dados e redes de computadores .3.ed. São Paulo: Artmed, 2004. 840 p. GOURLEY, David; TOTTY, Brian. HTTP: TheDefinitiveGuide. Sebastopol, Ucrânia: O’Reilly Media, 2002. 635 p. FOWLER, Martin. UML essencial : um breve guia para a linguagem padrão de modelagem de objetos. 3. ed. Porto Alegre: Bookman, 2005. 165 p. LOGMAN, Wesley Addison. A history of HTML .1998. Disponível em: <http://www.w3.org/People/Raggett/book4/ch02.html>. Acesso em: 23 out. 2010. MADEIRA, Frederico; Suporte a transações . 2004. Disponível em: <http://imasters.com.br/artigo/2787/mysql/suporte_a_transacoes/>. Acesso em: 14/04/2011. MAJER, Carlos. Desenvolvimento Web: Introdução ao AJAX . [São Paulo], 07 maio. 2010. Disponível em: <http://www.ebah.com.br/desenvolvimento-web-introducao-ao-ajax-pdf-a48787.html>. Acesso em: 23 ago. 2010. MCLEAN, Epharaim; TURBAN, Efraim; WETHERBE, James. Tecnologia da informação para gestão . 3. ed. São Paulo: Artmed, 2002. 645 p. MELO, Alexandro Altair; G.F. NASCIMENTO, Mauricio. PHP Profissional. São Paulo: Novatec, 2007. 464 p. MORONI, Herbert. Criação de sites em Ajax. São Paulo: Digeratti Books, 2007. 128 p. MUTO, Claudio Adonai. PHP e MySQL – Guia Introdutório . 3. ed. Rio de Janeiro: Brasport, 2006. 412 p.
61
OTSUKA, Joice Lee. SAACI - Sistema de Apoio à Aprendizagem Colaborativa na Internet . Fluxograma. 1999. 127 f. Dissertação (Mestrado em Ciência da Computação) - Universidade Federal do Rio Grande do Sul, Porto Alegre, 1999. PAIVA, Raphael. Desmitificando o Ajax. Esquema. 2005. Disponível em: <http://www.jack.eti.br/www/arquivos/apostilas/web/apostila_ajax.pdf>. Acesso em: 23 ago. 2010. PHP GROUP. PHP. 2010. Disponível em: <http://php.net/>. Acesso em: 23 out. 2010. PHPMYADMIN DEVEL TEAM. phpMyAdmin: About.2003. Disponível em: <http://www.phpmyadmin.net/home_page/index.php>. Acesso em: 19 out. 2010. PLATHEY, Oliver. FPDFLibrary . 2008. Disponível em: <http://www.fpdf.org>. Acesso em: 15 ago. 2010. REMOALDO, Pedro. Guia Pratico do Dreamweaver CS3 com PHP, JavaScript e Ajax . Lisboa, Portugal:Centro Atlântico, 2008. 676 p. RODRIGUES DE FREITAS; Andrey. Pericia forense aplicada a informática: ambiente Microsoft. Rio de Janeiro: Brasport, 2006. 215 p. SANTOS, Alfredo. Quem mexeu no meu sistema?: Segurança em sistemas de informação. Rio de Janeiro: Brasport, 2008. 212 p. SOMERA, Guilherme. Treinamento prático em CSS. São Paulo: Digeratti Books, 2006. 160 p. SOUZA, Sandro J. A extensão MySQLi. 2007. Disponível em: <http://www.htmlstaff.org/ver.php?id=10071>.Acesso em: 22 ago. 2010. STALLINGS, William. Redes e Sistemas de Comunicação de Dados . Rio de Janeiro: Elsevier, 2005. 460 p. STEVENS, W. Richard; FENNER, Bill; RUDOFF, M. Andrew. Programação de Rede Unix . São Paulo: Artmed, 2004. 906 p.
62
STROPARO, Elder. Historia do MySQL . 2010. Disponível em: <http://elderstroparo.blogspot.com/2010/01/historia-do-mysql.html>. Acesso em: 23 out. 2010. TRIACCA, Anderson. História do Javascript. Disponível em: <http://www.andersontriacca.com/index.php?Hist%F3ria-do-Javascript&id_postagem=2>. Acesso em: 15 out. 2010. TURBAN, Efraim; MCLEAN, Ephraim; WETHERBE, James. Tecnologia da Informação para Gestão. São Paulo: Artmed, 2002. 660 p. VIDEIRO, Rafael. Criação de bases de dados em linguagem SQL. Disponível em: <http://mysql.softonic.com.br/>. Acesso em: 20 out. 2010. VIEIRA, Leandro. As novas funcionalidade do Dreamweaver CS3 . Disponível em: <http://www.imasters.com.br/artigo/5858/dreamweaver/as_novas_funcionalidades_do_dreamweaver_cs3/>. Acesso em: 22 out. 2010. WELLING, Luke; THOMSON, Laura. PHP e MySQL Desenvolvimento Web. Rio de Janeiro: Elsevier, 2003. 675 p. WORLD WIDE WEB CONSORTIUM. Extensible Markup Language (XML). Disponível em: <http://www.w3.org/XML/>. Acesso em: 15 out. 2010.
63
APÊNDICES
APÊNDICE A APÊNDICE A – Diagrama de sequência
64
APÊNDICE B APÊNDICE B – Diagrama de classes
65
66
APÊNDICE C – Código HTML do formulário para a autenticação do usuário
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <link href="menu/css/menu.css" rel="stylesheet" type="text/css" /> <link href="menu/css/pagina.css" rel="stylesheet" type="text/css" /> </style><br /> <table width="400" border="0" align="center"><table width="400" height="144" border="0" align="center"> <form id="form1" name="form1" method="post" action="admin/logar.php"> <tr> <td width="94"> </td> <td width="296"><h3><strong>Efetue o login</strong></h3></td> </tr> <tr> <td><div align="right">Usuário:</div></td> <td> <label> <input type="text" name="login" id="login" /> </label> </td> </tr> <tr> <td><div align="right">Senha:</div></td> <td> <label> <input type="password" name="senha" id="senha" /> </label> </td> </tr> <tr> <td><div align="right">Departamento:</div></td> <td><select name="dpto" id="dpto"> <option value="1">Representante</option> <option value="2">Faturamento</option> <option value="3">Producão</option> <option value="4">Admin</option> </select></td> </tr> <tr> <td height="37"></td> <td><input type='submit' value='Logar' class='botao' /></td> </tr> </form> </table> </html>
67
APÊNDICE D – Código PHP utilizado para cadastro <?php include "../conexao.php"; include "dataconverter.php"; $id = $_POST['id']; $nome = $_POST['nome']; $endereco = $_POST['endereco']; $uf = $_POST['uf']; $cidade = $_POST['cidade']; $enderecoentrega = $_POST['enderecoentrega']; $data = $_POST['data']; $observacoes = $_POST['observacoes']; $usuario = $_POST['usuario']; $id = preg_replace("/\D+/", "", $id); // remove qualquer caracter não numérico $data = converterData($data); if($_POST['id']=='' and $_GET['funcao'] != "excluir_cliente" and $_GET['funcao'] != "editar_cliente" ) { echo "<script type='text/javascript'>alert('Inclua o CNPJ do CLIENTE!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } if($_POST['nome']=='' and $_GET['funcao'] != "excluir_cliente") { echo "<script type='text/javascript'>alert('Inclua o NOME!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } if($_POST['endereco']=='' and $_GET['funcao'] != "excluir_cliente") { echo "<script type='text/javascript'>alert('Inclua o ENDERECO!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } if($_POST['data']=='' and $_GET['funcao'] != "excluir_cliente") { echo "<script type='text/javascript'>alert('Inclua a data do cadastro!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } if($_POST['uf']=='' and $_GET['funcao'] != "excluir_cliente") { echo "<script type='text/javascript'>alert('Selecione o Estado!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } if($_POST['cidade']=='' and $_GET['funcao'] != "excluir_cliente") { echo "<script type='text/javascript'>alert('Inclua a cidade!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } else if($_GET['funcao'] == "gravar_cliente" and $_POST['id']!='' and $_POST['nome']!='' and $_POST['endereco']!='' and $_POST['data']!='' ) { $sql_gravar = mysql_query("INSERT INTO cliente (id_cliente, nome , endereco, uf, cidade,enderecoentrega, data, observacoes, usuario) value ('$id','$nome','$endereco','$uf','$cidade', '$enderecoentrega','$data','$observacoes','$usuario')"); echo "<script type='text/javascript'>alert('Cliente Cadastrado!');</script>"; echo "<script>window.location='../cliente.php';</script>"; } else if($_GET['funcao'] == "editar_cliente" and $_POST['nome']!='' and $_POST['endereco']!='' and $_POST['data']!='') { $id = $_GET['id'];
68
$retorno = $_GET['retorno']; $sql_alterar = mysql_query("UPDATE cliente SET nome='$nome', endereco='$endereco', uf='$uf', cidade='$cidade', enderecoentrega='$enderecoentrega',data='$data', observacoes='$observacoes' WHERE id_cliente = '$id'"); header("Location: $retorno?nome_busca=$nome"); } if($_GET['funcao'] == "excluir_cliente"){ $id = $_GET['id']; $retorno = $_GET['retorno']; $sql_del = mysql_query("DELETE FROM cliente WHERE id_cliente = '$id'"); header("Location: $retorno"); } ?>
69
APÊNDICE E – Código de inclusão de pedidos <?php include "../conexao.php"; include "dataconverter.php"; $condicao = $_POST['condicao']; if($_GET['funcao']=="inclui_pedido") { $id_cliente = $_GET['id_cliente']; session_start(); $_SESSION[pedido_dados][id_cliente] = $id_cliente; header("location: ../pedido_inclui.php?funcao=editar_cliente"); //&id_cliente=$id_cliente } if($_GET['funcao']=="incluir_iten") { $id_produto = $_GET['id_produto']; $quantidade = $_POST['quantidade']; $preco = $_POST['preco']; session_start(); $_SESSION[indice] = $_SESSION[indice]+1; $indice = $_SESSION[indice]; $_SESSION[pedido][$indice][id_produto] = $id_produto; $_SESSION[pedido][$indice][quantidade] = $quantidade; $_SESSION[pedido][$indice][preco] = $preco; $sql_ipi = mysql_query("SELECT ipi FROM produto WHERE id_produto = '$id_produto'"); if (isset($sql_ipi)){ while($linha_produto = mysql_fetch_array($sql_ipi)){ $tabela_ipi = $linha_produto['ipi']; } } $_SESSION[pedido][$indice][ipi] = $tabela_ipi; $_SESSION[pedido][$indice][total] = (($preco+$tabela_ipi)*$quantidade); //--- DESCOBRIR TOTAL DO PEDIDO $indice = $_SESSION[indice]; $_SESSION[pedido_dados][total] = $_SESSION[pedido_dados][total] + $_SESSION[pedido][$indice][total]; header("location: ../pedido_inclui.php?funcao=editar_cliente"); } if($_GET['funcao']=="adicionais") { $sql_adicionais = mysql_query("UPDATE pedido SET condpgto = ('$condicao') where id_pedido = ('$id_pedido')"); $sql_adicionais = mysql_query("UPDATE pedido SET confirmado = ('1') where id_pedido = ('$id_pedido')"); } //**CONFIRMAÇÃO DO PEDIDO if($_GET['funcao'] == "confirmar") { //--- PEDIDO session_start(); $id_cliente = $_SESSION[pedido_dados][id_cliente]; $vltotal = $_SESSION[pedido_dados][total];
70
//---INSERINDO PEDIDO $login_usuario = $_SESSION["login_usuario"]; $sql_confirma_pedido = mysql_query("INSERT INTO pedido (id_cliente, valor, condpgto, login, carregamento) value ('$id_cliente','$vltotal','$condpgto','$login_usuario','0')"); $tabela_pedido = mysql_query("SELECT max(id_pedido) FROM pedido"); if (isset($tabela_pedido)){ while($linha_pedido = mysql_fetch_array($tabela_pedido)){ $numero_pedido = $linha_pedido['max(id_pedido)']; } } $_SESSION[pedido_dados][id_pedido] = $numero_pedido; //---------ITENS $indice = $_SESSION[indice]; $contador_itens = 1; while ($contador_itens<=$indice) { $id_produto = $_SESSION[pedido][$contador_itens][id_produto]; $quantidade = $_SESSION[pedido][$contador_itens][quantidade]; $preco = $_SESSION[pedido][$contador_itens][preco]; $total_itens = $_SESSION[pedido][$contador_itens][total]; $sql_confirma_itens = mysql_query("INSERT INTO itens (id_produto, id_pedido, quantidade, vlunitario, vltotal) value ('$id_produto','$numero_pedido','$quantidade','$preco','$total_itens')"); $contador_itens = $contador_itens+1; } $_SESSION[pedido_dados] = NULL; $_SESSION[pedido] = NULL; echo"<script LANGUAGE=\"Javascript\">alert(\"Pedido cadastrado - Numero: $numero_pedido\");</SCRIPT>"; echo "<script>window.location='../pedido_inclui.php';</script>"; } //**INSERE ITEM NA EDIÇÃO DO PEDIDO if($_GET['funcao'] == 'incluir_iten_edita') { $id = $_POST['id_pedido']; } ?>
71
APÊNDICE F – Código de inclusão e baixas de ordens <?php include "../conexao.php"; include "dataconverter.php"; if ($_POST['funcao'] == "adicionar") { $transportadora = $_POST['transportadora']; $motorista = $_POST['motorista']; $datacarreg = $_POST['datacarreg']; if ($transportadora == "" or $motorista == "" or $datacarreg == "") { echo "<script type='text/javascript'>alert('Preencha todos os campos!');</script>"; echo "<script>window.location='../ordem.php';</script>"; } if ($_POST['id_pedido'] != "") { $ordem_id1 = mysql_query("insert into ordem (quantidade, peso) values (0,0)"); $ordem_id2 = mysql_query("SELECT max(id_ordem) FROM ordem"); $ordem_id3 = mysql_fetch_array($ordem_id2); $ordem_id = $ordem_id3['max(id_ordem)']; $entregas = 0; foreach ($_POST['id_pedido'] as $pedido_id) { $entregas = $entregas + 1; $sql = " update pedido set id_ordem = '$ordem_id' where id_pedido = '$pedido_id'"; if ($sql) { $sql = mysql_query($sql); } } $outras1 = mysql_query("select sum(peso), sum(quantidade) from pedido, produto, itens where pedido.id_ordem = '$ordem_id' and pedido.id_pedido = '$pedido_id' and itens.id_pedido = pedido.id_pedido and itens.id_produto = produto.id_produto"); if (isset($outras1)) { while ($linha_ordem = mysql_fetch_array($outras1)) { $peso = $linha_ordem['sum(peso)']; $quantidade = $linha_ordem['sum(quantidade)']; } } //--TRATAMENTO FINAL $peso = $peso * $quantidade; $datacarreg = converterData($datacarreg); //--INSERÇÃO FINAL $final = mysql_query("update ordem set quantidade = '$quantidade', peso = '$peso', entregas ='$entregas', transportadora = '$transportadora', motorista = '$motorista', datacarreg = '$datacarreg' where id_ordem = '$ordem_id'"); echo "<script type='text/javascript'>alert('Ordem criada - Número: $ordem_id');</script>"; echo "<script>window.location='../ordem.php';</script>"; } else { echo "<script type='text/javascript'>alert('Selecione algum pedido!');</script>"; echo "<script>window.location='../ordem.php';</script>"; } } //-- BAIXA DE ORDEM if ($_POST['funcao'] == "baixar") { if ($_POST['id_ordem'] == "") { echo "<script type='text/javascript'>alert('Selecione alguma ordem!');</script>"; echo "<script>window.location='../ordem_baixa.php';</script>";
72
} if ($_POST['datacarreg'] == "") { echo "<script type='text/javascript'>alert('Cadastre a data de carregamento!');</script>"; echo "<script>window.location='../ordem_baixa.php';</script>"; } if ($_POST['id_pedido'] != "" or $_POST['datacarreg'] != "") { $datacarreg = converterData($_POST['datacarreg']); foreach ($_POST['id_ordem'] as $ordem_id) { $sql = "update pedido, ordem set carregamento = '1', datacarreg = '$datacarreg' where pedido.id_ordem = '$ordem_id' and ordem.id_ordem = '$ordem_id'"; $sql = mysql_query($sql); } echo "<script type='text/javascript'>alert('Orden(s) baixadas');</script>"; echo "<script>window.location='../ordem_baixa.php';</script>"; } }?>
73
APÊNDICE G – Verificação de departamento e usuário logado
<?php include "conexao.php"; session_start(); if (isset($_SESSION["login_usuario"]) AND isset($_SESSION['senha_usuario'])) { $login_usuario = $_SESSION["login_usuario"]; $senha_usuario = $_SESSION["senha_usuario"]; $departamento_usuario = $_SESSION["departamento_usuario"];
$sql = mysql_query("SELECT * FROM usuario WHERE login = '$login_usuario'"); $cont = mysql_num_rows($sql); while ($linha = mysql_fetch_array($sql)) { $senha_db = $linha['senha']; $departamento_db = $linha['departamento']; } if ($cont == 0) { unset($_SESSION["login_usuario"]); unset($_SESSION["senha_usuario"]); unset($_SESSION["departamento_usuario"]); echo " <META HTTP-EQUIV=REFRESH CONTENT='0; URL=login.php'> <script type=\"text/javascript\"> alert(\"O nome de usuario nao corresponde.\"); </script>"; } if ($senha_db != md5($senha_usuario)) {//confere senha unset($_SESSION["login_usuario"]); unset($_SESSION["senha_usuario"]); unset($_SESSION["departamento_usuario"]); echo " <script type=\"text/javascript\"> alert(\"Senha incorreta.\"); window.location='login.php';</script>"; } }else { echo " <script type=\"text/javascript\"> alert(\"Autentique-se para entrar no sistema.\"); window.location='login.php';</script>"; } function dep_representante(){ if ($_SESSION["departamento_usuario"] == '1') { echo " <script type=\"text/javascript\"> alert(\"Pagina nao autorizada.\"); window.location='login.php';</script>"; } } function dep_faturamento(){ if ($_SESSION["departamento_usuario"] == '2') { echo " <script type=\"text/javascript\"> alert(\"Pagina nao autorizada.\"); window.location='login.php';</script>"; } } function dep_producao(){
74
if ($_SESSION["departamento_usuario"] == '3') { echo " <script type=\"text/javascript\"> alert(\"Pagina nao autorizada.\"); window.location='login.php';</script>"; } } function dep_admin(){ if ($_SESSION["departamento_usuario"] == '4') { echo " <script type=\"text/javascript\"> alert(\"Pagina nao autorizada.\"); window.location='login.php';</script>"; } } ?>
75
APÊNDICE H – Sintaxe SQL para criação das tabelas do banco de dados
CREATE TABLE `itens` ( `id_itens` int(11) NOT NULL AUTO_INCREMENT, `id_produto` int(11) NOT NULL, `id_pedido` int(11) NOT NULL, `quantidade` int(11) DEFAULT NULL, `vlunitario` float DEFAULT NULL, `vlst` float DEFAULT NULL, `vltotal` float DEFAULT NULL, PRIMARY KEY (`id_itens`), KEY `id_pedido` (`id_pedido`), KEY `id_produto` (`id_produto`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `cliente` ( `id_cliente` varchar(20) NOT NULL, `nome` varchar(255) NOT NULL, `endereco` varchar(255) NOT NULL, `uf` varchar(2) NOT NULL, `cidade` varchar(100) NOT NULL, `enderecoentrega` varchar(255) DEFAULT NULL, `data` date NOT NULL, `observacoes` varchar(255) DEFAULT NULL, `usuario` varchar(50) NOT NULL, PRIMARY KEY (`id_cliente`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `ordem` ( `id_ordem` int(10) unsigned NOT NULL AUTO_INCREMENT, `quantidade` int(11) NOT NULL, `peso` float NOT NULL, `entregas` varchar(255) DEFAULT NULL, `transportadora` varchar(30) DEFAULT NULL, `motorista` varchar(30) DEFAULT NULL, `datacarreg` date DEFAULT NULL, PRIMARY KEY (`id_ordem`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `pedido` ( `id_pedido` int(11) NOT NULL AUTO_INCREMENT, `id_ordem` int(11) DEFAULT NULL, `id_cliente` varchar(20) NOT NULL, `valor` float DEFAULT NULL, `desconto` int(11) DEFAULT NULL, `condpgto` varchar(60) DEFAULT NULL, `login` varchar(50) DEFAULT NULL, `carregamento` binary(1) NOT NULL, PRIMARY KEY (`id_pedido`), KEY `id_ordem` (`id_ordem`), KEY `id_cliente` (`id_cliente`), FULLTEXT KEY `id_cliente_2` (`id_cliente`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `produto` ( `id_produto` int(11) NOT NULL AUTO_INCREMENT, `produto` varchar(60) NOT NULL, `peso` float NOT NULL,
76
`data` date NOT NULL, `observacoes` varchar(255) DEFAULT NULL, `ipi` double DEFAULT NULL, PRIMARY KEY (`id_produto`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `usuario` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(80) NOT NULL, `login` varchar(80) NOT NULL, `senha` varchar(80) NOT NULL, `email` varchar(255) NOT NULL, `departamento` int(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
77
ANEXOS
78
ANEXO A – Código JavaScript para validação de CNPJ e CPF
function campo_numerico (){ if (event.keyCode < 45 || event.keyCode > 57) event.returnValue = false; } /*function cnpj_cpf verifica qual das funcoes tem que chamar cpf ou cnpj*/ function cnpj_cpf(campo,documento,f,formi){ form = formi; for (Count = 0; Count < 2; Count++){ if (form.rad[Count].checked) break; } if (Count == 0){ mascara_cpf (campo,documento,f); } else{ mascara_cnpj (campo,documento,f); } } function mascara_cnpj (campo,documento,f){ var mydata = ''; mydata = mydata + documento; if (mydata.length == 2){ mydata = mydata + '.'; ct_campo = eval("document."+f+"."+campo+".value = mydata"); ct_campo; } if (mydata.length == 6){ mydata = mydata + '.'; ct_campo = eval("document."+f+"."+campo+".value = mydata"); ct_campo; } if (mydata.length == 10){ mydata = mydata + '/'; ct_campo1 = eval("document."+f+"."+campo+".value = mydata"); ct_campo1; } if (mydata.length == 15){ mydata = mydata + '-'; ct_campo1 = eval("document."+f+"."+campo+".value = mydata"); ct_campo1; } if (mydata.length == 18){ valida_cnpj(f,campo); } } function mascara_cpf (campo,documento,f){ var mydata = ''; mydata = mydata + documento; if (mydata.length == 3){ mydata = mydata + '.'; ct_campo = eval("document."+f+"."+campo+".value = mydata"); ct_campo; } if (mydata.length == 7){ mydata = mydata + '.';
79
ct_campo = eval("document."+f+"."+campo+".value = mydata"); ct_campo; } if (mydata.length == 11){ mydata = mydata + '-'; ct_campo1 = eval("document."+f+"."+campo+".value = mydata"); ct_campo1; } if (mydata.length == 14){ valida_cpf(f,campo); } } function valida_cnpj(f,campo){ pri = eval("document."+f+"."+campo+".value.substring(0,2)"); seg = eval("document."+f+"."+campo+".value.substring(3,6)"); ter = eval("document."+f+"."+campo+".value.substring(7,10)"); qua = eval("document."+f+"."+campo+".value.substring(11,15)"); qui = eval("document."+f+"."+campo+".value.substring(16,18)"); var i; var numero; var situacao = ''; numero = (pri+seg+ter+qua+qui); s = numero; c = s.substr(0,12); var dv = s.substr(12,2); var d1 = 0; for (i = 0; i < 12; i++){ d1 += c.charAt(11-i)*(2+(i % 8)); } if (d1 == 0){ var result = "falso"; } d1 = 11 - (d1 % 11); if (d1 > 9) d1 = 0; if (dv.charAt(0) != d1){ var result = "falso"; } d1 *= 2; for (i = 0; i < 12; i++){ d1 += c.charAt(11-i)*(2+((i+1) % 8)); } d1 = 11 - (d1 % 11); if (d1 > 9) d1 = 0; if (dv.charAt(1) != d1){ var result = "falso"; } if (result == "falso") { alert("CNPJ inválido!"); aux1 = eval("document."+f+"."+campo+".focus"); aux2 = eval("document."+f+"."+campo+".value = ''"); } } function valida_cpf(f,campo){ pri = eval("document."+f+"."+campo+".value.substring(0,3)"); seg = eval("document."+f+"."+campo+".value.substring(4,7)"); ter = eval("document."+f+"."+campo+".value.substring(8,11)"); qua = eval("document."+f+"."+campo+".value.substring(12,14)"); var i; var numero;
80
numero = (pri+seg+ter+qua); s = numero; c = s.substr(0,9); var dv = s.substr(9,2); var d1 = 0; for (i = 0; i < 9; i++){ d1 += c.charAt(i)*(10-i); } if (d1 == 0){ var result = "falso"; } d1 = 11 - (d1 % 11); if (d1 > 9) d1 = 0; if (dv.charAt(0) != d1){ var result = "falso"; } d1 *= 2; for (i = 0; i < 9; i++){ d1 += c.charAt(i)*(11-i); } d1 = 11 - (d1 % 11); if (d1 > 9) d1 = 0; if (dv.charAt(1) != d1){ var result = "falso"; } if (result == "falso") { alert("CPF inválido!"); aux1 = eval("document."+f+"."+campo+".focus"); aux2 = eval("document."+f+"."+campo+".value = ''"); } }