Files
Ruokamanageri/src/main/java/fi/lpam/dataluokat/Asiakas.java
T
2026-05-30 01:31:34 +03:00

638 lines
21 KiB
Java

package fi.lpam.dataluokat;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import java.sql.*;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
@SuppressWarnings("DuplicatedCode")
public class Asiakas implements TietokantaOlio {
private int id = -1;
private String nimi;
private String osoite;
private int maanantaiKpl, tiistaiKpl, keskiviikkoKpl, torstaiKpl, perjantaiKpl, lauantaiKpl, sunnuntaiKpl;
private int salaatit, pääruoat, jälkiruoat;
private int dinnerMaanantaiKpl, dinnerTiistaiKpl, dinnerKeskiviikkoKpl, dinnerTorstaiKpl, dinnerPerjantaiKpl, dinnerLauantaiKpl, dinnerSunnuntaiKpl;
private int dinnerSalaatit, dinnerPääruoat, dinnerJälkiruoat;
private String erityisruokavalio;
private String avainTieto;
private String lisätiedot;
private String laskutusOsoite, yhteyshenkilönNimi, yhteyshenkilönPuhelinnumero, yhteyshenkilönSähköposti;
/**
* 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
*/
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,
String laskutusOsoite,
String yhteyshenkilönNimi,
String yhteyshenkilönPuhelinnumero,
String yhteyshenkilönSähköposti,
int lauantaiKpl,
int sunnuntaiKpl,
int dinnerMaanantaiKpl,
int dinnerTiistaiKpl,
int dinnerKeskiviikkoKpl,
int dinnerTorstaiKpl,
int dinnerPerjantaiKpl,
int dinnerLauantaiKpl,
int dinnerSunnuntaiKpl,
int dinnerSalaatit,
int dinnerPääruoat,
int dinnerJälkiruoat) {
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.lauantaiKpl = lauantaiKpl;
this.sunnuntaiKpl = sunnuntaiKpl;
this.salaatit = salaatit;
this.pääruoat = pääruoat;
this.jälkiruoat = jälkiruoat;
this.erityisruokavalio = erityisruokavalio;
this.avainTieto = avainTieto;
this.lisätiedot = lisätiedot;
this.laskutusOsoite = laskutusOsoite;
this.yhteyshenkilönNimi = yhteyshenkilönNimi;
this.yhteyshenkilönPuhelinnumero = yhteyshenkilönPuhelinnumero;
this.yhteyshenkilönSähköposti = yhteyshenkilönSähköposti;
this.dinnerMaanantaiKpl = dinnerMaanantaiKpl;
this.dinnerTiistaiKpl = dinnerTiistaiKpl;
this.dinnerKeskiviikkoKpl = dinnerKeskiviikkoKpl;
this.dinnerTorstaiKpl = dinnerTorstaiKpl;
this.dinnerPerjantaiKpl = dinnerPerjantaiKpl;
this.dinnerLauantaiKpl = dinnerLauantaiKpl;
this.dinnerSunnuntaiKpl = dinnerSunnuntaiKpl;
this.dinnerSalaatit = dinnerSalaatit;
this.dinnerPääruoat = dinnerPääruoat;
this.dinnerJälkiruoat = dinnerJälkiruoat;
}
/**
* 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 ja palauttaa ne annetussa järjestyksessä
* @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 + ")";
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery(sql);
HashMap<Integer, Asiakas> asiakkaat = new HashMap<>(IDt.length);
parsiResultSet(rs).forEach(asiakas -> asiakkaat.put(asiakas.getId(), asiakas));
ArrayList<Asiakas> järjestetyt = new ArrayList<>(asiakkaat.size());
for (int id : IDt) {
if (asiakkaat.containsKey(id)) järjestetyt.add(asiakkaat.get(id)); //Huomioidaan, onko asiakas poistettu
}
return järjestetyt;
}
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()) {
int i = 1;
Asiakas uusi = new Asiakas(
rs.getInt(i++),
rs.getString(i++),
rs.getString(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getString(i++),
rs.getString(i++),
rs.getString(i++),
rs.getString(i++),
rs.getString(i++),
rs.getString(i++),
rs.getString(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++),
rs.getInt(i++)
);
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, lauantaiKpl, sunnuntaiKpl, salaatit, pääruoat, jälkiruoat, " +
"dinner_maanantaiKpl, dinner_tiistaiKpl, dinner_keskiviikkoKpl, dinner_torstaiKpl, dinner_perjantaiKpl, dinner_lauantaiKpl, dinner_sunnuntaiKpl, dinner_salaatit, dinner_pääruoat, dinner_jälkiruoat, " +
"erityisruokavalio, avainTieto, lisätiedot, laskutusosoite, yhteyshenkilönNimi, yhteyshenkilönPuhelinnumero, yhteyshenkilönSähköposti) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
int i = 1;
stmt.setString(i++, nimi);
stmt.setString(i++, osoite);
stmt.setInt(i++, maanantaiKpl);
stmt.setInt(i++, tiistaiKpl);
stmt.setInt(i++, keskiviikkoKpl);
stmt.setInt(i++, torstaiKpl);
stmt.setInt(i++, perjantaiKpl);
stmt.setInt(i++, lauantaiKpl);
stmt.setInt(i++, sunnuntaiKpl);
stmt.setInt(i++, salaatit);
stmt.setInt(i++, pääruoat);
stmt.setInt(i++, jälkiruoat);
stmt.setInt(i++, dinnerMaanantaiKpl);
stmt.setInt(i++, dinnerTiistaiKpl);
stmt.setInt(i++, dinnerKeskiviikkoKpl);
stmt.setInt(i++, dinnerTorstaiKpl);
stmt.setInt(i++, dinnerPerjantaiKpl);
stmt.setInt(i++, dinnerLauantaiKpl);
stmt.setInt(i++, dinnerSunnuntaiKpl);
stmt.setInt(i++, dinnerSalaatit);
stmt.setInt(i++, dinnerPääruoat);
stmt.setInt(i++, dinnerJälkiruoat);
stmt.setString(i++, erityisruokavalio);
stmt.setString(i++, avainTieto);
stmt.setString(i++, lisätiedot);
stmt.setString(i++, laskutusOsoite);
stmt.setString(i++, yhteyshenkilönNimi);
stmt.setString(i++, yhteyshenkilönPuhelinnumero);
stmt.setString(i++, yhteyshenkilönSähköposti);
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 = ?, lauantaiKpl = ?, sunnuntaiKpl = ?, salaatit = ?, pääruoat = ?, jälkiruoat = ?, " +
"dinner_maanantaiKpl = ?, dinner_tiistaiKpl = ?, dinner_keskiviikkoKpl = ?, dinner_torstaiKpl = ?, dinner_perjantaiKpl = ?, dinner_lauantaiKpl = ?, dinner_sunnuntaiKpl = ?, dinner_salaatit = ?, dinner_pääruoat = ?, dinner_jälkiruoat = ?, " +
"erityisruokavalio = ?, avainTieto = ?, lisätiedot = ?, laskutusosoite = ?, yhteyshenkilönNimi = ?, yhteyshenkilönPuhelinnumero = ?, yhteyshenkilönSähköposti = ? WHERE id = ?");
int i = 1;
stmt.setString(i++, nimi);
stmt.setString(i++, osoite);
stmt.setInt(i++, maanantaiKpl);
stmt.setInt(i++, tiistaiKpl);
stmt.setInt(i++, keskiviikkoKpl);
stmt.setInt(i++, torstaiKpl);
stmt.setInt(i++, perjantaiKpl);
stmt.setInt(i++, lauantaiKpl);
stmt.setInt(i++, sunnuntaiKpl);
stmt.setInt(i++, salaatit);
stmt.setInt(i++, pääruoat);
stmt.setInt(i++, jälkiruoat);
stmt.setInt(i++, dinnerMaanantaiKpl);
stmt.setInt(i++, dinnerTiistaiKpl);
stmt.setInt(i++, dinnerKeskiviikkoKpl);
stmt.setInt(i++, dinnerTorstaiKpl);
stmt.setInt(i++, dinnerPerjantaiKpl);
stmt.setInt(i++, dinnerLauantaiKpl);
stmt.setInt(i++, dinnerSunnuntaiKpl);
stmt.setInt(i++, dinnerSalaatit);
stmt.setInt(i++, dinnerPääruoat);
stmt.setInt(i++, dinnerJälkiruoat);
stmt.setString(i++, erityisruokavalio);
stmt.setString(i++, avainTieto);
stmt.setString(i++, lisätiedot);
stmt.setString(i++, laskutusOsoite);
stmt.setString(i++, yhteyshenkilönNimi);
stmt.setString(i++, yhteyshenkilönPuhelinnumero);
stmt.setString(i++, yhteyshenkilönSähköposti);
stmt.setInt(i++, 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 getKuljetuksenSalaatit(LocalDate päivä, Kuljetus.Tyyppi tyyppi) {
return switch (tyyppi) {
case Kuljetus.Tyyppi.Lounas -> getLounasKuljetusKerroin(päivä) * getSalaatit();
case Kuljetus.Tyyppi.Päivällinen -> getPäivällisKuljetusKerroin(päivä) * getDinnerSalaatit();
};
}
public int getKuljetuksenPääruoat(LocalDate päivä, Kuljetus.Tyyppi tyyppi) {
return switch (tyyppi) {
case Kuljetus.Tyyppi.Lounas -> getLounasKuljetusKerroin(päivä) * getPääruoat();
case Kuljetus.Tyyppi.Päivällinen -> getPäivällisKuljetusKerroin(päivä) * getDinnerPääruoat();
};
}
public int getKuljetuksenJälkiruoat(LocalDate päivä, Kuljetus.Tyyppi tyyppi) {
return switch (tyyppi) {
case Kuljetus.Tyyppi.Lounas -> getLounasKuljetusKerroin(päivä) * getJälkiruoat();
case Kuljetus.Tyyppi.Päivällinen -> getPäivällisKuljetusKerroin(päivä) * getDinnerJälkiruoat();
};
}
private int getLounasKuljetusKerroin(LocalDate päivä) {
return switch (päivä.getDayOfWeek()) {
case DayOfWeek.MONDAY -> getMaanantaiKpl();
case DayOfWeek.TUESDAY -> getTiistaiKpl();
case DayOfWeek.WEDNESDAY -> getKeskiviikkoKpl();
case DayOfWeek.THURSDAY -> getTorstaiKpl();
case DayOfWeek.FRIDAY -> getPerjantaiKpl();
case DayOfWeek.SATURDAY -> getLauantaiKpl();
case DayOfWeek.SUNDAY -> getSunnuntaiKpl();
};
}
private int getPäivällisKuljetusKerroin(LocalDate päivä) {
return switch (päivä.getDayOfWeek()) {
case DayOfWeek.MONDAY -> getDinnerMaanantaiKpl();
case DayOfWeek.TUESDAY -> getDinnerTiistaiKpl();
case DayOfWeek.WEDNESDAY -> getDinnerKeskiviikkoKpl();
case DayOfWeek.THURSDAY -> getDinnerTorstaiKpl();
case DayOfWeek.FRIDAY -> getDinnerPerjantaiKpl();
case DayOfWeek.SATURDAY -> getDinnerLauantaiKpl();
case DayOfWeek.SUNDAY -> getDinnerSunnuntaiKpl();
};
}
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 getLauantaiKpl() {
return lauantaiKpl;
}
public void setLauantaiKpl(int lauantaiKpl) {
this.lauantaiKpl = lauantaiKpl;
}
public int getSunnuntaiKpl() {
return sunnuntaiKpl;
}
public void setSunnuntaiKpl(int sunnuntaiKpl) {
this.sunnuntaiKpl = sunnuntaiKpl;
}
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;
}
public String getLaskutusOsoite() {
return laskutusOsoite;
}
public void setLaskutusOsoite(String laskutusOsoite) {
this.laskutusOsoite = laskutusOsoite;
}
public String getYhteyshenkilönNimi() {
return yhteyshenkilönNimi;
}
public void setYhteyshenkilönNimi(String yhteyshenkilönNimi) {
this.yhteyshenkilönNimi = yhteyshenkilönNimi;
}
public String getYhteyshenkilönPuhelinnumero() {
return yhteyshenkilönPuhelinnumero;
}
public void setYhteyshenkilönPuhelinnumero(String yhteyshenkilönPuhelinnumero) {
this.yhteyshenkilönPuhelinnumero = yhteyshenkilönPuhelinnumero;
}
public String getYhteyshenkilönSähköposti() {
return yhteyshenkilönSähköposti;
}
public void setYhteyshenkilönSähköposti(String yhteyshenkilönSähköposti) {
this.yhteyshenkilönSähköposti = yhteyshenkilönSähköposti;
}
public int getDinnerMaanantaiKpl() {
return dinnerMaanantaiKpl;
}
public void setDinnerMaanantaiKpl(int dinnerMaanantaiKpl) {
this.dinnerMaanantaiKpl = dinnerMaanantaiKpl;
}
public int getDinnerTiistaiKpl() {
return dinnerTiistaiKpl;
}
public void setDinnerTiistaiKpl(int dinnerTiistaiKpl) {
this.dinnerTiistaiKpl = dinnerTiistaiKpl;
}
public int getDinnerKeskiviikkoKpl() {
return dinnerKeskiviikkoKpl;
}
public void setDinnerKeskiviikkoKpl(int dinnerKeskiviikkoKpl) {
this.dinnerKeskiviikkoKpl = dinnerKeskiviikkoKpl;
}
public int getDinnerTorstaiKpl() {
return dinnerTorstaiKpl;
}
public void setDinnerTorstaiKpl(int dinnerTorstaiKpl) {
this.dinnerTorstaiKpl = dinnerTorstaiKpl;
}
public int getDinnerPerjantaiKpl() {
return dinnerPerjantaiKpl;
}
public void setDinnerPerjantaiKpl(int dinnerPerjantaiKpl) {
this.dinnerPerjantaiKpl = dinnerPerjantaiKpl;
}
public int getDinnerLauantaiKpl() {
return dinnerLauantaiKpl;
}
public void setDinnerLauantaiKpl(int dinnerLauantaiKpl) {
this.dinnerLauantaiKpl = dinnerLauantaiKpl;
}
public int getDinnerSunnuntaiKpl() {
return dinnerSunnuntaiKpl;
}
public void setDinnerSunnuntaiKpl(int dinnerSunnuntaiKpl) {
this.dinnerSunnuntaiKpl = dinnerSunnuntaiKpl;
}
public int getDinnerSalaatit() {
return dinnerSalaatit;
}
public void setDinnerSalaatit(int dinnerSalaatit) {
this.dinnerSalaatit = dinnerSalaatit;
}
public int getDinnerPääruoat() {
return dinnerPääruoat;
}
public void setDinnerPääruoat(int dinnerPääruoat) {
this.dinnerPääruoat = dinnerPääruoat;
}
public int getDinnerJälkiruoat() {
return dinnerJälkiruoat;
}
public void setDinnerJälkiruoat(int dinnerJälkiruoat) {
this.dinnerJälkiruoat = dinnerJälkiruoat;
}
}