Aplikasi POS Amigo, dibangun dengan JavaFX dengan Maven
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

173 lignes
6.2 KiB

  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package id.amigogroup.posterminal.keamanan;
  7. import com.fasterxml.jackson.databind.JsonNode;
  8. import com.fasterxml.jackson.databind.ObjectMapper;
  9. import com.fasterxml.jackson.databind.node.ObjectNode;
  10. import id.amigogroup.posterminal.SystemValue;
  11. import id.amigogroup.posterminal.api.AmigoPosRx;
  12. import id.amigogroup.posterminal.model.Karyawan;
  13. import id.amigogroup.posterminal.util.AlertUtil;
  14. import id.amigogroup.posterminal.util.Fucout;
  15. import io.reactivex.Observable;
  16. import io.reactivex.Observer;
  17. import io.reactivex.disposables.Disposable;
  18. import java.io.IOException;
  19. import java.net.HttpURLConnection;
  20. import java.net.URL;
  21. import java.util.ResourceBundle;
  22. import java.util.logging.Level;
  23. import java.util.logging.Logger;
  24. import javafx.event.ActionEvent;
  25. import javafx.fxml.FXML;
  26. import javafx.fxml.FXMLLoader;
  27. import javafx.fxml.Initializable;
  28. import javafx.scene.Parent;
  29. import javafx.scene.Scene;
  30. import javafx.scene.control.Alert;
  31. import javafx.scene.control.PasswordField;
  32. import javafx.scene.control.TextField;
  33. import javafx.scene.image.Image;
  34. import javafx.scene.layout.AnchorPane;
  35. import javafx.stage.Stage;
  36. import okhttp3.ResponseBody;
  37. import retrofit2.HttpException;
  38. /**
  39. * FXML Controller class
  40. *
  41. * @author ronal
  42. */
  43. public class FormLoginController implements Initializable {
  44. @FXML
  45. private AnchorPane apMain;
  46. @FXML
  47. private TextField fldNamaPengguna;
  48. @FXML
  49. private PasswordField fldKataSandi;
  50. private final AmigoPosRx posRx = new AmigoPosRx();
  51. /**
  52. * Initializes the controller class.
  53. */
  54. @Override
  55. public void initialize(URL url, ResourceBundle rb) {
  56. }
  57. public Stage generateNewWindow(String url) throws IOException {
  58. Stage stage = new Stage();
  59. Parent root;
  60. root = FXMLLoader.load(getClass().getResource(url));
  61. Scene scene = new Scene(root);
  62. stage.setTitle(Fucout.APP_TITLE);
  63. stage.getIcons().add(new Image(Fucout.APP_ICON));
  64. stage.setScene(scene);
  65. return stage;
  66. }
  67. @FXML
  68. public void btnLoginOnAction(ActionEvent event) {
  69. if (!fldNamaPengguna.getText().equals("") && !fldKataSandi.getText().equals("")) {
  70. String nik = fldNamaPengguna.getText();
  71. Observable.zip(
  72. posRx.getKaryawanByNik(fldNamaPengguna.getText()),
  73. posRx.loginKaryawanByNikPin(nik, fldKataSandi.getText()),
  74. (Karyawan k, ResponseBody response) -> {
  75. return new KaryawanLogin(k,response);
  76. }).subscribe(karyawanLoginObserver);
  77. } else {
  78. Alert alert = AlertUtil.getAlertWarning(
  79. "Data Login Tidak Lengkap",
  80. "Kolom username dan password harus terisi");
  81. alert.initOwner(apMain.getScene().getWindow());
  82. alert.show();
  83. }
  84. }
  85. Observer<KaryawanLogin> karyawanLoginObserver = new Observer<>() {
  86. @Override
  87. public void onSubscribe(Disposable dspsbl) {
  88. }
  89. @Override
  90. public void onNext(KaryawanLogin k) {
  91. //kasir, Asko produk, Asko SDM, Pemko
  92. if (k != null && Fucout.isAllowedLogin(k.karyawan.getIdPekerjaan())) {
  93. ObjectMapper mapper = new ObjectMapper();
  94. try {
  95. JsonNode jsonNode = mapper.readTree(k.result.string());
  96. ObjectNode objectNode = jsonNode.deepCopy();
  97. if(objectNode.get("status").asBoolean()){
  98. SystemValue.karyawanLogin = k.karyawan;
  99. generateNewWindow("/fxml/FormUtama.fxml").show();
  100. Stage thisStage = (Stage) apMain.getScene().getWindow();
  101. thisStage.hide();
  102. }
  103. else{
  104. Alert alert = AlertUtil.getAlertError(
  105. AlertUtil.ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE,
  106. objectNode.get("message").asText());
  107. alert.initOwner(apMain.getScene().getWindow());
  108. alert.show();
  109. }
  110. } catch (IOException ex) {
  111. Alert alert = AlertUtil.getAlertError(
  112. AlertUtil.ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE,
  113. "Terjadi error yang tidak diduga sehingga karyawan tidak boleh mengakses.");
  114. alert.initOwner((Stage) apMain.getScene().getWindow());
  115. alert.show();
  116. Logger.getLogger(FormLoginController.class.getName()).log(Level.SEVERE, null, ex);
  117. }
  118. } else {
  119. Alert alert = AlertUtil.getAlertError(
  120. AlertUtil.ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE,
  121. "Karyawan dengan nomor tersebut tidak berwenang untuk mengakses aplikasi ini.");
  122. alert.initOwner((Stage) apMain.getScene().getWindow());
  123. alert.show();
  124. }
  125. }
  126. @Override
  127. public void onError(Throwable error) {
  128. if (error instanceof HttpException) {
  129. switch (((HttpException) error).code()) {
  130. case HttpURLConnection.HTTP_NOT_FOUND:
  131. Alert alert = AlertUtil.getAlertError(
  132. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  133. "Karyawan dengan nomor tersebut tidak ditemukan.");
  134. alert.initOwner(apMain.getScene().getWindow());
  135. alert.show();
  136. }
  137. } else {
  138. AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow());
  139. }
  140. }
  141. @Override
  142. public void onComplete() {
  143. }
  144. };
  145. private class KaryawanLogin{
  146. private Karyawan karyawan;
  147. private ResponseBody result;
  148. public KaryawanLogin(Karyawan karyawan, ResponseBody result) {
  149. this.karyawan = karyawan;
  150. this.result = result;
  151. }
  152. }
  153. }