Cálculo de salários Introdução e objectivos O Tio Manuel abriu um novo negócio: um restaurante dedicado exclusivamente a entregas de comida ao domicilio. Para apoiar a gestão deste seu novo negócio, contratou a ULHT para desenvolver um programa de calculo de salários dos funcionários responsáveis pelas entregas de comida. O programa deverá ser desenvolvido em linguagem Java. Devem ser implementados os requisitos que se apresentam neste documento. Informação do domínio Como se indicou anteriormente, o principal objectivo do programa é determinar o salário de cada funcionário. Caracterização do Funcionário Os funcionários são caracterizados por: o seu ID de funcionário um número inteiro positivo. o seu nome uma String o seu nível de experiência um número inteiro entre 0 e 5. Calculo de Salário O Salário de um determinado funcionário é calculado da seguinte forma: Salário Bruto = Salário Base + Bónus Salário Líquido = Salário Bruto Imposto * Salário Bruto 1
Salário Base Cada funcionário tem um Salário Base. Este é um valor que o funcionário recebe, independentemente do número de entregas que efectua. Os funcionários com mais experiência recebem um salário base maior. O Salário Base (SB)é calculado da seguinte forma: SB = Remuneração Base + Nível de experiência * 5 O valor actual da Remuneração Baseé de 500.5unidades monetárias. Bónus Para além do Salário Base, cada funcionário recebe um Bónus. O objectivo deste pagamento extra é premiar os funcionários que são mais eficientes no seu trabalho. Desta forma, por cada entrega, é pago um valor monetário extra. Este valor depende do número de quilómetros percorridos para fazer a entrega. Por uma questão de simplificação da realidade, o restaurante divide a área geográfica na qual opera em três zonas (A, B e C). A tabela seguinte apresenta os valores que são pagos actualmente, em cada zona. Zona Valor / encomenda A 0.5 B 0.75 C 1.5 Assim sendo, o Bónusde um funcionário, num determinado mês, é calculado da seguinte forma: Bónus = Enc. Zona A * 0.5 + Enc. Zona B * 0.75 + Enc. Zona C * 1.5 Onde: Enc. Zona Aé o número de encomendas que o funcionário entregou na Zona A. Enc. Zona Bé o número de encomendas que o funcionário entregou na Zona B. Enc. Zona Cé o número de encomendas que o funcionário entregou na Zona C. 2
Imposto Cada funcionário tem ainda de pagar uma parte do seu salário como Impostosobre o seu rendimento. Este Impostoé calculado considerando a seguinte tabela: Salário bruto entre Taxa a aplicar (%) < 505 0 [505; 1000[ 10 [1000; 1500[ 15 >= 1500 20 Exemplo Por exemplo, para um salário bruto de 1350, a Taxa será de 15%. Logo, Salário Bruto = 1350 Imposto = 1350 * 15% = 202.5 Salário Líquido = 1350 202.5 = 1147.5 Programa a desenvolver Input do programa Para alimentar o programa serão usados dois ficheiros de texto, conforme indicados na tabela seguinte. Nome do ficheiro funcionarios.txt entregas.txt Descrição Contém a listagem de funcionários que trabalham para o restaurante. Contém a listagem de entregas efectuadas por cada funcionário, num determinado mês. 3
Estrutura e conteúdo do ficheiro de input funcionarios.txt Onde: <ID Funcionário> : <Nome Funcionário> : <Nível experiência> <ID Funcionário>é um número inteiro positivo; <Nome Funcionário>é uma String; <Nível experiência>é um número inteiro positivo. Notas: Eventuais linhas em branco no ficheiro devem ser ignoradas. É garantido que não aparecem no ficheiro entradas com IDs de funcionário repetidos. Os símbolos <>acima indicados servem apenas como identificador dos vários componentes e não estão presentes nos ficheiros de input. Eventuais espaços em branco à volta do nome do Funcionário devem ser ignorados. p.e. Victor Valente deve ser interpretado como Victor Valente. Estrutura e conteúdo do ficheiro de input entregas.txt Cada linha do ficheiro de input irá conter o nome de um produto e o número de unidades, separados pelo caractere de dois pontos conforme a descrição que se segue: <ID Funcionário> : <Zona Encomenda> : <Peso> Onde: <ID Motorista>é um número inteiro positivo <Zona Encomenda>é um caractere (com os valores A, B ou C ) <Peso Encomenda>é um número inteiro positivo, em gramas (p.e. 200) Output do programa O programa deverá ter como output um ficheiro de texto chamado resultados <data hora>.txt. 4
Onde <data hora> será a concatenação da data e hora de início de execução do programa, no formato AAAAMMDDHH24MISS. Estrutura e conteúdo do ficheiro de output O ficheiro de output deve apresentar a seguinte informação, para cada um dos funcionários: O seu ID de Funcionário. O seu nome. O seu nível de experiência. O número total de encomendas que o funcionário realizou. O número total de encomendas para a Zona A. O número total de encomendas para a Zona B. O número total de encomendas para a Zona C. O peso total transportado pelo funcionário. O peso total transportado para a Zona A. O peso total transportado para a Zona B. O peso total transportado para a Zona C. O valor do Salário Base O valor do Bónus O valor do Salário Bruto A percentagem a pagar de Imposto. O valor a pagar de Imposto O valor do Salário Líquido 5
Notas: Os Pesos devem ser apresentados em quilogramas e com 3 casas decimais. Os Salários e Imposto devem ser apresentado com 3 casas decimais. Esta informação deve ser escrita usando a seguinte sintaxe: Exemplos <Nome> <ID> <Nível experiência> <Total enc> <Total zona A> <Total zona B> <Total zona C> <Peso total> <Peso Zona A> <Peso Zona B> <Peso Zona C> <Salário Base> <Bónus> <Salário Bruto> <Percentagem Imposto> <Valor do Imposto> <Salário Líquido> <Linha em branco> Ficheiros de Input Segue se um exemplo do ficheiro de input funcionarios.txt: 1 : Pedro Reis : 5 2 : Miguel Teles : 5 3 : Nuno Reis : 4 4 : Rafael Carrilho : 3 5 : Nuno Nunes : 3 6 : Osvaldo Pires : 2 7 : Tiago Santos : 2 8 : J. Almeida : 2 9 : Rui Almondegas : 2 10 : Anacleto : 1 11 : José Manuel : 3 12 : Rudolfo Bento : 3 13 : Victor Valente : 1 14 : Lúcia Portugal : 3 15 : Vanessa Santos : 1 6
Segue se um exemplo do ficheiro de input entregas.txt: 1 : A : 250 2 : B : 610 3 : C : 1250 2 : D : 350 3 : A : 250 4 : A : 500 1 : B : 200 5 : C : 300 5 : C : 250 Ficheiro de output Segue se um exemplo que demonstra a estrutura esperada do ficheiro de output: Pedro Reis 1 5 2 1 1 0 0.450 0.250 0.200 0.000 525.500 1.250 526.75 10% 52.675 474.075 Miguel Teles 2 5 (...) Avaliação e cotações O projecto será avaliado tendo em conta os requisitos implementados, através da análise do ficheiro de output. 7
Item Descrição Pontuação Leitura do ficheiro, calculo de salários e outros dados, escrita dos resultados. Legibilidade do código Escrita correcta no ficheiro de output dos dados pedidos, para cada funcionário, respeitando o formato indicado. Inclui: Informação base do funcionário Total de encomendas Sub totais de encomendas (por zona) Peso total, em Kg. Sub totais de peso (por zona) Salário base Bónus Salário bruto Percentagem de Imposto Imposto Salário líquido Nome do ficheiro de output composto pela data e hora, no formato indicado. São seguidas as boas práticas de programação e legibilidade de código exploradas nas aulas. Nomeadamente: Evitar duplicação de código; Nomes significativos para a classe, variáveis e funções; Minimizar o uso de variáveis globais; Evitar o uso de constantes mágicas ; 17 valores 3 valores Entrega A entrega deve ser feita via moodle, usando a pasta de entrega de projecto do Professor 8
correspondente. A data de entrega é 23 de Janeiro, pelas 23h55m. Não serão aceites trabalhos após esta data e hora. Cópias Trabalhos que sejam identificados como cópias serão anulados e os alunos respectivos terão nota zero. A decisão sobre se um trabalho é uma cópia cabe exclusivamente aos docentes da cadeira. Outras informações relevantes Não deve ser implementado qualquer menu para interacção manual com o utilizador. Trabalhos que não leiam e escrevam os ficheiros nos formatos indicados não serão avaliados. Não devem ser adicionados quaisquer cabeçalhos (ou rodapés) aos ficheiros de output. Recomenda se que eventuais dúvidas sobre o enunciado sejam esclarecidas no fórum do moodle de 2014/2015. Os projectos devem ser realizados em grupos de 1 a 3 alunos. Existirá uma defesa presencial e individual do projecto. Durante esta defesa individual, será pedido ao aluno que faça alterações ao código para dar resposta a alterações aos requisitos. É possível que sejam feitas alterações a este enunciado, durante o tempo de desenvolvimento do projecto. Por esta razão, os alunos devem estar atentos ao moodle de FP. 9
Anexo I Excerto de código que determina a Data e Hora actual num determinado formato import java.util.calendar; import java.text.simpledateformat; public static final String DATE_FORMAT = "yyyy MM dd HH:mm:ss"; public static String now() { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); return sdf.format(cal.gettime()); } Nota: O formato de data demonstrado neste exemplo (ver String DATE_FORMAT)não é igual ao formato que é pedido no projecto para criação do ficheiro de output. 10