Ndizi Project Management

Changelog

1.1.2

  • Invoice Payment Records: Added a repeatable payments ledger to invoices (_ndizi_invoice_payments: date, amount, method, note) with an editor in the Invoice meta box, partial-payment support, and a running Total Paid / Balance Due readout. Exposed over the REST API with a capability-gated auth_callback (ndizi_manage_invoices).
  • Automatic Status from Payments: Invoice status now derives from recorded payments on save — paid when fully covered, partial when partly paid — unless the invoice is Draft or Void. Added a Partially Paid status.
  • Balance Due Display: The printable/PDF invoice, client portal, and admin Invoices list now show amount paid and outstanding balance; the portal “Pay Online” button reflects the remaining balance.

1.1.1

  • REST Meta Exposure: Added custom-fields support to the Client, Project, Task, Invoice, Contact, and Time Off Request post types so their registered show_in_rest meta is now readable through the core REST API. Previously this meta was silently dropped, blocking external integrations and imports.
  • Capability-Gated Meta Writes: Client, Project, and Invoice meta (including _ndizi_client_id, _ndizi_invoice_number, _ndizi_invoice_currency, _ndizi_invoice_line_items, and _ndizi_external_source / _ndizi_external_id) is now writable over REST only by users with the relevant ndizi_manage_* capability, via per-meta auth_callbacks. Task, Contact, and Time Off meta remains deny-by-default and is not REST-writable, preventing an unprivileged user from altering sensitive fields such as time-off approval status.

1.1.0

  • Direct Client Invoicing: Invoices can now be created and assigned directly to a Client without requiring a Project selection.
  • Structured Repeatable Line Items: Added line item editor in the Invoice meta box with dynamic total calculations, rendered in printable templates, CSV/JSON exports, and Stripe Checkout.
  • Dedicated Invoice Numbers: Support custom invoice numbers (_ndizi_invoice_number) displayed across Admin list tables, printable views, exports, portal lists, and Stripe.
  • Multi-Currency Support: Configurable global site default currency (Settings → General) and per-invoice currency dropdown selection, formatted dynamically in tables, exports, and Stripe payloads.
  • External Provenance Metadata: Added _ndizi_external_source and _ndizi_external_id metadata fields to Clients, Projects, and Invoices.
  • Direct Client Time Tracking: Support tracking time directly to a Client (optional Project and Task selection) across the custom database table, REST API, WP-CLI, Admin Bar quick-timer, Standalone PWA tracker, Reports dashboard, and the Time Entries DataViews table.

1.0.3

  • Fixed a bug where submitting the Client Portal login key could blank the page instead of logging the client in (a redirect was resolving the current URL too early in the request lifecycle).
  • The Client Portal block now has per-block toggles for task submission (on by default) and out-of-office requests (off by default), so a dashboard can be display-only for tasks or hide time-off entirely.
  • Out-of-office requests are now their own module (Ndizi PM → Settings → Active Modules), so admins who don’t need them can turn off the admin screen and portal support site-wide.
  • Added a Copy Portal Link row action to the Clients list table that copies a client’s login link to the clipboard. The plugin tracks which published page(s) contain the Client Portal block, and a new Settings → Client Portal section lets you pick the default page when more than one qualifies.

1.0.2

  • Google Fonts (Inter & Outfit) are now opt-in: a new Settings → Typography toggle, off by default, gates all requests to Google’s font servers. When disabled, the UI uses a web-safe system font stack.
  • Compiled assets now ship with their human-readable source: the src/ directory is included in the package, and the readme documents how to rebuild build/ from it.
  • Inline scripts and styles are now routed through the WordPress enqueue system (wp_enqueue_*, wp_localize_script(), wp_add_inline_script(), wp_add_inline_style(), wp_print_styles()/wp_print_scripts()) instead of hardcoded <link>/<script> tags or echoed <style> blocks.
  • REST URLs are now built with rest_url() (and add_query_arg()) instead of hardcoding the /wp-json/ path, so the iCal feed and Stripe webhook URLs work across custom REST prefixes.
  • Documented all third-party services (Google Calendar, Google OAuth, Stripe, Google Fonts) in a new “External services” readme section.

