private void createOperations(Date startDate, int numberOfDays, Context context) { for (int i = 0; i < numberOfDays; i++) { Date date = DateUtils.addDays(startDate, i); if (i % 7 == 0) { income(date, context.accounts.get(0), context.salaryCategory, new BigDecimal("16000")); } if (i % 5 == 0) { income( date, context.accounts.get(1), context.otherIncomeCategory, new BigDecimal(1000 + Math.round(Math.random() * 5000))); } for (int j = 0; j < Math.random() * 7; j++) { expense(date, context.accounts.get(1), context); if (j % 2 == 0) expense(date, context.accounts.get(0), context); } if (i % 2 == 0) { Account account2 = context.accounts.get((int) (1 + Math.random() * (context.accounts.size() - 1))); transfer(date, context.accounts.get(0), account2); } } }
private BigDecimal randomExpenseAmount(Account account, Date date, Double part) { BigDecimal balance = balanceWorker.getBalance(account.getId(), date); if (BigDecimal.ZERO.compareTo(balance) >= 0) return BigDecimal.ZERO; else { return new BigDecimal((int) (Math.random() * balance.doubleValue() * part)); } }
private void expense(final Date date, final Account account, final Context context) { persistence.runInTransaction( em -> { int categoryIdx = (int) Math.round(Math.random() * (context.expenseCategories.size() - 1)); Category category = context.expenseCategories.get(categoryIdx); if (category == null) return; int categoryWeight = context.expenseCategories.size() - categoryIdx; BigDecimal amount = randomExpenseAmount(account, date, 0.1 + (categoryWeight * 0.05)); if (BigDecimal.ZERO.compareTo(amount) >= 0) return; Operation operation = metadata.create(Operation.class); operation.setOpType(OperationType.EXPENSE); operation.setOpDate(date); operation.setAcc1(account); operation.setCategory(category); operation.setAmount1(amount); em.persist(operation); log.info("Expense: " + date + ", " + account.getName() + ", " + amount); }); }