Separate comped payment totals

This commit is contained in:
Dorian
2026-05-19 14:39:04 -05:00
parent de0b482d65
commit 1f6a443415

View File

@@ -311,20 +311,27 @@ const newestMember = computed(() =>
[...members.value].sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))[0] || null,
)
const paidPayments = computed(() => payments.value.filter((payment) => payment.status === 'paid'))
const pendingPayments = computed(() => payments.value.filter((payment) => payment.status !== 'paid'))
const revenuePaidPayments = computed(() => paidPayments.value.filter((payment) => payment.provider !== 'comp'))
const compPayments = computed(() => paidPayments.value.filter((payment) => payment.provider === 'comp'))
const pendingPayments = computed(() => payments.value.filter((payment) => payment.status !== 'paid' && payment.provider !== 'comp'))
const compedPaymentValue = (payment) => {
const amount = Number(payment.amountUsd)
if (Number.isFinite(amount) && amount > 0) return amount
return Number(payment.months || 1) * membershipMonthlyUsd.value
}
const paymentTotals = computed(() => {
const paid = paidPayments.value.reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const paid = revenuePaidPayments.value.reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const pending = pendingPayments.value.reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const cash = paidPayments.value.filter((payment) => ['manual', 'cash'].includes(payment.provider)).reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const bitcoin = paidPayments.value.filter((payment) => payment.provider === 'btcpay').reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const comp = paidPayments.value.filter((payment) => payment.provider === 'comp').reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const cash = revenuePaidPayments.value.filter((payment) => ['manual', 'cash'].includes(payment.provider)).reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const bitcoin = revenuePaidPayments.value.filter((payment) => payment.provider === 'btcpay').reduce((total, payment) => total + Number(payment.amountUsd || 0), 0)
const comp = compPayments.value.reduce((total, payment) => total + compedPaymentValue(payment), 0)
return { paid, pending, cash, bitcoin, comp }
})
const paymentMethodRows = computed(() => {
const rows = [
{ label: 'Cash', value: paymentTotals.value.cash, count: paidPayments.value.filter((payment) => ['manual', 'cash'].includes(payment.provider)).length },
{ label: 'Bitcoin', value: paymentTotals.value.bitcoin, count: paidPayments.value.filter((payment) => payment.provider === 'btcpay').length },
{ label: 'Comp', value: paymentTotals.value.comp, count: paidPayments.value.filter((payment) => payment.provider === 'comp').length },
{ label: 'Cash', value: paymentTotals.value.cash, count: revenuePaidPayments.value.filter((payment) => ['manual', 'cash'].includes(payment.provider)).length },
{ label: 'Bitcoin', value: paymentTotals.value.bitcoin, count: revenuePaidPayments.value.filter((payment) => payment.provider === 'btcpay').length },
{ label: 'Comped', value: paymentTotals.value.comp, count: compPayments.value.length },
]
const max = Math.max(...rows.map((row) => row.value), 1)
return rows.map((row) => ({ ...row, percentage: Math.max(4, Math.round((row.value / max) * 100)) }))
@@ -336,7 +343,7 @@ const paymentTimelineRows = computed(() => {
const key = date.toISOString().slice(0, 10)
return { key, label: date.toLocaleDateString('en-US', { weekday: 'short' }), value: 0 }
})
paidPayments.value.forEach((payment) => {
revenuePaidPayments.value.forEach((payment) => {
const key = String(payment.paidAt || payment.createdAt || '').slice(0, 10)
const day = days.find((item) => item.key === key)
if (day) day.value += Number(payment.amountUsd || 0)
@@ -3230,7 +3237,7 @@ watch(mobileMenuOpen, (open) => {
<article class="payment-metric">
<span>Collected</span>
<strong>{{ formatUsd(paymentTotals.paid) }}</strong>
<p>{{ paidPayments.length }} paid</p>
<p>{{ revenuePaidPayments.length }} paid</p>
</article>
<article class="payment-metric">
<span>Pending</span>
@@ -3247,6 +3254,11 @@ watch(mobileMenuOpen, (open) => {
<strong>{{ formatUsd(paymentTotals.bitcoin) }}</strong>
<p>BTCPay invoices</p>
</article>
<article class="payment-metric">
<span>Comped</span>
<strong>{{ formatUsd(paymentTotals.comp) }}</strong>
<p>{{ compPayments.length }} complimentary</p>
</article>
</div>
<div class="payment-dashboard-grid">