Делаю приложение для компании, использующей сетевой маркетинг. Уровень поддерева называется "линией". То есть те, кого я пригласил - первая линия, те, кого пригласила вторая линия - третья и так далее.
Когда на 1 линии собирается 5 новеньких - за каждого из них начисляется A
Когда на 2 линии собирается 5 новеньких - за каждого из них начисляется B
Когда на 3 линии собирается 5 новеньких - за каждого из них начисляется C
Когда на 4 линии собирается 5 новеньких - за каждого из них начисляется D
Реализация выплаты во втором куске кода. В первом - модель самого участника пирамиды.
Теперь проблема: когда я создаю на 1, 3, или 4 линии участника n 5 участников - ему самому начисляется не 5A, 5C, 5D денег соответственно, а A, C и D. То есть, в 5 раз меньше. Но за вторую линию он получает как надо. Прям магия какая-то. Чую, что намудрил где-то с методом save(), но не пойму где. всегда создаётся как и положено 5 объектов CompanyToClientPayment, каждая из них отмечается как оплаченная, но по факту оплачена только одна.
Сохранение нового участника "пирамиды" и проверка, не пора ли начислять родителям деньги. На параметр five_per_period не обращайте внимание:
def pay_to_parent(self, line, five_per_period):
parent = self.get_parent_of_level(line)
if parent:
from payments.models import CompanyToClientPayment
if line == 1:
payment_to_parent = CompanyToClientPayment(client=parent,
total=prices[0]
use_date=date.today())
payment_to_parent.save()
elif line == 2:
payment_to_parent = CompanyToClientPayment(client=parent,
total=prices[1]
use_date=date.today())
payment_to_parent.save()
elif line == 3:
payment_to_parent = CompanyToClientPayment(client=parent,
total=prices[2],
use_date=date.today())
payment_to_parent.save()
elif line == 4:
payment_to_parent = CompanyToClientPayment(client=parent,
total=prices[3],
use_date=date.today())
payment_to_parent.save()
setattr(self, self.rewarded_parents_fields[line - 1], True)
def save(self, newbie=True, *args, **kwargs):
if newbie:
if self.get_parent_of_level(1):
newbie_brothers = self.get_parent_of_level(1).get_relative_level(level=1, newbies_only=True)
newbie_brothers.append(self)
if len(newbie_brothers) == 5:
for newbie in newbie_brothers:
newbie.pay_to_parent(1, five_per_period=True)
if newbie.get_parent_of_level(2):
newbie.pay_to_parent(2, five_per_period=True)
if self.get_parent_of_level(3):
newbie_brothers = self.get_parent_of_level(3).get_relative_level(level=3, newbies_only=True)
newbie_brothers.append(self)
if len(newbie_brothers) == 5:
for newbie in newbie_brothers:
newbie.pay_to_parent(3, five_per_period=False)
if self.get_parent_of_level(4):
newbie_brothers = self.get_parent_of_level(4).get_relative_level(level=4, newbies_only=True)
newbie_brothers.append(self)
if len(newbie_brothers) == 5:
for newbie in newbie_brothers:
newbie.pay_to_parent(4, five_per_period=False)
super(TreeNode, self).save(*args, **kwargs)
Модель выплаты за приглашение
class CompanyToClientPayment(models.Model):
total = models.PositiveIntegerField(verbose_name='Сумма платежа', blank=False, null=False)
use_date = models.DateField(verbose_name='Дата платежа', blank=False)
client = models.ForeignKey(TreeNode, verbose_name='Участник')
is_paid = models.BooleanField(default=False, verbose_name='Выплачено')
def save(self, *args, **kwargs):
if not self.is_paid:
if self.use_date <= date.today():
self.pay()
self.client.save(newbie=False)
super(CompanyToClientPayment, self).save(*args, **kwargs)
def pay(self):
if not self.is_paid:
self.client.capital += self.total
self.is_paid = True