From 779e826c5c1950e3b64a6f7b81f05eed03b613a7 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:31:12 +0700
Subject: [PATCH 01/44] fix: add new relationship between appointment and resep

---
 .../appointment/AppointmentModel.java          | 18 ++++++++++++------
 .../TK/SpringTkApap/resep/ResepModel.java      | 14 +++++++++-----
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
index ac6caef..f98f397 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
@@ -1,21 +1,22 @@
 package spring.TK.SpringTkApap.appointment;
 
 import com.sun.istack.NotNull;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
 import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.format.annotation.DateTimeFormat;
+import spring.TK.SpringTkApap.resep.ResepModel;
 import spring.TK.SpringTkApap.tagihan.TagihanModel;
-import spring.TK.SpringTkApap.user.DokterModel;
-import spring.TK.SpringTkApap.user.PasienModel;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.model.PasienModel;
 
 import javax.persistence.*;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 
-@Data @Entity
+@Setter
+@Getter
+@Entity
 @Table(name = "appointment")
 @NoArgsConstructor
 @AllArgsConstructor
@@ -40,6 +41,11 @@ public class AppointmentModel implements Serializable {
     @OnDelete(action = OnDeleteAction.CASCADE)
     private PasienModel pasien;
 
+    @OneToOne(fetch = FetchType.EAGER)
+    @JoinColumn(name = "id", referencedColumnName = "id")
+    @OnDelete(action = OnDeleteAction.CASCADE)
+    private ResepModel resep;
+
     @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
     private TagihanModel tagihan;
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
index f179bde..b0cce2c 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
@@ -1,21 +1,22 @@
 package spring.TK.SpringTkApap.resep;
 
 import com.sun.istack.NotNull;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
 import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.format.annotation.DateTimeFormat;
+import spring.TK.SpringTkApap.appointment.AppointmentModel;
 import spring.TK.SpringTkApap.jumlah.JumlahModel;
-import spring.TK.SpringTkApap.user.ApotekerModel;
+import spring.TK.SpringTkApap.user.model.ApotekerModel;
 
 import javax.persistence.*;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
 
-@Data @Entity
+@Setter
+@Getter
+@Entity
 @Table(name = "resep")
 @NoArgsConstructor
 @AllArgsConstructor
@@ -37,4 +38,7 @@ public class ResepModel implements Serializable {
 
     @OneToMany(mappedBy = "resep", fetch = FetchType.EAGER)
     private List<JumlahModel> listJumlah;
+
+    @OneToOne(mappedBy = "resep", fetch = FetchType.EAGER)
+    private AppointmentModel appointment;
 }
-- 
GitLab


From 0f84a8481f2fd5f916f9e381f3938f339164cff6 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:32:23 +0700
Subject: [PATCH 02/44] chores: move the all of the model to one package

---
 .../spring/TK/SpringTkApap/user/{ => model}/AdminModel.java     | 2 +-
 .../spring/TK/SpringTkApap/user/{ => model}/ApotekerModel.java  | 2 +-
 .../spring/TK/SpringTkApap/user/{ => model}/DokterModel.java    | 2 +-
 .../spring/TK/SpringTkApap/user/{ => model}/PasienModel.java    | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)
 rename SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/{ => model}/AdminModel.java (87%)
 rename SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/{ => model}/ApotekerModel.java (91%)
 rename SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/{ => model}/DokterModel.java (93%)
 rename SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/{ => model}/PasienModel.java (94%)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/AdminModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/AdminModel.java
similarity index 87%
rename from SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/AdminModel.java
rename to SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/AdminModel.java
index c97325e..d33643c 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/AdminModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/AdminModel.java
@@ -1,4 +1,4 @@
-package spring.TK.SpringTkApap.user;
+package spring.TK.SpringTkApap.user.model;
 
 import lombok.*;
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/ApotekerModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java
similarity index 91%
rename from SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/ApotekerModel.java
rename to SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java
index ae181de..99bd34f 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/ApotekerModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java
@@ -1,4 +1,4 @@
-package spring.TK.SpringTkApap.user;
+package spring.TK.SpringTkApap.user.model;
 
 import lombok.*;
 import spring.TK.SpringTkApap.resep.ResepModel;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/DokterModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
similarity index 93%
rename from SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/DokterModel.java
rename to SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
index 578a65d..9c9d4d4 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/DokterModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
@@ -1,4 +1,4 @@
-package spring.TK.SpringTkApap.user;
+package spring.TK.SpringTkApap.user.model;
 
 import com.sun.istack.NotNull;
 import lombok.*;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/PasienModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
similarity index 94%
rename from SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/PasienModel.java
rename to SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
index b442f53..ce4e6ec 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/PasienModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
@@ -1,4 +1,4 @@
-package spring.TK.SpringTkApap.user;
+package spring.TK.SpringTkApap.user.model;
 
 import com.sun.istack.NotNull;
 import lombok.*;
-- 
GitLab


From d25c2acca0a5931e1b483276f6c8a6a72ce3d0e3 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:33:11 +0700
Subject: [PATCH 03/44] fix: flutter adding intl to dependencies

---
 tk_apap_flutter/pubspec.lock | 7 +++++++
 tk_apap_flutter/pubspec.yaml | 1 +
 2 files changed, 8 insertions(+)

diff --git a/tk_apap_flutter/pubspec.lock b/tk_apap_flutter/pubspec.lock
index 9ea0e42..5ff6c30 100644
--- a/tk_apap_flutter/pubspec.lock
+++ b/tk_apap_flutter/pubspec.lock
@@ -67,6 +67,13 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  intl:
+    dependency: "direct main"
+    description:
+      name: intl
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.17.0"
   lints:
     dependency: transitive
     description:
diff --git a/tk_apap_flutter/pubspec.yaml b/tk_apap_flutter/pubspec.yaml
index 8cba498..95d98d9 100644
--- a/tk_apap_flutter/pubspec.yaml
+++ b/tk_apap_flutter/pubspec.yaml
@@ -36,6 +36,7 @@ dependencies:
   # The following adds the Cupertino Icons font to your application.
   # Use with the CupertinoIcons class for iOS style icons.
   cupertino_icons: ^1.0.2
+  intl: ^0.17.0
 
 dev_dependencies:
   flutter_test:
-- 
GitLab


From c041c39188816b84e69a275abe609c48f914308c Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:34:01 +0700
Subject: [PATCH 04/44] feat: create appointment spring (not finished)

---
 .../appointment/AppointmentController.java    | 36 +++++++++++++++
 .../appointment/AppointmentDB.java            | 15 ++++++
 .../appointment/AppointmentService.java       | 14 ++++++
 .../appointment/AppointmentServiceImpl.java   | 46 +++++++++++++++++++
 4 files changed, 111 insertions(+)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
new file mode 100644
index 0000000..437a75f
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -0,0 +1,36 @@
+package spring.TK.SpringTkApap.appointment;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+import spring.TK.SpringTkApap.user.service.DokterService;
+import spring.TK.SpringTkApap.user.service.PasienService;
+
+import java.util.List;
+
+@Controller
+public class AppointmentController {
+
+    @Autowired
+    AppointmentService appointmentService;
+
+    @Autowired
+    DokterService dokterService;
+
+    @Autowired
+    PasienService pasienService;
+
+    @GetMapping("/appointment/add/{noPasien}")
+    private String addAppointment(@PathVariable(name = "noPasien") String noPasien, Model model) {
+        List<DokterModel> listDokter = dokterService.getAll();
+        PasienModel pasien = pasienService.getPasien(noPasien);
+
+        model.addAttribute("listDokter", listDokter);
+        model.addAttribute("pasien", pasien);
+        return "add-appointment";
+    }
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
new file mode 100644
index 0000000..7191697
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
@@ -0,0 +1,15 @@
+package spring.TK.SpringTkApap.appointment;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+
+import java.time.LocalDateTime;
+import java.util.Optional;
+
+@Repository
+public interface AppointmentDB extends JpaRepository<AppointmentModel, String> {
+    Optional<AppointmentModel> findByKode(String kode);
+
+    Optional<AppointmentModel> findByDokterAndWaktuAwalBetween(DokterModel dokter, LocalDateTime waktuAwal, LocalDateTime waktuAkhir);
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
new file mode 100644
index 0000000..6c71b30
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
@@ -0,0 +1,14 @@
+package spring.TK.SpringTkApap.appointment;
+
+import java.util.List;
+
+public interface AppointmentService {
+
+    AppointmentModel addAppointment(AppointmentModel appointment);
+
+    AppointmentModel getAppointment(String kode);
+
+    List<AppointmentModel> getAll();
+
+    void deleteAppointment(AppointmentModel appointment);
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
new file mode 100644
index 0000000..43fa0a7
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
@@ -0,0 +1,46 @@
+package spring.TK.SpringTkApap.appointment;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class AppointmentServiceImpl implements AppointmentService{
+
+    @Autowired
+    AppointmentDB appointmentDB;
+
+    @Override
+    public AppointmentModel addAppointment(AppointmentModel appointment) {
+        String kode = "APT" + appointmentDB.count();
+
+        Optional<AppointmentModel> isExist = appointmentDB.findByDokterAndWaktuAwalBetween(appointment.getDokter(), appointment.getWaktuAwal(), appointment.getWaktuAwal().plusHours(1));
+        if (isExist.isEmpty()) {
+            return null;
+        }
+
+        appointment.setIsDone(Boolean.FALSE);
+        appointment.setKode(kode);
+        return appointmentDB.save(appointment);
+    }
+
+    @Override
+    public AppointmentModel getAppointment(String kode) {
+        Optional<AppointmentModel> anAppoint = appointmentDB.findByKode(kode);
+        return anAppoint.orElse(null);
+    }
+
+    @Override
+    public List<AppointmentModel> getAll() {
+        return appointmentDB.findAll();
+    }
+
+    @Override
+    public void deleteAppointment(AppointmentModel appointment) {
+        appointmentDB.delete(appointment);
+    }
+}
-- 
GitLab


From b4165680d125c0206b9ac2a67f96ac9404ef9c84 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:34:10 +0700
Subject: [PATCH 05/44] feat: create appointment flutter (not finished)

---
 .../lib/src/pages/createAppointment.dart      | 42 +++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100644 tk_apap_flutter/lib/src/pages/createAppointment.dart

diff --git a/tk_apap_flutter/lib/src/pages/createAppointment.dart b/tk_apap_flutter/lib/src/pages/createAppointment.dart
new file mode 100644
index 0000000..c528665
--- /dev/null
+++ b/tk_apap_flutter/lib/src/pages/createAppointment.dart
@@ -0,0 +1,42 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class CreateAppointment extends StatefulWidget {
+  const CreateAppointment({Key? key}) : super(key: key);
+
+  @override
+  State<CreateAppointment> createState() => _CreateAppointmentState();
+}
+
+class _CreateAppointmentState extends State<CreateAppointment> {
+  // Data yang diperlukan tanggal dan waktu, dropdown [namaDokter - Tarif]
+
+  DateTime dateTime = DateTime.now();
+
+  // Key for validation
+  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
+
+  // Widget for field
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        appBar: AppBar(title: Text("Form Demo")),
+        body: Container(
+          margin: EdgeInsets.all(24),
+          child: Form(
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: <Widget>[
+                // list of all widget stated before
+                SizedBox(height: 100),
+                ElevatedButton(
+                  onPressed: () {},
+                  child: const Text('Submit'),
+                ),
+              ],
+            ),
+          ),
+        ));
+  }
+}
-- 
GitLab


From 2154ab6919cd4b5afb582c5bb0958d43a5f4c53d Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:34:49 +0700
Subject: [PATCH 06/44] feat: create pasien repo and service

---
 .../user/repository/DokterDB.java             |  9 +++++
 .../user/repository/PasienDB.java             |  9 +++++
 .../user/service/DokterService.java           | 19 +++++++++
 .../user/service/DokterServiceImpl.java       | 40 +++++++++++++++++++
 .../user/service/PasienService.java           | 16 ++++++++
 .../user/service/PasienServiceImpl.java       | 39 ++++++++++++++++++
 6 files changed, 132 insertions(+)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
