Aplikasi POS Amigo, dibangun dengan JavaFX dengan Maven
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

638 righe
26 KiB

  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package id.amigogroup.posterminal.transaksi;
  7. import com.fasterxml.jackson.databind.JsonNode;
  8. import com.fasterxml.jackson.databind.ObjectMapper;
  9. import com.fasterxml.jackson.databind.node.ObjectNode;
  10. import id.amigogroup.posterminal.SystemValue;
  11. import id.amigogroup.posterminal.api.AmigoPosRx;
  12. import id.amigogroup.posterminal.model.Barang;
  13. import id.amigogroup.posterminal.model.DNotaRetur;
  14. import id.amigogroup.posterminal.model.DNotaTunai;
  15. import id.amigogroup.posterminal.util.AmigoPosCache;
  16. import id.amigogroup.posterminal.util.AlertUtil;
  17. import id.amigogroup.posterminal.util.ButtonUtility;
  18. import id.amigogroup.posterminal.util.Fucout;
  19. import io.reactivex.Observer;
  20. import io.reactivex.disposables.Disposable;
  21. import java.net.HttpURLConnection;
  22. import java.net.URL;
  23. import java.util.List;
  24. import java.util.Optional;
  25. import java.util.ResourceBundle;
  26. import java.util.logging.Level;
  27. import java.util.logging.Logger;
  28. import javafx.application.Platform;
  29. import javafx.beans.property.ReadOnlyObjectWrapper;
  30. import javafx.collections.FXCollections;
  31. import javafx.collections.ObservableList;
  32. import javafx.fxml.FXML;
  33. import javafx.fxml.Initializable;
  34. import javafx.scene.control.Alert;
  35. import javafx.scene.control.Button;
  36. import javafx.scene.control.ButtonType;
  37. import javafx.scene.control.Label;
  38. import javafx.scene.control.TableColumn;
  39. import javafx.scene.control.TableView;
  40. import javafx.scene.control.TextField;
  41. import javafx.scene.control.cell.PropertyValueFactory;
  42. import javafx.scene.input.ClipboardContent;
  43. import javafx.scene.input.DragEvent;
  44. import javafx.scene.input.Dragboard;
  45. import javafx.scene.input.KeyCode;
  46. import javafx.scene.input.KeyEvent;
  47. import javafx.scene.input.MouseEvent;
  48. import javafx.scene.input.TransferMode;
  49. import javafx.scene.layout.AnchorPane;
  50. import javafx.scene.layout.StackPane;
  51. import retrofit2.HttpException;
  52. /**
  53. * FXML Controller class
  54. *
  55. * @author ronal
  56. */
  57. public class FormTransaksiReturController implements Initializable {
  58. @FXML
  59. private AnchorPane apMain;
  60. @FXML
  61. private TextField fldNotaPenjualan;
  62. @FXML
  63. private TableView<TabelBarangTunai> tbvPenjualan;
  64. @FXML
  65. private TableColumn<TabelBarangTunai, Integer> tcNo;
  66. @FXML
  67. private TableColumn<TabelBarangTunai, String> tcKode;
  68. @FXML
  69. private TableColumn<TabelBarangTunai, String> tcNama;
  70. @FXML
  71. private TableColumn<TabelBarangTunai, String> tcUkur;
  72. @FXML
  73. private TableColumn<TabelBarangTunai, String> tcJumlah;
  74. @FXML
  75. private TableColumn<TabelBarangTunai, String> tcHarga;
  76. @FXML
  77. private TableColumn<TabelBarangTunai, String> tcDisc1;
  78. @FXML
  79. private TableColumn<TabelBarangTunai, String> tcDisc2;
  80. @FXML
  81. private TableColumn<TabelBarangTunai, String> tcSubTotal;
  82. @FXML
  83. private TableColumn<TabelBarangTunai, TextField> tcPramuniaga;
  84. @FXML
  85. private Label lblNomorNota;
  86. @FXML
  87. private Label lblKasir;
  88. @FXML
  89. private TableView<TabelBarangRetur> tbvRetur;
  90. @FXML
  91. private TableColumn<TabelBarangRetur, Integer> tcNoRetur;
  92. @FXML
  93. private TableColumn<TabelBarangRetur, String> tcKodeRetur;
  94. @FXML
  95. private TableColumn<TabelBarangRetur, String> tcNamaRetur;
  96. @FXML
  97. private TableColumn<TabelBarangRetur, String> tcUkurRetur;
  98. @FXML
  99. private TableColumn<TabelBarangRetur, String> tcJumlahRetur;
  100. @FXML
  101. private TableColumn<TabelBarangRetur, String> tcHargaRetur;
  102. @FXML
  103. private TableColumn<TabelBarangRetur, String> tcDisc1Retur;
  104. @FXML
  105. private TableColumn<TabelBarangRetur, String> tcDisc2Retur;
  106. @FXML
  107. private TableColumn<TabelBarangRetur, String> tcSubTotalRetur;
  108. @FXML
  109. private TableColumn<TabelBarangRetur, TextField> tcPramuniagaRetur;
  110. @FXML
  111. private TableColumn<TabelBarangRetur, Button> tcBtnBatal;
  112. @FXML
  113. private StackPane stpReturDrop;
  114. @FXML
  115. private Label lblTambahKeTabelRetur;
  116. private final AmigoPosRx posRx = new AmigoPosRx();
  117. private String noNota = "";
  118. private final ObservableList<TabelBarangTunai> daftarTabelPenjualan = FXCollections.observableArrayList();
  119. public final ObservableList<TabelBarangRetur> daftarTabelRetur = FXCollections.observableArrayList();
  120. private TabelBarangTunai draggedTabelBarangTunai = null;
  121. public String lastNoNotaPenjualan = "";
  122. public String tipeRetur = "";
  123. public int nominalRetur = 0;
  124. /**
  125. * Initializes the controller class.
  126. */
  127. @Override
  128. public void initialize(URL url, ResourceBundle rb) {
  129. tcNo.setCellValueFactory((TableColumn.CellDataFeatures<TabelBarangTunai, Integer> cell) -> {
  130. return new ReadOnlyObjectWrapper(tbvPenjualan.getItems().indexOf(cell.getValue()) + 1);
  131. });
  132. tcKode.setCellValueFactory(new PropertyValueFactory<>("kode"));
  133. tcNama.setCellValueFactory(new PropertyValueFactory<>("nama"));
  134. tcUkur.setCellValueFactory(new PropertyValueFactory<>("ukur"));
  135. tcJumlah.setCellValueFactory(new PropertyValueFactory<>("jumlah"));
  136. tcHarga.setCellValueFactory(new PropertyValueFactory<>("harga"));
  137. tcDisc1.setCellValueFactory(new PropertyValueFactory<>("disc1"));
  138. tcDisc2.setCellValueFactory(new PropertyValueFactory<>("disc2"));
  139. tcSubTotal.setCellValueFactory(new PropertyValueFactory<>("subTotal"));
  140. tcPramuniaga.setCellValueFactory(new PropertyValueFactory<>("fldPramuniaga"));
  141. tbvPenjualan.setItems(daftarTabelPenjualan);
  142. tcNoRetur.setCellValueFactory((TableColumn.CellDataFeatures<TabelBarangRetur, Integer> cell) -> {
  143. return new ReadOnlyObjectWrapper(tbvRetur.getItems().indexOf(cell.getValue()) + 1);
  144. });
  145. tcKodeRetur.setCellValueFactory(new PropertyValueFactory<>("kode"));
  146. tcNamaRetur.setCellValueFactory(new PropertyValueFactory<>("nama"));
  147. tcUkurRetur.setCellValueFactory(new PropertyValueFactory<>("ukur"));
  148. tcJumlahRetur.setCellValueFactory(new PropertyValueFactory<>("jumlah"));
  149. tcHargaRetur.setCellValueFactory(new PropertyValueFactory<>("harga"));
  150. tcDisc1Retur.setCellValueFactory(new PropertyValueFactory<>("disc1"));
  151. tcDisc2Retur.setCellValueFactory(new PropertyValueFactory<>("disc2"));
  152. tcSubTotalRetur.setCellValueFactory(new PropertyValueFactory<>("subTotal"));
  153. tcPramuniagaRetur.setCellValueFactory(new PropertyValueFactory<>("fldPramuniaga"));
  154. tcBtnBatal.setCellValueFactory(new PropertyValueFactory<>("btnBatal"));
  155. tbvRetur.setItems(daftarTabelRetur);
  156. Platform.runLater(() -> {
  157. fldNotaPenjualan.requestFocus();
  158. });
  159. }
  160. public void initData(String noNota, boolean baru) {
  161. this.noNota = noNota;
  162. if (!baru) {
  163. posRx.getDNotaReturByNoNota(noNota).subscribe(getDaftarDNotaReturObserver);
  164. }
  165. if (SystemValue.karyawanLogin != null) {
  166. lblKasir.setText(Fucout.getTextColon(SystemValue.karyawanLogin.getNama()));
  167. }
  168. lblNomorNota.setText(Fucout.getTextColon(noNota));
  169. }
  170. private void refreshDataPenjualan(List<DNotaTunai> daftarNotaTunai) {
  171. daftarTabelPenjualan.clear();
  172. for (DNotaTunai dNotaTunai : daftarNotaTunai) {
  173. TextField fldPramuniaga = new TextField(dNotaTunai.getKodePram());
  174. String namaBarang = "...";
  175. if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) {
  176. Barang barang = AmigoPosCache.getInstance().getDaftarBarang()
  177. .get(dNotaTunai.getKdBarang());
  178. namaBarang = Fucout.getText(barang.getNamaBarang());
  179. dNotaTunai.setBarang(barang);
  180. }
  181. TabelBarangTunai tbt = new TabelBarangTunai(
  182. Fucout.getText(dNotaTunai.getKdBarang()),
  183. namaBarang,
  184. Fucout.getText(dNotaTunai.getNoBarang()),
  185. Fucout.getText(String.valueOf(dNotaTunai.getJumlah())),
  186. Fucout.getText(Fucout.formatRibuan(dNotaTunai.getHargaJual())),
  187. Fucout.getText(Fucout.formatPersentase(dNotaTunai.getDiskon())),
  188. Fucout.getText(Fucout.formatPersentase(dNotaTunai.getDiskon2())),
  189. null,
  190. Fucout.getText(Fucout.formatRibuan(
  191. dNotaTunai.getHargaJual() * dNotaTunai.getJumlah()
  192. )),
  193. fldPramuniaga,
  194. null);
  195. tbt.setData(dNotaTunai);
  196. daftarTabelPenjualan.add(tbt);
  197. if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) {
  198. posRx.getBarangByKodeBarang(dNotaTunai.getKdBarang()).subscribe(getBarangPenjualanObserver);
  199. }
  200. }
  201. }
  202. private void refreshDataRetur(List<DNotaRetur> daftarDNotaRetur) {
  203. daftarTabelRetur.clear();
  204. for (DNotaRetur dNotaRetur : daftarDNotaRetur) {
  205. //Button
  206. Button btnBatal = ButtonUtility.generateButton(ButtonUtility.CLOSE_ICON);
  207. TextField fldPramuniaga = new TextField(dNotaRetur.getKodePram());
  208. String namaBarang = "...";
  209. if (AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaRetur.getKdBarang())) {
  210. Barang barang = AmigoPosCache.getInstance().getDaftarBarang()
  211. .get(dNotaRetur.getKdBarang());
  212. namaBarang = Fucout.getText(barang.getNamaBarang());
  213. dNotaRetur.setBarang(barang);
  214. }
  215. TabelBarangRetur tbr = new TabelBarangRetur(
  216. Fucout.getText(dNotaRetur.getKdBarang()),
  217. namaBarang,
  218. Fucout.getText(dNotaRetur.getNoBarang()),
  219. Fucout.getText(String.valueOf(dNotaRetur.getJumlah())),
  220. Fucout.getText(Fucout.formatRibuan(dNotaRetur.getHargaJual())),
  221. Fucout.getText(Fucout.formatPersentase(dNotaRetur.getDiskon())),
  222. Fucout.getText(Fucout.formatPersentase(dNotaRetur.getDiskon2())),
  223. Fucout.getText(Fucout.formatRibuan(
  224. dNotaRetur.getHargaJual() * dNotaRetur.getJumlah()
  225. )),
  226. fldPramuniaga,
  227. btnBatal);
  228. btnBatal.setOnAction((t) -> {
  229. batalRetur(tbr);
  230. });
  231. tbr.setData(dNotaRetur);
  232. daftarTabelRetur.add(tbr);
  233. if (!AmigoPosCache.getInstance().getDaftarBarang().containsKey(dNotaRetur.getKdBarang())) {
  234. posRx.getBarangByKodeBarang(dNotaRetur.getKdBarang()).subscribe(getBarangReturObserver);
  235. }
  236. }
  237. }
  238. private void batalRetur(TabelBarangRetur tbr) {
  239. Alert alert = AlertUtil.getAlertDialogKonfirmasi(
  240. AlertUtil.DIALOG_KONFIRMASI_MESSAGE,
  241. "Yakin ingin membatalkan barang?");
  242. alert.initOwner(apMain.getScene().getWindow());
  243. Optional<ButtonType> result = alert.showAndWait();
  244. if (result.isPresent() && result.get() == AlertUtil.BUTTON_YA) {
  245. if (tbr.getData().getJumlah() > 1) {
  246. tbr.getData().setJumlah(tbr.getData().getJumlah() - 1);
  247. tbr.setJumlah(String.valueOf(tbr.getData().getJumlah()));
  248. tbvRetur.refresh();
  249. } else {
  250. daftarTabelRetur.remove(tbr);
  251. }
  252. nominalRetur -= tbr.getData().getHargaJual();
  253. }
  254. }
  255. @FXML
  256. void fldNotaPenjualanOnKeyPressed(KeyEvent event) {
  257. if (event.getCode() == KeyCode.ENTER) {
  258. switch(fldNotaPenjualan.getText().charAt(0)){
  259. case Fucout.KODE_NOTA_BAWA:
  260. tipeRetur = Fucout.TEKS_TIPE_NOTA_BAWA;
  261. break;
  262. case Fucout.KODE_NOTA_BON:
  263. tipeRetur = Fucout.TEKS_TIPE_NOTA_BAWA;
  264. break;
  265. case Fucout.KODE_NOTA_RETUR:
  266. break;
  267. default:
  268. tipeRetur = Fucout.TEKS_TIPE_NOTA_TUNAI;
  269. break;
  270. }
  271. Disposable disposable = posRx.validasiMNotaTunaiByNoNotaTanggal(fldNotaPenjualan.getText())
  272. .subscribe((response) -> {
  273. ObjectMapper mapper = new ObjectMapper();
  274. JsonNode jsonNode = mapper.readTree(response.string());
  275. ObjectNode node = jsonNode.deepCopy();
  276. if (node.get("result") != null && node.get("result").asBoolean()) {
  277. posRx.getDNotaTunaiByNoNota(fldNotaPenjualan.getText()).subscribe(getDNotaTunaiObserver);
  278. } else {
  279. Alert alert = AlertUtil.getAlertError(
  280. "Nota Tidak Bisa Digunakan",
  281. node.get("message").asText());
  282. alert.initOwner(apMain.getScene().getWindow());
  283. alert.show();
  284. }
  285. }, (error) -> {
  286. if (error instanceof HttpException) {
  287. switch (((HttpException) error).code()) {
  288. case HttpURLConnection.HTTP_NOT_FOUND:
  289. Platform.runLater(() -> {
  290. Alert alert = AlertUtil.getAlertError(
  291. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  292. "Data nota tidak ditemukan.");
  293. alert.initOwner(apMain.getScene().getWindow());
  294. alert.show();
  295. });
  296. break;
  297. default:
  298. Logger.getLogger(FormTransaksiReturController.class.getName()).log(Level.SEVERE, null, error);
  299. }
  300. } else {
  301. AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow());
  302. }
  303. });
  304. }
  305. }
  306. @FXML
  307. void tbvPenjualanOnDragDetected(MouseEvent event) {
  308. Dragboard db = tbvPenjualan.startDragAndDrop(TransferMode.COPY);
  309. if (tbvPenjualan.getSelectionModel().getSelectedItem() != null) {
  310. stpReturDrop.setVisible(true);
  311. ClipboardContent content = new ClipboardContent();
  312. content.putString(tbvPenjualan.getSelectionModel().getSelectedItem().getNama());
  313. db.setContent(content);
  314. draggedTabelBarangTunai = tbvPenjualan.getSelectionModel().getSelectedItem();
  315. }
  316. event.consume();
  317. }
  318. @FXML
  319. void stpReturDropOnDragOver(DragEvent event) {
  320. if (event.getGestureSource() != tbvRetur
  321. && event.getDragboard().hasString()) {
  322. event.acceptTransferModes(TransferMode.COPY);
  323. }
  324. event.consume();
  325. }
  326. @FXML
  327. void stpReturDropOnDragEntered(DragEvent event) {
  328. if (event.getGestureSource() != stpReturDrop
  329. && event.getDragboard().hasString()) {
  330. lblTambahKeTabelRetur.setText("Tambah Barang " + event.getDragboard().getString() + " ke Nota Retur");
  331. lblTambahKeTabelRetur.setVisible(true);
  332. if (!stpReturDrop.getStyleClass().contains("table-drag-over")) {
  333. stpReturDrop.getStyleClass().add("table-drag-over");
  334. }
  335. }
  336. event.consume();
  337. }
  338. @FXML
  339. void stpReturDropOnDragExited(DragEvent event) {
  340. lblTambahKeTabelRetur.setVisible(false);
  341. if (stpReturDrop.getStyleClass().contains("table-drag-over")) {
  342. lblTambahKeTabelRetur.setText("Tambah Barang ke Nota Retur");
  343. stpReturDrop.getStyleClass().remove("table-drag-over");
  344. }
  345. event.consume();
  346. }
  347. @FXML
  348. void stpReturDropOnDragDropped(DragEvent event) {
  349. /* data dropped
  350. * if there is a string data on dragboard, read it and use it */
  351. Dragboard db = event.getDragboard();
  352. boolean success = false;
  353. if (db.hasString()) {
  354. }
  355. if (draggedTabelBarangTunai != null) {
  356. boolean ada = false;
  357. for (TabelBarangRetur tbr : daftarTabelRetur) {
  358. if (tbr.getData() != null && draggedTabelBarangTunai.getData() != null) {
  359. DNotaRetur dNotaRetur = tbr.getData();
  360. DNotaTunai dNotaTunai = draggedTabelBarangTunai.getData();
  361. if (dNotaRetur.getKdBarang().equals(dNotaTunai.getKdBarang())
  362. && dNotaRetur.getNoBarang().equals(dNotaTunai.getNoBarang())) {
  363. if ((dNotaRetur.getJumlah() + 1) <= dNotaTunai.getJumlah()) {
  364. dNotaRetur.setJumlah(dNotaRetur.getJumlah() + 1);
  365. tbr.setJumlah(Fucout.getText(String.valueOf(dNotaRetur.getJumlah())));
  366. tbr.setSubTotal(Fucout.getText(Fucout.formatRibuan(
  367. dNotaRetur.getJumlah() * dNotaRetur.getHargaJual()
  368. )));
  369. tbvRetur.refresh();
  370. nominalRetur += tbr.getData().getHargaJual();
  371. } else {
  372. Alert alert = AlertUtil.getAlertError(
  373. "Jumlah Barang Kurang",
  374. "Barang di Nota Penjualan yang di-Retur sudah mencapai jumlah yang ada.");
  375. alert.initOwner(apMain.getScene().getWindow());
  376. alert.show();
  377. }
  378. ada = true;
  379. break;
  380. }
  381. }
  382. }
  383. success = true;
  384. if (!ada) {
  385. Button btnBatal = ButtonUtility.generateButton(ButtonUtility.CLOSE_ICON);
  386. TextField fldPramuniaga = new TextField();
  387. DNotaRetur dNotaRetur = new DNotaRetur(noNota, draggedTabelBarangTunai.getData());
  388. TabelBarangRetur tbr = new TabelBarangRetur(
  389. draggedTabelBarangTunai.getKode(),
  390. draggedTabelBarangTunai.getNama(),
  391. draggedTabelBarangTunai.getUkur(),
  392. Fucout.getText(String.valueOf(dNotaRetur.getJumlah())),
  393. draggedTabelBarangTunai.getHarga(),
  394. draggedTabelBarangTunai.getDisc1(),
  395. draggedTabelBarangTunai.getDisc2(),
  396. Fucout.getText(Fucout.formatRibuan(
  397. dNotaRetur.getJumlah() * dNotaRetur.getHargaJual()
  398. )),
  399. fldPramuniaga,
  400. btnBatal);
  401. btnBatal.setOnAction((t) -> {
  402. batalRetur(tbr);
  403. });
  404. tbr.setData(dNotaRetur);
  405. nominalRetur += tbr.getData().getHargaJual();
  406. daftarTabelRetur.add(tbr);
  407. }
  408. }
  409. /* let the source know whether the string was successfully
  410. * transferred and used */
  411. event.setDropCompleted(success);
  412. event.consume();
  413. }
  414. @FXML
  415. void tbvPenjualanOnDragDone(DragEvent event) {
  416. /* the drag and drop gesture ended
  417. * if the data was successfully moved, clear it */
  418. stpReturDrop.setVisible(false);
  419. // if (event.getTransferMode() == TransferMode.MOVE) {
  420. // }
  421. event.consume();
  422. }
  423. Observer<List<DNotaTunai>> getDNotaTunaiObserver = new Observer<>() {
  424. @Override
  425. public void onSubscribe(Disposable dspsbl) {
  426. }
  427. @Override
  428. public void onNext(List<DNotaTunai> daftarDNotaTunai) {
  429. lastNoNotaPenjualan = fldNotaPenjualan.getText();
  430. refreshDataPenjualan(daftarDNotaTunai);
  431. }
  432. @Override
  433. public void onError(Throwable error) {
  434. if (error instanceof HttpException) {
  435. switch (((HttpException) error).code()) {
  436. case HttpURLConnection.HTTP_NOT_FOUND:
  437. Platform.runLater(() -> {
  438. Alert alert = AlertUtil.getAlertError(
  439. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  440. "Data nota tidak ditemukan.");
  441. alert.initOwner(apMain.getScene().getWindow());
  442. alert.show();
  443. });
  444. break;
  445. default:
  446. Logger.getLogger(FormTransaksiReturController.class.getName()).log(Level.SEVERE, null, error);
  447. }
  448. } else {
  449. AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow());
  450. }
  451. }
  452. @Override
  453. public void onComplete() {
  454. }
  455. };
  456. Observer<Barang> getBarangPenjualanObserver = new Observer<>() {
  457. @Override
  458. public void onSubscribe(Disposable dspsbl) {
  459. }
  460. @Override
  461. public void onNext(Barang b) {
  462. AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b);
  463. for (TabelBarangTunai tbt : tbvPenjualan.getItems()) {
  464. if (tbt.getData().getKdBarang().equals(b.getKodeBarang())) {
  465. tbt.setNama(b.getNamaBarang());
  466. tbt.getData().setBarang(b);
  467. tbvPenjualan.refresh();
  468. }
  469. }
  470. }
  471. @Override
  472. public void onError(Throwable error) {
  473. if (error instanceof HttpException) {
  474. switch (((HttpException) error).code()) {
  475. case HttpURLConnection.HTTP_NOT_FOUND:
  476. Platform.runLater(() -> {
  477. Alert alert = AlertUtil.getAlertError(
  478. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  479. "Barang dengan kode tersebut tidak ditemukan.");
  480. alert.initOwner(apMain.getScene().getWindow());
  481. alert.show();
  482. });
  483. break;
  484. default:
  485. Logger.getLogger(FormTransaksiReturController.class.getName()).log(Level.SEVERE, null, error);
  486. }
  487. } else {
  488. AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow());
  489. }
  490. }
  491. @Override
  492. public void onComplete() {
  493. }
  494. };
  495. Observer<List<DNotaRetur>> getDaftarDNotaReturObserver = new Observer<>() {
  496. @Override
  497. public void onSubscribe(Disposable dspsbl) {
  498. }
  499. @Override
  500. public void onNext(List<DNotaRetur> daftarDNotaRetur) {
  501. refreshDataRetur(daftarDNotaRetur);
  502. }
  503. @Override
  504. public void onError(Throwable error) {
  505. if (error instanceof HttpException) {
  506. switch (((HttpException) error).code()) {
  507. case HttpURLConnection.HTTP_NOT_FOUND:
  508. Platform.runLater(() -> {
  509. Alert alert = AlertUtil.getAlertError(
  510. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  511. "Barang dengan kode tersebut tidak ditemukan.");
  512. alert.initOwner(apMain.getScene().getWindow());
  513. alert.show();
  514. });
  515. break;
  516. default:
  517. Logger.getLogger(FormTransaksiReturController.class.getName()).log(Level.SEVERE, null, error);
  518. }
  519. } else {
  520. AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow());
  521. }
  522. }
  523. @Override
  524. public void onComplete() {
  525. }
  526. };
  527. Observer<Barang> getBarangReturObserver = new Observer<>() {
  528. @Override
  529. public void onSubscribe(Disposable dspsbl) {
  530. }
  531. @Override
  532. public void onNext(Barang b) {
  533. AmigoPosCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b);
  534. for (TabelBarangRetur tbr : tbvRetur.getItems()) {
  535. if (tbr.getData().getKdBarang().equals(b.getKodeBarang())) {
  536. tbr.setNama(b.getNamaBarang());
  537. tbr.getData().setBarang(b);
  538. tbvRetur.refresh();
  539. }
  540. }
  541. }
  542. @Override
  543. public void onError(Throwable error) {
  544. if (error instanceof HttpException) {
  545. switch (((HttpException) error).code()) {
  546. case HttpURLConnection.HTTP_NOT_FOUND:
  547. Platform.runLater(() -> {
  548. Alert alert = AlertUtil.getAlertError(
  549. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  550. "Barang dengan kode tersebut tidak ditemukan.");
  551. alert.initOwner(apMain.getScene().getWindow());
  552. alert.show();
  553. });
  554. break;
  555. default:
  556. Logger.getLogger(FormTransaksiReturController.class.getName()).log(Level.SEVERE, null, error);
  557. }
  558. } else {
  559. AmigoPosRx.handleGenericError(error, apMain.getScene().getWindow());
  560. }
  561. }
  562. @Override
  563. public void onComplete() {
  564. }
  565. };
  566. }