Skip to content

Palkanlaskenta

Matti Luukkainen edited this page Nov 30, 2016 · 2 revisions
package fi.helsinki.cs.palkanlaskenta;

public class Main {
    public static void main(String[] args) {
        Palkanlaskenta p = new Palkanlaskenta();
        p.lisaaTyontekija(1,"Arto", "123 456", "Mannerheimintie 10","[email protected]", "040-12345",10);
   
        p.lisaaTunnit(1, 5);
   
        System.out.println(p.tyontekijat("csv"));
        System.out.println(p.maksuhistoria("csv"));
        
        p.maksaPalkat();

        System.out.println(p.maksuhistoria("csv"));
    }
}
package fi.helsinki.cs.palkanlaskenta;

import java.util.ArrayList;
import java.util.List;


public class Palkanlaskenta extends MaksupalveluRajapinta {
    private List<String> maksut;
    private List<Henkilo> tyontekijat;
    
    public Palkanlaskenta(){
        maksut = new ArrayList<>();
        tyontekijat = new ArrayList<>();        
    }
        
    public boolean lisaaTyontekija(int tunnus, String nimi, String tilinro, String osoite, String email, String puhnro, int tuntipalkka){
        for (Henkilo henkilo : tyontekijat) {
            if (tunnus==henkilo.getTunnus()) {
                return false;
            }
        }
        Henkilo uusi = new Henkilo(tunnus, nimi, tilinro, osoite, email, puhnro, tuntipalkka);
        tyontekijat.add(uusi);
        return true;
    }
        
    public boolean lisaaTunnit(int tunnus, int tunnit) {
        for (Henkilo henkilo : tyontekijat) {
            if (tunnus==henkilo.getTunnus()) {
                henkilo.lisaaTunnit(tunnit);
                return true;
            }
        }        
        
        return false;
    }

    public boolean uusiTuntipalkka(int tunnus, int tuntipalkka) {
        // TODO: to be implements
        return false;
    }
    
    public void maksaPalkat(){
        for (Henkilo henkilo : tyontekijat) {
            List<Integer> hlonPalkat = henkilo.laskePalkat();
            
            int hlonPalkkaYht = 0;
            for (int palkka : hlonPalkat) {
                hlonPalkkaYht += palkka;
            }
            
            String nimi = henkilo.getNimi();
            String tili = henkilo.getTili();
            
            suoritaTilisiirto(nimi, tili, hlonPalkkaYht);
            
            String csv = ""+nimi+
                         ";"+tili+
                         ";"+hlonPalkkaYht;    
            
            maksut.add(csv);
        }          
    }

    public List<String> tyontekijat(String format) {
        // TODO: add support for JSON and XML
        if (!format.equals("csv")) {
            throw new IllegalArgumentException("supported formats: csv");
        }
        
        List<String> csvt = new ArrayList<>();
        for (Henkilo henkilo : tyontekijat) {
            int tunnus = henkilo.getTunnus();
            String nimi = henkilo.getNimi();
            String tili = henkilo.getTili();   
            int tuntiPalkka = henkilo.getTuntipalkka();
            
            String csv = ""+tunnus+
                          ";"+nimi+
                          ";"+tili+
                          ";"+tuntiPalkka;
            csvt.add(csv);
        }
        
        return csvt;
    }    
    
    public List<String> maksuhistoria(String format) {
        // TODO: add support for JSON and XML
        if (!format.equals("csv")) {
            throw new IllegalArgumentException("supported formats: csv");
        }
        
        return maksut;
    }

}
package fi.helsinki.cs.palkanlaskenta;

import java.util.ArrayList;
import java.util.List;

public class Henkilo {
    private int tunnus;
    private String nimi;
    private String osoite;
    private String email;
    private String puhnro;
    
    private String tili;
    private int tuntipalkka;

    private ArrayList<Integer> maksamattomatTunnit;
    
