Projektin moduulirakenteen formatointi

Signed-off-by: laurimaaninka <lauri.maaninka@gmail.com>
This commit is contained in:
2026-04-12 20:25:49 +03:00
parent 8cf1d03e5c
commit e83bdee4d0
33 changed files with 82 additions and 92 deletions
@@ -1,391 +0,0 @@
package fi.lpam.dataluokat;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import java.sql.*;
import java.util.ArrayList;
@SuppressWarnings("DuplicatedCode")
public class Asiakas implements TietokantaOlio {
private int id = -1;
private String nimi;
private String osoite;
private int maanantaiKpl, tiistaiKpl, keskiviikkoKpl, torstaiKpl, perjantaiKpl;
private int salaatit, pääruoat, jälkiruoat;
private String erityisruokavalio;
private String avainTieto;
private String lisätiedot;
/**
* Tyhjä konstruktori uusien luomista varten
*/
public Asiakas() {
}
/**
* Vain MultiColumnListViewin käyttöön
* @param nimi Asiakkaan nimi
*/
public Asiakas(String nimi) {
this.nimi = nimi;
}
/**
* Kun luetaan asiakas tietokannasta
* @param id asiakkaan id
* @param nimi asiakkaan nimi
* @param osoite osoite
* @param maanantaiKpl kuljetettava määrä
* @param tiistaiKpl kuljetettava määrä
* @param keskiviikkoKpl kuljetettava määrä
* @param torstaiKpl kuljetettava määrä
* @param perjantaiKpl kuljetettava määrä
* @param salaatit kuljetettava määrä
* @param pääruoat kuljetettava määrä
* @param jälkiruoat kuljetettava määrä
* @param erityisruokavalio ...
* @param avainTieto ...
* @param lisätiedot mahdolliset lisätilaukset/tiedot
*/
private Asiakas(int id, String nimi, String osoite, int maanantaiKpl, int tiistaiKpl, int keskiviikkoKpl, int torstaiKpl, int perjantaiKpl, int salaatit, int pääruoat, int jälkiruoat, String erityisruokavalio, String avainTieto, String lisätiedot) {
this.id = id;
this.nimi = nimi;
this.osoite = osoite;
this.maanantaiKpl = maanantaiKpl;
this.tiistaiKpl = tiistaiKpl;
this.keskiviikkoKpl = keskiviikkoKpl;
this.torstaiKpl = torstaiKpl;
this.perjantaiKpl = perjantaiKpl;
this.salaatit = salaatit;
this.pääruoat = pääruoat;
this.jälkiruoat = jälkiruoat;
this.erityisruokavalio = erityisruokavalio;
this.avainTieto = avainTieto;
this.lisätiedot = lisätiedot;
}
/**
* @param nimi asiakkaan nimi
* @param osoite osoite
* @param maanantaiKpl kuljetettava määrä
* @param tiistaiKpl kuljetettava määrä
* @param keskiviikkoKpl kuljetettava määrä
* @param torstaiKpl kuljetettava määrä
* @param perjantaiKpl kuljetettava määrä
* @param salaatit kuljetettava määrä
* @param pääruoat kuljetettava määrä
* @param jälkiruoat kuljetettava määrä
* @param erityisruokavalio ...
* @param avainTieto ...
* @param lisätiedot mahdolliset lisätilaukset/tiedot
*/
public Asiakas(String nimi, String osoite, int maanantaiKpl, int tiistaiKpl, int keskiviikkoKpl, int torstaiKpl, int perjantaiKpl, int salaatit, int pääruoat, int jälkiruoat, String erityisruokavalio, String avainTieto, String lisätiedot) {
this.nimi = nimi;
this.osoite = osoite;
this.maanantaiKpl = maanantaiKpl;
this.tiistaiKpl = tiistaiKpl;
this.keskiviikkoKpl = keskiviikkoKpl;
this.torstaiKpl = torstaiKpl;
this.perjantaiKpl = perjantaiKpl;
this.salaatit = salaatit;
this.pääruoat = pääruoat;
this.jälkiruoat = jälkiruoat;
this.erityisruokavalio = erityisruokavalio;
this.avainTieto = avainTieto;
this.lisätiedot = lisätiedot;
}
/**
* Hakee kaikki asiakkaat tietokannan asiakkaat taulusta
* @return ArrayList<Asiakas>
*/
public static ArrayList<Asiakas> haeKaikki() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery("select * from asiakkaat");
return parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return null;
}
}
/**
* Hakee tietokannasta asiakasidn perusteella asiakkaat
* @param IDt haettavat asiakkkaat
* @return Haetut asiakkaat tai null
*/
public static ArrayList<Asiakas> haeTietyt(int[] IDt) {
StringBuilder sbIDt = new StringBuilder();
sbIDt.append(IDt[0]);
for (int i = 1; i < IDt.length; i++) {
sbIDt.append(", ").append(IDt[i]);
}
try (Connection tietokanta = Tietokanta.haeYhteys()) {
String sql = "select * from asiakkaat where id in (" + sbIDt + ") order by instr('" + sbIDt + "', id)";
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery(sql);
return parsiResultSet(rs);
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return null;
}
}
/**
* Käsittelee ResultSettiä
* @param rs saatu ResultSet
* @return ArrayList<Asiakas>
*/
private static ArrayList<Asiakas> parsiResultSet(ResultSet rs) {
ArrayList<Asiakas> asiakkaat = new ArrayList<>();
try {
while (rs.next()) {
Asiakas uusi = new Asiakas(
rs.getInt("id"),
rs.getString("nimi"),
rs.getString("osoite"),
rs.getInt("maanantaiKpl"),
rs.getInt("tiistaiKpl"),
rs.getInt("keskiviikkoKpl"),
rs.getInt("torstaiKpl"),
rs.getInt("perjantaiKpl"),
rs.getInt("salaatit"),
rs.getInt("pääruoat"),
rs.getInt("jälkiruoat"),
rs.getString("erityisruokavalio"),
rs.getString("avainTieto"),
rs.getString("lisätiedot")
);
asiakkaat.add(uusi);
}
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
}
return asiakkaat;
}
/**
* Tallentaa uuden asiakkaan tietokantaan. Tietokanta luo automaattisesti id:n asiakkaalle.
*
*/
@Override
public boolean tallennaUusi() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("INSERT INTO asiakkaat (nimi, osoite, maanantaiKpl, tiistaiKpl, keskiviikkoKpl, torstaiKpl, perjantaiKpl, salaatit, pääruoat, jälkiruoat, erityisruokavalio, avainTieto, lisätiedot) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, nimi);
stmt.setString(2, osoite);
stmt.setInt(3, maanantaiKpl);
stmt.setInt(4, tiistaiKpl);
stmt.setInt(5, keskiviikkoKpl);
stmt.setInt(6, torstaiKpl);
stmt.setInt(7, perjantaiKpl);
stmt.setInt(8, salaatit);
stmt.setInt(9, pääruoat);
stmt.setInt(10, jälkiruoat);
stmt.setString(11, erityisruokavalio);
stmt.setString(12, avainTieto);
stmt.setString(13, lisätiedot);
int muokatutRivit = stmt.executeUpdate();
if (muokatutRivit == 0) {
throw new SQLException("Käyttäjän luominen epäonnistui, rivejä ei muokattu");
}
try (ResultSet generatedKeys = stmt.getGeneratedKeys()) {
if (generatedKeys.next()) {
this.setId(generatedKeys.getInt(1));
}
else {
throw new SQLException("Käyttäjän luominen epäonnistui, id:tä ei saatu");
}
}
} catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return false;
}
return true;
}
/**
* Päivittää kutsuvan asiakkaan tiedot tietokantaan
*/
@Override
public boolean päivitäTietokantaan() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("UPDATE asiakkaat set nimi = ?, osoite = ?, maanantaiKpl = ?, tiistaiKpl = ?, keskiviikkoKpl = ?, torstaiKpl = ?, perjantaiKpl = ?, salaatit = ?, pääruoat = ?, jälkiruoat = ?, erityisruokavalio = ?, avainTieto = ?, lisätiedot = ? WHERE id = ?");
stmt.setString(1, nimi);
stmt.setString(2, osoite);
stmt.setInt(3, maanantaiKpl);
stmt.setInt(4, tiistaiKpl);
stmt.setInt(5, keskiviikkoKpl);
stmt.setInt(6, torstaiKpl);
stmt.setInt(7, perjantaiKpl);
stmt.setInt(8, salaatit);
stmt.setInt(9, pääruoat);
stmt.setInt(10, jälkiruoat);
stmt.setString(11, erityisruokavalio);
stmt.setString(12, avainTieto);
stmt.setString(13, lisätiedot);
stmt.setInt(14, id);
stmt.executeUpdate();
return true;
} catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return false;
}
}
/**
* Poistaa asiakkaan tietokannasta
*/
@Override
public boolean poista() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
String sql = "DELETE FROM asiakkaat WHERE id = " + id;
Statement stmt = tietokanta.createStatement();
stmt.executeUpdate(sql);
return true;
} catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return false;
}
}
public boolean tallenna() {
if (this.id == -1) {
return this.tallennaUusi();
}
else {
return this.päivitäTietokantaan();
}
}
/**
* Kierroshallintaa varten toString
* @return asiakkaan nimi
*/
public String toString() {
return this.getNimi();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNimi() {
return nimi;
}
public void setNimi(String nimi) {
this.nimi = nimi;
}
public String getOsoite() {
return osoite;
}
public void setOsoite(String osoite) {
this.osoite = osoite;
}
public int getMaanantaiKpl() {
return maanantaiKpl;
}
public void setMaanantaiKpl(int maanantaiKpl) {
this.maanantaiKpl = maanantaiKpl;
}
public int getTiistaiKpl() {
return tiistaiKpl;
}
public void setTiistaiKpl(int tiistaiKpl) {
this.tiistaiKpl = tiistaiKpl;
}
public int getKeskiviikkoKpl() {
return keskiviikkoKpl;
}
public void setKeskiviikkoKpl(int keskiviikkoKpl) {
this.keskiviikkoKpl = keskiviikkoKpl;
}
public int getTorstaiKpl() {
return torstaiKpl;
}
public void setTorstaiKpl(int torstaiKpl) {
this.torstaiKpl = torstaiKpl;
}
public int getPerjantaiKpl() {
return perjantaiKpl;
}
public void setPerjantaiKpl(int perjantaiKpl) {
this.perjantaiKpl = perjantaiKpl;
}
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 getErityisruokavalio() {
return erityisruokavalio;
}
public void setErityisruokavalio(String erityisruokavalio) {
this.erityisruokavalio = erityisruokavalio;
}
public String getAvainTieto() {
return avainTieto;
}
public void setAvainTieto(String avainTieto) {
this.avainTieto = avainTieto;
}
public String getLisätiedot() {
return lisätiedot;
}
public void setLisätiedot(String lisätiedot) {
this.lisätiedot = lisätiedot;
}
}
@@ -1,218 +0,0 @@
package fi.lpam.dataluokat;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
public class Kierros implements TietokantaOlio {
private int id = -1;
private int kierrosNumero;
private ObservableList<Asiakas> asiakkaat;
public Kierros(int kierrosNumero, ObservableList<Asiakas> asiakkaat) {
this.kierrosNumero = kierrosNumero;
this.asiakkaat = asiakkaat;
}
private Kierros(int id, int kierrosNumero, ObservableList<Asiakas> asiakkaat) {
this.id = id;
this.kierrosNumero = kierrosNumero;
this.asiakkaat = asiakkaat;
}
/** Hakee kaikki kierrokset tietokannasta
* @return kaikki kierrokset
*/
public static ArrayList<Kierros> haeKaikki() {
ArrayList<Kierros> kierrokset = new ArrayList<>();
try (Connection tietokanta = Tietokanta.haeYhteys()) {
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery("select id, kierrosNumero, asiakkaat from kierrokset");
while (rs.next()) {
kierrokset.add(new Kierros(rs.getInt(1), rs.getInt(2), FXCollections.observableArrayList(muutaMerkkijonoAsiakkaiksi(rs.getString(3)))));
}
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
}
return kierrokset;
}
/**
* Hakee tietyn kierroksen
* @param kierrosNumero haettavan kierroksen numero
* @return Kierros, null jos ei löydy
*/
public static Kierros haeKierros(int kierrosNumero) {
Kierros kierros;
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("select id, kierrosNumero, asiakkaat from kierrokset where kierrosNumero = ?");
stmt.setInt(1, kierrosNumero);
ResultSet rs = stmt.executeQuery();
kierros = new Kierros(rs.getInt(1), rs.getInt(2), FXCollections.observableArrayList(muutaMerkkijonoAsiakkaiksi(rs.getString(3))));
return kierros;
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
}
return null;
}
/**
* Haetaan uniikit kierrosnumerot
* @return kierrosten uniikit kierrosnumerot
*/
public static ArrayList<Integer> haeKierrosNumerot() {
ArrayList<Integer> numerot = new ArrayList<>();
try (Connection tietotokanta = Tietokanta.haeYhteys()) {
Statement stmt = tietotokanta.createStatement();
ResultSet rs = stmt.executeQuery("select distinct kierrosNumero from kierrokset ORDER BY kierrosNumero");
while (rs.next()) {
numerot.add(rs.getInt("kierrosNumero"));
}
return numerot;
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return numerot;
}
}
@Override
public boolean tallennaUusi() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("insert into kierrokset (kierrosNumero, asiakkaat) values (?, ?)", Statement.RETURN_GENERATED_KEYS);
stmt.setInt(1, kierrosNumero);
stmt.setString(2, muutaAsiakkaatMerkkijonoksi());
int muokatutRivit = stmt.executeUpdate();
if (muokatutRivit == 0) {
throw new SQLException("Kierroksen luominen epäonnistui, rivejä ei muokattu");
}
ResultSet luodutIDt = stmt.getGeneratedKeys();
if (luodutIDt.next()) {
this.id = luodutIDt.getInt(1);
} else {
throw new SQLException("Kierroksen luominen epäonnistui, idtä ei saatu");
}
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return false;
}
return true;
}
@Override
public boolean päivitäTietokantaan() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("update kierrokset set asiakkaat = ?, kierrosnumero = ? where id = ?");
stmt.setString(1, muutaAsiakkaatMerkkijonoksi());
stmt.setInt(2, kierrosNumero);
stmt.setInt(3, id);
int muokatutRivit = stmt.executeUpdate();
if (muokatutRivit == 0) {
throw new SQLException("Kierroksen muokkaaminen epäonnistui, rivejä ei muokattu");
}
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return false;
}
return true;
}
@Override
public boolean poista() {
if (this.id < 0) return false;
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("delete from kierrokset where id = ?");
stmt.setInt(1, id);
int muokatutRivit = stmt.executeUpdate();
if (muokatutRivit == 0) {
throw new SQLException("Kierroksen poisto epäonnistui, rivejä ei muokattu");
}
}
catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return false;
}
return true;
}
@Override
public boolean tallenna() {
if (this.id < 0) {
return this.tallennaUusi();
}
else {
return this.päivitäTietokantaan();
}
}
/**
* Muuttaa listan asiakkaista merkkijonoksi
* @return listan asiakkaat muodossa "id id id..."
*/
private String muutaAsiakkaatMerkkijonoksi() {
StringBuilder sb = new StringBuilder();
if (asiakkaat.isEmpty()) {return sb.toString();}
Iterator<Asiakas> it = asiakkaat.iterator();
sb.append(it.next().getId());
while (it.hasNext()) {
sb.append(" ").append(it.next().getId());
}
return sb.toString();
}
private static ArrayList<Asiakas> muutaMerkkijonoAsiakkaiksi(String merkkijono) {
String[] strAsiakasIDt = merkkijono.split(" ");
int[] asiakasIDt = new int[strAsiakasIDt.length];
for (int i = 0; i < strAsiakasIDt.length; i++) {
asiakasIDt[i] = Integer.parseInt(strAsiakasIDt[i]);
}
return Asiakas.haeTietyt(asiakasIDt);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getKierrosNumero() {
return kierrosNumero;
}
public void setKierrosNumero(int kierrosNumero) {
this.kierrosNumero = kierrosNumero;
}
public ObservableList<Asiakas> getAsiakkaat() {
return asiakkaat;
}
public void setAsiakkaat(ObservableList<Asiakas> asiakkaat) {
this.asiakkaat = asiakkaat;
}
public String toString() {
return this.kierrosNumero + ": " + this.asiakkaat;
}
}
@@ -1,406 +0,0 @@
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 {
private int id = -1;
private int asiakasID;
private String nimi;
private LocalDate kuljetusPäivämäärä;
private int kuljetusKierros;
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.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) {
this.asiakasID = asiakas.getId();
this.nimi = asiakas.getNimi();
this.kuljetusPäivämäärä = pvm;
this.kuljetusKierros = kuljetusKierros;
int kuljetusKerroin = switch (kuljetusPäivämäärä.getDayOfWeek()) {
case MONDAY -> asiakas.getMaanantaiKpl();
case TUESDAY -> asiakas.getTiistaiKpl();
case WEDNESDAY -> asiakas.getKeskiviikkoKpl();
case THURSDAY -> asiakas.getTorstaiKpl();
case FRIDAY -> asiakas.getPerjantaiKpl();
default -> 0;
};
this.salaatit = kuljetusKerroin * asiakas.getSalaatit();
this.pääruoat = kuljetusKerroin * asiakas.getPääruoat();
this.jälkiruoat = kuljetusKerroin * asiakas.getJälkiruoat();
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) {
this.id = id;
this.asiakasID = asiakasID;
this.nimi = nimi;
this.kuljetusPäivämäärä = kuljetusPäivämäärä;
this.kuljetusKierros = kuljetusKierros;
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;
}
public static ArrayList<Kuljetus> haeKaikki() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM kuljetukset;");
return parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
return null;
}
}
/**
* Hakee yhden päivän kuljetukset riippumatta kierroksesta
* @param päivä haettava päivä
* @return päivän kuljetukset
*/
public static ArrayList<Kuljetus> haePäivänKuljetukset(LocalDate päivä) {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("SELECT * FROM kuljetukset WHERE kuljetusPäivämäärä = ?;");
stmt.setDate(1, Date.valueOf(päivä));
ResultSet rs = stmt.executeQuery();
return parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
return null;
}
}
/**
* Hakee tietyn kierroksen kuljetukset
* @param päivä kierroksen päivä
* @param kuljetusKierros kierroksen numero
* @return valitun päivän valitun kierroksen kuljetukset
*/
public static ArrayList<Kuljetus> haePäivänKuljetuksetKierroksella(LocalDate päivä, int kuljetusKierros) {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("SELECT * FROM kuljetukset WHERE kuljetusKierros = ? and kuljetusPäivämäärä = ?");
stmt.setInt(1, kuljetusKierros);
stmt.setDate(2, Date.valueOf(päivä));
ResultSet rs = stmt.executeQuery();
return parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
return null;
}
}
/**
* Hakee kuljetukset aikajakson perusteella
*
* @param alku jakson alku (sisältyen)
* @param loppu jakson loppu (sisältyen)
* @return Jakson kuljetukset
*/
public static ArrayList<Kuljetus> haeAikaJakso(LocalDate alku, LocalDate loppu) {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("SELECT * FROM kuljetukset WHERE kuljetusPäivämäärä BETWEEN ? AND ?");
stmt.setDate(1, Date.valueOf(alku));
stmt.setDate(2, Date.valueOf(loppu));
ResultSet rs = stmt.executeQuery();
return parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
return null;
}
}
public static ArrayList<Kuljetus> haeAikaJaksollaJaKierroksella(LocalDate alku, LocalDate loppu, int kuljetusKierros) {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("SELECT * FROM kuljetukset WHERE kuljetusKierros = ? and kuljetusPäivämäärä BETWEEN ? AND ?");
stmt.setInt(1, kuljetusKierros);
stmt.setDate(2, Date.valueOf(alku));
stmt.setDate(3, Date.valueOf(loppu));
ResultSet rs = stmt.executeQuery();
return parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
return null;
}
}
@Override
public boolean tallennaUusi() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("INSERT INTO kuljetukset (asiakasID, nimi, kuljetusPäivämäärä, kuljetusKierros, 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.setInt(5, salaatit);
stmt.setInt(6, pääruoat);
stmt.setInt(7, jälkiruoat);
stmt.setString(8, ruokarajoite);
stmt.setString(9, osoite);
stmt.setString(10, avainTieto);
stmt.setString(11, 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;
}
@Override
public boolean päivitäTietokantaan() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("UPDATE kuljetukset set asiakasID = ?, nimi = ?, kuljetusPäivämäärä = ?, kuljetusKierros = ?, 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.setInt(5, salaatit);
stmt.setInt(6, pääruoat);
stmt.setInt(7, jälkiruoat);
stmt.setString(8, ruokarajoite);
stmt.setString(9, osoite);
stmt.setString(10, avainTieto);
stmt.setString(11, lisätieto);
stmt.setInt(12, 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<Kuljetus> parsiResultSet(ResultSet rs) {
ArrayList<Kuljetus> 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")
);
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 +
", 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) {
int kuljetusKerroin = switch (kuljetusPäivämäärä.getDayOfWeek()) {
case MONDAY -> asiakas.getMaanantaiKpl();
case TUESDAY -> asiakas.getTiistaiKpl();
case WEDNESDAY -> asiakas.getKeskiviikkoKpl();
case THURSDAY -> asiakas.getTorstaiKpl();
case FRIDAY -> asiakas.getPerjantaiKpl();
default -> 0;
};
setSalaatit(asiakas.getSalaatit() * kuljetusKerroin);
setPääruoat(asiakas.getPääruoat() * kuljetusKerroin);
setJälkiruoat(asiakas.getJälkiruoat() * kuljetusKerroin);
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;
}
}
@@ -1,109 +0,0 @@
package fi.lpam.dataluokat;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList;
@SuppressWarnings("ClassCanBeRecord")
public class RaporttiRivi {
private final String nimi;
private final LocalDate alkuPvm, loppuPvm;
private final int salaatit, pääruoat, jälkiruoat;
private final String lisätiedot;
public RaporttiRivi(String nimi, LocalDate alkuPvm, LocalDate loppuPvm, int salaatit, int pääruoat, int jälkiruoat, String lisätiedot) {
this.nimi = nimi;
this.alkuPvm = alkuPvm;
this.loppuPvm = loppuPvm;
this.salaatit = salaatit;
this.pääruoat = pääruoat;
this.jälkiruoat = jälkiruoat;
this.lisätiedot = lisätiedot;
}
public static ArrayList<RaporttiRivi> haeRaportti(LocalDate alkuPvm, LocalDate loppuPvm, boolean tarkka) {
ArrayList<RaporttiRivi> raportti = new ArrayList<>();
try (Connection tietokanta = Tietokanta.haeYhteys()) {
ResultSet rs;
if (tarkka) {
//Jokainen kuljetus saa oman rivin
PreparedStatement stmt = tietokanta.prepareStatement("select nimi, kuljetusPäivämäärä, salaatit, pääruoat, jälkiruoat, lisätieto from kuljetukset where kuljetusPäivämäärä between ? and ? order by nimi");
stmt.setDate(1, Date.valueOf(alkuPvm));
stmt.setDate(2, Date.valueOf(loppuPvm));
rs = stmt.executeQuery();
while (rs.next()) {
RaporttiRivi uusi = new RaporttiRivi(
rs.getString(1),
rs.getDate(2).toLocalDate(),
rs.getDate(2).toLocalDate(),
rs.getInt(3),
rs.getInt(4),
rs.getInt(5),
rs.getString(6)
);
raportti.add(uusi);
}
} else {
//Kuljetukset summataan yhteen riviin per vastaanottaja
PreparedStatement stmt = tietokanta.prepareStatement("select nimi, kuljetusPäivämäärä, sum(salaatit), sum(pääruoat), sum(jälkiruoat), group_concat(lisätieto, '\n') from kuljetukset where kuljetusPäivämäärä between ? and ? group by nimi order by nimi;");
stmt.setDate(1, Date.valueOf(alkuPvm));
stmt.setDate(2, Date.valueOf(loppuPvm));
rs = stmt.executeQuery();
while (rs.next()) {
RaporttiRivi uusi = new RaporttiRivi(
rs.getString(1),
alkuPvm,
loppuPvm,
rs.getInt(3),
rs.getInt(4),
rs.getInt(5),
rs.getString(6)
);
raportti.add(uusi);
}
}
} catch (SQLException e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
return null;
}
return raportti;
}
@Override
public String toString() {
return this.nimi + ":\nSal: " + this.salaatit + ", Pr: " + this.pääruoat + ", Jr: " + this.jälkiruoat + "\nLisätiedot:\n" + this.lisätiedot.strip();
}
public String getNimi() {
return nimi;
}
public LocalDate getAlkuPvm() {
return alkuPvm;
}
public LocalDate getLoppuPvm() {
return loppuPvm;
}
public int getSalaatit() {
return salaatit;
}
public int getPääruoat() {
return pääruoat;
}
public int getJälkiruoat() {
return jälkiruoat;
}
public String getLisätiedot() {
return lisätiedot;
}
}
@@ -1,60 +0,0 @@
package fi.lpam.dataluokat;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import fi.lpam.gui.virheDialogit.YhteysVirhe;
import fi.lpam.Main;
import javafx.scene.control.Alert;
import org.apache.commons.lang3.SystemUtils;
import java.io.*;
import java.sql.*;
import java.util.Objects;
public class Tietokanta {
private static String osoite;
private static String dbPath = SystemUtils.getUserHome().getAbsolutePath() + "\\OneDrive\\Kuljetusruokasovellus\\tietokanta.db";
public Tietokanta(boolean dev) throws IOException {
if (dev) dbPath = "testikanta.db";
File file = new File(dbPath);
try {
//noinspection ResultOfMethodCallIgnored
file.getParentFile().mkdirs();
}
catch (Exception _) {}
//noinspection ResultOfMethodCallIgnored
file.createNewFile();
osoite = "jdbc:sqlite:" + file.getAbsolutePath();
try (Connection conn = haeYhteys()) {
InputStream is = Objects.requireNonNull(Main.class.getResourceAsStream("tietokanta.sql"));
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String sql = br.readAllAsString();
for (String query : sql.split(";")) {
conn.createStatement().execute(query);
}
}
catch (Exception e) {
SiirtoVirhe virhe = new SiirtoVirhe(e);
virhe.showAndWait();
}
}
public static Connection haeYhteys() {
Connection connection = null;
try {
connection = DriverManager.getConnection(osoite);
} catch (Exception e) {
Alert virhe = new YhteysVirhe(e);
virhe.showAndWait();
}
return connection;
}
}
@@ -1,12 +0,0 @@
package fi.lpam.dataluokat;
public interface TietokantaOlio {
boolean tallennaUusi();
boolean päivitäTietokantaan();
boolean poista();
boolean tallenna();
}