[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 notapull/7/head
| @@ -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<Barang> result = dialogCariBarang.showAndWait(); | |||
| Optional<BarangFull> 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; | |||
| } | |||
| } | |||
| @@ -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<Barang> getBarangByKodeBarang(String kodeBarang) { | |||
| return UtilsApi.getServiceApiBarang().getBarangByKodeBarang(kodeBarang); | |||
| return UtilsApi.getServiceApiBarang().getBarangByKodeBarang(kodeBarang) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| public Observable<Pagination<Barang>> getBarangByNamaBarang(String namaBarang){ | |||
| return UtilsApi.getServiceApiBarang().getBarangByNamaBarang(namaBarang); | |||
| public Observable<Pagination<Barang>> getBarangByNamaBarang(String namaBarang) { | |||
| return UtilsApi.getServiceApiBarang().getBarangByNamaBarang(namaBarang) | |||
| .subscribeOn(Schedulers.io()); | |||
| } | |||
| public Observable<List<NoBarang>> getNoBarangByIdGabunganSortNomor(String idGabungan) { | |||
| return UtilsApi.getServiceApiBarang().getByIdGabunganSortNomor(idGabungan) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| public Observable<NoBarang> getNoBarangByIdGabunganNomor(String idGabungan, String nomor) { | |||
| return UtilsApi.getServiceApiBarang().getByIdGabunganNomor(idGabungan, nomor); | |||
| return UtilsApi.getServiceApiBarang().getByIdGabunganNomor(idGabungan, nomor) | |||
| .subscribeOn(Schedulers.io()); | |||
| } | |||
| public Observable<MNotaTunai> getMNotaTunaiByNoNota(String noNota) { | |||
| return UtilsApi.getServiceApiBarang().getMNotaTunaiByNoNota(noNota); | |||
| return UtilsApi.getServiceApiBarang().getMNotaTunaiByNoNota(noNota) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| public Observable<List<DNotaTunai>> getDNotaTunaiByNoNota(String noNota) { | |||
| @@ -47,9 +64,10 @@ public class AmigoPosRx { | |||
| } | |||
| public Observable<MNotaRetur> getMNotaReturByNoNota(String noNota) { | |||
| return UtilsApi.getServiceApiBarang().getMNotaReturByNoNota(noNota); | |||
| return UtilsApi.getServiceApiBarang().getMNotaReturByNoNota(noNota) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| //Checkin API | |||
| public Observable<List<Tas>> getAllTas() { | |||
| return UtilsApi.getServiceApiCheckin().getAllTas(); | |||
| @@ -57,19 +75,44 @@ public class AmigoPosRx { | |||
| //Karyawan API | |||
| public Observable<Karyawan> getKaryawanByNik(String nik) { | |||
| return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik); | |||
| return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| //Pelanggan API | |||
| public Observable<Pelanggan> getPelangganByKodeMember(String kodeMember) { | |||
| return UtilsApi.getServiceApiPelanggan().getPelangganByKodeMember(kodeMember); | |||
| return UtilsApi.getServiceApiPelanggan().getPelangganByKodeMember(kodeMember) | |||
| .subscribeOn(Schedulers.trampoline()); | |||
| } | |||
| public Observable<Pagination<Pelanggan>> getPelangganByNama(String nama) { | |||
| return UtilsApi.getServiceApiPelanggan().getPelangganByNama(nama); | |||
| return UtilsApi.getServiceApiPelanggan().getPelangganByNama(nama) | |||
| .subscribeOn(Schedulers.io()); | |||
| } | |||
| public Observable<Pagination<Pelanggan>> 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); | |||
| }); | |||
| } | |||
| } | |||
| } | |||
| @@ -27,11 +27,20 @@ public interface ServiceApiBarang { | |||
| Observable<Barang> getBarangByKodeBarang(@Path("kode") String kode); | |||
| //NO-BARANG | |||
| //Mengambil No Barang by Id Gabungan & Ukuran | |||
| @GET("no-barangs/id-gabungan/{idGabungan}/kolom-urut/nomor") | |||
| Observable<List<NoBarang>> getByIdGabunganSortNomor( | |||
| @Path("idGabungan") String idGabungan); | |||
| //Mengambil No Barang by Id Gabungan & Ukuran | |||
| @GET("no-barangs/id-gabungan/{idGabungan}/nomor/{nomor}") | |||
| Observable<NoBarang> getByIdGabunganNomor( | |||
| @Path("idGabungan") String idGabungan, | |||
| @Path("nomor") String nomor); | |||
| //Mengambil Barang Berdasarkan Nama Barang | |||
| @GET("barangs/nama/{namaBarang}") | |||
| Observable<Pagination<Barang>> 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<MNotaRetur> getMNotaReturByNoNota(@Path("noNota") String noNota); | |||
| //Mengambil Barang Berdasarkan Nama Barang | |||
| @GET("barangs/nama/{namaBarang}") | |||
| Observable<Pagination<Barang>> getBarangByNamaBarang(@Path("namaBarang") String namaBarang); | |||
| } | |||
| @@ -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()); | |||
| } | |||
| } | |||
| @@ -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()); | |||
| } | |||
| } | |||
| @@ -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<Barang> implements Initializable { | |||
| public class DialogCariBarangController extends Dialog<BarangFull> implements Initializable { | |||
| @FXML | |||
| AnchorPane apContent; | |||
| @@ -68,8 +76,6 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia | |||
| private TableColumn<TabelBarangCari, String> tcUkur; | |||
| @FXML | |||
| private TableColumn<TabelBarangCari, String> tcHarga; | |||
| // @FXML | |||
| // private TableColumn<TabelBarangCari, Button> tcBtnTambah; | |||
| @FXML | |||
| private ToggleGroup tgTipe; | |||
| @FXML | |||
| @@ -79,7 +85,8 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia | |||
| final ObservableList<TabelBarangCari> 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<Barang> 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.<DialogCariBarangController>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<Barang> implements Initia | |||
| public void updateTabelBarang(List<Barang> 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<Barang> 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<Barang> barangKodeObserver = new Observer<Barang>() { | |||
| @@ -165,6 +233,9 @@ public class DialogCariBarangController extends Dialog<Barang> 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<Barang> db = new ArrayList<>(); | |||
| db.add(b); | |||
| updateTabelBarang(db); | |||
| @@ -183,12 +254,7 @@ public class DialogCariBarangController extends Dialog<Barang> 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<Barang> implements Initia | |||
| } | |||
| }; | |||
| public Observer<Pagination<Barang>> daftarBarangObserver = new Observer<Pagination<Barang>>() { | |||
| private DisposableObserver<Pagination<Barang>> getDaftarBarangObserver() { | |||
| return new DisposableObserver<Pagination<Barang>>() { | |||
| @Override | |||
| public void onNext(Pagination<Barang> 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<List<NoBarang>> getDaftarNoBarangObserver() { | |||
| return new DisposableObserver<List<NoBarang>>() { | |||
| @Override | |||
| public void onNext(List<NoBarang> 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<Barang> getTambahBarangObserver = new Observer<>() { | |||
| @Override | |||
| public void onSubscribe(Disposable dspsbl) { | |||
| } | |||
| @Override | |||
| public void onNext(Pagination<Barang> 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<Barang> 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<BarangFull> 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() { | |||
| } | |||
| }; | |||
| } | |||
| @@ -107,12 +107,10 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> implements | |||
| FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariPelanggan.fxml")); | |||
| loader.setController(this); | |||
| // DialogCariBarangController controller = loader.<DialogCariBarangController>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<Pelanggan> implements | |||
| } | |||
| } | |||
| public void fillTable() { | |||
| // Button btnTambah = new Button("Tambah"); | |||
| // btnTambah.setOnAction((event) -> { | |||
| // setResult("Pak Coba"); | |||
| // this.close(); | |||
| // }); | |||
| } | |||
| public void updateTabelPelanggan(List<Pelanggan> daftarPelanggan) { | |||
| daftarTabelPelanggan.clear(); | |||
| for (Pelanggan pelanggan : daftarPelanggan) { | |||
| @@ -144,9 +134,9 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> 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<Pelanggan> implements | |||
| && tfPencarian.getText().length() >= 3) { | |||
| posRx.getPelangganByNoTelpNoHp(tfPencarian.getText()).subscribe(daftarPelangganObserver); | |||
| } | |||
| } | |||
| public Observer<Pelanggan> pelangganMemberObserver = new Observer<Pelanggan>() { | |||
| @@ -183,12 +174,7 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> 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<Pelanggan> 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()); | |||
| } | |||
| } | |||
| @@ -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<Button> btnTambah; | |||
| private Barang dataBarang; | |||
| private NoBarang dataNoBarang; | |||
| public TabelBarangCari(String kode, String nama, String ukur,String harga) { | |||
| this.kode = new SimpleStringProperty(kode); | |||
| this.nama = new SimpleStringProperty(nama); | |||
| this.ukur = new SimpleStringProperty(ukur); | |||
| this.harga = new SimpleStringProperty(harga); | |||
| // this.btnTambah = new SimpleObjectProperty<>(btnTambah); | |||
| } | |||
| /** | |||
| @@ -84,17 +85,31 @@ public class TabelBarangCari { | |||
| this.harga.set(harga); | |||
| } | |||
| // /** | |||
| // * @return the btnTambah | |||
| // */ | |||
| // public Button getBtnTambah() { | |||
| // return btnTambah.get(); | |||
| // } | |||
| // | |||
| // /** | |||
| // * @param btnTambah the btnTambah to set | |||
| // */ | |||
| // public void setBtnTambah(Button btnTambah) { | |||
| // this.btnTambah.set(btnTambah); | |||
| // } | |||
| /** | |||
| * @return the data | |||
| */ | |||
| public Barang getDataBarang() { | |||
| return dataBarang; | |||
| } | |||
| /** | |||
| * @param dataBarang the dataBarang to set | |||
| */ | |||
| public void setDataBarang(Barang dataBarang) { | |||
| this.dataBarang = dataBarang; | |||
| } | |||
| /** | |||
| * @return the dataNoBarang | |||
| */ | |||
| public NoBarang getDataNoBarang() { | |||
| return dataNoBarang; | |||
| } | |||
| /** | |||
| * @param dataNoBarang the dataNoBarang to set | |||
| */ | |||
| public void setDataNoBarang(NoBarang dataNoBarang) { | |||
| this.dataNoBarang = dataNoBarang; | |||
| } | |||
| } | |||
| @@ -16,6 +16,10 @@ public class BarangFull { | |||
| private Barang barang; | |||
| private NoBarang noBarang; | |||
| public BarangFull() { | |||
| } | |||
| public BarangFull(Barang barang, NoBarang noBarang) { | |||
| this.barang = barang; | |||
| this.noBarang = noBarang; | |||
| @@ -77,8 +77,7 @@ public class DialogTambahNotaController extends Dialog<String> implements Initia | |||
| FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogTambahNota.fxml")); | |||
| loader.setController(this); | |||
| // DialogCariBarangController controller = loader.<DialogCariBarangController>getController(); | |||
| Parent root = loader.load(); | |||
| getDialogPane().setContent(root); | |||
| @@ -125,15 +124,8 @@ public class DialogTambahNotaController extends Dialog<String> implements Initia | |||
| alert.initModality(Modality.APPLICATION_MODAL); | |||
| alert.show(); | |||
| } | |||
| } catch (Exception e) { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| AlertUtil.ERROR_TIDAK_TERDUGA_TITLE, | |||
| AlertUtil.ERROR_TIDAK_TERDUGA_MESSAGE); | |||
| alert.initOwner(apTambahNota.getScene().getWindow()); | |||
| alert.initModality(Modality.APPLICATION_MODAL); | |||
| alert.show(); | |||
| Logger.getLogger(DialogTambahNotaController.class.getName()).log(Level.SEVERE, null, e); | |||
| } catch (Exception error) { | |||
| AmigoPosRx.handleGenericError(error, apTambahNota.getScene().getWindow()); | |||
| } | |||
| if (!notaExists) { | |||
| @@ -273,16 +273,16 @@ public class FormTransaksiReturController implements Initializable { | |||
| tbr.setSubTotal(Fucout.getText(Fucout.formatRibuan( | |||
| dNotaRetur.getJumlah() * dNotaRetur.getHargaJual() | |||
| ))); | |||
| tbvRetur.refresh(); | |||
| } else{ | |||
| } else { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| "Jumlah Barang Kurang", | |||
| "Jumlah Barang Kurang", | |||
| "Barang di Nota Penjualan yang di-Retur sudah mencapai jumlah yang ada."); | |||
| alert.initOwner(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| } | |||
| ada = true; | |||
| break; | |||
| } | |||
| @@ -353,24 +353,8 @@ public class FormTransaksiReturController 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()); | |||
| } | |||
| } | |||
| @@ -411,24 +395,8 @@ public class FormTransaksiReturController 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()); | |||
| } | |||
| } | |||
| @@ -94,7 +94,7 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| @Override | |||
| public void initialize(URL url, ResourceBundle rb) { | |||
| fldScan.requestFocus(); | |||
| tcNo.setCellValueFactory((TableColumn.CellDataFeatures<TabelBarangTunai, Integer> cell) -> { | |||
| return new ReadOnlyObjectWrapper(tbvTransaksi.getItems().indexOf(cell.getValue()) + 1); | |||
| }); | |||
| @@ -169,23 +169,32 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| } | |||
| } | |||
| public void addToTable(Barang barang, NoBarang noBarang, int jumlah) { | |||
| public void addToTable(Barang barang, NoBarang noBarang) { | |||
| if (barang != null && noBarang != null) { | |||
| if (noBarang.getStokOperasional() >= jumlah) { | |||
| if (noBarang.getStokOperasional() > 0) { | |||
| boolean ada = false; | |||
| for (TabelBarangTunai tbt : daftarTabelTransaksi) { | |||
| if (tbt.getKode().equals(barang.getKodeBarang()) && tbt.getUkur().equals(noBarang.getNomor())) { | |||
| noBarang.setStokOperasional(noBarang.getStokOperasional() - jumlah); | |||
| if (noBarang.getStokOperasional() >= tbt.getData().getJumlah() + 1) { | |||
| tbt.getData().setJumlah(tbt.getData().getJumlah() + 1); | |||
| tbt.setJumlah(String.valueOf(tbt.getData().getJumlah())); | |||
| tbvTransaksi.refresh(); | |||
| } else { | |||
| System.out.println("Halo"); | |||
| Platform.runLater(() -> { | |||
| Alert alert = AlertUtil.getAlertWarning( | |||
| "Stok Habis", | |||
| "Tidak bisa menambahkan barang karena stok barang habis"); | |||
| alert.initOwner(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| }); | |||
| } | |||
| tbt.getData().setJumlah(tbt.getData().getJumlah() + jumlah); | |||
| tbt.setJumlah(String.valueOf(tbt.getData().getJumlah())); | |||
| tbvTransaksi.refresh(); | |||
| ada = true; | |||
| break; | |||
| } | |||
| } | |||
| if (!ada) { | |||
| String[] promo = {"Ulang Tahun", "Harbolnas", "Ultah Amigo"}; | |||
| ComboBox<String> cbxPromo = new ComboBox<>(FXCollections.observableArrayList(promo)); | |||
| @@ -201,30 +210,39 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| noNota, | |||
| barang.getKodeBarang(), | |||
| barang.getNamaBarang(), | |||
| jumlah, | |||
| 1, | |||
| 0, | |||
| 0, | |||
| noBarang.getHargaJual(), | |||
| noBarang.getHargaPokok(), | |||
| "", | |||
| 0); | |||
| TabelBarangTunai tbt = new TabelBarangTunai( | |||
| Fucout.getText(barang.getKodeBarang()), | |||
| Fucout.getText(barang.getNamaBarang()), | |||
| Fucout.getText(noBarang.getNomor()), | |||
| String.valueOf(jumlah), | |||
| String.valueOf(1), | |||
| Fucout.getText(Fucout.formatRibuan(noBarang.getHargaJual())), | |||
| "...", | |||
| "...", | |||
| cbxPromo, | |||
| Fucout.getText(Fucout.formatRibuan( | |||
| jumlah * noBarang.getHargaJual()) | |||
| 1 * noBarang.getHargaJual()) | |||
| ), | |||
| fldPramuniaga); | |||
| tbt.setData(dNotaTunai); | |||
| daftarTabelTransaksi.add(tbt); | |||
| } | |||
| } else { | |||
| Platform.runLater(() -> { | |||
| Alert alert = AlertUtil.getAlertWarning( | |||
| "Stok Habis", | |||
| "Tidak bisa menambahkan barang karena stok barang habis"); | |||
| alert.initOwner(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| }); | |||
| } | |||
| } | |||
| } | |||
| @@ -245,19 +263,21 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| NoBarang noBarang = AmigoPosCache.getInstance().getDaftarNoBarang() | |||
| .get(barang.getIdGabungan() + ukur); | |||
| addToTable(barang, noBarang, 1); | |||
| addToTable(barang, noBarang); | |||
| } else { | |||
| Observable.zip(posRx.getBarangByKodeBarang(kodeBarang), | |||
| posRx.getNoBarangByIdGabunganNomor(barang.getIdGabungan(), ukur), | |||
| (b, nB) -> new BarangFull(b, nB)).subscribe(getBarangFullGetNoBarangFromBarangObserver); | |||
| } | |||
| } | |||
| Observable.zip(posRx.getBarangByKodeBarang(kodeBarang), | |||
| Observable.just(ukur), | |||
| (barang, nomor) -> { | |||
| barang.setNomor(nomor); | |||
| return barang; | |||
| }).subscribe(getTambahBarangObserver); | |||
| if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(kodeBarang)) { | |||
| Observable.zip(posRx.getBarangByKodeBarang(kodeBarang), | |||
| Observable.just(ukur), | |||
| (barang, nomor) -> { | |||
| barang.setNomor(nomor); | |||
| return barang; | |||
| }).subscribe(getTambahBarangObserver); | |||
| } | |||
| } | |||
| } | |||
| @@ -285,24 +305,8 @@ public class FormTransaksiTunaiController 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()); | |||
| } | |||
| } | |||
| @@ -333,26 +337,16 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| 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(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| Platform.runLater(() -> { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, | |||
| "Barang dengan kode tersebut tidak ditemukan."); | |||
| alert.initOwner(apMain.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(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| } else { | |||
| 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()); | |||
| } | |||
| } | |||
| @@ -391,26 +385,16 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| 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(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| Platform.runLater(() -> { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, | |||
| "Barang dengan kode tersebut tidak ditemukan."); | |||
| alert.initOwner(apMain.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(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| } else { | |||
| 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()); | |||
| } | |||
| } | |||
| @@ -427,7 +411,7 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| @Override | |||
| public void onNext(BarangFull bf) { | |||
| addToTable(bf.getBarang(), bf.getNoBarang(), 1); | |||
| addToTable(bf.getBarang(), bf.getNoBarang()); | |||
| } | |||
| @Override | |||
| @@ -435,26 +419,16 @@ public class FormTransaksiTunaiController implements Initializable { | |||
| 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(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| Platform.runLater(() -> { | |||
| Alert alert = AlertUtil.getAlertError( | |||
| AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE, | |||
| "Barang dengan kode tersebut tidak ditemukan."); | |||
| alert.initOwner(apMain.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(apMain.getScene().getWindow()); | |||
| alert.show(); | |||
| } else { | |||
| 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()); | |||
| } | |||
| } | |||
| @@ -6,6 +6,7 @@ | |||
| package id.amigogroup.posterminal.util; | |||
| import javafx.scene.control.Alert; | |||
| import javafx.scene.control.ButtonBar.ButtonData; | |||
| import javafx.scene.control.ButtonType; | |||
| import javafx.scene.image.Image; | |||
| import javafx.scene.image.ImageView; | |||
| @@ -20,6 +21,14 @@ public class AlertUtil { | |||
| public static final String ERROR_TIDAK_TERDUGA_MESSAGE = "Terjadi kesalahan yang tidak terduga."; | |||
| public static final String ERROR_KONEKSI_TIMEOUT_TITLE = "Error: Timeout - Koneksi Gagal"; | |||
| public static final String ERROR_KONEKSI_TIMEOUT_MESSAGE = "Koneksi ke server mengalami kegagalan."; | |||
| public static final String ERROR_TIDAK_LENGKAP_TITLE = "Error: Data Tidak Lengkap"; | |||
| public static Alert getAlertWarning(String title, String message){ | |||
| Alert alert = new Alert(Alert.AlertType.WARNING, message, ButtonType.OK); | |||
| alert.setTitle(title); | |||
| alert.setHeaderText(null); | |||
| return alert; | |||
| } | |||
| public static Alert getAlertError(String title, String message){ | |||
| Alert alert = new Alert(Alert.AlertType.ERROR, message, ButtonType.OK); | |||
| @@ -25,12 +25,12 @@ | |||
| </toggleGroup> | |||
| </RadioButton> | |||
| <RadioButton fx:id="rbNamaBarang" layoutX="103.0" layoutY="93.0" mnemonicParsing="false" selected="true" text="Nama Barang" toggleGroup="$tgTipe" AnchorPane.leftAnchor="103.0" AnchorPane.topAnchor="93.0" /> | |||
| <TableView fx:id="tbvBarang" layoutX="14.0" layoutY="117.0" prefHeight="338.0" prefWidth="500.0" AnchorPane.bottomAnchor="-5.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="117.0"> | |||
| <TableView fx:id="tbvBarang" layoutX="14.0" layoutY="117.0" onKeyPressed="#tbvBarangOnKeyPressed" onMouseClicked="#tbvBarangOnMouseClicked" prefHeight="338.0" prefWidth="500.0" AnchorPane.bottomAnchor="-5.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="117.0"> | |||
| <columns> | |||
| <TableColumn fx:id="tcNo" maxWidth="30.0" minWidth="30.0" prefWidth="30.0" resizable="false" text="No" /> | |||
| <TableColumn fx:id="tcKode" prefWidth="75.0" text="Kode" /> | |||
| <TableColumn fx:id="tcNama" prefWidth="75.0" text="Nama" /> | |||
| <TableColumn fx:id="tcUkur" text="Ukur" /> | |||
| <TableColumn fx:id="tcUkur" maxWidth="40.0" minWidth="40.0" prefWidth="40.0" resizable="false" text="Ukur" /> | |||
| <TableColumn fx:id="tcHarga" prefWidth="75.0" text="Harga" /> | |||
| </columns> | |||
| <columnResizePolicy> | |||