コード例 #1
0
ファイル: invoice.py プロジェクト: CenaZ/repanier
    def delete_if_unconfirmed(self, permanence):
        if not self.is_order_confirm_send:
            from repanier.email.email_order import export_order_2_1_customer
            from repanier.models.purchase import Purchase

            filename = "{0}-{1}.xlsx".format(
                slugify(_("Canceled order")),
                slugify(permanence)
            )
            sender_email, sender_function, signature, cc_email_staff = get_signature(
                is_reply_to_order_email=True)
            export_order_2_1_customer(
                self.customer, filename, permanence, sender_email,
                sender_function, signature,
                cancel_order=True
            )
            purchase_qs = Purchase.objects.filter(
                customer_invoice_id=self.id,
                is_box_content=False,
            ).order_by('?')
            for a_purchase in purchase_qs.select_related("customer"):
                create_or_update_one_cart_item(
                    customer=a_purchase.customer,
                    offer_item_id=a_purchase.offer_item_id,
                    q_order=DECIMAL_ZERO,
                    batch_job=True,
                    comment=_("Cancelled qty : %s") % number_format(a_purchase.quantity_ordered, 4)
                )
コード例 #2
0
ファイル: invoice.py プロジェクト: pcolmant/repanier
    def cancel_if_unconfirmed(self, permanence):
        if settings.REPANIER_SETTINGS_CUSTOMER_MUST_CONFIRM_ORDER \
                and not self.is_order_confirm_send \
                and self.has_purchase:
            from repanier.email.email_order import export_order_2_1_customer
            from repanier.models.purchase import PurchaseWoReceiver

            filename = "{}-{}.xlsx".format(
                _("Canceled order"),
                permanence
            )

            export_order_2_1_customer(
                self.customer, filename, permanence,
                cancel_order=True
            )
            purchase_qs = PurchaseWoReceiver.objects.filter(
                customer_invoice_id=self.id,
                is_box_content=False,
            ).order_by('?')
            for a_purchase in purchase_qs.select_related("customer"):
                create_or_update_one_cart_item(
                    customer=a_purchase.customer,
                    offer_item_id=a_purchase.offer_item_id,
                    q_order=DECIMAL_ZERO,
                    batch_job=True,
                    comment=_("Qty not confirmed : {}").format(number_format(a_purchase.quantity_ordered, 4))
                )
コード例 #3
0
ファイル: invoice.py プロジェクト: chiora93/repanier
    def cancel_if_unconfirmed(self, permanence):
        if settings.REPANIER_SETTINGS_CUSTOMER_MUST_CONFIRM_ORDER \
                and not self.is_order_confirm_send \
                and self.has_purchase:
            from repanier.email.email_order import export_order_2_1_customer
            from repanier.models.purchase import Purchase

            filename = "{0}-{1}.xlsx".format(_("Canceled order"), permanence)

            export_order_2_1_customer(self.customer,
                                      filename,
                                      permanence,
                                      cancel_order=True)
            purchase_qs = Purchase.objects.filter(
                customer_invoice_id=self.id,
                is_box_content=False,
            ).order_by('?')
            for a_purchase in purchase_qs.select_related("customer"):
                create_or_update_one_cart_item(
                    customer=a_purchase.customer,
                    offer_item_id=a_purchase.offer_item_id,
                    q_order=DECIMAL_ZERO,
                    batch_job=True,
                    comment=_("Qty not confirmed : {}").format(
                        number_format(a_purchase.quantity_ordered, 4)))
