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
bf89a86ab1
Categories stage 3: list category filters offer only the categories their records have through categoryFilterOptionsHtml, archived ones marked (archived) and referrals that aren't categories marked (not set up), on expenses, recurring expenses, income, invoices, products, tickets, recurring tickets, client referrals and their export windows; new filters for quotes and recurring invoices by category, assets by status, licenses by software type and racks by type, each also in its export window and filter summary; asset type tabs count within the chosen status, and license tabs within software type and license type, fixing license counts that ignored the license type filter; Category export column for invoices, quotes and recurring invoices and Status column for assets, off until ticked; lists and quick looks show a category as its icon in its color through categoryMarkHtml, or its dot without one, on expenses, recurring expenses, income, transactions, tickets, recurring tickets and the ticket page; Admin > Categories usage counts link to the new filtered lists; read-only categories API at api/v1/categories/read.php with kind, id, name, archived and paging, checked per kind against the module that uses it, with usage counts for keys whose user sees every client; racks Archived button kept on one line; changelog updated
2026-10-17 20:42:29 -04:00
johnnyq
59e75764f8
Empty states: one shared empty state on every list page, drawn by includes/inc_empty_state.php from each page's $empty_state through the new emptyStateHtml() in functions/format.php - a grey round tile with the list's icon, a title, a line on what goes there and the page's own New and Import buttons when nothing has been added, No X match with a Clear filters button that keeps the client, archived and the current tab when a search or filters leave nothing, Nothing in {tab} with the tab's description for an empty pill and a tick for pills that flag trouble, and No archived X for an empty archive; pills count as views rather than filters; replaces the pages' own empty blocks so a filtered-to-nothing list no longer shows two messages; files, notifications and racks use it in their own layouts; adds emptyStateFiltered(), emptyStateClearUrl() and emptyStatePill() and the .itflow-empty-state styles; changelog updated
2026-10-17 00:47:32 -04:00
johnnyq
422088fb60
Invoices, quotes and recurring invoices makeover stage 2: per user, per device and per license recurring lines that take their quantity from the client's contacts (all or tagged), devices (ticked types or tagged, lost/stolen/retired left out) or a license's seats (in use or bought), counted again for every invoice with an optional contract minimum, set from a Counted choice on the add row or the full Quantity from section in Edit Line with a live count, marked on each line and listed in a new Seats card with Update now when the client has changed, quarterly frequency alongside monthly and yearly counted as a third in MRR on the dashboard, client pages, client portal and reports, period words {month} {quarter} {year} {period} filled into scope, notes and lines, schedule card showing the period the next invoice covers, recurring_invoice_anchor_day so month-end schedules return to the 31st after a short month, nightly run and Invoice Now consolidated into recurringInvoiceGenerate() which claims the run so it is billed once, refreshes seat counts and takes taxes at current rates, nightly run now bills runs missed by up to 7 days, Invoice Now bills the next run early and moves the schedule on from that run instead of restarting from today, recurring email goes to non-archived primary and billing contacts once per address and stays a draft when outgoing mail is not set up. Fixes portal recurring card ignoring yearly-only clients and counting archived ones, edit recurring invoice resetting the billing day. Adds DB 2.9.1, recurring_invoice_sync and recurring_seat_count handlers, itflowBillingSeatForm(), and updates the 26.11 changelog
2026-10-16 13:09:59 -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
9bfd26d57b
Add titles to icon-only buttons
...
- title on 294 icon-only buttons, named for what each one does
- aria-label on the 7 show-password buttons (title becomes the popover
header) and the portal mobile nav toggle
- Fix dead add-category button on products filter, credential bulk tag
button now preselects Credential, drop duplicate inner-icon titles
2026-10-08 17:12:21 -04:00
johnnyq
d98b8bc427
Add ps-3 to table columns that don't have a checkbox and made sure all table listings conform
2026-08-29 19:45:28 -04:00
johnnyq
6df101c217
Css fixes
2026-08-16 22:25:05 -04:00
johnnyq
2375e69f2d
Update badge classes to bg
2026-08-15 13:00:41 -04:00
johnnyq
dc6b191eed
Update Font, Migrated away from JQUERY dependent libs: toastr to bootstrap5 toasts, daterangepicker to flatpickr, select2 to Tom Select, InputMask to IMask
2026-08-14 17:08:40 -04:00
johnnyq
a084e37c39
Initial migration from AdminLTE 3 to 4, bootstrap 4 to 5
2026-08-14 13:22:11 -04:00
johnnyq
108781db5b
Move more select * to column select for further optimization
2026-08-06 13:44:02 -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
ddd9c2b56a
clientScopeSql sweep whicn now removed the extra unessesary client joins
2026-08-06 11:45:56 -04:00
johnnyq
3c8f812a16
Feature: On all export modals added Filter Tab and Selectable Columns tab with default selected, also you can now export to a PDF
2026-07-30 00:46:15 -04:00
johnnyq
b3f959ac55
Use Short echo tags across the code
2026-07-28 18:47:52 -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
21328c2dee
clientEnforcement on Recurring Invoices and payments listings
2026-07-09 16:13:39 -04:00
johnnyq
c16a1753a5
Add text MonoSpace in places where it needs to be, reduced info icon size in clients, Fixed navigation highlight for files when in document details and is asset details
2026-06-25 18:06:39 -04:00
johnnyq
65b53dd7f4
Tables: Removed removed -sm in table-responsive to fix some responsive issues also adding margin between top and bottom tags in clients and moved the tags in its own div
2026-03-26 13:30:07 -04:00
johnnyq
6e33c071ef
Hide New Invoice, Recurring Invoices, Tickets, revenues, products for appropriate permissions
2026-03-09 11:44:45 -04:00
johnnyq
f653752026
Recurring Invoice: Add missing CSRF checks and missing permissions in POST
2026-03-01 22:37:51 -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
a82e2c7ea1
Billable and non billable status use icons check and minus
2025-12-18 20:38:15 -05:00
johnnyq
69253385c5
Update Invoice, Quote, Recurring Invoice Hyperlinks to take you directly to the client view instead of keeping you in global view. We also did this with tickets in the previous commit
2025-11-03 16:29:41 -05:00
johnnyq
41f9a2e6e2
Migrated add revenue, trip, quote, invoice, recurring invoice, product, document, folder, file, project, and asset interface over to the new ajax-modal
2025-11-03 14:06:44 -05:00
johnnyq
c5dd5f2b6f
Add Clause to not collapse advanced filter on all time aka if date from is set to the default 1970-01-01
2025-10-20 18:16:39 -04:00
johnnyq
ab77705ca2
Feature: Replace old date range to Date Range Picker JS for better date from/to handling
2025-10-20 18:04:00 -04:00
johnnyq
edabc5c33f
rename /user/ to /agent/ and update links to use agent/ instead
2025-09-23 18:04:23 -04:00