package fi.lpam.dataluokat; import fi.lpam.gui.virheDialogit.SiirtoVirhe; import java.sql.*; import java.time.LocalDate; import java.util.ArrayList; @SuppressWarnings({"ClassCanBeRecord", "DuplicatedCode"}) public class RaporttiRivi { private final String nimi; 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 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.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) { ArrayList raportti = new ArrayList<>(); try (Connection tietokanta = Tietokanta.haeYhteys()) { ResultSet rs; if (tarkka) { //Jokainen kuljetus saa oman rivin 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(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 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(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); } } } catch (SQLException e) { SiirtoVirhe virhe = new SiirtoVirhe(e); virhe.showAndWait(); return null; } return raportti; } @Override public String toString() { 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 getPvm() { return pvm; } public int getSalaatit() { return salaatit; } public int getPääruoat() { return pääruoat; } public int getJälkiruoat() { return jälkiruoat; } public String getLisä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; } }