From 0df9da499465712dc6d11d5b7f0dd7026705ecf4 Mon Sep 17 00:00:00 2001
From: Veritorakka <eemeli302@gmail.com>
Date: Wed, 3 May 2023 15:05:00 +0300
Subject: [PATCH] =?UTF-8?q?Tein=20teht=C3=A4v=C3=A4n=201=20kohdan=20A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../fi/utu/tech/ooj/exercise2/Asiakas.java    | 144 ++++++++++++++++++
 .../tech/ooj/exercise2/Asiakasrekisteri.java  |  63 ++++++++
 2 files changed, 207 insertions(+)
 create mode 100644 src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java
 create mode 100644 src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java

diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java
new file mode 100644
index 0000000..f3d1489
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakas.java
@@ -0,0 +1,144 @@
+package fi.utu.tech.ooj.exercise2;
+/**
+ * Asiakas-luokka sisältää tiedot yksittäisestä asiakkaasta.
+ */
+public class Asiakas {
+    private String nimi;
+    private String katuosoite;
+    private String postinumero;
+    private String postitoimipaikka;
+    private String puhelinnumero;
+
+    /**
+     * Luo uuden asiakkaan annetuilla tiedoilla.
+     * @param nimi Asiakkaan nimi.
+     * @param katuosoite Asiakkaan katuosoite.
+     * @param postinumero Asiakkaan postinumero.
+     * @param postitoimipaikka Asiakkaan postitoimipaikka.
+     * @param puhelinnumero Asiakkaan puhelinnumero.
+     */
+    public Asiakas(String nimi, String katuosoite, String postinumero, String postitoimipaikka, String puhelinnumero) {
+        this.nimi = nimi;
+        this.katuosoite = katuosoite;
+        this.postinumero = postinumero;
+        this.postitoimipaikka = postitoimipaikka;
+        this.puhelinnumero = puhelinnumero;
+    }
+
+    /**
+     * Palauttaa asiakkaan nimen.
+     * @return Asiakkaan nimi.
+     */
+    public String getNimi() {
+        return nimi;
+    }
+
+    /**
+     * Palauttaa asiakkaan katuosoitteen.
+     * @return Asiakkaan katuosoite.
+     */
+    public String getKatuosoite() {
+        return katuosoite;
+    }
+
+    /**
+     * Palauttaa asiakkaan postinumeron.
+     * @return Asiakkaan postinumero.
+     */
+    public String getPostinumero() {
+        return postinumero;
+    }
+
+    /**
+     * Palauttaa asiakkaan postitoimipaikan.
+     * @return Asiakkaan postitoimipaikka.
+     */
+    public String getPostitoimipaikka() {
+        return postitoimipaikka;
+    }
+
+    /**
+     * Palauttaa asiakkaan puhelinnumeron.
+     * @return Asiakkaan puhelinnumero.
+     */
+    public String getPuhelinnumero() {
+        return puhelinnumero;
+    }
+
+    /**
+     * Asettaa asiakkaan nimen.
+     * Nimen tulee olla vähintään yhden merkin mittainen.
+     *
+     * @param nimi asiakkaan nimi
+     * @throws IllegalArgumentException jos nimi on null tai tyhjä merkkijono
+     */
+    public void setNimi(String nimi) {
+        if (nimi == null || nimi.isEmpty()) {
+            throw new IllegalArgumentException("Nimi ei voi olla null tai tyhjä merkkijono.");
+        }
+        this.nimi = nimi;
+    }
+
+    /**
+     * Asettaa asiakkaan katuosoitteen.
+     * Katuosoitteen tulee olla vähintään yhden merkin mittainen.
+     *
+     * @param katuosoite asiakkaan katuosoite
+     * @throws IllegalArgumentException jos katuosoite on null tai tyhjä merkkijono
+     */
+    public void setKatuosoite(String katuosoite) {
+        if (katuosoite == null || katuosoite.isEmpty()) {
+            throw new IllegalArgumentException("Katuosoite ei voi olla null tai tyhjä merkkijono.");
+        }
+        this.katuosoite = katuosoite;
+    }
+
+    /**
+    * Asettaa asiakkaan postinumeron. Postinumeron tulee olla tarkalleen viisi numeroa pitkä.
+    *
+    * @param postinumero Asiakkaan postinumero
+    * @throws IllegalArgumentException jos postinumero ei ole tarkalleen viisi numeroa pitkä
+    */
+    public void setPostinumero(String postinumero) {
+        if (postinumero == null || postinumero.length() != 5 || !postinumero.matches("[0-9]+")) {
+        throw new IllegalArgumentException("Postinumeron tulee olla tarkalleen viisi numeroa pitkä.");
+        }
+        this.postinumero = postinumero;
+    } 
+    
+    /**
+     * Asettaa asiakkaan postitoimipaikan.
+     * @param postitoimipaikka Asiakkaan postitoimipaikka
+     */
+    public void setPostitoimipaikka(String postitoimipaikka) {
+        this.postitoimipaikka = postitoimipaikka;
+    }
+
+    /**
+    * Asettaa asiakkaan puhelinnumeron
+    * @param puhelinnumero asiakkaan puhelinnumero, esim. "+358 12 3456789" tai "0123456789"
+    * @throws IllegalArgumentException jos annettu puhelinnumero ei ole kelvollinen suomalainen puhelinnumero
+    */
+    public void setPuhelinnumero(String puhelinnumero) throws IllegalArgumentException {
+        // poistetaan välilyönnit ja muut erikoismerkit numerosta
+        String numero = puhelinnumero.replaceAll("[^0-9+]", "");
+        int pituus = numero.length();
+        if (pituus == 10 && numero.charAt(0) == '0') {
+            // jos puhelinnumero on suomalaisessa muodossa
+            this.puhelinnumero = numero;
+        } else if (pituus == 13 && numero.startsWith("+358")) {
+            // jos puhelinnumero on kansainvälisessä muodossa, muutetaan suuntanumero +358 -> 0
+            this.puhelinnumero = "0" + numero.substring(4);
+        } else {
+            throw new IllegalArgumentException("Virheellinen puhelinnumero: " + puhelinnumero);
+        }
+    }
+}
+
+/*
+ * Perustelut
+ * Asiakkaan tietojen hallinnointi on olennainen osa laskutusohjelman toimintaa, joten erillinen Asiakas-luokka on tarpeellinen.
+ * Asiakas-luokka mahdollistaa asiakastietojen kapseloinnin yhteen paikkaan ja helpottaa niiden käyttöä eri osissa ohjelmaa.
+ * Asiakas-luokkaan voidaan lisätä erilaisia toiminnallisuuksia, kuten esimerkiksi asiakastietojen validointi ja tarkastaminen.
+ * 
+ */
\ No newline at end of file
diff --git a/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java
new file mode 100644
index 0000000..179ce70
--- /dev/null
+++ b/src/main/java/fi/utu/tech/ooj/exercise2/Asiakasrekisteri.java
@@ -0,0 +1,63 @@
+package fi.utu.tech.ooj.exercise2;
+
+import java.util.ArrayList;
+
+/**
+ * Asiakasrekisteri-luokka ylläpitää listaa kaikista asiakkaista.
+ * Se mahdollistaa uusien asiakkaiden lisäämisen rekisteriin sekä
+ * olemassa olevien asiakkaiden hakemisen ja poistamisen rekisteristä.
+ */
+public class Asiakasrekisteri {
+    private ArrayList<Asiakas> asiakkaat;
+
+    /**
+     * Konstruktori luo uuden Asiakasrekisteri-olion.
+     * Asiakaslista alustetaan tyhjäksi.
+     */
+    public Asiakasrekisteri() {
+        this.asiakkaat = new ArrayList<>();
+    }
+
+    /**
+     * Metodi lisää uuden asiakkaan rekisteriin.
+     *
+     * @param asiakas Lisättävä asiakas.
+     */
+    public void lisaaAsiakas(Asiakas asiakas) {
+        asiakkaat.add(asiakas);
+    }
+
+    /**
+     * Metodi hakee asiakkaan annetun nimen perusteella.
+     *
+     * @param nimi Haettavan asiakkaan nimi.
+     * @return Asiakas-olio, jos asiakas löytyy. Muuten null.
+     */
+    public Asiakas haeAsiakas(String nimi) {
+        for (Asiakas asiakas : asiakkaat) {
+            if (asiakas.getNimi().equals(nimi)) {
+                return asiakas;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Metodi poistaa asiakkaan rekisteristä.
+     *
+     * @param asiakas Poistettava asiakas.
+     * @return true, jos poisto onnistui. Muuten false.
+     */
+    public boolean poistaAsiakas(Asiakas asiakas) {
+        return asiakkaat.remove(asiakas);
+    }    
+}
+
+
+/*
+ * Perustelut
+ * Asiakasrekisteri on tarpeellinen, jotta asiakastietoja voidaan hallinnoida tehokkaasti ja niitä voidaan käyttää helposti eri osissa ohjelmaa.
+ * Asiakasrekisteri-luokka mahdollistaa asiakastietojen kapseloinnin yhteen paikkaan ja helpottaa niiden käyttöä eri osissa ohjelmaa.
+ * Asiakasrekisteri-luokkaan voidaan lisätä erilaisia toiminnallisuuksia, kuten esimerkiksi asiakastietojen hakeminen ja muokkaaminen.
+ * 
+ */
\ No newline at end of file
-- 
GitLab