From 83ae429c65a4a4d8838b56dfaffb724e7824f15c Mon Sep 17 00:00:00 2001 From: laurimaaninka Date: Sun, 12 Apr 2026 23:53:23 +0300 Subject: [PATCH] Versio 2.0.0 Signed-off-by: laurimaaninka --- CHANGELOG.md | 6 +- pom.xml | 2 +- .../dataluokat/RaporttiRivi.java | 140 ++++++++++++++---- .../ruokamanageri/gui/Asiakashallinta.java | 26 +++- .../ruokamanageri/gui/KuljetusRaportit.java | 30 +++- .../tulostajat/KuljetusListaTulostaja.java | 3 +- .../tulostajat/KuljetusRaporttiTulostaja.java | 3 +- 7 files changed, 166 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 648d9fd..ed18138 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ -# 2.0.0-wip -- Asiakkaalle laskutusosoite? +# 2.0.0 +- Asiakkaalle lisätty tietoihin laskutusosoite ja yhteyshenkilön yhteystiedot +- Tiedot nousevat kuljetusraportille laskutusta varten +- Lisätty ohjelmaan linkki muutoslokiin # 1.1.1 - Integroitu versionumenointi projektiin diff --git a/pom.xml b/pom.xml index bcee7b3..be06f6f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 fi.lpam.ruokamanageri Ruokamanageri - 2.0.0-wip + 2.0.0 UTF-8 25 diff --git a/src/main/java/fi/lpam/ruokamanageri/dataluokat/RaporttiRivi.java b/src/main/java/fi/lpam/ruokamanageri/dataluokat/RaporttiRivi.java index d376af6..822d5f6 100644 --- a/src/main/java/fi/lpam/ruokamanageri/dataluokat/RaporttiRivi.java +++ b/src/main/java/fi/lpam/ruokamanageri/dataluokat/RaporttiRivi.java @@ -6,21 +6,34 @@ import java.sql.*; import java.time.LocalDate; import java.util.ArrayList; -@SuppressWarnings("ClassCanBeRecord") +@SuppressWarnings({"ClassCanBeRecord", "DuplicatedCode"}) public class RaporttiRivi { private final String nimi; - private final LocalDate alkuPvm, loppuPvm; + private final LocalDate pvm; private final int salaatit, pääruoat, jälkiruoat; private final String lisätiedot; + private final String yhteyshenkilönNimi, laskutusOsoite, yhteyshenkilönPuhelinnumero, yhteyshenkilönSähköposti; - public RaporttiRivi(String nimi, LocalDate alkuPvm, LocalDate loppuPvm, int salaatit, int pääruoat, int jälkiruoat, String lisätiedot) { + public RaporttiRivi(String nimi, + LocalDate pvm, + int salaatit, + int pääruoat, + int jälkiruoat, + String lisätiedot, + String yhteyshenkilönNimi, + String laskutusOsoite, + String yhteyshenkilönPuhelinnumero, + String yhteyshenkilönSähköposti) { this.nimi = nimi; - this.alkuPvm = alkuPvm; - this.loppuPvm = loppuPvm; + this.pvm = pvm; this.salaatit = salaatit; this.pääruoat = pääruoat; this.jälkiruoat = jälkiruoat; this.lisätiedot = lisätiedot; + this.yhteyshenkilönNimi = yhteyshenkilönNimi; + this.laskutusOsoite = laskutusOsoite; + this.yhteyshenkilönPuhelinnumero = yhteyshenkilönPuhelinnumero; + this.yhteyshenkilönSähköposti = yhteyshenkilönSähköposti; } public static ArrayList haeRaportti(LocalDate alkuPvm, LocalDate loppuPvm, boolean tarkka) { @@ -29,40 +42,82 @@ public class RaporttiRivi { 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"); + PreparedStatement stmt = tietokanta.prepareStatement(""" + select kuljetukset.asiakasID, + kuljetukset.nimi, + kuljetukset.kuljetusPäivämäärä, + kuljetukset.salaatit, + kuljetukset.pääruoat, + kuljetukset.jälkiruoat, + kuljetukset.lisätieto, + asiakkaat.yhteyshenkilönNimi, + asiakkaat.laskutusosoite, + asiakkaat.yhteyshenkilönPuhelinnumero, + asiakkaat.yhteyshenkilönSähköposti + from kuljetukset + left join asiakkaat on kuljetukset.asiakasID=asiakkaat.id + where kuljetusPäivämäärä between ? and ? + order by kuljetukset.nimi + """); stmt.setDate(1, Date.valueOf(alkuPvm)); stmt.setDate(2, Date.valueOf(loppuPvm)); rs = stmt.executeQuery(); while (rs.next()) { + int i = 2; 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) + rs.getString(i++), + rs.getDate(i++).toLocalDate(), + rs.getInt(i++), + rs.getInt(i++), + rs.getInt(i++), + rs.getString(i++), + rs.getString(i++), + rs.getString(i++), + rs.getString(i++), + rs.getString(i++) ); 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)); + PreparedStatement stmt = tietokanta.prepareStatement(""" + select kuljetukset.asiakasID, + kuljetukset.nimi, + kuljetukset.kuljetusPäivämäärä, + sum(kuljetukset.salaatit), + sum(kuljetukset.pääruoat), + sum(kuljetukset.jälkiruoat), + group_concat(kuljetukset.lisätieto, ?), + asiakkaat.yhteyshenkilönNimi, + asiakkaat.laskutusosoite, + asiakkaat.yhteyshenkilönPuhelinnumero, + asiakkaat.yhteyshenkilönSähköposti + from kuljetukset + left join asiakkaat on kuljetukset.asiakasID=asiakkaat.id + where kuljetusPäivämäärä between ? and ? + group by kuljetukset.nimi + order by kuljetukset.nimi + """); + stmt.setString(1, "\n"); + stmt.setDate(2, Date.valueOf(alkuPvm)); + stmt.setDate(3, Date.valueOf(loppuPvm)); rs = stmt.executeQuery(); while (rs.next()) { + int i = 2; RaporttiRivi uusi = new RaporttiRivi( - rs.getString(1), - alkuPvm, - loppuPvm, - rs.getInt(3), - rs.getInt(4), - rs.getInt(5), - rs.getString(6) + rs.getString(i++), + rs.getDate(i++).toLocalDate(), + rs.getInt(i++), + rs.getInt(i++), + rs.getInt(i++), + rs.getString(i++), + rs.getString(i++), + rs.getString(i++), + rs.getString(i++), + rs.getString(i++) ); raportti.add(uusi); } @@ -76,19 +131,25 @@ public class RaporttiRivi { } @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(); + + String laskutustiedot = "\n" + yhteyshenkilönNimi + + "\n" + laskutusOsoite + + "\n" + yhteyshenkilönPuhelinnumero + + "\n" + yhteyshenkilönSähköposti; + + return nimi + + "\nSal: " + salaatit + ", Pr: " + pääruoat + ", Jr: " + jälkiruoat + + "\nLisätiedot:\n" + + getLisätiedot() + + laskutustiedot.replace("\nnull", "").strip(); } public String getNimi() { return nimi; } - public LocalDate getAlkuPvm() { - return alkuPvm; - } - - public LocalDate getLoppuPvm() { - return loppuPvm; + public LocalDate getPvm() { + return pvm; } public int getSalaatit() { @@ -104,6 +165,23 @@ public class RaporttiRivi { } public String getLisätiedot() { - return lisätiedot; + if (lisätiedot == null) return null; + return lisätiedot.strip().trim().stripLeading().stripTrailing(); + } + + public String getYhteyshenkilönNimi() { + return yhteyshenkilönNimi; + } + + public String getLaskutusOsoite() { + return laskutusOsoite; + } + + public String getYhteyshenkilönPuhelinnumero() { + return yhteyshenkilönPuhelinnumero; + } + + public String getYhteyshenkilönSähköposti() { + return yhteyshenkilönSähköposti; } } \ No newline at end of file diff --git a/src/main/java/fi/lpam/ruokamanageri/gui/Asiakashallinta.java b/src/main/java/fi/lpam/ruokamanageri/gui/Asiakashallinta.java index f90fae2..1d0cd81 100644 --- a/src/main/java/fi/lpam/ruokamanageri/gui/Asiakashallinta.java +++ b/src/main/java/fi/lpam/ruokamanageri/gui/Asiakashallinta.java @@ -1,15 +1,24 @@ package fi.lpam.ruokamanageri.gui; +import fi.lpam.ruokamanageri.Main; import fi.lpam.ruokamanageri.dataluokat.Asiakas; import fi.lpam.ruokamanageri.gui.elementit.MaaraTableColumn; import fi.lpam.ruokamanageri.gui.elementit.TabPohja; import javafx.collections.FXCollections; import javafx.scene.control.*; +import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseEvent; import javafx.scene.layout.*; +import java.awt.*; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Objects; import java.util.Optional; @@ -33,19 +42,30 @@ public class Asiakashallinta extends TabPohja { yläpalkinNapit.setSpacing(5); yläpalkki.setRight(yläpalkinNapit); + Button avaaVersioloki = new Button("Avaa muutosloki"); + avaaVersioloki.setFont(buttonFont); + avaaVersioloki.setOnAction(_ -> { + try { + Desktop.getDesktop().browse(new URI("https://git.lpam.fi/laurimaaninka/Ruokamanageri/src/branch/master/CHANGELOG.md")); + } catch (IOException | URISyntaxException e) { + System.out.println(e.getMessage()); + } + }); + yläpalkinNapit.getChildren().add(avaaVersioloki); + Button poistaValittu = new Button("Poista"); poistaValittu.setOnAction(_ -> poistaValittu()); - poistaValittu.setFont(TabPohja.buttonFont); + poistaValittu.setFont(buttonFont); yläpalkinNapit.getChildren().add(poistaValittu); Button muokkaaAsiakasta = new Button("Muokkaa"); muokkaaAsiakasta.setOnAction(_ -> muokkaaValittua()); - muokkaaAsiakasta.setFont(TabPohja.buttonFont); + muokkaaAsiakasta.setFont(buttonFont); yläpalkinNapit.getChildren().add(muokkaaAsiakasta); Button uusiAsiakas = new Button("Uusi asiakas"); uusiAsiakas.setOnAction(_ -> uusiAsiakas()); - uusiAsiakas.setFont(TabPohja.buttonFont); + uusiAsiakas.setFont(buttonFont); yläpalkinNapit.getChildren().add(uusiAsiakas); tvAsiakkaat.setEditable(false); diff --git a/src/main/java/fi/lpam/ruokamanageri/gui/KuljetusRaportit.java b/src/main/java/fi/lpam/ruokamanageri/gui/KuljetusRaportit.java index 313f9de..58110bd 100644 --- a/src/main/java/fi/lpam/ruokamanageri/gui/KuljetusRaportit.java +++ b/src/main/java/fi/lpam/ruokamanageri/gui/KuljetusRaportit.java @@ -59,18 +59,21 @@ public class KuljetusRaportit extends TabPohja { Button tulostaRaportti = new Button("Tulosta raportti"); tulostaRaportti.setFont(buttonFont); tulostaRaportti.setOnAction(_ ->tulostaRaportti()); - yläpalkinNapit.getChildren().addAll(tarkka, new Label("Hae kuljetukset välillä:"), alkuPvm, new Label("-"), loppuPvm, haeKuljetukset, tulostaRaportti); + yläpalkinNapit.getChildren().addAll(tarkka, + new Label("Hae kuljetukset välillä:"), + alkuPvm, new Label("-"), loppuPvm, + haeKuljetukset, tulostaRaportti); root.setCenter(tableView); TableColumn tcNimi = new TableColumn<>("Nimi"); - tcNimi.setMinWidth(150); + tcNimi.setMinWidth(200); tcNimi.setCellValueFactory(new PropertyValueFactory<>("nimi")); TableColumn tcPvm = new TableColumn<>("Päivämäärä"); tcPvm.setMinWidth(150); tcPvm.setCellFactory(_ ->new PaivamaaraTableCell()); - tcPvm.setCellValueFactory(new PropertyValueFactory<>("loppuPvm")); + tcPvm.setCellValueFactory(new PropertyValueFactory<>("pvm")); TableColumn tcSalaatit = new TableColumn<>("Salaatit"); tcSalaatit.setMinWidth(100); @@ -85,10 +88,27 @@ public class KuljetusRaportit extends TabPohja { tcJälkiruoat.setCellValueFactory(new PropertyValueFactory<>("jälkiruoat")); TableColumn tcLisätiedot = new TableColumn<>("Lisätiedot"); - tcLisätiedot.setMinWidth(500); + tcLisätiedot.setMinWidth(300); tcLisätiedot.setCellValueFactory(new PropertyValueFactory<>("lisätiedot")); - tableView.getColumns().addAll(tcNimi, tcPvm, tcSalaatit, tcPääruoat, tcJälkiruoat, tcLisätiedot); + TableColumn tcYhteyshenkilönNimi = new TableColumn<>("Yhteyshenkilön nimi"); + tcYhteyshenkilönNimi.setMinWidth(200); + tcYhteyshenkilönNimi.setCellValueFactory(new PropertyValueFactory<>("yhteyshenkilönNimi")); + + TableColumn tcLaskutusOsoite = new TableColumn<>("Laskutusosoite"); + tcLaskutusOsoite.setMinWidth(200); + tcLaskutusOsoite.setCellValueFactory(new PropertyValueFactory<>("laskutusOsoite")); + + TableColumn tcYhteyshenkilönPuhelinnumero = new TableColumn<>("Puhelinnumero"); + tcYhteyshenkilönPuhelinnumero.setMinWidth(200); + tcYhteyshenkilönPuhelinnumero.setCellValueFactory(new PropertyValueFactory<>("yhteyshenkilönPuhelinnumero")); + + TableColumn tcYhteyshenkilönSähköposti = new TableColumn<>("Sähköposti"); + tcYhteyshenkilönSähköposti.setMinWidth(200); + tcYhteyshenkilönSähköposti.setCellValueFactory(new PropertyValueFactory<>("yhteyshenkilönSähköposti")); + + tableView.getColumns().addAll(tcNimi, tcPvm, tcSalaatit, tcPääruoat, tcJälkiruoat, tcLisätiedot, + tcYhteyshenkilönNimi, tcLaskutusOsoite, tcYhteyshenkilönPuhelinnumero, tcYhteyshenkilönSähköposti); tableView.setPlaceholder(new Label("Hae raportti")); for (TableColumn sarake : tableView.getColumns()) { sarake.setSortable(false); diff --git a/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusListaTulostaja.java b/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusListaTulostaja.java index 0730dcf..0325734 100644 --- a/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusListaTulostaja.java +++ b/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusListaTulostaja.java @@ -45,8 +45,9 @@ public class KuljetusListaTulostaja extends Tulostaja{ siirräOsoitinta(NIMEN_LEVEYS); sisältö.showText(kuljetus.getLisätieto()); uusiRivi(RIVI_KORKEUS*0.1F); - sisältö.showText("___________________________________________________________________"); + sisältö.showText("___________________________________________________________________"); //67 alaviivaa (noin sivun leveys) } + tulosta(); } catch (IOException e) { diff --git a/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusRaporttiTulostaja.java b/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusRaporttiTulostaja.java index abc6d90..cb384f5 100644 --- a/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusRaporttiTulostaja.java +++ b/src/main/java/fi/lpam/ruokamanageri/tulostajat/KuljetusRaporttiTulostaja.java @@ -4,13 +4,14 @@ import fi.lpam.ruokamanageri.dataluokat.RaporttiRivi; import java.io.IOException; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; @SuppressWarnings("DuplicatedCode") public class KuljetusRaporttiTulostaja extends Tulostaja { public void luoRaportti(ArrayList raporttiRivit, LocalDate alkuPvm, LocalDate loppuPvm) { try { - sisältö.showText("Raportti aikaväliltä " + alkuPvm + " - " + loppuPvm); + sisältö.showText("Raportti aikaväliltä " + alkuPvm.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + " - " + loppuPvm.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))); uusiRivi(); uusiRivi();