diff --git a/app/Http/Controllers/Bill/IndexController.php b/app/Http/Controllers/Bill/IndexController.php index f7f3edc381..aa69d3aab8 100644 --- a/app/Http/Controllers/Bill/IndexController.php +++ b/app/Http/Controllers/Bill/IndexController.php @@ -34,6 +34,7 @@ use FireflyIII\Repositories\ObjectGroup\OrganisesObjectGroups; use FireflyIII\Transformers\BillTransformer; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Log; use Symfony\Component\HttpFoundation\ParameterBag; /** @@ -145,7 +146,8 @@ class IndexController extends Controller */ private function getSums(array $bills): array { - $sums = []; + $sums = []; + $range = app('preferences')->get('viewRange', '1M')->data; /** @var array $group */ foreach ($bills as $groupOrder => $group) { @@ -154,9 +156,7 @@ class IndexController extends Controller if (false === $bill['active']) { continue; } - if (0 === count($bill['pay_dates'])) { - continue; - } + /** @var TransactionCurrency $currency */ $currencyId = $bill['currency_id']; $sums[$groupOrder][$currencyId] = $sums[$groupOrder][$currencyId] ?? [ @@ -166,22 +166,67 @@ class IndexController extends Controller 'currency_symbol' => $bill['currency_symbol'], 'currency_decimal_places' => $bill['currency_decimal_places'], 'avg' => '0', + 'period' => $range, + 'per_period' => '0', ]; - - $avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2'); - $avg = bcmul($avg, (string) count($bill['pay_dates'])); - $sums[$groupOrder][$currencyId]['avg'] = bcadd($sums[$groupOrder][$currencyId]['avg'], $avg); + // only fill in avg when bill is active. + if (count($bill['pay_dates']) > 0) { + $avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2'); + $avg = bcmul($avg, (string) count($bill['pay_dates'])); + $sums[$groupOrder][$currencyId]['avg'] = bcadd($sums[$groupOrder][$currencyId]['avg'], $avg); + } + // fill in per period regardless: + $sums[$groupOrder][$currencyId]['per_period'] = bcadd($sums[$groupOrder][$currencyId]['per_period'], $this->amountPerPeriod($bill, $range)); } } return $sums; } + /** + * @param array $bill + * @param string $range + * + * @return string + */ + private function amountPerPeriod(array $bill, string $range): string + { + $avg = bcdiv(bcadd((string) $bill['amount_min'], (string) $bill['amount_max']), '2'); + + Log::debug(sprintf('Amount per period for bill #%d "%s"', $bill['id'], $bill['name'])); + Log::debug(sprintf(sprintf('Average is %s', $avg))); + // calculate amount per year: + $multiplies = [ + 'yearly' => '1', + 'half-year' => '2', + 'quarterly' => '4', + 'monthly' => '12', + 'weekly' => '52.17', + ]; + $yearAmount = bcmul($avg, $multiplies[$bill['repeat_freq']]); + Log::debug(sprintf('Amount per year is %s (%s * %s)', $yearAmount, $avg, $multiplies[$bill['repeat_freq']])); + + // per period: + $division = [ + '1Y' => '1', + '6M' => '2', + '3M' => '4', + '1M' => '12', + '1W' => '52.16', + '1D' => '365.24', + ]; + $perPeriod = bcdiv($yearAmount, $division[$range]); + + Log::debug(sprintf('Amount per %s is %s (%s / %s)', $range, $perPeriod, $yearAmount, $division[$range])); + + return $perPeriod; + } + /** * Set the order of a bill. * - * @param Request $request - * @param Bill $bill + * @param Request $request + * @param Bill $bill * * @return JsonResponse */ diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 672263ec30..a2d85ea814 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -204,6 +204,12 @@ return [ 'authorization' => 'Authorization', 'active_bills_only' => 'active bills only', 'active_exp_bills_only' => 'active and expected bills only', + 'per_period_sum_1D' => 'Expected daily costs', + 'per_period_sum_1W' => 'Expected weekly costs', + 'per_period_sum_1M' => 'Expected monthly costs', + 'per_period_sum_3M' => 'Expected quarterly costs', + 'per_period_sum_6M' => 'Expected half-yearly costs', + 'per_period_sum_1Y' => 'Expected yearly costs', 'average_per_bill' => 'average per bill', 'expected_total' => 'expected total', 'reconciliation_account_name' => ':name reconciliation (:currency)', diff --git a/resources/views/v1/list/bills.twig b/resources/views/v1/list/bills.twig index f51b54ffd8..7917cc3f8b 100644 --- a/resources/views/v1/list/bills.twig +++ b/resources/views/v1/list/bills.twig @@ -129,19 +129,36 @@ {% endfor %} {% for sum in sums[objectGroupOrder] %} -