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 Kuljetus.Tyyppi tyyppi; private final int salaatit, pääruoat, jälkiruoat; private final String erva; private final String lisätiedot; private final String yhteyshenkilönNimi, laskutusOsoite, yhteyshenkilönPuhelinnumero, yhteyshenkilönSähköposti; private 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, String erva, Kuljetus.Tyyppi tyyppi) { this.nimi = nimi; this.pvm = pvm; this.tyyppi = tyyppi; this.salaatit = salaatit; this.pääruoat = pääruoat; this.jälkiruoat = jälkiruoat; this.lisätiedot = lisätiedot; this.erva = erva; 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, asiakkaat.erityisruokavalio, kuljetukset.tyyppi from kuljetukset left join asiakkaat on kuljetukset.asiakasID=asiakkaat.id where (kuljetusPäivämäärä between ? and ?) and (kuljetukset.salaatit > 0 or kuljetukset.pääruoat > 0 or kuljetukset.jälkiruoat > 0 or LENGTH(kuljetukset.lisätieto) > 3) order by asiakkaat.yhteyshenkilönNimi DESC, kuljetukset.nimi, kuljetukset.kuljetusPäivämäärä, kuljetukset.tyyppi """); 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++), rs.getString(i++), Kuljetus.Tyyppi.valueOf(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) as salaatit, sum(kuljetukset.pääruoat) as pääruoat, sum(kuljetukset.jälkiruoat) as jälkiruoat, group_concat(kuljetukset.lisätieto, ?), asiakkaat.yhteyshenkilönNimi, asiakkaat.laskutusosoite, asiakkaat.yhteyshenkilönPuhelinnumero, asiakkaat.yhteyshenkilönSähköposti, asiakkaat.erityisruokavalio, kuljetukset.tyyppi from kuljetukset left join asiakkaat on kuljetukset.asiakasID=asiakkaat.id where (kuljetusPäivämäärä between ? and ?) and (kuljetukset.salaatit > 0 or kuljetukset.pääruoat > 0 or kuljetukset.jälkiruoat > 0 or LENGTH(kuljetukset.lisätieto) > 3) group by kuljetukset.nimi, kuljetukset.tyyppi order by asiakkaat.yhteyshenkilönNimi DESC, kuljetukset.nimi, kuljetukset.kuljetusPäivämäärä, kuljetukset.tyyppi """); 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++), rs.getString(i++), Kuljetus.Tyyppi.valueOf(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 + " " + erva + "\n" + tyyppi + " Sal: " + 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; } public String getErva() { return erva; } public Kuljetus.Tyyppi getTyyppi() { return tyyppi; } }