'That recurring expense no longer exists.']);
exit;
}
$id = intval($row['recurring_expense_id']);
$client_id = intval($row['recurring_expense_client_id']);
$can_edit = lookupUserPermission('module_financial') >= 2;
$can_delete = lookupUserPermission('module_financial') >= 3;
$state = recurringExpenseState($row);
$currency = (string) $row['recurring_expense_currency_code'];
$amount = floatval($row['recurring_expense_amount']);
$monthly = $amount / recurringInvoiceMonths($row['recurring_expense_frequency']);
$next = (string) $row['recurring_expense_next_date'];
$behind = $state === 'active' && $next < date('Y-m-d');
$upcoming = recurringExpenseUpcoming($row, 4);
$made = recurringExpenseMade($id, 8);
$can_sales = lookupUserPermission('module_sales') >= 1;
$covered_by = intval($row['recurring_expense_recurring_invoice_id']);
$cover = $covered_by && $row['recurring_invoice_number'] !== null ? recurringInvoiceCosts($covered_by) : null;
$markup = floatval($row['recurring_expense_markup']);
$post_url = function ($action, $extra = '') use ($id) {
return "post.php?$action=$id$extra&csrf_token=" . $_SESSION['csrf_token'];
};
ob_start();
?>
It was due on = escapeHtml(date('M j, Y', strtotime($next))) ?> - too far back for the nightly run to record by itself.
Record Now records that run and moves on to the next, so press it for each missed run. Or Move On skips them all without recording them.
It was due on = escapeHtml(date('M j, Y', strtotime($next))) ?> - the next nightly run records it, or Record Now does it now.
= escapeHtml(recurringExpenseScheduleText($row)) ?>= $row['recurring_expense_frequency'] !== 'month' ? ' · ' . escapeHtml(billingMoney($monthly, $currency)) . ' a month' : '' ?>
= escapeHtml(implode(', ', array_map(function ($d) { return date('M j', strtotime($d)); }, $upcoming))) ?>= count($upcoming) === 4 ? '...' : ' · then it ends' ?>
Ended= $row['recurring_expense_last_sent'] ? ' - the last one was on ' . escapeHtml(date('M j, Y', strtotime($row['recurring_expense_last_sent']))) : '' ?>
Paused - next on = escapeHtml(date('M j, Y', strtotime($next))) ?> when it is resumed
= expenseCategoryDot($row['category_color'], $row['category_icon'] ?? '') ?>= escapeHtml($row['category_name'] ?: 'No category') ?>
= escapeHtml($row['recurring_expense_reference']) ?>
= escapeHtml($row['account_name'] ?: 'No account') ?>= $row['recurring_expense_payment_method'] ? ' · ' . escapeHtml($row['recurring_expense_payment_method']) . '' : '' ?>
Covered by = $can_sales ? '' . escapeHtml($cover_number) . '' : escapeHtml($cover_number) ?>
· = escapeHtml(billingMoney($cover['revenue'], $currency)) ?> a month before tax= $cover['percent'] !== null ? ', ' . $cover['percent'] . '% margin after ' . (count(array_filter(array_column($cover['rows'], 'running'))) === 1 ? 'this cost' : 'its costs') : '' ?>
Covered by a recurring invoice since deleted
Billed on each time at = escapeHtml(billingMoney(expenseBillPrice($amount, $markup), $currency)) ?> · = escapeHtml(rtrim(rtrim(number_format($markup, 2, '.', ''), '0'), '.')) ?>% markup
Our cost - not billed on
= escapeHtml(billingMoney($row['made_year'], $currency)) ?> recorded this year · = escapeHtml(billingMoney($amount * 12 / recurringInvoiceMonths($row['recurring_expense_frequency']), $currency)) ?> a year at this amount
= escapeHtml($expense['expense_date']) ?>
= escapeHtml(billingMoney($expense['expense_amount'], $expense['expense_currency_code'])) ?>
Nothing yet - the first one is recorded on = escapeHtml(date('M j, Y', strtotime($next))) ?>.
= auditLogHistorySection(auditLogHistory('Recurring Expense', $id, 10), ['client_id' => $client_id]) ?>