Commit Graph

388 Commits

Author SHA1 Message Date
johnnyq
278df4e7b3 Speed up Transactions, Reconcile and the transactions export again by reading the ledger lines first and joining each to its account with STRAIGHT_JOIN instead of letting the optimizer look lines up through a temporary index, and stop billable expenses waiting to be invoiced from slowing every page: database update 3.5.5 indexes expenses.expense_refund_of_id so the side menu count, the invoice page, Add Expenses and the expense quick look no longer check each waiting expense against every expense; 26.11.2 changelog updated 2026-11-02 16:29:18 -05:00
johnnyq
c24d13bfe8 Speed up Transactions, the Transfers pill, Reconcile and the transactions export: database update 3.5.4 indexes transfers.transfer_expense_id so the ledger no longer checks every expense against every transfer, accountLedgerSql() takes a with_balance flag so the running balance is only worked out where it shows (one account in date order and its export), and the Transfers summary cards come from the same pass as the pill counts and totals 2026-11-02 15:59:11 -05:00
johnnyq
3ff116f0d3 Database updates: keep junk values from stopping the 26.11 update - 3.0.3 sets trip miles of a billion or more to 0 before trip_miles becomes decimal(10,1), 3.1.1 sets tax rates of 100,000% or more to 0 before tax_percent becomes decimal(9,4), and 3.5.0 leaves out a client rate of 100,000,000 or more when making Standard terms and skips clients already given them by a run that stopped part way, so an update that failed at any of these resumes cleanly when run again 2026-10-29 13:45:59 -04:00
johnnyq
3c996a0b4b Add agent mentions in ticket internal notes: typing @ in an internal note (reply box and Edit reply) offers the agents who can open the ticket by role and client access, each mention is saved with the agent's current name and told in ITFlow with a link to the note and by email from the ticket mailbox, the ticket shows Mentions you with the name highlighted, a Mentioned me view on the tickets list and board lists open tickets with a note that mentions you, edits tell only newly added agents and drop removed ones, redacting and archiving take mentions off, mentions in public notes, email replies and bulk replies stay plain text and tell nobody, database 3.5.3 adds ticket_reply_mentions, and the Mentioned in a note email is added to Mail Previews 2026-10-28 14:19:15 -04:00
johnnyq
8487416912 Add client onboarding: Onboard a client under New Client's arrow and in the client menu (also on a lead's row, a lead's Edit window and Get started's first client step) walks through the company, locations, people with portal access, the agreement from a contract template optionally sent to sign, billing with the agreement's recurring invoice (paused while out to sign), IT basics with domains and vendors and licenses from templates, and a kickoff project from a project template, each step saving as it goes with Skip for now and ticking itself off from what the client already has, a Finish onboarding card on the client overview until finished or closed, steps following the agent's role and enabled modules, database 3.5.2 adds client_onboardings, contractFromTemplateAdd() takes a status so a contract can start as a draft, and the audit log gets an Onboard action 2026-10-28 02:09:45 -04:00
johnnyq
568a907ff9 Add agent invites: New User now emails an invite by default so the agent chooses their own password on the new join.php page, and Set a password now stays as the other option with the email that contained the password removed; database 3.5.1 adds user_invites with only a hash of the link's token kept and the vault master key locked under that token until it is accepted, cancelled or runs out; new functions/user_invite.php; adds the Invited view to Users with Send again, Get the link (shown once, also used when mail is not set up) and Cancel invite; waiting invites count toward the agent user limit and a role with waiting invites cannot be archived; the Get started team step invites when mail is set up; the quick look shows whose invite an agent joined from; replaces the new account email preview with the invite email; the nightly job clears invites cancelled or run out more than 90 days ago; adds userAvatarStore(); updates the changelog 2026-10-28 01:16:49 -04:00
johnnyq
b4105b45bf Clients list shows the hourly rate each client is billed at - its contract's, else the default marked (default), or its own before the 3.5.0 update; Admin > Contract Templates shows what a template leaves empty as the default for its rate, net terms and each priority's SLA, and Due on receipt for net terms of 0; changelog updated 2026-10-27 23:11:05 -04:00
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
954f1e3688 Contract templates: show Contract Templates in the admin menu under Templates when the accounting module is on (its link was still commented out from when contracts were hidden), show the Templates heading when accounting is the only module on, and when there are no templates yet tell an admin on New Contract where to make them; changelog updated 2026-10-27 17:48:21 -04:00
johnnyq
9ba21cf352 Assets: add NAS, UPS, PDU, Modem/ONT and NVR/DVR types from a new registry in functions/asset_type.php that sets each type's icon, tone, group, fields and details; the asset form shows only the fields a type uses (fields that already hold a value stay shown) and adds a Details section per type (CPU/RAM/storage, VM host/vCPUs, switch ports/SFP/PoE/management, NAS drives/capacity/RAID, UPS capacity/output/runtime/outlets/battery dates, PDU kind/outlets/input, modem circuit ID/ISP account, printer, phone, mobile, display, camera and NVR details) stored in a new asset_specs table (database 3.4.9); new or changed port and SFP counts add the missing interfaces, continuing the asset's numbering, skipping Wi-Fi, VLAN and management ports and never deleting any; the asset page and quick look show the details, a server or NAS lists the VMs that run on it, and Assigned and Warranty show only on types that use them; the list gets Servers & NAS and Power tabs, an optional Details column, a UPS battery badge, an Assigned picker only on assigned types, and New buttons named for what they add; nightly UPS Battery Due notifications at 45, 7 and 1 days as a Support notification; copy leaves out per-unit details, Transfer to Client carries details and interface types, export adds per-detail columns, import reads detail columns after the standard twelve (VM hosts by name, resolved after every row is in) and reports values it could not keep, and the API reads and writes asset_specs; racks, client portal, client export, overview, document templates and AI lists group the new types; fix asset import carrying physical location and notes into the next row, saving 0000-00-00 for a missing purchase date and warning on an unknown contact or location, save API and import types in the list's spelling, and keep interface types on transfer; changelog updated 2026-10-27 15:59:03 -04:00
johnnyq
06668d5004 Get started: Do it later and Skip all at the top while a step is still to do - Do it later goes to the dashboard and leaves Finish setting up there, Skip all asks first then skips every step (done ones too, so one that comes undone stays off the dashboard), goes to the dashboard and is logged with what was left to do; Go to ITFlow once every step is done or skipped; the footer's Don't show it on the dashboard removed (the dashboard card's x still dismisses); setup_cli.php --skip-get-started leaves Get started in Admin instead of opening it on first sign-in or showing it on the dashboard; CHANGELOG updated 2026-10-27 11:53:27 -04:00
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
6e03857c6c Show whether each ticket reply was emailed and who to: replies are marked Email reply, Public note or Internal, an email reply lists each recipient with their email's state from the mail queue (sent, waiting, retrying, failed with why, cancelled) and a Mail Queue link for admins, sending says how many it went to or why it didn't go, and editing an emailed reply says the client keeps what was sent; database 3.4.8 adds ticket_replies.ticket_reply_emailed and ticket_reply_emailed_to and email_queue.email_ticket_reply_id, matching the mail queue's update and resolved emails to their replies; bulk reply, bulk resolve and the API record it too 2026-10-26 12:51:28 -04:00
johnnyq
1fd45bcffa Get started: the standard SLAs set a response time only - Urgent 1 business hour, High 2, Medium 4, Low 8 - with no resolution time, reuse an existing SLA only when it has the same response time and none, and the Support step shows Answered within alone, with Put right within only when an SLA already given has one 2026-10-26 12:19:53 -04:00
johnnyq
91e9792c3c Give tags a quieter look everywhere they show - the tag's colour as a faint wash, a fine edge and its icon, the name in the page's own text colour, pale colours darkened on white and dark ones lifted in dark mode - on lists, record pages, Admin > Tags, the tag window, global search, the tag picker and every Tags filter, through the one .itflow-tag style, a soft .itflow-select-badge for tag options (tagOptionLook()) and the search tag icon 2026-10-25 15:45:57 -04:00
johnnyq
52df79f8b0 Show each starter content item as it will look under Pick which - a tag as its pill, a category as its chip, a product with its price and billing, with what each is for - and Preview the whole of a ticket, project, document, vendor or license template, canned response or product in a window, the words filled in as it is used marked; Maintenance > Starter Content gets Pick which too, its Add bringing only what is ticked and Will be added following the ticks, sharing admin/includes/starter_content_pick.php, admin/starter_content_preview.php and js/starter_content.js with Get started 2026-10-25 15:04:11 -04:00
johnnyq
6d29583cef Add Get started, a guided walk through what is left to set up after installing (cron, email, backups, billing, support, the team, starter content - each pack or picked item by item - and a first client), each step a short form of its own with Skip for now and ticked off from the settings themselves, shown to the first admin to sign in on a new install and as a Finish setting up card on the dashboard until done, skipped or dismissed, and in Admin > Get started any time; database 3.4.7 adds settings.config_getting_started (on for a new install, off for an updated one), config_getting_started_skipped and config_getting_started_opened_at; the starter content loaders take the items to load, the mail server check moves to settingsMailServerCheck() for Admin > Mail and the Email step, app.js only starts DataTables where it is loaded, and setup's finish step points at Get started 2026-10-25 14:46:02 -04:00
johnnyq
58e502ad38 Add Get started, a guided walk through what is left to set up after installing (cron, email, backups, billing, support, the team, starter content and a first client), each step a short form of its own with Skip for now and ticked off from the settings themselves, shown to the first admin to sign in on a new install and as a Finish setting up card on the dashboard until done, skipped or dismissed, and in Admin > Get started any time; database 3.4.7 adds settings.config_getting_started (on for a new install, off for an updated one), config_getting_started_skipped and config_getting_started_opened_at; the mail server check moves to settingsMailServerCheck() for Admin > Mail and the Email step, app.js only starts DataTables where it is loaded, and setup's finish step points at Get started 2026-10-25 14:28:17 -04:00
johnnyq
0e272910fb Client portal: invite people by email from a client's Contacts (Invites tab with send again, cancel, search and sorting) or by the primary contact in the portal, several at once with optional names and roles, each joining from the emailed link with their own name, title, phone and password or Microsoft 365 and becoming a contact then, an existing contact with that address being given access instead; self sign-up from Create an account on the sign-in page for addresses at a client's Domains when it is on in Admin > Settings > Client portal and for that client, verified by an emailed link and joining as a plain contact with agents and the primary contact told; the same answer whatever address is entered, per address and per IP limits and a hidden field for bots; nightly clean-up of unused links; six new email previews; new functions/portal_invite.php, client/invite.php, client/join.php and client/signup.php, replacing the unused contact_invite modal; DB 3.4.6 adds portal_invites, client_portal_signup and config_client_portal_signup 2026-10-25 01:07:53 -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
0f9038b1ed Contracts stage 3: prepaid hours - hours included each month, and blocks bought with a price, expiry, note and an optional draft invoice; a nightly draw of billable ticket time, oldest ticket first from the hours that run out first, with Draw now and Put back, and a ticket the hours run out on staying in Unbilled Time at the usual rate; Prepaid hours card, a low hours email to the owner, and hours left on the contracts list, client overview, ticket, Unbilled Time and the client portal; [Monthly Hours] placeholder; new functions/contract_hours.php; DB 3.4.4 adds monthly hours and the alert level to contracts and templates, plus contract_blocks and contract_block_uses 2026-10-25 01:06:27 -04:00
johnnyq
d0620067a1 Contracts stage 2: each contract is a document with placeholders ([Client], [Start Date], [Rate], an [SLA] table and more) to preview, print or download as PDF; Send to sign emails a contact or anyone a link to sign with a drawn or typed signature, from the link or the client portal (Billing > Contracts and the home page list of ones waiting); Countersign makes a draft active and emails the PDF signed by both with its signing trail and document fingerprint; Signing card with copy link, send again, withdraw and earlier requests; changing the document while it is out for signature withdraws the request; contract emails in Mail > Previews; new functions/contract_signature.php and functions/contract_pdf.php, guest/guest_view_contract.php, client/contracts.php and client/contract.php; DB 3.4.3 adds contract_signatures and keeps any stored signature as a recorded round 2026-10-25 01:05:42 -04:00
johnnyq
0da515fff5 Contracts stage 1: new Contracts list and page under Billing and the client menu with type, term, start and end, auto renew, notice days, support hours, rates, net terms and an SLA per priority from Admin > SLAs (empty uses the client's own), stat tiles, Active, Due soon, Drafts, Ended and All tabs, search, type and client filters and sorting; New, Copy and Edit from a template with an owner and contact, Make active, Renew and Cancel; nightly renewal or ending and an owner reminder a month before the notice date; client overview attention items and the contract in the Financial row; Contract Templates rebuilt with Template, Cover and Terms tabs, copy, archive and restore; new functions/contract.php; fixes deleting a client that has a contract, a new template's after-hours rate not saving, rates cut to whole amounts, Net 30 saved as 0 and Edit blanking the rates; DB 3.4.2 turns the old response and resolution hours into SLAs and renewal frequency into term and auto renew, and normalises type, status and net terms 2026-10-25 01:05:09 -04:00
johnnyq
185129dd72 Payment Methods: rebuilt Admin > Payment Methods with each method's use (payments, income, expenses) linking to Transactions, when it was last used, In use and Archived tabs, search and sorting; a method is for money in, money out or both and each picker offers only the ones that fit, transfers all of them; renaming carries the new name to every payment, income, expense, recurring expense, reimbursement, transfer, autopay and the defaults; payment and expense defaults set from the list; archive and restore; delete only an unused method, a used one is merged into another; methods records use that are not in the list can be added in one click; one New/Edit window with field icons; new functions/payment_method.php with paymentMethods() moved there from functions/billing.php; fixes a rename splitting records under two names, editing a Stripe payment or one whose method is no longer listed, and duplicate names; DB 3.4.1 adds payment_method_use and payment_method_archived_at 2026-10-25 01:03:16 -04:00
johnnyq
be374e9c2b Rebuild Admin > Ticket Statuses: list on the standard pattern with In use and Switched off tabs, search, sortable headers, ticket counts linking to the tickets, SLA clock and client-reply columns and drag ordering for the pickers and board; one New/Edit window with badge preview, colour swatches and a description shown on hover across the app; per-status choice of whether a client reply by email or portal moves the ticket back to Open or leaves it; switch off and delete move a status's tickets to a chosen status with ticket history and SLA sync, and clear canned responses that set it; built-in statuses keep their names, stay on and have fixed SLA and reply behaviour enforced server-side; badges use readable text colour; the tickets filter keeps a switched-off status; database 3.4.0 adds ticket_status_description and ticket_status_client_reply; new functions/ticket_status.php 2026-10-24 15:14:10 -04:00
johnnyq
fb9534b0a2 Rebuild Admin > Debug as a system health page: problems and warnings first with what to do and where, key figures along the top, checks by section (ITFlow and database version, updates, cron and jobs, mail queue and email to tickets, backups, PHP version, extensions and limits, HTTPS, certificate, base URL and HTTPS only, folders and disk space, server and clock drift, errors logged), database size, biggest tables and structure compared with db.sql ignoring integer display widths, uploads by folder, and a Copy for support plain-text report without host names, paths or keys; row counts use the database's estimate with a Count exactly option, the uploads scan stops after a few seconds, the certificate is checked against config_base_url instead of the request host, HTTPS counts X-Forwarded-Proto, every query degrades instead of failing when the database is behind the code, and the page no longer closes the database before the footer; new functions/system_health.php 2026-10-24 14:46:01 -04:00
johnnyq
2b401cb405 Custom Links rebuilt: tabs for the agent menu, top bar, client portal, admin menu and reports menu with counts plus All and Archived, search by name, address or description, sortable columns, each link with its icon, description, address and new-tab marker, links whose address can't work flagged; drag into order on a menu's tab or move up and down, new links at the end of their menu in place of the Order number; one add and edit window with a live preview of the link in its menu, an icon picker with search, a description shown on hover and a new-tab switch that follows the address until changed; copy, open, archive, restore and confirmed delete; addresses limited to web addresses, ITFlow pages, mailto, tel and the remote tool schemes asset links allow, with javascript and data refused and old ones drawn as going nowhere; menus read one shared helper, the agent menu's links sit under Tools even without Reports, the admin menu's get a Links heading, new-tab links get a small arrow, links without an icon get the link arrow and every link shows its description on hover; fixes mailto and tel links showing as unsupported in the side menus, the portal menu taking any address, the delete message missing the name and the new-tab tick never showing; edits audit what changed from what to what; adds functions/custom_link.php and js/custom_link_form.js, no database change; changelog 2026-10-24 14:03:40 -04:00
johnnyq
359851c876 Security sweep of the 26.11 work: API contact lookup by phone or mobile kept to the key's clients; API credentials refuse a wrong decrypt password instead of saving unreadable usernames and passwords, link credential_vendor_id and credential_software_id, and drop another client's contact or asset; Products Receive window lists expenses only with Financial access and only for clients the agent can open; account ledger, reconcile page and ledger export show lines for clients the agent can't open as Another client with only date, kind and amount, with search and the client filter kept to reachable clients; Tax Collected folds unreachable exempt clients into one line; client-limited agents no longer see other clients' names in the export window client filters, Transfer to Client, company vendor expense lists, My Activity or the New Client duplicate check; Stripe switched off stops guest pay links and saving cards, and the Stripe return never books a payment twice; Admin > Cron job window is admins only; records per page needs the CSRF token and takes only the listed sizes; uploads/canned_responses closed to direct access; Admin > Debug no longer stops at the footer; report export audit log no longer double-escapes names; bulk interface network refuses a deleted network; API assets/update keeps the primary interface IP, MAC and network, tickets/resolve reports success, software/read by name works, clients/create takes the company currency, certificates/create returns its error, clients/archive logs as Client, and the 405 response no longer echoes the method; changelog database step count corrected to sixty 2026-10-23 12:09:07 -04:00
johnnyq
26437daa44 AI stage 4: Billing use case falling back to General; Write it with AI on quotes and invoices whose lines can still change - say what it is for and AI picks lines from the product catalog at catalog prices and frequency, labor in quarter hours at the client's rate, and anything else unpriced for the agent to set (AI never sets a price), with a suggested scope, client note and pre-send checks, optionally using the quote's ticket and the client's people, sites and devices (ticket and documentation only with Support); ticked lines added through billing_ai_lines, taxed by kind, scope and note kept on request, lines that can't go on listed; Write it on the ticket Invoice window describes the work done from replies and notes for the client under the usual ticket line, passwords never sent nor written back; new functions/ai_billing.php, ai_billing_draft and ai_ticket_invoice_description endpoints, billing_ai_writer modal, billing_draft and invoice_description features; callAiApi remove mode also strips made-up secret placeholders; changelog 2026-10-20 21:23:52 -04:00
johnnyq
808c27a0fc AI stage 2: AI on tickets - Draft button in the ticket reply editor that writes the next reply from the ticket or from typed notes, for the reply type picked, leaving internal notes out of anything the client reads, with undo; richer ticket summary from the whole ticket with Save as a note, Copy and Again; Triage with AI suggesting a category and priority shown on the ticket to apply in part or dismiss, logged in the ticket history; automatic triage of new email, portal and API tickets with a Settings > Tickets mode of off, suggest or fill in and a new AI Triage cron job; Write up as a document drafting a knowledge base document from a ticket into the New Document form for the client or the company's own client record, linked to the ticket's asset, with passwords and keys left out as [removed]; new ticket features shown by name in AI Usage; database 3.3.9 adds config_ticket_ai_triage and ai_ticket_triage 2026-10-20 18:58:14 -04:00
johnnyq
80cdc4de41 AI stage 1: rebuild AI Providers and AI Models in the standard list pattern with ready-made provider kinds (OpenAI, Anthropic, Azure OpenAI, Gemini, Mistral, Groq, OpenRouter, Ollama, LM Studio, OpenAI-compatible), Test that lists a provider's models, Save anyway for a provider that doesn't answer, a first model offered when adding the first provider, the API key no longer shown, from-to audit lines, and delete confirms that say what goes and what stops; model window with suggested models, use case notes and Try it; new AI Usage page logging each request by feature, user, client, model, tokens, time and failure, with totals, views and filters, pruned with the audit log; passwords, keys, 2FA links and card numbers taken out before sending and put back in the answer, on by default per provider; new Use AI role permission; Reword shown only when set up and allowed, placed first in the toolbar, with its own instructions, undo in one step and a fixed endpoint on admin pages; ticket summary and template drafts purified; Settings overview warns while AI requests keep failing; database 3.3.8 adds provider kind and redact, ai_usage and module_ai 2026-10-20 17:45:00 -04:00
johnnyq
8d3fbcb2ab Payment Providers stage 3: the providers list shows card payments in the last 30 days with their total and the last payment date, and fees recorded in 30 days with a count of payments whose fee is still to record, flagged once more than two days old; adds Check connection, which reports the Stripe account the saved key belongs to or why it is not connected, and Record fees now, which runs the nightly fee reconciliation on demand through the same shared function the nightly job now uses; Settings > Invoices and billing shows how card payments stand under Paid online, and the Settings overview flags test keys, card payments going into an archived account, and Stripe fees not being recorded, with the Invoices and billing tile showing whether cards are on; overview warnings keep their button beside the text where there is room 2026-10-20 16:17:32 -04:00
johnnyq
7ca39973d0 Payment Providers stage 2: Saved Cards rebuilt in the standard list pattern showing whose card it is, the card brand and last four digits, expiry with expired and soon flags, and the recurring invoices that autopay with it and their next date, flagging an expired card on autopay as one that will be declined; adds All, On autopay and Expired tabs with counts, client and provider filters, search by customer and payment method ID, and sort by expiry; the Payment Providers list links to each provider's cards and autopay; removing a card names the autopay that stops, detaches it at Stripe, records the stopped autopay in each recurring invoice's history and states when Stripe could not be reached 2026-10-20 15:26:22 -04:00
johnnyq
a165189cc3 Payment Providers stage 1: list rebuilt in the standard pattern showing on or off, live or test mode from the keys, where payments go, the card limit, whether fees are recorded, saved cards with autopay and the last card payment; providers can be turned off and on, and delete states the saved cards, autopay and client links that go with it; Add and Edit share one window that no longer shows the secret key and checks the keys, the live and test mode match, the card limit and the fee vendor and category, and checks new keys with Stripe before anything is saved, showing problems beside each field; fees use a single record-fees switch with vendor and category; changes are logged from old to new value with keys logged only as changed; fixes a rejected Stripe key being saved, the empty provider name and PHP warnings on edit, the ignored enable expense switch, and the stale Online Payment path in the account archive message 2026-10-20 14:16:27 -04:00
johnnyq
cd52393138 Settings stage 4: Mail's Sending, Receiving, OAuth and From addresses tabs moved into the settings frame with provider-driven fields, refusals shown beside each field on the same tab and changes logged from old to new; passwords, the OAuth client secret and refresh token are no longer written into the page and are saved exactly as typed; a changed OAuth app or refresh token clears the cached access token, the access token field is removed and Microsoft 365 requires the tenant ID; the Microsoft connect callback stores only the tokens instead of switching both Sending and Receiving to Microsoft 365; Enter saves on the OAuth tab and on Logs; From addresses that are not email addresses are refused and From names keep their punctuation; removed the broken custom fields page with its handler and modals, the unused AI and online payment settings handlers, and the client autopay page 2026-10-20 12:56:01 -04:00
johnnyq
23297082ae Mail queue stage 3: show failed and stuck mail on the Settings overview and Mail tile, a mail queue summary on the Mail Tests tab and a failed-this-week count on the Mail Queue menu item, add Mail Queue to the Ctrl K search for admins, and say where to watch a test email go 2026-10-20 11:35:36 -04:00
johnnyq
0618ecfdd0 Mail queue stage 2: keep why each email failed or who cancelled it in the new email_queue.email_error column (database 3.3.7), written by the worker on every failure path and cleared on send or retry, show and search it on the list, include it in failure alerts and alert when the last retry gives up, and rebuild the email view with its status, reason, recipients, tries, times, attachments, calendar file, Retry now, Cancel and Delete, showing the message in a sandboxed frame 2026-10-20 11:34:57 -04:00
johnnyq
7e2971b610 Mail queue stage 1: rebuild the mail queue list with Waiting, Sending, Retrying, Failed, Sent and Cancelled tabs and counts, a status line per email, a banner when sending is off, cron is off or not running, the job is disabled or mail is waiting too long, and Retry now, Cancel and Delete per email and in bulk applied only where possible, add a Cancelled status, record the failure time for bad addresses, share the retry limits between the page and the worker, and fix the theme favicon reset failing on its audit entry 2026-10-20 11:34:23 -04:00
johnnyq
c20015ab45 Settings stage 3: rebuild Notifications as plain sections with a mail-off warning, move Security, Client portal, Single sign-on, Mail and Logs onto the settings frame, refuse a required login key with none set and show the agent sign-in address as the key is typed, stop putting the Entra client secret into the page and keep it when left empty, point the recurring invoice drafts note at Notifications, and add matching settings to the Ctrl K search for admins 2026-10-20 11:30:27 -04:00
johnnyq
928fc5f10a Settings stage 2: move Tickets, Projects, Quotes, Invoices and billing and Defaults onto the settings frame with sections and live next-number previews that refuse a number already in use, validate email addresses instead of blanking them, check the ticket close time and stop its PHP warnings, warn when late fees are on but reminders are off, limit the start page to real ITFlow pages and escape it where shown, keep archived default accounts, rename the Defaults fields to their columns, and keep the reminder, billing time, expense and mileage anchors 2026-10-20 11:29:58 -04:00
johnnyq
1b0169f421 Settings stage 1: add a Settings overview with a tile and current summary for every page, attention items for problems and a Find a setting search that opens the setting highlighted, add a shared settings frame with described sections, a save bar with unsaved state and Undo, a leave-page warning, server-side validation that keeps typed values and audit entries listing each change from old to new, and move Company details, Localization, Theme, Modules and Telemetry onto it with logo and favicon previews, the company phone following the country, a localization sample, a live theme preview, white-label key checks and Telemetry as a single switch 2026-10-20 11:29:24 -04:00
johnnyq
717c6234d5 Vendor templates stage 4: add Reports > Vendor Templates showing per template the client vendors added in the period against the one before, clients with one, out of step and missing account numbers, coverage of the clients that should have it, and licenses, assets, cases and spend by permission, plus a by-client view of the vendors each should have and is missing, with CSV export, linked from the vendor templates list and template page 2026-10-20 11:23:09 -04:00
johnnyq
6bb830ed3f Vendor templates stage 3: add a status page and support portal to vendors and vendor templates, linked from the vendor page, quick look, vendors list and its tickets and kept in step from the template, keep the account manager line and email on templates for new vendors only, add Export and Import of vendor templates with skip, add or replace for existing names and never account numbers or PINs, refresh the starter vendor templates with support sites, status pages, portals and what support asks for plus an Update for ones added before, carry the status page and portal in license template files, the API and exports, stop making a support site with a non-http scheme a link, and database 3.3.6 adds the new vendor and vendor template columns 2026-10-20 11:21:58 -04:00
johnnyq
cd03a7765d Vendor templates stage 2: keep client vendors in step with the template they were made from - saving a template updates the fields its vendors still shared, the template window gets the vendor window's tabs, a template page shows each client vendor as in step or the fields it differs in with Bring in line, Link and Unlink, lists hand-made vendors that look like it to link, and sets who should have it (no one, every client or clients with chosen tags) with coverage and Add to clients for those missing; the list gains Required and Out of step tabs, a client vendor shows its differences with Update from template, a client's Vendors list and overview show vendors missing, Add to clients no longer skips a client whose vendor from the template was archived, and database 3.3.5 adds vendor_template_required, vendor_template_required_tags and a vendor_template_id key on vendors 2026-10-20 11:20:45 -04:00
johnnyq
dfc708145d Vendor templates stage 1: Admin > Vendor Templates rebuilt on the standard list with Active and Archived tabs, support line, hours and SLA, how many clients have a vendor from each, last used and changed by, sortable and searchable including by support line; new template page with what a vendor starts with, the clients with it and their account numbers, the license templates that use it, made and changed by, and history; shared New/Edit window on the vendor window's tabs with per-field push to the vendors made from it, each logged on the vendor; copy, archive, restore and delete with vendors and license templates unlinked on delete; Make a template from a client's vendor, linking the vendor to it, and the vendor page linking its template for admins; Delete offered to every admin role, not only the built-in Administrator; the admin handler no longer includes the agent vendor handler; database 3.3.4 adds vendor_template_created_by and vendor_template_updated_by, backfilled from the audit log 2026-10-19 12:34:53 -04:00
johnnyq
a5a43e37ac Audit logs stage 3: failed sign-ins say why and are logged against the account they were for - wrong password, no account with that email, disabled, archived or invited account, client archived, portal turned off, a wrong MFA or two-step code after the right password - with failed Microsoft 365 portal sign-ins logged too and marked Their account in the audit log; the IP lockout counts portal failures as well; the first sign-in from an IP address is badged New IP in the audit lists and quick look; new Admin > Sign-ins under Access with People and IP addresses views, search, date filter, sortable columns and paging; admins get a notification and an email on a run of failed sign-ins or turned-away API calls from one address or against one account, set in Settings > Security (10 to start, 5, 20, 50 or never), each in the audit log Security view and in Mail > Previews; API calls counted per key, day and endpoint, with a 30-day calls column and last IP on API Keys and a usage window, expired-key calls logged against the key, and usage deleted with the key and after the log retention; database 3.3.2 drops the unused auth_logs table and adds settings.config_login_alert_failures and api_key_usage; new functions/sign_in.php, admin/sign_ins.php and admin/modals/api/api_key_usage.php; the license template page no longer warns when view is missing 2026-10-19 00:56:52 -04:00
johnnyq
f43d4a9127 Audit logs stage 2: record history and a client Audit Log for agents, scoped to their role; auditLogKinds() gives each kind the module that shows it, with new auditLogRoleSql() (everything for an admin, otherwise the kinds the role reads and never Denied), auditLogHistory(), auditLogHistoryUrl(), auditLogHistoryHtml(), auditLogHistoryCard() and auditLogHistorySection(); a History tab on contacts, assets, networks and projects, a History card on racks, documents and the ticket, project, document and license template pages, and a folded History on the file, expense, recurring expense and trip quick looks, each newest first with who, when and the IP for an admin, the latest 50 with how many more and a link to all of them; vendors, locations, licenses, services and products use the shared list, and vendorHistory(), locationHistory(), softwareHistory(), serviceHistory() and productHistory() are removed; new agent/audit_log.php in the client nav after Calendar, with search, who, type, action, one record by name, dates, sortable columns, paging and Changes, Deletions, Sign-ins and Data out views, plus the quick look and a link to Admin > Audit Logs for admins; the client overview's Recent activity is role-scoped and links there for everyone; Your account > Activity rebuilt as the same list over the agent's own entries; the document versions card is now called Versions; the admin audit log quick look links to itself absolutely so it opens from agent pages 2026-10-19 00:13:28 -04:00
johnnyq
ea23a2bad5 Audit logs stage 1: Admin > Audit Logs rebuilt on the standard list with search, sortable columns and paging, filters for date, who (agent, portal contact or ITFlow itself), client, type and action, and counted views for Changes, Deletions, Sign-ins, Security and Data out; each entry shows who with their avatar, the client, the type and action as a coloured label, the description without the name in front, the IP and device in words, and links to its record while it exists or says No longer here; a quick look with the full entry, the raw user agent, everything from that IP, the record's other entries and what the same person did 15 minutes either side; CSV/PDF export with the page's filters, view and picked columns, itself audited; new functions/audit_log.php, admin/modals/audit_log/audit_log.php and audit_log_export.php, admin/post/audit_log.php and audit_logs export columns; agent/files.php takes ?open= for a file's quick look; database 3.3.1 adds log_client_id and log_entity_id keys on logs, gives each action one name (Unarchive/Restored to Restore, Deleted, Merged, Closed, Reopened, Resolved and Sent to Delete, Merge, Close, Reopen, Resolve and Send, Client Access to Denied, saved card and payment provider Updates to Create or Delete, contract template Update to Edit, type client to Client) and repoints entries at the right record (reply edits and redactions to the ticket, API document edits to the document, reimbursements to the recording expense, API client restores to the client), guarded so it can run again; logAudit call sites in agent, admin, api, client, cron and functions use the same names and record ids 2026-10-18 22:36:25 -04:00
johnnyq
ad271aaa87 License templates stage 4: export license templates to a file (every current one, the ones picked including archived, or one from its page or row), carrying what a license starts with, the vendor template without account number, code or contact, and the product name, but not who should have it; import a file, skipping, copying or replacing templates already here by name, matching vendor templates by name or creating them from the file, matching current products by name without creating any, and on replace keeping licenses, who should have it and the template's own product unless the file's product is here; add a License Templates starter pack of 20 common MSP licenses with type, licensing, renewal term, notes and vendor, linked to the products of the same name once Products & Services is loaded, plus an Update that refreshes the ones already here; add Import, Export, the report and the starter pack to the New License Template menu; add a License Templates report by template and by client covering licenses made, seats in use against bought, renewals, coverage of the clients that should have one and, for Sales users, licenses billed and their monthly value, with CSV export 2026-10-18 21:42:31 -04:00
johnnyq
b76bdd4b82 License templates stage 3: a template can be required of every client or of clients with certain client tags (database 3.3.0, tags kept when tags are merged); the template page shows how many of those clients have it and lists the missing ones with Make and Make for the clients missing one; the list gains a Required tab and a coverage chip; a client's Licenses page shows the licenses it should have but doesn't, opening New License from the template, and the client overview counts them under Licenses missing; the template page lists its licenses by client with seats, renewal and billing state, with views for over seats, spare seats, renewing soon, expired and not billed, an action for each view and bulk Renew, True up seats and Bill seats; true-up sets seats bought to the seats in use or a typed number; Bill seats adds a line for the template's product to each client's recurring invoice that follows the license's seats bought or in use, using seats in use for licenses with no seat limit; the Renew window now posts to the agent handler so it also works from Admin 2026-10-18 21:10:29 -04:00