* [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.BorderPane; | ||||
| import javafx.scene.layout.VBox; | import javafx.scene.layout.VBox; | ||||
| import javafx.stage.Stage; | import javafx.stage.Stage; | ||||
| import javafx.stage.Window; | |||||
| import retrofit2.HttpException; | import retrofit2.HttpException; | ||||
| public class FormUtamaController implements Initializable { | public class FormUtamaController implements Initializable { | ||||
| @@ -406,6 +407,10 @@ public class FormUtamaController implements Initializable { | |||||
| return stage; | return stage; | ||||
| } | } | ||||
| public Window getWindow(){ | |||||
| return bpMain.getScene().getWindow(); | |||||
| } | |||||
| @FXML | @FXML | ||||
| void btnTambahNotaOnAction(ActionEvent event) { | void btnTambahNotaOnAction(ActionEvent event) { | ||||
| @@ -5,6 +5,7 @@ | |||||
| */ | */ | ||||
| package id.amigogroup.posterminal.api; | package id.amigogroup.posterminal.api; | ||||
| import com.fasterxml.jackson.databind.JsonNode; | |||||
| import id.amigogroup.posterminal.model.Barang; | import id.amigogroup.posterminal.model.Barang; | ||||
| import id.amigogroup.posterminal.model.DNotaTunai; | import id.amigogroup.posterminal.model.DNotaTunai; | ||||
| import id.amigogroup.posterminal.model.Karyawan; | import id.amigogroup.posterminal.model.Karyawan; | ||||
| @@ -20,6 +21,7 @@ import io.reactivex.schedulers.Schedulers; | |||||
| import java.net.SocketException; | import java.net.SocketException; | ||||
| import java.net.SocketTimeoutException; | import java.net.SocketTimeoutException; | ||||
| import java.net.UnknownHostException; | import java.net.UnknownHostException; | ||||
| import java.util.HashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.logging.Level; | import java.util.logging.Level; | ||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||
| @@ -95,6 +97,13 @@ public class AmigoPosRx { | |||||
| return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik) | return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik) | ||||
| .subscribeOn(Schedulers.trampoline()); | .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 | //Pelanggan API | ||||
| public Observable<Pelanggan> getPelangganByKodeMember(String kodeMember) { | public Observable<Pelanggan> getPelangganByKodeMember(String kodeMember) { | ||||
| @@ -7,7 +7,11 @@ package id.amigogroup.posterminal.api; | |||||
| import id.amigogroup.posterminal.model.Karyawan; | import id.amigogroup.posterminal.model.Karyawan; | ||||
| import io.reactivex.Observable; | import io.reactivex.Observable; | ||||
| import java.util.HashMap; | |||||
| import okhttp3.ResponseBody; | |||||
| import retrofit2.http.Body; | |||||
| import retrofit2.http.GET; | import retrofit2.http.GET; | ||||
| import retrofit2.http.POST; | |||||
| import retrofit2.http.Path; | import retrofit2.http.Path; | ||||
| /** | /** | ||||
| @@ -15,7 +19,14 @@ import retrofit2.http.Path; | |||||
| * @author ronal | * @author ronal | ||||
| */ | */ | ||||
| public interface ServiceApiKaryawan { | public interface ServiceApiKaryawan { | ||||
| //KARYAWAN | |||||
| //Mengambil Karyawan berdasarkan Nik | //Mengambil Karyawan berdasarkan Nik | ||||
| @GET("karyawans/{nik}") | @GET("karyawans/{nik}") | ||||
| Observable<Karyawan> getKaryawanByNik(@Path("nik") String 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; | 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.SystemValue; | ||||
| import id.amigogroup.posterminal.api.AmigoPosRx; | import id.amigogroup.posterminal.api.AmigoPosRx; | ||||
| import id.amigogroup.posterminal.model.Karyawan; | import id.amigogroup.posterminal.model.Karyawan; | ||||
| @@ -15,9 +18,7 @@ import io.reactivex.Observer; | |||||
| import io.reactivex.disposables.Disposable; | import io.reactivex.disposables.Disposable; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.net.HttpURLConnection; | import java.net.HttpURLConnection; | ||||
| import java.net.SocketTimeoutException; | |||||
| import java.net.URL; | import java.net.URL; | ||||
| import java.net.UnknownHostException; | |||||
| import java.util.ResourceBundle; | import java.util.ResourceBundle; | ||||
| import java.util.logging.Level; | import java.util.logging.Level; | ||||
| import java.util.logging.Logger; | import java.util.logging.Logger; | ||||
| @@ -33,6 +34,7 @@ import javafx.scene.control.TextField; | |||||
| import javafx.scene.image.Image; | import javafx.scene.image.Image; | ||||
| import javafx.scene.layout.AnchorPane; | import javafx.scene.layout.AnchorPane; | ||||
| import javafx.stage.Stage; | import javafx.stage.Stage; | ||||
| import okhttp3.ResponseBody; | |||||
| import retrofit2.HttpException; | import retrofit2.HttpException; | ||||
| /** | /** | ||||
| @@ -73,33 +75,64 @@ public class FormLoginController implements Initializable { | |||||
| @FXML | @FXML | ||||
| public void btnLoginOnAction(ActionEvent event) { | 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 | @Override | ||||
| public void onSubscribe(Disposable dspsbl) { | public void onSubscribe(Disposable dspsbl) { | ||||
| } | } | ||||
| @Override | @Override | ||||
| public void onNext(Karyawan k) { | |||||
| public void onNext(KaryawanLogin k) { | |||||
| //kasir, Asko produk, Asko SDM, Pemko | //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 { | 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) { | } 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); | Logger.getLogger(FormLoginController.class.getName()).log(Level.SEVERE, null, ex); | ||||
| } | } | ||||
| } else { | } else { | ||||
| Alert alert = AlertUtil.getAlertError( | 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."); | "Karyawan dengan nomor tersebut tidak berwenang untuk mengakses aplikasi ini."); | ||||
| alert.initOwner((Stage) apMain.getScene().getWindow()); | alert.initOwner((Stage) apMain.getScene().getWindow()); | ||||
| alert.show(); | alert.show(); | ||||
| @@ -126,4 +159,14 @@ public class FormLoginController implements Initializable { | |||||
| public void onComplete() { | 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.JsonNode; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import com.fasterxml.jackson.databind.node.ObjectNode; | import com.fasterxml.jackson.databind.node.ObjectNode; | ||||
| import id.amigogroup.posterminal.SystemValue; | |||||
| import id.amigogroup.posterminal.api.AmigoPosRx; | import id.amigogroup.posterminal.api.AmigoPosRx; | ||||
| import id.amigogroup.posterminal.model.Barang; | import id.amigogroup.posterminal.model.Barang; | ||||
| import id.amigogroup.posterminal.model.DNotaRetur; | import id.amigogroup.posterminal.model.DNotaRetur; | ||||
| @@ -82,6 +83,8 @@ public class FormTransaksiReturController implements Initializable { | |||||
| @FXML | @FXML | ||||
| private Label lblNomorNota; | private Label lblNomorNota; | ||||
| @FXML | @FXML | ||||
| private Label lblKasir; | |||||
| @FXML | |||||
| private TableView<TabelBarangRetur> tbvRetur; | private TableView<TabelBarangRetur> tbvRetur; | ||||
| @FXML | @FXML | ||||
| private TableColumn<TabelBarangRetur, Integer> tcNoRetur; | private TableColumn<TabelBarangRetur, Integer> tcNoRetur; | ||||
| @@ -107,8 +110,7 @@ public class FormTransaksiReturController implements Initializable { | |||||
| private StackPane stpReturDrop; | private StackPane stpReturDrop; | ||||
| @FXML | @FXML | ||||
| private Label lblTambahKeTabelRetur; | private Label lblTambahKeTabelRetur; | ||||
| private TableColumn<TabelBarangTunai, Button> tcAction; | |||||
| private final AmigoPosRx posRx = new AmigoPosRx(); | private final AmigoPosRx posRx = new AmigoPosRx(); | ||||
| private String noNota = ""; | private String noNota = ""; | ||||
| private final ObservableList<TabelBarangTunai> daftarTabelPenjualan = FXCollections.observableArrayList(); | private final ObservableList<TabelBarangTunai> daftarTabelPenjualan = FXCollections.observableArrayList(); | ||||
| @@ -156,6 +158,13 @@ public class FormTransaksiReturController implements Initializable { | |||||
| public void initData(String noNota, boolean baru) { | public void initData(String noNota, boolean baru) { | ||||
| this.noNota = noNota; | this.noNota = noNota; | ||||
| if(!baru){ | |||||
| } | |||||
| if(SystemValue.karyawanLogin != null){ | |||||
| lblKasir.setText(Fucout.getTextColon(SystemValue.karyawanLogin.getNama())); | |||||
| } | |||||
| lblNomorNota.setText(Fucout.getTextColon(noNota)); | lblNomorNota.setText(Fucout.getTextColon(noNota)); | ||||
| } | } | ||||
| @@ -63,6 +63,8 @@ public class FormTransaksiTunaiController implements Initializable { | |||||
| @FXML | @FXML | ||||
| private Label lblNoNota; | private Label lblNoNota; | ||||
| @FXML | @FXML | ||||
| private Label lblKasir; | |||||
| @FXML | |||||
| private TableView<TabelBarangTunai> tbvTransaksi; | private TableView<TabelBarangTunai> tbvTransaksi; | ||||
| @FXML | @FXML | ||||
| private TableColumn<TabelBarangTunai, Integer> tcNo; | private TableColumn<TabelBarangTunai, Integer> tcNo; | ||||
| @@ -133,6 +135,10 @@ public class FormTransaksiTunaiController implements Initializable { | |||||
| if (!baru) { | if (!baru) { | ||||
| posRx.getDNotaTunaiByNoNota(noNota).subscribe(getDNotaTunaiObserver); | posRx.getDNotaTunaiByNoNota(noNota).subscribe(getDNotaTunaiObserver); | ||||
| } | } | ||||
| if(SystemValue.karyawanLogin != null){ | |||||
| lblKasir.setText(Fucout.getTextColon(SystemValue.karyawanLogin.getNama())); | |||||
| } | |||||
| this.parent = parent; | this.parent = parent; | ||||
| this.noNota = noNota; | this.noNota = noNota; | ||||
| lblNoNota.setText(Fucout.getTextColon(noNota)); | lblNoNota.setText(Fucout.getTextColon(noNota)); | ||||
| @@ -144,8 +150,6 @@ public class FormTransaksiTunaiController implements Initializable { | |||||
| KeyCombination kcTundaNota = new KeyCodeCombination(KeyCode.T, KeyCombination.CONTROL_DOWN); | KeyCombination kcTundaNota = new KeyCodeCombination(KeyCode.T, KeyCombination.CONTROL_DOWN); | ||||
| Runnable rnTundaNota = () -> { | Runnable rnTundaNota = () -> { | ||||
| //Tunda Nota | |||||
| System.out.println("Tunda"); | |||||
| List<DNotaTunai> daftarDNotaTunai = new ArrayList<>(); | List<DNotaTunai> daftarDNotaTunai = new ArrayList<>(); | ||||
| if (noNota != null && !noNota.equals("")) { | if (noNota != null && !noNota.equals("")) { | ||||
| @@ -364,7 +368,7 @@ public class FormTransaksiTunaiController implements Initializable { | |||||
| total = totalTemp; | total = totalTemp; | ||||
| updateLabelGrandTotal(); | updateLabelGrandTotal(); | ||||
| return 0; | |||||
| return totalTemp; | |||||
| } | } | ||||
| private void updateLabelGrandTotal() { | private void updateLabelGrandTotal() { | ||||
| @@ -619,7 +623,7 @@ public class FormTransaksiTunaiController implements Initializable { | |||||
| Alert alert = AlertUtil.getAlertInfo( | Alert alert = AlertUtil.getAlertInfo( | ||||
| "Berhasil Ditunda", | "Berhasil Ditunda", | ||||
| "Nota berhasil ditunda!"); | "Nota berhasil ditunda!"); | ||||
| alert.initOwner(apMain.getScene().getWindow()); | |||||
| alert.initOwner(parent.getWindow()); | |||||
| alert.show(); | alert.show(); | ||||
| if (parent != null) { | if (parent != null) { | ||||
| @@ -17,6 +17,7 @@ import javafx.scene.image.ImageView; | |||||
| * @author ronal | * @author ronal | ||||
| */ | */ | ||||
| public class AlertUtil { | 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_DITEMUKAN_TITLE = "Error: Data Tidak Ditemukan"; | ||||
| public static final String ERROR_TIDAK_TERDUGA_TITLE = "Error: Terjadi Kesalahan"; | public static final String ERROR_TIDAK_TERDUGA_TITLE = "Error: Terjadi Kesalahan"; | ||||
| public static final String ERROR_TIDAK_TERDUGA_MESSAGE = "Terjadi kesalahan yang tidak terduga."; | 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"> | <HBox alignment="CENTER_LEFT" maxWidth="1.7976931348623157E308" spacing="5.0" GridPane.columnIndex="2"> | ||||
| <children> | <children> | ||||
| <Label text="Kasir" /> | <Label text="Kasir" /> | ||||
| <Label text=": -" /> | |||||
| <Label fx:id="lblKasir" text=": -" /> | |||||
| </children> | </children> | ||||
| <GridPane.margin> | <GridPane.margin> | ||||
| <Insets top="5.0" /> | <Insets top="5.0" /> | ||||
| @@ -82,7 +82,7 @@ | |||||
| <Font size="14.0" /> | <Font size="14.0" /> | ||||
| </font> | </font> | ||||
| </Label> | </Label> | ||||
| <Label text=": -"> | |||||
| <Label fx:id="lblKasir" text=": -"> | |||||
| <font> | <font> | ||||
| <Font size="14.0" /> | <Font size="14.0" /> | ||||
| </font> | </font> | ||||