Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

The official Tasks, Projects and Time Tracking module for InvoiceShelf 3.x. It adds projects hung
off a customer, tasks that move across a configurable Kanban board, time recorded by hand or by a
running timer, and a billing wizard that turns unbilled hours into invoice lines.
running timer, and invoicing that turns unbilled hours into a draft invoice from wherever the
work is: a task, a selection of tasks, a whole project, or the unbilled time page.

The module is `AGPL-3.0-only`.

Expand Down
4 changes: 2 additions & 2 deletions app/Application/BillingService.php
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public function unbilled(int $companyId, int $customerId, ?string $from = null,
* Which customers have unbilled billable time, and how much of it.
*
* The same rule `unbilled()` applies to one customer, applied to all of
* them at once: the wizard's first step needs to know who is worth opening
* them at once: the unbilled time page needs to know who is worth opening
* before it asks for anyone's entries. A customer whose work spans two
* currencies gets a row per currency, because money in two denominations
* cannot be added up and `prepare()` refuses such a selection anyway.
Expand Down Expand Up @@ -163,7 +163,7 @@ public function customers(int $companyId, ?string $from = null, ?string $to = nu
* Every key the host's invoice writer reads is present, including the ones
* this module never sets: a line carries its zeroed discount and tax fields
* so `DocumentItemService::createItems` never reaches for a missing index,
* and `notes` and `template_name` are placeholders the wizard fills in from
* and `notes` and `template_name` are placeholders the browser fills in from
* the company's own defaults before it posts.
*
* @param 'task'|'project'|'member'|'summary' $grouping
Expand Down
8 changes: 4 additions & 4 deletions app/Http/Controllers/BillingController.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ public function __construct(Authorizes $authorizes, private readonly BillingServ
}

/**
* Who has unbilled time, before the wizard asks for anyone's entries.
* Who has unbilled time, before anyone's entries are asked for.
*
* One row per customer and currency, so the first step can be a list of
* people worth invoicing rather than a customer picker over the whole
* address book.
* One row per customer and currency, so the unbilled time page can open on
* a list of people worth invoicing rather than a customer picker over the
* whole address book.
*/
public function customers(UnbilledCustomersRequest $request): JsonResponse
{
Expand Down
2 changes: 1 addition & 1 deletion app/Http/Requests/UnbilledCustomersRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Modules\TasksProjects\Http\Requests;

/**
* The optional window the wizard's first step narrows the roll-up to.
* The optional window the unbilled time page narrows the roll-up to.
*
* There is no customer here on purpose: this is the list of customers, so
* naming one would be asking the wrong question.
Expand Down
Loading
Loading