from django.db import models from django.utils.translation import get_language, gettext_lazy as _ class FormOption(models.Model): CATEGORY_CHOICES = [ ('department', _('Abteilung')), ('device', _('Geräte')), ('software', _('Software')), ('access', _('Zugänge')), ('workspace_group', _('Workspace-Gruppen')), ('resource', _('Ressourcen')), ('phone', _('Telefonnummern')), ] category = models.CharField(max_length=40, choices=CATEGORY_CHOICES) label = models.CharField(max_length=255) label_en = models.CharField(max_length=255, blank=True) value = models.CharField(max_length=255, blank=True) sort_order = models.PositiveIntegerField(default=0) is_active = models.BooleanField(default=True) class Meta: ordering = ['category', 'sort_order', 'label'] unique_together = ('category', 'label') def __str__(self) -> str: return f"{self.get_category_display()}: {self.label}" def translated_label(self, language_code: str | None = None) -> str: lang = (language_code or get_language() or 'de').split('-')[0] if lang == 'en' and self.label_en.strip(): return self.label_en.strip() return self.label.strip() class FormFieldConfig(models.Model): PAGE_CHOICES = [ ('', _('Automatisch')), ('stammdaten', _('Stammdaten')), ('vertrag', _('Vertrag')), ('itsetup', _('IT-Setup')), ('abschluss', _('Abschluss')), ('mitarbeitende', _('Mitarbeitende')), ('austritt', _('Austritt')), ] FORM_CHOICES = [('onboarding', _('Onboarding')), ('offboarding', _('Offboarding'))] form_type = models.CharField(max_length=20, choices=FORM_CHOICES) field_name = models.CharField(max_length=80) sort_order = models.PositiveIntegerField(default=0) is_visible = models.BooleanField(default=True) is_required = models.BooleanField(null=True, blank=True, default=None) page_key = models.CharField(max_length=80, blank=True, default='') label_override = models.CharField(max_length=255, blank=True) label_override_en = models.CharField(max_length=255, blank=True) help_text_override = models.TextField(blank=True) help_text_override_en = models.TextField(blank=True) class Meta: ordering = ['form_type', 'sort_order', 'field_name'] unique_together = ('form_type', 'field_name') verbose_name = 'Formularfeld-Konfiguration' verbose_name_plural = 'Formularfeld-Konfigurationen' def __str__(self) -> str: return f'{self.get_form_type_display()}: {self.field_name}' def translated_label_override(self, language_code: str | None = None) -> str: lang = (language_code or get_language() or 'de').split('-')[0] if lang == 'en' and self.label_override_en.strip(): return self.label_override_en.strip() return self.label_override.strip() def translated_help_text_override(self, language_code: str | None = None) -> str: lang = (language_code or get_language() or 'de').split('-')[0] if lang == 'en' and self.help_text_override_en.strip(): return self.help_text_override_en.strip() return self.help_text_override.strip() class FormSectionConfig(models.Model): FORM_CHOICES = [('onboarding', _('Onboarding')), ('offboarding', _('Offboarding'))] form_type = models.CharField(max_length=20, choices=FORM_CHOICES) section_key = models.CharField(max_length=80) sort_order = models.PositiveIntegerField(default=0) is_visible = models.BooleanField(default=True) class Meta: ordering = ['form_type', 'sort_order', 'section_key'] unique_together = ('form_type', 'section_key') verbose_name = 'Formularabschnitt-Konfiguration' verbose_name_plural = 'Formularabschnitt-Konfigurationen' def __str__(self) -> str: return f'{self.form_type}: {self.section_key}' class FormConditionalRuleConfig(models.Model): FORM_CHOICES = [('onboarding', _('Onboarding'))] form_type = models.CharField(max_length=20, choices=FORM_CHOICES) target_key = models.CharField(max_length=80) clauses = models.JSONField(default=list, blank=True) is_active = models.BooleanField(default=True) class Meta: ordering = ['form_type', 'target_key'] unique_together = ('form_type', 'target_key') verbose_name = 'Formular-Bedingungsregel' verbose_name_plural = 'Formular-Bedingungsregeln' def __str__(self) -> str: return f'{self.form_type}: {self.target_key}' class FormCustomSectionConfig(models.Model): FORM_CHOICES = [('onboarding', _('Onboarding'))] form_type = models.CharField(max_length=20, choices=FORM_CHOICES) section_key = models.SlugField(max_length=80) sort_order = models.PositiveIntegerField(default=0) title = models.CharField(max_length=255) title_en = models.CharField(max_length=255, blank=True) is_active = models.BooleanField(default=True) class Meta: ordering = ['form_type', 'sort_order', 'section_key'] unique_together = ('form_type', 'section_key') verbose_name = 'Benutzerdefinierter Formularabschnitt' verbose_name_plural = 'Benutzerdefinierte Formularabschnitte' def __str__(self) -> str: return f'{self.form_type}: {self.title}' def translated_title(self, language_code: str | None = None) -> str: lang = (language_code or get_language() or 'de').split('-')[0] if lang == 'en' and self.title_en.strip(): return self.title_en.strip() return self.title.strip() class FormCustomFieldConfig(models.Model): FIELD_TYPE_TEXT = 'text' FIELD_TYPE_TEXTAREA = 'textarea' FIELD_TYPE_SELECT = 'select' FIELD_TYPE_CHECKBOX = 'checkbox' FIELD_TYPE_CHOICES = [ (FIELD_TYPE_TEXT, _('Text')), (FIELD_TYPE_TEXTAREA, _('Mehrzeilig')), (FIELD_TYPE_SELECT, _('Auswahl')), (FIELD_TYPE_CHECKBOX, _('Checkbox')), ] FORM_CHOICES = [('onboarding', _('Onboarding')), ('offboarding', _('Offboarding'))] form_type = models.CharField(max_length=20, choices=FORM_CHOICES) field_key = models.SlugField(max_length=80) section_key = models.CharField(max_length=80) sort_order = models.PositiveIntegerField(default=0) field_type = models.CharField(max_length=20, choices=FIELD_TYPE_CHOICES, default=FIELD_TYPE_TEXT) is_active = models.BooleanField(default=True) is_required = models.BooleanField(default=False) label = models.CharField(max_length=255) label_en = models.CharField(max_length=255, blank=True) help_text = models.TextField(blank=True) help_text_en = models.TextField(blank=True) select_options = models.TextField(blank=True, help_text='Eine Option pro Zeile. Optional: wert|Label') select_options_en = models.TextField(blank=True, help_text='Eine Option pro Zeile. Optional: value|Label') class Meta: ordering = ['form_type', 'section_key', 'sort_order', 'field_key'] unique_together = ('form_type', 'field_key') verbose_name = 'Benutzerdefiniertes Formularfeld' verbose_name_plural = 'Benutzerdefinierte Formularfelder' def __str__(self) -> str: return f'{self.form_type}: {self.label}' def translated_label(self, language_code: str | None = None) -> str: lang = (language_code or get_language() or 'de').split('-')[0] if lang == 'en' and self.label_en.strip(): return self.label_en.strip() return self.label.strip() def translated_help_text(self, language_code: str | None = None) -> str: lang = (language_code or get_language() or 'de').split('-')[0] if lang == 'en' and self.help_text_en.strip(): return self.help_text_en.strip() return self.help_text.strip() def translated_select_options(self, language_code: str | None = None) -> list[tuple[str, str]]: lang = (language_code or get_language() or 'de').split('-')[0] raw = self.select_options_en if lang == 'en' and self.select_options_en.strip() else self.select_options options = [] for line in (raw or '').splitlines(): line = line.strip() if not line: continue if '|' in line: value, label = [part.strip() for part in line.split('|', 1)] else: value = label = line if value: options.append((value, label or value)) return options