1.0.1

  • Fixed a _load_textdomain_just_in_time notice (WP 6.7+) caused by translations running before the init action; the module registry is now translation-free and labels load at display time.
  • Fixed the Playground demo not seeding mock data: the destructive-seed guard keyed on an unreliable Playground check, so it blocked seeding. It now gates on the environment type, and the demo blueprints declare a non-production environment.
  • WordPress.org Plugin Check pass: direct-file-access guards on block render and seed templates, prefixed/scoped file-scope variables, and documented database-query annotations.
  • Added a WordPress Playground live demo (Live Preview blueprint).
  • Now requires WordPress 6.9 or later (for the Abilities API integration).

1.0.0

  • First stable release.
  • New Time Entries management screen (Ndizi PM → Time Entries) built on @wordpress/dataviews: sortable, filterable table of all time logs with merged Project/Task and Date columns.
  • Manager-facing approval workflow UI: multi-select bulk Approve / Unapprove actions on the Time Entries screen (manager-only). Approval-only updates are permitted even inside locked billing periods.
  • Time-entry datetimes now render from UTC to site-local time in the table.
  • Shared DataViews vendor bundle (build/vendor-dataviews.js/.css) registered as the ndizi-dataviews script/style handles for reuse across admin screens.
  • Hardening and correctness fixes: time-entry approval restricted to managers with approved_by controlled server-side, dev seeder (?ndizi_seed) guarded against unauthorized use, REST error codes/statuses mapped correctly for time-log writes, and per_page/page clamped on time-log queries.

1.0.0-alpha.2

  • Google Calendar integration: tasks and time entries synced via OAuth2; iCal subscription feed at /wp-json/ndizi/v1/calendar/ical.
  • Stripe online payment: “Pay Online” button in client portal, Stripe Checkout session REST endpoint, and webhook auto-mark-paid handler.
  • Client portal time-off/absence request form (creates ndizi_time_off CPT posts).
  • Time entry approval workflow: approved / approved_by DB columns; approved entries block edits and deletion.
  • Chrome browser extension for timer control from any browser tab.
  • Standalone tracker: responsive CSS at ≤480 px, browser push notifications for idle timer, ?desc= pre-fill parameter.
  • Auto DB schema upgrade on plugin init via ndizi_db_version version check.
  • GET /calendar/ical, POST /invoices/<id>/pay, POST /stripe/webhook REST routes added.
  • Portal scripts now receive rest_url for client-side REST calls.
  • WordPress Abilities API: Ndizi capabilities exposed via Ndizi_Abilities for agentic/MCP workflows.
  • Settings page: Google OAuth connect button, Stripe API key fields.

1.0.0-alpha

  • Initial release.
  • Decoupled SQL schema database initialization (wp_ndizi_time_entries).
  • Custom Post Types and taxonomy metadata setups.
  • Integrated admin bar active timer with customizable icons and idle warning banner.
  • Lock date / time entry locking enforced across REST API, DB layer, and admin UI.
  • Hierarchical billing rates (task then user then project) on invoices and reports.
  • Gantt charts and dashboard report pages with date-range, project, and user filters.
  • Date-range filtered time reports with standard CSV and QuickBooks CSV export.
  • Invoice line-item CSV and JSON exports.
  • Shortcode- and block-driven frontend portal with passwordless token auth.
  • Email notifications for task assignment and status changes.
  • Outbound webhooks and Slack incoming webhook integration.
  • WP-CLI wp ndizi time command group (start, stop, status).
  • Modular architecture: feature modules toggleable from the Settings page.
  • REST API controller for external timer integration.
  • Standalone PWA dark glassmorphic tracker page.
  • Hardening: per-post-type verification on meta-box saves, MIME/size/count limits on portal uploads, CSV formula-injection escaping on exports, sanitize callbacks on time-entry REST routes, cryptographically secure client auth-key generator, non-negative rate validation.

Plugin Website
Visit website

Version:
1.1.2
Last Updated
July 21, 2026
Active Installs
10
Requires
WordPress 6.9
Tested Up To
WordPress 7.0.2
Requires PHP
7.4

Share Post

Join our newsletter.

Get insights into what’s happening at ChangelogWP right in your inbox. We don’t believe in spam.