codebuff 1.0.143 → 1.0.144
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/chat-storage.js +17 -7
- package/dist/chat-storage.js.map +1 -1
- package/dist/cli.js +20 -9
- package/dist/cli.js.map +1 -1
- package/dist/client.js +17 -7
- package/dist/client.js.map +1 -1
- package/dist/code-map/languages.js +17 -7
- package/dist/code-map/languages.js.map +1 -1
- package/dist/code-map/parse.js +17 -7
- package/dist/code-map/parse.js.map +1 -1
- package/dist/code-map/tsconfig.tsbuildinfo +1 -1
- package/dist/common/constants.d.ts +2 -0
- package/dist/common/constants.js +1 -0
- package/dist/common/constants.js.map +1 -1
- package/dist/common/logger.d.ts +1 -0
- package/dist/common/logger.js +7 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/common/types/usage.d.ts +2 -2
- package/dist/common/util/constants.d.ts +1 -0
- package/dist/common/util/constants.js +7 -0
- package/dist/common/util/constants.js.map +1 -0
- package/dist/common/util/credentials.d.ts +2 -2
- package/dist/common/util/messages.d.ts +1 -0
- package/dist/common/util/messages.js +7 -0
- package/dist/common/util/messages.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/menu.js +17 -7
- package/dist/menu.js.map +1 -1
- package/dist/project-files.js +17 -7
- package/dist/project-files.js.map +1 -1
- package/dist/utils/terminal.js +17 -10
- package/dist/utils/terminal.js.map +1 -1
- package/package.json +1 -1
- package/dist/common/billing/payment-guards.d.ts +0 -11
- package/dist/common/billing/payment-guards.js +0 -136
- package/dist/common/billing/payment-guards.js.map +0 -1
- package/dist/common/billing/subscription-state.d.ts +0 -13
- package/dist/common/billing/subscription-state.js +0 -117
- package/dist/common/billing/subscription-state.js.map +0 -1
- package/dist/common/billing/webhook-processor.d.ts +0 -21
- package/dist/common/billing/webhook-processor.js +0 -315
- package/dist/common/billing/webhook-processor.js.map +0 -1
- package/dist/common/scripts/get-invoices.d.ts +0 -1
- package/dist/common/scripts/get-invoices.js +0 -5
- package/dist/common/scripts/get-invoices.js.map +0 -1
- package/dist/common/scripts/get-month-overage.d.ts +0 -1
- package/dist/common/scripts/get-month-overage.js +0 -5
- package/dist/common/scripts/get-month-overage.js.map +0 -1
- package/dist/common/scripts/get-upcoming-invoices.d.ts +0 -1
- package/dist/common/scripts/get-upcoming-invoices.js +0 -5
- package/dist/common/scripts/get-upcoming-invoices.js.map +0 -1
- package/dist/common/scripts/update-subscriptions.d.ts +0 -1
- package/dist/common/scripts/update-subscriptions.js +0 -92
- package/dist/common/scripts/update-subscriptions.js.map +0 -1
- package/dist/common/util/get-customer-invoices.d.ts +0 -11
- package/dist/common/util/get-customer-invoices.js +0 -117
- package/dist/common/util/get-customer-invoices.js.map +0 -1
- package/dist/common/util/get-month-overage.d.ts +0 -11
- package/dist/common/util/get-month-overage.js +0 -143
- package/dist/common/util/get-month-overage.js.map +0 -1
- package/dist/common/util/get-upcoming-invoices.d.ts +0 -11
- package/dist/common/util/get-upcoming-invoices.js +0 -141
- package/dist/common/util/get-upcoming-invoices.js.map +0 -1
- package/dist/common/websockets/logger-interface.d.ts +0 -6
- package/dist/common/websockets/logger-interface.js +0 -9
- package/dist/common/websockets/logger-interface.js.map +0 -1
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAllCustomersWithInvoices = getAllCustomersWithInvoices;
|
|
4
|
-
exports.main = main;
|
|
5
|
-
const ts_pattern_1 = require("ts-pattern");
|
|
6
|
-
const stripe_1 = require("./stripe");
|
|
7
|
-
const getCustomerId = (customer) => {
|
|
8
|
-
return (0, ts_pattern_1.match)(customer)
|
|
9
|
-
.with(
|
|
10
|
-
// string ID case
|
|
11
|
-
ts_pattern_1.P.string, (id) => id)
|
|
12
|
-
.with(
|
|
13
|
-
// Customer or DeletedCustomer case
|
|
14
|
-
{ object: 'customer' }, (customer) => customer.id)
|
|
15
|
-
.exhaustive();
|
|
16
|
-
};
|
|
17
|
-
// Track subscription status for each customer
|
|
18
|
-
const subscription_statuses = new Map();
|
|
19
|
-
async function getAllCustomersWithInvoices() {
|
|
20
|
-
const customers = [];
|
|
21
|
-
let hasMore = true;
|
|
22
|
-
let startingAfter = undefined;
|
|
23
|
-
// Iterate through all subscriptions using cursor pagination
|
|
24
|
-
while (hasMore) {
|
|
25
|
-
const result = await stripe_1.stripeServer.subscriptions.list({
|
|
26
|
-
limit: 100,
|
|
27
|
-
starting_after: startingAfter,
|
|
28
|
-
status: 'all',
|
|
29
|
-
expand: ['data.items'],
|
|
30
|
-
});
|
|
31
|
-
const { data, has_more } = result;
|
|
32
|
-
// Process each subscription
|
|
33
|
-
for (const subscription of data) {
|
|
34
|
-
// Skip if no metered items in subscription
|
|
35
|
-
const hasMeteredItem = subscription.items.data.some((item) => item.price.recurring?.usage_type === 'metered');
|
|
36
|
-
if (!hasMeteredItem) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
const customerId = getCustomerId(subscription.customer);
|
|
41
|
-
const invoices = await stripe_1.stripeServer.invoices.list({
|
|
42
|
-
customer: customerId,
|
|
43
|
-
limit: 2, // Get 2 to verify they have more than one
|
|
44
|
-
status: 'paid',
|
|
45
|
-
});
|
|
46
|
-
const customer = await stripe_1.stripeServer.customers.retrieve(subscription.customer);
|
|
47
|
-
if (customer.deleted) {
|
|
48
|
-
console.log(`Customer ${customer.id} has been deleted, skipping`);
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (invoices.data.length < 2) {
|
|
52
|
-
console.log(`Customer ${customer.email} has fewer than 2 paid invoices, skipping`);
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
const lastInvoice = invoices.data[0];
|
|
56
|
-
if (lastInvoice.amount_paid === 0) {
|
|
57
|
-
console.log(`Customer ${customer.email} paid $0 on last invoice, skipping`);
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
subscription_statuses.set(customer.id, {
|
|
61
|
-
cancelled: !!subscription.cancellation_details?.reason,
|
|
62
|
-
});
|
|
63
|
-
customers.push({
|
|
64
|
-
customerId: customer.id,
|
|
65
|
-
email: customer.email ?? null,
|
|
66
|
-
name: customer.name ?? null,
|
|
67
|
-
lastInvoice: {
|
|
68
|
-
amount: lastInvoice.amount_paid,
|
|
69
|
-
date: new Date(lastInvoice.created * 1000),
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
console.log(`Error getting invoice for subscription ${subscription.id}`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
hasMore = has_more;
|
|
78
|
-
if (hasMore && data.length > 0) {
|
|
79
|
-
startingAfter = data[data.length - 1].id;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return customers;
|
|
83
|
-
}
|
|
84
|
-
// Example usage
|
|
85
|
-
async function main() {
|
|
86
|
-
try {
|
|
87
|
-
const customers = await getAllCustomersWithInvoices();
|
|
88
|
-
// Split into active and cancelled customers
|
|
89
|
-
const activeCustomers = customers.filter((c) => !subscription_statuses.get(c.customerId)?.cancelled);
|
|
90
|
-
const cancelledCustomers = customers.filter((c) => subscription_statuses.get(c.customerId)?.cancelled);
|
|
91
|
-
console.log('Active customers with past invoices:');
|
|
92
|
-
activeCustomers.forEach((customer) => {
|
|
93
|
-
console.log(`
|
|
94
|
-
Customer: ${customer.name} (${customer.email})
|
|
95
|
-
Last Invoice: ${(customer.lastInvoice.amount / 100).toFixed(2)} on ${customer.lastInvoice.date}
|
|
96
|
-
`);
|
|
97
|
-
});
|
|
98
|
-
console.log('\nCancelled customers with past invoices:');
|
|
99
|
-
cancelledCustomers.forEach((customer) => {
|
|
100
|
-
console.log(`
|
|
101
|
-
Customer: ${customer.name} (${customer.email})
|
|
102
|
-
Last Invoice: ${(customer.lastInvoice.amount / 100).toFixed(2)} on ${customer.lastInvoice.date}
|
|
103
|
-
`);
|
|
104
|
-
});
|
|
105
|
-
const total = customers.reduce((sum, customer) => sum + customer.lastInvoice.amount, 0);
|
|
106
|
-
const totalInDollars = total / 100; // Convert cents to dollars
|
|
107
|
-
const average = totalInDollars / customers.length || 0;
|
|
108
|
-
console.log(`\nTotal invoice amount (all customers): $${totalInDollars.toFixed(2)}`);
|
|
109
|
-
console.log(`Average invoice amount (all customers): $${average.toFixed(2)}`);
|
|
110
|
-
console.log(`Total active customers: ${activeCustomers.length}`);
|
|
111
|
-
console.log(`Total cancelled customers: ${cancelledCustomers.length}`);
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
console.error('Error fetching customer data:', error);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=get-customer-invoices.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-customer-invoices.js","sourceRoot":"","sources":["../../src/util/get-customer-invoices.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
declare function getAllMonthOverages(): Promise<{
|
|
2
|
-
customerId: string;
|
|
3
|
-
email: string | null;
|
|
4
|
-
name: string | null;
|
|
5
|
-
overageInvoice: {
|
|
6
|
-
amount: number;
|
|
7
|
-
date: Date;
|
|
8
|
-
};
|
|
9
|
-
}[]>;
|
|
10
|
-
declare function main(): Promise<void>;
|
|
11
|
-
export { getAllMonthOverages, main };
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAllMonthOverages = getAllMonthOverages;
|
|
4
|
-
exports.main = main;
|
|
5
|
-
const stripe_1 = require("./stripe");
|
|
6
|
-
const ts_pattern_1 = require("ts-pattern");
|
|
7
|
-
const getCustomerId = (customer) => {
|
|
8
|
-
return (0, ts_pattern_1.match)(customer)
|
|
9
|
-
.with(
|
|
10
|
-
// string ID case
|
|
11
|
-
ts_pattern_1.P.string, (id) => id)
|
|
12
|
-
.with(
|
|
13
|
-
// Customer or DeletedCustomer case
|
|
14
|
-
{ object: 'customer' }, (customer) => customer.id)
|
|
15
|
-
.exhaustive();
|
|
16
|
-
};
|
|
17
|
-
async function getAllMonthOverages() {
|
|
18
|
-
const customersWithOverage = [];
|
|
19
|
-
let hasMore = true;
|
|
20
|
-
let startingAfter = undefined;
|
|
21
|
-
// Iterate through all subscriptions using cursor pagination
|
|
22
|
-
while (hasMore) {
|
|
23
|
-
const result = await stripe_1.stripeServer.subscriptions.list({
|
|
24
|
-
limit: 100,
|
|
25
|
-
starting_after: startingAfter,
|
|
26
|
-
status: 'active',
|
|
27
|
-
expand: ['data.items'],
|
|
28
|
-
});
|
|
29
|
-
const { data, has_more } = result;
|
|
30
|
-
// Process each subscription
|
|
31
|
-
for (const subscription of data) {
|
|
32
|
-
// Check for metered items in subscription
|
|
33
|
-
const hasMeteredItem = subscription.items.data.some((item) => item.price.recurring?.usage_type === 'metered');
|
|
34
|
-
if (!hasMeteredItem) {
|
|
35
|
-
console.log(`Subscription ${subscription.id} has no metered items, skipping`);
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
console.log(`Found metered subscription: ${subscription.id}`);
|
|
39
|
-
try {
|
|
40
|
-
const customerId = getCustomerId(subscription.customer);
|
|
41
|
-
const customer = await stripe_1.stripeServer.customers.retrieve(subscription.customer);
|
|
42
|
-
if (customer.deleted) {
|
|
43
|
-
console.log(`Customer ${customer.id} has been deleted, skipping`);
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
// Get upcoming invoice
|
|
47
|
-
const upcomingInvoice = await stripe_1.stripeServer.invoices.retrieveUpcoming({
|
|
48
|
-
customer: customerId,
|
|
49
|
-
subscription: subscription.id,
|
|
50
|
-
});
|
|
51
|
-
// Calculate metered items total from upcoming invoice
|
|
52
|
-
const meteredOverageItems = upcomingInvoice.lines.data
|
|
53
|
-
.filter(item => item.price?.recurring?.usage_type === 'metered');
|
|
54
|
-
console.log(`Customer ${customer.email}: Found ${meteredOverageItems.length} metered items in upcoming invoice`);
|
|
55
|
-
console.log(`Customer ${customer.email}: Metered items:`, meteredOverageItems.map(item => ({
|
|
56
|
-
amount: item.amount,
|
|
57
|
-
description: item.description,
|
|
58
|
-
period: item.period
|
|
59
|
-
})));
|
|
60
|
-
const monthlyOverageTotal = meteredOverageItems.reduce((sum, item) => sum + item.amount, 0);
|
|
61
|
-
if (monthlyOverageTotal > 0) {
|
|
62
|
-
console.log(`Customer ${customer.email}: Upcoming metered charges: $${(monthlyOverageTotal / 100).toFixed(2)}`);
|
|
63
|
-
customersWithOverage.push({
|
|
64
|
-
customerId: customer.id,
|
|
65
|
-
email: customer.email ?? null,
|
|
66
|
-
name: customer.name ?? null,
|
|
67
|
-
overageInvoice: {
|
|
68
|
-
amount: monthlyOverageTotal,
|
|
69
|
-
date: new Date(upcomingInvoice.period_end * 1000),
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
// If no upcoming charges, check recent invoices
|
|
75
|
-
const oneMonthAgo = new Date();
|
|
76
|
-
oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
|
|
77
|
-
const recentInvoices = await stripe_1.stripeServer.invoices.list({
|
|
78
|
-
customer: customerId,
|
|
79
|
-
limit: 1,
|
|
80
|
-
status: 'paid',
|
|
81
|
-
created: {
|
|
82
|
-
gte: Math.floor(oneMonthAgo.getTime() / 1000),
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
if (recentInvoices.data.length > 0) {
|
|
86
|
-
const lastInvoice = recentInvoices.data[0];
|
|
87
|
-
const recentOverageItems = lastInvoice.lines.data
|
|
88
|
-
.filter(item => item.price?.recurring?.usage_type === 'metered');
|
|
89
|
-
console.log(`Customer ${customer.email}: Found ${recentOverageItems.length} metered items in recent invoice`);
|
|
90
|
-
console.log(`Customer ${customer.email}: Recent metered items:`, recentOverageItems.map(item => ({
|
|
91
|
-
amount: item.amount,
|
|
92
|
-
description: item.description,
|
|
93
|
-
period: item.period
|
|
94
|
-
})));
|
|
95
|
-
const recentOverageTotal = recentOverageItems.reduce((sum, item) => sum + item.amount, 0);
|
|
96
|
-
if (recentOverageTotal > 0) {
|
|
97
|
-
console.log(`Customer ${customer.email}: Recent metered charges: $${(recentOverageTotal / 100).toFixed(2)}`);
|
|
98
|
-
customersWithOverage.push({
|
|
99
|
-
customerId: customer.id,
|
|
100
|
-
email: customer.email ?? null,
|
|
101
|
-
name: customer.name ?? null,
|
|
102
|
-
overageInvoice: {
|
|
103
|
-
amount: recentOverageTotal,
|
|
104
|
-
date: new Date(lastInvoice.created * 1000),
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
console.log(`Error getting upcoming invoice for subscription ${subscription.id}:`, error);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
hasMore = has_more;
|
|
116
|
-
if (hasMore && data.length > 0) {
|
|
117
|
-
startingAfter = data[data.length - 1].id;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return customersWithOverage;
|
|
121
|
-
}
|
|
122
|
-
async function main() {
|
|
123
|
-
try {
|
|
124
|
-
const customersWithOverage = await getAllMonthOverages();
|
|
125
|
-
console.log('Monthly overage charges:');
|
|
126
|
-
customersWithOverage.forEach((customer) => {
|
|
127
|
-
console.log(`
|
|
128
|
-
Customer: ${customer.name} (${customer.email})
|
|
129
|
-
Monthly Overage: $${(customer.overageInvoice.amount / 100).toFixed(2)} due on ${customer.overageInvoice.date}
|
|
130
|
-
`);
|
|
131
|
-
});
|
|
132
|
-
const totalOverage = customersWithOverage.reduce((sum, customer) => sum + customer.overageInvoice.amount, 0);
|
|
133
|
-
const totalOverageInDollars = totalOverage / 100;
|
|
134
|
-
const averageOverage = totalOverageInDollars / customersWithOverage.length || 0;
|
|
135
|
-
console.log(`\nTotal monthly overage: $${totalOverageInDollars.toFixed(2)}`);
|
|
136
|
-
console.log(`Average monthly overage: $${averageOverage.toFixed(2)}`);
|
|
137
|
-
console.log(`Total customers with overage charges: ${customersWithOverage.length}`);
|
|
138
|
-
}
|
|
139
|
-
catch (error) {
|
|
140
|
-
console.error('Error fetching monthly overage data:', error);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
//# sourceMappingURL=get-month-overage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-month-overage.js","sourceRoot":"","sources":["../../src/util/get-month-overage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
declare function getAllUpcomingInvoices(): Promise<{
|
|
2
|
-
customerId: string;
|
|
3
|
-
email: string | null;
|
|
4
|
-
name: string | null;
|
|
5
|
-
upcomingInvoice: {
|
|
6
|
-
amount: number;
|
|
7
|
-
date: Date;
|
|
8
|
-
};
|
|
9
|
-
}[]>;
|
|
10
|
-
declare function main(): Promise<void>;
|
|
11
|
-
export { getAllUpcomingInvoices, main };
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAllUpcomingInvoices = getAllUpcomingInvoices;
|
|
4
|
-
exports.main = main;
|
|
5
|
-
const stripe_1 = require("./stripe");
|
|
6
|
-
const ts_pattern_1 = require("ts-pattern");
|
|
7
|
-
const getCustomerId = (customer) => {
|
|
8
|
-
return (0, ts_pattern_1.match)(customer)
|
|
9
|
-
.with(
|
|
10
|
-
// string ID case
|
|
11
|
-
ts_pattern_1.P.string, (id) => id)
|
|
12
|
-
.with(
|
|
13
|
-
// Customer or DeletedCustomer case
|
|
14
|
-
{ object: 'customer' }, (customer) => customer.id)
|
|
15
|
-
.exhaustive();
|
|
16
|
-
};
|
|
17
|
-
async function getAllUpcomingInvoices() {
|
|
18
|
-
const customers = [];
|
|
19
|
-
let hasMore = true;
|
|
20
|
-
let startingAfter = undefined;
|
|
21
|
-
// Iterate through all subscriptions using cursor pagination
|
|
22
|
-
while (hasMore) {
|
|
23
|
-
const result = await stripe_1.stripeServer.subscriptions.list({
|
|
24
|
-
limit: 100,
|
|
25
|
-
starting_after: startingAfter,
|
|
26
|
-
status: 'active',
|
|
27
|
-
expand: ['data.items'],
|
|
28
|
-
});
|
|
29
|
-
const { data, has_more } = result;
|
|
30
|
-
// Process each subscription
|
|
31
|
-
for (const subscription of data) {
|
|
32
|
-
// Check for metered items in subscription
|
|
33
|
-
const hasMeteredItem = subscription.items.data.some((item) => item.price.recurring?.usage_type === 'metered');
|
|
34
|
-
if (!hasMeteredItem) {
|
|
35
|
-
console.log(`Subscription ${subscription.id} has no metered items, skipping`);
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
console.log(`Found metered subscription: ${subscription.id}`);
|
|
39
|
-
try {
|
|
40
|
-
const customerId = getCustomerId(subscription.customer);
|
|
41
|
-
const customer = await stripe_1.stripeServer.customers.retrieve(subscription.customer);
|
|
42
|
-
if (customer.deleted) {
|
|
43
|
-
console.log(`Customer ${customer.id} has been deleted, skipping`);
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
// Get upcoming invoice
|
|
47
|
-
const upcomingInvoice = await stripe_1.stripeServer.invoices.retrieveUpcoming({
|
|
48
|
-
customer: customerId,
|
|
49
|
-
subscription: subscription.id,
|
|
50
|
-
});
|
|
51
|
-
// Calculate metered items total from upcoming invoice
|
|
52
|
-
const meteredItems = upcomingInvoice.lines.data.filter((item) => item.price?.recurring?.usage_type === 'metered');
|
|
53
|
-
console.log(`Customer ${customer.email}: Found ${meteredItems.length} metered items in upcoming invoice`);
|
|
54
|
-
console.log(`Customer ${customer.email}: Metered items:`, meteredItems.map(item => ({
|
|
55
|
-
amount: item.amount,
|
|
56
|
-
description: item.description,
|
|
57
|
-
period: item.period
|
|
58
|
-
})));
|
|
59
|
-
const meteredItemsTotal = meteredItems.reduce((sum, item) => sum + item.amount, 0);
|
|
60
|
-
if (meteredItemsTotal > 0) {
|
|
61
|
-
console.log(`Customer ${customer.email}: Upcoming metered charges: $${(meteredItemsTotal / 100).toFixed(2)}`);
|
|
62
|
-
customers.push({
|
|
63
|
-
customerId: customer.id,
|
|
64
|
-
email: customer.email ?? null,
|
|
65
|
-
name: customer.name ?? null,
|
|
66
|
-
upcomingInvoice: {
|
|
67
|
-
amount: meteredItemsTotal,
|
|
68
|
-
date: new Date(upcomingInvoice.period_end * 1000),
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
// If no upcoming charges, check recent invoices
|
|
74
|
-
const oneMonthAgo = new Date();
|
|
75
|
-
oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1);
|
|
76
|
-
const recentInvoices = await stripe_1.stripeServer.invoices.list({
|
|
77
|
-
customer: customerId,
|
|
78
|
-
limit: 1,
|
|
79
|
-
status: 'paid',
|
|
80
|
-
created: {
|
|
81
|
-
gte: Math.floor(oneMonthAgo.getTime() / 1000),
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
if (recentInvoices.data.length > 0) {
|
|
85
|
-
const lastInvoice = recentInvoices.data[0];
|
|
86
|
-
const recentMeteredItems = lastInvoice.lines.data.filter((item) => item.price?.recurring?.usage_type === 'metered');
|
|
87
|
-
console.log(`Customer ${customer.email}: Found ${recentMeteredItems.length} metered items in recent invoice`);
|
|
88
|
-
console.log(`Customer ${customer.email}: Recent metered items:`, recentMeteredItems.map(item => ({
|
|
89
|
-
amount: item.amount,
|
|
90
|
-
description: item.description,
|
|
91
|
-
period: item.period
|
|
92
|
-
})));
|
|
93
|
-
const recentMeteredTotal = recentMeteredItems.reduce((sum, item) => sum + item.amount, 0);
|
|
94
|
-
if (recentMeteredTotal > 0) {
|
|
95
|
-
console.log(`Customer ${customer.email}: Recent metered charges: $${(recentMeteredTotal / 100).toFixed(2)}`);
|
|
96
|
-
customers.push({
|
|
97
|
-
customerId: customer.id,
|
|
98
|
-
email: customer.email ?? null,
|
|
99
|
-
name: customer.name ?? null,
|
|
100
|
-
upcomingInvoice: {
|
|
101
|
-
amount: recentMeteredTotal,
|
|
102
|
-
date: new Date(lastInvoice.created * 1000),
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
console.log(`Error getting upcoming invoice for subscription ${subscription.id}:`, error);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
hasMore = has_more;
|
|
114
|
-
if (hasMore && data.length > 0) {
|
|
115
|
-
startingAfter = data[data.length - 1].id;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return customers;
|
|
119
|
-
}
|
|
120
|
-
async function main() {
|
|
121
|
-
try {
|
|
122
|
-
const customers = await getAllUpcomingInvoices();
|
|
123
|
-
console.log('Upcoming metered charges:');
|
|
124
|
-
customers.forEach((customer) => {
|
|
125
|
-
console.log(`
|
|
126
|
-
Customer: ${customer.name} (${customer.email})
|
|
127
|
-
Metered Charges: $${(customer.upcomingInvoice.amount / 100).toFixed(2)} due on ${customer.upcomingInvoice.date}
|
|
128
|
-
`);
|
|
129
|
-
});
|
|
130
|
-
const total = customers.reduce((sum, customer) => sum + customer.upcomingInvoice.amount, 0);
|
|
131
|
-
const totalInDollars = total / 100;
|
|
132
|
-
const average = totalInDollars / customers.length || 0;
|
|
133
|
-
console.log(`\nTotal upcoming metered charges: $${totalInDollars.toFixed(2)}`);
|
|
134
|
-
console.log(`Average upcoming metered charge: $${average.toFixed(2)}`);
|
|
135
|
-
console.log(`Total customers with metered charges: ${customers.length}`);
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
console.error('Error fetching upcoming invoice data:', error);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=get-upcoming-invoices.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-upcoming-invoices.js","sourceRoot":"","sources":["../../src/util/get-upcoming-invoices.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-interface.js","sourceRoot":"","sources":["../../src/websockets/logger-interface.ts"],"names":[],"mappings":";;;AAMa,QAAA,UAAU,GAAW;IAChC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAA"}
|