Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
128 lines
18 KiB
JSON
128 lines
18 KiB
JSON
[
|
|
{ "id": "F001", "description": "Decide canonical model: products as service_catalog item kind vs separate products table referencing service_catalog", "implemented": true, "prdRefs": ["5.1", "8"] },
|
|
{ "id": "F002", "description": "Define Product/License taxonomy (item kinds, terminology, UI labels)", "implemented": true, "prdRefs": ["5.1", "10"] },
|
|
{ "id": "F003", "description": "Define required product fields for V1 (SKU, cost, vendor, category/type, GL mapping)", "implemented": true, "prdRefs": ["5.2", "10"] },
|
|
{ "id": "F004", "description": "Document pricing precedence for products (template → contract → schedule → client override → invoice override)", "implemented": false, "prdRefs": ["6.1"] },
|
|
{ "id": "F005", "description": "Document tax precedence for products (product tax_rate_id → client default → external passthrough mode)", "implemented": false, "prdRefs": ["6.4"] },
|
|
{ "id": "F006", "description": "Decide if product lines can be one-time on contracts (bill-once) vs only recurring per cycle", "implemented": true, "prdRefs": ["6.1", "10"] },
|
|
{ "id": "F007", "description": "Decide license modeling: separate item_kind='license' vs product with license properties (term/period semantics)", "implemented": true, "prdRefs": ["5.1", "10"] },
|
|
{ "id": "F008", "description": "Define what 'delete product' means (hard delete vs archive) and dependency behavior", "implemented": true, "prdRefs": ["8", "9"] },
|
|
{ "id": "F009", "description": "Define reporting/export requirements for products (grouping, summaries, categories)", "implemented": false, "prdRefs": ["6.5"] },
|
|
|
|
{ "id": "F010", "description": "Add schema support for product kind and product fields (DB migration)", "implemented": true, "prdRefs": ["5.1", "5.2", "8"] },
|
|
{ "id": "F011", "description": "Enforce per-tenant SKU uniqueness (if SKU enabled/required)", "implemented": true, "prdRefs": ["5.2", "8"] },
|
|
{ "id": "F012", "description": "Support active/inactive availability flag for products", "implemented": true, "prdRefs": ["5.2"] },
|
|
{ "id": "F013", "description": "Support multi-currency sales pricing for products aligned with existing service prices", "implemented": true, "prdRefs": ["2", "5.2", "6.3"] },
|
|
{ "id": "F014", "description": "Attach tax_rate_id to products (nullable = non-taxable) and persist with product records", "implemented": true, "prdRefs": ["6.4"] },
|
|
{ "id": "F015", "description": "Add product category/type metadata for filtering and mapping", "implemented": true, "prdRefs": ["5.2", "7.2"] },
|
|
{ "id": "F016", "description": "Add optional external_ids metadata field(s) for future integrations", "implemented": false, "prdRefs": ["5.2"] },
|
|
{ "id": "F017", "description": "Add 'cost' field for products (stored, non-inventory) for margin reporting", "implemented": true, "prdRefs": ["5.2", "10"] },
|
|
{ "id": "F018", "description": "Add vendor/manufacturer fields for products", "implemented": true, "prdRefs": ["5.2", "10"] },
|
|
{ "id": "F019", "description": "Add unit_of_measure defaults appropriate for products (e.g., 'each')", "implemented": true, "prdRefs": ["5.2"] },
|
|
{ "id": "F109", "description": "Add license term metadata fields on catalog items (e.g., term, billing cadence) usable for license-like products", "implemented": true, "prdRefs": ["5.2", "10"] },
|
|
{ "id": "F109A", "description": "Defer license period start/end dates and proration rules (future)", "implemented": false, "prdRefs": ["10"] },
|
|
|
|
{ "id": "F020", "description": "Add product CRUD actions/service layer (create/list/update/delete) with validation", "implemented": true, "prdRefs": ["2", "7.2"] },
|
|
{ "id": "F021", "description": "Add product list API endpoints and schemas (OpenAPI/REST where applicable)", "implemented": true, "prdRefs": ["2", "6.3"] },
|
|
{ "id": "F022", "description": "Add product search (by name/SKU) and filtering (active, category/type)", "implemented": true, "prdRefs": ["7.2"] },
|
|
{ "id": "F023", "description": "Prevent deletion of products that are referenced by contracts or invoices (or implement safe archival)", "implemented": true, "prdRefs": ["8", "9"] },
|
|
{ "id": "F024", "description": "Validate product pricing: at least one currency price must exist", "implemented": true, "prdRefs": ["5.2", "7.2"] },
|
|
{ "id": "F025", "description": "Validate product pricing: cannot set negative rates; enforce precision/rounding rules", "implemented": true, "prdRefs": ["5.2"] },
|
|
{ "id": "F026", "description": "Validate product tax configuration: allow null tax_rate_id to represent non-taxable", "implemented": true, "prdRefs": ["6.4"] },
|
|
{ "id": "F027", "description": "Add server-side pagination for product listing with stable ordering", "implemented": true, "prdRefs": ["7.2"] },
|
|
{ "id": "F028", "description": "Add CSV export of products (name, SKU, active, prices, tax rate, category/type)", "implemented": false, "prdRefs": ["7.2"] },
|
|
{ "id": "F029", "description": "Add CSV import of products with validation and idempotency rules (optional for V1)", "implemented": false, "prdRefs": ["7.2", "8"] },
|
|
|
|
{ "id": "F030", "description": "Add Products navigation entry and route", "implemented": true, "prdRefs": ["7.1"] },
|
|
{ "id": "F031", "description": "Implement Products manager table UI (name, SKU, active, price, tax rate, updated)", "implemented": true, "prdRefs": ["7.2"] },
|
|
{ "id": "F032", "description": "Implement Product create/edit UI (name, description, SKU, pricing, tax rate, active)", "implemented": true, "prdRefs": ["7.2"] },
|
|
{ "id": "F033", "description": "Implement keyboard-friendly product picker component (search + select)", "implemented": true, "prdRefs": ["7.3"] },
|
|
{ "id": "F034", "description": "Display correct currency context in product pricing inputs and lists", "implemented": true, "prdRefs": ["7.3", "6.1", "6.3"] },
|
|
{ "id": "F035", "description": "Support bulk actions in product manager (archive/unarchive, set category/type)", "implemented": false, "prdRefs": ["7.2"] },
|
|
{ "id": "F036", "description": "Support inline validation feedback for SKU uniqueness and missing pricing", "implemented": false, "prdRefs": ["7.2"] },
|
|
{ "id": "F037", "description": "Ensure product UI uses consistent money formatting utilities and avoids hard-coded $", "implemented": true, "prdRefs": ["7.2", "7.3"] },
|
|
{ "id": "F038", "description": "Ensure product UI is permission-aware (hide/disable actions based on RBAC)", "implemented": false, "prdRefs": ["7.2", "4"] },
|
|
{ "id": "F039", "description": "Add empty/error/loading states for Products manager and edit dialogs", "implemented": true, "prdRefs": ["7.2"] },
|
|
|
|
{ "id": "F040", "description": "Add API and UI support for selecting products in contexts that currently select services (where appropriate)", "implemented": true, "prdRefs": ["7.3"] },
|
|
{ "id": "F041", "description": "Ensure product picker can be scoped by currency availability (optional filter)", "implemented": false, "prdRefs": ["7.3"] },
|
|
{ "id": "F042", "description": "Ensure product picker hides inactive products by default with override toggle (optional)", "implemented": false, "prdRefs": ["7.3"] },
|
|
{ "id": "F043", "description": "Add product 'details' view (read-only) for quick inspection from pickers (optional)", "implemented": false, "prdRefs": ["7.2"] },
|
|
|
|
{ "id": "F050", "description": "Define and formalize contract line types needed for products/licenses (schema/types/UI)", "implemented": false, "prdRefs": ["6.1", "6.2"] },
|
|
{ "id": "F051", "description": "Update TypeScript types to include product/license contract line types where currently restricted", "implemented": false, "prdRefs": ["6.1"] },
|
|
{ "id": "F052", "description": "Update API schemas/validation to accept product/license contract line types where appropriate", "implemented": true, "prdRefs": ["6.1"] },
|
|
{ "id": "F053", "description": "Update contract line service configuration to support product lines (quantities and optional overrides)", "implemented": true, "prdRefs": ["6.1"] },
|
|
{ "id": "F054", "description": "Update contract wizard UI to allow choosing product-related line types and attaching products", "implemented": true, "prdRefs": ["6.1", "7.3"] },
|
|
|
|
{ "id": "F060", "description": "Allow attaching products to contract templates (default products + quantities)", "implemented": true, "prdRefs": ["6.1"] },
|
|
{ "id": "F061", "description": "Clone template product attachments into contract and client assignment snapshots", "implemented": true, "prdRefs": ["6.1", "8"] },
|
|
{ "id": "F062", "description": "Allow attaching products to contracts and contract lines (tenant scope)", "implemented": true, "prdRefs": ["6.1"] },
|
|
{ "id": "F063", "description": "Allow overriding product quantity and pricing at client-contract assignment level", "implemented": true, "prdRefs": ["6.1", "10"] },
|
|
{ "id": "F064", "description": "Validate that products have a price for the contract currency (or require custom rate)", "implemented": true, "prdRefs": ["7.3"] },
|
|
{ "id": "F065", "description": "Support product-specific billing timing rules on contract lines (advance/arrears) if applicable", "implemented": false, "prdRefs": ["6.1"] },
|
|
{ "id": "F066", "description": "Support product discounts using existing discount mechanisms (or explicitly defer)", "implemented": false, "prdRefs": ["10"] },
|
|
|
|
{ "id": "F070", "description": "Define and implement billing behavior for product charges on contracts (recurring vs one-time)", "implemented": true, "prdRefs": ["6.1", "10"] },
|
|
{ "id": "F071", "description": "Implement billing engine product charge generation (type='product') from client contract configuration", "implemented": true, "prdRefs": ["6.2"] },
|
|
{ "id": "F072", "description": "Implement billing engine license charge generation (type='license') or consolidate under product logic (decision)", "implemented": true, "prdRefs": ["6.2", "10"] },
|
|
{ "id": "F073", "description": "Ensure product charges include tax context (tax_rate_id/tax_region) and are recalculated in invoice persistence", "implemented": true, "prdRefs": ["6.4"] },
|
|
{ "id": "F074", "description": "Ensure product charges respect proration/billing timing rules as defined for the contract line", "implemented": true, "prdRefs": ["6.1", "6.2"] },
|
|
{ "id": "F075", "description": "Ensure product charges respect contract currency and fallback/validation rules when a price is missing", "implemented": true, "prdRefs": ["6.2", "7.3"] },
|
|
{ "id": "F076", "description": "Ensure product charges produce correct invoice_items and invoice_item_details rows for downstream rendering/export", "implemented": true, "prdRefs": ["6.3"] },
|
|
|
|
{ "id": "F080", "description": "Allow adding products to manual invoices via product picker", "implemented": true, "prdRefs": ["6.3"] },
|
|
{ "id": "F081", "description": "Allow overriding quantity/rate on manual invoice product lines with auditability (if required)", "implemented": true, "prdRefs": ["10"] },
|
|
{ "id": "F082", "description": "Ensure manual invoice item persistence stores product association and item kind/type for rendering/export", "implemented": true, "prdRefs": ["6.3"] },
|
|
{ "id": "F083", "description": "Ensure manual invoice tax calculation matches product tax and client exemption rules", "implemented": true, "prdRefs": ["6.4"] },
|
|
{ "id": "F084", "description": "Update invoice templates/renderer to display product lines clearly (and optionally distinguish from services)", "implemented": true, "prdRefs": ["6.3"] },
|
|
{ "id": "F085", "description": "Update client portal invoice views to display product lines correctly", "implemented": true, "prdRefs": ["6.3"] },
|
|
{ "id": "F086", "description": "Ensure invoice totals and rounding are correct with product line quantities (including fractional quantities if allowed)", "implemented": true, "prdRefs": ["6.3"] },
|
|
|
|
{ "id": "F160", "description": "Add products to tickets (record materials/parts on a ticket and flow into invoicing)", "implemented": true, "prdRefs": ["6.6", "10"] },
|
|
{ "id": "F161", "description": "Add products to projects (record materials/parts on a project and flow into invoicing)", "implemented": true, "prdRefs": ["6.6", "10"] },
|
|
{ "id": "F162", "description": "Add products/materials to tickets (record materials/parts on a ticket and flow into invoicing; auto-bill in V1)", "implemented": true, "prdRefs": ["6.6", "10"] },
|
|
{ "id": "F163", "description": "Add products/materials to projects (record materials/parts on a project and flow into invoicing; auto-bill in V1)", "implemented": true, "prdRefs": ["6.6", "10"] },
|
|
{ "id": "F164", "description": "Implement shared Materials model for ticket/project product usage (separate records, not time entries in V1)", "implemented": true, "prdRefs": ["6.6", "10"] },
|
|
{ "id": "F165", "description": "Defer time-entry materials linkage (future)", "implemented": false, "prdRefs": ["6.6"] },
|
|
{ "id": "F166", "description": "Ingest ticket/project materials into billing engine as charges (like usage/time) and persist to invoice items during invoice generation", "implemented": true, "prdRefs": ["6.6"] },
|
|
{ "id": "F167", "description": "Prevent double-billing of materials (track billed state and invoice association)", "implemented": true, "prdRefs": ["6.6"] },
|
|
{ "id": "F168", "description": "Define materials billing window rules (which period picks up which materials) consistent with usage/time period behavior", "implemented": true, "prdRefs": ["6.6"] },
|
|
|
|
{ "id": "F090", "description": "Ensure accounting mapping resolution works for product lines (reuse service mapping or extend mapping types)", "implemented": true, "prdRefs": ["6.5"] },
|
|
{ "id": "F091", "description": "Ensure accounting export includes product lines correctly with currency and tax handling", "implemented": true, "prdRefs": ["6.5"] },
|
|
{ "id": "F092", "description": "Ensure accounting export produces correct external item identifiers for product lines", "implemented": true, "prdRefs": ["6.5"] },
|
|
{ "id": "F093", "description": "Ensure tax passthrough mode (future) can mark product tax lines as externally authoritative without breaking rendering", "implemented": false, "prdRefs": ["6.4", "6.5"] },
|
|
|
|
{ "id": "F100", "description": "Add permissions/RBAC for managing products and editing product pricing/tax fields", "implemented": true, "prdRefs": ["4", "7.2"] },
|
|
{ "id": "F101", "description": "Add audit trails/updated_at tracking for product changes surfaced in UI", "implemented": false, "prdRefs": ["7.2"] },
|
|
{ "id": "F102", "description": "Add migration/backfill strategy for existing catalog items (default kinds)", "implemented": true, "prdRefs": ["8"] },
|
|
{ "id": "F103", "description": "Add documentation updates describing Products, Contracts integration, and invoice behavior", "implemented": true, "prdRefs": ["11"] },
|
|
|
|
{ "id": "F104", "description": "Add DB indexes to support fast product search by name/SKU and filtering by kind/category/active", "implemented": true, "prdRefs": ["7.2"] },
|
|
{ "id": "F105", "description": "Implement product archival (soft delete) semantics and ensure archived products are excluded from default queries", "implemented": true, "prdRefs": ["8", "9"] },
|
|
{ "id": "F106", "description": "Add an admin setting to require SKU for products (tenant-scoped)", "implemented": false, "prdRefs": ["5.2", "10"] },
|
|
{ "id": "F107", "description": "Add an admin setting for default product tax behavior (default tax_rate_id or default non-taxable)", "implemented": false, "prdRefs": ["6.4"] },
|
|
{ "id": "F108", "description": "Add an admin setting for default unit_of_measure for products", "implemented": false, "prdRefs": ["5.2"] },
|
|
|
|
{ "id": "F110", "description": "Expose product kind/type fields in invoice APIs and UI so invoice lines can be labeled correctly", "implemented": true, "prdRefs": ["6.3"] },
|
|
{ "id": "F111", "description": "Ensure invoice generation persists a stable reference to the product/catalog item for each invoice line", "implemented": true, "prdRefs": ["6.3"] },
|
|
{ "id": "F112", "description": "Support editing/removing product lines on draft invoices with correct recalculation (manual invoice update flow)", "implemented": true, "prdRefs": ["6.3"] },
|
|
|
|
{ "id": "F120", "description": "Add API endpoints for attaching/detaching products to contract templates/contract lines (bulk operations)", "implemented": false, "prdRefs": ["6.1"] },
|
|
{ "id": "F121", "description": "Show products attached to a contract line in contract line details UI", "implemented": true, "prdRefs": ["6.1", "7.3"] },
|
|
{ "id": "F122", "description": "Show products attached to a client contract line in client contract UI (including overrides)", "implemented": true, "prdRefs": ["6.1", "7.3"] },
|
|
{ "id": "F123", "description": "Add validation preventing attaching inactive/archived products to new contract lines (unless explicitly allowed)", "implemented": true, "prdRefs": ["5.2", "7.3"] },
|
|
{ "id": "F124", "description": "Add validation preventing product quantity <= 0 on contracts and invoices (unless negative adjustments are supported)", "implemented": true, "prdRefs": ["6.1", "6.3"] },
|
|
|
|
{ "id": "F130", "description": "Ensure contract wizard validates currency completeness for all attached products before activation", "implemented": true, "prdRefs": ["7.3"] },
|
|
{ "id": "F131", "description": "Ensure billing run emits actionable errors when encountering missing currency pricing for products", "implemented": true, "prdRefs": ["6.2", "9"] },
|
|
{ "id": "F132", "description": "Ensure billing run does not silently skip product charges (no empty placeholder paths)", "implemented": true, "prdRefs": ["6.2", "9"] },
|
|
{ "id": "F133", "description": "Ensure product charges are persisted with sufficient detail to support accounting export grouping and tax passthrough", "implemented": true, "prdRefs": ["6.3", "6.5"] },
|
|
|
|
{ "id": "F140", "description": "Add product-specific accounting mapping UX (optional: map product category/type to external item codes)", "implemented": false, "prdRefs": ["6.5"] },
|
|
{ "id": "F141", "description": "Add reporting exports for product catalog (admin utility) and revenue by product/category (optional for V1)", "implemented": false, "prdRefs": ["6.5"] },
|
|
|
|
{ "id": "F150", "description": "Define forward-compatibility hooks for future inventory augmentation (SKU stability, external ids, optional cost fields)", "implemented": false, "prdRefs": ["2", "5.2"] }
|
|
]
|