6 Commits

8 changed files with 121 additions and 159 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>fi.lpam.ruokamanageri</groupId>
<artifactId>Ruokamanageri</artifactId>
<version>4.0.0</version>
<version>4.1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>25</maven.compiler.source>
+64 -103
View File
@@ -1,6 +1,7 @@
package fi.lpam.dataluokat;
import fi.lpam.gui.virheDialogit.SiirtoVirhe;
import javafx.scene.control.Alert;
import java.sql.*;
import java.time.DayOfWeek;
@@ -29,7 +30,6 @@ public class Asiakas implements TietokantaOlio {
}
/**
* Vain MultiColumnListViewin käyttöön
* @param nimi Asiakkaan nimi
*/
public Asiakas(String nimi) {
@@ -40,65 +40,9 @@ public class Asiakas implements TietokantaOlio {
* 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) {
String nimi) {
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;
}
/**
@@ -106,15 +50,16 @@ public class Asiakas implements TietokantaOlio {
* @return ArrayList<Asiakas>
*/
public static ArrayList<Asiakas> haeKaikki() {
ArrayList<Asiakas> asiakkaat = new ArrayList<>();
try (Connection tietokanta = Tietokanta.haeYhteys()) {
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery("select * from asiakkaat");
return parsiResultSet(rs);
ResultSet rs = stmt.executeQuery("select id, nimi from asiakkaat");
asiakkaat = parsiResultSet(rs);
} catch (SQLException e) {
SiirtoVirhe alert = new SiirtoVirhe(e);
alert.showAndWait();
return null;
}
return asiakkaat;
}
/**
@@ -129,7 +74,7 @@ public class Asiakas implements TietokantaOlio {
sbIDt.append(", ").append(IDt[i]);
}
try (Connection tietokanta = Tietokanta.haeYhteys()) {
String sql = "select * from asiakkaat where id in (" + sbIDt + ")";
String sql = "select id, nimi from asiakkaat where id in (" + sbIDt + ")";
Statement stmt = tietokanta.createStatement();
ResultSet rs = stmt.executeQuery(sql);
@@ -149,49 +94,15 @@ public class Asiakas implements TietokantaOlio {
}
/**
* Käsittelee ResultSettiä
* Olettaa resultsetin sisältävän id:n ja nimen
* @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);
asiakkaat.add(new Asiakas(rs.getInt("id"), rs.getString("nimi")));
}
}
catch (SQLException e) {
@@ -203,10 +114,8 @@ public class Asiakas implements TietokantaOlio {
/**
* Tallentaa uuden asiakkaan tietokantaan. Tietokanta luo automaattisesti id:n asiakkaalle.
*
*/
@Override
public boolean tallennaUusi() {
private 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, " +
@@ -268,8 +177,7 @@ public class Asiakas implements TietokantaOlio {
/**
* Päivittää kutsuvan asiakkaan tiedot tietokantaan
*/
@Override
public boolean päivitäTietokantaan() {
private 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 = ?, " +
@@ -395,6 +303,53 @@ public class Asiakas implements TietokantaOlio {
};
}
private String haeString(String sarake) {
try (Connection conn = Tietokanta.haeYhteys()) {
PreparedStatement stmt = conn.prepareStatement("select ? from asiakkaat where id = ?");
stmt.setString(1, sarake);
stmt.setInt(2, this.id);
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getString(1);
}
catch (Exception e) {
Alert alert = new SiirtoVirhe(e);
alert.showAndWait();
}
return null;
}
private int haeInt(String sarake) {
try (Connection conn = Tietokanta.haeYhteys()) {
PreparedStatement stmt = conn.prepareStatement("select ? from asiakkaat where id = ?");
stmt.setString(1, sarake);
stmt.setInt(2, this.id);
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getInt(1);
}
catch (Exception e) {
Alert alert = new SiirtoVirhe(e);
alert.showAndWait();
}
return 0;
}
private Date haeDate(String sarake) {
try (Connection conn = Tietokanta.haeYhteys()) {
PreparedStatement stmt = conn.prepareStatement("select ? from asiakkaat where id = ?");
stmt.setString(1, sarake);
stmt.setInt(2, this.id);
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getDate(1);
}
catch (Exception e) {
Alert alert = new SiirtoVirhe(e);
alert.showAndWait();
}
return null;
}
public int getId() {
return id;
@@ -413,6 +368,9 @@ public class Asiakas implements TietokantaOlio {
}
public String getOsoite() {
if (osoite == null) {
osoite = haeString("osoite");
}
return osoite;
}
@@ -421,6 +379,9 @@ public class Asiakas implements TietokantaOlio {
}
public int getMaanantaiKpl() {
if (maanantaiKpl == 0) {
maanantaiKpl = haeInt("maanantaiKpl");
}
return maanantaiKpl;
}
@@ -86,8 +86,7 @@ public class Kierros implements TietokantaOlio {
}
@Override
public boolean tallennaUusi() {
private 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);
@@ -114,8 +113,7 @@ public class Kierros implements TietokantaOlio {
return true;
}
@Override
public boolean päivitäTietokantaan() {
private boolean päivitäTietokantaan() {
try (Connection tietokanta = Tietokanta.haeYhteys()) {
PreparedStatement stmt = tietokanta.prepareStatement("update kierrokset set asiakkaat = ?, kierrosnumero = ? where id = ?");
stmt.setString(1, muutaAsiakkaatMerkkijonoksi());
@@ -103,8 +103,7 @@ public class Kuljetus implements TietokantaOlio {
}
}
@Override
public boolean tallennaUusi() {
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);
@@ -139,8 +138,7 @@ public class Kuljetus implements TietokantaOlio {
return true;
}
@Override
public boolean päivitäTietokantaan() {
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);
@@ -1,12 +1,16 @@
package fi.lpam.dataluokat;
public interface TietokantaOlio {
/**
* Tallentaa joko uuden, tai päivittää olemassa olevaa riviä
* @return onnistuiko operaatio
*/
boolean tallenna();
boolean tallennaUusi();
boolean päivitäTietokantaan();
/**
* Poistaa kutsuvan olion rivin tietokannasta
* @return onnistuiko operaatio
*/
boolean poista();
boolean tallenna();
}
+38 -37
View File
@@ -7,7 +7,6 @@ import fi.lpam.gui.elementit.TabPohja;
import fi.lpam.Main;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
@@ -38,31 +37,19 @@ public class AsiakasIkkuna extends Stage {
this.setTitle("Uusi asiakas");
}
TabPane tabPane = new TabPane();
tabPane.setSide(Side.LEFT);
int korkeus = 150;
tabPane.setTabMinWidth(korkeus);
tabPane.setTabMinWidth(korkeus);
tabPane.setTabMinHeight(35);
tabPane.setTabMaxHeight(35);
tabPane.setOnKeyPressed(e -> {
HBox hbTiedot = new HBox();
hbTiedot.setOnKeyPressed(e -> {
switch (e.getCode()) {
case ENTER: tallenna(); break;
case ESCAPE: close(); break;
default: break;
}});
Tab tabLounastiedot, tabPäivällistiedot, tabAsiakastiedot;
tabLounastiedot = new TabPohja("Kuljetustiedot");
tabPäivällistiedot = new TabPohja("Päivällistiedot");
tabAsiakastiedot = new TabPohja("Asiakastiedot");
tabPane.getTabs().addAll(tabLounastiedot, tabPäivällistiedot, tabAsiakastiedot);
GridPane lounasTiedot = new GridPane();
lounasTiedot.setPadding(new Insets(15));
lounasTiedot.setHgap(10);
lounasTiedot.setVgap(10);
tabLounastiedot.setContent(lounasTiedot);
lounasTiedot.addRow(lounasTiedot.getRowCount(), new Label("Lounaat per kuljetus"));
@@ -106,27 +93,16 @@ public class AsiakasIkkuna extends Stage {
tfSunnuntai = new IntegerSpinner();
lounasTiedot.addRow(lounasTiedot.getRowCount(), new Label("Sunnuntai"), tfSunnuntai);
Label ruokarajoitteet = new Label("Ruokarajoitteet");
tfRuokarajoitteet = new TextField();
lounasTiedot.addRow(lounasTiedot.getRowCount(), ruokarajoitteet, tfRuokarajoitteet);
Label avainTieto = new Label("Avaintieto");
tfAvainTieto = new TextField();
lounasTiedot.addRow(lounasTiedot.getRowCount(), avainTieto, tfAvainTieto);
Label lisätiedot = new Label("Kuljetuksen lisätiedot");
tfLisätiedot = new TextField();
tfLisätiedot.setPromptText("Näkyy raporteilla");
lounasTiedot.addRow(lounasTiedot.getRowCount(), lisätiedot, tfLisätiedot);
GridPane päivällisTiedot = new GridPane();
päivällisTiedot.setPadding(new Insets(15));
päivällisTiedot.setHgap(10);
päivällisTiedot.setVgap(10);
tabPäivällistiedot.setContent(päivällisTiedot);
päivällisTiedot.addRow(päivällisTiedot.getRowCount(), new Label("Päivälliset per kuljetus"));
Button kopioiLounasPäivälliseen = new Button("Kopioi lounasmäärät");
kopioiLounasPäivälliseen.setOnAction(_->kopioiLounasmäärätPäivälliselle());
päivällisTiedot.addRow(päivällisTiedot.getRowCount(), new Label("Päivälliset per kuljetus"), kopioiLounasPäivälliseen);
tfDinnerSalaatit = new IntegerSpinner();
päivällisTiedot.addRow(päivällisTiedot.getRowCount(), new Label("Salaatit"), tfDinnerSalaatit);
@@ -160,11 +136,12 @@ public class AsiakasIkkuna extends Stage {
tfDinnerSunnuntai = new IntegerSpinner();
päivällisTiedot.addRow(päivällisTiedot.getRowCount(), new Label("Sunnuntai"), tfDinnerSunnuntai);
GridPane asiakasTiedot = new GridPane();
asiakasTiedot.setPadding(new Insets(15));
asiakasTiedot.setHgap(10);
asiakasTiedot.setVgap(10);
tabAsiakastiedot.setContent(asiakasTiedot);
Label nimi = new Label("Asiakkaan etu- ja sukunimi");
nimi.setStyle("-fx-font-weight: bold;");
@@ -194,6 +171,22 @@ public class AsiakasIkkuna extends Stage {
tfYhteyshenkilönSähköposti = new TextField();
asiakasTiedot.addRow(asiakasTiedot.getRowCount(), yhteyshenkilönSähköposti, tfYhteyshenkilönSähköposti);
Label ruokarajoitteet = new Label("Ruokarajoitteet");
tfRuokarajoitteet = new TextField();
asiakasTiedot.addRow(asiakasTiedot.getRowCount(), ruokarajoitteet, tfRuokarajoitteet);
Label avainTieto = new Label("Avaintieto");
tfAvainTieto = new TextField();
asiakasTiedot.addRow(asiakasTiedot.getRowCount(), avainTieto, tfAvainTieto);
Label lisätiedot = new Label("Kuljetuksen lisätiedot");
tfLisätiedot = new TextField();
tfLisätiedot.setPromptText("Näkyy raporteilla");
asiakasTiedot.addRow(asiakasTiedot.getRowCount(), lisätiedot, tfLisätiedot);
hbTiedot.getChildren().addAll(asiakasTiedot, lounasTiedot, päivällisTiedot);
HBox napit = new HBox();
Button peruuta = new Button("Peruuta");
peruuta.setFont(TabPohja.BUTTON_FONT);
@@ -208,7 +201,7 @@ public class AsiakasIkkuna extends Stage {
VBox root = new VBox();
root.getChildren().addAll(tabPane, napit);
root.getChildren().addAll(hbTiedot, napit);
this.setScene(new Scene(root));
this.getIcons().add(new Image(Objects.requireNonNull(Main.class.getClassLoader().getResourceAsStream("kuljetusruokalaatikko.jpg"))));
this.setAlwaysOnTop(true);
@@ -304,12 +297,7 @@ public class AsiakasIkkuna extends Stage {
int maxYritykset = 3;
int yritykset = 0;
while (!läpi) {
if (käsiteltäväAsiakas.getId() > 0) {
läpi = käsiteltäväAsiakas.päivitäTietokantaan();
}
else {
läpi = käsiteltäväAsiakas.tallennaUusi();
}
läpi = käsiteltäväAsiakas.tallenna();
yritykset++;
if (yritykset > maxYritykset) {
break;
@@ -337,4 +325,17 @@ public class AsiakasIkkuna extends Stage {
}
this.setAlwaysOnTop(true);
}
private void kopioiLounasmäärätPäivälliselle() {
tfDinnerMaanantai.getValueFactory().setValue(tfMaanantai.getValue());
tfDinnerTiistai.getValueFactory().setValue(tfTiistai.getValue());
tfDinnerKeskiviikko.getValueFactory().setValue(tfKeskiviikko.getValue());
tfDinnerTorstai.getValueFactory().setValue(tfTorstai.getValue());
tfDinnerPerjantai.getValueFactory().setValue(tfPerjantai.getValue());
tfDinnerLauantai.getValueFactory().setValue(tfLauantai.getValue());
tfDinnerSunnuntai.getValueFactory().setValue(tfSunnuntai.getValue());
tfDinnerSalaatit.getValueFactory().setValue(tfSalaatit.getValue());
tfDinnerPääruoat.getValueFactory().setValue(tfPääruoat.getValue());
tfDinnerJälkiruoat.getValueFactory().setValue(tfJälkiruoat.getValue());
}
}
@@ -192,11 +192,7 @@ public class KuljetusListat extends TabPohja {
private void tallennaKierros() {
try {
for (Kuljetus kuljetus : tableView.getItems()) {
if (kuljetus.getId() > 0) {
kuljetus.päivitäTietokantaan();
} else {
kuljetus.tallennaUusi();
}
kuljetus.tallenna();
}
tallennusStatus.setText("Tallennettu: Kyllä");
btnTulosta.setDisable(false);
+4
View File
@@ -1,3 +1,7 @@
# 4.1.0
- Asiakasikkunaan nappi, jolla voi kopioida lounasmäärät päivälliselle
- Asiakasikkunan uudelleenjärjestely
# 4.0.0
- Kuljetuslistoista luodaan lounas- ja päivällislistat erikseen
- Kuljetuslistalla asiakkaan nimeä ei voi enään muokata