Allow to exclude free products from invoices

This commit is contained in:
Raphael Michel
2017-07-14 12:07:29 +02:00
parent 0ab6ac569e
commit 6ea798e55b
7 changed files with 66 additions and 3 deletions

View File

@@ -3,6 +3,7 @@ from decimal import Decimal
from django.core.files.base import ContentFile
from django.db import transaction
from django.db.models import Count
from django.utils import timezone
from django.utils.translation import pgettext, ugettext as _
from i18nfield.strings import LazyI18nString
@@ -47,9 +48,16 @@ def build_invoice(invoice: Invoice) -> Invoice:
invoice.save()
invoice.lines.all().delete()
positions = list(invoice.order.positions.select_related('addon_to', 'item', 'variation'))
positions = list(
invoice.order.positions.select_related('addon_to', 'item', 'variation').annotate(
addon_c=Count('addons')
)
)
positions.sort(key=lambda p: p.sort_key)
for p in positions:
if not invoice.event.settings.invoice_include_free and p.price == Decimal('0.00') and not p.addon_c:
continue
desc = str(p.item.name)
if p.variation:
desc += " - " + str(p.variation.value)

View File

@@ -545,6 +545,7 @@ class OrderChangeManager:
self._totaldiff = 0
self._quotadiff = Counter()
self._operations = []
self._invoice_dirty = False
def change_item(self, position: OrderPosition, item: Item, variation: Optional[ItemVariation]):
if (not variation and item.has_variations) or (variation and variation.item_id != item.pk):
@@ -560,6 +561,9 @@ class OrderChangeManager:
if not new_quotas:
raise OrderError(self.error_messages['quota_missing'])
if self.order.event.settings.invoice_include_free or price != Decimal('0.00') or position.price != Decimal('0.00'):
self._invoice_dirty = True
self._totaldiff = price - position.price
self._quotadiff.update(new_quotas)
self._quotadiff.subtract(position.quotas)
@@ -576,6 +580,9 @@ class OrderChangeManager:
if not new_quotas:
raise OrderError(self.error_messages['quota_missing'])
if self.order.event.settings.invoice_include_free or price != Decimal('0.00') or position.price != Decimal('0.00'):
self._invoice_dirty = True
self._totaldiff = price - position.price
self._quotadiff.update(new_quotas)
self._quotadiff.subtract(position.quotas)
@@ -583,6 +590,10 @@ class OrderChangeManager:
def change_price(self, position: OrderPosition, price: Decimal):
self._totaldiff = price - position.price
if self.order.event.settings.invoice_include_free or price != Decimal('0.00') or position.price != Decimal('0.00'):
self._invoice_dirty = True
self._operations.append(self.PriceOperation(position, price))
def cancel(self, position: OrderPosition):
@@ -590,6 +601,9 @@ class OrderChangeManager:
self._quotadiff.subtract(position.quotas)
self._operations.append(self.CancelOperation(position))
if self.order.event.settings.invoice_include_free or position.price != Decimal('0.00'):
self._invoice_dirty = True
def add_position(self, item: Item, variation: ItemVariation, price: Decimal, addon_to: Order = None,
subevent: SubEvent = None):
if price is None:
@@ -609,6 +623,9 @@ class OrderChangeManager:
if not new_quotas:
raise OrderError(self.error_messages['quota_missing'])
if self.order.event.settings.invoice_include_free or price != Decimal('0.00'):
self._invoice_dirty = True
self._totaldiff = price
self._quotadiff.update(new_quotas)
self._operations.append(self.AddOperation(item, variation, price, addon_to, subevent))
@@ -730,7 +747,7 @@ class OrderChangeManager:
def _reissue_invoice(self):
i = self.order.invoices.filter(is_cancellation=False).last()
if i:
if i and self._invoice_dirty:
generate_cancellation(i)
generate_invoice(self.order)

View File

@@ -53,6 +53,10 @@ DEFAULTS = {
'default': 'False',
'type': bool,
},
'invoice_include_free': {
'default': 'True',
'type': bool,
},
'invoice_numbers_consecutive': {
'default': 'True',
'type': bool,

View File

@@ -440,6 +440,12 @@ class InvoiceSettingsForm(SettingsForm):
widget=forms.CheckboxInput(attrs={'data-checkbox-dependency': '#id_invoice_address_asked'}),
required=False
)
invoice_include_free = forms.BooleanField(
label=_("Show free products on invoices"),
help_text=_("Note that invoices will never be generated for orders that contain only free "
"products."),
required=False
)
invoice_numbers_consecutive = forms.BooleanField(
label=_("Generate invoices with consecutive numbers"),
help_text=_("If deactivated, the order code will be used in the invoice number."),

View File

@@ -14,6 +14,7 @@
{% bootstrap_field form.invoice_generate layout="horizontal" %}
{% bootstrap_field form.invoice_renderer layout="horizontal" %}
{% bootstrap_field form.invoice_language layout="horizontal" %}
{% bootstrap_field form.invoice_include_free layout="horizontal" %}
{% bootstrap_field form.invoice_address_from layout="horizontal" %}
{% bootstrap_field form.invoice_introductory_text layout="horizontal" %}
{% bootstrap_field form.invoice_additional_text layout="horizontal" %}