new file mode 100644
index 0000000..c31a304
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
@@ -0,0 +1,9 @@
+package spring.TK.SpringTkApap.user.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+
+@Repository
+public interface DokterDB extends JpaRepository<DokterModel, String> {
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
new file mode 100644
index 0000000..6be4362
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
@@ -0,0 +1,9 @@
+package spring.TK.SpringTkApap.user.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+
+@Repository
+public interface PasienDB extends JpaRepository<PasienModel, String> {
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
new file mode 100644
index 0000000..0c8ea7a
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
@@ -0,0 +1,19 @@
+package spring.TK.SpringTkApap.user.service;
+
+import spring.TK.SpringTkApap.appointment.AppointmentModel;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+
+import java.util.List;
+
+public interface DokterService {
+
+    DokterModel addDokter(DokterModel dokter);
+
+    List<DokterModel> getAll();
+
+    DokterModel getDokter(String uuid);
+
+    void deleteDokter(DokterModel dokter);
+
+
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
new file mode 100644
index 0000000..69cdb91
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
@@ -0,0 +1,40 @@
+package spring.TK.SpringTkApap.user.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.repository.DokterDB;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class DokterServiceImpl implements DokterService{
+
+    @Autowired
+    DokterDB dokterDB;
+
+    @Override
+    public DokterModel addDokter(DokterModel dokter) {
+        dokterDB.save(dokter);
+        return null;
+    }
+
+    @Override
+    public List<DokterModel> getAll() {
+        return dokterDB.findAll();
+    }
+
+    @Override
+    public DokterModel getDokter(String uuid) {
+        Optional<DokterModel> dokter = dokterDB.findById(uuid);
+        return dokter.orElse(null);
+    }
+
+    @Override
+    public void deleteDokter(DokterModel dokter) {
+        dokterDB.delete(dokter);
+    }
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
new file mode 100644
index 0000000..65e08d0
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
@@ -0,0 +1,16 @@
+package spring.TK.SpringTkApap.user.service;
+
+import spring.TK.SpringTkApap.user.model.PasienModel;
+
+import java.util.List;
+
+public interface PasienService {
+
+    PasienModel addPasien(PasienModel pasien);
+
+    PasienModel getPasien(String uuid);
+
+    List<PasienModel> getAll();
+
+    void deletePasien(PasienModel pasien);
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
new file mode 100644
index 0000000..eb15ad3
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
@@ -0,0 +1,39 @@
+package spring.TK.SpringTkApap.user.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+import spring.TK.SpringTkApap.user.repository.PasienDB;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class PasienServiceImpl implements PasienService {
+
+    @Autowired
+    PasienDB pasienDB;
+
+    @Override
+    public PasienModel addPasien(PasienModel pasien) {
+        return pasienDB.save(pasien);
+    }
+
+    @Override
+    public PasienModel getPasien(String uuid) {
+        Optional<PasienModel> pasien = pasienDB.findById(uuid);
+        return pasien.orElse(null);
+    }
+
+    @Override
+    public List<PasienModel> getAll() {
+        return pasienDB.findAll();
+    }
+
+    @Override
+    public void deletePasien(PasienModel pasien) {
+        pasienDB.delete(pasien);
+    }
+}
-- 
GitLab


From 4f013926e0b6334af347658da31248a907e822ab Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:36:14 +0700
Subject: [PATCH 07/44] feat: create pasien repo and service

---
 .../user/repository/PasienDB.java             |  9 -----
 .../user/service/PasienService.java           | 16 --------
 .../user/service/PasienServiceImpl.java       | 39 -------------------
 3 files changed, 64 deletions(-)
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
deleted file mode 100644
index 6be4362..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package spring.TK.SpringTkApap.user.repository;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-import spring.TK.SpringTkApap.user.model.PasienModel;
-
-@Repository
-public interface PasienDB extends JpaRepository<PasienModel, String> {
-}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
deleted file mode 100644
index 65e08d0..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package spring.TK.SpringTkApap.user.service;
-
-import spring.TK.SpringTkApap.user.model.PasienModel;
-
-import java.util.List;
-
-public interface PasienService {
-
-    PasienModel addPasien(PasienModel pasien);
-
-    PasienModel getPasien(String uuid);
-
-    List<PasienModel> getAll();
-
-    void deletePasien(PasienModel pasien);
-}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
deleted file mode 100644
index eb15ad3..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package spring.TK.SpringTkApap.user.service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import spring.TK.SpringTkApap.user.model.PasienModel;
-import spring.TK.SpringTkApap.user.repository.PasienDB;
-
-import javax.transaction.Transactional;
-import java.util.List;
-import java.util.Optional;
-
-@Service
-@Transactional
-public class PasienServiceImpl implements PasienService {
-
-    @Autowired
-    PasienDB pasienDB;
-
-    @Override
-    public PasienModel addPasien(PasienModel pasien) {
-        return pasienDB.save(pasien);
-    }
-
-    @Override
-    public PasienModel getPasien(String uuid) {
-        Optional<PasienModel> pasien = pasienDB.findById(uuid);
-        return pasien.orElse(null);
-    }
-
-    @Override
-    public List<PasienModel> getAll() {
-        return pasienDB.findAll();
-    }
-
-    @Override
-    public void deletePasien(PasienModel pasien) {
-        pasienDB.delete(pasien);
-    }
-}
-- 
GitLab


From c2d08d8c4058d68975da0103ec1894e5416310e7 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:36:24 +0700
Subject: [PATCH 08/44] feat: create dokter repo and service

---
 .../user/repository/DokterDB.java             |  9 -----
 .../user/service/DokterService.java           | 19 ---------
 .../user/service/DokterServiceImpl.java       | 40 -------------------
 3 files changed, 68 deletions(-)
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
deleted file mode 100644
index c31a304..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package spring.TK.SpringTkApap.user.repository;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-import spring.TK.SpringTkApap.user.model.DokterModel;
-
-@Repository
-public interface DokterDB extends JpaRepository<DokterModel, String> {
-}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
deleted file mode 100644
index 0c8ea7a..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package spring.TK.SpringTkApap.user.service;
-
-import spring.TK.SpringTkApap.appointment.AppointmentModel;
-import spring.TK.SpringTkApap.user.model.DokterModel;
-
-import java.util.List;
-
-public interface DokterService {
-
-    DokterModel addDokter(DokterModel dokter);
-
-    List<DokterModel> getAll();
-
-    DokterModel getDokter(String uuid);
-
-    void deleteDokter(DokterModel dokter);
-
-
-}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
deleted file mode 100644
index 69cdb91..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package spring.TK.SpringTkApap.user.service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import spring.TK.SpringTkApap.user.model.DokterModel;
-import spring.TK.SpringTkApap.user.repository.DokterDB;
-
-import javax.transaction.Transactional;
-import java.util.List;
-import java.util.Optional;
-
-@Service
-@Transactional
-public class DokterServiceImpl implements DokterService{
-
-    @Autowired
-    DokterDB dokterDB;
-
-    @Override
-    public DokterModel addDokter(DokterModel dokter) {
-        dokterDB.save(dokter);
-        return null;
-    }
-
-    @Override
-    public List<DokterModel> getAll() {
-        return dokterDB.findAll();
-    }
-
-    @Override
-    public DokterModel getDokter(String uuid) {
-        Optional<DokterModel> dokter = dokterDB.findById(uuid);
-        return dokter.orElse(null);
-    }
-
-    @Override
-    public void deleteDokter(DokterModel dokter) {
-        dokterDB.delete(dokter);
-    }
-}
-- 
GitLab


From a9dd0655b9a828b2f38f7a06be52896defcf4614 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:43:42 +0700
Subject: [PATCH 09/44] feat: create dokter repo and service

---
 .../user/repository/DokterDB.java             |  9 +++++
 .../user/service/DokterService.java           | 19 +++++++++
 .../user/service/DokterServiceImpl.java       | 40 +++++++++++++++++++
 3 files changed, 68 insertions(+)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
new file mode 100644
index 0000000..c31a304
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
@@ -0,0 +1,9 @@
+package spring.TK.SpringTkApap.user.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+
+@Repository
+public interface DokterDB extends JpaRepository<DokterModel, String> {
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
new file mode 100644
index 0000000..0c8ea7a
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
@@ -0,0 +1,19 @@
+package spring.TK.SpringTkApap.user.service;
+
+import spring.TK.SpringTkApap.appointment.AppointmentModel;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+
+import java.util.List;
+
+public interface DokterService {
+
+    DokterModel addDokter(DokterModel dokter);
+
+    List<DokterModel> getAll();
+
+    DokterModel getDokter(String uuid);
+
+    void deleteDokter(DokterModel dokter);
+
+
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
new file mode 100644
index 0000000..69cdb91
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
@@ -0,0 +1,40 @@
+package spring.TK.SpringTkApap.user.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.repository.DokterDB;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class DokterServiceImpl implements DokterService{
+
+    @Autowired
+    DokterDB dokterDB;
+
+    @Override
+    public DokterModel addDokter(DokterModel dokter) {
+        dokterDB.save(dokter);
+        return null;
+    }
+
+    @Override
+    public List<DokterModel> getAll() {
+        return dokterDB.findAll();
+    }
+
+    @Override
+    public DokterModel getDokter(String uuid) {
+        Optional<DokterModel> dokter = dokterDB.findById(uuid);
+        return dokter.orElse(null);
+    }
+
+    @Override
+    public void deleteDokter(DokterModel dokter) {
+        dokterDB.delete(dokter);
+    }
+}
-- 
GitLab


From 8f80011a5ca8b09f8e29fc502dd09413d0fd4838 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 16 Nov 2022 10:43:54 +0700
Subject: [PATCH 10/44] feat: create pasien repo and service

---
 .../user/repository/PasienDB.java             |  9 +++++
 .../user/service/PasienService.java           | 16 ++++++++
 .../user/service/PasienServiceImpl.java       | 39 +++++++++++++++++++
 3 files changed, 64 insertions(+)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
new file mode 100644
index 0000000..6be4362
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
@@ -0,0 +1,9 @@
+package spring.TK.SpringTkApap.user.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+
+@Repository
+public interface PasienDB extends JpaRepository<PasienModel, String> {
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
new file mode 100644
index 0000000..65e08d0
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
@@ -0,0 +1,16 @@
+package spring.TK.SpringTkApap.user.service;
+
+import spring.TK.SpringTkApap.user.model.PasienModel;
+
+import java.util.List;
+
+public interface PasienService {
+
+    PasienModel addPasien(PasienModel pasien);
+
+    PasienModel getPasien(String uuid);
+
+    List<PasienModel> getAll();
+
+    void deletePasien(PasienModel pasien);
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
new file mode 100644
index 0000000..eb15ad3
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
@@ -0,0 +1,39 @@
+package spring.TK.SpringTkApap.user.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+import spring.TK.SpringTkApap.user.repository.PasienDB;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class PasienServiceImpl implements PasienService {
+
+    @Autowired
+    PasienDB pasienDB;
+
+    @Override
+    public PasienModel addPasien(PasienModel pasien) {
+        return pasienDB.save(pasien);
+    }
+
+    @Override
+    public PasienModel getPasien(String uuid) {
+        Optional<PasienModel> pasien = pasienDB.findById(uuid);
+        return pasien.orElse(null);
+    }
+
+    @Override
+    public List<PasienModel> getAll() {
+        return pasienDB.findAll();
+    }
+
+    @Override
+    public void deletePasien(PasienModel pasien) {
+        pasienDB.delete(pasien);
+    }
+}
-- 
GitLab


From 9960a371b83443014b880070fb2e379e5815f597 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 14:09:07 +0700
Subject: [PATCH 11/44] chores: add http dependencies

---
 tk_apap_flutter/pubspec.lock | 21 +++++++++++++++++++++
 tk_apap_flutter/pubspec.yaml |  2 ++
 2 files changed, 23 insertions(+)

diff --git a/tk_apap_flutter/pubspec.lock b/tk_apap_flutter/pubspec.lock
index 5ff6c30..4261944 100644
--- a/tk_apap_flutter/pubspec.lock
+++ b/tk_apap_flutter/pubspec.lock
@@ -67,6 +67,20 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  http:
+    dependency: "direct main"
+    description:
+      name: http
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.13.5"
+  http_parser:
+    dependency: transitive
+    description:
+      name: http_parser
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.0.2"
   intl:
     dependency: "direct main"
     description:
@@ -156,6 +170,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.4.12"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.3.1"
   vector_math:
     dependency: transitive
     description:
diff --git a/tk_apap_flutter/pubspec.yaml b/tk_apap_flutter/pubspec.yaml
index 95d98d9..756f6e7 100644
--- a/tk_apap_flutter/pubspec.yaml
+++ b/tk_apap_flutter/pubspec.yaml
@@ -29,6 +29,8 @@ environment:
 # the latest version available on pub.dev. To see which dependencies have newer
 # versions available, run `flutter pub outdated`.
 dependencies:
+  http:
+    ^0.13.5
   flutter:
     sdk: flutter
 
-- 
GitLab


From cc1ccdd9f726474159121792c4cd469d7e451aa6 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 14:09:33 +0700
Subject: [PATCH 12/44] chores: add http dependencies

---
 tk_apap_flutter/android/app/src/main/AndroidManifest.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tk_apap_flutter/android/app/src/main/AndroidManifest.xml b/tk_apap_flutter/android/app/src/main/AndroidManifest.xml
index 68910a7..5518531 100644
--- a/tk_apap_flutter/android/app/src/main/AndroidManifest.xml
+++ b/tk_apap_flutter/android/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.example.tk_apap_flutter">
+    <uses-permission android:name="android.permission.INTERNET"/>
    <application
         android:label="tk_apap_flutter"
         android:name="${applicationName}"
-- 
GitLab


From 632935ed9f26d0e64aadb847df5cc5fcfbb3efc7 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 14:11:45 +0700
Subject: [PATCH 13/44] feat: flutter appointment pages

---
 tk_apap_flutter/lib/DTO/Appointment.dart      |   8 ++
 tk_apap_flutter/lib/DTO/Dokter.dart           |   9 ++
 tk_apap_flutter/lib/main.dart                 |   7 +-
 .../lib/pages/createAppointment.dart          | 105 ++++++++++++++++++
 .../lib/src/pages/createAppointment.dart      |  42 -------
 5 files changed, 128 insertions(+), 43 deletions(-)
 create mode 100644 tk_apap_flutter/lib/DTO/Appointment.dart
 create mode 100644 tk_apap_flutter/lib/DTO/Dokter.dart
 create mode 100644 tk_apap_flutter/lib/pages/createAppointment.dart
 delete mode 100644 tk_apap_flutter/lib/src/pages/createAppointment.dart

diff --git a/tk_apap_flutter/lib/DTO/Appointment.dart b/tk_apap_flutter/lib/DTO/Appointment.dart
new file mode 100644
index 0000000..2334cf2
--- /dev/null
+++ b/tk_apap_flutter/lib/DTO/Appointment.dart
@@ -0,0 +1,8 @@
+import 'package:tk_apap_flutter/DTO/Dokter.dart';
+
+class Appointment {
+  DateTime waktuAwal = DateTime.now();
+  Dokter dokter = Dokter();
+
+  Appointment();
+}
\ No newline at end of file
diff --git a/tk_apap_flutter/lib/DTO/Dokter.dart b/tk_apap_flutter/lib/DTO/Dokter.dart
new file mode 100644
index 0000000..fa21ae5
--- /dev/null
+++ b/tk_apap_flutter/lib/DTO/Dokter.dart
@@ -0,0 +1,9 @@
+class Dokter {
+  String nama = '';
+  String username = '';
+  int tagihan = 0;
+
+  Dokter();
+
+  Dokter.createDokter(this.nama, this.username, this.tagihan);
+}
\ No newline at end of file
diff --git a/tk_apap_flutter/lib/main.dart b/tk_apap_flutter/lib/main.dart
index e016029..2a386a0 100644
--- a/tk_apap_flutter/lib/main.dart
+++ b/tk_apap_flutter/lib/main.dart
@@ -1,4 +1,5 @@
 import 'package:flutter/material.dart';
+import 'package:tk_apap_flutter/pages/createAppointment.dart';
 
 void main() {
   runApp(const MyApp());
@@ -106,7 +107,11 @@ class _MyHomePageState extends State<MyHomePage> {
         ),
       ),
       floatingActionButton: FloatingActionButton(
-        onPressed: _incrementCounter,
+        onPressed: () {
+          Navigator.push(
+            context, MaterialPageRoute(builder: (context) => const CreateAppointment()),
+          );
+        },
         tooltip: 'Increment',
         child: const Icon(Icons.add),
       ), // This trailing comma makes auto-formatting nicer for build methods.
diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/createAppointment.dart
new file mode 100644
index 0000000..5bbe687
--- /dev/null
+++ b/tk_apap_flutter/lib/pages/createAppointment.dart
@@ -0,0 +1,105 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:http/http.dart' as http;
+import 'package:intl/intl.dart';
+import '../DTO/Appointment.dart';
+import '../DTO/Dokter.dart';
+
+class CreateAppointment extends StatefulWidget {
+  const CreateAppointment({Key? key}) : super(key: key);
+
+  @override
+  State<CreateAppointment> createState() => _CreateAppointmentState();
+}
+
+class _CreateAppointmentState extends State<CreateAppointment> {
+  // Data yang diperlukan tanggal dan waktu, dropdown [namaDokter - Tarif]
+
+  final dateCtl = TextEditingController();
+  String dropdownValue = 'Arga';
+  DateTime dateTime = DateTime.now();
+  DateTime ansDateTime = DateTime.now();
+  var uri = Uri.http('localhost:8080', '/');
+
+  // Form state
+  final _appointment = Appointment();
+
+  // Key for validation
+  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
+
+  @override
+  void dispose() {
+    dateCtl.dispose();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+
+    return Scaffold(
+        appBar: AppBar(title: const Text("Buat Appointment")),
+        body: Container(
+          margin: const EdgeInsets.all(24),
+          child: Form(
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: <Widget>[
+                TextFormField(
+                  controller: dateCtl,
+                  onTap: () async {
+                    FocusScope.of(context).requestFocus(FocusNode());
+                    await pickDateTime();
+                    dateCtl.text = DateFormat("yyyy/MM/dd HH:mm").format(ansDateTime);
+                  },
+                ),
+                DropdownButton(
+                    items: const [
+                      DropdownMenuItem(value: 'Arga', child: Text("DokterArga")),
+                      DropdownMenuItem(value: 'Ludi', child: Text("DokterLudi")),
+                      DropdownMenuItem(value: "Nahda", child: Text("DokterNahda"))
+                    ],
+                    value: dropdownValue,
+                    isExpanded: true,
+                    onChanged: (value) async {
+                      setState(() {
+                        dropdownValue = value!;
+                      });
+                    } ),
+                ElevatedButton(
+                  onPressed: () {},
+                  child: const Text('Submit'),
+                ),
+              ],
+            ),
+          ),
+        ));
+  }
+
+  Future<DateTime?> pickDate() => showDatePicker(
+      context: context,
+      initialDate: dateTime,
+      firstDate: dateTime,
+      lastDate: DateTime(2023));
+
+  Future<TimeOfDay?> pickTime() => showTimePicker(
+      context: context,
+      initialTime: TimeOfDay(hour: dateTime.hour, minute: dateTime.minute));
+
+  Future pickDateTime() async {
+    DateTime? date = await pickDate();
+    if (date == null) return;
+
+    TimeOfDay? time = await pickTime();
+    if (time == null) return;
+
+    final dateTime = DateTime(
+      date.year,
+      date.month,
+      date.day,
+      time.hour,
+      time.minute,
+    );
+    setState(() => _appointment.waktuAwal = dateTime);
+    setState(() => {ansDateTime = dateTime});
+  }
+}
diff --git a/tk_apap_flutter/lib/src/pages/createAppointment.dart b/tk_apap_flutter/lib/src/pages/createAppointment.dart
deleted file mode 100644
index c528665..0000000
--- a/tk_apap_flutter/lib/src/pages/createAppointment.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-
-class CreateAppointment extends StatefulWidget {
-  const CreateAppointment({Key? key}) : super(key: key);
-
-  @override
-  State<CreateAppointment> createState() => _CreateAppointmentState();
-}
-
-class _CreateAppointmentState extends State<CreateAppointment> {
-  // Data yang diperlukan tanggal dan waktu, dropdown [namaDokter - Tarif]
-
-  DateTime dateTime = DateTime.now();
-
-  // Key for validation
-  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
-
-  // Widget for field
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-        appBar: AppBar(title: Text("Form Demo")),
-        body: Container(
-          margin: EdgeInsets.all(24),
-          child: Form(
-            child: Column(
-              mainAxisAlignment: MainAxisAlignment.center,
-              children: <Widget>[
-                // list of all widget stated before
-                SizedBox(height: 100),
-                ElevatedButton(
-                  onPressed: () {},
-                  child: const Text('Submit'),
-                ),
-              ],
-            ),
-          ),
-        ));
-  }
-}
-- 
GitLab


From 2c263e92deb0e5410c780168af4ec7aa02511362 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 15:56:39 +0700
Subject: [PATCH 14/44] feat: create rest service and controller for
 appointmnent

---
 .../AppointmentRestController.java            | 47 +++++++++++++++++++
 .../appointment/AppointmentRestService.java   | 10 ++++
 .../AppointmentRestServiceImpl.java           | 44 +++++++++++++++++
 3 files changed, 101 insertions(+)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
new file mode 100644
index 0000000..94dd38b
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -0,0 +1,47 @@
+package spring.TK.SpringTkApap.appointment;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+@RestController
+@RequestMapping("/api/appointment")
+public class AppointmentRestController {
+
+    @Autowired
+    private AppointmentRestService appointmentRestService;
+
+    @PostMapping(value = "/create")
+    private AppointmentModel createAppointmentSubmit(@RequestBody AppointmentModel appointment, BindingResult bindingResult) {
+        if (bindingResult.hasFieldErrors()) {
+            throw new ResponseStatusException(
+                    HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
+            );
+        } else {
+            return appointmentRestService.createAppointment(appointment);
+        }
+    }
+
+    @GetMapping(value ="/{kode}")
+    private AppointmentModel getAppointment(@PathVariable(name = "kode") String kode) {
+        try {
+            return appointmentRestService.getAppointment(kode);
+        } catch (NoSuchElementException e) {
+            throw new ResponseStatusException(
+                    HttpStatus.NOT_FOUND, "Appointment " + kode + " tidak ditemukan."
+            );
+        }
+    }
+
+    @GetMapping(value = "/all")
+    private List<AppointmentModel> getAllAppointment() {
+        return appointmentRestService.retrieveAppointment();
+    }
+
+
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
new file mode 100644
index 0000000..f6863fd
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
@@ -0,0 +1,10 @@
+package spring.TK.SpringTkApap.appointment;
+
+import java.util.List;
+
+public interface AppointmentRestService {
+    AppointmentModel createAppointment(AppointmentModel appointment);
+    List<AppointmentModel> retrieveAppointment();
+    AppointmentModel getAppointment(String kode);
+    AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate);
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
new file mode 100644
index 0000000..2605a17
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -0,0 +1,44 @@
+package spring.TK.SpringTkApap.appointment;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class AppointmentRestServiceImpl implements AppointmentRestService{
+
+    @Autowired
+    AppointmentDB appointmentDB;
+
+    @Override
+    public AppointmentModel createAppointment(AppointmentModel appointment) {
+        return appointmentDB.save(appointment);
+    }
+
+    @Override
+    public List<AppointmentModel> retrieveAppointment() {
+        return appointmentDB.findAll();
+    }
+
+    @Override
+    public AppointmentModel getAppointment(String kode) {
+        Optional<AppointmentModel> appointment = appointmentDB.findByKode(kode);
+        if (appointment.isPresent()) {
+            return appointment.get();
+        }
+        throw new NoSuchElementException();
+    }
+
+    @Override
+    public AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate) {
+        AppointmentModel appointment =getAppointment(kode);
+        appointment.setIsDone(appointmentUpdate.getIsDone());
+        return appointment;
+    }
+
+}
-- 
GitLab


From b6fc79ed9f4696305d89c0e46c9faf9bd12dbef2 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 17:45:26 +0700
Subject: [PATCH 15/44] feat: implement rest api create appointment

---
 .../appointment/AppointmentModel.java         |  1 +
 .../TK/SpringTkApap/resep/ResepModel.java     |  2 +
 .../user/model/ApotekerModel.java             |  2 +
 .../SpringTkApap/user/model/DokterModel.java  |  2 +
 .../SpringTkApap/user/model/PasienModel.java  |  2 +
 .../src/main/resources/application.properties |  2 +-
 .../lib/src/pages/createAppointment.dart      | 42 -------------------
 7 files changed, 10 insertions(+), 43 deletions(-)
 delete mode 100644 tk_apap_flutter/lib/src/pages/createAppointment.dart

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
index f98f397..8314fa5 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
@@ -1,5 +1,6 @@
 package spring.TK.SpringTkApap.appointment;
 
+import com.fasterxml.jackson.annotation.JsonBackReference;
 import com.sun.istack.NotNull;
 import lombok.*;
 import org.hibernate.annotations.OnDelete;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
index b0cce2c..72441a9 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
@@ -1,5 +1,6 @@
 package spring.TK.SpringTkApap.resep;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.sun.istack.NotNull;
 import lombok.*;
 import org.hibernate.annotations.OnDelete;
@@ -40,5 +41,6 @@ public class ResepModel implements Serializable {
     private List<JumlahModel> listJumlah;
 
     @OneToOne(mappedBy = "resep", fetch = FetchType.EAGER)
+    @JsonIgnore
     private AppointmentModel appointment;
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java
index 99bd34f..f662daa 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/ApotekerModel.java
@@ -1,5 +1,6 @@
 package spring.TK.SpringTkApap.user.model;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.*;
 import spring.TK.SpringTkApap.resep.ResepModel;
 import spring.TK.SpringTkApap.auth.model.UserModel;
@@ -18,6 +19,7 @@ import java.util.List;
 public class ApotekerModel extends UserModel {
 
     @OneToMany(mappedBy = "apoteker", fetch = FetchType.LAZY)
+    @JsonIgnore
     private List<ResepModel> listResep;
 
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
index 9c9d4d4..690fd73 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
@@ -1,5 +1,6 @@
 package spring.TK.SpringTkApap.user.model;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.sun.istack.NotNull;
 import lombok.*;
 import spring.TK.SpringTkApap.appointment.AppointmentModel;
@@ -20,5 +21,6 @@ public class DokterModel extends UserModel {
     private Integer tarif = 0;
 
     @OneToMany(mappedBy = "dokter", fetch = FetchType.EAGER)
+    @JsonIgnore
     private List<AppointmentModel> listAppointment;
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
index ce4e6ec..c6b792b 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
@@ -1,5 +1,6 @@
 package spring.TK.SpringTkApap.user.model;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.sun.istack.NotNull;
 import lombok.*;
 import spring.TK.SpringTkApap.appointment.AppointmentModel;
@@ -23,5 +24,6 @@ public class PasienModel extends UserModel {
     private Integer umur;
 
     @OneToMany(mappedBy = "pasien", fetch = FetchType.LAZY)
+    @JsonIgnore
     private List<AppointmentModel> listAppointment;
 }
diff --git a/SpringTkApap/src/main/resources/application.properties b/SpringTkApap/src/main/resources/application.properties
index 573f30a..8b4c16d 100644
--- a/SpringTkApap/src/main/resources/application.properties
+++ b/SpringTkApap/src/main/resources/application.properties
@@ -9,7 +9,7 @@ spring.datasource.password=
 
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
 
-spring.jpa.hibernate.ddl-auto=create
+spring.jpa.hibernate.ddl-auto=update
 
 spring.main.allow-circular-references=true
 
diff --git a/tk_apap_flutter/lib/src/pages/createAppointment.dart b/tk_apap_flutter/lib/src/pages/createAppointment.dart
deleted file mode 100644
index c528665..0000000
--- a/tk_apap_flutter/lib/src/pages/createAppointment.dart
+++ /dev/null
@@ -1,42 +0,0 @@
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-
-class CreateAppointment extends StatefulWidget {
-  const CreateAppointment({Key? key}) : super(key: key);
-
-  @override
-  State<CreateAppointment> createState() => _CreateAppointmentState();
-}
-
-class _CreateAppointmentState extends State<CreateAppointment> {
-  // Data yang diperlukan tanggal dan waktu, dropdown [namaDokter - Tarif]
-
-  DateTime dateTime = DateTime.now();
-
-  // Key for validation
-  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
-
-  // Widget for field
-
-  @override
-  Widget build(BuildContext context) {
-    return Scaffold(
-        appBar: AppBar(title: Text("Form Demo")),
-        body: Container(
-          margin: EdgeInsets.all(24),
-          child: Form(
-            child: Column(
-              mainAxisAlignment: MainAxisAlignment.center,
-              children: <Widget>[
-                // list of all widget stated before
-                SizedBox(height: 100),
-                ElevatedButton(
-                  onPressed: () {},
-                  child: const Text('Submit'),
-                ),
-              ],
-            ),
-          ),
-        ));
-  }
-}
-- 
GitLab


From a5c4d85c9ea74bf141cdcf65efe893aaaa0089f4 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 21:17:38 +0700
Subject: [PATCH 16/44] feat: finalize rest controller for create appointment

---
 .../appointment/AppointmentController.java    |  2 +-
 .../appointment/AppointmentDB.java            |  1 +
 .../AppointmentRestController.java            |  4 +-
 .../appointment/AppointmentRestService.java   |  5 +-
 .../AppointmentRestServiceImpl.java           | 33 +++++++++-
 .../appointment/AppointmentService.java       |  2 +
 .../appointment/AppointmentServiceImpl.java   |  1 +
 .../{ => model}/AppointmentModel.java         |  2 +-
 .../TK/SpringTkApap/resep/ResepModel.java     |  2 +-
 .../TK/SpringTkApap/tagihan/TagihanModel.java |  2 +-
 .../SpringTkApap/user/model/DokterModel.java  |  2 +-
 .../SpringTkApap/user/model/PasienModel.java  |  2 +-
 .../user/repository/DokterDB.java             |  3 +
 .../user/repository/PasienDB.java             |  3 +
 .../user/service/DokterService.java           |  5 +-
 .../user/service/DokterServiceImpl.java       |  8 ++-
 .../user/service/PasienService.java           |  4 +-
 .../user/service/PasienServiceImpl.java       |  8 ++-
 .../lib/pages/createAppointment.dart          | 62 ++++++++++++++++---
 19 files changed, 128 insertions(+), 23 deletions(-)
 rename SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/{ => model}/AppointmentModel.java (97%)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 437a75f..1ee227e 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -27,7 +27,7 @@ public class AppointmentController {
     @GetMapping("/appointment/add/{noPasien}")
     private String addAppointment(@PathVariable(name = "noPasien") String noPasien, Model model) {
         List<DokterModel> listDokter = dokterService.getAll();
-        PasienModel pasien = pasienService.getPasien(noPasien);
+        PasienModel pasien = pasienService.getPasienById(noPasien);
 
         model.addAttribute("listDokter", listDokter);
         model.addAttribute("pasien", pasien);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
index 7191697..06f3979 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
@@ -2,6 +2,7 @@ package spring.TK.SpringTkApap.appointment;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.time.LocalDateTime;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 94dd38b..69b5105 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -5,6 +5,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.server.ResponseStatusException;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
 
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -17,7 +19,7 @@ public class AppointmentRestController {
     private AppointmentRestService appointmentRestService;
 
     @PostMapping(value = "/create")
-    private AppointmentModel createAppointmentSubmit(@RequestBody AppointmentModel appointment, BindingResult bindingResult) {
+    private AppointmentModel createAppointmentSubmit(@RequestBody CreateAppointmentDTO appointment, BindingResult bindingResult) {
         if (bindingResult.hasFieldErrors()) {
             throw new ResponseStatusException(
                     HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
index f6863fd..b81f1a3 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
@@ -1,9 +1,12 @@
 package spring.TK.SpringTkApap.appointment;
 
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+
 import java.util.List;
 
 public interface AppointmentRestService {
-    AppointmentModel createAppointment(AppointmentModel appointment);
+    AppointmentModel createAppointment(CreateAppointmentDTO appointment);
     List<AppointmentModel> retrieveAppointment();
     AppointmentModel getAppointment(String kode);
     AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index 2605a17..34178f6 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -2,8 +2,17 @@ package spring.TK.SpringTkApap.appointment;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+import spring.TK.SpringTkApap.user.repository.DokterDB;
+import spring.TK.SpringTkApap.user.repository.PasienDB;
+import spring.TK.SpringTkApap.user.service.DokterService;
+import spring.TK.SpringTkApap.user.service.PasienService;
 
 import javax.transaction.Transactional;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
@@ -15,9 +24,29 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
     @Autowired
     AppointmentDB appointmentDB;
 
+    @Autowired
+    DokterService dokterService;
+
+    @Autowired
+    PasienService pasienService;
+
     @Override
-    public AppointmentModel createAppointment(AppointmentModel appointment) {
-        return appointmentDB.save(appointment);
+    public AppointmentModel createAppointment(CreateAppointmentDTO appointment) {
+        LocalDateTime waktuAwal = appointment.getWaktuAwal();
+        String usernameDokter = appointment.getUsernameDokter();
+        String usernamePasien = appointment.getUsernamePasien();
+        String kode = "APT" + appointmentDB.count() + 1;
+
+        DokterModel dokter = dokterService.getDokterByUsername(usernameDokter);
+        PasienModel pasien = pasienService.getPasienByUsername(usernamePasien);
+
+        AppointmentModel newAppointment = new AppointmentModel();
+        newAppointment.setWaktuAwal(waktuAwal);
+        newAppointment.setIsDone(Boolean.FALSE);
+        newAppointment.setPasien(pasien);
+        newAppointment.setDokter(dokter);
+        newAppointment.setKode(kode);
+        return appointmentDB.save(newAppointment);
     }
 
     @Override
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
index 6c71b30..5fc8f03 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
@@ -1,5 +1,7 @@
 package spring.TK.SpringTkApap.appointment;
 
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+
 import java.util.List;
 
 public interface AppointmentService {
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
index 43fa0a7..3960e22 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
@@ -2,6 +2,7 @@ package spring.TK.SpringTkApap.appointment;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 
 import javax.transaction.Transactional;
 import java.util.List;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
similarity index 97%
rename from SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
rename to SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
index 8314fa5..55004a0 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
@@ -1,4 +1,4 @@
-package spring.TK.SpringTkApap.appointment;
+package spring.TK.SpringTkApap.appointment.model;
 
 import com.fasterxml.jackson.annotation.JsonBackReference;
 import com.sun.istack.NotNull;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
index 72441a9..cedde8b 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
@@ -6,7 +6,7 @@ import lombok.*;
 import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.format.annotation.DateTimeFormat;
-import spring.TK.SpringTkApap.appointment.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.jumlah.JumlahModel;
 import spring.TK.SpringTkApap.user.model.ApotekerModel;
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java
index 38b6131..da57195 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java
@@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
 import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.format.annotation.DateTimeFormat;
-import spring.TK.SpringTkApap.appointment.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
index 690fd73..962fd49 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterModel.java
@@ -3,7 +3,7 @@ package spring.TK.SpringTkApap.user.model;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.sun.istack.NotNull;
 import lombok.*;
-import spring.TK.SpringTkApap.appointment.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.auth.model.UserModel;
 
 import javax.persistence.*;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
index c6b792b..b314fb9 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/PasienModel.java
@@ -3,7 +3,7 @@ package spring.TK.SpringTkApap.user.model;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.sun.istack.NotNull;
 import lombok.*;
-import spring.TK.SpringTkApap.appointment.AppointmentModel;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.auth.model.UserModel;
 
 import javax.persistence.*;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
index c31a304..9e7da71 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
@@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
+import java.util.Optional;
+
 @Repository
 public interface DokterDB extends JpaRepository<DokterModel, String> {
+    Optional<DokterModel> findByUsername(String username);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
index 6be4362..0f8bd72 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/PasienDB.java
@@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 import spring.TK.SpringTkApap.user.model.PasienModel;
 
+import java.util.Optional;
+
 @Repository
 public interface PasienDB extends JpaRepository<PasienModel, String> {
+    Optional<PasienModel> findByUsername(String username);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
index 0c8ea7a..cc20a16 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
@@ -1,6 +1,5 @@
 package spring.TK.SpringTkApap.user.service;
 
-import spring.TK.SpringTkApap.appointment.AppointmentModel;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.util.List;
@@ -11,7 +10,9 @@ public interface DokterService {
 
     List<DokterModel> getAll();
 
-    DokterModel getDokter(String uuid);
+    DokterModel getDokterById(String uuid);
+
+    DokterModel getDokterByUsername(String username);
 
     void deleteDokter(DokterModel dokter);
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
index 69cdb91..5c4b083 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
@@ -28,11 +28,17 @@ public class DokterServiceImpl implements DokterService{
     }
 
     @Override
-    public DokterModel getDokter(String uuid) {
+    public DokterModel getDokterById(String uuid) {
         Optional<DokterModel> dokter = dokterDB.findById(uuid);
         return dokter.orElse(null);
     }
 
+    @Override
+    public DokterModel getDokterByUsername(String username) {
+        Optional<DokterModel> dokter = dokterDB.findByUsername(username);
+        return dokter.orElse(null);
+    }
+
     @Override
     public void deleteDokter(DokterModel dokter) {
         dokterDB.delete(dokter);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
index 65e08d0..c2c8f0a 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienService.java
@@ -8,7 +8,9 @@ public interface PasienService {
 
     PasienModel addPasien(PasienModel pasien);
 
-    PasienModel getPasien(String uuid);
+    PasienModel getPasienById(String uuid);
+
+    PasienModel getPasienByUsername(String username);
 
     List<PasienModel> getAll();
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
index eb15ad3..152939c 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/PasienServiceImpl.java
@@ -22,11 +22,17 @@ public class PasienServiceImpl implements PasienService {
     }
 
     @Override
-    public PasienModel getPasien(String uuid) {
+    public PasienModel getPasienById(String uuid) {
         Optional<PasienModel> pasien = pasienDB.findById(uuid);
         return pasien.orElse(null);
     }
 
+    @Override
+    public PasienModel getPasienByUsername(String username) {
+        Optional<PasienModel> pasien = pasienDB.findByUsername(username);
+        return pasien.orElse(null);
+    }
+
     @Override
     public List<PasienModel> getAll() {
         return pasienDB.findAll();
diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/createAppointment.dart
index 5bbe687..da4e809 100644
--- a/tk_apap_flutter/lib/pages/createAppointment.dart
+++ b/tk_apap_flutter/lib/pages/createAppointment.dart
@@ -1,4 +1,5 @@
-import 'package:flutter/cupertino.dart';
+import 'dart:convert';
+
 import 'package:flutter/material.dart';
 import 'package:http/http.dart' as http;
 import 'package:intl/intl.dart';
@@ -35,7 +36,6 @@ class _CreateAppointmentState extends State<CreateAppointment> {
 
   @override
   Widget build(BuildContext context) {
-
     return Scaffold(
         appBar: AppBar(title: const Text("Buat Appointment")),
         body: Container(
@@ -49,14 +49,18 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                   onTap: () async {
                     FocusScope.of(context).requestFocus(FocusNode());
                     await pickDateTime();
-                    dateCtl.text = DateFormat("yyyy/MM/dd HH:mm").format(ansDateTime);
+                    dateCtl.text =
+                        DateFormat("yyyy/MM/dd HH:mm").format(ansDateTime);
                   },
                 ),
                 DropdownButton(
                     items: const [
-                      DropdownMenuItem(value: 'Arga', child: Text("DokterArga")),
-                      DropdownMenuItem(value: 'Ludi', child: Text("DokterLudi")),
-                      DropdownMenuItem(value: "Nahda", child: Text("DokterNahda"))
+                      DropdownMenuItem(
+                          value: 'arga_christian', child: Text("DokterArga")),
+                      DropdownMenuItem(
+                          value: 'Ludi', child: Text("DokterLudi")),
+                      DropdownMenuItem(
+                          value: 'Nahda', child: Text("DokterNahda"))
                     ],
                     value: dropdownValue,
                     isExpanded: true,
@@ -64,9 +68,51 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                       setState(() {
                         dropdownValue = value!;
                       });
-                    } ),
+                    }),
                 ElevatedButton(
-                  onPressed: () {},
+                  onPressed: () async {
+                    var response = await http.post(
+                      Uri.parse('http://10.0.2.2:8080/api/appointment/create'),
+                      headers: {
+                        "Accept": "application/json",
+                        "content-type": "application/json"
+                      },
+                      body: jsonEncode(<String, String>{
+                        'waktuAwal':
+                            DateFormat("yyyy-MM-ddTHH:mm").format(ansDateTime),
+                        'username_dokter': dropdownValue,
+                        'username_pasien': "muhammad_arga"
+                      }),
+                    );
+                    if (response.statusCode == 200) {
+                      showDialog<String>(
+                        context: context,
+                        builder: (BuildContext context) => AlertDialog(
+                          title: const Text('Berhasil membuat Appointment'),
+                          actions: <Widget>[
+                            TextButton(
+                              onPressed: () => Navigator.pop(context, 'OK'),
+                              child: const Text('OK'),
+                            )
+                          ],
+                        ),
+                      );
+                    } else {
+                      showDialog<String>(
+                        context: context,
+                        builder: (BuildContext context) => AlertDialog(
+                          title: Text(DateFormat("yyyy-MM-ddTHH:mm")
+                              .format(ansDateTime)),
+                          actions: <Widget>[
+                            TextButton(
+                              onPressed: () => Navigator.pop(context, 'OK'),
+                              child: Text('${response.statusCode}'),
+                            )
+                          ],
+                        ),
+                      );
+                    }
+                  },
                   child: const Text('Submit'),
                 ),
               ],
-- 
GitLab


From 6d2949fde6d1af2323e3b55454acfdecff7a1901 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 21:17:59 +0700
Subject: [PATCH 17/44] chores: create appointment DTO

---
 .../model/CreateAppointmentDTO.java           | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/CreateAppointmentDTO.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/CreateAppointmentDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/CreateAppointmentDTO.java
new file mode 100644
index 0000000..3c9e526
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/CreateAppointmentDTO.java
@@ -0,0 +1,23 @@
+package spring.TK.SpringTkApap.appointment.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class CreateAppointmentDTO implements Serializable {
+    private LocalDateTime waktuAwal;
+    @JsonProperty("username_dokter")
+    private String usernameDokter;
+
+    @JsonProperty("username_pasien")
+    private String usernamePasien;
+}
-- 
GitLab


From d4df508c4493663a81d06ac1abc7e0e40ecac211 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Mon, 21 Nov 2022 21:30:47 +0700
Subject: [PATCH 18/44] fix: fixing the code for appointment

---
 .../SpringTkApap/appointment/AppointmentRestServiceImpl.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index 34178f6..f257a8f 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -35,7 +35,8 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
         LocalDateTime waktuAwal = appointment.getWaktuAwal();
         String usernameDokter = appointment.getUsernameDokter();
         String usernamePasien = appointment.getUsernamePasien();
-        String kode = "APT" + appointmentDB.count() + 1;
+        int intKode = Math.toIntExact(appointmentDB.count() + 1);
+        String kode = "APT-" + intKode;
 
         DokterModel dokter = dokterService.getDokterByUsername(usernameDokter);
         PasienModel pasien = pasienService.getPasienByUsername(usernamePasien);
-- 
GitLab


From 22f63cc95a46672284bf7f113c144427df133331 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Tue, 22 Nov 2022 19:05:09 +0700
Subject: [PATCH 19/44] feat: implement create appointment mobile through api

---
 .../appointment/AppointmentController.java    |   3 +-
 .../AppointmentRestController.java            |   2 +-
 .../appointment/AppointmentRestService.java   |   2 +-
 .../AppointmentRestServiceImpl.java           |  14 +-
 .../user/controller/DokterRestController.java |  25 +++
 .../TK/SpringTkApap/user/model/DokterDTO.java |  16 ++
 .../user/service/DokterService.java           |   3 +-
 .../user/service/DokterServiceImpl.java       |  15 +-
 .../lib/pages/createAppointment.dart          | 192 ++++++++++--------
 9 files changed, 182 insertions(+), 90 deletions(-)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 1ee227e..1c137af 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -5,6 +5,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.model.PasienModel;
 import spring.TK.SpringTkApap.user.service.DokterService;
@@ -26,7 +27,7 @@ public class AppointmentController {
 
     @GetMapping("/appointment/add/{noPasien}")
     private String addAppointment(@PathVariable(name = "noPasien") String noPasien, Model model) {
-        List<DokterModel> listDokter = dokterService.getAll();
+        List<DokterDTO> listDokter = dokterService.getAll();
         PasienModel pasien = pasienService.getPasienById(noPasien);
 
         model.addAttribute("listDokter", listDokter);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 69b5105..3bee211 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -41,7 +41,7 @@ public class AppointmentRestController {
     }
 
     @GetMapping(value = "/all")
-    private List<AppointmentModel> getAllAppointment() {
+    private List<CreateAppointmentDTO> getAllAppointment() {
         return appointmentRestService.retrieveAppointment();
     }
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
index b81f1a3..61b9db4 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
@@ -7,7 +7,7 @@ import java.util.List;
 
 public interface AppointmentRestService {
     AppointmentModel createAppointment(CreateAppointmentDTO appointment);
-    List<AppointmentModel> retrieveAppointment();
+    List<CreateAppointmentDTO> retrieveAppointment();
     AppointmentModel getAppointment(String kode);
     AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index f257a8f..3f8b4c2 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -13,6 +13,7 @@ import spring.TK.SpringTkApap.user.service.PasienService;
 
 import javax.transaction.Transactional;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
@@ -51,8 +52,17 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
     }
 
     @Override
-    public List<AppointmentModel> retrieveAppointment() {
-        return appointmentDB.findAll();
+    public List<CreateAppointmentDTO> retrieveAppointment() {
+        List<AppointmentModel> listAppointment = appointmentDB.findAll();
+        List<CreateAppointmentDTO> list = new ArrayList<>();
+        for (AppointmentModel appointment : listAppointment) {
+            CreateAppointmentDTO appDto = new CreateAppointmentDTO();
+            appDto.setWaktuAwal(appointment.getWaktuAwal());
+            appDto.setUsernamePasien(appointment.getPasien().getUsername());
+            appDto.setUsernameDokter(appointment.getDokter().getUsername());
+            list.add(appDto);
+        }
+        return list;
     }
 
     @Override
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
new file mode 100644
index 0000000..5aa3a9a
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
@@ -0,0 +1,25 @@
+package spring.TK.SpringTkApap.user.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.user.model.DokterDTO;
+import spring.TK.SpringTkApap.user.service.DokterService;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/doktor")
+public class DokterRestController {
+
+    @Autowired
+    private DokterService dokterService;
+
+    @GetMapping(value = "/all")
+    private List<DokterDTO>  getAllDoktor() {
+        return dokterService.getAll();
+    }
+
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java
new file mode 100644
index 0000000..7c7c524
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java
@@ -0,0 +1,16 @@
+package spring.TK.SpringTkApap.user.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class DokterDTO {
+    private String nama;
+    private String username;
+    private Integer tagihan;
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
index cc20a16..c07b956 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
@@ -1,5 +1,6 @@
 package spring.TK.SpringTkApap.user.service;
 
+import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.util.List;
@@ -8,7 +9,7 @@ public interface DokterService {
 
     DokterModel addDokter(DokterModel dokter);
 
-    List<DokterModel> getAll();
+    List<DokterDTO> getAll();
 
     DokterModel getDokterById(String uuid);
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
index 5c4b083..ac95d01 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
@@ -2,10 +2,12 @@ package spring.TK.SpringTkApap.user.service;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.repository.DokterDB;
 
 import javax.transaction.Transactional;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
@@ -23,8 +25,17 @@ public class DokterServiceImpl implements DokterService{
     }
 
     @Override
-    public List<DokterModel> getAll() {
-        return dokterDB.findAll();
+    public List<DokterDTO> getAll() {
+        List<DokterModel> listDokter = dokterDB.findAll();
+        List<DokterDTO> list = new ArrayList<>();
+        for (DokterModel dokter : listDokter) {
+            DokterDTO newDokter = new DokterDTO();
+            newDokter.setNama(dokter.getNama());
+            newDokter.setUsername(dokter.getUsername());
+            newDokter.setTagihan(dokter.getTarif());
+            list.add(newDokter);
+        }
+        return list;
     }
 
     @Override
diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/createAppointment.dart
index da4e809..16f2e1e 100644
--- a/tk_apap_flutter/lib/pages/createAppointment.dart
+++ b/tk_apap_flutter/lib/pages/createAppointment.dart
@@ -1,4 +1,5 @@
 import 'dart:convert';
+import 'dart:ffi';
 
 import 'package:flutter/material.dart';
 import 'package:http/http.dart' as http;
@@ -16,11 +17,30 @@ class CreateAppointment extends StatefulWidget {
 class _CreateAppointmentState extends State<CreateAppointment> {
   // Data yang diperlukan tanggal dan waktu, dropdown [namaDokter - Tarif]
 
+  Future<List<Dokter>> getAllDoktor() async {
+    var uri = Uri.parse('http://10.0.2.2:8080/api/doktor/all');
+    http.Response response = await http.get(uri);
+    if (response.statusCode == 200) {
+      List<Dokter> list = <Dokter>[];
+      List jsonData = jsonDecode(response.body);
+      for (int i = 0; i < jsonData.length; i++) {
+        Dokter dokter = Dokter.createDokter(jsonData[i]['nama'] as String,
+            jsonData[i]['username'] as String, jsonData[i]['tagihan'] as int);
+        list.add(dokter);
+      }
+      for (int i = 0; i < list.length; i++) {
+        print(list[i].username);
+      }
+      return list;
+    } else {
+      throw response.statusCode;
+    }
+  }
+
   final dateCtl = TextEditingController();
-  String dropdownValue = 'Arga';
+  Dokter? dropdownValue;
   DateTime dateTime = DateTime.now();
-  DateTime ansDateTime = DateTime.now();
-  var uri = Uri.http('localhost:8080', '/');
+  DateTime? ansDateTime;
 
   // Form state
   final _appointment = Appointment();
@@ -39,86 +59,94 @@ class _CreateAppointmentState extends State<CreateAppointment> {
     return Scaffold(
         appBar: AppBar(title: const Text("Buat Appointment")),
         body: Container(
-          margin: const EdgeInsets.all(24),
-          child: Form(
-            child: Column(
-              mainAxisAlignment: MainAxisAlignment.center,
-              children: <Widget>[
-                TextFormField(
-                  controller: dateCtl,
-                  onTap: () async {
-                    FocusScope.of(context).requestFocus(FocusNode());
-                    await pickDateTime();
-                    dateCtl.text =
-                        DateFormat("yyyy/MM/dd HH:mm").format(ansDateTime);
-                  },
-                ),
-                DropdownButton(
-                    items: const [
-                      DropdownMenuItem(
-                          value: 'arga_christian', child: Text("DokterArga")),
-                      DropdownMenuItem(
-                          value: 'Ludi', child: Text("DokterLudi")),
-                      DropdownMenuItem(
-                          value: 'Nahda', child: Text("DokterNahda"))
-                    ],
-                    value: dropdownValue,
-                    isExpanded: true,
-                    onChanged: (value) async {
-                      setState(() {
-                        dropdownValue = value!;
-                      });
-                    }),
-                ElevatedButton(
-                  onPressed: () async {
-                    var response = await http.post(
-                      Uri.parse('http://10.0.2.2:8080/api/appointment/create'),
-                      headers: {
-                        "Accept": "application/json",
-                        "content-type": "application/json"
-                      },
-                      body: jsonEncode(<String, String>{
-                        'waktuAwal':
-                            DateFormat("yyyy-MM-ddTHH:mm").format(ansDateTime),
-                        'username_dokter': dropdownValue,
-                        'username_pasien': "muhammad_arga"
-                      }),
-                    );
-                    if (response.statusCode == 200) {
-                      showDialog<String>(
-                        context: context,
-                        builder: (BuildContext context) => AlertDialog(
-                          title: const Text('Berhasil membuat Appointment'),
-                          actions: <Widget>[
-                            TextButton(
-                              onPressed: () => Navigator.pop(context, 'OK'),
-                              child: const Text('OK'),
-                            )
-                          ],
-                        ),
-                      );
-                    } else {
-                      showDialog<String>(
-                        context: context,
-                        builder: (BuildContext context) => AlertDialog(
-                          title: Text(DateFormat("yyyy-MM-ddTHH:mm")
-                              .format(ansDateTime)),
-                          actions: <Widget>[
-                            TextButton(
-                              onPressed: () => Navigator.pop(context, 'OK'),
-                              child: Text('${response.statusCode}'),
-                            )
-                          ],
+            margin: const EdgeInsets.all(24),
+            child: FutureBuilder<List<Dokter>>(
+              future: getAllDoktor(),
+              builder: (context, snapshot) {
+                if (snapshot.hasData) {
+                  var data = snapshot.data!;
+                  return Form(
+                    child: Column(
+                      mainAxisAlignment: MainAxisAlignment.center,
+                      children: <Widget>[
+                        TextFormField(
+                          controller: dateCtl,
+                          onTap: () async {
+                            FocusScope.of(context).requestFocus(FocusNode());
+                            await pickDateTime();
+                            dateCtl.text = DateFormat("yyyy/MM/dd HH:mm")
+                                .format(ansDateTime!);
+                          },
                         ),
-                      );
-                    }
-                  },
-                  child: const Text('Submit'),
-                ),
-              ],
-            ),
-          ),
-        ));
+                        DropdownButton(
+                            items: data.map((Dokter items) {
+                              return DropdownMenuItem(
+                                value: items,
+                                child: Text("${items.nama} - ${items.tagihan}"),
+                              );
+                            }).toList(),
+                            value: dropdownValue,
+                            onChanged: (Dokter? newValue) async {
+                              dropdownValue = newValue!;
+                            }),
+                        ElevatedButton(
+                          onPressed: () async {
+                            var response = await http.post(
+                              Uri.parse(
+                                  'http://10.0.2.2:8080/api/appointment/create'),
+                              headers: {
+                                "Accept": "application/json",
+                                "content-type": "application/json"
+                              },
+                              body: jsonEncode(<String, String?>{
+                                'waktuAwal': DateFormat("yyyy-MM-ddTHH:mm")
+                                    .format(ansDateTime!),
+                                'username_dokter': dropdownValue?.username,
+                                'username_pasien': "muhammad_arga"
+                              }),
+                            );
+                            if (response.statusCode == 200) {
+                              showDialog<String>(
+                                context: context,
+                                builder: (BuildContext context) => AlertDialog(
+                                  title: const Text(
+                                      'Berhasil membuat Appointment'),
+                                  actions: <Widget>[
+                                    TextButton(
+                                      onPressed: () =>
+                                          Navigator.pop(context, 'OK'),
+                                      child: const Text('OK'),
+                                    )
+                                  ],
+                                ),
+                              );
+                            } else {
+                              showDialog<String>(
+                                context: context,
+                                builder: (BuildContext context) => AlertDialog(
+                                  title: Text(DateFormat("yyyy-MM-ddTHH:mm")
+                                      .format(ansDateTime!)),
+                                  actions: <Widget>[
+                                    TextButton(
+                                      onPressed: () =>
+                                          Navigator.pop(context, 'OK'),
+                                      child: Text('${response.statusCode}'),
+                                    )
+                                  ],
+                                ),
+                              );
+                            }
+                          },
+                          child: const Text('Submit'),
+                        )
+                      ],
+                    ),
+                  );
+                } else {
+                  return const CircularProgressIndicator();
+                }
+              },
+            )));
   }
 
   Future<DateTime?> pickDate() => showDatePicker(
-- 
GitLab


From 51df2a83b8f0bdcb6d2376c2ef34ce62fa8cfcc4 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 23 Nov 2022 19:57:28 +0700
Subject: [PATCH 20/44] changes

---
 tk_apap_flutter/lib/main.dart                 |  26 ++-
 .../Flutter/GeneratedPluginRegistrant.swift   |   4 +
 tk_apap_flutter/pubspec.lock                  | 218 +++++++++++++++++-
 tk_apap_flutter/pubspec.yaml                  |  10 +-
 4 files changed, 243 insertions(+), 15 deletions(-)

diff --git a/tk_apap_flutter/lib/main.dart b/tk_apap_flutter/lib/main.dart
index 2a386a0..d907884 100644
--- a/tk_apap_flutter/lib/main.dart
+++ b/tk_apap_flutter/lib/main.dart
@@ -1,4 +1,9 @@
+import 'package:tk_apap_flutter/pages/Login.dart';
+import 'package:tk_apap_flutter/pages/HomeScreen.dart';
+import 'package:tk_apap_flutter/pages/edit_profile.dart';
+import 'package:tk_apap_flutter/pages/story_screen.dart';
 import 'package:flutter/material.dart';
+import 'package:tk_apap_flutter/constants/color_constants.dart';
 import 'package:tk_apap_flutter/pages/createAppointment.dart';
 
 void main() {
@@ -14,18 +19,17 @@ class MyApp extends StatelessWidget {
     return MaterialApp(
       title: 'Flutter Demo',
       theme: ThemeData(
-        // This is the theme of your application.
-        //
-        // Try running your application with "flutter run". You'll see the
-        // application has a blue toolbar. Then, without quitting the app, try
-        // changing the primarySwatch below to Colors.green and then invoke
-        // "hot reload" (press "r" in the console where you ran "flutter run",
-        // or simply save your changes to "hot reload" in a Flutter IDE).
-        // Notice that the counter didn't reset back to zero; the application
-        // is not restarted.
-        primarySwatch: Colors.blue,
+          primaryColor: kPrimaryColor,
+          accentColor: kAccentColor
       ),
-      home: const MyHomePage(title: 'Flutter Demo Home Page'),
+      home: Login(),
+      debugShowCheckedModeBanner: false,
+      routes: {
+        HomeScreen.routeName: (ctx) => HomeScreen(),
+        Login.routeName: (ctx) => Login(),
+        EditProfile.routeName: (ctx) => EditProfile(),
+        StoryScreen.routeName: (ctx) => StoryScreen()
+      },
     );
   }
 }
diff --git a/tk_apap_flutter/macos/Flutter/GeneratedPluginRegistrant.swift b/tk_apap_flutter/macos/Flutter/GeneratedPluginRegistrant.swift
index cccf817..14e6964 100644
--- a/tk_apap_flutter/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/tk_apap_flutter/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -5,6 +5,10 @@
 import FlutterMacOS
 import Foundation
 
+import path_provider_macos
+import shared_preferences_macos
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+  PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+  SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
 }
diff --git a/tk_apap_flutter/pubspec.lock b/tk_apap_flutter/pubspec.lock
index 4261944..5bd35aa 100644
--- a/tk_apap_flutter/pubspec.lock
+++ b/tk_apap_flutter/pubspec.lock
@@ -36,6 +36,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.16.0"
+  crypto:
+    dependency: transitive
+    description:
+      name: crypto
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.2"
   cupertino_icons:
     dependency: "direct main"
     description:
@@ -50,6 +57,20 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.3.1"
+  ffi:
+    dependency: transitive
+    description:
+      name: ffi
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.1"
+  file:
+    dependency: transitive
+    description:
+      name: file
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "6.1.4"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -62,11 +83,37 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.0.1"
+  flutter_session_manager:
+    dependency: "direct main"
+    description:
+      name: flutter_session_manager
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.3"
   flutter_test:
     dependency: "direct dev"
     description: flutter
     source: sdk
     version: "0.0.0"
+  flutter_web_plugins:
+    dependency: transitive
+    description: flutter
+    source: sdk
+    version: "0.0.0"
+  font_awesome_flutter:
+    dependency: "direct main"
+    description:
+      name: font_awesome_flutter
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "10.2.1"
+  google_fonts:
+    dependency: "direct main"
+    description:
+      name: google_fonts
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.0.1"
   http:
     dependency: "direct main"
     description:
@@ -88,6 +135,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.17.0"
+  js:
+    dependency: transitive
+    description:
+      name: js
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.6.4"
   lints:
     dependency: transitive
     description:
@@ -116,6 +170,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.8.0"
+  nested:
+    dependency: transitive
+    description:
+      name: nested
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
   path:
     dependency: transitive
     description:
@@ -123,6 +184,146 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "1.8.2"
+  path_provider:
+    dependency: transitive
+    description:
+      name: path_provider
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.11"
+  path_provider_android:
+    dependency: transitive
+    description:
+      name: path_provider_android
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.22"
+  path_provider_ios:
+    dependency: transitive
+    description:
+      name: path_provider_ios
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.11"
+  path_provider_linux:
+    dependency: transitive
+    description:
+      name: path_provider_linux
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.7"
+  path_provider_macos:
+    dependency: transitive
+    description:
+      name: path_provider_macos
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.6"
+  path_provider_platform_interface:
+    dependency: transitive
+    description:
+      name: path_provider_platform_interface
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.5"
+  path_provider_windows:
+    dependency: transitive
+    description:
+      name: path_provider_windows
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.3"
+  platform:
+    dependency: transitive
+    description:
+      name: platform
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.0"
+  plugin_platform_interface:
+    dependency: transitive
+    description:
+      name: plugin_platform_interface
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.3"
+  process:
+    dependency: transitive
+    description:
+      name: process
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.4"
+  provider:
+    dependency: "direct main"
+    description:
+      name: provider
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "6.0.4"
+  shared_preferences:
+    dependency: transitive
+    description:
+      name: shared_preferences
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.15"
+  shared_preferences_android:
+    dependency: transitive
+    description:
+      name: shared_preferences_android
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.14"
+  shared_preferences_ios:
+    dependency: transitive
+    description:
+      name: shared_preferences_ios
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.1"
+  shared_preferences_linux:
+    dependency: transitive
+    description:
+      name: shared_preferences_linux
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.1"
+  shared_preferences_macos:
+    dependency: transitive
+    description:
+      name: shared_preferences_macos
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.4"
+  shared_preferences_platform_interface:
+    dependency: transitive
+    description:
+      name: shared_preferences_platform_interface
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.0"
+  shared_preferences_web:
+    dependency: transitive
+    description:
+      name: shared_preferences_web
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.0.4"
+  shared_preferences_windows:
+    dependency: transitive
+    description:
+      name: shared_preferences_windows
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "2.1.1"
+  simple_animations:
+    dependency: "direct main"
+    description:
+      name: simple_animations
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "5.0.0+3"
   sky_engine:
     dependency: transitive
     description: flutter
@@ -184,5 +385,20 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "2.1.2"
+  win32:
+    dependency: transitive
+    description:
+      name: win32
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "3.1.1"
+  xdg_directories:
+    dependency: transitive
+    description:
+      name: xdg_directories
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.0+2"
 sdks:
-  dart: ">=2.18.4 <3.0.0"
+  dart: ">=2.17.0 <3.0.0"
+  flutter: ">=3.0.0"
diff --git a/tk_apap_flutter/pubspec.yaml b/tk_apap_flutter/pubspec.yaml
index 756f6e7..e87960e 100644
--- a/tk_apap_flutter/pubspec.yaml
+++ b/tk_apap_flutter/pubspec.yaml
@@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
 version: 1.0.0+1
 
 environment:
-  sdk: '>=2.18.4 <3.0.0'
+  sdk: ">=2.7.0 <3.0.0"
 
 # Dependencies specify other packages that your package needs in order to work.
 # To automatically upgrade your package dependencies to the latest versions
@@ -29,8 +29,7 @@ environment:
 # the latest version available on pub.dev. To see which dependencies have newer
 # versions available, run `flutter pub outdated`.
 dependencies:
-  http:
-    ^0.13.5
+  http: ^0.13.5
   flutter:
     sdk: flutter
 
@@ -38,6 +37,11 @@ dependencies:
   # The following adds the Cupertino Icons font to your application.
   # Use with the CupertinoIcons class for iOS style icons.
   cupertino_icons: ^1.0.2
+  provider: ^6.0.4
+  font_awesome_flutter: ^10.2.1
+  simple_animations: ^5.0.0+3
+  flutter_session_manager: ^1.0.3
+  google_fonts: ^3.0.1
   intl: ^0.17.0
 
 dev_dependencies:
-- 
GitLab


From 78938c0a68015e9b10d342788726098404e9e8a8 Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 23 Nov 2022 20:02:43 +0700
Subject: [PATCH 21/44] changes

---
 .../lib/pages/createAppointment.dart          | 28 +++++++++----------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/createAppointment.dart
index 16f2e1e..4174949 100644
--- a/tk_apap_flutter/lib/pages/createAppointment.dart
+++ b/tk_apap_flutter/lib/pages/createAppointment.dart
@@ -8,7 +8,7 @@ import '../DTO/Appointment.dart';
 import '../DTO/Dokter.dart';
 
 class CreateAppointment extends StatefulWidget {
-  const CreateAppointment({Key? key}) : super(key: key);
+  const CreateAppointment({Key key}) : super(key: key);
 
   @override
   State<CreateAppointment> createState() => _CreateAppointmentState();
@@ -38,9 +38,9 @@ class _CreateAppointmentState extends State<CreateAppointment> {
   }
 
   final dateCtl = TextEditingController();
-  Dokter? dropdownValue;
+  Dokter dropdownValue;
   DateTime dateTime = DateTime.now();
-  DateTime? ansDateTime;
+  DateTime ansDateTime;
 
   // Form state
   final _appointment = Appointment();
@@ -64,7 +64,7 @@ class _CreateAppointmentState extends State<CreateAppointment> {
               future: getAllDoktor(),
               builder: (context, snapshot) {
                 if (snapshot.hasData) {
-                  var data = snapshot.data!;
+                  var data = snapshot.data;
                   return Form(
                     child: Column(
                       mainAxisAlignment: MainAxisAlignment.center,
@@ -75,7 +75,7 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                             FocusScope.of(context).requestFocus(FocusNode());
                             await pickDateTime();
                             dateCtl.text = DateFormat("yyyy/MM/dd HH:mm")
-                                .format(ansDateTime!);
+                                .format(ansDateTime);
                           },
                         ),
                         DropdownButton(
@@ -86,8 +86,8 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                               );
                             }).toList(),
                             value: dropdownValue,
-                            onChanged: (Dokter? newValue) async {
-                              dropdownValue = newValue!;
+                            onChanged: (Dokter newValue) async {
+                              dropdownValue = newValue;
                             }),
                         ElevatedButton(
                           onPressed: () async {
@@ -98,9 +98,9 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                                 "Accept": "application/json",
                                 "content-type": "application/json"
                               },
-                              body: jsonEncode(<String, String?>{
+                              body: jsonEncode(<String, String>{
                                 'waktuAwal': DateFormat("yyyy-MM-ddTHH:mm")
-                                    .format(ansDateTime!),
+                                    .format(ansDateTime),
                                 'username_dokter': dropdownValue?.username,
                                 'username_pasien': "muhammad_arga"
                               }),
@@ -125,7 +125,7 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                                 context: context,
                                 builder: (BuildContext context) => AlertDialog(
                                   title: Text(DateFormat("yyyy-MM-ddTHH:mm")
-                                      .format(ansDateTime!)),
+                                      .format(ansDateTime)),
                                   actions: <Widget>[
                                     TextButton(
                                       onPressed: () =>
@@ -149,21 +149,21 @@ class _CreateAppointmentState extends State<CreateAppointment> {
             )));
   }
 
-  Future<DateTime?> pickDate() => showDatePicker(
+  Future<DateTime> pickDate() => showDatePicker(
       context: context,
       initialDate: dateTime,
       firstDate: dateTime,
       lastDate: DateTime(2023));
 
-  Future<TimeOfDay?> pickTime() => showTimePicker(
+  Future<TimeOfDay> pickTime() => showTimePicker(
       context: context,
       initialTime: TimeOfDay(hour: dateTime.hour, minute: dateTime.minute));
 
   Future pickDateTime() async {
-    DateTime? date = await pickDate();
+    DateTime date = await pickDate();
     if (date == null) return;
 
-    TimeOfDay? time = await pickTime();
+    TimeOfDay time = await pickTime();
     if (time == null) return;
 
     final dateTime = DateTime(
-- 
GitLab


From cfc1ce02c288c2c0875007f54b2874692e3fad7b Mon Sep 17 00:00:00 2001
From: Arga Christian <argalumbanraja@gmail.com>
Date: Wed, 23 Nov 2022 20:03:13 +0700
Subject: [PATCH 22/44] Revert "feat: implement create appointment mobile
 through api"

This reverts commit 22f63cc95a46672284bf7f113c144427df133331.
---
 .../appointment/AppointmentController.java    |   3 +-
 .../AppointmentRestController.java            |   2 +-
 .../appointment/AppointmentRestService.java   |   2 +-
 .../AppointmentRestServiceImpl.java           |  14 +-
 .../user/controller/DokterRestController.java |  25 ---
 .../TK/SpringTkApap/user/model/DokterDTO.java |  16 --
 .../user/service/DokterService.java           |   3 +-
 .../user/service/DokterServiceImpl.java       |  15 +-
 .../lib/pages/createAppointment.dart          | 202 ++++++++----------
 9 files changed, 95 insertions(+), 187 deletions(-)
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
 delete mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 1c137af..1ee227e 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -5,7 +5,6 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
-import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.model.PasienModel;
 import spring.TK.SpringTkApap.user.service.DokterService;
@@ -27,7 +26,7 @@ public class AppointmentController {
 
     @GetMapping("/appointment/add/{noPasien}")
     private String addAppointment(@PathVariable(name = "noPasien") String noPasien, Model model) {
-        List<DokterDTO> listDokter = dokterService.getAll();
+        List<DokterModel> listDokter = dokterService.getAll();
         PasienModel pasien = pasienService.getPasienById(noPasien);
 
         model.addAttribute("listDokter", listDokter);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 3bee211..69b5105 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -41,7 +41,7 @@ public class AppointmentRestController {
     }
 
     @GetMapping(value = "/all")
-    private List<CreateAppointmentDTO> getAllAppointment() {
+    private List<AppointmentModel> getAllAppointment() {
         return appointmentRestService.retrieveAppointment();
     }
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
index 61b9db4..b81f1a3 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
@@ -7,7 +7,7 @@ import java.util.List;
 
 public interface AppointmentRestService {
     AppointmentModel createAppointment(CreateAppointmentDTO appointment);
-    List<CreateAppointmentDTO> retrieveAppointment();
+    List<AppointmentModel> retrieveAppointment();
     AppointmentModel getAppointment(String kode);
     AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index 3f8b4c2..f257a8f 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -13,7 +13,6 @@ import spring.TK.SpringTkApap.user.service.PasienService;
 
 import javax.transaction.Transactional;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
@@ -52,17 +51,8 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
     }
 
     @Override
-    public List<CreateAppointmentDTO> retrieveAppointment() {
-        List<AppointmentModel> listAppointment = appointmentDB.findAll();
-        List<CreateAppointmentDTO> list = new ArrayList<>();
-        for (AppointmentModel appointment : listAppointment) {
-            CreateAppointmentDTO appDto = new CreateAppointmentDTO();
-            appDto.setWaktuAwal(appointment.getWaktuAwal());
-            appDto.setUsernamePasien(appointment.getPasien().getUsername());
-            appDto.setUsernameDokter(appointment.getDokter().getUsername());
-            list.add(appDto);
-        }
-        return list;
+    public List<AppointmentModel> retrieveAppointment() {
+        return appointmentDB.findAll();
     }
 
     @Override
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
deleted file mode 100644
index 5aa3a9a..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package spring.TK.SpringTkApap.user.controller;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
-import spring.TK.SpringTkApap.user.model.DokterDTO;
-import spring.TK.SpringTkApap.user.service.DokterService;
-
-import java.util.List;
-
-@RestController
-@RequestMapping("/api/doktor")
-public class DokterRestController {
-
-    @Autowired
-    private DokterService dokterService;
-
-    @GetMapping(value = "/all")
-    private List<DokterDTO>  getAllDoktor() {
-        return dokterService.getAll();
-    }
-
-}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java
deleted file mode 100644
index 7c7c524..0000000
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterDTO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package spring.TK.SpringTkApap.user.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-@Setter
-@Getter
-@NoArgsConstructor
-@AllArgsConstructor
-public class DokterDTO {
-    private String nama;
-    private String username;
-    private Integer tagihan;
-}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
index c07b956..cc20a16 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
@@ -1,6 +1,5 @@
 package spring.TK.SpringTkApap.user.service;
 
-import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.util.List;
@@ -9,7 +8,7 @@ public interface DokterService {
 
     DokterModel addDokter(DokterModel dokter);
 
-    List<DokterDTO> getAll();
+    List<DokterModel> getAll();
 
     DokterModel getDokterById(String uuid);
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
index ac95d01..5c4b083 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
@@ -2,12 +2,10 @@ package spring.TK.SpringTkApap.user.service;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.repository.DokterDB;
 
 import javax.transaction.Transactional;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
@@ -25,17 +23,8 @@ public class DokterServiceImpl implements DokterService{
     }
 
     @Override
-    public List<DokterDTO> getAll() {
-        List<DokterModel> listDokter = dokterDB.findAll();
-        List<DokterDTO> list = new ArrayList<>();
-        for (DokterModel dokter : listDokter) {
-            DokterDTO newDokter = new DokterDTO();
-            newDokter.setNama(dokter.getNama());
-            newDokter.setUsername(dokter.getUsername());
-            newDokter.setTagihan(dokter.getTarif());
-            list.add(newDokter);
-        }
-        return list;
+    public List<DokterModel> getAll() {
+        return dokterDB.findAll();
     }
 
     @Override
diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/createAppointment.dart
index 4174949..da4e809 100644
--- a/tk_apap_flutter/lib/pages/createAppointment.dart
+++ b/tk_apap_flutter/lib/pages/createAppointment.dart
@@ -1,5 +1,4 @@
 import 'dart:convert';
-import 'dart:ffi';
 
 import 'package:flutter/material.dart';
 import 'package:http/http.dart' as http;
@@ -8,7 +7,7 @@ import '../DTO/Appointment.dart';
 import '../DTO/Dokter.dart';
 
 class CreateAppointment extends StatefulWidget {
-  const CreateAppointment({Key key}) : super(key: key);
+  const CreateAppointment({Key? key}) : super(key: key);
 
   @override
   State<CreateAppointment> createState() => _CreateAppointmentState();
@@ -17,30 +16,11 @@ class CreateAppointment extends StatefulWidget {
 class _CreateAppointmentState extends State<CreateAppointment> {
   // Data yang diperlukan tanggal dan waktu, dropdown [namaDokter - Tarif]
 
-  Future<List<Dokter>> getAllDoktor() async {
-    var uri = Uri.parse('http://10.0.2.2:8080/api/doktor/all');
-    http.Response response = await http.get(uri);
-    if (response.statusCode == 200) {
-      List<Dokter> list = <Dokter>[];
-      List jsonData = jsonDecode(response.body);
-      for (int i = 0; i < jsonData.length; i++) {
-        Dokter dokter = Dokter.createDokter(jsonData[i]['nama'] as String,
-            jsonData[i]['username'] as String, jsonData[i]['tagihan'] as int);
-        list.add(dokter);
-      }
-      for (int i = 0; i < list.length; i++) {
-        print(list[i].username);
-      }
-      return list;
-    } else {
-      throw response.statusCode;
-    }
-  }
-
   final dateCtl = TextEditingController();
-  Dokter dropdownValue;
+  String dropdownValue = 'Arga';
   DateTime dateTime = DateTime.now();
-  DateTime ansDateTime;
+  DateTime ansDateTime = DateTime.now();
+  var uri = Uri.http('localhost:8080', '/');
 
   // Form state
   final _appointment = Appointment();
@@ -59,111 +39,103 @@ class _CreateAppointmentState extends State<CreateAppointment> {
     return Scaffold(
         appBar: AppBar(title: const Text("Buat Appointment")),
         body: Container(
-            margin: const EdgeInsets.all(24),
-            child: FutureBuilder<List<Dokter>>(
-              future: getAllDoktor(),
-              builder: (context, snapshot) {
-                if (snapshot.hasData) {
-                  var data = snapshot.data;
-                  return Form(
-                    child: Column(
-                      mainAxisAlignment: MainAxisAlignment.center,
-                      children: <Widget>[
-                        TextFormField(
-                          controller: dateCtl,
-                          onTap: () async {
-                            FocusScope.of(context).requestFocus(FocusNode());
-                            await pickDateTime();
-                            dateCtl.text = DateFormat("yyyy/MM/dd HH:mm")
-                                .format(ansDateTime);
-                          },
+          margin: const EdgeInsets.all(24),
+          child: Form(
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: <Widget>[
+                TextFormField(
+                  controller: dateCtl,
+                  onTap: () async {
+                    FocusScope.of(context).requestFocus(FocusNode());
+                    await pickDateTime();
+                    dateCtl.text =
+                        DateFormat("yyyy/MM/dd HH:mm").format(ansDateTime);
+                  },
+                ),
+                DropdownButton(
+                    items: const [
+                      DropdownMenuItem(
+                          value: 'arga_christian', child: Text("DokterArga")),
+                      DropdownMenuItem(
+                          value: 'Ludi', child: Text("DokterLudi")),
+                      DropdownMenuItem(
+                          value: 'Nahda', child: Text("DokterNahda"))
+                    ],
+                    value: dropdownValue,
+                    isExpanded: true,
+                    onChanged: (value) async {
+                      setState(() {
+                        dropdownValue = value!;
+                      });
+                    }),
+                ElevatedButton(
+                  onPressed: () async {
+                    var response = await http.post(
+                      Uri.parse('http://10.0.2.2:8080/api/appointment/create'),
+                      headers: {
+                        "Accept": "application/json",
+                        "content-type": "application/json"
+                      },
+                      body: jsonEncode(<String, String>{
+                        'waktuAwal':
+                            DateFormat("yyyy-MM-ddTHH:mm").format(ansDateTime),
+                        'username_dokter': dropdownValue,
+                        'username_pasien': "muhammad_arga"
+                      }),
+                    );
+                    if (response.statusCode == 200) {
+                      showDialog<String>(
+                        context: context,
+                        builder: (BuildContext context) => AlertDialog(
+                          title: const Text('Berhasil membuat Appointment'),
+                          actions: <Widget>[
+                            TextButton(
+                              onPressed: () => Navigator.pop(context, 'OK'),
+                              child: const Text('OK'),
+                            )
+                          ],
+                        ),
+                      );
+                    } else {
+                      showDialog<String>(
+                        context: context,
+                        builder: (BuildContext context) => AlertDialog(
+                          title: Text(DateFormat("yyyy-MM-ddTHH:mm")
+                              .format(ansDateTime)),
+                          actions: <Widget>[
+                            TextButton(
+                              onPressed: () => Navigator.pop(context, 'OK'),
+                              child: Text('${response.statusCode}'),
+                            )
+                          ],
                         ),
-                        DropdownButton(
-                            items: data.map((Dokter items) {
-                              return DropdownMenuItem(
-                                value: items,
-                                child: Text("${items.nama} - ${items.tagihan}"),
-                              );
-                            }).toList(),
-                            value: dropdownValue,
-                            onChanged: (Dokter newValue) async {
-                              dropdownValue = newValue;
-                            }),
-                        ElevatedButton(
-                          onPressed: () async {
-                            var response = await http.post(
-                              Uri.parse(
-                                  'http://10.0.2.2:8080/api/appointment/create'),
-                              headers: {
-                                "Accept": "application/json",
-                                "content-type": "application/json"
-                              },
-                              body: jsonEncode(<String, String>{
-                                'waktuAwal': DateFormat("yyyy-MM-ddTHH:mm")
-                                    .format(ansDateTime),
-                                'username_dokter': dropdownValue?.username,
-                                'username_pasien': "muhammad_arga"
-                              }),
-                            );
-                            if (response.statusCode == 200) {
-                              showDialog<String>(
-                                context: context,
-                                builder: (BuildContext context) => AlertDialog(
-                                  title: const Text(
-                                      'Berhasil membuat Appointment'),
-                                  actions: <Widget>[
-                                    TextButton(
-                                      onPressed: () =>
-                                          Navigator.pop(context, 'OK'),
-                                      child: const Text('OK'),
-                                    )
-                                  ],
-                                ),
-                              );
-                            } else {
-                              showDialog<String>(
-                                context: context,
-                                builder: (BuildContext context) => AlertDialog(
-                                  title: Text(DateFormat("yyyy-MM-ddTHH:mm")
-                                      .format(ansDateTime)),
-                                  actions: <Widget>[
-                                    TextButton(
-                                      onPressed: () =>
-                                          Navigator.pop(context, 'OK'),
-                                      child: Text('${response.statusCode}'),
-                                    )
-                                  ],
-                                ),
-                              );
-                            }
-                          },
-                          child: const Text('Submit'),
-                        )
-                      ],
-                    ),
-                  );
-                } else {
-                  return const CircularProgressIndicator();
-                }
-              },
-            )));
+                      );
+                    }
+                  },
+                  child: const Text('Submit'),
+                ),
+              ],
+            ),
+          ),
+        ));
   }
 
-  Future<DateTime> pickDate() => showDatePicker(
+  Future<DateTime?> pickDate() => showDatePicker(
       context: context,
       initialDate: dateTime,
       firstDate: dateTime,
       lastDate: DateTime(2023));
 
-  Future<TimeOfDay> pickTime() => showTimePicker(
+  Future<TimeOfDay?> pickTime() => showTimePicker(
       context: context,
       initialTime: TimeOfDay(hour: dateTime.hour, minute: dateTime.minute));
 
   Future pickDateTime() async {
-    DateTime date = await pickDate();
+    DateTime? date = await pickDate();
     if (date == null) return;
 
-    TimeOfDay time = await pickTime();
+    TimeOfDay? time = await pickTime();
     if (time == null) return;
 
     final dateTime = DateTime(
-- 
GitLab


From a69194afb7adfd16f4d521410056975297861003 Mon Sep 17 00:00:00 2001
From: "muhammad.syahrul01" <muhammad.syahrul01@ui.ac.id>
Date: Fri, 25 Nov 2022 09:23:04 +0700
Subject: [PATCH 23/44] feat: routing appointment pages from HomeScreen

---
 tk_apap_flutter/lib/main.dart                    |  4 +++-
 tk_apap_flutter/lib/pages/createAppointment.dart |  1 +
 tk_apap_flutter/lib/pages/login.dart             |  2 +-
 tk_apap_flutter/lib/widgets/drawerWidget.dart    | 12 ++++++++++++
 tk_apap_flutter/pubspec.lock                     | 10 +++++-----
 5 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/tk_apap_flutter/lib/main.dart b/tk_apap_flutter/lib/main.dart
index 4c3e315..b421638 100644
--- a/tk_apap_flutter/lib/main.dart
+++ b/tk_apap_flutter/lib/main.dart
@@ -1,3 +1,4 @@
+import 'package:provider/provider.dart';
 import 'package:tk_apap_flutter/pages/Login.dart';
 import 'package:tk_apap_flutter/pages/HomeScreen.dart';
 import 'package:tk_apap_flutter/pages/edit_profile.dart';
@@ -28,7 +29,8 @@ class MyApp extends StatelessWidget {
         HomeScreen.routeName: (ctx) => HomeScreen(),
         Login.routeName: (ctx) => Login(),
         EditProfile.routeName: (ctx) => EditProfile(),
-        StoryScreen.routeName: (ctx) => StoryScreen()
+        StoryScreen.routeName: (ctx) => StoryScreen(),
+        CreateAppointment.routeName: (ctx) => CreateAppointment(),
       },
       // home: const MyHomePage(title: 'Flutter Demo Home Page'),
     );
diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/createAppointment.dart
index 4174949..fdd8c43 100644
--- a/tk_apap_flutter/lib/pages/createAppointment.dart
+++ b/tk_apap_flutter/lib/pages/createAppointment.dart
@@ -8,6 +8,7 @@ import '../DTO/Appointment.dart';
 import '../DTO/Dokter.dart';
 
 class CreateAppointment extends StatefulWidget {
+  static const routeName = "/appointment";
   const CreateAppointment({Key key}) : super(key: key);
 
   @override
diff --git a/tk_apap_flutter/lib/pages/login.dart b/tk_apap_flutter/lib/pages/login.dart
index 99812e1..154689f 100644
--- a/tk_apap_flutter/lib/pages/login.dart
+++ b/tk_apap_flutter/lib/pages/login.dart
@@ -24,7 +24,7 @@ class _LoginState extends State<Login> {
   UserLogin user = UserLogin("", "");
   bool _isHidden = true;
 
-  final url = Uri.parse('http://192.168.1.4:8080/api/authenticate'); //TODO:ubah sesuai IP Address, nanti pakai link web
+  final url = Uri.parse('http://10.0.2.2:8080/api/authenticate'); //TODO:ubah sesuai IP Address, nanti pakai link web
   final header = <String, String> {
     'Content-Type':
     'application/json; charset=UTF-8'
diff --git a/tk_apap_flutter/lib/widgets/drawerWidget.dart b/tk_apap_flutter/lib/widgets/drawerWidget.dart
index 5f9bcd9..81c346a 100644
--- a/tk_apap_flutter/lib/widgets/drawerWidget.dart
+++ b/tk_apap_flutter/lib/widgets/drawerWidget.dart
@@ -1,4 +1,5 @@
 import 'package:tk_apap_flutter/pages/HomeScreen.dart';
+import 'package:tk_apap_flutter/pages/createAppointment.dart';
 import 'package:tk_apap_flutter/pages/edit_profile.dart';
 import 'package:tk_apap_flutter/pages/story_screen.dart';
 import 'package:tk_apap_flutter/pages/Login.dart';
@@ -73,6 +74,17 @@ class CustomDrawer extends StatelessWidget {
               Navigator.of(context).pushNamed(Login.routeName);
             },
           ),
+          ListTile(
+            leading: FaIcon(
+              FontAwesomeIcons.award,
+              color: Colors.green,
+            ),
+            title: Text('Appointment'),
+            onTap: () async {
+              await SessionManager().destroy();
+              Navigator.of(context).pushNamed(CreateAppointment.routeName);
+            },
+          )
         ],
       ),
     );
diff --git a/tk_apap_flutter/pubspec.lock b/tk_apap_flutter/pubspec.lock
index 082b75e..322a397 100644
--- a/tk_apap_flutter/pubspec.lock
+++ b/tk_apap_flutter/pubspec.lock
@@ -162,7 +162,7 @@ packages:
       name: material_color_utilities
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.2.0"
+    version: "0.1.5"
   meta:
     dependency: transitive
     description:
@@ -335,7 +335,7 @@ packages:
       name: source_span
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.9.1"
+    version: "1.9.0"
   stack_trace:
     dependency: transitive
     description:
@@ -370,7 +370,7 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.13"
+    version: "0.4.12"
   typed_data:
     dependency: transitive
     description:
@@ -384,7 +384,7 @@ packages:
       name: vector_math
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.3"
+    version: "2.1.2"
   win32:
     dependency: transitive
     description:
@@ -400,5 +400,5 @@ packages:
     source: hosted
     version: "0.2.0+2"
 sdks:
-  dart: ">=2.18.0-146.0.dev <3.0.0"
+  dart: ">=2.17.0 <3.0.0"
   flutter: ">=3.0.0"
-- 
GitLab


From 33778d3ab01aa07b9caca925ceb4d5afb1fe9a24 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Fri, 25 Nov 2022 23:16:25 +0700
Subject: [PATCH 24/44] fix: the api response

---
 .../appointment/AppointmentRestController.java             | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 3bee211..438a9f5 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -2,6 +2,7 @@ package spring.TK.SpringTkApap.appointment;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.server.ResponseStatusException;
@@ -19,17 +20,17 @@ public class AppointmentRestController {
     private AppointmentRestService appointmentRestService;
 
     @PostMapping(value = "/create")
-    private AppointmentModel createAppointmentSubmit(@RequestBody CreateAppointmentDTO appointment, BindingResult bindingResult) {
+    private ResponseEntity<String> createAppointmentSubmit(@RequestBody CreateAppointmentDTO appointment, BindingResult bindingResult) {
         if (bindingResult.hasFieldErrors()) {
             throw new ResponseStatusException(
                     HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
             );
         } else {
-            return appointmentRestService.createAppointment(appointment);
+            return ResponseEntity.ok("Created the appointment");
         }
     }
 
-    @GetMapping(value ="/{kode}")
+    @GetMapping(value = "/{kode}")
     private AppointmentModel getAppointment(@PathVariable(name = "kode") String kode) {
         try {
             return appointmentRestService.getAppointment(kode);
-- 
GitLab


From 3f238291a2be38d0f9b2cc367850bf23b3c23ecb Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Tue, 6 Dec 2022 16:51:44 +0700
Subject: [PATCH 25/44] feat:web list appointment and flutter fix for create
 appointment

---
 .../appointment/AppointmentController.java    | 34 ++++++++++++++++--
 .../AppointmentRestController.java            |  2 ++
 .../appointment/model/AppointmentModel.java   |  7 ++--
 .../auth/security/WebSecurityConfig.java      |  3 +-
 .../TK/SpringTkApap/resep/ResepModel.java     |  4 ++-
 .../user/controller/DokterRestController.java |  3 ++
 .../src/main/resources/application-dev.yml    |  2 +-
 .../appointment/view-all-appointment.html     |  6 ++--
 .../appointment/view-appointment.html         | 36 +++++++++++++++++++
 9 files changed, 84 insertions(+), 13 deletions(-)
 create mode 100644 SpringTkApap/src/main/resources/templates/appointment/view-appointment.html

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 8dd6e27..62bcbe9 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -9,6 +9,7 @@ import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.auth.model.RolesEnum;
 import spring.TK.SpringTkApap.auth.model.UserModel;
 import spring.TK.SpringTkApap.auth.service.UserService;
+import spring.TK.SpringTkApap.resep.ResepModel;
 import spring.TK.SpringTkApap.user.model.AdminModel;
 import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
@@ -44,8 +45,8 @@ public class AppointmentController {
         return "add-appointment";
     }
 
-    @GetMapping("/appointment/get-all/{noUser}")
-    public String getAllAppointment(@PathVariable(name = "noUser") String noUser, Model model, Principal principal) {
+    @GetMapping("/appointment/get-all")
+    public String getAllAppointment(Model model, Principal principal) {
         UserModel user = userService.getUserByUsername(principal.getName());
         List<AppointmentModel> listApm;
 
@@ -59,6 +60,33 @@ public class AppointmentController {
                 listApm);
         model.addAttribute("role", user.getRole().toString());
 
-        return "view-all-appointment";
+        return "appointment/view-all-appointment";
+    }
+
+    @GetMapping("/appointment/{kodeAppointment}")
+    public String getAppointment(@PathVariable("kodeAppointment") String kodeApt, Model model, Principal principal) {
+        UserModel user = userService.getUserByUsername(principal.getName());
+        AppointmentModel appointment = appointmentService.getAppointment(kodeApt);
+        List<ResepModel> listResep = appointment.getListResep();
+
+        String resepStatus;
+
+        if (listResep.size() != 0) {
+            resepStatus = "DONE";
+
+            for (ResepModel resep : listResep) {
+                if (resep.getIsDone() == Boolean.FALSE) {
+                    resepStatus = "NOT DONE";
+                    break;
+                }
+            }
+        } else {
+            resepStatus = null;
+        }
+
+        model.addAttribute("resepStatus", resepStatus);
+        model.addAttribute("apt", appointment);
+
+        return "appointment/view-appointment";
     }
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 999c2fb..cc74172 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.NoSuchElementException;
 
 @RestController
+@CrossOrigin(origins = "*")
 @RequestMapping("/api/appointment")
 public class AppointmentRestController {
 
@@ -49,6 +50,7 @@ public class AppointmentRestController {
 
     @GetMapping(value = "/all")
     public List<CreateAppointmentDTO> getAllAppointment() {
+        System.out.println("here");
         return appointmentRestService.retrieveAppointment();
     }
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
index 3974941..446d4dd 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
@@ -13,6 +13,7 @@ import spring.TK.SpringTkApap.user.model.PasienModel;
 import javax.persistence.*;
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Setter
 @Getter
@@ -41,10 +42,8 @@ public class AppointmentModel implements Serializable {
     @OnDelete(action = OnDeleteAction.CASCADE)
     private PasienModel pasien;
 
-    @OneToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = "id", referencedColumnName = "id")
-    @OnDelete(action = OnDeleteAction.CASCADE)
-    private ResepModel resep;
+    @OneToMany(mappedBy = "appointment", fetch = FetchType.EAGER)
+    private List<ResepModel> listResep;
 
     @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
     private transient TagihanModel tagihan;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
index 34d174e..f5fb80a 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
@@ -51,6 +51,7 @@ public class WebSecurityConfig {
                     .antMatchers("/obat/update/**").hasAuthority(APOTEKER)
                     .antMatchers("/user/add/**").hasAuthority(ADMIN)
                     .antMatchers("/user/delete/**").hasAuthority(ADMIN)
+                    .antMatchers("/appointment/get-all").hasAnyAuthority(ADMIN, DOKTER, PASIEN)
                     .anyRequest().authenticated()
                     .and( )
                     .formLogin()
@@ -101,7 +102,7 @@ public class WebSecurityConfig {
                     .authorizeRequests()
                     .antMatchers("/api/authenticate").permitAll()
                     .antMatchers(HttpMethod.GET, "/api/user").hasAuthority(PASIEN)
-                    .anyRequest().hasAuthority(PASIEN)
+                    .anyRequest().hasAnyAuthority(PASIEN, ADMIN)
                     .and()
                     .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint)
                     .and()
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
index cedde8b..1cc2964 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
@@ -40,7 +40,9 @@ public class ResepModel implements Serializable {
     @OneToMany(mappedBy = "resep", fetch = FetchType.EAGER)
     private List<JumlahModel> listJumlah;
 
-    @OneToOne(mappedBy = "resep", fetch = FetchType.EAGER)
+    @ManyToOne(fetch = FetchType.EAGER)
+    @JoinColumn(name = "kode", referencedColumnName = "kode")
+    @OnDelete(action = OnDeleteAction.CASCADE)
     @JsonIgnore
     private AppointmentModel appointment;
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
index 909c5f7..1fa598d 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
@@ -1,6 +1,7 @@
 package spring.TK.SpringTkApap.user.controller;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -10,6 +11,7 @@ import spring.TK.SpringTkApap.user.service.DokterService;
 import java.util.List;
 
 @RestController
+@CrossOrigin(origins = "*")
 @RequestMapping("/api/doktor")
 public class DokterRestController {
 
@@ -18,6 +20,7 @@ public class DokterRestController {
 
     @GetMapping(value = "/all")
     public List<DokterDTO>  getAllDoktor() {
+        System.out.println(dokterService.getAll().get(0));
         return dokterService.getAll();
     }
 
diff --git a/SpringTkApap/src/main/resources/application-dev.yml b/SpringTkApap/src/main/resources/application-dev.yml
index 41e295b..cb834a2 100644
--- a/SpringTkApap/src/main/resources/application-dev.yml
+++ b/SpringTkApap/src/main/resources/application-dev.yml
@@ -18,7 +18,7 @@ spring:
         format_sql: true
 
     # pembuatan database (create || create-drop || validate || update)
-    hibernate.ddl-auto: create
+    hibernate.ddl-auto: update
 
     show-sql: true
 
diff --git a/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html b/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html
index 997566a..a9edf91 100644
--- a/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html
+++ b/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html
@@ -40,15 +40,15 @@
                             <td th:if="${apm.isDone}">Sudah Selesai</td>
                             <td th:unless="${apm.isDone}">Belum Selesai</td>
                             <td>
-                                <a class="btn btn-sm btn-warning" th:href="@{/appointment/detail/} + ${apm.idObat}">Lihat Detail</a>
+                                <a class="btn btn-sm btn-warning" th:href="@{/appointment/detail/} + ${apm.kode}">Lihat Detail</a>
                             </td>
                         </tr>
                         </tbody>
                     </table>
                 </div>
-                <div th:unless="*{listObat.size() != 0}">
+                <div th:unless="*{listApm.size() != 0}">
                     <br>
-                    <h4 th:text="'Belum ada obat yang terdaftar'"></h4>
+                    <h4 th:text="'Belum ada appointment yang terdaftar'"></h4>
                 </div>
                 <br>
                 <a class="btn btn-primary" href="/">Home</a>
diff --git a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
new file mode 100644
index 0000000..c8061fc
--- /dev/null
+++ b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
+<head>
+  <meta charset="UTF-8">
+  <title>RumahSehat - Detail Appointment</title>
+  <object th:include="fragments/fragment :: css" th:remove="tag"></object>
+  <object th:include="fragments/fragment :: js" th:remove="tag"></object>
+</head>
+<body>
+<object th:replace="fragments/fragment :: navbar('Appointment')"></object>
+
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <div class="d-flex justify-content-between">
+          <h2>Detail Appointment</h2>
+        </div>
+        <br>
+
+        <p th:text="'Kode Appointment: ' + ${apt.kode}"></p>
+        <p th:text="'Waktu Awal Appointment: ' + ${apt.waktuAwal}"></p>
+        <p th:if="${apt.isDone}">Status Appointment: Sudah Selesai</p>
+        <p th:unless="${apt.isDone}">Status Appointment: Belum Selesai</p>
+        <p th:text="'Nama Dokter: ' + ${apt.dokter.nama}"></p>
+        <p th:text="'Nama Pasien: ' + ${apt.pasien.nama}"></p>
+        <br>
+        <a class="btn btn-primary" href="/">Home</a>
+        <button type="submit" class="btn btn-primary">Selesai</button>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
-- 
GitLab


From e4f02487e7d92749fee55610d1723cf05cf7dca3 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Tue, 6 Dec 2022 18:46:00 +0700
Subject: [PATCH 26/44] feat: detail pages web (no resep)

---
 .../appointment/AppointmentController.java    | 21 +++++-
 .../appointment/AppointmentService.java       |  2 +
 .../appointment/AppointmentServiceImpl.java   |  5 ++
 .../TK/SpringTkApap/auth/setting/Setting.java |  2 +-
 .../appointment/view-all-appointment.html     |  2 +-
 .../appointment/view-appointment.html         | 67 +++++++++++++------
 6 files changed, 72 insertions(+), 27 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 62bcbe9..9307968 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -5,6 +5,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.auth.model.RolesEnum;
 import spring.TK.SpringTkApap.auth.model.UserModel;
@@ -69,14 +70,14 @@ public class AppointmentController {
         AppointmentModel appointment = appointmentService.getAppointment(kodeApt);
         List<ResepModel> listResep = appointment.getListResep();
 
-        String resepStatus;
+        Boolean resepStatus;
 
         if (listResep.size() != 0) {
-            resepStatus = "DONE";
+            resepStatus = Boolean.FALSE;
 
             for (ResepModel resep : listResep) {
                 if (resep.getIsDone() == Boolean.FALSE) {
-                    resepStatus = "NOT DONE";
+                    resepStatus = Boolean.TRUE;
                     break;
                 }
             }
@@ -89,4 +90,18 @@ public class AppointmentController {
 
         return "appointment/view-appointment";
     }
+
+    @PostMapping("/appointment/{kodeAppointment}")
+    public String changeStatusApt(@PathVariable("kodeAppointment") String kodeApt, Model model) {
+        AppointmentModel appointment = appointmentService.getAppointment(kodeApt);
+        appointment.setIsDone(Boolean.TRUE);
+        appointment.setKode(kodeApt);
+        appointmentService.updateAppointment(appointment);
+        System.out.println("here");
+
+        model.addAttribute("resepStatus", Boolean.FALSE);
+        model.addAttribute("apt", appointment);
+
+        return "appointment/view-appointment";
+    }
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
index 5fc8f03..af88f48 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
@@ -8,6 +8,8 @@ public interface AppointmentService {
 
     AppointmentModel addAppointment(AppointmentModel appointment);
 
+    AppointmentModel updateAppointment(AppointmentModel appointmentModel);
+
     AppointmentModel getAppointment(String kode);
 
     List<AppointmentModel> getAll();
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
index 3960e22..1100c84 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
@@ -29,6 +29,11 @@ public class AppointmentServiceImpl implements AppointmentService{
         return appointmentDB.save(appointment);
     }
 
+    @Override
+    public AppointmentModel updateAppointment(AppointmentModel appointmentModel) {
+        return appointmentDB.save(appointmentModel);
+    }
+
     @Override
     public AppointmentModel getAppointment(String kode) {
         Optional<AppointmentModel> anAppoint = appointmentDB.findByKode(kode);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java
index 23126f8..1492155 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java
@@ -5,7 +5,7 @@ public class Setting {
     private Setting() {
     }
 
-    public static final String CLIENT_BASE_URL = "https://apap-tk-53.cs.ui.ac.id";
+    public static final String CLIENT_BASE_URL = "http://localhost:8080";
 
     public static final String CLIENT_LOGIN = CLIENT_BASE_URL + "/validate-ticket";
 
diff --git a/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html b/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html
index a9edf91..64a49fa 100644
--- a/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html
+++ b/SpringTkApap/src/main/resources/templates/appointment/view-all-appointment.html
@@ -40,7 +40,7 @@
                             <td th:if="${apm.isDone}">Sudah Selesai</td>
                             <td th:unless="${apm.isDone}">Belum Selesai</td>
                             <td>
-                                <a class="btn btn-sm btn-warning" th:href="@{/appointment/detail/} + ${apm.kode}">Lihat Detail</a>
+                                <a class="btn btn-sm btn-warning" th:href="@{/appointment/} + ${apm.kode}">Lihat Detail</a>
                             </td>
                         </tr>
                         </tbody>
diff --git a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
index c8061fc..a04aa25 100644
--- a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
+++ b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
@@ -1,35 +1,58 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
 <head>
-  <meta charset="UTF-8">
-  <title>RumahSehat - Detail Appointment</title>
-  <object th:include="fragments/fragment :: css" th:remove="tag"></object>
-  <object th:include="fragments/fragment :: js" th:remove="tag"></object>
+    <meta charset="UTF-8">
+    <title>RumahSehat - Detail Appointment</title>
+    <object th:include="fragments/fragment :: css" th:remove="tag"></object>
+    <object th:include="fragments/fragment :: js" th:remove="tag"></object>
 </head>
 <body>
 <object th:replace="fragments/fragment :: navbar('Appointment')"></object>
 
 <div class="container">
-  <div class="card m-4 p-4">
-    <div class="card-body">
-      <div class="justify-content-center">
-        <div class="d-flex justify-content-between">
-          <h2>Detail Appointment</h2>
-        </div>
-        <br>
+    <div class="card m-4 p-4">
+        <div class="card-body">
+            <div class="justify-content-center">
+                <div class="d-flex justify-content-between">
+                    <h2>Detail Appointment</h2>
+                </div>
+                <br>
+                <p th:text="'Kode Appointment: ' + ${apt.kode}"></p>
+                <p th:text="'Waktu Awal Appointment: ' + ${apt.waktuAwal}"></p>
+                <p th:if="${apt.isDone}">Status Appointment: Sudah Selesai</p>
+                <p th:unless="${apt.isDone}">Status Appointment: Belum Selesai</p>
+                <p th:text="'Nama Dokter: ' + ${apt.dokter.nama}"></p>
+                <p th:text="'Nama Pasien: ' + ${apt.pasien.nama}"></p>
+                <br>
+
+                <div>
+                    <a class="btn btn-primary" href="#">Detail Resep</a>
+                </div>
+                <br>
+
+                <div th:unless="${apt.isDone}">
+                    <a class="btn btn-primary" href="#">Create Resep</a>
+                    <br>
+
+                    <div th:if="${resepStatus}">
+                        <button type="submit" class="btn btn-primary" disabled>Selesai</button>
+                        <br>
+                    </div>
 
-        <p th:text="'Kode Appointment: ' + ${apt.kode}"></p>
-        <p th:text="'Waktu Awal Appointment: ' + ${apt.waktuAwal}"></p>
-        <p th:if="${apt.isDone}">Status Appointment: Sudah Selesai</p>
-        <p th:unless="${apt.isDone}">Status Appointment: Belum Selesai</p>
-        <p th:text="'Nama Dokter: ' + ${apt.dokter.nama}"></p>
-        <p th:text="'Nama Pasien: ' + ${apt.pasien.nama}"></p>
-        <br>
-        <a class="btn btn-primary" href="/">Home</a>
-        <button type="submit" class="btn btn-primary">Selesai</button>
-      </div>
+                    <div th:unless="${resepStatus}">
+                        <br>
+                        <form th:action="@{/appointment/} + ${apt.kode}" method="POST">
+                            <button type="submit" class="btn btn-primary">Selesai</button>
+                        </form>
+                    </div>
+
+                </div>
+            </div>
+            <br>
+            <a class="btn btn-primary" href="/">Home</a>
+        </div>
     </div>
-  </div>
+</div>
 </div>
 
 </body>
-- 
GitLab


From a32f26b3d4a73b115137fa759cd11f778e5a07e3 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Tue, 6 Dec 2022 23:31:05 +0700
Subject: [PATCH 27/44] feat: adding rest service to create temporary patient

---
 .../AppointmentRestController.java            | 34 ++++++++++++++++---
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index cc74172..2a769a1 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -3,12 +3,18 @@ package spring.TK.SpringTkApap.appointment;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.server.ResponseStatusException;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.appointment.model.GetAptDTO;
+import spring.TK.SpringTkApap.auth.model.RolesEnum;
+import spring.TK.SpringTkApap.user.model.PasienModel;
+import spring.TK.SpringTkApap.user.service.PasienService;
 
+import java.security.Principal;
 import java.util.List;
 import java.util.NoSuchElementException;
 
@@ -20,8 +26,11 @@ public class AppointmentRestController {
     @Autowired
     private AppointmentRestService appointmentRestService;
 
+    @Autowired
+    private PasienService pasienService;
+
     @PostMapping(value = "/create")
-    public ResponseEntity<String> createAppointmentSubmit(@RequestBody CreateAppointmentDTO appointment, BindingResult bindingResult) {
+    public ResponseEntity<String> createAppointmentSubmit(@RequestBody CreateAppointmentDTO appointment, BindingResult bindingResult, Principal principal) {
         if (bindingResult.hasFieldErrors()) {
             throw new ResponseStatusException(
                     HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
@@ -49,10 +58,27 @@ public class AppointmentRestController {
     }
 
     @GetMapping(value = "/all")
-    public List<CreateAppointmentDTO> getAllAppointment() {
-        System.out.println("here");
-        return appointmentRestService.retrieveAppointment();
+    public List<GetAptDTO> getAllAppointment(Principal principal) {
+        PasienModel pasien = pasienService.getPasienByUsername(principal.getName());
+        return appointmentRestService.retrieveAppointment(pasien);
     }
 
 
+    @GetMapping(value = "/tes")
+    public void createPasien() {
+        PasienModel pasien = new PasienModel();
+        pasien.setUmur(30);
+        pasien.setSaldo(500000);
+        pasien.setNama("Argaaaa");
+        pasien.setPassword(encrypt("12345678"));
+        pasien.setEmail("a@gmail.com");
+        pasien.setRole(RolesEnum.PASIEN);
+        pasien.setUsername("aargaa");
+        pasienService.addPasien(pasien);
+    }
+
+    public String encrypt(String password){
+        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        return passwordEncoder.encode(password);
+    }
 }
-- 
GitLab


From e71c9bfa3756729f471ed1583fe27baccfdd436b Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Tue, 6 Dec 2022 23:31:29 +0700
Subject: [PATCH 28/44] feat: adding rest service to create temporary patient

---
 .../TK/SpringTkApap/appointment/AppointmentRestService.java   | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
index 61b9db4..90db754 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
@@ -2,12 +2,14 @@ package spring.TK.SpringTkApap.appointment;
 
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.appointment.model.GetAptDTO;
+import spring.TK.SpringTkApap.user.model.PasienModel;
 
 import java.util.List;
 
 public interface AppointmentRestService {
     AppointmentModel createAppointment(CreateAppointmentDTO appointment);
-    List<CreateAppointmentDTO> retrieveAppointment();
+    List<GetAptDTO> retrieveAppointment(PasienModel pasien);
     AppointmentModel getAppointment(String kode);
     AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate);
 }
-- 
GitLab


From ba1109f125b318d6bb086451d27be811c09caa79 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Tue, 6 Dec 2022 23:32:08 +0700
Subject: [PATCH 29/44] feat: appointment patient from mobile

---
 .../AppointmentRestServiceImpl.java           | 24 ++++++++++++------
 .../appointment/model/GetAptDTO.java          | 18 +++++++++++++
 tk_apap_flutter/lib/main.dart                 |  6 +++--
 ...ppointment.dart => CreateAppointment.dart} |  7 +++---
 tk_apap_flutter/lib/pages/HomeScreen.dart     |  2 +-
 tk_apap_flutter/lib/pages/login.dart          |  4 +--
 tk_apap_flutter/lib/widgets/drawerWidget.dart | 25 ++++++++++++++++---
 7 files changed, 66 insertions(+), 20 deletions(-)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java
 rename tk_apap_flutter/lib/pages/{createAppointment.dart => CreateAppointment.dart} (95%)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index 8f14619..7875c5c 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.appointment.model.GetAptDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.model.PasienModel;
 import spring.TK.SpringTkApap.user.service.DokterService;
@@ -57,15 +58,22 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
     }
 
     @Override
-    public List<CreateAppointmentDTO> retrieveAppointment() {
-        List<AppointmentModel> listAppointment = appointmentDB.findAll();
-        List<CreateAppointmentDTO> list = new ArrayList<>();
+    public List<GetAptDTO> retrieveAppointment(PasienModel pasien) {
+        List<AppointmentModel> listAppointment = pasien.getListAppointment();
+        List<GetAptDTO> list = new ArrayList<>();
         for (AppointmentModel appointment : listAppointment) {
-            CreateAppointmentDTO appDto = new CreateAppointmentDTO();
-            appDto.setWaktuAwal(appointment.getWaktuAwal());
-            appDto.setUsernamePasien(appointment.getPasien().getUsername());
-            appDto.setUsernameDokter(appointment.getDokter().getUsername());
-            list.add(appDto);
+            GetAptDTO dto = new GetAptDTO();
+            dto.setWaktuAwal(appointment.getWaktuAwal().toString());
+            String done = "";
+            if (appointment.getIsDone()) {
+                done = "Done";
+            } else {
+                done = "Not Done";
+            }
+            dto.setIsDone(done);
+            dto.setNamaDokter(appointment.getDokter().getNama());
+
+            list.add(dto);
         }
         return list;
     }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java
new file mode 100644
index 0000000..6fe4bd8
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java
@@ -0,0 +1,18 @@
+package spring.TK.SpringTkApap.appointment.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class GetAptDTO implements Serializable {
+    String namaDokter;
+    String waktuAwal;
+    String isDone;
+}
diff --git a/tk_apap_flutter/lib/main.dart b/tk_apap_flutter/lib/main.dart
index e768af7..f94a2ef 100644
--- a/tk_apap_flutter/lib/main.dart
+++ b/tk_apap_flutter/lib/main.dart
@@ -1,11 +1,12 @@
 import 'package:provider/provider.dart';
 import 'package:tk_apap_flutter/pages/Login.dart';
 import 'package:tk_apap_flutter/pages/HomeScreen.dart';
+import 'package:tk_apap_flutter/pages/DaftarAppointment.dart';
 import 'package:tk_apap_flutter/pages/edit_profile.dart';
 import 'package:tk_apap_flutter/pages/resep.dart';
 import 'package:flutter/material.dart';
 import 'package:tk_apap_flutter/constants/color_constants.dart';
-import 'package:tk_apap_flutter/pages/createAppointment.dart';
+import 'package:tk_apap_flutter/pages/CreateAppointment.dart';
 
 void main() {
   runApp(const MyApp());
@@ -30,7 +31,8 @@ class MyApp extends StatelessWidget {
         Login.routeName: (ctx) => Login(),
         EditProfile.routeName: (ctx) => EditProfile(),
         Resep.routeName: (ctx) => Resep(),
-        CreateAppointment.routeName: (ctx) => CreateAppointment(),
+        CreateAppointment.routeName: (ctx) => const CreateAppointment(),
+        DetailAppointment.routeName: (ctx) => const DetailAppointment()
       },
       // home: const MyHomePage(title: 'Flutter Demo Home Page'),
     );
diff --git a/tk_apap_flutter/lib/pages/createAppointment.dart b/tk_apap_flutter/lib/pages/CreateAppointment.dart
similarity index 95%
rename from tk_apap_flutter/lib/pages/createAppointment.dart
rename to tk_apap_flutter/lib/pages/CreateAppointment.dart
index 36aee10..ffd665d 100644
--- a/tk_apap_flutter/lib/pages/createAppointment.dart
+++ b/tk_apap_flutter/lib/pages/CreateAppointment.dart
@@ -71,7 +71,6 @@ class _CreateAppointmentState extends State<CreateAppointment> {
               builder: (context, snapshot) {
                 if (snapshot.hasData) {
                   var data = snapshot.data;
-                  print(data.toString());
                   return Form(
                     child: Column(
                       mainAxisAlignment: MainAxisAlignment.center,
@@ -100,9 +99,11 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                           onPressed: () async {
                             dynamic token = await SessionManager().get("token");
                             String tknString = "Bearer $token";
+                            dynamic username = await SessionManager().get("username");
+                            String strUsername = username;
                             var response = await http.post(
                               Uri.parse(
-                                  'http://10.5.89.198:8080/api/appointment/create'), //TODO: Ganti sesuai ipconfig
+                                  'http://10.0.2.2:8080/api/appointment/create'), //TODO: Ganti sesuai ipconfig
                               headers: {
                                 'Accept': 'application/json',
                                 'Content-Type': 'application/json; charset=UTF-8',
@@ -111,7 +112,7 @@ class _CreateAppointmentState extends State<CreateAppointment> {
                                 'waktuAwal': DateFormat("yyyy-MM-ddTHH:mm")
                                     .format(ansDateTime),
                                 'username_dokter': dropdownValue,
-                                'username_pasien': "muhammad_arga"
+                                'username_pasien': strUsername
                               }),
                             );
                             if (response.statusCode == 200) {
diff --git a/tk_apap_flutter/lib/pages/HomeScreen.dart b/tk_apap_flutter/lib/pages/HomeScreen.dart
index 30a44d3..24fd641 100644
--- a/tk_apap_flutter/lib/pages/HomeScreen.dart
+++ b/tk_apap_flutter/lib/pages/HomeScreen.dart
@@ -3,7 +3,7 @@ import 'package:google_fonts/google_fonts.dart';
 import 'package:tk_apap_flutter/animation/FadeAnimation.dart';
 import 'package:tk_apap_flutter/constants/color_constants.dart';
 import 'package:tk_apap_flutter/constants/text_style_constants.dart';
-import 'package:tk_apap_flutter/pages/createAppointment.dart';
+import 'package:tk_apap_flutter/pages/CreateAppointment.dart';
 import 'package:tk_apap_flutter/pages/edit_profile.dart';
 import 'package:tk_apap_flutter/widgets/drawerWidget.dart';
 import 'package:flutter/cupertino.dart';
diff --git a/tk_apap_flutter/lib/pages/login.dart b/tk_apap_flutter/lib/pages/login.dart
index 0ace740..e4bd143 100644
--- a/tk_apap_flutter/lib/pages/login.dart
+++ b/tk_apap_flutter/lib/pages/login.dart
@@ -24,7 +24,7 @@ class _LoginState extends State<Login> {
   UserLogin user = UserLogin("", "");
   bool _isHidden = true;
 
-  final url = Uri.parse('http://10.5.89.198:8080/api/authenticate'); //TODO:ubah sesuai IP Address, nanti pakai link web
+  final url = Uri.parse('http://10.0.2.2:8080/api/authenticate'); //TODO:ubah sesuai IP Address, nanti pakai link web
   final header = <String, String> {
     'Content-Type':
     'application/json; charset=UTF-8'
@@ -45,7 +45,7 @@ class _LoginState extends State<Login> {
         final json = jsonEncode(response.body).toString();
         Map<String, dynamic> jsonResponse = await stringToMap(json);
         print(jsonResponse);
-        if (jsonResponse["role"] == "ADMIN") { // TODO: PASIEN
+        if (jsonResponse["role"] == "PASIEN") { // TODO: PASIEN
           saveSession(jsonResponse);
           Navigator.of(context).pushReplacementNamed(HomeScreen.routeName);
         } else {
diff --git a/tk_apap_flutter/lib/widgets/drawerWidget.dart b/tk_apap_flutter/lib/widgets/drawerWidget.dart
index 1874287..06e650c 100644
--- a/tk_apap_flutter/lib/widgets/drawerWidget.dart
+++ b/tk_apap_flutter/lib/widgets/drawerWidget.dart
@@ -1,5 +1,5 @@
 import 'package:tk_apap_flutter/pages/HomeScreen.dart';
-import 'package:tk_apap_flutter/pages/createAppointment.dart';
+import 'package:tk_apap_flutter/pages/CreateAppointment.dart';
 import 'package:tk_apap_flutter/pages/edit_profile.dart';
 import 'package:tk_apap_flutter/pages/resep.dart';
 import 'package:tk_apap_flutter/pages/Login.dart';
@@ -7,6 +7,8 @@ import 'package:flutter/material.dart';
 import 'package:flutter_session_manager/flutter_session_manager.dart';
 import 'package:font_awesome_flutter/font_awesome_flutter.dart';
 
+import '../pages/DaftarAppointment.dart';
+
 class CustomDrawer extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
@@ -68,8 +70,24 @@ class CustomDrawer extends StatelessWidget {
                           color: Colors.black
                       ),),
                     onTap: () async {
-                      await SessionManager().destroy();
-                      Navigator.of(context).pushNamed(Login.routeName);
+                      // await SessionManager().destroy();
+                      Navigator.of(context).pushNamed(CreateAppointment.routeName);
+                    },
+                  ),
+                  ListTile(
+                    leading: FaIcon(
+                      FontAwesomeIcons.paperclip,
+                      color: const Color(0xff023780),
+                    ),
+                    title: Text('List Appointment',
+                      style: TextStyle(
+                          fontSize: 18,
+                          fontWeight: FontWeight.bold,
+                          color: Colors.black
+                      ),),
+                    onTap: () async {
+                      // await SessionManager().destroy();
+                      Navigator.of(context).pushNamed(DetailAppointment.routeName);
                     },
                   ),
                   ListTile(
@@ -121,7 +139,6 @@ class CustomDrawer extends StatelessWidget {
 
                 ]
           )
-
           )],
       ),
     );
-- 
GitLab


From e39a05733e28a0cdb0eb16998752f3547148cd2e Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Wed, 7 Dec 2022 10:52:47 +0700
Subject: [PATCH 30/44] adding DetailAppointment pages

---
 tk_apap_flutter/lib/DTO/AptDTO.dart           |   9 ++
 .../lib/pages/DaftarAppointment.dart          | 107 ++++++++++++++++++
 2 files changed, 116 insertions(+)
 create mode 100644 tk_apap_flutter/lib/DTO/AptDTO.dart
 create mode 100644 tk_apap_flutter/lib/pages/DaftarAppointment.dart

diff --git a/tk_apap_flutter/lib/DTO/AptDTO.dart b/tk_apap_flutter/lib/DTO/AptDTO.dart
new file mode 100644
index 0000000..4bcc3ea
--- /dev/null
+++ b/tk_apap_flutter/lib/DTO/AptDTO.dart
@@ -0,0 +1,9 @@
+class AptDTO {
+  String namaDokter;
+  String waktuAwal;
+  String isDone;
+
+  AptDTO();
+
+  AptDTO.createAptDTO(this.namaDokter, this.waktuAwal, this.isDone);
+}
\ No newline at end of file
diff --git a/tk_apap_flutter/lib/pages/DaftarAppointment.dart b/tk_apap_flutter/lib/pages/DaftarAppointment.dart
new file mode 100644
index 0000000..9e71bc1
--- /dev/null
+++ b/tk_apap_flutter/lib/pages/DaftarAppointment.dart
@@ -0,0 +1,107 @@
+import 'dart:convert';
+import 'dart:ffi';
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_session_manager/flutter_session_manager.dart';
+import 'package:http/http.dart' as http;
+
+import '../DTO/AptDTO.dart';
+
+class DetailAppointment extends StatefulWidget {
+  static const routeName = "/appointment/get-all";
+
+  const DetailAppointment({Key key}) : super(key: key);
+
+  @override
+  State<DetailAppointment> createState() => _DetailAppointmentState();
+}
+
+class _DetailAppointmentState extends State<DetailAppointment> {
+
+  Future<List<AptDTO>> getAppointment() async {
+    var uri = Uri.parse('http://10.0.2.2:8080/api/appointment/all');
+    dynamic token = await SessionManager().get('token');
+    String tknString = ('Bearer $token');
+    http.Response response = await http.get(uri,
+        headers: {
+          'Accept': 'application/json',
+          'Content-Type': 'application/json; charset=UTF-8',
+          'Authorization': tknString
+        });
+    if (response.statusCode == 200) {
+      List<AptDTO> list = <AptDTO>[];
+      List jsonData = jsonDecode(response.body);
+      for (int i = 0; i < jsonData.length; i++) {
+        AptDTO apt = AptDTO.createAptDTO(jsonData[i]['namaDokter'] as String,
+            jsonData[i]['waktuAwal'] as String,
+            jsonData[i]['isDone'] as String);
+        list.add(apt);
+      }
+      return list;
+    } else {
+      throw response.statusCode;
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        appBar: AppBar(title: const Text("Daftar Appointment")),
+        body: Container(
+          margin: const EdgeInsets.all(24),
+          child: FutureBuilder<List<AptDTO>>(
+            future: getAppointment(),
+            builder: (context, snapshot) {
+              if (snapshot.hasData) {
+                List data = snapshot.data;
+                return Container(
+                  child: ListView.builder(
+                      itemCount: data.length,
+                      itemBuilder: (context, index) {
+                        AptDTO apt = data[index];
+                        return InkWell(
+                            onTap: () {},
+                            child: Card(
+                                shape: const RoundedRectangleBorder(),
+                              child: Padding(
+                                padding: const EdgeInsets.all(20),
+                                child: Column(
+                                  children: <Widget> [
+                                    Text(
+                                      'Dokter ${apt.namaDokter}',
+                                      style: const TextStyle(
+                                        fontSize: 16,
+                                        fontWeight: FontWeight.w500,
+                                      ),
+                                    ),
+                                    Text(
+                                      apt.waktuAwal,
+                                      style: const TextStyle(
+                                        fontSize: 16,
+                                        fontWeight: FontWeight.w500
+                                      ),
+                                    ),
+                                    Text(
+                                      'Status: ${apt.isDone}',
+                                      style: const TextStyle(
+                                        fontSize: 16,
+                                        fontWeight: FontWeight.w500,
+                                      ),
+                                    ),
+                                  ],
+                                ),
+                              ),
+                            )
+                        );
+                      })
+                );
+              } else {
+                return const CircularProgressIndicator();
+              }
+            },
+          ),
+        )
+    );
+  }
+}
-- 
GitLab


From 23e41990dac5645863a5c86f8a32ec64b9d7a504 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Wed, 7 Dec 2022 11:33:20 +0700
Subject: [PATCH 31/44] feat: adding modal to appointment with no resep

---
 .../appointment/AppointmentController.java    |  8 ++---
 .../appointment/view-appointment.html         | 36 +++++++++++++++++--
 2 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 9307968..1d0b801 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -70,19 +70,19 @@ public class AppointmentController {
         AppointmentModel appointment = appointmentService.getAppointment(kodeApt);
         List<ResepModel> listResep = appointment.getListResep();
 
-        Boolean resepStatus;
+        Integer resepStatus;
 
         if (listResep.size() != 0) {
-            resepStatus = Boolean.FALSE;
+            resepStatus = 1;
 
             for (ResepModel resep : listResep) {
                 if (resep.getIsDone() == Boolean.FALSE) {
-                    resepStatus = Boolean.TRUE;
+                    resepStatus = 2;
                     break;
                 }
             }
         } else {
-            resepStatus = null;
+            resepStatus = 3;
         }
 
         model.addAttribute("resepStatus", resepStatus);
diff --git a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
index a04aa25..d28e5ed 100644
--- a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
+++ b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
@@ -1,6 +1,10 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
 <head>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
     <meta charset="UTF-8">
     <title>RumahSehat - Detail Appointment</title>
     <object th:include="fragments/fragment :: css" th:remove="tag"></object>
@@ -34,18 +38,23 @@
                     <a class="btn btn-primary" href="#">Create Resep</a>
                     <br>
 
-                    <div th:if="${resepStatus}">
+                    <div th:if="${resepStatus == 2}">
                         <button type="submit" class="btn btn-primary" disabled>Selesai</button>
                         <br>
                     </div>
 
-                    <div th:unless="${resepStatus}">
+                    <div th:if="${resepStatus == 1}">
                         <br>
                         <form th:action="@{/appointment/} + ${apt.kode}" method="POST">
                             <button type="submit" class="btn btn-primary">Selesai</button>
                         </form>
                     </div>
 
+                    <div th:if="${resepStatus == 3}">
+                        <br>
+                        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">Selesai</button>
+                    </div>
+
                 </div>
             </div>
             <br>
@@ -53,6 +62,29 @@
         </div>
     </div>
 </div>
+
+
+<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="exampleModalLabel">Warning!</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <p>Appointment ini tidak memiliki resep</p>
+                <p>Apakah anda yakin ingin menyelesaikan appointment ini?</p>
+            </div>
+            <div class="modal-footer">
+                <form th:action="@{/appointment/} + ${apt.kode}" method="POST">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+                <button type="submit" class="btn btn-primary">Save changes</button>
+                </form>
+            </div>
+        </div>
+    </div>
 </div>
 
 </body>
-- 
GitLab


From b91d07af2b05aff0752c9f12fb3b6914fcb99e13 Mon Sep 17 00:00:00 2001
From: Arga Christian Roymansa <arga.christian@ui.ac.id>
Date: Wed, 7 Dec 2022 12:07:49 +0700
Subject: [PATCH 32/44] Update
 SpringTkApap/src/main/resources/application-prod.yml

---
 SpringTkApap/src/main/resources/application-prod.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/SpringTkApap/src/main/resources/application-prod.yml b/SpringTkApap/src/main/resources/application-prod.yml
index 0a719c4..43f3d2f 100644
--- a/SpringTkApap/src/main/resources/application-prod.yml
+++ b/SpringTkApap/src/main/resources/application-prod.yml
@@ -29,5 +29,7 @@ spring:
 
     show-sql: true
 
+
 jwt:
   secret: ta_a_ori_53
+
-- 
GitLab


From f8504146842110cab811ecf7581ca8741e134b3e Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Wed, 7 Dec 2022 14:22:39 +0700
Subject: [PATCH 33/44] changes

---
 .../AppointmentRestController.java            | 17 +++++--------
 .../appointment/AppointmentRestService.java   |  4 ++--
 .../AppointmentRestServiceImpl.java           | 24 +++++++++++--------
 .../appointment/model/DetailDTO.java          | 21 ++++++++++++++++
 .../TK/SpringTkApap/auth/setting/Setting.java |  2 +-
 5 files changed, 44 insertions(+), 24 deletions(-)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 2a769a1..17f83aa 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.server.ResponseStatusException;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.appointment.model.DetailDTO;
 import spring.TK.SpringTkApap.appointment.model.GetAptDTO;
 import spring.TK.SpringTkApap.auth.model.RolesEnum;
 import spring.TK.SpringTkApap.user.model.PasienModel;
@@ -46,17 +47,6 @@ public class AppointmentRestController {
         }
     }
 
-    @GetMapping(value = "/{kode}")
-    public AppointmentModel getAppointment(@PathVariable(name = "kode") String kode) {
-        try {
-            return appointmentRestService.getAppointment(kode);
-        } catch (NoSuchElementException e) {
-            throw new ResponseStatusException(
-                    HttpStatus.NOT_FOUND, "Appointment " + kode + " tidak ditemukan."
-            );
-        }
-    }
-
     @GetMapping(value = "/all")
     public List<GetAptDTO> getAllAppointment(Principal principal) {
         PasienModel pasien = pasienService.getPasienByUsername(principal.getName());
@@ -77,6 +67,11 @@ public class AppointmentRestController {
         pasienService.addPasien(pasien);
     }
 
+    @GetMapping(value = "/appointment-detail/{kodeApt}")
+    public DetailDTO getDetailApt(@PathVariable(name = "kodeApt") String kode) {
+        return appointmentRestService.getAppointment(kode);
+    }
+
     public String encrypt(String password){
         BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
         return passwordEncoder.encode(password);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
index 90db754..7aa01c6 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestService.java
@@ -2,6 +2,7 @@ package spring.TK.SpringTkApap.appointment;
 
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.appointment.model.DetailDTO;
 import spring.TK.SpringTkApap.appointment.model.GetAptDTO;
 import spring.TK.SpringTkApap.user.model.PasienModel;
 
@@ -10,6 +11,5 @@ import java.util.List;
 public interface AppointmentRestService {
     AppointmentModel createAppointment(CreateAppointmentDTO appointment);
     List<GetAptDTO> retrieveAppointment(PasienModel pasien);
-    AppointmentModel getAppointment(String kode);
-    AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate);
+    DetailDTO getAppointment(String kode);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index 7875c5c..68551f9 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.appointment.model.CreateAppointmentDTO;
+import spring.TK.SpringTkApap.appointment.model.DetailDTO;
 import spring.TK.SpringTkApap.appointment.model.GetAptDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.model.PasienModel;
@@ -79,19 +80,22 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
     }
 
     @Override
-    public AppointmentModel getAppointment(String kode) {
+    public DetailDTO getAppointment(String kode) {
         Optional<AppointmentModel> appointment = appointmentDB.findByKode(kode);
+        AppointmentModel apt;
         if (appointment.isPresent()) {
-            return appointment.get();
+            apt = appointment.get();
+        } else {
+            throw new NoSuchElementException();
         }
-        throw new NoSuchElementException();
-    }
-
-    @Override
-    public AppointmentModel updateAppointment(String kode, AppointmentModel appointmentUpdate) {
-        AppointmentModel appointment =getAppointment(kode);
-        appointment.setIsDone(appointmentUpdate.getIsDone());
-        return appointment;
+        DetailDTO newApt = new DetailDTO();
+        newApt.setKodeApt(apt.getKode());
+        newApt.setWaktuAwal(apt.getWaktuAwal().toString());
+        newApt.setDetailResep(apt.getListResep().size());
+        newApt.setIsDone(apt.getIsDone());
+        newApt.setNamaPasien(apt.getPasien().getNama());
+        newApt.setNamaDokter(apt.getDokter().getNama());
+        return newApt;
     }
 
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java
new file mode 100644
index 0000000..ef11504
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java
@@ -0,0 +1,21 @@
+package spring.TK.SpringTkApap.appointment.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class DetailDTO implements Serializable {
+    String kodeApt;
+    String waktuAwal;
+    Boolean isDone;
+    String namaDokter;
+    String namaPasien;
+    Integer detailResep;
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java
index 1492155..23126f8 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/setting/Setting.java
@@ -5,7 +5,7 @@ public class Setting {
     private Setting() {
     }
 
-    public static final String CLIENT_BASE_URL = "http://localhost:8080";
+    public static final String CLIENT_BASE_URL = "https://apap-tk-53.cs.ui.ac.id";
 
     public static final String CLIENT_LOGIN = CLIENT_BASE_URL + "/validate-ticket";
 
-- 
GitLab


From 8034e184ca63fd5ad460d2133a121ca09071d398 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Wed, 7 Dec 2022 14:27:33 +0700
Subject: [PATCH 34/44] changes

---
 app.env                                       |  6 ++---
 tk_apap_flutter/lib/DTO/DetailDTO.dart        | 13 +++++++++
 .../lib/pages/DetailAppointment.dart          | 27 +++++++++++++++++++
 3 files changed, 43 insertions(+), 3 deletions(-)
 create mode 100644 tk_apap_flutter/lib/DTO/DetailDTO.dart
 create mode 100644 tk_apap_flutter/lib/pages/DetailAppointment.dart

diff --git a/app.env b/app.env
index f92f5b5..11e23f2 100644
--- a/app.env
+++ b/app.env
@@ -1,6 +1,6 @@
 SPRING_PROFILES_ACTIVE=prod
 
 MYSQL_ROOT_PASSWORD=password123456!
-MYSQL_DATABASE=tkapap
-MYSQL_USER=root
-MYSQL_PASSWORD=
\ No newline at end of file
+MYSQL_DATABASE=apap_db
+MYSQL_USER=apap_user
+MYSQL_PASSWORD=password1234!
diff --git a/tk_apap_flutter/lib/DTO/DetailDTO.dart b/tk_apap_flutter/lib/DTO/DetailDTO.dart
new file mode 100644
index 0000000..4e4365b
--- /dev/null
+++ b/tk_apap_flutter/lib/DTO/DetailDTO.dart
@@ -0,0 +1,13 @@
+class DetailDTO {
+  String kodeApt;
+  String waktuAwal;
+  String isDone;
+  String namaDokter;
+  String namaPasien;
+  String detailResep;
+
+  DetailDTO();
+
+  DetailDTO.createAptDTO(this.kodeApt, this.waktuAwal, this.isDone,
+      this.namaDokter, this.namaPasien, this.detailResep);
+}
diff --git a/tk_apap_flutter/lib/pages/DetailAppointment.dart b/tk_apap_flutter/lib/pages/DetailAppointment.dart
new file mode 100644
index 0000000..0abaeb4
--- /dev/null
+++ b/tk_apap_flutter/lib/pages/DetailAppointment.dart
@@ -0,0 +1,27 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+import '../DTO/DetailDTO.dart';
+
+class DetailAppointment extends StatefulWidget {
+  const DetailAppointment({Key key}) : super(key: key);
+
+  @override
+  State<DetailAppointment> createState() => _DetailAppointmentState();
+}
+
+class _DetailAppointmentState extends State<DetailAppointment> {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(title: const Text("Detail Appointment")),
+      body: Container(
+        margin: const EdgeInsets.all(24),
+        child: FutureBuilder<List<DetailDTO>>(
+          future: ,
+          builder: ,
+        ),
+      )
+    );
+  }
+}
-- 
GitLab


From 0b7ca8cdc915ac7aafa08a0b8eee9d3ac2512eae Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Sat, 10 Dec 2022 12:44:38 +0700
Subject: [PATCH 35/44] feat: detail appointment

---
 .../AppointmentRestController.java            |   2 +-
 .../AppointmentRestServiceImpl.java           |  10 +-
 .../appointment/model/DetailDTO.java          |   2 +-
 .../appointment/model/GetAptDTO.java          |   1 +
 tk_apap_flutter/lib/DTO/AptDTO.dart           |   3 +-
 tk_apap_flutter/lib/DTO/DetailDTO.dart        |   4 +-
 tk_apap_flutter/lib/main.dart                 |   4 +-
 .../lib/pages/DaftarAppointment.dart          | 111 ++++++++--------
 .../lib/pages/DetailAppointment.dart          | 123 ++++++++++++++++--
 tk_apap_flutter/lib/widgets/drawerWidget.dart |   2 +-
 10 files changed, 189 insertions(+), 73 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 17f83aa..e22e8c7 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -67,7 +67,7 @@ public class AppointmentRestController {
         pasienService.addPasien(pasien);
     }
 
-    @GetMapping(value = "/appointment-detail/{kodeApt}")
+    @GetMapping(value = "/detail/{kodeApt}")
     public DetailDTO getDetailApt(@PathVariable(name = "kodeApt") String kode) {
         return appointmentRestService.getAppointment(kode);
     }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index 68551f9..ef9e5dc 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -73,6 +73,7 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
             }
             dto.setIsDone(done);
             dto.setNamaDokter(appointment.getDokter().getNama());
+            dto.setKodeApt(appointment.getKode());
 
             list.add(dto);
         }
@@ -81,6 +82,7 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
 
     @Override
     public DetailDTO getAppointment(String kode) {
+        System.out.println(kode);
         Optional<AppointmentModel> appointment = appointmentDB.findByKode(kode);
         AppointmentModel apt;
         if (appointment.isPresent()) {
@@ -88,11 +90,17 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
         } else {
             throw new NoSuchElementException();
         }
+        String done = "";
+        if (apt.getIsDone()) {
+            done = "Done";
+        } else {
+            done = "Not Done";
+        }
         DetailDTO newApt = new DetailDTO();
         newApt.setKodeApt(apt.getKode());
         newApt.setWaktuAwal(apt.getWaktuAwal().toString());
         newApt.setDetailResep(apt.getListResep().size());
-        newApt.setIsDone(apt.getIsDone());
+        newApt.setIsDone(done);
         newApt.setNamaPasien(apt.getPasien().getNama());
         newApt.setNamaDokter(apt.getDokter().getNama());
         return newApt;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java
index ef11504..d0cbb09 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/DetailDTO.java
@@ -14,7 +14,7 @@ import java.io.Serializable;
 public class DetailDTO implements Serializable {
     String kodeApt;
     String waktuAwal;
-    Boolean isDone;
+    String isDone;
     String namaDokter;
     String namaPasien;
     Integer detailResep;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java
index 6fe4bd8..ab13dab 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/GetAptDTO.java
@@ -15,4 +15,5 @@ public class GetAptDTO implements Serializable {
     String namaDokter;
     String waktuAwal;
     String isDone;
+    String kodeApt;
 }
diff --git a/tk_apap_flutter/lib/DTO/AptDTO.dart b/tk_apap_flutter/lib/DTO/AptDTO.dart
index 4bcc3ea..cfb22ea 100644
--- a/tk_apap_flutter/lib/DTO/AptDTO.dart
+++ b/tk_apap_flutter/lib/DTO/AptDTO.dart
@@ -2,8 +2,9 @@ class AptDTO {
   String namaDokter;
   String waktuAwal;
   String isDone;
+  String kodeApt;
 
   AptDTO();
 
-  AptDTO.createAptDTO(this.namaDokter, this.waktuAwal, this.isDone);
+  AptDTO.createAptDTO(this.namaDokter, this.waktuAwal, this.isDone, this.kodeApt);
 }
\ No newline at end of file
diff --git a/tk_apap_flutter/lib/DTO/DetailDTO.dart b/tk_apap_flutter/lib/DTO/DetailDTO.dart
index 4e4365b..2a43168 100644
--- a/tk_apap_flutter/lib/DTO/DetailDTO.dart
+++ b/tk_apap_flutter/lib/DTO/DetailDTO.dart
@@ -4,10 +4,10 @@ class DetailDTO {
   String isDone;
   String namaDokter;
   String namaPasien;
-  String detailResep;
+  int detailResep;
 
   DetailDTO();
 
-  DetailDTO.createAptDTO(this.kodeApt, this.waktuAwal, this.isDone,
+  DetailDTO.createDetailDTO(this.kodeApt, this.waktuAwal, this.isDone,
       this.namaDokter, this.namaPasien, this.detailResep);
 }
diff --git a/tk_apap_flutter/lib/main.dart b/tk_apap_flutter/lib/main.dart
index f94a2ef..56af8f3 100644
--- a/tk_apap_flutter/lib/main.dart
+++ b/tk_apap_flutter/lib/main.dart
@@ -1,4 +1,5 @@
 import 'package:provider/provider.dart';
+import 'package:tk_apap_flutter/pages/DetailAppointment.dart';
 import 'package:tk_apap_flutter/pages/Login.dart';
 import 'package:tk_apap_flutter/pages/HomeScreen.dart';
 import 'package:tk_apap_flutter/pages/DaftarAppointment.dart';
@@ -32,7 +33,8 @@ class MyApp extends StatelessWidget {
         EditProfile.routeName: (ctx) => EditProfile(),
         Resep.routeName: (ctx) => Resep(),
         CreateAppointment.routeName: (ctx) => const CreateAppointment(),
-        DetailAppointment.routeName: (ctx) => const DetailAppointment()
+        DaftarAppointment.routeName: (ctx) => const DaftarAppointment(),
+        DetailAppointment.routeName: (ctx) => DetailAppointment(),
       },
       // home: const MyHomePage(title: 'Flutter Demo Home Page'),
     );
diff --git a/tk_apap_flutter/lib/pages/DaftarAppointment.dart b/tk_apap_flutter/lib/pages/DaftarAppointment.dart
index 9e71bc1..d30aa6c 100644
--- a/tk_apap_flutter/lib/pages/DaftarAppointment.dart
+++ b/tk_apap_flutter/lib/pages/DaftarAppointment.dart
@@ -1,41 +1,42 @@
 import 'dart:convert';
-import 'dart:ffi';
+import 'dart:developer';
 
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_session_manager/flutter_session_manager.dart';
 import 'package:http/http.dart' as http;
+import 'package:tk_apap_flutter/pages/DetailAppointment.dart';
 
 import '../DTO/AptDTO.dart';
 
-class DetailAppointment extends StatefulWidget {
+class DaftarAppointment extends StatefulWidget {
   static const routeName = "/appointment/get-all";
 
-  const DetailAppointment({Key key}) : super(key: key);
+  const DaftarAppointment({Key key}) : super(key: key);
 
   @override
-  State<DetailAppointment> createState() => _DetailAppointmentState();
+  State<DaftarAppointment> createState() => _DaftarAppointmentState();
 }
 
-class _DetailAppointmentState extends State<DetailAppointment> {
-
+class _DaftarAppointmentState extends State<DaftarAppointment> {
   Future<List<AptDTO>> getAppointment() async {
     var uri = Uri.parse('http://10.0.2.2:8080/api/appointment/all');
     dynamic token = await SessionManager().get('token');
     String tknString = ('Bearer $token');
-    http.Response response = await http.get(uri,
-        headers: {
-          'Accept': 'application/json',
-          'Content-Type': 'application/json; charset=UTF-8',
-          'Authorization': tknString
-        });
+    http.Response response = await http.get(uri, headers: {
+      'Accept': 'application/json',
+      'Content-Type': 'application/json; charset=UTF-8',
+      'Authorization': tknString
+    });
     if (response.statusCode == 200) {
       List<AptDTO> list = <AptDTO>[];
       List jsonData = jsonDecode(response.body);
       for (int i = 0; i < jsonData.length; i++) {
-        AptDTO apt = AptDTO.createAptDTO(jsonData[i]['namaDokter'] as String,
+        AptDTO apt = AptDTO.createAptDTO(
+            jsonData[i]['namaDokter'] as String,
             jsonData[i]['waktuAwal'] as String,
-            jsonData[i]['isDone'] as String);
+            jsonData[i]['isDone'] as String,
+            jsonData[i]['kodeApt'] as String);
         list.add(apt);
       }
       return list;
@@ -56,52 +57,60 @@ class _DetailAppointmentState extends State<DetailAppointment> {
               if (snapshot.hasData) {
                 List data = snapshot.data;
                 return Container(
-                  child: ListView.builder(
-                      itemCount: data.length,
-                      itemBuilder: (context, index) {
-                        AptDTO apt = data[index];
-                        return InkWell(
-                            onTap: () {},
-                            child: Card(
+                    child: ListView.builder(
+                        itemCount: data.length,
+                        itemBuilder: (context, index) {
+                          AptDTO apt = data[index];
+                          return InkWell(
+                              onTap: () async {
+                                SessionManager().set('kodeApt', apt.kodeApt);
+                                log(await SessionManager().get('kodeApt') as String);
+                                Navigator.of(context)
+                                    .pushNamed(DetailAppointment.routeName);
+                              },
+                              child: Card(
                                 shape: const RoundedRectangleBorder(),
-                              child: Padding(
-                                padding: const EdgeInsets.all(20),
-                                child: Column(
-                                  children: <Widget> [
-                                    Text(
-                                      'Dokter ${apt.namaDokter}',
-                                      style: const TextStyle(
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.w500,
+                                child: Padding(
+                                  padding: const EdgeInsets.all(20),
+                                  child: Column(
+                                    children: <Widget>[
+                                      Text(
+                                        'Dokter ${apt.namaDokter}',
+                                        style: const TextStyle(
+                                          fontSize: 16,
+                                          fontWeight: FontWeight.w500,
+                                        ),
                                       ),
-                                    ),
-                                    Text(
-                                      apt.waktuAwal,
-                                      style: const TextStyle(
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.w500
+                                      Text(
+                                        apt.waktuAwal,
+                                        style: const TextStyle(
+                                            fontSize: 16,
+                                            fontWeight: FontWeight.w500),
                                       ),
-                                    ),
-                                    Text(
-                                      'Status: ${apt.isDone}',
-                                      style: const TextStyle(
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.w500,
+                                      Text(
+                                        'Status: ${apt.isDone}',
+                                        style: const TextStyle(
+                                          fontSize: 16,
+                                          fontWeight: FontWeight.w500,
+                                        ),
                                       ),
-                                    ),
-                                  ],
+                                      Text(
+                                        'Kode: ${apt.kodeApt}',
+                                        style: const TextStyle(
+                                          fontSize: 16,
+                                          fontWeight: FontWeight.w500,
+                                        ),
+                                      )
+                                    ],
+                                  ),
                                 ),
-                              ),
-                            )
-                        );
-                      })
-                );
+                              ));
+                        }));
               } else {
                 return const CircularProgressIndicator();
               }
             },
           ),
-        )
-    );
+        ));
   }
 }
diff --git a/tk_apap_flutter/lib/pages/DetailAppointment.dart b/tk_apap_flutter/lib/pages/DetailAppointment.dart
index 0abaeb4..6dc124a 100644
--- a/tk_apap_flutter/lib/pages/DetailAppointment.dart
+++ b/tk_apap_flutter/lib/pages/DetailAppointment.dart
@@ -1,27 +1,122 @@
+import 'dart:convert';
+import 'dart:developer';
+
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_session_manager/flutter_session_manager.dart';
+import 'package:http/http.dart' as http;
+import 'package:tk_apap_flutter/pages/HomeScreen.dart';
 
 import '../DTO/DetailDTO.dart';
 
-class DetailAppointment extends StatefulWidget {
+class DetailAppointment extends StatelessWidget {
+  static const routeName = "/appointment/get";
+
   const DetailAppointment({Key key}) : super(key: key);
 
-  @override
-  State<DetailAppointment> createState() => _DetailAppointmentState();
-}
+  Future<DetailDTO> getDetailApt() async {
+    String kode = await SessionManager().get("kodeApt") as String;
+    var uri = Uri.parse('http://10.0.2.2:8080/api/appointment/detail/$kode');
+    dynamic token = await SessionManager().get("token");
+    String tknString = 'Bearer $token';
+    log("here");
+    http.Response response = await http.get(uri, headers: {
+      'Accept': 'application/json',
+      'Content-Type': 'application/json; charset=UTF-8',
+      'Authorization': tknString});
+    if (response.statusCode == 200) {
+      Map jsonData = jsonDecode(response.body);
+      log(jsonData['namaDokter'] as String);
+      DetailDTO detail = DetailDTO.createDetailDTO(
+          jsonData['kodeApt'] as String,
+          jsonData['waktuAwal'] as String,
+          jsonData['isDone'] as String,
+          jsonData['namaDokter'] as String,
+          jsonData['namaPasien'] as String,
+          jsonData['detailResep'] as int);
+      log('detailResep ${detail.detailResep}');
+      return detail;
+    } else {
+      log(response.statusCode as String);
+      throw response.statusCode;
+    }
+  }
 
-class _DetailAppointmentState extends State<DetailAppointment> {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-      appBar: AppBar(title: const Text("Detail Appointment")),
-      body: Container(
-        margin: const EdgeInsets.all(24),
-        child: FutureBuilder<List<DetailDTO>>(
-          future: ,
-          builder: ,
-        ),
-      )
+        appBar: AppBar(title: const Text("Detail Appointment")),
+        body: Column(
+          children: <Widget> [
+            Container(
+              margin: const EdgeInsets.only(top: 24, left: 24, right: 24),
+              width: double.infinity,
+              child: FutureBuilder<DetailDTO>(
+                future: getDetailApt(),
+                builder: (context, snapshot) {
+                  if (snapshot.hasData) {
+                    DetailDTO data = snapshot.data;
+                    return Container(
+                      child: Card(
+                        shape: const RoundedRectangleBorder(),
+                        child: Padding(
+                          padding: const EdgeInsets.all(16),
+                          child: Column(
+                            crossAxisAlignment: CrossAxisAlignment.start,
+                            children: <Widget>[
+                              Text(
+                                'Kode Appointment:  ${data.kodeApt}',
+                                style: const TextStyle(
+                                  fontSize: 16,
+                                  fontWeight: FontWeight.w500,
+                                ),
+                              ),
+                              Text(data.waktuAwal,
+                                  style: const TextStyle(
+                                    fontWeight: FontWeight.w500,
+                                    fontSize: 16,
+                                  )),
+                              Text(
+                                'Status: ${data.isDone}',
+                                style: const TextStyle(
+                                  fontWeight: FontWeight.w500,
+                                  fontSize: 16,
+                                ),
+                              ),
+                              Text(
+                                'Nama Dokter: ${data.namaDokter}',
+                                style: const TextStyle(
+                                  fontWeight: FontWeight.w500,
+                                  fontSize: 16,
+                                ),
+                              ),
+                              Text(
+                                'Nama Pasien ${data.namaPasien}',
+                                style: const TextStyle(
+                                  fontWeight: FontWeight.w500,
+                                  fontSize: 16,
+                                ),
+                              ),
+                              const SizedBox(height: 16,),
+                              TextButton(
+                                onPressed: (data.detailResep == 0) ? null : () {
+                                    return Navigator.of(context).pushNamed(HomeScreen.routeName); // TODO: Ke Resep
+                                },
+                                child: (data.detailResep == 0) ? const Text('Tidak Ada Resep') : const Text('Detail Resep'),
+                              ),
+                            ],
+                          ),
+                        ),
+                      ),
+                    );
+                  } else {
+                    return CircularProgressIndicator();
+                  }
+                },
+              ),
+            ),
+          ],
+        )
     );
   }
-}
+}
\ No newline at end of file
diff --git a/tk_apap_flutter/lib/widgets/drawerWidget.dart b/tk_apap_flutter/lib/widgets/drawerWidget.dart
index 06e650c..6c9187b 100644
--- a/tk_apap_flutter/lib/widgets/drawerWidget.dart
+++ b/tk_apap_flutter/lib/widgets/drawerWidget.dart
@@ -87,7 +87,7 @@ class CustomDrawer extends StatelessWidget {
                       ),),
                     onTap: () async {
                       // await SessionManager().destroy();
-                      Navigator.of(context).pushNamed(DetailAppointment.routeName);
+                      Navigator.of(context).pushNamed(DaftarAppointment.routeName);
                     },
                   ),
                   ListTile(
-- 
GitLab


From dc035fdfce54869de83782dfe3708eedbdb60432 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Sun, 11 Dec 2022 09:33:10 +0700
Subject: [PATCH 36/44] fix: fixing daftar appointment and detail appointment

---
 .../lib/pages/DaftarAppointment.dart          | 100 +++++++++---------
 1 file changed, 50 insertions(+), 50 deletions(-)

diff --git a/tk_apap_flutter/lib/pages/DaftarAppointment.dart b/tk_apap_flutter/lib/pages/DaftarAppointment.dart
index 44af54d..4991791 100644
--- a/tk_apap_flutter/lib/pages/DaftarAppointment.dart
+++ b/tk_apap_flutter/lib/pages/DaftarAppointment.dart
@@ -3,36 +3,37 @@ import 'dart:convert';
 import 'package:flutter/material.dart';
 import 'package:flutter_session_manager/flutter_session_manager.dart';
 import 'package:http/http.dart' as http;
+import 'package:tk_apap_flutter/pages/DetailAppointment.dart';
 import '../DTO/AptDTO.dart';
 
-class DetailAppointment extends StatefulWidget {
+class DaftarAppointment extends StatefulWidget {
   static const routeName = "/appointment/get-all";
 
-  const DetailAppointment({Key key}) : super(key: key);
+  const DaftarAppointment({Key key}) : super(key: key);
 
   @override
-  State<DetailAppointment> createState() => _DetailAppointmentState();
+  State<DaftarAppointment> createState() => _DaftarAppointmentState();
 }
 
-class _DetailAppointmentState extends State<DetailAppointment> {
-
+class _DaftarAppointmentState extends State<DaftarAppointment> {
   Future<List<AptDTO>> getAppointment() async {
     var uri = Uri.parse('http://10.0.2.2:8080/api/appointment/all');
     dynamic token = await SessionManager().get('token');
     String tknString = ('Bearer $token');
-    http.Response response = await http.get(uri,
-        headers: {
-          'Accept': 'application/json',
-          'Content-Type': 'application/json; charset=UTF-8',
-          'Authorization': tknString
-        });
+    http.Response response = await http.get(uri, headers: {
+      'Accept': 'application/json',
+      'Content-Type': 'application/json; charset=UTF-8',
+      'Authorization': tknString
+    });
     if (response.statusCode == 200) {
       List<AptDTO> list = <AptDTO>[];
       List jsonData = jsonDecode(response.body);
       for (int i = 0; i < jsonData.length; i++) {
-        AptDTO apt = AptDTO.createAptDTO(jsonData[i]['namaDokter'] as String,
+        AptDTO apt = AptDTO.createAptDTO(
+            jsonData[i]['namaDokter'] as String,
             jsonData[i]['waktuAwal'] as String,
-            jsonData[i]['isDone'] as String);
+            jsonData[i]['isDone'] as String,
+            jsonData[i]['kodeApt'] as String);
         list.add(apt);
       }
       return list;
@@ -53,52 +54,51 @@ class _DetailAppointmentState extends State<DetailAppointment> {
               if (snapshot.hasData) {
                 List data = snapshot.data;
                 return Container(
-                  child: ListView.builder(
-                      itemCount: data.length,
-                      itemBuilder: (context, index) {
-                        AptDTO apt = data[index];
-                        return InkWell(
-                            onTap: () {},
-                            child: Card(
+                    child: ListView.builder(
+                        itemCount: data.length,
+                        itemBuilder: (context, index) {
+                          AptDTO apt = data[index];
+                          return InkWell(
+                              onTap: () {
+                                SessionManager().set("kodeApt", apt.kodeApt);
+                                Navigator.of(context).pushNamed(DetailAppointment.routeName);
+                              },
+                              child: Card(
                                 shape: const RoundedRectangleBorder(),
-                              child: Padding(
-                                padding: const EdgeInsets.all(20),
-                                child: Column(
-                                  children: <Widget> [
-                                    Text(
-                                      'Dokter ${apt.namaDokter}',
-                                      style: const TextStyle(
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.w500,
+                                child: Padding(
+                                  padding: const EdgeInsets.all(20),
+                                  child: Column(
+                                    children: <Widget>[
+                                      Text(
+                                        'Dokter ${apt.namaDokter}',
+                                        style: const TextStyle(
+                                          fontSize: 16,
+                                          fontWeight: FontWeight.w500,
+                                        ),
                                       ),
-                                    ),
-                                    Text(
-                                      apt.waktuAwal,
-                                      style: const TextStyle(
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.w500
+                                      Text(
+                                        apt.waktuAwal,
+                                        style: const TextStyle(
+                                            fontSize: 16,
+                                            fontWeight: FontWeight.w500),
                                       ),
-                                    ),
-                                    Text(
-                                      'Status: ${apt.isDone}',
-                                      style: const TextStyle(
-                                        fontSize: 16,
-                                        fontWeight: FontWeight.w500,
+                                      Text(
+                                        'Status: ${apt.isDone}',
+                                        style: const TextStyle(
+                                          fontSize: 16,
+                                          fontWeight: FontWeight.w500,
+                                        ),
                                       ),
-                                    ),
-                                  ],
+                                    ],
+                                  ),
                                 ),
-                              ),
-                            )
-                        );
-                      })
-                );
+                              ));
+                        }));
               } else {
                 return const CircularProgressIndicator();
               }
             },
           ),
-        )
-    );
+        ));
   }
 }
-- 
GitLab


From e49abfdf0849b3302d3320ceb189be8c9f7e4e56 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Sun, 11 Dec 2022 12:15:44 +0700
Subject: [PATCH 37/44] fix: add warning with modal in detail appointment

---
 .../appointment/AppointmentController.java    | 13 ++-----
 .../AppointmentRestServiceImpl.java           |  6 ++-
 .../appointment/model/AppointmentModel.java   |  4 +-
 .../TK/SpringTkApap/resep/ResepModel.java     |  2 +-
 .../appointment/view-appointment.html         | 37 +++++++++++++++++--
 5 files changed, 44 insertions(+), 18 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 9307968..6cb9992 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -68,19 +68,12 @@ public class AppointmentController {
     public String getAppointment(@PathVariable("kodeAppointment") String kodeApt, Model model, Principal principal) {
         UserModel user = userService.getUserByUsername(principal.getName());
         AppointmentModel appointment = appointmentService.getAppointment(kodeApt);
-        List<ResepModel> listResep = appointment.getListResep();
+        ResepModel listResep = appointment.getListResep();
 
         Boolean resepStatus;
 
-        if (listResep.size() != 0) {
-            resepStatus = Boolean.FALSE;
-
-            for (ResepModel resep : listResep) {
-                if (resep.getIsDone() == Boolean.FALSE) {
-                    resepStatus = Boolean.TRUE;
-                    break;
-                }
-            }
+        if (listResep != null) {
+            resepStatus = !listResep.getIsDone();
         } else {
             resepStatus = null;
         }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index ef9e5dc..a3d809d 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -99,7 +99,11 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
         DetailDTO newApt = new DetailDTO();
         newApt.setKodeApt(apt.getKode());
         newApt.setWaktuAwal(apt.getWaktuAwal().toString());
-        newApt.setDetailResep(apt.getListResep().size());
+        if (apt.getListResep() != null) {
+            newApt.setDetailResep(1);
+        } else {
+            newApt.setDetailResep(0);
+        }
         newApt.setIsDone(done);
         newApt.setNamaPasien(apt.getPasien().getNama());
         newApt.setNamaDokter(apt.getDokter().getNama());
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
index 446d4dd..cf77f1a 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
@@ -42,8 +42,8 @@ public class AppointmentModel implements Serializable {
     @OnDelete(action = OnDeleteAction.CASCADE)
     private PasienModel pasien;
 
-    @OneToMany(mappedBy = "appointment", fetch = FetchType.EAGER)
-    private List<ResepModel> listResep;
+    @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
+    private ResepModel listResep;
 
     @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
     private transient TagihanModel tagihan;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
index 1cc2964..b167044 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/resep/ResepModel.java
@@ -40,7 +40,7 @@ public class ResepModel implements Serializable {
     @OneToMany(mappedBy = "resep", fetch = FetchType.EAGER)
     private List<JumlahModel> listJumlah;
 
-    @ManyToOne(fetch = FetchType.EAGER)
+    @OneToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "kode", referencedColumnName = "kode")
     @OnDelete(action = OnDeleteAction.CASCADE)
     @JsonIgnore
diff --git a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
index a04aa25..bdb9795 100644
--- a/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
+++ b/SpringTkApap/src/main/resources/templates/appointment/view-appointment.html
@@ -5,6 +5,13 @@
     <title>RumahSehat - Detail Appointment</title>
     <object th:include="fragments/fragment :: css" th:remove="tag"></object>
     <object th:include="fragments/fragment :: js" th:remove="tag"></object>
+    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
+
+    <!-- Include the jQuery library -->
+    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
+
+    <!-- Include the Bootstrap JavaScript file -->
+    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
 </head>
 <body>
 <object th:replace="fragments/fragment :: navbar('Appointment')"></object>
@@ -41,11 +48,10 @@
 
                     <div th:unless="${resepStatus}">
                         <br>
-                        <form th:action="@{/appointment/} + ${apt.kode}" method="POST">
-                            <button type="submit" class="btn btn-primary">Selesai</button>
-                        </form>
+                        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
+                            Selesai
+                        </button>
                     </div>
-
                 </div>
             </div>
             <br>
@@ -53,6 +59,29 @@
         </div>
     </div>
 </div>
+
+<!-- Modal -->
+<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="exampleModalLabel">Warning!</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                Appointment ini tidak memiliki Resep!
+            </div>
+            <div class="modal-footer">
+                <form th:action="@{/appointment/} + ${apt.kode}" method="POST">
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Batalkan!</button>
+                    <button type="submit" class="btn btn-primary">Lanjutkan!</button>
+                </form>
+            </div>
+        </div>
+    </div>
 </div>
 
 </body>
-- 
GitLab


From a4751ab5d221123f7670137c9f9f45e2fa1220b8 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Sun, 11 Dec 2022 13:05:38 +0700
Subject: [PATCH 38/44] changes to fulfill the create tagihan service

---
 .../appointment/AppointmentController.java    | 12 +++++--
 .../AppointmentRestController.java            |  1 -
 .../appointment/model/AppointmentModel.java   |  8 +++--
 .../TK/SpringTkApap/tagihan/TagihanDB.java    |  8 +++++
 .../TK/SpringTkApap/tagihan/TagihanModel.java | 15 ++++----
 .../SpringTkApap/tagihan/TagihanService.java  |  7 ++++
 .../tagihan/TagihanServiceImpl.java           | 34 +++++++++++++++++++
 7 files changed, 71 insertions(+), 14 deletions(-)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanDB.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanService.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanServiceImpl.java

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 6cb9992..a507ec4 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -11,6 +11,8 @@ import spring.TK.SpringTkApap.auth.model.RolesEnum;
 import spring.TK.SpringTkApap.auth.model.UserModel;
 import spring.TK.SpringTkApap.auth.service.UserService;
 import spring.TK.SpringTkApap.resep.ResepModel;
+import spring.TK.SpringTkApap.tagihan.TagihanModel;
+import spring.TK.SpringTkApap.tagihan.TagihanService;
 import spring.TK.SpringTkApap.user.model.AdminModel;
 import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
@@ -19,6 +21,7 @@ import spring.TK.SpringTkApap.user.service.DokterService;
 import spring.TK.SpringTkApap.user.service.PasienService;
 
 import java.security.Principal;
+import java.time.LocalDateTime;
 import java.util.List;
 
 @Controller
@@ -36,6 +39,9 @@ public class AppointmentController {
     @Autowired
     UserService userService;
 
+    @Autowired
+    TagihanService tagihanService;
+
     @GetMapping("/appointment/add/{noPasien}")
     public String addAppointment(@PathVariable(name = "noPasien") String noPasien, Model model) {
         List<DokterDTO> listDokter = dokterService.getAll();
@@ -90,8 +96,10 @@ public class AppointmentController {
         appointment.setIsDone(Boolean.TRUE);
         appointment.setKode(kodeApt);
         appointmentService.updateAppointment(appointment);
-        System.out.println("here");
-
+        TagihanModel tagihan = new TagihanModel();
+        tagihanService.addTagihan(tagihan, appointment);
+        appointment.setTagihan(tagihan);
+        appointmentService.updateAppointment(appointment);
         model.addAttribute("resepStatus", Boolean.FALSE);
         model.addAttribute("apt", appointment);
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index e22e8c7..7f1f96b 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -17,7 +17,6 @@ import spring.TK.SpringTkApap.user.service.PasienService;
 
 import java.security.Principal;
 import java.util.List;
-import java.util.NoSuchElementException;
 
 @RestController
 @CrossOrigin(origins = "*")
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
index cf77f1a..7cf86d4 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
@@ -6,11 +6,13 @@ import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.format.annotation.DateTimeFormat;
 import spring.TK.SpringTkApap.resep.ResepModel;
+import spring.TK.SpringTkApap.tagihan.TagihanDB;
 import spring.TK.SpringTkApap.tagihan.TagihanModel;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.model.PasienModel;
 
 import javax.persistence.*;
+import javax.swing.text.html.HTML;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -45,6 +47,8 @@ public class AppointmentModel implements Serializable {
     @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
     private ResepModel listResep;
 
-    @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
-    private transient TagihanModel tagihan;
+    @OneToOne(fetch = FetchType.EAGER)
+    @JoinColumn(name = "kode", referencedColumnName = "kode")
+    @OnDelete(action = OnDeleteAction.CASCADE)
+    private TagihanModel tagihan;
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanDB.java
new file mode 100644
index 0000000..bb7beb8
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanDB.java
@@ -0,0 +1,8 @@
+package spring.TK.SpringTkApap.tagihan;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TagihanDB extends JpaRepository<TagihanModel, String> {
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java
index da57195..9983e51 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanModel.java
@@ -1,9 +1,7 @@
 package spring.TK.SpringTkApap.tagihan;
 
 import com.sun.istack.NotNull;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
 import org.hibernate.annotations.OnDelete;
 import org.hibernate.annotations.OnDeleteAction;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -12,7 +10,9 @@ import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import javax.persistence.*;
 import java.time.LocalDateTime;
 
-@Data @Entity
+@Setter
+@Getter
+@Entity
 @Table(name = "tagihan")
 @NoArgsConstructor
 @AllArgsConstructor
@@ -25,7 +25,6 @@ public class TagihanModel {
     @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
     private LocalDateTime tanggalTerbuat;
 
-    @NotNull @Column(nullable = false)
     @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
     private LocalDateTime tanggalBayar;
 
@@ -35,8 +34,6 @@ public class TagihanModel {
     @NotNull @Column(nullable = false)
     private Integer jumlahTagihan;
 
-    @OneToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = "kode", referencedColumnName = "kode")
-    @OnDelete(action = OnDeleteAction.CASCADE)
-    private AppointmentModel appointment;
+    @OneToOne(mappedBy = "tagihan", fetch = FetchType.EAGER)
+    private transient AppointmentModel appointment;
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanService.java
new file mode 100644
index 0000000..62928f8
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanService.java
@@ -0,0 +1,7 @@
+package spring.TK.SpringTkApap.tagihan;
+
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+
+public interface TagihanService {
+    TagihanModel addTagihan(TagihanModel tagihan, AppointmentModel appointment);
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanServiceImpl.java
new file mode 100644
index 0000000..298953c
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/tagihan/TagihanServiceImpl.java
@@ -0,0 +1,34 @@
+package spring.TK.SpringTkApap.tagihan;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import spring.TK.SpringTkApap.appointment.AppointmentDB;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+
+@Service
+@Transactional
+public class TagihanServiceImpl implements TagihanService{
+
+    @Autowired
+    TagihanDB tagihanDB;
+
+    @Autowired
+    AppointmentDB appointmentDB;
+
+    @Override
+    public TagihanModel addTagihan(TagihanModel tagihan, AppointmentModel appointment) {
+        tagihan.setAppointment(appointment);
+        tagihan.setJumlahTagihan(appointment.getDokter().getTarif());
+        tagihan.setIsPaid(Boolean.FALSE);
+        tagihan.setTanggalBayar(null);
+        tagihan.setTanggalTerbuat(LocalDateTime.now());
+        int kode = + (int) (tagihanDB.count() + 1);
+        String strKode = Integer.toString(kode);
+        tagihan.setKode("BILL-" + strKode);
+        tagihanDB.save(tagihan);
+        return tagihan;
+    }
+}
-- 
GitLab


From 93de3735843ea23e070812ebcd0199d2870c4992 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Sun, 11 Dec 2022 15:37:26 +0700
Subject: [PATCH 39/44] fix: security and action logging for appointment

---
 .../appointment/AppointmentRestController.java           | 9 +++++++++
 .../appointment/AppointmentRestServiceImpl.java          | 9 +++++++++
 .../TK/SpringTkApap/auth/security/WebSecurityConfig.java | 4 +++-
 .../user/controller/DokterRestController.java            | 9 ++++++++-
 4 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
index 7f1f96b..924ab69 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestController.java
@@ -1,5 +1,8 @@
 package spring.TK.SpringTkApap.appointment;
 
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -21,8 +24,11 @@ import java.util.List;
 @RestController
 @CrossOrigin(origins = "*")
 @RequestMapping("/api/appointment")
+@Slf4j
 public class AppointmentRestController {
 
+    Logger logger = LoggerFactory.getLogger(AppointmentRestController.class);
+
     @Autowired
     private AppointmentRestService appointmentRestService;
 
@@ -32,16 +38,19 @@ public class AppointmentRestController {
     @PostMapping(value = "/create")
     public ResponseEntity<String> createAppointmentSubmit(@RequestBody CreateAppointmentDTO appointment, BindingResult bindingResult, Principal principal) {
         if (bindingResult.hasFieldErrors()) {
+            logger.error("BAD REQUEST, terdapat field yang tidak valid");
             throw new ResponseStatusException(
                     HttpStatus.BAD_REQUEST, "Request body has invalid type or missing field."
             );
         } else {
             AppointmentModel newAppointment = appointmentRestService.createAppointment(appointment);
             if (newAppointment == null) {
+                logger.error("Tidak dapat membuat Appointment karena jadwal sudah diambil pasien lain.");
                 throw new ResponseStatusException(
                         HttpStatus.INTERNAL_SERVER_ERROR, "Jadwal yang dipilih sudah penuh."
                 );
             }
+            logger.info("Berhasil membuat appointment dengan jadwal yang sudah dipilih");
             return ResponseEntity.ok(String.format("Appointmentmu berhasil dibuat, kode appointmentmu adalah %s", newAppointment.getKode()));
         }
     }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
index a3d809d..00e3f43 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentRestServiceImpl.java
@@ -1,5 +1,8 @@
 package spring.TK.SpringTkApap.appointment;
 
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
@@ -21,8 +24,11 @@ import java.util.Optional;
 
 @Service
 @Transactional
+@Slf4j
 public class AppointmentRestServiceImpl implements AppointmentRestService{
 
+    Logger logger = LoggerFactory.getLogger(AppointmentRestServiceImpl.class);
+
     @Autowired
     AppointmentDB appointmentDB;
 
@@ -55,6 +61,7 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
         newAppointment.setPasien(pasien);
         newAppointment.setDokter(dokter);
         newAppointment.setKode(kode);
+        logger.info("Berhasil membuat appointment baru");
         return appointmentDB.save(newAppointment);
     }
 
@@ -77,6 +84,7 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
 
             list.add(dto);
         }
+        logger.info("Berhasil mendapatkan seluruh appointment milik pasien");
         return list;
     }
 
@@ -107,6 +115,7 @@ public class AppointmentRestServiceImpl implements AppointmentRestService{
         newApt.setIsDone(done);
         newApt.setNamaPasien(apt.getPasien().getNama());
         newApt.setNamaDokter(apt.getDokter().getNama());
+        logger.info("Berhasil mendapatkan detail appointment");
         return newApt;
     }
 
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
index e509302..12591f5 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
@@ -52,7 +52,7 @@ public class WebSecurityConfig {
                     .antMatchers("/user/add/**").hasAuthority(ADMIN)
                     .antMatchers("/user/delete/**").hasAuthority(ADMIN)
                     .antMatchers("/appointment/viewall").hasAnyAuthority(ADMIN, DOKTER, PASIEN)
-                    .antMatchers("/appointment/**").hasAnyAuthority(ADMIN, DOKTER)
+                    .antMatchers("/appointment/detail").hasAnyAuthority(ADMIN, DOKTER, PASIEN)
                     .antMatchers("/user/viewall/**").hasAuthority(ADMIN)
                     .anyRequest().authenticated()
                     .and( )
@@ -104,6 +104,8 @@ public class WebSecurityConfig {
                     .authorizeRequests()
                     .antMatchers("/api/authenticate", "/api/pasien/register").permitAll()
                     .antMatchers(HttpMethod.GET, "/api/user").hasAuthority(PASIEN)
+                    .antMatchers(HttpMethod.GET, "/api/doktor/all").hasAuthority(PASIEN)
+                    .antMatchers(HttpMethod.POST, "/api/appointment/**").hasAnyAuthority(PASIEN, ADMIN)
                     .anyRequest().hasAnyAuthority(PASIEN, ADMIN)
                     .and()
                     .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint)
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
index 1fa598d..3f7f265 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
@@ -1,10 +1,14 @@
 package spring.TK.SpringTkApap.user.controller;
 
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import spring.TK.SpringTkApap.appointment.AppointmentRestController;
 import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.service.DokterService;
 
@@ -13,14 +17,17 @@ import java.util.List;
 @RestController
 @CrossOrigin(origins = "*")
 @RequestMapping("/api/doktor")
+@Slf4j
 public class DokterRestController {
 
+    Logger logger = LoggerFactory.getLogger(DokterRestController.class);
+
     @Autowired
     private DokterService dokterService;
 
     @GetMapping(value = "/all")
     public List<DokterDTO>  getAllDoktor() {
-        System.out.println(dokterService.getAll().get(0));
+        logger.info("Berhasil mengambil data seluruh dokter yang ada");
         return dokterService.getAll();
     }
 
-- 
GitLab


From f8dbc3921e9151357bfd360f77ec3c69ad209b22 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Sun, 11 Dec 2022 23:11:26 +0700
Subject: [PATCH 40/44] feat: fitur khusus bagian c

---
 .../appointment/AppointmentDB.java            |   4 +
 .../appointment/AppointmentService.java       |   3 +
 .../appointment/AppointmentServiceImpl.java   |   6 +
 .../appointment/model/AppointmentModel.java   |   3 -
 .../auth/controller/PageController.java       |   1 -
 .../auth/security/WebSecurityConfig.java      |   1 +
 .../user/controller/DokterController.java     | 100 ++++++++++++
 .../user/controller/DokterRestController.java |  35 ++++-
 .../SpringTkApap/user/model/DokterRevDTO.java |  21 +++
 .../user/repository/DokterDB.java             |   2 +
 .../user/service/DokterService.java           |   2 +
 .../user/service/DokterServiceImpl.java       |   5 +
 .../templates/dokter/choose-dokter.html       |  39 +++++
 .../templates/dokter/dokter-chart.html        | 145 ++++++++++++++++++
 .../main/resources/templates/error/403.html   |  18 +--
 15 files changed, 371 insertions(+), 14 deletions(-)
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
 create mode 100644 SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java
 create mode 100644 SpringTkApap/src/main/resources/templates/dokter/choose-dokter.html
 create mode 100644 SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
index 06f3979..cdf2b6b 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
@@ -3,14 +3,18 @@ package spring.TK.SpringTkApap.appointment;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Optional;
 
 @Repository
 public interface AppointmentDB extends JpaRepository<AppointmentModel, String> {
     Optional<AppointmentModel> findByKode(String kode);
 
+    List<AppointmentModel> findAllByDokter(DokterModel dokterModel);
+
     Optional<AppointmentModel> findByDokterAndWaktuAwalBetween(DokterModel dokter, LocalDateTime waktuAwal, LocalDateTime waktuAkhir);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
index af88f48..b280e33 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentService.java
@@ -1,6 +1,7 @@
 package spring.TK.SpringTkApap.appointment;
 
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.util.List;
 
@@ -15,4 +16,6 @@ public interface AppointmentService {
     List<AppointmentModel> getAll();
 
     void deleteAppointment(AppointmentModel appointment);
+
+    List<AppointmentModel> findAllByDokter(DokterModel dokter);
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
index 1100c84..7eb8544 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentServiceImpl.java
@@ -3,6 +3,7 @@ package spring.TK.SpringTkApap.appointment;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import javax.transaction.Transactional;
 import java.util.List;
@@ -49,4 +50,9 @@ public class AppointmentServiceImpl implements AppointmentService{
     public void deleteAppointment(AppointmentModel appointment) {
         appointmentDB.delete(appointment);
     }
+
+    @Override
+    public List<AppointmentModel> findAllByDokter(DokterModel dokter) {
+        return appointmentDB.findAllByDokter(dokter);
+    }
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
index 3b14970..7cf86d4 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/model/AppointmentModel.java
@@ -47,9 +47,6 @@ public class AppointmentModel implements Serializable {
     @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
     private ResepModel listResep;
 
-    @OneToOne(mappedBy = "appointment", fetch = FetchType.EAGER)
-    private ResepModel listResep;
-
     @OneToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "kode", referencedColumnName = "kode")
     @OnDelete(action = OnDeleteAction.CASCADE)
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/controller/PageController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/controller/PageController.java
index 861d45d..ba23c5b 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/controller/PageController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/controller/PageController.java
@@ -10,7 +10,6 @@ import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.reactive.function.client.WebClient;
 import org.springframework.web.servlet.ModelAndView;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
index 12591f5..4f8a49f 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/auth/security/WebSecurityConfig.java
@@ -54,6 +54,7 @@ public class WebSecurityConfig {
                     .antMatchers("/appointment/viewall").hasAnyAuthority(ADMIN, DOKTER, PASIEN)
                     .antMatchers("/appointment/detail").hasAnyAuthority(ADMIN, DOKTER, PASIEN)
                     .antMatchers("/user/viewall/**").hasAuthority(ADMIN)
+                    .antMatchers("/dokter/**").hasAuthority(ADMIN)
                     .anyRequest().authenticated()
                     .and( )
                     .formLogin()
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
new file mode 100644
index 0000000..e098119
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
@@ -0,0 +1,100 @@
+package spring.TK.SpringTkApap.user.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import spring.TK.SpringTkApap.appointment.AppointmentService;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.model.DokterRevDTO;
+import spring.TK.SpringTkApap.user.service.DokterService;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Controller
+@RequestMapping("/dokter")
+@Slf4j
+public class DokterController {
+
+    Logger logger = LoggerFactory.getLogger(DokterRestController.class);
+
+    @Autowired
+    DokterService dokterService;
+
+    @Autowired
+    AppointmentService appointmentService;
+
+    @GetMapping("/choose")
+    public String chooseDokter(Model model) {
+        model.addAttribute("listDokter", dokterService.retrieveAll());
+        return "dokter/choose-dokter";
+    }
+
+    @PostMapping("/choose")
+    public String getchart(@ModelAttribute List<DokterModel> list, Model model) {
+        List<DokterModel> listDokter = dokterService.retrieveAll();
+        DokterRevDTO dokterRevDTO = new DokterRevDTO();
+        List<String> listLabels = new ArrayList<>();
+        List<Long> listRevenue = new ArrayList<>();
+        List<Integer> listBanyakApt = new ArrayList<>();
+        for (DokterModel dokterModel : listDokter) {
+            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel);
+            listLabels.add(dokterModel.getUsername());
+            long rev = 0;
+            int banyakApt = 0;
+            for (AppointmentModel apt : listApt) {
+                rev += dokterModel.getTarif();
+                banyakApt += 1;
+            }
+            listRevenue.add(rev);
+            listBanyakApt.add(banyakApt);
+        }
+        dokterRevDTO.setNama(listLabels);
+        dokterRevDTO.setRevenue(listRevenue);
+        dokterRevDTO.setBanyakAppointment(listBanyakApt);
+        model.addAttribute("listDokter", dokterRevDTO);
+        return "dokter/dokter-chart";
+    }
+
+    @PostMapping("/chart")
+    public String chart(@RequestParam(value = "choosed") String[] choosed, Model model) {
+        List<String> listString = Arrays.stream(choosed).collect(Collectors.toList());
+        DokterRevDTO dokterRevDTO = new DokterRevDTO();
+        List<String> listLabels = new ArrayList<>();
+        List<Long> listRevenue = new ArrayList<>();
+        List<Integer> listBanyakApt = new ArrayList<>();
+        List<List<LocalDate>> listTanggal = new ArrayList<>();
+        int i = 0;
+        for (String usernameDokter : listString) {
+            DokterModel dokterModel = dokterService.getDokterByUsername(usernameDokter);
+            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel);
+            listLabels.add(dokterModel.getUsername());
+            long rev = 0;
+            int banyakApt = 0;
+            List<LocalDate> tanggal = new ArrayList<>();
+            for (AppointmentModel apt : listApt) {
+                logger.info(apt.getWaktuAwal().toString());
+                rev += dokterModel.getTarif();
+                banyakApt += 1;
+                tanggal.add(apt.getWaktuAwal().toLocalDate());
+            }
+            listRevenue.add(rev);
+            listBanyakApt.add(banyakApt);
+            listTanggal.add(tanggal);
+        }
+        dokterRevDTO.setNama(listLabels);
+        dokterRevDTO.setRevenue(listRevenue);
+        dokterRevDTO.setBanyakAppointment(listBanyakApt);
+        dokterRevDTO.setTanggal(listTanggal);
+        model.addAttribute("listDokter", dokterRevDTO);
+        return "dokter/dokter-chart";
+    }
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
index 3f7f265..4717729 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
@@ -9,9 +9,14 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import spring.TK.SpringTkApap.appointment.AppointmentRestController;
+import spring.TK.SpringTkApap.appointment.AppointmentService;
+import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
 import spring.TK.SpringTkApap.user.model.DokterDTO;
+import spring.TK.SpringTkApap.user.model.DokterModel;
+import spring.TK.SpringTkApap.user.model.DokterRevDTO;
 import spring.TK.SpringTkApap.user.service.DokterService;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @RestController
@@ -25,10 +30,38 @@ public class DokterRestController {
     @Autowired
     private DokterService dokterService;
 
+    @Autowired
+    private AppointmentService appointmentService;
+
     @GetMapping(value = "/all")
-    public List<DokterDTO>  getAllDoktor() {
+    public List<DokterDTO> getAllDoktor() {
         logger.info("Berhasil mengambil data seluruh dokter yang ada");
         return dokterService.getAll();
     }
 
+    @GetMapping(value = "/rev")
+    public DokterRevDTO getDokterRev() {
+        List<DokterModel> listDokter = dokterService.retrieveAll();
+        DokterRevDTO dokterRevDTO = new DokterRevDTO();
+        List<String> listLabels = new ArrayList<>();
+        List<Long> listRevenue = new ArrayList<>();
+        List<Integer> listBanyakApt = new ArrayList<>();
+        for (DokterModel dokterModel : listDokter) {
+            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel);
+            listLabels.add(dokterModel.getUsername());
+            long rev = 0;
+            int banyakApt = 0;
+            for (AppointmentModel apt : listApt) {
+                rev += dokterModel.getTarif();
+                banyakApt += 1;
+            }
+            listRevenue.add(rev);
+            listBanyakApt.add(banyakApt);
+        }
+        dokterRevDTO.setNama(listLabels);
+        dokterRevDTO.setRevenue(listRevenue);
+        dokterRevDTO.setBanyakAppointment(listBanyakApt);
+        return dokterRevDTO;
+    }
+
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java
new file mode 100644
index 0000000..e40c1db
--- /dev/null
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java
@@ -0,0 +1,21 @@
+package spring.TK.SpringTkApap.user.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class DokterRevDTO implements Serializable {
+    private List<String> nama;
+    private List<Long> revenue;
+    private List<Integer> banyakAppointment;
+    private List<List<LocalDate>> tanggal;
+}
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
index 9e7da71..c6f8e10 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/repository/DokterDB.java
@@ -4,9 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
+import java.util.List;
 import java.util.Optional;
 
 @Repository
 public interface DokterDB extends JpaRepository<DokterModel, String> {
     Optional<DokterModel> findByUsername(String username);
+
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
index c07b956..b3111e1 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterService.java
@@ -11,6 +11,8 @@ public interface DokterService {
 
     List<DokterDTO> getAll();
 
+    List<DokterModel> retrieveAll();
+
     DokterModel getDokterById(String uuid);
 
     DokterModel getDokterByUsername(String username);
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
index ac95d01..5f7bf83 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/service/DokterServiceImpl.java
@@ -38,6 +38,11 @@ public class DokterServiceImpl implements DokterService{
         return list;
     }
 
+    @Override
+    public List<DokterModel> retrieveAll() {
+        return dokterDB.findAll();
+    }
+
     @Override
     public DokterModel getDokterById(String uuid) {
         Optional<DokterModel> dokter = dokterDB.findById(uuid);
diff --git a/SpringTkApap/src/main/resources/templates/dokter/choose-dokter.html b/SpringTkApap/src/main/resources/templates/dokter/choose-dokter.html
new file mode 100644
index 0000000..4d64103
--- /dev/null
+++ b/SpringTkApap/src/main/resources/templates/dokter/choose-dokter.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+  <title>Pilih Dokter</title>
+  <object th:include="fragments/fragment :: css" th:remove="tag"></object>
+  <object th:include="fragments/fragment :: js" th:remove="tag"></object>
+</head>
+<body>
+<object th:replace="fragments/fragment :: navbar('Dokter')"></object>
+<div class = "container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center"> <h2>Pilih Dokter</h2>
+        <br>
+        <form th:action="@{/dokter/chart}" th:object="${listDokter}" method="POST">
+          <th:block th:each="dokter, stat: ${listDokter}">
+            <input name="choosed" class="single-checkbox" type="checkbox" th:value="${dokter.username}"/>
+            <label th:text="${dokter.nama}"></label>
+            <br>
+          </th:block>
+          <button type="submit" class="btn btn-primary">Submit</button>
+          <a class="btn btn-link" href="/static">Home</a>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
+<object th:replace="fragments/fragment :: footer"></object>
+
+<script>
+  var limit = 5;
+  $('input.single-checkbox').on('change', function(evt) {
+    if($(this).siblings(':checked').length >= limit) {
+      this.checked = false;
+    }
+  });
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
new file mode 100644
index 0000000..33a4224
--- /dev/null
+++ b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="UTF-8">
+    <title>RumahSehat - Dokter Chart</title>
+    <object th:include="fragments/fragment :: css" th:remove="tag"></object>
+    <object th:include="fragments/fragment :: js" th:remove="tag"></object>
+    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
+</head>
+<body>
+<object th:replace="fragments/fragment :: navbar('Appointment')"></object>
+
+<div class="container">
+    <div class="card m-4 p-4">
+        <div class="card-body">
+            <div class="justify-content-center">
+                <div class="d-flex justify-content-between">
+                    <h2>Daftar Appointment</h2>
+                    <div>
+                    </div>
+                </div>
+                <br>
+                <div id="bar-chart">
+                    <canvas id="myChart" height="700" width="500"></canvas>
+                    <button type="button" class="btn btn-outline-danger" onclick="dataType('appointmnet')">appointment
+                    </button>
+                    <button type="button" class="btn btn-outline-danger" onclick="dataType('revenue')">revenue</button>
+                </div>
+                <div id="line-chart">
+                    <canvas id="yourChart" height="700" width="500"></canvas>
+                    <input type="date" onchange="filterData()" id="startDate"></input>
+                    <input type="date" onchange="filterData()" id="endDate"></input>
+                </div>
+                <button type="button" id="changes" onclick="changes()" class="btn btn-outline-success">Changes Style</button>
+                <a class="btn btn-primary" href="/">Home</a>
+            </div>
+        </div>
+    </div>
+</div>
+<object th:replace="fragments/fragment :: footer"></object>
+
+
+<script th:inline="javascript">
+    getData();
+    var newChart;
+    var data;
+
+    function changes() {
+        const lineDiv = document.getElementById('line-chart');
+        const barDiv = document.getElementById('bar-chart');
+        const btn = document.getElementById('changes')
+        btn.onclick = function () {
+            if (lineDiv.style.display !== "none") {
+                lineDiv.style.display = "none";
+                barDiv.style.display = "block";
+            } else {
+                lineDiv.style.display = "block";
+                barDiv.style.display = "none";
+            }
+        }
+    }
+
+    async function getDataLines() {
+        data = [[${listDokter}]]
+        newChart = new Chart(document.getElementById('yourChart'), {
+            type: 'line',
+            data: {
+                labels: data.tanggal,
+                datasets: [
+                    {
+                        labels: data.name,
+                        data: data.revenue
+                    }
+                ]
+            }, options: {
+                legend: {display: false},
+                title: {
+                    display: true,
+                    text: "Revenue Dokter"
+                }
+            }
+        })
+    }
+
+    async function getData(types) {
+        if (types === "revenue") {
+            data = [[${listDokter}]]
+            console.log(data);
+            newChart = new Chart(document.getElementById('myChart'), {
+                type: 'bar',
+                data: {
+                    labels: data.nama,
+                    datasets: [
+                        {
+                            label: "revenue",
+                            data: data.revenue
+                        }
+                    ]
+                }, options: {
+                    legend: {display: false},
+                    title: {
+                        display: true,
+                        text: "Revenue dokter"
+                    }
+                }
+            })
+        } else {
+            data = [[${listDokter}]]
+            console.log(data);
+            newChart = new Chart(document.getElementById('myChart'), {
+                type: 'bar',
+                data: {
+                    labels: data.nama,
+                    datasets: [
+                        {
+                            label: "banyakAppointment",
+                            data: data.banyakAppointment
+                        }
+                    ]
+                }, options: {
+                    legend: {display: false},
+                    title: {
+                        display: true,
+                        text: "Banyak appointment dokter"
+                    }
+                }
+            })
+        }
+    }
+
+    function dataType(type) {
+        var newDataset
+        newChart.destroy()
+        if (type === "revenue") {
+            console.log(data.revenue);
+            getData("revenue")
+        } else {
+            console.log(data.banyakAppointment);
+            getData("banyak Appointment")
+        }
+    }
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/SpringTkApap/src/main/resources/templates/error/403.html b/SpringTkApap/src/main/resources/templates/error/403.html
index a05ed97..a82b208 100644
--- a/SpringTkApap/src/main/resources/templates/error/403.html
+++ b/SpringTkApap/src/main/resources/templates/error/403.html
@@ -1,20 +1,20 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org">
 <head>
-  <meta charset="UTF-8">
-  <title>403 NOT FOUND</title>
-  <object th:include="fragments/fragment :: css" th:remove="tag"></object>
-  <object th:include="fragments/fragment :: js" th:remove="tag"></object>
+    <meta charset="UTF-8">
+    <title>403 NOT FOUND</title>
+    <object th:include="fragments/fragment :: css" th:remove="tag"></object>
+    <object th:include="fragments/fragment :: js" th:remove="tag"></object>
 </head>
 <body>
 <nav th:replace="fragments/fragment :: navbar('Beranda')"></nav>
 
 <div class="d-flex justify-content-center">
-  <div class="m-4 d-flex flex-column justify-content-center">
-    <h2 class="text-center" th:text="${message}"></h2>
-    <h4 class="text-center"> You don't have the authority to access this page.</h4>
-    <a class="text-center" th:href="@{/}">Home</a>
-  </div>
+    <div class="m-4 d-flex flex-column justify-content-center">
+        <h2 class="text-center" th:text="${message}"></h2>
+        <h4 class="text-center"> You don't have the authority to access this page.</h4>
+        <a class="text-center" th:href="@{/}">Home</a>
+    </div>
 </div>
 <object th:replace="fragments/fragment :: footer"></object>
 </body>
-- 
GitLab


From 96ce6409093fb3340715c8ef283b30e6c0d951d9 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Mon, 12 Dec 2022 05:53:55 +0700
Subject: [PATCH 41/44] feat: fitur khusus bagian a

---
 .../user/controller/DokterController.java     | 79 ++++++-----------
 .../user/controller/DokterRestController.java | 26 ------
 .../SpringTkApap/user/model/DokterRevDTO.java |  9 +-
 .../templates/dokter/dokter-chart.html        | 86 ++++++++++---------
 4 files changed, 76 insertions(+), 124 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
index e098119..dbeebba 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
@@ -14,6 +14,7 @@ import spring.TK.SpringTkApap.user.model.DokterRevDTO;
 import spring.TK.SpringTkApap.user.service.DokterService;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -38,63 +39,35 @@ public class DokterController {
         return "dokter/choose-dokter";
     }
 
-    @PostMapping("/choose")
-    public String getchart(@ModelAttribute List<DokterModel> list, Model model) {
-        List<DokterModel> listDokter = dokterService.retrieveAll();
-        DokterRevDTO dokterRevDTO = new DokterRevDTO();
-        List<String> listLabels = new ArrayList<>();
-        List<Long> listRevenue = new ArrayList<>();
-        List<Integer> listBanyakApt = new ArrayList<>();
-        for (DokterModel dokterModel : listDokter) {
-            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel);
-            listLabels.add(dokterModel.getUsername());
-            long rev = 0;
-            int banyakApt = 0;
-            for (AppointmentModel apt : listApt) {
-                rev += dokterModel.getTarif();
-                banyakApt += 1;
-            }
-            listRevenue.add(rev);
-            listBanyakApt.add(banyakApt);
-        }
-        dokterRevDTO.setNama(listLabels);
-        dokterRevDTO.setRevenue(listRevenue);
-        dokterRevDTO.setBanyakAppointment(listBanyakApt);
-        model.addAttribute("listDokter", dokterRevDTO);
-        return "dokter/dokter-chart";
-    }
-
     @PostMapping("/chart")
     public String chart(@RequestParam(value = "choosed") String[] choosed, Model model) {
-        List<String> listString = Arrays.stream(choosed).collect(Collectors.toList());
-        DokterRevDTO dokterRevDTO = new DokterRevDTO();
-        List<String> listLabels = new ArrayList<>();
-        List<Long> listRevenue = new ArrayList<>();
-        List<Integer> listBanyakApt = new ArrayList<>();
-        List<List<LocalDate>> listTanggal = new ArrayList<>();
-        int i = 0;
-        for (String usernameDokter : listString) {
-            DokterModel dokterModel = dokterService.getDokterByUsername(usernameDokter);
-            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel);
-            listLabels.add(dokterModel.getUsername());
-            long rev = 0;
-            int banyakApt = 0;
-            List<LocalDate> tanggal = new ArrayList<>();
+        int[] rev = new int[choosed.length];
+        int[] banyakApt = new int[choosed.length];
+        List<int[]> monthlyRev= new ArrayList<>();
+        List<String> month = new ArrayList<>();
+
+        for (int i = 0; i < rev.length; i++) {
+            DokterModel dokter = dokterService.getDokterByUsername(choosed[i]);
+            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokter);
+            banyakApt[i] = listApt.size();
+            rev[i] = listApt.size() * dokter.getTarif();
+
+            int [] data = new int[12];
             for (AppointmentModel apt : listApt) {
-                logger.info(apt.getWaktuAwal().toString());
-                rev += dokterModel.getTarif();
-                banyakApt += 1;
-                tanggal.add(apt.getWaktuAwal().toLocalDate());
-            }
-            listRevenue.add(rev);
-            listBanyakApt.add(banyakApt);
-            listTanggal.add(tanggal);
+                data[apt.getWaktuAwal().getMonthValue()-1] += dokter.getTarif();
+            } monthlyRev.add(data);
+        }
+
+        for (int i = 0; i < 12; i++) {
+            month.add(LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0).plusMonths(i).getMonth().toString() + " " + LocalDateTime.now().getYear());
         }
-        dokterRevDTO.setNama(listLabels);
-        dokterRevDTO.setRevenue(listRevenue);
-        dokterRevDTO.setBanyakAppointment(listBanyakApt);
-        dokterRevDTO.setTanggal(listTanggal);
-        model.addAttribute("listDokter", dokterRevDTO);
+
+        model.addAttribute("label", choosed);
+        model.addAttribute("rev", rev);
+        model.addAttribute("banyakApt", banyakApt);
+        model.addAttribute("bulan", month);
+        model.addAttribute("monthlyRev", monthlyRev);
+
         return "dokter/dokter-chart";
     }
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
index 4717729..c3f230f 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterRestController.java
@@ -38,30 +38,4 @@ public class DokterRestController {
         logger.info("Berhasil mengambil data seluruh dokter yang ada");
         return dokterService.getAll();
     }
-
-    @GetMapping(value = "/rev")
-    public DokterRevDTO getDokterRev() {
-        List<DokterModel> listDokter = dokterService.retrieveAll();
-        DokterRevDTO dokterRevDTO = new DokterRevDTO();
-        List<String> listLabels = new ArrayList<>();
-        List<Long> listRevenue = new ArrayList<>();
-        List<Integer> listBanyakApt = new ArrayList<>();
-        for (DokterModel dokterModel : listDokter) {
-            List<AppointmentModel> listApt = appointmentService.findAllByDokter(dokterModel);
-            listLabels.add(dokterModel.getUsername());
-            long rev = 0;
-            int banyakApt = 0;
-            for (AppointmentModel apt : listApt) {
-                rev += dokterModel.getTarif();
-                banyakApt += 1;
-            }
-            listRevenue.add(rev);
-            listBanyakApt.add(banyakApt);
-        }
-        dokterRevDTO.setNama(listLabels);
-        dokterRevDTO.setRevenue(listRevenue);
-        dokterRevDTO.setBanyakAppointment(listBanyakApt);
-        return dokterRevDTO;
-    }
-
 }
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java
index e40c1db..7c25e94 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/model/DokterRevDTO.java
@@ -14,8 +14,9 @@ import java.util.List;
 @AllArgsConstructor
 @NoArgsConstructor
 public class DokterRevDTO implements Serializable {
-    private List<String> nama;
-    private List<Long> revenue;
-    private List<Integer> banyakAppointment;
-    private List<List<LocalDate>> tanggal;
+    private int[] month = new int[12];
+    private String nama;
+    private Long revenue = 0L;
+    private Integer banyakAppointment = 0;
+    private List<LocalDate> tanggal;
 }
diff --git a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
index 33a4224..e6b8072 100644
--- a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
+++ b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
@@ -28,10 +28,9 @@
                 </div>
                 <div id="line-chart">
                     <canvas id="yourChart" height="700" width="500"></canvas>
-                    <input type="date" onchange="filterData()" id="startDate"></input>
-                    <input type="date" onchange="filterData()" id="endDate"></input>
                 </div>
-                <button type="button" id="changes" onclick="changes()" class="btn btn-outline-success">Changes Style</button>
+                <button type="button" id="changes" onclick="changes()" class="btn btn-outline-success">Changes Style
+                </button>
                 <a class="btn btn-primary" href="/">Home</a>
             </div>
         </div>
@@ -42,8 +41,8 @@
 
 <script th:inline="javascript">
     getData();
+    getDataLines();
     var newChart;
-    var data;
 
     function changes() {
         const lineDiv = document.getElementById('line-chart');
@@ -61,18 +60,26 @@
     }
 
     async function getDataLines() {
-        data = [[${listDokter}]]
+        let listDokter = [[${label}]]
+        let monthly = [[${monthlyRev}]]
+        let dataset = []
+
+        for (let i = 0; i < listDokter.length; i++) {
+            let data = {
+                label: listDokter[i],
+                data: monthly[i]
+            }
+            dataset.push(data);
+        }
+
+        const data = {
+            labels: [[${bulan}]],
+            datasets: dataset
+        }
         newChart = new Chart(document.getElementById('yourChart'), {
             type: 'line',
-            data: {
-                labels: data.tanggal,
-                datasets: [
-                    {
-                        labels: data.name,
-                        data: data.revenue
-                    }
-                ]
-            }, options: {
+            data: data,
+            options: {
                 legend: {display: false},
                 title: {
                     display: true,
@@ -84,19 +91,19 @@
 
     async function getData(types) {
         if (types === "revenue") {
-            data = [[${listDokter}]]
-            console.log(data);
+            const data = {
+                labels: [[${label}]],
+                datasets: [{
+                    label: "Revenue",
+                    data: [[${rev}]],
+                    borderWidth: 2
+                }]
+            }
+
             newChart = new Chart(document.getElementById('myChart'), {
                 type: 'bar',
-                data: {
-                    labels: data.nama,
-                    datasets: [
-                        {
-                            label: "revenue",
-                            data: data.revenue
-                        }
-                    ]
-                }, options: {
+                data: data,
+                options: {
                     legend: {display: false},
                     title: {
                         display: true,
@@ -105,23 +112,23 @@
                 }
             })
         } else {
-            data = [[${listDokter}]]
-            console.log(data);
+            const data = {
+                labels: [[${label}]],
+                datasets: [{
+                    label: "Banyak Appointment",
+                    data: [[${banyakApt}]],
+                    borderWidth: 2
+                }]
+            }
+
             newChart = new Chart(document.getElementById('myChart'), {
                 type: 'bar',
-                data: {
-                    labels: data.nama,
-                    datasets: [
-                        {
-                            label: "banyakAppointment",
-                            data: data.banyakAppointment
-                        }
-                    ]
-                }, options: {
+                data: data,
+                options: {
                     legend: {display: false},
                     title: {
                         display: true,
-                        text: "Banyak appointment dokter"
+                        text: "Banyak Appointment"
                     }
                 }
             })
@@ -129,13 +136,10 @@
     }
 
     function dataType(type) {
-        var newDataset
-        newChart.destroy()
+        newChart.destroy();
         if (type === "revenue") {
-            console.log(data.revenue);
             getData("revenue")
         } else {
-            console.log(data.banyakAppointment);
             getData("banyak Appointment")
         }
     }
-- 
GitLab


From def032b2beec1186b983d916865154ffadf2a220 Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Mon, 12 Dec 2022 12:01:37 +0700
Subject: [PATCH 42/44] feat: fitur khusus bagian b, belum pilih tahun dan
 bulan

---
 .../appointment/AppointmentController.java    |   2 -
 .../appointment/AppointmentDB.java            |   1 -
 .../user/controller/DokterController.java     |  18 ++-
 .../templates/dokter/dokter-chart.html        | 103 +++++++++++++-----
 4 files changed, 89 insertions(+), 35 deletions(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index 93cacd3..cea5507 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -13,7 +13,6 @@ import spring.TK.SpringTkApap.auth.service.UserService;
 import spring.TK.SpringTkApap.resep.ResepModel;
 import spring.TK.SpringTkApap.tagihan.TagihanModel;
 import spring.TK.SpringTkApap.tagihan.TagihanService;
-import spring.TK.SpringTkApap.user.model.AdminModel;
 import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 import spring.TK.SpringTkApap.user.model.PasienModel;
@@ -21,7 +20,6 @@ import spring.TK.SpringTkApap.user.service.DokterService;
 import spring.TK.SpringTkApap.user.service.PasienService;
 
 import java.security.Principal;
-import java.time.LocalDateTime;
 import java.util.List;
 
 @Controller
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
index cdf2b6b..262ffa7 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentDB.java
@@ -3,7 +3,6 @@ package spring.TK.SpringTkApap.appointment;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 import spring.TK.SpringTkApap.appointment.model.AppointmentModel;
-import spring.TK.SpringTkApap.user.model.DokterDTO;
 import spring.TK.SpringTkApap.user.model.DokterModel;
 
 import java.time.LocalDateTime;
diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
index dbeebba..9f8b25d 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/user/controller/DokterController.java
@@ -45,6 +45,8 @@ public class DokterController {
         int[] banyakApt = new int[choosed.length];
         List<int[]> monthlyRev= new ArrayList<>();
         List<String> month = new ArrayList<>();
+        List<String> day = new ArrayList<>();
+        List<int[]> dailyRev = new ArrayList<>();
 
         for (int i = 0; i < rev.length; i++) {
             DokterModel dokter = dokterService.getDokterByUsername(choosed[i]);
@@ -52,21 +54,31 @@ public class DokterController {
             banyakApt[i] = listApt.size();
             rev[i] = listApt.size() * dokter.getTarif();
 
-            int [] data = new int[12];
+            int[] dataMonthly = new int[12];
+            int[] dataDaily = new int[31];
             for (AppointmentModel apt : listApt) {
-                data[apt.getWaktuAwal().getMonthValue()-1] += dokter.getTarif();
-            } monthlyRev.add(data);
+                dataMonthly[apt.getWaktuAwal().getMonthValue()-1] += dokter.getTarif();
+                dataDaily[apt.getWaktuAwal().getDayOfMonth()-1] += dokter.getTarif();
+            }
+            monthlyRev.add(dataMonthly);
+            dailyRev.add(dataDaily);
         }
 
         for (int i = 0; i < 12; i++) {
             month.add(LocalDateTime.of(LocalDateTime.now().getYear(), 1, 1, 0, 0).plusMonths(i).getMonth().toString() + " " + LocalDateTime.now().getYear());
         }
 
+        for (int i = 0; i < 31; i++) {
+            day.add(LocalDateTime.of(LocalDateTime.now().getYear(), LocalDateTime.now().getMonth(), 1, 0, 0).plusDays(i).getDayOfWeek().toString());
+        }
+        System.out.println(day);
         model.addAttribute("label", choosed);
         model.addAttribute("rev", rev);
         model.addAttribute("banyakApt", banyakApt);
         model.addAttribute("bulan", month);
+        model.addAttribute("day", day);
         model.addAttribute("monthlyRev", monthlyRev);
+        model.addAttribute("dailyRev", dailyRev);
 
         return "dokter/dokter-chart";
     }
diff --git a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
index e6b8072..4d4ace4 100644
--- a/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
+++ b/SpringTkApap/src/main/resources/templates/dokter/dokter-chart.html
@@ -28,6 +28,9 @@
                 </div>
                 <div id="line-chart">
                     <canvas id="yourChart" height="700" width="500"></canvas>
+                    <button type="button" class="btn btn-outline-danger" onclick="changesType('monthly')">monthly
+                    </button>
+                    <button type="button" class="btn btn-outline-danger" onclick="changesType('daily')">daily</button>
                 </div>
                 <button type="button" id="changes" onclick="changes()" class="btn btn-outline-success">Changes Style
                 </button>
@@ -40,9 +43,10 @@
 
 
 <script th:inline="javascript">
-    getData();
-    getDataLines();
-    var newChart;
+    getData('revenue');
+    getDataLines('monthly');
+    var barChart;
+    var lineChart;
 
     function changes() {
         const lineDiv = document.getElementById('line-chart');
@@ -59,34 +63,64 @@
         }
     }
 
-    async function getDataLines() {
-        let listDokter = [[${label}]]
-        let monthly = [[${monthlyRev}]]
-        let dataset = []
+    async function getDataLines(types) {
+        if (types === 'monthly') {
+            let listDokter = [[${label}]]
+            let monthly = [[${monthlyRev}]]
+            let dataset = []
 
-        for (let i = 0; i < listDokter.length; i++) {
-            let data = {
-                label: listDokter[i],
-                data: monthly[i]
+            for (let i = 0; i < listDokter.length; i++) {
+                let data = {
+                    label: listDokter[i],
+                    data: monthly[i]
+                }
+                dataset.push(data);
             }
-            dataset.push(data);
-        }
 
-        const data = {
-            labels: [[${bulan}]],
-            datasets: dataset
-        }
-        newChart = new Chart(document.getElementById('yourChart'), {
-            type: 'line',
-            data: data,
-            options: {
-                legend: {display: false},
-                title: {
-                    display: true,
-                    text: "Revenue Dokter"
+            const data = {
+                labels: [[${bulan}]],
+                datasets: dataset
+            }
+            lineChart = new Chart(document.getElementById('yourChart'), {
+                    type: 'line',
+                    data: data,
+                    options: {
+                        legend: {display: false},
+                        title: {
+                            display: true,
+                            text: "Revenue Dokter"
+                        }
+                    }
                 }
+            )
+        } else {
+            let listDokter = [[${label}]]
+            let daily = [[${dailyRev}]]
+            let dataset = []
+
+            for (let i = 0; i < listDokter.length; i++) {
+                let data = {
+                    label: listDokter[i],
+                    data: daily[i]
+                }
+                dataset.push(data);
             }
-        })
+            const data = {
+                labels: [[${day}]],
+                datasets: dataset
+            }
+            lineChart = new Chart(document.getElementById('yourChart'), {
+                type: 'line',
+                data: data,
+                options: {
+                    legend: {display: false},
+                    title: {
+                        display: true,
+                        text: "Revenue Dokter"
+                    }
+                }
+            })
+        }
     }
 
     async function getData(types) {
@@ -100,7 +134,7 @@
                 }]
             }
 
-            newChart = new Chart(document.getElementById('myChart'), {
+            barChart = new Chart(document.getElementById('myChart'), {
                 type: 'bar',
                 data: data,
                 options: {
@@ -121,7 +155,7 @@
                 }]
             }
 
-            newChart = new Chart(document.getElementById('myChart'), {
+            barChart = new Chart(document.getElementById('myChart'), {
                 type: 'bar',
                 data: data,
                 options: {
@@ -135,11 +169,22 @@
         }
     }
 
+    function changesType(type) {
+        if (type === 'monthly') {
+            lineChart.destroy();
+            getDataLines('monthly')
+        } else {
+            lineChart.destroy();
+            getDataLines('daily')
+        }
+    }
+
     function dataType(type) {
-        newChart.destroy();
         if (type === "revenue") {
+            barChart.destroy();
             getData("revenue")
         } else {
+            barChart.destroy();
             getData("banyak Appointment")
         }
     }
-- 
GitLab


From 928b96df1fbeccdfbd046e75453c83f036f30cad Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Mon, 12 Dec 2022 12:24:40 +0700
Subject: [PATCH 43/44] changes

---
 .../TK/SpringTkApap/appointment/AppointmentController.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index cea5507..d03fa55 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -26,7 +26,7 @@ import java.util.List;
 public class AppointmentController {
 
     @Autowired
-    AppointmentService appointmentService;
+    spring.tk.springtkapap.appointment.AppointmentService appointmentService;
 
     @Autowired
     DokterService dokterService;
-- 
GitLab


From a85cf92e2b4d7c218b30fb777c5a4e11622c40bc Mon Sep 17 00:00:00 2001
From: "arga.christian" <arga.christian@ui.ac.id>
Date: Mon, 12 Dec 2022 12:25:17 +0700
Subject: [PATCH 44/44] changes

---
 .../TK/SpringTkApap/appointment/AppointmentController.java      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
index d03fa55..cea5507 100644
--- a/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
+++ b/SpringTkApap/src/main/java/spring/TK/SpringTkApap/appointment/AppointmentController.java
@@ -26,7 +26,7 @@ import java.util.List;
 public class AppointmentController {
 
     @Autowired
-    spring.tk.springtkapap.appointment.AppointmentService appointmentService;
+    AppointmentService appointmentService;
 
     @Autowired
     DokterService dokterService;
-- 
GitLab