From 738f0b9ffddd2b674e78e1e89fa1f464dc2d3080 Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 3 May 2017 18:08:36 +0200 Subject: [PATCH] RC --- mysite/common_settings.py | 8 +- repanier/admin/permanence_in_preparation.py | 2 +- repanier/email/email_order.py | 7 +- .../commands/recalculate_order_amount.py | 197 +++++++++--------- repanier/models/invoice.py | 12 +- repanier/models/offeritem.py | 15 +- repanier/models/product.py | 10 +- repanier/models/purchase.py | 38 ++-- repanier/task/task_invoice.py | 6 +- repanier/task/task_order.py | 35 +++- repanier/tools.py | 75 ++++--- repanier/views/btn_confirm_order_ajax.py | 7 +- .../views/send_mail_to_all_members_view.py | 8 +- .../views/send_mail_to_coordinators_view.py | 6 +- repanier/xlsx/xlsx_order.py | 127 +++++------ 15 files changed, 308 insertions(+), 245 deletions(-) diff --git a/mysite/common_settings.py b/mysite/common_settings.py index 800a068..6b128f2 100644 --- a/mysite/common_settings.py +++ b/mysite/common_settings.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- -import ConfigParser +try: + import configparser +except: + from six.moves import configparser + import codecs import logging @@ -38,7 +42,7 @@ MEDIA_URL = "%s%s%s" % (os.sep, "media", os.sep) STATIC_ROOT = os.path.join(PROJECT_DIR, "collect-static") DJANGO_SETTINGS_SITE_NAME = os.path.split(PROJECT_DIR)[-1] -config = ConfigParser.RawConfigParser(allow_no_value=True) +config = configparser.RawConfigParser(allow_no_value=True) conf_file_name = '%s%s%s.ini' % ( PROJECT_DIR, os.sep, diff --git a/repanier/admin/permanence_in_preparation.py b/repanier/admin/permanence_in_preparation.py index af27650..c36693f 100644 --- a/repanier/admin/permanence_in_preparation.py +++ b/repanier/admin/permanence_in_preparation.py @@ -272,7 +272,7 @@ class PermanenceInPreparationAdmin(TranslatableAdmin): self.message_user(request, user_message, user_message_level) return # Also display order without delivery point -> The customer has not selected it yet - deliveries_to_be_exported.append(None) + # deliveries_to_be_exported.append(None) else: deliveries_to_be_exported = None response = None diff --git a/repanier/email/email_order.py b/repanier/email/email_order.py index 3a198ad..8eff29e 100644 --- a/repanier/email/email_order.py +++ b/repanier/email/email_order.py @@ -8,8 +8,8 @@ from django.utils.html import strip_tags from django.utils.translation import ugettext_lazy as _ from openpyxl.writer.excel import save_virtual_workbook -from repanier.models import DeliveryBoard from repanier.models import Customer +from repanier.models import DeliveryBoard from repanier.models import Permanence, Configuration, CustomerInvoice from repanier.models import PermanenceBoard from repanier.models import Producer, ProducerInvoice @@ -17,7 +17,7 @@ from repanier.tools import * from repanier.xlsx.xlsx_order import generate_customer_xlsx, generate_producer_xlsx -def email_order(permanence_id, all_producers=True, closed_deliveries_id=None, producers_id=None): +def email_order(permanence_id, all_producers=True, producers_id=None, closed_deliveries_id=None): from repanier.apps import REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_BOARD, \ REPANIER_SETTINGS_GROUP_NAME, REPANIER_SETTINGS_SEND_ORDER_MAIL_TO_PRODUCER, \ REPANIER_SETTINGS_SEND_ABSTRACT_ORDER_MAIL_TO_PRODUCER, \ @@ -42,6 +42,7 @@ def email_order(permanence_id, all_producers=True, closed_deliveries_id=None, pr if closed_deliveries_id: # closed_deliveries_id is not empty list and not "None" # all_producers is True + all_producers = True for delivery_id in closed_deliveries_id: delivery_board = DeliveryBoard.objects.filter( id=delivery_id @@ -110,7 +111,7 @@ def email_order(permanence_id, all_producers=True, closed_deliveries_id=None, pr permanence=permanence.id, language=language_code, ).order_by('?') - if producers_id is not None: + if producers_id: producer_set = producer_set.filter(id__in=producers_id) for producer in producer_set: long_profile_name = producer.long_profile_name if producer.long_profile_name is not None else producer.short_profile_name diff --git a/repanier/management/commands/recalculate_order_amount.py b/repanier/management/commands/recalculate_order_amount.py index 9284de9..c40b258 100644 --- a/repanier/management/commands/recalculate_order_amount.py +++ b/repanier/management/commands/recalculate_order_amount.py @@ -17,102 +17,107 @@ class Command(BaseCommand): help = 'Recalculate order amount' def handle(self, *args, **options): - latest_total = BankAccount.objects.filter( - producer__isnull=True, - customer__isnull=True, - permanence__isnull=False - ).only( - "permanence" - ).order_by( - "-id" - ).first() - while latest_total: - permanence = latest_total.permanence - if permanence.status == PERMANENCE_INVOICED: - print ("Cancel %s %s" % (permanence.permanence_date, permanence.get_status_display())) - task_invoice.admin_cancel(permanence) - else: - latest_total.delete() - latest_total = BankAccount.objects.filter( - producer__isnull=True, - customer__isnull=True, - permanence__isnull=False - ).only( - "permanence" - ).order_by( - "-id" - ).first() + recalculate_order_amount( + permanence_id=60, + re_init=True + ) - for permanence in Permanence.objects.filter( - status=PERMANENCE_ARCHIVED - ).order_by('permanence_date'): - print ("Cancel %s %s" % (permanence.permanence_date, permanence.get_status_display())) - task_invoice.admin_cancel(permanence) - - for permanence in Permanence.objects.filter( - status__lt=PERMANENCE_CLOSED - ).order_by('permanence_date'): - print ("Recalculate %s %s" % (permanence.permanence_date, permanence.get_status_display())) - recalculate_order_amount( - permanence_id=permanence.id, - re_init=True - ) - reorder_offer_items(permanence.id) - for customer_invoice in CustomerInvoice.objects.filter(permanence_id=permanence.id): - delivery_point = LUT_DeliveryPoint.objects.filter( - customer_responsible=customer_invoice.customer_id - ).order_by('?').first() - if delivery_point is not None: - delivery = DeliveryBoard.objects.filter( - delivery_point_id=delivery_point.id, - permanence_id=permanence.id, - ).order_by('?').first() - customer_invoice.delivery = delivery - customer_invoice.set_delivery(customer_invoice.delivery) - if customer_invoice.is_order_confirm_send: - customer_invoice.confirm_order() - customer_invoice.save() - # if customer_invoice.is_order_confirm_send: - # confirm_customer_invoice(permanence.id, customer_invoice.customer_id) - for permanence in Permanence.objects.filter( - status__gte=PERMANENCE_CLOSED, - status__lt=PERMANENCE_INVOICED - ).order_by('permanence_date'): - # Important : Do not reclaculte if permanence is invoiced or archived. - # First, cancel the invoice / archiving. - print ("Recalculate %s %s" % (permanence.permanence_date, permanence.get_status_display())) - status = permanence.status - permanence.set_status(status) - # if status >= PERMANENCE_SEND: - recalculate_order_amount( - permanence_id=permanence.id, - re_init=True - ) - reorder_offer_items(permanence.id) - for customer_invoice in CustomerInvoice.objects.filter(permanence_id=permanence.id): - delivery_point = LUT_DeliveryPoint.objects.filter( - customer_responsible=customer_invoice.customer_id - ).order_by('?').first() - if delivery_point is not None: - print("---- %s" % delivery_point) - delivery = DeliveryBoard.objects.filter( - delivery_point_id=delivery_point.id, - permanence_id=permanence.id, - ).order_by('?').first() - customer_invoice.delivery = delivery - customer_invoice.set_delivery(customer_invoice.delivery) - if customer_invoice.is_order_confirm_send: - customer_invoice.confirm_order() - customer_invoice.save() - - for permanence in Permanence.objects.filter( - status=PERMANENCE_SEND, - highest_status__in=[PERMANENCE_INVOICED, PERMANENCE_ARCHIVED] - ).order_by( - "payment_date", "is_updated_on" - ): - # if permanence.highest_status == PERMANENCE_INVOICED: - # else: - pass + # latest_total = BankAccount.objects.filter( + # producer__isnull=True, + # customer__isnull=True, + # permanence__isnull=False + # ).only( + # "permanence" + # ).order_by( + # "-id" + # ).first() + # while latest_total: + # permanence = latest_total.permanence + # if permanence.status == PERMANENCE_INVOICED: + # print ("Cancel %s %s" % (permanence.permanence_date, permanence.get_status_display())) + # task_invoice.admin_cancel(permanence) + # else: + # latest_total.delete() + # latest_total = BankAccount.objects.filter( + # producer__isnull=True, + # customer__isnull=True, + # permanence__isnull=False + # ).only( + # "permanence" + # ).order_by( + # "-id" + # ).first() + # + # for permanence in Permanence.objects.filter( + # status=PERMANENCE_ARCHIVED + # ).order_by('permanence_date'): + # print ("Cancel %s %s" % (permanence.permanence_date, permanence.get_status_display())) + # task_invoice.admin_cancel(permanence) + # + # for permanence in Permanence.objects.filter( + # status__lt=PERMANENCE_CLOSED + # ).order_by('permanence_date'): + # print ("Recalculate %s %s" % (permanence.permanence_date, permanence.get_status_display())) + # recalculate_order_amount( + # permanence_id=permanence.id, + # re_init=True + # ) + # reorder_offer_items(permanence.id) + # for customer_invoice in CustomerInvoice.objects.filter(permanence_id=permanence.id): + # delivery_point = LUT_DeliveryPoint.objects.filter( + # customer_responsible=customer_invoice.customer_id + # ).order_by('?').first() + # if delivery_point is not None: + # delivery = DeliveryBoard.objects.filter( + # delivery_point_id=delivery_point.id, + # permanence_id=permanence.id, + # ).order_by('?').first() + # customer_invoice.delivery = delivery + # customer_invoice.set_delivery(customer_invoice.delivery) + # if customer_invoice.is_order_confirm_send: + # customer_invoice.confirm_order() + # customer_invoice.save() + # # if customer_invoice.is_order_confirm_send: + # # confirm_customer_invoice(permanence.id, customer_invoice.customer_id) + # for permanence in Permanence.objects.filter( + # status__gte=PERMANENCE_CLOSED, + # status__lt=PERMANENCE_INVOICED + # ).order_by('permanence_date'): + # # Important : Do not reclaculte if permanence is invoiced or archived. + # # First, cancel the invoice / archiving. + # print ("Recalculate %s %s" % (permanence.permanence_date, permanence.get_status_display())) + # status = permanence.status + # permanence.set_status(status) + # # if status >= PERMANENCE_SEND: + # recalculate_order_amount( + # permanence_id=permanence.id, + # re_init=True + # ) + # reorder_offer_items(permanence.id) + # for customer_invoice in CustomerInvoice.objects.filter(permanence_id=permanence.id): + # delivery_point = LUT_DeliveryPoint.objects.filter( + # customer_responsible=customer_invoice.customer_id + # ).order_by('?').first() + # if delivery_point is not None: + # print("---- %s" % delivery_point) + # delivery = DeliveryBoard.objects.filter( + # delivery_point_id=delivery_point.id, + # permanence_id=permanence.id, + # ).order_by('?').first() + # customer_invoice.delivery = delivery + # customer_invoice.set_delivery(customer_invoice.delivery) + # if customer_invoice.is_order_confirm_send: + # customer_invoice.confirm_order() + # customer_invoice.save() + # + # for permanence in Permanence.objects.filter( + # status=PERMANENCE_SEND, + # highest_status__in=[PERMANENCE_INVOICED, PERMANENCE_ARCHIVED] + # ).order_by( + # "payment_date", "is_updated_on" + # ): + # # if permanence.highest_status == PERMANENCE_INVOICED: + # # else: + # pass diff --git a/repanier/models/invoice.py b/repanier/models/invoice.py index 6e4c11d..e980c2c 100644 --- a/repanier/models/invoice.py +++ b/repanier/models/invoice.py @@ -202,11 +202,11 @@ class CustomerInvoice(models.Model): purchase.Purchase.objects.filter( customer_invoice__id=self.id ).update(quantity_confirmed=F('quantity_ordered')) - self.calculate_and_save_delta_buyinggroup() + self.calculate_and_save_delta_buyinggroup(confirm_order=True) self.is_order_confirm_send = True @transaction.atomic - def calculate_and_save_delta_buyinggroup(self): + def calculate_and_save_delta_buyinggroup(self, confirm_order=False): producer_invoice_buyinggroup = ProducerInvoice.objects.filter( producer__represent_this_buyinggroup=True, permanence_id=self.permanence_id, @@ -225,7 +225,7 @@ class CustomerInvoice(models.Model): producer_invoice_buyinggroup.delta_vat.amount -= self.delta_vat.amount producer_invoice_buyinggroup.delta_transport.amount -= self.delta_transport.amount - self.calculate_delta_price() + self.calculate_delta_price(confirm_order) self.calculate_delta_transport() producer_invoice_buyinggroup.delta_price_with_tax.amount += self.delta_price_with_tax.amount @@ -234,10 +234,11 @@ class CustomerInvoice(models.Model): producer_invoice_buyinggroup.save() - def calculate_delta_price(self): + def calculate_delta_price(self, confirm_order=False): getcontext().rounding = ROUND_HALF_UP - if self.customer_charged is None: + if self.customer_charged is None or confirm_order: + # confirm_order : the customer confirm his/her order result_set = purchase.Purchase.objects.filter( permanence_id=self.permanence_id, customer_id=self.customer_id, @@ -307,7 +308,6 @@ class CustomerInvoice(models.Model): self.delta_price_with_tax.amount = DECIMAL_ZERO self.delta_vat.amount = DECIMAL_ZERO - def calculate_delta_transport(self): self.delta_transport.amount = DECIMAL_ZERO diff --git a/repanier/models/offeritem.py b/repanier/models/offeritem.py index 5c16c01..2de98e6 100644 --- a/repanier/models/offeritem.py +++ b/repanier/models/offeritem.py @@ -348,10 +348,10 @@ class OfferItem(TranslatableModel): unit_price = self.get_unit_price(customer_price=customer_price) if len(qty_display) > 0: if self.unit_deposit.amount > DECIMAL_ZERO: - return '%s, %s + ♻ %s' % ( + return '%s; %s + ♻ %s' % ( qty_display, unit_price, self.unit_deposit) else: - return '%s, %s' % (qty_display, unit_price) + return '%s; %s' % (qty_display, unit_price) else: if self.unit_deposit.amount > DECIMAL_ZERO: return '%s + ♻ %s' % ( @@ -361,7 +361,10 @@ class OfferItem(TranslatableModel): def get_order_name(self, is_quantity_invoiced=False, box_unicode=BOX_UNICODE): - return '%s %s' % (self.long_name, self.get_qty_display(is_quantity_invoiced, box_unicode)) + qty_display = self.get_qty_display(is_quantity_invoiced, box_unicode) + if qty_display: + return '%s %s' % (self.long_name, qty_display) + return '%s' % self.long_name def get_long_name_with_producer_price(self): return self.get_long_name(customer_price=False) @@ -370,7 +373,11 @@ class OfferItem(TranslatableModel): get_long_name_with_producer_price.admin_order_field = 'translations__long_name' def get_long_name(self, is_quantity_invoiced=False, customer_price=True, box_unicode=BOX_UNICODE): - return '%s %s' % (self.long_name, self.get_qty_and_price_display(is_quantity_invoiced, customer_price, box_unicode)) + + qty_and_price_display = self.get_qty_and_price_display(is_quantity_invoiced, customer_price, box_unicode) + if qty_and_price_display: + return '%s %s' % (self.long_name, qty_and_price_display) + return '%s' % self.long_name get_long_name.short_description = (_("long_name")) get_long_name.allow_tags = False diff --git a/repanier/models/product.py b/repanier/models/product.py index 337f593..8d4fb88 100644 --- a/repanier/models/product.py +++ b/repanier/models/product.py @@ -264,10 +264,10 @@ class Product(TranslatableModel): unit_price = self.get_unit_price(customer_price=customer_price) if len(qty_display) > 0: if self.unit_deposit.amount > DECIMAL_ZERO: - return '%s, %s + ♻ %s' % ( + return '%s; %s + ♻ %s' % ( qty_display, unit_price, self.unit_deposit) else: - return '%s, %s' % (qty_display, unit_price) + return '%s; %s' % (qty_display, unit_price) else: if self.unit_deposit.amount > DECIMAL_ZERO: return '%s + ♻ %s' % ( @@ -276,8 +276,10 @@ class Product(TranslatableModel): return '%s' % unit_price def get_long_name(self, is_quantity_invoiced=False, customer_price=True, box_unicode=BOX_UNICODE): - return '%s %s' % ( - self.long_name, self.get_qty_and_price_display(is_quantity_invoiced, customer_price, box_unicode)) + qty_and_price_display = self.get_qty_and_price_display(is_quantity_invoiced, customer_price, box_unicode) + if qty_and_price_display: + return '%s %s' % (self.long_name, qty_and_price_display) + return "%s" % self.long_name get_long_name.short_description = (_("long_name")) get_long_name.allow_tags = True diff --git a/repanier/models/purchase.py b/repanier/models/purchase.py index 5a33402..acaa328 100644 --- a/repanier/models/purchase.py +++ b/repanier/models/purchase.py @@ -184,7 +184,7 @@ class Purchase(models.Model): get_delivery_display.allow_tags = False def get_quantity(self): - if self.status < PERMANENCE_SEND: + if self.status < PERMANENCE_WAIT_FOR_SEND: return self.quantity_ordered else: return self.quantity_invoiced @@ -192,19 +192,29 @@ class Purchase(models.Model): get_quantity.short_description = (_("quantity invoiced")) get_quantity.allow_tags = False + def get_producer_quantity(self): + if self.status < PERMANENCE_WAIT_FOR_SEND: + return self.quantity_ordered + else: + offer_item = self.offer_item + if offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if offer_item.order_average_weight != 0: + return (self.quantity_invoiced / offer_item.order_average_weight).quantize(FOUR_DECIMALS) + return self.quantity_invoiced + def get_long_name(self, customer_price=True): if self.offer_item is not None: if self.is_box_content: return "%s %s" % ( self.offer_item.get_long_name( - is_quantity_invoiced=self.status >= PERMANENCE_SEND, + # is_quantity_invoiced=self.status >= PERMANENCE_WAIT_FOR_SEND, customer_price=customer_price ), BOX_UNICODE ) else: return self.offer_item.get_long_name( - is_quantity_invoiced=self.status >= PERMANENCE_SEND, + # is_quantity_invoiced=self.status >= PERMANENCE_WAIT_FOR_SEND, customer_price=customer_price ) else: @@ -307,10 +317,8 @@ class Purchase(models.Model): def purchase_post_init(sender, **kwargs): purchase = kwargs["instance"] if purchase.id is not None: - if purchase.status < PERMANENCE_WAIT_FOR_SEND: - purchase.previous_quantity = purchase.quantity_ordered - else: - purchase.previous_quantity = purchase.quantity_invoiced + purchase.previous_quantity_ordered = purchase.quantity_ordered + purchase.previous_quantity_invoiced = purchase.quantity_invoiced purchase.previous_purchase_price = purchase.purchase_price.amount purchase.previous_selling_price = purchase.selling_price.amount purchase.previous_producer_vat = purchase.producer_vat.amount @@ -318,6 +326,8 @@ def purchase_post_init(sender, **kwargs): purchase.previous_deposit = purchase.deposit.amount purchase.previous_comment = purchase.comment else: + purchase.previous_quantity_ordered = DECIMAL_ZERO + purchase.previous_quantity_invoiced = DECIMAL_ZERO purchase.previous_quantity = DECIMAL_ZERO purchase.previous_purchase_price = DECIMAL_ZERO purchase.previous_selling_price = DECIMAL_ZERO @@ -332,11 +342,17 @@ def purchase_pre_save(sender, **kwargs): purchase = kwargs["instance"] if purchase.status < PERMANENCE_WAIT_FOR_SEND: quantity = purchase.quantity_ordered + delta_quantity = quantity - purchase.previous_quantity_ordered if purchase.offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + # This quantity is used to calculate the price + # The unit price is for 1 kg. + # 1 = 1 piece of order_average_weight + # 2 = 2 pices of order_average_weight quantity *= purchase.offer_item.order_average_weight + else: quantity = purchase.quantity_invoiced - delta_quantity = quantity - purchase.previous_quantity + delta_quantity = quantity - purchase.previous_quantity_invoiced if purchase.is_box_content: purchase.is_resale_price_fixed = True if delta_quantity != DECIMAL_ZERO: @@ -415,10 +431,8 @@ def purchase_pre_save(sender, **kwargs): total_profit=F('total_profit') + delta_profit ) # Do not do it twice - if purchase.status < PERMANENCE_WAIT_FOR_SEND: - purchase.previous_quantity = purchase.quantity_ordered - else: - purchase.previous_quantity = purchase.quantity_invoiced + purchase.previous_quantity_ordered = purchase.quantity_ordered + purchase.previous_quantity_invoiced = purchase.quantity_invoiced purchase.previous_purchase_price = purchase.purchase_price.amount purchase.previous_selling_price = purchase.selling_price.amount diff --git a/repanier/task/task_invoice.py b/repanier/task/task_invoice.py index 439b2ba..5dc12ce 100644 --- a/repanier/task/task_invoice.py +++ b/repanier/task/task_invoice.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import thread +import threading from django.contrib import messages from django.utils.translation import ugettext_lazy as _ @@ -670,7 +670,9 @@ def admin_cancel(permanence): def admin_send(permanence): if permanence.status == PERMANENCE_INVOICED: - thread.start_new_thread(email_invoice.send_invoice, (permanence.id,)) + # thread.start_new_thread(email_invoice.send_invoice, (permanence.id,)) + 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 else: diff --git a/repanier/task/task_order.py b/repanier/task/task_order.py index fcda2f2..45d0d63 100644 --- a/repanier/task/task_order.py +++ b/repanier/task/task_order.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- import datetime -import thread +import threading import uuid from django.conf import settings @@ -19,10 +19,8 @@ from repanier.models import OfferItem from repanier.models import Permanence from repanier.models import Producer from repanier.models import Product -from repanier.tools import clean_offer_item -from repanier.tools import recalculate_order_amount, create_or_update_one_purchase, get_or_create_offer_item, \ - add_months, \ - reorder_offer_items +from repanier.tools import clean_offer_item, reorder_purchases +from repanier.tools import recalculate_order_amount, create_or_update_one_purchase, reorder_offer_items @transaction.atomic @@ -261,13 +259,17 @@ def admin_open_and_send(request, permanence, do_not_send_any_mail=False): else: permanence.set_status(PERMANENCE_WAIT_FOR_PRE_OPEN) # pre_open_order(permanence.id) - thread.start_new_thread(pre_open_order, (permanence.id,)) + # thread.start_new_thread(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: permanence.set_status(PERMANENCE_WAIT_FOR_OPEN) # open_order(permanence.id) - thread.start_new_thread(open_order, (permanence.id, do_not_send_any_mail)) + # thread.start_new_thread(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 return user_message, user_message_level @@ -417,9 +419,14 @@ def close_order(permanence, all_producers, producers_id=None): @transaction.atomic -def send_order(permanence, all_producers, producers_id=None, deliveries_id=None): +def send_order(permanence, all_producers=True, producers_id=None, deliveries_id=None): + recalculate_order_amount( + permanence_id=permanence.id, + send_to_producer=True + ) + reorder_purchases(permanence.id) try: - email_order.email_order(permanence.id, all_producers, closed_deliveries_id=deliveries_id, producers_id=producers_id) + email_order.email_order(permanence.id, all_producers, producers_id=producers_id, closed_deliveries_id=deliveries_id) except Exception as error_str: print("################################## send_order") print(error_str) @@ -491,7 +498,10 @@ def close_send_order(permanence_id, all_producers, producers_id=None, deliveries def admin_close(permanence_id, all_producers=False, deliveries_id=None, producers_id=None): # close_send_order(permanence_id, deliveries_id, False, False) - thread.start_new_thread(close_send_order, (permanence_id, all_producers, producers_id, deliveries_id, False)) + # thread.start_new_thread(close_send_order, (permanence_id, all_producers, producers_id, deliveries_id, False)) + t = threading.Thread(target=close_send_order, + args=(permanence_id, all_producers, producers_id, deliveries_id, False)) + t.start() user_message = _("The orders are being closed.") user_message_level = messages.INFO return user_message, user_message_level @@ -499,7 +509,10 @@ def admin_close(permanence_id, all_producers=False, deliveries_id=None, producer def admin_send(permanence_id, all_producers=False, deliveries_id=None, producers_id=None): # close_send_order(permanence_id, deliveries_id, True) - thread.start_new_thread(close_send_order, (permanence_id, all_producers, producers_id, deliveries_id, True)) + # thread.start_new_thread(close_send_order, (permanence_id, all_producers, producers_id, deliveries_id, True)) + t = threading.Thread(target=close_send_order, + args=(permanence_id, all_producers, producers_id, deliveries_id, True)) + t.start() user_message = _("The orders are being send.") user_message_level = messages.INFO return user_message, user_message_level diff --git a/repanier/tools.py b/repanier/tools.py index dc1a406..d7af9c8 100644 --- a/repanier/tools.py +++ b/repanier/tools.py @@ -5,7 +5,14 @@ import calendar import datetime import json import time -import urllib2 + +try: + # For Python 3.0 and later + from urllib.request import urlopen +except ImportError: + # Fall back to Python 2's urllib2 + from urllib2 import urlopen + from smtplib import SMTPRecipientsRefused from django.conf import settings @@ -16,7 +23,7 @@ from django.core.mail import EmailMessage, mail_admins from django.core.serializers.json import DjangoJSONEncoder from django.db import transaction from django.db.models import F -from django.db.models import Q, Sum +from django.db.models import Q from django.http import Http404 from django.template.loader import render_to_string from django.utils import timezone @@ -25,7 +32,6 @@ from django.utils.formats import number_format from django.utils.safestring import mark_safe from django.utils.text import slugify from django.utils.translation import ugettext_lazy as _ -from parler.models import TranslationDoesNotExist from six import string_types import models @@ -375,8 +381,10 @@ def get_preparator_unit(order_unit=PRODUCT_ORDER_UNIT_PC): return unit -def get_base_unit(qty=0, order_unit=PRODUCT_ORDER_UNIT_PC, status=None): - if order_unit == PRODUCT_ORDER_UNIT_KG or (status >= PERMANENCE_SEND and order_unit == PRODUCT_ORDER_UNIT_PC_KG): +def get_base_unit(qty=0, order_unit=PRODUCT_ORDER_UNIT_PC, status=None, producer=False): + if order_unit == PRODUCT_ORDER_UNIT_KG or ( + status >= PERMANENCE_SEND and order_unit == PRODUCT_ORDER_UNIT_PC_KG and not producer + ): if qty == DECIMAL_ZERO: base_unit = EMPTY_STRING else: @@ -710,11 +718,9 @@ def payment_message(customer, permanence): def recalculate_order_amount(permanence_id, - customer_id=None, offer_item_qs=None, - producers_id=None, - send_to_producer=False, - re_init=False): + re_init=False, + send_to_producer=False): if send_to_producer or re_init: models.ProducerInvoice.objects.filter( permanence_id=permanence_id @@ -759,35 +765,31 @@ def recalculate_order_amount(permanence_id, offer_item.previous_add_2_stock = DECIMAL_ZERO offer_item.save() - if customer_id is None: - if offer_item_qs is not None: - purchase_set = models.Purchase.objects \ - .filter(permanence_id=permanence_id, offer_item__in=offer_item_qs) \ - .order_by('?') - else: - purchase_set = models.Purchase.objects \ - .filter(permanence_id=permanence_id) \ - .order_by('?') + if offer_item_qs is not None: + purchase_set = models.Purchase.objects \ + .filter(permanence_id=permanence_id, offer_item__in=offer_item_qs) \ + .order_by('?') else: purchase_set = models.Purchase.objects \ - .filter(permanence_id=permanence_id, customer_id=customer_id) \ + .filter(permanence_id=permanence_id) \ .order_by('?') for purchase in purchase_set.select_related("offer_item"): - # Recalcuate the total_price_with_tax of ProducerInvoice, + # Recalculate the total_price_with_tax of ProducerInvoice, # the total_price_with_tax of CustomerInvoice, # the total_purchase_with_tax + total_selling_with_tax of CustomerProducerInvoice, # and quantity_invoiced + total_purchase_with_tax + total_selling_with_tax of OfferItem - offer_item = purchase.offer_item if send_to_producer or re_init: # purchase.admin_update = True - purchase.previous_quantity = DECIMAL_ZERO + purchase.previous_quantity_ordered = DECIMAL_ZERO + purchase.previous_quantity_invoiced = DECIMAL_ZERO purchase.previous_purchase_price = DECIMAL_ZERO purchase.previous_selling_price = DECIMAL_ZERO purchase.previous_producer_vat = DECIMAL_ZERO purchase.previous_customer_vat = DECIMAL_ZERO purchase.previous_deposit = DECIMAL_ZERO if send_to_producer: + offer_item = purchase.offer_item if offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: purchase.quantity_invoiced = (purchase.quantity_ordered * offer_item.order_average_weight) \ .quantize(FOUR_DECIMALS) @@ -795,9 +797,6 @@ def recalculate_order_amount(permanence_id, purchase.quantity_invoiced = purchase.quantity_ordered purchase.save() - if send_to_producer: - reorder_purchases(permanence_id) - def display_selected_value(offer_item, quantity_ordered): if offer_item.may_order: @@ -896,6 +895,7 @@ def display_selected_box_value(customer, offer_item, box_purchase): @transaction.atomic def update_or_create_purchase(customer=None, offer_item_id=None, q_order=None, value_id=None, basket=False, batch_job=False, comment=EMPTY_STRING): + from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS to_json = [] if offer_item_id is not None and (q_order is not None or value_id is not None) and customer is not None: offer_item = models.OfferItem.objects.select_for_update(nowait=False) \ @@ -1055,7 +1055,7 @@ def update_or_create_purchase(customer=None, offer_item_id=None, q_order=None, v if customer_invoice is not None and permanence is not None: order_amount = customer_invoice.get_total_price_with_tax() status_changed = customer_invoice.cancel_confirm_order() - if apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS and status_changed: + if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS and status_changed: html = render_to_string( 'repanier/communication_confirm_order.html') option_dict = {'id': "#communication", 'html': html} @@ -1077,7 +1077,9 @@ def update_or_create_purchase(customer=None, offer_item_id=None, q_order=None, v def my_basket(is_order_confirm_send, order_amount, to_json): - if not is_order_confirm_send and apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: + from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS + + if not is_order_confirm_send and REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: msg_html = ' %s    ' % ( order_amount,) else: @@ -1091,6 +1093,8 @@ def my_basket(is_order_confirm_send, order_amount, to_json): def my_order_confirmation(permanence, customer_invoice, is_basket=False, basket_message=EMPTY_STRING, to_json=None): + from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS + if permanence.with_delivery_point: if customer_invoice.delivery is not None: label = customer_invoice.delivery.get_delivery_customer_display() @@ -1192,7 +1196,7 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False, else: msg_delivery = EMPTY_STRING msg_confirmation1 = EMPTY_STRING - if not is_basket and not apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: + if not is_basket and not REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: # or customer_invoice.total_price_with_tax.amount != DECIMAL_ZERO: # If apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS is True, # then permanence.with_delivery_point is also True @@ -1215,7 +1219,7 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False, msg_html = None btn_disabled = EMPTY_STRING if permanence.status == PERMANENCE_OPENED else "disabled" msg_confirmation2 = EMPTY_STRING - if apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: + if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: if is_basket: if customer_invoice.status == PERMANENCE_OPENED: if (permanence.with_delivery_point and customer_invoice.delivery is None) \ @@ -1289,12 +1293,14 @@ def my_order_confirmation(permanence, customer_invoice, is_basket=False, def my_order_confirmation_email_send_to(customer): + from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS + if customer is not None and customer.email2: to_email = (customer.user.email, customer.email2) else: to_email = (customer.user.email,) sent_to = ", ".join(to_email) if to_email is not None else EMPTY_STRING - if apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: + if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: msg_confirmation = _( "Your order is confirmed. An email containing this order summary has been sent to %s.") % sent_to else: @@ -1306,7 +1312,7 @@ def create_or_update_one_purchase( customer_id, offer_item, permanence_date=None, status=PERMANENCE_OPENED, q_order=None, batch_job=False, is_box_content=False, comment=EMPTY_STRING): - + from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS # The batch_job flag is used because we need to forbid # customers to add purchases during the close_orders_async or other batch_job process # when the status is PERMANENCE_WAIT_FOR_SEND @@ -1375,7 +1381,7 @@ def create_or_update_one_purchase( if purchase is not None: purchase.set_comment(comment) if q_order <= q_alert: - if purchase.quantity_confirmed <= q_order: + if not REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS or purchase.quantity_confirmed <= q_order: purchase.quantity_ordered = q_order purchase.save() else: @@ -1636,7 +1642,7 @@ def producer_web_services_activated(reference_site=None): web_service_version = None if reference_site is not None and len(reference_site) > 0: try: - web_services = urllib2.urlopen( + web_services = urlopen( '%s%s' % (reference_site, urlresolvers.reverse('version_rest')), timeout=0.5 ) @@ -1660,8 +1666,9 @@ def add_months(sourcedate, months): def calc_basket_message(customer, permanence, status): + from repanier.apps import REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS if status == PERMANENCE_OPENED: - if apps.REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: + if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS: if permanence.with_delivery_point: you_can_change = "
%s" % ( _("You can increase the order quantities as long as the orders are open for your delivery point."), diff --git a/repanier/views/btn_confirm_order_ajax.py b/repanier/views/btn_confirm_order_ajax.py index 390a314..9999cec 100644 --- a/repanier/views/btn_confirm_order_ajax.py +++ b/repanier/views/btn_confirm_order_ajax.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import json +from django.contrib.auth.decorators import login_required from django.core.serializers.json import DjangoJSONEncoder from django.http import Http404 from django.http import HttpResponse @@ -12,7 +13,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views.decorators.cache import never_cache from django.views.decorators.http import require_GET -from repanier.const import PERMANENCE_CLOSED, DECIMAL_ZERO +from repanier.const import DECIMAL_ZERO from repanier.email.email_order import export_order_2_1_customer from repanier.models import Customer, CustomerInvoice, Permanence from repanier.tools import sint, get_signature, my_basket, my_order_confirmation, calc_basket_message @@ -20,14 +21,12 @@ from repanier.tools import sint, get_signature, my_basket, my_order_confirmation @never_cache @require_GET -# @login_required +@login_required 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: diff --git a/repanier/views/send_mail_to_all_members_view.py b/repanier/views/send_mail_to_all_members_view.py index 513b491..9f01087 100644 --- a/repanier/views/send_mail_to_all_members_view.py +++ b/repanier/views/send_mail_to_all_members_view.py @@ -1,9 +1,8 @@ # -*- coding: utf-8 from __future__ import unicode_literals -import thread +import threading from django import forms -from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.mail import EmailMessage from django.forms import Textarea @@ -15,7 +14,6 @@ from django.views.decorators.cache import never_cache from django.views.decorators.csrf import csrf_protect from djng.forms import NgFormValidationMixin -from repanier.const import EMPTY_STRING from repanier.models import Customer, Staff from repanier.tools import send_email from repanier.views.forms import RepanierForm @@ -73,7 +71,9 @@ def send_mail_to_all_members_view(request): cc=to_email_customer ) # send_email(email=email, from_name=user_customer.long_basket_name) - thread.start_new_thread(send_email,(email, user_customer.long_basket_name, True)) + # thread.start_new_thread(send_email,(email, user_customer.long_basket_name, True)) + t = threading.Thread(target=send_email, args=(email, user_customer.long_basket_name, True)) + t.start() email = form.fields["your_email"] email.initial = request.user.email email.widget.attrs['readonly'] = True diff --git a/repanier/views/send_mail_to_coordinators_view.py b/repanier/views/send_mail_to_coordinators_view.py index 291c951..2f0f344 100644 --- a/repanier/views/send_mail_to_coordinators_view.py +++ b/repanier/views/send_mail_to_coordinators_view.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 from __future__ import unicode_literals -import thread +import threading from django import forms from django.conf import settings from django.contrib.auth.decorators import login_required @@ -102,7 +102,9 @@ def send_mail_to_coordinators_view(request): cc=to_email_staff ) # send_email(email=email) - thread.start_new_thread(send_email, (email,)) + # thread.start_new_thread(send_email, (email,)) + t = threading.Thread(target=send_email, args=(email,)) + t.start() # return HttpResponseRedirect('/') email = form.fields["your_email"] email.initial = request.user.email diff --git a/repanier/xlsx/xlsx_order.py b/repanier/xlsx/xlsx_order.py index 2ae59c5..2b0c91d 100644 --- a/repanier/xlsx/xlsx_order.py +++ b/repanier/xlsx/xlsx_order.py @@ -41,47 +41,47 @@ def export_abstract(permanence, deliveries_id=None, group=False, wb=None): (_('email'), 35), ] wb, ws = new_portrait_a4_sheet(wb, permanence, EMPTY_STRING, header=header, add_print_title=False) - customer_set = Customer.objects.filter( - customerinvoice__permanence_id=permanence.id, - represent_this_buyinggroup=False, - customerinvoice__delivery__isnull=True - ) - for customer in customer_set: - invoice = CustomerInvoice.objects.filter( - permanence=permanence, customer=customer - ).order_by('?').first() - if invoice is not None and invoice.total_price_with_tax.amount != DECIMAL_ZERO: - customer.preparation_order = preparation_order - customer.save(update_fields=['preparation_order']) - preparation_order += 1 - if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS and not invoice.is_order_confirm_send: - confirmed = _(" /!\ Unconfirmed") - else: - confirmed = EMPTY_STRING - row = [ - "N/A", - " %d - %s%s" % (customer.preparation_order, customer.long_basket_name, confirmed), - customer.phone1, - customer.phone2, - invoice.total_price_with_tax.amount, - # Used to send mail to customer with an order (via copy-paste to mail) - ";".join( - [customer.user.email, customer.email2, EMPTY_STRING] - ) if customer.email2 else ";".join( - [customer.user.email, customer.email2] - ) - ] - for col_num in range(len(row)): - c = ws.cell(row=row_num, column=col_num) - c.value = row[col_num] - if col_num == 4: - c.style.number_format.format_code = repanier.apps.REPANIER_SETTINGS_CURRENCY_XLSX - else: - c.style.number_format.format_code = NumberFormat.FORMAT_TEXT - c.style.alignment.wrap_text = False - if row_num % 2 == 0: - c.style.borders.bottom.border_style = Border.BORDER_THIN - row_num += 1 + # customer_set = Customer.objects.filter( + # customerinvoice__permanence_id=permanence.id, + # represent_this_buyinggroup=False, + # customerinvoice__delivery__isnull=True + # ) + # for customer in customer_set: + # invoice = CustomerInvoice.objects.filter( + # permanence=permanence, customer=customer + # ).order_by('?').first() + # if invoice is not None and invoice.total_price_with_tax.amount != DECIMAL_ZERO: + # customer.preparation_order = preparation_order + # customer.save(update_fields=['preparation_order']) + # preparation_order += 1 + # if REPANIER_SETTINGS_CUSTOMERS_MUST_CONFIRM_ORDERS and not invoice.is_order_confirm_send: + # confirmed = _(" /!\ Unconfirmed") + # else: + # confirmed = EMPTY_STRING + # row = [ + # "N/A", + # " %d - %s%s" % (customer.preparation_order, customer.long_basket_name, confirmed), + # customer.phone1, + # customer.phone2, + # invoice.total_price_with_tax.amount, + # # Used to send mail to customer with an order (via copy-paste to mail) + # ";".join( + # [customer.user.email, customer.email2, EMPTY_STRING] + # ) if customer.email2 else ";".join( + # [customer.user.email, customer.email2] + # ) + # ] + # for col_num in range(len(row)): + # c = ws.cell(row=row_num, column=col_num) + # c.value = row[col_num] + # if col_num == 4: + # c.style.number_format.format_code = repanier.apps.REPANIER_SETTINGS_CURRENCY_XLSX + # else: + # c.style.number_format.format_code = NumberFormat.FORMAT_TEXT + # c.style.alignment.wrap_text = False + # if row_num % 2 == 0: + # c.style.borders.bottom.border_style = Border.BORDER_THIN + # row_num += 1 for delivery_ref, delivery in enumerate(DeliveryBoard.objects.filter(id__in=deliveries_id).order_by("id")): customer_set = Customer.objects.filter( customerinvoice__permanence_id=permanence.id, @@ -469,12 +469,13 @@ def export_preparation_for_a_delivery(delivery_cpt, delivery_id, header, permane if department_for_customer_save is not None else EMPTY_STRING while purchase is not None and customer_save.id == purchase.customer_id \ and department_for_customer_save == purchase.offer_item.department_for_customer: - qty = purchase.get_quantity() + qty = purchase.get_producer_quantity() if qty != DECIMAL_ZERO: base_unit = get_base_unit( qty, purchase.offer_item.order_unit, - purchase.status + purchase.status, + producer=True ) c = ws.cell(row=row_num, column=0) c.value = purchase.id @@ -513,7 +514,7 @@ def export_preparation_for_a_delivery(delivery_cpt, delivery_id, header, permane c.value = "%s" % base_unit c.style.number_format.format_code = NumberFormat.FORMAT_TEXT customer_unit_price = purchase.get_customer_unit_price() - if purchase.status < PERMANENCE_SEND and purchase.offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if purchase.offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: price_qty = qty * purchase.offer_item.order_average_weight purchases_price_formula.append('ROUND(H%s*%s*%s,2)' % \ (row_num + 1, @@ -559,7 +560,8 @@ def export_preparation_for_a_delivery(delivery_cpt, delivery_id, header, permane [str(purchases_price)], True, wb, None, None, yellowFill ) - row_num -= 1 + if at_least_one_product: + row_num -= 1 ############################################################################################################################# else: # Using quantity_for_preparation_sort_order the order is by customer__short_basket_name if the product @@ -596,12 +598,13 @@ def export_preparation_for_a_delivery(delivery_cpt, delivery_id, header, permane purchases_quantity = DECIMAL_ZERO row_num += 1 while purchase is not None and offer_item_save == purchase.offer_item: - qty = purchase.get_quantity() + qty = purchase.get_producer_quantity() if qty != DECIMAL_ZERO: base_unit = get_base_unit( qty, offer_item_save.order_unit, - purchase.status + purchase.status, + producer=True ) c = ws.cell(row=row_num, column=0) c.value = purchase.id @@ -641,7 +644,7 @@ def export_preparation_for_a_delivery(delivery_cpt, delivery_id, header, permane c = ws.cell(row=row_num, column=8) c.value = "%s" % base_unit c.style.number_format.format_code = NumberFormat.FORMAT_TEXT - if purchase.status < PERMANENCE_SEND and offer_item_save.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if offer_item_save.order_unit == PRODUCT_ORDER_UNIT_PC_KG: c = ws.cell(row=row_num, column=9) if offer_item_save.wrapped: c.value = "%s :" % repanier.apps.REPANIER_SETTINGS_CURRENCY_DISPLAY @@ -766,12 +769,13 @@ def export_producer_by_product(permanence, producer, wb=None): # Don't purchase anything to the producer in this case qty = DECIMAL_ZERO else: - qty = purchase.get_quantity() + qty = purchase.get_producer_quantity() if qty != DECIMAL_ZERO: base_unit = get_base_unit( qty, offer_item.order_unit, - status + status, + producer=True ) c = ws.cell(row=row_num, column=0) c.value = "%d - %s" % (purchase.customer.preparation_order, purchase.customer.short_basket_name) @@ -826,7 +830,7 @@ def export_producer_by_product(permanence, producer, wb=None): c.style.number_format.format_code = repanier.apps.REPANIER_SETTINGS_CURRENCY_XLSX c.style.borders.bottom.border_style = Border.BORDER_THIN c = ws.cell(row=row_num, column=7) - if status < PERMANENCE_SEND and offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: price_qty = qty * offer_item.order_average_weight c.value = '=ROUND(B%s*%s*(F%s+G%s),2)' % ( row_num + 1, offer_item.order_average_weight, row_num + 1, row_num + 1) @@ -851,13 +855,14 @@ def export_producer_by_product(permanence, producer, wb=None): if qty != DECIMAL_ZERO: # Important : in this case, the qty comes from offer item. # Offer item contains weight, not pieces - if status == PERMANENCE_WAIT_FOR_SEND: + if status >= PERMANENCE_WAIT_FOR_SEND: if offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG and offer_item.order_average_weight > DECIMAL_ZERO: qty = (qty / offer_item.order_average_weight).quantize(TWO_DECIMALS) base_unit = get_base_unit( qty, offer_item.order_unit, - status + status, + producer=True ) c = ws.cell(row=row_num, column=0) c.value = repanier.apps.REPANIER_SETTINGS_GROUP_NAME @@ -908,7 +913,7 @@ def export_producer_by_product(permanence, producer, wb=None): c.style.number_format.format_code = repanier.apps.REPANIER_SETTINGS_CURRENCY_XLSX c.style.borders.bottom.border_style = Border.BORDER_THIN c = ws.cell(row=row_num, column=7) - if status < PERMANENCE_SEND and offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if offer_item.order_unit == PRODUCT_ORDER_UNIT_PC_KG: price_qty = qty * offer_item.order_average_weight c.value = '=ROUND(B%s*%s*(F%s+G%s),2)' % ( row_num + 1, offer_item.order_average_weight, row_num + 1, row_num + 1) @@ -1028,13 +1033,14 @@ def export_producer_by_customer(permanence, producer, wb=None): row_start_customer = row_num first_purchase = True while purchase is not None and customer_save.id == purchase.customer_id: - qty = purchase.get_quantity() + qty = purchase.get_producer_quantity() if qty != DECIMAL_ZERO: offer_item_save = purchase.offer_item base_unit = get_base_unit( qty, purchase.offer_item.order_unit, - purchase.status + purchase.status, + producer=True ) c = ws.cell(row=row_num, column=0) c.value = qty @@ -1075,7 +1081,7 @@ def export_producer_by_customer(permanence, producer, wb=None): c.style.number_format.format_code = repanier.apps.REPANIER_SETTINGS_CURRENCY_XLSX c.style.borders.bottom.border_style = Border.BORDER_THIN c = ws.cell(row=row_num, column=6) - if purchase.status < PERMANENCE_SEND and offer_item_save.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if offer_item_save.order_unit == PRODUCT_ORDER_UNIT_PC_KG: c.value = '=ROUND(A%s*%s*(E%s+F%s),2)' % ( row_num + 1, offer_item_save.order_average_weight, row_num + 1, row_num + 1) else: @@ -1279,12 +1285,13 @@ def export_customer_for_a_delivery( hide_column_placement = False if producer_save != offer_item_save.producer: hide_column_producer = False - qty = purchase.get_quantity() + qty = purchase.get_producer_quantity() if deposit or qty != DECIMAL_ZERO: base_unit = get_base_unit( qty, offer_item_save.order_unit, - purchase.status + purchase.status, + producer=True ) c = ws.cell(row=row_num, column=0) c.value = purchase.id @@ -1343,7 +1350,7 @@ def export_customer_for_a_delivery( c.style.number_format.format_code = repanier.apps.REPANIER_SETTINGS_CURRENCY_XLSX c.style.borders.bottom.border_style = Border.BORDER_THIN c = ws.cell(row=row_num, column=9) - if purchase.status < PERMANENCE_SEND and offer_item_save.order_unit == PRODUCT_ORDER_UNIT_PC_KG: + if offer_item_save.order_unit == PRODUCT_ORDER_UNIT_PC_KG: price_qty = qty * offer_item_save.order_average_weight c.value = '=ROUND(F%s*%s*(H%s+I%s),2)' % ( row_num + 1, offer_item_save.order_average_weight, row_num + 1, row_num + 1) -- 2.22.0