AnalysisTestController.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. package controllers;
  2. import java.math.RoundingMode;
  3. import java.net.URL;
  4. import java.text.DecimalFormat;
  5. import java.text.DecimalFormatSymbols;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Locale;
  9. import java.util.Map;
  10. import java.util.Optional;
  11. import java.util.ResourceBundle;
  12. import data.GuiMysql;
  13. import javafx.collections.FXCollections;
  14. import javafx.collections.ObservableList;
  15. import javafx.event.ActionEvent;
  16. import javafx.fxml.FXML;
  17. import javafx.fxml.Initializable;
  18. import javafx.scene.control.Button;
  19. import javafx.scene.control.DatePicker;
  20. import javafx.scene.control.TableCell;
  21. import javafx.scene.control.TableColumn;
  22. import javafx.scene.control.TableView;
  23. import javafx.scene.control.TextField;
  24. import javafx.scene.control.cell.MapValueFactory;
  25. import javafx.scene.control.cell.PropertyValueFactory;
  26. import javafx.scene.control.cell.TextFieldTableCell;
  27. import javafx.util.Callback;
  28. import javafx.util.converter.FloatStringConverter;
  29. import objects.League;
  30. import objects.SoccerMatch;
  31. import objects.SoccerMatchAnalysis;
  32. import objects.bets.Bet;
  33. import objects.bets.Bet.Status;
  34. @SuppressWarnings("rawtypes")
  35. public class AnalysisTestController implements Initializable {
  36. private static final float MIN_COVER_ODDS = 1.25f;
  37. private static final float MAX_COVER_ODDS = 2.25f;
  38. private static final DecimalFormat FLOAT_FORMATTER = new DecimalFormat("0.00");
  39. @FXML
  40. TableView<SoccerMatch> gameViewTable;
  41. TableColumn<SoccerMatch, String> homeTeamNameColumn = new TableColumn<>("Home Team");
  42. TableColumn<SoccerMatch, String> awayTeamNameColumn = new TableColumn<>("Away Team");
  43. TableColumn<SoccerMatch, Float> odds1Column = new TableColumn<>("1");
  44. TableColumn<SoccerMatch, Float> oddsXColumn = new TableColumn<>("X");
  45. TableColumn<SoccerMatch, Float> odds2Column = new TableColumn<>("2");
  46. TableColumn<SoccerMatch, String> leagueNameColumn = new TableColumn<>("Country");
  47. TableColumn<SoccerMatch, String> countryNameColumn = new TableColumn<>("League");
  48. TableColumn<SoccerMatch, String> analyzeValueColumn = new TableColumn<>("Value");
  49. TableColumn<SoccerMatch, Float> matchBetAmountColumn = new TableColumn<>("Bet Amount");
  50. TableColumn<SoccerMatch, Void> addBetColumn = new TableColumn<>("Add Bet");
  51. @FXML
  52. TableView<Bet> activeBetsTable;
  53. TableColumn<Bet, String> matchupColumn = new TableColumn<>("Matchup");
  54. TableColumn<Bet, Float> oddsColumn = new TableColumn<>("Odds");
  55. TableColumn<Bet, Float> betAmountColumn = new TableColumn<>("BetAmount");
  56. TableColumn<Bet, Bet.Status> statusColumn = new TableColumn<>("Status");
  57. TableColumn<Bet, Integer> homeScoreColumn = new TableColumn<>("Home Score");
  58. TableColumn<Bet, Integer> awayScoreColumn = new TableColumn<>("Away Score");
  59. TableColumn<Bet, Integer> betCoveredNumberColumn = new TableColumn<>("Bet Covered Number");
  60. @FXML
  61. TableView<Map<String, Object>> leagueBetStatsTable;
  62. @FXML
  63. TableColumn<Map, String> statsLeagueNameColumn = new TableColumn<>("League");
  64. @FXML
  65. TableColumn<Map, Integer> statsHomeWinColumn = new TableColumn<>("Home Win");
  66. @FXML
  67. TableColumn<Map, Integer> statsHomeLossColumn = new TableColumn<>("Home Loss");
  68. @FXML
  69. TableColumn<Map, Float> statsHomePercentColumn = new TableColumn<>("Home Percent");
  70. @FXML
  71. TableColumn<Map, Integer> statsAwayWinColumn = new TableColumn<>("Away Win");
  72. @FXML
  73. TableColumn<Map, Integer> statsAwayLossColumn = new TableColumn<>("Away Loss");
  74. @FXML
  75. TableColumn<Map, Float> statsAwayPercentColumn = new TableColumn<>("Away Percent");
  76. @FXML
  77. TableColumn<Map, Float> statsTotalPercentColumn = new TableColumn<>("Total Percent");
  78. @FXML
  79. Button checkBetsButton;
  80. @FXML
  81. Button getMatchesButton;
  82. @FXML
  83. DatePicker date;
  84. @FXML
  85. TextField bankTextField;
  86. @FXML
  87. TextField bettingPercentTextField;
  88. private float currentBetAmount = 10f;
  89. @Override
  90. public void initialize(URL location, ResourceBundle resources) {
  91. FLOAT_FORMATTER.setRoundingMode(RoundingMode.UP);
  92. DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.ENGLISH);
  93. dfs.setDecimalSeparator('.');
  94. dfs.setGroupingSeparator(',');
  95. FLOAT_FORMATTER.setDecimalFormatSymbols(dfs);
  96. bettingPercentTextField.textProperty().addListener((observable, oldValue, newValue) -> {
  97. if (newValue.length() > 0) {
  98. checkValidBetAmount();
  99. }
  100. });
  101. date.valueProperty().addListener((observable, oldValue, newValue) -> {
  102. if (oldValue != newValue) {
  103. gameViewTable.getItems().clear();
  104. }
  105. });
  106. gameViewTable.getSelectionModel().selectedItemProperty().addListener((obj, oldValue, newValue) -> {
  107. if (oldValue != null) {
  108. oldValue.setBetAmount(currentBetAmount);
  109. }
  110. if (newValue != null) {
  111. newValue.setBetAmount(getNewBetValue(newValue));
  112. }
  113. gameViewTable.refresh();
  114. activeBetsTable.refresh();
  115. });
  116. homeTeamNameColumn.setCellValueFactory(new PropertyValueFactory<>("homeTeamName"));
  117. awayTeamNameColumn.setCellValueFactory(new PropertyValueFactory<>("awayTeamName"));
  118. odds1Column.setCellValueFactory(new PropertyValueFactory<>("odds1"));
  119. oddsXColumn.setCellValueFactory(new PropertyValueFactory<>("oddsX"));
  120. odds2Column.setCellValueFactory(new PropertyValueFactory<>("odds2"));
  121. leagueNameColumn.setCellValueFactory(new PropertyValueFactory<>("leagueName"));
  122. countryNameColumn.setCellValueFactory(new PropertyValueFactory<>("countryName"));
  123. analyzeValueColumn.setCellValueFactory(new PropertyValueFactory<>("analysisValue"));
  124. matchBetAmountColumn.setCellValueFactory(new PropertyValueFactory<>("betAmount"));
  125. Callback<TableColumn<SoccerMatch, Void>, TableCell<SoccerMatch, Void>> cellFactory = new Callback<TableColumn<SoccerMatch, Void>, TableCell<SoccerMatch, Void>>() {
  126. @Override
  127. public TableCell<SoccerMatch, Void> call(final TableColumn<SoccerMatch, Void> param) {
  128. return new TableCell<SoccerMatch, Void>() {
  129. private final Button btn = new Button("Submit");
  130. {
  131. btn.setOnAction((ActionEvent event) -> {
  132. SoccerMatch data = getTableView().getItems().get(getIndex());
  133. addToBets(data);
  134. });
  135. }
  136. @Override
  137. public void updateItem(Void item, boolean empty) {
  138. super.updateItem(item, empty);
  139. if (empty) {
  140. setGraphic(null);
  141. } else {
  142. setGraphic(btn);
  143. }
  144. }
  145. };
  146. }
  147. };
  148. addBetColumn.setCellFactory(cellFactory);
  149. gameViewTable.getColumns().addAll(homeTeamNameColumn, awayTeamNameColumn, odds1Column, oddsXColumn, odds2Column,
  150. countryNameColumn, leagueNameColumn, analyzeValueColumn, matchBetAmountColumn, addBetColumn);
  151. gameViewTable.setEditable(true);
  152. odds1Column.setCellFactory(TextFieldTableCell.<SoccerMatch, Float>forTableColumn(new FloatStringConverter()));
  153. odds1Column.setOnEditCommit(
  154. e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setOdds1(e.getNewValue()));
  155. oddsXColumn.setCellFactory(TextFieldTableCell.<SoccerMatch, Float>forTableColumn(new FloatStringConverter()));
  156. oddsXColumn.setOnEditCommit(
  157. e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setOddsX(e.getNewValue()));
  158. odds2Column.setCellFactory(TextFieldTableCell.<SoccerMatch, Float>forTableColumn(new FloatStringConverter()));
  159. odds2Column.setOnEditCommit(
  160. e -> e.getTableView().getItems().get(e.getTablePosition().getRow()).setOdds2(e.getNewValue()));
  161. matchupColumn.setCellValueFactory(new PropertyValueFactory<>("matchup"));
  162. matchupColumn.setMinWidth(100d);
  163. oddsColumn.setCellValueFactory(new PropertyValueFactory<>("betOdds"));
  164. betAmountColumn.setCellValueFactory(new PropertyValueFactory<>("betAmount"));
  165. homeScoreColumn.setCellValueFactory(new PropertyValueFactory<>("homeScore"));
  166. awayScoreColumn.setCellValueFactory(new PropertyValueFactory<>("awayScore"));
  167. betCoveredNumberColumn.setCellValueFactory(new PropertyValueFactory<>("betCoveredNumber"));
  168. statusColumn.setCellValueFactory(new PropertyValueFactory<>("status"));
  169. activeBetsTable.getColumns().addAll(matchupColumn, oddsColumn, betAmountColumn, statusColumn, homeScoreColumn,
  170. awayScoreColumn, betCoveredNumberColumn);
  171. getActiveBets();
  172. statsLeagueNameColumn.setCellValueFactory(new MapValueFactory<>("statsLeagueName"));
  173. statsHomeWinColumn.setCellValueFactory(new MapValueFactory<>("statsHomeWin"));
  174. statsHomeLossColumn.setCellValueFactory(new MapValueFactory<>("statsHomeLoss"));
  175. statsAwayWinColumn.setCellValueFactory(new MapValueFactory<>("statsAwayWin"));
  176. statsAwayLossColumn.setCellValueFactory(new MapValueFactory<>("statsAwayLoss"));
  177. statsHomePercentColumn.setCellValueFactory(new MapValueFactory<>("statsHomePercent"));
  178. statsAwayPercentColumn.setCellValueFactory(new MapValueFactory<>("statsAwayPercent"));
  179. statsTotalPercentColumn.setCellValueFactory(new MapValueFactory<>("statsTotalPercent"));
  180. initializeStatsPanel();
  181. }
  182. private void addMatchesToTable(List<SoccerMatch> matches) {
  183. ObservableList<SoccerMatch> currentMatches = FXCollections.<SoccerMatch>observableArrayList();
  184. for (SoccerMatch soccerMatch : matches) {
  185. int analyzeValue = getAnalyzeValue(soccerMatch);
  186. soccerMatch.setAnalysisValue(analyzeValue);
  187. if (currentBetAmount > 0) {
  188. soccerMatch.setBetAmount(currentBetAmount);
  189. }
  190. currentMatches.add(soccerMatch);
  191. }
  192. gameViewTable.getItems().addAll(currentMatches);
  193. }
  194. private void addToBets(SoccerMatch data) {
  195. if (data.getAnalysisValueInt() > 0) {
  196. setNewBet(data, true);
  197. } else if (data.getAnalysisValueInt() < 0f) {
  198. setNewBet(data, false);
  199. } else {
  200. System.out.println("Can't add bets with analysts value " + data.getAnalysisValueInt());
  201. }
  202. }
  203. private void checkBet(Bet b) {
  204. if (b.getHomeScore() >= 0 && b.getAwayScore() >= 0
  205. && (b.getBet().equals("1") && b.getHomeScore() > b.getAwayScore())
  206. || (b.getBet().equals("2") && b.getHomeScore() < b.getAwayScore())) { // Win
  207. b.setStatus(Bet.Status.DONE);
  208. Float win = (b.getBetOdds() * b.getBetAmount());
  209. updateBank(win);
  210. } else if (b.getHomeScore() >= 0 && b.getAwayScore() >= 0) { // Loss
  211. b.setStatus(Bet.Status.LOST);
  212. }
  213. GuiMysql.getInstance().updateBetStatus(b.getId(), b.getStatus());
  214. updateStatsPanel(b);
  215. }
  216. @FXML
  217. private void CheckBetsAction() {
  218. activeBetsTable.getItems().stream().filter(p -> p.getStatus() == Bet.Status.OPEN).forEach(this::checkBet);
  219. activeBetsTable.refresh();
  220. updateBetAmount();
  221. }
  222. private void checkValidBetAmount() {
  223. try {
  224. float bankValue = Float.parseFloat(bankTextField.getText());
  225. float betPercent = Float.parseFloat(bettingPercentTextField.getText());
  226. final float betAmount = Float.parseFloat(FLOAT_FORMATTER.format(bankValue * (betPercent / 100f)));
  227. currentBetAmount = betAmount;
  228. gameViewTable.getItems().forEach(i -> {
  229. i.setBetAmount(betAmount);
  230. });
  231. gameViewTable.refresh();
  232. } catch (NumberFormatException e) {
  233. // Ignore
  234. }
  235. }
  236. private void getActiveBets() {
  237. List<Bet> analysisBets = GuiMysql.getInstance().getAnalysisBets();
  238. activeBetsTable.getItems().addAll(analysisBets);
  239. activeBetsTable.refresh();
  240. }
  241. private Integer getAnalyzeValue(SoccerMatch soccerMatch) {
  242. int result = 0;
  243. SoccerMatchAnalysis analysis = new SoccerMatchAnalysis(soccerMatch);
  244. League leagueInfo = GuiMysql.getInstance().getLeagueInfo(soccerMatch.getHomeTeam().getTeamLeagueId());
  245. if (leagueInfo != null) {
  246. int homeWinsCount = analysis.winLossRatio(leagueInfo.getWinLossRatio(), true);
  247. int awayWinsCount = analysis.winLossRatio(leagueInfo.getWinLossRatio(), false);
  248. int homeWinLossRatioCount = analysis.winLossRationHomeAndAway(true,
  249. leagueInfo.getWinLossRatioHomeAndAway());
  250. int awayWinLossRatioCount = analysis.winLossRationHomeAndAway(false,
  251. leagueInfo.getWinLossRatioHomeAndAway());
  252. int homeScoringTotal = analysis.scoringTotal(leagueInfo.getScoringTotal(), true);
  253. int awayScoringTotal = analysis.scoringTotal(leagueInfo.getScoringTotal(), false);
  254. int scoringDiffLastGames = analysis.getScoringDiffLastGames(leagueInfo.getScoringDiffLastGame());
  255. int winsCountDiff = homeWinsCount - awayWinsCount;
  256. int winLossRatioDiff = homeWinLossRatioCount - awayWinLossRatioCount;
  257. int scoringTotalDiff = homeScoringTotal - awayScoringTotal;
  258. if (scoringDiffLastGames < 0 && winsCountDiff < 0 && winLossRatioDiff < 0 && scoringTotalDiff < 0) {
  259. result = (scoringDiffLastGames + winsCountDiff + winLossRatioDiff + scoringTotalDiff) / 4;
  260. } else if (scoringDiffLastGames > 0 && winsCountDiff > 0 && winLossRatioDiff > 0
  261. && scoringTotalDiff > 0) {
  262. result = (scoringDiffLastGames + winsCountDiff + winLossRatioDiff + scoringTotalDiff) / 4;
  263. }
  264. }
  265. return result;
  266. }
  267. private float getBank() {
  268. float bank = 0;
  269. try {
  270. bank = Float.parseFloat(bankTextField.getText());
  271. } catch (NumberFormatException e) {
  272. }
  273. return bank;
  274. }
  275. @FXML
  276. private void GetMatchesAction() {
  277. List<SoccerMatch> matches = GuiMysql.getInstance().getMatches(1, date.getValue().toString(), "ASC", true);
  278. addMatchesToTable(matches);
  279. }
  280. private Float getNewBetValue(SoccerMatch newValue) {
  281. float odds = 0f;
  282. float currentDebt = 0f;
  283. float result = currentBetAmount;
  284. if (((newValue.getAnalysisValueInt() > 0 && newValue.getOdds1() > MIN_COVER_ODDS
  285. && newValue.getOdds1() < MAX_COVER_ODDS) ||
  286. (newValue.getAnalysisValueInt() < 0 && newValue.getOdds2() > MIN_COVER_ODDS
  287. && newValue.getOdds2() < MAX_COVER_ODDS))
  288. &&
  289. activeBetsTable.getItems().stream().filter(p -> p.getStatus() == Bet.Status.LOST).count() > 0) {
  290. Bet bet = activeBetsTable.getItems().stream().filter(p -> p.getStatus() == Bet.Status.LOST).findFirst()
  291. .get();
  292. Bet tempBet = bet;
  293. int betCoverNumber = 0;
  294. while (tempBet.getCoveredBetId() > 0) {
  295. tempBet = GuiMysql.getInstance().getAnalysisBet(tempBet.getCoveredBetId());
  296. currentDebt += tempBet.getBetAmount();
  297. betCoverNumber++;
  298. }
  299. bet.setBetCoveredNumber(betCoverNumber);
  300. if (betCoverNumber > 3 && newValue.getAnalysisValueInt() < 10 && newValue.getAnalysisValueInt() > -10) {
  301. return Float.parseFloat(FLOAT_FORMATTER.format(result));
  302. }
  303. currentDebt += bet.getBetAmount();
  304. newValue.setPreviousBet(bet);
  305. if (newValue.getAnalysisValueInt() > 0f) {
  306. odds = newValue.getOdds1();
  307. } else if (newValue.getAnalysisValueInt() < 0f) {
  308. odds = newValue.getOdds2();
  309. }
  310. if (currentDebt > 0f && odds > 0f) {
  311. result = currentDebt / (odds - 1f); // + currentBetAmount;
  312. } else if (newValue.getBetAmount() != null) {
  313. result = newValue.getBetAmount();
  314. }
  315. }
  316. return Float.parseFloat(FLOAT_FORMATTER.format(result));
  317. }
  318. private void initializeStatsPanel() {
  319. List<Bet> bets = GuiMysql.getInstance().getAnalysisBetStatistics();
  320. for (Bet bet : bets) {
  321. updateStatsPanel(bet);
  322. }
  323. }
  324. @FXML
  325. private void RemoveDoneBetsAction() {
  326. List<Bet> doneBets = activeBetsTable.getItems().stream()
  327. .filter(p -> p.getStatus() == Status.DONE || p.getStatus() == Status.COVERED)
  328. .toList();
  329. for (Bet bet : doneBets) {
  330. if (bet.getStatus().equals(Status.COVERED)) {
  331. GuiMysql.getInstance().updateBetStatus(bet.getId(), Status.DONE);
  332. }
  333. activeBetsTable.getItems().remove(bet);
  334. }
  335. activeBetsTable.getItems().sort((b1, b2) -> Float.compare(b2.getBetAmount(), b1.getBetAmount()));
  336. activeBetsTable.refresh();
  337. }
  338. private void setNewBet(SoccerMatch data, boolean isHomeBet) {
  339. int betId = GuiMysql.getInstance()
  340. .addAnalysisBet(new Bet(-1, data, isHomeBet ? "1" : "2", data.getBetAmount(),
  341. isHomeBet ? data.getOdds1() : data.getOdds2()));
  342. Bet bet = GuiMysql.getInstance().getAnalysisBet(betId);
  343. if (data.getPreviousBet() != null) {
  344. data.getPreviousBet().setStatus(Status.COVERED);
  345. bet.setCoveredBetId(data.getPreviousBet().getId());
  346. GuiMysql.getInstance().setBetCovered(bet.getId(), bet.getCoveredBetId());
  347. try {
  348. activeBetsTable.getItems().set(activeBetsTable.getItems().indexOf(data.getPreviousBet()),
  349. data.getPreviousBet());
  350. } catch (IndexOutOfBoundsException e) {
  351. data.setPreviousBet(null); // TODO, ingen bra lösning kanske.. Men enkel att göra :)
  352. } finally {
  353. GuiMysql.getInstance().updateBetStatus(data.getPreviousBet().getId(), Status.COVERED);
  354. }
  355. }
  356. activeBetsTable.getItems().add(bet);
  357. updateBank(-bet.getBetAmount());
  358. }
  359. private void updateBank(float value) {
  360. float bank;
  361. try {
  362. bank = Float.parseFloat(bankTextField.getText());
  363. bank += value;
  364. bankTextField.setText(String.valueOf(bank));
  365. } catch (NumberFormatException e) {
  366. }
  367. }
  368. private void updateBetAmount() {
  369. try {
  370. float betLevel = Float.parseFloat(bettingPercentTextField.getText());
  371. currentBetAmount = Float.parseFloat(FLOAT_FORMATTER.format(getBank() * (betLevel / 100f)));
  372. } catch (NumberFormatException e) {
  373. }
  374. }
  375. private void updateStatsPanel(Bet b) {
  376. String leagueName = b.getMatch().getLeagueName();
  377. Optional<Map<String, Object>> leagueStatsRow = leagueBetStatsTable.getItems().stream()
  378. .filter(p -> p.get("statsLeagueName") != null && leagueName.equals(p.get("statsLeagueName")))
  379. .findFirst();
  380. if (leagueStatsRow.isEmpty()) {
  381. Map<String, Object> newItem = new HashMap<>();
  382. newItem.put("statsLeagueName", leagueName);
  383. newItem.put("statsHomeWin", b.isBetOnHomeTeam() && b.getHomeScore() > b.getAwayScore() ? 1 : 0);
  384. newItem.put("statsHomeLoss",
  385. b.isBetOnHomeTeam() && (b.getHomeScore() < b.getAwayScore() || b.getHomeScore() == b.getAwayScore())
  386. ? 1
  387. : 0);
  388. int statsHomeWin = (int) newItem.get("statsHomeWin");
  389. int statsHomeLoss = (int) newItem.get("statsHomeLoss");
  390. if (statsHomeWin > 0 || statsHomeLoss > 0) {
  391. newItem.put("statsHomePercent", (statsHomeWin / (float) (statsHomeWin + statsHomeLoss)) * 100);
  392. }
  393. newItem.put("statsAwayWin", b.isBetOnAwayTeam() && b.getHomeScore() < b.getAwayScore() ? 1 : 0);
  394. newItem.put("statsAwayLoss",
  395. b.isBetOnAwayTeam() && (b.getHomeScore() > b.getAwayScore() || b.getHomeScore() == b.getAwayScore())
  396. ? 1
  397. : 0);
  398. int statsAwayWin = (int) newItem.get("statsAwayWin");
  399. int statsAwayLoss = (int) newItem.get("statsAwayLoss");
  400. if (statsAwayWin > 0 || statsAwayLoss > 0) {
  401. newItem.put("statsAwayPercent", (statsAwayWin / (float) (statsAwayWin + statsAwayLoss)) * 100);
  402. }
  403. if (statsHomeWin + statsHomeLoss + statsAwayWin + statsAwayLoss > 0) {
  404. newItem.put("statsTotalPercent",
  405. ((statsHomeWin + statsAwayWin)
  406. / (float) (statsHomeWin + statsHomeLoss + statsAwayWin + statsAwayLoss)) * 100);
  407. }
  408. ObservableList<Map<String, Object>> items = leagueBetStatsTable.getItems();
  409. items.add(newItem);
  410. } else {
  411. Map<String, Object> map = leagueStatsRow.get();
  412. if (b.isBetOnHomeTeam() && b.getHomeScore() > b.getAwayScore()) {
  413. map.put("statsHomeWin", (int) map.get("statsHomeWin") + 1);
  414. } else if (b.isBetOnHomeTeam()
  415. && (b.getHomeScore() < b.getAwayScore() || b.getHomeScore() == b.getAwayScore())) {
  416. map.put("statsHomeLoss", (int) map.get("statsHomeLoss") + 1);
  417. } else if (b.isBetOnAwayTeam() && b.getHomeScore() < b.getAwayScore()) {
  418. map.put("statsAwayWin", (int) map.get("statsAwayWin") + 1);
  419. } else if (b.isBetOnAwayTeam()
  420. && (b.getHomeScore() > b.getAwayScore() || b.getHomeScore() == b.getAwayScore())) {
  421. map.put("statsAwayLoss", (int) map.get("statsAwayLoss") + 1);
  422. }
  423. int statsHomeWin = (int) map.get("statsHomeWin");
  424. int statsHomeLoss = (int) map.get("statsHomeLoss");
  425. if (statsHomeWin > 0 || statsHomeLoss > 0) {
  426. map.put("statsHomePercent", (statsHomeWin / (float) (statsHomeWin + statsHomeLoss)) * 100);
  427. }
  428. int statsAwayWin = (int) map.get("statsAwayWin");
  429. int statsAwayLoss = (int) map.get("statsAwayLoss");
  430. if (statsAwayWin > 0 || statsAwayLoss > 0) {
  431. map.put("statsAwayPercent", (statsAwayWin / (float) (statsAwayWin + statsAwayLoss)) * 100);
  432. }
  433. if (statsHomeWin + statsHomeLoss + statsAwayWin + statsAwayLoss > 0) {
  434. map.put("statsTotalPercent",
  435. ((statsHomeWin + statsAwayWin)
  436. / (float) (statsHomeWin + statsHomeLoss + statsAwayWin + statsAwayLoss)) * 100);
  437. }
  438. leagueBetStatsTable.getItems().set(leagueBetStatsTable.getItems().indexOf(map), map);
  439. }
  440. leagueBetStatsTable.refresh();
  441. }
  442. }