@invoicer/cli 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -10,6 +10,8 @@ import { registerGenerateCommand } from "./commands/generate.js";
10
10
  import { registerClientsCommand } from "./commands/clients.js";
11
11
  import { registerTimesheetCommand } from "./commands/timesheet.js";
12
12
  import { registerSenderCommand } from "./commands/sender.js";
13
+ import { registerDraftsCommand } from "./commands/drafts.js";
14
+ import { registerWorkspaceCommand } from "./commands/workspace.js";
13
15
  function getPackageVersion() {
14
16
  try {
15
17
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -31,6 +33,8 @@ export function createProgram(paths = createProjectPaths()) {
31
33
  registerClientsCommand(program, paths);
32
34
  registerTimesheetCommand(program, paths);
33
35
  registerSenderCommand(program, paths);
36
+ registerDraftsCommand(program, paths);
37
+ registerWorkspaceCommand(program, paths);
34
38
  return program;
35
39
  }
36
40
  export async function runCli(argv = process.argv, paths = createProjectPaths()) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,OAAO,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAsB,kBAAkB,EAAE;IACtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEhC,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvC,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,QAAsB,kBAAkB,EAAE;IAC1F,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,IAAI,YAAY,EAAE,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,11 @@ export function registerClientsCommand(program, paths) {
29
29
  console.log(` Address: ${client.address}`);
30
30
  if (client.payPeriodType)
31
31
  console.log(` Terms: ${client.payPeriodType}`);
32
+ if (client.paymentTerms)
33
+ console.log(` Payment Terms: ${client.paymentTerms}`);
34
+ if (client.billingCycle) {
35
+ console.log(` Billing Cycle: ${client.billingCycle.type} (from ${client.billingCycle.anchorDate})`);
36
+ }
32
37
  console.log();
33
38
  });
34
39
  process.exit(0);
@@ -74,6 +79,32 @@ export function registerClientsCommand(program, paths) {
74
79
  message: "Payment terms (e.g., Net 30, Due on Receipt):",
75
80
  default: "Due on Receipt",
76
81
  },
82
+ {
83
+ type: "confirm",
84
+ name: "setupBillingCycle",
85
+ message: "Set up automatic billing cycle?",
86
+ default: false,
87
+ },
88
+ {
89
+ type: "list",
90
+ name: "billingCycleType",
91
+ message: "Billing cycle:",
92
+ choices: [
93
+ { name: "Weekly (7 days)", value: "weekly" },
94
+ { name: "Biweekly (14 days)", value: "biweekly" },
95
+ { name: "Monthly", value: "monthly" },
96
+ ],
97
+ default: "monthly",
98
+ when: (a) => a.setupBillingCycle,
99
+ },
100
+ {
101
+ type: "input",
102
+ name: "anchorDate",
103
+ message: "Billing cycle start date (YYYY-MM-DD):",
104
+ default: new Date().toISOString().slice(0, 10),
105
+ validate: (v) => /^\d{4}-\d{2}-\d{2}$/.test(v) || "Use YYYY-MM-DD format",
106
+ when: (a) => a.setupBillingCycle,
107
+ },
77
108
  ]);
78
109
  const newClient = {
79
110
  name: answers.name.trim(),
@@ -82,6 +113,10 @@ export function registerClientsCommand(program, paths) {
82
113
  currency: answers.currency,
83
114
  defaultRate: Number(answers.defaultRate),
84
115
  payPeriodType: answers.payPeriodType.trim(),
116
+ paymentTerms: answers.payPeriodType.trim(),
117
+ billingCycle: answers.setupBillingCycle
118
+ ? { type: answers.billingCycleType, anchorDate: answers.anchorDate }
119
+ : undefined,
85
120
  };
86
121
  if (cfg.client.some((client) => client.name === newClient.name)) {
87
122
  console.error(`❌ Client "${newClient.name}" already exists`);
@@ -139,7 +174,33 @@ export function registerClientsCommand(program, paths) {
139
174
  type: "input",
140
175
  name: "payPeriodType",
141
176
  message: "Payment terms:",
142
- default: current.payPeriodType || "Due on Receipt",
177
+ default: current.paymentTerms || current.payPeriodType || "Due on Receipt",
178
+ },
179
+ {
180
+ type: "confirm",
181
+ name: "setupBillingCycle",
182
+ message: "Set up automatic billing cycle?",
183
+ default: !!current.billingCycle,
184
+ },
185
+ {
186
+ type: "list",
187
+ name: "billingCycleType",
188
+ message: "Billing cycle:",
189
+ choices: [
190
+ { name: "Weekly (7 days)", value: "weekly" },
191
+ { name: "Biweekly (14 days)", value: "biweekly" },
192
+ { name: "Monthly", value: "monthly" },
193
+ ],
194
+ default: current.billingCycle?.type || "monthly",
195
+ when: (a) => a.setupBillingCycle,
196
+ },
197
+ {
198
+ type: "input",
199
+ name: "anchorDate",
200
+ message: "Billing cycle start date (YYYY-MM-DD):",
201
+ default: current.billingCycle?.anchorDate || new Date().toISOString().slice(0, 10),
202
+ validate: (v) => /^\d{4}-\d{2}-\d{2}$/.test(v) || "Use YYYY-MM-DD format",
203
+ when: (a) => a.setupBillingCycle,
143
204
  },
144
205
  ]);
