diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 00000000..293bcbd7 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,51 @@ +{ + "permissions": { + "allow": [ + "mcp__dual-graph__graph_scan", + "mcp__dual-graph__graph_continue", + "Bash(find G:ResgridResgridCoreResgrid.ModelBilling -type f -name *.cs)", + "Bash(python3:*)", + "Bash(xargs grep:*)", + "Bash(grep -E \"\\\\.cs$|Program\")", + "Bash(grep -l \"DepartmentMembers\\\\|DepartmentMember\" \"G:\\\\Resgrid\\\\Resgrid/Repositories/Resgrid.Repositories.DataRepository/\"*.cs)", + "Bash(find /g/Resgrid/Resgrid/Repositories/Resgrid.Repositories.DataRepository/Servers -name *.cs)", + "Bash(find G:/Resgrid/Resgrid -newer G:/Resgrid/Resgrid/CLAUDE.md -name *.cs -not -path */obj/* -not -path */.git/*)", + "Bash(dotnet build:*)" + ] + }, + "hooks": { + "SessionStart": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "powershell -NoProfile -File \"G:/Resgrid/Resgrid/.dual-graph/prime.ps1\"" + } + ] + } + ], + "Stop": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "powershell -NoProfile -File \"G:/Resgrid/Resgrid/.dual-graph/stop_hook.ps1\"" + } + ] + } + ], + "PreCompact": [ + { + "matcher": "", + "hooks": [ + { + "type": "command", + "command": "powershell -NoProfile -File \"G:/Resgrid/Resgrid/.dual-graph/prime.ps1\"" + } + ] + } + ] + } +} diff --git a/.gitignore b/.gitignore index b3ad9276..2d0321e8 100644 --- a/.gitignore +++ b/.gitignore @@ -272,3 +272,4 @@ Web/Resgrid.WebCore/wwwroot/js/ng/* Web/Resgrid.WebCore/wwwroot/lib/* /Web/Resgrid.Web/wwwroot/lib .dual-graph/ +.claude/settings.local.json diff --git a/CLAUDE.md b/CLAUDE.md index a306ab6f..ae750bf4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -92,98 +92,3 @@ When the user signals they are done (e.g. "bye", "done", "wrap up", "end session - **Next Steps**: bullet list, max 3 items Keep `CONTEXT.md` under 20 lines total. Do NOT summarize the full conversation — only what's needed to resume next session. - ---- - -# Coding Standards - -## General - -Write C# code that maximises readability, maintainability, and correctness while minimising complexity and coupling. Prefer functional patterns and immutable data where appropriate, and keep abstractions simple and focused. - -- Write clear, self-documenting code -- Keep abstractions simple and focused -- Minimise dependencies and coupling -- Use modern C# features appropriately -- Use the repository pattern with Dapper at the repository layer for SQL Server and PostgreSQL database communication - -## Code Organisation - -**Use meaningful names — no unclear abbreviations:** -```csharp -// Good -public async Task> ProcessOrderAsync(OrderRequest request, CancellationToken cancellationToken) - -// Avoid -public async Task> ProcAsync(ReqDto r, CancellationToken ct) -``` - -**Separate state from behaviour:** -```csharp -// Good -public sealed record Order(OrderId Id, List Lines); - -public static class OrderOperations -{ - public static decimal CalculateTotal(Order order) => - order.Lines.Sum(line => line.Price * line.Quantity); -} -``` - -**Prefer pure methods — avoid hidden side effects:** -```csharp -// Good -public static decimal CalculateTotalPrice(IEnumerable lines, decimal taxRate) => - lines.Sum(line => line.Price * line.Quantity) * (1 + taxRate); - -// Avoid -public void CalculateAndUpdateTotalPrice() -{ - this.Total = this.Lines.Sum(l => l.Price * l.Quantity); - this.UpdateDatabase(); -} -``` - -**Use extension methods for domain-specific operations:** -```csharp -public static class OrderExtensions -{ - public static bool CanBeFulfilled(this Order order, Inventory inventory) => - order.Lines.All(line => inventory.HasStock(line.ProductId, line.Quantity)); -} -``` - -**Design for testability — avoid hidden dependencies:** -```csharp -// Good: pure, easily testable -public static decimal CalculateDiscount(decimal price, int quantity, CustomerTier tier) => ... - -// Avoid: hidden service calls make this impossible to unit test -public decimal CalculateDiscount() -{ - var user = _userService.GetCurrentUser(); - var settings = _configService.GetSettings(); - ... -} -``` - -## Dependency Management - -**Minimise constructor injection — too many dependencies signal a design problem:** -```csharp -// Good -public sealed class OrderProcessor(IOrderRepository repository) { } - -// Avoid -public class OrderProcessor( - IOrderRepository repository, - ILogger logger, - IEmailService emailService, - IMetrics metrics, - IValidator validator) { } -``` - -**Prefer composition via interfaces:** -```csharp -public sealed class EnhancedLogger(ILogger baseLogger, IMetrics metrics) : ILogger { } -``` diff --git a/Core/Resgrid.Config/PaymentProviderConfig.cs b/Core/Resgrid.Config/PaymentProviderConfig.cs index 47ba61d8..991d37eb 100644 --- a/Core/Resgrid.Config/PaymentProviderConfig.cs +++ b/Core/Resgrid.Config/PaymentProviderConfig.cs @@ -25,6 +25,17 @@ public static class PaymentProviderConfig public static string TenEntityPackage = "6f4c5f8b-584d-4291-8a7d-29bf97ae6aa9"; public static string TenEntityPackageTest = "6f4c5f8b-584d-4291-8a7d-29bf97ae6aa9"; + public static string PaddleProductionApiKey = ""; + public static string PaddleTestApiKey = ""; + public static string PaddleProductionBillingWebhookSigningKey = ""; + public static string PaddleTestBillingWebhookSigningKey = ""; + public static string PaddlePTT10UserAddonPackage = ""; + public static string PaddlePTT10UserAddonPackageTest = ""; + public static string PaddleProductionEnvironment = "production"; + public static string PaddleTestEnvironment = "sandbox"; + public static string PaddleProductionClientToken = ""; + public static string PaddleTestClientToken = ""; + public static string GetStripeClientKey() { if (IsTestMode) @@ -72,5 +83,45 @@ public static string GetTenEntityPackageId() else return TenEntityPackage; } + + public static string GetPaddleApiKey() + { + if (IsTestMode) + return PaddleTestApiKey; + else + return PaddleProductionApiKey; + } + + public static string GetPaddleBillingWebhookSigningKey() + { + if (IsTestMode) + return PaddleTestBillingWebhookSigningKey; + else + return PaddleProductionBillingWebhookSigningKey; + } + + public static string GetPaddlePTT10UserAddonPackageId() + { + if (IsTestMode) + return PaddlePTT10UserAddonPackageTest; + else + return PaddlePTT10UserAddonPackage; + } + + public static string GetPaddleEnvironment() + { + if (IsTestMode) + return PaddleTestEnvironment; + else + return PaddleProductionEnvironment; + } + + public static string GetPaddleClientToken() + { + if (IsTestMode) + return PaddleTestClientToken; + else + return PaddleProductionClientToken; + } } } diff --git a/Core/Resgrid.Config/SystemBehaviorConfig.cs b/Core/Resgrid.Config/SystemBehaviorConfig.cs index 24e75cd1..8d9ab5c7 100644 --- a/Core/Resgrid.Config/SystemBehaviorConfig.cs +++ b/Core/Resgrid.Config/SystemBehaviorConfig.cs @@ -35,6 +35,12 @@ public static class SystemBehaviorConfig /// public static string BillingApiBaseUrl = ""; + /// + /// When true, new accounts must select and pay for a plan during registration. + /// Free tier signups are not allowed. Intended for EU-Central deployments. + /// + public static bool RequirePlanSelectionDuringSignup = false; + /// /// This will prevent the system from sending any outbound messages, for example /// email, push, text or call. Allows for testing the system without risk of sending diff --git a/Core/Resgrid.Config/TelemetryConfig.cs b/Core/Resgrid.Config/TelemetryConfig.cs index df61da32..def5b2f9 100644 --- a/Core/Resgrid.Config/TelemetryConfig.cs +++ b/Core/Resgrid.Config/TelemetryConfig.cs @@ -1,38 +1,10 @@ -namespace Resgrid.Config +namespace Resgrid.Config { public static class TelemetryConfig { public static string Exporter = ""; - public static TelemetryExporters ExporterType = TelemetryExporters.None; - public static string PostHogUrl = ""; - public static string PostHogApiKey = ""; - - public static string AptabaseUrl = ""; - public static string AptabaseWebApiKey = ""; - public static string AptabaseServicesApiKey = ""; - public static string AptabaseResponderApiKey = ""; - public static string AptabaseUnitApiKey = ""; - public static string AptabaseBigBoardApiKey = ""; - public static string AptabaseDispatchApiKey = ""; - public static string CountlyUrl = ""; public static string CountlyWebKey = ""; - - public static string GetAnalyticsKey() - { - if (ExporterType == TelemetryExporters.PostHog) - return PostHogApiKey; - else if (ExporterType == TelemetryExporters.Aptabase) - return AptabaseWebApiKey; - return string.Empty; - } - } - - public enum TelemetryExporters - { - None = 0, - PostHog = 1, - Aptabase = 2 } } diff --git a/Core/Resgrid.Localization/Account/Login.ar.resx b/Core/Resgrid.Localization/Account/Login.ar.resx index 4ea22f13..4d7ab328 100644 --- a/Core/Resgrid.Localization/Account/Login.ar.resx +++ b/Core/Resgrid.Localization/Account/Login.ar.resx @@ -198,4 +198,10 @@ اسم المستخدم + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Account/Login.de.resx b/Core/Resgrid.Localization/Account/Login.de.resx index e74b6984..09f4c679 100644 --- a/Core/Resgrid.Localization/Account/Login.de.resx +++ b/Core/Resgrid.Localization/Account/Login.de.resx @@ -203,4 +203,10 @@ Benutzername + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Account/Login.en.resx b/Core/Resgrid.Localization/Account/Login.en.resx index 63f91629..18f1f33d 100644 --- a/Core/Resgrid.Localization/Account/Login.en.resx +++ b/Core/Resgrid.Localization/Account/Login.en.resx @@ -252,4 +252,10 @@ Username + + Discount Code + + + Affiliate Code + \ No newline at end of file diff --git a/Core/Resgrid.Localization/Account/Login.es.resx b/Core/Resgrid.Localization/Account/Login.es.resx index 15a18815..5caaa286 100644 --- a/Core/Resgrid.Localization/Account/Login.es.resx +++ b/Core/Resgrid.Localization/Account/Login.es.resx @@ -252,4 +252,10 @@ Nombre de usuario + + Discount Code + + + Affiliate Code + \ No newline at end of file diff --git a/Core/Resgrid.Localization/Account/Login.fr.resx b/Core/Resgrid.Localization/Account/Login.fr.resx index bb552a69..82706429 100644 --- a/Core/Resgrid.Localization/Account/Login.fr.resx +++ b/Core/Resgrid.Localization/Account/Login.fr.resx @@ -203,4 +203,10 @@ Nom d'utilisateur + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Account/Login.it.resx b/Core/Resgrid.Localization/Account/Login.it.resx index 3514df92..d65770a5 100644 --- a/Core/Resgrid.Localization/Account/Login.it.resx +++ b/Core/Resgrid.Localization/Account/Login.it.resx @@ -203,4 +203,10 @@ Nome utente + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Account/Login.pl.resx b/Core/Resgrid.Localization/Account/Login.pl.resx index 6752e34e..954451df 100644 --- a/Core/Resgrid.Localization/Account/Login.pl.resx +++ b/Core/Resgrid.Localization/Account/Login.pl.resx @@ -203,4 +203,10 @@ Nazwa użytkownika + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Account/Login.sv.resx b/Core/Resgrid.Localization/Account/Login.sv.resx index 82d3d817..d42c26d1 100644 --- a/Core/Resgrid.Localization/Account/Login.sv.resx +++ b/Core/Resgrid.Localization/Account/Login.sv.resx @@ -203,4 +203,10 @@ Användarnamn + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Account/Login.uk.resx b/Core/Resgrid.Localization/Account/Login.uk.resx index 328a7c41..5c51a9e6 100644 --- a/Core/Resgrid.Localization/Account/Login.uk.resx +++ b/Core/Resgrid.Localization/Account/Login.uk.resx @@ -203,4 +203,10 @@ Ім'я користувача + + Discount Code + + + Affiliate Code + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.ar.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.ar.resx new file mode 100644 index 00000000..3cbcaffc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.ar.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + إضافة أتمتة + + + إضافة نموذج + + + نشط + + + ستحتاج إلى مطابقة أسماء الحقول المحددة أعلاه مع الحقول التي تريد تشغيلها. اترك قيمة الحقل فارغة لأي قيمة. + + + أتمتة المكالمات + + + قيمة المكالمة + + + تحذير: سيؤدي هذا إلى حذف هذا النموذج نهائيًا. هل أنت متأكد أنك تريد حذف النموذج + + + تعطيل + + + تفعيل + + + اسم الحقل + + + قيمة الحقل + + + مصمم النماذج + + + نموذج + + + اسم النموذج + + + النماذج + + + نوع النموذج + + + نموذج مكالمة جديدة + + + نموذج جديد + + + نموذج جديد + + + نموذج جديد + + + يمكنك فقط امتلاك نموذج واحد من نوع مكالمة جديدة نشط في وقت واحد. + + + العملية + + + النماذج + + + عرض + + + عرض النموذج + + + عرض النموذج + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.cs b/Core/Resgrid.Localization/Areas/User/Forms/Forms.cs new file mode 100644 index 00000000..31a73f0a --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Resgrid.Localization.Areas.User.Forms +{ + public class Forms + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.de.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.de.resx new file mode 100644 index 00000000..6f74d7ff --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.de.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Automatisierung hinzufügen + + + Formular hinzufügen + + + Aktiv + + + Sie müssen die oben angegebenen Feldnamen mit den Feldern abgleichen, auf die Sie operieren möchten. Lassen Sie den Feldwert für jeden Wert leer. + + + Anruf-Automatisierungen + + + Anrufwert + + + WARNUNG: Dadurch wird dieses Formular dauerhaft gelöscht. Sind Sie sicher, dass Sie das Formular löschen möchten + + + Deaktivieren + + + Aktivieren + + + Feldname + + + Feldwert + + + Formular-Designer + + + Formular + + + Formularname + + + Formulare + + + Formulartyp + + + Neues Anrufformular + + + Neues Formular + + + Neues Formular + + + Neues Formular + + + Sie können jeweils nur 1 aktives Formular vom Typ Neuer Anruf haben. + + + Operation + + + Formulare + + + Ansehen + + + Formular ansehen + + + Formular ansehen + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.en.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.en.resx new file mode 100644 index 00000000..5f2f375b --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.en.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add Automation + + + Add Form + + + Active + + + You will need to match the field names specificed above with the fields you want to operate on. Leave the field value blank for any value. + + + Call Automations + + + Call Value + + + WARNING: This will permanently delete this form. Are you sure you want to delete the form + + + Disable + + + Enable + + + Field Name + + + Field Value + + + Form Designer + + + Form + + + Form Name + + + Forms + + + Form Type + + + New Call Form + + + New Form + + + New Form + + + New Form + + + You can only have 1 New Call Form type active at a time. + + + Operation + + + Forms + + + View + + + View Form + + + View Form + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.es.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.es.resx new file mode 100644 index 00000000..292fb3a1 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.es.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Agregar automatización + + + Agregar formulario + + + Activo + + + Deberá hacer coincidir los nombres de campo especificados arriba con los campos en los que desea operar. Deje el valor del campo en blanco para cualquier valor. + + + Automatizaciones de llamadas + + + Valor de llamada + + + ADVERTENCIA: Esto eliminará permanentemente este formulario. ¿Está seguro de que desea eliminar el formulario + + + Deshabilitar + + + Habilitar + + + Nombre del campo + + + Valor del campo + + + Diseñador de formularios + + + Formulario + + + Nombre del formulario + + + Formularios + + + Tipo de formulario + + + Formulario de nueva llamada + + + Nuevo formulario + + + Nuevo formulario + + + Nuevo formulario + + + Solo puede tener 1 formulario de tipo Nueva llamada activo a la vez. + + + Operación + + + Formularios + + + Ver + + + Ver formulario + + + Ver formulario + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.fr.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.fr.resx new file mode 100644 index 00000000..5e058965 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.fr.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ajouter une automatisation + + + Ajouter un formulaire + + + Actif + + + Vous devrez faire correspondre les noms de champs spécifiés ci-dessus avec les champs sur lesquels vous souhaitez opérer. Laissez la valeur du champ vide pour toute valeur. + + + Automatisations d'appels + + + Valeur d'appel + + + AVERTISSEMENT : Cela supprimera définitivement ce formulaire. Êtes-vous sûr de vouloir supprimer le formulaire + + + Désactiver + + + Activer + + + Nom du champ + + + Valeur du champ + + + Concepteur de formulaire + + + Formulaire + + + Nom du formulaire + + + Formulaires + + + Type de formulaire + + + Formulaire de nouvel appel + + + Nouveau formulaire + + + Nouveau formulaire + + + Nouveau formulaire + + + Vous ne pouvez avoir qu'1 formulaire de type Nouvel appel actif à la fois. + + + Opération + + + Formulaires + + + Voir + + + Voir le formulaire + + + Voir le formulaire + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.it.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.it.resx new file mode 100644 index 00000000..807d9ff5 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.it.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aggiungi automazione + + + Aggiungi modulo + + + Attivo + + + Sarà necessario abbinare i nomi dei campi specificati sopra con i campi su cui si desidera operare. Lasciare il valore del campo vuoto per qualsiasi valore. + + + Automazioni chiamate + + + Valore chiamata + + + ATTENZIONE: Questo eliminerà definitivamente questo modulo. Sei sicuro di voler eliminare il modulo + + + Disabilita + + + Abilita + + + Nome campo + + + Valore campo + + + Designer modulo + + + Modulo + + + Nome modulo + + + Moduli + + + Tipo di modulo + + + Modulo nuova chiamata + + + Nuovo modulo + + + Nuovo modulo + + + Nuovo modulo + + + Puoi avere solo 1 modulo di tipo Nuova chiamata attivo alla volta. + + + Operazione + + + Moduli + + + Visualizza + + + Visualizza modulo + + + Visualizza modulo + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.pl.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.pl.resx new file mode 100644 index 00000000..493d38a2 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.pl.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Dodaj automatyzację + + + Dodaj formularz + + + Aktywny + + + Musisz dopasować nazwy pól określone powyżej do pól, na których chcesz operować. Pozostaw wartość pola pustą dla dowolnej wartości. + + + Automatyzacje połączeń + + + Wartość połączenia + + + OSTRZEŻENIE: To trwale usunie ten formularz. Czy na pewno chcesz usunąć formularz + + + Wyłącz + + + Włącz + + + Nazwa pola + + + Wartość pola + + + Projektant formularzy + + + Formularz + + + Nazwa formularza + + + Formularze + + + Typ formularza + + + Formularz nowego połączenia + + + Nowy formularz + + + Nowy formularz + + + Nowy formularz + + + Możesz mieć tylko 1 aktywny formularz typu Nowe połączenie na raz. + + + Operacja + + + Formularze + + + Wyświetl + + + Wyświetl formularz + + + Wyświetl formularz + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.sv.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.sv.resx new file mode 100644 index 00000000..7e7cd17e --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.sv.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Lägg till automatisering + + + Lägg till formulär + + + Aktiv + + + Du måste matcha fältnamnen som anges ovan med de fält du vill arbeta med. Lämna fältvärdet tomt för valfritt värde. + + + Samtalsautomatiseringar + + + Samtalsvärde + + + VARNING: Detta kommer att permanent ta bort detta formulär. Är du säker på att du vill ta bort formuläret + + + Inaktivera + + + Aktivera + + + Fältnamn + + + Fältvärde + + + Formulärdesigner + + + Formulär + + + Formulärnamn + + + Formulär + + + Formulärtyp + + + Nytt samtalsformulär + + + Nytt formulär + + + Nytt formulär + + + Nytt formulär + + + Du kan bara ha 1 aktivt formulär av typen Nytt samtal åt gången. + + + Operation + + + Formulär + + + Visa + + + Visa formulär + + + Visa formulär + + diff --git a/Core/Resgrid.Localization/Areas/User/Forms/Forms.uk.resx b/Core/Resgrid.Localization/Areas/User/Forms/Forms.uk.resx new file mode 100644 index 00000000..fb4306b0 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Forms/Forms.uk.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Додати автоматизацію + + + Додати форму + + + Активний + + + Вам потрібно зіставити назви полів, зазначені вище, з полями, на яких ви хочете виконувати операції. Залиште значення поля порожнім для будь-якого значення. + + + Автоматизації викликів + + + Значення виклику + + + УВАГА: Це назавжди видалить цю форму. Ви впевнені, що хочете видалити форму + + + Вимкнути + + + Увімкнути + + + Назва поля + + + Значення поля + + + Дизайнер форм + + + Форма + + + Назва форми + + + Форми + + + Тип форми + + + Форма нового виклику + + + Нова форма + + + Нова форма + + + Нова форма + + + Ви можете мати лише 1 активну форму типу Новий виклик одночасно. + + + Операція + + + Форми + + + Переглянути + + + Переглянути форму + + + Переглянути форму + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.ar.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.ar.resx new file mode 100644 index 00000000..abfc9266 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.ar.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + مجموعات القسم + + + المجموعات + + + إضافة مجموعة جديدة + + + إضافة مجموعة جديدة + + + اسم المجموعة + + + الأصل + + + بريد الإرسال + + + بريد الرسائل + + + الأعضاء + + + تنظيمي + + + محطة + + + لا شيء + + + السياج الجغرافي + + + حذف المجموعة + + + حذف المجموعة + + + هل أنت متأكد أنك تريد حذف هذه المجموعة؟ + + + إذا اخترت حذف هذه المجموعة، فسيتم إزالة معلومات المجموعة، مثل عناوين الإرسال والرسائل، مع المجموعة ولن يمكن استخدامها مرة أخرى. + + + تحتوي هذه المجموعة على مستخدمين نشطين، يجب عليك نقل المستخدمين أو حذفهم لتتمكن من حذف المجموعة. + + + تحتوي هذه المجموعة على مجموعات فرعية. ستحتاج إلى نقل أو حذف المجموعة الفرعية قبل حذف المجموعة. + + + تحتوي هذه المجموعة على وحدات مخصصة لها. ستحتاج إلى نقل الوحدة إلى مجموعة محطة أخرى أو حذف الوحدة لتتمكن من حذف المجموعة. + + + تحتوي هذه المجموعة على مجموعات مناوبات مخصصة لها. ستحتاج إلى إزالة مجموعات المناوبات هذه لتتمكن من حذف المجموعة. + + + انقر على مربع الاختيار أدناه لحذف هذه المجموعة. + + + إذا اخترت حذف هذه المجموعة، فسيتم حذف المعلومات أدناه بشكل دائم. لا يمكن التراجع عن هذه العملية. + + + البيانات المحذوفة + + + بيانات المجموعة + + + عضويات مجموعة الموظفين + + + عضويات مجموعة الوحدات + + + مخزون المجموعة + + + بيانات مناوبات المجموعة + + + تأكيد الحذف؟ + + + حذف المجموعة + + + مجموعة جديدة + + + مجموعة جديدة + + + نوع المجموعة + + + مجموعة تنظيمية + + + مجموعة المحطة + + + المجموعة الأصل + + + عنوان المحطة + + + تتطلب مجموعات المحطات موقعاً فعلياً (حيث يمكن للموظفين والوحدات الاستجابة لها). يرجى إدخال عنوان أو إحداثيات GPS أو عنوان what3words. + + + الشارع + + + المدينة + + + الولاية/المقاطعة + + + الرمز البريدي + + + الدولة + + + أو + + + إحداثيات GPS + + + خط العرض (التدوين العشري: مثل 39.1517) + + + خط الطول (التدوين العشري: مثل -119.4571) + + + عنوان what3words + + + عنوان w3w (مثل humble.echo.sticky) + + + طابعة PrintNode + + + PrintNode هي خدمة تتيح لنا إرسال مهام الطباعة إلى جهاز كمبيوتر أو خادم محلي على شبكتك إلى طابعة محددة. يجب أن يكون لديك حساب PrintNode نشط وبرنامجه مُعد مع الطابعة النشطة. + + + اختر الطابعة + + + يمكن للمستخدمين أن يكونوا في مجموعة واحدة فقط في كل مرة. إذا لم تجد مستخدمك في القائمة، فهو موجود بالفعل في مجموعة. + + + مسؤولو المجموعة + + + مستخدمو المجموعة + + + حفظ المجموعة + + + مفتاح API: + + + الحصول على الطابعات + + + الطابعة + + + إغلاق + + + تعديل المجموعة + + + تعديل المجموعة + + + طباعة المكالمات على الطابعة + + + سيؤدي تفعيل هذا الخيار إلى طباعة مكالمة على الطابعة المحددة عند إرفاق وحدة أو شخص من هذه المجموعة (إرساله) إلى مكالمة + + + السياج الجغرافي للمحطة + + + السياج الجغرافي للمحطة + + + السياج الجغرافي للمحطة + + + أدناه يمكنك إنشاء سياج جغرافي لمحطتك. الحقول باللون الأزرق المائل مطلوبة. تتيح لك الأسيجة الجغرافية إنشاء حدود على الخريطة تمثل منطقة الاستجابة لهذه المحطة. + + + لون المنطقة + + + حفظ السياج الجغرافي + + + مسح السياج الجغرافي + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.cs b/Core/Resgrid.Localization/Areas/User/Groups/Groups.cs new file mode 100644 index 00000000..596e7870 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Resgrid.Localization.Areas.User.Groups +{ + public class Groups + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.de.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.de.resx new file mode 100644 index 00000000..36ff7a0d --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.de.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Abteilungsgruppen + + + Gruppen + + + Neue Gruppe hinzufügen + + + Eine neue Gruppe hinzufügen + + + Gruppenname + + + Übergeordnet + + + Einsatz-E-Mail + + + Nachrichten-E-Mail + + + Mitglieder + + + Organisatorisch + + + Station + + + Keine + + + Geofence + + + Gruppe löschen + + + Gruppe löschen + + + Sind Sie sicher, dass Sie diese Gruppe löschen möchten? + + + Wenn Sie diese Gruppe löschen, werden die Gruppeninformationen, zum Beispiel Einsatz- und Nachrichtenadressen, zusammen mit der Gruppe entfernt und können nicht mehr verwendet werden. + + + Diese Gruppe hat aktive Benutzer, Sie müssen die Benutzer verschieben oder löschen, um die Gruppe löschen zu können. + + + Diese Gruppe hat untergeordnete Gruppen. Sie müssen die untergeordnete Gruppe verschieben oder löschen, bevor Sie die Gruppe löschen können. + + + Dieser Gruppe sind Einheiten zugewiesen. Sie müssen die Einheit in eine andere Stationsgruppe verschieben oder die Einheit löschen, um die Gruppe löschen zu können. + + + Dieser Gruppe sind Schichtgruppen zugewiesen. Sie müssen diese Schichtgruppen entfernen, Schichten einer Station\Gruppe zugewiesen, um die Gruppe löschen zu können. + + + Klicken Sie auf das Kontrollkästchen unten, um diese Gruppe zu löschen. + + + Wenn Sie diese Gruppe löschen, werden die folgenden Informationen dauerhaft gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden. + + + Gelöschte Daten + + + Gruppendaten + + + Personalgruppen-Mitgliedschaften + + + Einheitengruppen-Mitgliedschaften + + + Gruppeninventar + + + Gruppen-Schichtdaten + + + Löschen bestätigen? + + + Gruppe löschen + + + Neue Gruppe + + + Neue Gruppe + + + Gruppentyp + + + Organisationsgruppe + + + Stationsgruppe + + + Übergeordnete Gruppe + + + Stationsadresse + + + Stationsgruppen benötigen einen physischen Standort (da Personal und Einheiten auf sie reagieren können). Bitte geben Sie eine Adresse, GPS-Koordinaten oder eine what3words-Adresse ein. + + + Straße + + + Stadt + + + Bundesland/Provinz + + + Postleitzahl + + + Land + + + Oder + + + GPS-Koordinaten + + + Breitengrad (Dezimalnotation: z.B. 39.1517) + + + Längengrad (Dezimalnotation: z.B. -119.4571) + + + what3words-Adresse + + + w3w-Adresse (z.B. humble.echo.sticky) + + + PrintNode-Drucker + + + PrintNode ist ein Dienst, der es uns ermöglicht, Druckaufträge an einen lokalen Computer oder Server in Ihrem Netzwerk zu einem bestimmten Drucker zu senden. Sie müssen ein aktives PrintNode-Konto haben und dessen Software mit dem aktiven Drucker eingerichtet haben. + + + Drucker auswählen + + + Benutzer können jeweils nur in einer Gruppe sein. Wenn Sie Ihren Benutzer nicht in der Liste sehen, ist er bereits in einer Gruppe. + + + Gruppenadministratoren + + + Gruppenbenutzer + + + Gruppe speichern + + + API-Schlüssel: + + + Drucker abrufen + + + Drucker + + + Schließen + + + Gruppe bearbeiten + + + Gruppe bearbeiten + + + Einsätze auf Drucker drucken + + + Wenn diese Option aktiviert ist, wird ein Einsatz auf dem ausgewählten Drucker gedruckt, wenn eine Einheit oder Person dieser Gruppe einem Einsatz zugewiesen (disponiert) wird + + + Geofence-Station + + + Geofence-Station + + + Geofence-Station + + + Unten können Sie einen Geofence für Ihre Station erstellen. Felder in blauer Kursivschrift sind Pflichtfelder. Geofences ermöglichen es Ihnen, eine Grenze auf der Karte zu erstellen, die das Einsatzgebiet dieser Station darstellt. Dies wird verwendet, um Einsätze automatisch zu leiten und Reaktionen zu bestimmen. + + + Bezirksfarbe + + + Geofence speichern + + + Geofence löschen + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.en.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.en.resx new file mode 100644 index 00000000..849af6a2 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.en.resx @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Department Groups + + + Groups + + + Add New Group + + + Add a new Group + + + Group Name + + + Parent + + + Dispatch Email + + + Message Email + + + Members + + + Organizational + + + Station + + + None + + + Geofence + + + + + Delete Group + + + Delete Group + + + Are you sure you want to delete this group? + + + If you choose to delete this group the groups information, for example dispatch and message addresses will be removed with the group and won't be able to be used again. + + + This group has active users underneath it, you must move or delete the users to be able to delete the group. + + + This group has child groups under it. You will need to move or delete the child group before deleting the group. + + + This group has units assigned to it. You will need to move the unit to another Station Group or delete the unit to be able to delete the group. + + + This group has shift groups assigned to it. You will need to remove those shift groups, Shifts assigned to a Station\Group, to be able to delete the group. + + + Click the checkbox below to delete this group. + + + If you choose to delete this group the information below will be permanently deleted. This operation cannot be undone. + + + Data that is Deleted + + + Group Data + + + Personnel Group Memberships + + + Unit Group Memberships + + + Group Inventory + + + Group Shift Data + + + Confirm Delete? + + + Delete Group + + + + + New Group + + + New Group + + + Group type + + + Organizational Group + + + Station Group + + + Parent Group + + + Station Address + + + Station groups require a physical location (as personnel and units can respond to them). Please enter an Address or GPS Coordinates or a what3words address. + + + Street + + + City + + + State/Province + + + Zip/Postal Code + + + Country + + + Or + + + Gps Coordinates + + + Latitude (Decimal Notation: i.e. 39.1517) + + + Longitude (Decimal Notation: i.e. -119.4571) + + + what3words Address + + + w3w Address (i.e. humble.echo.sticky) + + + PrintNode Printer + + + PrintNode is a service that allows us to submit print jobs to a local computer or server on your network to a specific printer. You must have an active PrintNode account and it's software setup with the printer active. + + + Select Printer + + + Users can only be in one group at a time. If you don't see your user in the list they are already in a group. + + + Group Admins + + + Group Users + + + Save Group + + + Api Key: + + + Get Printers + + + Printer + + + Close + + + + + Edit Group + + + Edit Group + + + Print Calls to Printer + + + Enabling this option will print a call to the selected Printer when a unit or person from this group is attached (dispatched) to a call + + + + + Geofence Station + + + GeoFence Station + + + Geofence Station + + + Below you can create a geofence for your station. Fields in blue italics are required. Geofences allow you to create a boundary on the map that is this stations response area. This will be used to automatically route calls and determine responses. To create the Geofence first click on the map to create your start point then click again to draw a line, keep drawing lines until you have encircled the response area. + + + District Color + + + Save Geofence + + + Clear Geofence + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.es.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.es.resx new file mode 100644 index 00000000..ac53fd87 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.es.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Grupos del Departamento + + + Grupos + + + Agregar Nuevo Grupo + + + Agregar un nuevo Grupo + + + Nombre del Grupo + + + Principal + + + Correo de Despacho + + + Correo de Mensajes + + + Miembros + + + Organizacional + + + Estación + + + Ninguno + + + Geocerca + + + Eliminar Grupo + + + Eliminar Grupo + + + ¿Está seguro de que desea eliminar este grupo? + + + Si elige eliminar este grupo, la información del grupo, por ejemplo, las direcciones de despacho y mensajes se eliminarán con el grupo y no podrán usarse nuevamente. + + + Este grupo tiene usuarios activos debajo de él, debe mover o eliminar los usuarios para poder eliminar el grupo. + + + Este grupo tiene grupos secundarios debajo. Deberá mover o eliminar el grupo secundario antes de eliminar el grupo. + + + Este grupo tiene unidades asignadas. Deberá mover la unidad a otro Grupo de Estación o eliminar la unidad para poder eliminar el grupo. + + + Este grupo tiene grupos de turnos asignados. Deberá eliminar esos grupos de turnos, Turnos asignados a una Estación\Grupo, para poder eliminar el grupo. + + + Haga clic en la casilla de verificación a continuación para eliminar este grupo. + + + Si elige eliminar este grupo, la información a continuación se eliminará permanentemente. Esta operación no se puede deshacer. + + + Datos que se Eliminan + + + Datos del Grupo + + + Membresías de Grupo de Personal + + + Membresías de Grupo de Unidades + + + Inventario del Grupo + + + Datos de Turno del Grupo + + + ¿Confirmar Eliminación? + + + Eliminar Grupo + + + Nuevo Grupo + + + Nuevo Grupo + + + Tipo de Grupo + + + Grupo Organizacional + + + Grupo de Estación + + + Grupo Principal + + + Dirección de la Estación + + + Los grupos de estación requieren una ubicación física (ya que el personal y las unidades pueden responder a ellos). Por favor ingrese una Dirección, Coordenadas GPS o una dirección what3words. + + + Calle + + + Ciudad + + + Estado/Provincia + + + Código Postal + + + País + + + O + + + Coordenadas GPS + + + Latitud (Notación Decimal: ej. 39.1517) + + + Longitud (Notación Decimal: ej. -119.4571) + + + Dirección what3words + + + Dirección w3w (ej. humble.echo.sticky) + + + Impresora PrintNode + + + PrintNode es un servicio que nos permite enviar trabajos de impresión a una computadora o servidor local en su red a una impresora específica. Debe tener una cuenta activa de PrintNode y su software configurado con la impresora activa. + + + Seleccionar Impresora + + + Los usuarios solo pueden estar en un grupo a la vez. Si no ve su usuario en la lista, ya está en un grupo. + + + Administradores del Grupo + + + Usuarios del Grupo + + + Guardar Grupo + + + Clave API: + + + Obtener Impresoras + + + Impresora + + + Cerrar + + + Editar Grupo + + + Editar Grupo + + + Imprimir Llamadas en Impresora + + + Habilitar esta opción imprimirá una llamada en la impresora seleccionada cuando una unidad o persona de este grupo sea adjuntada (despachada) a una llamada + + + Geocerca de Estación + + + Geocerca de Estación + + + Geocerca de Estación + + + A continuación puede crear una geocerca para su estación. Los campos en cursiva azul son obligatorios. Las geocercas le permiten crear un límite en el mapa que es el área de respuesta de esta estación. Se usará para enrutar automáticamente las llamadas y determinar las respuestas. + + + Color del Distrito + + + Guardar Geocerca + + + Limpiar Geocerca + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.fr.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.fr.resx new file mode 100644 index 00000000..310744f3 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.fr.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Groupes du Département + + + Groupes + + + Ajouter un Nouveau Groupe + + + Ajouter un nouveau groupe + + + Nom du Groupe + + + Parent + + + E-mail de Répartition + + + E-mail de Messages + + + Membres + + + Organisationnel + + + Station + + + Aucun + + + Géorepérage + + + Supprimer le Groupe + + + Supprimer le Groupe + + + Êtes-vous sûr de vouloir supprimer ce groupe ? + + + Si vous choisissez de supprimer ce groupe, les informations du groupe, par exemple les adresses de répartition et de messages, seront supprimées avec le groupe et ne pourront plus être utilisées. + + + Ce groupe a des utilisateurs actifs, vous devez déplacer ou supprimer les utilisateurs pour pouvoir supprimer le groupe. + + + Ce groupe a des sous-groupes. Vous devrez déplacer ou supprimer le sous-groupe avant de supprimer le groupe. + + + Ce groupe a des unités assignées. Vous devrez déplacer l'unité vers un autre Groupe de Station ou supprimer l'unité pour pouvoir supprimer le groupe. + + + Ce groupe a des groupes de quarts assignés. Vous devrez supprimer ces groupes de quarts, les quarts assignés à une Station\Groupe, pour pouvoir supprimer le groupe. + + + Cliquez sur la case à cocher ci-dessous pour supprimer ce groupe. + + + Si vous choisissez de supprimer ce groupe, les informations ci-dessous seront définitivement supprimées. Cette opération ne peut pas être annulée. + + + Données Supprimées + + + Données du Groupe + + + Adhésions au Groupe du Personnel + + + Adhésions au Groupe des Unités + + + Inventaire du Groupe + + + Données de Quart du Groupe + + + Confirmer la Suppression ? + + + Supprimer le Groupe + + + Nouveau Groupe + + + Nouveau Groupe + + + Type de Groupe + + + Groupe Organisationnel + + + Groupe de Station + + + Groupe Parent + + + Adresse de la Station + + + Les groupes de station nécessitent un emplacement physique (car le personnel et les unités peuvent y répondre). Veuillez entrer une Adresse, des Coordonnées GPS ou une adresse what3words. + + + Rue + + + Ville + + + État/Province + + + Code Postal + + + Pays + + + Ou + + + Coordonnées GPS + + + Latitude (Notation Décimale : ex. 39.1517) + + + Longitude (Notation Décimale : ex. -119.4571) + + + Adresse what3words + + + Adresse w3w (ex. humble.echo.sticky) + + + Imprimante PrintNode + + + PrintNode est un service qui nous permet d'envoyer des travaux d'impression à un ordinateur ou serveur local de votre réseau vers une imprimante spécifique. Vous devez avoir un compte PrintNode actif et son logiciel configuré avec l'imprimante active. + + + Sélectionner l'Imprimante + + + Les utilisateurs ne peuvent être dans qu'un seul groupe à la fois. Si vous ne voyez pas votre utilisateur dans la liste, il est déjà dans un groupe. + + + Administrateurs du Groupe + + + Utilisateurs du Groupe + + + Enregistrer le Groupe + + + Clé API : + + + Obtenir les Imprimantes + + + Imprimante + + + Fermer + + + Modifier le Groupe + + + Modifier le Groupe + + + Imprimer les Appels sur Imprimante + + + L'activation de cette option imprimera un appel sur l'imprimante sélectionnée lorsqu'une unité ou une personne de ce groupe est attachée (déployée) à un appel + + + Géorepérage de Station + + + Géorepérage de Station + + + Géorepérage de Station + + + Ci-dessous, vous pouvez créer un géorepérage pour votre station. Les champs en italique bleu sont obligatoires. Les géorepérages vous permettent de créer une limite sur la carte qui correspond à la zone de réponse de cette station. + + + Couleur du District + + + Enregistrer le Géorepérage + + + Effacer le Géorepérage + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.it.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.it.resx new file mode 100644 index 00000000..ddf4cfce --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.it.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Gruppi del Dipartimento + + + Gruppi + + + Aggiungi Nuovo Gruppo + + + Aggiungi un nuovo Gruppo + + + Nome del Gruppo + + + Genitore + + + Email di Dispacciamento + + + Email dei Messaggi + + + Membri + + + Organizzativo + + + Stazione + + + Nessuno + + + Geofence + + + Elimina Gruppo + + + Elimina Gruppo + + + Sei sicuro di voler eliminare questo gruppo? + + + Se scegli di eliminare questo gruppo, le informazioni del gruppo, ad esempio gli indirizzi di dispacciamento e messaggi, verranno rimossi con il gruppo e non potranno essere utilizzati di nuovo. + + + Questo gruppo ha utenti attivi, devi spostare o eliminare gli utenti per poter eliminare il gruppo. + + + Questo gruppo ha sottogruppi. Devi spostare o eliminare il sottogruppo prima di eliminare il gruppo. + + + Questo gruppo ha unità assegnate. Devi spostare l'unità in un altro Gruppo Stazione o eliminare l'unità per poter eliminare il gruppo. + + + Questo gruppo ha gruppi di turni assegnati. Devi rimuovere quei gruppi di turni, Turni assegnati a una Stazione\Gruppo, per poter eliminare il gruppo. + + + Clicca sulla casella di controllo qui sotto per eliminare questo gruppo. + + + Se scegli di eliminare questo gruppo, le informazioni seguenti verranno eliminate definitivamente. Questa operazione non può essere annullata. + + + Dati Eliminati + + + Dati del Gruppo + + + Appartenenze al Gruppo del Personale + + + Appartenenze al Gruppo delle Unità + + + Inventario del Gruppo + + + Dati dei Turni del Gruppo + + + Conferma Eliminazione? + + + Elimina Gruppo + + + Nuovo Gruppo + + + Nuovo Gruppo + + + Tipo di Gruppo + + + Gruppo Organizzativo + + + Gruppo Stazione + + + Gruppo Genitore + + + Indirizzo della Stazione + + + I gruppi stazione richiedono una posizione fisica (poiché il personale e le unità possono rispondervi). Inserisci un Indirizzo, le Coordinate GPS o un indirizzo what3words. + + + Via + + + Città + + + Stato/Provincia + + + Codice Postale + + + Paese + + + O + + + Coordinate GPS + + + Latitudine (Notazione Decimale: es. 39.1517) + + + Longitudine (Notazione Decimale: es. -119.4571) + + + Indirizzo what3words + + + Indirizzo w3w (es. humble.echo.sticky) + + + Stampante PrintNode + + + PrintNode è un servizio che ci permette di inviare lavori di stampa a un computer o server locale nella tua rete a una stampante specifica. Devi avere un account PrintNode attivo e il suo software configurato con la stampante attiva. + + + Seleziona Stampante + + + Gli utenti possono essere in un solo gruppo alla volta. Se non vedi il tuo utente nell'elenco, è già in un gruppo. + + + Amministratori del Gruppo + + + Utenti del Gruppo + + + Salva Gruppo + + + Chiave API: + + + Ottieni Stampanti + + + Stampante + + + Chiudi + + + Modifica Gruppo + + + Modifica Gruppo + + + Stampa Chiamate sulla Stampante + + + L'abilitazione di questa opzione stamperà una chiamata sulla stampante selezionata quando un'unità o una persona di questo gruppo viene allegata (dispacciata) a una chiamata + + + Geofence Stazione + + + Geofence Stazione + + + Geofence Stazione + + + Qui sotto puoi creare un geofence per la tua stazione. I campi in corsivo blu sono obbligatori. I geofence ti permettono di creare un confine sulla mappa che è l'area di risposta di questa stazione. + + + Colore del Distretto + + + Salva Geofence + + + Cancella Geofence + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.pl.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.pl.resx new file mode 100644 index 00000000..f6a76c0d --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.pl.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Grupy Działu + + + Grupy + + + Dodaj Nową Grupę + + + Dodaj nową grupę + + + Nazwa Grupy + + + Nadrzędna + + + E-mail Dyspozytury + + + E-mail Wiadomości + + + Członkowie + + + Organizacyjna + + + Stacja + + + Brak + + + Geofence + + + Usuń Grupę + + + Usuń Grupę + + + Czy na pewno chcesz usunąć tę grupę? + + + Jeśli zdecydujesz się usunąć tę grupę, informacje o grupie, na przykład adresy dyspozytury i wiadomości, zostaną usunięte razem z grupą i nie będą mogły być ponownie użyte. + + + Ta grupa ma aktywnych użytkowników, musisz przenieść lub usunąć użytkowników, aby móc usunąć grupę. + + + Ta grupa ma podgrupy. Musisz przenieść lub usunąć podgrupę przed usunięciem grupy. + + + Ta grupa ma przypisane jednostki. Musisz przenieść jednostkę do innej Grupy Stacji lub usunąć jednostkę, aby móc usunąć grupę. + + + Ta grupa ma przypisane grupy zmian. Musisz usunąć te grupy zmian, Zmiany przypisane do Stacji\Grupy, aby móc usunąć grupę. + + + Kliknij pole wyboru poniżej, aby usunąć tę grupę. + + + Jeśli zdecydujesz się usunąć tę grupę, poniższe informacje zostaną trwale usunięte. Tej operacji nie można cofnąć. + + + Usuwane Dane + + + Dane Grupy + + + Członkostwa w Grupie Personelu + + + Członkostwa w Grupie Jednostek + + + Inwentarz Grupy + + + Dane Zmian Grupy + + + Potwierdź Usunięcie? + + + Usuń Grupę + + + Nowa Grupa + + + Nowa Grupa + + + Typ Grupy + + + Grupa Organizacyjna + + + Grupa Stacji + + + Grupa Nadrzędna + + + Adres Stacji + + + Grupy stacji wymagają fizycznej lokalizacji (ponieważ personel i jednostki mogą na nie reagować). Wprowadź Adres, Współrzędne GPS lub adres what3words. + + + Ulica + + + Miasto + + + Stan/Województwo + + + Kod Pocztowy + + + Kraj + + + Lub + + + Współrzędne GPS + + + Szerokość geograficzna (Notacja dziesiętna: np. 39.1517) + + + Długość geograficzna (Notacja dziesiętna: np. -119.4571) + + + Adres what3words + + + Adres w3w (np. humble.echo.sticky) + + + Drukarka PrintNode + + + PrintNode to usługa, która pozwala nam wysyłać zadania drukowania do lokalnego komputera lub serwera w Twojej sieci do konkretnej drukarki. Musisz mieć aktywne konto PrintNode i jego oprogramowanie skonfigurowane z aktywną drukarką. + + + Wybierz Drukarkę + + + Użytkownicy mogą być w tylko jednej grupie na raz. Jeśli nie widzisz swojego użytkownika na liście, jest już w grupie. + + + Administratorzy Grupy + + + Użytkownicy Grupy + + + Zapisz Grupę + + + Klucz API: + + + Pobierz Drukarki + + + Drukarka + + + Zamknij + + + Edytuj Grupę + + + Edytuj Grupę + + + Drukuj Wezwania na Drukarce + + + Włączenie tej opcji spowoduje wydrukowanie wezwania na wybranej drukarce, gdy jednostka lub osoba z tej grupy zostanie przydzielona (zadysponowana) do wezwania + + + Geofence Stacji + + + Geofence Stacji + + + Geofence Stacji + + + Poniżej możesz utworzyć geofence dla swojej stacji. Pola w niebieskiej kursywie są wymagane. Geofence umożliwia utworzenie granicy na mapie, która jest obszarem reagowania tej stacji. + + + Kolor Dystryktu + + + Zapisz Geofence + + + Wyczyść Geofence + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.sv.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.sv.resx new file mode 100644 index 00000000..61b8f3c5 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.sv.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Avdelningsgrupper + + + Grupper + + + Lägg till ny grupp + + + Lägg till en ny grupp + + + Gruppnamn + + + Överordnad + + + Utrycknings-e-post + + + Meddelande-e-post + + + Medlemmar + + + Organisatorisk + + + Station + + + Ingen + + + Geofence + + + Ta bort grupp + + + Ta bort grupp + + + Är du säker på att du vill ta bort den här gruppen? + + + Om du väljer att ta bort den här gruppen kommer gruppens information, till exempel utrycknings- och meddelandeadresser, att tas bort med gruppen och kan inte användas igen. + + + Den här gruppen har aktiva användare under sig, du måste flytta eller ta bort användarna för att kunna ta bort gruppen. + + + Den här gruppen har undergrupper. Du måste flytta eller ta bort undergruppen innan du tar bort gruppen. + + + Den här gruppen har enheter tilldelade till sig. Du måste flytta enheten till en annan stationsgrupp eller ta bort enheten för att kunna ta bort gruppen. + + + Den här gruppen har skiftgrupper tilldelade till sig. Du måste ta bort dessa skiftgrupper, skift tilldelade till en Station\Grupp, för att kunna ta bort gruppen. + + + Klicka på kryssrutan nedan för att ta bort den här gruppen. + + + Om du väljer att ta bort den här gruppen kommer informationen nedan att raderas permanent. Denna åtgärd kan inte ångras. + + + Data som tas bort + + + Gruppdata + + + Personalgruppmedlemskap + + + Enhetsgruppmedlemskap + + + Gruppinventar + + + Grupps skiftdata + + + Bekräfta borttagning? + + + Ta bort grupp + + + Ny grupp + + + Ny grupp + + + Grupptyp + + + Organisationsgrupp + + + Stationsgrupp + + + Överordnad grupp + + + Stationsadress + + + Stationsgrupper kräver en fysisk plats (eftersom personal och enheter kan svara på dem). Ange en adress, GPS-koordinater eller en what3words-adress. + + + Gata + + + Stad + + + Stat/Provins + + + Postnummer + + + Land + + + Eller + + + GPS-koordinater + + + Latitud (Decimalnotation: t.ex. 39.1517) + + + Longitud (Decimalnotation: t.ex. -119.4571) + + + what3words-adress + + + w3w-adress (t.ex. humble.echo.sticky) + + + PrintNode-skrivare + + + PrintNode är en tjänst som låter oss skicka utskriftsjobb till en lokal dator eller server i ditt nätverk till en specifik skrivare. Du måste ha ett aktivt PrintNode-konto och dess programvara konfigurerad med skrivaren aktiv. + + + Välj skrivare + + + Användare kan bara vara i en grupp åt gången. Om du inte ser din användare i listan är de redan i en grupp. + + + Gruppadministratörer + + + Gruppsanvändare + + + Spara grupp + + + API-nyckel: + + + Hämta skrivare + + + Skrivare + + + Stäng + + + Redigera grupp + + + Redigera grupp + + + Skriv ut utryckningar på skrivare + + + Aktivering av detta alternativ skriver ut ett larm på den valda skrivaren när en enhet eller person från denna grupp bifogas (utskickas) till ett larm + + + Geofence-station + + + Geofence-station + + + Geofence-station + + + Nedan kan du skapa en geofence för din station. Fält i blå kursiv är obligatoriska. Geofences låter dig skapa en gräns på kartan som är denna stations svarsområde. Detta kommer att användas för att automatiskt dirigera larm och bestämma svar. + + + Distriktsfärg + + + Spara geofence + + + Rensa geofence + + diff --git a/Core/Resgrid.Localization/Areas/User/Groups/Groups.uk.resx b/Core/Resgrid.Localization/Areas/User/Groups/Groups.uk.resx new file mode 100644 index 00000000..278bff2b --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Groups/Groups.uk.resx @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Групи Відділу + + + Групи + + + Додати Нову Групу + + + Додати нову групу + + + Назва Групи + + + Батьківська + + + Електронна пошта диспетчеризації + + + Електронна пошта повідомлень + + + Члени + + + Організаційна + + + Станція + + + Немає + + + Геозона + + + Видалити Групу + + + Видалити Групу + + + Ви впевнені, що хочете видалити цю групу? + + + Якщо ви вирішите видалити цю групу, інформація про групу, наприклад адреси диспетчеризації та повідомлень, будуть видалені разом з групою і не зможуть бути використані знову. + + + Ця група має активних користувачів, ви повинні перемістити або видалити користувачів, щоб мати можливість видалити групу. + + + Ця група має дочірні групи. Вам потрібно перемістити або видалити дочірню групу перед видаленням групи. + + + До цієї групи призначені підрозділи. Вам потрібно перемістити підрозділ до іншої Групи Станцій або видалити підрозділ, щоб мати можливість видалити групу. + + + До цієї групи призначені групи змін. Вам потрібно видалити ці групи змін, Зміни, призначені до Станції\Групи, щоб мати можливість видалити групу. + + + Натисніть прапорець нижче, щоб видалити цю групу. + + + Якщо ви вирішите видалити цю групу, наведена нижче інформація буде видалена назавжди. Цю операцію не можна скасувати. + + + Дані, що видаляються + + + Дані Групи + + + Членства в Групі Персоналу + + + Членства в Групі Підрозділів + + + Інвентар Групи + + + Дані Змін Групи + + + Підтвердити Видалення? + + + Видалити Групу + + + Нова Група + + + Нова Група + + + Тип Групи + + + Організаційна Група + + + Група Станції + + + Батьківська Група + + + Адреса Станції + + + Групи станцій вимагають фізичного місцезнаходження (оскільки персонал та підрозділи можуть реагувати на них). Будь ласка, введіть Адресу, Координати GPS або адресу what3words. + + + Вулиця + + + Місто + + + Область/Провінція + + + Поштовий Індекс + + + Країна + + + Або + + + Координати GPS + + + Широта (Десяткова нотація: наприклад 39.1517) + + + Довгота (Десяткова нотація: наприклад -119.4571) + + + Адреса what3words + + + Адреса w3w (наприклад humble.echo.sticky) + + + Принтер PrintNode + + + PrintNode — це сервіс, який дозволяє нам надсилати завдання друку на локальний комп'ютер або сервер у вашій мережі до конкретного принтера. Ви повинні мати активний обліковий запис PrintNode та його програмне забезпечення, налаштоване з активним принтером. + + + Вибрати Принтер + + + Користувачі можуть перебувати лише в одній групі одночасно. Якщо ви не бачите свого користувача в списку, він вже знаходиться в групі. + + + Адміністратори Групи + + + Користувачі Групи + + + Зберегти Групу + + + Ключ API: + + + Отримати Принтери + + + Принтер + + + Закрити + + + Редагувати Групу + + + Редагувати Групу + + + Друкувати Виклики на Принтері + + + Увімкнення цієї опції друкуватиме виклик на вибраному принтері, коли підрозділ або особа з цієї групи буде прикріплена (задіяна) до виклику + + + Геозона Станції + + + Геозона Станції + + + Геозона Станції + + + Нижче ви можете створити геозону для вашої станції. Поля синім курсивом є обов'язковими. Геозони дозволяють створити межу на карті, яка є зоною реагування цієї станції. + + + Колір Округу + + + Зберегти Геозону + + + Очистити Геозону + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.ar.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.ar.resx new file mode 100644 index 00000000..2626d5ae --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.ar.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + روابط القسم + + + روابط القسم + + + رابط قسم جديد + + + من القسم + + + إلى القسم + + + مفعّل + + + البيانات المشتركة + + + الرابط مفعّل + + + الرابط معطّل + + + المكالمات + + + الموظفون + + + الوحدات + + + الأوامر + + + لا توجد بيانات مشتركة + + + تفعيل + + + تعطيل + + + حذف + + + عرض البيانات + + + رمز رابط القسم الخاص بك + + + تحذير: سيؤدي هذا إلى حذف هذا الرابط نهائياً. هل أنت متأكد من رغبتك في حذفه؟ + + + تفعيل رابط القسم + + + روابط القسم تشارك البيانات في اتجاه واحد. أدناه يمكنك تفعيل رابط وتعيين لونه. سيُستخدم لون الرابط لتلوين المكالمات والموظفين والوحدات لتحديدها كمنشأة من هذا الرابط. + + + لون الرابط + + + حفظ وتفعيل الرابط + + + رابط قسم جديد + + + روابط القسم تشارك البيانات في اتجاه واحد. أدناه يمكنك الإعداد والمشاركة مع قسم آخر وبمجرد تفعيلهم للرابط يمكنهم عرض المعلومات المشتركة. لكي يرى قسمك بيانات ذلك القسم يحتاجون إلى إنشاء رابط لقسمك وأنت بحاجة إلى تفعيله. + + + رمز الرابط + + + لون النوع + + + هذا هو اللون الذي سيطبق لتحديد المكالمات\الوحدات\الموظفين لرابط القسم هذا + + + مشاركة المكالمات + + + مشاركة الوحدات + + + مشاركة الموظفين + + + مشاركة الأوامر + + + حفظ الرابط + + + عرض رابط القسم + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.cs b/Core/Resgrid.Localization/Areas/User/Links/Links.cs new file mode 100644 index 00000000..9274860e --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Resgrid.Localization.Areas.User.Links +{ + public class Links + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.de.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.de.resx new file mode 100644 index 00000000..d033ead7 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.de.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Abteilungsverknüpfungen + + + Abteilungsverknüpfungen + + + Neue Abteilungsverknüpfung + + + Von Abteilung + + + Zu Abteilung + + + Aktiviert + + + Gemeinsame Daten + + + Verknüpfung Aktiviert + + + Verknüpfung Deaktiviert + + + Einsätze + + + Personal + + + Einheiten + + + Aufträge + + + Keine Daten Geteilt + + + Aktivieren + + + Deaktivieren + + + Löschen + + + Daten Anzeigen + + + Ihr Abteilungsverknüpfungscode + + + WARNUNG: Dies wird diese Verknüpfung dauerhaft löschen. Sind Sie sicher, dass Sie sie löschen möchten? + + + Abteilungsverknüpfung Aktivieren + + + Abteilungsverknüpfungen teilen Daten in einer Richtung. Hier können Sie eine Verknüpfung aktivieren und ihre Farbe festlegen. Die Verknüpfungsfarbe wird verwendet, um Einsätze, Personal und Einheiten zu kennzeichnen, die aus dieser Verknüpfung stammen. + + + Verknüpfungsfarbe + + + Speichern und Verknüpfung Aktivieren + + + Neue Abteilungsverknüpfung + + + Abteilungsverknüpfungen teilen Daten in einer Richtung. Unten können Sie eine Verknüpfung mit einer anderen Abteilung einrichten und sobald diese die Verknüpfung aktiviert, können sie die geteilten Informationen einsehen. Damit Ihre Abteilung die Daten dieser Abteilung sehen kann, müssen sie eine Verknüpfung zu Ihrer Abteilung erstellen und Sie müssen diese aktivieren. + + + Verknüpfungscode + + + Typfarbe + + + Dies ist die Farbe, die zur Identifizierung von Einsätzen\Einheiten\Personal für diese Abteilungsverknüpfung verwendet wird + + + Einsätze Teilen + + + Einheiten Teilen + + + Personal Teilen + + + Aufträge Teilen + + + Verknüpfung Speichern + + + Abteilungsverknüpfung Anzeigen + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.en.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.en.resx new file mode 100644 index 00000000..de240c33 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.en.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Department Links + + + Department Links + + + New Department Links + + + From Department + + + To Department + + + Enabled + + + Shared Data + + + Link Enabled + + + Link Disabled + + + Calls + + + Personnel + + + Units + + + Orders + + + No Data Shared + + + Enable + + + Disable + + + Delete + + + View Data + + + Your Department Link Code + + + WARNING: This will permanently delete this link. Are you sure you want to delete it? + + + Enable Department Link + + + Department Links are sharing data in one direction. Below is where you can enable a link and set it's link color. The link color will be used to color calls, personnel and units that will identify them as originating from this link. + + + Link Color + + + Save and Enable Link + + + New Department Link + + + Department Links are sharing data in one direction. Below you can setup and share with another department and once they enable the link they can view the information you shared. For your department to see that departments data they need to create a link to your department and you need to enable it. + + + Link Code + + + Type Color + + + This is the color that will be applied to identify Calls\Units\Personnel for this department link + + + Share Calls + + + Share Units + + + Share Personnel + + + Share Orders + + + Save Link + + + View Department Link + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.es.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.es.resx new file mode 100644 index 00000000..7ba4d609 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.es.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vínculos de Departamento + + + Vínculos de Departamento + + + Nuevo Vínculo de Departamento + + + Desde Departamento + + + Hacia Departamento + + + Habilitado + + + Datos Compartidos + + + Vínculo Habilitado + + + Vínculo Deshabilitado + + + Llamadas + + + Personal + + + Unidades + + + Órdenes + + + Sin Datos Compartidos + + + Habilitar + + + Deshabilitar + + + Eliminar + + + Ver Datos + + + Tu Código de Vínculo de Departamento + + + ADVERTENCIA: Esto eliminará permanentemente este vínculo. ¿Estás seguro de que quieres eliminarlo? + + + Habilitar Vínculo de Departamento + + + Los vínculos de departamento comparten datos en una dirección. Aquí puedes habilitar un vínculo y establecer su color. El color del vínculo se usará para colorear llamadas, personal y unidades que se identificarán como originadas de este vínculo. + + + Color del Vínculo + + + Guardar y Habilitar Vínculo + + + Nuevo Vínculo de Departamento + + + Los vínculos de departamento comparten datos en una dirección. A continuación puedes configurar y compartir con otro departamento y una vez que habiliten el vínculo podrán ver la información compartida. Para que tu departamento vea los datos de ese departamento necesitan crear un vínculo hacia tu departamento y tú necesitas habilitarlo. + + + Código de Vínculo + + + Color de Tipo + + + Este es el color que se aplicará para identificar Llamadas\Unidades\Personal para este vínculo de departamento + + + Compartir Llamadas + + + Compartir Unidades + + + Compartir Personal + + + Compartir Órdenes + + + Guardar Vínculo + + + Ver Vínculo de Departamento + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.fr.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.fr.resx new file mode 100644 index 00000000..98cab0bc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.fr.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Liens de Département + + + Liens de Département + + + Nouveau Lien de Département + + + Depuis le Département + + + Vers le Département + + + Activé + + + Données Partagées + + + Lien Activé + + + Lien Désactivé + + + Appels + + + Personnel + + + Unités + + + Ordres + + + Aucune Donnée Partagée + + + Activer + + + Désactiver + + + Supprimer + + + Voir les Données + + + Votre Code de Lien de Département + + + AVERTISSEMENT : Cela supprimera définitivement ce lien. Êtes-vous sûr de vouloir le supprimer ? + + + Activer le Lien de Département + + + Les liens de département partagent des données dans une direction. Ci-dessous, vous pouvez activer un lien et définir sa couleur. La couleur du lien sera utilisée pour colorer les appels, le personnel et les unités qui les identifieront comme provenant de ce lien. + + + Couleur du Lien + + + Enregistrer et Activer le Lien + + + Nouveau Lien de Département + + + Les liens de département partagent des données dans une direction. Ci-dessous, vous pouvez configurer et partager avec un autre département et une fois qu'ils activent le lien, ils peuvent voir les informations partagées. Pour que votre département voie les données de ce département, ils doivent créer un lien vers votre département et vous devez l'activer. + + + Code de Lien + + + Couleur de Type + + + C'est la couleur qui sera appliquée pour identifier les Appels\Unités\Personnel pour ce lien de département + + + Partager les Appels + + + Partager les Unités + + + Partager le Personnel + + + Partager les Ordres + + + Enregistrer le Lien + + + Voir le Lien de Département + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.it.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.it.resx new file mode 100644 index 00000000..80c831cb --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.it.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Collegamenti di Dipartimento + + + Collegamenti di Dipartimento + + + Nuovo Collegamento di Dipartimento + + + Dal Dipartimento + + + Al Dipartimento + + + Abilitato + + + Dati Condivisi + + + Collegamento Abilitato + + + Collegamento Disabilitato + + + Chiamate + + + Personale + + + Unità + + + Ordini + + + Nessun Dato Condiviso + + + Abilita + + + Disabilita + + + Elimina + + + Visualizza Dati + + + Il Tuo Codice Collegamento di Dipartimento + + + ATTENZIONE: Questo eliminerà permanentemente questo collegamento. Sei sicuro di volerlo eliminare? + + + Abilita Collegamento di Dipartimento + + + I collegamenti di dipartimento condividono dati in una direzione. Di seguito puoi abilitare un collegamento e impostarne il colore. Il colore del collegamento verrà utilizzato per colorare chiamate, personale e unità identificandoli come provenienti da questo collegamento. + + + Colore Collegamento + + + Salva e Abilita Collegamento + + + Nuovo Collegamento di Dipartimento + + + I collegamenti di dipartimento condividono dati in una direzione. Di seguito puoi configurare e condividere con un altro dipartimento e una volta che abilitano il collegamento possono visualizzare le informazioni condivise. Per far sì che il tuo dipartimento veda i dati di quel dipartimento devono creare un collegamento al tuo dipartimento e tu devi abilitarlo. + + + Codice Collegamento + + + Colore Tipo + + + Questo è il colore che verrà applicato per identificare Chiamate\Unità\Personale per questo collegamento di dipartimento + + + Condividi Chiamate + + + Condividi Unità + + + Condividi Personale + + + Condividi Ordini + + + Salva Collegamento + + + Visualizza Collegamento di Dipartimento + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.pl.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.pl.resx new file mode 100644 index 00000000..38e41fb3 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.pl.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Łącza Wydziałowe + + + Łącza Wydziałowe + + + Nowe Łącze Wydziałowe + + + Z Wydziału + + + Do Wydziału + + + Włączone + + + Udostępnione Dane + + + Łącze Włączone + + + Łącze Wyłączone + + + Zgłoszenia + + + Personel + + + Jednostki + + + Zlecenia + + + Brak Udostępnionych Danych + + + Włącz + + + Wyłącz + + + Usuń + + + Wyświetl Dane + + + Twój Kod Łącza Wydziałowego + + + OSTRZEŻENIE: Spowoduje to trwałe usunięcie tego łącza. Czy na pewno chcesz je usunąć? + + + Włącz Łącze Wydziałowe + + + Łącza wydziałowe udostępniają dane w jednym kierunku. Poniżej możesz włączyć łącze i ustawić jego kolor. Kolor łącza będzie używany do kolorowania zgłoszeń, personelu i jednostek identyfikując je jako pochodzące z tego łącza. + + + Kolor Łącza + + + Zapisz i Włącz Łącze + + + Nowe Łącze Wydziałowe + + + Łącza wydziałowe udostępniają dane w jednym kierunku. Poniżej możesz skonfigurować i udostępnić danemu wydziałowi, a po włączeniu łącza przez ten wydział będzie mógł przeglądać udostępnione informacje. Aby Twój wydział mógł widzieć dane tego wydziału, muszą oni utworzyć łącze do Twojego wydziału i musisz je włączyć. + + + Kod Łącza + + + Kolor Typu + + + To jest kolor, który zostanie zastosowany do identyfikacji Zgłoszeń\Jednostek\Personelu dla tego łącza wydziałowego + + + Udostępnij Zgłoszenia + + + Udostępnij Jednostki + + + Udostępnij Personel + + + Udostępnij Zlecenia + + + Zapisz Łącze + + + Wyświetl Łącze Wydziałowe + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.sv.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.sv.resx new file mode 100644 index 00000000..27ef90d6 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.sv.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Avdelningslänkar + + + Avdelningslänkar + + + Ny Avdelningslänk + + + Från Avdelning + + + Till Avdelning + + + Aktiverad + + + Delad Data + + + Länk Aktiverad + + + Länk Inaktiverad + + + Larm + + + Personal + + + Enheter + + + Ordrar + + + Ingen Data Delad + + + Aktivera + + + Inaktivera + + + Radera + + + Visa Data + + + Din Avdelningslänkskod + + + VARNING: Detta kommer permanent ta bort denna länk. Är du säker på att du vill ta bort den? + + + Aktivera Avdelningslänk + + + Avdelningslänkar delar data i en riktning. Nedan kan du aktivera en länk och ange dess färg. Länkfärgen används för att färgkoda larm, personal och enheter som identifierar dem som härstammande från denna länk. + + + Länkfärg + + + Spara och Aktivera Länk + + + Ny Avdelningslänk + + + Avdelningslänkar delar data i en riktning. Nedan kan du konfigurera och dela med en annan avdelning och när de aktiverar länken kan de se den delade informationen. För att din avdelning ska se den avdelningens data behöver de skapa en länk till din avdelning och du behöver aktivera den. + + + Länkkod + + + Typfärg + + + Detta är färgen som används för att identifiera Larm\Enheter\Personal för denna avdelningslänk + + + Dela Larm + + + Dela Enheter + + + Dela Personal + + + Dela Ordrar + + + Spara Länk + + + Visa Avdelningslänk + + diff --git a/Core/Resgrid.Localization/Areas/User/Links/Links.uk.resx b/Core/Resgrid.Localization/Areas/User/Links/Links.uk.resx new file mode 100644 index 00000000..4cf81008 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Links/Links.uk.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Зв'язки Відділу + + + Зв'язки Відділу + + + Новий Зв'язок Відділу + + + З Відділу + + + До Відділу + + + Увімкнено + + + Спільні Дані + + + Зв'язок Увімкнено + + + Зв'язок Вимкнено + + + Виклики + + + Персонал + + + Підрозділи + + + Накази + + + Немає Спільних Даних + + + Увімкнути + + + Вимкнути + + + Видалити + + + Переглянути Дані + + + Ваш Код Зв'язку Відділу + + + ПОПЕРЕДЖЕННЯ: Це назавжди видалить цей зв'язок. Ви впевнені, що хочете його видалити? + + + Увімкнути Зв'язок Відділу + + + Зв'язки відділу обмінюються даними в одному напрямку. Нижче ви можете увімкнути зв'язок та встановити його колір. Колір зв'язку буде використовуватися для забарвлення викликів, персоналу та підрозділів, що ідентифікує їх як такі, що походять із цього зв'язку. + + + Колір Зв'язку + + + Зберегти та Увімкнути Зв'язок + + + Новий Зв'язок Відділу + + + Зв'язки відділу обмінюються даними в одному напрямку. Нижче ви можете налаштувати та поділитися з іншим відділом, і коли вони увімкнуть зв'язок, вони зможуть переглядати спільну інформацію. Щоб ваш відділ бачив дані того відділу, їм потрібно створити зв'язок з вашим відділом, і вам потрібно його увімкнути. + + + Код Зв'язку + + + Колір Типу + + + Це колір, який буде застосований для ідентифікації Викликів\Підрозділів\Персоналу для цього зв'язку відділу + + + Поділитися Викликами + + + Поділитися Підрозділами + + + Поділитися Персоналом + + + Поділитися Наказами + + + Зберегти Зв'язок + + + Переглянути Зв'язок Відділу + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.ar.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.ar.resx new file mode 100644 index 00000000..3b1a36c4 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.ar.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + الإشعارات + + + الإشعارات + + + إشعار جديد + + + الحالة السابقة + + + الحالة الحالية + + + إشعار + + + لا شيء + + + حذف + + + تحذير: سيؤدي هذا إلى حذف هذا الإشعار نهائياً. هل أنت متأكد من رغبتك في المتابعة؟ + + + نوع الوحدة للمراقبة + + + الدور للمراقبة + + + الحالات المقبولة + + + الحد الأدنى + + + المستخدمون للإشعار + + + الجميع + + + مشرفو القسم + + + تقييد بالمجموعة + + + مشرفو المجموعة فقط + + + تُدار إشعارات التقويم الآن بناءً على نوع حدث التقويم (لا شيء، مُعيَّن، RSVP) والكيانات المشتركة في الحدث. بالنسبة لنوع الحدث لا شيء، سيتم إخطار المستخدمين في تحديد الكيانات (القسم أو مجموعة). بالنسبة لأحداث RSVP سيتم إخطار جميع المستخدمين في القسم وبالنسبة للأحداث المُعيَّنة سيتم إخطار المشاركين المطلوبين والتشغيليين فقط. + + + تُدار إشعارات الوردية الآن بناءً على الأحداث المنفذة على الوردية (تم الإنشاء، تم التحديث، أيام مُضافة). سيتم إخطار المستخدمين المرتبطين بوردية موجودة بالتحديثات، وسيتم إخطار جميع المستخدمين في القسم بالورديات الجديدة وبالنسبة لورديات التسجيل سيتم إخطار جميع المستخدمين بالأيام الجديدة، والمعيَّنون فقط الأشخاص في تلك الوردية. + + + حفظ دور الإشعار + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.cs b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.cs new file mode 100644 index 00000000..f95a9256 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Resgrid.Localization.Areas.User.Notifications +{ + public class Notifications + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.de.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.de.resx new file mode 100644 index 00000000..c753c86a --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.de.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Benachrichtigungen + + + Benachrichtigungen + + + Neue Benachrichtigung + + + Vorheriger Status + + + Aktueller Status + + + Benachrichtigen + + + Keine + + + Löschen + + + WARNUNG: Dies wird diese Benachrichtigung dauerhaft löschen. Sind Sie sicher, dass Sie fortfahren möchten? + + + Zu Überwachender Einheitstyp + + + Zu Überwachende Rolle + + + Akzeptable Zustände + + + Untere Grenze + + + Zu Benachrichtigende Benutzer + + + Alle + + + Abteilungsadministratoren + + + Auf Gruppe Beschränken + + + Nur Gruppenadministratoren + + + Kalenderbenachrichtigungen werden jetzt basierend auf dem Kalender-Ereignistyp (Keine, Zugewiesen, RSVP) und den Entitäten des Ereignisses gesteuert. Beim Ereignistyp Keine werden Benutzer in der Entitätsauswahl (die Abteilung oder eine Gruppe) benachrichtigt. Bei RSVP-Ereignissen werden alle Benutzer der Abteilung benachrichtigt und bei zugewiesenen Ereignissen werden nur Pflicht- und Betriebsteilnehmer benachrichtigt. + + + Schichtbenachrichtigungen werden jetzt basierend auf Ereignissen einer Schicht (Erstellt, Aktualisiert, Tage Hinzugefügt) gesteuert. Benutzer einer bestehenden Schicht werden über Aktualisierungen informiert, alle Benutzer der Abteilung werden über neue Schichten informiert und bei Anmeldeschichten werden alle Benutzer über neue Tage informiert und nur die Personen auf dieser Schicht werden zugewiesen benachrichtigt. + + + Benachrichtigungsrolle Speichern + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.en.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.en.resx new file mode 100644 index 00000000..11fdb256 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.en.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Notifications + + + Notifications + + + New Notification + + + Before State + + + Current State + + + Notify + + + None + + + Delete + + + WARNING: This will permanently delete this notification. are you sure you want to continue? + + + Unit Type To Monitor + + + Role To Monitor + + + Acceptable States + + + Lower Limit + + + Users To Notify + + + Everyone + + + Department Admins + + + Lock To Group + + + Group Admins Only + + + Calendar notifications are now driven based on the calendar event type (None, Assigned, RSVP) and the Entities apart of the event. For the None event type users in the Entities selection (the department or a group) will be notified. For RSVP events all users in the department will be notified and for assigned events only Required and Opertional attendees will be notified. + + + Shift notifications are now driven based off of events performed against a shift (Created, Updated, Days Added). Users attached to an existing shift will be notified of updates, all users in the department will be notified about new shifts and for signup shifts all users will be notified about new days, and assigned just the people on that shift. + + + Save Notification Role + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.es.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.es.resx new file mode 100644 index 00000000..5cb60672 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.es.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Notificaciones + + + Notificaciones + + + Nueva Notificación + + + Estado Anterior + + + Estado Actual + + + Notificar + + + Ninguno + + + Eliminar + + + ADVERTENCIA: Esto eliminará permanentemente esta notificación. ¿Estás seguro de que quieres continuar? + + + Tipo de Unidad a Monitorear + + + Rol a Monitorear + + + Estados Aceptables + + + Límite Inferior + + + Usuarios a Notificar + + + Todos + + + Administradores del Departamento + + + Bloquear al Grupo + + + Solo Administradores de Grupo + + + Las notificaciones del calendario ahora se basan en el tipo de evento del calendario (Ninguno, Asignado, RSVP) y las entidades del evento. Para el tipo de evento Ninguno, los usuarios en la selección de entidades (el departamento o un grupo) serán notificados. Para eventos RSVP se notificará a todos los usuarios del departamento y para eventos asignados solo se notificará a los asistentes Requeridos y Operacionales. + + + Las notificaciones de turno ahora se basan en eventos realizados en un turno (Creado, Actualizado, Días Añadidos). Los usuarios vinculados a un turno existente serán notificados de actualizaciones, todos los usuarios del departamento serán notificados sobre nuevos turnos y para turnos de inscripción todos los usuarios serán notificados sobre nuevos días, y solo las personas asignadas a ese turno. + + + Guardar Rol de Notificación + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.fr.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.fr.resx new file mode 100644 index 00000000..9a023446 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.fr.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Notifications + + + Notifications + + + Nouvelle Notification + + + État Précédent + + + État Actuel + + + Notifier + + + Aucun + + + Supprimer + + + AVERTISSEMENT : Cela supprimera définitivement cette notification. Êtes-vous sûr de vouloir continuer ? + + + Type d'Unité à Surveiller + + + Rôle à Surveiller + + + États Acceptables + + + Limite Inférieure + + + Utilisateurs à Notifier + + + Tout le Monde + + + Administrateurs de Département + + + Restreindre au Groupe + + + Administrateurs de Groupe Uniquement + + + Les notifications de calendrier sont maintenant gérées en fonction du type d'événement du calendrier (Aucun, Assigné, RSVP) et des entités appartenant à l'événement. Pour le type d'événement Aucun, les utilisateurs dans la sélection des entités (le département ou un groupe) seront notifiés. Pour les événements RSVP, tous les utilisateurs du département seront notifiés et pour les événements assignés, seuls les participants Requis et Opérationnels seront notifiés. + + + Les notifications de quart sont maintenant gérées en fonction des événements effectués sur un quart (Créé, Mis à jour, Jours Ajoutés). Les utilisateurs attachés à un quart existant seront notifiés des mises à jour, tous les utilisateurs du département seront notifiés des nouveaux quarts et pour les quarts d'inscription tous les utilisateurs seront notifiés des nouveaux jours, et assignés uniquement les personnes sur ce quart. + + + Enregistrer le Rôle de Notification + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.it.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.it.resx new file mode 100644 index 00000000..236d55ea --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.it.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Notifiche + + + Notifiche + + + Nuova Notifica + + + Stato Precedente + + + Stato Attuale + + + Notifica + + + Nessuno + + + Elimina + + + ATTENZIONE: Questo eliminerà permanentemente questa notifica. Sei sicuro di voler continuare? + + + Tipo di Unità da Monitorare + + + Ruolo da Monitorare + + + Stati Accettabili + + + Limite Inferiore + + + Utenti da Notificare + + + Tutti + + + Amministratori di Dipartimento + + + Blocca al Gruppo + + + Solo Amministratori di Gruppo + + + Le notifiche del calendario sono ora guidate in base al tipo di evento del calendario (Nessuno, Assegnato, RSVP) e alle entità che fanno parte dell'evento. Per il tipo di evento Nessuno, gli utenti nella selezione delle entità (il dipartimento o un gruppo) verranno notificati. Per gli eventi RSVP tutti gli utenti del dipartimento verranno notificati e per gli eventi assegnati verranno notificati solo i partecipanti Obbligatori e Operativi. + + + Le notifiche di turno sono ora guidate in base agli eventi eseguiti contro un turno (Creato, Aggiornato, Giorni Aggiunti). Gli utenti collegati a un turno esistente verranno notificati degli aggiornamenti, tutti gli utenti del dipartimento verranno notificati dei nuovi turni e per i turni di iscrizione tutti gli utenti verranno notificati dei nuovi giorni, e assegnati solo le persone su quel turno. + + + Salva Ruolo Notifica + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.pl.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.pl.resx new file mode 100644 index 00000000..5a9910e8 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.pl.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Powiadomienia + + + Powiadomienia + + + Nowe Powiadomienie + + + Stan Poprzedni + + + Stan Bieżący + + + Powiadamiaj + + + Brak + + + Usuń + + + OSTRZEŻENIE: Spowoduje to trwałe usunięcie tego powiadomienia. Czy na pewno chcesz kontynuować? + + + Typ Jednostki do Monitorowania + + + Rola do Monitorowania + + + Dopuszczalne Stany + + + Dolny Limit + + + Użytkownicy do Powiadamiania + + + Wszyscy + + + Administratorzy Wydziału + + + Zablokuj do Grupy + + + Tylko Administratorzy Grupy + + + Powiadomienia kalendarza są teraz sterowane na podstawie typu zdarzenia kalendarza (Brak, Przypisany, RSVP) i podmiotów będących częścią zdarzenia. Dla typu zdarzenia Brak, użytkownicy w wyborze podmiotów (wydział lub grupa) zostaną powiadomieni. Dla zdarzeń RSVP wszyscy użytkownicy wydziału zostaną powiadomieni, a dla zdarzeń przypisanych powiadamiani będą tylko uczestnicy Wymagani i Operacyjni. + + + Powiadomienia o zmianie są teraz sterowane na podstawie zdarzeń wykonanych na zmianie (Utworzone, Zaktualizowane, Dodane Dni). Użytkownicy przypisani do istniejącej zmiany będą powiadamiani o aktualizacjach, wszyscy użytkownicy wydziału będą powiadamiani o nowych zmianach, a dla zmian rejestracyjnych wszyscy użytkownicy będą powiadamiani o nowych dniach, a przypisani tylko osoby na tej zmianie. + + + Zapisz Rolę Powiadomienia + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.sv.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.sv.resx new file mode 100644 index 00000000..b19e3cc9 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.sv.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aviseringar + + + Aviseringar + + + Ny Avisering + + + Tidigare Status + + + Aktuell Status + + + Meddela + + + Ingen + + + Radera + + + VARNING: Detta kommer permanent ta bort denna avisering. Är du säker på att du vill fortsätta? + + + Enhetstyp att Övervaka + + + Roll att Övervaka + + + Acceptabla Tillstånd + + + Undre Gräns + + + Användare att Meddela + + + Alla + + + Avdelningsadministratörer + + + Lås till Grupp + + + Endast Gruppadministratörer + + + Kalenderaviseringar styrs nu baserat på kalender-händelsetypen (Ingen, Tilldelad, RSVP) och de enheter som ingår i händelsen. För händelsetypen Ingen meddelas användare i entitetsvalet (avdelningen eller en grupp). För RSVP-händelser meddelas alla användare i avdelningen och för tilldelade händelser meddelas endast Obligatoriska och Operationella deltagare. + + + Skiftaviseringar styrs nu baserat på händelser som utförs mot ett skift (Skapat, Uppdaterat, Dagar Tillagda). Användare kopplade till ett befintligt skift meddelas om uppdateringar, alla användare i avdelningen meddelas om nya skift och för anmälningsskift meddelas alla användare om nya dagar, och tilldelade enbart personerna på det skiftet. + + + Spara Aviseringsroll + + diff --git a/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.uk.resx b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.uk.resx new file mode 100644 index 00000000..5e2b3dda --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Notifications/Notifications.uk.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Сповіщення + + + Сповіщення + + + Нове Сповіщення + + + Попередній Стан + + + Поточний Стан + + + Сповістити + + + Немає + + + Видалити + + + ПОПЕРЕДЖЕННЯ: Це назавжди видалить це сповіщення. Ви впевнені, що хочете продовжити? + + + Тип Підрозділу для Моніторингу + + + Роль для Моніторингу + + + Допустимі Стани + + + Нижня Межа + + + Користувачі для Сповіщення + + + Усі + + + Адміністратори Відділу + + + Обмежити Групою + + + Тільки Адміністратори Групи + + + Сповіщення календаря тепер керуються на основі типу події календаря (Немає, Призначено, RSVP) та суб'єктів, що є частиною події. Для типу події Немає користувачі у виборі суб'єктів (відділ або група) будуть сповіщені. Для подій RSVP усі користувачі відділу будуть сповіщені, а для призначених подій будуть сповіщені лише Обов'язкові та Оперативні учасники. + + + Сповіщення про зміни тепер керуються на основі подій, виконаних щодо зміни (Створено, Оновлено, Дні Додано). Користувачі, прикріплені до існуючої зміни, будуть сповіщені про оновлення, усі користувачі відділу будуть сповіщені про нові зміни, а для реєстраційних змін усі користувачі будуть сповіщені про нові дні, а призначені — лише люди на тій зміні. + + + Зберегти Роль Сповіщення + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.ar.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.ar.resx new file mode 100644 index 00000000..8db6e956 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.ar.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + طلبات الموارد + + + تحديث الإعدادات + + + إنشاء طلب + + + طلباتك + + + الطلبات المتاحة + + + تم الإنشاء + + + نسبة التنفيذ + + + مغلق + + + منفذ + + + مفتوح + + + عرض + + + الموقع + + + المسافة + + + طلب جديد + + + العنوان + + + عنوان قصير للطلب + + + الملخص + + + ملخص للطلب + + + إغلاق الطلب في + + + الوقت الذي يجب أن يتم فيه تنفيذ الطلب؛ اعتمادًا على نوع الطلب قد يتم إغلاقه تلقائيًا في ذلك الوقت. + + + رقم الحادثة + + + معرّف الحادثة أو رقمها + + + اسم الحادثة + + + اسم الحادثة + + + عنوان الحادثة + + + عنوان الحادثة أو مركز القيادة أو نقطة التحكم + + + الرمز المالي + + + الرمز المالي للحادثة أو الطلب + + + اسم جهة الاتصال + + + اسم نقطة الاتصال للاجتماع أو الحادثة + + + رقم جهة الاتصال + + + رقم نقطة الاتصال للاجتماع أو الحادثة + + + موقع الاجتماع + + + الموقع الذي ستلتقي فيه الوحدات من الطلبات المنفذة + + + وقت الاجتماع + + + تعليمات خاصة + + + أي تعليمات أو متطلبات خاصة بالطلب + + + السماح بالتنفيذ الجزئي + + + يسمح للإدارة بتنفيذ بند طلب الموارد جزئيًا (يتيح ذلك لعدة وحدات من إدارات متعددة تنفيذ البند) + + + القبول التلقائي للتنفيذات + + + سيقبل النظام التنفيذات تلقائيًا (الجزئية بناءً على إعداد السماح بالتنفيذ الجزئي) على أساس من يأتي أولًا يُخدَّم أولًا + + + بنود الطلب + + + انقر على زر "إضافة" الأخضر لإضافة بنود إلى هذا الطلب؛ البنود هي مجموعات من الوحدات المتشابهة التي تريد أن تكون جزءًا من الطلب. + + + المورد + + + الحد الأدنى + + + الحد الأقصى + + + الرمز المالي + + + الاحتياجات الخاصة + + + المتطلبات + + + إضافة + + + إنشاء طلب + + + إعدادات طلبات الموارد + + + عدم استلام الطلبات + + + رؤية الطلبات الافتراضية + + + نطاق الرؤية (بالأميال) + + + مدير الطلبات الافتراضي + + + تقييد إشعارات الطلبات بمستوى التوظيف + + + مستوى التوظيف المسموح به للإشعارات + + + أنواع الأقسام المسموح بها + + + قبول التنفيذات تلقائيًا + + + إخطار الأدوار + + + الأدوار المراد إخطارها + + + حفظ الإعدادات + + + تنفيذ الطلب + + + الحالة: + + + أُنشئ بواسطة: + + + الحادثة: + + + الرقم\المعرّف: + + + الرمز المالي: + + + آخر تحديث: + + + تاريخ الإنشاء: + + + اسم جهة الاتصال: + + + رقم جهة الاتصال: + + + التنفيذ: + + + طلب الموارد هذا منفذ بنسبة + + + بالمئة. + + + التنفيذات + + + المورد: + + + المتطلبات: + + + الحد الأدنى: + + + الحد الأقصى: + + + المطلوب: + + + نتيجة تنفيذ الطلب + + + فشل التنفيذ + + + حدث خطأ أثناء معالجة طلبك. يُرجى الاطلاع على الخطأ أدناه لمزيد من التفاصيل. + + + تم إضافة التنفيذ وقبوله + + + تمت إضافة تنفيذك إلى النظام وقُبل تلقائيًا. + + + قد ترغب في التواصل مع نقطة الاتصال للطلب للتأكد من عدم وجود تفاصيل أخرى تحتاج إلى معالجة. + + + تنفيذ مقترح + + + تم تسجيل تنفيذك في النظام وتحديده كمعلق. سيحتاج منشئ طلب الموارد إلى مراجعة طلب التنفيذ يدويًا والموافقة عليه. ستتلقى إشعارًا عند حدوث ذلك. + + + عرض الطلب + + + طلب تنفيذ الطلب + + + الطلبات + + + القسم + + + الطابع الزمني + + + جهة الاتصال + + + ملاحظة + + + الوحدات + + + مقبول + + + غير مقبول + + + معلق + + + قبول + + + ملخص الطلب + + + تعليمات خاصة + + + عنوان الحادثة + + + الاجتماع + + + الموقع: + + + التاريخ: + + + غير محدد + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.cs b/Core/Resgrid.Localization/Areas/User/Orders/Orders.cs new file mode 100644 index 00000000..d1241059 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Resgrid.Localization.Areas.User.Orders +{ + public class Orders + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.de.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.de.resx new file mode 100644 index 00000000..5dddd785 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.de.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ressourcenbestellungen + + + Einstellungen Aktualisieren + + + Bestellung Erstellen + + + Ihre Bestellungen + + + Verfügbare Bestellungen + + + Erstellt + + + Füllprozentsatz + + + Geschlossen + + + Erfüllt + + + Offen + + + Ansehen + + + Standort + + + Entfernung + + + Neue Bestellung + + + Titel + + + Kurzer Titel für die Bestellung + + + Zusammenfassung + + + Eine Zusammenfassung für die Bestellung + + + Bestellung Schließen Am + + + Der Zeitpunkt, bis zu dem die Bestellung erfüllt werden muss; je nach Bestelltyp wird sie zu diesem Zeitpunkt möglicherweise automatisch geschlossen. + + + Einsatznummer + + + Einsatz-ID oder -nummer + + + Einsatzname + + + Name des Einsatzes + + + Einsatzadresse + + + Adresse des Einsatzes, IC oder Kommandoposten + + + Finanzcode + + + Finanzcode für den Einsatz oder die Bestellung + + + Kontaktname + + + Name des Ansprechpartners für den Treffpunkt oder den Einsatz + + + Kontaktnummer + + + Nummer des Ansprechpartners für den Treffpunkt oder den Einsatz + + + Treffpunkt + + + Ort, an dem sich die Einheiten aus den erfüllten Bestellungen treffen werden + + + Treffzeit + + + Besondere Anweisungen + + + Besondere Anweisungen oder Anforderungen für die Bestellung + + + Teilweise Erfüllungen Erlauben + + + Ermöglicht einer Abteilung, einen Ressourcenbestellungsposten teilweise zu erfüllen (dies ermöglicht mehreren Einheiten aus mehreren Abteilungen, einen Posten zu erfüllen) + + + Erfüllungen Automatisch Akzeptieren + + + Das System akzeptiert Erfüllungen automatisch (teilweise basierend auf der Einstellung Teilweise Erfüllungen Erlauben) nach dem Prinzip wer zuerst kommt, mahlt zuerst + + + Bestellartikel + + + Klicken Sie auf die grüne Schaltfläche "Hinzufügen", um Artikel zu dieser Bestellung hinzuzufügen; Artikel sind Gruppen ähnlicher Einheiten, die Teil der Bestellung sein sollen. + + + Ressource + + + Min + + + Max + + + Finanzcode + + + Besondere Bedürfnisse + + + Anforderungen + + + Hinzufügen + + + Bestellung Erstellen + + + Ressourcenbestellungseinstellungen + + + Keine Bestellungen Empfangen + + + Standard-Bestellsichtbarkeit + + + Sichtbarkeitsbereich (in Meilen) + + + Standard-Bestellverwaltungsbenutzer + + + Bestellbenachrichtigungen auf Personalbesetzung Beschränken + + + Erlaubtes Personalbesetzungsniveau für Benachrichtigungen + + + Erlaubte Abteilungstypen + + + Erfüllungen Automatisch Akzeptieren + + + Rollen Benachrichtigen + + + Zu Benachrichtigende Rollen + + + Einstellungen Speichern + + + Bestellung Erfüllen + + + Status: + + + Erstellt von: + + + Einsatz: + + + Nummer\ID: + + + Finanzcode: + + + Zuletzt Aktualisiert: + + + Erstellt: + + + Kontaktname: + + + Kontaktnummer: + + + Erfüllung: + + + Diese Ressourcenbestellung ist + + + erfüllt. + + + Erfüllungen + + + Ressource: + + + Anforderungen: + + + Min: + + + Max: + + + Benötigt: + + + Ergebnis der Bestellerfüllung + + + Erfüllung Fehlgeschlagen + + + Bei der Verarbeitung Ihrer Anfrage ist ein Fehler aufgetreten. Bitte sehen Sie den Fehler unten für weitere Details. + + + Erfüllung Hinzugefügt und Akzeptiert + + + Ihre Erfüllung wurde dem System hinzugefügt und automatisch akzeptiert. + + + Möglicherweise möchten Sie sich an den Ansprechpartner der Bestellung wenden, um sicherzustellen, dass keine weiteren Details geklärt werden müssen. + + + Erfüllung Vorgeschlagen + + + Ihre Erfüllung wurde im System erfasst und als ausstehend markiert. Der Ersteller der Ressourcenanfrage muss Ihre Erfüllungsanfrage manuell prüfen und genehmigen. Sie werden benachrichtigt, wenn dies geschieht. + + + Bestellung Ansehen + + + Anfrage zur Bestellerfüllung + + + Bestellungen + + + Abteilung + + + Zeitstempel + + + Kontakt + + + Notiz + + + Einheiten + + + Akzeptiert + + + Nicht Akzeptiert + + + Ausstehend + + + Akzeptieren + + + Bestellzusammenfassung + + + Besondere Anweisungen + + + Einsatzadresse + + + Treffpunkt + + + Standort: + + + Datum: + + + Nicht Angegeben + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.en.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.en.resx new file mode 100644 index 00000000..7c5d94bc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.en.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resource Orders + + + Update Settings + + + Create Order + + + Your Orders + + + Available Orders + + + Created + + + Fill Percentage + + + Closed + + + Filled + + + Open + + + View + + + Location + + + Distance + + + New Order + + + Title + + + Short Title for the Order + + + Summary + + + A summary for the order + + + Close Order On + + + The time that the order needs filled by, depending on the order type it may be automatically closed at this time. + + + Incident Number + + + Incident ID or number + + + Incident Name + + + Name of the Incident + + + Incident Address + + + Address of the Incident, IC or Command Post + + + Finance Code + + + Financial code for the incident or order + + + Contact Name + + + Name of the point of contact for the meetup or incident + + + Contact Number + + + Number of the point of contact for the meetup or incident + + + Meetup Location + + + Location where the units from the filled orders will meet + + + Meetup Time + + + Special Instructions + + + Any special instructions or requirements for the order + + + Allow Partial Fills + + + Allow a department to partially fill a resource order item (this allows multiple units from multiple departments to fill an item) + + + Auto-Accept Fills + + + The system will automatically accept fills (partial based on the Allow Partial Fills setting) on first come first service + + + Order Items + + + Click the green "Add" button to add items to this order, items are groups of similar units you wish to be a part of the order. + + + Resource + + + Min + + + Max + + + Financial Code + + + Special Needs + + + Requirements + + + Add + + + Create Order + + + Resource Order Settings + + + Do Not Receive Orders + + + Default Order Visibility + + + Range for Visibility (in Mi) + + + Default Order Managing User + + + Limit Order Notifications to Staffing + + + Allowed Notification Staffing Level + + + Allowed Department Types + + + Automatically Accept Fills + + + Notify Roles + + + Roles to Notify + + + Save Settings + + + Fill Order + + + Status: + + + Created by: + + + Incident: + + + Number\ID: + + + Finance Code: + + + Last Updated: + + + Created: + + + Contact Name: + + + Contact Number: + + + Fill: + + + This resource order is + + + filled. + + + Fills + + + Resource: + + + Requirements: + + + Min: + + + Max: + + + Needed: + + + Fill Order Result + + + Fill Failed + + + There was an error trying to fulfil your request. Please view the error below for more detail. + + + Fill Added and Accepted + + + Your fill was added into the system and has been accepted automatically. + + + You may want to reach out to the Point of Contact for the order to ensure if there are any other details that need to be worked out. + + + Fill Proposed + + + Your fill has been logged with the system and marked as pending. The creator of the resource request will need to manually review your fill request and approve it. You will receive a notification when that action occurs. + + + View Order + + + Request To Fill Order + + + Orders + + + Department + + + Timestamp + + + Contact + + + Note + + + Units + + + Accepted + + + Not Accepted + + + Pending + + + Accept + + + Order Summary + + + Special Instructions + + + Incident Address + + + Meetup + + + Location: + + + Date: + + + Not Supplied + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.es.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.es.resx new file mode 100644 index 00000000..49dd0a50 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.es.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Órdenes de Recursos + + + Actualizar Configuración + + + Crear Orden + + + Sus Órdenes + + + Órdenes Disponibles + + + Creado + + + Porcentaje de Cumplimiento + + + Cerrado + + + Completado + + + Abierto + + + Ver + + + Ubicación + + + Distancia + + + Nueva Orden + + + Título + + + Título corto para la orden + + + Resumen + + + Un resumen para la orden + + + Cerrar Orden En + + + El momento en que la orden debe ser completada; según el tipo de orden puede cerrarse automáticamente en ese momento. + + + Número de Incidente + + + ID o número del incidente + + + Nombre del Incidente + + + Nombre del incidente + + + Dirección del Incidente + + + Dirección del incidente, CI o Puesto de Mando + + + Código Financiero + + + Código financiero del incidente u orden + + + Nombre de Contacto + + + Nombre del punto de contacto para la reunión o el incidente + + + Número de Contacto + + + Número del punto de contacto para la reunión o el incidente + + + Lugar de Reunión + + + Lugar donde se reunirán las unidades de las órdenes completadas + + + Hora de Reunión + + + Instrucciones Especiales + + + Cualquier instrucción o requisito especial para la orden + + + Permitir Cumplimientos Parciales + + + Permite a un departamento completar parcialmente un artículo de orden de recursos (esto permite que múltiples unidades de múltiples departamentos completen un artículo) + + + Aceptación Automática de Cumplimientos + + + El sistema aceptará automáticamente los cumplimientos (parciales según la configuración de Permitir Cumplimientos Parciales) por orden de llegada + + + Artículos de la Orden + + + Haga clic en el botón verde "Agregar" para añadir artículos a esta orden; los artículos son grupos de unidades similares que desea incluir en la orden. + + + Recurso + + + Mín + + + Máx + + + Código Financiero + + + Necesidades Especiales + + + Requisitos + + + Agregar + + + Crear Orden + + + Configuración de Órdenes de Recursos + + + No Recibir Órdenes + + + Visibilidad Predeterminada de Órdenes + + + Rango de Visibilidad (en millas) + + + Usuario Gestor de Órdenes Predeterminado + + + Limitar Notificaciones de Órdenes al Personal + + + Nivel de Personal Permitido para Notificaciones + + + Tipos de Departamento Permitidos + + + Aceptar Cumplimientos Automáticamente + + + Notificar Roles + + + Roles a Notificar + + + Guardar Configuración + + + Completar Orden + + + Estado: + + + Creado por: + + + Incidente: + + + Número\ID: + + + Código Financiero: + + + Última Actualización: + + + Creado: + + + Nombre de Contacto: + + + Número de Contacto: + + + Cumplimiento: + + + Esta orden de recursos está + + + completada. + + + Cumplimientos + + + Recurso: + + + Requisitos: + + + Mín: + + + Máx: + + + Necesarios: + + + Resultado de Cumplimiento de Orden + + + Cumplimiento Fallido + + + Hubo un error al intentar completar su solicitud. Por favor, vea el error a continuación para más detalles. + + + Cumplimiento Agregado y Aceptado + + + Su cumplimiento fue agregado al sistema y ha sido aceptado automáticamente. + + + Es posible que desee comunicarse con el Punto de Contacto de la orden para asegurarse de que no haya otros detalles que resolver. + + + Cumplimiento Propuesto + + + Su cumplimiento ha sido registrado en el sistema y marcado como pendiente. El creador de la solicitud de recursos deberá revisar manualmente su solicitud de cumplimiento y aprobarla. Recibirá una notificación cuando esto ocurra. + + + Ver Orden + + + Solicitar Completar Orden + + + Órdenes + + + Departamento + + + Marca de Tiempo + + + Contacto + + + Nota + + + Unidades + + + Aceptado + + + No Aceptado + + + Pendiente + + + Aceptar + + + Resumen de Orden + + + Instrucciones Especiales + + + Dirección del Incidente + + + Reunión + + + Ubicación: + + + Fecha: + + + No Proporcionado + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.fr.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.fr.resx new file mode 100644 index 00000000..7b71f3bf --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.fr.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Commandes de Ressources + + + Mettre à Jour les Paramètres + + + Créer une Commande + + + Vos Commandes + + + Commandes Disponibles + + + Créé + + + Pourcentage de Remplissage + + + Fermé + + + Rempli + + + Ouvert + + + Voir + + + Emplacement + + + Distance + + + Nouvelle Commande + + + Titre + + + Titre court pour la commande + + + Résumé + + + Un résumé pour la commande + + + Fermer la Commande Le + + + Le moment auquel la commande doit être remplie ; selon le type de commande, elle peut être fermée automatiquement à ce moment-là. + + + Numéro d'Incident + + + ID ou numéro de l'incident + + + Nom de l'Incident + + + Nom de l'incident + + + Adresse de l'Incident + + + Adresse de l'incident, IC ou Poste de Commandement + + + Code Financier + + + Code financier pour l'incident ou la commande + + + Nom du Contact + + + Nom du point de contact pour le rendez-vous ou l'incident + + + Numéro de Contact + + + Numéro du point de contact pour le rendez-vous ou l'incident + + + Lieu de Rendez-vous + + + Lieu où les unités des commandes remplies se retrouveront + + + Heure de Rendez-vous + + + Instructions Spéciales + + + Toutes instructions ou exigences spéciales pour la commande + + + Autoriser les Remplissages Partiels + + + Permet à un département de remplir partiellement un article de commande de ressources (cela permet à plusieurs unités de plusieurs départements de remplir un article) + + + Acceptation Automatique des Remplissages + + + Le système acceptera automatiquement les remplissages (partiels selon le paramètre Autoriser les Remplissages Partiels) selon le principe premier arrivé, premier servi + + + Articles de la Commande + + + Cliquez sur le bouton vert "Ajouter" pour ajouter des articles à cette commande ; les articles sont des groupes d'unités similaires que vous souhaitez inclure dans la commande. + + + Ressource + + + Min + + + Max + + + Code Financier + + + Besoins Spéciaux + + + Exigences + + + Ajouter + + + Créer une Commande + + + Paramètres des Commandes de Ressources + + + Ne Pas Recevoir de Commandes + + + Visibilité des Commandes par Défaut + + + Plage de Visibilité (en miles) + + + Utilisateur Gestionnaire de Commandes par Défaut + + + Limiter les Notifications de Commandes au Personnel + + + Niveau de Personnel Autorisé pour les Notifications + + + Types de Département Autorisés + + + Accepter Automatiquement les Remplissages + + + Notifier les Rôles + + + Rôles à Notifier + + + Enregistrer les Paramètres + + + Remplir la Commande + + + Statut : + + + Créé par : + + + Incident : + + + Numéro\ID : + + + Code Financier : + + + Dernière Mise à Jour : + + + Créé : + + + Nom du Contact : + + + Numéro de Contact : + + + Remplissage : + + + Cette commande de ressources est remplie à + + + remplie. + + + Remplissages + + + Ressource : + + + Exigences : + + + Min : + + + Max : + + + Nécessaire : + + + Résultat du Remplissage de Commande + + + Remplissage Échoué + + + Une erreur s'est produite lors du traitement de votre demande. Veuillez consulter l'erreur ci-dessous pour plus de détails. + + + Remplissage Ajouté et Accepté + + + Votre remplissage a été ajouté au système et a été accepté automatiquement. + + + Vous souhaitez peut-être contacter le Point de Contact de la commande pour vous assurer qu'il n'y a pas d'autres détails à régler. + + + Remplissage Proposé + + + Votre remplissage a été enregistré dans le système et marqué comme en attente. Le créateur de la demande de ressources devra examiner manuellement votre demande de remplissage et l'approuver. Vous recevrez une notification lorsque cela se produira. + + + Voir la Commande + + + Demande de Remplissage de Commande + + + Commandes + + + Département + + + Horodatage + + + Contact + + + Note + + + Unités + + + Accepté + + + Non Accepté + + + En Attente + + + Accepter + + + Résumé de la Commande + + + Instructions Spéciales + + + Adresse de l'Incident + + + Rendez-vous + + + Emplacement : + + + Date : + + + Non Fourni + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.it.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.it.resx new file mode 100644 index 00000000..98af54c4 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.it.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ordini di Risorse + + + Aggiorna Impostazioni + + + Crea Ordine + + + I Tuoi Ordini + + + Ordini Disponibili + + + Creato + + + Percentuale di Completamento + + + Chiuso + + + Completato + + + Aperto + + + Visualizza + + + Posizione + + + Distanza + + + Nuovo Ordine + + + Titolo + + + Titolo breve per l'ordine + + + Riepilogo + + + Un riepilogo per l'ordine + + + Chiudi Ordine Il + + + Il momento entro cui l'ordine deve essere soddisfatto; a seconda del tipo di ordine potrebbe essere chiuso automaticamente in quel momento. + + + Numero Incidente + + + ID o numero dell'incidente + + + Nome Incidente + + + Nome dell'incidente + + + Indirizzo Incidente + + + Indirizzo dell'incidente, IC o Posto di Comando + + + Codice Finanziario + + + Codice finanziario per l'incidente o l'ordine + + + Nome Contatto + + + Nome del punto di contatto per il ritrovo o l'incidente + + + Numero di Contatto + + + Numero del punto di contatto per il ritrovo o l'incidente + + + Luogo di Ritrovo + + + Luogo dove si incontreranno le unità degli ordini soddisfatti + + + Orario di Ritrovo + + + Istruzioni Speciali + + + Eventuali istruzioni o requisiti speciali per l'ordine + + + Consenti Completamenti Parziali + + + Permette a un dipartimento di soddisfare parzialmente un articolo di ordine di risorse (questo consente a più unità di più dipartimenti di soddisfare un articolo) + + + Accettazione Automatica dei Completamenti + + + Il sistema accetterà automaticamente i completamenti (parziali in base all'impostazione Consenti Completamenti Parziali) in ordine di arrivo + + + Articoli dell'Ordine + + + Clicca il pulsante verde "Aggiungi" per aggiungere articoli a questo ordine; gli articoli sono gruppi di unità simili che desideri includere nell'ordine. + + + Risorsa + + + Min + + + Max + + + Codice Finanziario + + + Esigenze Speciali + + + Requisiti + + + Aggiungi + + + Crea Ordine + + + Impostazioni degli Ordini di Risorse + + + Non Ricevere Ordini + + + Visibilità Predefinita degli Ordini + + + Raggio di Visibilità (in miglia) + + + Utente Gestore Ordini Predefinito + + + Limita le Notifiche degli Ordini al Personale + + + Livello di Personale Consentito per le Notifiche + + + Tipi di Dipartimento Consentiti + + + Accetta Automaticamente i Completamenti + + + Notifica Ruoli + + + Ruoli da Notificare + + + Salva Impostazioni + + + Soddisfa Ordine + + + Stato: + + + Creato da: + + + Incidente: + + + Numero\ID: + + + Codice Finanziario: + + + Ultimo Aggiornamento: + + + Creato: + + + Nome Contatto: + + + Numero di Contatto: + + + Completamento: + + + Questo ordine di risorse è + + + completato. + + + Completamenti + + + Risorsa: + + + Requisiti: + + + Min: + + + Max: + + + Necessari: + + + Risultato del Completamento dell'Ordine + + + Completamento Fallito + + + Si è verificato un errore durante l'elaborazione della richiesta. Vedere l'errore di seguito per maggiori dettagli. + + + Completamento Aggiunto e Accettato + + + Il tuo completamento è stato aggiunto al sistema ed è stato accettato automaticamente. + + + Potresti voler contattare il Punto di Contatto dell'ordine per assicurarti che non ci siano altri dettagli da definire. + + + Completamento Proposto + + + Il tuo completamento è stato registrato nel sistema e contrassegnato come in attesa. Il creatore della richiesta di risorse dovrà esaminare manualmente la tua richiesta di completamento e approvarla. Riceverai una notifica quando ciò accadrà. + + + Visualizza Ordine + + + Richiesta di Completamento Ordine + + + Ordini + + + Dipartimento + + + Data/Ora + + + Contatto + + + Nota + + + Unità + + + Accettato + + + Non Accettato + + + In Attesa + + + Accetta + + + Riepilogo Ordine + + + Istruzioni Speciali + + + Indirizzo Incidente + + + Ritrovo + + + Posizione: + + + Data: + + + Non Fornito + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.pl.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.pl.resx new file mode 100644 index 00000000..8e3c3aad --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.pl.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Zamówienia Zasobów + + + Aktualizuj Ustawienia + + + Utwórz Zamówienie + + + Twoje Zamówienia + + + Dostępne Zamówienia + + + Utworzono + + + Procent Realizacji + + + Zamknięte + + + Zrealizowane + + + Otwarte + + + Wyświetl + + + Lokalizacja + + + Odległość + + + Nowe Zamówienie + + + Tytuł + + + Krótki tytuł zamówienia + + + Podsumowanie + + + Podsumowanie zamówienia + + + Zamknij Zamówienie Dnia + + + Czas, do którego zamówienie musi być zrealizowane; w zależności od typu zamówienia może zostać automatycznie zamknięte w tym momencie. + + + Numer Zdarzenia + + + ID lub numer zdarzenia + + + Nazwa Zdarzenia + + + Nazwa zdarzenia + + + Adres Zdarzenia + + + Adres zdarzenia, IC lub Stanowiska Dowodzenia + + + Kod Finansowy + + + Kod finansowy dla zdarzenia lub zamówienia + + + Imię i Nazwisko Kontaktu + + + Imię i nazwisko osoby kontaktowej dla spotkania lub zdarzenia + + + Numer Kontaktowy + + + Numer osoby kontaktowej dla spotkania lub zdarzenia + + + Miejsce Spotkania + + + Miejsce, gdzie spotkają się jednostki ze zrealizowanych zamówień + + + Czas Spotkania + + + Specjalne Instrukcje + + + Wszelkie specjalne instrukcje lub wymagania dotyczące zamówienia + + + Zezwalaj na Częściowe Realizacje + + + Umożliwia jednostce częściowe zrealizowanie pozycji zamówienia zasobów (pozwala to wielu jednostkom z wielu działów na realizację pozycji) + + + Automatyczne Akceptowanie Realizacji + + + System automatycznie zaakceptuje realizacje (częściowe w zależności od ustawienia Zezwalaj na Częściowe Realizacje) na zasadzie kto pierwszy, ten lepszy + + + Pozycje Zamówienia + + + Kliknij zielony przycisk "Dodaj", aby dodać pozycje do tego zamówienia; pozycje to grupy podobnych jednostek, które mają być częścią zamówienia. + + + Zasób + + + Min + + + Max + + + Kod Finansowy + + + Specjalne Potrzeby + + + Wymagania + + + Dodaj + + + Utwórz Zamówienie + + + Ustawienia Zamówień Zasobów + + + Nie Otrzymuj Zamówień + + + Domyślna Widoczność Zamówień + + + Zasięg Widoczności (w milach) + + + Domyślny Użytkownik Zarządzający Zamówieniami + + + Ogranicz Powiadomienia o Zamówieniach do Obsady + + + Dozwolony Poziom Obsady dla Powiadomień + + + Dozwolone Typy Działów + + + Automatycznie Akceptuj Realizacje + + + Powiadamiaj Role + + + Role do Powiadomienia + + + Zapisz Ustawienia + + + Realizuj Zamówienie + + + Status: + + + Utworzono przez: + + + Zdarzenie: + + + Numer\ID: + + + Kod Finansowy: + + + Ostatnio Zaktualizowano: + + + Utworzono: + + + Imię i Nazwisko Kontaktu: + + + Numer Kontaktowy: + + + Realizacja: + + + To zamówienie zasobów jest zrealizowane w + + + procentach. + + + Realizacje + + + Zasób: + + + Wymagania: + + + Min: + + + Max: + + + Potrzebne: + + + Wynik Realizacji Zamówienia + + + Realizacja Nieudana + + + Wystąpił błąd podczas przetwarzania żądania. Sprawdź błąd poniżej, aby uzyskać więcej szczegółów. + + + Realizacja Dodana i Zaakceptowana + + + Twoja realizacja została dodana do systemu i zaakceptowana automatycznie. + + + Możesz chcieć skontaktować się z Osobą Kontaktową dla zamówienia, aby upewnić się, że nie ma innych szczegółów do ustalenia. + + + Realizacja Zaproponowana + + + Twoja realizacja została zarejestrowana w systemie i oznaczona jako oczekująca. Twórca żądania zasobów będzie musiał ręcznie przejrzeć Twoją prośbę o realizację i ją zatwierdzić. Otrzymasz powiadomienie, gdy to nastąpi. + + + Wyświetl Zamówienie + + + Prośba o Realizację Zamówienia + + + Zamówienia + + + Dział + + + Znacznik Czasu + + + Kontakt + + + Notatka + + + Jednostki + + + Zaakceptowane + + + Niezaakceptowane + + + Oczekujące + + + Akceptuj + + + Podsumowanie Zamówienia + + + Specjalne Instrukcje + + + Adres Zdarzenia + + + Spotkanie + + + Lokalizacja: + + + Data: + + + Nie Podano + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.sv.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.sv.resx new file mode 100644 index 00000000..23f57f47 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.sv.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resursbeställningar + + + Uppdatera Inställningar + + + Skapa Beställning + + + Dina Beställningar + + + Tillgängliga Beställningar + + + Skapad + + + Fyllnadsgrad + + + Stängd + + + Uppfylld + + + Öppen + + + Visa + + + Plats + + + Avstånd + + + Ny Beställning + + + Titel + + + Kort titel för beställningen + + + Sammanfattning + + + En sammanfattning för beställningen + + + Stäng Beställning Den + + + Den tid då beställningen måste vara uppfylld; beroende på beställningstypen kan den stängas automatiskt vid den tidpunkten. + + + Incidentnummer + + + Incident-ID eller nummer + + + Incidentnamn + + + Incidentens namn + + + Incidentadress + + + Adress för incidenten, IC eller kommandopost + + + Finanskod + + + Finanskod för incidenten eller beställningen + + + Kontaktnamn + + + Namn på kontaktpersonen för mötet eller incidenten + + + Kontaktnummer + + + Nummer till kontaktpersonen för mötet eller incidenten + + + Mötesplats + + + Plats där enheterna från de uppfyllda beställningarna ska mötas + + + Mötestid + + + Särskilda Instruktioner + + + Eventuella särskilda instruktioner eller krav för beställningen + + + Tillåt Delvisa Uppfyllanden + + + Tillåter en avdelning att delvis uppfylla en resursbeställningspost (detta gör att flera enheter från flera avdelningar kan uppfylla en post) + + + Automatisk Godkännande av Uppfyllanden + + + Systemet godkänner automatiskt uppfyllanden (delvis baserat på inställningen Tillåt Delvisa Uppfyllanden) enligt principen först till kvarn + + + Beställningsartiklar + + + Klicka på den gröna knappen "Lägg till" för att lägga till artiklar i den här beställningen; artiklar är grupper av liknande enheter som du vill ska ingå i beställningen. + + + Resurs + + + Min + + + Max + + + Finanskod + + + Särskilda Behov + + + Krav + + + Lägg Till + + + Skapa Beställning + + + Inställningar för Resursbeställningar + + + Ta Inte Emot Beställningar + + + Standardsynlighet för Beställningar + + + Synlighetsräckvidd (i miles) + + + Standard Beställningshanterare + + + Begränsa Beställningsaviseringar till Bemanningsnivå + + + Tillåten Bemanningsnivå för Aviseringar + + + Tillåtna Avdelningstyper + + + Godkänn Uppfyllanden Automatiskt + + + Meddela Roller + + + Roller att Meddela + + + Spara Inställningar + + + Uppfyll Beställning + + + Status: + + + Skapad av: + + + Incident: + + + Nummer\ID: + + + Finanskod: + + + Senast Uppdaterad: + + + Skapad: + + + Kontaktnamn: + + + Kontaktnummer: + + + Uppfyllnad: + + + Denna resursbeställning är + + + uppfylld. + + + Uppfyllanden + + + Resurs: + + + Krav: + + + Min: + + + Max: + + + Behövs: + + + Resultat av Beställningsuppfyllnad + + + Uppfyllnad Misslyckades + + + Ett fel uppstod vid behandlingen av din begäran. Se felet nedan för mer detaljer. + + + Uppfyllnad Tillagd och Godkänd + + + Din uppfyllnad lades till i systemet och godkändes automatiskt. + + + Du kanske vill kontakta kontaktpersonen för beställningen för att säkerställa att det inte finns några andra detaljer att ordna. + + + Uppfyllnad Föreslagen + + + Din uppfyllnad har registrerats i systemet och markerats som väntande. Skaparen av resursbegäran måste manuellt granska din uppfyllnadsbegäran och godkänna den. Du kommer att få ett meddelande när det sker. + + + Visa Beställning + + + Begär att Uppfylla Beställning + + + Beställningar + + + Avdelning + + + Tidsstämpel + + + Kontakt + + + Anteckning + + + Enheter + + + Godkänd + + + Ej Godkänd + + + Väntande + + + Godkänn + + + Beställningssammanfattning + + + Särskilda Instruktioner + + + Incidentadress + + + Möte + + + Plats: + + + Datum: + + + Ej Angiven + + diff --git a/Core/Resgrid.Localization/Areas/User/Orders/Orders.uk.resx b/Core/Resgrid.Localization/Areas/User/Orders/Orders.uk.resx new file mode 100644 index 00000000..fb8859e6 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Orders/Orders.uk.resx @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Замовлення Ресурсів + + + Оновити Налаштування + + + Створити Замовлення + + + Ваші Замовлення + + + Доступні Замовлення + + + Створено + + + Відсоток Виконання + + + Закрито + + + Виконано + + + Відкрито + + + Переглянути + + + Місцезнаходження + + + Відстань + + + Нове Замовлення + + + Заголовок + + + Короткий заголовок замовлення + + + Підсумок + + + Підсумок замовлення + + + Закрити Замовлення + + + Час, до якого замовлення має бути виконане; залежно від типу замовлення воно може бути автоматично закрите в цей час. + + + Номер Інциденту + + + ID або номер інциденту + + + Назва Інциденту + + + Назва інциденту + + + Адреса Інциденту + + + Адреса інциденту, IC або Командного Пункту + + + Фінансовий Код + + + Фінансовий код для інциденту або замовлення + + + Ім'я Контакту + + + Ім'я особи для контакту щодо зустрічі або інциденту + + + Номер Контакту + + + Номер особи для контакту щодо зустрічі або інциденту + + + Місце Зустрічі + + + Місце, де зустрінуться підрозділи з виконаних замовлень + + + Час Зустрічі + + + Спеціальні Інструкції + + + Будь-які спеціальні інструкції або вимоги для замовлення + + + Дозволити Часткове Виконання + + + Дозволяє підрозділу частково виконати позицію замовлення ресурсів (це дозволяє кільком підрозділам з кількох відділів виконати одну позицію) + + + Автоматичне Прийняття Виконань + + + Система автоматично приймає виконання (часткові відповідно до налаштування Дозволити Часткове Виконання) за принципом першим прийшов, першим обслуговується + + + Позиції Замовлення + + + Натисніть зелену кнопку "Додати", щоб додати позиції до цього замовлення; позиції — це групи схожих підрозділів, які мають бути частиною замовлення. + + + Ресурс + + + Мін + + + Макс + + + Фінансовий Код + + + Спеціальні Потреби + + + Вимоги + + + Додати + + + Створити Замовлення + + + Налаштування Замовлень Ресурсів + + + Не Отримувати Замовлення + + + Видимість Замовлень За Замовчуванням + + + Діапазон Видимості (у милях) + + + Менеджер Замовлень За Замовчуванням + + + Обмежити Повідомлення про Замовлення до Рівня Персоналу + + + Дозволений Рівень Персоналу для Повідомлень + + + Дозволені Типи Відділів + + + Автоматично Приймати Виконання + + + Повідомляти Ролі + + + Ролі для Повідомлення + + + Зберегти Налаштування + + + Виконати Замовлення + + + Статус: + + + Створено: + + + Інцидент: + + + Номер\ID: + + + Фінансовий Код: + + + Останнє Оновлення: + + + Створено: + + + Ім'я Контакту: + + + Номер Контакту: + + + Виконання: + + + Це замовлення ресурсів виконано на + + + відсотків. + + + Виконання + + + Ресурс: + + + Вимоги: + + + Мін: + + + Макс: + + + Потрібно: + + + Результат Виконання Замовлення + + + Виконання Не Вдалося + + + Під час обробки вашого запиту сталася помилка. Перегляньте помилку нижче для отримання додаткових відомостей. + + + Виконання Додано і Прийнято + + + Ваше виконання було додано до системи та автоматично прийнято. + + + Можливо, ви захочете зв'язатися з Контактною Особою замовлення, щоб переконатися, що немає інших деталей для вирішення. + + + Виконання Запропоновано + + + Ваше виконання зареєстроване в системі та позначене як очікуване. Творець запиту ресурсів повинен вручну переглянути ваш запит на виконання та затвердити його. Ви отримаєте сповіщення, коли це станеться. + + + Переглянути Замовлення + + + Запит на Виконання Замовлення + + + Замовлення + + + Відділ + + + Позначка Часу + + + Контакт + + + Примітка + + + Підрозділи + + + Прийнято + + + Не Прийнято + + + Очікується + + + Прийняти + + + Підсумок Замовлення + + + Спеціальні Інструкції + + + Адреса Інциденту + + + Зустріч + + + Місце: + + + Дата: + + + Не Вказано + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.ar.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.ar.resx new file mode 100644 index 00000000..b396834b --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.ar.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + البروتوكولات + + + بروتوكول جديد + + + تاريخ الإنشاء + + + بروتوكول الإرسال + + + عرض + + + حذف + + + تحذير: سيؤدي هذا إلى حذف هذا البروتوكول نهائيًا. هل أنت متأكد من حذف البروتوكول + + + بروتوكول جديد + + + اسم البروتوكول + + + رمز البروتوكول + + + الوصف + + + نص البروتوكول + + + وزن سؤال التفعيل + + + المرفقات + + + المشغّلات + + + تُستخدم المشغّلات لتحديد متى سيتم تفعيل هذا البروتوكول، أو طرح الأسئلة أدناه، للمكالمات + + + النوع + + + يبدأ في + + + ينتهي في + + + نوع المكالمة + + + أولوية المكالمة + + + إضافة مشغّل + + + الأسئلة + + + إذا كنت تحتاج فقط إلى المشغّلات لتفعيل البروتوكول، فلست بحاجة إلى إضافة أي أسئلة. + + + السؤال + + + الإجابات + + + إضافة سؤال + + + إضافة بروتوكول + + + إضافة مشغّل + + + النوع: + + + يبدأ في: + + + ينتهي في: + + + أولوية المكالمة: + + + نوع المكالمة: + + + إغلاق + + + إضافة سؤال + + + السؤال: + + + عرض البروتوكول + + + الحالة: + + + نشط + + + معطّل + + + الرمز: + + + النوع: + + + أُنشئ بواسطة: + + + تاريخ الإنشاء: + + + الوزن: + + + الوصف: + + + نص البروتوكول: + + + المشغّلات + + + المرفقات + + + الأسئلة + + + الأولوية + + + أولوية المكالمة + + + نوع المكالمة + + + أولوية ونوع المكالمة + + + لا يوجد تاريخ بداية + + + لا يوجد تاريخ نهاية + + + غير منطبق + + + اسم الملف + + + نوع الملف + + + الحجم + + + الوزن + + + الإجابة + + + البروتوكولات + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.cs b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.cs new file mode 100644 index 00000000..2065ec49 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Resgrid.Localization.Areas.User.Protocols +{ + public class Protocols + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.de.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.de.resx new file mode 100644 index 00000000..8a269f34 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.de.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protokolle + + + Neues Protokoll + + + Erstellt Am + + + Einsatzprotokoll + + + Ansehen + + + Löschen + + + WARNUNG: Dadurch wird dieses Protokoll dauerhaft gelöscht. Sind Sie sicher, dass Sie das Protokoll löschen möchten + + + Neues Protokoll + + + Protokollname + + + Protokollcode + + + Beschreibung + + + Protokolltext + + + Gewichtung der Aktivierungsfrage + + + Anhänge + + + Auslöser + + + Auslöser werden verwendet, um zu bestimmen, wann dieses Protokoll aktiviert wird oder die folgenden Fragen für Einsätze stellt + + + Typ + + + Beginnt Am + + + Endet Am + + + Einsatztyp + + + Einsatzpriorität + + + Auslöser Hinzufügen + + + Fragen + + + Wenn Sie nur die Auslöser benötigen, um das Protokoll zu aktivieren, müssen Sie keine Fragen hinzufügen. + + + Frage + + + Antworten + + + Frage Hinzufügen + + + Protokoll Hinzufügen + + + Auslöser Hinzufügen + + + Typ: + + + Beginnt Am: + + + Endet Am: + + + Einsatzpriorität: + + + Einsatztyp: + + + Schließen + + + Frage Hinzufügen + + + Frage: + + + Protokoll Ansehen + + + Status: + + + Aktiv + + + Deaktiviert + + + Code: + + + Typ: + + + Erstellt Von: + + + Erstellt Am: + + + Gewichtung: + + + Beschreibung: + + + Protokolltext: + + + Auslöser + + + Anhänge + + + Fragen + + + Priorität + + + Einsatzpriorität + + + Einsatztyp + + + Einsatzpriorität & Typ + + + Kein Startdatum + + + Kein Enddatum + + + N/A + + + Dateiname + + + Dateityp + + + Größe + + + Gewichtung + + + Antwort + + + Protokolle + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.en.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.en.resx new file mode 100644 index 00000000..615db682 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.en.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protocols + + + New Protocol + + + Created On + + + Dispatch Protocol + + + View + + + Delete + + + WARNING: This will permanently delete this protocol. Are you sure you want to delete the protocol + + + New Protocol + + + Protocol Name + + + Protocol Code + + + Description + + + Protocol Text + + + Activation Question Weight + + + Attachments + + + Triggers + + + Triggers are used to determine when this protocol will be activated, or will ask the questions below, for calls + + + Type + + + Starts On + + + Ends On + + + Call Type + + + Call Priority + + + Add Trigger + + + Questions + + + If you only need the triggers to activate the protocol then you do not need to add any questions. + + + Question + + + Answers + + + Add Question + + + Add Protocol + + + Add Trigger + + + Type: + + + Starts On: + + + Ends On: + + + Call Priority: + + + Call Type: + + + Close + + + Add Question + + + Question: + + + View Protocol + + + Status: + + + Active + + + Disabled + + + Code: + + + Type: + + + Created By: + + + Created On: + + + Weight: + + + Description: + + + Protocol Text: + + + Triggers + + + Attachments + + + Questions + + + Priority + + + Call Priority + + + Call Type + + + Call Priority & Type + + + No Start Date + + + No End Date + + + N/A + + + File Name + + + File Type + + + Size + + + Weight + + + Answer + + + Protocols + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.es.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.es.resx new file mode 100644 index 00000000..b28c8d0c --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.es.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protocolos + + + Nuevo Protocolo + + + Fecha de Creación + + + Protocolo de Despacho + + + Ver + + + Eliminar + + + ADVERTENCIA: Esto eliminará permanentemente este protocolo. ¿Está seguro de que desea eliminar el protocolo + + + Nuevo Protocolo + + + Nombre del Protocolo + + + Código del Protocolo + + + Descripción + + + Texto del Protocolo + + + Peso de la Pregunta de Activación + + + Archivos Adjuntos + + + Disparadores + + + Los disparadores se utilizan para determinar cuándo se activará este protocolo, o hará las preguntas a continuación, para las llamadas + + + Tipo + + + Comienza El + + + Termina El + + + Tipo de Llamada + + + Prioridad de Llamada + + + Agregar Disparador + + + Preguntas + + + Si solo necesita que los disparadores activen el protocolo, no es necesario agregar preguntas. + + + Pregunta + + + Respuestas + + + Agregar Pregunta + + + Agregar Protocolo + + + Agregar Disparador + + + Tipo: + + + Comienza El: + + + Termina El: + + + Prioridad de Llamada: + + + Tipo de Llamada: + + + Cerrar + + + Agregar Pregunta + + + Pregunta: + + + Ver Protocolo + + + Estado: + + + Activo + + + Desactivado + + + Código: + + + Tipo: + + + Creado Por: + + + Creado El: + + + Peso: + + + Descripción: + + + Texto del Protocolo: + + + Disparadores + + + Archivos Adjuntos + + + Preguntas + + + Prioridad + + + Prioridad de Llamada + + + Tipo de Llamada + + + Prioridad y Tipo de Llamada + + + Sin Fecha de Inicio + + + Sin Fecha de Fin + + + N/A + + + Nombre de Archivo + + + Tipo de Archivo + + + Tamaño + + + Peso + + + Respuesta + + + Protocolos + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.fr.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.fr.resx new file mode 100644 index 00000000..4eb7f178 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.fr.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protocoles + + + Nouveau Protocole + + + Créé Le + + + Protocole de Déploiement + + + Voir + + + Supprimer + + + AVERTISSEMENT : Cela supprimera définitivement ce protocole. Êtes-vous sûr de vouloir supprimer le protocole + + + Nouveau Protocole + + + Nom du Protocole + + + Code du Protocole + + + Description + + + Texte du Protocole + + + Poids de la Question d'Activation + + + Pièces Jointes + + + Déclencheurs + + + Les déclencheurs sont utilisés pour déterminer quand ce protocole sera activé, ou posera les questions ci-dessous, pour les appels + + + Type + + + Commence Le + + + Se Termine Le + + + Type d'Appel + + + Priorité d'Appel + + + Ajouter un Déclencheur + + + Questions + + + Si vous avez seulement besoin des déclencheurs pour activer le protocole, vous n'avez pas besoin d'ajouter des questions. + + + Question + + + Réponses + + + Ajouter une Question + + + Ajouter le Protocole + + + Ajouter un Déclencheur + + + Type : + + + Commence Le : + + + Se Termine Le : + + + Priorité d'Appel : + + + Type d'Appel : + + + Fermer + + + Ajouter une Question + + + Question : + + + Voir le Protocole + + + Statut : + + + Actif + + + Désactivé + + + Code : + + + Type : + + + Créé Par : + + + Créé Le : + + + Poids : + + + Description : + + + Texte du Protocole : + + + Déclencheurs + + + Pièces Jointes + + + Questions + + + Priorité + + + Priorité d'Appel + + + Type d'Appel + + + Priorité & Type d'Appel + + + Pas de Date de Début + + + Pas de Date de Fin + + + N/A + + + Nom du Fichier + + + Type de Fichier + + + Taille + + + Poids + + + Réponse + + + Protocoles + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.it.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.it.resx new file mode 100644 index 00000000..c9628980 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.it.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protocolli + + + Nuovo Protocollo + + + Creato Il + + + Protocollo di Dispaccio + + + Visualizza + + + Elimina + + + ATTENZIONE: Questo eliminerà definitivamente questo protocollo. Sei sicuro di voler eliminare il protocollo + + + Nuovo Protocollo + + + Nome Protocollo + + + Codice Protocollo + + + Descrizione + + + Testo del Protocollo + + + Peso della Domanda di Attivazione + + + Allegati + + + Trigger + + + I trigger vengono utilizzati per determinare quando questo protocollo verrà attivato, o farà le domande sottostanti, per le chiamate + + + Tipo + + + Inizia Il + + + Termina Il + + + Tipo di Chiamata + + + Priorità Chiamata + + + Aggiungi Trigger + + + Domande + + + Se hai bisogno solo dei trigger per attivare il protocollo, non è necessario aggiungere domande. + + + Domanda + + + Risposte + + + Aggiungi Domanda + + + Aggiungi Protocollo + + + Aggiungi Trigger + + + Tipo: + + + Inizia Il: + + + Termina Il: + + + Priorità Chiamata: + + + Tipo di Chiamata: + + + Chiudi + + + Aggiungi Domanda + + + Domanda: + + + Visualizza Protocollo + + + Stato: + + + Attivo + + + Disabilitato + + + Codice: + + + Tipo: + + + Creato Da: + + + Creato Il: + + + Peso: + + + Descrizione: + + + Testo del Protocollo: + + + Trigger + + + Allegati + + + Domande + + + Priorità + + + Priorità Chiamata + + + Tipo di Chiamata + + + Priorità & Tipo di Chiamata + + + Nessuna Data di Inizio + + + Nessuna Data di Fine + + + N/A + + + Nome File + + + Tipo di File + + + Dimensione + + + Peso + + + Risposta + + + Protocolli + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.pl.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.pl.resx new file mode 100644 index 00000000..7f6bd457 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.pl.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protokoły + + + Nowy Protokół + + + Data Utworzenia + + + Protokół Dyspozytorski + + + Wyświetl + + + Usuń + + + OSTRZEŻENIE: Spowoduje to trwałe usunięcie tego protokołu. Czy na pewno chcesz usunąć protokół + + + Nowy Protokół + + + Nazwa Protokołu + + + Kod Protokołu + + + Opis + + + Tekst Protokołu + + + Waga Pytania Aktywacyjnego + + + Załączniki + + + Wyzwalacze + + + Wyzwalacze służą do określenia, kiedy ten protokół zostanie aktywowany lub kiedy zostaną zadane poniższe pytania dla zgłoszeń + + + Typ + + + Zaczyna Się + + + Kończy Się + + + Typ Zgłoszenia + + + Priorytet Zgłoszenia + + + Dodaj Wyzwalacz + + + Pytania + + + Jeśli potrzebujesz tylko wyzwalaczy do aktywacji protokołu, nie musisz dodawać pytań. + + + Pytanie + + + Odpowiedzi + + + Dodaj Pytanie + + + Dodaj Protokół + + + Dodaj Wyzwalacz + + + Typ: + + + Zaczyna Się: + + + Kończy Się: + + + Priorytet Zgłoszenia: + + + Typ Zgłoszenia: + + + Zamknij + + + Dodaj Pytanie + + + Pytanie: + + + Wyświetl Protokół + + + Status: + + + Aktywny + + + Wyłączony + + + Kod: + + + Typ: + + + Utworzono Przez: + + + Data Utworzenia: + + + Waga: + + + Opis: + + + Tekst Protokołu: + + + Wyzwalacze + + + Załączniki + + + Pytania + + + Priorytet + + + Priorytet Zgłoszenia + + + Typ Zgłoszenia + + + Priorytet i Typ Zgłoszenia + + + Brak Daty Rozpoczęcia + + + Brak Daty Zakończenia + + + N/D + + + Nazwa Pliku + + + Typ Pliku + + + Rozmiar + + + Waga + + + Odpowiedź + + + Protokoły + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.sv.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.sv.resx new file mode 100644 index 00000000..c7bf3fed --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.sv.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Protokoll + + + Nytt Protokoll + + + Skapad Den + + + Utlarmningsprotokoll + + + Visa + + + Radera + + + VARNING: Detta kommer att permanent radera detta protokoll. Är du säker på att du vill radera protokollet + + + Nytt Protokoll + + + Protokollnamn + + + Protokollkod + + + Beskrivning + + + Protokolltext + + + Vikt för Aktiveringsfråga + + + Bilagor + + + Utlösare + + + Utlösare används för att avgöra när detta protokoll aktiveras, eller ställer frågorna nedan, för larm + + + Typ + + + Börjar Den + + + Slutar Den + + + Larmtyp + + + Larmprioritet + + + Lägg Till Utlösare + + + Frågor + + + Om du bara behöver utlösarna för att aktivera protokollet behöver du inte lägga till några frågor. + + + Fråga + + + Svar + + + Lägg Till Fråga + + + Lägg Till Protokoll + + + Lägg Till Utlösare + + + Typ: + + + Börjar Den: + + + Slutar Den: + + + Larmprioritet: + + + Larmtyp: + + + Stäng + + + Lägg Till Fråga + + + Fråga: + + + Visa Protokoll + + + Status: + + + Aktiv + + + Inaktiverad + + + Kod: + + + Typ: + + + Skapad Av: + + + Skapad Den: + + + Vikt: + + + Beskrivning: + + + Protokolltext: + + + Utlösare + + + Bilagor + + + Frågor + + + Prioritet + + + Larmprioritet + + + Larmtyp + + + Larmprioritet & Typ + + + Inget Startdatum + + + Inget Slutdatum + + + N/A + + + Filnamn + + + Filtyp + + + Storlek + + + Vikt + + + Svar + + + Protokoll + + diff --git a/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.uk.resx b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.uk.resx new file mode 100644 index 00000000..4019e457 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Protocols/Protocols.uk.resx @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Протоколи + + + Новий Протокол + + + Дата Створення + + + Протокол Диспетчеризації + + + Переглянути + + + Видалити + + + ПОПЕРЕДЖЕННЯ: Це призведе до безповоротного видалення цього протоколу. Ви впевнені, що хочете видалити протокол + + + Новий Протокол + + + Назва Протоколу + + + Код Протоколу + + + Опис + + + Текст Протоколу + + + Вага Активаційного Питання + + + Вкладення + + + Тригери + + + Тригери використовуються для визначення того, коли цей протокол буде активований, або ставитиме наведені нижче запитання для викликів + + + Тип + + + Починається + + + Закінчується + + + Тип Виклику + + + Пріоритет Виклику + + + Додати Тригер + + + Запитання + + + Якщо вам потрібні тільки тригери для активації протоколу, вам не потрібно додавати запитання. + + + Запитання + + + Відповіді + + + Додати Запитання + + + Додати Протокол + + + Додати Тригер + + + Тип: + + + Починається: + + + Закінчується: + + + Пріоритет Виклику: + + + Тип Виклику: + + + Закрити + + + Додати Запитання + + + Запитання: + + + Переглянути Протокол + + + Статус: + + + Активний + + + Вимкнено + + + Код: + + + Тип: + + + Створено Ким: + + + Дата Створення: + + + Вага: + + + Опис: + + + Текст Протоколу: + + + Тригери + + + Вкладення + + + Запитання + + + Пріоритет + + + Пріоритет Виклику + + + Тип Виклику + + + Пріоритет та Тип Виклику + + + Немає Дати Початку + + + Немає Дати Закінчення + + + Н/Д + + + Ім'я Файлу + + + Тип Файлу + + + Розмір + + + Вага + + + Відповідь + + + Протоколи + + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.ar.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.ar.resx new file mode 100644 index 00000000..fc5bd3fb --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.ar.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + التقارير + عرض التقرير + التقارير + تقرير سجل حالة الموظفين + سيعرض هذا التقرير سجل حالة الموظفين بالكامل (سجلات الإجراءات) المقدم من الموظفين المحددين + تقرير الموظفين + عرض جميع الموظفين في قسمك وأدوارهم ومعلومات الاتصال الأساسية. + تقرير التوظيف + عرض جميع الموظفين وحالتهم الحالية ومستوى التوظيف والتغيير التالي المجدول لمستوى التوظيف. + تقرير الشهادات + عرض جميع الشهادات لكل شخص في القسم. + تقرير جاهزية المناوبة + سيعرض هذا التقرير جاهزية المناوبة لأيام المناوبة القادمة لكل مناوبة. + تقرير نشاط القسم السنوي + سيعرض هذا التقرير نشاط المكالمات والسجلات والتدريب والموظفين في القسم بأرقام من بداية العام. + تقرير ساعات سجل الموظفين + سيعرض هذا التقرير عدد الساعات التي عمل فيها موظفو القسم وتدربوا وردوا على المكالمات وفقاً لإدخالات السجل. + تقرير ملخص المكالمات + سيعرض هذا التقرير تفاصيل جميع المكالمات في نطاق تاريخ محدد + تقرير سجل توظيف الموظفين + سيعرض هذا التقرير سجل التوظيف بالكامل المقدم من الموظفين المحددين + تقرير سجل حالة الوحدة + يعرض حالات الوحدة لوحدة واحدة أو جميع الوحدات أو وحدات في مجموعة لنطاق زمني محدد من قبل المستخدم + تقرير المكالمات النشطة والموارد + يوضح التقرير المكالمات المفتوحة حالياً وقت تشغيل التقرير والوحدات والموظفين المرفقين بهذه المكالمات + وقت بدء التقرير + وقت انتهاء التقرير + تشغيل التقرير + النوع + مجموعة أو مستخدم/مستخدمون + مجموعة + مجموعة + مستخدم/مستخدمون + وحدة/وحدات + مجموعة أو وحدة/وحدات + المعرف + الاسم + المجموعة + المجموع + العدد + النوع + الحالة + الحالة + الطابع الزمني + ملاحظة + الساعات + الرقم + البداية + النهاية + التاريخ + الأدوار + الموقع + تغييرات الحالة + المجموع + أنواع المكالمات + حالات المكالمات + المكالمات + تم التسجيل في + تم الإغلاق في + مدة المكالمة + وقت الوصول للموقع + الوحدات + الموظفون + مفتوح + % + تقرير شهادات Resgrid + الرقم + صادر من + المنطقة + تنتهي في + تقرير نشاط القسم السنوي + تفاصيل استجابة الموظفين + التدريبات + تفاصيل تدريب الموظفين + تم الإيفاد + حضر + يناير + فبراير + مارس + أبريل + مايو + يونيو + يوليو + أغسطس + سبتمبر + أكتوبر + نوفمبر + ديسمبر + تقرير أحداث الموظفين Resgrid + الوجهة\المكالمة + تقرير ساعات الموظفين + تقرير تفصيلي لساعات الموظفين + ساعات المكالمات + ساعات العمل + ساعات التدريب + سجلات العمل + تقرير موظفي Resgrid + اسم المستخدم + البريد الإلكتروني + رقم الجوال + عنوان البريد + تقرير سجل توظيف الموظفين + تغييرات التوظيف + التوظيف + مجدول + تقرير توظيف Resgrid + طابع زمني للتوظيف + التغيير التالي + التوظيف التالي + متاح + متأخر + غير متاح + ملتزم + في المناوبة + غير معروف + تقرير أحداث الوحدة Resgrid + تقرير سجل حالة الوحدة + تغييرات الحالة + إجمالي الحالات + تقرير جاهزية المناوبة القادمة + جاهز + غير جاهز + مطلوب + اختياري + الفرق + الدور + اسم التسجيل + تقرير المكالمات النشطة والموارد + اسم المكالمة + الوحدات في المكالمة + الموظفون في المكالمة + اسم الوحدة + اسم الشخص + اسم المجموعة + تم الإيفاد في + علامة 14 يوم + علامة 21 يوم + سجل Resgrid + المنطقة + القسم + النوع + تم التسجيل في + سجل بواسطة + بدأ في + انتهى في + الموظفون + السرد + غير متوفر + عمل + المعرف + المحطة + الوحدات + الحالة + اسم المكالمة + نوع المكالمة + بلا نوع + الأولوية + عنوان المكالمة + تم الإيفاد + في الطريق + في الموقع + تم الإطلاق + في الثكنة + التدقيق + تدريب\دورة + الرمز + المدربون + الحضور + الوقت الإجمالي + نوع الاجتماع + نوع السجل + اجتماع + الموقع + يترأس + حاضرون آخرون + محضر الاجتماع + رقم القضية + ضابط المناوبة + الوجهة + أعلن بواسطة + موقع الجثة + معرف المكالمة + رقم المكالمة + معرف الحادثة + معرف المرجع + لا شيء + رد اتصال + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.cs b/Core/Resgrid.Localization/Areas/User/Reports/Reports.cs new file mode 100644 index 00000000..adf8b29b --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Resgrid.Localization.Areas.User.Reports +{ + public class Reports + { + } +} diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.de.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.de.resx new file mode 100644 index 00000000..7bd26a34 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.de.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Berichte + Bericht Anzeigen + Berichte + Bericht zum Personalstatusverlauf + Dieser Bericht zeigt den gesamten Personalstatusverlauf (Aktionsprotokolle) des ausgewählten Personals an + Personalbericht + Alle Mitarbeiter Ihrer Abteilung, deren Rollen und grundlegende Kontaktinformationen anzeigen. + Besetzungsbericht + Alle Mitarbeiter und ihren aktuellen Status, Besetzungsgrad und den nächsten geplanten Besetzungsgrädänderung anzeigen. + Zertifizierungsbericht + Alle Zertifizierungen jeder Person in der Abteilung anzeigen. + Schichtbereitschaftsbericht + Dieser Bericht zeigt die Schichtbereitschaft für die nächsten Schichttage jeder Schicht. + Jahresbericht Abteilungsaktivität + Dieser Bericht zeigt die Einsatz-, Protokoll-, Schulungs- und Personalaktivität der Abteilung als Jahreswerte. + Personaleinsatzstundenbericht + Dieser Bericht zeigt die Anzahl der Stunden, die das Abteilungspersonal gearbeitet, geschult und auf Einsätze reagiert hat. + Einsatzzusammenfassungsbericht + Dieser Bericht zeigt Details zu allen Einsätzen in einem ausgewählten Datumsbereich + Bericht zum Personalbesetzungsverlauf + Dieser Bericht zeigt den gesamten Besetzungsverlauf des ausgewählten Personals + Einheitenstatusverlaufsbericht + Zeigt die Einheitenzustände für eine einzelne Einheit, alle oder Einheiten einer Gruppe für einen benutzerdefinierten Zeitraum + Bericht zu aktiven Einsätzen und Ressourcen + Der Bericht zeigt die zum Zeitpunkt der Berichterstellung aktiven Einsätze und die derzeit diesen Einsätzen zugewiesenen Einheiten und Mitarbeiter + Berichtsstartzeit + Berichtsendzeit + Bericht Ausführen + Typ + Gruppe oder Benutzer + Gruppe + Gruppe + Benutzer + Einheit(en) + Gruppe oder Einheit(en) + ID + Name + Gruppe + Gesamt + Anzahl + Typ + Status + Status + Zeitstempel + Notiz + Stunden + Nummer + Start + Ende + Datum + Rollen + Ort + Statusänderungen + Gesamt + Einsatztypen + Einsatzzustände + Einsätze + Eingeloggt Am + Geschlossen Am + Einsatzdauer + Zeit vor Ort + Einheiten + Personal + Offen + % + Resgrid Zertifizierungsbericht + Nummer + Ausgestellt Von + Bereich + Läuft Ab + Jahresbericht Abteilungsaktivität + Personalreaktionsdetail + Schulungen + Personalschulungsdetail + Entsandt + Teilgenommen + Januar + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + November + Dezember + Resgrid Personalereignisbericht + Ziel\Einsatz + Personalstundenbericht + Personalstundendetailbericht + Einsatzstunden + Arbeitsstunden + Schulungsstunden + Arbeitsprotokolle + Resgrid Personalbericht + Benutzername + E-Mail + Mobilnummer + Postanschrift + Bericht zum Personalbesetzungsverlauf + Besetzungsänderungen + Besetzung + Geplant + Resgrid Besetzungsbericht + Besetzungszeitstempel + Nächste Änderung + Nächste Besetzung + Verfügbar + Verzögert + Nicht Verfügbar + Gebunden + Im Dienst + Unbekannt + Resgrid Einheitenereignisbericht + Einheitenstatusverlaufsbericht + Statusänderungen + Gesamtzustände + Bericht zur bevorstehenden Schichtbereitschaft + Bereit + Nicht Bereit + Erforderlich + Optional + Delta + Rolle + Anmeldename + Bericht zu aktiven Einsätzen und Ressourcen + Einsatzname + Einheiten im Einsatz + Personal im Einsatz + Einheitsname + Personenname + Gruppenname + Entsandt Am + 14-Tage-Marke + 21-Tage-Marke + Resgrid Protokoll + Bezirk + Abteilung + Typ + Eingeloggt Am + Eingeloggt Von + Gestartet Am + Beendet Am + Personal + Bericht + Nicht Angegeben + Arbeit + Id + Station + Einheiten + Zustand + Einsatzname + Einsatztyp + Kein Typ + Priorität + Einsatzadresse + Entsandt + Unterwegs + Vor Ort + Freigegeben + In der Wache + Prüfung + Schulung\Kurs + Code + Ausbilder + Anwesenheit + Gesamtzeit + Besprechungstyp + Protokolltyp + Besprechung + Ort + Vorsitzend + Andere Teilnehmer + Besprechungsprotokoll + Fall-Nr. + OIC + Ziel + Festgestellt Von + Leicherort + Einsatz-Id + Einsatznummer + Vorfall-Id + Referenz-Id + Keine + Rückruf + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.en.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.en.resx new file mode 100644 index 00000000..8613df63 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.en.resx @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Reporting + + + View Report + + + Reports + + + + + Personnel Status History Report + + + This report will show all the personnel status (action logs) history supplied by the selected personnel + + + + + Personnel Report + + + View all the personnel in your department, their roles and basic contact information. + + + + + Staffing Report + + + View all personnel and their current status, staffing level and next scheduled staffing level change. + + + + + Certifications Report + + + View all the certifications for each person in the department. + + + + + Shift Readiness Report + + + This report will show shift readiness for the next upcoming shift days for each shift. + + + + + Department YTD Activity Report + + + This report will show the call, log, training and personnel activity for the department in year to date numbers. + + + + + Personnel Log Hours Report + + + This report will show the number of hours department personnel worked, trained and responded to calls as recorded via log (after action reports) entries. + + + + + Call Summary Report + + + This report will show details about all calls in a selected date range (i.e. call types, close states, etc) + + + + + Personnel Staffing History Report + + + This report will show all the staffing history supplied by the selected personnel + + + + + Unit State History Report + + + Shows the Unit States for a single unit, all, or a units in a group for a user defined time range + + + + + Active Calls and Resources Report + + + Report details the currently open calls at the time of running the report and any units and personnel currently attached to those calls + + + + + Report Start Time + + + Report End Time + + + Run Report + + + Type + + + Group or User(s) + + + Group + + + Group + + + User(s) + + + Units(s) + + + Group or Units(s) + + + + + ID + + + Name + + + Group + + + Total + + + Count + + + Type + + + State + + + Status + + + Timestamp + + + Note + + + Hours + + + Number + + + Start + + + End + + + Date + + + Roles + + + Location + + + + + Status Changes + + + Total + + + + + Call Types + + + Call States + + + Calls + + + Logged On + + + Closed On + + + Call Length + + + OnScene Time + + + Units + + + Personnel + + + Open + + + % + + + + + Resgrid Certifications Report + + + Number + + + Issued By + + + Area + + + Expires + + + + + YTD Department Activity Report + + + Personnel Response Detail + + + Trainings + + + Personnel Training Detail + + + Dispatched + + + Attended + + + January + + + February + + + March + + + April + + + May + + + June + + + July + + + August + + + September + + + October + + + November + + + December + + + + + Resgrid Personnel Events Report + + + Destination\Call + + + + + Personnel Hours Report + + + Personnel Hours Detail Report + + + Call Hours + + + Work Hours + + + Training Hours + + + Work Logs + + + + + Resgrid Personnel Report + + + Username + + + Email + + + Mobile Number + + + Mailing Address + + + + + Personnel Staffing History Report + + + Staffing Changes + + + Staffing + + + Scheduled + + + + + Resgrid Staffing Report + + + Staffing Timestamp + + + Next Change + + + Next Staffing + + + Available + + + Delayed + + + Unavailable + + + Committed + + + On Shift + + + Unknown + + + + + Resgrid Unit Events Report + + + + + Unit State History Report + + + State Changes + + + Total States + + + + + Upcoming Shift Readiness Report + + + Ready + + + Not Ready + + + Required + + + Optional + + + Delta + + + Role + + + Signup Name + + + + + Active Calls and Resources Report + + + Call Name + + + Units on Call + + + Personnel on Call + + + Unit Name + + + Person Name + + + Group Name + + + Dispatched On + + + 14 Day Mark + + + 21 Day Mark + + + + + Resgrid Log + + + District + + + Department + + + Type + + + Logged On + + + Logged By + + + Started On + + + Ended On + + + Personnel + + + Narrative + + + Not Supplied + + + Work + + + Id + + + Station + + + Units + + + Condition + + + Call Name + + + Call Type + + + No Type + + + Priority + + + Call Address + + + Dispatched + + + Enroute + + + On Scene + + + Released + + + In Quarters + + + Audit + + + Training\Course + + + Code + + + Instructors + + + Attendance + + + Total Time + + + Meeting Type + + + Log Type + + + Meeting + + + Location + + + Presiding + + + Other Attendees + + + Meeting Minutes + + + Case # + + + OIC + + + Destination + + + Pronounced By + + + Body Location + + + Call Id + + + Call Number + + + Incident Id + + + Reference Id + + + None + + + Callback + + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.es.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.es.resx new file mode 100644 index 00000000..71683acc --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.es.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Informes + Ver Informe + Informes + Informe de Historial de Estado del Personal + Este informe mostrará todo el historial de estado del personal (registros de acciones) proporcionado por el personal seleccionado + Informe de Personal + Ver todo el personal en su departamento, sus roles e información de contacto básica. + Informe de Dotación + Ver todo el personal y su estado actual, nivel de dotación y próximo cambio de nivel de dotación programado. + Informe de Certificaciones + Ver todas las certificaciones de cada persona en el departamento. + Informe de Preparación de Turno + Este informe mostrará la preparación del turno para los próximos días de turno para cada turno. + Informe de Actividad Anual del Departamento + Este informe mostrará la actividad de llamadas, registros, capacitación y personal del departamento en cifras anuales hasta la fecha. + Informe de Horas de Registro del Personal + Este informe mostrará el número de horas que el personal del departamento trabajó, entrenó y respondió a llamadas según los registros. + Informe de Resumen de Llamadas + Este informe mostrará detalles sobre todas las llamadas en un rango de fechas seleccionado + Informe de Historial de Dotación del Personal + Este informe mostrará todo el historial de dotación proporcionado por el personal seleccionado + Informe de Historial de Estado de Unidad + Muestra los estados de unidad para una sola unidad, todas, o unidades en un grupo para un rango de tiempo definido por el usuario + Informe de Llamadas Activas y Recursos + El informe detalla las llamadas actualmente abiertas al momento de ejecutar el informe y las unidades y personal actualmente adjuntos a esas llamadas + Hora de Inicio del Informe + Hora de Fin del Informe + Ejecutar Informe + Tipo + Grupo o Usuario(s) + Grupo + Grupo + Usuario(s) + Unidad(es) + Grupo o Unidad(es) + ID + Nombre + Grupo + Total + Cantidad + Tipo + Estado + Estado + Marca de Tiempo + Nota + Horas + Número + Inicio + Fin + Fecha + Roles + Ubicación + Cambios de Estado + Total + Tipos de Llamada + Estados de Llamada + Llamadas + Registrado En + Cerrado En + Duración de Llamada + Tiempo en Escena + Unidades + Personal + Abierto + % + Informe de Certificaciones Resgrid + Número + Emitido Por + Área + Vence + Informe de Actividad Anual del Departamento + Detalle de Respuesta del Personal + Capacitaciones + Detalle de Capacitación del Personal + Despachado + Asistido + Enero + Febrero + Marzo + Abril + Mayo + Junio + Julio + Agosto + Septiembre + Octubre + Noviembre + Diciembre + Informe de Eventos del Personal Resgrid + Destino\Llamada + Informe de Horas del Personal + Informe Detallado de Horas del Personal + Horas de Llamada + Horas de Trabajo + Horas de Capacitación + Registros de Trabajo + Informe de Personal Resgrid + Usuario + Correo Electrónico + Número Móvil + Dirección Postal + Informe de Historial de Dotación del Personal + Cambios de Dotación + Dotación + Programado + Informe de Dotación Resgrid + Marca de Tiempo de Dotación + Próximo Cambio + Próxima Dotación + Disponible + Retrasado + No Disponible + Comprometido + En Turno + Desconocido + Informe de Eventos de Unidad Resgrid + Informe de Historial de Estado de Unidad + Cambios de Estado + Total de Estados + Informe de Preparación del Próximo Turno + Listo + No Listo + Requerido + Opcional + Delta + Rol + Nombre de Registro + Informe de Llamadas Activas y Recursos + Nombre de Llamada + Unidades en Llamada + Personal en Llamada + Nombre de Unidad + Nombre de Persona + Nombre de Grupo + Despachado En + Marca de 14 Días + Marca de 21 Días + Registro Resgrid + Distrito + Departamento + Tipo + Registrado En + Registrado Por + Iniciado En + Finalizado En + Personal + Narrativa + No Proporcionado + Trabajo + Id + Estación + Unidades + Condición + Nombre de Llamada + Tipo de Llamada + Sin Tipo + Prioridad + Dirección de Llamada + Despachado + En Camino + En Escena + Liberado + En Cuartel + Auditoría + Capacitación\Curso + Código + Instructores + Asistencia + Tiempo Total + Tipo de Reunión + Tipo de Registro + Reunión + Ubicación + Presidiendo + Otros Asistentes + Actas de Reunión + Caso # + OIC + Destino + Declarado Por + Ubicación del Cuerpo + Id de Llamada + Número de Llamada + Id de Incidente + Id de Referencia + Ninguno + Devolución de Llamada + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.fr.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.fr.resx new file mode 100644 index 00000000..13798105 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.fr.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Rapports + Voir le Rapport + Rapports + Rapport d'Historique du Statut du Personnel + Ce rapport affichera tout l'historique du statut du personnel (journaux d'actions) fourni par le personnel sélectionné + Rapport du Personnel + Afficher tout le personnel de votre département, leurs rôles et les informations de contact de base. + Rapport de Dotation + Afficher tout le personnel et leur statut actuel, niveau de dotation et prochain changement de niveau de dotation planifié. + Rapport de Certifications + Afficher toutes les certifications de chaque personne dans le département. + Rapport de Préparation des Quarts + Ce rapport affichera la préparation des quarts pour les prochains jours de quart pour chaque quart. + Rapport d'Activité Annuelle du Département + Ce rapport affichera l'activité des appels, journaux, formations et personnel du département en chiffres annuels. + Rapport des Heures de Journal du Personnel + Ce rapport affichera le nombre d'heures que le personnel a travaillé, formé et répondu aux appels selon les journaux. + Rapport de Synthèse des Appels + Ce rapport affichera les détails de tous les appels dans une plage de dates sélectionnée + Rapport d'Historique de Dotation du Personnel + Ce rapport affichera tout l'historique de dotation fourni par le personnel sélectionné + Rapport d'Historique d'État des Unités + Affiche les états d'unité pour une seule unité, toutes, ou les unités d'un groupe pour une plage de temps définie par l'utilisateur + Rapport des Appels Actifs et Ressources + Le rapport détaille les appels actuellement ouverts au moment de l'exécution et les unités et personnels actuellement attachés à ces appels + Heure de Début du Rapport + Heure de Fin du Rapport + Exécuter le Rapport + Type + Groupe ou Utilisateur(s) + Groupe + Groupe + Utilisateur(s) + Unité(s) + Groupe ou Unité(s) + ID + Nom + Groupe + Total + Nombre + Type + État + Statut + Horodatage + Note + Heures + Numéro + Début + Fin + Date + Rôles + Emplacement + Changements de Statut + Total + Types d'Appel + États d'Appel + Appels + Enregistré Le + Fermé Le + Durée de l'Appel + Temps sur Place + Unités + Personnel + Ouvert + % + Rapport de Certifications Resgrid + Numéro + Délivré Par + Zone + Expire + Rapport d'Activité Annuelle du Département + Détail de Réponse du Personnel + Formations + Détail de Formation du Personnel + Dépêché + Présent + Janvier + Février + Mars + Avril + Mai + Juin + Juillet + Août + Septembre + Octobre + Novembre + Décembre + Rapport d'Événements du Personnel Resgrid + Destination\Appel + Rapport des Heures du Personnel + Rapport Détaillé des Heures du Personnel + Heures d'Appel + Heures de Travail + Heures de Formation + Journaux de Travail + Rapport du Personnel Resgrid + Nom d'Utilisateur + Email + Numéro Mobile + Adresse Postale + Rapport d'Historique de Dotation du Personnel + Changements de Dotation + Dotation + Planifié + Rapport de Dotation Resgrid + Horodatage de Dotation + Prochain Changement + Prochaine Dotation + Disponible + Retardé + Indisponible + Engagé + En Service + Inconnu + Rapport d'Événements d'Unité Resgrid + Rapport d'Historique d'État des Unités + Changements d'État + Total des États + Rapport de Préparation du Prochain Quart + Prêt + Pas Prêt + Requis + Optionnel + Delta + Rôle + Nom d'Inscription + Rapport des Appels Actifs et Ressources + Nom de l'Appel + Unités sur Appel + Personnel sur Appel + Nom de l'Unité + Nom de la Personne + Nom du Groupe + Dépêché Le + Marque 14 Jours + Marque 21 Jours + Journal Resgrid + District + Département + Type + Enregistré Le + Enregistré Par + Commencé Le + Terminé Le + Personnel + Récit + Non Fourni + Travail + Id + Station + Unités + Condition + Nom de l'Appel + Type d'Appel + Aucun Type + Priorité + Adresse de l'Appel + Dépêché + En Route + Sur Place + Libéré + Au Quartier + Audit + Formation\Cours + Code + Instructeurs + Présence + Temps Total + Type de Réunion + Type de Journal + Réunion + Emplacement + Présidant + Autres Participants + Procès-verbal + Dossier # + OIC + Destination + Déclaré Par + Emplacement du Corps + Id d'Appel + Numéro d'Appel + Id d'Incident + Id de Référence + Aucun + Rappel + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.it.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.it.resx new file mode 100644 index 00000000..35199347 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.it.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Rapporti + Visualizza Rapporto + Rapporti + Rapporto Storico Stato Personale + Questo rapporto mostrerà tutta la cronologia dello stato del personale (registri delle azioni) fornito dal personale selezionato + Rapporto Personale + Visualizza tutto il personale nel tuo dipartimento, i loro ruoli e le informazioni di contatto di base. + Rapporto Organico + Visualizza tutto il personale e il loro stato attuale, livello di organico e prossima modifica pianificata del livello di organico. + Rapporto Certificazioni + Visualizza tutte le certificazioni per ogni persona nel dipartimento. + Rapporto Prontezza Turno + Questo rapporto mostrerà la prontezza del turno per i prossimi giorni di turno per ogni turno. + Rapporto Attività Annuale Dipartimento + Questo rapporto mostrerà l'attività di chiamate, registri, formazione e personale del dipartimento nei numeri da inizio anno. + Rapporto Ore Registro Personale + Questo rapporto mostrerà il numero di ore che il personale del dipartimento ha lavorato, si è formato e ha risposto alle chiamate secondo i registri. + Rapporto Riepilogo Chiamate + Questo rapporto mostrerà i dettagli di tutte le chiamate in un intervallo di date selezionato + Rapporto Storico Organico Personale + Questo rapporto mostrerà tutta la cronologia dell'organico fornita dal personale selezionato + Rapporto Storico Stato Unità + Mostra gli stati dell'unità per una singola unità, tutte, o le unità in un gruppo per un intervallo di tempo definito dall'utente + Rapporto Chiamate Attive e Risorse + Il rapporto dettaglia le chiamate attualmente aperte al momento dell'esecuzione e le unità e il personale attualmente associati a quelle chiamate + Ora di Inizio Rapporto + Ora di Fine Rapporto + Esegui Rapporto + Tipo + Gruppo o Utente/i + Gruppo + Gruppo + Utente/i + Unità + Gruppo o Unità + ID + Nome + Gruppo + Totale + Conteggio + Tipo + Stato + Stato + Timestamp + Nota + Ore + Numero + Inizio + Fine + Data + Ruoli + Posizione + Cambi di Stato + Totale + Tipi di Chiamata + Stati Chiamata + Chiamate + Registrato Il + Chiuso Il + Durata Chiamata + Tempo sulla Scena + Unità + Personale + Aperto + % + Rapporto Certificazioni Resgrid + Numero + Rilasciato Da + Area + Scade + Rapporto Attività Annuale Dipartimento + Dettaglio Risposta Personale + Formazioni + Dettaglio Formazione Personale + Inviato + Partecipato + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + Agosto + Settembre + Ottobre + Novembre + Dicembre + Rapporto Eventi Personale Resgrid + Destinazione\Chiamata + Rapporto Ore Personale + Rapporto Dettagliato Ore Personale + Ore Chiamate + Ore Lavoro + Ore Formazione + Registri Lavoro + Rapporto Personale Resgrid + Nome Utente + Email + Numero Mobile + Indirizzo Postale + Rapporto Storico Organico Personale + Cambi di Organico + Organico + Programmato + Rapporto Organico Resgrid + Timestamp Organico + Prossimo Cambio + Prossimo Organico + Disponibile + In Ritardo + Non Disponibile + Impegnato + In Turno + Sconosciuto + Rapporto Eventi Unità Resgrid + Rapporto Storico Stato Unità + Cambi di Stato + Stati Totali + Rapporto Prontezza Turno Imminente + Pronto + Non Pronto + Richiesto + Opzionale + Delta + Ruolo + Nome Iscrizione + Rapporto Chiamate Attive e Risorse + Nome Chiamata + Unità in Chiamata + Personale in Chiamata + Nome Unità + Nome Persona + Nome Gruppo + Inviato Il + Segno 14 Giorni + Segno 21 Giorni + Registro Resgrid + Distretto + Dipartimento + Tipo + Registrato Il + Registrato Da + Iniziato Il + Terminato Il + Personale + Narrativa + Non Fornito + Lavoro + Id + Stazione + Unità + Condizione + Nome Chiamata + Tipo Chiamata + Nessun Tipo + Priorità + Indirizzo Chiamata + Inviato + In Percorso + Sulla Scena + Rilasciato + In Caserma + Audit + Formazione\Corso + Codice + Istruttori + Presenza + Tempo Totale + Tipo Riunione + Tipo Registro + Riunione + Posizione + Presieduto + Altri Partecipanti + Verbale Riunione + Caso # + OIC + Destinazione + Dichiarato Da + Posizione Corpo + Id Chiamata + Numero Chiamata + Id Incidente + Id Riferimento + Nessuno + Richiamata + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.pl.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.pl.resx new file mode 100644 index 00000000..c305cff9 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.pl.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Raporty + Wyświetl Raport + Raporty + Raport Historii Statusu Personelu + Ten raport pokaże całą historię statusu personelu (dzienniki działań) dostarczoną przez wybrany personel + Raport Personelu + Wyświetl cały personel w swoim dziale, ich role i podstawowe informacje kontaktowe. + Raport Obsady + Wyświetl cały personel i ich aktualny status, poziom obsady i następną zaplanowaną zmianę poziomu obsady. + Raport Certyfikatów + Wyświetl wszystkie certyfikaty każdej osoby w dziale. + Raport Gotowości Zmiany + Ten raport pokaże gotowość zmiany dla nadchodzących dni zmianowych dla każdej zmiany. + Roczny Raport Aktywności Działu + Ten raport pokaże aktywność zgłoszeń, dzienników, szkoleń i personelu działu w liczbach od początku roku. + Raport Godzin Dziennika Personelu + Ten raport pokaże liczbę godzin, które personel działu pracował, szkolił się i reagował na zgłoszenia według wpisów w dzienniku. + Raport Podsumowania Zgłoszeń + Ten raport pokaże szczegóły wszystkich zgłoszeń w wybranym zakresie dat + Raport Historii Obsady Personelu + Ten raport pokaże całą historię obsady dostarczoną przez wybrany personel + Raport Historii Stanu Jednostki + Pokazuje stany jednostki dla jednej jednostki, wszystkich lub jednostek w grupie dla zakresu czasu zdefiniowanego przez użytkownika + Raport Aktywnych Zgłoszeń i Zasobów + Raport szczegółowo opisuje aktualnie otwarte zgłoszenia w czasie uruchamiania raportu oraz jednostki i personel aktualnie przypisane do tych zgłoszeń + Czas Rozpoczęcia Raportu + Czas Zakończenia Raportu + Uruchom Raport + Typ + Grupa lub Użytkownik(cy) + Grupa + Grupa + Użytkownik(cy) + Jednostka(i) + Grupa lub Jednostka(i) + ID + Nazwa + Grupa + Łącznie + Liczba + Typ + Stan + Status + Sygnatura Czasowa + Notatka + Godziny + Numer + Początek + Koniec + Data + Role + Lokalizacja + Zmiany Statusu + Łącznie + Typy Zgłoszeń + Stany Zgłoszeń + Zgłoszenia + Zalogowano + Zamknięto + Długość Zgłoszenia + Czas na Miejscu + Jednostki + Personel + Otwarte + % + Raport Certyfikatów Resgrid + Numer + Wydane Przez + Obszar + Wygasa + Roczny Raport Aktywności Działu + Szczegóły Odpowiedzi Personelu + Szkolenia + Szczegóły Szkolenia Personelu + Wysłany + Uczestniczył + Styczeń + Luty + Marzec + Kwiecień + Maj + Czerwiec + Lipiec + Sierpień + Wrzesień + Październik + Listopad + Grudzień + Raport Zdarzeń Personelu Resgrid + Cel\Zgłoszenie + Raport Godzin Personelu + Szczegółowy Raport Godzin Personelu + Godziny Zgłoszeń + Godziny Pracy + Godziny Szkoleń + Dzienniki Pracy + Raport Personelu Resgrid + Nazwa Użytkownika + Email + Numer Telefonu + Adres Korespondencyjny + Raport Historii Obsady Personelu + Zmiany Obsady + Obsada + Zaplanowany + Raport Obsady Resgrid + Sygnatura Czasowa Obsady + Następna Zmiana + Następna Obsada + Dostępny + Opóźniony + Niedostępny + Zaangażowany + Na Zmianie + Nieznany + Raport Zdarzeń Jednostki Resgrid + Raport Historii Stanu Jednostki + Zmiany Stanu + Łączne Stany + Raport Gotowości Nadchodzącej Zmiany + Gotowy + Niegotowy + Wymagany + Opcjonalny + Delta + Rola + Nazwa Rejestracji + Raport Aktywnych Zgłoszeń i Zasobów + Nazwa Zgłoszenia + Jednostki przy Zgłoszeniu + Personel przy Zgłoszeniu + Nazwa Jednostki + Imię i Nazwisko + Nazwa Grupy + Wysłany + Oznaczenie 14 Dni + Oznaczenie 21 Dni + Dziennik Resgrid + Dzielnica + Dział + Typ + Zalogowano + Zalogowane Przez + Rozpoczęto + Zakończono + Personel + Opis + Nie Podano + Praca + Id + Stacja + Jednostki + Stan + Nazwa Zgłoszenia + Typ Zgłoszenia + Brak Typu + Priorytet + Adres Zgłoszenia + Wysłany + W Drodze + Na Miejscu + Zwolniony + W Koszarach + Audyt + Szkolenie\Kurs + Kod + Instruktorzy + Frekwencja + Łączny Czas + Typ Spotkania + Typ Dziennika + Spotkanie + Lokalizacja + Przewodniczący + Inni Uczestnicy + Protokół Spotkania + Sprawa # + OIC + Cel + Stwierdzono Przez + Miejsce Znalezienia Ciała + Id Zgłoszenia + Numer Zgłoszenia + Id Zdarzenia + Id Referencji + Brak + Oddzwonienie + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.sv.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.sv.resx new file mode 100644 index 00000000..774a62ca --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.sv.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Rapporter + Visa Rapport + Rapporter + Personalstatushistorikrapport + Denna rapport visar all personalstatushistorik (åtgärdsloggar) för vald personal + Personalrapport + Visa all personal i din avdelning, deras roller och grundläggande kontaktinformation. + Bemanningsrapport + Visa all personal och deras aktuella status, bemanningsnivå och nästa schemalagda bemanningsförändring. + Certifieringsrapport + Visa alla certifieringar för varje person i avdelningen. + Skiftberedskapsrapport + Denna rapport visar skiftberedskap för kommande skiftdagar för varje skift. + Avdelningens Årsaktivitetsrapport + Denna rapport visar larm-, logg-, utbildnings- och personalaktivitet för avdelningen i helårstal. + Personalloggtimmar Rapport + Denna rapport visar antalet timmar som avdelningens personal arbetat, utbildats och svarat på larm enligt loggposter. + Larmsammanfattningsrapport + Denna rapport visar detaljer om alla larm i ett valt datumintervall + Personalbemanningshistorikrapport + Denna rapport visar all bemanningshistorik för vald personal + Enhetsstatushistorikrapport + Visar enhetsstatus för en enhet, alla eller enheter i en grupp för ett användardefinierat tidsintervall + Aktiva Larm och Resurser Rapport + Rapporten detaljerar aktuellt öppna larm vid tidpunkten för körning och enheter och personal kopplade till dessa larm + Rapportens Starttid + Rapportens Sluttid + Kör Rapport + Typ + Grupp eller Användare + Grupp + Grupp + Användare + Enhet(er) + Grupp eller Enhet(er) + ID + Namn + Grupp + Totalt + Antal + Typ + Tillstånd + Status + Tidsstämpel + Notering + Timmar + Nummer + Start + Slut + Datum + Roller + Plats + Statusändringar + Totalt + Larmtyper + Larmtillstånd + Larm + Loggad + Stängd + Larmlängd + Tid på Plats + Enheter + Personal + Öppen + % + Resgrid Certifieringsrapport + Nummer + Utfärdad Av + Område + Utgår + Årsaktivitetsrapport för Avdelningen + Personalresponsdetalj + Utbildningar + Personalutbildningsdetalj + Utskickad + Närvarade + Januari + Februari + Mars + April + Maj + Juni + Juli + Augusti + September + Oktober + November + December + Resgrid Personalhändelserapport + Destination\Larm + Personaltimmarsrapport + Detaljerad Personaltimmarsrapport + Larmtimmar + Arbetstimmar + Utbildningstimmar + Arbetsloggar + Resgrid Personalrapport + Användarnamn + E-post + Mobilnummer + Postadress + Personalbemanningshistorikrapport + Bemanningsändringar + Bemanning + Schemalagd + Resgrid Bemanningsrapport + Bemanningstidsstämpel + Nästa Ändring + Nästa Bemanning + Tillgänglig + Försenad + Otillgänglig + Engagerad + I Tjänst + Okänd + Resgrid Enhetshändelserapport + Enhetsstatushistorikrapport + Tillståndsändringar + Totala Tillstånd + Kommande Skiftberedskapsrapport + Redo + Inte Redo + Krävs + Valfri + Delta + Roll + Registreringsnamn + Aktiva Larm och Resurser Rapport + Larmnamn + Enheter på Larm + Personal på Larm + Enhetsnamn + Personnamn + Gruppnamn + Utskickad + 14 Dagarsmärke + 21 Dagarsmärke + Resgrid Logg + Distrikt + Avdelning + Typ + Loggad + Loggad Av + Startad + Avslutad + Personal + Berättelse + Inte Angivet + Arbete + Id + Station + Enheter + Tillstånd + Larmnamn + Larmtyp + Ingen Typ + Prioritet + Larmadress + Utskickad + På Väg + På Plats + Frisläppt + I Kasern + Revision + Utbildning\Kurs + Kod + Instruktörer + Närvaro + Total Tid + Mötestyp + Loggtyp + Möte + Plats + Ordförande + Andra Deltagare + Mötesprotokoll + Ärende # + OIC + Destination + Konstaterad Av + Kroppens Plats + Larm-Id + Larmnummer + Incident-Id + Referens-Id + Ingen + Återuppringning + diff --git a/Core/Resgrid.Localization/Areas/User/Reports/Reports.uk.resx b/Core/Resgrid.Localization/Areas/User/Reports/Reports.uk.resx new file mode 100644 index 00000000..8ee37b40 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Reports/Reports.uk.resx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Звіти + Переглянути Звіт + Звіти + Звіт про Історію Статусу Персоналу + Цей звіт покаже всю історію статусу персоналу (журнали дій) наданого вибраним персоналом + Звіт про Персонал + Переглянути весь персонал у вашому підрозділі, їхні ролі та основну контактну інформацію. + Звіт про Укомплектованість + Переглянути весь персонал та їх поточний статус, рівень укомплектованості та наступну заплановану зміну рівня укомплектованості. + Звіт про Сертифікати + Переглянути всі сертифікати кожної особи у підрозділі. + Звіт про Готовність до Зміни + Цей звіт покаже готовність до зміни для наступних днів зміни для кожної зміни. + Річний Звіт про Активність Підрозділу + Цей звіт покаже активність викликів, журналів, навчання та персоналу підрозділу в річних цифрах. + Звіт про Години Журналу Персоналу + Цей звіт покаже кількість годин, які персонал підрозділу працював, навчався та реагував на виклики згідно записів журналу. + Зведений Звіт про Виклики + Цей звіт покаже деталі всіх викликів у вибраному діапазоні дат + Звіт про Історію Укомплектованості Персоналу + Цей звіт покаже всю історію укомплектованості наданого вибраним персоналом + Звіт про Історію Стану Підрозділу + Показує стани підрозділу для одного підрозділу, всіх або підрозділів у групі за визначений користувачем часовий діапазон + Звіт про Активні Виклики та Ресурси + Звіт деталізує активні виклики на момент запуску звіту та підрозділи і персонал, прикріплені до цих викликів + Час Початку Звіту + Час Закінчення Звіту + Запустити Звіт + Тип + Група або Користувач(і) + Група + Група + Користувач(і) + Підрозділ(и) + Група або Підрозділ(и) + ID + Ім'я + Група + Всього + Кількість + Тип + Стан + Статус + Мітка Часу + Примітка + Години + Номер + Початок + Кінець + Дата + Ролі + Місцезнаходження + Зміни Статусу + Всього + Типи Виклику + Стани Виклику + Виклики + Зареєстровано + Закрито + Тривалість Виклику + Час на Місці + Підрозділи + Персонал + Відкрито + % + Звіт про Сертифікати Resgrid + Номер + Видано + Область + Дійсний до + Річний Звіт про Активність Підрозділу + Деталі Відповіді Персоналу + Навчання + Деталі Навчання Персоналу + Відправлено + Відвідали + Січень + Лютий + Березень + Квітень + Травень + Червень + Липень + Серпень + Вересень + Жовтень + Листопад + Грудень + Звіт про Події Персоналу Resgrid + Призначення\Виклик + Звіт про Години Персоналу + Детальний Звіт про Години Персоналу + Години Виклику + Робочі Години + Години Навчання + Журнали Роботи + Звіт про Персонал Resgrid + Ім'я Користувача + Електронна Пошта + Номер Мобільного + Поштова Адреса + Звіт про Історію Укомплектованості Персоналу + Зміни Укомплектованості + Укомплектованість + Заплановано + Звіт про Укомплектованість Resgrid + Мітка Часу Укомплектованості + Наступна Зміна + Наступна Укомплектованість + Доступний + Затримується + Недоступний + Зайнятий + На Зміні + Невідомо + Звіт про Події Підрозділу Resgrid + Звіт про Історію Стану Підрозділу + Зміни Стану + Всього Станів + Звіт про Готовність до Майбутньої Зміни + Готовий + Не Готовий + Обов'язково + Необов'язково + Дельта + Роль + Ім'я при Реєстрації + Звіт про Активні Виклики та Ресурси + Назва Виклику + Підрозділи на Виклику + Персонал на Виклику + Назва Підрозділу + Ім'я Особи + Назва Групи + Відправлено + Позначка 14 Днів + Позначка 21 День + Журнал Resgrid + Район + Підрозділ + Тип + Зареєстровано + Зареєстровано + Розпочато + Завершено + Персонал + Опис + Не Вказано + Робота + Id + Станція + Підрозділи + Стан + Назва Виклику + Тип Виклику + Без Типу + Пріоритет + Адреса Виклику + Відправлено + В Дорозі + На Місці + Звільнено + У Казармах + Аудит + Навчання\Курс + Код + Інструктори + Відвідуваність + Загальний Час + Тип Зборів + Тип Журналу + Збори + Місцезнаходження + Головує + Інші Учасники + Протокол Зборів + Справа # + OIC + Призначення + Констатовано + Місце Тіла + Id Виклику + Номер Виклику + Id Інциденту + Id Посилання + Немає + Зворотній Дзвінок + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx index 73db28fe..e9e46ed4 100644 --- a/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.ar.resx @@ -111,4 +111,78 @@ مكوث: تخطي: محطة + + + إضافة محطة + يدوي + مكالمة مجدولة + نقطة مرور + المكالمة المرتبطة + جارٍ تحميل المكالمات... + عادي + عالٍ + حرج + اختياري + بحث + What3Words + الموقع + انقر على الخريطة لتحديد الموقع، أو استخدم العنوان / What3Words أعلاه. + الوصول المخطط + المغادرة المخططة + الإقامة المقدرة (دقيقة) + اختر جهة اتصال + -- أدخل يدوياً أو اختر موجوداً -- + يؤدي اختيار جهة اتصال إلى ملء الاسم والرقم أدناه تلقائياً. + اسم جهة الاتصال + رقم جهة الاتصال + ملاحظات + + + بدء المسار + بدء المسار + بدء المسار + تعيين وحدة + -- اختر وحدة -- + اختر الوحدة التي ستنفذ هذا المسار. + معلومات المسار + دقيقة مقدرة + ابدأ المسار الآن + + + المسارات المؤرشفة + المسارات المؤرشفة + مؤرشف + لا توجد مسارات مؤرشفة + لا توجد خطط مسارات مؤرشفة. + تفاصيل المسار المؤرشف + + + الاتجاهات + طباعة + بدء المسار + الاتجاهات خطوة بخطوة + جارٍ حساب المسار… + تعذّر استرداد تعليمات القيادة. قد تكون عناوين المحطات أو إحداثياتها غير قابلة للوصول عبر الطريق. المحطات مدرجة أدناه بالترتيب. + ملخص المحطات + اسم المحطة + الإقامة (دقيقة) + جهة الاتصال + + + هذا المسار مؤرشف ولا يمكن بدؤه أو تعديله أو حذفه. + العودة إلى المسارات المؤرشفة + + + موقع البداية + موقع النهاية + أدخل العنوان + انقر على الخريطة لتحديد موقع البداية، أو استخدم العنوان / What3Words / الإحداثيات أعلاه. + انقر على الخريطة لتحديد موقع النهاية، أو استخدم العنوان / What3Words / الإحداثيات أعلاه. + تطبيق + خط العرض + خط الطول + ابحث عن الموقع عبر + + + عرض التفاصيل diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.de.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.de.resx new file mode 100644 index 00000000..21b2feb9 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.de.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Abbrechen + Speichern + Name + Beschreibung + Status + Aktionen + + + Routen + Routen + Neue Route + In Bearbeitung + Archivierte Routen + Stopps + Profil + Erstellt + Ansicht + Bearbeiten + Verlauf + Diesen Routenplan löschen? + + + Routenverlauf + Routenverlauf + Verlauf + Einheit + Gestartet + Beendet + Detail + + + Routen in Bearbeitung + Routen in Bearbeitung + In Bearbeitung + Keine Routen in Bearbeitung + Es sind derzeit keine Routen in Bearbeitung. + Archivierte Routen + Archivierte Routen + Archiviert + Keine archivierten Routen + Es gibt keine archivierten Routenpläne. + Detail der archivierten Route + Einheit + Stopps + Gestartet + Details anzeigen + + + Neue Route + Neuer Routenplan + Neu + Routendetails + Einheit + -- Bei Start zuweisen -- + Entwurf + Aktiv + Pausiert + Archiviert + Routenfarbe + Routenprofil + Fahren + Gehen + Radfahren + Fahren (mit Verkehr) + Geofence-Radius (m) + Station als Start verwenden + Station als Ende verwenden + Stoppreihenfolge optimieren + Karte & Stopps + Stopps können nach der Routenerstellung über die API oder das Bearbeitungsformular verwaltet werden. + Route erstellen + + + Route starten + Route starten + Route starten + Einheit zuweisen + -- Eine Einheit auswählen -- + Wählen Sie die Einheit aus, die diese Route ausführen wird. + Routeninformationen + Min. geschätzt + Route jetzt starten + + + Route bearbeiten + Routenplan bearbeiten + Bearbeiten + # + Typ + Adresse + Priorität + Änderungen speichern + + + Routendetail + Ansicht + Routenkarte + Details + Status + Profil + Geofence + Distanz + Dauer + + + Routeninstanzdetail + Routeninstanz + Instanzdetail + Instanzinformationen + Gestartet + Beendet + Fortschritt + Stopp-Zeitlinie + Ausstehend + Eingecheckt + Abgeschlossen + Übersprungen + Unbekannt + Eingang: + Ausgang: + Aufenthalt: + Übersprungen: + Stopp + + + Stopp hinzufügen + Manuell + Geplanter Anruf + Wegpunkt + Verknüpfter Anruf + Anrufe werden geladen... + Normal + Hoch + Kritisch + Optional + Suchen + What3Words + Standort + Klicken Sie auf die Karte, um den Standort festzulegen, oder verwenden Sie Adresse / What3Words oben. + Geplante Ankunft + Geplante Abfahrt + Gesch. Aufenthalt (Min) + Kontakt auswählen + -- Manuell eingeben oder vorhandenen auswählen -- + Die Auswahl eines Kontakts füllt Name und Nummer automatisch aus. + Kontaktname + Kontaktnummer + Notizen + + + Wegbeschreibung + Drucken + Route starten + Abbiegeanweisungen + Route wird berechnet… + Fahrtanweisungen konnten nicht abgerufen werden. Die Stoppadressen oder Koordinaten sind möglicherweise nicht per Straße erreichbar. Die Stopps sind unten in der Reihenfolge aufgeführt. + Stopp-Zusammenfassung + Stoppname + Aufenthalt (Min) + Kontakt + + + Diese Route ist archiviert und kann nicht gestartet, bearbeitet oder gelöscht werden. + Zurück zu archivierten Routen + + + Startort + Endort + Adresse eingeben + Klicken Sie auf die Karte, um den Startort festzulegen, oder verwenden Sie Adresse / What3Words / Koordinaten oben. + Klicken Sie auf die Karte, um den Endort festzulegen, oder verwenden Sie Adresse / What3Words / Koordinaten oben. + Übernehmen + Breitengrad + Längengrad + Ort suchen über + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx index d1f9f1fc..29ef1351 100644 --- a/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.en.resx @@ -458,4 +458,70 @@ Notes + + + Directions + + + Print + + + Start Route + + + Turn-by-Turn Directions + + + Calculating route… + + + Could not retrieve driving directions. The stop addresses or coordinates may not be reachable by road. The stops are listed below in order. + + + Stop Summary + + + Stop Name + + + Dwell (min) + + + Contact + + + + This route is archived and cannot be started, edited, or deleted. + + + Back to Archived Routes + + + + Start Location + + + End Location + + + Enter address + + + Click the map to set the start location, or use address / What3Words / coordinates above. + + + Click the map to set the end location, or use address / What3Words / coordinates above. + + + Apply + + + Latitude + + + Longitude + + + Find location via + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.es.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.es.resx new file mode 100644 index 00000000..be382e82 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.es.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cancelar + Guardar + Nombre + Descripción + Estado + Acciones + + + Rutas + Rutas + Nueva ruta + En progreso + Rutas archivadas + Paradas + Perfil + Creado + Ver + Editar + Historial + ¿Eliminar este plan de ruta? + + + Historial de ruta + Historial de ruta + Historial + Unidad + Iniciado + Finalizado + Detalle + + + Rutas en progreso + Rutas en progreso + En progreso + No hay rutas en progreso + No hay instancias de rutas actualmente en progreso. + Rutas archivadas + Rutas archivadas + Archivado + No hay rutas archivadas + No hay planes de rutas archivados. + Detalle de ruta archivada + Unidad + Paradas + Iniciado + Ver detalles + + + Nueva ruta + Nuevo plan de ruta + Nuevo + Detalles de la ruta + Unidad + -- Asignar al iniciar -- + Borrador + Activo + Pausado + Archivado + Color de ruta + Perfil de ruta + Conduciendo + Caminando + En bicicleta + Conduciendo (con tráfico) + Radio de geocerca (m) + Usar estación como inicio + Usar estación como fin + Optimizar orden de paradas + Mapa y paradas + Las paradas se pueden gestionar después de crear la ruta mediante la API o el formulario de edición. + Crear ruta + + + Iniciar ruta + Iniciar ruta + Iniciar ruta + Asignar unidad + -- Seleccionar una unidad -- + Seleccione la unidad que ejecutará esta ruta. + Información de ruta + min estimado + Iniciar ruta ahora + + + Editar ruta + Editar plan de ruta + Editar + # + Tipo + Dirección + Prioridad + Guardar cambios + + + Detalle de ruta + Ver + Mapa de ruta + Detalles + Estado + Perfil + Geocerca + Distancia + Duración + + + Detalle de instancia de ruta + Instancia de ruta + Detalle de instancia + Información de instancia + Iniciado + Finalizado + Progreso + Cronograma de paradas + Pendiente + Registrado + Completado + Omitido + Desconocido + Entrada: + Salida: + Espera: + Omitido: + Parada + + + Agregar parada + Manual + Llamada programada + Punto de ruta + Llamada vinculada + Cargando llamadas... + Normal + Alta + Crítica + Opcional + Buscar + What3Words + Ubicación + Haga clic en el mapa para establecer la ubicación, o use la dirección / What3Words arriba. + Llegada planificada + Salida planificada + Espera est. (min) + Seleccionar contacto + -- Escriba manualmente o seleccione uno existente -- + Seleccionar un contacto rellena automáticamente el nombre y el número. + Nombre del contacto + Número del contacto + Notas + + + Instrucciones de ruta + Imprimir + Iniciar ruta + Instrucciones paso a paso + Calculando ruta… + No se pudieron obtener las instrucciones de conducción. Las direcciones o coordenadas de las paradas pueden no ser accesibles por carretera. Las paradas se muestran a continuación en orden. + Resumen de paradas + Nombre de parada + Espera (min) + Contacto + + + Esta ruta está archivada y no se puede iniciar, editar ni eliminar. + Volver a rutas archivadas + + + Ubicación de inicio + Ubicación de fin + Ingrese dirección + Haga clic en el mapa para establecer la ubicación de inicio, o use la dirección / What3Words / coordenadas arriba. + Haga clic en el mapa para establecer la ubicación de fin, o use la dirección / What3Words / coordenadas arriba. + Aplicar + Latitud + Longitud + Buscar ubicación mediante + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.fr.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.fr.resx new file mode 100644 index 00000000..d242d48d --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.fr.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Annuler + Enregistrer + Nom + Description + Statut + Actions + + + Itinéraires + Itinéraires + Nouvel itinéraire + En cours + Itinéraires archivés + Arrêts + Profil + Créé + Voir + Modifier + Historique + Supprimer ce plan d'itinéraire ? + + + Historique de l'itinéraire + Historique de l'itinéraire + Historique + Unité + Démarré + Terminé + Détail + + + Itinéraires en cours + Itinéraires en cours + En cours + Aucun itinéraire en cours + Aucune instance d'itinéraire n'est actuellement en cours. + Itinéraires archivés + Itinéraires archivés + Archivé + Aucun itinéraire archivé + Il n'y a aucun plan d'itinéraire archivé. + Détail de l'itinéraire archivé + Unité + Arrêts + Démarré + Voir les détails + + + Nouvel itinéraire + Nouveau plan d'itinéraire + Nouveau + Détails de l'itinéraire + Unité + -- Assigner au démarrage -- + Brouillon + Actif + En pause + Archivé + Couleur de l'itinéraire + Profil d'itinéraire + En voiture + À pied + À vélo + En voiture (avec trafic) + Rayon de géofence (m) + Utiliser la station comme départ + Utiliser la station comme arrivée + Optimiser l'ordre des arrêts + Carte et arrêts + Les arrêts peuvent être gérés après la création de l'itinéraire via l'API ou le formulaire de modification. + Créer l'itinéraire + + + Démarrer l'itinéraire + Démarrer l'itinéraire + Démarrer l'itinéraire + Assigner une unité + -- Sélectionner une unité -- + Sélectionnez l'unité qui exécutera cet itinéraire. + Informations sur l'itinéraire + min estimé + Démarrer l'itinéraire maintenant + + + Modifier l'itinéraire + Modifier le plan d'itinéraire + Modifier + # + Type + Adresse + Priorité + Enregistrer les modifications + + + Détail de l'itinéraire + Voir + Carte de l'itinéraire + Détails + Statut + Profil + Géofence + Distance + Durée + + + Détail de l'instance d'itinéraire + Instance d'itinéraire + Détail de l'instance + Informations sur l'instance + Démarré + Terminé + Progression + Chronologie des arrêts + En attente + Enregistré + Terminé + Ignoré + Inconnu + Entrée : + Sortie : + Arrêt : + Ignoré : + Arrêt + + + Ajouter un arrêt + Manuel + Appel planifié + Point de passage + Appel lié + Chargement des appels... + Normal + Élevée + Critique + Optionnelle + Rechercher + What3Words + Emplacement + Cliquez sur la carte pour définir l'emplacement, ou utilisez l'adresse / What3Words ci-dessus. + Arrivée prévue + Départ prévu + Arrêt est. (min) + Sélectionner un contact + -- Saisir manuellement ou sélectionner un existant -- + La sélection d'un contact remplit automatiquement le nom et le numéro ci-dessous. + Nom du contact + Numéro du contact + Notes + + + Itinéraire + Imprimer + Démarrer l'itinéraire + Indications étape par étape + Calcul de l'itinéraire… + Impossible de récupérer les instructions de conduite. Les adresses ou coordonnées des arrêts peuvent ne pas être accessibles par la route. Les arrêts sont listés ci-dessous dans l'ordre. + Résumé des arrêts + Nom de l'arrêt + Arrêt (min) + Contact + + + Cet itinéraire est archivé et ne peut pas être démarré, modifié ou supprimé. + Retour aux itinéraires archivés + + + Lieu de départ + Lieu d'arrivée + Saisir l'adresse + Cliquez sur la carte pour définir le lieu de départ, ou utilisez l'adresse / What3Words / les coordonnées ci-dessus. + Cliquez sur la carte pour définir le lieu d'arrivée, ou utilisez l'adresse / What3Words / les coordonnées ci-dessus. + Appliquer + Latitude + Longitude + Trouver l'emplacement via + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.it.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.it.resx new file mode 100644 index 00000000..c4d5a1d5 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.it.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Annulla + Salva + Nome + Descrizione + Stato + Azioni + + + Percorsi + Percorsi + Nuovo percorso + In corso + Percorsi archiviati + Fermate + Profilo + Creato + Visualizza + Modifica + Cronologia + Eliminare questo piano di percorso? + + + Cronologia percorso + Cronologia percorso + Cronologia + Unità + Avviato + Terminato + Dettaglio + + + Percorsi in corso + Percorsi in corso + In corso + Nessun percorso in corso + Non ci sono istanze di percorso attualmente in corso. + Percorsi archiviati + Percorsi archiviati + Archiviato + Nessun percorso archiviato + Non ci sono piani di percorso archiviati. + Dettaglio percorso archiviato + Unità + Fermate + Avviato + Visualizza dettagli + + + Nuovo percorso + Nuovo piano di percorso + Nuovo + Dettagli del percorso + Unità + -- Assegna all'avvio -- + Bozza + Attivo + In pausa + Archiviato + Colore percorso + Profilo percorso + In auto + A piedi + In bicicletta + In auto (con traffico) + Raggio geofence (m) + Usa stazione come partenza + Usa stazione come arrivo + Ottimizza ordine fermate + Mappa e fermate + Le fermate possono essere gestite dopo la creazione del percorso tramite API o il modulo di modifica. + Crea percorso + + + Avvia percorso + Avvia percorso + Avvia percorso + Assegna unità + -- Seleziona un'unità -- + Seleziona l'unità che eseguirà questo percorso. + Informazioni percorso + min stimati + Avvia percorso ora + + + Modifica percorso + Modifica piano di percorso + Modifica + # + Tipo + Indirizzo + Priorità + Salva modifiche + + + Dettaglio percorso + Visualizza + Mappa percorso + Dettagli + Stato + Profilo + Geofence + Distanza + Durata + + + Dettaglio istanza percorso + Istanza percorso + Dettaglio istanza + Informazioni istanza + Avviato + Terminato + Avanzamento + Cronologia fermate + In attesa + Arrivato + Completato + Saltato + Sconosciuto + Entrata: + Uscita: + Sosta: + Saltato: + Fermata + + + Aggiungi fermata + Manuale + Chiamata pianificata + Waypoint + Chiamata collegata + Caricamento chiamate... + Normale + Alta + Critica + Opzionale + Trova + What3Words + Posizione + Clicca sulla mappa per impostare la posizione, o usa indirizzo / What3Words sopra. + Arrivo previsto + Partenza prevista + Sosta est. (min) + Seleziona contatto + -- Digita manualmente o seleziona esistente -- + La selezione di un contatto compila automaticamente nome e numero. + Nome contatto + Numero contatto + Note + + + Indicazioni + Stampa + Avvia percorso + Indicazioni passo per passo + Calcolo percorso… + Impossibile recuperare le indicazioni stradali. Gli indirizzi o le coordinate delle fermate potrebbero non essere raggiungibili su strada. Le fermate sono elencate di seguito in ordine. + Riepilogo fermate + Nome fermata + Sosta (min) + Contatto + + + Questo percorso è archiviato e non può essere avviato, modificato o eliminato. + Torna ai percorsi archiviati + + + Posizione di partenza + Posizione di arrivo + Inserisci indirizzo + Clicca sulla mappa per impostare la posizione di partenza, o usa indirizzo / What3Words / coordinate sopra. + Clicca sulla mappa per impostare la posizione di arrivo, o usa indirizzo / What3Words / coordinate sopra. + Applica + Latitudine + Longitudine + Trova posizione tramite + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.pl.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.pl.resx new file mode 100644 index 00000000..891d7247 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.pl.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Anuluj + Zapisz + Nazwa + Opis + Status + Akcje + + + Trasy + Trasy + Nowa trasa + W toku + Zarchiwizowane trasy + Przystanki + Profil + Utworzono + Widok + Edytuj + Historia + Usunąć ten plan trasy? + + + Historia trasy + Historia trasy + Historia + Jednostka + Rozpoczęto + Zakończono + Szczegóły + + + Trasy w toku + Trasy w toku + W toku + Brak aktywnych tras + Nie ma aktualnie żadnych tras w toku. + Zarchiwizowane trasy + Zarchiwizowane trasy + Zarchiwizowane + Brak zarchiwizowanych tras + Nie ma zarchiwizowanych planów tras. + Szczegóły zarchiwizowanej trasy + Jednostka + Przystanki + Rozpoczęto + Zobacz szczegóły + + + Nowa trasa + Nowy plan trasy + Nowy + Szczegóły trasy + Jednostka + -- Przydziel przy starcie -- + Wersja robocza + Aktywna + Wstrzymana + Zarchiwizowana + Kolor trasy + Profil trasy + Jazda samochodem + Pieszo + Rowerem + Jazda (z ruchem ulicznym) + Promień geofence (m) + Użyj stacji jako startu + Użyj stacji jako końca + Optymalizuj kolejność przystanków + Mapa i przystanki + Przystanki można zarządzać po utworzeniu trasy przez API lub formularz edycji. + Utwórz trasę + + + Rozpocznij trasę + Rozpocznij trasę + Rozpocznij trasę + Przydziel jednostkę + -- Wybierz jednostkę -- + Wybierz jednostkę, która będzie realizować tę trasę. + Informacje o trasie + min szacowanych + Rozpocznij trasę teraz + + + Edytuj trasę + Edytuj plan trasy + Edytuj + # + Typ + Adres + Priorytet + Zapisz zmiany + + + Szczegóły trasy + Widok + Mapa trasy + Szczegóły + Status + Profil + Geofence + Odległość + Czas trwania + + + Szczegóły instancji trasy + Instancja trasy + Szczegóły instancji + Informacje o instancji + Rozpoczęto + Zakończono + Postęp + Oś czasu przystanków + Oczekujący + Zameldowany + Ukończony + Pominięty + Nieznany + Wejście: + Wyjście: + Postój: + Pominięto: + Przystanek + + + Dodaj przystanek + Ręczny + Zaplanowane zgłoszenie + Punkt trasy + Powiązane zgłoszenie + Ładowanie zgłoszeń... + Normalny + Wysoki + Krytyczny + Opcjonalny + Znajdź + What3Words + Lokalizacja + Kliknij mapę, aby ustawić lokalizację, lub użyj adresu / What3Words powyżej. + Planowane przybycie + Planowany odjazd + Szac. postój (min) + Wybierz kontakt + -- Wpisz ręcznie lub wybierz istniejący -- + Wybranie kontaktu automatycznie wypełnia imię i numer poniżej. + Imię kontaktu + Numer kontaktu + Notatki + + + Wskazówki + Drukuj + Rozpocznij trasę + Wskazówki krok po kroku + Obliczanie trasy… + Nie można pobrać wskazówek dojazdu. Adresy lub współrzędne przystanków mogą być nieosiągalne drogą. Przystanki są wymienione poniżej w kolejności. + Podsumowanie przystanków + Nazwa przystanku + Postój (min) + Kontakt + + + Ta trasa jest zarchiwizowana i nie można jej uruchomić, edytować ani usunąć. + Wróć do zarchiwizowanych tras + + + Lokalizacja startowa + Lokalizacja końcowa + Wpisz adres + Kliknij mapę, aby ustawić lokalizację startową, lub użyj adresu / What3Words / współrzędnych powyżej. + Kliknij mapę, aby ustawić lokalizację końcową, lub użyj adresu / What3Words / współrzędnych powyżej. + Zastosuj + Szerokość geograficzna + Długość geograficzna + Znajdź lokalizację przez + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.sv.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.sv.resx new file mode 100644 index 00000000..40e6a060 --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.sv.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Avbryt + Spara + Namn + Beskrivning + Status + Åtgärder + + + Rutter + Rutter + Ny rutt + Pågående + Arkiverade rutter + Stopp + Profil + Skapad + Visa + Redigera + Historik + Ta bort denna ruttplan? + + + Rutthistorik + Rutthistorik + Historik + Enhet + Startad + Avslutad + Detalj + + + Pågående rutter + Pågående rutter + Pågående + Inga pågående rutter + Det finns inga ruttinstanser som pågår för tillfället. + Arkiverade rutter + Arkiverade rutter + Arkiverad + Inga arkiverade rutter + Det finns inga arkiverade ruttplaner. + Arkiverad ruttdetalj + Enhet + Stopp + Startad + Visa detaljer + + + Ny rutt + Ny ruttplan + Ny + Ruttdetaljer + Enhet + -- Tilldela vid start -- + Utkast + Aktiv + Pausad + Arkiverad + Ruttfärg + Ruttprofil + Körning + Gång + Cykling + Körning (med trafik) + Geofence-radie (m) + Använd station som start + Använd station som slut + Optimera stoppordning + Karta och stopp + Stopp kan hanteras efter att rutten skapats via API eller redigeringsformuläret. + Skapa rutt + + + Starta rutt + Starta rutt + Starta rutt + Tilldela enhet + -- Välj en enhet -- + Välj den enhet som ska utföra denna rutt. + Ruttinformation + min uppskattad + Starta rutt nu + + + Redigera rutt + Redigera ruttplan + Redigera + # + Typ + Adress + Prioritet + Spara ändringar + + + Ruttdetalj + Visa + Ruttkarta + Detaljer + Status + Profil + Geofence + Avstånd + Varaktighet + + + Ruttinstansdetalj + Ruttinstans + Instansdetalj + Instansinformation + Startad + Avslutad + Framsteg + Stopptidslinje + Väntande + Incheckad + Slutförd + Hoppade över + Okänd + In: + Ut: + Uppehåll: + Hoppat: + Stopp + + + Lägg till stopp + Manuell + Schemalagt samtal + Vägpunkt + Länkat samtal + Laddar samtal... + Normal + Hög + Kritisk + Valfri + Hitta + What3Words + Plats + Klicka på kartan för att ange platsen, eller använd adress / What3Words ovan. + Planerad ankomst + Planerad avgång + Uppsk. uppehåll (min) + Välj kontakt + -- Skriv manuellt eller välj befintlig -- + Att välja en kontakt fyller automatiskt i namn och nummer nedan. + Kontaktnamn + Kontaktnummer + Anteckningar + + + Vägbeskrivning + Skriv ut + Starta rutt + Sväng-för-sväng-anvisningar + Beräknar rutt… + Kunde inte hämta körinstruktioner. Stopadresserna eller koordinaterna kanske inte är nåbara via väg. Stoppen listas nedan i ordning. + Stoppöversikt + Stoppnamn + Uppehåll (min) + Kontakt + + + Denna rutt är arkiverad och kan inte startas, redigeras eller tas bort. + Tillbaka till arkiverade rutter + + + Startplats + Slutplats + Ange adress + Klicka på kartan för att ange startplatsen, eller använd adress / What3Words / koordinater ovan. + Klicka på kartan för att ange slutplatsen, eller använd adress / What3Words / koordinater ovan. + Tillämpa + Latitud + Longitud + Hitta plats via + diff --git a/Core/Resgrid.Localization/Areas/User/Routes/Routes.uk.resx b/Core/Resgrid.Localization/Areas/User/Routes/Routes.uk.resx new file mode 100644 index 00000000..98b2087d --- /dev/null +++ b/Core/Resgrid.Localization/Areas/User/Routes/Routes.uk.resx @@ -0,0 +1,184 @@ + + + text/microsoft-resx + 2.0 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Скасувати + Зберегти + Назва + Опис + Статус + Дії + + + Маршрути + Маршрути + Новий маршрут + В процесі + Архівні маршрути + Зупинки + Профіль + Створено + Перегляд + Редагувати + Історія + Видалити цей план маршруту? + + + Історія маршруту + Історія маршруту + Історія + Підрозділ + Розпочато + Завершено + Деталі + + + Маршрути в процесі + Маршрути в процесі + В процесі + Немає активних маршрутів + Наразі немає маршрутів у процесі виконання. + Архівні маршрути + Архівні маршрути + Архівний + Немає архівних маршрутів + Немає архівних планів маршрутів. + Деталі архівного маршруту + Підрозділ + Зупинки + Розпочато + Переглянути деталі + + + Новий маршрут + Новий план маршруту + Новий + Деталі маршруту + Підрозділ + -- Призначити при старті -- + Чернетка + Активний + На паузі + Архівний + Колір маршруту + Профіль маршруту + На автомобілі + Пішки + На велосипеді + На автомобілі (з трафіком) + Радіус геозони (м) + Використати станцію як початок + Використати станцію як кінець + Оптимізувати порядок зупинок + Карта та зупинки + Зупинками можна керувати після створення маршруту через API або форму редагування. + Створити маршрут + + + Почати маршрут + Почати маршрут + Почати маршрут + Призначити підрозділ + -- Виберіть підрозділ -- + Виберіть підрозділ, який буде виконувати цей маршрут. + Інформація про маршрут + хв розрахункових + Почати маршрут зараз + + + Редагувати маршрут + Редагувати план маршруту + Редагувати + # + Тип + Адреса + Пріоритет + Зберегти зміни + + + Деталі маршруту + Перегляд + Карта маршруту + Деталі + Статус + Профіль + Геозона + Відстань + Тривалість + + + Деталі екземпляра маршруту + Екземпляр маршруту + Деталі екземпляра + Інформація про екземпляр + Розпочато + Завершено + Прогрес + Хронологія зупинок + Очікує + Зареєстровано + Завершено + Пропущено + Невідомо + Вхід: + Вихід: + Зупинка: + Пропущено: + Зупинка + + + Додати зупинку + Вручну + Запланований виклик + Проміжна точка + Пов'язаний виклик + Завантаження викликів... + Звичайний + Високий + Критичний + Необов'язковий + Знайти + What3Words + Місце + Натисніть на карту, щоб встановити місце, або використайте адресу / What3Words вище. + Запланований прибуток + Запланований від'їзд + Розрах. зупинка (хв) + Виберіть контакт + -- Введіть вручну або виберіть існуючий -- + Вибір контакту автоматично заповнює ім'я та номер нижче. + Ім'я контакту + Номер контакту + Нотатки + + + Маршрут + Друкувати + Почати маршрут + Покрокові вказівки + Обчислення маршруту… + Не вдалося отримати маршрут руху. Адреси або координати зупинок можуть бути недоступні по дорозі. Зупинки перераховані нижче в порядку. + Зведення зупинок + Назва зупинки + Зупинка (хв) + Контакт + + + Цей маршрут архівований і не може бути запущений, відредагований або видалений. + Назад до архівних маршрутів + + + Місце початку + Місце завершення + Введіть адресу + Натисніть на карту, щоб встановити місце початку, або використайте адресу / What3Words / координати вище. + Натисніть на карту, щоб встановити місце завершення, або використайте адресу / What3Words / координати вище. + Застосувати + Широта + Довгота + Знайти місце через + diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx index 3bcf5e0a..833ac212 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.ar.resx @@ -159,4 +159,13 @@ اسم القالب + + إضافة قالب + + + ملاحظة البلاغ + + + قالب البلاغ السريع + diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.de.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.de.resx index 4f6cbd56..050aa6fe 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.de.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.de.resx @@ -69,45 +69,54 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] - Add Call Note Template + Anrufnotizvorlage hinzufügen - Call Name To Set + Festzulegender Anrufname - Call Nature To Set + Festzulegende Anrufart - Call Notes + Anrufnotizen - Call Note Templates + Anrufnotizvorlagen - Call Priority To Set + Festzulegende Anrufpriorität - Call Type To Set + Festzulegender Anruftyp - Edit Call Note + Anrufnotiz bearbeiten - Edit Call Note Template + Anrufnotizvorlage bearbeiten - Edit Template + Vorlage bearbeiten - New Call Note Template + Neue Anrufnotizvorlage - New Template + Neue Vorlage - Note Text + Notiztext - Template Name + Vorlagenname + + + Vorlage hinzufügen + + + Anrufnotiz + + + Anruf-Schnellvorlage diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.en.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.en.resx index 22a7bbf2..b8f14b90 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.en.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.en.resx @@ -159,4 +159,13 @@ Template Name + + Add Template + + + Call Note + + + Call Quick Template + \ No newline at end of file diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.es.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.es.resx index 4fdb1b6a..b942b06f 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.es.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.es.resx @@ -98,4 +98,21 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Agregar plantilla de nota de llamada + Nombre de llamada a establecer + Naturaleza de llamada a establecer + Notas de llamada + Plantillas de nota de llamada + Prioridad de llamada a establecer + Tipo de llamada a establecer + Editar nota de llamada + Editar plantilla de nota de llamada + Editar plantilla + Nueva plantilla de nota de llamada + Nueva plantilla + Texto de la nota + Nombre de la plantilla + Agregar plantilla + Nota de llamada + Plantilla rápida de llamada \ No newline at end of file diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.fr.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.fr.resx index 4f6cbd56..10ada4f4 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.fr.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.fr.resx @@ -69,45 +69,54 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] - Add Call Note Template + Ajouter un modèle de note d'appel - Call Name To Set + Nom d'appel à définir - Call Nature To Set + Nature d'appel à définir - Call Notes + Notes d'appel - Call Note Templates + Modèles de note d'appel - Call Priority To Set + Priorité d'appel à définir - Call Type To Set + Type d'appel à définir - Edit Call Note + Modifier la note d'appel - Edit Call Note Template + Modifier le modèle de note d'appel - Edit Template + Modifier le modèle - New Call Note Template + Nouveau modèle de note d'appel - New Template + Nouveau modèle - Note Text + Texte de la note - Template Name + Nom du modèle + + + Ajouter un modèle + + + Note d'appel + + + Modèle rapide d'appel diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.it.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.it.resx index 4f6cbd56..d98f37d3 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.it.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.it.resx @@ -69,45 +69,54 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] - Add Call Note Template + Aggiungi modello di nota chiamata - Call Name To Set + Nome chiamata da impostare - Call Nature To Set + Natura della chiamata da impostare - Call Notes + Note chiamata - Call Note Templates + Modelli di nota chiamata - Call Priority To Set + Priorità chiamata da impostare - Call Type To Set + Tipo di chiamata da impostare - Edit Call Note + Modifica nota chiamata - Edit Call Note Template + Modifica modello di nota chiamata - Edit Template + Modifica modello - New Call Note Template + Nuovo modello di nota chiamata - New Template + Nuovo modello - Note Text + Testo della nota - Template Name + Nome del modello + + + Aggiungi modello + + + Nota chiamata + + + Modello rapido chiamata diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.pl.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.pl.resx index 4f6cbd56..f2b18943 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.pl.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.pl.resx @@ -69,45 +69,54 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] - Add Call Note Template + Dodaj szablon notatki zgłoszenia - Call Name To Set + Nazwa zgłoszenia do ustawienia - Call Nature To Set + Charakter zgłoszenia do ustawienia - Call Notes + Notatki zgłoszenia - Call Note Templates + Szablony notatek zgłoszenia - Call Priority To Set + Priorytet zgłoszenia do ustawienia - Call Type To Set + Typ zgłoszenia do ustawienia - Edit Call Note + Edytuj notatkę zgłoszenia - Edit Call Note Template + Edytuj szablon notatki zgłoszenia - Edit Template + Edytuj szablon - New Call Note Template + Nowy szablon notatki zgłoszenia - New Template + Nowy szablon - Note Text + Tekst notatki - Template Name + Nazwa szablonu + + + Dodaj szablon + + + Notatka zgłoszenia + + + Szablon szybkiego zgłoszenia diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.sv.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.sv.resx index 4f6cbd56..4af9eaf4 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.sv.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.sv.resx @@ -69,45 +69,54 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] - Add Call Note Template + Lägg till samtalsnotatmall - Call Name To Set + Samtalsnamn att ange - Call Nature To Set + Samtalsnatur att ange - Call Notes + Samtalsnotat - Call Note Templates + Samtalsnotatmallar - Call Priority To Set + Samtalsprioritet att ange - Call Type To Set + Samtalstyp att ange - Edit Call Note + Redigera samtalsnotat - Edit Call Note Template + Redigera samtalsnotatmall - Edit Template + Redigera mall - New Call Note Template + Ny samtalsnotatmall - New Template + Ny mall - Note Text + Notattext - Template Name + Mallnamn + + + Lägg till mall + + + Samtalsnotat + + + Snabbmall för samtal diff --git a/Core/Resgrid.Localization/Areas/User/Templates/Templates.uk.resx b/Core/Resgrid.Localization/Areas/User/Templates/Templates.uk.resx index 4f6cbd56..db1a3c10 100644 --- a/Core/Resgrid.Localization/Areas/User/Templates/Templates.uk.resx +++ b/Core/Resgrid.Localization/Areas/User/Templates/Templates.uk.resx @@ -69,45 +69,54 @@ [base64 mime encoded string representing a byte array form of the .NET Framework object] - Add Call Note Template + Додати шаблон нотатки виклику - Call Name To Set + Назва виклику для встановлення - Call Nature To Set + Характер виклику для встановлення - Call Notes + Нотатки виклику - Call Note Templates + Шаблони нотаток виклику - Call Priority To Set + Пріоритет виклику для встановлення - Call Type To Set + Тип виклику для встановлення - Edit Call Note + Редагувати нотатку виклику - Edit Call Note Template + Редагувати шаблон нотатки виклику - Edit Template + Редагувати шаблон - New Call Note Template + Новий шаблон нотатки виклику - New Template + Новий шаблон - Note Text + Текст нотатки - Template Name + Назва шаблону + + + Додати шаблон + + + Нотатка виклику + + + Шаблон швидкого виклику diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx index 04db8775..dc719093 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.ar.resx @@ -162,4 +162,28 @@ الصوت والضغط للتحدث + + إضافة قناة PTT + + + البث الصوتي + + + يمكنك تعيين قناة واحدة فقط كقناة افتراضية في وقت واحد. لجعل قناة أخرى افتراضية، يجب عليك أولاً إيقاف تشغيل خيار القناة الافتراضية. + + + تعديل قناة الضغط للتحدث + + + لاحظ أنه لا يمكن أن تكون هناك سوى قناة افتراضية واحدة في وقت واحد؛ سيؤدي اختيار قناة افتراضية جديدة إلى إيقاف تشغيل الافتراضي للقناة الحالية. + + + قناة ضغط للتحدث جديدة + + + الضغط للتحدث + + + حفظ قناة PTT + diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.de.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.de.resx index 36b69d60..c332683f 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.de.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.de.resx @@ -59,56 +59,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - this is my long string - - - [base64 mime encoded serialized .NET Framework object] - - - [base64 mime encoded string representing a byte array form of the .NET Framework object] - - New Audio Stream + Neuer Audiostream - Add Audio Stream + Audiostream hinzufügen + + + PTT-Kanal hinzufügen - New Voice Channel + Neuer Sprachkanal + + + Audiostream - Audio Stream Name + Name des Audiostreams - Audio Streams + Audiostreams - Audio Stream Url + URL des Audiostreams - Channel Name + Kanalname + + + Es kann jeweils nur 1 Kanal als Standard festgelegt werden. Um einen anderen Kanal als Standard festzulegen, müssen Sie zunächst die Standardkanaloption deaktivieren. - Edit Audio Stream + Audiostream bearbeiten + + + Push-To-Talk-Kanal bearbeiten - Is Default + Ist Standard + + + Beachten Sie, dass es nur einen Standardkanal gleichzeitig geben kann. Wenn Sie einen neuen Standardkanal auswählen, wird der Standard des vorhandenen Kanals deaktiviert. + + + Neuer Push-To-Talk-Kanal - Participants + Teilnehmer - Push-To-Talk Addon Not Purchased + Push-To-Talk-Erweiterung nicht erworben - Your department has not purchased the Push-To-Talk addon. Your departments Managing Member can purchase the addon from the Subscription and Billing page. Push-To-Talk allows your department to enable real-time voice communications though the Resgrid applications. + Ihre Abteilung hat die Push-To-Talk-Erweiterung nicht erworben. Das verwaltende Mitglied Ihrer Abteilung kann die Erweiterung auf der Seite für Abonnement und Abrechnung erwerben. Push-To-Talk ermöglicht Ihrer Abteilung, Echtzeit-Sprachkommunikation über die Resgrid-Anwendungen zu aktivieren. + + + Sprechtaste - Save Audio Stream + Audiostream speichern + + + PTT-Kanal speichern - Voice (PTT) Channels + Sprachkanäle (PTT) Audio und Sprechtaste diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.en.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.en.resx index dceb2cf9..382f75f3 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.en.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.en.resx @@ -162,4 +162,28 @@ Audio & Push-To-Talk + + Add PTT Channel + + + Audio Stream + + + You can only have 1 channel set as the default at a time. To make another channel the default you must first turn the default channel option off. + + + Edit Push-To-Talk Channel + + + Note there can be only one default channel at a time, selecting a new default channel will turn off default for the existing one. + + + New Push-To-Talk Channel + + + Push-To-Talk + + + Save PTT Channel + \ No newline at end of file diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.es.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.es.resx index 4fdb1b6a..8780a09d 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.es.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.es.resx @@ -98,4 +98,73 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Nuevo flujo de audio + + + Agregar flujo de audio + + + Agregar canal PTT + + + Nuevo canal de voz + + + Flujo de audio + + + Nombre del flujo de audio + + + Flujos de audio + + + URL del flujo de audio + + + Nombre del canal + + + Solo puede tener 1 canal configurado como predeterminado a la vez. Para establecer otro canal como predeterminado, primero debe desactivar la opción de canal predeterminado. + + + Editar flujo de audio + + + Editar canal Push-To-Talk + + + Es predeterminado + + + Tenga en cuenta que solo puede haber un canal predeterminado a la vez; seleccionar un nuevo canal predeterminado desactivará el predeterminado del existente. + + + Nuevo canal Push-To-Talk + + + Participantes + + + Complemento Push-To-Talk no adquirido + + + Su departamento no ha adquirido el complemento Push-To-Talk. El miembro administrador de su departamento puede adquirir el complemento desde la página de Suscripción y Facturación. Push-To-Talk permite a su departamento habilitar comunicaciones de voz en tiempo real a través de las aplicaciones de Resgrid. + + + Push-To-Talk + + + Guardar flujo de audio + + + Guardar canal PTT + + + Canales de voz (PTT) + + + Audio y Push-To-Talk + \ No newline at end of file diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.fr.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.fr.resx index b622cc30..850d3454 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.fr.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.fr.resx @@ -59,56 +59,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - this is my long string - - - [base64 mime encoded serialized .NET Framework object] - - - [base64 mime encoded string representing a byte array form of the .NET Framework object] - - New Audio Stream + Nouveau flux audio - Add Audio Stream + Ajouter un flux audio + + + Ajouter un canal PTT - New Voice Channel + Nouveau canal vocal + + + Flux audio - Audio Stream Name + Nom du flux audio - Audio Streams + Flux audio - Audio Stream Url + URL du flux audio - Channel Name + Nom du canal + + + Vous ne pouvez avoir qu'un seul canal défini par défaut à la fois. Pour définir un autre canal par défaut, vous devez d'abord désactiver l'option de canal par défaut. - Edit Audio Stream + Modifier le flux audio + + + Modifier le canal Push-To-Talk - Is Default + Est par défaut + + + Notez qu'il ne peut y avoir qu'un seul canal par défaut à la fois ; sélectionner un nouveau canal par défaut désactivera le canal par défaut existant. + + + Nouveau canal Push-To-Talk Participants - Push-To-Talk Addon Not Purchased + Module Push-To-Talk non acheté - Your department has not purchased the Push-To-Talk addon. Your departments Managing Member can purchase the addon from the Subscription and Billing page. Push-To-Talk allows your department to enable real-time voice communications though the Resgrid applications. + Votre département n'a pas acheté le module Push-To-Talk. Le membre gestionnaire de votre département peut acheter le module depuis la page Abonnement et Facturation. Push-To-Talk permet à votre département d'activer les communications vocales en temps réel via les applications Resgrid. + + + Push-To-Talk - Save Audio Stream + Enregistrer le flux audio + + + Enregistrer le canal PTT - Voice (PTT) Channels + Canaux vocaux (PTT) Audio et push-to-talk diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.it.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.it.resx index 12a94baa..0d12c627 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.it.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.it.resx @@ -59,56 +59,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - this is my long string - - - [base64 mime encoded serialized .NET Framework object] - - - [base64 mime encoded string representing a byte array form of the .NET Framework object] - - New Audio Stream + Nuovo flusso audio - Add Audio Stream + Aggiungi flusso audio + + + Aggiungi canale PTT - New Voice Channel + Nuovo canale vocale + + + Flusso audio - Audio Stream Name + Nome del flusso audio - Audio Streams + Flussi audio - Audio Stream Url + URL del flusso audio - Channel Name + Nome del canale + + + Puoi avere solo 1 canale impostato come predefinito alla volta. Per rendere un altro canale predefinito, devi prima disattivare l'opzione del canale predefinito. - Edit Audio Stream + Modifica flusso audio + + + Modifica canale Push-To-Talk - Is Default + È predefinito + + + Si noti che può esserci solo un canale predefinito alla volta; selezionare un nuovo canale predefinito disattiverà il predefinito per quello esistente. + + + Nuovo canale Push-To-Talk - Participants + Partecipanti - Push-To-Talk Addon Not Purchased + Componente aggiuntivo Push-To-Talk non acquistato - Your department has not purchased the Push-To-Talk addon. Your departments Managing Member can purchase the addon from the Subscription and Billing page. Push-To-Talk allows your department to enable real-time voice communications though the Resgrid applications. + Il tuo dipartimento non ha acquistato il componente aggiuntivo Push-To-Talk. Il membro amministratore del tuo dipartimento può acquistare il componente dalla pagina Abbonamento e Fatturazione. Push-To-Talk consente al tuo dipartimento di abilitare le comunicazioni vocali in tempo reale tramite le applicazioni Resgrid. + + + Push-To-Talk - Save Audio Stream + Salva flusso audio + + + Salva canale PTT - Voice (PTT) Channels + Canali vocali (PTT) Audio e push-to-talk diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.pl.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.pl.resx index faa42f46..edcfb31f 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.pl.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.pl.resx @@ -59,56 +59,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - this is my long string - - - [base64 mime encoded serialized .NET Framework object] - - - [base64 mime encoded string representing a byte array form of the .NET Framework object] - - New Audio Stream + Nowy strumień audio - Add Audio Stream + Dodaj strumień audio + + + Dodaj kanał PTT - New Voice Channel + Nowy kanał głosowy + + + Strumień audio - Audio Stream Name + Nazwa strumienia audio - Audio Streams + Strumienie audio - Audio Stream Url + URL strumienia audio - Channel Name + Nazwa kanału + + + Jednocześnie może być ustawiony tylko 1 kanał domyślny. Aby ustawić inny kanał jako domyślny, należy najpierw wyłączyć opcję kanału domyślnego. - Edit Audio Stream + Edytuj strumień audio + + + Edytuj kanał Push-To-Talk - Is Default + Jest domyślny + + + Należy pamiętać, że jednocześnie może istnieć tylko jeden kanał domyślny; wybranie nowego kanału domyślnego spowoduje wyłączenie domyślnego dla istniejącego. + + + Nowy kanał Push-To-Talk - Participants + Uczestnicy - Push-To-Talk Addon Not Purchased + Dodatek Push-To-Talk nie został zakupiony - Your department has not purchased the Push-To-Talk addon. Your departments Managing Member can purchase the addon from the Subscription and Billing page. Push-To-Talk allows your department to enable real-time voice communications though the Resgrid applications. + Twój oddział nie zakupił dodatku Push-To-Talk. Administrator oddziału może zakupić dodatek na stronie Subskrypcji i Rozliczeń. Push-To-Talk umożliwia oddziałowi aktywowanie komunikacji głosowej w czasie rzeczywistym za pośrednictwem aplikacji Resgrid. + + + Push-To-Talk - Save Audio Stream + Zapisz strumień audio + + + Zapisz kanał PTT - Voice (PTT) Channels + Kanały głosowe (PTT) Dźwięk i Push-To-Talk diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.sv.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.sv.resx index a3863458..eccd20a3 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.sv.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.sv.resx @@ -59,56 +59,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - this is my long string - - - [base64 mime encoded serialized .NET Framework object] - - - [base64 mime encoded string representing a byte array form of the .NET Framework object] - - New Audio Stream + Ny ljudström - Add Audio Stream + Lägg till ljudström + + + Lägg till PTT-kanal - New Voice Channel + Ny röstkanal + + + Ljudström - Audio Stream Name + Namn på ljudström - Audio Streams + Ljudströmmar - Audio Stream Url + URL för ljudström - Channel Name + Kanalnamn + + + Du kan bara ha 1 kanal inställd som standard åt gången. För att göra en annan kanal till standard måste du först stänga av standardkanalalternativet. - Edit Audio Stream + Redigera ljudström + + + Redigera Push-To-Talk-kanal - Is Default + Är standard + + + Observera att det bara kan finnas en standardkanal åt gången; att välja en ny standardkanal stänger av standarden för den befintliga. + + + Ny Push-To-Talk-kanal - Participants + Deltagare - Push-To-Talk Addon Not Purchased + Push-To-Talk-tillägg inte köpt - Your department has not purchased the Push-To-Talk addon. Your departments Managing Member can purchase the addon from the Subscription and Billing page. Push-To-Talk allows your department to enable real-time voice communications though the Resgrid applications. + Din avdelning har inte köpt Push-To-Talk-tillägget. Avdelningens administratörsmedlem kan köpa tillägget från sidan för Prenumeration och Fakturering. Push-To-Talk gör det möjligt för din avdelning att aktivera realtidsröstkommunkation via Resgrid-applikationerna. + + + Push-To-Talk - Save Audio Stream + Spara ljudström + + + Spara PTT-kanal - Voice (PTT) Channels + Röstkanaler (PTT) Ljud och Push-To-Talk diff --git a/Core/Resgrid.Localization/Areas/User/Voice/Voice.uk.resx b/Core/Resgrid.Localization/Areas/User/Voice/Voice.uk.resx index 3a8c4fa5..ff822c4e 100644 --- a/Core/Resgrid.Localization/Areas/User/Voice/Voice.uk.resx +++ b/Core/Resgrid.Localization/Areas/User/Voice/Voice.uk.resx @@ -59,56 +59,71 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - this is my long string - - - [base64 mime encoded serialized .NET Framework object] - - - [base64 mime encoded string representing a byte array form of the .NET Framework object] - - New Audio Stream + Новий аудіопотік - Add Audio Stream + Додати аудіопотік + + + Додати PTT-канал - New Voice Channel + Новий голосовий канал + + + Аудіопотік - Audio Stream Name + Назва аудіопотоку - Audio Streams + Аудіопотоки - Audio Stream Url + URL аудіопотоку - Channel Name + Назва каналу + + + Одночасно може бути встановлено лише 1 канал за замовчуванням. Щоб зробити інший канал типовим, спочатку потрібно вимкнути параметр типового каналу. - Edit Audio Stream + Редагувати аудіопотік + + + Редагувати канал Push-To-Talk - Is Default + За замовчуванням + + + Зверніть увагу, що одночасно може бути лише один типовий канал; вибір нового типового каналу вимкне типовий для існуючого. + + + Новий канал Push-To-Talk - Participants + Учасники - Push-To-Talk Addon Not Purchased + Доповнення Push-To-Talk не придбано - Your department has not purchased the Push-To-Talk addon. Your departments Managing Member can purchase the addon from the Subscription and Billing page. Push-To-Talk allows your department to enable real-time voice communications though the Resgrid applications. + Ваш підрозділ не придбав доповнення Push-To-Talk. Керуючий член вашого підрозділу може придбати доповнення на сторінці Підписки та Виставлення рахунків. Push-To-Talk дозволяє вашому підрозділу активувати голосовий зв'язок у реальному часі через програми Resgrid. + + + Push-To-Talk - Save Audio Stream + Зберегти аудіопотік + + + Зберегти PTT-канал - Voice (PTT) Channels + Голосові канали (PTT) Аудіо та push-to-talk diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx index 0b0820ee..45eef8e8 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx @@ -553,4 +553,41 @@ معلّق + + + تفاصيل التشغيل + + + ملخص التشغيل + + + سجلات الخطوات + + + لم يتم تسجيل أي سجلات للخطوات لهذا التشغيل. + + + خطوة: + + + تم تخطي الخطوة بسبب الشرط. + + + تم تقييم الشرط إلى: + + + النتيجة + + + المخرجات المعروضة + + + جميع أنواع أحداث التشغيل المتاحة لها بالفعل سير عمل مُكوَّن. احذف سير عمل موجوداً لتحرير نوع حدثه. + + + يمكن لكل نوع حدث أن يكون له سير عمل واحد فقط. يتم عرض أنواع الأحداث غير المستخدمة فقط. + + + تفاصيل + diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx index abd870af..052ae013 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx @@ -552,6 +552,43 @@ Neu - Pending + Ausstehend + + + + Ausführungsdetail + + + Ausführungszusammenfassung + + + Schrittprotokolle + + + Für diese Ausführung wurden keine Schrittprotokolle aufgezeichnet. + + + Schritt: + + + Schritt durch Bedingung übersprungen. + + + Bedingung ausgewertet zu: + + + Ergebnis + + + Gerenderte Ausgabe + + + Alle verfügbaren Trigger-Ereignistypen haben bereits einen konfigurierten Workflow. Löschen Sie einen vorhandenen Workflow, um seinen Ereignistyp freizugeben. + + + Jeder Ereignistyp kann nur einen Workflow haben. Es werden nur ungenutzte Ereignistypen angezeigt. + + + Detail diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx index 2bea2b4c..690ca453 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx @@ -576,5 +576,43 @@ Pending + + + Run Detail + + + Run Summary + + + Step Logs + + + No step logs recorded for this run. + + + Step: + + + Step skipped by condition. + + + Condition evaluated to: + + + Result + + + Rendered Output + + + + All available trigger event types already have a workflow configured. Delete an existing workflow to free up its event type. + + + Each event type can only have one workflow. Only unused event types are shown. + + + Detail + diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx index 141c8239..967a6e46 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx @@ -575,5 +575,42 @@ Pendiente + + + Detalle de ejecución + + + Resumen de ejecución + + + Registros de pasos + + + No se registraron registros de pasos para esta ejecución. + + + Paso: + + + Paso omitido por condición. + + + La condición evaluó a: + + + Resultado + + + Salida renderizada + + + Todos los tipos de eventos de activación disponibles ya tienen un flujo de trabajo configurado. Elimine un flujo de trabajo existente para liberar su tipo de evento. + + + Cada tipo de evento solo puede tener un flujo de trabajo. Solo se muestran los tipos de eventos no utilizados. + + + Detalle + diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx index 1a453355..48cb1a93 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx @@ -552,6 +552,43 @@ Nouveau - Pending + En attente + + + + Détail d'exécution + + + Résumé d'exécution + + + Journaux d'étapes + + + Aucun journal d'étape enregistré pour cette exécution. + + + Étape : + + + Étape ignorée par condition. + + + La condition a été évaluée à : + + + Résultat + + + Sortie rendue + + + Tous les types d'événements déclencheurs disponibles ont déjà un workflow configuré. Supprimez un workflow existant pour libérer son type d'événement. + + + Chaque type d'événement ne peut avoir qu'un seul workflow. Seuls les types d'événements non utilisés sont affichés. + + + Détail diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx index e56b2425..915d5d96 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx @@ -552,6 +552,43 @@ Nuovo - Pending + In sospeso + + + + Dettaglio esecuzione + + + Riepilogo esecuzione + + + Log dei passaggi + + + Nessun log di passaggio registrato per questa esecuzione. + + + Passaggio: + + + Passaggio saltato per condizione. + + + La condizione è stata valutata a: + + + Risultato + + + Output renderizzato + + + Tutti i tipi di evento trigger disponibili hanno già un workflow configurato. Elimina un workflow esistente per liberare il suo tipo di evento. + + + Ogni tipo di evento può avere un solo workflow. Vengono mostrati solo i tipi di evento non utilizzati. + + + Dettaglio diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx index d215485e..168bcf92 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx @@ -552,6 +552,43 @@ Nowy - Pending + Oczekujące + + + + Szczegóły uruchomienia + + + Podsumowanie uruchomienia + + + Dzienniki kroków + + + Brak zapisanych dzienników kroków dla tego uruchomienia. + + + Krok: + + + Krok pominięty przez warunek. + + + Warunek oceniony na: + + + Wynik + + + Wyrenderowane wyjście + + + Wszystkie dostępne typy zdarzeń wyzwalacza mają już skonfigurowany przepływ pracy. Usuń istniejący przepływ pracy, aby zwolnić jego typ zdarzenia. + + + Każdy typ zdarzenia może mieć tylko jeden przepływ pracy. Wyświetlane są tylko nieużywane typy zdarzeń. + + + Szczegóły diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx index fd581e72..43ebe586 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx @@ -575,5 +575,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx index 72939776..980d8954 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx @@ -552,6 +552,43 @@ Ny - Pending + Väntande + + + + Körningsdetalj + + + Körningssammanfattning + + + Stegloggar + + + Inga stegloggar registrerade för denna körning. + + + Steg: + + + Steg överhoppat av villkor. + + + Villkor utvärderat till: + + + Resultat + + + Renderad utdata + + + Alla tillgängliga trigghändelsetyper har redan ett konfigurerat arbetsflöde. Ta bort ett befintligt arbetsflöde för att frigöra dess händelsetyp. + + + Varje händelsetyp kan bara ha ett arbetsflöde. Endast oanvända händelsetyper visas. + + + Detalj diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx index debc0235..e614ece9 100644 --- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx +++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx @@ -552,6 +552,43 @@ Новий - Pending + Очікує + + + + Деталі запуску + + + Зведення запуску + + + Журнали кроків + + + Для цього запуску не записано журналів кроків. + + + Крок: + + + Крок пропущено через умову. + + + Умова оцінена як: + + + Результат + + + Відрендерений вивід + + + Усі доступні типи подій-тригерів вже мають налаштований робочий процес. Видаліть наявний робочий процес, щоб звільнити його тип події. + + + Кожен тип події може мати лише один робочий процес. Відображаються лише невикористані типи подій. + + + Деталі diff --git a/Core/Resgrid.Model/Billing/Api/CreatePaddleCheckoutResult.cs b/Core/Resgrid.Model/Billing/Api/CreatePaddleCheckoutResult.cs new file mode 100644 index 00000000..f8533bee --- /dev/null +++ b/Core/Resgrid.Model/Billing/Api/CreatePaddleCheckoutResult.cs @@ -0,0 +1,13 @@ +namespace Resgrid.Model.Billing.Api; + +public class CreatePaddleCheckoutResult : BillingApiResponseBase +{ + public CreatePaddleCheckoutData Data { get; set; } +} + +public class CreatePaddleCheckoutData +{ + public string PriceId { get; set; } + public string CustomerId { get; set; } + public string Environment { get; set; } +} diff --git a/Core/Resgrid.Model/Billing/Api/GetActivePaddleSubscriptionResult.cs b/Core/Resgrid.Model/Billing/Api/GetActivePaddleSubscriptionResult.cs new file mode 100644 index 00000000..c35000d1 --- /dev/null +++ b/Core/Resgrid.Model/Billing/Api/GetActivePaddleSubscriptionResult.cs @@ -0,0 +1,12 @@ +namespace Resgrid.Model.Billing.Api; + +public class GetActivePaddleSubscriptionResult : BillingApiResponseBase +{ + public GetActivePaddleSubscriptionData Data { get; set; } +} + +public class GetActivePaddleSubscriptionData +{ + public string SubscriptionId { get; set; } + public long TotalQuantity { get; set; } +} diff --git a/Core/Resgrid.Model/CqrsEventTypes.cs b/Core/Resgrid.Model/CqrsEventTypes.cs index 66f5f77c..707f7b47 100644 --- a/Core/Resgrid.Model/CqrsEventTypes.cs +++ b/Core/Resgrid.Model/CqrsEventTypes.cs @@ -19,5 +19,10 @@ public enum CqrsEventTypes StripeCheckoutUpdated = 14, StripeInvoicePaid = 15, StripeInvoiceItemDeleted = 16, + PaddleTransactionCompleted = 17, + PaddleTransactionPaymentFailed = 18, + PaddleSubscriptionUpdated = 19, + PaddleSubscriptionCanceled = 20, + PaddleSubscriptionCreated = 21, } } diff --git a/Core/Resgrid.Model/DepartmentSettingTypes.cs b/Core/Resgrid.Model/DepartmentSettingTypes.cs index 40e2a6f0..7634f1ec 100644 --- a/Core/Resgrid.Model/DepartmentSettingTypes.cs +++ b/Core/Resgrid.Model/DepartmentSettingTypes.cs @@ -38,5 +38,6 @@ public enum DepartmentSettingTypes UnitDispatchAlsoDispatchToGroup = 34, PersonnelOnUnitSetUnitStatus = 35, Require2FAForAdmins = 36, + PaddleCustomerId = 37, } } diff --git a/Core/Resgrid.Model/GdprDataExportRequest.cs b/Core/Resgrid.Model/GdprDataExportRequest.cs new file mode 100644 index 00000000..cbe388c3 --- /dev/null +++ b/Core/Resgrid.Model/GdprDataExportRequest.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace Resgrid.Model +{ + [Table("GdprDataExportRequests")] + public class GdprDataExportRequest : IEntity + { + public string GdprDataExportRequestId { get; set; } + + public string UserId { get; set; } + + public int DepartmentId { get; set; } + + public int Status { get; set; } + + public DateTime RequestedOn { get; set; } + + public DateTime? ProcessingStartedOn { get; set; } + + public DateTime? CompletedOn { get; set; } + + public string DownloadToken { get; set; } + + public DateTime? TokenExpiresAt { get; set; } + + public byte[] ExportData { get; set; } + + public long? FileSizeBytes { get; set; } + + public string ErrorMessage { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return GdprDataExportRequestId; } + set { GdprDataExportRequestId = value.ToString(); } + } + + [NotMapped] + public string TableName => "GdprDataExportRequests"; + + [NotMapped] + public string IdName => "GdprDataExportRequestId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; + } +} diff --git a/Core/Resgrid.Model/GdprExportStatus.cs b/Core/Resgrid.Model/GdprExportStatus.cs new file mode 100644 index 00000000..ad0caf4d --- /dev/null +++ b/Core/Resgrid.Model/GdprExportStatus.cs @@ -0,0 +1,11 @@ +namespace Resgrid.Model +{ + public enum GdprExportStatus + { + Pending = 0, + Processing = 1, + Completed = 2, + Failed = 3, + Expired = 4 + } +} diff --git a/Core/Resgrid.Model/PaymentMethods.cs b/Core/Resgrid.Model/PaymentMethods.cs index dce51d53..25016958 100644 --- a/Core/Resgrid.Model/PaymentMethods.cs +++ b/Core/Resgrid.Model/PaymentMethods.cs @@ -7,6 +7,7 @@ public enum PaymentMethods Invoice = 3, System = 4, BrainTree = 5, - Wave = 6 + Wave = 6, + Paddle = 7 } } \ No newline at end of file diff --git a/Core/Resgrid.Model/Repositories/IGdprDataExportRequestRepository.cs b/Core/Resgrid.Model/Repositories/IGdprDataExportRequestRepository.cs new file mode 100644 index 00000000..6909d583 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IGdprDataExportRequestRepository.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + public interface IGdprDataExportRequestRepository : IRepository + { + Task> GetPendingRequestsAsync(); + Task TryClaimForProcessingAsync(string requestId, CancellationToken cancellationToken = default); + Task GetByTokenAsync(string token); + Task GetActiveRequestByUserIdAsync(string userId); + Task> GetExpiredRequestsAsync(); + } +} diff --git a/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs b/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs index 908f17c8..7c99446e 100644 --- a/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs +++ b/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs @@ -281,5 +281,9 @@ public interface IDepartmentSettingsService /// Returns 0 = disabled, 1 = dept admins + managing user, 2 = dept admins + managing user + group admins. /// Task GetRequire2FAForAdminsAsync(int departmentId); + + Task GetDepartmentIdForPaddleCustomerIdAsync(string paddleCustomerId, bool bypassCache = false); + + Task GetPaddleCustomerIdForDepartmentAsync(int departmentId); } } diff --git a/Core/Resgrid.Model/Services/IEmailService.cs b/Core/Resgrid.Model/Services/IEmailService.cs index 2a549ac7..45f7d92c 100644 --- a/Core/Resgrid.Model/Services/IEmailService.cs +++ b/Core/Resgrid.Model/Services/IEmailService.cs @@ -3,6 +3,7 @@ using MimeKit; using Resgrid.Model.Events; using Stripe; +using System; namespace Resgrid.Model.Services { @@ -211,5 +212,7 @@ Task SendUserCancellationNotificationToTeamAsync(Department department, Pa /// User's first name for personalisation. /// The numeric verification code to include in the email. Task SendEmailVerificationCodeAsync(string toEmailAddress, string firstName, string verificationCode); + + Task SendGdprDataExportReadyAsync(string toEmailAddress, string firstName, string downloadUrl, DateTime expiresAt); } } diff --git a/Core/Resgrid.Model/Services/IGdprDataExportService.cs b/Core/Resgrid.Model/Services/IGdprDataExportService.cs new file mode 100644 index 00000000..ced94fe1 --- /dev/null +++ b/Core/Resgrid.Model/Services/IGdprDataExportService.cs @@ -0,0 +1,15 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Model.Services +{ + public interface IGdprDataExportService + { + Task CreateExportRequestAsync(string userId, int departmentId, CancellationToken cancellationToken = default); + Task GetActiveRequestByUserIdAsync(string userId); + Task GetRequestByTokenAsync(string token); + Task ProcessPendingRequestsAsync(CancellationToken cancellationToken = default); + Task ExpireOldRequestsAsync(CancellationToken cancellationToken = default); + Task MarkDownloadedAsync(GdprDataExportRequest request, CancellationToken cancellationToken = default); + } +} diff --git a/Core/Resgrid.Model/Services/IShiftsService.cs b/Core/Resgrid.Model/Services/IShiftsService.cs index 55187bb1..0b3a188b 100644 --- a/Core/Resgrid.Model/Services/IShiftsService.cs +++ b/Core/Resgrid.Model/Services/IShiftsService.cs @@ -296,5 +296,7 @@ Task PopulateShiftData(Shift shift, bool getDepartment, bool getPersonnel Task> GetShiftSignupsByDepartmentGroupIdAndDayAsync(int departmentGroupId, DateTime shiftDayDate); + + Task> GetShiftPersonsForUserAsync(string userId); } } diff --git a/Core/Resgrid.Model/Services/ISubscriptionsService.cs b/Core/Resgrid.Model/Services/ISubscriptionsService.cs index 266ea452..ce9e787b 100644 --- a/Core/Resgrid.Model/Services/ISubscriptionsService.cs +++ b/Core/Resgrid.Model/Services/ISubscriptionsService.cs @@ -246,8 +246,22 @@ Task CreateStripeSessionForCustomerPortal( Task SavePaymentEventAsync(PaymentProviderEvent providerEvent, CancellationToken cancellationToken = default(CancellationToken)); - Task CreateStripeSessionForSub(int departmentId, string stripeCustomerId, string stripePlanId, int planId, string email, string departmentName, int count); + Task CreateStripeSessionForSub(int departmentId, string stripeCustomerId, string stripePlanId, int planId, string email, string departmentName, int count, string discountCode = null); Task ChangeActiveSubscriptionAsync(string stripeCustomerId, string stripePlanId); + + Task CreatePaddleCheckoutForSub(int departmentId, string paddleCustomerId, string paddlePriceId, int planId, string email, string departmentName, int count, string discountCode = null); + + Task CreatePaddleCheckoutForUpdate(int departmentId, string paddleCustomerId, string email, string departmentName); + + Task GetActivePaddleSubscriptionAsync(string paddleCustomerId); + + Task GetActivePTTPaddleSubscriptionAsync(string paddleCustomerId); + + Task ChangePaddleSubscriptionAsync(string paddleCustomerId, string paddlePriceId); + + Task ModifyPaddlePTTAddonSubscriptionAsync(string paddleCustomerId, long quantity, PlanAddon planAddon); + + Task CancelPaddleSubscriptionAsync(string paddleCustomerId); } } diff --git a/Core/Resgrid.Model/Services/ITrainingService.cs b/Core/Resgrid.Model/Services/ITrainingService.cs index e057644d..3403542a 100644 --- a/Core/Resgrid.Model/Services/ITrainingService.cs +++ b/Core/Resgrid.Model/Services/ITrainingService.cs @@ -93,5 +93,7 @@ public interface ITrainingService /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. /// Task<Training>. Task MarkAsNotifiedAsync(int trainingId, CancellationToken cancellationToken = default(CancellationToken)); + + Task> GetTrainingUsersForUserAsync(string userId); } } diff --git a/Core/Resgrid.Model/SystemAuditTypes.cs b/Core/Resgrid.Model/SystemAuditTypes.cs index 8272b0c0..d56f6e7b 100644 --- a/Core/Resgrid.Model/SystemAuditTypes.cs +++ b/Core/Resgrid.Model/SystemAuditTypes.cs @@ -12,6 +12,9 @@ public enum SystemAuditTypes TwoFactorStepUpVerified = 7, SsoLogin = 8, SsoLoginFailed = 9, - ScimOperation = 10 + ScimOperation = 10, + AccountDeletionRequested = 11, + GdprDataExportRequested = 12, + GdprDataExportDownloaded = 13 } } diff --git a/Core/Resgrid.Services/DepartmentSettingsService.cs b/Core/Resgrid.Services/DepartmentSettingsService.cs index e8ccbab9..257be104 100644 --- a/Core/Resgrid.Services/DepartmentSettingsService.cs +++ b/Core/Resgrid.Services/DepartmentSettingsService.cs @@ -15,6 +15,7 @@ public class DepartmentSettingsService : IDepartmentSettingsService { private static string DisableAutoAvailableCacheKey = "DSetAutoAvailable_{0}"; private static string StripeCustomerCacheKey = "DSetStripeCus_{0}"; + private static string PaddleCustomerCacheKey = "DSetPaddleCus_{0}"; private static string BigBoardCenterGps = "DSetBBCenterGps_{0}"; private static string StaffingSupressInfo = "DSetStaffingSupress_{0}"; private static string PersonnelOnUnitSetUnitStatusCacheKey = "DSetPersonnelOnUnitSetUnitStatus_{0}"; @@ -751,5 +752,40 @@ public async Task GetRequire2FAForAdminsAsync(int departmentId) return 0; // Disabled by default } + + public async Task GetPaddleCustomerIdForDepartmentAsync(int departmentId) + { + var settingValue = await GetSettingByDepartmentIdType(departmentId, DepartmentSettingTypes.PaddleCustomerId); + + if (settingValue != null) + return settingValue.Setting; + + return String.Empty; + } + + public async Task GetDepartmentIdForPaddleCustomerIdAsync(string paddleCustomerId, bool bypassCache = false) + { + DepartmentSetting key; + + async Task getSetting() + { + return await _departmentSettingsRepository.GetDepartmentSettingBySettingTypeAsync(paddleCustomerId, DepartmentSettingTypes.PaddleCustomerId); + } + + if (!bypassCache && Config.SystemBehaviorConfig.CacheEnabled) + { + key = await _cacheProvider.RetrieveAsync(string.Format(PaddleCustomerCacheKey, paddleCustomerId), + getSetting, TwoYearCacheLength); + } + else + { + key = await getSetting(); + } + + if (key != null) + return key.DepartmentId; + + return null; + } } } diff --git a/Core/Resgrid.Services/EmailService.cs b/Core/Resgrid.Services/EmailService.cs index 8d2d33cf..d3cdff73 100644 --- a/Core/Resgrid.Services/EmailService.cs +++ b/Core/Resgrid.Services/EmailService.cs @@ -667,5 +667,30 @@ public async Task SendEmailVerificationCodeAsync(string toEmailAddress, st return false; } + + public async Task SendGdprDataExportReadyAsync(string toEmailAddress, string firstName, string downloadUrl, DateTime expiresAt) + { + if (string.IsNullOrWhiteSpace(toEmailAddress)) + return false; + + try + { + using var mail = new MailMessage(); + mail.To.Add(toEmailAddress); + mail.Subject = "Your Resgrid Data Export is Ready"; + mail.From = new MailAddress(Config.OutboundEmailServerConfig.FromMail, "Resgrid"); + mail.Body = $"Hi {firstName},\r\n\r\nYour personal data export is ready for download.\r\n\r\nDownload link: {downloadUrl}\r\n\r\nThis link expires on {expiresAt:f} UTC. After this date the data will no longer be available.\r\n\r\nIf you did not request this, please contact support.\r\n\r\nThe Resgrid Team"; + mail.IsBodyHtml = false; + + await _emailSender.SendEmail(mail); + return true; + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + return false; + } } } diff --git a/Core/Resgrid.Services/GdprDataExportService.cs b/Core/Resgrid.Services/GdprDataExportService.cs new file mode 100644 index 00000000..07517d4d --- /dev/null +++ b/Core/Resgrid.Services/GdprDataExportService.cs @@ -0,0 +1,250 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Resgrid.Config; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Services; + +namespace Resgrid.Services +{ + public class GdprDataExportService : IGdprDataExportService + { + private readonly IGdprDataExportRequestRepository _repository; + private readonly IUserProfileService _userProfileService; + private readonly IUsersService _usersService; + private readonly IDepartmentsService _departmentsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly IActionLogsService _actionLogsService; + private readonly IMessageService _messageService; + private readonly ICertificationService _certificationService; + private readonly ITrainingService _trainingService; + private readonly IShiftsService _shiftsService; + private readonly IEmailService _emailService; + + public GdprDataExportService( + IGdprDataExportRequestRepository repository, + IUserProfileService userProfileService, + IUsersService usersService, + IDepartmentsService departmentsService, + IDepartmentGroupsService departmentGroupsService, + IPersonnelRolesService personnelRolesService, + IActionLogsService actionLogsService, + IMessageService messageService, + ICertificationService certificationService, + ITrainingService trainingService, + IShiftsService shiftsService, + IEmailService emailService) + { + _repository = repository; + _userProfileService = userProfileService; + _usersService = usersService; + _departmentsService = departmentsService; + _departmentGroupsService = departmentGroupsService; + _personnelRolesService = personnelRolesService; + _actionLogsService = actionLogsService; + _messageService = messageService; + _certificationService = certificationService; + _trainingService = trainingService; + _shiftsService = shiftsService; + _emailService = emailService; + } + + public async Task CreateExportRequestAsync(string userId, int departmentId, CancellationToken cancellationToken = default) + { + var request = new GdprDataExportRequest + { + UserId = userId, + DepartmentId = departmentId, + Status = (int)GdprExportStatus.Pending, + RequestedOn = DateTime.UtcNow + }; + + return await _repository.SaveOrUpdateAsync(request, cancellationToken, true); + } + + public async Task GetActiveRequestByUserIdAsync(string userId) + { + return await _repository.GetActiveRequestByUserIdAsync(userId); + } + + public async Task GetRequestByTokenAsync(string token) + { + return await _repository.GetByTokenAsync(token); + } + + public async Task ProcessPendingRequestsAsync(CancellationToken cancellationToken = default) + { + var pending = await _repository.GetPendingRequestsAsync(); + if (pending == null) return; + + foreach (var request in pending) + { + var claimed = await _repository.TryClaimForProcessingAsync(request.GdprDataExportRequestId, cancellationToken); + if (!claimed) + continue; + + try + { + var zipBytes = await BuildExportZipAsync(request.UserId, request.DepartmentId); + + var tokenBytes = new byte[32]; + RandomNumberGenerator.Fill(tokenBytes); + var token = Convert.ToBase64String(tokenBytes) + .Replace('+', '-').Replace('/', '_').TrimEnd('='); + + request.Status = (int)GdprExportStatus.Completed; + request.ProcessingStartedOn = DateTime.UtcNow; + request.CompletedOn = DateTime.UtcNow; + request.ExportData = zipBytes; + request.FileSizeBytes = zipBytes.LongLength; + request.DownloadToken = token; + request.TokenExpiresAt = DateTime.UtcNow.AddDays(7); + await _repository.SaveOrUpdateAsync(request, cancellationToken, true); + + var profile = await _userProfileService.GetProfileByUserIdAsync(request.UserId); + var user = _usersService.GetUserById(request.UserId); + if (profile != null && user != null) + { + var downloadUrl = $"{Config.SystemBehaviorConfig.ResgridBaseUrl}/User/Home/DownloadMyData?token={token}"; + await _emailService.SendGdprDataExportReadyAsync( + user.Email, + profile.FirstName, + downloadUrl, + request.TokenExpiresAt.Value); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + request.Status = (int)GdprExportStatus.Failed; + request.ErrorMessage = ex.Message; + await _repository.SaveOrUpdateAsync(request, cancellationToken, true); + } + } + } + + public async Task ExpireOldRequestsAsync(CancellationToken cancellationToken = default) + { + var expired = await _repository.GetExpiredRequestsAsync(); + if (expired == null) return; + + foreach (var request in expired) + { + request.Status = (int)GdprExportStatus.Expired; + request.ExportData = null; + await _repository.SaveOrUpdateAsync(request, cancellationToken, true); + } + } + + public async Task MarkDownloadedAsync(GdprDataExportRequest request, CancellationToken cancellationToken = default) + { + request.DownloadToken = null; + request.TokenExpiresAt = DateTime.UtcNow; + request.Status = (int)GdprExportStatus.Expired; + request.ExportData = null; + await _repository.SaveOrUpdateAsync(request, cancellationToken, true); + } + + private async Task BuildExportZipAsync(string userId, int departmentId) + { + using var ms = new MemoryStream(); + using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, leaveOpen: true)) + { + await AddJsonEntry(archive, "profile.json", await BuildProfileDataAsync(userId)); + await AddJsonEntry(archive, "membership.json", await BuildMembershipDataAsync(userId, departmentId)); + await AddJsonEntry(archive, "action_logs.json", await BuildActionLogsDataAsync(userId)); + await AddJsonEntry(archive, "messages_inbox.json", await BuildInboxMessagesDataAsync(userId)); + await AddJsonEntry(archive, "messages_sent.json", await BuildSentMessagesDataAsync(userId)); + await AddJsonEntry(archive, "certifications.json", await BuildCertificationsDataAsync(userId)); + await AddJsonEntry(archive, "trainings.json", await BuildTrainingsDataAsync(userId)); + await AddJsonEntry(archive, "shifts.json", await BuildShiftsDataAsync(userId)); + } + + return ms.ToArray(); + } + + private static async Task AddJsonEntry(ZipArchive archive, string fileName, object data) + { + var entry = archive.CreateEntry(fileName, CompressionLevel.Optimal); + using var entryStream = entry.Open(); + var json = JsonConvert.SerializeObject(data, Formatting.Indented); + var bytes = Encoding.UTF8.GetBytes(json); + await entryStream.WriteAsync(bytes, 0, bytes.Length); + } + + private async Task BuildProfileDataAsync(string userId) + { + var profile = await _userProfileService.GetProfileByUserIdAsync(userId); + var user = _usersService.GetUserById(userId); + return new { profile, user = user != null ? new { user.Id, user.Email, user.UserName } : null }; + } + + private async Task BuildMembershipDataAsync(string userId, int departmentId) + { + var member = await _departmentsService.GetDepartmentMemberAsync(userId, departmentId); + var group = await _departmentGroupsService.GetGroupForUserAsync(userId, departmentId); + var roles = await _personnelRolesService.GetRolesForUserAsync(userId, departmentId); + return new { member, group, roles }; + } + + private async Task BuildActionLogsDataAsync(string userId) + { + var logs = await _actionLogsService.GetAllActionLogsForUser(userId); + return logs; + } + + private async Task BuildInboxMessagesDataAsync(string userId) + { + var messages = await _messageService.GetInboxMessagesByUserIdAsync(userId); + return messages; + } + + private async Task BuildSentMessagesDataAsync(string userId) + { + var messages = await _messageService.GetSentMessagesByUserIdAsync(userId); + return messages; + } + + private async Task BuildCertificationsDataAsync(string userId) + { + var certs = await _certificationService.GetCertificationsByUserIdAsync(userId); + if (certs != null) + { + return certs.Select(c => new + { + c.PersonnelCertificationId, + c.UserId, + c.DepartmentId, + c.Name, + c.Number, + c.ExpiresOn, + c.RecievedOn, + c.Type + }); + } + return new List(); + } + + private async Task BuildTrainingsDataAsync(string userId) + { + var trainings = await _trainingService.GetTrainingUsersForUserAsync(userId); + return trainings; + } + + private async Task BuildShiftsDataAsync(string userId) + { + var shifts = await _shiftsService.GetShiftPersonsForUserAsync(userId); + return shifts; + } + } +} diff --git a/Core/Resgrid.Services/ServicesModule.cs b/Core/Resgrid.Services/ServicesModule.cs index 671ab02e..793d0405 100644 --- a/Core/Resgrid.Services/ServicesModule.cs +++ b/Core/Resgrid.Services/ServicesModule.cs @@ -96,6 +96,9 @@ protected override void Load(ContainerBuilder builder) //builder.RegisterType().As().InstancePerLifetimeScope(); //builder.RegisterType().As().InstancePerLifetimeScope(); //builder.RegisterType().As().InstancePerLifetimeScope(); + + // GDPR Services + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Core/Resgrid.Services/ShiftsService.cs b/Core/Resgrid.Services/ShiftsService.cs index bdc8bec9..ad9a5efc 100644 --- a/Core/Resgrid.Services/ShiftsService.cs +++ b/Core/Resgrid.Services/ShiftsService.cs @@ -760,5 +760,14 @@ public async Task> GetShiftSignupsByDepartmentGroupIdAndDayAsy var signups = await _shiftSignupRepository.GetAllShiftSignupsByGroupIdAndDateAsync(departmentGroupId, shiftDayDate); return signups.ToList(); } + + public async Task> GetShiftPersonsForUserAsync(string userId) + { + var persons = await _shiftPersonRepository.GetAllByUserIdAsync(userId); + if (persons != null) + return persons.ToList(); + + return new List(); + } } } diff --git a/Core/Resgrid.Services/SubscriptionsService.cs b/Core/Resgrid.Services/SubscriptionsService.cs index eefab529..9e6040ac 100644 --- a/Core/Resgrid.Services/SubscriptionsService.cs +++ b/Core/Resgrid.Services/SubscriptionsService.cs @@ -1148,7 +1148,7 @@ public async Task CreateStripeSessionForCu return await _paymentProviderEventsRepository.SaveOrUpdateAsync(providerEvent, cancellationToken); } - public async Task CreateStripeSessionForSub(int departmentId, string stripeCustomerId, string stripePlanId, int planId, string email, string departmentName, int count) + public async Task CreateStripeSessionForSub(int departmentId, string stripeCustomerId, string stripePlanId, int planId, string email, string departmentName, int count, string discountCode = null) { if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) { @@ -1167,6 +1167,9 @@ public async Task CreateStripeSessionForSub(in request.AddParameter("email", email, ParameterType.QueryString, true); request.AddParameter("departmentName", departmentName, ParameterType.QueryString, true); + if (!String.IsNullOrWhiteSpace(discountCode)) + request.AddParameter("discountCode", discountCode, ParameterType.QueryString); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.NotFound) @@ -1208,5 +1211,209 @@ public async Task ChangeActiveSubscriptionAsync(st return null; } + + public async Task CreatePaddleCheckoutForSub(int departmentId, string paddleCustomerId, string paddlePriceId, int planId, string email, string departmentName, int count, string discountCode = null) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/CreatePaddleCheckoutForSubscription", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + request.AddParameter("departmentId", departmentId, ParameterType.QueryString); + request.AddParameter("paddlePriceId", paddlePriceId, ParameterType.QueryString); + request.AddParameter("planId", planId, ParameterType.QueryString); + request.AddParameter("count", count, ParameterType.QueryString); + request.AddParameter("email", email, ParameterType.QueryString, true); + request.AddParameter("departmentName", departmentName, ParameterType.QueryString, true); + + if (!String.IsNullOrWhiteSpace(discountCode)) + request.AddParameter("discountCode", discountCode, ParameterType.QueryString); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return null; + + if (response.Data == null) + return null; + + return response.Data.Data; + } + + return null; + } + + public async Task CreatePaddleCheckoutForUpdate(int departmentId, string paddleCustomerId, string email, string departmentName) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/CreatePaddleCheckoutForUpdate", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + request.AddParameter("departmentId", departmentId, ParameterType.QueryString); + request.AddParameter("email", email, ParameterType.QueryString, true); + request.AddParameter("departmentName", departmentName, ParameterType.QueryString, true); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return null; + + if (response.Data == null) + return null; + + return response.Data.Data; + } + + return null; + } + + public async Task GetActivePaddleSubscriptionAsync(string paddleCustomerId) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/GetActivePaddleSubscription", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return null; + + if (response.Data == null) + return null; + + return response.Data.Data; + } + + return null; + } + + public async Task GetActivePTTPaddleSubscriptionAsync(string paddleCustomerId) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/GetActivePTTPaddleSubscription", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return null; + + if (response.Data == null) + return null; + + return response.Data.Data; + } + + return null; + } + + public async Task ChangePaddleSubscriptionAsync(string paddleCustomerId, string paddlePriceId) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/ChangePaddleSubscription", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + request.AddParameter("paddlePriceId", paddlePriceId, ParameterType.QueryString); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return false; + + if (response.Data == null) + return false; + + return response.Data.Data; + } + + return false; + } + + public async Task ModifyPaddlePTTAddonSubscriptionAsync(string paddleCustomerId, long quantity, PlanAddon planAddon) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/ModifyPaddlePTTAddonSubscription", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + request.AddParameter("quantity", quantity, ParameterType.QueryString); + request.AddParameter("planAddonId", planAddon.PlanAddonId, ParameterType.QueryString); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return false; + + if (response.Data == null) + return false; + + return response.Data.Data; + } + + return false; + } + + public async Task CancelPaddleSubscriptionAsync(string paddleCustomerId) + { + if (!String.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) && !String.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey)) + { + if (string.IsNullOrWhiteSpace(paddleCustomerId)) + paddleCustomerId = " "; + + var client = new RestClient(Config.SystemBehaviorConfig.BillingApiBaseUrl, configureSerialization: s => s.UseNewtonsoftJson()); + var request = new RestRequest($"/api/Billing/CancelPaddleSubscription", Method.Get); + request.AddHeader("X-API-Key", Config.ApiConfig.BackendInternalApikey); + request.AddHeader("Content-Type", "application/json"); + request.AddParameter("paddleCustomerId", Uri.EscapeDataString(paddleCustomerId), ParameterType.QueryString); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode == HttpStatusCode.NotFound) + return false; + + if (response.Data == null) + return false; + + return response.Data.Data; + } + + return false; + } } } diff --git a/Core/Resgrid.Services/TrainingService.cs b/Core/Resgrid.Services/TrainingService.cs index 69ed2b3b..b669e082 100644 --- a/Core/Resgrid.Services/TrainingService.cs +++ b/Core/Resgrid.Services/TrainingService.cs @@ -235,5 +235,14 @@ public async Task> GetTrainingsToNotifyAsync(DateTime currentTime return await _trainingRepository.SaveOrUpdateAsync(training, cancellationToken); } + + public async Task> GetTrainingUsersForUserAsync(string userId) + { + var users = await _trainingUserRepository.GetAllByUserIdAsync(userId); + if (users != null) + return users.ToList(); + + return new List(); + } } } diff --git a/Providers/Resgrid.Providers.Migrations/Migrations/M0055_AddGdprDataExportRequests.cs b/Providers/Resgrid.Providers.Migrations/Migrations/M0055_AddGdprDataExportRequests.cs new file mode 100644 index 00000000..218e65a2 --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Migrations/M0055_AddGdprDataExportRequests.cs @@ -0,0 +1,30 @@ +using FluentMigrator; + +namespace Resgrid.Providers.Migrations.Migrations +{ + [Migration(55)] + public class M0055_AddGdprDataExportRequests : Migration + { + public override void Up() + { + Create.Table("GdprDataExportRequests") + .WithColumn("GdprDataExportRequestId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("UserId").AsString(128).Nullable() + .WithColumn("DepartmentId").AsInt32().NotNullable() + .WithColumn("Status").AsInt32().NotNullable().WithDefaultValue(0) + .WithColumn("RequestedOn").AsDateTime().NotNullable() + .WithColumn("ProcessingStartedOn").AsDateTime().Nullable() + .WithColumn("CompletedOn").AsDateTime().Nullable() + .WithColumn("DownloadToken").AsString(100).Nullable() + .WithColumn("TokenExpiresAt").AsDateTime().Nullable() + .WithColumn("ExportData").AsBinary(int.MaxValue).Nullable() + .WithColumn("FileSizeBytes").AsInt64().Nullable() + .WithColumn("ErrorMessage").AsString(2000).Nullable(); + } + + public override void Down() + { + Delete.Table("GdprDataExportRequests"); + } + } +} diff --git a/Providers/Resgrid.Providers.MigrationsPg/Migrations/M0055_AddGdprDataExportRequestsPg.cs b/Providers/Resgrid.Providers.MigrationsPg/Migrations/M0055_AddGdprDataExportRequestsPg.cs new file mode 100644 index 00000000..ffb95f04 --- /dev/null +++ b/Providers/Resgrid.Providers.MigrationsPg/Migrations/M0055_AddGdprDataExportRequestsPg.cs @@ -0,0 +1,30 @@ +using FluentMigrator; + +namespace Resgrid.Providers.MigrationsPg.Migrations +{ + [Migration(55)] + public class M0055_AddGdprDataExportRequestsPg : Migration + { + public override void Up() + { + Create.Table("gdprdataexportrequests") + .WithColumn("gdprdataexportrequestid").AsCustom("citext").NotNullable().PrimaryKey() + .WithColumn("userid").AsCustom("citext").Nullable() + .WithColumn("departmentid").AsInt32().NotNullable() + .WithColumn("status").AsInt32().NotNullable().WithDefaultValue(0) + .WithColumn("requestedon").AsDateTime().NotNullable() + .WithColumn("processingstartedon").AsDateTime().Nullable() + .WithColumn("completedon").AsDateTime().Nullable() + .WithColumn("downloadtoken").AsCustom("citext").Nullable() + .WithColumn("tokenexpiresat").AsDateTime().Nullable() + .WithColumn("exportdata").AsBinary(int.MaxValue).Nullable() + .WithColumn("filesizebytes").AsInt64().Nullable() + .WithColumn("errormessage").AsCustom("text").Nullable(); + } + + public override void Down() + { + Delete.Table("gdprdataexportrequests"); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/GdprDataExportRequestRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/GdprDataExportRequestRepository.cs new file mode 100644 index 00000000..3233ec80 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/GdprDataExportRequestRepository.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Threading; +using System.Threading.Tasks; +using Dapper; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; + +namespace Resgrid.Repositories.DataRepository +{ + public class GdprDataExportRequestRepository : RepositoryBase, IGdprDataExportRequestRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IUnitOfWork _unitOfWork; + + public GdprDataExportRequestRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _unitOfWork = unitOfWork; + } + + public async Task> GetPendingRequestsAsync() + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("Status", (int)GdprExportStatus.Pending); + + return await x.QueryAsync( + sql: "SELECT GdprDataExportRequestId, UserId, DepartmentId, Status, RequestedOn, ProcessingStartedOn, CompletedOn, DownloadToken, TokenExpiresAt, FileSizeBytes, ErrorMessage FROM GdprDataExportRequests WHERE Status = @Status", + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + throw; + } + } + + public async Task TryClaimForProcessingAsync(string requestId, CancellationToken cancellationToken = default) + { + try + { + var claimFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("Id", requestId); + dynamicParameters.Add("PendingStatus", (int)GdprExportStatus.Pending); + dynamicParameters.Add("ProcessingStatus", (int)GdprExportStatus.Processing); + dynamicParameters.Add("Now", DateTime.UtcNow); + + var rowsAffected = await x.ExecuteAsync( + sql: "UPDATE GdprDataExportRequests SET Status = @ProcessingStatus, ProcessingStartedOn = @Now WHERE GdprDataExportRequestId = @Id AND Status = @PendingStatus", + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + + return rowsAffected > 0; + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(cancellationToken); + return await claimFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await claimFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + throw; + } + } + + public async Task GetByTokenAsync(string token) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("Token", token); + + return await x.QueryFirstOrDefaultAsync( + sql: "SELECT * FROM GdprDataExportRequests WHERE DownloadToken = @Token", + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + throw; + } + } + + public async Task GetActiveRequestByUserIdAsync(string userId) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("UserId", userId); + dynamicParameters.Add("PendingStatus", (int)GdprExportStatus.Pending); + dynamicParameters.Add("ProcessingStatus", (int)GdprExportStatus.Processing); + + return await x.QueryFirstOrDefaultAsync( + sql: "SELECT GdprDataExportRequestId, UserId, DepartmentId, Status, RequestedOn, ProcessingStartedOn, CompletedOn, DownloadToken, TokenExpiresAt, FileSizeBytes, ErrorMessage FROM GdprDataExportRequests WHERE UserId = @UserId AND Status IN (@PendingStatus, @ProcessingStatus)", + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + throw; + } + } + + public async Task> GetExpiredRequestsAsync() + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("CompletedStatus", (int)GdprExportStatus.Completed); + dynamicParameters.Add("Now", DateTime.UtcNow); + + return await x.QueryAsync( + sql: "SELECT GdprDataExportRequestId, UserId, DepartmentId, Status, RequestedOn, ProcessingStartedOn, CompletedOn, DownloadToken, TokenExpiresAt, FileSizeBytes, ErrorMessage FROM GdprDataExportRequests WHERE Status = @CompletedStatus AND TokenExpiresAt < @Now", + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + throw; + } + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs b/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs index 39ee08f5..333148f5 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs @@ -200,6 +200,9 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + + // GDPR Repositories + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Web/Resgrid.Web.Services/Controllers/v4/ConfigController.cs b/Web/Resgrid.Web.Services/Controllers/v4/ConfigController.cs index dd281646..1e43a020 100644 --- a/Web/Resgrid.Web.Services/Controllers/v4/ConfigController.cs +++ b/Web/Resgrid.Web.Services/Controllers/v4/ConfigController.cs @@ -97,12 +97,8 @@ public async Task> GetConfig(string key) result.Data.NovuBackendApiUrl = ChatConfig.NovuBackendUrl; result.Data.NovuSocketUrl = ChatConfig.NovuSocketUrl; - result.Data.AnalyticsApiKey = TelemetryConfig.GetAnalyticsKey(); - - if (TelemetryConfig.ExporterType == TelemetryExporters.PostHog) - result.Data.AnalyticsHost = TelemetryConfig.PostHogUrl; - else if (TelemetryConfig.ExporterType == TelemetryExporters.Aptabase) - result.Data.AnalyticsHost = TelemetryConfig.AptabaseUrl; + result.Data.AnalyticsApiKey = ""; + result.Data.AnalyticsHost = ""; result.PageSize = 1; result.Status = ResponseHelper.Success; diff --git a/Web/Resgrid.Web/Areas/User/Controllers/AccountController.cs b/Web/Resgrid.Web/Areas/User/Controllers/AccountController.cs index 952982ba..9b9fc862 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/AccountController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/AccountController.cs @@ -8,6 +8,7 @@ using Resgrid.Web.Areas.User.Models.Account; using Resgrid.Web.Helpers; using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; +using Resgrid.Providers.Claims; namespace Resgrid.Web.Areas.User.Controllers { @@ -24,10 +25,11 @@ public class AccountController : SecureBaseController private readonly IAuthorizationService _authorizationService; private readonly IDeleteService _deleteService; private readonly IPersonnelRolesService _personnelRolesService; + private readonly ISystemAuditsService _systemAuditsService; public AccountController(IDepartmentsService departmentsService, IUsersService usersService, IActionLogsService actionLogsService, IEmailService emailService, IUserProfileService userProfileService, IDeleteService deleteService, IAuthorizationService authorizationService, - ILimitsService limitsService, IPersonnelRolesService personnelRolesService) + ILimitsService limitsService, IPersonnelRolesService personnelRolesService, ISystemAuditsService systemAuditsService) { _departmentsService = departmentsService; _usersService = usersService; @@ -38,6 +40,7 @@ public AccountController(IDepartmentsService departmentsService, IUsersService u _authorizationService = authorizationService; _limitsService = limitsService; _personnelRolesService = personnelRolesService; + _systemAuditsService = systemAuditsService; } #endregion Private Members and Constructors @@ -69,6 +72,20 @@ public async Task DeleteAccount(DeleteAccountModel model, Cancell if (ModelState.IsValid) { + var user = _usersService.GetUserById(UserId); + await _systemAuditsService.SaveSystemAuditAsync(new SystemAudit + { + System = (int)SystemAuditSystems.Website, + Type = (int)SystemAuditTypes.AccountDeletionRequested, + DepartmentId = DepartmentId, + UserId = UserId, + Username = user?.UserName, + Successful = true, + IpAddress = IpAddressHelper.GetRequestIP(Request, true), + ServerName = Environment.MachineName, + Data = $"Account deletion requested. {Request.Headers["User-Agent"]}" + }, cancellationToken); + await _deleteService.DeleteUserAccountAsync(DepartmentId, UserId, UserId, IpAddressHelper.GetRequestIP(Request, true), $"{Request.Headers["User-Agent"]} {Request.Headers["Accept-Language"]}", cancellationToken); return RedirectToAction("LogOff", "Account", new { area = "" }); } diff --git a/Web/Resgrid.Web/Areas/User/Controllers/HomeController.cs b/Web/Resgrid.Web/Areas/User/Controllers/HomeController.cs index 47c16798..fd7cde02 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/HomeController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/HomeController.cs @@ -68,6 +68,8 @@ public class HomeController : SecureBaseController private readonly IUdfRenderingService _udfRenderingService; private readonly IDepartmentSsoService _departmentSsoService; private readonly IStringLocalizer _secLocalizer; + private readonly IGdprDataExportService _gdprDataExportService; + private readonly ISystemAuditsService _systemAuditsService; public HomeController(IDepartmentsService departmentsService, IUsersService usersService, IActionLogsService actionLogsService, IUserStateService userStateService, IDepartmentGroupsService departmentGroupsService, Resgrid.Model.Services.IAuthorizationService authorizationService, @@ -76,7 +78,8 @@ public HomeController(IDepartmentsService departmentsService, IUsersService user ICustomStateService customStateService, IEventAggregator eventAggregator, IOptions appOptionsAccessor, UserManager userManager, IStringLocalizerFactory factory, ISubscriptionsService subscriptionsService, IContactVerificationService contactVerificationService, IUserDefinedFieldsService userDefinedFieldsService, IUdfRenderingService udfRenderingService, IDepartmentSsoService departmentSsoService, - IStringLocalizer secLocalizer) + IStringLocalizer secLocalizer, IGdprDataExportService gdprDataExportService, + ISystemAuditsService systemAuditsService) { _departmentsService = departmentsService; _usersService = usersService; @@ -103,6 +106,8 @@ public HomeController(IDepartmentsService departmentsService, IUsersService user _udfRenderingService = udfRenderingService; _departmentSsoService = departmentSsoService; _secLocalizer = secLocalizer; + _gdprDataExportService = gdprDataExportService; + _systemAuditsService = systemAuditsService; _localizer = factory.Create("Home.Dashboard", new AssemblyName(typeof(SupportedLocales).GetTypeInfo().Assembly.FullName).Name); } @@ -485,6 +490,9 @@ public async Task EditUserProfile(string userId) if (model.IsOwnProfile) model.MinPasswordLength = await _departmentSsoService.GetEffectiveMinPasswordLengthAsync(DepartmentId); + if (model.IsOwnProfile) + model.ActiveDataExportRequest = await _gdprDataExportService.GetActiveRequestByUserIdAsync(userId); + return View(model); } @@ -1074,6 +1082,101 @@ public async Task ConfirmContactVerificationCode([FromBody] Confi return Json(new { success = confirmed }); } #endregion Contact Verification (AJAX) + + #region GDPR Data Export + + [HttpPost] + [ValidateAntiForgeryToken] + [Authorize(Policy = ResgridResources.Department_View)] + public async Task RequestMyData(CancellationToken cancellationToken) + { + var existing = await _gdprDataExportService.GetActiveRequestByUserIdAsync(UserId); + if (existing != null) + { + TempData["GdprError"] = "You already have a pending or in-progress data export request. Please wait for it to complete."; + return RedirectToAction("EditUserProfile", new { userId = UserId }); + } + + await _gdprDataExportService.CreateExportRequestAsync(UserId, DepartmentId, cancellationToken); + + var user = _usersService.GetUserById(UserId); + await _systemAuditsService.SaveSystemAuditAsync(new SystemAudit + { + System = (int)SystemAuditSystems.Website, + Type = (int)SystemAuditTypes.GdprDataExportRequested, + DepartmentId = DepartmentId, + UserId = UserId, + Username = user?.UserName, + Successful = true, + IpAddress = IpAddressHelper.GetRequestIP(Request, true), + ServerName = Environment.MachineName, + Data = $"GDPR data export requested. {Request.Headers["User-Agent"]}" + }, cancellationToken); + + TempData["GdprSuccess"] = "Your data export request has been submitted. You will receive an email when it is ready."; + + return RedirectToAction("EditUserProfile", new { userId = UserId }); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Department_View)] + public async Task DownloadMyData(string token, CancellationToken cancellationToken) + { + if (string.IsNullOrWhiteSpace(token)) + return NotFound(); + + var request = await _gdprDataExportService.GetRequestByTokenAsync(token); + if (request == null) + return NotFound(); + + if (request.UserId != UserId) + return Forbid(); + + if (request.TokenExpiresAt.HasValue && request.TokenExpiresAt.Value < DateTime.UtcNow) + { + TempData["GdprError"] = "This download link has expired. Please submit a new data export request."; + return RedirectToAction("EditUserProfile", new { userId = UserId }); + } + + if (request.ExportData == null || request.ExportData.Length == 0) + return NotFound(); + + // Hold a reference to the data before invalidating the record + var fileData = request.ExportData; + var fileName = $"resgrid_data_export_{DateTime.UtcNow:yyyyMMdd}.zip"; + + // Invalidate the token so this is a one-time download + await _gdprDataExportService.MarkDownloadedAsync(request, cancellationToken); + + var user = _usersService.GetUserById(UserId); + await _systemAuditsService.SaveSystemAuditAsync(new SystemAudit + { + System = (int)SystemAuditSystems.Website, + Type = (int)SystemAuditTypes.GdprDataExportDownloaded, + DepartmentId = DepartmentId, + UserId = UserId, + Username = user?.UserName, + Successful = true, + IpAddress = IpAddressHelper.GetRequestIP(Request, true), + ServerName = Environment.MachineName, + Data = $"GDPR data export downloaded (file: {fileName}). {Request.Headers["User-Agent"]}" + }, cancellationToken); + + return File(fileData, "application/zip", fileName); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Department_View)] + public async Task GetDataExportStatus() + { + var request = await _gdprDataExportService.GetActiveRequestByUserIdAsync(UserId); + if (request == null) + return Json(new { status = "none" }); + + return Json(new { status = request.Status, statusName = ((GdprExportStatus)request.Status).ToString() }); + } + + #endregion GDPR Data Export } /// Request body for sending a contact verification code. diff --git a/Web/Resgrid.Web/Areas/User/Controllers/SubscriptionController.cs b/Web/Resgrid.Web/Areas/User/Controllers/SubscriptionController.cs index 266c6784..b903341b 100644 --- a/Web/Resgrid.Web/Areas/User/Controllers/SubscriptionController.cs +++ b/Web/Resgrid.Web/Areas/User/Controllers/SubscriptionController.cs @@ -67,6 +67,28 @@ public SubscriptionController(IDepartmentsService departmentsService, IUsersServ #endregion Private Members and Constructors + [HttpGet] + [Authorize] + public async Task SelectRegistrationPlan(string discountCode = null) + { + var currentPayment = await _subscriptionsService.GetCurrentPaymentForDepartmentAsync(DepartmentId); + if (currentPayment != null && !currentPayment.IsFreePlan()) + return RedirectToAction("Dashboard", "Home", new { Area = "User" }); + + var model = new SelectRegistrationPlanView(); + model.DepartmentId = DepartmentId; + model.StripeKey = Config.PaymentProviderConfig.GetStripeClientKey(); + model.DiscountCode = discountCode; + + var paddleCustomerId = await _departmentSettingsService.GetPaddleCustomerIdForDepartmentAsync(DepartmentId); + bool isPaddleDepartment = !string.IsNullOrWhiteSpace(paddleCustomerId); + model.IsPaddleDepartment = isPaddleDepartment; + model.PaddleEnvironment = Config.PaymentProviderConfig.GetPaddleEnvironment(); + model.PaddleClientToken = Config.PaymentProviderConfig.GetPaddleClientToken(); + + return View(model); + } + [HttpGet] [Authorize(Policy = ResgridResources.Department_Update)] public async Task Index() @@ -209,18 +231,32 @@ public async Task Index() else model.AddonCost = "0"; - var user = _usersService.GetUserById(UserId); + var paddleCustomerId = await _departmentSettingsService.GetPaddleCustomerIdForDepartmentAsync(DepartmentId); + bool isPaddleDepartment = !string.IsNullOrWhiteSpace(paddleCustomerId) + || (model.Payment != null && model.Payment.Method == (int)PaymentMethods.Paddle); + model.IsPaddleDepartment = isPaddleDepartment; - try + if (isPaddleDepartment) { - var session = await _subscriptionsService.CreateStripeSessionForCustomerPortal(DepartmentId, model.StripeCustomer, "", user.Email, department.Name); - - if (session != null) - model.StripeCustomerPortalUrl = session.Url; + model.PaddleCustomer = paddleCustomerId; + model.PaddleEnvironment = Config.PaymentProviderConfig.GetPaddleEnvironment(); + model.PaddleClientToken = Config.PaymentProviderConfig.GetPaddleClientToken(); } - catch (Exception ex) + else { - Logging.LogException(ex); + var user = _usersService.GetUserById(UserId); + + try + { + var session = await _subscriptionsService.CreateStripeSessionForCustomerPortal(DepartmentId, model.StripeCustomer, "", user.Email, department.Name); + + if (session != null) + model.StripeCustomerPortalUrl = session.Url; + } + catch (Exception ex) + { + Logging.LogException(ex); + } } return View(model); @@ -386,7 +422,37 @@ public async Task Cancel(CancelView model, CancellationToken canc if (payment == null) return RedirectToAction("CancelFailure", "Subscription", new { Area = "User" }); - if (payment.Method == (int)PaymentMethods.Stripe) + if (payment.Method == (int)PaymentMethods.Paddle) + { + var paddleCustomerId = await _departmentSettingsService.GetPaddleCustomerIdForDepartmentAsync(DepartmentId); + + if (!String.IsNullOrWhiteSpace(paddleCustomerId)) + { + var result = await _subscriptionsService.CancelPaddleSubscriptionAsync(paddleCustomerId); + + var auditEvent = new AuditEvent(); + auditEvent.Before = paddleCustomerId; + auditEvent.DepartmentId = DepartmentId; + auditEvent.UserId = UserId; + auditEvent.Type = AuditLogTypes.SubscriptionCancelled; + auditEvent.After = result.ToString(); + auditEvent.Successful = result; + auditEvent.IpAddress = IpAddressHelper.GetRequestIP(Request, true); + auditEvent.ServerName = Environment.MachineName; + auditEvent.UserAgent = $"{Request.Headers["User-Agent"]} {Request.Headers["Accept-Language"]}"; + _eventAggregator.SendMessage(auditEvent); + + if (result) + return RedirectToAction("CancelSuccess", "Subscription", new { Area = "User" }); + else + return RedirectToAction("CancelFailure", "Subscription", new { Area = "User" }); + } + else + { + return RedirectToAction("CancelFailure", "Subscription", new { Area = "User" }); + } + } + else if (payment.Method == (int)PaymentMethods.Stripe) { var stripeCustomerId = await _departmentSettingsService.GetStripeCustomerIdForDepartmentAsync(DepartmentId); @@ -619,13 +685,13 @@ public async Task CancelAddon(int addonTypeId) [HttpGet] [Authorize(Policy = ResgridResources.Department_Update)] - public async Task GetStripeSession(int id, int count, CancellationToken cancellationToken) + public async Task GetStripeSession(int id, int count, string discountCode = null, CancellationToken cancellationToken = default) { var plan = await _subscriptionsService.GetPlanByIdAsync(id); var stripeCustomerId = await _departmentSettingsService.GetStripeCustomerIdForDepartmentAsync(DepartmentId); var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); var user = _usersService.GetUserById(UserId); - var session = await _subscriptionsService.CreateStripeSessionForSub(DepartmentId, stripeCustomerId, plan.GetExternalKey(), plan.PlanId, user.Email, department.Name, count); + var session = await _subscriptionsService.CreateStripeSessionForSub(DepartmentId, stripeCustomerId, plan.GetExternalKey(), plan.PlanId, user.Email, department.Name, count, discountCode); var subscription = await _subscriptionsService.GetActiveStripeSubscriptionAsync(session.CustomerId); bool hasActiveSub = false; @@ -655,6 +721,99 @@ public async Task GetStripeUpdate() }); } + [HttpGet] + [Authorize(Policy = ResgridResources.Department_Update)] + public async Task GetPaddleCheckout(int id, int count, string discountCode = null, CancellationToken cancellationToken = default) + { + var plan = await _subscriptionsService.GetPlanByIdAsync(id); + var paddleCustomerId = await _departmentSettingsService.GetPaddleCustomerIdForDepartmentAsync(DepartmentId); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + var user = _usersService.GetUserById(UserId); + var checkout = await _subscriptionsService.CreatePaddleCheckoutForSub(DepartmentId, paddleCustomerId, plan.GetExternalKey(), plan.PlanId, user.Email, department.Name, count, discountCode); + + bool hasActiveSub = false; + if (!string.IsNullOrWhiteSpace(paddleCustomerId)) + { + var subscription = await _subscriptionsService.GetActivePaddleSubscriptionAsync(paddleCustomerId); + if (subscription != null) + hasActiveSub = true; + } + + return Json(new + { + PriceId = checkout?.PriceId, + CustomerId = checkout?.CustomerId, + Environment = checkout?.Environment, + HasActiveSub = hasActiveSub + }); + } + + public async Task PaddleProcessing(int planId) + { + ProcessingView model = new ProcessingView(); + model.PlanId = planId; + + return View(model); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Department_Update)] + public async Task ManagePaddlePTTAddon() + { + var model = new BuyAddonView(); + model.PlanAddon = await _subscriptionsService.GetPlanAddonByIdAsync(Config.PaymentProviderConfig.GetPaddlePTT10UserAddonPackageId()); + model.PlanAddonId = model.PlanAddon.PlanAddonId; + model.Department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + + var paddleCustomer = await _departmentSettingsService.GetPaddleCustomerIdForDepartmentAsync(DepartmentId); + + var addon = await _subscriptionsService.GetActivePTTPaddleSubscriptionAsync(paddleCustomer); + + if (addon != null) + { + model.Quantity = addon.TotalQuantity; + } + + return View("ManagePTTAddon", model); + } + + [HttpPost] + [Authorize(Policy = ResgridResources.Department_Update)] + public async Task ManagePaddlePTTAddon(BuyAddonView model) + { + try + { + var addonPlan = await _subscriptionsService.GetPlanAddonByIdAsync(model.PlanAddonId); + var paddleCustomer = await _departmentSettingsService.GetPaddleCustomerIdForDepartmentAsync(DepartmentId); + + var auditEvent = new AuditEvent(); + auditEvent.Before = null; + auditEvent.DepartmentId = DepartmentId; + auditEvent.UserId = UserId; + auditEvent.Type = AuditLogTypes.AddonSubscriptionModified; + auditEvent.After = model.Quantity.ToString(); + auditEvent.Successful = true; + auditEvent.IpAddress = IpAddressHelper.GetRequestIP(Request, true); + auditEvent.ServerName = Environment.MachineName; + auditEvent.UserAgent = $"{Request.Headers["User-Agent"]} {Request.Headers["Accept-Language"]}"; + _eventAggregator.SendMessage(auditEvent); + + var result = await _subscriptionsService.ModifyPaddlePTTAddonSubscriptionAsync(paddleCustomer, model.Quantity, addonPlan); + + if (result) + return RedirectToAction("PaymentComplete", "Subscription", new { Area = "User", planId = 0 }); + else + return RedirectToAction("PaymentFailed", "Subscription", new { Area = "User", chargeId = "", errorMessage = "Unknown Error" }); + } + catch (Exception ex) + { + Logging.SendExceptionEmail(ex, "ManagePaddlePTTAddon", DepartmentId, UserName); + + return RedirectToAction("PaymentFailed", "Subscription", + new { Area = "User", chargeId = "", errorMessage = ex.Message }); + } + } + //[AuthorizeUpdate] public async Task CancelSuccess() { diff --git a/Web/Resgrid.Web/Areas/User/Models/EditProfileModel.cs b/Web/Resgrid.Web/Areas/User/Models/EditProfileModel.cs index 09de48ae..81a2be1e 100644 --- a/Web/Resgrid.Web/Areas/User/Models/EditProfileModel.cs +++ b/Web/Resgrid.Web/Areas/User/Models/EditProfileModel.cs @@ -119,5 +119,7 @@ public class EditProfileModel: BaseUserModel /// True when the profile belongs to the currently authenticated user (only own profile can self-verify). /// Checks both and because different controller paths set one or the other. public bool CanSelfVerify => Self || IsOwnProfile; + + public GdprDataExportRequest ActiveDataExportRequest { get; set; } } } diff --git a/Web/Resgrid.Web/Areas/User/Models/Subscription/SelectRegistrationPlanView.cs b/Web/Resgrid.Web/Areas/User/Models/Subscription/SelectRegistrationPlanView.cs new file mode 100644 index 00000000..dfab5b0e --- /dev/null +++ b/Web/Resgrid.Web/Areas/User/Models/Subscription/SelectRegistrationPlanView.cs @@ -0,0 +1,12 @@ +namespace Resgrid.Web.Areas.User.Models.Subscription +{ + public class SelectRegistrationPlanView + { + public string StripeKey { get; set; } + public int DepartmentId { get; set; } + public string PaddleEnvironment { get; set; } + public bool IsPaddleDepartment { get; set; } + public string PaddleClientToken { get; set; } + public string DiscountCode { get; set; } + } +} diff --git a/Web/Resgrid.Web/Areas/User/Models/Subscription/SubscriptionView.cs b/Web/Resgrid.Web/Areas/User/Models/Subscription/SubscriptionView.cs index d928eab1..d6c767e5 100644 --- a/Web/Resgrid.Web/Areas/User/Models/Subscription/SubscriptionView.cs +++ b/Web/Resgrid.Web/Areas/User/Models/Subscription/SubscriptionView.cs @@ -43,6 +43,11 @@ public class SubscriptionView : BaseUserModel public DateTime? AddonEndingOn { get; set; } public string StripeCustomerPortalUrl { get; set; } + public string PaddleCustomer { get; set; } + public string PaddleEnvironment { get; set; } + public bool IsPaddleDepartment { get; set; } + public string PaddleClientToken { get; set; } + public string IsEntitiesTabActive() { diff --git a/Web/Resgrid.Web/Areas/User/Views/Forms/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Forms/Index.cshtml index d5d76749..b3ac39da 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Forms/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Forms/Index.cshtml @@ -1,19 +1,20 @@ -@using Resgrid.Model +@using Resgrid.Model @using Resgrid.Web.Helpers @model Resgrid.WebCore.Areas.User.Models.Forms.FormIndexModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Forms"; + ViewBag.Title = "Resgrid | " + localizer["PageTitle"]; }
-

Forms

+

@localizer["FormsHeading"]

@@ -21,7 +22,7 @@ { } @@ -37,19 +38,19 @@ - Name + @commonLocalizer["Name"] - Type + @commonLocalizer["Type"] - Active + @localizer["ActiveColumn"] - Created On + @commonLocalizer["CreatedOn"] - Action + @commonLocalizer["Action"] @@ -63,17 +64,17 @@ @if (t.Type == 0) { - New Call Form + @localizer["NewCallFormType"] } @if (t.IsActive) { - Yes + @commonLocalizer["Yes"] } else { - No + @commonLocalizer["No"] } @@ -82,19 +83,19 @@ - View + @localizer["ViewButton"] @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { if (t.IsActive) { - Disable + @localizer["DisableButton"] } else { - Enable + @localizer["EnableButton"] } - Delete + @commonLocalizer["Delete"] } @@ -111,7 +112,7 @@
- You can only have 1 New Call Form type active at a time. + @localizer["OneActiveFormWarning"]
diff --git a/Web/Resgrid.Web/Areas/User/Views/Forms/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Forms/New.cshtml index 1f345b60..9a3d95cd 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Forms/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Forms/New.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Model +@using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Forms.NewFormModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Form"; + ViewBag.Title = "Resgrid | " + localizer["NewFormPageTitle"]; }
-

New Form

+

@localizer["NewFormHeading"]

@@ -44,7 +45,7 @@
@Html.TextBoxFor(m => m.FormName, new { @class = "form-control", autofocus = "autofocus" }) @@ -52,7 +53,7 @@
@Html.DropDownListFor(m => m.FormType, Model.FormTypes) @@ -60,7 +61,7 @@
@@ -68,11 +69,11 @@
-
You will need to match the field names specificed above with the fields you want to operate on. Leave the field value blank for any value.
+
@localizer["CallAutomationsDescription"]
@@ -80,14 +81,14 @@ - Field Name + @localizer["FieldNameColumn"] - Field Value + @localizer["FieldValueColumn"] - Operation + @localizer["OperationColumn"] - Call Value - Add Automation + @localizer["CallValueColumn"] + @localizer["AddAutomationButton"] @@ -98,8 +99,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Forms/View.cshtml b/Web/Resgrid.Web/Areas/User/Views/Forms/View.cshtml index 524453e1..43a6eb88 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Forms/View.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Forms/View.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Model +@using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Forms.ViewFormModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | View Form"; + ViewBag.Title = "Resgrid | " + localizer["ViewFormPageTitle"]; }
-

View Form

+

@localizer["ViewFormHeading"]

@@ -29,7 +30,7 @@
@Model.Form.Name @@ -37,18 +38,18 @@
@if (Model.Form.Type == 0) { - New Call Form + @localizer["NewCallFormType"] }
diff --git a/Web/Resgrid.Web/Areas/User/Views/Groups/DeleteGroup.cshtml b/Web/Resgrid.Web/Areas/User/Views/Groups/DeleteGroup.cshtml index 2b22c92b..718483bc 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Groups/DeleteGroup.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Groups/DeleteGroup.cshtml @@ -1,20 +1,21 @@ -@model Resgrid.Web.Areas.User.Models.Groups.DeleteGroupView +@model Resgrid.Web.Areas.User.Models.Groups.DeleteGroupView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Delete Group"; + ViewBag.Title = "Resgrid | " + localizer["DeleteGroupPageTitle"]; }
-

Delete Group

+

@localizer["DeleteGroupHeading"]

@@ -33,18 +34,18 @@
- Are you sure you want to delete this group? If you choose to delete this group the groups information, for example dispatch and message addresses will be removed with the group and won't be able to be used again. + @localizer["DeleteGroupConfirmQuestion"] @localizer["DeleteGroupWarning"]
@if (Model.UserCount > 0) {
- This group has active users underneath it, you must move or delete the users to be able to delete the group. + @localizer["DeleteGroupActiveUsersWarning"]
} @@ -52,7 +53,7 @@ {
- This group has child groups under it. You will need to move or delete the child group before deleting the group. + @localizer["DeleteGroupChildGroupsWarning"]
} @@ -60,7 +61,7 @@ {
- >This group has units assigned to it. You will need to move the unit to another Station Group or delete the unit to be able to delete the group. + @localizer["DeleteGroupUnitsWarning"]
} @@ -68,7 +69,7 @@ {
- This group has shift groups assigned to it. You will need to remove those shift groups, Shifts assigned to a Station\Group, to be able to delete the group. + @localizer["DeleteGroupShiftsWarning"]
} @@ -76,24 +77,24 @@ {
- Click the checkbox below to delete this group. + @localizer["DeleteGroupCheckboxHint"]
- If you choose to delete this group the information below will be permanently deleted. This operation cannot be undone. + @localizer["DeleteGroupPermanentWarning"]

- Data that is Deleted + @localizer["DeleteGroupDataDeleted"]
    -
  • Group Data
  • -
  • Personnel Group Memberships
  • -
  • Unit Group Memberships
  • -
  • Group Inventory
  • -
  • Group Shift Data
  • +
  • @localizer["DeleteGroupDataGroupData"]
  • +
  • @localizer["DeleteGroupDataPersonnelMemberships"]
  • +
  • @localizer["DeleteGroupDataUnitMemberships"]
  • +
  • @localizer["DeleteGroupDataInventory"]
  • +
  • @localizer["DeleteGroupDataShiftData"]
- +
@@ -101,8 +102,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
} diff --git a/Web/Resgrid.Web/Areas/User/Views/Groups/EditGroup.cshtml b/Web/Resgrid.Web/Areas/User/Views/Groups/EditGroup.cshtml index 7fbeb6f5..f4d5e388 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Groups/EditGroup.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Groups/EditGroup.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Model +@using Resgrid.Model @model Resgrid.Web.Areas.User.Models.Groups.EditGroupView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Edit Group"; + ViewBag.Title = "Resgrid | " + localizer["EditGroupPageTitle"]; }
-

Edit Group

+

@localizer["EditGroupHeading"]

@@ -43,54 +44,54 @@ }
- +
- + @if (Model.EditGroup.Type.HasValue && Model.EditGroup.Type.Value == (int)DepartmentGroupTypes.Station) { - + } else { - + }
- + @if (Model.EditGroup.Type.HasValue && Model.EditGroup.Type.Value == (int)DepartmentGroupTypes.Station) { - + } else { - + }
- +
- +
@Html.DropDownListFor(m => m.EditGroup.ParentDepartmentGroupId, Model.StationGroups)
- Station groups require a physical location (as personnel and units can respond to them). Please enter an Address or GPS Coordinates or a what3words address. + @localizer["StationAddressDescription"] what3words address.
@Html.TextBoxFor(m => m.Address1, new { @class = "form-control" }) @@ -98,7 +99,7 @@
@Html.TextBoxFor(m => m.City, new { @class = "form-control" }) @@ -106,7 +107,7 @@
@Html.TextBoxFor(m => m.State, new { @class = "form-control" }) @@ -114,7 +115,7 @@
@Html.TextBoxFor(m => m.PostalCode, new { @class = "form-control" }) @@ -122,41 +123,41 @@
@Html.DropDownListFor(m => m.Country, new SelectList(Countries.CountryNames), new { @class = "form-control", style = "width: 300px" })
-

Or

+

@localizer["Or"]

@Html.TextBoxFor(m => m.Latitude, new { @class = "form-control" }) - Latitude (Decimal Notation: i.e. 39.1517) + @localizer["LatitudeHint"]
@Html.TextBoxFor(m => m.Longitude, new { @class = "form-control" }) - Longitude (Decimal Notation: i.e. -119.4571) + @localizer["LongitudeHint"]
-

Or

+

@localizer["Or"]

@Html.TextBoxFor(m => m.What3Word, new { @class = "form-control", @style = "width:250px;", autocomplete = "off", placeholder = "what.three.words", tabindex = "8" }) - w3w Address (i.e. humble.echo.sticky) + @localizer["What3WordsHint"]
@@ -165,17 +166,17 @@
-

PrintNode is a service that allows us to submit print jobs to a local computer or server on your network to a specific printer. You must have an active PrintNode account and it's software setup with the printer active.

+

PrintNode @localizer["PrintNodeDescription"]

@@ -186,24 +187,24 @@
- +
- Enabling this option will print a call to the selected Printer when a unit or person from this group is attached (dispatched) to a call + @localizer["PrintCallsToPrinterHint"]
-

Users can only be in one group at a time. If you don't see your user in the list they are already in a group.

+

@localizer["UsersOneGroupNote"]

@@ -213,7 +214,7 @@
@@ -222,8 +223,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
@@ -238,20 +239,20 @@
diff --git a/Web/Resgrid.Web/Areas/User/Views/Groups/Geofence.cshtml b/Web/Resgrid.Web/Areas/User/Views/Groups/Geofence.cshtml index 11ec06ac..464d1182 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Groups/Geofence.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Groups/Geofence.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.Web.Areas.User.Models.Groups.GeofenceView +@model Resgrid.Web.Areas.User.Models.Groups.GeofenceView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Geofence Station"; + ViewBag.Title = "Resgrid | " + localizer["GeofencePageTitle"]; } @section Styles { @@ -11,17 +12,17 @@

- GeoFence Station + @localizer["GeofenceHeading"]

@@ -34,7 +35,7 @@
-

Below you can create a geofence for your station. Fields in blue italics are required. Geofences allow you to create a boundary on the map that is this stations response area. This will be used to automatically route calls and determine responses. To create the Geofence first click on the map to create your start point then click again to draw a line, keep drawing lines until you have encircled the response area.

+

@localizer["GeofenceDescription"]

@@ -43,22 +44,22 @@
- +
@Model.Group.Name
- +
@Html.TextBoxFor(m => m.Group.GeofenceColor, new { @class = "form-control", id = "colorPicker" })
- +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Groups/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Groups/Index.cshtml index 11a529cf..c39378fc 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Groups/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Groups/Index.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Model +@using Resgrid.Model @using Resgrid.Web.Helpers @model Resgrid.Web.Areas.User.Models.Groups.DepartmentGroupsModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Department Groups"; + ViewBag.Title = "Resgrid | " + localizer["IndexPageTitle"]; }

-

Groups

+

@localizer["GroupsHeading"]

@@ -26,12 +27,12 @@
-
Groups
+
@localizer["GroupsHeading"]
@if (Model.CanAddNewGroup) { }
@@ -42,22 +43,22 @@ - Group Name + @localizer["GroupName"] - Type + @commonLocalizer["Type"] - Parent + @localizer["Parent"] - Dispatch Email + @localizer["DispatchEmail"] - Message Email + @localizer["MessageEmail"] - Members + @localizer["Members"] @@ -73,17 +74,17 @@ @if (g.Type == null || g.Type == (int)DepartmentGroupTypes.Orginizational) { - @Html.Raw("Organizational") + @Html.Raw(localizer["Organizational"].Value) } else { - @Html.Raw("Station") + @Html.Raw(localizer["Station"].Value) } @if (g.Parent == null) { - @Html.Raw("None") + @Html.Raw(localizer["None"].Value) } else { @@ -102,13 +103,13 @@ @if (ClaimsAuthorizationHelper.IsUserDepartmentOrGroupAdmin(g.DepartmentGroupId)) { - Edit + @commonLocalizer["Edit"] @if (g.Type == (int)DepartmentGroupTypes.Station) { - Geofence + @localizer["Geofence"] } - Delete + @commonLocalizer["Delete"] } diff --git a/Web/Resgrid.Web/Areas/User/Views/Groups/NewGroup.cshtml b/Web/Resgrid.Web/Areas/User/Views/Groups/NewGroup.cshtml index 99c11e11..b30f03df 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Groups/NewGroup.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Groups/NewGroup.cshtml @@ -1,22 +1,23 @@ - + @using Resgrid.Model @model Resgrid.Web.Areas.User.Models.Groups.NewGroupView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Group"; + ViewBag.Title = "Resgrid | " + localizer["NewGroupPageTitle"]; }
-

New Group

+

@localizer["NewGroupHeading"]

@@ -42,40 +43,40 @@ @Html.HiddenFor(m => m.PrinterApiKey)
- +
- - + +
- - + +
- +
- +
@Html.DropDownListFor(m => m.NewGroup.ParentDepartmentGroupId, Model.StationGroups)
- Station groups require a physical location (as personnel and units can respond to them). Please enter an Address or GPS Coordinates or a what3words address. + @localizer["StationAddressDescription"] what3words address.
@Html.TextBoxFor(m => m.Address1, new { @class = "form-control" }) @@ -83,7 +84,7 @@
@Html.TextBoxFor(m => m.City, new { @class = "form-control" }) @@ -91,7 +92,7 @@
@Html.TextBoxFor(m => m.State, new { @class = "form-control" }) @@ -99,7 +100,7 @@
@Html.TextBoxFor(m => m.PostalCode, new { @class = "form-control" }) @@ -107,41 +108,41 @@
@Html.DropDownListFor(m => m.Country, new SelectList(Countries.CountryNames), new { @class = "form-control", style = "width: 300px" })
-

Or

+

@localizer["Or"]

@Html.TextBoxFor(m => m.Latitude, new { @class = "form-control" }) - Latitude (Decimal Notation: i.e. 39.1517) + @localizer["LatitudeHint"]
@Html.TextBoxFor(m => m.Longitude, new { @class = "form-control" }) - Longitude (Decimal Notation: i.e. -119.4571) + @localizer["LongitudeHint"]
-

Or

+

@localizer["Or"]

@Html.TextBoxFor(m => m.What3Word, new { @class = "form-control", @style = "width:250px;", autocomplete = "off", placeholder = "what.three.words", tabindex = "8" }) - w3w Address (i.e. humble.echo.sticky) + @localizer["What3WordsHint"]
@@ -150,17 +151,17 @@
-

PrintNode is a service that allows us to submit print jobs to a local computer or server on your network to a specific printer. You must have an active PrintNode account and it's software setup with the printer active.

+

PrintNode @localizer["PrintNodeDescription"]

@@ -172,12 +173,12 @@
-

Users can only be in one group at a time. If you don't see your user in the list they are already in a group.

+

@localizer["UsersOneGroupNote"]

@@ -187,7 +188,7 @@
@@ -196,8 +197,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
@@ -212,20 +213,20 @@
diff --git a/Web/Resgrid.Web/Areas/User/Views/Home/EditUserProfile.cshtml b/Web/Resgrid.Web/Areas/User/Views/Home/EditUserProfile.cshtml index beefa98f..aa08064d 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Home/EditUserProfile.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Home/EditUserProfile.cshtml @@ -713,6 +713,58 @@
@if (Model.IsOwnProfile) + { + @if (TempData["GdprSuccess"] != null) + { +
+ +

@TempData["GdprSuccess"]

+
+ } + @if (TempData["GdprError"] != null) + { +
+ +

@TempData["GdprError"]

+
+ } +
+
+
Your Personal Data (GDPR)
+
+
+
+
+

You can request a copy of all your personal data stored in Resgrid. The export will be prepared in the background and you will receive an email with a download link when it is ready (usually within 5 minutes).

+
+
+ @if (Model.ActiveDataExportRequest != null) + { +
+ Request Status: + @{ + var statusName = ((Resgrid.Model.GdprExportStatus)Model.ActiveDataExportRequest.Status).ToString(); + } + @statusName + — Requested on @Model.ActiveDataExportRequest.RequestedOn.ToString("f") + @if (Model.ActiveDataExportRequest.Status == 2 && Model.ActiveDataExportRequest.TokenExpiresAt.HasValue) + { + — Download link expires @Model.ActiveDataExportRequest.TokenExpiresAt.Value.ToString("f") + } +
+ } + else + { +
+
+ +
+
+ } +
+
+ } + @if (Model.IsOwnProfile) {
@@ -737,6 +789,30 @@
+@if (Model.IsOwnProfile) +{ + +} diff --git a/Web/Resgrid.Web/Areas/User/Views/Links/Enable.cshtml b/Web/Resgrid.Web/Areas/User/Views/Links/Enable.cshtml index 988e425d..0e5529db 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Links/Enable.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Links/Enable.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.WebCore.Areas.User.Models.Links.NewLinksView +@model Resgrid.WebCore.Areas.User.Models.Links.NewLinksView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Enable Department Link"; + ViewBag.Title = "Resgrid | " + localizer["EnableDepartmentLinkTitle"]; } @section Styles @@ -14,16 +15,16 @@
-

Enable Department Link

+

@localizer["EnableDepartmentLinkTitle"]

@@ -39,7 +40,7 @@
- Department Links are sharing data in one direction. Below is where you can enable a link and set it's link color. The link color will be used to color calls, personnel and units that will identify them as originating from this link. + @localizer["EnableLinkDescription"]
@if (!String.IsNullOrEmpty(Model.Message)) { @@ -54,14 +55,14 @@
- +
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Links/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Links/Index.cshtml index e1d1e71d..b2f1fc66 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Links/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Links/Index.cshtml @@ -1,22 +1,23 @@ -@using Resgrid.Framework +@using Resgrid.Framework @using Resgrid.Model @using Resgrid.Model.Events @using Resgrid.Web.Extensions @using Resgrid.Web.Helpers @model Resgrid.WebCore.Areas.User.Models.Links.LinksIndexView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Department Links"; + ViewBag.Title = "Resgrid | " + localizer["PageTitle"]; }
-

Department Links

+

@localizer["DepartmentLinks"]

@@ -24,7 +25,7 @@ { } @@ -47,12 +48,12 @@ - + - - - - + + + + @@ -78,11 +79,11 @@ @@ -194,7 +195,7 @@
- Your Department Link Code + @localizer["YourDepartmentLinkCode"]
@Model.Code
diff --git a/Web/Resgrid.Web/Areas/User/Views/Links/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Links/New.cshtml index c65612a8..5ce2707e 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Links/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Links/New.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.WebCore.Areas.User.Models.Links.NewLinksView +@model Resgrid.WebCore.Areas.User.Models.Links.NewLinksView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Department Link"; + ViewBag.Title = "Resgrid | " + localizer["NewDepartmentLinkTitle"]; } @section Styles @@ -14,16 +15,16 @@
-

New Department Link

+

@localizer["NewDepartmentLinkTitle"]

@@ -39,7 +40,7 @@
- Department Links are sharing data in one direction. Below you can setup and share with another department and once they enable the link they can view the information you shared. For your department to see that departments data they need to create a link to your department and you need to enable it. + @localizer["NewLinkDescription"]
@if (!String.IsNullOrEmpty(Model.Message)) { @@ -53,31 +54,31 @@
- +
- +
- This is the color that will be applied to identify Calls\Units\Personnel for this department link + @localizer["TypeColorHelp"]
- +
- +
@@ -85,7 +86,7 @@
@@ -94,8 +95,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Links/View.cshtml b/Web/Resgrid.Web/Areas/User/Views/Links/View.cshtml index 38061e7d..7bb05fcb 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Links/View.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Links/View.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.WebCore.Areas.User.Models.Links.LinkDataView +@model Resgrid.WebCore.Areas.User.Models.Links.LinkDataView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | View Department Link"; + ViewBag.Title = "Resgrid | " + localizer["ViewDepartmentLinkTitle"]; } @section Styles @@ -14,16 +15,16 @@
-

View Department Link

+

@localizer["ViewDepartmentLinkTitle"]

@@ -34,7 +35,7 @@
-
Calls
+
@localizer["Calls"]
@@ -47,7 +48,7 @@
-
Units
+
@localizer["Units"]
@@ -60,7 +61,7 @@
-
Personnel
+
@localizer["Personnel"]
diff --git a/Web/Resgrid.Web/Areas/User/Views/Notifications/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Notifications/Index.cshtml index f8aa9ae1..e8161394 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Notifications/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Notifications/Index.cshtml @@ -1,22 +1,23 @@ -@using Resgrid.Framework +@using Resgrid.Framework @using Resgrid.Model @using Resgrid.Model.Events @using Resgrid.Web.Extensions @using Resgrid.Web.Helpers @model Resgrid.Web.Areas.User.Models.Notifications.NotificationIndexView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Notifications"; + ViewBag.Title = "Resgrid | " + localizer["PageTitle"]; }
-

Notifications

+

@localizer["Notifications"]

@@ -24,7 +25,7 @@ { } @@ -39,12 +40,12 @@
From Department@localizer["FromDepartment"] To DepartmentEnabledShared DataActions@localizer["ToDepartment"]@localizer["Enabled"]@localizer["SharedData"]@commonLocalizer["Actions"]
@if (l.LinkEnabled) { - Link Enabled + @localizer["LinkEnabled"] } else { - Link Disabled + @localizer["LinkDisabled"] } @@ -93,11 +94,11 @@ { if (data.Length <= 0) { - data = "Calls"; + data = localizer["Calls"]; } else { - data = data + ",Calls"; + data = data + "," + localizer["Calls"]; } } @@ -105,11 +106,11 @@ { if (data.Length <= 0) { - data = "Personnel"; + data = localizer["Personnel"]; } else { - data = data + ",Personnel"; + data = data + "," + localizer["Personnel"]; } } @@ -117,11 +118,11 @@ { if (data.Length <= 0) { - data = "Units"; + data = localizer["Units"]; } else { - data = data + ",Units"; + data = data + "," + localizer["Units"]; } } @@ -129,11 +130,11 @@ { if (data.Length <= 0) { - data = "Orders"; + data = localizer["Orders"]; } else { - data = data + ",Orders"; + data = data + "," + localizer["Orders"]; } } } @@ -144,27 +145,27 @@ } else { - No Data Shared + @localizer["NoDataShared"] } @if (l.DepartmentId != Model.DepartmentId && l.LinkEnabled == false && ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { - Enable + @localizer["Enable"] } else if (l.DepartmentId != Model.DepartmentId && l.LinkEnabled && ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { - Disable + @localizer["Disable"] } @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { - - Delete + + @localizer["Delete"] } @@ -172,7 +173,7 @@ @if (l.DepartmentId != Model.DepartmentId && l.LinkEnabled) { - View Data + @localizer["ViewData"] }
- - - - - - + + + + + + @@ -62,7 +63,7 @@ } else { - None + @localizer["None"] } @@ -94,4 +95,4 @@ @section Scripts { -} \ No newline at end of file +} diff --git a/Web/Resgrid.Web/Areas/User/Views/Notifications/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Notifications/New.cshtml index 7abd930c..e983fdbe 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Notifications/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Notifications/New.cshtml @@ -1,6 +1,7 @@ -@model Resgrid.Web.Areas.User.Models.Notifications.NotificationNewView +@model Resgrid.Web.Areas.User.Models.Notifications.NotificationNewView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Notification"; + ViewBag.Title = "Resgrid | " + localizer["NewNotification"]; } @section Styles @@ -14,16 +15,16 @@
-

New Notification

+

@localizer["NewNotification"]

@@ -48,24 +49,24 @@
- +
- +
- +
- +
@@ -43,108 +44,108 @@
- +
- +
- The time that the order needs filled by, depending on the order type it may be automatically closed at this time. + @localizer["CloseOrderOnHelp"]
- +
- +
- +
- +
- +
- +
- +
@@ -154,54 +155,54 @@
- +
- +
- Allow a department to partially fill a resource order item (this allows multiple units from multiple departments to fill an item) + @localizer["AllowPartialFillsHelp"]
- +
- The system will automatically accept fills (partial based on the Allow Partial Fills setting) on first come first service + @localizer["AutoAcceptFillsHelp"]
-
Click the green "Add" button to add items to this order, items are groups of similar units you wish to be a part of the order.
+
@localizer["OrderItemsHelp"]
TypeDataBefore StateCurrent StateNotifyActions@commonLocalizer["Type"]@commonLocalizer["Data"]@localizer["BeforeState"]@localizer["CurrentState"]@localizer["Notify"]@commonLocalizer["Actions"]
@@ -77,7 +78,7 @@ @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { - Delete + @localizer["Delete"] }
@if (order.CloseDate.HasValue) { - Closed + @localizer["ClosedLabel"] } else { if (order.IsFilled()) { - Filled + @localizer["FilledLabel"] } else { - Open + @localizer["OpenLabel"] } } @order.Title
- Created @order.OpenDate.TimeConverterToString(Model.Department) + @localizer["CreatedLabel"] @order.OpenDate.TimeConverterToString(Model.Department)
- Fill Percentage: @order.FilledPrecentage()% + @localizer["FillPercentageLabel"]: @order.FilledPrecentage()%
- View + @localizer["ViewButton"]
@if (order.CloseDate.HasValue) { - Closed + @localizer["ClosedLabel"] } else { if (order.IsFilled()) { - Filled + @localizer["FilledLabel"] } else { - Open + @localizer["OpenLabel"] } } @order.Title
- Created @order.OpenDate.TimeConverterToString(Model.Department) + @localizer["CreatedLabel"] @order.OpenDate.TimeConverterToString(Model.Department)
@order.Department.Name
- Location @order.IncidentAddress + @localizer["LocationLabel"] @order.IncidentAddress
- Distance + @localizer["DistanceLabel"]
@order.GetDistanceTo(Model.Coordinates.Latitude.Value, Model.Coordinates.Longitude.Value) mi
- Fill Percentage: @order.FilledPrecentage()% + @localizer["FillPercentageLabel"]: @order.FilledPrecentage()%
- View + @localizer["ViewButton"]
- - - - - - - + + + + + + + @@ -213,8 +214,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Orders/Settings.cshtml b/Web/Resgrid.Web/Areas/User/Views/Orders/Settings.cshtml index 2f8d87e4..10946a48 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Orders/Settings.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Orders/Settings.cshtml @@ -1,19 +1,20 @@ -@using Resgrid.Model +@using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Orders.OrderSetttingsView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Resource Order Settings"; + ViewBag.Title = "Resgrid | " + localizer["OrderSettingsHeader"]; }
-

Resource Order Settings

+

@localizer["OrderSettingsHeader"]

@@ -30,7 +31,7 @@
- +
@@ -39,26 +40,26 @@
- +
@Html.DropDownListFor(m => m.Settings.Visibility, Model.OrderVisibilities, new { style = "width: 250px" })
- +
- +
@@ -67,19 +68,19 @@
- +
@Html.DropDownListFor(m => m.Settings.AllowedStaffingLevelToReceiveNotifications, Model.StaffingLevels, new { style = "width: 250px" })
- +
- +
@@ -88,7 +89,7 @@
- +
@@ -97,7 +98,7 @@
- +
@@ -107,8 +108,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
@@ -121,4 +122,4 @@ @section Scripts { -} \ No newline at end of file +} diff --git a/Web/Resgrid.Web/Areas/User/Views/Orders/View.cshtml b/Web/Resgrid.Web/Areas/User/Views/Orders/View.cshtml index 2a72e176..8dd777a6 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Orders/View.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Orders/View.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Model +@using Resgrid.Model @model Resgrid.Web.Areas.User.Models.Orders.ViewOrderView +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | View Order"; + ViewBag.Title = "Resgrid | " + localizer["ViewOrderHeader"]; }
-

View Order

+

@localizer["ViewOrderHeader"]

@@ -31,26 +32,26 @@
@if (Model.Department.DepartmentId != Model.Order.DepartmentId && !Model.Order.IsFilled()) { - Request To Fill Order + @localizer["RequestToFillButton"] }

@Model.Order.Title

-
Status:
+
@localizer["StatusLabel"]
@if (Model.Order.CloseDate.HasValue) { - Closed + @localizer["ClosedLabel"] } else { if (Model.Order.IsFilled()) { - Filled + @localizer["FilledLabel"] } else { - Open + @localizer["OpenLabel"] } }
@@ -60,25 +61,25 @@
-
Created by:
+
@localizer["CreatedByLabel"]
@Model.Order.Department.Name
-
Incident:
+
@localizer["IncidentLabel"]
@Model.Order.IncidentName
-
Number\ID:
+
@localizer["NumberIdLabel"]
@Model.Order.IncidentNumber
-
Finance Code:
+
@localizer["FinanceCodeDtLabel"]
@Model.Order.FinancialCode
-
Last Updated:
+
@localizer["LastUpdatedLabel"]
@Model.Order.OpenDate.TimeConverterToString(Model.Department)
-
Created:
+
@localizer["CreatedDtLabel"]
@Model.Order.OpenDate.TimeConverterToString(Model.Department)
-
Contact Name:
+
@localizer["ContactNameDtLabel"]
@Model.Order.ContactName
-
Contact Number:
+
@localizer["ContactNumberDtLabel"]
@Model.Order.ContactNumber
@@ -86,12 +87,12 @@
-
Fill:
+
@localizer["FillDtLabel"]
- This resource order is @Model.Order.FilledPrecentage()% filled. + @localizer["FillPercentageText"] @Model.Order.FilledPrecentage()% @localizer["FillPercentageText2"]
@@ -102,7 +103,7 @@ @@ -115,25 +116,25 @@
-
Resource:
+
@localizer["ResourceDtLabel"]
@item.Resource
-
Requirements:
+
@localizer["RequirementsDtLabel"]
@item.Requirements
-
Min:
+
@localizer["MinDtLabel"]
@item.Min
-
Max:
+
@localizer["MaxDtLabel"]
@item.Max
@@ -141,12 +142,12 @@
ResourceMinMaxFinancial CodeSpecial NeedsRequirementsAdd@localizer["ResourceColumn"]@localizer["MinColumn"]@localizer["MaxColumn"]@localizer["FinancialCodeColumn"]@localizer["SpecialNeedsColumn"]@localizer["RequirementsColumn"]@localizer["AddButton"]
- - - - - - + + + + + + @@ -157,15 +158,15 @@ @@ -212,32 +213,32 @@
-

Order Summary

+

@localizer["OrderSummaryHeader"]

@Model.Order.Summary

-

Special Instructions

+

@localizer["SpecialInstructionsHeader"]

@Model.Order.SpecialInstructions

-

Incident Address

+

@localizer["IncidentAddressHeader"]

@Model.Order.IncidentAddress

-

Meetup

+

@localizer["MeetupHeader"]

-
Location:
+
@localizer["MeetupLocationDtLabel"]
@Model.Order.MeetupLocation
-
Date:
+
@localizer["MeetupDateDtLabel"]
@if (Model.Order.MeetupDate.HasValue) {
@Model.Order.MeetupDate.Value.TimeConverterToString(Model.Department)
} else { -
Not Supplied
+
@localizer["NotSuppliedLabel"]
}
@@ -246,5 +247,5 @@ @section Scripts { - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/Protocols/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Protocols/Index.cshtml index 2f5b6e0c..e7139374 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Protocols/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Protocols/Index.cshtml @@ -1,19 +1,20 @@ -@using Resgrid.Model +@using Resgrid.Model @using Resgrid.Web.Helpers @model Resgrid.WebCore.Areas.User.Models.Protocols.ProtocolIndexModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Protocols"; + ViewBag.Title = "Resgrid | " + localizer["ProtocolsHeader"]; }
-

Protocols

+

@localizer["ProtocolsHeader"]

@@ -21,7 +22,7 @@ { } @@ -37,16 +38,16 @@
@@ -58,7 +59,7 @@ @t.Name diff --git a/Web/Resgrid.Web/Areas/User/Views/Protocols/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Protocols/New.cshtml index e2f8c2a1..53fc209f 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Protocols/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Protocols/New.cshtml @@ -1,21 +1,22 @@ -@using Resgrid.Model +@using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Protocols.NewProtocolModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Protocol"; + ViewBag.Title = "Resgrid | " + localizer["NewProtocolHeader"]; }
-

New Protocol

+

@localizer["NewProtocolHeader"]

@@ -45,7 +46,7 @@
@@ -56,7 +57,7 @@
@@ -66,7 +67,7 @@
@@ -80,7 +81,7 @@
@@ -94,7 +95,7 @@
@@ -104,7 +105,7 @@
@@ -114,23 +115,23 @@
-
Triggers are used to determine when this protocol will be activated, or will ask the questions below, for calls
+
@localizer["TriggersHelp"]
StatusDepartmentTimestampContactNoteUnits@commonLocalizer["Status"]@localizer["DepartmentColumn"]@localizer["TimestampColumn"]@localizer["ContactColumn"]@localizer["NoteColumn"]@localizer["UnitsColumn"]
@if (fill.Accepted) { - Accepted + @localizer["AcceptedLabel"] } else if (Model.Order.CloseDate.HasValue) { - Not Accepted + @localizer["NotAcceptedLabel"] } else { - Pending + @localizer["PendingLabel"] } @@ -191,7 +192,7 @@ @if (!fill.Accepted && Model.Department.DepartmentId == Model.Order.DepartmentId) { - Accept + @localizer["AcceptButton"] }
- Name + @commonLocalizer["Name"] - Type + @commonLocalizer["Type"] - Created On + @localizer["CreatedOnColumn"] - Action + @commonLocalizer["Action"]
- Dispatch Protocol + @localizer["DispatchProtocolLabel"] @Html.Raw(t.CreatedOn.ToShortDateString()) @@ -66,13 +67,13 @@ - View + @localizer["ViewButton"] @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { - + - Delete + @localizer["DeleteButton"] }
- - - - - - + + + + + + @@ -141,20 +142,20 @@
-
If you only need the triggers to activate the protocol then you do not need to add any questions.
+
@localizer["QuestionsHelp"]
TypeStarts OnEnds OnCall TypeCall Priority Add Trigger@localizer["TriggerTypeColumn"]@localizer["TriggerStartsOnColumn"]@localizer["TriggerEndsOnColumn"]@localizer["TriggerCallTypeColumn"]@localizer["TriggerCallPriorityColumn"] @localizer["AddTriggerButton"]
- - - + + + @@ -166,8 +167,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
@@ -182,35 +183,35 @@ @@ -221,19 +222,19 @@ diff --git a/Web/Resgrid.Web/Areas/User/Views/Protocols/View.cshtml b/Web/Resgrid.Web/Areas/User/Views/Protocols/View.cshtml index e5fa3301..361359d7 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Protocols/View.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Protocols/View.cshtml @@ -1,22 +1,23 @@ -@using Resgrid.Model +@using Resgrid.Model @using Resgrid.Framework @model Resgrid.WebCore.Areas.User.Models.Protocols.ViewProtocolModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | View Protocol"; + ViewBag.Title = "Resgrid | " + localizer["ViewProtocolHeader"]; }
-

View Protocol

+

@localizer["ViewProtocolHeader"]

@@ -33,15 +34,15 @@

@Model.Protocol.Name

-
Status:
+
@localizer["StatusLabel"]
@if (Model.Protocol.IsDisabled == false) { - Active + @localizer["ActiveLabel"] } else { - Disabled + @localizer["DisabledLabel"] }
@@ -50,21 +51,21 @@
-
Code:
+
@localizer["CodeLabel"]
@Model.Protocol.Code
-
Type:
+
@localizer["TypeLabel"]
- Dispatch Protocol + @localizer["DispatchProtocolLabel"]
-
Created By:
+
@localizer["CreatedByLabel"]
@(await UserHelper.GetFullNameForUser(Model.Protocol.CreatedByUserId))
-
Created On:
+
@localizer["CreatedOnLabel"]
@Model.Protocol.CreatedOn.TimeConverterToString(Model.Department)
-
Weight:
+
@localizer["WeightLabel"]
@Model.Protocol.MinimumWeight
@@ -72,7 +73,7 @@
-
Description:
+
@localizer["DescriptionDtLabel"]
@Html.Raw(Model.Protocol.Description)
@@ -82,7 +83,7 @@
-
Protocol Text:
+
@localizer["ProtocolTextDtLabel"]
@Html.Raw(Model.Protocol.ProtocolText)
@@ -95,9 +96,9 @@ @@ -107,11 +108,11 @@
QuestionAnswers Add Question@localizer["QuestionColumn"]@localizer["AnswersColumn"] @localizer["AddQuestionButton"]
- - - - - + + + + + @@ -121,21 +122,21 @@ @@ -181,9 +182,9 @@
TypeStarts OnEnds OnPriorityCall Type@localizer["TriggerTypeColumn"]@localizer["TriggerStartsOnColumn"]@localizer["TriggerEndsOnColumn"]@localizer["TriggerPriorityColumn"]@localizer["TriggerCallTypeColumn"]
@if (t.Type == 0) { - Call Priority + @localizer["CallPriorityTrigger"] } else if (t.Type == 1) { - Call Type + @localizer["CallTypeTrigger"] } else if (t.Type == 2) { - Call Priority & Type + @localizer["CallPriorityAndTypeTrigger"] } @if (!t.StartsOn.HasValue) { - No Start Date + @localizer["NoStartDate"] } else { @@ -145,7 +146,7 @@ @if (!t.EndsOn.HasValue) { - No End Date + @localizer["NoEndDate"] } else { @@ -159,7 +160,7 @@ } else { - N/A + @localizer["NotApplicableLabel"] } @@ -169,7 +170,7 @@ } else { - N/A + @localizer["NotApplicableLabel"] }
- - - + + + @@ -215,8 +216,8 @@
File NameFile TypeSize@localizer["FileNameColumn"]@localizer["FileTypeColumn"]@localizer["SizeColumn"]
- - + + @@ -230,8 +231,8 @@
QuestionAnswers@localizer["QuestionColumn"]@localizer["AnswersColumn"]
- - + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml index 90f800fb..34909678 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogs.cshtml @@ -1,7 +1,9 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.PersonnelStatusHistoryView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -10,9 +12,9 @@ - Personnel Status History Report + @localizer["PersonnelStatusHistoryReportName"] - +
-

Personnel Status History Report

+

@localizer["PersonnelStatusHistoryReportName"]

@Model.Start.FormatForDepartment(Model.Department)-@Model.End.FormatForDepartment(Model.Department)
-

Status Changes

+

@localizer["StatusChanges"]

@@ -63,10 +65,10 @@
WeightAnswer@localizer["WeightColumn"]@localizer["AnswerColumn"]
- - - - + + + + @@ -83,9 +85,9 @@
IDNameGroupTotal@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]@localizer["TotalHeader"]
- - - + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogsParams.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogsParams.cshtml index 9a8e9d2b..b444565b 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogsParams.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/ActionLogsParams.cshtml @@ -1,24 +1,26 @@ -@using Resgrid.Framework +@using Resgrid.Framework @using Resgrid.Model @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Params.PersonnelStaffingHistoryReportParams +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Personnel Status Report Params"; + ViewBag.Title = "Resgrid | " + localizer["PersonnelStatusHistoryReportName"]; }
-

Personnel Status History Report

+

@localizer["PersonnelStatusHistoryReportName"]

@@ -40,15 +42,15 @@
- Group @Html.RadioButtonFor(m => m.GroupSelect, true) or User(s) @Html.RadioButtonFor(m => m.GroupSelect, false) + @localizer["Group"] @Html.RadioButtonFor(m => m.GroupSelect, true) or @localizer["UsersLabel"] @Html.RadioButtonFor(m => m.GroupSelect, false)
@Html.DropDownListFor(m => m.UserId, Model.Users, new { @style = "width: 450px;" }) @@ -56,7 +58,7 @@
@@ -93,7 +95,7 @@ { } @@ -104,10 +106,10 @@
TimestampStatusNote@localizer["TimestampHeader"]@localizer["StatusHeader"]@localizer["NoteHeader"]
- Number + @localizer["NumberHeader"] @callState.Number - Call Name + @localizer["CallNameHeader"] @callState.Name - Type + @localizer["TypeHeader"] @callState.Type - Logged On + @localizer["LoggedOnHeader"] @callState.LoggedOn.FormatForDepartment(Model.Department) - Units + @localizer["UnitsHeader"] @callState.Units.Count() - Personnel + @localizer["PersonnelHeader"] @callState.Personnel.Count()
-

Units on Call

+

@localizer["UnitsOnCallHeader"]

- - - - + + + + @@ -127,7 +129,7 @@ { } @@ -138,11 +140,11 @@
Unit NameDispatched On14 Day Mark21 Day Mark@localizer["UnitNameHeader"]@localizer["DispatchedOnHeader"]@localizer["FourteenDayMarkHeader"]@localizer["TwentyOneDayMarkHeader"]
-

Personnel on Call

+

@localizer["PersonnelOnCallHeader"]

- - - - - + + + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml index 58e6c324..b5d253b7 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReport.cshtml @@ -1,7 +1,9 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Calls.CallSummaryView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -10,9 +12,9 @@ - Call Summary Report + @localizer["CallSummaryReportName"] - +
-

Call Summary Report

+

@localizer["CallSummaryReportName"]

@Model.Start.FormatForDepartment(Model.Department)-@Model.End.FormatForDepartment(Model.Department)
-

Call Types

+

@localizer["CallTypes"]

@@ -62,9 +64,9 @@
Person NameGroup NameDispatched On14 Day Mark21 Day Mark@localizer["PersonNameHeader"]@localizer["GroupNameHeader"]@localizer["DispatchedOnHeader"]@localizer["FourteenDayMarkHeader"]@localizer["TwentyOneDayMarkHeader"]
- - - + + + @@ -99,7 +101,7 @@
-

Call States

+

@localizer["CallStates"]

@@ -107,9 +109,9 @@
TypeCount%@localizer["TypeHeader"]@localizer["CountHeader"]@localizer["PercentHeader"]
- - - + + + @@ -144,7 +146,7 @@
-

Calls

+

@localizer["Calls"]

@@ -152,15 +154,15 @@
StateCount%@localizer["StateHeader"]@localizer["CountHeader"]@localizer["PercentHeader"]
- - - - - - - - - + + + + + + + + + @@ -177,7 +179,7 @@ } else { - + } diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReportParams.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReportParams.cshtml index 42c79823..f5b76274 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReportParams.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/CallSummaryReportParams.cshtml @@ -1,24 +1,26 @@ - + @using Resgrid.Framework @using Resgrid.Model @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Params.PersonnelHoursReportParams +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Call Summary Report Params"; + ViewBag.Title = "Resgrid | " + localizer["CallSummaryReportName"]; }
-

Call Summary Report

+

@localizer["CallSummaryReportName"]

@@ -40,7 +42,7 @@
@Html.TextBoxFor(m => m.Start, new { style = "width:250px;", onkeydown = "javascript:return false;" }) @@ -48,7 +50,7 @@
@Html.TextBoxFor(m => m.End, new { style = "width:250px;", onkeydown = "javascript:return false;" }) @@ -57,8 +59,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/CertificationsReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/CertificationsReport.cshtml index 935a097a..f9618a6d 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/CertificationsReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/CertificationsReport.cshtml @@ -1,4 +1,6 @@ -@model Resgrid.Web.Areas.User.Models.Reports.Certifications.CertificationsReportView +@using Microsoft.Extensions.Localization +@model Resgrid.Web.Areas.User.Models.Reports.Certifications.CertificationsReportView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -7,9 +9,9 @@ - Resgrid Certifications Report + @localizer["CertificationsReportTitle"] - +
-

Resgrid Certifications Report

+

@localizer["CertificationsReportTitle"]

@@ -51,9 +53,9 @@
NumberNameTypeLogged OnClosed OnCall LengthOnScene TimeUnitsPersonnel@localizer["NumberHeader"]@localizer["NameHeader"]@localizer["TypeHeader"]@localizer["LoggedOnHeader"]@localizer["ClosedOnHeader"]@localizer["CallLengthHeader"]@localizer["OnSceneTimeHeader"]@localizer["UnitsHeader"]@localizer["PersonnelHeader"]
Open@localizer["OpenStatus"]@callState.GetCallLength() @callState.GetOnSceneTime()
- - - + + + @@ -70,12 +72,12 @@
IDNameGroup@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]
- - - - - - + + + + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml index ceed41bb..f0035739 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/DepartmentActivityReport.cshtml @@ -1,7 +1,9 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Activity.DepartmentActivityView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -10,9 +12,9 @@ - YTD Department Activity Report + @localizer["YtdDepartmentActivityReportTitle"] - +
-

YTD Department Activity Report

+

@localizer["YtdDepartmentActivityReportTitle"]

-

Calls

+

@localizer["Calls"]

@@ -61,9 +63,9 @@
TypeNameNumberIssued ByAreaExpires@localizer["TypeHeader"]@localizer["NameHeader"]@localizer["CertNumberHeader"]@localizer["IssuedByHeader"]@localizer["AreaHeader"]@localizer["ExpiresHeader"]
- - - + + + @@ -98,7 +100,7 @@
-

Personnel Response Detail

+

@localizer["PersonnelResponseDetail"]

@@ -106,10 +108,10 @@
TypeCount%@localizer["TypeHeader"]@localizer["CountHeader"]@localizer["PercentHeader"]
- - - - + + + + @foreach (var callType in Model.CallTypeCount.OrderBy(x => x.Item1)) { @@ -142,7 +144,7 @@
-

Trainings

+

@localizer["Trainings"]

@@ -158,7 +160,7 @@
IDNameGroupDispatched@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]@localizer["DispatchedHeader"]
- January + @localizer["January"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 1) != null) { @@ -171,7 +173,7 @@ - February + @localizer["February"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 2) != null) { @@ -184,7 +186,7 @@ - March + @localizer["March"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 3) != null) { @@ -199,7 +201,7 @@
- April + @localizer["April"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 4) != null) { @@ -212,7 +214,7 @@ - May + @localizer["May"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 5) != null) { @@ -225,7 +227,7 @@ - June + @localizer["June"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 6) != null) { @@ -240,7 +242,7 @@
- July + @localizer["July"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 7) != null) { @@ -253,7 +255,7 @@ - August + @localizer["August"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 8) != null) { @@ -266,7 +268,7 @@ - September + @localizer["September"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 9) != null) { @@ -281,7 +283,7 @@
- October + @localizer["October"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 10) != null) { @@ -294,7 +296,7 @@ - November + @localizer["November"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 11) != null) { @@ -307,7 +309,7 @@ - December + @localizer["December"] @if (Model.TrainingMonthCount.FirstOrDefault(x => x.Item1 == 12) != null) { @@ -329,7 +331,7 @@
-

Personnel Training Detail

+

@localizer["PersonnelTrainingDetail"]

@@ -337,12 +339,12 @@ - - - - - - + + + + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/Index.cshtml index 0f13455f..c789b160 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/Index.cshtml @@ -1,22 +1,23 @@ -@using Resgrid.Framework +@using Resgrid.Framework @using Resgrid.Model @using Resgrid.Web.Helpers @using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Logs.LogsIndexView @inject IStringLocalizer flaggedReportLocalizer +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Reports"; + ViewBag.Title = "Resgrid | " + localizer["ReportingTitle"]; }
-

Reporting

+

@localizer["ReportingTitle"]

@@ -31,134 +32,134 @@
IDNameGroupTotalAttended%@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]@localizer["TotalHeader"]@localizer["AttendedHeader"]@localizer["PercentHeader"]
- - + + @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) { } @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) @@ -171,7 +172,7 @@ @flaggedReportLocalizer["ReportIndexDescription"] } diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml index bbd1fd36..a08db5b7 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/LogReport.cshtml @@ -1,8 +1,10 @@ -@using Resgrid.Model +@using Resgrid.Model @using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Logs.LogReportView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -11,9 +13,9 @@ - Resgrid Log Report + @localizer["LogReportTitle"] - +
-

Resgrid Log

+

@localizer["LogReportTitle"]

@@ -69,41 +71,41 @@ @if (Model.Log.StationGroup != null) {
} else { } @if (Model.Log.LogType != null) { } else { } @@ -112,7 +114,7 @@ @if (Model.Log.StartedOn.HasValue) { @@ -120,14 +122,14 @@ else { } @if (Model.Log.EndedOn.HasValue) { @@ -135,8 +137,8 @@ else { } @@ -146,13 +148,13 @@
- Personnel + @localizer["PersonnelLabel"]
NameDescription@commonLocalizer["Name"]@commonLocalizer["Description"]
- Personnel Status History Report + @localizer["PersonnelStatusHistoryReportName"] - This report will show all the personnel status (action logs) history supplied by the selected personnel + @localizer["PersonnelStatusHistoryReportDescription"] - View Report + @localizer["ViewReport"]
- Personnel Report + @localizer["PersonnelReportName"] - View all the personnel in your department, their roles and basic contact information. + @localizer["PersonnelReportDescription"] - View Report + @localizer["ViewReport"]
- Staffing Report + @localizer["StaffingReportName"] - View all personnel and their current status, staffing level and next scheduled staffing level change. + @localizer["StaffingReportDescription"] - View Report + @localizer["ViewReport"]
- Certifications Report + @localizer["CertificationsReportName"] - View all the certifications for each person in the department. + @localizer["CertificationsReportDescription"] - View Report + @localizer["ViewReport"]
- Shift Readiness Report + @localizer["ShiftReadinessReportName"] - This report will show shift readiness for the next upcoming shift days for each shift. + @localizer["ShiftReadinessReportDescription"] - View Report + @localizer["ViewReport"]
- Department YTD Activity Report + @localizer["DepartmentActivityReportName"] - This report will show the call, log, training and personnel activity for the department in year to date numbers. + @localizer["DepartmentActivityReportDescription"] - View Report + @localizer["ViewReport"]
- Personnel Log Hours Report + @localizer["PersonnelHoursReportName"] - This report will show the number of hours department personnel worked, trained and responded to calls as recorded via log (after action reports) entries. + @localizer["PersonnelHoursReportDescription"] - View Report + @localizer["ViewReport"]
- Call Summary Report + @localizer["CallSummaryReportName"] - This report will show details about all calls in a selected date range (i.e. call types, close states, etc) + @localizer["CallSummaryReportDescription"] - View Report + @localizer["ViewReport"]
- Personnel Staffing History Report + @localizer["PersonnelStaffingHistoryReportName"] - This report will show all the staffing history supplied by the selected personnel + @localizer["PersonnelStaffingHistoryReportDescription"] - View Report + @localizer["ViewReport"]
- Unit State History Report + @localizer["UnitStateHistoryReportName"] - Shows the Unit States for a single unit, all, or a units in a group for a user defined time range + @localizer["UnitStateHistoryReportDescription"] - View Report + @localizer["ViewReport"]
- Active Calls and Resources Report + @localizer["ActiveCallsResourcesReportName"] - Report details the currently open calls at the time of running the report and any units and personnel currently attached to those calls + @localizer["ActiveCallsResourcesReportDescription"] - View Report + @localizer["ViewReport"]
- View Report + @localizer["ViewReport"]
- District + @localizer["DistrictLabel"] @Model.Log.StationGroup.Name - Department + @localizer["DepartmentLabel"] @Model.Log.Department.Name - Type + @localizer["TypeLabel"] @(((LogTypes)Model.Log.LogType.Value).ToString()) - Type - Work + @localizer["TypeLabel"] + @localizer["WorkLogType"]
- Logged On + @localizer["LoggedOnLabel"] @Model.Log.LoggedOn.TimeConverterToString(Model.Log.Department) - Logged By + @localizer["LoggedByLabel"] @(await UserHelper.GetFullNameForUser(Model.Log.LoggedByUserId)) - Started On + @localizer["StartedOnLabel"] @Model.Log.StartedOn.Value.FormatForDepartment(Model.Log.Department, true) - Started On - Not Supplied + @localizer["StartedOnLabel"] + @localizer["NotSupplied"] - Ended On + @localizer["EndedOnLabel"] @Model.Log.EndedOn.Value.FormatForDepartment(Model.Log.Department, true) - Ended On - Not Supplied + @localizer["EndedOnLabel"] + @localizer["NotSupplied"]
- - - + + + @@ -185,7 +187,7 @@
- Narrative + @localizer["NarrativeLabel"]
@Html.Raw(Model.Log.Narrative)
@@ -204,7 +206,7 @@ style="margin-top: 10px; margin-bottom: 5px;">
-

Resgrid Log

+

@localizer["LogReportTitle"]

@@ -213,47 +215,47 @@
@if (Model.Log.StationGroup != null) { } else { } @if (Model.Log.LogType != null) { } else { } @@ -262,22 +264,22 @@ @if (Model.Log.Call != null) { @@ -285,8 +287,8 @@ else { } @@ -294,15 +296,15 @@ @if (Model.Log.Call != null) { } else { } @@ -313,7 +315,7 @@
- Units + @localizer["UnitsLabel"]
@foreach (var unit in Model.Log.Units) { @@ -321,7 +323,7 @@
@unit.Unit.Name
- Dispatched + @localizer["DispatchedLabel"] @if (unit.Dispatched.HasValue) { @@ -330,11 +332,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- Enroute + @localizer["EnrouteLabel"] @if (unit.Enroute.HasValue) { @@ -343,11 +345,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- On Scene + @localizer["OnSceneLabel"] @if (unit.OnScene.HasValue) { @@ -356,11 +358,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- Released + @localizer["ReleasedLabel"] @if (unit.Released.HasValue) { @@ -369,11 +371,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- In Quarters + @localizer["InQuartersLabel"] @if (unit.InQuarters.HasValue) { @@ -382,16 +384,16 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- Id + @localizer["IdLabel"] @Model.Log.ExternalId - District + @localizer["DistrictLabel"] @Model.Log.StationGroup.Name - District + @localizer["DistrictLabel"] @Model.Log.Department.Name - Type + @localizer["TypeLabel"] @(((LogTypes)Model.Log.LogType.Value).ToString()) - Type - Work + @localizer["TypeLabel"] + @localizer["WorkLogType"]
- Logged On + @localizer["LoggedOnLabel"] @Model.Log.LoggedOn.TimeConverterToString(Model.Log.Department) - Logged By + @localizer["LoggedByLabel"] @(await UserHelper.GetFullNameForUser(Model.Log.LoggedByUserId)) - Call Name + @localizer["CallNameLabel"] @Model.Log.Call.Name - Call Type + @localizer["CallTypeLabel"] @if (!String.IsNullOrWhiteSpace(Model.Log.Call.Type)) { @Model.Log.Call.Type } else { - No Type + @localizer["NoTypeLabel"] } - Priority + @localizer["PriorityLabel"] @(await CallPriorityHelper.CallPriorityToString(Model.Log.DepartmentId, Model.Log.Call.Priority)) - Call Name - Not Supplied + @localizer["CallNameLabel"] + @localizer["NotSupplied"]
- Call Address + @localizer["CallAddressLabel"] @Model.Log.Call.Address - Call Address - Not Supplied + @localizer["CallAddressLabel"] + @localizer["NotSupplied"]
- - - + + + @@ -427,13 +429,13 @@
- Personnel + @localizer["PersonnelLabel"]
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- - - + + + @@ -466,13 +468,13 @@
- Condition + @localizer["ConditionLabel"]
@Html.Raw(Model.Log.InitialReport)
- Narrative + @localizer["NarrativeLabel"]
@Html.Raw(Model.Log.Narrative)
@@ -491,7 +493,7 @@ style="margin-top: 10px; margin-bottom: 5px;">
-

Resgrid Log

+

@localizer["LogReportTitle"]

@@ -502,14 +504,14 @@ @if (Model.Log.StationGroup != null) {
} else { } @@ -520,54 +522,54 @@ @if (Model.Log.LogType != null) { } else { } @@ -608,14 +610,14 @@
- Personnel + @localizer["PersonnelLabel"]
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- District + @localizer["DistrictLabel"] @Model.Log.StationGroup.Name - District + @localizer["DistrictLabel"] @Model.Log.Department.Name - Type + @localizer["TypeLabel"] @(((LogTypes)Model.Log.LogType.Value).ToString()) - Type - Work + @localizer["TypeLabel"] + @localizer["WorkLogType"]
- Logged On + @localizer["LoggedOnLabel"] @Model.Log.LoggedOn.TimeConverterToString(Model.Log.Department) - Logged By + @localizer["LoggedByLabel"] @(await UserHelper.GetFullNameForUser(Model.Log.LoggedByUserId)) - Attendance + @localizer["AttendanceLabel"] @Html.Raw(string.Format("{0}%", Model.Attendance.ToString("F")))
- Training\Course + @localizer["TrainingCourseLabel"] @Model.Log.Course - Code + @localizer["CodeLabel"] @Model.Log.CourseCode - Instructors + @localizer["InstructorsLabel"] @Model.Log.Instructors
- Start + @localizer["StartHeader"] @if (Model.Log.StartedOn.HasValue) { - End + @localizer["EndHeader"] @if (Model.Log.EndedOn.HasValue) { Total Time + @localizer["TotalTimeLabel"] @timeDiff.ToString("g")
- - - - + + + + @@ -649,7 +651,7 @@
- Units + @localizer["UnitsLabel"]
@foreach (var unit in Model.Log.Units) { @@ -660,10 +662,10 @@
IDNameStationAudit@localizer["IdHeader"]@localizer["NameHeader"]@localizer["StationHeader"]@localizer["AuditHeader"]
- - - - + + + + @@ -699,7 +701,7 @@
- Narrative + @localizer["NarrativeLabel"]
@Html.Raw(Model.Log.Narrative)
@@ -718,7 +720,7 @@ style="margin-top: 10px; margin-bottom: 5px;">
-

Resgrid Log

+

@localizer["LogReportTitle"]

@@ -727,47 +729,47 @@
@if (Model.Log.StationGroup != null) { } else { } @if (Model.Log.LogType != null) { } else { } @@ -776,7 +778,7 @@ @if (Model.Log.StartedOn.HasValue) { @@ -784,14 +786,14 @@ else { } @if (Model.Log.EndedOn.HasValue) { @@ -799,22 +801,22 @@ else { } @@ -824,13 +826,13 @@
- Personnel + @localizer["PersonnelLabel"]
IDNameStationAudit@localizer["IdHeader"]@localizer["NameHeader"]@localizer["StationHeader"]@localizer["AuditHeader"]
- Meeting Type + @localizer["MeetingTypeLabel"] @Model.Log.Type - District + @localizer["DistrictLabel"] @Model.Log.StationGroup.Name - Department + @localizer["DepartmentLabel"] @Model.Log.Department.Name - Log Type + @localizer["LogTypeLabel"] @(((LogTypes)Model.Log.LogType.Value).ToString()) - Type - Meeting + @localizer["TypeLabel"] + @localizer["MeetingLogType"]
- Logged On + @localizer["LoggedOnLabel"] @Model.Log.LoggedOn.FormatForDepartment(Model.Log.Department, true) - Logged By + @localizer["LoggedByLabel"] @(await UserHelper.GetFullNameForUser(Model.Log.LoggedByUserId)) - Started On + @localizer["StartedOnLabel"] @Model.Log.StartedOn.Value.FormatForDepartment(Model.Log.Department, true) - Started On - Not Supplied + @localizer["StartedOnLabel"] + @localizer["NotSupplied"] - Ended On + @localizer["EndedOnLabel"] @Model.Log.EndedOn.Value.FormatForDepartment(Model.Log.Department, true) - Ended On - Not Supplied + @localizer["EndedOnLabel"] + @localizer["NotSupplied"] - Location + @localizer["LocationLabel"] @Model.Log.Location
- Presiding + @localizer["PresidingLabel"] @Model.Log.Instructors - Other Attendees + @localizer["OtherAttendeesLabel"] @Model.Log.OtherPersonnel
- - - + + + @@ -863,7 +865,7 @@
- Meeting Minutes + @localizer["MeetingMinutesLabel"]
@Html.Raw(Model.Log.Narrative)
@@ -882,7 +884,7 @@ style="margin-top: 10px; margin-bottom: 5px;">
-

Resgrid Log

+

@localizer["LogReportTitle"]

@@ -891,51 +893,51 @@
@if (Model.Log.StationGroup != null) { } else { } @if (Model.Log.LogType != null) { } else { } @@ -943,29 +945,29 @@ @if (Model.Log.StartedOn.HasValue) { } else { } @@ -975,7 +977,7 @@
- Units + @localizer["UnitsLabel"]
@foreach (var unit in Model.Log.Units) { @@ -983,7 +985,7 @@
@unit.Unit.Name
- Dispatched + @localizer["DispatchedLabel"] @if (unit.Dispatched.HasValue) { @@ -992,11 +994,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- Enroute + @localizer["EnrouteLabel"] @if (unit.Enroute.HasValue) { @@ -1005,11 +1007,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- On Scene + @localizer["OnSceneLabel"] @if (unit.OnScene.HasValue) { @@ -1018,11 +1020,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- Released + @localizer["ReleasedLabel"] @if (unit.Released.HasValue) { @@ -1031,11 +1033,11 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
- In Quarters + @localizer["InQuartersLabel"] @if (unit.InQuarters.HasValue) { @@ -1044,16 +1046,16 @@ } else { - Not Supplied + @localizer["NotSupplied"] }
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- Case # + @localizer["CaseNumberLabel"] @Model.Log.ExternalId - District + @localizer["DistrictLabel"] @Model.Log.StationGroup.Name - Department + @localizer["DepartmentLabel"] @Model.Log.Department.Name - Log Type + @localizer["LogTypeLabel"] @(((LogTypes)Model.Log.LogType.Value).ToString()) - Type - Meeting + @localizer["TypeLabel"] + @localizer["MeetingLogType"]
- Logged On + @localizer["LoggedOnLabel"] @Model.Log.LoggedOn.FormatForDepartment(Model.Log.Department, true) - Logged By + @localizer["LoggedByLabel"] @(await UserHelper.GetFullNameForUser(Model.Log.LoggedByUserId)) - OIC + @localizer["OicLabel"] @Model.Log.Instructors
- Date + @localizer["DateHeader"] @Model.Log.StartedOn.Value.ToShortDateString() - Date - Not Supplied + @localizer["DateHeader"] + @localizer["NotSupplied"] - Destination + @localizer["DestinationLabel"] @Model.Log.Location
- Pronounced By + @localizer["PronouncedByLabel"] @Model.Log.PronouncedDeceasedBy - Body Location + @localizer["BodyLocationLabel"] @Model.Log.BodyLocation
- - - + + + @@ -1089,13 +1091,13 @@
- Personnel + @localizer["PersonnelLabel"]
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- - - + + + @@ -1128,7 +1130,7 @@
- Meeting Minutes + @localizer["MeetingMinutesLabel"]
@Html.Raw(Model.Log.Narrative)
@@ -1147,7 +1149,7 @@ style="margin-top: 10px; margin-bottom: 5px;">
-

Resgrid Log

+

@localizer["LogReportTitle"]

@@ -1162,41 +1164,41 @@ @if (Model.Log.StationGroup != null) {
} else { } @if (Model.Log.LogType != null) { } else { } @@ -1205,18 +1207,18 @@ {
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- District + @localizer["DistrictLabel"] @Model.Log.StationGroup.Name - Department + @localizer["DepartmentLabel"] @Model.Log.Department.Name - Type + @localizer["TypeLabel"] @(((LogTypes)Model.Log.LogType.Value).ToString()) - Type - Callback + @localizer["TypeLabel"] + @localizer["CallbackLogType"]
- Logged On + @localizer["LoggedOnLabel"] @Model.Log.LoggedOn.FormatForDepartment(Model.Log.Department, true) - Logged By + @localizer["LoggedByLabel"] @(await UserHelper.GetFullNameForUser(Model.Log.LoggedByUserId))
- Call Id + @localizer["CallIdLabel"] @Model.Log.Call.CallId - Call Number + @localizer["CallNumberLabel"] @Model.Log.Call.Number @@ -1260,22 +1262,22 @@ @if (Model.Log.Call != null) { @@ -1283,8 +1285,8 @@ else { } @@ -1292,15 +1294,15 @@ @if (Model.Log.Call != null) { } else { } @@ -1311,13 +1313,13 @@
- Personnel + @localizer["PersonnelLabel"]
- Incident Id + @localizer["IncidentIdLabel"] @if (!String.IsNullOrWhiteSpace(Model.Log.Call.IncidentNumber)) { @@ -1224,11 +1226,11 @@ } else { - None + @localizer["NoneLabel"] } - Call Id + @localizer["CallIdLabel"] @if (!String.IsNullOrWhiteSpace(Model.Log.Call.ExternalIdentifier)) { @@ -1236,11 +1238,11 @@ } else { - None + @localizer["NoneLabel"] } - Reference Id + @localizer["ReferenceIdLabel"] @if (!String.IsNullOrWhiteSpace(@Model.Log.Call.ReferenceNumber)) { @@ -1248,7 +1250,7 @@ } else { - None + @localizer["NoneLabel"] }
- Call Name + @localizer["CallNameLabel"] @Model.Log.Call.Name - Call Type + @localizer["CallTypeLabel"] @if (!String.IsNullOrWhiteSpace(Model.Log.Call.Type)) { @Model.Log.Call.Type } else { - No Type + @localizer["NoTypeLabel"] } - Priority + @localizer["PriorityLabel"] @(await CallPriorityHelper.CallPriorityToString(Model.Log.DepartmentId, Model.Log.Call.Priority)) - Call Name - Not Supplied + @localizer["CallNameLabel"] + @localizer["NotSupplied"]
- Call Address + @localizer["CallAddressLabel"] @Model.Log.Call.Address - Call Address - Not Supplied + @localizer["CallAddressLabel"] + @localizer["NotSupplied"]
- - - + + + @@ -1350,7 +1352,7 @@
- Narrative + @localizer["NarrativeLabel"]
@Html.Raw(Model.Log.Narrative)
diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml index d764b2d5..32b2c26b 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelEventsReport.cshtml @@ -1,7 +1,9 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Personnel.PersonnelEventsReportView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -10,9 +12,9 @@ - Resgrid Personnel Events Report + @localizer["PersonnelEventsReportTitle"] - + Resgrid Personnel Events Report +

@localizer["PersonnelEventsReportTitle"]

} @@ -62,11 +64,11 @@
IDStationName@localizer["IdHeader"]@localizer["StationHeader"]@localizer["NameHeader"]
- - - - - + + + + + @@ -98,4 +100,3 @@ - diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml index 05fd8dea..a41fe685 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursDetailReport.cshtml @@ -1,7 +1,9 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Personnel.PersonnelHoursDetailView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -10,9 +12,9 @@ - Personnel Hours Detail Report + @localizer["PersonnelHoursDetailReportTitle"] - +
-

Personnel Hours Detail Report

+

@localizer["PersonnelHoursDetailReportTitle"]

@@ -58,26 +60,26 @@
StatusDestination\CallTimestampLocationNote@localizer["StatusHeader"]@localizer["DestinationCallHeader"]@localizer["TimestampHeader"]@localizer["LocationHeader"]@localizer["NoteHeader"]
- Id + @localizer["IdHeader"] @Model.ID - Name + @localizer["NameHeader"] @Model.Name - Group + @localizer["GroupHeader"] @Model.Group
- Start + @localizer["StartHeader"] @Model.Start.FormatForDepartment(Model.Department) - End + @localizer["EndHeader"] @Model.End.FormatForDepartment(Model.Department) @@ -91,7 +93,7 @@
-

Calls

+

@localizer["Calls"]

@@ -99,11 +101,11 @@ - - - - - + + + + + @@ -123,7 +125,7 @@
-

Work Logs

+

@localizer["WorkLogs"]

@@ -131,10 +133,10 @@
NumberNameStartEndHours@localizer["NumberHeader"]@localizer["NameHeader"]@localizer["StartHeader"]@localizer["EndHeader"]@localizer["HoursHeader"]
- - - - + + + + @@ -153,7 +155,7 @@
-

Trainings

+

@localizer["Trainings"]

@@ -161,10 +163,10 @@
NameStartEndHours@localizer["NameHeader"]@localizer["StartHeader"]@localizer["EndHeader"]@localizer["HoursHeader"]
- - - - + + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml index 4c452597..6935bcfa 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReport.cshtml @@ -1,7 +1,9 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Personnel.PersonnelHoursView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -10,9 +12,9 @@ - Personnel Hours Report + @localizer["PersonnelHoursReportTitle"] - +
-

Personnel Hours Report

+

@localizer["PersonnelHoursReportTitle"]

@Model.Start.FormatForDepartment(Model.Department)-@Model.End.FormatForDepartment(Model.Department)
-

Call Hours

+

@localizer["CallHours"]

@@ -63,11 +65,11 @@
NameStartEndHours@localizer["NameHeader"]@localizer["StartHeader"]@localizer["EndHeader"]@localizer["HoursHeader"]
- - - - - + + + + + @@ -87,7 +89,7 @@
-

Work Hours

+

@localizer["WorkHours"]

@@ -95,11 +97,11 @@
IDNameGroupCountHours@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]@localizer["CountHeader"]@localizer["HoursHeader"]
- - - - - + + + + + @@ -119,7 +121,7 @@
-

Training Hours

+

@localizer["TrainingHours"]

@@ -127,11 +129,11 @@
IDNameGroupCountHours@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]@localizer["CountHeader"]@localizer["HoursHeader"]
- - - - - + + + + + diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReportParams.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReportParams.cshtml index cd78db72..5dfdc1df 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReportParams.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelHoursReportParams.cshtml @@ -1,24 +1,26 @@ - + @using Resgrid.Framework @using Resgrid.Model @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Params.PersonnelHoursReportParams +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Personnel Hours Report Params"; + ViewBag.Title = "Resgrid | " + localizer["PersonnelHoursReportName"]; }
-

Personnel Hours Report

+

@localizer["PersonnelHoursReportName"]

@@ -40,7 +42,7 @@
@Html.DropDownListFor(m => m.UserId, Model.Users, new { @style = "width: 450px;" }) @@ -48,7 +50,7 @@
@Html.TextBoxFor(m => m.Start, new { style = "width:250px;", onkeydown = "javascript:return false;" }) @@ -56,7 +58,7 @@
@Html.TextBoxFor(m => m.End, new { style = "width:250px;", onkeydown = "javascript:return false;" }) @@ -65,8 +67,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml index 8a1b0c3f..1b3a0ce9 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Reports/PersonnelReport.cshtml @@ -1,6 +1,8 @@ -@using Resgrid.Model.Helpers +@using Resgrid.Model.Helpers @using Resgrid.Web.Helpers +@using Microsoft.Extensions.Localization @model Resgrid.Web.Areas.User.Models.Reports.Personnel.PersonnelReportView +@inject IStringLocalizer localizer @{ Layout = null; } @@ -9,9 +11,9 @@ - Resgrid Personnel Report + @localizer["PersonnelReportTitle"] - + - + +} + +
+
+

Select Your Plan

+ +
+
+ +
+
+
+
+
+ +
+ A paid plan is required to activate your account on this server. + Free tier signups are not available on this Resgrid instance. Please select a plan below to complete your registration. +
+ +

Move the slider below to select the number of Entities (Users + Units) you require. Your first 10 entities are included at no charge — each additional pack of 10 entities is billed at the rate shown. Select Buy Yearly or Buy Monthly to proceed to the Stripe checkout page.

+ +
+
+
+

Entities

+ Users or Units sold in packs of 10 +
+
+
+ + + +
+
+
+
+ +
+
+
+ Entities +
+
+
+ + Monthly billing amount +
+ +

+ .00 +
+
+
+ + Yearly (annual) billing amount +
+ +

+ .00 +
+
+
+
+
+ @if (Model.IsPaddleDepartment) { + Buy Yearly + } else { + Buy Yearly + } +
+
+ @if (Model.IsPaddleDepartment) { + Buy Monthly + } else { + Buy Monthly + } +
+
+
+ +
+ + @if (!string.IsNullOrWhiteSpace(Model.DiscountCode)) + { +
+ Discount Code Applied: @Model.DiscountCode +
+ } + +
+ Need help choosing? Contact us at @SystemBehaviorConfig.ContactUsUrl and we can help find the right plan for your organization. +
+ +
+
+
+
+
+ +@section Scripts +{ + @if (Model.IsPaddleDepartment) { + + + } else { + + } + + +} diff --git a/Web/Resgrid.Web/Areas/User/Views/Templates/CallNotes.cshtml b/Web/Resgrid.Web/Areas/User/Views/Templates/CallNotes.cshtml index 82b3d438..a96412fa 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Templates/CallNotes.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Templates/CallNotes.cshtml @@ -65,7 +65,7 @@ @t.Sort
IDNameGroupCountHours@localizer["IdHeader"]@localizer["NameHeader"]@localizer["GroupHeader"]@localizer["CountHeader"]@localizer["HoursHeader"]
- Call Note + @localizer["CallNoteType"] @Html.Raw(t.AddedOn.ToShortDateString()) diff --git a/Web/Resgrid.Web/Areas/User/Views/Templates/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Templates/Index.cshtml index b1e65ca4..0536ad8d 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Templates/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Templates/Index.cshtml @@ -60,7 +60,7 @@ @t.Name - Call Quick Template + @localizer["CallQuickTemplateType"] @Html.Raw(t.CreatedOn.ToShortDateString()) diff --git a/Web/Resgrid.Web/Areas/User/Views/Templates/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Templates/New.cshtml index 7ff81bc9..ef23aff5 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Templates/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Templates/New.cshtml @@ -1,21 +1,22 @@ @using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Templates.NewTemplateModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Template"; + ViewBag.Title = "Resgrid | " + localizer["NewTemplateHeader"]; }
-

New Template

+

@localizer["NewTemplateHeader"]

@@ -43,7 +44,7 @@
@@ -53,7 +54,7 @@
@@ -63,7 +64,7 @@
@@ -73,7 +74,7 @@
@@ -83,7 +84,7 @@
@@ -93,8 +94,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Templates/NewCallNote.cshtml b/Web/Resgrid.Web/Areas/User/Views/Templates/NewCallNote.cshtml index 37c2d47e..a790f336 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Templates/NewCallNote.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Templates/NewCallNote.cshtml @@ -1,24 +1,25 @@ @using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Templates.NewCallNoteModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Call Note Template"; + ViewBag.Title = "Resgrid | " + localizer["NewCallNoteTemplateHeader"]; }
-

New Call Note Template

+

@localizer["NewCallNoteTemplateHeader"]

@@ -46,7 +47,7 @@
@@ -56,7 +57,7 @@
@@ -66,7 +67,7 @@
@@ -76,8 +77,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Voice/Edit.cshtml b/Web/Resgrid.Web/Areas/User/Views/Voice/Edit.cshtml index 91ca440b..4e3d695f 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Voice/Edit.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Voice/Edit.cshtml @@ -1,21 +1,22 @@ @using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Voice.NewChannelModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | Edit Push-To-Talk Channel"; + ViewBag.Title = "Resgrid | " + localizer["EditPTTChannelHeader"]; }
-

Edit Push-To-Talk Channel

+

@localizer["EditPTTChannelHeader"]

@@ -43,7 +44,7 @@
- +
@@ -51,18 +52,18 @@
- +
- Note there can be only one default channel at a time, selecting a new default channel will turn off default for the existing one. + @localizer["IsDefaultHelp"]
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Voice/Index.cshtml b/Web/Resgrid.Web/Areas/User/Views/Voice/Index.cshtml index b52e4f6e..49f3840f 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Voice/Index.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Voice/Index.cshtml @@ -64,7 +64,7 @@ @c.Name
- Audio Stream + @localizer["AudioStream"] @c.Data @@ -168,7 +168,7 @@
- You can only have 1 channel set as the default at a time. To make another channel the default you must first turn the default channel option off. + @localizer["DefaultChannelWarning"]
diff --git a/Web/Resgrid.Web/Areas/User/Views/Voice/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Voice/New.cshtml index bb117a6f..8e8d4d38 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Voice/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Voice/New.cshtml @@ -1,21 +1,22 @@ @using Resgrid.Model @model Resgrid.WebCore.Areas.User.Models.Voice.NewChannelModel +@inject IStringLocalizer localizer @{ - ViewBag.Title = "Resgrid | New Push-To-Talk Channel"; + ViewBag.Title = "Resgrid | " + localizer["NewPTTChannelHeader"]; }
-

New Push-To-Talk Channel

+

@localizer["NewPTTChannelHeader"]

@@ -43,7 +44,7 @@
@Html.TextBoxFor(m => m.ChannelName, new { @class = "form-control", autofocus = "autofocus" }) @@ -51,8 +52,8 @@
- Cancel - + @commonLocalizer["Cancel"] +
diff --git a/Web/Resgrid.Web/Areas/User/Views/Workflows/New.cshtml b/Web/Resgrid.Web/Areas/User/Views/Workflows/New.cshtml index 32dd5cb9..f9bf4657 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Workflows/New.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Workflows/New.cshtml @@ -37,7 +37,7 @@ @if (noEventTypesAvailable) {
- All available trigger event types already have a workflow configured. Delete an existing workflow to free up its event type. + @localizer["AllEventTypesUsed"]
} @@ -60,7 +60,7 @@ { } - Each event type can only have one workflow. Only unused event types are shown. + @localizer["TriggerEventHelp"]
diff --git a/Web/Resgrid.Web/Areas/User/Views/Workflows/RunDetail.cshtml b/Web/Resgrid.Web/Areas/User/Views/Workflows/RunDetail.cshtml index 9bb29305..75206e7d 100644 --- a/Web/Resgrid.Web/Areas/User/Views/Workflows/RunDetail.cshtml +++ b/Web/Resgrid.Web/Areas/User/Views/Workflows/RunDetail.cshtml @@ -1,14 +1,14 @@ @model Resgrid.Model.WorkflowRun @inject IStringLocalizer localizer @{ - ViewData["Title"] = "Resgrid | Run Detail"; + ViewData["Title"] = "Resgrid | " + localizer["RunDetailPageTitle"]; Layout = "~/Areas/User/Views/Shared/_UserLayout.cshtml"; var logs = ViewBag.Logs as List ?? new List(); }
-

Run Detail

+

@localizer["RunDetailPageTitle"]