Ejemplo n.º 1
0
def create_member(member):
    """Some passive business logic will be triggered by the creation of new members"""
    # 1.Encrypted password
    encrypted_or_reset_password(member, member.password)
    # 2.Free vouchers for this member membership level
    free_vouchers = member.membership.complimentary_vouchers.all()
    if free_vouchers:
        record_reward_member_voucher(member, free_vouchers)
Ejemplo n.º 2
0
def daily():
    """ Executed at 00:00:02 every day"""
    # 1.Check campaign state
    models.Campaign.objects.filter(effective_date__gte=datetime.now(), expiring_date__gte=datetime.now()).update(
        state=1)
    models.Campaign.objects.filter(effective_date__lte=datetime.now(), expiring_date__gte=datetime.now()).update(
        state=2)
    models.Campaign.objects.filter(effective_date__lte=datetime.now(), expiring_date__lte=datetime.now()).update(
        state=3)

    # 2.Check voucher state and Voucher_Member state
    models.Voucher.objects.filter(effective_date__gte=datetime.now(), expiring_date__gte=datetime.now()).update(state=1)
    models.Voucher.objects.filter(effective_date__lte=datetime.now(), expiring_date__gte=datetime.now()).update(state=2)
    models.Voucher.objects.filter(effective_date__lte=datetime.now(), expiring_date__lte=datetime.now()).update(state=3)
    models.Voucher_Member.objects.filter(voucher__effective_date__lte=datetime.now(),
                                         voucher__expiring_date__lte=datetime.now()).update(status=2)

    # 3.Change in membership level cycle
    membership_members = models.Membership_Member.objects.filter(status=0, expiring_date__lte=datetime.now()).all()
    members = []
    # 3.1 will execute downgrade one level
    with transaction.atomic():
        for membership_member in membership_members:
            member = membership_member.member
            members.append(member)
            desc_memberships = models.Membership.objects.order_by('-start_points').all()
            for membership in desc_memberships:
                if member.total_points <= member.membership.renewal_points:
                    if 0 > member.membership.start_points < membership.start_points:
                        update_membership(member, membership)
                        break

    # 3.2 will automatic exchange of vouchers for one year and clear the points(points_bal and total_points)
    with transaction.atomic():
        reward_vouchers = []
        for member in members:
            total_num_products = models.Product.objects.all().count()
            # get Any one drink(M) voucher
            voucher = models.Voucher.objects.annotate(num=Count('redemption_products')).filter(state=2,
                                                                                               num=total_num_products)
            if voucher.exists():
                voucher = voucher.first()
            else:
                lastest_id = models.Voucher.objects.only('id').latest('id').pk
                voucher = models.Voucher.objects.create(
                    name='Any one drink(M)-%s' % (datetime.now().strftime('%Y-%m-%d %H:%M:%S')), type=0,
                    voucher_code='any_one_drink(M)-%05d' % (lastest_id + 1),
                    effective_date='2018-01-01', expiring_date='2099-01-01',
                    redemption_points=9999, product_size=[0], product_number=1,
                    state=2)
                voucher.redemption_products.set(models.Product.objects.all())
                voucher.save()
            count_redeemed = int(member.points_bal // member.membership.complimentary_m_drink_points)
            update_points(member, -member.points_bal, 4)
            for i in range(count_redeemed):
                reward_vouchers.append(voucher)
            record_reward_member_voucher(member, reward_vouchers)
Ejemplo n.º 3
0
def monthly():
    """ Execute at 00:00:02 every month on the 1st"""
    # 1.Birthday voucher for the month of the month
    with transaction.atomic():
        if datetime.now().day == 1:
            members = models.Member.objects.filter(dob__month=datetime.now().month).all()
            for member in members:
                vouchers = member.membership.birthday_vouchers.all()
                record_reward_member_voucher(member, vouchers)
Ejemplo n.º 4
0
def recharge(recharge_record):
    """ Some passive business logic will be triggered by the recharged action"""
    wallet = recharge_record.wallet
    member = wallet.member
    top_up_money = recharge_record.money

    # 1.Update wallet balance and lastest_top_up
    wallet.balance += top_up_money
    wallet.lastest_top_up = recharge_record.created
    wallet.save()

    # 2.Campaign recharge reward (with every $x top up to E-wallet)
    # 2.1 Determine if the campaign conditions are met, and get all meet campaigns
    meet_campaigns = get_meet_campaigns_for_top_up(member)

    # 2.2 Calculate all campaign rewards
    campaign_types = models.CampaignType.objects.filter(
        campaign__in=meet_campaigns).all()
    for campaign_type in campaign_types:
        # 2.2.1 Check if the number of rewards is exceeded
        limit_redemption = campaign_type.campaign_condition.limit_redemption
        if limit_redemption:
            count = models.Member_CampaignType.objects.filter(
                member=member, campaign_type=campaign_type).aggregate(
                    count=Count('id')).get('count')
            # print(count, limit_redemption)
            if count >= limit_redemption:
                return
        insert_member_campaigntype(member, [campaign_type])
        # 2.2.2 update member points_bal, insert Points_Member record
        if campaign_type.campaign_condition.every_top_up:
            every_top_up = campaign_type.campaign_condition.every_top_up
            if campaign_type.bouns_points:
                bouns_points = campaign_type.bouns_points
                reward_count = int(top_up_money // every_top_up)
                total_reward_points = reward_count * bouns_points
                update_points(member,
                              total_reward_points,
                              2,
                              campaigntype=campaign_type)
                # print(total_reward_points)
        # 2.2.3 upgrade membership level
        if campaign_type.top_up_money and campaign_type.upgrade_membership:
            top_up_money_for_upgrade = campaign_type.top_up_money
            upgrade_membership_start_points = campaign_type.upgrade_membership.start_points
            if wallet.member.membership.start_points < upgrade_membership_start_points and top_up_money >= top_up_money_for_upgrade:
                update_membership(member, campaign_type.upgrade_membership)
                # print(upgrade_membership)
        # 2.2.4 free vouchers for this campaign
        if campaign_type.free_vouchers.all():
            free_vouchers = campaign_type.free_vouchers.all()
            record_reward_member_voucher(member, free_vouchers)
Ejemplo n.º 5
0
def update_membership(member, new_membership):
    """Changes triggered by a member's membership level change"""
    # 1.Record and update Membership_Member
    member.membership_members.update(status=1)
    models.Membership_Member.objects.create(member=member,
                                            membership=new_membership,
                                            status=0)
    member.membership = new_membership
    member.save()
    # 2.Free vouchers for new membership level
    free_vouchers = member.membership.complimentary_vouchers.all()
    if free_vouchers:
        record_reward_member_voucher(member, free_vouchers)
Ejemplo n.º 6
0
 def create(self, validated_data):
     # Insert the outlet information in the transaction record
     outlet = get_or_create_outlet(self.initial_data.get('outlet'))
     validated_data['outlet'] = outlet
     instance = super(TransactionCSerializer, self).create(validated_data)
     # Insert the campaign type record that the member has participated in
     insert_member_campaigntype(instance.member, instance.campaigntypes.all())
     # Record the voucher obtained by this member
     record_reward_member_voucher(instance.member, instance.reward_vouchers.all())
     # Record the voucher redeemed by this member
     record_redeemed_member_voucher(instance.member, instance.redeemed_vouchers.all())
     # Record the points earned and redeemed by this member
     for count, campaign_type in enumerate(instance.campaigntypes.all()):
         if count == 0:
             update_points(instance.member, instance.reward_points, 2, campaigntype=campaign_type)
             update_points(instance.member, -instance.redeemed_points, 3, campaigntype=campaign_type)
         else:
             update_points(instance.member, 0, 2, campaigntype=campaign_type)
             update_points(instance.member, -0, 3, campaigntype=campaign_type)
     # update member last_purchase_date
     update_member_last_purchase_date(instance.member, instance.transact_datetime)
     return instance