浏览代码

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
pull/7/head
父节点
当前提交
9c3acf6f6a
共有 14 个文件被更改,包括 483 次插入294 次删除
  1. +30
    -17
      src/main/java/id/amigogroup/posterminal/FormUtamaController.java
  2. +56
    -13
      src/main/java/id/amigogroup/posterminal/api/AmigoPosRx.java
  3. +9
    -4
      src/main/java/id/amigogroup/posterminal/api/ServiceApiBarang.java
  4. +1
    -17
      src/main/java/id/amigogroup/posterminal/bayar/FormBayarReturController.java
  5. +1
    -12
      src/main/java/id/amigogroup/posterminal/keamanan/FormLoginController.java
  6. +261
    -49
      src/main/java/id/amigogroup/posterminal/pencarian/DialogCariBarangController.java
  7. +4
    -23
      src/main/java/id/amigogroup/posterminal/pencarian/DialogCariPelangganController.java
  8. +32
    -17
      src/main/java/id/amigogroup/posterminal/pencarian/TabelBarangCari.java
  9. +4
    -0
      src/main/java/id/amigogroup/posterminal/transaksi/BarangFull.java
  10. +3
    -11
      src/main/java/id/amigogroup/posterminal/transaksi/DialogTambahNotaController.java
  11. +6
    -38
      src/main/java/id/amigogroup/posterminal/transaksi/FormTransaksiReturController.java
  12. +65
    -91
      src/main/java/id/amigogroup/posterminal/transaksi/FormTransaksiTunaiController.java
  13. +9
    -0
      src/main/java/id/amigogroup/posterminal/util/AlertUtil.java
  14. +2
    -2
      src/main/resources/fxml/DialogCariBarang.fxml

+ 30
- 17
src/main/java/id/amigogroup/posterminal/FormUtamaController.java 查看文件

@@ -1,12 +1,12 @@
package id.amigogroup.posterminal; package id.amigogroup.posterminal;


import id.amigogroup.posterminal.api.AmigoPosRx; import id.amigogroup.posterminal.api.AmigoPosRx;
import id.amigogroup.posterminal.model.Barang;
import id.amigogroup.posterminal.model.Pelanggan; import id.amigogroup.posterminal.model.Pelanggan;
import id.amigogroup.posterminal.pencarian.DialogCariBarangController; import id.amigogroup.posterminal.pencarian.DialogCariBarangController;
import id.amigogroup.posterminal.pencarian.DialogCariNotaTundaController; import id.amigogroup.posterminal.pencarian.DialogCariNotaTundaController;
import id.amigogroup.posterminal.pencarian.DialogCariPelangganController; import id.amigogroup.posterminal.pencarian.DialogCariPelangganController;
import id.amigogroup.posterminal.pencarian.DialogCetakUlangNotaController; import id.amigogroup.posterminal.pencarian.DialogCetakUlangNotaController;
import id.amigogroup.posterminal.transaksi.BarangFull;
import id.amigogroup.posterminal.transaksi.DialogKonfirmasiReturController; import id.amigogroup.posterminal.transaksi.DialogKonfirmasiReturController;
import id.amigogroup.posterminal.transaksi.DialogTambahNotaController; import id.amigogroup.posterminal.transaksi.DialogTambahNotaController;
import id.amigogroup.posterminal.transaksi.FormTransaksiReturController; import id.amigogroup.posterminal.transaksi.FormTransaksiReturController;
@@ -17,7 +17,6 @@ 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.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -166,13 +165,14 @@ public class FormUtamaController implements Initializable {
loader.setLocation(getClass().getResource("/fxml/FormTransaksiTunai.fxml")); loader.setLocation(getClass().getResource("/fxml/FormTransaksiTunai.fxml"));
node = loader.load(); node = loader.load();
FormTransaksiTunaiController fttc = loader.getController(); FormTransaksiTunaiController fttc = loader.getController();
fttc.initData(noNota,baru);
notaContent.controllerTunai = fttc;
fttc.initData(noNota, baru);
break; break;
case FormConstanta.TRANSAKSI_RETUR: case FormConstanta.TRANSAKSI_RETUR:
loader.setLocation(getClass().getResource("/fxml/FormTransaksiRetur.fxml")); loader.setLocation(getClass().getResource("/fxml/FormTransaksiRetur.fxml"));
node = loader.load(); node = loader.load();
FormTransaksiReturController ftrc = loader.getController(); FormTransaksiReturController ftrc = loader.getController();
ftrc.initData(noNota,baru);
ftrc.initData(noNota, baru);
break; break;


} }
@@ -230,7 +230,29 @@ public class FormUtamaController implements Initializable {
DialogCariBarangController dialogCariBarang = new DialogCariBarangController(); DialogCariBarangController dialogCariBarang = new DialogCariBarangController();
dialogCariBarang.initOwner(bpMain.getScene().getWindow()); 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); listShortcuts.put(kcCariBarang, rnCariBarang);


