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">×</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">×</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