Unify time tracking on server-backed entries with updateRunning.

Consolidates dashboard and invoice timers onto shared time-entry APIs so clock-in state, invoice linking, and clock-out flow stay consistent across surfaces.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-17 22:36:39 -04:00
co-authored by Cursor
parent 81a0ce33a4
commit 5c28b33e9f
15 changed files with 730 additions and 373 deletions
+32
View File
@@ -155,6 +155,38 @@ export const invoicesRouter = createTRPCRouter({
}
}),
/** Draft and sent invoices available for time-clock billing. */
getBillable: protectedProcedure
.input(z.object({ clientId: z.string().optional() }).optional())
.query(async ({ ctx, input }) => {
const conditions = [
eq(invoices.createdById, ctx.session.user.id),
inArray(invoices.status, ["draft", "sent"]),
];
if (input?.clientId) conditions.push(eq(invoices.clientId, input.clientId));
return ctx.db.query.invoices.findMany({
where: and(...conditions),
columns: {
id: true,
invoiceNumber: true,
invoicePrefix: true,
status: true,
clientId: true,
issueDate: true,
totalAmount: true,
},
with: {
client: { columns: { id: true, name: true } },
},
orderBy: (invoices, { desc }) => [
desc(invoices.issueDate),
desc(invoices.dueDate),
desc(invoices.invoiceNumber),
],
});
}),
getLineItemHistory: protectedProcedure.query(async ({ ctx }) => {
const userInvoices = await ctx.db
.select({ id: invoices.id })