@@ -488,19 +510,8 @@ public class FormUtamaController implements Initializable {
alert.initOwner(bpMain.getScene().getWindow()); alert.initOwner(bpMain.getScene().getWindow());
alert.show(); 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 { } 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 { private class NotaContent {


Button btnTunai; Button btnTunai;
FormTransaksiTunaiController controllerTunai = null;
Button btnBawa; Button btnBawa;
Button btnBon; Button btnBon;
Button btnRetur; Button btnRetur;
FormTransaksiReturController controllerRetur = null;
} }
} }

+ 56
- 13
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.NoBarang;
import id.amigogroup.posterminal.model.Pelanggan; import id.amigogroup.posterminal.model.Pelanggan;
import id.amigogroup.posterminal.model.Tas; import id.amigogroup.posterminal.model.Tas;
import id.amigogroup.posterminal.util.AlertUtil;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.List; 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 //Barang API
public Observable<Barang> getBarangByKodeBarang(String kodeBarang) { 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) { 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) { 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) { public Observable<List<DNotaTunai>> getDNotaTunaiByNoNota(String noNota) {
@@ -47,9 +64,10 @@ public class AmigoPosRx {
} }


public Observable<MNotaRetur> getMNotaReturByNoNota(String noNota) { public Observable<MNotaRetur> getMNotaReturByNoNota(String noNota) {
return UtilsApi.getServiceApiBarang().getMNotaReturByNoNota(noNota);
return UtilsApi.getServiceApiBarang().getMNotaReturByNoNota(noNota)
.subscribeOn(Schedulers.trampoline());
} }
//Checkin API //Checkin API
public Observable<List<Tas>> getAllTas() { public Observable<List<Tas>> getAllTas() {
return UtilsApi.getServiceApiCheckin().getAllTas(); return UtilsApi.getServiceApiCheckin().getAllTas();
@@ -57,19 +75,44 @@ public class AmigoPosRx {


//Karyawan API //Karyawan API
public Observable<Karyawan> getKaryawanByNik(String nik) { public Observable<Karyawan> getKaryawanByNik(String nik) {
return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik);
return UtilsApi.getServiceApiKaryawan().getKaryawanByNik(nik)
.subscribeOn(Schedulers.trampoline());
} }


//Pelanggan API //Pelanggan API
public Observable<Pelanggan> getPelangganByKodeMember(String kodeMember) { 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) { 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) { 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);
});
}
} }
} }

+ 9
- 4
src/main/java/id/amigogroup/posterminal/api/ServiceApiBarang.java 查看文件

@@ -27,11 +27,20 @@ public interface ServiceApiBarang {
Observable<Barang> getBarangByKodeBarang(@Path("kode") String kode); Observable<Barang> getBarangByKodeBarang(@Path("kode") String kode);
//NO-BARANG //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 //Mengambil No Barang by Id Gabungan & Ukuran
@GET("no-barangs/id-gabungan/{idGabungan}/nomor/{nomor}") @GET("no-barangs/id-gabungan/{idGabungan}/nomor/{nomor}")
Observable<NoBarang> getByIdGabunganNomor( Observable<NoBarang> getByIdGabunganNomor(
@Path("idGabungan") String idGabungan, @Path("idGabungan") String idGabungan,
@Path("nomor") String nomor); @Path("nomor") String nomor);

//Mengambil Barang Berdasarkan Nama Barang
@GET("barangs/nama/{namaBarang}")
Observable<Pagination<Barang>> getBarangByNamaBarang(@Path("namaBarang") String namaBarang);
//M-NOTA-TUNAI //M-NOTA-TUNAI
//Mengambil Master Nota Tunai by No Nota //Mengambil Master Nota Tunai by No Nota
@@ -56,8 +65,4 @@ public interface ServiceApiBarang {
//Mengambil Master Nota Retur by No Nota //Mengambil Master Nota Retur by No Nota
@GET("m-nota-retur/no-nota/{noNota}") @GET("m-nota-retur/no-nota/{noNota}")
Observable<MNotaRetur> getMNotaReturByNoNota(@Path("noNota") String 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);
} }

