package fi.lpam.dataluokat; import fi.lpam.gui.virheDialogit.SiirtoVirhe; import java.sql.*; import java.time.LocalDate; import java.util.ArrayList; @SuppressWarnings("DuplicatedCode") public class Kuljetus implements TietokantaOlio { public enum Tyyppi { Lounas, Päivällinen; } private int id = -1; private int asiakasID; private String nimi; private LocalDate kuljetusPäivämäärä; private int kuljetusKierros; private Tyyppi tyyppi; private int salaatit, pääruoat, jälkiruoat; private String osoite, lisätieto, avainTieto, ruokarajoite; public Kuljetus(Kuljetus vanha) { this.id = vanha.id; this.asiakasID = vanha.asiakasID; this.nimi = vanha.nimi; this.kuljetusPäivämäärä = vanha.kuljetusPäivämäärä; this.kuljetusKierros = vanha.kuljetusKierros; this.tyyppi = vanha.tyyppi; this.salaatit = vanha.salaatit; this.pääruoat = vanha.pääruoat; this.jälkiruoat = vanha.jälkiruoat; this.osoite = vanha.osoite; this.lisätieto = vanha.lisätieto; this.avainTieto = vanha.avainTieto; this.ruokarajoite = vanha.ruokarajoite; } public Kuljetus(Asiakas asiakas, LocalDate pvm, int kuljetusKierros, Tyyppi tyyppi) { this.asiakasID = asiakas.getId(); this.nimi = asiakas.getNimi(); this.kuljetusPäivämäärä = pvm; this.kuljetusKierros = kuljetusKierros; this.tyyppi = tyyppi; this.salaatit = asiakas.getKuljetuksenSalaatit(pvm, tyyppi); this.pääruoat = asiakas.getKuljetuksenPääruoat(pvm, tyyppi); this.jälkiruoat = asiakas.getKuljetuksenJälkiruoat(pvm, tyyppi); this.osoite = asiakas.getOsoite(); this.avainTieto = asiakas.getAvainTieto(); this.lisätieto = asiakas.getLisätiedot(); this.ruokarajoite = asiakas.getErityisruokavalio(); } private Kuljetus(int id, int asiakasID, String nimi, LocalDate kuljetusPäivämäärä, int kuljetusKierros, int salaatit, int pääruoat, int jälkiruoat, String osoite, String lisätieto, String avainTieto, String ruokarajoite, Tyyppi tyyppi) { this.id = id; this.asiakasID = asiakasID; this.nimi = nimi; this.kuljetusPäivämäärä = kuljetusPäivämäärä; this.kuljetusKierros = kuljetusKierros; this.tyyppi = tyyppi; this.salaatit = salaatit; this.pääruoat = pääruoat; this.jälkiruoat = jälkiruoat; this.osoite = osoite; this.lisätieto = lisätieto; this.avainTieto = avainTieto; this.ruokarajoite = ruokarajoite; } /** * Hakee tietyn kierroksen kuljetukset * @param päivä kierroksen päivä * @param kuljetusKierros kierroksen numero * @param tyyppi kuljetuksen tyyppi * @return valitun päivän valitun kierroksen kuljetukset */ public static ArrayList haeKierroksenKuljetukset(LocalDate päivä, int kuljetusKierros, Tyyppi tyyppi) { try (Connection tietokanta = Tietokanta.haeYhteys()) { PreparedStatement stmt = tietokanta.prepareStatement("SELECT * FROM kuljetukset WHERE kuljetusKierros = ? and kuljetusPäivämäärä = ? and tyyppi = ?"); stmt.setInt(1, kuljetusKierros); stmt.setDate(2, Date.valueOf(päivä)); stmt.setString(3, tyyppi.toString()); ResultSet rs = stmt.executeQuery(); return parsiResultSet(rs); } catch (SQLException e) { SiirtoVirhe virhe = new SiirtoVirhe(e); virhe.showAndWait(); return null; } } private boolean tallennaUusi() { try (Connection tietokanta = Tietokanta.haeYhteys()) { PreparedStatement stmt = tietokanta.prepareStatement("INSERT INTO kuljetukset (asiakasID, nimi, kuljetusPäivämäärä, kuljetusKierros, tyyppi, salaatit, pääruoat, jälkiruoat, ruokarajoite, osoite, avainTieto, lisätieto) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS); stmt.setInt(1, asiakasID); stmt.setString(2, nimi); stmt.setDate(3, Date.valueOf(kuljetusPäivämäärä)); stmt.setInt(4, kuljetusKierros); stmt.setString(5, tyyppi.toString()); stmt.setInt(6, salaatit); stmt.setInt(7, pääruoat); stmt.setInt(8, jälkiruoat); stmt.setString(9, ruokarajoite); stmt.setString(10, osoite); stmt.setString(11, avainTieto); stmt.setString(12, lisätieto); int muokatutRivit = stmt.executeUpdate(); if (muokatutRivit == 0) { throw new SQLException("Kuljetuksen luominen epäonnistui, rivejä ei muokattu"); } try (ResultSet generatedKeys = stmt.getGeneratedKeys()) { if (generatedKeys.next()) { this.setId(generatedKeys.getInt(1)); } else { throw new SQLException("Kuljetuksen luominen epäonnistui, id:tä ei saatu"); } } } catch (SQLException e) { SiirtoVirhe alert = new SiirtoVirhe(e); alert.showAndWait(); return false; } return true; } private boolean päivitäTietokantaan() { try (Connection tietokanta = Tietokanta.haeYhteys()) { PreparedStatement stmt = tietokanta.prepareStatement("UPDATE kuljetukset set asiakasID = ?, nimi = ?, kuljetusPäivämäärä = ?, kuljetusKierros = ?, tyyppi = ?, salaatit = ?, pääruoat = ?, jälkiruoat = ?, ruokarajoite = ?, osoite = ?, avainTieto = ?, lisätieto = ? WHERE id = ?"); stmt.setInt(1, asiakasID); stmt.setString(2, nimi); stmt.setDate(3, Date.valueOf(kuljetusPäivämäärä)); stmt.setInt(4, kuljetusKierros); stmt.setString(5, tyyppi.toString()); stmt.setInt(6, salaatit); stmt.setInt(7, pääruoat); stmt.setInt(8, jälkiruoat); stmt.setString(9, ruokarajoite); stmt.setString(10, osoite); stmt.setString(11, avainTieto); stmt.setString(12, lisätieto); stmt.setInt(13, id); stmt.executeUpdate(); return true; } catch (SQLException e) { SiirtoVirhe alert = new SiirtoVirhe(e); alert.showAndWait(); return false; } } @Override public boolean poista() { try (Connection tietokanta = Tietokanta.haeYhteys()) { String sql = "DELETE FROM kuljetukset WHERE id = " + id; Statement stmt = tietokanta.createStatement(); stmt.executeUpdate(sql); return true; } catch (SQLException e) { SiirtoVirhe alert = new SiirtoVirhe(e); alert.showAndWait(); return false; } } @Override public boolean tallenna() { if (this.id == -1) { return this.tallennaUusi(); } else { return this.päivitäTietokantaan(); } } private static ArrayList parsiResultSet(ResultSet rs) { ArrayList kuljetukset = new ArrayList<>(); try { while (rs.next()) { Kuljetus uusi = new Kuljetus( rs.getInt("id"), rs.getInt("asiakasID"), rs.getString("nimi"), rs.getDate("kuljetusPäivämäärä").toLocalDate(), rs.getInt("kuljetusKierros"), rs.getInt("salaatit"), rs.getInt("pääruoat"), rs.getInt("jälkiruoat"), rs.getString("osoite"), rs.getString("lisätieto"), rs.getString("avainTieto"), rs.getString("ruokarajoite"), Tyyppi.valueOf(rs.getString("tyyppi").strip()) ); System.out.println(rs.getString("tyyppi").equals(Tyyppi.Lounas.toString())); System.out.println(Tyyppi.Lounas); System.out.println(uusi.getTyyppi()); System.out.println(Tyyppi.valueOf(rs.getString("tyyppi"))); kuljetukset.add(uusi); } } catch (SQLException e) { SiirtoVirhe alert = new SiirtoVirhe(e); alert.showAndWait(); } return kuljetukset; } @Override public String toString() { return "Kuljetus{" + "id=" + id + ", asiakasID=" + asiakasID + ", nimi='" + nimi + '\'' + ", kuljetusPäivämäärä=" + kuljetusPäivämäärä + ", kuljetusKierros=" + kuljetusKierros + ", tyyppi =" + tyyppi + ", salaatit=" + salaatit + ", pääruoat=" + pääruoat + ", jälkiruoat=" + jälkiruoat + ", osoite='" + osoite + '\'' + ", lisätieto='" + lisätieto + '\'' + ", avainTieto='" + avainTieto + '\'' + ", ruokarajoite='" + ruokarajoite + '\'' + '}'; } public void nollaa() { setSalaatit(0); setPääruoat(0); setJälkiruoat(0); setLisätieto(""); } public void palautaMäärät(Asiakas asiakas) { setSalaatit(asiakas.getKuljetuksenSalaatit(kuljetusPäivämäärä, tyyppi)); setPääruoat(asiakas.getKuljetuksenPääruoat(kuljetusPäivämäärä, tyyppi)); setJälkiruoat(asiakas.getKuljetuksenJälkiruoat(kuljetusPäivämäärä, tyyppi)); setLisätieto(asiakas.getLisätiedot()); } public boolean kuljetetaan() { return salaatit > 0 || pääruoat > 0 || jälkiruoat > 0 || !lisätieto.isBlank(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAsiakasID() { return asiakasID; } public void setAsiakasID(int asiakasID) { this.asiakasID = asiakasID; } public String getNimi() { return nimi; } public void setNimi(String nimi) { this.nimi = nimi; } public LocalDate getKuljetusPäivämäärä() { return kuljetusPäivämäärä; } public void setKuljetusPäivämäärä(LocalDate kuljetusPäivämäärä) { this.kuljetusPäivämäärä = kuljetusPäivämäärä; } public int getKuljetusKierros() { return kuljetusKierros; } public void setKuljetusKierros(int kuljetusKierros) { this.kuljetusKierros = kuljetusKierros; } public int getSalaatit() { return salaatit; } public void setSalaatit(int salaatit) { this.salaatit = salaatit; } public int getPääruoat() { return pääruoat; } public void setPääruoat(int pääruoat) { this.pääruoat = pääruoat; } public int getJälkiruoat() { return jälkiruoat; } public void setJälkiruoat(int jälkiruoat) { this.jälkiruoat = jälkiruoat; } public String getOsoite() { return osoite; } public void setOsoite(String osoite) { this.osoite = osoite; } public String getLisätieto() { return lisätieto; } public void setLisätieto(String lisätieto) { this.lisätieto = lisätieto; } public String getAvainTieto() { return avainTieto; } public void setAvainTieto(String avainTieto) { this.avainTieto = avainTieto; } public String getRuokarajoite() { return ruokarajoite; } public void setRuokarajoite(String ruokarajoite) { this.ruokarajoite = ruokarajoite; } public Tyyppi getTyyppi() { return tyyppi; } public void setTyyppi(Tyyppi tyyppi) { this.tyyppi = tyyppi; } }