feat: vollständige Firmendaten (Adresse, Abrechnung) bei Firmenanlage
Bei Firmenanlage (Registrierung + Betreiber-Firmenanlage) müssen jetzt Adresse (Straße, PLZ, Ort, Land) und Abrechnungsdaten (Rechnungsemail, optional USt-IdNr.) erfasst werden, nicht nur der Firmenname (Migration 0023). USt-IdNr. bewusst optional - Kleinunternehmer nach §19 UStG haben keine. Neue Seite /verwaltung/firma (admin-only) zum Einsehen/ Nachtragen für bestehende Firmen. store.CreateAccount nimmt jetzt ein AccountInput statt nur einen Namen entgegen (Signaturänderung betrifft ~20 Testaufrufe, mechanisch umgestellt). register.html/ betreiber_account_neu.html auf form-card/form-grid umgestellt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
74
internal/web/firmendaten_handlers.go
Normal file
74
internal/web/firmendaten_handlers.go
Normal file
@@ -0,0 +1,74 @@
|
||||
// Firmendaten (Migration 0023) — Adress- und Abrechnungsdaten des
|
||||
// eigenen Mandanten einsehen/pflegen. Bei der Neuanlage (Registrierung,
|
||||
// Betreiber-Firmenanlage) sind diese Felder Pflicht; bestehende, davor
|
||||
// angelegte Accounts können sie hier nachtragen.
|
||||
package web
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/netcell-it/deklarix/internal/store"
|
||||
)
|
||||
|
||||
type firmendatenData struct {
|
||||
Title string
|
||||
Nav navData
|
||||
Name string
|
||||
Strasse string
|
||||
PLZ string
|
||||
Ort string
|
||||
Land string
|
||||
UStID string
|
||||
Rechnungsemail string
|
||||
Error string
|
||||
Gespeichert bool
|
||||
}
|
||||
|
||||
func (s *Server) handleFirmendaten(w http.ResponseWriter, r *http.Request) {
|
||||
acc, err := s.store.GetAccount(r.Context(), currentUser(r).AccountID)
|
||||
if err != nil {
|
||||
http.Error(w, "Firmendaten konnten nicht geladen werden: "+err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
data := firmendatenData{
|
||||
Title: "Firmendaten", Nav: navFor(r),
|
||||
Name: acc.Name, Strasse: acc.Strasse, PLZ: acc.PLZ, Ort: acc.Ort,
|
||||
Land: acc.Land, UStID: acc.UStID, Rechnungsemail: acc.Rechnungsemail,
|
||||
Gespeichert: r.URL.Query().Get("gespeichert") == "1",
|
||||
}
|
||||
if err := s.templates.ExecuteTemplate(w, "firmendaten", data); err != nil {
|
||||
http.Error(w, "Seite konnte nicht gerendert werden", http.StatusInternalServerError)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) handleFirmendatenSpeichern(w http.ResponseWriter, r *http.Request) {
|
||||
if err := r.ParseForm(); err != nil {
|
||||
http.Error(w, "ungültiges Formular", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
in := store.AccountInput{
|
||||
Name: r.FormValue("account_name"),
|
||||
Strasse: r.FormValue("strasse"),
|
||||
PLZ: r.FormValue("plz"),
|
||||
Ort: r.FormValue("ort"),
|
||||
Land: r.FormValue("land"),
|
||||
UStID: r.FormValue("ust_id"),
|
||||
Rechnungsemail: r.FormValue("rechnungsemail"),
|
||||
}
|
||||
if in.Name == "" || in.Strasse == "" || in.PLZ == "" || in.Ort == "" || in.Land == "" || in.Rechnungsemail == "" {
|
||||
data := firmendatenData{
|
||||
Title: "Firmendaten", Nav: navFor(r), Error: "Alle Felder außer USt-IdNr. sind Pflicht",
|
||||
Name: in.Name, Strasse: in.Strasse, PLZ: in.PLZ, Ort: in.Ort, Land: in.Land,
|
||||
UStID: in.UStID, Rechnungsemail: in.Rechnungsemail,
|
||||
}
|
||||
if err := s.templates.ExecuteTemplate(w, "firmendaten", data); err != nil {
|
||||
http.Error(w, "Seite konnte nicht gerendert werden", http.StatusInternalServerError)
|
||||
}
|
||||
return
|
||||
}
|
||||
if _, err := s.store.UpdateAccountDetails(r.Context(), currentUser(r).AccountID, in); err != nil {
|
||||
http.Error(w, "Speichern fehlgeschlagen: "+err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
http.Redirect(w, r, "/verwaltung/firma?gespeichert=1", http.StatusSeeOther)
|
||||
}
|
||||
Reference in New Issue
Block a user