+ 1
- 17
src/main/java/id/amigogroup/posterminal/bayar/FormBayarReturController.java 查看文件

@@ -94,24 +94,8 @@ public class FormBayarReturController implements Initializable {
alert.show(); 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 { } 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());
} }
} }




+ 1
- 12
src/main/java/id/amigogroup/posterminal/keamanan/FormLoginController.java 查看文件

@@ -117,19 +117,8 @@ public class FormLoginController implements Initializable {
alert.initOwner(apMain.getScene().getWindow()); alert.initOwner(apMain.getScene().getWindow());
alert.show(); 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 { } 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());
} }
} }




+ 261
- 49
src/main/java/id/amigogroup/posterminal/pencarian/DialogCariBarangController.java 查看文件

@@ -5,15 +5,21 @@
*/ */
package id.amigogroup.posterminal.pencarian; package id.amigogroup.posterminal.pencarian;


import id.amigogroup.posterminal.FormUtamaController;
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.NoBarang;
import id.amigogroup.posterminal.model.Pagination; import id.amigogroup.posterminal.model.Pagination;
import id.amigogroup.posterminal.transaksi.BarangFull;
import id.amigogroup.posterminal.util.AlertUtil; import id.amigogroup.posterminal.util.AlertUtil;
import id.amigogroup.posterminal.util.AmigoPosCache;
import id.amigogroup.posterminal.util.Fucout; import id.amigogroup.posterminal.util.Fucout;
import io.reactivex.Observable;
import io.reactivex.Observer; import io.reactivex.Observer;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableObserver;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
@@ -41,6 +47,8 @@ import javafx.scene.control.ToggleGroup;
import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent; import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane; import javafx.scene.layout.AnchorPane;
import javafx.stage.Window; import javafx.stage.Window;
import retrofit2.HttpException; import retrofit2.HttpException;
@@ -50,7 +58,7 @@ import retrofit2.HttpException;
* *
* @author ronal * @author ronal
*/ */
public class DialogCariBarangController extends Dialog<Barang> implements Initializable {
public class DialogCariBarangController extends Dialog<BarangFull> implements Initializable {


@FXML @FXML
AnchorPane apContent; AnchorPane apContent;
@@ -68,8 +76,6 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia
private TableColumn<TabelBarangCari, String> tcUkur; private TableColumn<TabelBarangCari, String> tcUkur;
@FXML @FXML
private TableColumn<TabelBarangCari, String> tcHarga; private TableColumn<TabelBarangCari, String> tcHarga;
// @FXML
// private TableColumn<TabelBarangCari, Button> tcBtnTambah;
@FXML @FXML
private ToggleGroup tgTipe; private ToggleGroup tgTipe;
@FXML @FXML
@@ -79,7 +85,8 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia


final ObservableList<TabelBarangCari> daftarTabelBarang = FXCollections.observableArrayList(); final ObservableList<TabelBarangCari> daftarTabelBarang = FXCollections.observableArrayList();
AmigoPosRx posRx = new AmigoPosRx(); AmigoPosRx posRx = new AmigoPosRx();
private Barang barang = null;
CompositeDisposable compositeDisposable = new CompositeDisposable();
private BarangFull selectedBarangFull = null;


/** /**
* Initializes the controller class. * Initializes the controller class.
@@ -97,29 +104,24 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia
tcNama.setCellValueFactory(new PropertyValueFactory<>("nama")); tcNama.setCellValueFactory(new PropertyValueFactory<>("nama"));
tcUkur.setCellValueFactory(new PropertyValueFactory<>("ukur")); tcUkur.setCellValueFactory(new PropertyValueFactory<>("ukur"));
tcHarga.setCellValueFactory(new PropertyValueFactory<>("harga")); tcHarga.setCellValueFactory(new PropertyValueFactory<>("harga"));
// tcBtnTambah.setCellValueFactory(new PropertyValueFactory<>("btnTambah"));
tbvBarang.setItems(daftarTabelBarang); tbvBarang.setItems(daftarTabelBarang);
// fillTable(new ArrayList<>());
} }


public DialogCariBarangController(/*FormPresensiController parent*/) {
public DialogCariBarangController() {
selectedBarangFull = new BarangFull();
try { try {
Window window = getDialogPane().getScene().getWindow(); Window window = getDialogPane().getScene().getWindow();
window.setOnCloseRequest(event -> this.close()); window.setOnCloseRequest(event -> this.close());


FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariBarang.fxml")); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariBarang.fxml"));
loader.setController(this); loader.setController(this);
// DialogCariBarangController controller = loader.<DialogCariBarangController>getController();
Parent root = loader.load(); Parent root = loader.load();
getDialogPane().setContent(root); getDialogPane().setContent(root);
setTitle("Cari Barang"); setTitle("Cari Barang");


// getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
// setResultConverter(buttonType -> {
// return str;
// });
setResultConverter(buttonType -> { setResultConverter(buttonType -> {
return barang;
return selectedBarangFull;
}); });
} catch (IOException e) { } catch (IOException e) {
Logger.getLogger(DialogCariBarangController.class Logger.getLogger(DialogCariBarangController.class
@@ -130,18 +132,42 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia
public void updateTabelBarang(List<Barang> daftarBarang) { public void updateTabelBarang(List<Barang> daftarBarang) {
daftarTabelBarang.clear(); daftarTabelBarang.clear();
for (Barang barang : daftarBarang) { 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) { void tfPencarianOnKeyReleased(KeyEvent event) {
if (((RadioButton) tgTipe.getSelectedToggle() == rbKodeBarang if (((RadioButton) tgTipe.getSelectedToggle() == rbKodeBarang
&& event.getCode() == KeyCode.ENTER)) { && 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 } else if (((RadioButton) tgTipe.getSelectedToggle() == rbNamaBarang
&& tfPencarian.getText().length() >= 3)) { && 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>() { public Observer<Barang> barangKodeObserver = new Observer<Barang>() {
@@ -165,6 +233,9 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia
@Override @Override
public void onNext(Barang b) { public void onNext(Barang b) {
if (b != null) { if (b != null) {
if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(b.getKodeBarang())) {
AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b);
}
List<Barang> db = new ArrayList<>(); List<Barang> db = new ArrayList<>();
db.add(b); db.add(b);
updateTabelBarang(db); updateTabelBarang(db);
@@ -183,12 +254,7 @@ public class DialogCariBarangController extends Dialog<Barang> implements Initia
alert.show(); alert.show();
} }
} else { } 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 @Override
public void onSubscribe(Disposable dspsbl) { public void onSubscribe(Disposable dspsbl) {
} }


@Override @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) { if (error instanceof HttpException) {
switch (((HttpException) error).code()) { switch (((HttpException) error).code()) {
case HttpURLConnection.HTTP_NOT_FOUND: 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 { } 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 @Override
public void onComplete() { 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() {
}
};
} }

+ 4
- 23
src/main/java/id/amigogroup/posterminal/pencarian/DialogCariPelangganController.java 查看文件

@@ -107,12 +107,10 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> implements


FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariPelanggan.fxml")); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogCariPelanggan.fxml"));
loader.setController(this); loader.setController(this);
// DialogCariBarangController controller = loader.<DialogCariBarangController>getController();
Parent root = loader.load(); Parent root = loader.load();
getDialogPane().setContent(root); getDialogPane().setContent(root);
setTitle("Cari Pelanggan"); setTitle("Cari Pelanggan");


// getDialogPane().getButtonTypes().add(ButtonType.CANCEL);
setResultConverter(buttonType -> { setResultConverter(buttonType -> {
return pelanggan; 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) { public void updateTabelPelanggan(List<Pelanggan> daftarPelanggan) {
daftarTabelPelanggan.clear(); daftarTabelPelanggan.clear();
for (Pelanggan pelanggan : daftarPelanggan) { for (Pelanggan pelanggan : daftarPelanggan) {
@@ -144,9 +134,9 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> implements


@FXML @FXML
void tfPencarianOnKeyReleased(KeyEvent event) { void tfPencarianOnKeyReleased(KeyEvent event) {
daftarTabelPelanggan.clear();
if (((RadioButton) tgTipe.getSelectedToggle()) == rbMember if (((RadioButton) tgTipe.getSelectedToggle()) == rbMember
&& event.getCode() == KeyCode.ENTER) { && event.getCode() == KeyCode.ENTER) {
System.out.println("MASUK DONGssssssss");
posRx.getPelangganByKodeMember(tfPencarian.getText()).subscribe(pelangganMemberObserver); posRx.getPelangganByKodeMember(tfPencarian.getText()).subscribe(pelangganMemberObserver);
} else if (((RadioButton) tgTipe.getSelectedToggle()) == rbNama } else if (((RadioButton) tgTipe.getSelectedToggle()) == rbNama
&& tfPencarian.getText().length() >= 3) { && tfPencarian.getText().length() >= 3) {
@@ -155,6 +145,7 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> implements
&& tfPencarian.getText().length() >= 3) { && tfPencarian.getText().length() >= 3) {
posRx.getPelangganByNoTelpNoHp(tfPencarian.getText()).subscribe(daftarPelangganObserver); posRx.getPelangganByNoTelpNoHp(tfPencarian.getText()).subscribe(daftarPelangganObserver);
} }

} }


public Observer<Pelanggan> pelangganMemberObserver = new Observer<Pelanggan>() { public Observer<Pelanggan> pelangganMemberObserver = new Observer<Pelanggan>() {
@@ -183,12 +174,7 @@ public class DialogCariPelangganController extends Dialog<Pelanggan> implements
alert.show(); alert.show();
} }
} else { } 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(); alert.show();
} }
} else { } 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());
} }
} }




+ 32
- 17
src/main/java/id/amigogroup/posterminal/pencarian/TabelBarangCari.java 查看文件

@@ -5,9 +5,9 @@
*/ */
package id.amigogroup.posterminal.pencarian; 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.beans.property.SimpleStringProperty;
import javafx.scene.control.Button;


/** /**
* *
@@ -18,14 +18,15 @@ public class TabelBarangCari {
private final SimpleStringProperty nama; private final SimpleStringProperty nama;
private final SimpleStringProperty ukur; private final SimpleStringProperty ukur;
private final SimpleStringProperty harga; 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) { public TabelBarangCari(String kode, String nama, String ukur,String harga) {
this.kode = new SimpleStringProperty(kode); this.kode = new SimpleStringProperty(kode);
this.nama = new SimpleStringProperty(nama); this.nama = new SimpleStringProperty(nama);
this.ukur = new SimpleStringProperty(ukur); this.ukur = new SimpleStringProperty(ukur);
this.harga = new SimpleStringProperty(harga); this.harga = new SimpleStringProperty(harga);
// this.btnTambah = new SimpleObjectProperty<>(btnTambah);
} }


/** /**
@@ -84,17 +85,31 @@ public class TabelBarangCari {
this.harga.set(harga); 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;
}
} }

+ 4
- 0
src/main/java/id/amigogroup/posterminal/transaksi/BarangFull.java 查看文件

@@ -16,6 +16,10 @@ public class BarangFull {
private Barang barang; private Barang barang;
private NoBarang noBarang; private NoBarang noBarang;


public BarangFull() {
}
public BarangFull(Barang barang, NoBarang noBarang) { public BarangFull(Barang barang, NoBarang noBarang) {
this.barang = barang; this.barang = barang;
this.noBarang = noBarang; this.noBarang = noBarang;


+ 3
- 11
src/main/java/id/amigogroup/posterminal/transaksi/DialogTambahNotaController.java 查看文件

@@ -77,8 +77,7 @@ public class DialogTambahNotaController extends Dialog<String> implements Initia


FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogTambahNota.fxml")); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DialogTambahNota.fxml"));
loader.setController(this); loader.setController(this);
// DialogCariBarangController controller = loader.<DialogCariBarangController>getController();

Parent root = loader.load(); Parent root = loader.load();
getDialogPane().setContent(root); getDialogPane().setContent(root);


@@ -125,15 +124,8 @@ public class DialogTambahNotaController extends Dialog<String> implements Initia
alert.initModality(Modality.APPLICATION_MODAL); alert.initModality(Modality.APPLICATION_MODAL);
alert.show(); 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) { if (!notaExists) {


+ 6
- 38
src/main/java/id/amigogroup/posterminal/transaksi/FormTransaksiReturController.java 查看文件

@@ -273,16 +273,16 @@ public class FormTransaksiReturController implements Initializable {
tbr.setSubTotal(Fucout.getText(Fucout.formatRibuan( tbr.setSubTotal(Fucout.getText(Fucout.formatRibuan(
dNotaRetur.getJumlah() * dNotaRetur.getHargaJual() dNotaRetur.getJumlah() * dNotaRetur.getHargaJual()
))); )));
tbvRetur.refresh(); tbvRetur.refresh();
} else{
} else {
Alert alert = AlertUtil.getAlertError( Alert alert = AlertUtil.getAlertError(
"Jumlah Barang Kurang",
"Jumlah Barang Kurang",
"Barang di Nota Penjualan yang di-Retur sudah mencapai jumlah yang ada."); "Barang di Nota Penjualan yang di-Retur sudah mencapai jumlah yang ada.");
alert.initOwner(apMain.getScene().getWindow()); alert.initOwner(apMain.getScene().getWindow());
alert.show(); alert.show();
} }
ada = true; ada = true;
break; break;
} }
@@ -353,24 +353,8 @@ public class FormTransaksiReturController implements Initializable {
alert.show(); 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 { } 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(); 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 { } 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());
} }
} }




+ 65
- 91
src/main/java/id/amigogroup/posterminal/transaksi/FormTransaksiTunaiController.java 查看文件

@@ -94,7 +94,7 @@ public class FormTransaksiTunaiController implements Initializable {
@Override @Override
public void initialize(URL url, ResourceBundle rb) { public void initialize(URL url, ResourceBundle rb) {
fldScan.requestFocus(); fldScan.requestFocus();
tcNo.setCellValueFactory((TableColumn.CellDataFeatures<TabelBarangTunai, Integer> cell) -> { tcNo.setCellValueFactory((TableColumn.CellDataFeatures<TabelBarangTunai, Integer> cell) -> {
return new ReadOnlyObjectWrapper(tbvTransaksi.getItems().indexOf(cell.getValue()) + 1); 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 (barang != null && noBarang != null) {

if (noBarang.getStokOperasional() >= jumlah) {
if (noBarang.getStokOperasional() > 0) {
boolean ada = false; boolean ada = false;
for (TabelBarangTunai tbt : daftarTabelTransaksi) { for (TabelBarangTunai tbt : daftarTabelTransaksi) {
if (tbt.getKode().equals(barang.getKodeBarang()) && tbt.getUkur().equals(noBarang.getNomor())) { 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; ada = true;
break; break;
} }
} }

if (!ada) { if (!ada) {
String[] promo = {"Ulang Tahun", "Harbolnas", "Ultah Amigo"}; String[] promo = {"Ulang Tahun", "Harbolnas", "Ultah Amigo"};
ComboBox<String> cbxPromo = new ComboBox<>(FXCollections.observableArrayList(promo)); ComboBox<String> cbxPromo = new ComboBox<>(FXCollections.observableArrayList(promo));
@@ -201,30 +210,39 @@ public class FormTransaksiTunaiController implements Initializable {
noNota, noNota,
barang.getKodeBarang(), barang.getKodeBarang(),
barang.getNamaBarang(), barang.getNamaBarang(),
jumlah,
1,
0, 0,
0, 0,
noBarang.getHargaJual(), noBarang.getHargaJual(),
noBarang.getHargaPokok(), noBarang.getHargaPokok(),
"", "",
0); 0);

TabelBarangTunai tbt = new TabelBarangTunai( TabelBarangTunai tbt = new TabelBarangTunai(
Fucout.getText(barang.getKodeBarang()), Fucout.getText(barang.getKodeBarang()),
Fucout.getText(barang.getNamaBarang()), Fucout.getText(barang.getNamaBarang()),
Fucout.getText(noBarang.getNomor()), Fucout.getText(noBarang.getNomor()),
String.valueOf(jumlah),
String.valueOf(1),
Fucout.getText(Fucout.formatRibuan(noBarang.getHargaJual())), Fucout.getText(Fucout.formatRibuan(noBarang.getHargaJual())),
"...", "...",
"...", "...",
cbxPromo, cbxPromo,
Fucout.getText(Fucout.formatRibuan( Fucout.getText(Fucout.formatRibuan(
jumlah * noBarang.getHargaJual())
1 * noBarang.getHargaJual())
), ),
fldPramuniaga); fldPramuniaga);
tbt.setData(dNotaTunai); tbt.setData(dNotaTunai);


daftarTabelTransaksi.add(tbt); 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() NoBarang noBarang = AmigoPosCache.getInstance().getDaftarNoBarang()
.get(barang.getIdGabungan() + ukur); .get(barang.getIdGabungan() + ukur);


addToTable(barang, noBarang, 1);
addToTable(barang, noBarang);
} else { } else {
Observable.zip(posRx.getBarangByKodeBarang(kodeBarang), Observable.zip(posRx.getBarangByKodeBarang(kodeBarang),
posRx.getNoBarangByIdGabunganNomor(barang.getIdGabungan(), ukur), posRx.getNoBarangByIdGabunganNomor(barang.getIdGabungan(), ukur),
(b, nB) -> new BarangFull(b, nB)).subscribe(getBarangFullGetNoBarangFromBarangObserver); (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(); 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 { } 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) { if (error instanceof HttpException) {
switch (((HttpException) error).code()) { switch (((HttpException) error).code()) {
case HttpURLConnection.HTTP_NOT_FOUND: 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 { } 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) { if (error instanceof HttpException) {
switch (((HttpException) error).code()) { switch (((HttpException) error).code()) {
case HttpURLConnection.HTTP_NOT_FOUND: 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 { } 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 @Override
public void onNext(BarangFull bf) { public void onNext(BarangFull bf) {
addToTable(bf.getBarang(), bf.getNoBarang(), 1);
addToTable(bf.getBarang(), bf.getNoBarang());
} }


@Override @Override
@@ -435,26 +419,16 @@ public class FormTransaksiTunaiController implements Initializable {
if (error instanceof HttpException) { if (error instanceof HttpException) {
switch (((HttpException) error).code()) { switch (((HttpException) error).code()) {
case HttpURLConnection.HTTP_NOT_FOUND: 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 { } 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());
} }
} }




+ 9
- 0
src/main/java/id/amigogroup/posterminal/util/AlertUtil.java 查看文件

@@ -6,6 +6,7 @@
package id.amigogroup.posterminal.util; package id.amigogroup.posterminal.util;


import javafx.scene.control.Alert; import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.control.ButtonType; import javafx.scene.control.ButtonType;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.ImageView; 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_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_TITLE = "Error: Timeout - Koneksi Gagal";
public static final String ERROR_KONEKSI_TIMEOUT_MESSAGE = "Koneksi ke server mengalami kegagalan."; 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){ public static Alert getAlertError(String title, String message){
Alert alert = new Alert(Alert.AlertType.ERROR, message, ButtonType.OK); Alert alert = new Alert(Alert.AlertType.ERROR, message, ButtonType.OK);


+ 2
- 2
src/main/resources/fxml/DialogCariBarang.fxml 查看文件

@@ -25,12 +25,12 @@
</toggleGroup> </toggleGroup>
</RadioButton> </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" /> <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> <columns>
<TableColumn fx:id="tcNo" maxWidth="30.0" minWidth="30.0" prefWidth="30.0" resizable="false" text="No" /> <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="tcKode" prefWidth="75.0" text="Kode" />
<TableColumn fx:id="tcNama" prefWidth="75.0" text="Nama" /> <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" /> <TableColumn fx:id="tcHarga" prefWidth="75.0" text="Harga" />
</columns> </columns>
<columnResizePolicy> <columnResizePolicy>


正在加载...
取消
保存