mirror of
https://github.com/xtr-dev/payload-billing.git
synced 2025-12-09 18:33:24 +00:00
150 lines
3.8 KiB
TypeScript
150 lines
3.8 KiB
TypeScript
import type { Payload } from 'payload'
|
|
|
|
import { devUser } from './helpers/credentials.js'
|
|
|
|
export const seed = async (payload: Payload) => {
|
|
// Seed default user first
|
|
const { totalDocs } = await payload.count({
|
|
collection: 'users',
|
|
where: {
|
|
email: {
|
|
equals: devUser.email,
|
|
},
|
|
},
|
|
})
|
|
|
|
if (!totalDocs) {
|
|
await payload.create({
|
|
collection: 'users',
|
|
data: devUser,
|
|
})
|
|
}
|
|
|
|
// Seed billing sample data
|
|
await seedBillingData(payload)
|
|
}
|
|
|
|
async function seedBillingData(payload: Payload): Promise<void> {
|
|
payload.logger.info('Seeding billing sample data...')
|
|
|
|
try {
|
|
// Check if we already have sample data
|
|
const existingCustomers = await payload.count({
|
|
collection: 'customers',
|
|
where: {
|
|
email: {
|
|
equals: 'john.doe@example.com',
|
|
},
|
|
},
|
|
})
|
|
|
|
if (existingCustomers.totalDocs > 0) {
|
|
payload.logger.info('Sample billing data already exists, skipping seed')
|
|
return
|
|
}
|
|
|
|
// Create a sample customer
|
|
const customer = await payload.create({
|
|
collection: 'customers',
|
|
data: {
|
|
email: 'john.doe@example.com',
|
|
name: 'John Doe',
|
|
phone: '+1-555-0123',
|
|
address: {
|
|
line1: '123 Main St',
|
|
city: 'New York',
|
|
state: 'NY',
|
|
postal_code: '10001',
|
|
country: 'US'
|
|
},
|
|
metadata: {
|
|
source: 'seed',
|
|
created_by: 'system'
|
|
}
|
|
}
|
|
})
|
|
|
|
payload.logger.info(`Created sample customer: ${customer.id}`)
|
|
|
|
// Create a sample invoice
|
|
const invoice = await payload.create({
|
|
collection: 'invoices',
|
|
data: {
|
|
number: 'INV-001-SAMPLE',
|
|
customer: customer.id,
|
|
currency: 'USD',
|
|
items: [
|
|
{
|
|
description: 'Web Development Services',
|
|
quantity: 10,
|
|
unitAmount: 5000, // $50.00 per hour
|
|
totalAmount: 50000 // $500.00 total
|
|
},
|
|
{
|
|
description: 'Design Consultation',
|
|
quantity: 2,
|
|
unitAmount: 7500, // $75.00 per hour
|
|
totalAmount: 15000 // $150.00 total
|
|
}
|
|
],
|
|
subtotal: 65000, // $650.00
|
|
taxAmount: 5200, // $52.00 (8% tax)
|
|
amount: 70200, // $702.00 total
|
|
status: 'open',
|
|
dueDate: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), // 30 days from now
|
|
notes: 'Payment terms: Net 30 days. This is sample data for development.',
|
|
metadata: {
|
|
project: 'website-redesign',
|
|
billable_hours: 12,
|
|
sample: true
|
|
}
|
|
}
|
|
})
|
|
|
|
payload.logger.info(`Created sample invoice: ${invoice.number}`)
|
|
|
|
// Create a sample payment using test provider
|
|
const payment = await payload.create({
|
|
collection: 'payments',
|
|
data: {
|
|
provider: 'test',
|
|
providerId: `test_pay_sample_${Date.now()}`,
|
|
status: 'succeeded',
|
|
amount: 70200, // $702.00
|
|
currency: 'USD',
|
|
description: `Sample payment for invoice ${invoice.number}`,
|
|
customer: customer.id,
|
|
invoice: invoice.id,
|
|
metadata: {
|
|
invoice_number: invoice.number,
|
|
payment_method: 'test_card',
|
|
sample: true
|
|
},
|
|
providerData: {
|
|
testMode: true,
|
|
simulatedPayment: true,
|
|
autoCompleted: true
|
|
}
|
|
}
|
|
})
|
|
|
|
payload.logger.info(`Created sample payment: ${payment.id}`)
|
|
|
|
// Update invoice status to paid
|
|
await payload.update({
|
|
collection: 'invoices',
|
|
id: invoice.id,
|
|
data: {
|
|
status: 'paid',
|
|
payment: payment.id,
|
|
paidAt: new Date().toISOString()
|
|
}
|
|
})
|
|
|
|
payload.logger.info('Billing sample data seeded successfully!')
|
|
|
|
} catch (error) {
|
|
payload.logger.error('Error seeding billing data:', error)
|
|
}
|
|
}
|