コード例 #4
0
def btn_confirm_order_ajax(request):
    if not request.is_ajax():
        raise Http404
    permanence_id = sint(request.GET.get('permanence', 0))
    user = request.user
    if not user.is_authenticated():
        raise Http404
    customer = Customer.objects.filter(
        user_id=user.id, is_active=True, may_order=True).order_by('?').first()
    if customer is None:
        raise Http404
    translation.activate(customer.language)
    permanence = Permanence.objects.filter(id=permanence_id).order_by('?').first()
    if permanence is None:
        raise Http404
    customer_invoice = CustomerInvoice.objects.filter(
        permanence_id=permanence_id,
        customer_id=customer.id,
        is_order_confirm_send=False,
        total_price_with_tax__gt=DECIMAL_ZERO
    ).order_by('?')
    if not customer_invoice.exists():
        raise Http404
    filename = "{0}-{1}.xlsx".format(
        slugify(_("Order")),
        slugify(permanence)
    )
    sender_email, sender_function, signature, cc_email_staff = get_signature(
        is_reply_to_order_email=True)
    export_order_2_1_customer(
        customer, filename, permanence, sender_email,
        sender_function, signature
    )
    customer_invoice = CustomerInvoice.objects.filter(
        permanence_id=permanence_id,
        customer_id=customer.id
    ).order_by('?').first()
    customer_invoice.confirm_order()
    customer_invoice.save()
    to_json = []
    my_basket(customer_invoice.is_order_confirm_send, customer_invoice.get_total_price_with_tax(), to_json)
    basket_message = calc_basket_message(
        customer,
        permanence,
        PERMANENCE_CLOSED
    )
    my_order_confirmation(
        permanence=permanence,
        customer_invoice=customer_invoice,
        is_basket=True,
        basket_message=basket_message,
        to_json=to_json
    )
    return HttpResponse(json.dumps(to_json, cls=DjangoJSONEncoder), content_type="application/json")
コード例 #5
0
ファイル: purchase.py プロジェクト: ryanbagwell/repanier
    def is_order_confirm_send(self, request):
        permanence_id = request.GET.get("permanence", None)
        customer_id = request.GET.get("customer", None)
        user_message_level = messages.ERROR
        user_message = _("Action canceled by the system.")
        if permanence_id is not None and customer_id is not None:
            customer = Customer.objects.filter(id=customer_id).order_by("?").first()
            permanence = (
                Permanence.objects.filter(id=permanence_id).order_by("?").first()
            )
            if permanence is not None and customer is not None:
                customer_invoice = (
                    CustomerInvoice.objects.filter(
                        customer_id=customer_id, permanence_id=permanence_id
                    )
                    .order_by("?")
                    .first()
                )
                if customer_invoice is not None:
                    if (
                        customer_invoice.status == PERMANENCE_OPENED
                        and not customer_invoice.is_order_confirm_send
                    ):
                        filename = "{}-{}.xlsx".format(_("Order"), permanence)
                        export_order_2_1_customer(customer, filename, permanence)
                        user_message_level = messages.INFO
                        user_message = customer.my_order_confirmation_email_send_to()
                    else:
                        user_message_level = messages.INFO
                        user_message = _("Order confirmed")
                    customer_invoice.confirm_order()
                    customer_invoice.save()
                else:
                    user_message_level = messages.INFO
                    user_message = _("Nothing to confirm.")

            redirect_to = "{}?permanence={}&customer={}".format(
                reverse("admin:repanier_purchase_changelist"),
                permanence_id,
                customer_id,
            )
        elif permanence_id is not None:
            redirect_to = "{}?permanence={}".format(
                reverse("admin:repanier_purchase_changelist"), permanence_id
            )
        else:
            redirect_to = reverse("admin:repanier_purchase_changelist")
        self.message_user(request, user_message, user_message_level)
        return HttpResponseRedirect(redirect_to)
