Aplikasi POS Amigo, dibangun dengan JavaFX dengan Maven
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

283 lines
10 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 id.amigogroup.posterminal.FormUtamaController;
  8. import id.amigogroup.posterminal.api.AmigoPosRx;
  9. import id.amigogroup.posterminal.model.Barang;
  10. import id.amigogroup.posterminal.model.DNotaTunai;
  11. import id.amigogroup.posterminal.pencarian.BarangCache;
  12. import id.amigogroup.posterminal.util.AlertUtil;
  13. import id.amigogroup.posterminal.util.Fucout;
  14. import io.reactivex.Observer;
  15. import io.reactivex.disposables.Disposable;
  16. import java.net.HttpURLConnection;
  17. import java.net.SocketTimeoutException;
  18. import java.net.URL;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. import java.util.ResourceBundle;
  24. import java.util.logging.Level;
  25. import java.util.logging.Logger;
  26. import javafx.application.Platform;
  27. import javafx.beans.property.ReadOnlyObjectWrapper;
  28. import javafx.collections.FXCollections;
  29. import javafx.collections.ObservableList;
  30. import javafx.concurrent.Task;
  31. import javafx.fxml.FXML;
  32. import javafx.fxml.Initializable;
  33. import javafx.scene.control.Alert;
  34. import javafx.scene.control.Label;
  35. import javafx.scene.control.TableColumn;
  36. import javafx.scene.control.TableView;
  37. import javafx.scene.control.TextField;
  38. import javafx.scene.control.cell.PropertyValueFactory;
  39. import javafx.scene.input.KeyCode;
  40. import javafx.scene.input.KeyEvent;
  41. import javafx.scene.layout.AnchorPane;
  42. import retrofit2.HttpException;
  43. /**
  44. * FXML Controller class
  45. *
  46. * @author ronal
  47. */
  48. public class FormTransaksiReturController implements Initializable {
  49. @FXML
  50. private AnchorPane apMain;
  51. @FXML
  52. private TextField fldNotaPenjualan;
  53. @FXML
  54. private TableView<TabelBarangTunai> tbvPenjualan;
  55. @FXML
  56. private TableColumn<TabelBarangTunai, Integer> tcNo;
  57. @FXML
  58. private TableColumn<TabelBarangTunai, String> tcKode;
  59. @FXML
  60. private TableColumn<TabelBarangTunai, String> tcNama;
  61. @FXML
  62. private TableColumn<TabelBarangTunai, String> tcUkur;
  63. @FXML
  64. private TableColumn<TabelBarangTunai, String> tcJumlah;
  65. @FXML
  66. private TableColumn<TabelBarangTunai, String> tcHarga;
  67. @FXML
  68. private TableColumn<TabelBarangTunai, String> tcDisc1;
  69. @FXML
  70. private TableColumn<TabelBarangTunai, String> tcDisc2;
  71. @FXML
  72. private TableColumn<TabelBarangTunai, String> tcSubTotal;
  73. @FXML
  74. private TableColumn<TabelBarangTunai, TextField> tcPramuniaga;
  75. // @FXML
  76. // private TableView<?> tbvRetur;
  77. // @FXML
  78. // private TableColumn<?, ?> tcNoRetur;
  79. // @FXML
  80. // private TableColumn<?, ?> tcKodeRetur;
  81. // @FXML
  82. // private TableColumn<?, ?> tcNamaRetur;
  83. // @FXML
  84. // private TableColumn<?, ?> tcUkurRetur;
  85. // @FXML
  86. // private TableColumn<?, ?> tcJumlahRetur;
  87. // @FXML
  88. // private TableColumn<?, ?> tcHargaRetur;
  89. // @FXML
  90. // private TableColumn<?, ?> tcDisc1Retur;
  91. // @FXML
  92. // private TableColumn<?, ?> tcDisc2Retur;
  93. // @FXML
  94. // private TableColumn<?, ?> tcSubtotalRetur;
  95. // @FXML
  96. // private TableColumn<?, ?> tcPramuniagaRetur;
  97. private final AmigoPosRx posRx = new AmigoPosRx();
  98. private final ObservableList<TabelBarangTunai> daftarTabelPenjualan = FXCollections.observableArrayList();
  99. private List<DetailTransaksi> daftarDetailTransaksi = new ArrayList<>();
  100. /**
  101. * Initializes the controller class.
  102. */
  103. @Override
  104. public void initialize(URL url, ResourceBundle rb) {
  105. tcNo.setCellValueFactory((TableColumn.CellDataFeatures<TabelBarangTunai, Integer> cell) -> {
  106. return new ReadOnlyObjectWrapper(tbvPenjualan.getItems().indexOf(cell.getValue()) + 1);
  107. });
  108. tcKode.setCellValueFactory(new PropertyValueFactory<>("kode"));
  109. tcNama.setCellValueFactory(new PropertyValueFactory<>("nama"));
  110. tcUkur.setCellValueFactory(new PropertyValueFactory<>("ukur"));
  111. tcJumlah.setCellValueFactory(new PropertyValueFactory<>("jumlah"));
  112. tcHarga.setCellValueFactory(new PropertyValueFactory<>("harga"));
  113. tcDisc1.setCellValueFactory(new PropertyValueFactory<>("disc1"));
  114. tcDisc2.setCellValueFactory(new PropertyValueFactory<>("disc2"));
  115. tcSubTotal.setCellValueFactory(new PropertyValueFactory<>("subTotal"));
  116. tcPramuniaga.setCellValueFactory(new PropertyValueFactory<>("fldPramuniaga"));
  117. tbvPenjualan.setItems(daftarTabelPenjualan);
  118. Platform.runLater(() -> {
  119. fldNotaPenjualan.requestFocus();
  120. });
  121. }
  122. private void mapCurrentDataToDetailTransaksi() {
  123. }
  124. int count = 0;
  125. @FXML
  126. Label lbl;
  127. private void refreshData(List<DNotaTunai> daftarNotaTunai) {
  128. daftarTabelPenjualan.clear();
  129. for (DNotaTunai dNotaTunai : daftarNotaTunai) {
  130. TextField fldPramuniaga = new TextField(dNotaTunai.getKodePram());
  131. String namaBarang = "...";
  132. if (BarangCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) {
  133. namaBarang = Fucout.getText(BarangCache.getInstance().getDaftarBarang()
  134. .get(dNotaTunai.getKdBarang()).getNamaBarang());
  135. }
  136. daftarTabelPenjualan.add(new TabelBarangTunai(
  137. Fucout.getText(dNotaTunai.getKdBarang()),
  138. namaBarang,
  139. Fucout.getText(dNotaTunai.getNoBarang()),
  140. Fucout.getText(String.valueOf(dNotaTunai.getJumlah())),
  141. Fucout.getText(Fucout.formatRibuan(dNotaTunai.getHargaJual())),
  142. Fucout.getText(Fucout.formatPersentase(dNotaTunai.getDiskon())),
  143. Fucout.getText(Fucout.formatPersentase(dNotaTunai.getDiskon2())),
  144. null,
  145. Fucout.getText(Fucout.formatRibuan(
  146. dNotaTunai.getHargaJual() * dNotaTunai.getJumlah()
  147. )),
  148. fldPramuniaga));
  149. if (!BarangCache.getInstance().getDaftarBarang().containsKey(dNotaTunai.getKdBarang())) {
  150. posRx.getBarangByKodeBarang(dNotaTunai.getKdBarang()).subscribe(getBarangObserver);
  151. }
  152. }
  153. }
  154. @FXML
  155. void fldNotaPenjualanOnKeyPressed(KeyEvent event) {
  156. if (event.getCode() == KeyCode.ENTER) {
  157. posRx.getDNotaTunaiByNoNota(fldNotaPenjualan.getText()).subscribe(getDNotaTunaiObserver);
  158. }
  159. }
  160. Observer<List<DNotaTunai>> getDNotaTunaiObserver = new Observer<>() {
  161. @Override
  162. public void onSubscribe(Disposable dspsbl) {
  163. }
  164. @Override
  165. public void onNext(List<DNotaTunai> daftarDNotaTunai) {
  166. refreshData(daftarDNotaTunai);
  167. }
  168. @Override
  169. public void onError(Throwable error) {
  170. if (error instanceof HttpException) {
  171. switch (((HttpException) error).code()) {
  172. case HttpURLConnection.HTTP_NOT_FOUND:
  173. Platform.runLater(() -> {
  174. Alert alert = AlertUtil.getAlertError(
  175. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  176. "Data nota tidak ditemukan.");
  177. alert.initOwner(apMain.getScene().getWindow());
  178. alert.show();
  179. });
  180. }
  181. } else if (error instanceof SocketTimeoutException) {
  182. Platform.runLater(() -> {
  183. Alert alert = AlertUtil.getAlertError(
  184. AlertUtil.ERROR_KONEKSI_TIMEOUT_TITLE,
  185. AlertUtil.ERROR_KONEKSI_TIMEOUT_MESSAGE);
  186. alert.initOwner(apMain.getScene().getWindow());
  187. alert.show();
  188. });
  189. } else {
  190. Platform.runLater(() -> {
  191. Alert alert = AlertUtil.getAlertError(
  192. AlertUtil.ERROR_TIDAK_TERDUGA_TITLE,
  193. AlertUtil.ERROR_TIDAK_TERDUGA_MESSAGE);
  194. alert.initOwner(apMain.getScene().getWindow());
  195. alert.show();
  196. Logger.getLogger(FormUtamaController.class
  197. .getName()).log(Level.SEVERE, null, error);
  198. });
  199. }
  200. }
  201. @Override
  202. public void onComplete() {
  203. }
  204. };
  205. Observer<Barang> getBarangObserver = new Observer<>() {
  206. @Override
  207. public void onSubscribe(Disposable dspsbl) {
  208. }
  209. @Override
  210. public void onNext(Barang b) {
  211. BarangCache.getInstance().getDaftarBarang().put(b.getKodeBarang(), b);
  212. for (TabelBarangTunai tbt : tbvPenjualan.getItems()) {
  213. if (tbt.getKode().equals(b.getKodeBarang())) {
  214. tbt.setNama(b.getNamaBarang());
  215. tbvPenjualan.refresh();
  216. }
  217. }
  218. }
  219. @Override
  220. public void onError(Throwable error) {
  221. if (error instanceof HttpException) {
  222. switch (((HttpException) error).code()) {
  223. case HttpURLConnection.HTTP_NOT_FOUND:
  224. Platform.runLater(() -> {
  225. Alert alert = AlertUtil.getAlertError(
  226. AlertUtil.ERROR_TIDAK_DITEMUKAN_TITLE,
  227. "Barang dengan kode tersebut tidak ditemukan.");
  228. alert.initOwner(apMain.getScene().getWindow());
  229. alert.show();
  230. });
  231. }
  232. } else if (error instanceof SocketTimeoutException) {
  233. Platform.runLater(() -> {
  234. Alert alert = AlertUtil.getAlertError(
  235. AlertUtil.ERROR_KONEKSI_TIMEOUT_TITLE,
  236. AlertUtil.ERROR_KONEKSI_TIMEOUT_MESSAGE);
  237. alert.initOwner(apMain.getScene().getWindow());
  238. alert.show();
  239. });
  240. } else {
  241. Platform.runLater(() -> {
  242. Alert alert = AlertUtil.getAlertError(
  243. AlertUtil.ERROR_TIDAK_TERDUGA_TITLE,
  244. AlertUtil.ERROR_TIDAK_TERDUGA_MESSAGE);
  245. alert.initOwner(apMain.getScene().getWindow());
  246. alert.show();
  247. Logger.getLogger(FormUtamaController.class
  248. .getName()).log(Level.SEVERE, null, error);
  249. });
  250. }
  251. }
  252. @Override
  253. public void onComplete() {
  254. }
  255. };
  256. }