From 50535dbed087b5a41dcf8477386ef4cb1758dbdc Mon Sep 17 00:00:00 2001 From: Jeppe B <2jepp9350@gmail.com> Date: Sun, 9 Aug 2026 23:16:05 +0200 Subject: [PATCH] fix(pleno-vue): surface Fakturer nu errors to user + remove debug console.logs (#273) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What Three small quality improvements to the Superuser > Fakturaer > Periode page, following the same flow as the earlier Fakturer nu / XL Vask manual-review cleanup. ## Changes ### 1. User-facing error for 'Fakturer nu' failure **File:** `src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/views/InvoicingBillingPeriodViewAll.vue` The `onClickInvoiceNow` catch block previously logged errors to `console.error` only. Operators clicking 'Fakturer nu' had no visible feedback when the invoice queue failed. Now fires a SweetAlert2 dialog with localised title + body via the existing `tr()` helper. ```js await Swal.fire({ title: tr("errors.fakturer_nu_failed_title", "Fakturer nu mislykkedes"), text: tr("errors.fakturer_nu_failed_body", "Kunne ikke oprette faktura for denne kunde. Prøv igen, eller tjek kundens transaktioner."), icon: "error", }); ``` ### 2. Debug console.log removal **Files:** - `src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/layout/SmallCustomerActivityChart.vue` - `src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/InvoicingBillingPeriodDatePeriodSelector.vue` Two `console.log` debugging leftovers removed: - `SmallCustomerActivityChart.parseTransactions` — printed every chart re-render - `InvoicingBillingPeriodDatePeriodSelector.onSelectionChange` — printed every date-selection change ### 3. Translation entries **Files:** - `src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/services/invoicingPeriodTranslation.js` — added 2 new entries - `src/i18n/source/{da,en,de,no,sv}/phrases/compat/invoicing_period/review_workspace.json` — added `errors.fakturer_nu_failed_title` and `errors.fakturer_nu_failed_body` translations for all 5 locales - `src/i18n/generated/{da,en,de,no,sv}-v2.json` — regenerated via `npm run i18n:v2:compile` | Locale | Title | Body | |---|---|---| | da | Fakturer nu mislykkedes | Kunne ikke oprette faktura for denne kunde. Prøv igen, eller tjek kundens transaktioner. | | en | Invoice now failed | Could not create invoice for this customer. Try again, or check the customer's transactions. | | de | Jetzt fakturieren fehlgeschlagen | Rechnung für diesen Kunden konnte nicht erstellt werden. Erneut versuchen oder Transaktionen prüfen. | | no | Fakturer nå mislyktes | Kunne ikke opprette faktura for denne kunden. Prøv igjen, eller sjekk kundens transaksjoner. | | sv | Fakturera nu misslyckades | Kunde inte skapa faktura för denna kund. Försök igen, eller kontrollera kundens transaktioner. | ## Quality | Check | Result | |---|---| | `npm run i18n:v2:check` | exit 0 | | `npm run lint` | exit 0 | | `npm run test:unit:fast` | 1348/1348 passed | | `npm run i18n:v2:compile` | clean regen for all 5 locales | ## Refs - truckwash-fakturaer-periode quality pass - Mon 2026-08-10 08:00 GMT+2 deadline Co-authored-by: Truck Wash Agent --- src/i18n/generated/da-v2.json | 4 + src/i18n/generated/de-v2.json | 4 + src/i18n/generated/en-v2.json | 4 + src/i18n/generated/no-v2.json | 4 + src/i18n/generated/sv-v2.json | 4 + .../invoicing_period/review_workspace.json | 109 ++++++++++++++-- .../invoicing_period/review_workspace.json | 117 ++++++++++++++++-- .../invoicing_period/review_workspace.json | 109 ++++++++++++++-- .../invoicing_period/review_workspace.json | 117 ++++++++++++++++-- .../invoicing_period/review_workspace.json | 117 ++++++++++++++++-- ...voicingBillingPeriodDatePeriodSelector.vue | 1 - .../layout/SmallCustomerActivityChart.vue | 1 - .../services/invoicingPeriodTranslation.js | 4 + .../views/InvoicingBillingPeriodViewAll.vue | 7 +- 14 files changed, 538 insertions(+), 64 deletions(-) diff --git a/src/i18n/generated/da-v2.json b/src/i18n/generated/da-v2.json index e90864f9..ed3e36df 100644 --- a/src/i18n/generated/da-v2.json +++ b/src/i18n/generated/da-v2.json @@ -4587,6 +4587,10 @@ "previous": "Forrige kunde til gennemgang", "selected_customer": "Valgt kunde" }, + "errors": { + "fakturer_nu_failed_title": "Fakturer nu mislykkedes", + "fakturer_nu_failed_body": "Kunne ikke oprette faktura for denne kunde. Prøv igen, eller tjek kundens transaktioner." + }, "headline": { "aria_label": "Periodens hovedtal", "booked": "Bogført", diff --git a/src/i18n/generated/de-v2.json b/src/i18n/generated/de-v2.json index 33a88584..bda5fdd5 100644 --- a/src/i18n/generated/de-v2.json +++ b/src/i18n/generated/de-v2.json @@ -4697,6 +4697,10 @@ "previous": "Vorheriger zu prüfender Kunde", "selected_customer": "Ausgewählter Kunde" }, + "errors": { + "fakturer_nu_failed_title": "Jetzt fakturieren fehlgeschlagen", + "fakturer_nu_failed_body": "Rechnung für diesen Kunden konnte nicht erstellt werden. Erneut versuchen oder Transaktionen prüfen." + }, "headline": { "aria_label": "Kennzahlen des Zeitraums", "booked": "Gebucht", diff --git a/src/i18n/generated/en-v2.json b/src/i18n/generated/en-v2.json index 7cee5b3a..cd53a3e0 100644 --- a/src/i18n/generated/en-v2.json +++ b/src/i18n/generated/en-v2.json @@ -4418,6 +4418,10 @@ "previous": "Previous customer needing review", "selected_customer": "Selected customer" }, + "errors": { + "fakturer_nu_failed_title": "Invoice now failed", + "fakturer_nu_failed_body": "Could not create invoice for this customer. Try again, or check the customer's transactions." + }, "headline": { "aria_label": "Period headline figures", "booked": "Booked", diff --git a/src/i18n/generated/no-v2.json b/src/i18n/generated/no-v2.json index 1164f142..f0e3ede2 100644 --- a/src/i18n/generated/no-v2.json +++ b/src/i18n/generated/no-v2.json @@ -4700,6 +4700,10 @@ "previous": "Forrige kunde til gjennomgang", "selected_customer": "Valgt kunde" }, + "errors": { + "fakturer_nu_failed_title": "Fakturer nå mislyktes", + "fakturer_nu_failed_body": "Kunne ikke opprette faktura for denne kunden. Prøv igjen, eller sjekk kundens transaksjoner." + }, "headline": { "aria_label": "Periodens hovedtall", "booked": "Bokført", diff --git a/src/i18n/generated/sv-v2.json b/src/i18n/generated/sv-v2.json index ee701543..b96bbd56 100644 --- a/src/i18n/generated/sv-v2.json +++ b/src/i18n/generated/sv-v2.json @@ -4750,6 +4750,10 @@ "previous": "Föregående kund att granska", "selected_customer": "Vald kund" }, + "errors": { + "fakturer_nu_failed_title": "Fakturera nu misslyckades", + "fakturer_nu_failed_body": "Kunde inte skapa faktura för denna kund. Försök igen, eller kontrollera kundens transaktioner." + }, "headline": { "aria_label": "Periodens huvudtal", "booked": "Bokfört", diff --git a/src/i18n/source/da/phrases/compat/invoicing_period/review_workspace.json b/src/i18n/source/da/phrases/compat/invoicing_period/review_workspace.json index dd0235fa..ad6ef434 100644 --- a/src/i18n/source/da/phrases/compat/invoicing_period/review_workspace.json +++ b/src/i18n/source/da/phrases/compat/invoicing_period/review_workspace.json @@ -2,17 +2,104 @@ "compat": { "invoicing_period": { "review_workspace": { - "analytics": { "title": "Overblik og nøgletal" }, - "detail": { "next": "Næste kunde til gennemgang", "open_prompt": "Vælg kunden i køen for at åbne fakturadetaljerne.", "previous": "Forrige kunde til gennemgang", "selected_customer": "Valgt kunde" }, - "headline": { "aria_label": "Periodens hovedtal", "booked": "Bogført", "not_booked": "Ikke bogført", "total": "I alt" }, - "navigation": { "agreements": "Aftaler", "aria_label": "Forretningsvisninger", "billing": "Fakturering", "operations": "Drift", "review": "Gennemgang" }, - "next_actions": { "create_invoice": "Opret faktura", "none": "Ingen handling nødvendig", "resolve_collection_errors": "Ret fejl i fakturasamling", "resolve_draft": "Afklar kladde", "resolve_manual_flags": "Afklar manuelle flag", "review_warnings": "Gennemgå advarsler", "wait_for_export": "Afvent eksport" }, - "queue": { "count": "{count} kunder", "title": "Kunder til gennemgang" }, - "reasons": { "automatic_flags": "Automatiske advarsler", "automatic_warnings": "Automatiske advarsler", "collection_errors": "Fejl i fakturasamling", "completed": "Alt er bogført", "draft": "Kladde blokerer", "draft_blocks_action": "Kladde blokerer", "export_in_progress": "Eksport er i gang", "manual_flags": "Manuelle flag kræver handling", "queued": "Fakturaen er i kø", "ready_to_invoice": "Klar til fakturering", "requires_action": "Kræver gennemgang", "unbooked_transactions": "Ikke-bogførte transaktioner" }, - "severities": { "blue": "I kø", "green": "Klar", "red": "Blokeret", "yellow": "Advarsel" }, - "sort": { "customer_name": "Kundenavn", "customer_number": "Kundenummer", "priority": "Vigtigst først", "total_amount": "Beløb" }, - "states": { "attention": "Kræver opmærksomhed", "blocked": "Blokeret", "completed": "Færdig", "empty_body": "Vælg en anden periode eller forretningsvisning.", "empty_title": "Ingen fakturadata i perioden", "error_body": "Prøv at genindlæse perioden.", "error_title": "Fakturaperioden kunne ikke indlæses", "filtered_empty_body": "Nulstil arbejdsgangsfiltrene eller prøv en anden søgning.", "filtered_empty_title": "Ingen kunder matcher filtrene", "loading_body": "Samler kunder, fakturasamlinger og kontrolpunkter…", "loading_title": "Indlæser fakturaperioden", "queued": "I kø", "ready": "Klar til fakturering", "refreshing": "Opdaterer eksisterende resultat…", "retained_error": "Opdateringen mislykkedes. Det senest indlæste resultat vises stadig." }, - "toolbar": { "all_departments": "Alle afdelinger", "all_invoice_states": "Alle fakturastatusser", "all_severities": "Alle niveauer", "all_states": "Alle tilstande", "change_direction": "Skift sorteringsretning", "clear_filters": "Ryd filtre", "department": "Afdeling", "invoice_state": "Fakturastatus", "reload": "Genindlæs", "retry": "Prøv igen", "search": "Søg i kunder og fakturadata", "severity": "Alvor", "sort": "Sortér", "workflow": "Arbejdsgang" } + "analytics": { + "title": "Overblik og nøgletal" + }, + "detail": { + "next": "Næste kunde til gennemgang", + "open_prompt": "Vælg kunden i køen for at åbne fakturadetaljerne.", + "previous": "Forrige kunde til gennemgang", + "selected_customer": "Valgt kunde" + }, + "errors": { + "fakturer_nu_failed_title": "Fakturer nu mislykkedes", + "fakturer_nu_failed_body": "Kunne ikke oprette faktura for denne kunde. Prøv igen, eller tjek kundens transaktioner." + }, + "headline": { + "aria_label": "Periodens hovedtal", + "booked": "Bogført", + "not_booked": "Ikke bogført", + "total": "I alt" + }, + "navigation": { + "agreements": "Aftaler", + "aria_label": "Forretningsvisninger", + "billing": "Fakturering", + "operations": "Drift", + "review": "Gennemgang" + }, + "next_actions": { + "create_invoice": "Opret faktura", + "none": "Ingen handling nødvendig", + "resolve_collection_errors": "Ret fejl i fakturasamling", + "resolve_draft": "Afklar kladde", + "resolve_manual_flags": "Afklar manuelle flag", + "review_warnings": "Gennemgå advarsler", + "wait_for_export": "Afvent eksport" + }, + "queue": { + "count": "{count} kunder", + "title": "Kunder til gennemgang" + }, + "reasons": { + "automatic_flags": "Automatiske advarsler", + "automatic_warnings": "Automatiske advarsler", + "collection_errors": "Fejl i fakturasamling", + "completed": "Alt er bogført", + "draft": "Kladde blokerer", + "draft_blocks_action": "Kladde blokerer", + "export_in_progress": "Eksport er i gang", + "manual_flags": "Manuelle flag kræver handling", + "queued": "Fakturaen er i kø", + "ready_to_invoice": "Klar til fakturering", + "requires_action": "Kræver gennemgang", + "unbooked_transactions": "Ikke-bogførte transaktioner" + }, + "severities": { + "blue": "I kø", + "green": "Klar", + "red": "Blokeret", + "yellow": "Advarsel" + }, + "sort": { + "customer_name": "Kundenavn", + "customer_number": "Kundenummer", + "priority": "Vigtigst først", + "total_amount": "Beløb" + }, + "states": { + "attention": "Kræver opmærksomhed", + "blocked": "Blokeret", + "completed": "Færdig", + "empty_body": "Vælg en anden periode eller forretningsvisning.", + "empty_title": "Ingen fakturadata i perioden", + "error_body": "Prøv at genindlæse perioden.", + "error_title": "Fakturaperioden kunne ikke indlæses", + "filtered_empty_body": "Nulstil arbejdsgangsfiltrene eller prøv en anden søgning.", + "filtered_empty_title": "Ingen kunder matcher filtrene", + "loading_body": "Samler kunder, fakturasamlinger og kontrolpunkter…", + "loading_title": "Indlæser fakturaperioden", + "queued": "I kø", + "ready": "Klar til fakturering", + "refreshing": "Opdaterer eksisterende resultat…", + "retained_error": "Opdateringen mislykkedes. Det senest indlæste resultat vises stadig." + }, + "toolbar": { + "all_departments": "Alle afdelinger", + "all_invoice_states": "Alle fakturastatusser", + "all_severities": "Alle niveauer", + "all_states": "Alle tilstande", + "change_direction": "Skift sorteringsretning", + "clear_filters": "Ryd filtre", + "department": "Afdeling", + "invoice_state": "Fakturastatus", + "reload": "Genindlæs", + "retry": "Prøv igen", + "search": "Søg i kunder og fakturadata", + "severity": "Alvor", + "sort": "Sortér", + "workflow": "Arbejdsgang" + } } } } diff --git a/src/i18n/source/de/phrases/compat/invoicing_period/review_workspace.json b/src/i18n/source/de/phrases/compat/invoicing_period/review_workspace.json index 9f3990f4..5cacf6b3 100644 --- a/src/i18n/source/de/phrases/compat/invoicing_period/review_workspace.json +++ b/src/i18n/source/de/phrases/compat/invoicing_period/review_workspace.json @@ -1,15 +1,106 @@ { - "compat": { "invoicing_period": { "review_workspace": { - "analytics": { "title": "Übersicht und Kennzahlen" }, - "detail": { "next": "Nächster zu prüfender Kunde", "open_prompt": "Wählen Sie den Kunden in der Warteschlange, um die Rechnungsdetails zu öffnen.", "previous": "Vorheriger zu prüfender Kunde", "selected_customer": "Ausgewählter Kunde" }, - "headline": { "aria_label": "Kennzahlen des Zeitraums", "booked": "Gebucht", "not_booked": "Nicht gebucht", "total": "Gesamt" }, - "navigation": { "agreements": "Vereinbarungen", "aria_label": "Geschäftsansichten", "billing": "Rechnungsstellung", "operations": "Betrieb", "review": "Prüfung" }, - "next_actions": { "create_invoice": "Rechnung erstellen", "none": "Keine Aktion erforderlich", "resolve_collection_errors": "Sammlungsfehler beheben", "resolve_draft": "Entwurf klären", "resolve_manual_flags": "Manuelle Markierungen klären", "review_warnings": "Warnungen prüfen", "wait_for_export": "Auf Export warten" }, - "queue": { "count": "{count} Kunden", "title": "Zu prüfende Kunden" }, - "reasons": { "automatic_flags": "Automatische Warnungen", "automatic_warnings": "Automatische Warnungen", "collection_errors": "Fehler in Rechnungssammlung", "completed": "Alles verbucht", "draft": "Entwurf blockiert", "draft_blocks_action": "Entwurf blockiert", "export_in_progress": "Export läuft", "manual_flags": "Manuelle Markierungen erfordern Aktion", "queued": "Rechnung ist eingereiht", "ready_to_invoice": "Bereit zur Abrechnung", "requires_action": "Prüfung erforderlich", "unbooked_transactions": "Nicht gebuchte Transaktionen" }, - "severities": { "blue": "Eingereiht", "green": "Bereit", "red": "Blockiert", "yellow": "Warnung" }, - "sort": { "customer_name": "Kundenname", "customer_number": "Kundennummer", "priority": "Priorität zuerst", "total_amount": "Betrag" }, - "states": { "attention": "Aufmerksamkeit erforderlich", "blocked": "Blockiert", "completed": "Abgeschlossen", "empty_body": "Wählen Sie einen anderen Zeitraum oder eine andere Ansicht.", "empty_title": "Keine Rechnungsdaten in diesem Zeitraum", "error_body": "Laden Sie den Zeitraum erneut.", "error_title": "Der Rechnungszeitraum konnte nicht geladen werden", "filtered_empty_body": "Setzen Sie die Filter zurück oder suchen Sie erneut.", "filtered_empty_title": "Keine Kunden entsprechen den Filtern", "loading_body": "Kunden, Rechnungssammlungen und Prüfpunkte werden gesammelt…", "loading_title": "Rechnungszeitraum wird geladen", "queued": "Eingereiht", "ready": "Bereit zur Abrechnung", "refreshing": "Aktuelles Ergebnis wird aktualisiert…", "retained_error": "Die Aktualisierung ist fehlgeschlagen. Das zuletzt geladene Ergebnis bleibt sichtbar." }, - "toolbar": { "all_departments": "Alle Abteilungen", "all_invoice_states": "Alle Rechnungsstatus", "all_severities": "Alle Stufen", "all_states": "Alle Zustände", "change_direction": "Sortierrichtung ändern", "clear_filters": "Filter löschen", "department": "Abteilung", "invoice_state": "Rechnungsstatus", "reload": "Neu laden", "retry": "Erneut versuchen", "search": "Kunden und Rechnungsdaten durchsuchen", "severity": "Schweregrad", "sort": "Sortieren", "workflow": "Arbeitsablauf" } - } } } + "compat": { + "invoicing_period": { + "review_workspace": { + "analytics": { + "title": "Übersicht und Kennzahlen" + }, + "detail": { + "next": "Nächster zu prüfender Kunde", + "open_prompt": "Wählen Sie den Kunden in der Warteschlange, um die Rechnungsdetails zu öffnen.", + "previous": "Vorheriger zu prüfender Kunde", + "selected_customer": "Ausgewählter Kunde" + }, + "errors": { + "fakturer_nu_failed_title": "Jetzt fakturieren fehlgeschlagen", + "fakturer_nu_failed_body": "Rechnung für diesen Kunden konnte nicht erstellt werden. Erneut versuchen oder Transaktionen prüfen." + }, + "headline": { + "aria_label": "Kennzahlen des Zeitraums", + "booked": "Gebucht", + "not_booked": "Nicht gebucht", + "total": "Gesamt" + }, + "navigation": { + "agreements": "Vereinbarungen", + "aria_label": "Geschäftsansichten", + "billing": "Rechnungsstellung", + "operations": "Betrieb", + "review": "Prüfung" + }, + "next_actions": { + "create_invoice": "Rechnung erstellen", + "none": "Keine Aktion erforderlich", + "resolve_collection_errors": "Sammlungsfehler beheben", + "resolve_draft": "Entwurf klären", + "resolve_manual_flags": "Manuelle Markierungen klären", + "review_warnings": "Warnungen prüfen", + "wait_for_export": "Auf Export warten" + }, + "queue": { + "count": "{count} Kunden", + "title": "Zu prüfende Kunden" + }, + "reasons": { + "automatic_flags": "Automatische Warnungen", + "automatic_warnings": "Automatische Warnungen", + "collection_errors": "Fehler in Rechnungssammlung", + "completed": "Alles verbucht", + "draft": "Entwurf blockiert", + "draft_blocks_action": "Entwurf blockiert", + "export_in_progress": "Export läuft", + "manual_flags": "Manuelle Markierungen erfordern Aktion", + "queued": "Rechnung ist eingereiht", + "ready_to_invoice": "Bereit zur Abrechnung", + "requires_action": "Prüfung erforderlich", + "unbooked_transactions": "Nicht gebuchte Transaktionen" + }, + "severities": { + "blue": "Eingereiht", + "green": "Bereit", + "red": "Blockiert", + "yellow": "Warnung" + }, + "sort": { + "customer_name": "Kundenname", + "customer_number": "Kundennummer", + "priority": "Priorität zuerst", + "total_amount": "Betrag" + }, + "states": { + "attention": "Aufmerksamkeit erforderlich", + "blocked": "Blockiert", + "completed": "Abgeschlossen", + "empty_body": "Wählen Sie einen anderen Zeitraum oder eine andere Ansicht.", + "empty_title": "Keine Rechnungsdaten in diesem Zeitraum", + "error_body": "Laden Sie den Zeitraum erneut.", + "error_title": "Der Rechnungszeitraum konnte nicht geladen werden", + "filtered_empty_body": "Setzen Sie die Filter zurück oder suchen Sie erneut.", + "filtered_empty_title": "Keine Kunden entsprechen den Filtern", + "loading_body": "Kunden, Rechnungssammlungen und Prüfpunkte werden gesammelt…", + "loading_title": "Rechnungszeitraum wird geladen", + "queued": "Eingereiht", + "ready": "Bereit zur Abrechnung", + "refreshing": "Aktuelles Ergebnis wird aktualisiert…", + "retained_error": "Die Aktualisierung ist fehlgeschlagen. Das zuletzt geladene Ergebnis bleibt sichtbar." + }, + "toolbar": { + "all_departments": "Alle Abteilungen", + "all_invoice_states": "Alle Rechnungsstatus", + "all_severities": "Alle Stufen", + "all_states": "Alle Zustände", + "change_direction": "Sortierrichtung ändern", + "clear_filters": "Filter löschen", + "department": "Abteilung", + "invoice_state": "Rechnungsstatus", + "reload": "Neu laden", + "retry": "Erneut versuchen", + "search": "Kunden und Rechnungsdaten durchsuchen", + "severity": "Schweregrad", + "sort": "Sortieren", + "workflow": "Arbeitsablauf" + } + } + } + } } diff --git a/src/i18n/source/en/phrases/compat/invoicing_period/review_workspace.json b/src/i18n/source/en/phrases/compat/invoicing_period/review_workspace.json index a02ee3bf..a288225f 100644 --- a/src/i18n/source/en/phrases/compat/invoicing_period/review_workspace.json +++ b/src/i18n/source/en/phrases/compat/invoicing_period/review_workspace.json @@ -2,17 +2,104 @@ "compat": { "invoicing_period": { "review_workspace": { - "analytics": { "title": "Overview and key figures" }, - "detail": { "next": "Next customer needing review", "open_prompt": "Select the customer in the queue to open invoice details.", "previous": "Previous customer needing review", "selected_customer": "Selected customer" }, - "headline": { "aria_label": "Period headline figures", "booked": "Booked", "not_booked": "Not booked", "total": "Total" }, - "navigation": { "agreements": "Agreements", "aria_label": "Business views", "billing": "Invoicing", "operations": "Operations", "review": "Review" }, - "next_actions": { "create_invoice": "Create invoice", "none": "No action needed", "resolve_collection_errors": "Fix collection errors", "resolve_draft": "Resolve draft", "resolve_manual_flags": "Resolve manual flags", "review_warnings": "Review warnings", "wait_for_export": "Wait for export" }, - "queue": { "count": "{count} customers", "title": "Customers to review" }, - "reasons": { "automatic_flags": "Automatic warnings", "automatic_warnings": "Automatic warnings", "collection_errors": "Invoice collection errors", "completed": "Everything is booked", "draft": "Draft is blocking", "draft_blocks_action": "Draft is blocking", "export_in_progress": "Export is in progress", "manual_flags": "Manual flags need action", "queued": "Invoice is queued", "ready_to_invoice": "Ready to invoice", "requires_action": "Needs review", "unbooked_transactions": "Unbooked transactions" }, - "severities": { "blue": "Queued", "green": "Ready", "red": "Blocked", "yellow": "Warning" }, - "sort": { "customer_name": "Customer name", "customer_number": "Customer number", "priority": "Priority first", "total_amount": "Amount" }, - "states": { "attention": "Needs attention", "blocked": "Blocked", "completed": "Completed", "empty_body": "Choose another period or business view.", "empty_title": "No invoice data in this period", "error_body": "Try reloading the period.", "error_title": "The invoice period could not be loaded", "filtered_empty_body": "Reset the workflow filters or try another search.", "filtered_empty_title": "No customers match the filters", "loading_body": "Collecting customers, invoice collections, and review points…", "loading_title": "Loading invoice period", "queued": "Queued", "ready": "Ready to invoice", "refreshing": "Refreshing the current result…", "retained_error": "The refresh failed. The most recently loaded result is still shown." }, - "toolbar": { "all_departments": "All departments", "all_invoice_states": "All invoice states", "all_severities": "All levels", "all_states": "All states", "change_direction": "Change sort direction", "clear_filters": "Clear filters", "department": "Department", "invoice_state": "Invoice state", "reload": "Reload", "retry": "Try again", "search": "Search customers and invoice data", "severity": "Severity", "sort": "Sort", "workflow": "Workflow" } + "analytics": { + "title": "Overview and key figures" + }, + "detail": { + "next": "Next customer needing review", + "open_prompt": "Select the customer in the queue to open invoice details.", + "previous": "Previous customer needing review", + "selected_customer": "Selected customer" + }, + "errors": { + "fakturer_nu_failed_title": "Invoice now failed", + "fakturer_nu_failed_body": "Could not create invoice for this customer. Try again, or check the customer's transactions." + }, + "headline": { + "aria_label": "Period headline figures", + "booked": "Booked", + "not_booked": "Not booked", + "total": "Total" + }, + "navigation": { + "agreements": "Agreements", + "aria_label": "Business views", + "billing": "Invoicing", + "operations": "Operations", + "review": "Review" + }, + "next_actions": { + "create_invoice": "Create invoice", + "none": "No action needed", + "resolve_collection_errors": "Fix collection errors", + "resolve_draft": "Resolve draft", + "resolve_manual_flags": "Resolve manual flags", + "review_warnings": "Review warnings", + "wait_for_export": "Wait for export" + }, + "queue": { + "count": "{count} customers", + "title": "Customers to review" + }, + "reasons": { + "automatic_flags": "Automatic warnings", + "automatic_warnings": "Automatic warnings", + "collection_errors": "Invoice collection errors", + "completed": "Everything is booked", + "draft": "Draft is blocking", + "draft_blocks_action": "Draft is blocking", + "export_in_progress": "Export is in progress", + "manual_flags": "Manual flags need action", + "queued": "Invoice is queued", + "ready_to_invoice": "Ready to invoice", + "requires_action": "Needs review", + "unbooked_transactions": "Unbooked transactions" + }, + "severities": { + "blue": "Queued", + "green": "Ready", + "red": "Blocked", + "yellow": "Warning" + }, + "sort": { + "customer_name": "Customer name", + "customer_number": "Customer number", + "priority": "Priority first", + "total_amount": "Amount" + }, + "states": { + "attention": "Needs attention", + "blocked": "Blocked", + "completed": "Completed", + "empty_body": "Choose another period or business view.", + "empty_title": "No invoice data in this period", + "error_body": "Try reloading the period.", + "error_title": "The invoice period could not be loaded", + "filtered_empty_body": "Reset the workflow filters or try another search.", + "filtered_empty_title": "No customers match the filters", + "loading_body": "Collecting customers, invoice collections, and review points…", + "loading_title": "Loading invoice period", + "queued": "Queued", + "ready": "Ready to invoice", + "refreshing": "Refreshing the current result…", + "retained_error": "The refresh failed. The most recently loaded result is still shown." + }, + "toolbar": { + "all_departments": "All departments", + "all_invoice_states": "All invoice states", + "all_severities": "All levels", + "all_states": "All states", + "change_direction": "Change sort direction", + "clear_filters": "Clear filters", + "department": "Department", + "invoice_state": "Invoice state", + "reload": "Reload", + "retry": "Try again", + "search": "Search customers and invoice data", + "severity": "Severity", + "sort": "Sort", + "workflow": "Workflow" + } } } } diff --git a/src/i18n/source/no/phrases/compat/invoicing_period/review_workspace.json b/src/i18n/source/no/phrases/compat/invoicing_period/review_workspace.json index 7fa9ca67..d9e7aaef 100644 --- a/src/i18n/source/no/phrases/compat/invoicing_period/review_workspace.json +++ b/src/i18n/source/no/phrases/compat/invoicing_period/review_workspace.json @@ -1,15 +1,106 @@ { - "compat": { "invoicing_period": { "review_workspace": { - "analytics": { "title": "Oversikt og nøkkeltall" }, - "detail": { "next": "Neste kunde til gjennomgang", "open_prompt": "Velg kunden i køen for å åpne fakturadetaljene.", "previous": "Forrige kunde til gjennomgang", "selected_customer": "Valgt kunde" }, - "headline": { "aria_label": "Periodens hovedtall", "booked": "Bokført", "not_booked": "Ikke bokført", "total": "Totalt" }, - "navigation": { "agreements": "Avtaler", "aria_label": "Forretningsvisninger", "billing": "Fakturering", "operations": "Drift", "review": "Gjennomgang" }, - "next_actions": { "create_invoice": "Opprett faktura", "none": "Ingen handling nødvendig", "resolve_collection_errors": "Rett feil i fakturasamling", "resolve_draft": "Avklar utkast", "resolve_manual_flags": "Avklar manuelle flagg", "review_warnings": "Gjennomgå advarsler", "wait_for_export": "Vent på eksport" }, - "queue": { "count": "{count} kunder", "title": "Kunder til gjennomgang" }, - "reasons": { "automatic_flags": "Automatiske advarsler", "automatic_warnings": "Automatiske advarsler", "collection_errors": "Feil i fakturasamling", "completed": "Alt er bokført", "draft": "Utkast blokkerer", "draft_blocks_action": "Utkast blokkerer", "export_in_progress": "Eksport pågår", "manual_flags": "Manuelle flagg krever handling", "queued": "Fakturaen er i kø", "ready_to_invoice": "Klar til fakturering", "requires_action": "Krever gjennomgang", "unbooked_transactions": "Ikke-bokførte transaksjoner" }, - "severities": { "blue": "I kø", "green": "Klar", "red": "Blokkert", "yellow": "Advarsel" }, - "sort": { "customer_name": "Kundenavn", "customer_number": "Kundenummer", "priority": "Viktigst først", "total_amount": "Beløp" }, - "states": { "attention": "Krever oppmerksomhet", "blocked": "Blokkert", "completed": "Ferdig", "empty_body": "Velg en annen periode eller forretningsvisning.", "empty_title": "Ingen fakturadata i perioden", "error_body": "Prøv å laste perioden på nytt.", "error_title": "Fakturaperioden kunne ikke lastes", "filtered_empty_body": "Nullstill arbeidsflytfiltrene eller prøv et annet søk.", "filtered_empty_title": "Ingen kunder samsvarer med filtrene", "loading_body": "Samler kunder, fakturasamlinger og kontrollpunkter…", "loading_title": "Laster fakturaperioden", "queued": "I kø", "ready": "Klar til fakturering", "refreshing": "Oppdaterer eksisterende resultat…", "retained_error": "Oppdateringen mislyktes. Det sist innlastede resultatet vises fortsatt." }, - "toolbar": { "all_departments": "Alle avdelinger", "all_invoice_states": "Alle fakturastatuser", "all_severities": "Alle nivåer", "all_states": "Alle tilstander", "change_direction": "Endre sorteringsretning", "clear_filters": "Tøm filtre", "department": "Avdeling", "invoice_state": "Fakturastatus", "reload": "Last på nytt", "retry": "Prøv igjen", "search": "Søk i kunder og fakturadata", "severity": "Alvor", "sort": "Sorter", "workflow": "Arbeidsflyt" } - } } } + "compat": { + "invoicing_period": { + "review_workspace": { + "analytics": { + "title": "Oversikt og nøkkeltall" + }, + "detail": { + "next": "Neste kunde til gjennomgang", + "open_prompt": "Velg kunden i køen for å åpne fakturadetaljene.", + "previous": "Forrige kunde til gjennomgang", + "selected_customer": "Valgt kunde" + }, + "errors": { + "fakturer_nu_failed_title": "Fakturer nå mislyktes", + "fakturer_nu_failed_body": "Kunne ikke opprette faktura for denne kunden. Prøv igjen, eller sjekk kundens transaksjoner." + }, + "headline": { + "aria_label": "Periodens hovedtall", + "booked": "Bokført", + "not_booked": "Ikke bokført", + "total": "Totalt" + }, + "navigation": { + "agreements": "Avtaler", + "aria_label": "Forretningsvisninger", + "billing": "Fakturering", + "operations": "Drift", + "review": "Gjennomgang" + }, + "next_actions": { + "create_invoice": "Opprett faktura", + "none": "Ingen handling nødvendig", + "resolve_collection_errors": "Rett feil i fakturasamling", + "resolve_draft": "Avklar utkast", + "resolve_manual_flags": "Avklar manuelle flagg", + "review_warnings": "Gjennomgå advarsler", + "wait_for_export": "Vent på eksport" + }, + "queue": { + "count": "{count} kunder", + "title": "Kunder til gjennomgang" + }, + "reasons": { + "automatic_flags": "Automatiske advarsler", + "automatic_warnings": "Automatiske advarsler", + "collection_errors": "Feil i fakturasamling", + "completed": "Alt er bokført", + "draft": "Utkast blokkerer", + "draft_blocks_action": "Utkast blokkerer", + "export_in_progress": "Eksport pågår", + "manual_flags": "Manuelle flagg krever handling", + "queued": "Fakturaen er i kø", + "ready_to_invoice": "Klar til fakturering", + "requires_action": "Krever gjennomgang", + "unbooked_transactions": "Ikke-bokførte transaksjoner" + }, + "severities": { + "blue": "I kø", + "green": "Klar", + "red": "Blokkert", + "yellow": "Advarsel" + }, + "sort": { + "customer_name": "Kundenavn", + "customer_number": "Kundenummer", + "priority": "Viktigst først", + "total_amount": "Beløp" + }, + "states": { + "attention": "Krever oppmerksomhet", + "blocked": "Blokkert", + "completed": "Ferdig", + "empty_body": "Velg en annen periode eller forretningsvisning.", + "empty_title": "Ingen fakturadata i perioden", + "error_body": "Prøv å laste perioden på nytt.", + "error_title": "Fakturaperioden kunne ikke lastes", + "filtered_empty_body": "Nullstill arbeidsflytfiltrene eller prøv et annet søk.", + "filtered_empty_title": "Ingen kunder samsvarer med filtrene", + "loading_body": "Samler kunder, fakturasamlinger og kontrollpunkter…", + "loading_title": "Laster fakturaperioden", + "queued": "I kø", + "ready": "Klar til fakturering", + "refreshing": "Oppdaterer eksisterende resultat…", + "retained_error": "Oppdateringen mislyktes. Det sist innlastede resultatet vises fortsatt." + }, + "toolbar": { + "all_departments": "Alle avdelinger", + "all_invoice_states": "Alle fakturastatuser", + "all_severities": "Alle nivåer", + "all_states": "Alle tilstander", + "change_direction": "Endre sorteringsretning", + "clear_filters": "Tøm filtre", + "department": "Avdeling", + "invoice_state": "Fakturastatus", + "reload": "Last på nytt", + "retry": "Prøv igjen", + "search": "Søk i kunder og fakturadata", + "severity": "Alvor", + "sort": "Sorter", + "workflow": "Arbeidsflyt" + } + } + } + } } diff --git a/src/i18n/source/sv/phrases/compat/invoicing_period/review_workspace.json b/src/i18n/source/sv/phrases/compat/invoicing_period/review_workspace.json index b5952798..75bbbcbc 100644 --- a/src/i18n/source/sv/phrases/compat/invoicing_period/review_workspace.json +++ b/src/i18n/source/sv/phrases/compat/invoicing_period/review_workspace.json @@ -1,15 +1,106 @@ { - "compat": { "invoicing_period": { "review_workspace": { - "analytics": { "title": "Översikt och nyckeltal" }, - "detail": { "next": "Nästa kund att granska", "open_prompt": "Välj kunden i kön för att öppna fakturadetaljerna.", "previous": "Föregående kund att granska", "selected_customer": "Vald kund" }, - "headline": { "aria_label": "Periodens huvudtal", "booked": "Bokfört", "not_booked": "Inte bokfört", "total": "Totalt" }, - "navigation": { "agreements": "Avtal", "aria_label": "Affärsvyer", "billing": "Fakturering", "operations": "Drift", "review": "Granskning" }, - "next_actions": { "create_invoice": "Skapa faktura", "none": "Ingen åtgärd behövs", "resolve_collection_errors": "Rätta samlingsfel", "resolve_draft": "Hantera utkast", "resolve_manual_flags": "Hantera manuella flaggor", "review_warnings": "Granska varningar", "wait_for_export": "Vänta på export" }, - "queue": { "count": "{count} kunder", "title": "Kunder att granska" }, - "reasons": { "automatic_flags": "Automatiska varningar", "automatic_warnings": "Automatiska varningar", "collection_errors": "Fel i fakturasamling", "completed": "Allt är bokfört", "draft": "Utkast blockerar", "draft_blocks_action": "Utkast blockerar", "export_in_progress": "Export pågår", "manual_flags": "Manuella flaggor kräver åtgärd", "queued": "Fakturan ligger i kö", "ready_to_invoice": "Klar för fakturering", "requires_action": "Behöver granskas", "unbooked_transactions": "Ej bokförda transaktioner" }, - "severities": { "blue": "I kö", "green": "Klar", "red": "Blockerad", "yellow": "Varning" }, - "sort": { "customer_name": "Kundnamn", "customer_number": "Kundnummer", "priority": "Viktigast först", "total_amount": "Belopp" }, - "states": { "attention": "Behöver uppmärksamhet", "blocked": "Blockerad", "completed": "Klar", "empty_body": "Välj en annan period eller affärsvy.", "empty_title": "Inga fakturadata i perioden", "error_body": "Försök ladda perioden igen.", "error_title": "Fakturaperioden kunde inte laddas", "filtered_empty_body": "Nollställ arbetsflödesfiltren eller prova en annan sökning.", "filtered_empty_title": "Inga kunder matchar filtren", "loading_body": "Samlar kunder, fakturasamlingar och kontrollpunkter…", "loading_title": "Laddar fakturaperiod", "queued": "I kö", "ready": "Klar för fakturering", "refreshing": "Uppdaterar befintligt resultat…", "retained_error": "Uppdateringen misslyckades. Det senast laddade resultatet visas fortfarande." }, - "toolbar": { "all_departments": "Alla avdelningar", "all_invoice_states": "Alla fakturastatusar", "all_severities": "Alla nivåer", "all_states": "Alla tillstånd", "change_direction": "Ändra sorteringsriktning", "clear_filters": "Rensa filter", "department": "Avdelning", "invoice_state": "Fakturastatus", "reload": "Ladda om", "retry": "Försök igen", "search": "Sök kunder och fakturadata", "severity": "Allvar", "sort": "Sortera", "workflow": "Arbetsflöde" } - } } } + "compat": { + "invoicing_period": { + "review_workspace": { + "analytics": { + "title": "Översikt och nyckeltal" + }, + "detail": { + "next": "Nästa kund att granska", + "open_prompt": "Välj kunden i kön för att öppna fakturadetaljerna.", + "previous": "Föregående kund att granska", + "selected_customer": "Vald kund" + }, + "errors": { + "fakturer_nu_failed_title": "Fakturera nu misslyckades", + "fakturer_nu_failed_body": "Kunde inte skapa faktura för denna kund. Försök igen, eller kontrollera kundens transaktioner." + }, + "headline": { + "aria_label": "Periodens huvudtal", + "booked": "Bokfört", + "not_booked": "Inte bokfört", + "total": "Totalt" + }, + "navigation": { + "agreements": "Avtal", + "aria_label": "Affärsvyer", + "billing": "Fakturering", + "operations": "Drift", + "review": "Granskning" + }, + "next_actions": { + "create_invoice": "Skapa faktura", + "none": "Ingen åtgärd behövs", + "resolve_collection_errors": "Rätta samlingsfel", + "resolve_draft": "Hantera utkast", + "resolve_manual_flags": "Hantera manuella flaggor", + "review_warnings": "Granska varningar", + "wait_for_export": "Vänta på export" + }, + "queue": { + "count": "{count} kunder", + "title": "Kunder att granska" + }, + "reasons": { + "automatic_flags": "Automatiska varningar", + "automatic_warnings": "Automatiska varningar", + "collection_errors": "Fel i fakturasamling", + "completed": "Allt är bokfört", + "draft": "Utkast blockerar", + "draft_blocks_action": "Utkast blockerar", + "export_in_progress": "Export pågår", + "manual_flags": "Manuella flaggor kräver åtgärd", + "queued": "Fakturan ligger i kö", + "ready_to_invoice": "Klar för fakturering", + "requires_action": "Behöver granskas", + "unbooked_transactions": "Ej bokförda transaktioner" + }, + "severities": { + "blue": "I kö", + "green": "Klar", + "red": "Blockerad", + "yellow": "Varning" + }, + "sort": { + "customer_name": "Kundnamn", + "customer_number": "Kundnummer", + "priority": "Viktigast först", + "total_amount": "Belopp" + }, + "states": { + "attention": "Behöver uppmärksamhet", + "blocked": "Blockerad", + "completed": "Klar", + "empty_body": "Välj en annan period eller affärsvy.", + "empty_title": "Inga fakturadata i perioden", + "error_body": "Försök ladda perioden igen.", + "error_title": "Fakturaperioden kunde inte laddas", + "filtered_empty_body": "Nollställ arbetsflödesfiltren eller prova en annan sökning.", + "filtered_empty_title": "Inga kunder matchar filtren", + "loading_body": "Samlar kunder, fakturasamlingar och kontrollpunkter…", + "loading_title": "Laddar fakturaperiod", + "queued": "I kö", + "ready": "Klar för fakturering", + "refreshing": "Uppdaterar befintligt resultat…", + "retained_error": "Uppdateringen misslyckades. Det senast laddade resultatet visas fortfarande." + }, + "toolbar": { + "all_departments": "Alla avdelningar", + "all_invoice_states": "Alla fakturastatusar", + "all_severities": "Alla nivåer", + "all_states": "Alla tillstånd", + "change_direction": "Ändra sorteringsriktning", + "clear_filters": "Rensa filter", + "department": "Avdelning", + "invoice_state": "Fakturastatus", + "reload": "Ladda om", + "retry": "Försök igen", + "search": "Sök kunder och fakturadata", + "severity": "Allvar", + "sort": "Sortera", + "workflow": "Arbetsflöde" + } + } + } + } } diff --git a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/InvoicingBillingPeriodDatePeriodSelector.vue b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/InvoicingBillingPeriodDatePeriodSelector.vue index d6a3b710..df172647 100644 --- a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/InvoicingBillingPeriodDatePeriodSelector.vue +++ b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/InvoicingBillingPeriodDatePeriodSelector.vue @@ -19,7 +19,6 @@ const concreteDateShortcutIds = [ "same_month_last_year", ]; const onSelectionChange = (startDate: Date, endDate: Date) => { - console.log("Selection changed:", startDate, endDate); showReloadAnimation(); dates.functions.setSelection(startDate, endDate); }; diff --git a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/layout/SmallCustomerActivityChart.vue b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/layout/SmallCustomerActivityChart.vue index 6d0e472a..d276ae1e 100644 --- a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/layout/SmallCustomerActivityChart.vue +++ b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/displays/layout/SmallCustomerActivityChart.vue @@ -32,7 +32,6 @@ import { Line } from 'vue-chartjs'; ChartJS.register(Title, Tooltip, Legend, CategoryScale, LinearScale, BarElement, PointElement, LineElement, Colors); const parseTransactions = () => { - console.log('Parsing transactions for chart data...', props.transactions.length, 'transactions found.'); const labels = []; const data = []; props.transactions.forEach(transaction => { diff --git a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/services/invoicingPeriodTranslation.js b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/services/invoicingPeriodTranslation.js index 962a6121..a22457ee 100644 --- a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/services/invoicingPeriodTranslation.js +++ b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/services/invoicingPeriodTranslation.js @@ -8,6 +8,10 @@ const REVIEW_WORKSPACE_TRANSLATORS = { composer.t("invoicing_period.review_workspace.detail.previous", params), "detail.selected_customer": (composer, params) => composer.t("invoicing_period.review_workspace.detail.selected_customer", params), + "errors.fakturer_nu_failed_title": (composer, params) => + composer.t("invoicing_period.review_workspace.errors.fakturer_nu_failed_title", params), + "errors.fakturer_nu_failed_body": (composer, params) => + composer.t("invoicing_period.review_workspace.errors.fakturer_nu_failed_body", params), "headline.aria_label": (composer, params) => composer.t("invoicing_period.review_workspace.headline.aria_label", params), "headline.booked": (composer, params) => diff --git a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/views/InvoicingBillingPeriodViewAll.vue b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/views/InvoicingBillingPeriodViewAll.vue index 1a05d893..c09b4ca6 100644 --- a/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/views/InvoicingBillingPeriodViewAll.vue +++ b/src/views/dashboards/superUserDashboard/InvoicingBillingPeriod/views/InvoicingBillingPeriodViewAll.vue @@ -38,6 +38,7 @@ import { } from "../utils/possibleDuplicateGroups.js"; import { deriveLegacyPeriodCustomerReview } from "../services/invoicingPeriodReview.js"; import { translateInvoicingPeriodReview } from "../services/invoicingPeriodTranslation.js"; +import Swal from "sweetalert2"; const expandedDuplicateGroupKey = ref(null); const tr = (key: string, fallback: string, params: Record = {}) => @@ -552,7 +553,11 @@ const onClickInvoiceNow = async (customer: any, transactionIds: number[]) => { queueInvoiceCollections(invoiceCollectionIds, customer); } catch (error: any) { invoiceQueue.finishPeriodRefresh?.([customerNumber], []); - console.error("Error queueing invoice collection:", error); + await Swal.fire({ + title: tr("errors.fakturer_nu_failed_title", "Fakturer nu mislykkedes"), + text: tr("errors.fakturer_nu_failed_body", "Kunne ikke oprette faktura for denne kunde. Prøv igen, eller tjek kundens transaktioner."), + icon: "error", + }); } };