コード例 #6
0
def btn_confirm_order_ajax(request):
    if not request.is_ajax():
        raise Http404
    permanence_id = sint(request.GET.get('permanence', 0))
    user = request.user
    customer = Customer.objects.filter(user_id=user.id,
                                       is_active=True,
                                       may_order=True).order_by('?').first()
    if customer is None:
        raise Http404
    translation.activate(customer.language)
    permanence = Permanence.objects.filter(
        id=permanence_id).order_by('?').first()
    if permanence is None:
        raise Http404
    customer_invoice = CustomerInvoice.objects.filter(
        permanence_id=permanence_id,
        customer_id=customer.id,
        is_order_confirm_send=False,
        is_group=False,
        # total_price_with_tax__gt=DECIMAL_ZERO
        purchase__quantity_ordered__gt=DECIMAL_ZERO,
    ).order_by('?')
    if not customer_invoice.exists():
        raise Http404
    filename = "{0}-{1}.xlsx".format(slugify(_("Order")), slugify(permanence))
    sender_email, sender_function, signature, cc_email_staff = get_signature(
        is_reply_to_order_email=True)
    export_order_2_1_customer(customer, filename, permanence, sender_email,
                              sender_function, signature)
    customer_invoice = CustomerInvoice.objects.filter(
        permanence_id=permanence_id,
        customer_id=customer.id).order_by('?').first()
    customer_invoice.confirm_order()
    customer_invoice.save()
    to_json = []
    my_basket(customer_invoice.is_order_confirm_send,
              customer_invoice.get_total_price_with_tax(), to_json)
    if customer_invoice.delivery is not None:
        status = customer_invoice.delivery.status
    else:
        status = customer_invoice.status
    basket_message = calc_basket_message(customer, permanence, status)
    customer_invoice.my_order_confirmation(permanence=permanence,
                                           is_basket=True,
                                           basket_message=basket_message,
                                           to_json=to_json)
    return HttpResponse(json.dumps(to_json, cls=DjangoJSONEncoder),
                        content_type="application/json")
コード例 #7
0
    def is_order_confirm_send(self, request):
        permanence_id = request.GET.get('permanence', None)
        customer_id = request.GET.get('customer', None)
        user_message_level = messages.ERROR
        user_message = _("Action canceled by the system.")
        if permanence_id is not None and customer_id is not None:
            customer = Customer.objects.filter(id=customer_id).order_by('?').first()
            permanence = Permanence.objects.filter(id=permanence_id).order_by('?').first()
            if permanence is not None and customer is not None:
                customer_invoice = CustomerInvoice.objects.filter(
                        customer_id=customer_id,
                        permanence_id=permanence_id,
                ).order_by('?').first()
                if customer_invoice is not None:
                    if customer_invoice.status == PERMANENCE_OPENED and not customer_invoice.is_order_confirm_send:
                        filename = "{0}-{1}.xlsx".format(
                            slugify(_("Order")),
                            slugify(permanence)
                        )
                        sender_email, sender_function, signature, cc_email_staff = get_signature(
                            is_reply_to_order_email=True)
                        export_order_2_1_customer(
                            customer, filename, permanence, sender_email,
                            sender_function, signature)
                        user_message_level = messages.INFO
                        user_message = customer.my_order_confirmation_email_send_to()
                    else:
                        user_message_level = messages.INFO
                        user_message = _('Order confirmed')
                    customer_invoice.confirm_order()
                    customer_invoice.save()
                else:
                    user_message_level = messages.INFO
                    user_message = _('Nothing to confirm')

            redirect_to = "%s?permanence=%s&customer=%s" % (
                urlresolvers.reverse('admin:repanier_purchase_changelist', ), permanence_id, customer_id)
        elif permanence_id is not None:
            redirect_to = "%s?permanence=%s" % (
                urlresolvers.reverse('admin:repanier_purchase_changelist', ), permanence_id)
        else:
            redirect_to = urlresolvers.reverse('admin:repanier_purchase_changelist', )
        self.message_user(request, user_message, user_message_level)
        return HttpResponseRedirect(redirect_to)
