Preâmbulo
Meu objetivo é criar código reutilizável para vários projetos (e também publicá-lo no github) para gerenciar assinaturas. Eu sei sobre provedores de cobrança recorrente e de distribuição, mas não é para isso que este módulo se destina. Deve ser apenas um invólucro / auxiliar para calcular o saldo da conta, notificações fáceis para renovar uma assinatura e gerenciar cálculos de preços.
Existem países em que você não pode usar o faturamento recorrente por causa dos provedores ou possibilidades de pagamento terem pouco ou nenhum suporte ou são muito caros (micropagamentos). E há pessoas que não desejam usar o faturamento recorrente, mas pagam a fatura manualmente / pagam uma fatura no final do ano. Portanto, não sugira cobrança recorrente por paypal, serviços recorrentes ou similares.
Situação
Digamos que você tenha um modelo que possa se inscrever em um plano de assinatura (por exemplo User
). Este modelo possui um campo que armazena o identificador de um plano de assinatura no qual ele está atualmente inscrito. Assim, em cada mudança de plano, a mudança é registrada.
Existe um modelo (por exemplo SubscriptionPlanChanges
) com os seguintes campos registrando as alterações mencionadas:
subscriber
relacionado ao modelo de assinatura (User
neste caso)from_plan
definindo o identificador do plano que o modelo tinha antes da mudançato_plan
definindo o identificador de plano que o modelo selecionou agoracreated_at
é um campo de data e hora que armazena a alteraçãovalid_until
armazena a data até a assinatura real ser válidapaid_at
também é um campo de data e hora que define se (e quando) a assinatura foi paga
Claro, esse layout é discutível.
Questão do saldo da conta
Quando um usuário altera seu plano de assinatura, preciso comparar os campos do plano, obter os preços e calcular a dedução do novo plano com base nos valid_until
preços e no plano atual . Diga: você se inscreveu para um ano do plano A, mas após 6 meses, atualiza para o plano B, obtendo uma dedução de metade do preço pago pelos 6 meses do plano A.
O que estou me perguntando: se um usuário, por exemplo, muda para o plano gratuito, ele tem um crédito que pode ser deduzido se o usuário quiser mudar novamente. Você armazenaria esse valor em cache em um campo adicional ou calcularia todos os registros relacionados a esse usuário todas as vezes? Você adicionaria / alteraria algo sobre o layout da tabela?
Questão de fácil compreensão
Quando chega o final de um período de assinatura, o usuário é notificado e tem a possibilidade de renovar sua assinatura pagando novamente. A maneira mais fácil seria apenas atualizar paid_at
e valid_until
com novas opções de assinatura. No entanto, não tenho certeza se você armazena todos os dados que alguém possa precisar, como um histórico de pagamento / assinatura.
Outra opção seria criar um registro adicional para isso, onde from_plan
e to_plan
esteja tendo o mesmo identificador (simbolizando, assim, "nenhuma alteração"). Mas isso não interferiria no cálculo do saldo da conta de alguma maneira?
Se alguém pudesse me indicar a direção certa sobre as lógicas que lidam com essas assinaturas, eu agradeceria muito.
ATUALIZAÇÃO
Obrigado pela ajuda até agora. Eu acho que minha pergunta foi muito vaga, então tentarei ser mais preciso usando menos abstração. Infelizmente, ainda não consegui resolver o meu problema.
O caso A
User
pode selecionar Subscription Plan A
. Atualmente, ele armazena um SubscriptionPlanChange
para acompanhar isso. Após, por exemplo, 5 meses, User
atualiza sua assinatura para Subscription Plan B
. Portanto, ele paga o preço de sua nova assinatura, deduzindo o preço do plano a pelos sete meses não utilizados.
Caso B
Após 3 meses, User
volta para o dele Subscription Plan A
. Ele não precisa pagar, mas recebe um saldo para que, ao final da assinatura, obtenha esse saldo deduzido para sua nova assinatura.
O Caso C
User
pode selecionar um plano de assinatura para um sub-serviço que possui planos de assinatura independentes. O mesmo Case A
e Case B
pode aplicar-se a essa assinatura de sub-serviço.
_Case D_
O usuário cancela uma de suas assinaturas. Isso resulta em uma recarga de seu saldo.
Minha pergunta (atualmente, pelo menos) depende principalmente de como armazenar esses dados corretamente, para que eu possa reproduzir um histórico de assinaturas para análise de negócios e calcular saldos, obter pagamentos pendentes com base nas assinaturas etc.
Também não tenho certeza se o saldo deve ser armazenado, por exemplo, no próprio modelo do usuário ou se não está armazenado, mas pode ser calculado a qualquer momento com base nos dados / histórico armazenados.
Algumas coisas a serem observadas, embora eu não ache que elas devam apresentar problemas:
- Não precisa ser um
User
, pode ser qualquer coisa, é por isso queSubscriber
é polimórfico Plans
não necessariamente precisam ser planos, mas podem ser, por exemplo, osMagazines
mencionados. Isso é o que eu descrevi com processo C e Caixa D .