= 2; if (!$can_send_invoice) { if (($_GET['kind'] ?? '') !== 'reminder') { enforceUserPermission('module_sales', 2); } enforceBillingMoney('remind'); } $invoice_id = intval($_GET['invoice_id']); $sql = mysqli_query($mysqli, "SELECT invoice_client_id, invoice_number, invoice_prefix, invoice_status FROM invoices WHERE invoice_id = $invoice_id LIMIT 1"); $row = mysqli_fetch_assoc($sql); if (!$row) { exit(json_encode(['error' => 'That invoice no longer exists.'])); } $invoice_prefix = escapeHtml($row['invoice_prefix']); $invoice_number = intval($row['invoice_number']); $invoice_status = escapeHtml($row['invoice_status']); $client_id = intval($row['invoice_client_id']); enforceClientAccess(); $doc = billingRow('invoice', $invoice_id); // Billing-facing contacts only - see documentContactFilterSql(). Everyone // shown is also checked by default, which is the behaviour the old one-click // Send Email link had baked in; the checkboxes are here to drop one, not to // go hunting for somebody. $sql_contacts = mysqli_query( $mysqli, "SELECT contact_billing, contact_email, contact_id, contact_photo, contact_name, contact_primary, contact_title FROM contacts WHERE contact_client_id = $client_id AND contact_archived_at IS NULL AND contact_email IS NOT NULL AND contact_email != '' " . documentContactFilterSql('invoice') . " ORDER BY contact_primary DESC, contact_billing DESC, contact_name ASC" ); $contact_count = mysqli_num_rows($sql_contacts); // Which boxes open ticked. Read from the same helper Quick Send uses, so the // modal and the one-click path can never disagree about who "the defaults" are. $default_contact_ids = []; $sql_defaults = mysqli_query( $mysqli, "SELECT contact_id FROM contacts WHERE contact_client_id = $client_id AND contact_archived_at IS NULL AND contact_email IS NOT NULL AND contact_email != '' " . documentDefaultContactFilterSql('invoice') ); while ($row = mysqli_fetch_assoc($sql_defaults)) { $default_contact_ids[] = intval($row['contact_id']); } ob_start(); ?>