コード例 #8
0
def btn_confirm_order_ajax(request):
    if not request.is_ajax():
        raise Http404
    user = request.user
    customer = Customer.objects.filter(
        user_id=user.id, may_order=True).order_by('?').first()
    if customer is None:
        raise Http404
    translation.activate(customer.language)
    permanence_id = sint(request.GET.get('permanence', 0))
    permanence = Permanence.objects.filter(id=permanence_id).order_by('?').first()
    permanence_ok_or_404(permanence)
    customer_invoice = CustomerInvoice.objects.filter(
        permanence_id=permanence_id,
        customer_id=customer.id,
        is_order_confirm_send=False,
        is_group=False,
    ).order_by('?').first()
    if customer_invoice is None:
        raise Http404
    filename = "{}-{}.xlsx".format(
        _("Order"),
        permanence
    )
    export_order_2_1_customer(customer, filename, permanence)
    customer_invoice.confirm_order()
    customer_invoice.save()
    json_dict = my_basket(customer_invoice.is_order_confirm_send, customer_invoice.get_total_price_with_tax())
    if customer_invoice.delivery is not None:
        status = customer_invoice.delivery.status
    else:
        status = customer_invoice.status
    basket_message = get_html_basket_message(
        customer,
        permanence,
        status
    )
    json_dict.update(customer_invoice.get_html_my_order_confirmation(
        permanence=permanence,
        is_basket=True,
        basket_message=basket_message
    ))
    return JsonResponse(json_dict)
コード例 #9
0
ファイル: purchase.py プロジェクト: pcolmant/repanier
    def is_order_confirm_send(self, request):
        permanence_id = request.GET.get('permanence', None)
        customer_id = request.GET.get('customer', None)
        user_message_level = messages.ERROR
        user_message = _("Action canceled by the system.")
        if permanence_id is not None and customer_id is not None:
            customer = Customer.objects.filter(id=customer_id).order_by('?').first()
            permanence = Permanence.objects.filter(id=permanence_id).order_by('?').first()
            if permanence is not None and customer is not None:
                customer_invoice = CustomerInvoice.objects.filter(
                    customer_id=customer_id,
                    permanence_id=permanence_id,
                ).order_by('?').first()
                if customer_invoice is not None:
                    if customer_invoice.status == PERMANENCE_OPENED and not customer_invoice.is_order_confirm_send:
                        filename = "{}-{}.xlsx".format(
                            _("Order"),
                            permanence
                        )
                        export_order_2_1_customer(
                            customer, filename, permanence)
                        user_message_level = messages.INFO
                        user_message = customer.my_order_confirmation_email_send_to()
                    else:
                        user_message_level = messages.INFO
                        user_message = _('Order confirmed')
                    customer_invoice.confirm_order()
                    customer_invoice.save()
                else:
                    user_message_level = messages.INFO
                    user_message = _('Nothing to confirm')

            redirect_to = "{}?permanence={}&customer={}".format(
                reverse('admin:repanier_purchase_changelist', ), permanence_id, customer_id)
        elif permanence_id is not None:
            redirect_to = "{}?permanence={}".format(
                reverse('admin:repanier_purchase_changelist', ), permanence_id)
        else:
            redirect_to = reverse('admin:repanier_purchase_changelist', )
        self.message_user(request, user_message, user_message_level)
        return HttpResponseRedirect(redirect_to)
コード例 #10
0
def btn_confirm_order_ajax(request):
    if not request.is_ajax():
        raise Http404
    user = request.user
    customer = Customer.objects.filter(user_id=user.id,
                                       may_order=True).order_by('?').first()
    if customer is None:
        raise Http404
    translation.activate(customer.language)
    permanence_id = sint(request.GET.get('permanence', 0))
    permanence = Permanence.objects.filter(
        id=permanence_id).order_by('?').first()
    if permanence is None:
        raise Http404
    customer_invoice = CustomerInvoice.objects.filter(
        permanence_id=permanence_id,
        customer_id=customer.id,
        is_order_confirm_send=False,
        is_group=False,
    ).order_by('?').first()
    if customer_invoice is None:
        raise Http404
    filename = "{0}-{1}.xlsx".format(_("Order"), permanence)
    export_order_2_1_customer(customer, filename, permanence)
    customer_invoice.confirm_order()
    customer_invoice.save()
    json_dict = my_basket(customer_invoice.is_order_confirm_send,
                          customer_invoice.get_total_price_with_tax())
    if customer_invoice.delivery is not None:
        status = customer_invoice.delivery.status
    else:
        status = customer_invoice.status
    basket_message = get_html_basket_message(customer, permanence, status)
    json_dict.update(
        customer_invoice.get_html_my_order_confirmation(
            permanence=permanence,
            is_basket=True,
            basket_message=basket_message))
    return JsonResponse(json_dict)
