johnnyq
|
a85bcc1169
|
Add a Client portal view to Admin > Users listing every contact with a portal login across all clients, with their client, how they sign in, two-step status and last sign-in, searchable by name, email or client, sortable, paged, and filterable by client and by sign-in (password, Microsoft 365, no two-step, never signed in, access off); add row and bulk actions to email a password link or the invite again, turn off two-step sign-in, forget remembered browsers, and turn portal access off or back on, each logged against the contact; add the portal user helpers in functions/portal.php, have the portal's People page turn access off through the same function, which now also forgets remembered browsers, and keep the Users search to the side being looked at; add the changelog entries
|
2026-11-10 15:30:10 -05:00 |
|
johnnyq
|
6ecc27e7ca
|
Version ITFlow's scripts and stylesheets so browsers fetch the new copies after an update instead of needing a cache clear: add staticFileUrl() in functions/app.php, which adds ?v= and the file's modification time to the address, and send every script and stylesheet tag through it, libs included, with page-relative addresses changed to start from the site root; add js/tinymce_defaults.js to set TinyMCE's cache_suffix so the plugins, theme and skins it loads itself are versioned too; load ticket collision detection only when a ticket is shown, so a ticket that isn't found no longer throws a script error; add changelog entries and a CONTRIBUTING rule that new tags must use staticFileUrl()
|
2026-11-09 01:22:35 -05:00 |
|
johnnyq
|
076f4295be
|
Bug fixes
|
2026-11-07 12:26:58 -05:00 |
|
johnnyq
|
2a36534583
|
Add demo mode for a public demo like demo.itflow.org - $config_demo_mode = true; in config.php puts one-click sign-in buttons for Admin, Technician, Accountant and a client portal contact on the sign-in page and a demo notice on every page, and the new Demo Reset cron job rebuilds the demo nightly at 2:00 AM from db.sql with all starter content, the demo clients and the demo accounts, empties uploads except the logo and signs everyone out, keeping the company details, timezone and cron schedules; visitors can try everything except users and roles, their own sign-in details, mail, payment, AI and texting settings, API keys, backups, updates, cron, log forwarding, company, module and portal settings, custom links, starter content and share links, Debug is closed, guest links open only for someone signed in, queued email is cancelled with the reason, no sign-in alert emails are sent, certificate checks reach only public addresses on port 443, and the domain and certificate refreshers are left out; new functions/demo.php and cron/demo_reset.php, no database change, changelog, CONTRIBUTING and README updated
|
2026-11-06 17:46:40 -05:00 |
|
johnnyq
|
79e616614a
|
Set up a hosted instance and connect it in one command - Add Instance takes the address it will have, and the instance page gives a ready setup_cli command with the connection code and the client's company name, address, phone, website, tax ID, currency and primary contact as the first admin; setup_cli gains --manager-code and --manager-required (connects after setup, writes the managed line to config.php, exits 3 if it set up but could not connect), --ask-missing, --generate-password, --json and ITFLOW_SETUP_ environment variables for any option, and shows the cron job as a crontab line and for a hosting panel with the full PHP path; Managed Instances shows a connected instance whose cron has never run as Waiting for its cron job with the command to add, and the Managed Instances job says so in its notification; new managedSetupCommand(), the cron command in the instance report and the waiting state in managedInstanceHealth(), changelog updated
|
2026-11-06 14:29:27 -05:00 |
|
johnnyq
|
b391e2ce6c
|
Add Skyetel text messaging with two-way ticket texting, text to ticket for contacts, Text reply on tickets, a Texts inbox for unmatched numbers, verification codes and spam (codes masked, limited to credential access, every reveal audited, wiped after a day), STOP/START/HELP handling, a text log with retry and cancel in Maintenance > Text Messages, the Text Messages cron job, and texts to clients about their tickets, visits, visit reminders and invoices with per-contact opt-in from the contact, by text or in the client portal, quiet hours, and new settings in Tickets and Notifications (database 3.6.0 and 3.6.1)
|
2026-11-06 00:08:10 -05:00 |
|
johnnyq
|
87cdf79b28
|
Make managed mode off by default and turned on per side in config.php - $config_enable_managed_instances = true; adds Admin > Managed Instances, the api/managed endpoints and the Managed Instances cron job, and $config_enable_managed_by = true; (or $config_manager_required = true;) adds Admin > Managed By, the Manager Check-in cron job and support sign-in; with a side off its menu entry, pages, modal, post handler and cron job are gone, the manager endpoints answer 503 so instances keep their connection and retry, a connected instance stops checking in and its locks, read-only and suspended lift while its connection is kept, any open support session is ended, and the support user still takes no seat; new managerEnabled(), managedEnabled() and managedConnected(), the cron registry and health check leave out the jobs of a side that is off, changelog updated
|
2026-11-05 20:17:42 -05:00 |
|
johnnyq
|
b5ceeb4eaf
|
Bill sign-ups through the API and follow up when an invoice is paid - a lead that pays an invoice in full becomes a client however it is paid (online, autopay, a recorded payment or a batch), with the new A lead that pays an invoice becomes a client switch in Admin > Settings > Invoices and billing, on by default; a non-billable open ticket tied to an invoice (one raised through the API with ticket_invoice_id, or a quote's tickets once it becomes the invoice) gets an internal note when the invoice is paid in full, goes from On Hold back to Open, and its assigned agent is notified in the app and by email, while billable tickets whose time is on an invoice are left alone; new API endpoints recurring_invoices/create (lines from products or spelled out, the client's currency, frequency, start date, optional first invoice made at once and emailed to the primary and billing contacts, or marked Sent so its link can be paid, the answer including the invoice reference, amount, due date and pay link), recurring_invoices/read and portal_invites/create (sent from the company rather than the key's agent); tickets/create takes ticket_status (an active status other than Resolved and Closed), ticket_invoice_id (one of the client's own invoices) and ticket_notify agents to tell only the team; database 3.5.9 adds settings.config_invoice_paid_lead_to_client; invoicePaidFollowUp() runs from triggerCustomAction() on invoice_pay, with recurringInvoiceCreate(), billingInvoiceIssue() and the paid kind of ticketAgentEmailContent() in support; the Clients list reads each contract's term, so Renews soon shows again and its PHP warning is gone; changelog updated
|
2026-11-05 19:00:16 -05:00 |
|
johnnyq
|
294352fd8b
|
Let the API raise a ticket from a ticket template - tickets/create takes ticket_template_id, giving the ticket the template's subject and details when none are sent, its category, priority, billing and agent unless sent, and its tags, due time and tasks (the ones the answers call for), with the template's fill-ins answered from ticket_fill_ins and its placeholders filled in, and a missing or archived template, fill-ins that aren't an object, a required fill-in left out or a choice not on a list refused with 400 and the reason; ticket_notify sends the contact and watchers the Ticket Created email when Email clients about their tickets is on, tells the new-ticket address and notifies the assigned agent in the app and by email; the answer now includes ticket_reference, ticket_url (the contact's link to the ticket) and, from a template, ticket_tasks; canned responses now fill in a ticket's template fill-in answers such as [Hostname] alongside [Contact] and [Ticket], never over a built-in placeholder of the same name, and the canned response form says so; contacts/create and locations/create no longer write a PHP warning for each field left out; the new-ticket agent email reads raised through the API; changelog updated
|
2026-11-05 17:39:22 -05:00 |
|
johnnyq
|
1649db51a5
|
Add secure link sharing for the client IT documentation PDF: new Export shared-link type started from Export Data (Share a link, carrying over the ticked sections) or Shared Links (Share the IT documentation), PDF built at share time with the sharing agent's permissions and stored in uploads/shares encrypted with the link-derived key, deleted when the link is ended, expires or is used up and swept by the nightly prune, PDF password required and the sharing protection policy applied when passwords and 2FA secrets are included, guest page with Download the PDF and a password hint, download notification and client audit entry, section picker takes an id prefix and preselected sections, changelog updated
|
2026-11-05 16:03:43 -05:00 |
|
johnnyq
|
3b5c11c552
|
Add managed mode, so one ITFlow can manage others - Admin > Managed Instances adds an instance and gives a one-time connection code (a week) that the other ITFlow pastes into the new Admin > Managed By, after which it checks in every minute from the new Manager Check-in cron job with a health report (versions, update waiting and whether it has security fixes, cron, last backup, errors today, agents against the seat limit, clients, storage) and takes back what the manager sets; the manager lists each instance's version, health, seats and last check-in with a page per instance showing what needs a look, its requests and everything it reported, can update it by hand or automatically after a set number of days (security releases straight away, not retried for six hours after a failure), set its seat limit and white-label key (locked on the instance while set), make it read-only (look, export and download only, across agents, portal, guest links and the API) or suspended (a notice with the manager's message and contact, 503 for the API) with other cron jobs paused until it is active again, sign in to it as support through a signed one-time two-minute link into a two-hour session that takes no seat, can't open the vault and can't set passwords or make API keys, and remove it, while the new Managed Instances job notifies when one stops checking in and closes requests never answered; instances only call the manager, can disconnect unless config.php sets $config_manager_required, and the Update page and queue_update defer to the manager; database 3.5.8 adds managed_instances, managed_instance_commands, settings.config_manager_keys and settings.config_managed, the logic is in the new functions/managed.php with api/managed/enroll.php, api/managed/checkin.php, login_support.php and includes/managed_blocked.php, cronJobClaim() takes a paused reason that leaves a due job due, getAgentUserLimit() and getActiveAgentUserCount() honour the manager's limit and leave out the support user, the vault helpers read a missing session key as empty, the audit log knows the new types and actions, and the email parser no longer logs an App Logs error every minute while parsing is switched off; changelog updated
|
2026-11-05 15:22:41 -05:00 |
|
johnnyq
|
d7bc1bccf7
|
Make Maintenance > Update easier to follow - it opens with where the install stands (up to date, an update available, updating, the database still to finish, checking) and the one button for it, Update ITFlow in place of Queue Update, with what's new below it (the release notes between this install and the latest, read from the changelog by the update check, developer notes and commits folded away), what to do first including the ITFlow files changed on this install that updating would put back, the update shown running with the page refreshing itself and then when it finished or what stopped it, and this install's version, branch, database, commit, last check, last update, cron and the command to update from a shell alongside; database 3.5.7 adds settings.config_update_details, written by cron/update_check.php through the new updateCheckDetails(), updateChangelogSections() and updateChangelogHtml() render the release notes escaped, cron/app_update.php asks for a fresh check after an update, changelog updated
|
2026-11-05 14:25:19 -05:00 |
|
johnnyq
|
c11de9a599
|
Drop the phone formats build script from scripts/ - it is a maintainer tool, not one for installs - and say in functions/phone_formats.php where its rules came from (libphonenumber v9.0.43's PhoneNumberMetadata.xml), how they were taken and to make it again from a newer release rather than edit it by hand; changelog updated
|
2026-11-05 13:24:59 -05:00 |
|
johnnyq
|
3143cdb115
|
Fix phone numbers keeping the 0 dialled at home after the country code (+49 0172 1234567) and click-to-call dialling it - formatPhoneNumber() now writes every country's numbers with Google libphonenumber's rules from the new functions/phone_formats.php, built by scripts/phone_formats_build.php from libphonenumber v9.0.43, taking off the national prefix and a typed-in country code where what is left is still a number of that country, with the international format after the code and the national format without it, German landlines split after their area code, Italy keeping its 0 and North America unchanged; the new phoneDialNumber() gives tel: links +code and the number without its prefix, used by contactPhoneLink(), vendorDialNumber() and every hand-built tel: link on the agent side, the client portal and the guest ticket page, and the ticket quick look now dials the extension after a pause instead of running it into the number; changelog updated
|
2026-11-05 13:16:06 -05:00 |
|
johnnyq
|
cf2c9c2d9b
|
Let clients pay the card fee - turn on Clients pay the card fee on Stripe in Admin > Payment Providers with Stripe's percent and fixed rate, and each card payment in the client portal, through an invoice's link, by autopay or from Charge Saved Card is grossed up so Stripe's fee comes out of it, with one fee per payment shared over its invoices; the fee is shown before paying (Pay invoices, checkout, the guest pay page, invoice pages, autopay and the Charge Saved Card window) and goes on each invoice as a Card Fee line with no tax when the payment is booked, carried in the PaymentIntent's itflow_fees metadata and checked against the amount received to the cent; a client can be let off it with No card fee on their Billing tab, refunding a card payment takes its Card Fee line back off, autopay and Charge Saved Card now compare cents instead of whole dollars, database 3.5.6 adds the provider and client columns, changelog updated
|
2026-11-05 12:47:06 -05:00 |
|
johnnyq
|
e472c95a11
|
Record Stripe fees every 15 minutes instead of once a night - a new Payment Provider Fees cron job runs the fee recorder that Nightly Tasks used to, Nightly Tasks no longer does, the recorder holds a lock so the job and Record fees now can't both record the same fee, and the payment provider screens no longer say fees are recorded each night
|
2026-11-04 14:38:32 -05:00 |
|
johnnyq
|
66d08c00be
|
Fix Transactions Money in and Money out on All accounts counting every transfer twice - a transfer is money moved between your own accounts, so across all accounts both of its lines are now left out of the totals, the Money in and Money out pills and their export, while the Transfers pill still lists them and a single account's view still counts them as money in and out of that account
|
2026-11-04 14:29:01 -05:00 |
|
johnnyq
|
aff6812036
|
Security: hold an agent who must set up MFA to the set up page on every request, not just at sign in, and fix the client portal two-step gate, which a path added to the URL or a second action sent with the set up one got past - both now go through requestIsMfaSetup(), which checks the script actually running and every key in the request; View as contact is refused while an agent still owes MFA set up, and agents are emailed when MFA is turned on
|
2026-11-04 14:01:40 -05:00 |
|
johnnyq
|
9b92261e8c
|
Security: end a user's other sessions when their password changes - each session carries a stamp of the password it signed in with and the agent and client portal checks sign out any that no longer match, covering a self change, an admin setting it, the incident-response reset, portal reset links and invites, and View as contact; a portal self change keeps the browser that made it on a new session id
|
2026-11-04 13:50:17 -05:00 |
|
johnnyq
|
6e0acd2d31
|
Security: stop a backup restore from carrying .htaccess, .user.ini or .htpasswd files into uploads or writing into the backup storage directory, always rewrite the backup storage guard instead of only when missing, and rewrite the shipped deny-all guards in uploads/backups, canned_responses, expenses and tmp after every restore
|
2026-11-04 13:25:42 -05:00 |
|
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
|
8e24607a0a
|
Contracts: refuse impossible dates (2026-02-30) when adding, editing, activating, renewing, cancelling or starting from a template instead of failing on save; keep each term to the day of the month it started on or the last day of a shorter month so month-end contracts no longer drift (PHP, nightly renewal, the Renew window, templates, Standard terms and contract_form.js); withdraw signing requests still waiting on the client or a countersignature when a contract is cancelled, when it ends nightly or when its client is archived (singly or in bulk), and refuse signing or countersigning on ended, cancelled or archived-client contracts through the link, the portal and Countersign; leave archived clients' contracts alone nightly (no renewing, ending or reminders), keep them out of the all-clients list, Due soon and the side menu count, and refuse sending them to sign; count a self-renewing contract as due soon and remind about it only when its notice date falls within its term, so Standard terms and monthly contracts with 30 days' notice no longer remind every term; keep drawing and adding prepaid hours on a cancelled contract until its last day; refuse deleting a contract once tickets drew on its prepaid hours or it was signed by both, showing why in place of Delete; changelog updated
|
2026-10-28 23:51:45 -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
|
33b13206a5
|
Contracts from the client: New Client and Edit Client can start a contract from a template on the Billing tab, active from a picked day with the template's terms, the primary contact and the agent looking after it; the clients list gets a sortable Contract column showing the contract in force with its renewal and how many more are in force, or None with the next or draft contract or Start a contract, a Contract filter for one in force, none in force or one from a template, and a Start Contract bulk action; changelog updated
|
2026-10-27 23:39:30 -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
|
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
|
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
|
96076d295e
|
Ticket emails carry the conversation: the new message first, then earlier public replies newest first and the request, as short plain-text excerpts without pictures, cut when long, with the rest counted after four, never internal notes, archived replies or the portal's resolve, reopen and close lines; resolved, closed, work booked, watcher added, assigned to you, client replied and the SLA alerts all carry it, so resolving with the Resolve button or on the board no longer sends an empty Resolved email; the inbox preview line is the start of the message or what happened instead of the number and subject; the new ticket email to a client's colleagues shows what was asked for portal and agent tickets but never an emailed ticket's words, and the emailed-ticket confirmation still doesn't repeat them; the email parser cuts a plain-text reply at the reply line too; adds emailPlainText, ticketEmailHistory, ticketEmailExcerpt and ticketEmailPreview and a history block in emailHtml; changelog
|
2026-10-24 13:27:48 -04:00 |
|
johnnyq
|
9a793bee98
|
Guest ticket page rebuilt to match the client portal's ticket: logo, status badge and progress, conversation oldest first with each message's files, details, request details and a Contact us panel; shows when you will reply while the SLA response time is still ahead, work booked on the ticket (onsite with the site's address, or remote) with Add to calendar, and tasks waiting for client approval; Reply by email with the ticket number in the subject when the ticket mailbox is parsed, Reply in the client portal, and Call on Urgent and High tickets; close, reopen and rating are now form posts that act once, reopen restarts the resolution SLA and notifies agents, close stops the SLA clock, and the rating takes Good or Bad only and only once; the link key must match exactly, the page sends no referrer and can't be framed, files come through new guest_ticket_attachment.php with the portal's rules and download logging, never the parsed email; fixes contact photos not showing and the rating custom action never running; adds ticketByGuestKey, ticketGuestPath, ticketScheduleRow and ticketScheduleIcs, which ticketSetSchedule now uses for its calendar file; changelog
|
2026-10-24 12:55:22 -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
|
e76fb69928
|
AI stage 3: AI for clients and documents - Reword becomes a split button with tones (shorter, more formal, friendlier, plain English, organize into headings and lists, spelling and grammar only) and Translate into 30 languages with the last pick remembered, recorded as its own feature; client Briefing on the client overview for the last 30 days, quarter or year covering open work, recurring problems, upcoming renewals and scheduled work, money only for roles with Sales and things to bring up, never credentials or license keys, with Save as a document; Draft it with AI in New Document using what ITFlow knows of the client unless unticked, leaving unknowns in square brackets; Review with AI on a document's page giving a verdict, findings in order of importance and a summary to use, flagging passwords and keys written in it and never sending them, beside Mark reviewed; no database change
|
2026-10-20 20:20:23 -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 |
|