fix(time): konfigurierbare Fach-Zeitzone statt UTC/OS-Local fuer alle Datumsangaben
Lieferbericht zeigte UTC (08.09. 22:54 statt 09.09. 00:54): renderer.dt() formatierte DateTime<Utc> ohne Umrechnung. Weitere Stellen hingen an chrono::Local (OS-Zone des Hosts) bzw. hardcodiertem 'Europe/Berlin'. Neu: server.timezone (IANA, Default Europe/Berlin, chrono-tz) und durchgaengig UTC-Instant -> konfigurierte Zone: - Lieferbericht: alle Zeitstempel (Abgeschlossen, Notizen, Scans, erzeugt am) - Belegansicht (fmt_datetime) - ERP-Rueckschreibung delivered_at (Wanduhrzeit) - 'heute'-Ableitung: /me/tours, /dev/resync, /admin/import-erp, Import-Cron + Startup-Catch-up - Completion-Repo: AT TIME ZONE als Bind-Param statt Literal Speicherung bleibt UTC (TIMESTAMPTZ / DateTime<Utc>) - nur Anzeige und Kalendertag-Ableitung nutzen die Zone. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -25,7 +25,7 @@ pub async fn belege_details_html(
|
||||
) -> Result<Html<String>, ApiError> {
|
||||
tracing::info!(%belegnummer, "admin.belege_details_html");
|
||||
let details = state.get_delivery_details.execute(&belegnummer).await?;
|
||||
let page = build_page(details);
|
||||
let page = build_page(details, state.timezone);
|
||||
let html = page.render().map_err(|e| {
|
||||
ApiError(ApplicationError::Unexpected(format!(
|
||||
"template-render fehlgeschlagen: {e}"
|
||||
@ -112,7 +112,7 @@ struct ContactSourceVm {
|
||||
|
||||
// ===== Assembly ============================================================
|
||||
|
||||
fn build_page(d: DeliveryDetails) -> DeliveryDetailsPage {
|
||||
fn build_page(d: DeliveryDetails, tz: chrono_tz::Tz) -> DeliveryDetailsPage {
|
||||
let delivery = &d.delivery.delivery;
|
||||
|
||||
// Positionen: Artikel-/Lagernamen auflösen, Mengen/Preise formatieren.
|
||||
@ -171,7 +171,7 @@ fn build_page(d: DeliveryDetails) -> DeliveryDetailsPage {
|
||||
.map(|n| NoteVm {
|
||||
text: n.text.clone().unwrap_or_default(),
|
||||
author: n.author_personalnummer,
|
||||
created_at: fmt_datetime(n.created_at),
|
||||
created_at: fmt_datetime(n.created_at, tz),
|
||||
credit_note: n.is_amount_credit_note || n.credit_delivery_item_id.is_some(),
|
||||
image: n.image_attachment.is_some(),
|
||||
})
|
||||
@ -253,7 +253,7 @@ fn build_page(d: DeliveryDetails) -> DeliveryDetailsPage {
|
||||
services,
|
||||
notes,
|
||||
contacts,
|
||||
generated_at: fmt_datetime(chrono::Utc::now()),
|
||||
generated_at: fmt_datetime(chrono::Utc::now(), tz),
|
||||
}
|
||||
}
|
||||
|
||||
@ -311,10 +311,10 @@ fn fmt_date(d: chrono::NaiveDate) -> String {
|
||||
d.format("%d.%m.%Y").to_string()
|
||||
}
|
||||
|
||||
fn fmt_datetime(dt: chrono::DateTime<chrono::Utc>) -> String {
|
||||
dt.with_timezone(&chrono::Local)
|
||||
.format("%d.%m.%Y %H:%M")
|
||||
.to_string()
|
||||
/// UTC-Zeitstempel in der konfigurierten Zone (`server.timezone`) als
|
||||
/// `TT.MM.JJJJ HH:MM` — bewusst nicht `chrono::Local` (OS-Zone des Hosts).
|
||||
fn fmt_datetime(dt: chrono::DateTime<chrono::Utc>, tz: chrono_tz::Tz) -> String {
|
||||
dt.with_timezone(&tz).format("%d.%m.%Y %H:%M").to_string()
|
||||
}
|
||||
|
||||
fn state_label(s: DeliveryState) -> &'static str {
|
||||
|
||||
Reference in New Issue
Block a user