pay-lobster 1.0.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/README.md +401 -0
- package/README.md.bak +401 -0
- package/dist/agent.d.ts +132 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +224 -0
- package/dist/agent.js.map +1 -0
- package/dist/analytics.d.ts +120 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +345 -0
- package/dist/analytics.js.map +1 -0
- package/dist/approvals.d.ts +168 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +406 -0
- package/dist/approvals.js.map +1 -0
- package/dist/circle-client.d.ts +152 -0
- package/dist/circle-client.d.ts.map +1 -0
- package/dist/circle-client.js +266 -0
- package/dist/circle-client.js.map +1 -0
- package/dist/commission.d.ts +191 -0
- package/dist/commission.d.ts.map +1 -0
- package/dist/commission.js +475 -0
- package/dist/commission.js.map +1 -0
- package/dist/condition-builder.d.ts +98 -0
- package/dist/condition-builder.d.ts.map +1 -0
- package/dist/condition-builder.js +193 -0
- package/dist/condition-builder.js.map +1 -0
- package/dist/contacts.d.ts +179 -0
- package/dist/contacts.d.ts.map +1 -0
- package/dist/contacts.js +445 -0
- package/dist/contacts.js.map +1 -0
- package/dist/easy.d.ts +22 -0
- package/dist/easy.d.ts.map +1 -0
- package/dist/easy.js +40 -0
- package/dist/easy.js.map +1 -0
- package/dist/erc8004/constants.d.ts +152 -0
- package/dist/erc8004/constants.d.ts.map +1 -0
- package/dist/erc8004/constants.js +114 -0
- package/dist/erc8004/constants.js.map +1 -0
- package/dist/erc8004/discovery.d.ts +84 -0
- package/dist/erc8004/discovery.d.ts.map +1 -0
- package/dist/erc8004/discovery.js +217 -0
- package/dist/erc8004/discovery.js.map +1 -0
- package/dist/erc8004/identity.d.ts +91 -0
- package/dist/erc8004/identity.d.ts.map +1 -0
- package/dist/erc8004/identity.js +250 -0
- package/dist/erc8004/identity.js.map +1 -0
- package/dist/erc8004/index.d.ts +147 -0
- package/dist/erc8004/index.d.ts.map +1 -0
- package/dist/erc8004/index.js +225 -0
- package/dist/erc8004/index.js.map +1 -0
- package/dist/erc8004/reputation.d.ts +133 -0
- package/dist/erc8004/reputation.d.ts.map +1 -0
- package/dist/erc8004/reputation.js +277 -0
- package/dist/erc8004/reputation.js.map +1 -0
- package/dist/escrow-templates.d.ts +38 -0
- package/dist/escrow-templates.d.ts.map +1 -0
- package/dist/escrow-templates.js +419 -0
- package/dist/escrow-templates.js.map +1 -0
- package/dist/escrow.d.ts +320 -0
- package/dist/escrow.d.ts.map +1 -0
- package/dist/escrow.js +854 -0
- package/dist/escrow.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/invoices.d.ts +212 -0
- package/dist/invoices.d.ts.map +1 -0
- package/dist/invoices.js +393 -0
- package/dist/invoices.js.map +1 -0
- package/dist/notifications.d.ts +141 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +350 -0
- package/dist/notifications.js.map +1 -0
- package/dist/tips.d.ts +171 -0
- package/dist/tips.d.ts.map +1 -0
- package/dist/tips.js +390 -0
- package/dist/tips.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/x402-client.d.ts +127 -0
- package/dist/x402-client.d.ts.map +1 -0
- package/dist/x402-client.js +350 -0
- package/dist/x402-client.js.map +1 -0
- package/dist/x402-server.d.ts +133 -0
- package/dist/x402-server.d.ts.map +1 -0
- package/dist/x402-server.js +330 -0
- package/dist/x402-server.js.map +1 -0
- package/lib/agent.ts +273 -0
- package/lib/analytics.ts +474 -0
- package/lib/analytics.ts.bak +474 -0
- package/lib/approvals.ts +585 -0
- package/lib/approvals.ts.bak +585 -0
- package/lib/circle-client.ts +376 -0
- package/lib/circle-client.ts.bak +376 -0
- package/lib/commission.ts +680 -0
- package/lib/commission.ts.bak +680 -0
- package/lib/condition-builder.ts +223 -0
- package/lib/condition-builder.ts.bak +223 -0
- package/lib/contacts.ts +615 -0
- package/lib/contacts.ts.bak +615 -0
- package/lib/easy.ts +46 -0
- package/lib/easy.ts.bak +352 -0
- package/lib/erc8004/constants.ts +175 -0
- package/lib/erc8004/discovery.ts +299 -0
- package/lib/erc8004/identity.ts +327 -0
- package/lib/erc8004/index.ts +285 -0
- package/lib/erc8004/reputation.ts +368 -0
- package/lib/escrow-templates.ts +462 -0
- package/lib/escrow.ts +1216 -0
- package/lib/index.ts +13 -0
- package/lib/invoices.ts +588 -0
- package/lib/notifications.ts +484 -0
- package/lib/tips.ts +570 -0
- package/lib/types.ts +108 -0
- package/lib/x402-client.ts +471 -0
- package/lib/x402-server.ts +462 -0
- package/package.json +58 -0
package/dist/invoices.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Invoice & Payment Request System
|
|
4
|
+
*
|
|
5
|
+
* Generate, track, and manage USDC invoices and payment requests.
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.RecurringPaymentManager = exports.InvoiceManager = void 0;
|
|
12
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
13
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const DATA_DIR = process.env.USDC_DATA_DIR || './data';
|
|
16
|
+
/**
|
|
17
|
+
* Invoice Manager
|
|
18
|
+
*/
|
|
19
|
+
class InvoiceManager {
|
|
20
|
+
constructor(dataDir = DATA_DIR) {
|
|
21
|
+
this.dataPath = path_1.default.join(dataDir, 'invoices.json');
|
|
22
|
+
}
|
|
23
|
+
async loadInvoices() {
|
|
24
|
+
try {
|
|
25
|
+
const data = await promises_1.default.readFile(this.dataPath, 'utf-8');
|
|
26
|
+
return JSON.parse(data);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async saveInvoices(invoices) {
|
|
33
|
+
await promises_1.default.mkdir(path_1.default.dirname(this.dataPath), { recursive: true });
|
|
34
|
+
await promises_1.default.writeFile(this.dataPath, JSON.stringify(invoices, null, 2));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a new invoice
|
|
38
|
+
*/
|
|
39
|
+
async create(params) {
|
|
40
|
+
const invoices = await this.loadInvoices();
|
|
41
|
+
const invoiceNumber = `INV-${Date.now().toString(36).toUpperCase()}`;
|
|
42
|
+
const items = params.items.map(item => ({
|
|
43
|
+
...item,
|
|
44
|
+
total: (item.quantity * parseFloat(item.unitPrice)).toFixed(2),
|
|
45
|
+
}));
|
|
46
|
+
const subtotal = items.reduce((sum, item) => sum + parseFloat(item.total), 0);
|
|
47
|
+
const tax = params.taxRate ? subtotal * (params.taxRate / 100) : 0;
|
|
48
|
+
const total = subtotal + tax;
|
|
49
|
+
const invoice = {
|
|
50
|
+
id: crypto_1.default.randomUUID(),
|
|
51
|
+
number: invoiceNumber,
|
|
52
|
+
status: 'draft',
|
|
53
|
+
from: params.from,
|
|
54
|
+
to: params.to,
|
|
55
|
+
items,
|
|
56
|
+
subtotal: subtotal.toFixed(2),
|
|
57
|
+
tax: tax > 0 ? tax.toFixed(2) : undefined,
|
|
58
|
+
taxRate: params.taxRate,
|
|
59
|
+
total: total.toFixed(2),
|
|
60
|
+
currency: 'USDC',
|
|
61
|
+
paymentChain: params.chain || 'ETH-SEPOLIA',
|
|
62
|
+
paymentAddress: params.from.walletAddress,
|
|
63
|
+
memo: params.memo,
|
|
64
|
+
dueDate: params.dueDate,
|
|
65
|
+
createdAt: new Date().toISOString(),
|
|
66
|
+
updatedAt: new Date().toISOString(),
|
|
67
|
+
};
|
|
68
|
+
// Generate payment link
|
|
69
|
+
invoice.paymentLink = this.generatePaymentLink(invoice);
|
|
70
|
+
// Generate x402 payment URL
|
|
71
|
+
invoice.x402PaymentUrl = this.generateX402PaymentUrl(invoice);
|
|
72
|
+
invoices.push(invoice);
|
|
73
|
+
await this.saveInvoices(invoices);
|
|
74
|
+
return invoice;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get invoice by ID or number
|
|
78
|
+
*/
|
|
79
|
+
async get(idOrNumber) {
|
|
80
|
+
const invoices = await this.loadInvoices();
|
|
81
|
+
return invoices.find(inv => inv.id === idOrNumber || inv.number === idOrNumber) || null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* List invoices with optional filters
|
|
85
|
+
*/
|
|
86
|
+
async list(filters) {
|
|
87
|
+
let invoices = await this.loadInvoices();
|
|
88
|
+
if (filters?.status) {
|
|
89
|
+
invoices = invoices.filter(inv => inv.status === filters.status);
|
|
90
|
+
}
|
|
91
|
+
if (filters?.toName) {
|
|
92
|
+
invoices = invoices.filter(inv => inv.to.name.toLowerCase().includes(filters.toName.toLowerCase()));
|
|
93
|
+
}
|
|
94
|
+
if (filters?.fromDate) {
|
|
95
|
+
invoices = invoices.filter(inv => inv.createdAt >= filters.fromDate);
|
|
96
|
+
}
|
|
97
|
+
if (filters?.toDate) {
|
|
98
|
+
invoices = invoices.filter(inv => inv.createdAt <= filters.toDate);
|
|
99
|
+
}
|
|
100
|
+
return invoices.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Mark invoice as sent
|
|
104
|
+
*/
|
|
105
|
+
async markSent(id) {
|
|
106
|
+
const invoices = await this.loadInvoices();
|
|
107
|
+
const invoice = invoices.find(inv => inv.id === id);
|
|
108
|
+
if (invoice) {
|
|
109
|
+
invoice.status = 'sent';
|
|
110
|
+
invoice.sentAt = new Date().toISOString();
|
|
111
|
+
invoice.updatedAt = new Date().toISOString();
|
|
112
|
+
await this.saveInvoices(invoices);
|
|
113
|
+
}
|
|
114
|
+
return invoice || null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Mark invoice as paid
|
|
118
|
+
*/
|
|
119
|
+
async markPaid(id, txHash, amount) {
|
|
120
|
+
const invoices = await this.loadInvoices();
|
|
121
|
+
const invoice = invoices.find(inv => inv.id === id);
|
|
122
|
+
if (invoice) {
|
|
123
|
+
invoice.status = 'paid';
|
|
124
|
+
invoice.txHash = txHash;
|
|
125
|
+
invoice.paidAt = new Date().toISOString();
|
|
126
|
+
invoice.paidAmount = amount || invoice.total;
|
|
127
|
+
invoice.updatedAt = new Date().toISOString();
|
|
128
|
+
await this.saveInvoices(invoices);
|
|
129
|
+
}
|
|
130
|
+
return invoice || null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Cancel invoice
|
|
134
|
+
*/
|
|
135
|
+
async cancel(id) {
|
|
136
|
+
const invoices = await this.loadInvoices();
|
|
137
|
+
const invoice = invoices.find(inv => inv.id === id);
|
|
138
|
+
if (invoice && invoice.status !== 'paid') {
|
|
139
|
+
invoice.status = 'cancelled';
|
|
140
|
+
invoice.updatedAt = new Date().toISOString();
|
|
141
|
+
await this.saveInvoices(invoices);
|
|
142
|
+
}
|
|
143
|
+
return invoice || null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Generate payment link for invoice
|
|
147
|
+
*/
|
|
148
|
+
generatePaymentLink(invoice) {
|
|
149
|
+
// EIP-681 style payment request (simplified)
|
|
150
|
+
const params = new URLSearchParams({
|
|
151
|
+
to: invoice.paymentAddress,
|
|
152
|
+
value: invoice.total,
|
|
153
|
+
chain: invoice.paymentChain,
|
|
154
|
+
ref: invoice.number,
|
|
155
|
+
});
|
|
156
|
+
return `usdc://pay?${params.toString()}`;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Generate x402-enabled payment URL for invoice
|
|
160
|
+
* Returns a URL that triggers 402 Payment Required
|
|
161
|
+
*/
|
|
162
|
+
generateX402PaymentUrl(invoice) {
|
|
163
|
+
// This would point to your x402-enabled invoice payment endpoint
|
|
164
|
+
const baseUrl = process.env.X402_BASE_URL || 'https://api.lobster-pay.com';
|
|
165
|
+
return `${baseUrl}/invoices/${invoice.id}/pay`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Add x402 payment method to invoice
|
|
169
|
+
* Creates a payment-gated endpoint for this invoice
|
|
170
|
+
*/
|
|
171
|
+
async enableX402Payment(invoiceId, options) {
|
|
172
|
+
const invoice = await this.get(invoiceId);
|
|
173
|
+
if (!invoice) {
|
|
174
|
+
throw new Error('Invoice not found');
|
|
175
|
+
}
|
|
176
|
+
const baseUrl = options?.baseUrl || process.env.X402_BASE_URL || 'https://api.lobster-pay.com';
|
|
177
|
+
const x402Url = `${baseUrl}/invoices/${invoice.id}/pay`;
|
|
178
|
+
invoice.x402PaymentUrl = x402Url;
|
|
179
|
+
invoice.updatedAt = new Date().toISOString();
|
|
180
|
+
const invoices = await this.loadInvoices();
|
|
181
|
+
const index = invoices.findIndex(inv => inv.id === invoiceId);
|
|
182
|
+
if (index !== -1) {
|
|
183
|
+
invoices[index] = invoice;
|
|
184
|
+
await this.saveInvoices(invoices);
|
|
185
|
+
}
|
|
186
|
+
return x402Url;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Format invoice as text for messaging
|
|
190
|
+
*/
|
|
191
|
+
formatInvoiceText(invoice) {
|
|
192
|
+
let text = `📄 **Invoice ${invoice.number}**\n\n`;
|
|
193
|
+
text += `To: ${invoice.to.name}\n`;
|
|
194
|
+
text += `Status: ${invoice.status.toUpperCase()}\n\n`;
|
|
195
|
+
text += `**Items:**\n`;
|
|
196
|
+
for (const item of invoice.items) {
|
|
197
|
+
text += `• ${item.description} (x${item.quantity}) — $${item.total}\n`;
|
|
198
|
+
}
|
|
199
|
+
text += `\nSubtotal: $${invoice.subtotal} USDC\n`;
|
|
200
|
+
if (invoice.tax) {
|
|
201
|
+
text += `Tax (${invoice.taxRate}%): $${invoice.tax} USDC\n`;
|
|
202
|
+
}
|
|
203
|
+
text += `**Total: $${invoice.total} USDC**\n\n`;
|
|
204
|
+
if (invoice.dueDate) {
|
|
205
|
+
text += `Due: ${new Date(invoice.dueDate).toLocaleDateString()}\n`;
|
|
206
|
+
}
|
|
207
|
+
text += `\nPay to: \`${invoice.paymentAddress}\`\n`;
|
|
208
|
+
text += `Chain: ${invoice.paymentChain}\n`;
|
|
209
|
+
if (invoice.memo) {
|
|
210
|
+
text += `\nMemo: ${invoice.memo}\n`;
|
|
211
|
+
}
|
|
212
|
+
return text;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Check for overdue invoices
|
|
216
|
+
*/
|
|
217
|
+
async checkOverdue() {
|
|
218
|
+
const invoices = await this.loadInvoices();
|
|
219
|
+
const now = new Date();
|
|
220
|
+
const overdue = [];
|
|
221
|
+
for (const invoice of invoices) {
|
|
222
|
+
if (invoice.status === 'sent' &&
|
|
223
|
+
invoice.dueDate &&
|
|
224
|
+
new Date(invoice.dueDate) < now) {
|
|
225
|
+
invoice.status = 'overdue';
|
|
226
|
+
invoice.updatedAt = now.toISOString();
|
|
227
|
+
overdue.push(invoice);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (overdue.length > 0) {
|
|
231
|
+
await this.saveInvoices(invoices);
|
|
232
|
+
}
|
|
233
|
+
return overdue;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.InvoiceManager = InvoiceManager;
|
|
237
|
+
/**
|
|
238
|
+
* Recurring Payment Manager
|
|
239
|
+
*/
|
|
240
|
+
class RecurringPaymentManager {
|
|
241
|
+
constructor(dataDir = DATA_DIR) {
|
|
242
|
+
this.dataPath = path_1.default.join(dataDir, 'recurring.json');
|
|
243
|
+
}
|
|
244
|
+
async loadPayments() {
|
|
245
|
+
try {
|
|
246
|
+
const data = await promises_1.default.readFile(this.dataPath, 'utf-8');
|
|
247
|
+
return JSON.parse(data);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async savePayments(payments) {
|
|
254
|
+
await promises_1.default.mkdir(path_1.default.dirname(this.dataPath), { recursive: true });
|
|
255
|
+
await promises_1.default.writeFile(this.dataPath, JSON.stringify(payments, null, 2));
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Schedule a recurring payment
|
|
259
|
+
*/
|
|
260
|
+
async schedule(params) {
|
|
261
|
+
const payments = await this.loadPayments();
|
|
262
|
+
const startDate = params.startDate || new Date().toISOString().split('T')[0];
|
|
263
|
+
const nextPaymentDate = this.calculateNextDate(startDate, params.frequency);
|
|
264
|
+
const payment = {
|
|
265
|
+
id: crypto_1.default.randomUUID(),
|
|
266
|
+
name: params.name,
|
|
267
|
+
amount: params.amount,
|
|
268
|
+
toAddress: params.toAddress,
|
|
269
|
+
toName: params.toName,
|
|
270
|
+
chain: params.chain,
|
|
271
|
+
frequency: params.frequency,
|
|
272
|
+
startDate,
|
|
273
|
+
endDate: params.endDate,
|
|
274
|
+
nextPaymentDate,
|
|
275
|
+
status: 'active',
|
|
276
|
+
walletId: params.walletId,
|
|
277
|
+
payments: [],
|
|
278
|
+
createdAt: new Date().toISOString(),
|
|
279
|
+
};
|
|
280
|
+
payments.push(payment);
|
|
281
|
+
await this.savePayments(payments);
|
|
282
|
+
return payment;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Get all due payments
|
|
286
|
+
*/
|
|
287
|
+
async getDuePayments() {
|
|
288
|
+
const payments = await this.loadPayments();
|
|
289
|
+
const today = new Date().toISOString().split('T')[0];
|
|
290
|
+
return payments.filter(p => p.status === 'active' &&
|
|
291
|
+
p.nextPaymentDate <= today &&
|
|
292
|
+
(!p.endDate || p.endDate >= today));
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Record a payment execution
|
|
296
|
+
*/
|
|
297
|
+
async recordExecution(id, txHash) {
|
|
298
|
+
const payments = await this.loadPayments();
|
|
299
|
+
const payment = payments.find(p => p.id === id);
|
|
300
|
+
if (payment) {
|
|
301
|
+
payment.payments.push({
|
|
302
|
+
date: new Date().toISOString(),
|
|
303
|
+
txHash,
|
|
304
|
+
amount: payment.amount,
|
|
305
|
+
});
|
|
306
|
+
// Calculate next payment date
|
|
307
|
+
payment.nextPaymentDate = this.calculateNextDate(payment.nextPaymentDate, payment.frequency);
|
|
308
|
+
// Check if completed
|
|
309
|
+
if (payment.endDate && payment.nextPaymentDate > payment.endDate) {
|
|
310
|
+
payment.status = 'completed';
|
|
311
|
+
}
|
|
312
|
+
await this.savePayments(payments);
|
|
313
|
+
}
|
|
314
|
+
return payment || null;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Pause recurring payment
|
|
318
|
+
*/
|
|
319
|
+
async pause(id) {
|
|
320
|
+
const payments = await this.loadPayments();
|
|
321
|
+
const payment = payments.find(p => p.id === id);
|
|
322
|
+
if (payment && payment.status === 'active') {
|
|
323
|
+
payment.status = 'paused';
|
|
324
|
+
await this.savePayments(payments);
|
|
325
|
+
}
|
|
326
|
+
return payment || null;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Resume recurring payment
|
|
330
|
+
*/
|
|
331
|
+
async resume(id) {
|
|
332
|
+
const payments = await this.loadPayments();
|
|
333
|
+
const payment = payments.find(p => p.id === id);
|
|
334
|
+
if (payment && payment.status === 'paused') {
|
|
335
|
+
payment.status = 'active';
|
|
336
|
+
// Recalculate next payment from today
|
|
337
|
+
payment.nextPaymentDate = this.calculateNextDate(new Date().toISOString().split('T')[0], payment.frequency);
|
|
338
|
+
await this.savePayments(payments);
|
|
339
|
+
}
|
|
340
|
+
return payment || null;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Cancel recurring payment
|
|
344
|
+
*/
|
|
345
|
+
async cancel(id) {
|
|
346
|
+
const payments = await this.loadPayments();
|
|
347
|
+
const payment = payments.find(p => p.id === id);
|
|
348
|
+
if (payment) {
|
|
349
|
+
payment.status = 'cancelled';
|
|
350
|
+
await this.savePayments(payments);
|
|
351
|
+
}
|
|
352
|
+
return payment || null;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* List all recurring payments
|
|
356
|
+
*/
|
|
357
|
+
async list(status) {
|
|
358
|
+
const payments = await this.loadPayments();
|
|
359
|
+
return status
|
|
360
|
+
? payments.filter(p => p.status === status)
|
|
361
|
+
: payments;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Calculate next payment date based on frequency
|
|
365
|
+
*/
|
|
366
|
+
calculateNextDate(fromDate, frequency) {
|
|
367
|
+
const date = new Date(fromDate);
|
|
368
|
+
switch (frequency) {
|
|
369
|
+
case 'daily':
|
|
370
|
+
date.setDate(date.getDate() + 1);
|
|
371
|
+
break;
|
|
372
|
+
case 'weekly':
|
|
373
|
+
date.setDate(date.getDate() + 7);
|
|
374
|
+
break;
|
|
375
|
+
case 'biweekly':
|
|
376
|
+
date.setDate(date.getDate() + 14);
|
|
377
|
+
break;
|
|
378
|
+
case 'monthly':
|
|
379
|
+
date.setMonth(date.getMonth() + 1);
|
|
380
|
+
break;
|
|
381
|
+
case 'quarterly':
|
|
382
|
+
date.setMonth(date.getMonth() + 3);
|
|
383
|
+
break;
|
|
384
|
+
case 'yearly':
|
|
385
|
+
date.setFullYear(date.getFullYear() + 1);
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
return date.toISOString().split('T')[0];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.RecurringPaymentManager = RecurringPaymentManager;
|
|
392
|
+
exports.default = { InvoiceManager, RecurringPaymentManager };
|
|
393
|
+
//# sourceMappingURL=invoices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoices.js","sourceRoot":"","sources":["../lib/invoices.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,oDAA4B;AAC5B,2DAA6B;AAC7B,gDAAwB;AAqFxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,QAAQ,CAAC;AAEvD;;GAEG;AACH,MAAa,cAAc;IAGzB,YAAY,OAAO,GAAG,QAAQ;QAC5B,IAAI,CAAC,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAmB;QAC5C,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAQZ;QACC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAErE,MAAM,KAAK,GAAkB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrD,GAAG,IAAI;YACP,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SAC/D,CAAC,CAAC,CAAC;QAEJ,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC;QAE7B,MAAM,OAAO,GAAY;YACvB,EAAE,EAAE,gBAAM,CAAC,UAAU,EAAE;YACvB,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7B,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvB,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,aAAa;YAC3C,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa;YACzC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,wBAAwB;QACxB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAExD,4BAA4B;QAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAE9D,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAElC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,UAAkB;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACzB,GAAG,CAAC,EAAE,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,CACnD,IAAI,IAAI,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAKV;QACC,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAEzC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/B,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAO,CAAC,WAAW,EAAE,CAAC,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,QAAS,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,MAAO,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAClE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,MAAc,EAAE,MAAe;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,UAAU,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;YAC7C,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACzC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;YAC7B,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,OAAgB;QAC1C,6CAA6C;QAC7C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,EAAE,EAAE,OAAO,CAAC,cAAc;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,YAAY;YAC3B,GAAG,EAAE,OAAO,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,cAAc,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAAC,OAAgB;QAC7C,iEAAiE;QACjE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,6BAA6B,CAAC;QAC3E,OAAO,GAAG,OAAO,aAAa,OAAO,CAAC,EAAE,MAAM,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CACrB,SAAiB,EACjB,OAGC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,6BAA6B,CAAC;QAC/F,MAAM,OAAO,GAAG,GAAG,OAAO,aAAa,OAAO,CAAC,EAAE,MAAM,CAAC;QAExD,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;QACjC,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAgB;QAChC,IAAI,IAAI,GAAG,gBAAgB,OAAO,CAAC,MAAM,QAAQ,CAAC;QAClD,IAAI,IAAI,OAAO,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QACnC,IAAI,IAAI,WAAW,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC;QAEtD,IAAI,IAAI,cAAc,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;QACzE,CAAC;QAED,IAAI,IAAI,gBAAgB,OAAO,CAAC,QAAQ,SAAS,CAAC;QAClD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,IAAI,IAAI,QAAQ,OAAO,CAAC,OAAO,QAAQ,OAAO,CAAC,GAAG,SAAS,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,aAAa,OAAO,CAAC,KAAK,aAAa,CAAC;QAEhD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC;QACrE,CAAC;QAED,IAAI,IAAI,eAAe,OAAO,CAAC,cAAc,MAAM,CAAC;QACpD,IAAI,IAAI,UAAU,OAAO,CAAC,YAAY,IAAI,CAAC;QAE3C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,IAAI,WAAW,OAAO,CAAC,IAAI,IAAI,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAc,EAAE,CAAC;QAE9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IACE,OAAO,CAAC,MAAM,KAAK,MAAM;gBACzB,OAAO,CAAC,OAAO;gBACf,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,EAC/B,CAAC;gBACD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC3B,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA7RD,wCA6RC;AAED;;GAEG;AACH,MAAa,uBAAuB;IAGlC,YAAY,OAAO,GAAG,QAAQ;QAC5B,IAAI,CAAC,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAA4B;QACrD,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAUd;QACC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE3C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5E,MAAM,OAAO,GAAqB;YAChC,EAAE,EAAE,gBAAM,CAAC,UAAU,EAAE;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS;YACT,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe;YACf,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAElC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAErD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACzB,CAAC,CAAC,MAAM,KAAK,QAAQ;YACrB,CAAC,CAAC,eAAe,IAAI,KAAK;YAC1B,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,CACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,MAAc;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC9B,MAAM;gBACN,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YAEH,8BAA8B;YAC9B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAC9C,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,SAAS,CAClB,CAAC;YAEF,qBAAqB;YACrB,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;gBACjE,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;YAC/B,CAAC;YAED,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,EAAU;QACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC1B,sCAAsC;YACtC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAC9C,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,SAAS,CAClB,CAAC;YACF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;YAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAmC;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,MAAM;YACX,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC;IACf,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,QAAgB,EAAE,SAAwC;QAClF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhC,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzC,MAAM;QACV,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF;AArMD,0DAqMC;AAED,kBAAe,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment Notifications & Webhooks
|
|
3
|
+
*
|
|
4
|
+
* Real-time notifications for USDC transactions and events.
|
|
5
|
+
*/
|
|
6
|
+
export interface NotificationConfig {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
triggers: {
|
|
11
|
+
type: 'incoming' | 'outgoing' | 'recurring' | 'invoice' | 'threshold';
|
|
12
|
+
minAmount?: string;
|
|
13
|
+
addresses?: string[];
|
|
14
|
+
chains?: string[];
|
|
15
|
+
}[];
|
|
16
|
+
channels: {
|
|
17
|
+
type: 'webhook' | 'telegram' | 'email' | 'clawdbot';
|
|
18
|
+
config: Record<string, string>;
|
|
19
|
+
}[];
|
|
20
|
+
cooldownMs?: number;
|
|
21
|
+
lastTriggeredAt?: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface Notification {
|
|
26
|
+
id: string;
|
|
27
|
+
configId?: string;
|
|
28
|
+
type: 'payment_received' | 'payment_sent' | 'recurring_due' | 'invoice_paid' | 'threshold_alert' | 'bridge_complete';
|
|
29
|
+
title: string;
|
|
30
|
+
message: string;
|
|
31
|
+
data: Record<string, any>;
|
|
32
|
+
deliveries: {
|
|
33
|
+
channel: string;
|
|
34
|
+
status: 'pending' | 'sent' | 'failed';
|
|
35
|
+
sentAt?: string;
|
|
36
|
+
error?: string;
|
|
37
|
+
}[];
|
|
38
|
+
createdAt: string;
|
|
39
|
+
readAt?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Notification Manager
|
|
43
|
+
*/
|
|
44
|
+
export declare class NotificationManager {
|
|
45
|
+
private configPath;
|
|
46
|
+
private historyPath;
|
|
47
|
+
constructor(dataDir?: string);
|
|
48
|
+
private loadConfigs;
|
|
49
|
+
private saveConfigs;
|
|
50
|
+
private loadHistory;
|
|
51
|
+
private saveHistory;
|
|
52
|
+
/**
|
|
53
|
+
* Create notification configuration
|
|
54
|
+
*/
|
|
55
|
+
createConfig(params: {
|
|
56
|
+
name: string;
|
|
57
|
+
triggers: NotificationConfig['triggers'];
|
|
58
|
+
channels: NotificationConfig['channels'];
|
|
59
|
+
cooldownMs?: number;
|
|
60
|
+
}): Promise<NotificationConfig>;
|
|
61
|
+
/**
|
|
62
|
+
* Enable/disable notification config
|
|
63
|
+
*/
|
|
64
|
+
toggleConfig(id: string, enabled: boolean): Promise<NotificationConfig | null>;
|
|
65
|
+
/**
|
|
66
|
+
* List notification configs
|
|
67
|
+
*/
|
|
68
|
+
listConfigs(): Promise<NotificationConfig[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Delete notification config
|
|
71
|
+
*/
|
|
72
|
+
deleteConfig(id: string): Promise<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Process a transaction and trigger matching notifications
|
|
75
|
+
*/
|
|
76
|
+
processTransaction(tx: {
|
|
77
|
+
type: 'incoming' | 'outgoing';
|
|
78
|
+
amount: string;
|
|
79
|
+
fromAddress: string;
|
|
80
|
+
toAddress: string;
|
|
81
|
+
chain: string;
|
|
82
|
+
txHash: string;
|
|
83
|
+
}): Promise<Notification[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Create and deliver a notification
|
|
86
|
+
*/
|
|
87
|
+
createNotification(params: {
|
|
88
|
+
configId?: string;
|
|
89
|
+
type: Notification['type'];
|
|
90
|
+
title: string;
|
|
91
|
+
message: string;
|
|
92
|
+
data: Record<string, any>;
|
|
93
|
+
channels: NotificationConfig['channels'];
|
|
94
|
+
}): Promise<Notification>;
|
|
95
|
+
/**
|
|
96
|
+
* Deliver notification to a channel
|
|
97
|
+
*/
|
|
98
|
+
private deliver;
|
|
99
|
+
/**
|
|
100
|
+
* Deliver via webhook
|
|
101
|
+
*/
|
|
102
|
+
private deliverWebhook;
|
|
103
|
+
/**
|
|
104
|
+
* Deliver via Telegram (would integrate with Clawdbot's messaging)
|
|
105
|
+
*/
|
|
106
|
+
private deliverTelegram;
|
|
107
|
+
/**
|
|
108
|
+
* Deliver via Clawdbot session message
|
|
109
|
+
*/
|
|
110
|
+
private deliverClawdbot;
|
|
111
|
+
/**
|
|
112
|
+
* Get notification history
|
|
113
|
+
*/
|
|
114
|
+
getHistory(options?: {
|
|
115
|
+
type?: Notification['type'];
|
|
116
|
+
limit?: number;
|
|
117
|
+
unreadOnly?: boolean;
|
|
118
|
+
}): Promise<Notification[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Mark notification as read
|
|
121
|
+
*/
|
|
122
|
+
markRead(id: string): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Mark all as read
|
|
125
|
+
*/
|
|
126
|
+
markAllRead(): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* Get unread count
|
|
129
|
+
*/
|
|
130
|
+
getUnreadCount(): Promise<number>;
|
|
131
|
+
/**
|
|
132
|
+
* Shorten address for display
|
|
133
|
+
*/
|
|
134
|
+
private shortAddress;
|
|
135
|
+
/**
|
|
136
|
+
* Create default notification configs for a new user
|
|
137
|
+
*/
|
|
138
|
+
createDefaultConfigs(): Promise<NotificationConfig[]>;
|
|
139
|
+
}
|
|
140
|
+
export default NotificationManager;
|
|
141
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../lib/notifications.ts"],"names":[],"mappings":"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"}
|