145
206
  cfg.client[clientIndex] = {
@@ -149,6 +210,10 @@ export function registerClientsCommand(program, paths) {
149
210
  currency: answers.currency,
150
211
  defaultRate: Number(answers.defaultRate),
151
212
  payPeriodType: answers.payPeriodType.trim(),
213
+ paymentTerms: answers.payPeriodType.trim(),
214
+ billingCycle: answers.setupBillingCycle
215
+ ? { type: answers.billingCycleType, anchorDate: answers.anchorDate }
216
+ : undefined,
152
217
  };
153
218
  writeJsonFile(paths.configPath, cfg);
154
219
  console.log(`✅ Client "${answers.name}" updated successfully`);
@@ -1 +1 @@
1
- {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/commands/clients.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/commands/clients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,286 @@
1
+ import inquirer from "inquirer";
2
+ import { loadJsonFile } from "../core/json-store.js";
3
+ import { validateConfig } from "../core/validators.js";
4
+ import { checkAndGenerateDueDrafts, confirmDraft, deleteDraft, getDraftById, getDueScheduledDrafts, loadDrafts, markDraftSent, markDraftFailed, scheduleDraft, } from "../services/draft-service.js";
5
+ import { renderInvoicePdf } from "../services/pdf-render.js";
6
+ import { sendInvoiceEmail } from "../services/email.js";
7
+ function loadConfig(paths) {
8
+ return loadJsonFile(paths.configPath, { client: [], from: {} }, validateConfig);
9
+ }
10
+ function formatCurrency(amount, currency) {
11
+ return `${currency} ${amount.toFixed(2)}`;
12
+ }
13
+ function formatStatus(status) {
14
+ const icons = {
15
+ draft: "📝",
16
+ confirmed: "✅",
17
+ scheduled: "📅",
18
+ sent: "✉️ ",
19
+ failed: "❌",
20
+ };
21
+ return `${icons[status] || "❓"} ${status}`;
22
+ }
23
+ function printDraft(draft) {
24
+ console.log(`\n ID: ${draft.id}`);
25
+ console.log(` Client: ${draft.client}`);
26
+ console.log(` Status: ${formatStatus(draft.status)}`);
27
+ console.log(` Invoice: ${draft.invoiceNumber}`);
28
+ console.log(` Period: ${draft.periodFrom} → ${draft.periodTo}`);
29
+ console.log(` Total: ${formatCurrency(draft.total, draft.currency)}`);
30
+ if (draft.scheduledSendDate) {
31
+ console.log(` Send on: ${draft.scheduledSendDate}`);
32
+ }
33
+ if (draft.sentAt) {
34
+ console.log(` Sent at: ${draft.sentAt}`);
35
+ }
36
+ console.log(` Items: ${draft.lineItems.length} line item(s)`);
37
+ for (const item of draft.lineItems) {
38
+ console.log(` - ${item.description}: ${item.hours}h × ${formatCurrency(item.rate, draft.currency)} = ${formatCurrency(item.amount, draft.currency)}`);
39
+ }
40
+ }
41
+ export function registerDraftsCommand(program, paths) {
42
+ program
43
+ .command("drafts")
44
+ .description("Manage invoice drafts (auto-generate, review, schedule, send)")
45
+ .option("--list", "List all drafts", false)
46
+ .option("--generate", "Auto-generate drafts for completed billing cycles", false)
47
+ .option("--review <id>", "Review and confirm a draft")
48
+ .option("--schedule <id>", "Schedule a confirmed draft for sending")
49
+ .option("--send <id>", "Send a draft immediately")
50
+ .option("--delete <id>", "Delete a draft")
51
+ .option("--date <YYYY-MM-DD>", "Send date for --schedule")
52
+ .option("--process-due", "Process and send all due scheduled drafts", false)
53
+ .action(async (options) => {
54
+ // ── List ─────────────────────────────────────────────
55
+ if (options.list) {
56
+ const data = loadDrafts(paths);
57
+ if (data.drafts.length === 0) {
58
+ console.log("📭 No invoice drafts found.");
59
+ return;
60
+ }
61
+ console.log(`\n📋 Invoice Drafts (${data.drafts.length} total)\n${"─".repeat(48)}`);
62
+ const grouped = new Map();
63
+ for (const d of data.drafts) {
64
+ if (!grouped.has(d.status))
65
+ grouped.set(d.status, []);
66
+ grouped.get(d.status).push(d);
67
+ }
68
+ for (const [status, drafts] of grouped) {
69
+ console.log(`\n${formatStatus(status).toUpperCase()} (${drafts.length})`);
70
+ for (const d of drafts) {
71
+ printDraft(d);
72
+ }
73
+ }
74
+ return;
75
+ }
76
+ // ── Generate ─────────────────────────────────────────
77
+ if (options.generate) {
78
+ console.log("🔄 Checking billing cycles for due drafts...");
79
+ const newDrafts = checkAndGenerateDueDrafts(paths);
80
+ if (newDrafts.length === 0) {
81
+ console.log("✅ No new drafts needed. All billing cycles are current.");
82
+ return;
83
+ }
84
+ console.log(`\n📝 Generated ${newDrafts.length} new draft(s):\n`);
85
+ for (const d of newDrafts) {
86
+ printDraft(d);
87
+ }
88
+ return;
89
+ }
90
+ // ── Review (confirm) ─────────────────────────────────
91
+ if (options.review) {
92
+ const draft = getDraftById(paths, options.review);
93
+ if (!draft) {
94
+ console.error(`❌ Draft not found: ${options.review}`);
95
+ process.exit(1);
96
+ }
97
+ console.log("\n📄 Draft for review:");
98
+ printDraft(draft);
99
+ if (draft.status !== "draft") {
100
+ console.log(`\n⚠️ This draft is already "${draft.status}". Only "draft" status can be confirmed.`);
101
+ return;
102
+ }
103
+ const { confirm } = await inquirer.prompt([
104
+ { type: "confirm", name: "confirm", message: "Confirm this draft and generate PDF?", default: true },
105
+ ]);
106
+ if (!confirm) {
107
+ console.log("⏭️ Skipped.");
108
+ return;
109
+ }
110
+ // Generate PDF
111
+ const cfg = loadConfig(paths);
112
+ const client = cfg.client.find((c) => c.name === draft.client);
113
+ if (!client) {
114
+ console.error(`❌ Client "${draft.client}" not found in config.`);
115
+ process.exit(1);
116
+ }
117
+ const invoicePayload = {
118
+ from: cfg.from,
119
+ client,
120
+ currency: draft.currency,
121
+ invoiceNumber: draft.invoiceNumber,
122
+ invoiceDate: draft.invoiceDate,
123
+ periodFrom: draft.periodFrom,
124
+ periodTo: draft.periodTo,
125
+ lineItems: draft.lineItems.map((item) => ({
126
+ description: item.description,
127
+ hours: item.hours,
128
+ rate: item.rate,
129
+ amount: item.amount,
130
+ })),
131
+ paymentTerms: draft.paymentTerms,
132
+ note: cfg.note,
133
+ };
134
+ try {
135
+ const month = draft.periodFrom.slice(0, 7);
136
+ const outPath = await renderInvoicePdf(paths, invoicePayload, month);
137
+ const updated = confirmDraft(paths, draft.id);
138
+ const withPdf = { ...updated, pdfPath: outPath };
139
+ // Save the PDF path
140
+ const data = loadDrafts(paths);
141
+ const idx = data.drafts.findIndex((d) => d.id === draft.id);
142
+ if (idx !== -1) {
143
+ data.drafts[idx] = withPdf;
144
+ const { saveDrafts } = await import("../services/draft-service.js");
145
+ saveDrafts(paths, data);
146
+ }
147
+ console.log(`\n✅ Draft confirmed! PDF saved: ${outPath}`);
148
+ // Ask about scheduling
149
+ const { wantSchedule } = await inquirer.prompt([
150
+ { type: "confirm", name: "wantSchedule", message: "Schedule this invoice for sending?", default: true },
151
+ ]);
152
+ if (wantSchedule) {
153
+ const { sendDate } = await inquirer.prompt([
154
+ { type: "input", name: "sendDate", message: "Send date (YYYY-MM-DD):", validate: (v) => /^\d{4}-\d{2}-\d{2}$/.test(v) || "Use YYYY-MM-DD format" },
155
+ ]);
156
+ scheduleDraft(paths, draft.id, sendDate);
157
+ console.log(`📅 Scheduled to send on ${sendDate}`);
158
+ }
159
+ }
160
+ catch (e) {
161
+ console.error(`❌ Failed to generate PDF: ${e instanceof Error ? e.message : String(e)}`);
162
+ process.exit(1);
163
+ }
164
+ return;
165
+ }
166
+ // ── Schedule ─────────────────────────────────────────
167
+ if (options.schedule) {
168
+ if (!options.date) {
169
+ console.error("❌ --date is required with --schedule. Usage: invoicer drafts --schedule <id> --date 2026-03-01");
170
+ process.exit(1);
171
+ }
172
+ const draft = getDraftById(paths, options.schedule);
173
+ if (!draft) {
174
+ console.error(`❌ Draft not found: ${options.schedule}`);
175
+ process.exit(1);
176
+ }
177
+ if (draft.status !== "confirmed" && draft.status !== "draft") {
178
+ console.error(`❌ Draft must be "confirmed" or "draft" to schedule. Current status: ${draft.status}`);
179
+ process.exit(1);
180
+ }
181
+ scheduleDraft(paths, options.schedule, options.date);
182
+ console.log(`📅 Draft ${draft.invoiceNumber} scheduled to send on ${options.date}`);
183
+ return;
184
+ }
185
+ // ── Send ─────────────────────────────────────────────
186
+ if (options.send) {
187
+ const draft = getDraftById(paths, options.send);
188
+ if (!draft) {
189
+ console.error(`❌ Draft not found: ${options.send}`);
190
+ process.exit(1);
191
+ }
192
+ if (!draft.pdfPath) {
193
+ console.error("❌ No PDF generated for this draft. Use --review first to generate the PDF.");
194
+ process.exit(1);
195
+ }
196
+ const cfg = loadConfig(paths);
197
+ const client = cfg.client.find((c) => c.name === draft.client);
198
+ if (!client) {
199
+ console.error(`❌ Client "${draft.client}" not found in config.`);
200
+ process.exit(1);
201
+ }
202
+ try {
203
+ await sendInvoiceEmail({
204
+ outPath: draft.pdfPath,
205
+ invoiceNumber: draft.invoiceNumber,
206
+ clientName: client.name,
207
+ clientEmail: client.email || "",
208
+ currency: draft.currency,
209
+ total: draft.total,
210
+ periodFrom: draft.periodFrom,
211
+ periodTo: draft.periodTo,
212
+ senderProfile: cfg.from,
213
+ });
214
+ markDraftSent(paths, draft.id);
215
+ console.log(`✉️ Invoice ${draft.invoiceNumber} sent to ${client.email}`);
216
+ }
217
+ catch (e) {
218
+ markDraftFailed(paths, draft.id);
219
+ console.error(`❌ Failed to send: ${e instanceof Error ? e.message : String(e)}`);
220
+ process.exit(1);
221
+ }
222
+ return;
223
+ }
224
+ // ── Delete ───────────────────────────────────────────
225
+ if (options.delete) {
226
+ const draft = getDraftById(paths, options.delete);
227
+ if (!draft) {
228
+ console.error(`❌ Draft not found: ${options.delete}`);
229
+ process.exit(1);
230
+ }
231
+ const { confirm } = await inquirer.prompt([
232
+ { type: "confirm", name: "confirm", message: `Delete draft ${draft.invoiceNumber} (${draft.client})?`, default: false },
233
+ ]);
234
+ if (confirm) {
235
+ deleteDraft(paths, options.delete);
236
+ console.log(`🗑️ Draft deleted.`);
237
+ }
238
+ return;
239
+ }
240
+ // ── Process Due ──────────────────────────────────────
241
+ if (options.processDue) {
242
+ const dueDrafts = getDueScheduledDrafts(paths);
243
+ if (dueDrafts.length === 0) {
244
+ console.log("✅ No scheduled drafts are due for sending.");
245
+ return;
246
+ }
247
+ console.log(`📬 ${dueDrafts.length} draft(s) due for sending...\n`);
248
+ const cfg = loadConfig(paths);
249
+ for (const draft of dueDrafts) {
250
+ const client = cfg.client.find((c) => c.name === draft.client);
251
+ if (!client || !client.email) {
252
+ console.error(`⚠️ Skipping ${draft.invoiceNumber}: client "${draft.client}" has no email`);
253
+ markDraftFailed(paths, draft.id);
254
+ continue;
255
+ }
256
+ if (!draft.pdfPath) {
257
+ console.error(`⚠️ Skipping ${draft.invoiceNumber}: no PDF generated`);
258
+ markDraftFailed(paths, draft.id);
259
+ continue;
260
+ }
261
+ try {
262
+ await sendInvoiceEmail({
263
+ outPath: draft.pdfPath,
264
+ invoiceNumber: draft.invoiceNumber,
265
+ clientName: client.name,
266
+ clientEmail: client.email,
267
+ currency: draft.currency,
268
+ total: draft.total,
269
+ periodFrom: draft.periodFrom,
270
+ periodTo: draft.periodTo,
271
+ senderProfile: cfg.from,
272
+ });
273
+ markDraftSent(paths, draft.id);
274
+ console.log(` ✉️ ${draft.invoiceNumber} → ${client.email}`);
275
+ }
276
+ catch (e) {
277
+ markDraftFailed(paths, draft.id);
278
+ console.error(` ❌ ${draft.invoiceNumber}: ${e instanceof Error ? e.message : String(e)}`);
279
+ }
280
+ }
281
+ return;
282
+ }
283
+ console.log("Usage: invoicer drafts [--list | --generate | --review <id> | --schedule <id> --date <YYYY-MM-DD> | --send <id> | --delete <id> | --process-due]");
284
+ });
285
+ }
286
+ //# sourceMappingURL=drafts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drafts.js","sourceRoot":"","sources":["../../src/commands/drafts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { getCustomDataPath, setCustomDataPath, clearCustomDataPath, loadCliSettings, } from "../core/settings.js";
2
+ export function registerWorkspaceCommand(program, paths) {
3
+ program
4
+ .command("workspace")
5
+ .alias("path")
6
+ .description("Manage CLI data path location")
7
+ .option("--list", "Show current workspace path", false)
8
+ .option("--set <path>", "Set custom data path")
9
+ .option("--clear", "Clear custom data path and use default", false)
10
+ .action(async (options) => {
11
+ // If no option provided, show status
12
+ if (!options.list && !options.set && !options.clear) {
13
+ showWorkspaceStatus(paths);
14
+ process.exit(0);
15
+ }
16
+ if (options.list) {
17
+ showWorkspaceStatus(paths);
18
+ process.exit(0);
19
+ }
20
+ if (options.set) {
21
+ try {
22
+ setCustomDataPath(options.set);
23
+ console.log(`\n✅ Data path set to: ${options.set}`);
24
+ console.log(`\n📁 Data files location:\n ${options.set}/config.json\n ${options.set}/data/timesheet.json\n ${options.set}/data/archive.json\n`);
25
+ process.exit(0);
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ console.error(`❌ Failed to set data path: ${message}`);
30
+ process.exit(1);
31
+ }
32
+ }
33
+ if (options.clear) {
34
+ clearCustomDataPath();
35
+ console.log("\n✅ Custom data path cleared.");
36
+ console.log(" CLI will now use default location.");
37
+ showWorkspaceStatus(paths);
38
+ process.exit(0);
39
+ }
40
+ });
41
+ }
42
+ function showWorkspaceStatus(paths) {
43
+ const customPath = getCustomDataPath();
44
+ const settings = loadCliSettings();
45
+ console.log("\n📍 Current Workspace Configuration:\n");
46
+ if (customPath) {
47
+ console.log(` Status: ✅ Custom path set`);
48
+ console.log(` Path: ${customPath}`);
49
+ console.log(` Config: ${customPath}/config.json`);
50
+ console.log(` Data: ${customPath}/data/\n`);
51
+ }
52
+ else {
53
+ console.log(` Status: Using default location`);
54
+ console.log(` Path: ${paths.projectRoot}`);
55
+ console.log(` Config: ${paths.configPath}`);
56
+ console.log(` Data: ${paths.timesheetPath.replace("/timesheet.json", "")}/\n`);
57
+ }
58
+ console.log("📝 Usage:\n");
59
+ console.log(" Set custom path: invoicer workspace --set /path/to/workspace");
60
+ console.log(" Clear custom path: invoicer workspace --clear");
61
+ console.log(" Show status: invoicer workspace --list\n");
62
+ }
63
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import { homedir } from "node:os";
4
+ import { homedir, platform } from "node:os";
5
+ import { getCustomDataPath } from "./settings.js";
5
6
  export function findProjectRoot(startDir = process.cwd()) {
6
7
  let currentDir = startDir;
7
8
  const root = path.parse(currentDir).root;
@@ -18,12 +19,29 @@ export function createProjectPaths(startDir = process.cwd()) {
18
19
  const moduleRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
19
20
  const foundRoot = findProjectRoot(startDir);
20
21
  const hasModuleConfig = fs.existsSync(path.join(moduleRoot, "config.json"));
21
- // Priority: 1) Project root (if config found in parents)
22
- // 2) Module root (if it has config - development mode)
23
- // 3) ~/.invoicer (global installation)
24
- const projectRoot = foundRoot ?? (hasModuleConfig ? moduleRoot : path.join(homedir(), ".invoicer"));
25
- // Ensure ~/.invoicer directory and data subdirectory exist when using home directory
26
- if (!foundRoot && !hasModuleConfig) {
22
+ // Get default app data directory (matching desktop app behavior)
23
+ const getDefaultDataDir = () => {
24
+ const osType = platform();
25
+ if (osType === "win32") {
26
+ // Windows: %APPDATA%\invoicer
27
+ const appdata = process.env.APPDATA;
28
+ if (appdata)
29
+ return path.join(appdata, "invoicer");
30
+ }
31
+ // macOS and Linux: ~/.local/share/invoicer (XDG Base Directory spec)
32
+ const xdgDataHome = process.env.XDG_DATA_HOME;
33
+ if (xdgDataHome)
34
+ return path.join(xdgDataHome, "invoicer");
35
+ return path.join(homedir(), ".local", "share", "invoicer");
36
+ };
37
+ // Priority: 1) Custom data path (if user set via `invoicer workspace --set`)
38
+ // 2) Project root (if config found in parents)
39
+ // 3) Module root (if it has config - development mode)
40
+ // 4) System app data directory (matches desktop app)
41
+ const customPath = getCustomDataPath();
42
+ const projectRoot = customPath ?? foundRoot ?? (hasModuleConfig ? moduleRoot : getDefaultDataDir());
43
+ // Ensure data subdirectory exists when using app data directory
44
+ if (!customPath && !foundRoot && !hasModuleConfig) {
27
45
  const dataDir = path.join(projectRoot, "data");
28
46
  if (!fs.existsSync(dataDir)) {
29
47
  fs.mkdirSync(dataDir, { recursive: true });
@@ -35,6 +53,7 @@ export function createProjectPaths(startDir = process.cwd()) {
35
53
  lastPath: path.join(projectRoot, "data", "last.json"),
36
54
  timesheetPath: path.join(projectRoot, "data", "timesheet.json"),
37
55
  archivePath: path.join(projectRoot, "data", "archive.json"),
56
+ draftsPath: path.join(projectRoot, "data", "drafts.json"),
38
57
  outDir: path.join(projectRoot, "out"),
39
58
  indexHtmlPath: path.join(moduleRoot, "index.html"),
40
59
  };
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAYlC,MAAM,UAAU,eAAe,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IACtD,IAAI,UAAU,GAAG,QAAQ,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAEzC,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5E,yDAAyD;IACzD,iEAAiE;IACjE,iDAAiD;IACjD,MAAM,WAAW,GAAG,SAAS,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpG,qFAAqF;IACrF,IAAI,CAAC,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;QACjD,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC;QACrD,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC;QAC/D,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC;QAC3D,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QACrC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;KACnD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { homedir } from "node:os";
4
+ function getSettingsDir() {
5
+ // Use same config location as desktop app for consistency
6
+ const osType = process.platform;
7
+ if (osType === "win32") {
8
+ const appdata = process.env.APPDATA;
9
+ if (appdata)
10
+ return path.join(appdata, "invoicer");
11
+ }
12
+ const xdgConfigHome = process.env.XDG_CONFIG_HOME;
13
+ if (xdgConfigHome)
14
+ return path.join(xdgConfigHome, "invoicer");
15
+ return path.join(homedir(), ".config", "invoicer");
16
+ }
17
+ function getSettingsPath() {
18
+ const settingsDir = getSettingsDir();
19
+ return path.join(settingsDir, "cli-settings.json");
20
+ }
21
+ export function loadCliSettings() {
22
+ const settingsPath = getSettingsPath();
23
+ if (!fs.existsSync(settingsPath)) {
24
+ return { version: 1 };
25
+ }
26
+ try {
27
+ const data = fs.readFileSync(settingsPath, "utf-8");
28
+ const parsed = JSON.parse(data);
29
+ // Validate required fields
30
+ if (typeof parsed.version !== "number") {
31
+ throw new Error("Invalid settings: missing or invalid version field");
32
+ }
33
+ return parsed;
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : String(error);
37
+ console.error(`⚠️ Could not read CLI settings (${message}), using defaults`);
38
+ return { version: 1 };
39
+ }
40
+ }
41
+ export function saveCliSettings(settings) {
42
+ const settingsPath = getSettingsPath();
43
+ const settingsDir = path.dirname(settingsPath);
44
+ // Ensure directory exists
45
+ if (!fs.existsSync(settingsDir)) {
46
+ fs.mkdirSync(settingsDir, { recursive: true });
47
+ }
48
+ const json = JSON.stringify(settings, null, 2);
49
+ fs.writeFileSync(settingsPath, json, "utf-8");
50
+ }
51
+ export function getCustomDataPath() {
52
+ const settings = loadCliSettings();
53
+ if (!settings.customDataPath)
54
+ return null;
55
+ // Validate path still exists
56
+ if (fs.existsSync(settings.customDataPath)) {
57
+ return settings.customDataPath;
58
+ }
59
+ // Path no longer exists, clear it
60
+ settings.customDataPath = undefined;
61
+ saveCliSettings(settings);
62
+ return null;
63
+ }
64
+ export function setCustomDataPath(customPath) {
65
+ const resolvedPath = path.resolve(customPath);
66
+ // Ensure path exists and is a directory
67
+ if (!fs.existsSync(resolvedPath)) {
68
+ throw new Error(`Path does not exist: ${customPath}`);
69
+ }
70
+ const stat = fs.statSync(resolvedPath);
71
+ if (!stat.isDirectory()) {
72
+ throw new Error(`Path is not a directory: ${customPath}`);
73
+ }
74
+ // Check write permissions
75
+ try {
76
+ fs.accessSync(resolvedPath, fs.constants.W_OK);
77
+ }
78
+ catch {
79
+ throw new Error(`Path is not writable: ${customPath}`);
80
+ }
81
+ // Resolve symlinks to get canonical path
82
+ let canonicalPath = resolvedPath;
83
+ try {
84
+ canonicalPath = fs.realpathSync(resolvedPath);
85
+ }
86
+ catch {
87
+ // If canonicalization fails, use the resolved path anyway
88
+ console.warn(`⚠️ Could not resolve symlinks for ${resolvedPath}, using as-is`);
89
+ }
90
+ const settings = loadCliSettings();
91
+ settings.customDataPath = canonicalPath;
92
+ saveCliSettings(settings);
93
+ }
94
+ export function clearCustomDataPath() {
95
+ const settings = loadCliSettings();
96
+ settings.customDataPath = undefined;
97
+ saveCliSettings(settings);
98
+ }
99
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/core/settings.ts"],"names":[],"mappings":"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"}
@@ -32,8 +32,28 @@ function ensureOptionalNumber(value, label, fallback) {
32
32
  }
33
33
  return ensureNumber(value, label);
34
34
  }
35
+ const VALID_BILLING_CYCLE_TYPES = new Set(["weekly", "biweekly", "monthly", "custom"]);
36
+ const VALID_DRAFT_STATUSES = new Set(["draft", "confirmed", "scheduled", "sent", "failed"]);
37
+ function validateBillingCycle(value, label) {
38
+ if (value === undefined || value === null) {
39
+ return undefined;
40
+ }
41
+ const obj = ensureObject(value, label);
42
+ const cycleType = ensureString(obj.type, `${label}.type`, "").trim();
43
+ if (!VALID_BILLING_CYCLE_TYPES.has(cycleType)) {
44
+ throw new Error(`${label}.type must be one of: weekly, biweekly, monthly, custom`);
45
+ }
46
+ const anchorDate = ensureString(obj.anchorDate, `${label}.anchorDate`, "").trim();
47
+ if (!anchorDate || !/^\d{4}-\d{2}-\d{2}$/.test(anchorDate)) {
48
+ throw new Error(`${label}.anchorDate must be a valid YYYY-MM-DD date`);
49
+ }
50
+ return { type: cycleType, anchorDate };
51
+ }
35
52
  export function validateClientConfig(value, indexLabel = "client") {
36
53
  const client = ensureObject(value, indexLabel);
54
+ const billingCycle = client.billingCycle !== undefined
55
+ ? validateBillingCycle(client.billingCycle, `${indexLabel}.billingCycle`)
56
+ : undefined;
37
57
  return {
38
58
  name: ensureString(client.name, `${indexLabel}.name`).trim(),
39
59
  email: ensureString(client.email, `${indexLabel}.email`, "").trim(),
@@ -41,6 +61,8 @@ export function validateClientConfig(value, indexLabel = "client") {
41
61
  currency: ensureString(client.currency, `${indexLabel}.currency`, "USD") || "USD",
42
62
  defaultRate: ensureOptionalNumber(client.defaultRate, `${indexLabel}.defaultRate`, 0),
43
63
  payPeriodType: ensureString(client.payPeriodType, `${indexLabel}.payPeriodType`, "").trim(),
64
+ billingCycle,
65
+ paymentTerms: ensureString(client.paymentTerms, `${indexLabel}.paymentTerms`, "").trim() || undefined,
44
66
  };
45
67
  }
46
68
  export function validateConfig(value) {
@@ -133,4 +155,52 @@ export function validateArchiveData(value) {
133
155
  archivedEntries: archivedRaw.map((entry, index) => validateArchivedEntry(entry, `archive.archivedEntries[${index}]`)),
134
156
  };
135
157
  }
158
+ // ── Invoice Drafts ──────────────────────────────────────────────
159
+ function validateDraftLineItem(value, label) {
160
+ const obj = ensureObject(value, label);
161
+ return {
162
+ description: ensureString(obj.description, `${label}.description`, ""),
163
+ hours: ensureOptionalNumber(obj.hours, `${label}.hours`, 0),
164
+ rate: ensureOptionalNumber(obj.rate, `${label}.rate`, 0),
165
+ amount: ensureOptionalNumber(obj.amount, `${label}.amount`, 0),
166
+ };
167
+ }
168
+ function validateInvoiceDraft(value, label) {
169
+ const obj = ensureObject(value, label);
170
+ const status = ensureString(obj.status, `${label}.status`, "draft");
171
+ if (!VALID_DRAFT_STATUSES.has(status)) {
172
+ throw new Error(`${label}.status must be one of: draft, confirmed, scheduled, sent, failed`);
173
+ }
174
+ const lineItemsRaw = obj.lineItems ?? [];
175
+ if (!Array.isArray(lineItemsRaw)) {
176
+ throw new Error(`${label}.lineItems must be an array`);
177
+ }
178
+ return {
179
+ id: ensureString(obj.id, `${label}.id`),
180
+ client: ensureString(obj.client, `${label}.client`),
181
+ status: status,
182
+ invoiceNumber: ensureString(obj.invoiceNumber, `${label}.invoiceNumber`, ""),
183
+ periodFrom: ensureString(obj.periodFrom, `${label}.periodFrom`, ""),
184
+ periodTo: ensureString(obj.periodTo, `${label}.periodTo`, ""),
185
+ invoiceDate: ensureString(obj.invoiceDate, `${label}.invoiceDate`, ""),
186
+ lineItems: lineItemsRaw.map((item, i) => validateDraftLineItem(item, `${label}.lineItems[${i}]`)),
187
+ total: ensureOptionalNumber(obj.total, `${label}.total`, 0),
188
+ currency: ensureString(obj.currency, `${label}.currency`, "USD"),
189
+ paymentTerms: ensureString(obj.paymentTerms, `${label}.paymentTerms`, ""),
190
+ pdfPath: obj.pdfPath === null || obj.pdfPath === undefined ? null : ensureString(obj.pdfPath, `${label}.pdfPath`),
191
+ scheduledSendDate: obj.scheduledSendDate === null || obj.scheduledSendDate === undefined ? null : ensureString(obj.scheduledSendDate, `${label}.scheduledSendDate`),
192
+ sentAt: obj.sentAt === null || obj.sentAt === undefined ? null : ensureString(obj.sentAt, `${label}.sentAt`),
193
+ createdAt: ensureString(obj.createdAt, `${label}.createdAt`, new Date().toISOString()),
194
+ };
195
+ }
196
+ export function validateDraftsData(value) {
197
+ const obj = ensureObject(value, "drafts");
198
+ const draftsRaw = obj.drafts ?? [];
199
+ if (!Array.isArray(draftsRaw)) {
200
+ throw new Error("drafts.drafts must be an array");
201
+ }
202
+ return {
203
+ drafts: draftsRaw.map((draft, index) => validateInvoiceDraft(draft, `drafts[${index}]`)),
204
+ };
205
+ }
136
206
  //# sourceMappingURL=validators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/core/validators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/core/validators.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
+ // ── Billing Cycle ────────────────────────────────────────────────
1
2
  export {};
2
3
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AAAA,oEAAoE"}
@@ -0,0 +1,211 @@
1
+ import { loadJsonFile, writeJsonFile } from "../core/json-store.js";
2
+ import { validateConfig, validateDraftsData, validateLastState } from "../core/validators.js";
3
+ import { resolveInvoiceNumber, getInvoiceDate } from "./invoice-number.js";
4
+ import { readTimesheetEntries, aggregateEntriesByDescription } from "./timesheet.js";
5
+ // ── Helpers ──────────────────────────────────────────────────────
6
+ function addDays(date, days) {
7
+ const result = new Date(date);
8
+ result.setDate(result.getDate() + days);
9
+ return result;
10
+ }
11
+ function toISO(date) {
12
+ return date.toISOString().slice(0, 10);
13
+ }
14
+ function parseDate(dateStr) {
15
+ const [y, m, d] = dateStr.split("-").map(Number);
16
+ return new Date(y, m - 1, d);
17
+ }
18
+ function round2(value) {
19
+ return Math.round(value * 100) / 100;
20
+ }
21
+ // ── Billing Cycle Logic ──────────────────────────────────────────
22
+ function getCycleLengthDays(type) {
23
+ switch (type) {
24
+ case "weekly": return 7;
25
+ case "biweekly": return 14;
26
+ case "monthly": return 0; // special: month boundaries
27
+ case "custom": return 0; // user-defined, needs anchorDate logic
28
+ default: return 0;
29
+ }
30
+ }
31
+ function addOneMonth(date) {
32
+ const result = new Date(date);
33
+ result.setMonth(result.getMonth() + 1);
34
+ return result;
35
+ }
36
+ /**
37
+ * Compute all completed billing periods between anchorDate and today.
38
+ * Returns only periods that have already ended (periodTo < today).
39
+ */
40
+ export function getCompletedPeriods(cycle, today = new Date()) {
41
+ const anchor = parseDate(cycle.anchorDate);
42
+ const todayDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
43
+ const periods = [];
44
+ if (cycle.type === "monthly") {
45
+ let periodStart = anchor;
46
+ while (periodStart < todayDate) {
47
+ const periodEnd = addDays(addOneMonth(periodStart), -1);
48
+ if (periodEnd < todayDate) {
49
+ periods.push({ periodFrom: toISO(periodStart), periodTo: toISO(periodEnd) });
50
+ }
51
+ periodStart = addOneMonth(periodStart);
52
+ }
53
+ return periods;
54
+ }
55
+ const days = getCycleLengthDays(cycle.type);
56
+ if (days <= 0)
57
+ return periods;
58
+ let periodStart = anchor;
59
+ while (periodStart < todayDate) {
60
+ const periodEnd = addDays(periodStart, days - 1);
61
+ if (periodEnd < todayDate) {
62
+ periods.push({ periodFrom: toISO(periodStart), periodTo: toISO(periodEnd) });
63
+ }
64
+ periodStart = addDays(periodStart, days);
65
+ }
66
+ return periods;
67
+ }
68
+ // ── Drafts CRUD ──────────────────────────────────────────────────
69
+ export function loadDrafts(paths) {
70
+ return loadJsonFile(paths.draftsPath, { drafts: [] }, validateDraftsData);
71
+ }
72
+ export function saveDrafts(paths, data) {
73
+ writeJsonFile(paths.draftsPath, data);
74
+ }
75
+ function loadConfig(paths) {
76
+ return loadJsonFile(paths.configPath, { client: [], from: {} }, validateConfig);
77
+ }
78
+ function loadLastState(paths) {
79
+ return loadJsonFile(paths.lastPath, { clients: {} }, validateLastState);
80
+ }
81
+ // ── Auto-Generate Drafts ─────────────────────────────────────────
82
+ /**
83
+ * Check all clients with billingCycle configured.
84
+ * For each completed period that doesn't already have a draft, create one.
85
+ * Returns the newly created drafts.
86
+ */
87
+ export function checkAndGenerateDueDrafts(paths) {
88
+ const cfg = loadConfig(paths);
89
+ const last = loadLastState(paths);
90
+ const draftsData = loadDrafts(paths);
91
+ const newDrafts = [];
92
+ for (const client of cfg.client) {
93
+ if (!client.billingCycle)
94
+ continue;
95
+ const completedPeriods = getCompletedPeriods(client.billingCycle);
96
+ for (const period of completedPeriods) {
97
+ // Skip if a draft already exists for this client + period
98
+ const exists = draftsData.drafts.some((d) => d.client === client.name && d.periodFrom === period.periodFrom && d.periodTo === period.periodTo);
99
+ if (exists)
100
+ continue;
101
+ // Get timesheet entries within this period
102
+ const entries = readTimesheetEntries(paths, { client: client.name });
103
+ const periodEntries = entries.filter((e) => e.date >= period.periodFrom && e.date <= period.periodTo);
104
+ if (periodEntries.length === 0)
105
+ continue;
106
+ const draft = createDraftFromEntries({
107
+ client,
108
+ entries: periodEntries,
109
+ period,
110
+ cfg,
111
+ last,
112
+ });
113
+ newDrafts.push(draft);
114
+ draftsData.drafts.push(draft);
115
+ }
116
+ }
117
+ if (newDrafts.length > 0) {
118
+ saveDrafts(paths, draftsData);
119
+ writeJsonFile(paths.lastPath, last);
120
+ }
121
+ return newDrafts;
122
+ }
123
+ export function createDraftFromEntries(params) {
124
+ const { client, entries, period, cfg, last } = params;
125
+ // Aggregate entries by description
126
+ const groups = aggregateEntriesByDescription(entries);
127
+ const lineItems = groups.map((g) => ({
128
+ description: g.description,
129
+ hours: round2(g.hours),
130
+ rate: round2(g.rate),
131
+ amount: round2(g.amount),
132
+ }));
133
+ const total = round2(lineItems.reduce((sum, item) => sum + item.amount, 0));
134
+ const currency = client.currency?.trim() || "USD";
135
+ // Resolve the month from the period for invoice numbering
136
+ const month = period.periodFrom.slice(0, 7);
137
+ // Get client history for sequencing
138
+ if (!last.clients[client.name]) {
139
+ last.clients[client.name] = { lastHours: 0, lastRate: 0, seqByMonth: {} };
140
+ }
141
+ const clientHistory = last.clients[client.name];
142
+ const invoiceNumber = resolveInvoiceNumber({
143
+ month,
144
+ invoicePrefix: cfg.invoicePrefix,
145
+ seqByMonth: clientHistory.seqByMonth,
146
+ });
147
+ return {
148
+ id: `draft-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
149
+ client: client.name,
150
+ status: "draft",
151
+ invoiceNumber,
152
+ periodFrom: period.periodFrom,
153
+ periodTo: period.periodTo,
154
+ invoiceDate: getInvoiceDate(),
155
+ lineItems,
156
+ total,
157
+ currency,
158
+ paymentTerms: client.paymentTerms || client.payPeriodType || "",
159
+ pdfPath: null,
160
+ scheduledSendDate: null,
161
+ sentAt: null,
162
+ createdAt: new Date().toISOString(),
163
+ };
164
+ }
165
+ // ── Draft Actions ────────────────────────────────────────────────
166
+ export function getDraftById(paths, draftId) {
167
+ const data = loadDrafts(paths);
168
+ return data.drafts.find((d) => d.id === draftId);
169
+ }
170
+ export function updateDraft(paths, draftId, updates) {
171
+ const data = loadDrafts(paths);
172
+ const index = data.drafts.findIndex((d) => d.id === draftId);
173
+ if (index === -1)
174
+ throw new Error(`Draft not found: ${draftId}`);
175
+ const draft = { ...data.drafts[index], ...updates };
176
+ data.drafts[index] = draft;
177
+ saveDrafts(paths, data);
178
+ return draft;
179
+ }
180
+ export function deleteDraft(paths, draftId) {
181
+ const data = loadDrafts(paths);
182
+ const index = data.drafts.findIndex((d) => d.id === draftId);
183
+ if (index === -1)
184
+ throw new Error(`Draft not found: ${draftId}`);
185
+ data.drafts.splice(index, 1);
186
+ saveDrafts(paths, data);
187
+ }
188
+ export function confirmDraft(paths, draftId) {
189
+ return updateDraft(paths, draftId, { status: "confirmed" });
190
+ }
191
+ export function scheduleDraft(paths, draftId, sendDate) {
192
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(sendDate)) {
193
+ throw new Error("Send date must be YYYY-MM-DD format");
194
+ }
195
+ return updateDraft(paths, draftId, { status: "scheduled", scheduledSendDate: sendDate });
196
+ }
197
+ export function markDraftSent(paths, draftId) {
198
+ return updateDraft(paths, draftId, { status: "sent", sentAt: new Date().toISOString() });
199
+ }
200
+ export function markDraftFailed(paths, draftId) {
201
+ return updateDraft(paths, draftId, { status: "failed" });
202
+ }
203
+ /**
204
+ * Find drafts that are scheduled and due for sending (scheduledSendDate <= today).
205
+ */
206
+ export function getDueScheduledDrafts(paths, today = new Date()) {
207
+ const data = loadDrafts(paths);
208
+ const todayStr = toISO(today);
209
+ return data.drafts.filter((d) => d.status === "scheduled" && d.scheduledSendDate && d.scheduledSendDate <= todayStr);
210
+ }
211
+ //# sourceMappingURL=draft-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-service.js","sourceRoot":"","sources":["../../src/services/draft-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@invoicer/cli",
3
- "version": "1.2.4",
3
+ "version": "1.3.0",
4
4
  "description": "Professional invoice generator with timesheet integration and CLI support",
5
5
  "homepage": "https://invoicer.inbrief.sh/",
6
6
  "repository": {