コード例 #11
0
def close_order(permanence, all_producers, producers_id=None):
    getcontext().rounding = ROUND_HALF_UP
    today = timezone.now().date()

    if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS:
        # 0 - Cancel unconfirmed purchases
        purchase_qs = Purchase.objects.filter(
            permanence_id=permanence.id,
            customer_invoice__is_order_confirm_send=False,
            is_box_content=False
        ).exclude(
            quantity_ordered=DECIMAL_ZERO
        ).order_by('customer_invoice')
        if not all_producers:
            purchase_qs = purchase_qs.filter(producer_id__in=producers_id)
        customer_invoice_id_save = -1
        for purchase in purchase_qs.select_related("customer", "offer_item"):
            if customer_invoice_id_save != purchase.customer_invoice_id:
                customer_invoice_id_save = purchase.customer_invoice_id
                # This order has been cancelled
                # filename = force_filename("%s - %s.xlsx" % (_("Canceled order"), permanence))
                filename = "{0}-{1}.xlsx".format(
                    slugify(_("Canceled order")),
                    slugify(permanence)
                )
                sender_email, sender_function, signature, cc_email_staff = get_signature(
                    is_reply_to_order_email=True)
                export_order_2_1_customer(
                    purchase.customer, filename, permanence, sender_email,
                    sender_function, signature,
                    cancel_order=True)
            update_or_create_purchase(
                customer=purchase.customer,
                offer_item_id=purchase.offer_item.id,
                value_id=DECIMAL_ZERO,
                batch_job=True
            )
    else:
        # 0 - Delete unused purchases
        purchase_qs = Purchase.objects.filter(
            permanence_id=permanence.id,
            quantity_ordered=0
        ).order_by('?')
        if not all_producers:
            purchase_qs = purchase_qs.filter(producer_id__in=producers_id)
        purchase_qs.delete()
    # 1 - Round to multiple producer_order_by_quantity
    offer_item_qs = OfferItem.objects.filter(
        permanence_id=permanence.id,
        is_active=True,
        order_unit__lt=PRODUCT_ORDER_UNIT_DEPOSIT,
        producer_order_by_quantity__gt=1,
        quantity_invoiced__gt=0
    ).order_by('?')
    if not all_producers:
        offer_item_qs = offer_item_qs.filter(producer_id__in=producers_id)
    for offer_item in offer_item_qs:
        # It's possible to round the ordered qty even If we do not manage stock
        if offer_item.manage_replenishment:
            needed = (offer_item.quantity_invoiced - offer_item.stock)
        else:
            needed = offer_item.quantity_invoiced
        if needed > DECIMAL_ZERO:
            offer_item.add_2_stock = offer_item.producer_order_by_quantity - (
            needed % offer_item.producer_order_by_quantity)
            offer_item.save()
    # 2 - Add Transport
    offer_item_qs = OfferItem.objects.filter(
        permanence_id=permanence.id,
        is_active=False,
        order_unit=PRODUCT_ORDER_UNIT_TRANSPORTATION
    ).order_by('?')
    if not all_producers:
        offer_item_qs = offer_item_qs.filter(producer_id__in=producers_id)
    for offer_item in offer_item_qs:
        buying_group = Customer.objects.filter(is_active=True, represent_this_buyinggroup=True).order_by('?').first()
        create_or_update_one_purchase(buying_group, offer_item, 1, None, True, is_box_content=False)
    membership_fee_product = Product.objects.filter(is_membership_fee=True, is_active=True).order_by('?').first()
    membership_fee_product.producer_unit_price = repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE
    # Update the prices
    membership_fee_product.save()
    membership_fee_offer_item = get_or_create_offer_item(
        permanence, membership_fee_product.id,
        membership_fee_product.producer_id
    )
    for customer in Customer.objects.filter(
            is_active=True,
            may_order=True,
            customerinvoice__permanence_id=permanence.id,
            customerinvoice__total_price_with_tax__gt=DECIMAL_ZERO,
            represent_this_buyinggroup=False
    ).order_by('?'):
        # 3 - Add Deposit
        offer_item_qs = OfferItem.objects.filter(
            permanence_id=permanence.id,
            order_unit=PRODUCT_ORDER_UNIT_DEPOSIT
        ).order_by('?')
        if not all_producers:
            offer_item_qs = offer_item_qs.filter(producer_id__in=producers_id)
        for offer_item in offer_item_qs:
            create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False)
            create_or_update_one_purchase(customer, offer_item, 0, None, True, is_box_content=False)
        # 4 - Add Add Membership fee Subscription
        if repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION > 0:
            # There is a membership fee
            if customer.membership_fee_valid_until < today:
                permanence.producers.add(membership_fee_offer_item.producer_id)
                create_or_update_one_purchase(customer, membership_fee_offer_item, 1, None, True, is_box_content=False)
                while customer.membership_fee_valid_until < today:
                    # Do not pay the membership fee if no order passed during a certain amount of time
                    customer.membership_fee_valid_until = add_months(
                        customer.membership_fee_valid_until,
                        repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION
                    )
                customer.save(update_fields=['membership_fee_valid_until', ])

    # 5 - Add Common participation Subscription
    if all_producers:
        for offer_item in OfferItem.objects.filter(
                permanence_id=permanence.id, is_membership_fee=False,
                order_unit=PRODUCT_ORDER_UNIT_SUBSCRIPTION
        ).order_by('?'):
            for customer in Customer.objects.filter(
                    is_active=True, may_order=True,
                    represent_this_buyinggroup=False
            ).order_by('?'):
                permanence.producers.add(offer_item.producer_id)
                create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False)
        # Disable subscription for next permanence
        Product.objects.filter(
            order_unit=PRODUCT_ORDER_UNIT_SUBSCRIPTION, is_into_offer=True, is_membership_fee=False
        ).order_by('?').update(is_into_offer=False)

        permanence.set_status(PERMANENCE_CLOSED, allow_downgrade=False)
        if not repanier.apps.REPANIER_SETTINGS_INVOICE and repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT is None:
            # No Invoice and no bank_account --> auto archive
            # Put send permanences to the done status, because they will "never" be invoiced
            for permanence in Permanence.objects.filter(status=PERMANENCE_SEND):
                permanence.set_status(PERMANENCE_ARCHIVED, update_payment_date=True)
    else:
        permanence.set_status(PERMANENCE_CLOSED, all_producers=all_producers, producers_id=producers_id)
    # 6 - Refresh the Purchase 'sum' for each customer
    recalculate_order_amount(
        permanence_id=permanence.id,
        all_producers=all_producers,
        producers_id=producers_id,
        send_to_producer=False,
    )
