Projektin moduulirakenteen formatointi

Signed-off-by: laurimaaninka <lauri.maaninka@gmail.com>
This commit is contained in:
2026-04-12 20:25:49 +03:00
parent 8cf1d03e5c
commit e83bdee4d0
33 changed files with 82 additions and 92 deletions
@@ -1,204 +0,0 @@
package fi.lpam.gui;
import fi.lpam.dataluokat.Asiakas;
import fi.lpam.gui.elementit.IntegerSpinner;
import fi.lpam.gui.elementit.TabPohja;
import fi.lpam.Main;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import java.util.Objects;
public class AsiakasIkkuna extends Stage {
final Asiakas käsiteltäväAsiakas;
final TextField tfNimi, tfOsoite, tfRuokarajoitteet, tfAvainTieto, tfLisätiedot;
final IntegerSpinner tfMaanantai, tfTiistai, tfKeskiviikko, tfTorstai, tfPerjantai, tfSalaatit, tfPääruoat, tfJälkiruoat;
/**
* Luo ikkunan jossa muokataan saatua asiakasta
* @param käsiteltäväAsiakas voi olla uusi, tai vanha. Ikkuna ei välitä
*/
public AsiakasIkkuna(Asiakas käsiteltäväAsiakas) {
this.käsiteltäväAsiakas = käsiteltäväAsiakas;
this.setTitle("Asiakasikkuna");
GridPane root = new GridPane();
root.setPadding(new Insets(15));
root.setHgap(10);
root.setVgap(10);
root.setOnKeyPressed(e -> {
switch (e.getCode()) {
case ENTER: tallenna(); break;
case ESCAPE: close(); break;
default: break;
}});
root.addRow(root.getRowCount(), new Label("Vahvistetut kentät pakollisia"));
Label nimi = new Label("Asiakkaan etu- ja sukunimi");
nimi.setStyle("-fx-font-weight: bold;");
tfNimi = new TextField();
tfNimi.setPromptText("Pakollinen tieto");
root.addRow(root.getRowCount(), nimi, tfNimi);
Label osoite = new Label("Osoite");
osoite.setStyle("-fx-font-weight: bold;");
tfOsoite = new TextField();
tfOsoite.setPromptText("Pakollinen tieto");
root.addRow(root.getRowCount(), osoite, tfOsoite);
root.addRow(root.getRowCount(), new Label("Määrät per kuljetus"));
Label salaatit = new Label("Salaatit");
tfSalaatit = new IntegerSpinner();
root.addRow(root.getRowCount(), salaatit, tfSalaatit);
Label pääruoat = new Label("Pääruoat");
tfPääruoat = new IntegerSpinner();
root.addRow(root.getRowCount(), pääruoat, tfPääruoat);
Label jälkiruoat = new Label("Jälkiruoat");
tfJälkiruoat = new IntegerSpinner();
root.addRow(root.getRowCount(), jälkiruoat, tfJälkiruoat);
root.addRow(root.getRowCount(), new Label("Kuljetukset per päivä"));
Label maanantai = new Label("Maanantai");
tfMaanantai = new IntegerSpinner();
root.addRow(root.getRowCount(), maanantai, tfMaanantai);
Label tiistai = new Label("Tiistai");
tfTiistai = new IntegerSpinner();
root.addRow(root.getRowCount(), tiistai, tfTiistai);
Label keskiviikko = new Label("Keskiviikko");
tfKeskiviikko = new IntegerSpinner();
root.addRow(root.getRowCount(), keskiviikko, tfKeskiviikko);
Label torstai = new Label("Torstai");
tfTorstai = new IntegerSpinner();
root.addRow(root.getRowCount(), torstai, tfTorstai);
Label perjantai = new Label("Perjantai");
tfPerjantai = new IntegerSpinner();
root.addRow(root.getRowCount(), perjantai, tfPerjantai);
Label ruokarajoitteet = new Label("Ruokarajoitteet");
tfRuokarajoitteet = new TextField();
root.addRow(root.getRowCount(), ruokarajoitteet, tfRuokarajoitteet);
Label avainTieto = new Label("Avaintieto");
tfAvainTieto = new TextField();
root.addRow(root.getRowCount(), avainTieto, tfAvainTieto);
Label lisätiedot = new Label("Kuljetuksen lisätiedot");
tfLisätiedot = new TextField();
tfLisätiedot.setPromptText("Näkyy raporteilla");
root.addRow(root.getRowCount(), lisätiedot, tfLisätiedot);
Button peruuta = new Button("Peruuta");
peruuta.setFont(TabPohja.buttonFont);
peruuta.setMinWidth(160);
peruuta.setOnAction(_ -> this.close());
Button tallenna = new Button("Tallenna");
tallenna.setFont(TabPohja.buttonFont);
tallenna.setMinWidth(160);
tallenna.setOnAction(_ -> tallenna());
root.addRow(root.getRowCount(), peruuta, tallenna);
this.setScene(new Scene(root));
this.getIcons().add(new Image(Objects.requireNonNull(Main.class.getResourceAsStream("kuljetusruokalaatikko.jpg"))));
this.setAlwaysOnTop(true);
this.setResizable(false);
//Saatu asiakas on tullut muokattavaksi
if (käsiteltäväAsiakas.getId() > 0) {
näytäAsiakas();
}
}
/**
* Jos saadulla asiakkaalla on id (eli asiakas löytyy tietokannasta ja sillä on tietoja)
* tällä funktiolla täytetään asiakkaan tiedot ikkunan kenttiin
*/
private void näytäAsiakas() {
tfNimi.setText(käsiteltäväAsiakas.getNimi());
tfOsoite.setText(käsiteltäväAsiakas.getOsoite());
tfMaanantai.getValueFactory().setValue(käsiteltäväAsiakas.getMaanantaiKpl());
tfTiistai.getValueFactory().setValue(käsiteltäväAsiakas.getTiistaiKpl());
tfKeskiviikko.getValueFactory().setValue(käsiteltäväAsiakas.getKeskiviikkoKpl());
tfTorstai.getValueFactory().setValue(käsiteltäväAsiakas.getTorstaiKpl());
tfPerjantai.getValueFactory().setValue(käsiteltäväAsiakas.getPerjantaiKpl());
tfSalaatit.getValueFactory().setValue(käsiteltäväAsiakas.getSalaatit());
tfPääruoat.getValueFactory().setValue(käsiteltäväAsiakas.getPääruoat());
tfJälkiruoat.getValueFactory().setValue(käsiteltäväAsiakas.getJälkiruoat());
tfRuokarajoitteet.setText(käsiteltäväAsiakas.getErityisruokavalio());
tfAvainTieto.setText(käsiteltäväAsiakas.getAvainTieto());
tfLisätiedot.setText(käsiteltäväAsiakas.getLisätiedot());
}
private void tallenna() {
this.setAlwaysOnTop(false);
String nimi = tfNimi.getText();
String osoite = tfOsoite.getText();
if (nimi.isEmpty() || osoite.isEmpty()) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Tarkista tiedot");
alert.setHeaderText(null);
alert.setContentText("Nimi tai osoite ei voi olla tyhjiä");
alert.showAndWait();
return;
}
käsiteltäväAsiakas.setNimi(nimi);
käsiteltäväAsiakas.setOsoite(osoite);
käsiteltäväAsiakas.setMaanantaiKpl(tfMaanantai.getValue());
käsiteltäväAsiakas.setTiistaiKpl(tfTiistai.getValue());
käsiteltäväAsiakas.setKeskiviikkoKpl(tfKeskiviikko.getValue());
käsiteltäväAsiakas.setTorstaiKpl(tfTorstai.getValue());
käsiteltäväAsiakas.setPerjantaiKpl(tfPerjantai.getValue());
käsiteltäväAsiakas.setSalaatit(tfSalaatit.getValue());
käsiteltäväAsiakas.setPääruoat(tfPääruoat.getValue());
käsiteltäväAsiakas.setJälkiruoat(tfJälkiruoat.getValue());
käsiteltäväAsiakas.setErityisruokavalio(tfRuokarajoitteet.getText());
käsiteltäväAsiakas.setAvainTieto(tfAvainTieto.getText());
käsiteltäväAsiakas.setLisätiedot(tfLisätiedot.getText());
boolean läpi = false;
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();
}
yritykset++;
if (yritykset > maxYritykset) {
break;
}
}
if (läpi) {
int viikonKuljetukset = käsiteltäväAsiakas.getMaanantaiKpl() + käsiteltäväAsiakas.getTiistaiKpl() + käsiteltäväAsiakas.getKeskiviikkoKpl() + käsiteltäväAsiakas.getTorstaiKpl() + käsiteltäväAsiakas.getPerjantaiKpl();
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Onnistuimme!");
alert.setHeaderText("Asiakkaan tallentaminen onnistui!");
alert.setContentText(String.format("%s saa jatkossa yhteensä \n%s salaattia, %s pääruokaa ja %s jälkiruokaa viikossa",
käsiteltäväAsiakas.getNimi(), käsiteltäväAsiakas.getSalaatit()*viikonKuljetukset, käsiteltäväAsiakas.getPääruoat()*viikonKuljetukset, käsiteltäväAsiakas.getPääruoat()*viikonKuljetukset));
alert.showAndWait();
this.close();
}
this.setAlwaysOnTop(true);
}
}
@@ -1,156 +0,0 @@
package fi.lpam.gui;
import fi.lpam.dataluokat.Asiakas;
import fi.lpam.gui.elementit.MaaraTableColumn;
import fi.lpam.gui.elementit.TabPohja;
import javafx.collections.FXCollections;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import java.util.Objects;
import java.util.Optional;
@SuppressWarnings("unchecked")
public class Asiakashallinta extends TabPohja {
final TableView<Asiakas> tvAsiakkaat = new TableView<>();
public Asiakashallinta() {
BorderPane root = new BorderPane();
this.getChildren().add(root);
root.setPadding(oletusInsets);
BorderPane yläpalkki = new BorderPane();
root.setTop(yläpalkki);
Label otsikko = new Label("Asiakashallinta");
otsikko.setFont(tekstiFont);
yläpalkki.setLeft(otsikko);
HBox yläpalkinNapit = new HBox();
yläpalkinNapit.setSpacing(5);
yläpalkki.setRight(yläpalkinNapit);
Button poistaValittu = new Button("Poista");
poistaValittu.setOnAction(_ -> poistaValittu());
poistaValittu.setFont(TabPohja.buttonFont);
yläpalkinNapit.getChildren().add(poistaValittu);
Button muokkaaAsiakasta = new Button("Muokkaa");
muokkaaAsiakasta.setOnAction(_ -> muokkaaValittua());
muokkaaAsiakasta.setFont(TabPohja.buttonFont);
yläpalkinNapit.getChildren().add(muokkaaAsiakasta);
Button uusiAsiakas = new Button("Uusi asiakas");
uusiAsiakas.setOnAction(_ -> uusiAsiakas());
uusiAsiakas.setFont(TabPohja.buttonFont);
yläpalkinNapit.getChildren().add(uusiAsiakas);
tvAsiakkaat.setEditable(false);
tvAsiakkaat.setPlaceholder(new Label("Ei vielä tietoja"));
tvAsiakkaat.setOnMouseClicked((MouseEvent mouseEvent) -> {
if (mouseEvent.getClickCount() == 2) {
muokkaaValittua();
}
});
tvAsiakkaat.setOnKeyPressed(e -> {
if (tvAsiakkaat.getSelectionModel().getSelectedItem() != null) {
if (e.getCode() == KeyCode.ENTER) {
muokkaaValittua();
}
}
});
root.setCenter(tvAsiakkaat);
TableColumn<Asiakas, String> tcNimi = new TableColumn<>("Nimi");
tcNimi.setMinWidth(180);
tcNimi.setCellValueFactory(new PropertyValueFactory<>("nimi"));
TableColumn<Asiakas, String> tcOsoite = new TableColumn<>("Osoite");
tcOsoite.setMinWidth(250);
tcOsoite.setCellValueFactory(new PropertyValueFactory<>("osoite"));
TableColumn<Asiakas, MaaraTableColumn<Asiakas, Integer>> tcKuljetuspäivät = new TableColumn<>("Kuljetukset per päivä");
MaaraTableColumn<Asiakas, Integer> tcMaanantaiKpl = new MaaraTableColumn<>("MA", 20);
tcMaanantaiKpl.setCellValueFactory(new PropertyValueFactory<>("maanantaiKpl"));
MaaraTableColumn<Asiakas, Integer> tcTiistaiKpl = new MaaraTableColumn<>("TI", 20);
tcTiistaiKpl.setCellValueFactory(new PropertyValueFactory<>("tiistaiKpl"));
MaaraTableColumn<Asiakas, Integer> tcKeskiviikkoKpl = new MaaraTableColumn<>("KE", 20);
tcKeskiviikkoKpl.setCellValueFactory(new PropertyValueFactory<>("keskiviikkoKpl"));
MaaraTableColumn<Asiakas, Integer> tcTorstaiKpl = new MaaraTableColumn<>("TO", 20);
tcTorstaiKpl.setCellValueFactory(new PropertyValueFactory<>("torstaiKpl"));
MaaraTableColumn<Asiakas, Integer> tcPerjantaiKpl = new MaaraTableColumn<>("PE", 20);
tcPerjantaiKpl.setCellValueFactory(new PropertyValueFactory<>("perjantaiKpl"));
tcKuljetuspäivät.getColumns().addAll(tcMaanantaiKpl, tcTiistaiKpl, tcKeskiviikkoKpl, tcTorstaiKpl, tcPerjantaiKpl);
TableColumn<Asiakas, MaaraTableColumn<Asiakas, Integer>> tcKuljetusmäärät = new TableColumn<>("Määrät per kuljetus");
MaaraTableColumn<Asiakas, Integer> tcSalaatit = new MaaraTableColumn<>("Salaatit", 90);
tcSalaatit.setCellValueFactory(new PropertyValueFactory<>("salaatit"));
MaaraTableColumn<Asiakas, Integer> tcPääruoat = new MaaraTableColumn<>("Pääruoat", 90);
tcPääruoat.setCellValueFactory(new PropertyValueFactory<>("pääruoat"));
MaaraTableColumn<Asiakas, Integer> tcJälkiruoat = new MaaraTableColumn<>("Jälkiruoat", 90);
tcJälkiruoat.setCellValueFactory(new PropertyValueFactory<>("jälkiruoat"));
tcKuljetusmäärät.getColumns().addAll(tcSalaatit, tcPääruoat, tcJälkiruoat);
TableColumn<Asiakas, String> tcErityisruokavalio = new TableColumn<>("Ruokarajoitteet");
tcErityisruokavalio.setMinWidth(150);
tcErityisruokavalio.setCellValueFactory(new PropertyValueFactory<>("erityisruokavalio"));
TableColumn<Asiakas, String> tcAvainTieto = new TableColumn<>("Avaintieto");
tcAvainTieto.setMinWidth(150);
tcAvainTieto.setCellValueFactory(new PropertyValueFactory<>("avainTieto"));
TableColumn<Asiakas, String> tcLisätiedot = new TableColumn<>("Lisätieto kuljetukselle");
tcLisätiedot.setMinWidth(250);
tcLisätiedot.setCellValueFactory(new PropertyValueFactory<>("lisätiedot"));
tvAsiakkaat.getColumns().addAll(tcNimi, tcOsoite, tcKuljetuspäivät, tcKuljetusmäärät, tcErityisruokavalio, tcAvainTieto, tcLisätiedot);
for (TableColumn<Asiakas, ?> column : tvAsiakkaat.getColumns()) {
column.setEditable(false);
column.setReorderable(false);
column.setResizable(false);
column.setStyle("-fx-alignment: CENTER; -fx-font-size: 16px;");
}
tvAsiakkaat.setItems(FXCollections.observableArrayList(Objects.requireNonNull(Asiakas.haeKaikki())));
}
private void uusiAsiakas() {
Asiakas luotavaAsiakas = new Asiakas();
AsiakasIkkuna asiakasIkkuna = new AsiakasIkkuna(luotavaAsiakas);
asiakasIkkuna.showAndWait();
if (luotavaAsiakas.getId() != -1) {
//Asiakas luotu ja id saatu tietokannasta
tvAsiakkaat.getItems().add(luotavaAsiakas);
tvAsiakkaat.refresh();
}
}
private void muokkaaValittua() {
Asiakas muokattavaAsiakas = tvAsiakkaat.getSelectionModel().getSelectedItem();
if (muokattavaAsiakas == null) {return;}
AsiakasIkkuna asiakasIkkuna = new AsiakasIkkuna(muokattavaAsiakas);
asiakasIkkuna.showAndWait();
tvAsiakkaat.refresh();
}
private void poistaValittu() {
Asiakas valittuAsiakas = tvAsiakkaat.getSelectionModel().getSelectedItem();
boolean läpi = false;
if (valittuAsiakas != null) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Oletko varma?");
alert.setHeaderText("Poistetaanko valittu asiakas?");
alert.setContentText(valittuAsiakas.getNimi());
Optional<ButtonType> result = alert.showAndWait();
if (result.isPresent() && result.get() == ButtonType.OK) {
läpi = valittuAsiakas.poista();
}
if (läpi) {
tvAsiakkaat.getItems().remove(valittuAsiakas);
tvAsiakkaat.refresh();
}
}
}
}
@@ -1,129 +0,0 @@
package fi.lpam.gui;
import com.dlsc.gemsfx.MultiColumnListView;
import fi.lpam.dataluokat.Asiakas;
import fi.lpam.dataluokat.Kierros;
import fi.lpam.gui.elementit.AsiakasListCell;
import fi.lpam.gui.elementit.TabPohja;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;
public class Kierroshallinta extends TabPohja {
private final MultiColumnListView<Asiakas> mclv = new MultiColumnListView<>();
private final ArrayList<Kierros> kierrokset = Kierros.haeKaikki();
private final ArrayList<Asiakas> kaikkiAsiakkaat = Asiakas.haeKaikki();
public Kierroshallinta() {
BorderPane root = new BorderPane();
this.getChildren().add(root);
root.setPadding(oletusInsets);
root.setCenter(mclv);
mclv.setCellFactory(_ -> new AsiakasListCell(mclv));
mclv.setPlaceholderFrom(new Asiakas(""));
mclv.setPlaceholderTo(new Asiakas(""));
rakennaSarakkeet();
BorderPane yläpalkki = new BorderPane();
root.setTop(yläpalkki);
Label infoTeksti = new Label("Siirrä asiakkaat haluamallesi kierrokselle. Kierroksia voit lisätä painamalla lisää uusi kierros painiketta.\nKierrosnumerot päivittyvät, sekä tyhjät poistuvat kierroksia tallentaessa.");
infoTeksti.setFont(tekstiFont);
yläpalkki.setLeft(infoTeksti);
HBox yläpalkinNapit = new HBox();
yläpalkinNapit.setSpacing(5);
yläpalkki.setRight(yläpalkinNapit);
Button lisääKierros = new Button("Lisää uusi kierros");
lisääKierros.setOnAction(_ -> lisaaKierros());
lisääKierros.setFont(TabPohja.buttonFont);
yläpalkinNapit.getChildren().add(lisääKierros);
Button tallenna = new Button("Tallenna kierrokset");
tallenna.setFont(TabPohja.buttonFont);
tallenna.setOnAction(_ ->tallennaKierrokset());
yläpalkinNapit.getChildren().add(tallenna);
}
private void rakennaSarakkeet() {
mclv.getColumns().clear();
ObservableList<Asiakas> eiKierroksella = FXCollections.observableArrayList(new ArrayList<>());
HashSet<Integer> kierroksellaOlevatAsiakasIDt = new HashSet<>();
if (!kierrokset.isEmpty()) {
for (Kierros k : kierrokset) {
MultiColumnListView.ListViewColumn<Asiakas> sarake = new MultiColumnListView.ListViewColumn<>();
sarake.setHeader(new Label("Kierros " + k.getKierrosNumero()));
sarake.setItems(k.getAsiakkaat());
for (Asiakas asiakas : k.getAsiakkaat()) {
kierroksellaOlevatAsiakasIDt.add(asiakas.getId());
}
mclv.getColumns().add(sarake);
}
}
for (Asiakas k : Objects.requireNonNull(kaikkiAsiakkaat)) {
if (!kierroksellaOlevatAsiakasIDt.contains(k.getId())) {
eiKierroksella.add(k);
}
}
MultiColumnListView.ListViewColumn<Asiakas> colEiKierroksella = new MultiColumnListView.ListViewColumn<>();
colEiKierroksella.setHeader(new Label("Ei vielä kierroksella"));
colEiKierroksella.setItems(FXCollections.observableArrayList(eiKierroksella));
mclv.getColumns().add(colEiKierroksella);
}
private void lisaaKierros() {
int uudenKierroksenNumero = mclv.getColumns().size();
Kierros lisättäväKierros = new Kierros(uudenKierroksenNumero, FXCollections.observableArrayList(new ArrayList<>()));
kierrokset.add(lisättäväKierros);
MultiColumnListView.ListViewColumn<Asiakas> uusiSarake = new MultiColumnListView.ListViewColumn<>();
uusiSarake.setHeader(new Label("Kierros " + uudenKierroksenNumero));
uusiSarake.setItems(lisättäväKierros.getAsiakkaat());
mclv.getColumns().add(uudenKierroksenNumero-1, uusiSarake);
}
private void tallennaKierrokset() {
int kierrosNumero = 1;
int index = 0;
for (int i = 0; i < kierrokset.size();) {
Kierros k = kierrokset.get(i);
k.setAsiakkaat(mclv.getColumns().get(index).getItems());
index++;
if (k.getAsiakkaat().isEmpty()) {
k.poista();
kierrokset.remove(i);
continue;
}
k.setKierrosNumero(kierrosNumero);
kierrosNumero++;
k.tallenna();
i++;
}
rakennaSarakkeet();
Alert info = new Alert(Alert.AlertType.INFORMATION);
info.setTitle("Kierrokset tallennettu");
info.setHeaderText("Kierrokset tallennettu onnistuneesti");
info.setContentText(null);
info.showAndWait();
}
}
@@ -1,220 +0,0 @@
package fi.lpam.gui;
import fi.lpam.dataluokat.Asiakas;
import fi.lpam.dataluokat.Kierros;
import fi.lpam.dataluokat.Kuljetus;
import fi.lpam.gui.elementit.KuljetaTableCell;
import fi.lpam.tulostajat.KuljetusListaTulostaja;
import fi.lpam.gui.elementit.MaaraTableColumn;
import fi.lpam.gui.elementit.TabPohja;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.control.cell.ChoiceBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
@SuppressWarnings("unchecked")
public class KuljetusListat extends TabPohja {
private final TableView<Kuljetus> tableView = new TableView<>();
private final DatePicker datePicker = new DatePicker(LocalDate.now());
private final ComboBox<Integer> kierrosValinta = new ComboBox<>(FXCollections.observableArrayList(Kierros.haeKierrosNumerot()));
public static Label tallennusStatus;
private final Button btnTulosta;
private final HashMap<Integer, Asiakas> asiakkaat = new HashMap<>();
public KuljetusListat() {
ObservableList<Integer> määräVaihtoehdot = FXCollections.observableArrayList();
for (int i = 0; i <= 10; i++) {
määräVaihtoehdot.add(i);}
for (Asiakas asiakas : Objects.requireNonNull(Asiakas.haeKaikki())) {
asiakkaat.put(asiakas.getId(), asiakas);
}
BorderPane root = new BorderPane();
root.setPadding(oletusInsets);
this.getChildren().add(root);
BorderPane yläpalkki = new BorderPane();
Label infoTeksti = new Label("Kuljetuslistojen luonti");
infoTeksti.setFont(tekstiFont);
yläpalkki.setLeft(infoTeksti);
HBox kierroksenValintaLaatikko = new HBox();
kierroksenValintaLaatikko.setSpacing(5);
kierroksenValintaLaatikko.setSpacing(5);
kierroksenValintaLaatikko.setAlignment(Pos.CENTER);
Button valitse = new Button("Valitse");
valitse.setFont(buttonFont);
valitse.setOnAction(_ -> päivitäListanäkymä());
tallennusStatus = new Label("Tallennettu: Kyllä");
tallennusStatus.setFont(tekstiFont);
datePicker.valueProperty().addListener(_ -> päivitäListanäkymä());
kierrosValinta.valueProperty().addListener(_ -> päivitäListanäkymä());
kierroksenValintaLaatikko.getChildren().addAll(
new Label("Valitse päivämäärä:"),
datePicker,
new Label("Valitse kierros:"),
kierrosValinta, tallennusStatus);
yläpalkki.setCenter(kierroksenValintaLaatikko);
HBox napit = new HBox();
napit.setSpacing(5);
Button poista = new Button("Poista kuljetusrivi");
poista.setOnAction(_ ->poistaRivi());
poista.setFont(buttonFont);
Button tallenna = new Button("Tallenna");
tallenna.setFont(buttonFont);
tallenna.setOnAction(_ -> tallennaKierros());
btnTulosta = new Button("Tulosta lista");
btnTulosta.setDisable(true);
btnTulosta.setFont(buttonFont);
btnTulosta.setOnAction(_ ->tulostaLista());
napit.getChildren().addAll(poista, tallenna, btnTulosta);
yläpalkki.setRight(napit);
root.setTop(yläpalkki);
tableView.setEditable(true);
tableView.setPlaceholder(new Label("Valitse kierros aloittaaksesi"));
root.setCenter(tableView);
TableColumn<Kuljetus, Boolean> tcNappi = new TableColumn<>("Kuljeta");
tcNappi.setMinWidth(100);
tcNappi.setCellFactory(_ -> new KuljetaTableCell(asiakkaat));
tcNappi.setCellValueFactory(features -> new SimpleBooleanProperty(features.getValue() != null));
TableColumn<Kuljetus, String> tcNimi = new TableColumn<>("Nimi");
tcNimi.setMinWidth(150);
tcNimi.setCellFactory(TextFieldTableCell.forTableColumn());
tcNimi.setCellValueFactory(new PropertyValueFactory<>("nimi"));
tcNimi.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, String> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setNimi(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, String> tcOsoite = new TableColumn<>("Osoite");
tcOsoite.setMinWidth(250);
tcOsoite.setCellFactory(TextFieldTableCell.forTableColumn());
tcOsoite.setCellValueFactory(new PropertyValueFactory<>("osoite"));
tcOsoite.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, String> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setOsoite(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, Integer> tcSalaatit = new MaaraTableColumn<>("Salaatit", 100);
tcSalaatit.setCellFactory(ChoiceBoxTableCell.forTableColumn(määräVaihtoehdot));
tcSalaatit.setCellValueFactory(new PropertyValueFactory<>("salaatit"));
tcSalaatit.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, Integer> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setSalaatit(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, Integer> tcPääruoat = new MaaraTableColumn<>("Pääruoat", 100);
tcPääruoat.setCellFactory(ChoiceBoxTableCell.forTableColumn(määräVaihtoehdot));
tcPääruoat.setCellValueFactory(new PropertyValueFactory<>("pääruoat"));
tcPääruoat.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, Integer> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setPääruoat(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, Integer> tcJälkiruoat = new MaaraTableColumn<>("Jälkiruoat", 100);
tcJälkiruoat.setCellFactory(ChoiceBoxTableCell.forTableColumn(määräVaihtoehdot));
tcJälkiruoat.setCellValueFactory(new PropertyValueFactory<>("jälkiruoat"));
tcJälkiruoat.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, Integer> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setJälkiruoat(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, String> tcRuokarajoite = new TableColumn<>("Ruokarajoite");
tcRuokarajoite.setMinWidth(200);
tcRuokarajoite.setCellFactory(TextFieldTableCell.forTableColumn());
tcRuokarajoite.setCellValueFactory(new PropertyValueFactory<>("ruokarajoite"));
tcRuokarajoite.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, String> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setRuokarajoite(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, String> tcLisätieto = new TableColumn<>("Lisätieto kuljetukselle");
tcLisätieto.setMinWidth(200);
tcLisätieto.setCellFactory(TextFieldTableCell.forTableColumn());
tcLisätieto.setCellValueFactory(new PropertyValueFactory<>("lisätieto"));
tcLisätieto.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, String> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setLisätieto(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
TableColumn<Kuljetus, String> tcAvainTieto = new TableColumn<>("Avaintieto");
tcAvainTieto.setMinWidth(200);
tcAvainTieto.setCellFactory(TextFieldTableCell.forTableColumn());
tcAvainTieto.setCellValueFactory(new PropertyValueFactory<>("avainTieto"));
tcAvainTieto.setOnEditCommit((TableColumn.CellEditEvent<Kuljetus, String> event) -> {event.getTableView().getItems().get(event.getTablePosition().getRow()).setAvainTieto(event.getNewValue()); tallennusStatus.setText("Tallennettu: Ei");});
tableView.getColumns().addAll(tcNappi, tcNimi, tcOsoite, tcSalaatit, tcPääruoat, tcJälkiruoat, tcRuokarajoite, tcLisätieto, tcAvainTieto);
for (TableColumn<Kuljetus, ?> sarake : tableView.getColumns()) {
sarake.setSortable(false);
sarake.setEditable(true);
sarake.setResizable(true);
sarake.setStyle("-fx-alignment: CENTER; -fx-font-size: 16px;");
}
tcNimi.setEditable(false);
tcNimi.setResizable(false);
}
private void päivitäListanäkymä() {
LocalDate valittuPäivä = datePicker.getValue();
int valittuKierros = kierrosValinta.getValue();
ArrayList<Kuljetus> luetutKuljetuksetKierrokselle = Kuljetus.haePäivänKuljetuksetKierroksella(valittuPäivä, valittuKierros);
ObservableList<Asiakas> kierroksenAsiakkaat = Objects.requireNonNull(Kierros.haeKierros(valittuKierros)).getAsiakkaat();
ArrayList<Kuljetus> näytettävätKuljetukset = new ArrayList<>();
HashSet<Integer> näytettävätAsiakasIDt = new HashSet<>();
//Luodaan kierroksen kuljetusdata kierrosjärjestyksen mukaan
for (Asiakas asiakas : kierroksenAsiakkaat) {
näytettävätKuljetukset.add(new Kuljetus(asiakas, valittuPäivä, valittuKierros));
näytettävätAsiakasIDt.add(asiakas.getId());
}
//Yhdistetään tietokannan data järjestys säilyttäen
for (Kuljetus luettuKuljetus : Objects.requireNonNull(luetutKuljetuksetKierrokselle)) {
if (näytettävätAsiakasIDt.contains(luettuKuljetus.getAsiakasID())) {
for (Kuljetus näytettäväKuljetus : näytettävätKuljetukset) {
if (näytettäväKuljetus.getAsiakasID() == luettuKuljetus.getAsiakasID()) {
näytettävätKuljetukset.set(näytettävätKuljetukset.indexOf(näytettäväKuljetus), luettuKuljetus);
}
}
}
else {
näytettävätKuljetukset.add(luettuKuljetus);
}
}
tableView.setItems(FXCollections.observableArrayList(näytettävätKuljetukset));
tallennusStatus.setText("Tallennettu: Ei");
btnTulosta.setDisable(true);
}
private void poistaRivi() {
Kuljetus valittu = tableView.getSelectionModel().getSelectedItem();
tableView.getItems().remove(valittu);
if (valittu.getId() > 0) {valittu.poista();}
tableView.refresh();
tallennusStatus.setText("Tallennettu: Ei");
}
private void tallennaKierros() {
try {
for (Kuljetus kuljetus : tableView.getItems()) {
if (kuljetus.getId() > 0) {
kuljetus.päivitäTietokantaan();
} else {
kuljetus.tallennaUusi();
}
}
tallennusStatus.setText("Tallennettu: Kyllä");
btnTulosta.setDisable(false);
}
catch (Exception e) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Virhe");
alert.setHeaderText("Tallennus epäonnistui");
alert.setContentText(e.getMessage());
alert.showAndWait();
}
}
private void tulostaLista() {
new KuljetusListaTulostaja().luoKuljetusLista(tableView.getItems(), kierrosValinta.getValue());
}
}
@@ -1,100 +0,0 @@
package fi.lpam.gui;
import fi.lpam.dataluokat.RaporttiRivi;
import fi.lpam.tulostajat.KuljetusRaporttiTulostaja;
import fi.lpam.gui.elementit.PaivamaaraTableCell;
import fi.lpam.gui.elementit.TabPohja;
import javafx.collections.FXCollections;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Objects;
@SuppressWarnings("unchecked")
public class KuljetusRaportit extends TabPohja {
private final TableView<RaporttiRivi> tableView = new TableView<>();
private final DatePicker alkuPvm, loppuPvm;
private ArrayList<RaporttiRivi> raportti;
private final CheckBox tarkka;
void haeRaportti() {
raportti = RaporttiRivi.haeRaportti(alkuPvm.getValue(), loppuPvm.getValue(), tarkka.isSelected());
tableView.setItems(FXCollections.observableArrayList(Objects.requireNonNull(raportti)));
tableView.refresh();
}
void tulostaRaportti() {
new KuljetusRaporttiTulostaja().luoRaportti(raportti, alkuPvm.getValue(), loppuPvm.getValue());
}
public KuljetusRaportit() {
BorderPane root = new BorderPane();
root.setPadding(oletusInsets);
this.getChildren().add(root);
BorderPane yläpalkki = new BorderPane();
root.setTop(yläpalkki);
Label infoTeksti = new Label("Kuljetusraportit. \nTarkka-valinnalla koostetun raportin tulostaminen paperille ei suositeltua.");
infoTeksti.setFont(tekstiFont);
yläpalkki.setLeft(infoTeksti);
HBox yläpalkinNapit = new HBox();
yläpalkinNapit.setAlignment(Pos.CENTER);
yläpalkinNapit.setSpacing(5);
yläpalkki.setRight(yläpalkinNapit);
tarkka = new CheckBox("Tarkka");
alkuPvm = new DatePicker(LocalDate.now().minusDays(LocalDate.now().getDayOfMonth() - 1));
loppuPvm = new DatePicker(LocalDate.now());
Button haeKuljetukset = new Button("Hae");
haeKuljetukset.setFont(buttonFont);
haeKuljetukset.setOnAction(_ ->haeRaportti());
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);
root.setCenter(tableView);
TableColumn<RaporttiRivi, String> tcNimi = new TableColumn<>("Nimi");
tcNimi.setMinWidth(150);
tcNimi.setCellValueFactory(new PropertyValueFactory<>("nimi"));
TableColumn<RaporttiRivi, LocalDate> tcPvm = new TableColumn<>("Päivämäärä");
tcPvm.setMinWidth(150);
tcPvm.setCellFactory(_ ->new PaivamaaraTableCell());
tcPvm.setCellValueFactory(new PropertyValueFactory<>("loppuPvm"));
TableColumn<RaporttiRivi, Integer> tcSalaatit = new TableColumn<>("Salaatit");
tcSalaatit.setMinWidth(100);
tcSalaatit.setCellValueFactory(new PropertyValueFactory<>("salaatit"));
TableColumn<RaporttiRivi, Integer> tcPääruoat = new TableColumn<>("Pääruoat");
tcPääruoat.setMinWidth(100);
tcPääruoat.setCellValueFactory(new PropertyValueFactory<>("pääruoat"));
TableColumn<RaporttiRivi, Integer> tcJälkiruoat = new TableColumn<>("Jälkiruoat");
tcJälkiruoat.setMinWidth(100);
tcJälkiruoat.setCellValueFactory(new PropertyValueFactory<>("jälkiruoat"));
TableColumn<RaporttiRivi, String> tcLisätiedot = new TableColumn<>("Lisätiedot");
tcLisätiedot.setMinWidth(500);
tcLisätiedot.setCellValueFactory(new PropertyValueFactory<>("lisätiedot"));
tableView.getColumns().addAll(tcNimi, tcPvm, tcSalaatit, tcPääruoat, tcJälkiruoat, tcLisätiedot);
tableView.setPlaceholder(new Label("Hae raportti"));
for (TableColumn<RaporttiRivi, ?> sarake : tableView.getColumns()) {
sarake.setSortable(false);
sarake.setEditable(false);
sarake.setResizable(true);
sarake.setStyle("-fx-alignment: CENTER; -fx-font-size: 16px;");
}
}
}
@@ -1,69 +0,0 @@
package fi.lpam.gui.elementit;
import com.dlsc.gemsfx.MultiColumnListView;
import fi.lpam.dataluokat.Asiakas;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
public class AsiakasListCell extends MultiColumnListView.ColumnListCell<Asiakas> {
private final StackPane wrapper;
public AsiakasListCell(MultiColumnListView multiColumnListView) {
//noinspection unchecked
super(multiColumnListView);
this.setHeight(150);
this.setPrefHeight(50);
VBox content = new VBox();
content.visibleProperty().bind(placeholder.not().and(emptyProperty().not()));
content.managedProperty().bind(placeholder.not().and(emptyProperty().not()));
VBox contentPlaceholder = new VBox();
contentPlaceholder.visibleProperty().bind(placeholder);
contentPlaceholder.managedProperty().bind(placeholder);
Label label = new Label();
label.textProperty().bind(textProperty());
wrapper = new StackPane(content, contentPlaceholder, label);
setGraphic(wrapper);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
@Override
protected Node getSnapshotNode() {
return wrapper;
}
private final BooleanProperty placeholder = new SimpleBooleanProperty(this, "placeholder", false);
@Override
protected void updateItem(Asiakas asiakas, boolean empty) {
super.updateItem(asiakas, empty);
placeholder.set(false);
if (asiakas != null && !empty) {
if (asiakas == getMultiColumnListView().getPlaceholderFrom()) {
placeholder.set(true);
setText("");
} else if (asiakas == getMultiColumnListView().getPlaceholderTo()) {
placeholder.set(true);
setText("");
} else {
setText(asiakas.getNimi() + ": " + asiakas.getOsoite());
}
} else {
setText("");
}
}
}
@@ -1,24 +0,0 @@
package fi.lpam.gui.elementit;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
public class IntegerSpinner extends Spinner<Integer> {
/**
* Min 0, Max 50
*/
public IntegerSpinner() {
super(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 50));
this.setEditable(true);
}
/**
*
* @param min _
* @param max _
*/
public IntegerSpinner(int min, int max) {
super(new SpinnerValueFactory.IntegerSpinnerValueFactory(min, max));
this.setEditable(true);
}
}
@@ -1,45 +0,0 @@
package fi.lpam.gui.elementit;
import fi.lpam.dataluokat.Asiakas;
import fi.lpam.dataluokat.Kuljetus;
import fi.lpam.gui.KuljetusListat;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.layout.StackPane;
import java.util.HashMap;
public class KuljetaTableCell extends TableCell<Kuljetus, Boolean> {
private final StackPane paddedNappi = new StackPane();
public KuljetaTableCell(HashMap<Integer, Asiakas> asiakkaat) {
paddedNappi.setPadding(new Insets(3));
Button nappi = new Button("Muuta");
paddedNappi.getChildren().add(nappi);
nappi.setOnMouseClicked(_ -> {
getTableView().getSelectionModel().select(getIndex());
Kuljetus kuljetus = getTableRow().getItem();
if (kuljetus == null) return;
if (kuljetus.kuljetetaan()) {
kuljetus.nollaa();
} else {
kuljetus.palautaMäärät(asiakkaat.get(kuljetus.getAsiakasID()));
}
getTableRow().setItem(new Kuljetus(kuljetus));
KuljetusListat.tallennusStatus.setText("Tallennettu: Ei");
});
}
@Override protected void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(paddedNappi);
} else {
setGraphic(null);
}
}
}
@@ -1,12 +0,0 @@
package fi.lpam.gui.elementit;
import javafx.scene.control.TableColumn;
public class MaaraTableColumn<Asiakas, Integer> extends TableColumn<Asiakas, Integer> {
public MaaraTableColumn(String columnLabel, int minWidth) {
super(columnLabel);
this.setResizable(false);
this.setReorderable(false);
this.setMinWidth(minWidth);
}
}
@@ -1,23 +0,0 @@
package fi.lpam.gui.elementit;
import fi.lpam.dataluokat.RaporttiRivi;
import javafx.scene.control.TableCell;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* Kustomoitu TableCell, joka päivitäTietokantaan sen sisältämän LocalDaten muotoon dd.MM.yyyy
*/
public class PaivamaaraTableCell extends TableCell<RaporttiRivi, LocalDate> {
public PaivamaaraTableCell() {}
@Override
protected void updateItem(LocalDate aika, boolean empty) {
super.updateItem(aika, empty);
if (empty || aika == null) return;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
String muokattuAika = aika.format(formatter);
setText(muokattuAika);
}
}
@@ -1,25 +0,0 @@
package fi.lpam.gui.elementit;
import javafx.geometry.Insets;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
/**
* Käyttöliittymän pohja
*/
public class TabPohja extends StackPane {
public static final Insets oletusInsets = new Insets(5);
public static final String oletusStyle = "-fx-background-color: lightgray;";
public static final Font otsikkoFont = Font.font("Open Sans", FontWeight.BOLD, 18);
public static final Font buttonFont = Font.font("Open Sans", FontWeight.BOLD, 16);
public static final Font tekstiFont = Font.font("Open Sans", FontWeight.NORMAL, 16);
public static final Border oletusBorder = new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, new CornerRadii(5), BorderWidths.DEFAULT));
public TabPohja() {
this.setStyle(oletusStyle);
this.setPadding(oletusInsets);
this.setBorder(oletusBorder);
}
}
@@ -1,8 +0,0 @@
package fi.lpam.gui.virheDialogit;
public class SiirtoVirhe extends TietokantaVirhe{
public SiirtoVirhe(Exception e){
this.setHeaderText("Virhe datan siirrossa");
this.setContentText(e.getMessage());
}
}
@@ -1,20 +0,0 @@
package fi.lpam.gui.virheDialogit;
import fi.lpam.Main;
import javafx.scene.control.Alert;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.util.Objects;
abstract class TietokantaVirhe extends Alert {
public TietokantaVirhe() {
super(AlertType.ERROR);
this.setTitle("Tietokanta");
ImageView sql = new ImageView(new Image(Objects.requireNonNull(Main.class.getResourceAsStream("tietokanta.png"))));
sql.setPreserveRatio(true);
sql.setFitHeight(100);
this.setGraphic(sql);
}
}
@@ -1,8 +0,0 @@
package fi.lpam.gui.virheDialogit;
public class YhteysVirhe extends TietokantaVirhe{
public YhteysVirhe(Exception error){
this.setHeaderText("Virhe yhdistäessä tietokantaan");
this.setContentText(error.getMessage());
}
}