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) )
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)) )
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)))
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")
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)
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")
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)
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)
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)
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)
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, )
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)