    public Henkilo(int tunnus, String nimi, String tili, String osoite, String email, String puhnro, int tuntipalkka) {
        this.tunnus = tunnus;
        this.nimi = nimi;
        this.osoite = osoite;
        this.email = email;
        this.puhnro = puhnro;        
        this.tili = tili;
        this.tuntipalkka = tuntipalkka;
        this.maksamattomatTunnit = new ArrayList<>();
    }

    public int getTunnus() {
        return tunnus;
    }

    public String getNimi() {
        return nimi;
    }

    public String getTili() {
        return tili;
    }

    public int getTuntipalkka() {
        return tuntipalkka;
    }
    
    public void lisaaTunnit(int tunnit) {
        maksamattomatTunnit.add(tunnit);
    }

    public List<Integer> laskePalkat() {
        List<Integer> palkat = new ArrayList<>();
        
        for (int tunti : maksamattomatTunnit) {
            palkat.add(tunti*tuntipalkka);
        }
        
        maksamattomatTunnit = new ArrayList<>();
        
        return palkat;
    }
}
package fi.helsinki.cs.palkanlaskenta;

import com.google.gson.Gson;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.http.HttpResponse;
import org.apache.http.client.fluent.Request;
import org.apache.http.entity.ContentType;

public class MaksupalveluRajapinta {
    String url;

    public MaksupalveluRajapinta() {
        this.url = "http://otmpaymentinterface.herokuapp.com/payments";
    }
    
    public void suoritaTilisiirto(String nimi, String tili, int summa){
        Payment maksu = new Payment(nimi, tili, summa);
        
        try {
            HttpResponse httpResponse = Request.Post(url)
                    .bodyString(new Gson().toJson(maksu), ContentType.APPLICATION_JSON)        
                    .execute().returnResponse();
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }
    
    class Payment{
        String name;
        String account;
        int amount;

        public Payment(String name, String account, int amount) {
            this.name = name;
            this.account = account;
            this.amount = amount;
        }
        
    }
}

Palkanlaskennan testit

public class PalkanlaskentaTest {

    Palkanlaskenta p;
    
    @Before
    public void setUp() {
        p = new Palkanlaskenta();
    }
    
    @Test
    public void alussaEiMaksujaEikaTuontekijoita(){
        assertTrue(p.maksuhistoria("csv").isEmpty());
        assertTrue(p.tyontekijat("csv").isEmpty());
    }
    
    @Test
    public void yksiLisattyTyontekijaIlmanTunteja(){
        boolean ok = p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
        assertTrue(ok);
        
        assertEquals(1, p.tyontekijat("csv").size());
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("1","Arto", "123 456", "10"));
        assertContent(odotettu,p.tyontekijat("csv"));
        
        assertEquals(0, p.maksuhistoria("csv").size());
    }   

