""" Author: Michel Peltriaux Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 18.08.22 """ from django import forms from django.utils.translation import pgettext_lazy as _con, gettext_lazy as _ from konova.forms.modals import RemoveModalForm, BaseModalForm from konova.utils import validators from konova.utils.message_templates import PAYMENT_EDITED class NewPaymentForm(BaseModalForm): """ Form handling payment related input """ amount = forms.DecimalField( min_value=0.00, decimal_places=2, label=_con("money", "Amount"), # contextual translation label_suffix=_(""), help_text=_("in Euro"), widget=forms.NumberInput( attrs={ "class": "form-control", "placeholder": "0,00", } ) ) due = forms.DateField( label=_("Due on"), label_suffix=_(""), required=False, validators=[validators.reasonable_date], help_text=_("Due on which date"), widget=forms.DateInput( attrs={ "type": "date", "data-provide": "datepicker", "class": "form-control", }, format="%d.%m.%Y" ) ) comment = forms.CharField( max_length=200, required=False, label=_("Comment"), label_suffix=_(""), help_text=_("Additional comment, maximum {} letters").format(200), widget=forms.Textarea( attrs={ "rows": 5, "class": "form-control" } ) ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.intervention = self.instance self.form_title = _("Payment") self.form_caption = _("Add a payment for intervention '{}'").format(self.intervention.title) def is_valid(self): """ Checks on form validity. For this form we need to make sure that a date or a comment is set. If both are missing, the user needs to enter at least an explanation why there is no date to be entered. Returns: is_valid (bool): True if valid, False otherwise """ super_valid = super().is_valid() if not super_valid: return super_valid date = self.cleaned_data.get("due", None) comment = self.cleaned_data.get("comment", None) if not date and not comment: # At least one needs to be set! self.add_error( "comment", _("If there is no date you can enter, please explain why.") ) return False return super_valid def save(self): pay = self.instance.add_payment(self) return pay class EditPaymentModalForm(NewPaymentForm): """ Form handling edit for Payment """ payment = None def __init__(self, *args, **kwargs): self.payment = kwargs.pop("payment", None) super().__init__(*args, **kwargs) self.form_title = _("Edit payment") form_date = { "amount": self.payment.amount, "due": str(self.payment.due_on), "comment": self.payment.comment, } self.load_initial_data(form_date, disabled_fields=[]) def save(self): payment = self.payment payment.amount = self.cleaned_data.get("amount", None) payment.due_on = self.cleaned_data.get("due", None) payment.comment = self.cleaned_data.get("comment", None) payment.save() self.instance.mark_as_edited(self.user, self.request, edit_comment=PAYMENT_EDITED) self.instance.send_data_to_egon() return payment class RemovePaymentModalForm(RemoveModalForm): """ Removing modal form for Payment Can be used for anything, where removing shall be confirmed by the user a second time. """ payment = None def __init__(self, *args, **kwargs): payment = kwargs.pop("payment", None) self.payment = payment super().__init__(*args, **kwargs) def save(self): self.instance.remove_payment(self)