114 lines
3.6 KiB
JavaScript
114 lines
3.6 KiB
JavaScript
'use strict'
|
|
|
|
const { execute, queryOne, query } = require('../database/postgres')
|
|
|
|
class ClubMember {
|
|
static create({ tenant_id, club_id, plan_id, user_cpf, user_nome, user_telefone, user_email,
|
|
asaas_customer_id, asaas_subscription_id, next_billing_at }) {
|
|
return execute(
|
|
`INSERT INTO club_members
|
|
(tenant_id, club_id, plan_id, user_cpf, user_nome, user_telefone, user_email,
|
|
status, asaas_customer_id, asaas_subscription_id, next_billing_at, started_at)
|
|
VALUES ($1,$2,$3,$4,$5,$6,$7,'pending_payment',$8,$9,$10, NOW()) RETURNING id`,
|
|
[tenant_id, club_id, plan_id,
|
|
user_cpf.replace(/\D/g, ''), user_nome,
|
|
user_telefone || null, user_email || null,
|
|
asaas_customer_id || null, asaas_subscription_id || null,
|
|
next_billing_at || null]
|
|
)
|
|
}
|
|
|
|
static findByCpfAndClub(cpf, clubId) {
|
|
return queryOne(
|
|
`SELECT * FROM club_members
|
|
WHERE user_cpf=$1 AND club_id=$2 AND status NOT IN ('canceled')
|
|
ORDER BY id DESC LIMIT 1`,
|
|
[cpf.replace(/\D/g, ''), clubId]
|
|
)
|
|
}
|
|
|
|
static findAllByCpf(cpf) {
|
|
return query(
|
|
`SELECT cm.*, bc.name AS club_name, bc.slug AS club_slug,
|
|
cp.name AS plan_name, cp.price_monthly, cp.features
|
|
FROM club_members cm
|
|
JOIN benefit_clubs bc ON bc.id = cm.club_id
|
|
JOIN club_plans cp ON cp.id = cm.plan_id
|
|
WHERE cm.user_cpf = $1 AND cm.status NOT IN ('canceled')
|
|
ORDER BY cm.id`,
|
|
[cpf.replace(/\D/g, '')]
|
|
)
|
|
}
|
|
|
|
static findById(id) {
|
|
return queryOne(
|
|
`SELECT cm.*, bc.name AS club_name, bc.slug AS club_slug,
|
|
cp.name AS plan_name, cp.price_monthly
|
|
FROM club_members cm
|
|
JOIN benefit_clubs bc ON bc.id = cm.club_id
|
|
JOIN club_plans cp ON cp.id = cm.plan_id
|
|
WHERE cm.id = $1`,
|
|
[id]
|
|
)
|
|
}
|
|
|
|
static listByClub(clubId, { status, limit = 100, offset = 0 } = {}) {
|
|
if (status) {
|
|
return query(
|
|
`SELECT cm.*, cp.name AS plan_name, cp.price_monthly
|
|
FROM club_members cm
|
|
JOIN club_plans cp ON cp.id = cm.plan_id
|
|
WHERE cm.club_id=$1 AND cm.status=$2
|
|
ORDER BY cm.created_at DESC LIMIT $3 OFFSET $4`,
|
|
[clubId, status, limit, offset]
|
|
)
|
|
}
|
|
return query(
|
|
`SELECT cm.*, cp.name AS plan_name, cp.price_monthly
|
|
FROM club_members cm
|
|
JOIN club_plans cp ON cp.id = cm.plan_id
|
|
WHERE cm.club_id=$1
|
|
ORDER BY cm.created_at DESC LIMIT $2 OFFSET $3`,
|
|
[clubId, limit, offset]
|
|
)
|
|
}
|
|
|
|
static updateStatus(id, status) {
|
|
const extra = status === 'canceled' ? `, canceled_at=NOW()` : ''
|
|
return execute(
|
|
`UPDATE club_members SET status=$1${extra} WHERE id=$2`,
|
|
[status, id]
|
|
)
|
|
}
|
|
|
|
static updateSubscription(id, { asaas_subscription_id, asaas_customer_id, next_billing_at }) {
|
|
return execute(
|
|
`UPDATE club_members
|
|
SET asaas_subscription_id=$1, asaas_customer_id=$2, next_billing_at=$3
|
|
WHERE id=$4`,
|
|
[asaas_subscription_id, asaas_customer_id, next_billing_at || null, id]
|
|
)
|
|
}
|
|
|
|
static findBySubscriptionId(subscriptionId) {
|
|
return queryOne(
|
|
'SELECT * FROM club_members WHERE asaas_subscription_id=$1',
|
|
[subscriptionId]
|
|
)
|
|
}
|
|
|
|
// Membros com pagamento em atraso há mais de N dias
|
|
static findOverdue(daysOverdue = 5) {
|
|
return query(
|
|
`SELECT cm.*, cp.price_monthly
|
|
FROM club_members cm
|
|
JOIN club_plans cp ON cp.id = cm.plan_id
|
|
WHERE cm.status = 'active'
|
|
AND cm.next_billing_at < NOW() - ($1::int * INTERVAL '1 day')`,
|
|
[parseInt(daysOverdue, 10)]
|
|
)
|
|
}
|
|
}
|
|
|
|
module.exports = ClubMember
|