johnnyq
|
01fbcda75d
|
Security sweep 2: API archive, unarchive, resolve and close now check the client named in the call the same as create, update and delete do (every call except read.php and time.php counts as a write); API asset, contact, network and document create/update keep linked contacts, locations, vendors, networks and folders within the record's own client; linking a contact to an asset refuses another client's contact, and unlinking only clears the contact it was linked to; agents limited to certain clients no longer see other clients' names in the asset import template file name, export filter summaries, or the messages from file moves, unlinks, ticket asset removal, bulk project add and bulk interface network; guest quote Accept and Decline post instead of being plain links and check the key with hash_equals; exports that match nothing say so instead of showing a blank page; about 30 handlers now stop with 'no longer exists' when their record was just deleted, instead of showing warnings or an error page and writing history for a record that is gone; restore_contact_note reads its own id parameter; ticket prefix pattern escaped for the v flag; missing user agent and array key parameters handled; CHANGELOG updated
|
2026-10-26 19:54:36 -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
|
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
|
cd565b73c7
|
Taxes stage 2: Tax Collected report rebuilt for filing with an Invoiced basis (each sent invoice in the month of its date) or Paid basis (each payment carrying its share of its invoice), tax by part of each rate with registration numbers so a state's and a county's parts count apart and parts named alike add up in one row, sales before tax and net of discounts split into taxable, exempt and non-taxable, tax paid on purchases by part and net tax collected less paid, exempt sales by client with certificate and expiry, quarterly or monthly with a chart and CSV export of the tax table or the exempt sales, archived payments left out; expenses and recurring expenses record the tax included in them with a rate worked out from the amount as typed or typed over from the receipt, a tax amount with no rate allowed, refunds giving their tax back, recurring expenses copying it to each expense recorded, vendor defaults filling it in, and the list and quick looks showing it; exports gain invoice subtotal, discount, tax and tax by part, quote and recurring invoice tax, expense before tax, tax and tax rate, and client tax rate and exemption columns; API adds a taxes read endpoint with each rate's parts, subtotal, tax, tax by part and registration numbers on invoice and quote reads, and each line's rate on invoice item reads; Admin > Taxes explains naming parts alike and links the report; demo data names Allegheny County's state part PA Sales Tax and taxes the company's own-use purchases; removes the unused getMonthlyTax and getQuarterlyTax; database 3.1.2 adds expense and recurring expense tax rate and amount; changelog updated
|
2026-10-17 13:27:53 -04:00 |
|
johnnyq
|
8d5e5091ad
|
Expenses stage 3: billable expenses and pass-through costs - mark an expense for a client billable with a markup (default in Admin > Settings > Invoice), expenses to bill sit beside the time in Unbilled Time and go on a new or draft invoice with the tickets as a line each at a price that can be changed, the invoice gets an Expenses card with cost against billed and the margin plus an Add Expenses window, taking one off or deleting its line or invoice makes it to bill again (paid invoices keep it, cancelled ones keep the line), the quick look and list link billed expenses to their invoice with To bill and Billed pills and Bulk Set Billable, recurring expenses can be billed on each time or covered by one of the client's recurring invoices with a Costs card showing the monthly margin, expenses to bill counted in the menu, dashboard and client overview, export Billing and Billed On columns, demo data with recent client expenses to bill, database 3.0.1
|
2026-10-16 18:36:43 -04:00 |
|
johnnyq
|
775edc53d8
|
Products makeover stage 1: products and services with cost and margin, the vendor they are bought from with its part number, internal notes and default billing of one time, monthly, quarterly or yearly per user or per device that fills in Billed on quotes and Counted on recurring invoices, a per-product Track stock switch so only tracked items move stock and refuse to be invoiced past the shelf while untracked ones are ordered as needed, rebuilt Products list with what catalog lines bring in each month on recurring, sales over 90 days with the top seller and stock value at cost, tabs for Services, Products, Recurring and Stocked, a vendor filter and part number search, a new product page with price, margin, 12 month sales, monthly recurring, stock with recent moves, recurring invoices, open quotes, invoices and history tabs, inline notes and Copy, one New and Edit window with live margin, rebuilt Add Stock, import by column heading with update by code for price lists, export with cost, margin, billing, vendor, part number and stock, agent-only margin on invoices, quotes and recurring invoices, a Products tab on our vendors' pages, search results opening the product page, billing defaults in the starter catalog and costs and vendors in the demo data. Fixes bulk Restore of archived products doing nothing, deleted products leaving stock behind, Add Stock recording zero units or a missing expense, and a backslash before an apostrophe in agent names in billing history. Adds DB 2.9.4 with product cost, vendor, part number, notes, frequency, seat source and track stock set for products with stock history plus product keys on line and stock tables, functions/products.php with productSave() as the one write path, productUsage() and billingMargin(), agent/product.php, a shared product_form.php, copy_product and product_set_notes handlers, removes product_model.php, and updates the 26.11 changelog
|
2026-10-16 15:23:05 -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
|
5acb1802bb
|
Security: scope set_recurring_payment to the client's own invoice and payment method
|
2026-10-08 16:02:21 -04:00 |
|
Wrongecho
|
a41e738a9b
|
Add ability for recurring invoices to be generated as draft to allow review and amendment prior to sending
|
2026-09-14 13:22:59 +00:00 |
|
johnnyq
|
8c0e5246b4
|
Fix Card Margin bottoms client header and ticket cards on the right
|
2026-08-14 19:08:15 -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
|
f7548af234
|
Fix Export Missing coluns due to the select star sweep
|
2026-08-09 14:33:06 -04:00 |
|
johnnyq
|
64423cbefa
|
Fix Client PDF Export
|
2026-08-06 18:51:09 -04:00 |
|
johnnyq
|
f8899e592f
|
More Select * Queries convert
|
2026-08-06 13:57:46 -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
|
b8c9d5b4cf
|
Query Optimization: Select only needed columns instead of SELECT * on looped queries
|
2026-08-06 12:59:43 -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
|
97490bef3b
|
Security Fix in recurring invoices in cron
|
2026-07-27 18:07:15 -04:00 |
|
johnnyq
|
5c4805b822
|
Neutralize CSV formula injection in generated exports using the new created escapeCsvFormula Function
|
2026-07-24 18:12:45 -04:00 |
|
johnnyq
|
af51c4316f
|
Updated validateCSRFToken to automatically grab and compare get or post csrf token no longer need to pass an argument to the function which fixed the issue if no hash was present
|
2026-07-24 13:40:37 -04:00 |
|
johnnyq
|
9d540f4bfe
|
Replace Function customAction() with triggerCustomAction()
|
2026-07-14 17:43:55 -04:00 |
|
johnnyq
|
b8873039a4
|
Rename Functions: flash_alert, sanitizeFilename and display_folder_options using camelCase instead to match other custom php functions
|
2026-07-14 17:41:41 -04:00 |
|
johnnyq
|
f1836c70cd
|
Replace Function logAction() with logAudit()
|
2026-07-14 17:35:23 -04:00 |
|
johnnyq
|
b57ddc0e5c
|
Replace Function sanitizeInput() with just escapeSql() and update all instances throughout
|
2026-07-14 17:17:50 -04:00 |
|
wrongecho
|
7211426292
|
Invoices - Secure date/frequency input handling
|
2026-05-20 13:32:21 +01:00 |
|
johnnyq
|
e2547122a6
|
Update Var naming schemes to match the post var name
|
2026-03-08 14:25:12 -04:00 |
|
johnnyq
|
6122efc870
|
Updated all Queries related to invoice items to reflect their new tables quote, invoice, recurring invoice items
|
2026-03-07 19:35:44 -05:00 |
|
johnnyq
|
6d2cb0aea3
|
Split out item edits into seperate posts and modals for editing invoice, quote and recurring invoice items
|
2026-03-07 12:12:27 -05:00 |
|
johnnyq
|
111a30f13c
|
recurring invoices: enforceClientAccess
|
2026-03-06 18:01:20 -05: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
|
a79ce23ae5
|
Fix randomString() to generate cryptographically secure URL-safe tokens, reduced url keys to 32 Characters for performance and easy copy and paste and compatibility while still mainitaining ubreakable cryptographic keys
|
2025-12-18 14:24:53 -05:00 |
|
johnnyq
|
99e2487d2b
|
Fix dupe race condition with ticket, invoice, quote, project, recurring ticket numbering when being created in parallel Atomically update and get the next ticket number in one SQL query everywhere.
|
2025-11-28 14:14:46 -05:00 |
|
johnnyq
|
26bb430d6e
|
Seperate out posts into payment, invoice and recurring invoice instead of them all being under invoice post file
|
2025-10-29 16:18:32 -04:00 |
|
johnnyq
|
00f5198bed
|
Update appNotidfy links to use Absolute paths, updated gitignore
|
2025-09-25 13:31:16 -04:00 |
|
johnnyq
|
edabc5c33f
|
rename /user/ to /agent/ and update links to use agent/ instead
|
2025-09-23 18:04:23 -04:00 |
|