johnnyq
|
1e5bffff3c
|
Rates, net terms and SLAs come from the client's contract, else the instance defaults: database 3.5.0 adds a default after-hours rate (Settings > Defaults, now Rates and terms), gives each client whose own rate, net terms or SLAs differ from the defaults an active Standard terms contract setting just those (12-month term renewing itself, starting the day the client was added or the day before its earliest contract, archived with an archived client), deletes per-client SLA assignments and drops clients.client_rate and client_net_terms; time bills at the contract's rate, its after-hours rate or the default after-hours rate, else the default rate, new invoices are due on the contract's net terms else the default, and new tickets get the contract's SLA else the default; a client's own terms still apply until the update runs; the client add and edit windows lose the rate, terms and SLA fields for a note saying what the client is billed on and where it comes from, the Clients list loses Set Hourly Rate and Set Net Terms and shows the contract's rate, the overview's Terms shows the after-hours rate and whether terms are a contract's or the defaults, a contract's page and document show what it leaves empty from another contract in force or the default so signed documents stay unchanged, contract windows show the defaults as placeholders, contract names take a proper possessive; the client import and API create make a Standard terms contract for a rate or terms that aren't the defaults (returning contract_id), API update reports them in not_kept; the client export gives the rates, terms and SLAs as billed; demo data puts each demo client's terms on a contract; changelog updated
|
2026-10-27 22:22:34 -04:00 |
|
johnnyq
|
77df925981
|
Contracts stage 4: a contract in force sets the client's SLA for new tickets, the hourly rate with an after-hours rate for tickets opened outside business hours, and net terms for new invoices, the one that started last first and the client's own where it is empty; Unbilled Time bills each ticket at its own rate with one line per rate, and the ticket invoice window, Add Tickets, quote from a ticket, Unbilled Work and Time Detail reports, New Invoice, copy, quote to invoice, the invoice page, client overview and client edit follow it; a recurring invoice made from or linked to a contract is paused while it is a draft, started when it is made active or renewed with missed runs skipped, and paused once when it ends or its cancellation takes effect; new functions/contract_billing.php; fixes agent names double-escaped in the prepaid hours history; DB 3.4.5 adds contract_recurring_invoice_id and contract_recurring_stopped_at and treats a 0.00 contract rate as empty
|
2026-10-25 01:06:59 -04:00 |
|
johnnyq
|
1a51fc8dd6
|
Invoices, quotes and recurring invoices makeover stage 3: Unbilled Time page under Billing and in each client's menu with a count, listing every client's billable resolved or closed tickets not yet invoiced with time logged, hours to bill, rate, amount and oldest waiting, invoicing many clients at once onto a new draft each or each one's newest draft, and per client reviewing each ticket's hours before billing onto a new or existing draft with a line per ticket or one for all, live totals, and Not billable to write tickets off, Billing Time settings under Admin Settings Invoice for rounding to 6, 12, 15 or 30 minutes or the hour, nearest or always up, a per-ticket minimum and the line name, defaulting to the nearest 15 minutes, rebuilt ticket Invoice window showing time by agent, hours to bill and the client or default rate with add-to-draft and an open ticket warning, Add Tickets on an invoice now adds lines for the tickets' time with an option to attach without lines, client overview, dashboard and Unbilled Work report linking to it and counting unbilled time the same way, ticket billing written to ticket history instead of an internal note, invoices from tickets and copies due on the client's terms including On Receipt. Fixes ticket invoice line placed near the top of existing invoices, a ticket billable twice from two windows, no rate when the client had none set, and no hours filled in for tickets with 100 hours or more. Adds DB 2.9.2, billingTimeInvoice() as the one billing path with ticket claiming, billingUnbilledSql() and related helpers, unbilled_invoice, unbilled_invoice_clients and unbilled_write_off handlers, js/unbilled_time.js, and updates the 26.11 changelog
|
2026-10-16 13:42:06 -04:00 |
|
johnnyq
|
fee0a5cb80
|
Invoices, quotes and recurring invoices makeover stage 1: one shared document page for all three with inline line editing (product pick, live line totals, drag to reorder, lines locked once paid or answered), shared New/Edit form, late recurring invoices offer to skip to the next date without billing missed runs, Add Payment shows remaining balance and account balances, Batch Payment lists the invoices it will pay, Add Tickets takes several at once, new PDF layout for invoices, quotes and packing slips with pay/answer QR codes and paid/answered stamps, Letter or A4 by country, guest invoice Pay Now with other open invoices, guest quote Accept/Decline then signed copy or PO upload. Line amounts rounded to the cent on save, expired quotes can no longer be accepted from the link, Batch Payment skips non-billable invoices, recurring list creation-date filter removed. Fixes discount reset to zero on invoice/quote edit, stock not moving on invoice item quantity change, invoice status not updating on payment edit, autopay left behind on recurring invoice delete. Consolidates line items, totals, statuses and PDFs into functions/billing.php, includes/billing_paper.php, agent/post/billing.php and functions/billing_pdf.php with a single billing_items_order ajax reorder; removes the three item edit modals, link_invoice_to_ticket, guest_quote_upload_file_modal.php and js/product_autocomplete.js
|
2026-10-16 12:37:50 -04:00 |
|
johnnyq
|
a084e37c39
|
Initial migration from AdminLTE 3 to 4, bootstrap 4 to 5
|
2026-08-14 13:22:11 -04:00 |
|
johnnyq
|
b3744e9ed5
|
More sweeps to replace select * with actual returned column names dramatically reduces php memory usage and speeds up processing dramatically especially in the crons since they run all the time
|
2026-08-06 13:10:23 -04:00 |
|
johnnyq
|
b3f959ac55
|
Use Short echo tags across the code
|
2026-07-28 18:47:52 -04:00 |
|
johnnyq
|
761b2a7af4
|
Module permissions modal enforcement sweep to match its post counterpart
|
2026-07-25 00:28:42 -04:00 |
|
johnnyq
|
7bc47a58fe
|
Replace Function nullable_htmlentities() with just escapeHtml() and update all instances throughout
|
2026-07-14 17:10:45 -04:00 |
|
johnnyq
|
317fe91359
|
Add Missing clientEnforcement in various modals, already handled on POST also add client selection in edit trip and enforce client permissions on trips
|
2026-07-09 16:07:54 -04:00 |
|
johnnyq
|
4440581f14
|
Invoice: Add missing CSRF checks and missing permissions
|
2026-03-01 22:22:21 -05:00 |
|
johnnyq
|
0a30300bde
|
replace all instances of mysqli_fetch_array with mysqli_fetch_assoc for better performance and memory usage
|
2026-01-14 17:30:23 -05:00 |
|
johnnyq
|
edabc5c33f
|
rename /user/ to /agent/ and update links to use agent/ instead
|
2025-09-23 18:04:23 -04:00 |
|