from flask_wtf import FlaskForm from wtforms import ( BooleanField, HiddenField, IntegerField, PasswordField, SelectField, StringField, SubmitField, TextAreaField, ) from wtforms.validators import DataRequired, Email, NumberRange, Optional class AdminUserForm(FlaskForm): email = StringField('E-mail', validators=[DataRequired(), Email()]) name = StringField('Imię i nazwisko', validators=[DataRequired()]) role = SelectField('Rola globalna', choices=[('admin', 'Admin'), ('operator', 'Operator'), ('readonly', 'Readonly')], validators=[DataRequired()]) password = PasswordField('Hasło', validators=[Optional()]) company_id = SelectField('Dodaj dostęp do firmy', coerce=int, validators=[Optional()]) access_level = SelectField('Poziom dostępu do firmy', choices=[('full', 'Pełny'), ('readonly', 'Tylko odczyt')], validators=[Optional()]) force_password_change = BooleanField('Wymuś zmianę hasła') is_blocked = BooleanField('Zablokowany') submit = SubmitField('Zapisz użytkownika') class AccessForm(FlaskForm): company_id = SelectField('Firma', coerce=int, validators=[DataRequired()]) access_level = SelectField('Poziom dostępu', choices=[('full', 'Pełny'), ('readonly', 'Tylko odczyt')], validators=[DataRequired()]) submit = SubmitField('Zapisz dostęp') class PasswordResetForm(FlaskForm): password = PasswordField('Nowe hasło', validators=[DataRequired()]) force_password_change = BooleanField('Wymuś zmianę po logowaniu') submit = SubmitField('Resetuj hasło') class AdminCompanyForm(FlaskForm): name = StringField('Nazwa firmy', validators=[Optional()]) tax_id = StringField('NIP', validators=[Optional()]) regon = StringField('REGON', validators=[Optional()]) address = StringField('Adres', validators=[Optional()]) bank_account = StringField('Numer rachunku bankowego', validators=[Optional()]) is_active = BooleanField('Aktywna') sync_enabled = BooleanField('Automatyczne pobieranie') sync_interval_minutes = StringField('Interwał sync (min)', validators=[Optional()]) note = TextAreaField('Opis / notatka', validators=[Optional()]) mock_mode = BooleanField('Włącz tryb mock dla tej firmy') submit = SubmitField('Zapisz firmę') fetch_submit = SubmitField('Pobierz dane z CEIDG') def validate(self, extra_validators=None): if not super().validate(extra_validators=extra_validators): return False is_fetch = bool(self.fetch_submit.data and not self.submit.data) if is_fetch: if not (self.tax_id.data or '').strip(): self.tax_id.errors.append('Podaj NIP, aby pobrać dane z CEIDG.') return False return True if not (self.name.data or '').strip(): self.name.errors.append('To pole jest wymagane.') return False return True class CeidgConfigForm(FlaskForm): environment = HiddenField(default='production') api_key = PasswordField('API KEY CEIDG', validators=[Optional()]) submit = SubmitField('Zapisz konfigurację CEIDG') class LogCleanupForm(FlaskForm): days = IntegerField('Usuń logi starsze niż (dni)', validators=[DataRequired(), NumberRange(min=1, max=3650)]) submit = SubmitField('Wyczyść logi') class DatabaseBackupForm(FlaskForm): submit = SubmitField('Wykonaj kopię bazy') class GlobalMailSettingsForm(FlaskForm): server = StringField('SMTP host', validators=[Optional()]) port = StringField('SMTP port', validators=[Optional()]) username = StringField('SMTP login', validators=[Optional()]) password = PasswordField('SMTP hasło', validators=[Optional()]) sender = StringField('Nadawca', validators=[Optional(), Email()]) security_mode = SelectField('Zabezpieczenie połączenia', choices=[('tls', 'TLS / STARTTLS'), ('ssl', 'SSL'), ('none', 'Brak')], validators=[Optional()], default='tls') submit = SubmitField('Zapisz SMTP globalne') class GlobalNotificationSettingsForm(FlaskForm): pushover_user_key = StringField('Pushover user key', validators=[Optional()]) pushover_api_token = PasswordField('Pushover API token', validators=[Optional()]) min_amount = StringField('Powiadom od kwoty', validators=[Optional()]) quiet_hours = StringField('Cichy harmonogram', validators=[Optional()]) enabled = BooleanField('Włącz globalne powiadomienia') submit = SubmitField('Zapisz Pushover globalnie') class GlobalNfzSettingsForm(FlaskForm): enabled = BooleanField('Włącz moduł NFZ globalnie') submit = SubmitField('Zapisz NFZ globalnie') class GlobalKsefDefaultsForm(FlaskForm): environment = SelectField('Domyślne środowisko KSeF', choices=[('prod', 'PROD'), ('test', 'TEST')], validators=[Optional()]) auth_mode = SelectField('Domyślny tryb autoryzacji', choices=[('token', 'Token'), ('certificate', 'Certyfikat')]) client_id = StringField('Domyślny Client ID', validators=[Optional()]) submit = SubmitField('Zapisz domyślne parametry KSeF') class SharedCompanyKsefForm(FlaskForm): environment = SelectField('Środowisko współdzielonego profilu', choices=[('prod', 'PROD'), ('test', 'TEST')], validators=[Optional()]) auth_mode = SelectField('Tryb autoryzacji', choices=[('token', 'Token'), ('certificate', 'Certyfikat')]) token = PasswordField('Token', validators=[Optional()]) client_id = StringField('Client ID', validators=[Optional()]) certificate_name = StringField('Nazwa certyfikatu', validators=[Optional()]) certificate_data = PasswordField('Treść certyfikatu / base64', validators=[Optional()]) submit = SubmitField('Zapisz współdzielony profil KSeF')