From 429bb9df06cbb2586eb7d96d362173c983a202b6 Mon Sep 17 00:00:00 2001 From: laurimaaninka Date: Fri, 10 Apr 2026 18:41:29 +0300 Subject: [PATCH] Tulostamisen uudelleenrakentaminen Signed-off-by: laurimaaninka --- .idea/dataSources.xml | 7 ++ .idea/db-forest-config.xml | 10 ++ TODO.txt | 6 +- .../java/fi/lpam/dataluokat/Kuljetus.java | 2 +- src/main/java/fi/lpam/gui/KuljetusListat.java | 2 +- .../java/fi/lpam/gui/KuljetusRaportit.java | 2 +- .../tulostajat/KuljetusListaTulostaja.java | 82 ++++--------- .../tulostajat/KuljetusRaporttiTulostaja.java | 52 +++------ .../java/fi/lpam/tulostajat/Tulostaja.java | 109 +++++++++++++++++- 9 files changed, 170 insertions(+), 102 deletions(-) create mode 100644 .idea/db-forest-config.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 6a3623d..d28294d 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -8,5 +8,12 @@ jdbc:sqlite:C:\Users\TheHy\Ohjelmointi\Ruokamanageri\testikanta.db $ProjectFileDir$ + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:C:\Users\TheHy\OneDrive\Kuljetusruokasovellus\tietokanta.db + $ProjectFileDir$ + \ No newline at end of file diff --git a/.idea/db-forest-config.xml b/.idea/db-forest-config.xml new file mode 100644 index 0000000..2e42c93 --- /dev/null +++ b/.idea/db-forest-config.xml @@ -0,0 +1,10 @@ + + + + . + ---------------------------------------- + 1:0:99c09b65-0631-4e8f-9a1e-89c4fd901b4e + 2:0:9acbcf20-b2bb-4f33-8c57-21f23780a86c + . + + \ No newline at end of file diff --git a/TODO.txt b/TODO.txt index dc46b69..5428e18 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1 +1,5 @@ -TODO Kuljetuslistan luontiin riville nappi, josta nollata rivi/palauttaa oletuskuljetusmäärät +TODO Kuljetuslistalle lisää tilaa vasemmalle, jotta voi rei'ittää kansioon + +TODO kierroshallinnassa asiakasta raahattaessa placeholderin fiksaus + +TODO Asiakkaalle laskutusosoite \ No newline at end of file diff --git a/src/main/java/fi/lpam/dataluokat/Kuljetus.java b/src/main/java/fi/lpam/dataluokat/Kuljetus.java index 3a44a37..361d1a5 100644 --- a/src/main/java/fi/lpam/dataluokat/Kuljetus.java +++ b/src/main/java/fi/lpam/dataluokat/Kuljetus.java @@ -306,7 +306,7 @@ public class Kuljetus implements TietokantaOlio { } public boolean kuljetetaan() { - return salaatit > 0 || pääruoat > 0 || jälkiruoat > 0 || !lisätieto.isEmpty(); + return salaatit > 0 || pääruoat > 0 || jälkiruoat > 0 || !lisätieto.isBlank(); } public int getId() { return id; diff --git a/src/main/java/fi/lpam/gui/KuljetusListat.java b/src/main/java/fi/lpam/gui/KuljetusListat.java index 0639a07..13a2276 100644 --- a/src/main/java/fi/lpam/gui/KuljetusListat.java +++ b/src/main/java/fi/lpam/gui/KuljetusListat.java @@ -215,6 +215,6 @@ public class KuljetusListat extends TabPohja { } private void tulostaLista() { - KuljetusListaTulostaja.tulosta(tableView.getItems(), kierrosValinta.getValue()); + new KuljetusListaTulostaja().luoKuljetusLista(tableView.getItems(), kierrosValinta.getValue()); } } \ No newline at end of file diff --git a/src/main/java/fi/lpam/gui/KuljetusRaportit.java b/src/main/java/fi/lpam/gui/KuljetusRaportit.java index 8343ae1..d5aa1ad 100644 --- a/src/main/java/fi/lpam/gui/KuljetusRaportit.java +++ b/src/main/java/fi/lpam/gui/KuljetusRaportit.java @@ -30,7 +30,7 @@ public class KuljetusRaportit extends TabPohja { } void tulostaRaportti() { - KuljetusRaporttiTulostaja.luoRaportti(raportti, alkuPvm.getValue(), loppuPvm.getValue()); + new KuljetusRaporttiTulostaja().luoRaportti(raportti, alkuPvm.getValue(), loppuPvm.getValue()); } public KuljetusRaportit() { diff --git a/src/main/java/fi/lpam/tulostajat/KuljetusListaTulostaja.java b/src/main/java/fi/lpam/tulostajat/KuljetusListaTulostaja.java index a31ce02..e6a7966 100644 --- a/src/main/java/fi/lpam/tulostajat/KuljetusListaTulostaja.java +++ b/src/main/java/fi/lpam/tulostajat/KuljetusListaTulostaja.java @@ -1,88 +1,56 @@ package fi.lpam.tulostajat; import fi.lpam.dataluokat.Kuljetus; -import fi.lpam.gui.virheDialogit.SiirtoVirhe; import javafx.collections.ObservableList; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.printing.PDFPageable; -import java.awt.print.PrinterException; -import java.awt.print.PrinterJob; import java.io.IOException; import java.time.format.DateTimeFormatter; @SuppressWarnings("DuplicatedCode") public class KuljetusListaTulostaja extends Tulostaja{ - public static void tulosta(ObservableList kuljetukset, int kierrosnumero) { - int kuljetuksetPerSivu = 14; - try (PDDocument dokumentti = new PDDocument()) { - PDPage sivu = new PDPage(); - dokumentti.addPage(sivu); - PDPageContentStream sisältö = new PDPageContentStream(dokumentti, sivu); - sisältö.beginText(); + final float NIMEN_LEVEYS = 200; + final float OSOITTEEN_LEVEYS = 200; + public void luoKuljetusLista(ObservableList kuljetukset, int kierrosnumero) { + try { + sisältö.showText(kuljetukset.getFirst().getKuljetusPäivämäärä().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + ", kierros: " + kierrosnumero); + uusiRivi(); - sisältö.setFont(fontti, fonttiKoko); - sisältö.setLeading(leading); - sisältö.newLineAtOffset(25, 750); - sisältö.showText(kuljetukset.getFirst().getKuljetusPäivämäärä().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + ", kierros " + kierrosnumero); - sisältö.newLineAtOffset(0, -25); - - int riviLaskuri = 1; for (Kuljetus kuljetus : kuljetukset) { //Tyhjää kuljetusta ei tulosteta - if ((kuljetus.getSalaatit() + kuljetus.getPääruoat() + kuljetus.getJälkiruoat()) < 1) {continue;} + if (!kuljetus.kuljetetaan()) {continue;} - if (riviLaskuri > kuljetuksetPerSivu) { - sisältö.endText(); - sisältö.close(); - PDPage uusiSivu = new PDPage(); - dokumentti.addPage(uusiSivu); - sisältö = new PDPageContentStream(dokumentti, uusiSivu); - sisältö.beginText(); - sisältö.setFont(fontti, fonttiKoko); - sisältö.setLeading(leading); - sisältö.newLineAtOffset(25,750); - riviLaskuri = 0; + if (yOffset - MARGINAALI < 4 * RIVI_KORKEUS) { + uusiSivu(); } + //Ensimmäinen rivi + uusiRivi(); sisältö.showText(kuljetus.getNimi()); - int nimenLeveys = 200; - sisältö.newLineAtOffset(nimenLeveys, 0); + siirräOsoitinta(NIMEN_LEVEYS); sisältö.showText(kuljetus.getOsoite()); - int osoitteenLeveys = 230; - sisältö.newLineAtOffset(osoitteenLeveys, 0); + siirräOsoitinta(OSOITTEEN_LEVEYS); sisältö.showText(kuljetus.getAvainTieto()); //Toinen rivi - sisältö.newLineAtOffset(-nimenLeveys-osoitteenLeveys, -16); + uusiRivi(); sisältö.showText("Sal: " + kuljetus.getSalaatit() + " Pr: " + kuljetus.getPääruoat() + " Jr: " + kuljetus.getJälkiruoat()); - sisältö.newLineAtOffset(nimenLeveys, 0); + siirräOsoitinta(NIMEN_LEVEYS); sisältö.showText(kuljetus.getRuokarajoite()); - sisältö.newLineAtOffset(osoitteenLeveys, 0); + + //Kolmas rivi + uusiRivi(); + siirräOsoitinta(NIMEN_LEVEYS); sisältö.showText(kuljetus.getLisätieto()); - - sisältö.newLineAtOffset(-nimenLeveys-osoitteenLeveys, -15); - sisältö.showText("_______________________________________________________________________"); - sisältö.newLineAtOffset(0, -20); - - riviLaskuri++; + uusiRivi(RIVI_KORKEUS*0.1F); + sisältö.showText("___________________________________________________________________"); } - sisältö.endText(); - sisältö.close(); - - PrinterJob tuloste = PrinterJob.getPrinterJob(); - tuloste.setPageable(new PDFPageable(dokumentti)); - if (tuloste.printDialog()) { - tuloste.print(); - } - } catch (IOException | PrinterException e) { - SiirtoVirhe virhe = new SiirtoVirhe(e); - virhe.showAndWait(); + tulosta(); + } + catch (IOException e) { + handleIOException(e); } } } \ No newline at end of file diff --git a/src/main/java/fi/lpam/tulostajat/KuljetusRaporttiTulostaja.java b/src/main/java/fi/lpam/tulostajat/KuljetusRaporttiTulostaja.java index f349272..c838904 100644 --- a/src/main/java/fi/lpam/tulostajat/KuljetusRaporttiTulostaja.java +++ b/src/main/java/fi/lpam/tulostajat/KuljetusRaporttiTulostaja.java @@ -3,6 +3,7 @@ package fi.lpam.tulostajat; import fi.lpam.dataluokat.RaporttiRivi; import java.awt.print.PrinterJob; +import java.io.IOException; import java.time.LocalDate; import java.util.ArrayList; @@ -10,58 +11,33 @@ import fi.lpam.gui.virheDialogit.SiirtoVirhe; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.printing.PDFPageable; @SuppressWarnings("DuplicatedCode") public class KuljetusRaporttiTulostaja extends Tulostaja { - public static void luoRaportti(ArrayList raporttiRivit, LocalDate alkuPvm, LocalDate loppuPvm) { - int rivitPerSivu = 44; - try (PDDocument dokumentti = new PDDocument()) { - PDPage sivu = new PDPage(); - dokumentti.addPage(sivu); - PDPageContentStream sisältö = new PDPageContentStream(dokumentti, sivu); - sisältö.beginText(); - - - sisältö.setFont(fontti, fonttiKoko); - sisältö.setLeading(leading); - sisältö.newLineAtOffset(25,750); + public void luoRaportti(ArrayList raporttiRivit, LocalDate alkuPvm, LocalDate loppuPvm) { + try { sisältö.showText("Raportti aikaväliltä " + alkuPvm + " - " + loppuPvm); - sisältö.newLineAtOffset(0, -25); + uusiRivi(); + uusiRivi(); - int riviLaskuri = 2; for (RaporttiRivi rivi : raporttiRivit) { String[] teksti = rivi.toString().split("\n"); for (String t : teksti) { - if (riviLaskuri % rivitPerSivu == 0) { - sisältö.endText(); - sisältö.close(); - PDPage uusiSivu = new PDPage(); - dokumentti.addPage(uusiSivu); - sisältö = new PDPageContentStream(dokumentti, uusiSivu); - sisältö.beginText(); - sisältö.setFont(fontti, fonttiKoko); - sisältö.setLeading(leading); - sisältö.newLineAtOffset(25,750); + if (yOffset - MARGINAALI < 0) { + uusiSivu(); } sisältö.showText(t); - riviLaskuri++; - sisältö.newLine(); + uusiRivi(); } - sisältö.newLineAtOffset(0, -5); - } - sisältö.endText(); - sisältö.close(); - - PrinterJob tuloste = PrinterJob.getPrinterJob(); - tuloste.setPageable(new PDFPageable(dokumentti)); - if (tuloste.printDialog()) { - tuloste.print(); + uusiRivi(); } + tulosta(); } - catch (Exception e) { - SiirtoVirhe virhe = new SiirtoVirhe(e); - virhe.showAndWait(); + + catch (IOException e) { + handleIOException(e); } } } \ No newline at end of file diff --git a/src/main/java/fi/lpam/tulostajat/Tulostaja.java b/src/main/java/fi/lpam/tulostajat/Tulostaja.java index a8eb970..85c2711 100644 --- a/src/main/java/fi/lpam/tulostajat/Tulostaja.java +++ b/src/main/java/fi/lpam/tulostajat/Tulostaja.java @@ -1,11 +1,114 @@ package fi.lpam.tulostajat; +import fi.lpam.gui.virheDialogit.SiirtoVirhe; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.pdmodel.font.Standard14Fonts; +import org.apache.pdfbox.printing.PDFPageable; + +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import java.io.IOException; public abstract class Tulostaja { - static final PDFont fontti = new PDType1Font(Standard14Fonts.FontName.HELVETICA); - static final int fonttiKoko = 14; - static final float leading = 14.5f; + PDRectangle SIVUKOKO = PDRectangle.A4; + final PDFont FONTTI = new PDType1Font(Standard14Fonts.FontName.HELVETICA); + final float FONTTI_KOKO = 13; + final float MARGINAALI = 50; + final float RIVI_KORKEUS = FONTTI_KOKO * 1.2F; + + PDDocument dokumentti; + PDPage nykyinenSivu = null; + PDPageContentStream sisältö = null; + float sivunLeveys; + float startX; + float startY; + float yOffset; + float xOffset; + + + public Tulostaja() { + dokumentti = new PDDocument(); + sivunLeveys = SIVUKOKO.getWidth() - 2 * MARGINAALI; + startX = SIVUKOKO.getLowerLeftX() + MARGINAALI; + startY = SIVUKOKO.getUpperRightY() - MARGINAALI; + yOffset = startY; + xOffset = 0; + uusiSivu(); + } + + /**Luo uuden sivun dokumenttiin ja alustaa sisältö muuttujan valmiiksi*/ + void uusiSivu() { + try { + if (sisältö != null) { + sisältö.endText(); + sisältö.close(); + } + PDPage uusiSivu = new PDPage(SIVUKOKO); + dokumentti.addPage(uusiSivu); + nykyinenSivu = uusiSivu; + sisältö = new PDPageContentStream(dokumentti, uusiSivu); + sisältö.setFont(FONTTI, FONTTI_KOKO); + sisältö.beginText(); + sisältö.newLineAtOffset(startX, startY); + yOffset = startY; + } catch (IOException e) { + handleIOException(e); + } + } + + /**Siirtää osoittimen rivin alkuun, siirtää riviä alaspäin tY verran*/ + void uusiRivi(float tY) { + try { + sisältö.newLineAtOffset(-xOffset, -tY); + xOffset = 0; + yOffset -= tY; + } + catch (IOException e) { + handleIOException(e); + } + } + + /**Siirtää osoittimen uuden rivin alkuun*/ + void uusiRivi() { + uusiRivi(RIVI_KORKEUS); + } + /**Siirtää osoitinta sivulla. + oikealle, - vasemmalle*/ + void siirräOsoitinta(float tX) { + try { + sisältö.newLineAtOffset(tX, 0); + xOffset += tX; + } + catch (IOException e) { + handleIOException(e); + } + } + /**Avaa järjestelmän tulostusikkunan dokumentille*/ + void tulosta() { + try { + sisältö.endText(); + sisältö.close(); + PrinterJob tuloste = PrinterJob.getPrinterJob(); + tuloste.setPageable(new PDFPageable(dokumentti)); + if (tuloste.printDialog()) { + tuloste.print(); + } + } + catch (PrinterException ex) { + System.out.println("Error: " + ex.getMessage()); + } + catch (IOException ex) { + handleIOException(ex); + } + } + + /**Käsittelee pdfboxin IOExceptionit*/ + void handleIOException(IOException e) { + SiirtoVirhe virhe = new SiirtoVirhe(e); + virhe.showAndWait(); + } }