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:
subscriberrelacionado ao modelo de assinatura (Userneste caso)from_plandefinindo o identificador do plano que o modelo tinha antes da mudançato_plandefinindo o identificador de plano que o modelo selecionou agoracreated_até um campo de data e hora que armazena a alteraçãovalid_untilarmazena a data até a assinatura real ser válidapaid_attambé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_untilpreç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_ate valid_untilcom 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_plane to_planesteja 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 SubscriptionPlanChangepara acompanhar isso. Após, por exemplo, 5 meses, Useratualiza 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, Uservolta 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 Ae Case Bpode 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 Plansnão necessariamente precisam ser planos, mas podem ser, por exemplo, osMagazinesmencionados. Isso é o que eu descrevi com processo C e Caixa D .