@@ -285,6 +285,10 @@ class Invoice(models.Model): # noqa: PLR0904
285285 blank = True ,
286286 help_text = "Due date / Quote validity, keep blank unless specific terms are needed" ,
287287 )
288+ tax_date = models .DateField (
289+ blank = True ,
290+ help_text = "Date of taxable supply, keep blank for issue date" ,
291+ )
288292
289293 kind = models .IntegerField (choices = InvoiceKind )
290294 category = models .IntegerField (
@@ -355,6 +359,9 @@ def save( # type: ignore[override]
355359 if self .extra is None :
356360 self .extra = {}
357361 extra_fields : list [str ] = []
362+ if not self .tax_date :
363+ self .tax_date = self .issue_date
364+ extra_fields .append ("tax_date" )
358365 if not self .due_date :
359366 self .due_date = self .issue_date + datetime .timedelta (
360367 days = self .get_due_delta ()
@@ -415,7 +422,7 @@ def render_amount(self, amount: int | Decimal) -> str:
415422 @cached_property
416423 def exchange_rate_czk (self ) -> Decimal :
417424 """Exchange rate from currency to CZK."""
418- return ExchangeRates .get (self .get_currency_display (), self .issue_date )
425+ return ExchangeRates .get (self .get_currency_display (), self .tax_date )
419426
420427 @cached_property
421428 def bank_account (self ) -> BankAccountInfo :
@@ -424,7 +431,7 @@ def bank_account(self) -> BankAccountInfo:
424431 @cached_property
425432 def exchange_rate_eur (self ) -> Decimal :
426433 """Exchange rate from currency to EUR."""
427- return ExchangeRates .get ("EUR" , self .issue_date ) / self .exchange_rate_czk
434+ return ExchangeRates .get ("EUR" , self .tax_date ) / self .exchange_rate_czk
428435
429436 @cached_property
430437 def total_items_amount (self ) -> Decimal :
@@ -699,6 +706,7 @@ def duplicate( # noqa: PLR0913
699706 extra : dict [str , int ] | None = None ,
700707 customer_reference : str | None = None ,
701708 customer_note : str | None = None ,
709+ tax_date : datetime .date | None = None ,
702710 ) -> Invoice :
703711 """Create a final invoice from draft/proforma upon payment."""
704712 invoice = Invoice .objects .create (
@@ -710,6 +718,7 @@ def duplicate( # noqa: PLR0913
710718 discount = self .discount ,
711719 vat_rate = self .vat_rate ,
712720 currency = self .currency ,
721+ tax_date = cast ("datetime.date" , tax_date ),
713722 parent = self ,
714723 prepaid = prepaid ,
715724 extra = extra if extra is not None else self .extra ,
@@ -863,7 +872,7 @@ def save( # type: ignore[override]
863872 self .unit_price = ExchangeRates .convert_from_eur (
864873 self .package .price ,
865874 self .invoice .get_currency_display (),
866- self .invoice .issue_date ,
875+ self .invoice .tax_date ,
867876 )
868877 extra_fields .append ("unit_price" )
869878 if not self .description :
0 commit comments