    @Test
    public void samaIdEiVoiOllaKahdellaTyontekijalla(){
        boolean ok = p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345", 10);
        assertTrue(ok);
        ok = p.lisaaTyontekija(1,"Pekka", "123 457", "hämeentie","[email protected]","040-44345",20);
        assertFalse(ok);
        assertEquals(1, p.tyontekijat("csv").size());
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("1","Arto", "123 456", "10"));
        assertContent(odotettu,p.tyontekijat("csv"));
    } 
    
    @Test
    public void tuntienLisaaminenTyontekijalle(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
   
        p.lisaaTunnit(1, 5);
        assertEquals(0, p.maksuhistoria("csv").size());
        
        p.maksaPalkat();
        assertEquals(1, p.maksuhistoria("csv").size()); 
        
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("Arto", "123 456", "50"));
        assertContent(odotettu,p.maksuhistoria("csv"));        
    }   
    
    @Test
    public void tuntienLisaaminenTyontekijalleMontaKertaa(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
   
        p.lisaaTunnit(1, 5);
        p.lisaaTunnit(1, 20);
        assertEquals(0, p.maksuhistoria("csv").size());
        
        p.maksaPalkat();
        assertEquals(1, p.maksuhistoria("csv").size()); 
        
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("Arto", "123 456", "250"));
        assertContent(odotettu,p.maksuhistoria("csv"));                 
    }  
    
    @Test
    public void tuntejaEiVoiLisataTuntemattomalleTyontekijalle(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
   
        boolean ok = p.lisaaTunnit(2, 5);
        assertFalse(ok);
    }     
   
    @Test
    public void montaTyontekijaa(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
        p.lisaaTyontekija(2,"Liisa", "123 457", "hämeentie","[email protected]","040-44345",20);
        
        assertEquals(2, p.tyontekijat("csv").size());
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("1","Arto", "123 456", "10"));
        odotettu.add(toCSV("2","Liisa", "123 457", "20"));        
        assertContent(odotettu,p.tyontekijat("csv"));        
    }  
    
    @Test
    public void tuntienLisaaminenMonelleTyontekijalle(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
        p.lisaaTyontekija(2,"Liisa", "123 457", "hämeentie","[email protected]","040-44345",20);
        
        p.lisaaTunnit(1, 5);
        p.lisaaTunnit(1, 5);
        p.lisaaTunnit(2, 20);
        p.lisaaTunnit(2, 5);
        p.lisaaTunnit(1, 10);
        
        assertEquals(0, p.maksuhistoria("csv").size());
        
        p.maksaPalkat();
        assertEquals(2, p.maksuhistoria("csv").size()); 
        
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("Arto", "123 456", "200"));
        odotettu.add(toCSV("Liisa", "123 457", "500"));
        assertContent(odotettu,p.maksuhistoria("csv"));        
    }      

    @Test
    public void tuntienLisaaminenJaToinenPalkanmaksu(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345",10);
   
        p.lisaaTunnit(1, 5);
        assertEquals(0, p.maksuhistoria("csv").size());
        
        p.maksaPalkat();
        assertEquals(1, p.maksuhistoria("csv").size()); 
        
        List<String> odotettu = new ArrayList<>();
        odotettu.add(toCSV("Arto", "123 456", "50"));
        assertContent(odotettu,p.maksuhistoria("csv"));   
        
        p.lisaaTunnit(1, 15);
        p.lisaaTunnit(1, 20);

        assertEquals(1, p.maksuhistoria("csv").size());        
        
        p.maksaPalkat();
        assertEquals(2, p.maksuhistoria("csv").size()); 
        odotettu = new ArrayList<>();
        odotettu.add(toCSV("Arto", "123 456", "50"));
        odotettu.add(toCSV("Arto", "123 456", "350"));
        assertContent(odotettu,p.maksuhistoria("csv")); 
    }       
   
    @Test
    public void palkanMuuttuminenHuomioidaanMaksussa(){
        p.lisaaTyontekija(1,"Arto", "123 456", "mannerheimintie","[email protected]","040-12345", 10);
  
        p.lisaaTunnit(1, 10);

        p.uusiTuntipalkka(1, 20);
        p.lisaaTunnit(1, 10);
        
        p.maksaPalkat();
        assertEquals(1, p.maksuhistoria("csv").size()); 
        
        List<String> odotettu = new ArrayList<>();
        
        // maksetun palkan tulee olla nyt 300 euroa, sillä tunteja on kirjattu
        //  10h tuntipalkalla 10 e
        //  10h tuntipalkalla 20 e
        odotettu.add(toCSV("Arto", "123 456", "300"));
        assertContent(odotettu,p.maksuhistoria("csv"));        
    }       
    
    private void assertContent(List<String> odotettu, List<String> tulos){
        assertEquals(odotettu.size(), tulos.size());
        
        for (String tulosRivi : tulos) {
            assertTrue("palautettu "+tulosRivi+" ei odotettujen "+odotettu+ " joukossa",odotettu.contains(tulosRivi));
        }
    }
            
    private String toCSV(String... osat){
        String csv = "";
        for (int i = 0; i < osat.length-1; i++) {
            csv += osat[i]+ ";";
        }
        csv += osat[osat.length-1];
        
        return csv;
    }
}