* [Logic] Membuat fungsi login * Membuat rute baru * Membuat logic di form login * [UI] Membuat alert warning jika tidak memasukkan username/password * [UI] Menampilkan nama kasir di dalam notapull/11/head
| @@ -48,6 +48,7 @@ import javafx.scene.input.KeyEvent; | |||
| import javafx.scene.layout.BorderPane; | |||
| import javafx.scene.layout.VBox; | |||
| import javafx.stage.Stage; | |||
| import javafx.stage.Window; | |||
| import retrofit2.HttpException; | |||
| public class FormUtamaController implements Initializable { | |||
| @@ -406,6 +407,10 @@ public class FormUtamaController implements Initializable { | |||
| return stage; | |||
| } | |||
| public Window getWindow(){ | |||
| return bpMain.getScene().getWindow(); | |||
| } | |||
| @FXML | |||
| void btnTambahNotaOnAction(ActionEvent event) { | |||
| @@ -5,6 +5,7 @@ | |||
| */ | |||
| package id.amigogroup.posterminal.api; | |||
| import com.fasterxml.jackson.databind.JsonNode; | |||
| import id.amigogroup.posterminal.model.Barang; | |||
| import id.amigogroup.posterminal.model.DNotaTunai; | |||
| import id.amigogroup.posterminal.model.Karyawan; | |||
| @@ -20,6 +21,7 @@ import io.reactivex.schedulers.Schedulers; | |||
| import java.net.SocketException; | |||
| import java.net.SocketTimeoutException; | |||
| import java.net.UnknownHostException; | |||
| import java.util.HashMap; | |||
| import java.util.List; | |||
| import java.util.logging.Level; | |||
| import java.util.logging.Logger; | |||
| @@ -95,6 +97,13 @@ public class AmigoPosRx { | |||
| return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| public Observable<ResponseBody> loginKaryawanByNikPin(String nik, String pin) { | |||
| HashMap<String, Object> body = new HashMap<>(); | |||
| body.put("pin", pin); | |||
| return UtilsApi.getServiceApiKaryawan().loginKaryawanByNikPin(nik, body) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| //Pelanggan API | |||
| public Observable<Pelanggan> getPelangganByKodeMember(String kodeMember) { | |||
| @@ -7,7 +7,11 @@ package id.amigogroup.posterminal.api; | |||
| import id.amigogroup.posterminal.model.Karyawan; | |||
| import io.reactivex.Observable; | |||
| import java.util.HashMap; | |||
| import okhttp3.ResponseBody; | |||
| import retrofit2.http.Body; | |||
| import retrofit2.http.GET; | |||
| import retrofit2.http.POST; | |||
| import retrofit2.http.Path; | |||
| /** | |||
| @@ -15,7 +19,14 @@ import retrofit2.http.Path; | |||
| * @author ronal | |||
| */ | |||
| public interface ServiceApiKaryawan { | |||
| //KARYAWAN | |||
| //Mengambil Karyawan berdasarkan Nik | |||
| @GET("karyawans/{nik}") | |||
| Observable<Karyawan> getKaryawanByNik(@Path("nik") String nik); | |||
| //Mengambil Login Karyawan berdasarkan Nik dan Pin | |||
| @POST("karyawans/{nik}/auth/pin") | |||
| Observable<ResponseBody> loginKaryawanByNikPin( | |||
| @Path("nik") String nik, | |||
| @Body HashMap<String, Object> pin); | |||
| } | |||
| @@ -5,6 +5,9 @@ | |||
| */ | |||
| package id.amigogroup.posterminal.keamanan; | |||
| import com.fasterxml.jackson.databind.JsonNode; | |||
| import com.fasterxml.jackson.databind.ObjectMapper; | |||
| import com.fasterxml.jackson.databind.node.ObjectNode; | |||
| import id.amigogroup.posterminal.SystemValue; | |||
| import id.amigogroup.posterminal.api.AmigoPosRx; | |||
| import id.amigogroup.posterminal.model.Karyawan; | |||
| @@ -15,9 +18,7 @@ import io.reactivex.Observer; | |||
| import io.reactivex.disposables.Disposable; | |||
| import java.io.IOException; | |||
| import java.net.HttpURLConnection; | |||
| import java.net.SocketTimeoutException; | |||
| import java.net.URL; | |||
| import java.net.UnknownHostException; | |||
| import java.util.ResourceBundle; | |||
| import java.util.logging.Level; | |||
| import java.util.logging.Logger; | |||
| @@ -33,6 +34,7 @@ import javafx.scene.control.TextField; | |||
| import javafx.scene.image.Image; | |||
| import javafx.scene.layout.AnchorPane; | |||
| import javafx.stage.Stage; | |||
| import okhttp3.ResponseBody; | |||
| import retrofit2.HttpException; | |||
| /** | |||
| @@ -73,33 +75,64 @@ public class FormLoginController implements Initializable { | |||
| @FXML | |||
| public void btnLoginOnAction(ActionEvent event) { | |||
| if (!fldNamaPengguna.getText().equals("")) { | |||
| Observable<Karyawan> karyawanObs = posRx.getKaryawanByNik(fldNamaPengguna.getText()); | |||
| karyawanObs.subscribe(karyawanLoginObserver); | |||
| if (!fldNamaPengguna.getText().equals("") && !fldKataSandi.getText().equals("")) { | |||
| String nik = fldNamaPengguna.getText(); | |||
| Observable.zip( | |||
| posRx.getKaryawanByNik(fldNamaPengguna.getText()), | |||
| posRx.loginKaryawanByNikPin(nik, fldKataSandi.getText()), | |||
| (Karyawan k, ResponseBody response) -> { | |||
| return new KaryawanLogin(k,response); | |||
| }).subscribe(karyawanLoginObserver); | |||
| } else { | |||
| Alert alert = AlertUtil.getAlertWarning( | |||
| "Data Login Tidak Lengkap", | |||
| "Kolom username dan password harus terisi"); | |||
| alert.initOwner(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| } | |||
| } | |||
| Observer<Karyawan> karyawanLoginObserver = new Observer<>() { | |||
| Observer<KaryawanLogin> karyawanLoginObserver = new Observer<>() { | |||
| @Override | |||
| public void onSubscribe(Disposable dspsbl) { | |||
| } | |||
| @Override | |||
| public void onNext(Karyawan k) { | |||
| public void onNext(KaryawanLogin k) { | |||
| //kasir, Asko produk, Asko SDM, Pemko | |||
| if (k != null && Fucout.isAllowedLogin(k.getIdPekerjaan())) { | |||
| SystemValue.karyawanLogin = k; | |||
| if (k != null && Fucout.isAllowedLogin(k.karyawan.getIdPekerjaan())) { | |||
| ObjectMapper mapper = new ObjectMapper(); | |||
| try { | |||
| generateNewWindow("/fxml/FormUtama.fxml").show(); | |||
| Stage thisStage = (Stage) apMain.getScene().getWindow(); | |||
| //close current stage | |||
| thisStage.hide(); | |||
| JsonNode jsonNode = mapper.readTree(k.result.string()); | |||
| ObjectNode objectNode = jsonNode.deepCopy(); | |||
| if(objectNode.get("status").asBoolean()){ | |||
| SystemValue.karyawanLogin = k.karyawan; | |||
| generateNewWindow("/fxml/FormUtama.fxml").show(); | |||
| Stage thisStage = (Stage) apMain.getScene().getWindow(); | |||
| thisStage.hide(); | |||
| } | |||
| else{ | |||
| Alert alert = AlertUtil.getAlertError( | |||
| AlertUtil.ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE, | |||
| objectNode.get("message").asText()); | |||
| alert.initOwner(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| } | |||
| } catch (IOException ex) { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| AlertUtil.ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE, | |||
| "Terjadi error yang tidak diduga sehingga karyawan tidak boleh mengakses."); | |||
| alert.initOwner((Stage) apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| Logger.getLogger(FormLoginController.class.getName()).log(Level.SEVERE, null, ex); | |||
| } | |||
| } else { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| "Error: Karyawan Tidak Boleh Akses", | |||
| AlertUtil.ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE, | |||
| "Karyawan dengan nomor tersebut tidak berwenang untuk mengakses aplikasi ini."); | |||
| alert.initOwner((Stage) apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| @@ -126,4 +159,14 @@ public class FormLoginController implements Initializable { | |||
| public void onComplete() { | |||
| } | |||
| }; | |||
| private class KaryawanLogin{ | |||
| private Karyawan karyawan; | |||
| private ResponseBody result; | |||
| public KaryawanLogin(Karyawan karyawan, ResponseBody result) { | |||
| this.karyawan = karyawan; | |||
| this.result = result; | |||
| } | |||
| } | |||
| } | |||
| @@ -8,6 +8,7 @@ package id.amigogroup.posterminal.transaksi; | |||
| import com.fasterxml.jackson.databind.JsonNode; | |||
| import com.fasterxml.jackson.databind.ObjectMapper; | |||
| import com.fasterxml.jackson.databind.node.ObjectNode; | |||
| import id.amigogroup.posterminal.SystemValue; | |||
| import id.amigogroup.posterminal.api.AmigoPosRx; | |||
| import id.amigogroup.posterminal.model.Barang; | |||
| import id.amigogroup.posterminal.model.DNotaRetur; | |||
| @@ -82,6 +83,8 @@ public class FormTransaksiReturController implements Initializable { | |||
| @FXML | |||
| private Label lblNomorNota; | |||
| @FXML | |||
| private Label lblKasir; | |||
| @FXML | |||
| private TableView<TabelBarangRetur> tbvRetur; | |||
| @FXML | |||
| private TableColumn<TabelBarangRetur, Integer> tcNoRetur; | |||
| @@ -107,8 +110,7 @@ public class FormTransaksiReturController implements Initializable { | |||
| private StackPane stpReturDrop; | |||
| @FXML | |||
| private Label lblTambahKeTabelRetur; | |||
| private TableColumn<TabelBarangTunai, Button> tcAction; | |||
| private final AmigoPosRx posRx = new AmigoPosRx(); | |||
| private String noNota = ""; | |||
| private final ObservableList<TabelBarangTunai> daftarTabelPenjualan = FXCollections.observableArrayList(); | |||
| @@ -156,6 +158,13 @@ public class FormTransaksiReturController implements Initializable { | |||
| public void initData(String noNota, boolean baru) { | |||
| this.noNota = noNota; | |||
| if(!baru){ | |||
| } | |||
| if(SystemValue.karyawanLogin != null){ | |||
| lblKasir.setText(Fucout.getTextColon(SystemValue.karyawanLogin.getNama())); | |||
| } | |||
| lblNomorNota.setText(Fucout.getTextColon(noNota)); | |||
| } | |||
| @@ -63,6 +63,8 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| @FXML | |||
| private Label lblNoNota; | |||
| @FXML | |||
| private Label lblKasir; | |||
| @FXML | |||
| private TableView<TabelBarangTunai> tbvTransaksi; | |||
| @FXML | |||
| private TableColumn<TabelBarangTunai, Integer> tcNo; | |||
| @@ -133,6 +135,10 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| if (!baru) { | |||
| posRx.getDNotaTunaiByNoNota(noNota).subscribe(getDNotaTunaiObserver); | |||
| } | |||
| if(SystemValue.karyawanLogin != null){ | |||
| lblKasir.setText(Fucout.getTextColon(SystemValue.karyawanLogin.getNama())); | |||
| } | |||
| this.parent = parent; | |||
| this.noNota = noNota; | |||
| lblNoNota.setText(Fucout.getTextColon(noNota)); | |||
| @@ -144,8 +150,6 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| KeyCombination kcTundaNota = new KeyCodeCombination(KeyCode.T, KeyCombination.CONTROL_DOWN); | |||
| Runnable rnTundaNota = () -> { | |||
| //Tunda Nota | |||
| System.out.println("Tunda"); | |||
| List<DNotaTunai> daftarDNotaTunai = new ArrayList<>(); | |||
| if (noNota != null && !noNota.equals("")) { | |||
| @@ -364,7 +368,7 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| total = totalTemp; | |||
| updateLabelGrandTotal(); | |||
| return 0; | |||
| return totalTemp; | |||
| } | |||
| private void updateLabelGrandTotal() { | |||
| @@ -619,7 +623,7 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| Alert alert = AlertUtil.getAlertInfo( | |||
| "Berhasil Ditunda", | |||
| "Nota berhasil ditunda!"); | |||
| alert.initOwner(apMain.getScene().getWindow()); | |||
| alert.initOwner(parent.getWindow()); | |||
| alert.show(); | |||
| if (parent != null) { | |||
| @@ -17,6 +17,7 @@ import javafx.scene.image.ImageView; | |||
| * @author ronal | |||
| */ | |||
| public class AlertUtil { | |||
| public static final String ERROR_KARYAWAN_TIDAK_BOLEH_AKSES_TITLE = "Error: Karyawan Tidak Boleh Akses"; | |||
| public static final String ERROR_TIDAK_DITEMUKAN_TITLE = "Error: Data Tidak Ditemukan"; | |||
| public static final String ERROR_TIDAK_TERDUGA_TITLE = "Error: Terjadi Kesalahan"; | |||
| public static final String ERROR_TIDAK_TERDUGA_MESSAGE = "Terjadi kesalahan yang tidak terduga."; | |||
| @@ -97,7 +97,7 @@ | |||
| <HBox alignment="CENTER_LEFT" maxWidth="1.7976931348623157E308" spacing="5.0" GridPane.columnIndex="2"> | |||
| <children> | |||
| <Label text="Kasir" /> | |||
| <Label text=": -" /> | |||
| <Label fx:id="lblKasir" text=": -" /> | |||
| </children> | |||
| <GridPane.margin> | |||
| <Insets top="5.0" /> | |||
| @@ -82,7 +82,7 @@ | |||
| <Font size="14.0" /> | |||
| </font> | |||
| </Label> | |||
| <Label text=": -"> | |||
| <Label fx:id="lblKasir" text=": -"> | |||
| <font> | |||
| <Font size="14.0" /> | |||
| </font> | |||