예제 #1
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
            })
예제 #2
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
            })
예제 #3
0
    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,
            },
        )
예제 #4
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
            })
예제 #5
0
    def close_and_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.status not in [PERMANENCE_OPENED, PERMANENCE_CLOSED]:
            user_message = _("The status of %(permanence)s prohibit you to perform this action.") % {
                'permanence': permanence}
            user_message_level = messages.ERROR
            self.message_user(request, user_message, user_message_level)
            return
        only_deliveries = permanence.with_delivery_point
        if 'apply' in request.POST:
            all_deliveries = True if request.POST.get("all-deliveries", False) else False
            deliveries_to_be_send = request.POST.getlist("deliveries", [])
            all_producers = True if request.POST.get("all-producers", False) else False
            producers_to_be_send = request.POST.getlist("producers", [])
            if only_deliveries:
                if not all_deliveries and 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
            else:
                if not all_producers and len(producers_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
                if not all_producers and settings.REPANIER_SETTINGS_CUSTOMER_MUST_CONFIRM_ORDER:
                    user_message = _("You must select all producers because the customers must confirm orders.")
                    user_message_level = messages.WARNING
                    self.message_user(request, user_message, user_message_level)
                    return
            everything = all_producers or all_deliveries
            # close_and_send_order(permanence.id, everything, producers_to_be_send, deliveries_to_be_send)
            t = threading.Thread(target=close_and_send_order,
                                 args=(permanence.id, everything, producers_to_be_send, deliveries_to_be_send))
            t.start()
            user_message = _("The orders are being send.")
            user_message_level = messages.INFO
            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)

            staff = Staff.get_or_create_order_responsible()

            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 = "{} ({})".format(_('Short name'), permanence.short_name)
                else:
                    communication = _('Short name')
                customer_payment_needed = "<font color=\"#bd0926\">{}</font>".format(
                    _(
                        '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=\"#\">{}</a>".format(permanence)),
                'last_balance': mark_safe("<a href=\"#\">{}</a>".format(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': staff.get_html_signature,
            })

            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': format_html("<a href=\"#\">{}</a>", permanence),
                'signature': staff.get_html_signature,
            })

            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': format_html("<a href=\"#\">{}</a>", permanence),
                'board_composition': mark_safe(board_composition),
                'board_composition_and_description': mark_safe(board_composition_and_description),
                'signature': staff.get_html_signature,
            })

            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()
        order_producer_email_will_be_sent, order_producer_email_will_be_sent_to = send_email_to_who()
        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 only_deliveries:
            # /!\ If one delivery point has been closed, I may not close anymore by producer
            producers = Producer.objects.none()
            deliveries = DeliveryBoard.objects.filter(
                permanence_id=permanence.id,
                status__in=[PERMANENCE_OPENED, PERMANENCE_CLOSED]
            )
        else:
            producers = Producer.objects.filter(
                producerinvoice__permanence_id=permanence.id,
                producerinvoice__status__in=[PERMANENCE_OPENED, PERMANENCE_CLOSED]
            )
            deliveries = DeliveryBoard.objects.none()
        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': 'close_and_send_order',
                'permanence': permanence,
                'only_deliveries': only_deliveries,
                'deliveries': deliveries,
                'producers': producers,
                '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.status not in [PERMANENCE_PLANNED, PERMANENCE_PRE_OPEN]:
            user_message = _("The status of %(permanence)s prohibit you to perform this action.") % {
                'permanence': permanence}
            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)

                staff = Staff.get_or_create_order_responsible()

                with switch_language(permanence, language_code):
                    offer_description = permanence.safe_translation_getter(
                        'offer_description', any_language=True, default=EMPTY_STRING
                    )
                context = TemplateContext({
                    'name': _('Long name'),
                    'long_profile_name': _('Long name'),
                    'permanence_link': mark_safe("<a href=\"#\">{}</a>".format(_("Offers"))),
                    'offer_description': mark_safe(offer_description),
                    'offer_link': mark_safe("<a href=\"#\">{}</a>".format(_("Offers"))),
                    'signature': staff.get_html_signature,
                })
                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)

                staff = Staff.get_or_create_order_responsible()

                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>{}</ul>".format("".join("<li>{}, {}</li>".format(
                    p.get_long_name(),
                    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=\"#\">{}</a>".format(permanence)),
                    'signature': staff.get_html_signature,
                })
                template_offer_mail.append(language_code)
                template_offer_mail.append(template.render(context))
                if settings.REPANIER_SETTINGS_CUSTOMER_MUST_CONFIRM_ORDER:
                    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=\"#\">{}</a>".format(permanence)),
                        'signature': staff.get_html_signature,
                    })
                    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()
        if 'apply' in request.POST or 'apply-wo-mail' in request.POST:
            form = OpenAndSendOfferForm(request.POST)
            if form.is_valid():
                do_not_send_any_mail = 'apply-wo-mail' in request.POST
                if pre_open:
                    permanence_already_pre_opened = Permanence.objects.filter(
                        status__in=[PERMANENCE_WAIT_FOR_PRE_OPEN, PERMANENCE_PRE_OPEN]
                    ).order_by("-is_updated_on").only("id").first()
                    if permanence_already_pre_opened is not None:
                        user_message = _("A maximum of one permanence may be pre opened.")
                        user_message_level = messages.ERROR
                    else:
                        # pre_open_order(permanence.id)
                        t = threading.Thread(target=pre_open_order, args=(permanence.id,))
                        t.start()
                        user_message = _("The offers are being generated.")
                        user_message_level = messages.INFO
                else:
                    # open_order(permanence.id, do_not_send_any_mail)
                    t = threading.Thread(target=open_order, args=(permanence.id, do_not_send_any_mail))
                    t.start()
                    user_message = _("The offers are being generated.")
                    user_message_level = messages.INFO
                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.status != PERMANENCE_INVOICED:
            user_message = _("The status of %(permanence)s prohibit you to perform this action.") % {
                'permanence': permanence}
            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
        )
        staff = Staff.get_or_create_invoice_responsible()

        # 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 = "{} {} {} ({}) {} \"{}\".".format(
            _('Please pay'),
            RepanierMoney(123.45),
            _('to the bank account number'),
            repanier.apps.REPANIER_SETTINGS_BANK_ACCOUNT,
            _('with communication'),
            _('Short name'))
        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=\"#\">{}</a>".format(permanence)),
            'last_balance_link': mark_safe("<a href=\"#\">{}</a>".format(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': staff.get_html_signature,
        })
        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 name'),
            'long_profile_name': _('Long name'),
            'permanence_link': mark_safe("<a href=\"#\">{}</a>".format(permanence)),
            'signature': staff.get_html_signature,
        })
        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():
                t = threading.Thread(target=email_invoice.send_invoice, args=(permanence.id,))
                t.start()
                user_message = _("Emails containing the invoices will be send to the customers and the producers.")
                user_message_level = messages.INFO
                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 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
            })
예제 #9
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
            })