![]() |
Sistema de Folha de Pagamento (WePayU)Neste semestre, vocês projetarão e implementarão um sistema de informação simples para administrar os pagamentos a empregados de uma empresa. Nesta disciplina, a análise é dada pronta para vocês, através desse documento (leiam com bastante atenção) e, principalmente, através dos artefatos de análise executáveis representados pelos testes de aceitação automáticos que serão fornecidos (se você não entendeu essa frase, comece a assistir às aulas). Um dos objetivos desse projeto é fazer com que vocês consigam construir um sistema que passe 100% dos testes de aceitação. Se conseguirem, significa que vocês atingiram o objetivo mais importante no desenvolvimento de software de qualidade: atender aos requisitos do cliente. |
Os testes de aceitação acessam apenas a lógica do negócio, não a interface com o usuário. Em um sistema qualquer, interfaces bonitas e fáceis de usar são uma característica muito importante. Entretanto, para facilitar a vida de vocês, só faremos a lógica de negócio do sistema, sem implementação alguma de interface com o usuário. Também é uma regra importante separar a interface com o usuário da lógica de negócio e fazer com que seu projeto não tenha interface com o usuário é uma forma de você sacar esse ponto arquitetural importante.
Vocês terão que projetar e implementar o sistema de uma forma incremental. Haverá alguns milestones e, em cada um, novas funcionalidades serão adicionadas ao sistema. As funcionalidades estão descritas dentro de User Stories. Uma User Story consiste de duas partes: 1) uma descrição informal do que se deseja em termos de funcionalidade e das interações que o sistema deve suportar; 2) um conjunto formal de testes de aceitação que, se executarem direitinho, comprovam que a funcionalidade foi implementada como desejada. Em cada um dos milestones, haverá um conjunto de user stories que deverá ser implementado. Aqui você encontra os testes de aceitação para cada user story, e as instruções de como rodá-los. Antes de entregar um milestone, sempre leia as recomendações e a listagem do que deve ser entregue.
O sistema será construído em etapas (chamadas iterações). Em cada iteração, certas User Stories serão desenvolvidas. Veja os detalhes da análise nas descrições das user stories (há também um glossário dos termos usados no sistema).
O propósito do projeto é de construir um sistema de folha de pagamento. O sistema consiste de um banco de dados de empregados de uma empresa além dos seus dados associados tais como cartões de ponto. O sistema deve pagar cada empregado. Empregados devem receber o salário correto, no momento correto, usando o método que eles preferem. Além do mais, várias taxas e impostos são deduzidos do seu salário.
User stories
Milestones
Testes de aceitação
Linguagem de script
Glossário
Modelo conceitual
As User Stories (plural de User Story) levantadas inicialmente para o sistema estão mostradas abaixo. User Stories são uma forma de expressar requisitos funcionais desejados para o sistema (o que o sistema deve fazer). Observe que, no mundo real, o cliente poderá mudar de idéia com respeito a esses requisitos funcionais. É até possível que o professor (danado que é) altere os requisitos no meio do semestre. As User Stories foram priorizadas pelo cliente conforme podem ver na descrição dos milestones.
User Story |
Título | Breve Descrição |
1 | Adição de um empregado | Um novo empregado é adicionado ao sistema. Os seguintes atributos são fornecidos: nome, endereço, tipo (hourly,salaried,commissioned) e os atributos associados (salário horário, salário mensal, comissão). Um número de empregado (único) deve ser escolhido automaticamente pelo sistema. |
2 | Remoção de um empregado | Um empregado é removido do sistema. |
3 | Lançar um cartão de ponto | O sistema anotará a informação do cartão de ponto e a associará ao empregado correto. |
4 | Lançar um resultado venda | O sistema anotará a informação do resultado de venda e a associará ao empregado correto. |
5 | Lançar uma taxa de serviço | O sistema anotará a informação da taxa de serviço e a associará ao empregado correto. |
6 | Alterar detalhes de um empregado | Os seguintes atributos de um empregado podem ser alterados: nome, endereço, tipo (hourly,salaried,commisioned), método de pagamento, se pertence ao sindicato ou não, identificação no sindicato, taxa sindical |
7 | Rodar a folha de pagamento para hoje | O sistema deve achar todos os empregados que devem ser pagos no dia indicado, deve calcular o valor do salário e deve providenciar o pagamento de acordo com o método escolhido pelo empregado. |
8 | Undo/redo | Qualquer transação associada aos User Stories 1 a 7 deve ser desfeita (undo) ou refeita (redo). |
9 | Agenda de pagamento |
Cada empregado é pago de acordo com uma "agenda de pagamento". Empregados podem selecionar a agenda de pagamento que desejam. Por default, as agendas "semanalmente", "mensalmente" e "bi-semanalmente" são usadas, como explicado na descricao geral. Posteriormente, um empregado pode pedir para ser pago de acordo com qualquer uma dessas agendas. |
10 | Criação de novas agendas de pagamento |
A direção da empresa pode criar uma nova agenda de pagamento e
disponibilizá-la para os empregados escolherem, se assim desejarem. Uma agenda é especificada através de um string. Alguns exemplos mostram as possibilidades: "mensal 1": dia 1 de todo mês "mensal 7": dia 7 de todo mês "mensal $": último dia útil de todo mês "semanal 1 segunda": toda semana às segundas-feiras "semanal 1 sexta": toda semana às sextas-feiras "semanal 2 segunda": a cada 2 semanas às segundas-feiras |
Aqui você pode baixar os testes de aceitação que você deve rodar para saber se o seu sistema está atendendo direitinho os requisitos. Você usará o EasyAccept para rodar os testes. Veja aqui. Para poder rodar os testes, vocês precisarão criar uma Façade que acessa a business logic do seu sistema segundo uma linguagem de script que foi criada para os testes de aceitação.
Detalhe: num sistema de informação real, a persistência de dados usaria provavelmente um banco de dados. Não faremos isso aqui. A informação persistente pode ser feita em arquivo com XML (vejam java.beans.XMLEncoder e java.beans.XMLDecoder).
Para acessar a business logic de seu programa e poder realizar os testes de aceitação, você precisará implementar uma linguagem de script que consiste nos comandos abaixo. Esses são os comandos usados nos testes de aceitação (us1.txt, us2.txt, etc.). Cada um deles deve corresponder a um método na sua façade.
Obs.: estão listados apenas os comandos usados nos testes das User Stories 1 a 8.
<void> zeraSistema <void> alteraEmpregado emp=<String> atributo=<String> valor1=<String> <void> alteraEmpregado emp=<String> atributo=sindicalizado valor1=false <void> alteraEmpregado emp=<String> atributo=sindicalizado valor=true idSindicato=<String> taxaSindical=<String> <void> alteraEmpregado emp=<String> atributo=metodoPagamento valor1=banco banco=<String> agencia=<String> contaCorrente=<String> <String> criarEmpregado nome=<String> endereco=<String> tipo=<String> salario=<String> <String> criarEmpregado nome=<String> endereco=<String> tipo=comissionado salario=<String> comissao=<String> <void> encerrarSistema <String> getAtributoEmpregado emp=<String> atributo=<String> <String> getEmpregadoPorNome nome=<String> indice=<int> <String> getHorasExtrasTrabalhadas emp=<String> dataInicial=<String> dataFinal=<String> <String> getHorasTrabalhadas emp=<String> dataInicial=<String> dataFinal=<String> <String> getTaxasServico emp=<String> dataInicial=<String> dataFinal=<String> <String> getVendasRealizadas emp=<String> dataInicial=<String> dataFinal=<String> <void> lancaCartao emp=${id1} data=<String> horas=<String> <void> lancaTaxaServico emp=<String> data=<String> valor=<String> <void> lancaVenda emp=<String> data=<String> valor=<String> <void> removerEmpregado emp=<String> <void> redo <void> rodaFolha data=<String> saida=<String> <String> totalFolha data=<String> <void> undo
Teremos 3 milestones. Vejam abaixo.
Vocês vão observar que não pedi interface gráfica (Swing ou Web). Tem dois motivos:
Implemente as user stories 1 a 8.
Recomendações para a entrega:
Coisas que devem ser entregues:
Lembre dos seguintes pontos ao entregar o resultado:
Agora, vamos brincar! Você vai receber o projeto de outro grupo e deverá implementar o resto das user stories. Mude o mínimo necessário no programa que você recebeu para implementar a User Story. Você deve avaliar os pontos abaixo (incluir sua avaliação no relatório). Organize seu relatório exatamente usando as seções abaixo.
Vamos brincar com threads. Seus objetivos são:
User Story |
Título | Breve Descrição |
M4.1 | comando executeScript | Introduza um novo comando no EasyAccept chamado ExecuteScript. O comando
é chamado assim:executeScript newThread={true|false} scriptFile=<arquivo com script de teste> Por enquanto, só aceite newThread=false e desconsidere a questão de threads. O comando deve executar o script de teste contido no arquivo indicado. Claro que pode haver aninhamento de tais comandos: um script pode conte o comando executeScript para executar um script que, por sua vez, tem outro executeScript, e assim por diante. Não há recursão de scripts mas também não há necessidade de verificar se alguma recusrão foi feita. O teste de aceitação é m3_1.txt |
M4.2 | Execução com thread pool | Introduza o conceito de thread pool no EasyAccept. Para isso, implemente o
seguinte comando no EasyAccept:threadPool poolsize=<numero de threads> e faça com que o comando executeScript newThread=true ... use esse pool de threads. O teste de aceitação é m3_2.txt. Cuidado, pois agora o ambiente é multithread e há compartilhamento de estruturas de dados no seu sistema: seu sistema vai ter que ser alterado para ser multithread. |
M4.3 | Repetição de comandos | Para estressar os testes, queremos que os threads trabalhem durante mais
tempo. Implemente um novo comando do EasyAccept que repete um comando:repeat numberOfTimes=n anyCommand ... O teste de aceitação é m3_3.txt. |
Lembrem que o modelo de design (que será implementado em software) não precisa seguir o modelo conceitual entidade-por-entidade.
assalariado: um tipo de empregado que recebe salário fixo mensal.
cartão de ponto: quando o empregado chega no trabalho e sai do trabalho, ele "bate ponto" (ou "assina ponto") no relógio de ponto usando um cartão de ponto. O cartào registra data/hora de entrada e saída. Hoje, com tecnologias mais modernas, o cartão pode não mais existir fisicamente.
comissionado: tupo de empregado que recebe salário variável de acordo com seu desempenho (quanto ele(a) vende, por exemplo)
comissão: taxa aplicada em cima das vendas do empregado para calcular a parte variável do seu salário.
contracheque: relatório impresso indicando os detalhes de pagamento de um empregado, incluindo salário, deduções, etc.
dedução: algo retirado automaticamente do salário de um empregado.
empregado: alguém que recebe salário numa empresa. É a entidade básica tratada por um sistema de folha de pagamento.
folha de pagamento: "Rodar a folha" significa verificar quem deve receber quanto no certo dia.
hora extra: certos empregados podem receber salário maior quando trabalham além do número acertado de horas.
horista: um tipo de empregado que recebe salário proporcional ao número de horas trabalhadas. As horas trabalhadas são anotadas em "cartões de ponto".
identificação do empregado: cada empregado é identificado unicamente por uma identificação. Observe que a identificação usada pela folha de pagamento não é a mesma da identificação usada pelo sindicato.
imposto: um tipo especial de dedução resultado de uma lei fiscal; exemplos de impostos no Brasil: Imposto de Renda, INSS, ISS, ...
método de pagamento: a forma com a qual o empregado recebe seu salário (cheque pelos correios, depósito em banco, em mãos, ...)
relógio de ponto: aparelho que serve para anotar numa folha de ponto a hora de entrada e hora de saída de um empregado.
resultado venda: comprovante de uma venda realizada por um empregado.
salário: de forma geral, é o valor devido a um empregado pelo tabalho realizado. O salário antes das deduções chama-se "salário bruto"; depois das deduções, chama-se "salário líquido". Deduções podem ser impostos, taxa sindical, outras taxas de serviços, etc.
sindicato: uma associação de empregados que negocia com a empresa (salários, por exemplo) em prol do conjunto de empregados. Desta forma, os empregados conseguem negociar em conjunto e obter condições melhores de salário, de trabalho, etc. Um empregado não é obrigado a pertencer a um sindicato.
taxa de serviço: o sindicato pode prestar serviços adicionais (crechae para crianças, etc.) aos empregados e cobrar cada empregado pelos serviços que ele9a) utiliza.
taxa sindical: a taxa básica cobrada pelo sindicato de um empregado.