/* * 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 com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import id.amigogroup.posterminal.SystemValue; import id.amigogroup.posterminal.api.AmigoPosRx; import id.amigogroup.posterminal.model.Barang; import id.amigogroup.posterminal.model.DNotaRetur; import id.amigogroup.posterminal.model.DNotaTunai; import id.amigogroup.posterminal.util.AmigoPosCache; import id.amigogroup.posterminal.util.AlertUtil; import id.amigogroup.posterminal.util.ButtonUtility; import id.amigogroup.posterminal.util.Fucout; 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.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.ClipboardContent; import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.StackPane; import retrofit2.HttpException; /** * FXML Controller class * * @author ronal */ public class FormTransaksiReturController implements Initializable { @FXML private AnchorPane apMain; @FXML private TextField fldNotaPenjualan; @FXML private TableView tbvPenjualan; @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 tcSubTotal; @FXML private TableColumn tcPramuniaga; @FXML private Label lblNomorNota; @FXML private Label lblKasir; @FXML private TableView tbvRetur; @FXML private TableColumn tcNoRetur; @FXML private TableColumn tcKodeRetur; @FXML private TableColumn tcNamaRetur; @FXML private TableColumn tcUkurRetur; @FXML private TableColumn tcJumlahRetur; @FXML private TableColumn tcHargaRetur; @FXML private TableColumn tcDisc1Retur; @FXML private TableColumn tcDisc2Retur; @FXML private TableColumn tcSubTotalRetur; @FXML private TableColumn tcPramuniagaRetur; @FXML private TableColumn tcBtnBatal; @FXML private StackPane stpReturDrop; @FXML private Label lblTambahKeTabelRetur; private final AmigoPosRx posRx = new AmigoPosRx(); private String noNota = ""; private final ObservableList daftarTabelPenjualan = FXCollections.observableArrayList(); public final ObservableList daftarTabelRetur = FXCollections.observableArrayList(); private TabelBarangTunai draggedTabelBarangTunai = null; /** * Initializes the controller class. */ @Override public void initialize(URL url, ResourceBundle rb) { tcNo.setCellValueFactory((TableColumn.CellDataFeatures cell) -> { return new ReadOnlyObjectWrapper(tbvPenjualan.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")); tcSubTotal.setCellValueFactory(new PropertyValueFactory<>("subTotal")); tcPramuniaga.setCellValueFactory(new PropertyValueFactory<>("fldPramuniaga")); // tcBtnBatal.setCellValueFactory(new PropertyValueFactory<>("btnBatal")); tbvPenjualan.setItems(daftarTabelPenjualan); tcNoRetur.setCellValueFactory((TableColumn.CellDataFeatures cell) -> { return new ReadOnlyObjectWrapper(tbvRetur.getItems().indexOf(cell.getValue()) + 1); }); tcKodeRetur.setCellValueFactory(new PropertyValueFactory<>("kode")); tcNamaRetur.setCellValueFactory(new PropertyValueFactory<>("nama")); tcUkurRetur.setCellValueFactory(new PropertyValueFactory<>("ukur")); tcJumlahRetur.setCellValueFactory(new PropertyValueFactory<>("jumlah")); tcHargaRetur.setCellValueFactory(new PropertyValueFactory<>("harga")); tcDisc1Retur.setCellValueFactory(new PropertyValueFactory<>("disc1")); tcDisc2Retur.setCellValueFactory(new PropertyValueFactory<>("disc2")); tcSubTotalRetur.setCellValueFactory(new PropertyValueFactory<>("subTotal")); tcPramuniagaRetur.setCellValueFactory(new PropertyValueFactory<>("fldPramuniaga")); tbvRetur.setItems(daftarTabelRetur); Platform.runLater(() -> { fldNotaPenjualan.requestFocus(); }); } public void initData(String noNota, boolean baru) { this.noNota = noNota; if (!baru) { posRx.getDNotaReturByNoNota(noNota).subscribe(getDaftarDNotaReturObserver); } if (SystemValue.karyawanLogin != null) { lblKasir.setText(Fucout.getTextColon(SystemValue.karyawanLogin.getNama())); } lblNomorNota.setText(Fucout.getTextColon(noNota)); } private void refreshDataPenjualan(List daftarNotaTunai) { daftarTabelPenjualan.clear(); for (DNotaTunai dNotaTunai : daftarNotaTunai) { //Button Button btnBatal = ButtonUtility.generateButton(ButtonUtility.CLOSE_ICON); btnBatal.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(dNotaTunai.getKodePram()); String namaBarang = "..."; if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) { Barang barang = AmigoPosCache.getInstance().getDaftarBarang() .get(dNotaTunai.getKdBarang()); namaBarang = Fucout.getText(barang.getNamaBarang()); dNotaTunai.setBarang(barang); } TabelBarangTunai tbt = 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())), null, Fucout.getText(Fucout.formatRibuan( dNotaTunai.getHargaJual() * dNotaTunai.getJumlah() )), fldPramuniaga, btnBatal); tbt.setData(dNotaTunai); daftarTabelPenjualan.add(tbt); if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) { posRx.getBarangByKodeBarang(dNotaTunai.getKdBarang()).subscribe(getBarangPenjualanObserver); } } } private void refreshDataRetur(List daftarDNotaRetur) { daftarTabelRetur.clear(); for(DNotaRetur dNotaRetur : daftarDNotaRetur){ //Button TextField fldPramuniaga = new TextField(dNotaRetur.getKodePram()); String namaBarang = "..."; if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaRetur.getKdBarang())) { Barang barang = AmigoPosCache.getInstance().getDaftarBarang() .get(dNotaRetur.getKdBarang()); namaBarang = Fucout.getText(barang.getNamaBarang()); dNotaRetur.setBarang(barang); } TabelBarangRetur tbr = new TabelBarangRetur( Fucout.getText(dNotaRetur.getKdBarang()), namaBarang, Fucout.getText(dNotaRetur.getNoBarang()), Fucout.getText(String.valueOf(dNotaRetur.getJumlah())), Fucout.getText(Fucout.formatRibuan(dNotaRetur.getHargaJual())), Fucout.getText(Fucout.formatPersentase(dNotaRetur.getDiskon())), Fucout.getText(Fucout.formatPersentase(dNotaRetur.getDiskon2())), Fucout.getText(Fucout.formatRibuan( dNotaRetur.getHargaJual() * dNotaRetur.getJumlah() )), fldPramuniaga); tbr.setData(dNotaRetur); daftarTabelRetur.add(tbr); if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaRetur.getKdBarang())) { posRx.getBarangByKodeBarang(dNotaRetur.getKdBarang()).subscribe(getBarangReturObserver); } } } @FXML void fldNotaPenjualanOnKeyPressed(KeyEvent event) { if (event.getCode() == KeyCode.ENTER) { Disposable disposable = posRx.validasiMNotaTunaiByNoNotaTanggal(fldNotaPenjualan.getText()) .subscribe((response) -> { ObjectMapper mapper = new ObjectMapper(); JsonNode jsonNode = mapper.readTree(response.string()); ObjectNode node = jsonNode.deepCopy(); if (node.get("result") != null && node.get("result").asBoolean()) { posRx.getDNotaTunaiByNoNota(fldNotaPenjualan.getText()).subscribe(getDNotaTunaiObserver); } else { Alert alert = AlertUtil.getAlertError( "Nota Tidak Bisa Digunakan", node.get("message").asText()); alert.initOwner(apMain.getScene().getWindow()); alert.show(); } }, (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()); } }); } } @FXML void tbvPenjualanOnDragDetected(MouseEvent event) { Dragboard db = tbvPenjualan.startDragAndDrop(TransferMode.COPY); if (tbvPenjualan.getSelectionModel().getSelectedItem() != null) { stpReturDrop.setVisible(true); ClipboardContent content = new ClipboardContent(); content.putString(tbvPenjualan.getSelectionModel().getSelectedItem().getNama()); db.setContent(content); draggedTabelBarangTunai = tbvPenjualan.getSelectionModel().getSelectedItem(); } event.consume(); } @FXML void stpReturDropOnDragOver(DragEvent event) { if (event.getGestureSource() != tbvRetur && event.getDragboard().hasString()) { event.acceptTransferModes(TransferMode.COPY); } event.consume(); } @FXML void stpReturDropOnDragEntered(DragEvent event) { if (event.getGestureSource() != stpReturDrop && event.getDragboard().hasString()) { lblTambahKeTabelRetur.setText("Tambah Barang " + event.getDragboard().getString() + " ke Nota Retur"); lblTambahKeTabelRetur.setVisible(true); if (!stpReturDrop.getStyleClass().contains("table-drag-over")) { stpReturDrop.getStyleClass().add("table-drag-over"); } } event.consume(); } @FXML void stpReturDropOnDragExited(DragEvent event) { lblTambahKeTabelRetur.setVisible(false); if (stpReturDrop.getStyleClass().contains("table-drag-over")) { lblTambahKeTabelRetur.setText("Tambah Barang ke Nota Retur"); stpReturDrop.getStyleClass().remove("table-drag-over"); } event.consume(); } @FXML void stpReturDropOnDragDropped(DragEvent event) { /* data dropped * if there is a string data on dragboard, read it and use it */ Dragboard db = event.getDragboard(); boolean success = false; if (db.hasString()) { } if (draggedTabelBarangTunai != null) { boolean ada = false; for (TabelBarangRetur tbr : daftarTabelRetur) { if (tbr.getData() != null && draggedTabelBarangTunai.getData() != null) { DNotaRetur dNotaRetur = tbr.getData(); DNotaTunai dNotaTunai = draggedTabelBarangTunai.getData(); if (dNotaRetur.getKdBarang().equals(dNotaTunai.getKdBarang()) && dNotaRetur.getNoBarang().equals(dNotaTunai.getNoBarang())) { if ((dNotaRetur.getJumlah() + 1) <= dNotaTunai.getJumlah()) { dNotaRetur.setJumlah(dNotaRetur.getJumlah() + 1); tbr.setJumlah(Fucout.getText(String.valueOf(dNotaRetur.getJumlah()))); tbr.setSubTotal(Fucout.getText(Fucout.formatRibuan( dNotaRetur.getJumlah() * dNotaRetur.getHargaJual() ))); tbvRetur.refresh(); } else { Alert alert = AlertUtil.getAlertError( "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; } } } success = true; if (!ada) { TextField fldPramuniaga = new TextField(); DNotaRetur dNotaRetur = new DNotaRetur(noNota, draggedTabelBarangTunai.getData()); TabelBarangRetur tbr = new TabelBarangRetur( draggedTabelBarangTunai.getKode(), draggedTabelBarangTunai.getNama(), draggedTabelBarangTunai.getUkur(), Fucout.getText(String.valueOf(dNotaRetur.getJumlah())), draggedTabelBarangTunai.getHarga(), draggedTabelBarangTunai.getDisc1(), draggedTabelBarangTunai.getDisc2(), Fucout.getText(Fucout.formatRibuan( dNotaRetur.getJumlah() * dNotaRetur.getHargaJual() )), fldPramuniaga); tbr.setData(dNotaRetur); daftarTabelRetur.add(tbr); } } /* let the source know whether the string was successfully * transferred and used */ event.setDropCompleted(success); event.consume(); } @FXML void tbvPenjualanOnDragDone(DragEvent event) { /* the drag and drop gesture ended * if the data was successfully moved, clear it */ stpReturDrop.setVisible(false); // if (event.getTransferMode() == TransferMode.MOVE) { // } event.consume(); } Observer> getDNotaTunaiObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(List daftarDNotaTunai) { fldNotaPenjualan.clear(); refreshDataPenjualan(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 getBarangPenjualanObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(Barang b) { AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b); for (TabelBarangTunai tbt : tbvPenjualan.getItems()) { if (tbt.getData().getKdBarang().equals(b.getKodeBarang())) { tbt.setNama(b.getNamaBarang()); tbt.getData().setBarang(b); tbvPenjualan.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> getDaftarDNotaReturObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(List daftarDNotaRetur) { refreshDataRetur(daftarDNotaRetur); } @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 getBarangReturObserver = new Observer<>() { @Override public void onSubscribe(Disposable dspsbl) { } @Override public void onNext(Barang b) { AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b); for (TabelBarangRetur tbr : tbvRetur.getItems()) { if (tbr.getData().getKdBarang().equals(b.getKodeBarang())) { tbr.setNama(b.getNamaBarang()); tbr.getData().setBarang(b); tbvRetur.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() { } }; }