package fi.lpam.ruokamanageri.gui; import fi.lpam.ruokamanageri.dataluokat.Asiakas; import fi.lpam.ruokamanageri.gui.elementit.IntegerSpinner; import fi.lpam.ruokamanageri.gui.elementit.TabPohja; import fi.lpam.ruokamanageri.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.getClassLoader().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); } }