Advertisement
dzocesrce

[NP] Payroll System

Apr 27th, 2025
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.75 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. import java.util.stream.Collectors;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.Comparator;
  7. class FreelanceEmployee extends Employee {
  8.     List<Integer> tickets;
  9.     EMPLOYEE_TYPE employeeType;
  10.     double ratePerTicket;
  11.     public FreelanceEmployee(String id, String level, List<Integer> tickets, EMPLOYEE_TYPE employeeType) {
  12.         super(id, level);
  13.         this.tickets = tickets;
  14.         this.employeeType = employeeType;
  15.         this.ratePerTicket=0;
  16.     }
  17.  
  18.     public int getTicketPoints() {
  19.         return tickets.stream().mapToInt(i -> i).sum();
  20.     }
  21.  
  22.     public void setRate(double ratePerTicket){
  23.         this.ratePerTicket= ratePerTicket;
  24.     }
  25.  
  26.  
  27.     public EMPLOYEE_TYPE getEmployeeType() {
  28.         return employeeType;
  29.     }
  30.  
  31.     @Override
  32.     public double getSalary() {
  33.         return ratePerTicket*getTicketPoints();
  34.     }
  35.  
  36.     @Override
  37.     public String toString() {
  38.         return String.format("Employee ID: %s Level: %s Salary: %.2f Tickets count: %d Tickets points: %d",
  39.                 id,
  40.                 level,
  41.                 getSalary(),
  42.                 tickets.size(),
  43.                 getTicketPoints());
  44.     }
  45.  
  46.     @Override
  47.     public int compareTo(Employee o) {
  48.         return Comparator.comparing(Employee::getSalary).reversed().compare(this,o);
  49.     }
  50. }
  51. enum EMPLOYEE_TYPE {
  52.     HOURLY,
  53.     FREELANCE
  54. }
  55.  
  56.  class HourlyEmployee extends Employee{
  57.     double hours;
  58.     EMPLOYEE_TYPE employeeType;
  59.     double hourlyRate;
  60.     public static int WEEK_HOURS=40;
  61.     public static double OVERTIME_RATE=1.5;
  62.     public HourlyEmployee(String id, String level, double hours,EMPLOYEE_TYPE employeeType) {
  63.         super(id,level);
  64.         this.hours= hours;
  65.         this.employeeType= employeeType;
  66.         this.hourlyRate=0;
  67.     }
  68.  
  69.     public void setRate(double hourlyRate){
  70.         this.hourlyRate= hourlyRate;
  71.     }
  72.  
  73.     public EMPLOYEE_TYPE getEmployeeType() {
  74.         return employeeType;
  75.     }
  76.  
  77.     @Override
  78.     public double getSalary() {
  79.         return Math.min(WEEK_HOURS,hours)*hourlyRate+OVERTIME_RATE*Math.max(0,hours-WEEK_HOURS)*hourlyRate;
  80.     }
  81.  
  82.     @Override
  83.     public String toString() {
  84.         return String.format("Employee ID: %s Level: %s Salary: %.2f Regular hours: %.2f Overtime hours: %.2f",
  85.                 id,
  86.                 level,
  87.                 getSalary(),
  88.                 Math.min(WEEK_HOURS,hours),
  89.                 Math.max(0,hours-WEEK_HOURS));
  90.     }
  91.  
  92.     @Override
  93.     public int compareTo(Employee o) {
  94.         return Comparator.comparing(Employee::getSalary).reversed().compare(this,o);
  95.     }
  96. }
  97.  abstract class Employee implements Comparable<Employee> {
  98.     String id;
  99.     String level;
  100.  
  101.     public Employee(String id, String level) {
  102.         this.id = id;
  103.         this.level = level;
  104.     }
  105.  
  106.     public abstract void setRate(double rate);
  107.  
  108.     public String getId() {
  109.         return id;
  110.     }
  111.  
  112.     public String getLevel() {
  113.         return level;
  114.     }
  115.  
  116.     public abstract double getSalary();
  117.  
  118.     public static Employee create(String line) {
  119.         String[] parts= line.split(";");
  120.         String type= parts[0];
  121.         String id = parts[1];
  122.         String level = parts[2];
  123.         double hourlySalary;
  124.         List<Integer> tickets= new ArrayList<>();
  125.         if(type.equals("H")){
  126.             hourlySalary= Double.parseDouble(parts[3]);
  127.             return new HourlyEmployee(id,level,hourlySalary,EMPLOYEE_TYPE.HOURLY);
  128.         }
  129.         else{
  130.             for(int i=3;i<parts.length;i++){
  131.                 tickets.add(Integer.parseInt(parts[i]));
  132.             }
  133.             return new FreelanceEmployee(id,level,tickets,EMPLOYEE_TYPE.FREELANCE);
  134.         }
  135.     }
  136.  
  137.     public abstract EMPLOYEE_TYPE getEmployeeType();
  138.  
  139. }
  140. class PayrollSystem {
  141.  
  142.     List<Employee> employees;
  143.     Map<String,Double> hourlyRateByLevel;
  144.     Map<String,Double> timeRateByLevel;
  145.     PayrollSystem(Map<String,Double> hourlyRateByLevel, Map<String,Double> ticketRateByLevel){
  146.         this.hourlyRateByLevel= hourlyRateByLevel;
  147.         this.timeRateByLevel= ticketRateByLevel;
  148.         this.employees= new ArrayList<>();
  149.  
  150.     }
  151.     public void readEmployees(InputStream in) {
  152.         BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(in));
  153.  
  154. //        employees= bufferedReader.lines().map(Employee::create).collect(Collectors.toMap(
  155. //                entry->entry.id,
  156. //                entry->entry
  157. //        ));
  158.         employees= bufferedReader.lines().map(Employee::create).collect(Collectors.toList());
  159.         for(Employee e: employees){
  160.             if(e.getEmployeeType().equals(EMPLOYEE_TYPE.HOURLY)){
  161.                 double hourlyRate= hourlyRateByLevel.get(e.getLevel());
  162.                 e.setRate(hourlyRate);
  163.             }
  164.             else{
  165.                 double ratePerTicket= timeRateByLevel.get(e.getLevel());
  166.                 e.setRate(ratePerTicket);
  167.             }
  168.  
  169.         }
  170.  
  171.     }
  172.  
  173.     public Map<String, Set<Employee>> printEmployeesByLevels(PrintStream out, Set<String> levels) {
  174.         PrintWriter printWriter = new PrintWriter(out);
  175.         Map<String, Set<Employee>> employeesByLevels = employees.stream()
  176.                 .filter(i -> levels.contains(i.getLevel()))
  177.                 .collect(Collectors.groupingBy(
  178.                         Employee::getLevel,
  179.                         TreeMap::new, // map sorted by key
  180.                         Collectors.toCollection(TreeSet::new) // values sorted too
  181.                 ));
  182.         printWriter.flush();
  183.         return employeesByLevels;
  184.     }
  185. }
  186.  
  187. public class PayrollSystemTest {
  188.  
  189.     public static void main(String[] args) {
  190.  
  191.         Map<String, Double> hourlyRateByLevel = new LinkedHashMap<>();
  192.         Map<String, Double> ticketRateByLevel = new LinkedHashMap<>();
  193.         for (int i = 1; i <= 10; i++) {
  194.             hourlyRateByLevel.put("level" + i, 10 + i * 2.2);
  195.             ticketRateByLevel.put("level" + i, 5 + i * 2.5);
  196.         }
  197.  
  198.         PayrollSystem payrollSystem = new PayrollSystem(hourlyRateByLevel, ticketRateByLevel);
  199.  
  200.         System.out.println("READING OF THE EMPLOYEES DATA");
  201.         payrollSystem.readEmployees(System.in);
  202.  
  203.         System.out.println("PRINTING EMPLOYEES BY LEVEL");
  204.         Set<String> levels = new LinkedHashSet<>();
  205.         for (int i=5;i<=10;i++) {
  206.             levels.add("level"+i);
  207.         }
  208.         Map<String, Set<Employee>> result = payrollSystem.printEmployeesByLevels(System.out, levels);
  209.         result.forEach((level, employees) -> {
  210.             System.out.println("LEVEL: "+ level);
  211.             System.out.println("Employees: ");
  212.             employees.forEach(System.out::println);
  213.             System.out.println("------------");
  214.         });
  215.  
  216.  
  217.     }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement