コード例 #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
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")
コード例 #3
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")
コード例 #4
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)
コード例 #5
0
    def send_order(self, request, queryset):
        if 'cancel' in request.POST:
            user_message = _("Action canceled by the user.")
            user_message_level = messages.INFO
            self.message_user(request, user_message, user_message_level)
            return
        permanence = queryset.first()
        if permanence is None or permanence.status not in [
                PERMANENCE_OPENED, PERMANENCE_CLOSED
        ]:
            user_message = _("Action canceled by the system.")
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return
        if 'apply' in request.POST:
            deliveries_to_be_send = []
            producers_to_be_send = []
            producer_qs = Producer.objects.filter(permanence=permanence.id)
            if "deliveries" in request.POST:
                deliveries_to_be_send = request.POST.getlist("deliveries")
                if len(deliveries_to_be_send) == 0:
                    user_message = _(
                        "You must select at least one delivery point.")
                    user_message_level = messages.WARNING
                    self.message_user(request, user_message,
                                      user_message_level)
                    return
            all_producers = "all-producer-invoices" in request.POST
            producers_invoices_to_be_send = []
            if "producer-invoices" in request.POST:
                producers_invoices_to_be_send = request.POST.getlist(
                    "producer-invoices")
            if not all_producers and len(producers_invoices_to_be_send) == 0:
                user_message = _("You must select at least one producer.")
                user_message_level = messages.WARNING
                self.message_user(request, user_message, user_message_level)
                return
            producer_qs = producer_qs.filter(
                producerinvoice__in=producers_invoices_to_be_send)
            for producer in producer_qs.only("id").order_by('?'):
                producers_to_be_send.append(producer.id)

            user_message, user_message_level = task_order.admin_send(
                permanence_id=permanence.id,
                all_producers=all_producers,
                deliveries_id=deliveries_to_be_send,
                producers_id=producers_to_be_send)
            self.message_user(request, user_message, user_message_level)
            return

        template_order_customer_mail = []
        template_order_producer_mail = []
        template_order_staff_mail = []
        cur_language = translation.get_language()
        for language in settings.PARLER_LANGUAGES[settings.SITE_ID]:
            language_code = language["code"]
            translation.activate(language_code)

            template = Template(
                repanier.apps.REPANIER_SETTINGS_CONFIG.order_customer_mail)
            sender_email, sender_function, signature, cc_email_staff = get_signature(
                is_reply_to_order_email=True)
            customer_last_balance = \
                _('The balance of your account as of %(date)s is %(balance)s.') % {
                    'date'   : timezone.now().strftime(settings.DJANGO_SETTINGS_DATE),
                    'balance': RepanierMoney(123.45)
                }
            customer_on_hold_movement = \
                _(
                    'This balance does not take account of any unrecognized payments %(bank)s and any unbilled order %(other_order)s.') \
                % {
                    'bank'       : RepanierMoney(123.45),
                    'other_order': RepanierMoney(123.45)
                }

            bank_account_number = repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT
            if bank_account_number is not None:
                group_name = repanier.apps.REPANIER_SETTINGS_GROUP_NAME
                if permanence.short_name:
                    communication = "%s (%s)" % (_('Short name'),
                                                 permanence.short_name)
                else:
                    communication = _('Short name')
                customer_payment_needed = '<font color="#bd0926">%s</font>' % (
                    _('Please pay %(payment)s to the bank account %(name)s %(number)s with communication %(communication)s.'
                      ) % {
                          'payment': RepanierMoney(123.45),
                          'name': group_name,
                          'number': bank_account_number,
                          'communication': communication
                      })
            else:
                customer_payment_needed = EMPTY_STRING
            context = TemplateContext({
                'name':
                _('Long name'),
                'long_basket_name':
                _('Long name'),
                'basket_name':
                _('Short name'),
                'short_basket_name':
                _('Short name'),
                'permanence_link':
                mark_safe('<a href=#">%s</a>' % permanence),
                'last_balance':
                mark_safe('<a href="#">%s</a>' % customer_last_balance),
                'order_amount':
                RepanierMoney(123.45),
                'on_hold_movement':
                mark_safe(customer_on_hold_movement),
                'payment_needed':
                mark_safe(customer_payment_needed),
                'delivery_point':
                _('delivery point').upper(),
                'signature':
                mark_safe('%s<br/>%s<br/>%s' %
                          (signature, sender_function,
                           repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
            })

            template_order_customer_mail.append(language_code)
            template_order_customer_mail.append(template.render(context))

            template = Template(
                repanier.apps.REPANIER_SETTINGS_CONFIG.order_producer_mail)
            context = TemplateContext({
                'name':
                _('Long name'),
                'long_profile_name':
                _('Long name'),
                'order_empty':
                False,
                'duplicate':
                True,
                'permanence_link':
                mark_safe('<a href=#">%s</a>' % permanence),
                'signature':
                mark_safe('%s<br/>%s<br/>%s' %
                          (signature, sender_function,
                           repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
            })

            template_order_producer_mail.append(language_code)
            template_order_producer_mail.append(template.render(context))

            board_composition, board_composition_and_description = get_board_composition(
                permanence.id)
            template = Template(
                repanier.apps.REPANIER_SETTINGS_CONFIG.order_staff_mail)
            context = TemplateContext({
                'permanence_link':
                mark_safe('<a href=#">%s</a>' % permanence),
                'board_composition':
                mark_safe(board_composition),
                'board_composition_and_description':
                mark_safe(board_composition_and_description),
                'signature':
                mark_safe('%s<br/>%s<br/>%s' %
                          (signature, sender_function,
                           repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
            })

            template_order_staff_mail.append(language_code)
            template_order_staff_mail.append(template.render(context))

        translation.activate(cur_language)

        order_customer_email_will_be_sent, order_customer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_CUSTOMER)
        order_producer_email_will_be_sent, order_producer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_PRODUCER)
        order_board_email_will_be_sent, order_board_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_BOARD,
            board=True)

        form = CloseAndSendOrderForm(
            initial={
                'template_order_customer_mail':
                mark_safe("<br/>==============<br/>".join(
                    template_order_customer_mail)),
                'template_order_producer_mail':
                mark_safe("<br/>==============<br/>".join(
                    template_order_producer_mail)),
                'template_order_staff_mail':
                mark_safe("<br/>==============<br/>".join(
                    template_order_staff_mail)),
            })
        if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS or DeliveryBoard.objects.filter(
                permanence_id=permanence.id,
                status__gt=PERMANENCE_OPENED).order_by('?').exists():
            # /!\ If one delivery point has been closed, I may not close anymore by producer:
            producer_invoices = ProducerInvoice.objects.none()
        else:
            producer_invoices = ProducerInvoice.objects.filter(
                Q(permanence_id=permanence.id,
                  status=PERMANENCE_OPENED,
                  producer__represent_this_buyinggroup=False)
                | Q(permanence_id=permanence.id,
                    status=PERMANENCE_CLOSED,
                    producer__represent_this_buyinggroup=False)).order_by(
                        "producer")
        return render(
            request, 'repanier/confirm_admin_send_order.html', {
                'sub_title':
                _("Please, confirm the action : send orders"),
                'action_checkbox_name':
                admin.ACTION_CHECKBOX_NAME,
                'action':
                'send_order',
                'permanence':
                permanence,
                'deliveries':
                DeliveryBoard.objects.filter(
                    permanence_id=permanence.id,
                    status__in=[PERMANENCE_OPENED, PERMANENCE_CLOSED
                                ]).order_by("id"),
                'producer_invoices':
                producer_invoices,
                'form':
                form,
                'order_customer_email_will_be_sent':
                order_customer_email_will_be_sent,
                'order_customer_email_will_be_sent_to':
                order_customer_email_will_be_sent_to,
                'order_producer_email_will_be_sent':
                order_producer_email_will_be_sent,
                'order_producer_email_will_be_sent_to':
                order_producer_email_will_be_sent_to,
                'order_board_email_will_be_sent':
                order_board_email_will_be_sent,
                'order_board_email_will_be_sent_to':
                order_board_email_will_be_sent_to
            })
コード例 #6
0
    def open_and_send_offer(self, request, queryset):
        if 'cancel' in request.POST:
            user_message = _("Action canceled by the user.")
            user_message_level = messages.INFO
            self.message_user(request, user_message, user_message_level)
            return
        permanence = queryset.first()
        if permanence is None or not (PERMANENCE_PLANNED <= permanence.status
                                      <= PERMANENCE_WAIT_FOR_OPEN):
            user_message = _("Action canceled by the system.")
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return
        pre_open = (permanence.status
                    == PERMANENCE_PLANNED) and Producer.objects.filter(
                        permanence__id=permanence.id,
                        is_active=True,
                        producer_pre_opening=True).order_by('?').exists()
        if pre_open:
            template_offer_mail = []
            template_cancel_order_mail = []
            cur_language = translation.get_language()
            for language in settings.PARLER_LANGUAGES[settings.SITE_ID]:
                language_code = language["code"]
                translation.activate(language_code)

                with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG,
                                     language_code):
                    template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.
                                        offer_producer_mail)
                sender_email, sender_function, signature, cc_email_staff = get_signature(
                    is_reply_to_order_email=True)
                with switch_language(permanence, language_code):
                    offer_description = permanence.safe_translation_getter(
                        'offer_description',
                        any_language=True,
                        default=EMPTY_STRING)
                context = TemplateContext({
                    'name':
                    _('long_profile_name'),
                    'long_profile_name':
                    _('long_profile_name'),
                    'permanence_link':
                    mark_safe('<a href="#">%s</a>' % _("offer")),
                    'offer_description':
                    mark_safe(offer_description),
                    'offer_link':
                    mark_safe('<a href="#">%s</a>' % _("offer")),
                    'signature':
                    mark_safe('%s<br/>%s<br/>%s' %
                              (signature, sender_function,
                               repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
                })
                template_offer_mail.append(language_code)
                template_offer_mail.append(template.render(context))
            translation.activate(cur_language)
            email_will_be_sent, email_will_be_sent_to = send_email_to_who(True)
        else:
            template_offer_mail = []
            template_cancel_order_mail = []
            cur_language = translation.get_language()
            for language in settings.PARLER_LANGUAGES[settings.SITE_ID]:
                language_code = language["code"]
                translation.activate(language_code)

                with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG,
                                     language_code):
                    template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.
                                        offer_customer_mail)
                sender_email, sender_function, signature, cc_email_staff = get_signature(
                    is_reply_to_order_email=True)
                with switch_language(permanence, language_code):
                    offer_description = permanence.safe_translation_getter(
                        'offer_description',
                        any_language=True,
                        default=EMPTY_STRING)
                offer_producer = ', '.join(
                    [p.short_profile_name for p in permanence.producers.all()])
                qs = Product.objects.filter(
                    producer=permanence.producers.first(),
                    is_into_offer=True,
                    order_unit__lt=
                    PRODUCT_ORDER_UNIT_DEPOSIT  # Don't display technical products.
                ).order_by("translations__long_name")[:5]
                offer_detail = '<ul>%s</ul>' % ("".join(
                    '<li>%s, %s</li>' %
                    (p.get_long_name(with_box_unicode=False),
                     p.producer.short_profile_name) for p in qs), )
                context = TemplateContext({
                    'offer_description':
                    mark_safe(offer_description),
                    'offer_detail':
                    offer_detail,
                    'offer_recent_detail':
                    offer_detail,
                    'offer_producer':
                    offer_producer,
                    'permanence_link':
                    mark_safe('<a href="#">%s</a>' % permanence),
                    'signature':
                    mark_safe('%s<br/>%s<br/>%s' %
                              (signature, sender_function,
                               repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
                })
                template_offer_mail.append(language_code)
                template_offer_mail.append(template.render(context))
                if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS:
                    context = TemplateContext({
                        'name':
                        _('long_basket_name'),
                        'long_basket_name':
                        _('long_basket_name'),
                        'basket_name':
                        _('short_basket_name'),
                        'short_basket_name':
                        _('short_basket_name'),
                        'permanence_link':
                        mark_safe('<a href=#">%s</a>' % permanence),
                        'signature':
                        mark_safe(
                            '%s<br/>%s<br/>%s' %
                            (signature, sender_function,
                             repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
                    })
                    template_cancel_order_mail.append(language_code)
                    template_cancel_order_mail.append(template.render(context))
            translation.activate(cur_language)
            email_will_be_sent, email_will_be_sent_to = send_email_to_who(
                repanier.apps.REPANIER_SETTINGS_SEND_OPENING_MAIL_TO_CUSTOMER)
        if 'apply' in request.POST or 'apply-wo-mail' in request.POST:
            form = OpenAndSendOfferForm(request.POST)
            if form.is_valid():
                user_message, user_message_level = task_order.admin_open_and_send(
                    request, permanence, 'apply-wo-mail' in request.POST)
                self.message_user(request, user_message, user_message_level)
            return HttpResponseRedirect(request.get_full_path())
        else:
            form = OpenAndSendOfferForm(
                initial={
                    'template_offer_customer_mail':
                    mark_safe("<br/>==============<br/>".join(
                        template_offer_mail)),
                    'template_cancel_order_customer_mail':
                    mark_safe("<br/>==============<br/>".join(
                        template_cancel_order_mail)),
                })
        return render(
            request, 'repanier/confirm_admin_open_and_send_offer.html', {
                'sub_title':
                _("Please, confirm the action : open and send offers"),
                'action_checkbox_name': admin.ACTION_CHECKBOX_NAME,
                'action': 'open_and_send_offer',
                'permanence': permanence,
                'pre_open': pre_open,
                'form': form,
                'email_will_be_sent': email_will_be_sent,
                'email_will_be_sent_to': email_will_be_sent_to
            })
コード例 #7
0
    def send_invoices(self, request, permanence_qs):
        if 'cancel' in request.POST:
            user_message = _("Action canceled by the user.")
            user_message_level = messages.INFO
            self.message_user(request, user_message, user_message_level)
            return
        permanence = permanence_qs.first()
        if permanence is None or permanence.status != PERMANENCE_INVOICED:
            user_message = _("Action canceled by the system.")
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return
        template = Template(
            repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_customer_mail)
        invoice_description = permanence.safe_translation_getter(
            'invoice_description', any_language=True, default=EMPTY_STRING)
        sender_email, sender_function, signature, cc_email_staff = get_signature(
            is_reply_to_invoice_email=True)
        # TODO : Align on tools.payment_message
        customer_order_amount = \
                _('The amount of your order is %(amount)s.') % {
                    'amount': RepanierMoney(123.45)
                }
        customer_last_balance = \
            _('The balance of your account as of %(date)s is %(balance)s.') % {
                'date'   : timezone.now().strftime(settings.DJANGO_SETTINGS_DATE),
                'balance': RepanierMoney(123.45)
            }
        customer_payment_needed = "%s %s %s (%s) %s \"%s\"." % (
            _('Please pay'), RepanierMoney(123.45),
            _('to the bank account number'),
            repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT,
            _('with communication'), _('short_basket_name'))
        context = TemplateContext({
            'name':
            _('long_basket_name'),
            'long_basket_name':
            _('long_basket_name'),
            'basket_name':
            _('short_basket_name'),
            'short_basket_name':
            _('short_basket_name'),
            'permanence_link':
            mark_safe('<a href=#">%s</a>' % permanence),
            'last_balance_link':
            mark_safe('<a href="#">%s</a>' % customer_last_balance),
            'last_balance':
            customer_last_balance,
            'order_amount':
            mark_safe(customer_order_amount),
            'payment_needed':
            mark_safe(customer_payment_needed),
            'invoice_description':
            mark_safe(invoice_description),
            'signature':
            mark_safe('%s<br/>%s<br/>%s' %
                      (signature, sender_function,
                       repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
        })
        template_invoice_customer_mail = template.render(context)

        invoice_customer_email_will_be_sent, invoice_customer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_CUSTOMER)

        template = Template(
            repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_producer_mail)

        context = TemplateContext({
            'name':
            _('long_profile_name'),
            'long_profile_name':
            _('long_profile_name'),
            'permanence_link':
            mark_safe('<a href=#">%s</a>' % permanence),
            'signature':
            mark_safe('%s<br/>%s<br/>%s' %
                      (signature, sender_function,
                       repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
        })
        template_invoice_producer_mail = template.render(context)

        invoice_producer_email_will_be_sent, invoice_producer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_PRODUCER)
        if 'apply' in request.POST:
            form = InvoiceOrderForm(request.POST)
            if form.is_valid():
                user_message, user_message_level = task_invoice.admin_send(
                    permanence)
                self.message_user(request, user_message, user_message_level)
            return HttpResponseRedirect(request.get_full_path())
        else:
            form = InvoiceOrderForm(
                initial={
                    'template_invoice_customer_mail':
                    mark_safe(template_invoice_customer_mail),
                    'template_invoice_producer_mail':
                    mark_safe(template_invoice_producer_mail),
                })
        return render(
            request, 'repanier/confirm_admin_send_invoice.html', {
                'sub_title':
                _("Please, confirm the action : send invoices"),
                'action_checkbox_name':
                admin.ACTION_CHECKBOX_NAME,
                'action':
                'send_invoices',
                'permanence':
                permanence,
                'form':
                form,
                'invoice_customer_email_will_be_sent':
                invoice_customer_email_will_be_sent,
                'invoice_customer_email_will_be_sent_to':
                invoice_customer_email_will_be_sent_to,
                'invoice_producer_email_will_be_sent':
                invoice_producer_email_will_be_sent,
                'invoice_producer_email_will_be_sent_to':
                invoice_producer_email_will_be_sent_to
            })
コード例 #8
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,
    )
コード例 #9
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)
コード例 #10
0
ファイル: permanence_done.py プロジェクト: pcolmant/repanier
    def send_invoices(self, request, queryset):
        if "cancel" in request.POST:
            user_message = _("Action canceled by the user.")
            user_message_level = messages.INFO
            self.message_user(request, user_message, user_message_level)
            return None
        permanence = queryset.order_by("?").first()
        if permanence is None or permanence.status != PERMANENCE_DONE:
            user_message = _("Action canceled by the system.")
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return None
        template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_customer_mail)
        try:
            invoice_description = permanence.invoice_description
        except TranslationDoesNotExist:
            invoice_description = EMPTY_STRING
        sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_invoice_email=True)
        # TODO : Align on tools.payment_message
        customer_order_amount = _("The amount of your order is %(amount)s.") % {"amount": RepanierMoney(123.45)}
        customer_last_balance = _("The balance of your account as of %(date)s is %(balance)s.") % {
            "date": timezone.now().strftime(settings.DJANGO_SETTINGS_DATE),
            "balance": RepanierMoney(123.45),
        }
        customer_payment_needed = '%s %s %s (%s) %s "%s".' % (
            _("Please pay"),
            RepanierMoney(123.45),
            _("to the bank account number"),
            repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT,
            _("with communication"),
            _("short_basket_name"),
        )
        context = TemplateContext(
            {
                "name": _("long_basket_name"),
                "long_basket_name": _("long_basket_name"),
                "basket_name": _("short_basket_name"),
                "short_basket_name": _("short_basket_name"),
                "permanence_link": mark_safe('<a href=#">%s</a>' % permanence),
                "last_balance_link": mark_safe('<a href="#">%s</a>' % customer_last_balance),
                "last_balance": customer_last_balance,
                "order_amount": mark_safe(customer_order_amount),
                "payment_needed": mark_safe(customer_payment_needed),
                "invoice_description": mark_safe(invoice_description),
                "signature": mark_safe(
                    "%s<br/>%s<br/>%s" % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)
                ),
            }
        )
        template_invoice_customer_mail = template.render(context)

        invoice_customer_email_will_be_sent, invoice_customer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_CUSTOMER
        )

        template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.invoice_producer_mail)

        context = TemplateContext(
            {
                "name": _("long_profile_name"),
                "long_profile_name": _("long_profile_name"),
                "permanence_link": mark_safe('<a href=#">%s</a>' % permanence),
                "signature": mark_safe(
                    "%s<br/>%s<br/>%s" % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)
                ),
            }
        )
        template_invoice_producer_mail = template.render(context)

        invoice_producer_email_will_be_sent, invoice_producer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_INVOICE_MAIL_TO_PRODUCER
        )
        if "apply" in request.POST:
            form = InvoiceOrderForm(request.POST)
            if form.is_valid():
                user_message, user_message_level = task_invoice.admin_send(permanence.id)
                self.message_user(request, user_message, user_message_level)
            return HttpResponseRedirect(request.get_full_path())
        else:
            form = InvoiceOrderForm(
                initial={
                    "template_invoice_customer_mail": mark_safe(template_invoice_customer_mail),
                    "template_invoice_producer_mail": mark_safe(template_invoice_producer_mail),
                }
            )
        return render(
            request,
            "repanier/confirm_admin_send_invoice.html",
            {
                "sub_title": _("Please, confirm the action : send invoices"),
                "action_checkbox_name": admin.ACTION_CHECKBOX_NAME,
                "action": "send_invoices",
                "permanence": permanence,
                "form": form,
                "invoice_customer_email_will_be_sent": invoice_customer_email_will_be_sent,
                "invoice_customer_email_will_be_sent_to": invoice_customer_email_will_be_sent_to,
                "invoice_producer_email_will_be_sent": invoice_producer_email_will_be_sent,
                "invoice_producer_email_will_be_sent_to": invoice_producer_email_will_be_sent_to,
            },
        )
コード例 #11
0
    def send_order(self, request, queryset):
        if 'cancel' in request.POST:
            user_message = _("Action canceled by the user.")
            user_message_level = messages.INFO
            self.message_user(request, user_message, user_message_level)
            return None
        permanence = queryset.order_by('?').first()
        if permanence is None or permanence.status not in [PERMANENCE_OPENED, PERMANENCE_CLOSED]:
            user_message = _("Action canceled by the system.")
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return None
        if 'apply' in request.POST:
            deliveries_to_be_send = []
            producers_to_be_send = []
            producer_qs = Producer.objects.filter(permanence=permanence.id)
            if "deliveries" in request.POST:
                deliveries_to_be_send = request.POST.getlist("deliveries")
                if len(deliveries_to_be_send) == 0:
                    user_message = _("You must select at least one delivery point.")
                    user_message_level = messages.WARNING
                    self.message_user(request, user_message, user_message_level)
                    return None
            all_producers = "all-producer-invoices" in request.POST
            producers_invoices_to_be_send = []
            if "producer-invoices" in request.POST:
                producers_invoices_to_be_send = request.POST.getlist("producer-invoices")
            if not all_producers and len(producers_invoices_to_be_send) == 0:
                user_message = _("You must select at least one producer.")
                user_message_level = messages.WARNING
                self.message_user(request, user_message, user_message_level)
                return None
            producer_qs = producer_qs.filter(
                producerinvoice__in=producers_invoices_to_be_send)
            for producer in producer_qs.only("id").order_by('?'):
                producers_to_be_send.append(producer.id)

            user_message, user_message_level = task_order.admin_send(
                permanence_id=permanence.id,
                all_producers=all_producers,
                deliveries_id=deliveries_to_be_send,
                producers_id=producers_to_be_send
            )
            self.message_user(request, user_message, user_message_level)
            return None

        template_order_customer_mail = []
        template_order_producer_mail = []
        template_order_staff_mail = []
        cur_language = translation.get_language()
        for language in settings.PARLER_LANGUAGES[settings.SITE_ID]:
            language_code = language["code"]
            translation.activate(language_code)

            template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.order_customer_mail)
            sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_order_email=True)
            customer_last_balance = \
                _('The balance of your account as of %(date)s is %(balance)s.') % {
                    'date'   : timezone.now().strftime(settings.DJANGO_SETTINGS_DATE),
                    'balance': RepanierMoney(123.45)
                }
            customer_on_hold_movement = \
                _(
                    'This balance does not take account of any unrecognized payments %(bank)s and any unbilled order %(other_order)s.') \
                % {
                    'bank'       : RepanierMoney(123.45),
                    'other_order': RepanierMoney(123.45)
                }

            bank_account_number = repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT
            if bank_account_number is not None:
                group_name = repanier.apps.REPANIER_SETTINGS_GROUP_NAME
                if permanence.short_name:
                    communication = "%s (%s)" % (_('short_basket_name'), permanence.short_name)
                else:
                    communication = _('short_basket_name')
                customer_payment_needed = '<font color="#bd0926">%s</font>' % (
                    _(
                        'Please pay %(payment)s to the bank account %(name)s %(number)s with communication %(communication)s.') % {
                        'payment'      : RepanierMoney(123.45),
                        'name'         : group_name,
                        'number'       : bank_account_number,
                        'communication': communication
                    }
                )
            else:
                customer_payment_needed = EMPTY_STRING
            context = TemplateContext({
                'name'             : _('long_basket_name'),
                'long_basket_name' : _('long_basket_name'),
                'basket_name'      : _('short_basket_name'),
                'short_basket_name': _('short_basket_name'),
                'permanence_link'  : mark_safe('<a href=#">%s</a>' % permanence),
                'last_balance'     : mark_safe('<a href="#">%s</a>' % customer_last_balance),
                'order_amount'     : RepanierMoney(123.45),
                'on_hold_movement' : mark_safe(customer_on_hold_movement),
                'payment_needed'   : mark_safe(customer_payment_needed),
                'delivery_point'   : _('delivery point').upper(),
                'signature'        : mark_safe(
                    '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
            })

            template_order_customer_mail.append(language_code)
            template_order_customer_mail.append(template.render(context))

            template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.order_producer_mail)
            context = TemplateContext({
                'name'             : _('long_profile_name'),
                'long_profile_name': _('long_profile_name'),
                'order_empty'      : False,
                'duplicate'        : True,
                'permanence_link'  : mark_safe('<a href=#">%s</a>' % permanence),
                'signature'        : mark_safe(
                    '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
            })

            template_order_producer_mail.append(language_code)
            template_order_producer_mail.append(template.render(context))

            board_composition, board_composition_and_description = get_board_composition(permanence.id)
            template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.order_staff_mail)
            context = TemplateContext({
                'permanence_link'                  : mark_safe('<a href=#">%s</a>' % permanence),
                'board_composition'                : mark_safe(board_composition),
                'board_composition_and_description': mark_safe(board_composition_and_description),
                'signature'                        : mark_safe(
                    '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
            })

            template_order_staff_mail.append(language_code)
            template_order_staff_mail.append(template.render(context))



        translation.activate(cur_language)

        order_customer_email_will_be_sent, order_customer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_CUSTOMER
        )
        order_producer_email_will_be_sent, order_producer_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_PRODUCER
        )
        order_board_email_will_be_sent, order_board_email_will_be_sent_to = send_email_to_who(
            repanier.apps.REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_BOARD, board=True
        )

        form = CloseAndSendOrderForm(
            initial={
                'template_order_customer_mail': mark_safe("<br/>==============<br/>".join(template_order_customer_mail)),
                'template_order_producer_mail': mark_safe("<br/>==============<br/>".join(template_order_producer_mail)),
                'template_order_staff_mail'   : mark_safe("<br/>==============<br/>".join(template_order_staff_mail)),
            }
        )
        if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS or DeliveryBoard.objects.filter(
                permanence_id=permanence.id,
                status__gt=PERMANENCE_OPENED
        ).order_by('?').exists():
            # /!\ If one delivery point has been closed, I may not close anymore by producer:
            producer_invoices = ProducerInvoice.objects.none()
        else:
            producer_invoices = ProducerInvoice.objects.filter(
                Q(
                    permanence=permanence.id,
                    status=PERMANENCE_OPENED,
                    producer__represent_this_buyinggroup=False
                ) | Q(
                    permanence=permanence.id,
                    status=PERMANENCE_CLOSED,
                    producer__represent_this_buyinggroup=False
                )
            ).order_by("producer")
        return render(
            request,
            'repanier/confirm_admin_send_order.html', {
                'sub_title'                           : _("Please, confirm the action : send orders"),
                'action_checkbox_name'                : admin.ACTION_CHECKBOX_NAME,
                'action'                              : 'send_order',
                'permanence'                          : permanence,
                'deliveries'                          : DeliveryBoard.objects.filter(
                    permanence_id=permanence.id,
                    status__in=[PERMANENCE_OPENED, PERMANENCE_CLOSED]
                ).order_by("id"),
                'producer_invoices'                   : producer_invoices,
                'form'                                : form,
                'order_customer_email_will_be_sent'   : order_customer_email_will_be_sent,
                'order_customer_email_will_be_sent_to': order_customer_email_will_be_sent_to,
                'order_producer_email_will_be_sent'   : order_producer_email_will_be_sent,
                'order_producer_email_will_be_sent_to': order_producer_email_will_be_sent_to,
                'order_board_email_will_be_sent'      : order_board_email_will_be_sent,
                'order_board_email_will_be_sent_to'   : order_board_email_will_be_sent_to
            })
コード例 #12
0
    def open_and_send_offer(self, request, queryset):
        if 'cancel' in request.POST:
            user_message = _("Action canceled by the user.")
            user_message_level = messages.INFO
            self.message_user(request, user_message, user_message_level)
            return None
        permanence = queryset.order_by('?').first()
        if permanence is None or not (PERMANENCE_PLANNED <= permanence.status <= PERMANENCE_WAIT_FOR_OPEN):
            user_message = _("Action canceled by the system.")
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return None
        pre_open = (permanence.status == PERMANENCE_PLANNED) and Producer.objects.filter(
            permanence__id=permanence.id, is_active=True, producer_pre_opening=True
        ).order_by('?').exists()
        if pre_open:
            template_offer_mail = []
            template_cancel_order_mail = []
            cur_language = translation.get_language()
            for language in settings.PARLER_LANGUAGES[settings.SITE_ID]:
                language_code = language["code"]
                translation.activate(language_code)

                with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG, language_code):
                    template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.offer_producer_mail)
                sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_order_email=True)
                with switch_language(permanence, language_code):
                    try:
                        offer_description = permanence.offer_description
                    except TranslationDoesNotExist:
                        offer_description = EMPTY_STRING
                context = TemplateContext({
                    'name'             : _('long_profile_name'),
                    'long_profile_name': _('long_profile_name'),
                    'permanence_link'  : mark_safe('<a href="#">%s</a>' % _("offer")),
                    'offer_description': mark_safe(offer_description),
                    'offer_link'       : mark_safe('<a href="#">%s</a>' % _("offer")),
                    'signature'        : mark_safe(
                        '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
                })
                template_offer_mail.append(language_code)
                template_offer_mail.append(template.render(context))
            translation.activate(cur_language)
            email_will_be_sent, email_will_be_sent_to = send_email_to_who(True)
        else:
            template_offer_mail = []
            template_cancel_order_mail = []
            cur_language = translation.get_language()
            for language in settings.PARLER_LANGUAGES[settings.SITE_ID]:
                language_code = language["code"]
                translation.activate(language_code)

                with switch_language(repanier.apps.REPANIER_SETTINGS_CONFIG, language_code):
                    template = Template(repanier.apps.REPANIER_SETTINGS_CONFIG.offer_customer_mail)
                sender_email, sender_function, signature, cc_email_staff = get_signature(is_reply_to_order_email=True)
                with switch_language(permanence, language_code):
                    try:
                        offer_description = permanence.offer_description
                    except TranslationDoesNotExist:
                        offer_description = EMPTY_STRING

                offer_producer = ', '.join([p.short_profile_name for p in permanence.producers.all()])
                qs = Product.objects.filter(
                    producer=permanence.producers.first(),
                    is_into_offer=True,
                    order_unit__lt=PRODUCT_ORDER_UNIT_DEPOSIT  # Don't display technical products.
                ).order_by(
                    "translations__long_name"
                )[:5]
                offer_detail = '<ul>%s</ul>' % ("".join('<li>%s, %s</li>' % (
                    p.get_long_name(box_unicode=EMPTY_STRING),
                    p.producer.short_profile_name
                )
                                                        for p in qs
                                                        ),)
                context = TemplateContext({
                    'offer_description': mark_safe(offer_description),
                    'offer_detail'     : offer_detail,
                    'offer_producer'   : offer_producer,
                    'permanence_link'  : mark_safe('<a href="#">%s</a>' % permanence),
                    'signature'        : mark_safe(
                        '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
                })
                template_offer_mail.append(language_code)
                template_offer_mail.append(template.render(context))
                if repanier.apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS:
                    context = TemplateContext({
                        'name'             : _('long_basket_name'),
                        'long_basket_name' : _('long_basket_name'),
                        'basket_name'      : _('short_basket_name'),
                        'short_basket_name': _('short_basket_name'),
                        'permanence_link'  : mark_safe('<a href=#">%s</a>' % permanence),
                        'signature'        : mark_safe(
                            '%s<br/>%s<br/>%s' % (signature, sender_function, repanier.apps.REPANIER_SETTINGS_GROUP_NAME)),
                    })
                    template_cancel_order_mail.append(language_code)
                    template_cancel_order_mail.append(template.render(context))
            translation.activate(cur_language)
            email_will_be_sent, email_will_be_sent_to = send_email_to_who(
                repanier.apps.REPANIER_SETTINGS_SEND_OPENING_MAIL_TO_CUSTOMER
            )
        if 'apply' in request.POST:
            form = OpenAndSendOfferForm(request.POST)
            if form.is_valid():
                user_message, user_message_level = task_order.admin_open_and_send(
                    request, permanence
                )
                self.message_user(request, user_message, user_message_level)
            return HttpResponseRedirect(request.get_full_path())
        else:
            form = OpenAndSendOfferForm(
                initial={
                    'template_offer_customer_mail': mark_safe("<br/>==============<br/>".join(template_offer_mail)),
                    'template_cancel_order_customer_mail': mark_safe("<br/>==============<br/>".join(template_cancel_order_mail)),
                }
            )
        return render(
            request,
            'repanier/confirm_admin_open_and_send_offer.html', {
                'sub_title'            : _("Please, confirm the action : open and send offers"),
                'action_checkbox_name' : admin.ACTION_CHECKBOX_NAME,
                'action'               : 'open_and_send_offer',
                'permanence'           : permanence,
                'pre_open'             : pre_open,
                'form'                 : form,
                'email_will_be_sent'   : email_will_be_sent,
                'email_will_be_sent_to': email_will_be_sent_to
            })