Files
mercado.clube67.com/backend/models/ClubMember.js
T

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