コード例 #12
0
def close_order_delivery(permanence, delivery, all_producers, producers_id=None):
    today = timezone.now().date()
    getcontext().rounding = ROUND_HALF_UP
    # 0 - Delete unused purchases
    # No need to select : customer_invoice__delivery = delivery
    Purchase.objects.filter(
        permanence_id=permanence.id,
        quantity_ordered=0
    ).order_by('?').delete()
    if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS:
        purchase_qs = Purchase.objects.filter(
            permanence_id=permanence.id,
            customer_invoice__delivery=delivery,
            customer_invoice__is_order_confirm_send=False,
            is_box_content=False
        ).exclude(
            quantity_ordered=DECIMAL_ZERO
        ).order_by('customer_invoice')
        if not all_producers:
            # This may never be the but, but...
            purchase_qs = purchase_qs.filter(producer_id__in=producers_id)
        customer_invoice_id_save = -1
        for purchase in purchase_qs.select_related("customer", "offer_item"):
            if customer_invoice_id_save != purchase.customer_invoice_id:
                customer_invoice_id_save =purchase.customer_invoice_id
                # This order has been cancelled
                # filename = force_filename("%s - %s.xlsx" % (_("Canceled order"), permanence))
                filename = "{0}-{1}.xlsx".format(
                    slugify(_("Canceled order")),
                    slugify(permanence)
                )
                sender_email, sender_function, signature, cc_email_staff = get_signature(
                    is_reply_to_order_email=True)
                export_order_2_1_customer(
                    purchase.customer, filename, permanence, sender_email,
                    sender_function, signature,
                    cancel_order=True)
            update_or_create_purchase(
                customer=purchase.customer,
                offer_item_id=purchase.offer_item.id,
                value_id=DECIMAL_ZERO,
                batch_job=True
            )
    if all_producers:
        # 1 - Do not round to multiple producer_order_by_quantity
        # 2 - Do not add Transport
        membership_fee_product = Product.objects.filter(is_membership_fee=True, is_active=True).order_by('?').first()
        membership_fee_product.producer_unit_price = repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE
        # Update the prices
        membership_fee_product.save()
        membership_fee_offer_item = get_or_create_offer_item(permanence, membership_fee_product.id,
                                                             membership_fee_product.producer_id)
        for customer in Customer.objects.filter(
                is_active=True, may_order=True,
                customerinvoice__permanence_id=permanence.id,
                customerinvoice__delivery=delivery,
                customerinvoice__total_price_with_tax__gt=DECIMAL_ZERO,
                represent_this_buyinggroup=False
        ).order_by('?'):
            # 3 - Add Deposit
            for offer_item in OfferItem.objects.filter(permanence_id=permanence.id,  # is_active=False,
                                                       order_unit=PRODUCT_ORDER_UNIT_DEPOSIT).order_by('?'):
                permanence.producers.add(offer_item.producer_id)
                create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False)
                create_or_update_one_purchase(customer, offer_item, 0, None, True, is_box_content=False)
            # 4 - Add Membership fee Subscription
            if repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION > 0:
                # There is a membership fee
                if customer.membership_fee_valid_until < today:
                    permanence.producers.add(membership_fee_offer_item.producer_id)
                    create_or_update_one_purchase(customer, membership_fee_offer_item, 1, None, True,
                                                  is_box_content=False)
                    customer.membership_fee_valid_until = add_months(
                        customer.membership_fee_valid_until,
                        repanier.apps.REPANIER_SETTINGS_MEMBERSHIP_FEE_DURATION
                    )
                    customer.save(update_fields=['membership_fee_valid_until', ])
        # 5 - Add Common participation Subscription
        for offer_item in OfferItem.objects.filter(
                permanence_id=permanence.id, is_membership_fee=False,
                order_unit=PRODUCT_ORDER_UNIT_SUBSCRIPTION).order_by('?'):
            for customer in Customer.objects.filter(is_active=True, may_order=True,
                                                    represent_this_buyinggroup=False).order_by('?'):
                permanence.producers.add(offer_item.producer_id)
                create_or_update_one_purchase(customer, offer_item, 1, None, True, is_box_content=False)
    # 6 - Refresh the Purchase 'sum'
    recalculate_order_amount(
        permanence_id=permanence.id,
        all_producers=all_producers,
        producers_id=producers_id,
        send_to_producer=False
    )
    delivery.set_status(PERMANENCE_CLOSED, all_producers, producers_id)