Skip to content

[IP-268]: bill project tasks#578

Merged
nielsdrost7 merged 3 commits into
InvoicePlane:developfrom
underdogg-forks:feature/268-bill-project-tasks
Jul 17, 2026
Merged

[IP-268]: bill project tasks#578
nielsdrost7 merged 3 commits into
InvoicePlane:developfrom
underdogg-forks:feature/268-bill-project-tasks

Conversation

@nielsdrost7

@nielsdrost7 nielsdrost7 commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

What

  • ProjectBillingService::billTasks(Project, array $taskIds): Invoice — creates one invoice item per selected task (item name = task name, quantity 1, price = task_price, task's tax rate, task_id link). Appends to the client's existing draft invoice when one exists, otherwise creates a new draft with a null invoice number (numbering is assigned when the invoice leaves draft — consistent with the duplicate-prevention observer on PR [IP-513]: duplicate-number prevention via Observers #540, which allows multiple nulls for drafts).
  • Only completed tasks that are not already on an invoice (invoice_items.task_id) qualify — double billing is impossible.
  • Bill Tasks row action on the projects list (gated by create-invoices) opens a checkbox list of billable tasks; guard failures surface as a notification.
  • Invoice totals are refreshed from the item subtotals after billing.

Deviation from the SMART plan: no redirect to EditInvoice after billing — that page didn't exist on develop when this PR was written. It does now (and is further extended by PR #575), so the redirect is a ready-to-do follow-up (#587).

Closes

Closes #268 — Convert project tasks to invoice items for billing

Follow-up issues (not resolved here — reopen if auto-closed on merge)

Closes #587 — No redirect to the invoice edit page after billing project tasks (action only shows a success toast; now unblocked since EditInvoice exists on develop)

Tests

ProjectBillingTest — 5 tests: new draft creation, append-to-existing-draft, double-billing rejection, non-completed rejection, and modal option filtering.

Summary by CodeRabbit

  • New Features
    • Added the ability to bill completed, unbilled project tasks.
    • Users with invoice-creation permission can select eligible tasks and add them to a new or existing draft invoice.
    • Invoice totals are updated automatically after billing.
    • Added success and error notifications for billing actions.

@InvoicePlane InvoicePlane deleted a comment from coderabbitai Bot Jul 4, 2026
@nielsdrost7 nielsdrost7 self-assigned this Jul 4, 2026
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@nielsdrost7
nielsdrost7 force-pushed the feature/268-bill-project-tasks branch from 98e15f8 to 3bfd531 Compare July 4, 2026 12:23
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a78225f6-b53b-48c8-961c-043c38421a28

📥 Commits

Reviewing files that changed from the base of the PR and between 43f94c4 and dbe62cd.

📒 Files selected for processing (4)
  • Modules/Projects/Filament/Company/Resources/Projects/Tables/ProjectsTable.php
  • Modules/Projects/Services/ProjectBillingService.php
  • Modules/Projects/Tests/Feature/ProjectBillingTest.php
  • resources/lang/en/ip.php

📝 Walkthrough

Walkthrough

Adds a permission-gated project table action for selecting completed, unbilled tasks and adding them to a customer’s draft invoice. The billing service creates or reuses invoices, inserts task items, recalculates totals, and reports validation failures. Feature tests cover billing and task eligibility.

Changes

Project task billing

Layer / File(s) Summary
Task selection and billing
Modules/Projects/Services/ProjectBillingService.php
Filters completed, unbilled tasks and rejects selections with no billable tasks.
Draft invoice persistence
Modules/Projects/Services/ProjectBillingService.php
Reuses or creates a draft invoice, adds task invoice items, and refreshes totals.
Table action and validation
Modules/Projects/Filament/Company/Resources/Projects/Tables/ProjectsTable.php, Modules/Projects/Tests/Feature/ProjectBillingTest.php, resources/lang/en/ip.php
Adds the permission-gated selection action, notifications, translations, and feature coverage.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  actor User
  participant ProjectsTable
  participant ProjectBillingService
  participant DraftInvoice
  participant InvoiceItem

  User->>ProjectsTable: Select completed tasks
  ProjectsTable->>ProjectBillingService: billTasks(project, taskIds)
  ProjectBillingService->>DraftInvoice: Find or create draft invoice
  ProjectBillingService->>InvoiceItem: Add task invoice items
  ProjectBillingService->>DraftInvoice: Refresh totals
  DraftInvoice-->>ProjectsTable: Return invoice
  ProjectsTable-->>User: Show billing notification
Loading

Possibly related PRs

Suggested reviewers: khawarmehfooz

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nielsdrost7
nielsdrost7 marked this pull request as ready for review July 17, 2026 15:37
@nielsdrost7
nielsdrost7 merged commit a95c38e into InvoicePlane:develop Jul 17, 2026
0 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Projects]: Redirect to the invoice edit page after billing project tasks [Projects]: Convert project tasks to invoice items for billing

1 participant