Skip to content

feat: monthly worklog summary with configurable project groupings #80

@f3rdy

Description

@f3rdy

Problem

For monthly invoicing, I need to break down the logged hours per month across a configurable set of Jira project keys. Different invoice recipients map to different project-key sets, so the grouping is not static — it needs to be configurable per use case (e.g. one customer maps to projects PROJ1, PROJ2, PROJ3, another customer maps to PROJ4).

Today this requires manual filtering and summing across budjira tempo outputs.

Proposal

1. Configurable groupings

Allow named groupings to be defined in configuration (e.g. connections.toml or a new [groupings] section), mapping a label to a list of project keys:

[groupings.customer-a]
projects = ["PROJ1", "PROJ2", "PROJ3"]

[groupings.customer-b]
projects = ["PROJ4"]

A grouping should reference a single connection (or be derivable from one), so the project keys are resolved against the right Jira instance.

2. Summary command

A new command — e.g. budjira tempo summary <YYYY-MM> --grouping <name> — that prints the breakdown:

$ budjira tempo summary 2026-04 --grouping customer-a
Group customer-a
  PROJ1   42.5 h
  PROJ2   30.0 h
  PROJ3   15.0 h
  -----
  Total   87.5 h

Optional flags:

  • --all-groupings — print every configured grouping side-by-side
  • --format json|csv|table — for downstream tooling
  • --user <accountId> — restrict to a specific user (default: self)

3. Out of scope (for this ticket)

Direct invoice generation in an external billing tool (e.g. Spiris) is desirable but is a separate, larger piece of work. This ticket is only about producing the breakdown that an invoice can then be built from.

Why this matters

Monthly invoicing is a recurring task. Having budjira output the canonical numbers — grouped exactly the way the invoice needs them — removes a manual reconciliation step and makes the source of truth explicit (configured groupings) instead of implicit (whatever I happened to filter for that month).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions