fix(pleno-vue): surface Fakturer nu errors to user + remove debug console.logs (#273)

## 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 <agent@copenhagentruckwash.local>
This commit is contained in:
Jeppe B
2026-08-09 23:16:05 +02:00
committed by GitHub
co-authored by Truck Wash Agent
parent f5ccb2a2a9
commit 50535dbed0
14 changed files with 538 additions and 64 deletions
+4
View File
@@ -4587,6 +4587,10 @@
"previous": "Forrige kunde til gennemgang", "previous": "Forrige kunde til gennemgang",
"selected_customer": "Valgt kunde" "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": { "headline": {
"aria_label": "Periodens hovedtal", "aria_label": "Periodens hovedtal",
"booked": "Bogført", "booked": "Bogført",
+4
View File
@@ -4697,6 +4697,10 @@
"previous": "Vorheriger zu prüfender Kunde", "previous": "Vorheriger zu prüfender Kunde",
"selected_customer": "Ausgewählter 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": { "headline": {
"aria_label": "Kennzahlen des Zeitraums", "aria_label": "Kennzahlen des Zeitraums",
"booked": "Gebucht", "booked": "Gebucht",
+4
View File
@@ -4418,6 +4418,10 @@
"previous": "Previous customer needing review", "previous": "Previous customer needing review",
"selected_customer": "Selected customer" "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": { "headline": {
"aria_label": "Period headline figures", "aria_label": "Period headline figures",
"booked": "Booked", "booked": "Booked",
+4
View File
@@ -4700,6 +4700,10 @@
"previous": "Forrige kunde til gjennomgang", "previous": "Forrige kunde til gjennomgang",
"selected_customer": "Valgt kunde" "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": { "headline": {
"aria_label": "Periodens hovedtall", "aria_label": "Periodens hovedtall",
"booked": "Bokført", "booked": "Bokført",
+4
View File
@@ -4750,6 +4750,10 @@
"previous": "Föregående kund att granska", "previous": "Föregående kund att granska",
"selected_customer": "Vald kund" "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": { "headline": {
"aria_label": "Periodens huvudtal", "aria_label": "Periodens huvudtal",
"booked": "Bokfört", "booked": "Bokfört",
@@ -2,17 +2,104 @@
"compat": { "compat": {
"invoicing_period": { "invoicing_period": {
"review_workspace": { "review_workspace": {
"analytics": { "title": "Overblik og nøgletal" }, "analytics": {
"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" }, "title": "Overblik og nøgletal"
"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" }, "detail": {
"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" }, "next": "Næste kunde til gennemgang",
"queue": { "count": "{count} kunder", "title": "Kunder til gennemgang" }, "open_prompt": "Vælg kunden i køen for at åbne fakturadetaljerne.",
"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" }, "previous": "Forrige kunde til gennemgang",
"severities": { "blue": "I kø", "green": "Klar", "red": "Blokeret", "yellow": "Advarsel" }, "selected_customer": "Valgt kunde"
"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." }, "errors": {
"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" } "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"
}
} }
} }
} }
@@ -1,15 +1,106 @@
{ {
"compat": { "invoicing_period": { "review_workspace": { "compat": {
"analytics": { "title": "Übersicht und Kennzahlen" }, "invoicing_period": {
"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" }, "review_workspace": {
"headline": { "aria_label": "Kennzahlen des Zeitraums", "booked": "Gebucht", "not_booked": "Nicht gebucht", "total": "Gesamt" }, "analytics": {
"navigation": { "agreements": "Vereinbarungen", "aria_label": "Geschäftsansichten", "billing": "Rechnungsstellung", "operations": "Betrieb", "review": "Prüfung" }, "title": "Übersicht und Kennzahlen"
"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" }, "detail": {
"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" }, "next": "Nächster zu prüfender Kunde",
"severities": { "blue": "Eingereiht", "green": "Bereit", "red": "Blockiert", "yellow": "Warnung" }, "open_prompt": "Wählen Sie den Kunden in der Warteschlange, um die Rechnungsdetails zu öffnen.",
"sort": { "customer_name": "Kundenname", "customer_number": "Kundennummer", "priority": "Priorität zuerst", "total_amount": "Betrag" }, "previous": "Vorheriger zu prüfender Kunde",
"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." }, "selected_customer": "Ausgewählter Kunde"
"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" } },
} } } "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"
}
}
}
}
} }
@@ -2,17 +2,104 @@
"compat": { "compat": {
"invoicing_period": { "invoicing_period": {
"review_workspace": { "review_workspace": {
"analytics": { "title": "Overview and key figures" }, "analytics": {
"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" }, "title": "Overview and key figures"
"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" }, "detail": {
"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" }, "next": "Next customer needing review",
"queue": { "count": "{count} customers", "title": "Customers to review" }, "open_prompt": "Select the customer in the queue to open invoice details.",
"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" }, "previous": "Previous customer needing review",
"severities": { "blue": "Queued", "green": "Ready", "red": "Blocked", "yellow": "Warning" }, "selected_customer": "Selected customer"
"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." }, "errors": {
"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" } "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"
}
} }
} }
} }
@@ -1,15 +1,106 @@
{ {
"compat": { "invoicing_period": { "review_workspace": { "compat": {
"analytics": { "title": "Oversikt og nøkkeltall" }, "invoicing_period": {
"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" }, "review_workspace": {
"headline": { "aria_label": "Periodens hovedtall", "booked": "Bokført", "not_booked": "Ikke bokført", "total": "Totalt" }, "analytics": {
"navigation": { "agreements": "Avtaler", "aria_label": "Forretningsvisninger", "billing": "Fakturering", "operations": "Drift", "review": "Gjennomgang" }, "title": "Oversikt og nøkkeltall"
"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" }, "detail": {
"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" }, "next": "Neste kunde til gjennomgang",
"severities": { "blue": "I kø", "green": "Klar", "red": "Blokkert", "yellow": "Advarsel" }, "open_prompt": "Velg kunden i køen for å åpne fakturadetaljene.",
"sort": { "customer_name": "Kundenavn", "customer_number": "Kundenummer", "priority": "Viktigst først", "total_amount": "Beløp" }, "previous": "Forrige kunde til gjennomgang",
"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." }, "selected_customer": "Valgt kunde"
"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" } },
} } } "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"
}
}
}
}
} }
@@ -1,15 +1,106 @@
{ {
"compat": { "invoicing_period": { "review_workspace": { "compat": {
"analytics": { "title": "Översikt och nyckeltal" }, "invoicing_period": {
"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" }, "review_workspace": {
"headline": { "aria_label": "Periodens huvudtal", "booked": "Bokfört", "not_booked": "Inte bokfört", "total": "Totalt" }, "analytics": {
"navigation": { "agreements": "Avtal", "aria_label": "Affärsvyer", "billing": "Fakturering", "operations": "Drift", "review": "Granskning" }, "title": "Översikt och nyckeltal"
"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" }, "detail": {
"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" }, "next": "Nästa kund att granska",
"severities": { "blue": "I kö", "green": "Klar", "red": "Blockerad", "yellow": "Varning" }, "open_prompt": "Välj kunden i kön för att öppna fakturadetaljerna.",
"sort": { "customer_name": "Kundnamn", "customer_number": "Kundnummer", "priority": "Viktigast först", "total_amount": "Belopp" }, "previous": "Föregående kund att granska",
"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." }, "selected_customer": "Vald kund"
"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" } },
} } } "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"
}
}
}
}
} }
@@ -19,7 +19,6 @@ const concreteDateShortcutIds = [
"same_month_last_year", "same_month_last_year",
]; ];
const onSelectionChange = (startDate: Date, endDate: Date) => { const onSelectionChange = (startDate: Date, endDate: Date) => {
console.log("Selection changed:", startDate, endDate);
showReloadAnimation(); showReloadAnimation();
dates.functions.setSelection(startDate, endDate); dates.functions.setSelection(startDate, endDate);
}; };
@@ -32,7 +32,6 @@ import { Line } from 'vue-chartjs';
ChartJS.register(Title, Tooltip, Legend, CategoryScale, LinearScale, BarElement, PointElement, LineElement, Colors); ChartJS.register(Title, Tooltip, Legend, CategoryScale, LinearScale, BarElement, PointElement, LineElement, Colors);
const parseTransactions = () => { const parseTransactions = () => {
console.log('Parsing transactions for chart data...', props.transactions.length, 'transactions found.');
const labels = []; const labels = [];
const data = []; const data = [];
props.transactions.forEach(transaction => { props.transactions.forEach(transaction => {
@@ -8,6 +8,10 @@ const REVIEW_WORKSPACE_TRANSLATORS = {
composer.t("invoicing_period.review_workspace.detail.previous", params), composer.t("invoicing_period.review_workspace.detail.previous", params),
"detail.selected_customer": (composer, params) => "detail.selected_customer": (composer, params) =>
composer.t("invoicing_period.review_workspace.detail.selected_customer", 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) => "headline.aria_label": (composer, params) =>
composer.t("invoicing_period.review_workspace.headline.aria_label", params), composer.t("invoicing_period.review_workspace.headline.aria_label", params),
"headline.booked": (composer, params) => "headline.booked": (composer, params) =>
@@ -38,6 +38,7 @@ import {
} from "../utils/possibleDuplicateGroups.js"; } from "../utils/possibleDuplicateGroups.js";
import { deriveLegacyPeriodCustomerReview } from "../services/invoicingPeriodReview.js"; import { deriveLegacyPeriodCustomerReview } from "../services/invoicingPeriodReview.js";
import { translateInvoicingPeriodReview } from "../services/invoicingPeriodTranslation.js"; import { translateInvoicingPeriodReview } from "../services/invoicingPeriodTranslation.js";
import Swal from "sweetalert2";
const expandedDuplicateGroupKey = ref<string | null>(null); const expandedDuplicateGroupKey = ref<string | null>(null);
const tr = (key: string, fallback: string, params: Record<string, any> = {}) => const tr = (key: string, fallback: string, params: Record<string, any> = {}) =>
@@ -552,7 +553,11 @@ const onClickInvoiceNow = async (customer: any, transactionIds: number[]) => {
queueInvoiceCollections(invoiceCollectionIds, customer); queueInvoiceCollections(invoiceCollectionIds, customer);
} catch (error: any) { } catch (error: any) {
invoiceQueue.finishPeriodRefresh?.([customerNumber], []); 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",
});
} }
}; };