/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package id.amigogroup.posterminal.transaksi; import id.amigogroup.posterminal.api.AmigoPosRx; import id.amigogroup.posterminal.model.Barang; import id.amigogroup.posterminal.model.DNotaTunai; import id.amigogroup.posterminal.model.NoBarang; import id.amigogroup.posterminal.util.AmigoPosCache; import id.amigogroup.posterminal.util.AlertUtil; import id.amigogroup.posterminal.util.Fucout; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.ResourceBundle; import javafx.application.Platform; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.text.Text; import retrofit2.HttpException; /** * FXML Controller class * * @author ronal */ public class FormTransaksiTunaiController implements Initializable { @FXML private AnchorPane apMain; @FXML private TextField fldScan; @FXML private Label lblNoNota; @FXML private TableView tbvTransaksi; @FXML private TableColumn tcNo; @FXML private TableColumn tcKode; @FXML private TableColumn tcNama; @FXML private TableColumn tcUkur; @FXML private TableColumn tcJumlah; @FXML private TableColumn tcHarga; @FXML private TableColumn tcDisc1; @FXML private TableColumn tcDisc2; @FXML private TableColumn> tcPromo; @FXML private TableColumn tcSubtotal; @FXML private TableColumn tcPramuniaga; @FXML private TableColumn tcAction; @FXML private Label txtTanggal; @FXML private Text lblGrandTotal; public final ObservableList daftarTabelTransaksi = FXCollections.observableArrayList(); public static final ButtonType btnAction = new ButtonType("BATAL", ButtonBar.ButtonData.YES); private String noNota = ""; private AmigoPosRx posRx = new AmigoPosRx(); public int total = 0; /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { Platform.runLater(() -> { fldScan.requestFocus(); }); tcNo.setCellValueFactory((TableColumn.CellDataFeatures cell) -> { return new ReadOnlyObjectWrapper(tbvTransaksi.getItems().indexOf(cell.getValue()) + 1); }); tcKode.setCellValueFactory(new PropertyValueFactory<>("kode")); tcNama.setCellValueFactory(new PropertyValueFactory<>("nama")); tcUkur.setCellValueFactory(new PropertyValueFactory<>("ukur")); tcJumlah.setCellValueFactory(new PropertyValueFactory<>("jumlah")); tcHarga.setCellValueFactory(new PropertyValueFactory<>("harga")); tcDisc1.setCellValueFactory(new PropertyValueFactory<>("disc1")); tcDisc2.setCellValueFactory(new PropertyValueFactory<>("disc2")); tcPromo.setCellValueFactory(new PropertyValueFactory<>("cbxPromo")); tcSubtotal.setCellValueFactory(new PropertyValueFactory<>("subTotal")); tcPramuniaga.setCellValueFactory(new PropertyValueFactory<>("fldPramuniaga")); tcAction.setCellValueFactory(new PropertyValueFactory<>("btnAction")); tbvTransaksi.setItems(daftarTabelTransaksi); lblGrandTotal.setText(Fucout.formatRupiah(0)); } public void initData(String noNota, boolean baru) { if (!baru) { posRx.getDNotaTunaiByNoNota(noNota).subscribe(getDNotaTunaiObserver); } this.noNota = noNota; lblNoNota.setText(Fucout.getTextColon(noNota)); setTanggal(); } public void setTanggal() { java.util.Date skrg = new java.util.Date(); java.text.SimpleDateFormat kal = new java.text.SimpleDateFormat("dd/MM/yyyy"); txtTanggal.setText(kal.format(skrg)); } private void refreshData(List daftarNotaTunai) { daftarTabelTransaksi.clear(); hitungTotal(daftarNotaTunai); String[] promo = {"Ulang Tahun", "Harbolnas", "Ultah Amigo"}; for (DNotaTunai dNotaTunai : daftarNotaTunai) { //ComboBox ComboBox cbxPromo = new ComboBox<>(FXCollections.observableArrayList(promo)); cbxPromo.getSelectionModel().select("Ulang Tahun"); //Button Button btnAction = new Button("BATAL"); btnAction.setOnAction((t) -> { Alert alert = AlertUtil.getAlertError( AlertUtil.DIALOG_KONFIRMASI_MESSAGE, "Yakin ingin menghapus barang?"); alert.initOwner(apMain.getScene().getWindow()); alert.show(); }); //TextField TextField fldPramuniaga = new TextField(dNotaTunai.getKodePram()); fldPramuniaga.setOnKeyPressed((t) -> { if (t.getCode() == KeyCode.ENTER) { fldScan.requestFocus(); } }); String namaBarang = "..."; if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) { namaBarang = Fucout.getText(AmigoPosCache.getInstance().getDaftarBarang() .get(dNotaTunai.getKdBarang()).getNamaBarang()); } daftarTabelTransaksi.add(new TabelBarangTunai( Fucout.getText(dNotaTunai.getKdBarang()), namaBarang, Fucout.getText(dNotaTunai.getNoBarang()), Fucout.getText(String.valueOf(dNotaTunai.getJumlah())), Fucout.getText(Fucout.formatRibuan(dNotaTunai.getHargaJual())), Fucout.getText(Fucout.formatPersentase(dNotaTunai.getDiskon())), Fucout.getText(Fucout.formatPersentase(dNotaTunai.getDiskon2())), cbxPromo, Fucout.getText(Fucout.formatRibuan( dNotaTunai.getHargaJual() * dNotaTunai.getJumlah() )), fldPramuniaga, btnAction)); if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) { posRx.getBarangByKodeBarang(dNotaTunai.getKdBarang()).subscribe(getBarangObserver); } } } public void addToTable(Barang barang, NoBarang noBarang) { if (barang != null && noBarang != null) { fldScan.setText(""); if (noBarang.getStokOperasional() > 0) { boolean ada = false; for (TabelBarangTunai tbt : daftarTabelTransaksi) { if (tbt.getKode().equals(barang.getKodeBarang()) && tbt.getUkur().equals(noBarang.getNomor())) { if (tbt.getData() != null) { if (noBarang.getStokOperasional() >= tbt.getData().getJumlah() + 1) { tbt.getData().setJumlah(tbt.getData().getJumlah() + 1); tbt.setJumlah(String.valueOf(tbt.getData().getJumlah())); tbt.setSubTotal(Fucout.formatRibuan( tbt.getData().getJumlah() * tbt.getData().getHargaJual())); total += noBarang.getHargaJual(); updateLabelGrandTotal(); tbvTransaksi.refresh(); } else { Platform.runLater(() -> { Alert alert = AlertUtil.getAlertWarning( "Stok Habis", "Tidak bisa menambahkan barang karena stok barang habis"); alert.initOwner(apMain.getScene().getWindow()); alert.show(); }); } } ada = true; break; } } if (!ada) { String[] promo = {"Ulang Tahun", "Harbolnas", "Ultah Amigo"}; ComboBox cbxPromo = new ComboBox<>(FXCollections.observableArrayList(promo)); cbxPromo.getSelectionModel().select("Ulang Tahun"); Button btnAction = new Button("BATAL"); btnAction.setOnAction((t) -> { Alert alert = AlertUtil.getAlertDialogKonfirmasi( AlertUtil.DIALOG_KONFIRMASI_MESSAGE, "Yakin ingin menghapus barang?"); alert.initOwner(apMain.getScene().getWindow()); alert.show(); }); TextField fldPramuniaga = new TextField(); fldPramuniaga.setOnKeyPressed((t) -> { if (t.getCode() == KeyCode.ENTER) { fldScan.requestFocus(); } }); DNotaTunai dNotaTunai = new DNotaTunai( noNota, barang.getKodeBarang(), barang.getNamaBarang(), 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(1), Fucout.getText(Fucout.formatRibuan(noBarang.getHargaJual())), "...", "...", cbxPromo, Fucout.getText(Fucout.formatRibuan( 1 * noBarang.getHargaJual()) ), fldPramuniaga, btnAction); tbt.setData(dNotaTunai); total += noBarang.getHargaJual(); updateLabelGrandTotal(); 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(); }); } } } private int hitungTotal(List daftarDNotaTunai) { int totalTemp = 0; for (DNotaTunai dNotaTunai : daftarDNotaTunai) { totalTemp += dNotaTunai.getJumlah() * dNotaTunai.getHargaJual(); } total = totalTemp; updateLabelGrandTotal(); return 0; } private void updateLabelGrandTotal() { lblGrandTotal.setText(Fucout.formatRupiah(total)); } //SCAN BARANG @FXML void fldScanOnKeyPressed(KeyEvent event) { if (event.getCode() == KeyCode.ENTER) { String kodeFull = fldScan.getText(); String kodeBarang = Fucout.getKodeBarangFromKodeFull(kodeFull); String ukur = Fucout.getNomorBarangFromKodeFull(kodeFull); if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(kodeBarang)) { Barang barang = AmigoPosCache.getInstance().getDaftarBarang().get(kodeBarang); if (AmigoPosCache.getInstance().getDaftarNoBarang().containsKey( barang.getIdGabungan() + ukur)) { NoBarang noBarang = AmigoPosCache.getInstance().getDaftarNoBarang() .get(barang.getIdGabungan() + ukur); addToTable(barang, 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); } } } Observer> getDNotaTunaiObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(List daftarDNotaTunai) { refreshData(daftarDNotaTunai); } @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, "Data nota tidak ditemukan."); alert.initOwner(apMain.getScene().getWindow()); alert.show(); }); } } else { AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow()); } } @Override public void onComplete() { } }; Observer getBarangObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(Barang b) { AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b); for (TabelBarangTunai tbt : daftarTabelTransaksi) { if (tbt.getKode().equals(b.getKodeBarang())) { tbt.setNama(b.getNamaBarang()); tbvTransaksi.refresh(); } }; } @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(apMain.getScene().getWindow()); alert.show(); }); } } else { AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow()); } } @Override public void onComplete() { } }; Observer getTambahBarangObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override 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); } } } @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(apMain.getScene().getWindow()); alert.show(); }); } } else { AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow()); } } @Override public void onComplete() { } }; Observer getBarangFullGetNoBarangFromBarangObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(BarangFull bf) { addToTable(bf.getBarang(), bf.getNoBarang()); } @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(apMain.getScene().getWindow()); alert.show(); }); } } else { AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow()); } } @Override public void onComplete() { } }; }