Tickets waiting on or worked with them, open first - with their reference.
New Case
= ticketTableHtml($cases, ['vendor_ref' => true]) ?>
count($cases)) { ?>
Showing every open case and the = count($cases) - $case_open_count ?> most recent closed of = $case_count ?>.
No cases with them. Set the vendor on a ticket, with their reference, when you log a call with them.
Licenses and subscriptions bought through them, soonest renewal first.
New License
= linkRowHtml('software', $license, $client_id) ?>
= softwareRenewalPill($renewal) ?>
No licenses from them.
Bought from them, warranty ending soonest first - what to have to hand for a claim.
New Asset
Asset Serial Order ref Purchased Warranty
= $serial ?> -
= $order_ref ?: '- ' ?>
= escapeHtml($asset['asset_purchase_date']) ?: '- ' ?>
= $warranty['state'] === 'expired' ? 'Expired' : ($warranty['state'] === 'soon' ? 'Ends in ' . intval($warranty['days']) . ' days' : 'To ' . escapeHtml($warranty['date'])) ?>
-
No assets bought from them.
= $is_ours ? "Clients' domains we register or host with them, and for what." : 'Domains they register or host, and for what.' ?>
New Domain
Domain They are Expires = $is_ours ? 'Client ' : '' ?>
$role) {
if (intval($domain[$column]) === $vendor_id) {
$roles[] = $role;
}
}
$expiry = domainExpiry($domain['domain_expire'], $domain['domain_auto_renew']); ?>
= $role ?>
= domainExpiryPill($expiry, true) ?>
= escapeHtml($domain['client_name']) ?>
No domains with them.
The client's services that depend on them - who gets the call when one breaks.
Link
= serviceRowsHtml($services, $can_link_services ? function ($row) use ($vendor_id) {
return "post.php?unlink_item&from=vendor&id=$vendor_id&to=service&other=" . intval($row['service_id']) . "&csrf_token=" . $_SESSION['csrf_token'];
} : null) ?>
No services depend on them.
['credential', $logins, 'Their portal and support logins - linked from the client\'s credentials.', 'No logins linked.', $can_credentials_edit],
'documents' => ['document', $documents, 'The contract, the escalation sheet, how to raise a case with them.', 'No documents linked.', $can_support_edit],
'files' => ['file', $files, 'Quotes, invoices, the signed agreement.', 'No files linked.', $can_support_edit]] as $pane => [$to, $linked, $hint, $empty, $can_link]) {
if (!isset($vendor_tabs[$pane])) {
continue;
} ?>
= $hint ?>
Link
New Login
New Document
Upload
= credentialTableHtml($linked, [
'for' => true,
'unlink' => function ($row) use ($unlink_url, $can_link) {
return $can_link ? $unlink_url('credential', $row['credential_id']) : '';
},
]) ?>
= linkRowHtml($to, $linked_row, $client_id) ?>
= $empty ?>
= numfmt_format_currency($currency_format, $spend['year'], $session_company_currency) ?> this year
= numfmt_format_currency($currency_format, $spend['last_year'], $session_company_currency) ?> last year
= numfmt_format_currency($currency_format, $spend['total'], $session_company_currency) ?> in all
Date What for Account Amount
= escapeHtml($expense['expense_date']) ?>
= escapeHtml(truncate((string) $expense['expense_description'], 90)) ?: '- ' ?>
= escapeHtml(implode(' · ', array_filter([$expense['category_name'], $expense['expense_reference']]))) ?>
= intval($expense['expense_paid_by']) ? ' ' . escapeHtml($expense['paid_by_name'] ?: 'An agent') : escapeHtml($expense['account_name']) ?>
= numfmt_format_currency($currency_format, floatval($expense['expense_amount']), $expense['expense_currency_code']) ?>
count($expenses)) { ?>
The = count($expenses) ?> most recent of = $spend['count'] ?> -
see them all .
Nothing spent with them yet.
Subscriptions and contracts booked automatically.
New Recurring
Next Every What for Amount
= escapeHtml($recurring_expense['recurring_expense_next_date']) ?> = recurringExpenseNextPill($recurring_expense) ?>
= ['month' => 'Month', 'quarter' => 'Quarter', 'year' => 'Year'][$recurring_expense['recurring_expense_frequency']] ?? 'Month' ?>
= escapeHtml(truncate((string) $recurring_expense['recurring_expense_description'], 90)) ?: '- ' ?>
= escapeHtml($recurring_expense['category_name']) ?>
= numfmt_format_currency($currency_format, floatval($recurring_expense['recurring_expense_amount']), $recurring_expense['recurring_expense_currency_code']) ?>
Nothing recurring with them.
Products and services in the catalog bought from them, with their part number.
In Products
Item Part # Cost Price Stock
= productTile($vendor_product['product_type'], 'sm') ?>
= escapeHtml($vendor_product['product_name']) ?>
= escapeHtml(implode(' · ', array_filter([$vendor_product['product_code'], $vendor_product['product_frequency'] ? productBilledText($vendor_product['product_frequency'], $vendor_product['product_seat_source']) : '']))) ?: ' ' ?>
= $vendor_product['product_vendor_part'] ? escapeHtml($vendor_product['product_vendor_part']) : '- ' ?>
= floatval($vendor_product['product_cost']) > 0 ? escapeHtml(billingMoney($vendor_product['product_cost'], $vendor_product['product_currency_code'])) : '- ' ?>
= escapeHtml(billingMoney($vendor_product['product_price'], $vendor_product['product_currency_code'])) ?>
= productMarginPill(productMargin($vendor_product['product_price'], $vendor_product['product_cost'])) ?>
= intval($vendor_product['product_track_stock']) ? escapeHtml(billingQuantity($vendor_product['product_stock'])) : '- ' ?>
Nothing in the catalog comes from them. Pick them as the vendor on a product to list it here.
Edits, links and notes - newest first.
= auditLogHistoryHtml($history, ['client_id' => $client_id]) ?>