From 9c3acf6f6a876e3e6f6312f0bf361b052ae0d9fc Mon Sep 17 00:00:00 2001 From: Ronaldo Christnawan Date: Fri, 6 Mar 2020 12:01:10 +0700 Subject: [PATCH] Penggabungan Error Handling RxJava, Dialog Cari Barang [Logic] Semua error handling generic (mis. tidak ada internet) rxjava digabungkan ke AmigoPosRx [Logic + UI] Menampilkan data no barang di dialog cari barang, dan bisa digunakan untuk menambahkan barang ke nota --- .../posterminal/FormUtamaController.java | 47 ++- .../posterminal/api/AmigoPosRx.java | 69 +++- .../posterminal/api/ServiceApiBarang.java | 13 +- .../bayar/FormBayarReturController.java | 18 +- .../keamanan/FormLoginController.java | 13 +- .../pencarian/DialogCariBarangController.java | 310 +++++++++++++++--- .../DialogCariPelangganController.java | 27 +- .../pencarian/TabelBarangCari.java | 49 ++- .../posterminal/transaksi/BarangFull.java | 4 + .../transaksi/DialogTambahNotaController.java | 14 +- .../FormTransaksiReturController.java | 44 +-- .../FormTransaksiTunaiController.java | 156 ++++----- .../posterminal/util/AlertUtil.java | 9 + src/main/resources/fxml/DialogCariBarang.fxml | 4 +- 14 files changed, 483 insertions(+), 294 deletions(-) diff --git a/src/main/java/id/amigogroup/posterminal/FormUtamaController.java b/src/main/java/id/amigogroup/posterminal/FormUtamaController.java index 1d3fe95..34b7747 100644 --- a/src/main/java/id/amigogroup/posterminal/FormUtamaController.java +++ b/src/main/java/id/amigogroup/posterminal/FormUtamaController.java @@ -1,12 +1,12 @@ package id.amigogroup.posterminal; import id.amigogroup.posterminal.api.AmigoPosRx; -import id.amigogroup.posterminal.model.Barang; import id.amigogroup.posterminal.model.Pelanggan; import id.amigogroup.posterminal.pencarian.DialogCariBarangController; import id.amigogroup.posterminal.pencarian.DialogCariNotaTundaController; import id.amigogroup.posterminal.pencarian.DialogCariPelangganController; import id.amigogroup.posterminal.pencarian.DialogCetakUlangNotaController; +import id.amigogroup.posterminal.transaksi.BarangFull; import id.amigogroup.posterminal.transaksi.DialogKonfirmasiReturController; import id.amigogroup.posterminal.transaksi.DialogTambahNotaController; import id.amigogroup.posterminal.transaksi.FormTransaksiReturController; @@ -17,7 +17,6 @@ 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.util.ArrayList; import java.util.HashMap; @@ -166,13 +165,14 @@ public class FormUtamaController implements Initializable { loader.setLocation(getClass().getResource("/fxml/FormTransaksiTunai.fxml")); node = loader.load(); FormTransaksiTunaiController fttc = loader.getController(); - fttc.initData(noNota,baru); + notaContent.controllerTunai = fttc; + fttc.initData(noNota, baru); break; case FormConstanta.TRANSAKSI_RETUR: loader.setLocation(getClass().getResource("/fxml/FormTransaksiRetur.fxml")); node = loader.load(); FormTransaksiReturController ftrc = loader.getController(); - ftrc.initData(noNota,baru); + ftrc.initData(noNota, baru); break; } @@ -230,7 +230,29 @@ public class FormUtamaController implements Initializable { DialogCariBarangController dialogCariBarang = new DialogCariBarangController(); dialogCariBarang.initOwner(bpMain.getScene().getWindow()); - Optional result = dialogCariBarang.showAndWait(); + Optional result = dialogCariBarang.showAndWait(); + + if (result.isPresent()) { + BarangFull barangFull = result.get(); + switch (tipeTransaksiState) { + case FormConstanta.TRANSAKSI_TUNAI: + if (notaContent.controllerTunai != null) { + if (barangFull.getBarang() != null && barangFull.getNoBarang() != null + && barangFull.getBarang().getIdGabungan().equals(barangFull.getNoBarang().getIdGabungan())) { + notaContent.controllerTunai.addToTable(barangFull.getBarang(), barangFull.getNoBarang()); + } else { + Alert alert = AlertUtil.getAlertWarning( + AlertUtil.ERROR_TIDAK_LENGKAP_TITLE, + "Data Barang yang didapat tidak lengkap sehingga tidak bisa ditambahkan ke nota."); + alert.initOwner(bpMain.getScene().getWindow()); + alert.show(); + } + } + break; + case FormConstanta.TRANSAKSI_RETUR: + break; + } + } }; listShortcuts.put(kcCariBarang, rnCariBarang); @@ -488,19 +510,8 @@ public class FormUtamaController implements Initializable { alert.initOwner(bpMain.getScene().getWindow()); alert.show(); } - } else if (error instanceof SocketTimeoutException) { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_KONEKSI_TIMEOUT_TITLE, - AlertUtil.ERROR_KONEKSI_TIMEOUT_MESSAGE); - alert.initOwner(bpMain.getScene().getWindow()); - alert.show(); } else { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - AlertUtil.ERROR_TIDAK_TERDUGA_MESSAGE); - alert.initOwner(bpMain.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormUtamaController.class.getName()).log(Level.SEVERE, null, error); + AmigoPosRx.handleGenericError(error, bpMain.getScene().getWindow()); } } @@ -512,8 +523,10 @@ public class FormUtamaController implements Initializable { private class NotaContent { Button btnTunai; + FormTransaksiTunaiController controllerTunai = null; Button btnBawa; Button btnBon; Button btnRetur; + FormTransaksiReturController controllerRetur = null; } } diff --git a/src/main/java/id/amigogroup/posterminal/api/AmigoPosRx.java b/src/main/java/id/amigogroup/posterminal/api/AmigoPosRx.java index 132a1a5..e71a674 100644 --- a/src/main/java/id/amigogroup/posterminal/api/AmigoPosRx.java +++ b/src/main/java/id/amigogroup/posterminal/api/AmigoPosRx.java @@ -14,9 +14,17 @@ import id.amigogroup.posterminal.model.MNotaTunai; import id.amigogroup.posterminal.model.NoBarang; import id.amigogroup.posterminal.model.Pelanggan; import id.amigogroup.posterminal.model.Tas; +import id.amigogroup.posterminal.util.AlertUtil; import io.reactivex.Observable; import io.reactivex.schedulers.Schedulers; +import java.net.SocketException; +import java.net.UnknownHostException; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javafx.application.Platform; +import javafx.scene.control.Alert; +import javafx.stage.Window; /** * @@ -26,19 +34,28 @@ public class AmigoPosRx { //Barang API public Observable getBarangByKodeBarang(String kodeBarang) { - return UtilsApi.getServiceApiBarang().getBarangByKodeBarang(kodeBarang); + return UtilsApi.getServiceApiBarang().getBarangByKodeBarang(kodeBarang) + .subscribeOn(Schedulers.trampoline()); } - - public Observable> getBarangByNamaBarang(String namaBarang){ - return UtilsApi.getServiceApiBarang().getBarangByNamaBarang(namaBarang); + + public Observable> getBarangByNamaBarang(String namaBarang) { + return UtilsApi.getServiceApiBarang().getBarangByNamaBarang(namaBarang) + .subscribeOn(Schedulers.io()); + } + + public Observable> getNoBarangByIdGabunganSortNomor(String idGabungan) { + return UtilsApi.getServiceApiBarang().getByIdGabunganSortNomor(idGabungan) + .subscribeOn(Schedulers.trampoline()); } - + public Observable getNoBarangByIdGabunganNomor(String idGabungan, String nomor) { - return UtilsApi.getServiceApiBarang().getByIdGabunganNomor(idGabungan, nomor); + return UtilsApi.getServiceApiBarang().getByIdGabunganNomor(idGabungan, nomor) + .subscribeOn(Schedulers.io()); } public Observable getMNotaTunaiByNoNota(String noNota) { - return UtilsApi.getServiceApiBarang().getMNotaTunaiByNoNota(noNota); + return UtilsApi.getServiceApiBarang().getMNotaTunaiByNoNota(noNota) + .subscribeOn(Schedulers.trampoline()); } public Observable> getDNotaTunaiByNoNota(String noNota) { @@ -47,9 +64,10 @@ public class AmigoPosRx { } public Observable getMNotaReturByNoNota(String noNota) { - return UtilsApi.getServiceApiBarang().getMNotaReturByNoNota(noNota); + return UtilsApi.getServiceApiBarang().getMNotaReturByNoNota(noNota) + .subscribeOn(Schedulers.trampoline()); } - + //Checkin API public Observable> getAllTas() { return UtilsApi.getServiceApiCheckin().getAllTas(); @@ -57,19 +75,44 @@ public class AmigoPosRx { //Karyawan API public Observable getKaryawanByNik(String nik) { - return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik); + return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik) + .subscribeOn(Schedulers.trampoline()); } //Pelanggan API public Observable getPelangganByKodeMember(String kodeMember) { - return UtilsApi.getServiceApiPelanggan().getPelangganByKodeMember(kodeMember); + return UtilsApi.getServiceApiPelanggan().getPelangganByKodeMember(kodeMember) + .subscribeOn(Schedulers.trampoline()); } public Observable> getPelangganByNama(String nama) { - return UtilsApi.getServiceApiPelanggan().getPelangganByNama(nama); + return UtilsApi.getServiceApiPelanggan().getPelangganByNama(nama) + .subscribeOn(Schedulers.io()); } public Observable> getPelangganByNoTelpNoHp(String no) { - return UtilsApi.getServiceApiPelanggan().getPelangganByNoTelpNoHp(no); + return UtilsApi.getServiceApiPelanggan().getPelangganByNoTelpNoHp(no) + .subscribeOn(Schedulers.io()); + } + + public static void handleGenericError(Throwable error, Window window) { + if (error instanceof SocketException || error instanceof UnknownHostException) { + Platform.runLater(() -> { + Alert alert = AlertUtil.getAlertError( + AlertUtil.ERROR_KONEKSI_TIMEOUT_TITLE, + AlertUtil.ERROR_KONEKSI_TIMEOUT_MESSAGE); + alert.initOwner(window); + alert.show(); + }); + } else { + Platform.runLater(() -> { + Alert alert = AlertUtil.getAlertError( + AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, + AlertUtil.ERROR_TIDAK_TERDUGA_MESSAGE); + alert.initOwner(window); + alert.show(); + Logger.getLogger(AmigoPosRx.class.getName()).log(Level.SEVERE, null, error); + }); + } } } diff --git a/src/main/java/id/amigogroup/posterminal/api/ServiceApiBarang.java b/src/main/java/id/amigogroup/posterminal/api/ServiceApiBarang.java index 8bf8fc5..f79ec8d 100644 --- a/src/main/java/id/amigogroup/posterminal/api/ServiceApiBarang.java +++ b/src/main/java/id/amigogroup/posterminal/api/ServiceApiBarang.java @@ -27,11 +27,20 @@ public interface ServiceApiBarang { Observable getBarangByKodeBarang(@Path("kode") String kode); //NO-BARANG + //Mengambil No Barang by Id Gabungan & Ukuran + @GET("no-barangs/id-gabungan/{idGabungan}/kolom-urut/nomor") + Observable> getByIdGabunganSortNomor( + @Path("idGabungan") String idGabungan); + //Mengambil No Barang by Id Gabungan & Ukuran @GET("no-barangs/id-gabungan/{idGabungan}/nomor/{nomor}") Observable getByIdGabunganNomor( @Path("idGabungan") String idGabungan, @Path("nomor") String nomor); + + //Mengambil Barang Berdasarkan Nama Barang + @GET("barangs/nama/{namaBarang}") + Observable> getBarangByNamaBarang(@Path("namaBarang") String namaBarang); //M-NOTA-TUNAI //Mengambil Master Nota Tunai by No Nota @@ -56,8 +65,4 @@ public interface ServiceApiBarang { //Mengambil Master Nota Retur by No Nota @GET("m-nota-retur/no-nota/{noNota}") Observable getMNotaReturByNoNota(@Path("noNota") String noNota); - - //Mengambil Barang Berdasarkan Nama Barang - @GET("barangs/nama/{namaBarang}") - Observable> getBarangByNamaBarang(@Path("namaBarang") String namaBarang); } diff --git a/src/main/java/id/amigogroup/posterminal/bayar/FormBayarReturController.java b/src/main/java/id/amigogroup/posterminal/bayar/FormBayarReturController.java index e1240ce..ce308ed 100644 --- a/src/main/java/id/amigogroup/posterminal/bayar/FormBayarReturController.java +++ b/src/main/java/id/amigogroup/posterminal/bayar/FormBayarReturController.java @@ -94,24 +94,8 @@ public class FormBayarReturController implements Initializable { alert.show(); }); } - } else if (error instanceof SocketTimeoutException) { - Platform.runLater(() -> { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_KONEKSI_TIMEOUT_TITLE, - AlertUtil.ERROR_KONEKSI_TIMEOUT_MESSAGE); - alert.initOwner(apMain.getScene().getWindow()); - alert.show(); - }); } else { - Platform.runLater(() -> { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - AlertUtil.ERROR_TIDAK_TERDUGA_MESSAGE); - alert.initOwner(apMain.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormUtamaController.class - .getName()).log(Level.SEVERE, null, error); - }); + AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow()); } } diff --git a/src/main/java/id/amigogroup/posterminal/keamanan/FormLoginController.java b/src/main/java/id/amigogroup/posterminal/keamanan/FormLoginController.java index 1889423..d058eb9 100644 --- a/src/main/java/id/amigogroup/posterminal/keamanan/FormLoginController.java +++ b/src/main/java/id/amigogroup/posterminal/keamanan/FormLoginController.java @@ -117,19 +117,8 @@ public class FormLoginController implements Initializable { alert.initOwner(apMain.getScene().getWindow()); alert.show(); } - } else if (error instanceof SocketTimeoutException || error instanceof UnknownHostException) { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_KONEKSI_TIMEOUT_TITLE, - AlertUtil.ERROR_KONEKSI_TIMEOUT_MESSAGE); - alert.initOwner(apMain.getScene().getWindow()); - alert.show(); } else { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - "Terjadi kesalahan yang tidak terduga."); - alert.initOwner(apMain.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormLoginController.class.getName()).log(Level.SEVERE, null, error); + AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow()); } } diff --git a/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariBarangController.java b/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariBarangController.java index 3405814..cc75db0 100644 --- a/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariBarangController.java +++ b/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariBarangController.java @@ -5,15 +5,21 @@ */ package id.amigogroup.posterminal.pencarian; -import id.amigogroup.posterminal.FormUtamaController; import id.amigogroup.posterminal.api.AmigoPosRx; import id.amigogroup.posterminal.model.Barang; +import id.amigogroup.posterminal.model.NoBarang; import id.amigogroup.posterminal.model.Pagination; +import id.amigogroup.posterminal.transaksi.BarangFull; import id.amigogroup.posterminal.util.AlertUtil; +import id.amigogroup.posterminal.util.AmigoPosCache; import id.amigogroup.posterminal.util.Fucout; +import io.reactivex.Observable; import io.reactivex.Observer; +import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; +import io.reactivex.observers.DisposableObserver; import java.io.IOException; +import java.io.InterruptedIOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; @@ -41,6 +47,8 @@ import javafx.scene.control.ToggleGroup; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.stage.Window; import retrofit2.HttpException; @@ -50,7 +58,7 @@ import retrofit2.HttpException; * * @author ronal */ -public class DialogCariBarangController extends Dialog implements Initializable { +public class DialogCariBarangController extends Dialog implements Initializable { @FXML AnchorPane apContent; @@ -68,8 +76,6 @@ public class DialogCariBarangController extends Dialog implements Initia private TableColumn tcUkur; @FXML private TableColumn tcHarga; -// @FXML -// private TableColumn tcBtnTambah; @FXML private ToggleGroup tgTipe; @FXML @@ -79,7 +85,8 @@ public class DialogCariBarangController extends Dialog implements Initia final ObservableList daftarTabelBarang = FXCollections.observableArrayList(); AmigoPosRx posRx = new AmigoPosRx(); - private Barang barang = null; + CompositeDisposable compositeDisposable = new CompositeDisposable(); + private BarangFull selectedBarangFull = null; /** * Initializes the controller class. @@ -97,29 +104,24 @@ public class DialogCariBarangController extends Dialog implements Initia tcNama.setCellValueFactory(new PropertyValueFactory<>("nama")); tcUkur.setCellValueFactory(new PropertyValueFactory<>("ukur")); tcHarga.setCellValueFactory(new PropertyValueFactory<>("harga")); -// tcBtnTambah.setCellValueFactory(new PropertyValueFactory<>("btnTambah")); tbvBarang.setItems(daftarTabelBarang); -// fillTable(new ArrayList<>()); } - public DialogCariBarangController(/*FormPresensiController parent*/) { + public DialogCariBarangController() { + selectedBarangFull = new BarangFull(); try { Window window = getDialogPane().getScene().getWindow(); window.setOnCloseRequest(event -> this.close()); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariBarang.fxml")); loader.setController(this); -// DialogCariBarangController controller = loader.getController(); + Parent root = loader.load(); getDialogPane().setContent(root); setTitle("Cari Barang"); -// getDialogPane().getButtonTypes().add(ButtonType.CANCEL); -// setResultConverter(buttonType -> { -// return str; -// }); setResultConverter(buttonType -> { - return barang; + return selectedBarangFull; }); } catch (IOException e) { Logger.getLogger(DialogCariBarangController.class @@ -130,18 +132,42 @@ public class DialogCariBarangController extends Dialog implements Initia public void updateTabelBarang(List daftarBarang) { daftarTabelBarang.clear(); for (Barang barang : daftarBarang) { -// String noBarang = "..."; -// if (BarangCache.getInstance().getDaftarNoBarang().containsKey(barang.getKodeBarang())) { -// noBarang = Fucout.getText(BarangCache.getInstance().getDaftarNoBarang() -// .get(barang.getKodeBarang()).getNomor()); -// } - daftarTabelBarang.add(new TabelBarangCari( -// Fucout.getText(barang.getKodeBarang()), - barang.getKodeBarang(), - barang.getNamaBarang(), - "-", - "-")); + TabelBarangCari tbc = new TabelBarangCari( + Fucout.getText(barang.getKodeBarang()), + Fucout.getText(barang.getNamaBarang()), + "...", + "..."); + + tbc.setDataBarang(barang); + daftarTabelBarang.add(tbc); + + Disposable d = posRx.getNoBarangByIdGabunganSortNomor(barang.getIdGabungan()) + .subscribeWith(getDaftarNoBarangObserver()); + compositeDisposable.add(d); + } + } + @FXML + void tbvBarangOnKeyPressed(KeyEvent event) { + if (event.getCode() == KeyCode.ENTER) { + if (tbvBarang.getSelectionModel().getSelectedItem() != null) { + selectedBarangFull.setBarang(tbvBarang.getSelectionModel().getSelectedItem().getDataBarang()); + selectedBarangFull.setNoBarang(tbvBarang.getSelectionModel().getSelectedItem().getDataNoBarang()); + close(); + } + } + } + + @FXML + void tbvBarangOnMouseClicked(MouseEvent event) { + if (event.getButton().equals(MouseButton.PRIMARY)) { + if (event.getClickCount() >= 2) { + if (tbvBarang.getSelectionModel().getSelectedItem() != null) { + selectedBarangFull.setBarang(tbvBarang.getSelectionModel().getSelectedItem().getDataBarang()); + selectedBarangFull.setNoBarang(tbvBarang.getSelectionModel().getSelectedItem().getDataNoBarang()); + close(); + } + } } } @@ -149,12 +175,54 @@ public class DialogCariBarangController extends Dialog implements Initia void tfPencarianOnKeyReleased(KeyEvent event) { if (((RadioButton) tgTipe.getSelectedToggle() == rbKodeBarang && event.getCode() == KeyCode.ENTER)) { - posRx.getBarangByKodeBarang(tfPencarian.getText()).subscribe(barangKodeObserver); + idx = 0; + + if (tfPencarian.getText().length() <= 9) { + posRx.getBarangByKodeBarang(tfPencarian.getText()).subscribe(barangKodeObserver); + } else { + String kodeFull = tfPencarian.getText(); + String kodeBarang = Fucout.getKodeBarangFromKodeFull(kodeFull); + String ukur = Fucout.getNomorBarangFromKodeFull(kodeFull); + + if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(kodeBarang)) { + Barang barang = AmigoPosCache.getInstance().getDaftarBarang().get(kodeBarang); + + selectedBarangFull.setBarang(barang); + if (AmigoPosCache.getInstance().getDaftarNoBarang().containsKey( + barang.getIdGabungan() + ukur)) { + NoBarang noBarang = AmigoPosCache.getInstance().getDaftarNoBarang() + .get(barang.getIdGabungan() + ukur); + + selectedBarangFull.setNoBarang(noBarang); + } else { + Observable.zip(posRx.getBarangByKodeBarang(kodeBarang), + posRx.getNoBarangByIdGabunganNomor(barang.getIdGabungan(), ukur), + (b, nB) -> new BarangFull(b, nB)).subscribe(getBarangFullGetNoBarangFromBarangObserver); + } + } + if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(kodeBarang)) { + Observable.zip(posRx.getBarangByKodeBarang(kodeBarang), + Observable.just(ukur), + (barang, nomor) -> { + barang.setNomor(nomor); + return barang; + }).subscribe(getTambahBarangObserver); + } + } + } else if (((RadioButton) tgTipe.getSelectedToggle() == rbNamaBarang && tfPencarian.getText().length() >= 3)) { - posRx.getBarangByNamaBarang(tfPencarian.getText()).subscribe(daftarBarangObserver); + compositeDisposable.clear(); + daftarTabelBarang.clear(); + idx = 0; + Disposable d = posRx.getBarangByNamaBarang(tfPencarian.getText()) + .subscribeWith(getDaftarBarangObserver()); + compositeDisposable.add(d); + } else if ((RadioButton) tgTipe.getSelectedToggle() == rbNamaBarang + && tfPencarian.getText().length() < 3) { + compositeDisposable.clear(); + daftarTabelBarang.clear(); } - tfPencarian.requestFocus(); } public Observer barangKodeObserver = new Observer() { @@ -165,6 +233,9 @@ public class DialogCariBarangController extends Dialog implements Initia @Override public void onNext(Barang b) { if (b != null) { + if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(b.getKodeBarang())) { + AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b); + } List db = new ArrayList<>(); db.add(b); updateTabelBarang(db); @@ -183,12 +254,7 @@ public class DialogCariBarangController extends Dialog implements Initia alert.show(); } } else { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - "Terjadi kesalahan yang tidak terduga."); - alert.initOwner(apContent.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormUtamaController.class.getName()).log(Level.SEVERE, null, error); + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); } } @@ -197,15 +263,131 @@ public class DialogCariBarangController extends Dialog implements Initia } }; - public Observer> daftarBarangObserver = new Observer>() { + private DisposableObserver> getDaftarBarangObserver() { + return new DisposableObserver>() { + @Override + public void onNext(Pagination b) { + if (b != null) { + updateTabelBarang(b.getData()); + } + } + + @Override + public void onError(Throwable error) { + if (error instanceof HttpException) { + switch (((HttpException) error).code()) { + case HttpURLConnection.HTTP_NOT_FOUND: + Platform.runLater(() -> { + Alert alert = AlertUtil.getAlertError( + AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, + "Barang dengan kode tersebut tidak ditemukan."); + alert.initOwner(apContent.getScene().getWindow()); + alert.show(); + }); + } + } else { + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); + } + } + + @Override + public void onComplete() { + } + }; + } + + int idx = 0; + + public DisposableObserver> getDaftarNoBarangObserver() { + return new DisposableObserver>() { + @Override + public void onNext(List daftarNb) { + if (idx < daftarTabelBarang.size()) { + TabelBarangCari tbc = daftarTabelBarang.get(idx); + String idGabungan = daftarNb.get(0).getIdGabungan(); +// System.out.println("Barang " + (i + 1) + ": " + daftarTabelBarang.get(i).getDataBarang().getIdGabungan()); + + if (tbc.getDataBarang() != null && tbc.getDataBarang().getIdGabungan().equals(idGabungan)) { + Barang b = tbc.getDataBarang(); +// System.out.println("### Ditemukan id gabungan sama dengan hasil api: " + b.getNamaBarang() +// + "(Urutan ke: " + (i + 1) + ") ###"); + int j = 0; + for (NoBarang nb : daftarNb) { + if (j == 0) { +// System.out.println("Nomor pertama: " + nb.getNomor()); + b.setNomor(nb.getNomor()); + tbc.setDataNoBarang(nb); + tbc.setUkur(Fucout.getText(nb.getNomor())); + tbc.setHarga(Fucout.getText(Fucout.formatRibuan(nb.getHargaJual()))); + + tbvBarang.refresh(); + } else { +// System.out.println("Nomor " + (j + 1) + ": " + nb.getNomor()); + TabelBarangCari tbcBaru = new TabelBarangCari( + Fucout.getText(b.getKodeBarang()), + Fucout.getText(b.getNamaBarang()), + Fucout.getText(nb.getNomor()), + Fucout.getText(Fucout.formatRibuan(nb.getHargaJual()))); + tbcBaru.setDataBarang(b); + tbcBaru.setDataNoBarang(nb); + daftarTabelBarang.add(idx + j, tbcBaru); + } +// System.out.println("Masuk di urutan: " + (i + j + 1)); + j++; + } + idx += daftarNb.size(); +// System.out.println("### SELESAI ###\n"); + } + } + } + + @Override + public void onError(Throwable error) { + if (error instanceof HttpException) { + switch (((HttpException) error).code()) { + case HttpURLConnection.HTTP_NOT_FOUND: + Platform.runLater(() -> { + Alert alert = AlertUtil.getAlertError( + AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, + "Barang dengan kode tersebut tidak ditemukan."); + alert.initOwner(apContent.getScene().getWindow()); + alert.show(); + }); + } + } else if (error instanceof InterruptedIOException) { + daftarTabelBarang.clear(); + } else { + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); + } + } + + @Override + public void onComplete() { + } + }; + } + + Observer getTambahBarangObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override - public void onNext(Pagination b) { - if (b != null) { - updateTabelBarang(b.getData()); + public void onNext(Barang b) { + Barang bClone = new Barang(b); + + bClone.setNomor(null); + AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), bClone); + + if (b.getNomor() != null && !b.getNomor().equals("")) { + if (!AmigoPosCache.getInstance().getDaftarNoBarang().containsKey( + b.getIdGabungan() + b.getNomor())) { + Observable.zip( + Observable.just(b), + posRx.getNoBarangByIdGabunganNomor(b.getIdGabungan(), b.getNomor()), + (barang, noBarang) -> new BarangFull(barang, noBarang)) + .subscribe(getBarangFullGetNoBarangFromBarangObserver); + } } } @@ -214,25 +396,55 @@ public class DialogCariBarangController extends Dialog implements Initia if (error instanceof HttpException) { switch (((HttpException) error).code()) { case HttpURLConnection.HTTP_NOT_FOUND: - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, - "Barang dengan kode tersebut tidak ditemukan."); - alert.initOwner(apContent.getScene().getWindow()); - alert.show(); + Platform.runLater(() -> { + Alert alert = AlertUtil.getAlertError( + AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, + "Barang dengan kode tersebut tidak ditemukan."); + alert.initOwner(apContent.getScene().getWindow()); + alert.show(); + }); } } else { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - "Terjadi kesalahan yang tidak terduga."); - alert.initOwner(apContent.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormUtamaController.class.getName()).log(Level.SEVERE, null, error); + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); } } @Override public void onComplete() { } + }; + Observer getBarangFullGetNoBarangFromBarangObserver = new Observer<>() { + @Override + public void onSubscribe(Disposable dspsbl) { + } + + @Override + public void onNext(BarangFull bf) { + selectedBarangFull = bf; + } + + @Override + public void onError(Throwable error) { + if (error instanceof HttpException) { + switch (((HttpException) error).code()) { + case HttpURLConnection.HTTP_NOT_FOUND: + Platform.runLater(() -> { + Alert alert = AlertUtil.getAlertError( + AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, + "Barang dengan kode tersebut tidak ditemukan."); + alert.initOwner(apContent.getScene().getWindow()); + alert.show(); + }); + } + } else { + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); + } + } + + @Override + public void onComplete() { + } + }; } diff --git a/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariPelangganController.java b/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariPelangganController.java index c63e41c..6f57cbd 100644 --- a/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariPelangganController.java +++ b/src/main/java/id/amigogroup/posterminal/pencarian/DialogCariPelangganController.java @@ -107,12 +107,10 @@ public class DialogCariPelangganController extends Dialog implements FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariPelanggan.fxml")); loader.setController(this); -// DialogCariBarangController controller = loader.getController(); Parent root = loader.load(); getDialogPane().setContent(root); setTitle("Cari Pelanggan"); -// getDialogPane().getButtonTypes().add(ButtonType.CANCEL); setResultConverter(buttonType -> { return pelanggan; }); @@ -122,14 +120,6 @@ public class DialogCariPelangganController extends Dialog implements } } - public void fillTable() { -// Button btnTambah = new Button("Tambah"); -// btnTambah.setOnAction((event) -> { -// setResult("Pak Coba"); -// this.close(); -// }); - } - public void updateTabelPelanggan(List daftarPelanggan) { daftarTabelPelanggan.clear(); for (Pelanggan pelanggan : daftarPelanggan) { @@ -144,9 +134,9 @@ public class DialogCariPelangganController extends Dialog implements @FXML void tfPencarianOnKeyReleased(KeyEvent event) { + daftarTabelPelanggan.clear(); if (((RadioButton) tgTipe.getSelectedToggle()) == rbMember && event.getCode() == KeyCode.ENTER) { - System.out.println("MASUK DONGssssssss"); posRx.getPelangganByKodeMember(tfPencarian.getText()).subscribe(pelangganMemberObserver); } else if (((RadioButton) tgTipe.getSelectedToggle()) == rbNama && tfPencarian.getText().length() >= 3) { @@ -155,6 +145,7 @@ public class DialogCariPelangganController extends Dialog implements && tfPencarian.getText().length() >= 3) { posRx.getPelangganByNoTelpNoHp(tfPencarian.getText()).subscribe(daftarPelangganObserver); } + } public Observer pelangganMemberObserver = new Observer() { @@ -183,12 +174,7 @@ public class DialogCariPelangganController extends Dialog implements alert.show(); } } else { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - "Terjadi kesalahan yang tidak terduga."); - alert.initOwner(apContent.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormUtamaController.class.getName()).log(Level.SEVERE, null, error); + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); } } @@ -221,12 +207,7 @@ public class DialogCariPelangganController extends Dialog implements alert.show(); } } else { - Alert alert = AlertUtil.getAlertError( - AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, - "Terjadi kesalahan yang tidak terduga."); - alert.initOwner(apContent.getScene().getWindow()); - alert.show(); - Logger.getLogger(FormUtamaController.class.getName()).log(Level.SEVERE, null, error); + AmigoPosRx.handleGenericError(error, apContent.getScene().getWindow()); } } diff --git a/src/main/java/id/amigogroup/posterminal/pencarian/TabelBarangCari.java b/src/main/java/id/amigogroup/posterminal/pencarian/TabelBarangCari.java index 68801c3..079e14b 100644 --- a/src/main/java/id/amigogroup/posterminal/pencarian/TabelBarangCari.java +++ b/src/main/java/id/amigogroup/posterminal/pencarian/TabelBarangCari.java @@ -5,9 +5,9 @@ */ package id.amigogroup.posterminal.pencarian; -import javafx.beans.property.SimpleObjectProperty; +import id.amigogroup.posterminal.model.Barang; +import id.amigogroup.posterminal.model.NoBarang; import javafx.beans.property.SimpleStringProperty; -import javafx.scene.control.Button; /** * @@ -18,14 +18,15 @@ public class TabelBarangCari { private final SimpleStringProperty nama; private final SimpleStringProperty ukur; private final SimpleStringProperty harga; -// private final SimpleObjectProperty