From 6fd22ede847adb1376c6d33beab807782784df21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9CVeLiTi=E2=80=9D?= <“info@veliti.nl”>
Date: Tue, 25 Mar 2025 15:41:53 +0100
Subject: [PATCH] CMXX - Translations, Service report improvements and API
security
---
api.php | 25 +--
assets/functions.php | 198 ++++++++++++----------
settings/translations/translations_DE.php | 86 +++++++++-
settings/translations/translations_ES.php | 86 +++++++++-
settings/translations/translations_NL.php | 84 ++++++++-
settings/translations/translations_PT.php | 86 +++++++++-
settings/translations/translations_US.php | 9 +-
7 files changed, 451 insertions(+), 123 deletions(-)
diff --git a/api.php b/api.php
index 55ed46e..275713a 100644
--- a/api.php
+++ b/api.php
@@ -20,9 +20,9 @@ include './settings/config_redirector.php';
// Header security - enabled via config
//------------------------------------------
if (header_security){
- header('Content-Type: application/json');
- // Set strict security headers
+ // Strict security headers
+ header('Content-Type: application/json');
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('X-XSS-Protection: 1; mode=block');
@@ -30,19 +30,22 @@ if (header_security){
header('Access-Control-Allow-Origin: ' . $_ENV['ALLOWED_ORIGIN']);
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Accept, Authorization');
-
+ header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
+ header('Referrer-Policy: strict-origin-when-cross-origin');
+
// Validate Content-Type
- if (!str_contains($_SERVER['CONTENT_TYPE'],'application/json')) {
- http_response_code(400);
- exit(json_encode(['error' => 'Invalid Content-Type']));
+ if (!str_contains($_SERVER['CONTENT_TYPE'] ?? '', 'application/json')) {
+ http_response_code(400);
+ exit(json_encode(['error' => 'Invalid Content-Type']));
}
-
+
// Validate request size
- if ($_SERVER['CONTENT_LENGTH'] > '5M') {
- http_response_code(413);
- exit(json_encode(['error' => 'Request too large']));
+ $maxRequestSize = 5 * 1024 * 1024; // 5MB in bytes
+ if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > $maxRequestSize) {
+ http_response_code(413);
+ exit(json_encode(['error' => 'Request too large']));
}
- }
+}
//------------------------------------------
// Retrieve API version and Collection
diff --git a/assets/functions.php b/assets/functions.php
index 494ae93..d6e4f4c 100644
--- a/assets/functions.php
+++ b/assets/functions.php
@@ -1317,10 +1317,44 @@ function serviceReport($history, $request, $country_code)
$maintenance_test = $stmt->fetch();
$test_fail = $maintenance_test['description'];
$maintenance_test = json_decode($maintenance_test['description']);
+
+ function combineAndSortKeys($object) {
+ // Convert object properties to arrays if needed
+ $key1 = (array)($object->doubletestvalues ?? []);
+ $key2 = (array)($object->stringtestvalues ?? []);
+ $key3 = (array)($object->booleantestvalues ?? []);
+
+ // Combine all rows
+ $combined = array_merge($key1, $key2, $key3);
+
+ // Group rows based on the "pass" boolean
+ $grouped = [
+ 'failed' => [],
+ 'passed' => []
+ ];
+
+ foreach ($combined as $row) {
+ // Check if $row is an object and convert if needed
+ if (is_object($row)) {
+ $row = (array)$row;
+ }
+
+ if (isset($row['pass']) && $row['pass'] === true) {
+ $grouped['passed'][] = $row;
+ } else {
+ $grouped['failed'][] = $row;
+ }
+ }
+
+ return $grouped;
+ }
- //check if maintenance test has false test and update renewal date
+ // Example usage:
+ $sortedTestResults = combineAndSortKeys($maintenance_test);
+
+ //check if maintenance test has false test and update renewal date
if (str_contains($test_fail, "false")){
- $service_renewal_date = $service_report_outcome_attention; ;
+ $service_renewal_date = $service_report_outcome_attention;
}
}
@@ -1340,6 +1374,10 @@ function serviceReport($history, $request, $country_code)
font-size: 18px;
line-height: 1.5;
}
+
+ table > thead:first-of-type > tr:last-child {
+ page-break-after: avoid;
+ }
.servicereport {
border-collapse: collapse;
@@ -1544,8 +1582,16 @@ function serviceReport($history, $request, $country_code)
-
'.$summary_label1.'
-
+
+
+
+ | '.$summary_label1.' |
+
+
+
+
+
+
';
$actions = 0;
@@ -1573,11 +1619,24 @@ function serviceReport($history, $request, $country_code)
}
}
if ($actions == 0) {$servicereport .= '- '.$message1.'
';}
-
+
+ //CLOSE summary table and OPENGROUP_HEADER 8 table
$servicereport .= '
-
- '.$group_header_8.'
-
+ |
+
+
+
+
+
+
+ | '.$group_header_8.' |
+
+
+
+
+
+
';
if (str_contains($history->description, "service_mandatory_question")) {
foreach ($json_array->final as $final) {
@@ -1616,9 +1675,17 @@ function serviceReport($history, $request, $country_code)
}
if ($repairs == 0) {$servicereport .= '- ' . $message2 . '
';}
- $servicereport .=' ';
+
+ //CLOSE GROUP_HEADER 8 table
+ $servicereport .='
+
+ |
+
+
+
';
+
if (str_contains($history->description, "service_mandatory_question")) {
- //GET NOTES from JSON
+ //GET NOTES from JSON
$notes ='';
foreach ($json_array->final as $final){
if ($final->id == "service_notes"){
@@ -1626,12 +1693,24 @@ function serviceReport($history, $request, $country_code)
}
}
+ //GENERATE NOTES SECTION
$servicereport .='
- '.$group_header_7.'
';
+
+
+
+ | '.$group_header_7.' |
+
+
+ ';
if ($notes != '') {
- $servicereport .= ''.$notes.'
';
- } else {
- $servicereport .= ''.$service_report_no_comments.'
'; }
+ $servicereport .= '| '.$notes.' |
';
+ }
+ else {
+ $servicereport .= '| '.$service_report_no_comments.' |
';
+ }
+
+ $servicereport .='
+
';
}
$servicereport .= '
';
@@ -1652,82 +1731,28 @@ function serviceReport($history, $request, $country_code)
'.$service_report_maintenance_test_status.' |
- ';
-
- // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // Check for measurements ++++++++++++++++++++++++++
- // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // Check if false test found +++++++
- // +++++++++++++++++++++++++++++++++++++++++++++++++++++++
- $servicereport .= '';
+ ';
- //Check double test values
- foreach($maintenance_test->doubletestvalues as $key => $value)
+ //SHOW FAILED VALUES
+ foreach($sortedTestResults['failed'] as $key => $value)
{
- //If test is not passed or not
- if($value->pass == false){
- $text = $service_maintenance_test_fail;
- $style = 'error';
- }
- else
- {
- $text = $service_maintenance_test_pass;
- $style = 'success';
-
- }
-
- $servicereport .='
-
- | '.$value->name.' |
- '.$text.' |
-
+ $servicereport .='
+
+ | '.$value['name'].' |
+ '.$service_maintenance_test_fail.' |
+
';
}
- //Check string test values
- foreach($maintenance_test->stringtestvalues as $key => $value)
- {
- //If test is not passed or not
- if($value->pass == false){
- $text = $service_maintenance_test_fail;
- $style = 'error';
- }
- else
- {
- $text = $service_maintenance_test_pass;
- $style = 'success';
-
- }
- $servicereport .='
-
- | '.$value->name.' |
- '.$text.' |
-
- ';
- }
-
- //Check boolean test values
- foreach($maintenance_test->booleantestvalues as $key => $value)
- {
- //If test is not passed or not
- if($value->pass == false){
- $text = $service_maintenance_test_fail;
- $style = 'error';
- }
- else
- {
- $text = $service_maintenance_test_pass;
- $style = 'success';
- }
- $servicereport .='
-
- | '.$value->name.' |
- '.$text.' |
-
- ';
- }
-
+ //SHOW PASSED VALUES
+ foreach($sortedTestResults['passed'] as $key => $value)
+ {
+ $servicereport .='
+
+ | '.$value['name'].' |
+ '.$service_maintenance_test_pass.' |
+
+ ';
+ }
$servicereport .= '
@@ -1834,6 +1859,7 @@ function serviceReport($history, $request, $country_code)
//++++++++++++++++++++++++++++++++++++++++++++++
//Legacy Code
//++++++++++++++++++++++++++++++++++++++++++++++
+
if (isset($json_array->question25) && isset($json_array->newHistory)) {
$servicereport .= '
diff --git a/settings/translations/translations_DE.php b/settings/translations/translations_DE.php
index fb40312..eabe720 100644
--- a/settings/translations/translations_DE.php
+++ b/settings/translations/translations_DE.php
@@ -162,8 +162,8 @@ $service_report_maintenance_test_status = 'Status';
$service_report_outcome_good = 'Gut';
$service_report_outcome_attention = 'Achtung';
$service_report_no_text = 'Es gibt keine Serviceberichte ';
-$service_maintenance_test_fail = 'Fehlgeschlagen';
-$service_maintenance_test_pass = 'Gut';
+$service_maintenance_test_fail = 'Nicht genehmigt';
+$service_maintenance_test_pass = 'Genehmigt';
$status0 = '0';
$status0_text = 'Neu';
$status1 = '1';
@@ -466,8 +466,8 @@ $contract_ignore_serial = 'Seriennummern ignorieren';
$contract_assigned_users = 'Zugewiesene Benutzer';
$contract_assigned_users_add = 'Benutzer hinzufügen';
$group_header_1 = 'Allgemein';
-$group_header_2 = 'Kopf - Typ 1';
-$group_header_3 = 'Kopf - Typ 2';
+$group_header_2 = 'Type 1 connector';
+$group_header_3 = 'Type 2 connector';
$group_header_4 = 'Batterieeinheit';
$group_header_5 = 'Gehäuse';
$group_header_6 = 'Aktionen';
@@ -500,7 +500,6 @@ $service_visual_12 = 'Zustand des Kunststoffgehäuses';
$service_visual_13 = 'Batteriefach vorhanden?';
$service_visual_14 = 'Korrosion an Batterieanschlüssen?';
$service_visual_15 = 'Batterieanschlüsse vorhanden?';
-$service_visual_15 = 'Batterieanschlüsse vorhanden?';
$service_visual_16 = 'Seriennummer lesbar?';
$service_visual_17 = 'USB-Anschluss sauber?';
$service_visual_18 = 'Bewegung am USB-Anschluss?';
@@ -663,9 +662,86 @@ $buildreport_onstock_text = 'Gesamtanzahl auf Lager';
$data_build_sfg_view = 'In den letzten 7 Tagen produzierte Halbfertigprodukte';
$data_build_fg_view = 'In den letzten 7 Tagen produzierte Fertigprodukte';
$menu_translations = 'Übersetzungen';
+$button_create_rma = 'RMA erstellen';
+$rmas_h2 = 'Rücksendematerial';
+$rmas_p = 'Anzeigen, verwalten und suchen von RMA-Details';
+$rma_h2 = 'Rücksendematerialanforderung';
+$message_rma_1 = 'RMA erfolgreich erstellt!';
+$message_rma_2 = 'RMA erfolgreich aktualisiert!';
+$message_rma_3 = 'RMA erfolgreich gelöscht!';
+$message_no_rma = 'Es gibt kein RMA';
+$rma_search = 'RMA suchen...';
+$rma_rowID = 'Anforderungsnummer';
+$rma_status = 'Status';
+$rma_status0_text = 'Neu';
+$rma_status1_text = 'In Bearbeitung';
+$rma_status2_text = 'Genehmigt';
+$rma_status3_text = 'Abgeschlossen';
+$rma_status4_text = 'Abgebrochen';
+$rma_sw_version_latest = 'Neueste Softwareversion';
+$rma_servicereport_latest = 'Servicebericht der letzten 7 Tage erstellt';
+$rma_information = 'RMA-Informationen';
+$rma_return_reason = 'Rücksendegrund';
+$rma_return_reason0_text = '';
+$rma_return_reason1_text = '';
+$rma_return_reason2_text = '';
+$rma_return_reason3_text = '';
+$rma_return_reason4_text = '';
+$rma_return_reasons_notes = 'Rücksendegrundnotizen';
+$rma_return_tab1 = 'Rücksendegrund';
+$rma_return_tab2 = 'Fragen';
+$rma_question_allowed_label1 = 'Ja';
+$rma_question_allowed_label2 = 'Nein';
+$rma_question_header_1 = '';
+$rma_question_1 = 'Funktionieren die Batterien?';
+$rma_question_2 = 'Funktioniert der Knopf richtig?';
+$rma_question_3 = '';
+$rma_question_4 = '';
+$rma_question_5 = '';
+$rma_question_6 = '';
+$rma_question_7 = '';
+$menu_rmas = 'Rücksendematerial';
+$button_create_text_variable = 'Variable erstellen';
+$message_no_text_variables = 'Es gibt keine Variablen';
+$text_variables_h2 = 'Übersetzungen';
+$text_variable_name = 'Variablenname';
+$text_variable_translation_languagekey = 'Sprache';
+$text_variable_translation_translation = 'Übersetzung';
+$menu_products_attributes = 'Produktattribute';
+$message_patt_1 = 'Produktattribut erfolgreich erstellt!';
+$message_patt_2 = 'Produktattribut erfolgreich aktualisiert!';
+$message_patt_3 = 'Produktattribut erfolgreich gelöscht!';
+$products_attributes_h2 = 'Produktattribute';
+$products_attributes_p = 'Anzeigen, verwalten und suchen von Produktattributen';
+$button_create_products_attribute = 'Attribut erstellen';
+$products_attribute_search = 'Attribut suchen';
+$products_attribute_rowID = 'Attribut-ID';
+$products_attribute_group_name = 'Name';
+$message_no_products_attributes = 'Es gibt keine Attribute';
+$products_attribute_group_status = 'Status';
+$products_attribute_group_type = 'Typ';
$general_status_0 = 'Inaktiv';
$general_status_1 = 'Aktiv';
+$products_attributes_group_status = 'Status';
+$products_attributes_group_name = 'Name der Gruppe';
+$general_form_0 = 'Auswahlfeld';
+$general_form_1 = 'Kontrollkästchen';
+$general_form_2 = 'Dropdown-Liste';
+$products_attributes_group_mandatory = 'Pflicht';
+$products_attributes_group_items = 'Elemente in der Gruppe';
+$products_attributes_item_rowID = 'Artikel-ID';
+$products_attributes_item_status = 'Status';
+$products_attributes_item_name = 'Artikelname';
+$products_attributes_item_quantity = 'Artikelanzahl';
+$products_attributes_item_position = 'Artikelposition';
+$products_attributes_item_media = 'Artikelmedien';
+$product_name_1 = 'Testproduktübersetzung';
+$menu_pricelists = 'Preislisten';
$menu_media = 'Medien';
+$general_currency_1 = ' $';
+$general_currency_0 = ' €';
+$general_modifier_0 = '-';
+$general_modifier_1 = '+';
$menu_catalog = 'Katalog';
$menu_sales_orders = 'Bestellungen';
$menu_identity = 'Identität';
diff --git a/settings/translations/translations_ES.php b/settings/translations/translations_ES.php
index 997c3aa..74e265d 100644
--- a/settings/translations/translations_ES.php
+++ b/settings/translations/translations_ES.php
@@ -162,8 +162,8 @@ $service_report_maintenance_test_status = 'Estado';
$service_report_outcome_good = 'Bueno';
$service_report_outcome_attention = 'Atención';
$service_report_no_text = 'No hay informes de servicio';
-$service_maintenance_test_fail = 'falló';
-$service_maintenance_test_pass = 'bueno';
+$service_maintenance_test_fail = 'No aprobado';
+$service_maintenance_test_pass = 'Aprobado';
$status0 = '0';
$status0_text = 'Nuevo';
$status1 = '1';
@@ -466,8 +466,8 @@ $contract_ignore_serial = 'Ignorar números de serie';
$contract_assigned_users = 'Usuarios asignados';
$contract_assigned_users_add = 'Agregar usuario';
$group_header_1 = 'General';
-$group_header_2 = 'Cabeza - Tipo 1';
-$group_header_3 = 'Cabeza - Tipo 2';
+$group_header_2 = 'Type 1 connector';
+$group_header_3 = 'Type 2 connector';
$group_header_4 = 'Unidad de batería';
$group_header_5 = 'Carcasa';
$group_header_6 = 'Acciones';
@@ -500,7 +500,6 @@ $service_visual_12 = 'Estado de la carcasa de plástico';
$service_visual_13 = '¿Cubierta de batería disponible?';
$service_visual_14 = '¿Corrosión en los contactos de la batería?';
$service_visual_15 = '¿Número de serie legible?';
-$service_visual_15 = '¿Número de serie legible?';
$service_visual_16 = '¿Conector USB limpio?';
$service_visual_17 = '¿Movimiento en el conector USB?';
$service_visual_18 = '¿Tornillos fijos (5x)?';
@@ -669,9 +668,86 @@ $buildreport_onstock_text = 'Número total En stock';
$data_build_sfg_view = 'semiacabado producido en los últimos 7 días';
$data_build_fg_view = 'producto acabado producido en los últimos 7 días';
$menu_translations = 'Traducciones';
+$button_create_rma = 'Crear RMA';
+$rmas_h2 = 'Material de devolución';
+$rmas_p = 'Ver, gestionar y buscar detalles de RMA';
+$rma_h2 = 'Solicitud de material de devolución';
+$message_rma_1 = '¡RMA creado con éxito!';
+$message_rma_2 = '¡RMA actualizado con éxito!';
+$message_rma_3 = '¡RMA eliminado con éxito!';
+$message_no_rma = 'No hay RMA';
+$rma_search = 'Buscar RMA...';
+$rma_rowID = 'Número de solicitud';
+$rma_status = 'Estado';
+$rma_status0_text = 'Nuevo';
+$rma_status1_text = 'En progreso';
+$rma_status2_text = 'Aprobado';
+$rma_status3_text = 'Completado';
+$rma_status4_text = 'Cancelado';
+$rma_sw_version_latest = 'Última versión de software';
+$rma_servicereport_latest = 'Informe de servicio creado en los últimos 7 días';
+$rma_information = 'Información del RMA';
+$rma_return_reason = 'Motivo de devolución';
+$rma_return_reason0_text = '';
+$rma_return_reason1_text = '';
+$rma_return_reason2_text = '';
+$rma_return_reason3_text = '';
+$rma_return_reason4_text = '';
+$rma_return_reasons_notes = 'Notas sobre el motivo de devolución';
+$rma_return_tab1 = 'Motivo de devolución';
+$rma_return_tab2 = 'Preguntas';
+$rma_question_allowed_label1 = 'Sí';
+$rma_question_allowed_label2 = 'No';
+$rma_question_header_1 = '';
+$rma_question_1 = '¿Funcionan las baterías?';
+$rma_question_2 = '¿Funciona correctamente el botón?';
+$rma_question_3 = '';
+$rma_question_4 = '';
+$rma_question_5 = '';
+$rma_question_6 = '';
+$rma_question_7 = '';
+$menu_rmas = 'Material de devolución';
+$button_create_text_variable = 'Crear variable';
+$message_no_text_variables = 'No hay variables';
+$text_variables_h2 = 'Traducciones';
+$text_variable_name = 'Nombre de la variable';
+$text_variable_translation_languagekey = 'Idioma';
+$text_variable_translation_translation = 'Traducción';
+$menu_products_attributes = 'Atributos de producto';
+$message_patt_1 = '¡Atributo de producto creado con éxito!';
+$message_patt_2 = '¡Atributo de producto actualizado con éxito!';
+$message_patt_3 = '¡Atributo de producto eliminado con éxito!';
+$products_attributes_h2 = 'Atributos de producto';
+$products_attributes_p = 'Ver, gestionar y buscar atributos de producto';
+$button_create_products_attribute = 'Crear atributo';
+$products_attribute_search = 'Buscar atributo';
+$products_attribute_rowID = 'ID del atributo';
+$products_attribute_group_name = 'Nombre';
+$message_no_products_attributes = 'No hay atributos';
+$products_attribute_group_status = 'Estado';
+$products_attribute_group_type = 'Tipo';
$general_status_0 = 'Inactivo';
$general_status_1 = 'Activo';
+$products_attributes_group_status = 'Estado';
+$products_attributes_group_name = 'Nombre del grupo';
+$general_form_0 = 'Botón de opción';
+$general_form_1 = 'Casilla de verificación';
+$general_form_2 = 'Lista desplegable';
+$products_attributes_group_mandatory = 'Obligatorio';
+$products_attributes_group_items = 'Elementos en el grupo';
+$products_attributes_item_rowID = 'ID del artículo';
+$products_attributes_item_status = 'Estado';
+$products_attributes_item_name = 'Nombre del artículo';
+$products_attributes_item_quantity = 'Cantidad de artículos';
+$products_attributes_item_position = 'Posición del artículo';
+$products_attributes_item_media = 'Medios del artículo';
+$product_name_1 = 'Traducción del producto de prueba';
+$menu_pricelists = 'Listas de precios';
$menu_media = 'Medios';
+$general_currency_1 = ' $';
+$general_currency_0 = ' €';
+$general_modifier_0 = '-';
+$general_modifier_1 = '+';
$menu_catalog = 'Catálogo';
$menu_sales_orders = 'Pedidos';
$menu_identity = 'Identidad';
diff --git a/settings/translations/translations_NL.php b/settings/translations/translations_NL.php
index ab6e7be..f85bdc8 100644
--- a/settings/translations/translations_NL.php
+++ b/settings/translations/translations_NL.php
@@ -162,8 +162,8 @@ $service_report_maintenance_test_status = 'Status';
$service_report_outcome_good = 'Goed';
$service_report_outcome_attention = 'Attentie';
$service_report_no_text = 'Geen service rapporten ';
-$service_maintenance_test_fail = 'Afgekeurd';
-$service_maintenance_test_pass = 'Goed';
+$service_maintenance_test_fail = 'Niet goedgekeurd';
+$service_maintenance_test_pass = 'Goedgekeurd';
$status0 = '0';
$status0_text = 'Nieuw';
$status1 = '1';
@@ -466,8 +466,8 @@ $contract_ignore_serial = 'Negeer serienummers';
$contract_assigned_users = 'Gekoppelde gebruikers';
$contract_assigned_users_add = 'Gebruiker toevoegen';
$group_header_1 = 'Algemeen';
-$group_header_2 = 'Kop - Type 1';
-$group_header_3 = 'Kop - Type 2';
+$group_header_2 = 'Type 1 connector';
+$group_header_3 = 'Type 2 connector';
$group_header_4 = 'Batterij';
$group_header_5 = 'Behuizing';
$group_header_6 = 'Acties';
@@ -500,7 +500,6 @@ $service_visual_12 = 'Staat van de behuizing';
$service_visual_13 = 'Batterijklep aanwezig?';
$service_visual_14 = 'Corrosie op de batterij contacten?';
$service_visual_15 = 'Serienummer leesbaar?';
-$service_visual_15 = 'Serienummer leesbaar?';
$service_visual_16 = 'USB poort schoon?';
$service_visual_17 = 'Beweging op de USB poort?';
$service_visual_18 = 'All schroeven vast (5x)?';
@@ -669,13 +668,86 @@ $buildreport_onstock_text = 'Totaal aantal Voorraad';
$data_build_sfg_view = 'half-fabrikaat geproduceerd in de laatste 7 dagen';
$data_build_fg_view = 'Kompleet produkt geproduceerd in de laatste 7 dagen';
$menu_translations = 'Vertalingen';
+$button_create_rma = 'Maak RMA';
+$rmas_h2 = 'Retourmateriaal';
+$rmas_p = 'Bekijk, beheer en zoek RMA-gegevens.';
+$rma_h2 = 'Retourmateriaalverzoek';
+$message_rma_1 = 'RMA succesvol aangemaakt!';
+$message_rma_2 = 'RMA succesvol bijgewerkt!';
+$message_rma_3 = 'RMA succesvol verwijderd!';
+$message_no_rma = 'Er is geen RMA';
+$rma_search = 'Zoek RMA...';
+$rma_rowID = 'Verzoeknummer';
+$rma_status = 'Status';
+$rma_status0_text = 'Nieuw';
+$rma_status1_text = 'In uitvoering';
+$rma_status2_text = 'Goedgekeurd';
+$rma_status3_text = 'Voltooid';
+$rma_status4_text = 'Geannuleerd';
+$rma_sw_version_latest = 'Laatste softwareversie';
+$rma_servicereport_latest = 'Servicebericht gemaakt in de laatste 7 dagen';
+$rma_information = 'RMA informatie';
+$rma_return_reason = 'Retourreden';
+$rma_return_reason0_text = '';
+$rma_return_reason1_text = '';
+$rma_return_reason2_text = '';
+$rma_return_reason3_text = '';
+$rma_return_reason4_text = '';
+$rma_return_reasons_notes = 'Aantekeningen retourreden';
+$rma_return_tab1 = 'Retourreden';
+$rma_return_tab2 = 'Vragen';
+$rma_question_allowed_label1 = 'Ja';
+$rma_question_allowed_label2 = 'Nee';
+$rma_question_header_1 = '';
+$rma_question_1 = 'Werken de batterijen?';
+$rma_question_2 = 'Werkt de knop correct?';
+$rma_question_3 = '';
+$rma_question_4 = '';
+$rma_question_5 = '';
+$rma_question_6 = '';
+$rma_question_7 = '';
+$menu_rmas = 'Retourmateriaal';
+$button_create_text_variable = 'Maak variabele';
+$message_no_text_variables = 'Er zijn geen variabelen';
+$text_variables_h2 = 'Vertalingen';
+$text_variable_name = 'Naam van de variabele';
$text_variable_translation_languagekey = 'Taal';
$text_variable_translation_translation = 'Vertaling';
-$menu_products_attributes = 'Produkt attributen';
+$menu_products_attributes = 'Productattributen';
+$message_patt_1 = 'Productattribuut succesvol aangemaakt!';
+$message_patt_2 = 'Productattribuut succesvol bijgewerkt!';
+$message_patt_3 = 'Productattribuut succesvol verwijderd!';
+$products_attributes_h2 = 'Productattributen';
+$products_attributes_p = 'Bekijk, beheer en zoek productattributen';
+$button_create_products_attribute = 'Maak attribuut';
+$products_attribute_search = 'Zoek attribuut';
+$products_attribute_rowID = 'Attribuut ID';
+$products_attribute_group_name = 'Naam';
+$message_no_products_attributes = 'Er zijn geen attributen';
+$products_attribute_group_status = 'Status';
+$products_attribute_group_type = 'Type';
$general_status_0 = 'Inactief';
$general_status_1 = 'Actief';
+$products_attributes_group_status = 'Status';
+$products_attributes_group_name = 'Naam van de groep';
+$general_form_0 = 'Keuzerondje';
+$general_form_1 = 'Checkbox';
+$general_form_2 = 'Keuzelijst';
+$products_attributes_group_mandatory = 'Verplicht';
+$products_attributes_group_items = 'Items in groep';
+$products_attributes_item_rowID = 'Item ID';
+$products_attributes_item_status = 'Status';
+$products_attributes_item_name = 'Item naam';
+$products_attributes_item_quantity = 'Aantal items';
+$products_attributes_item_position = 'Positie van item';
+$products_attributes_item_media = 'Item media';
+$product_name_1 = 'Vertaling van testproduct';
$menu_pricelists = 'Prijslijsten';
$menu_media = 'Media';
+$general_currency_1 = ' $';
+$general_currency_0 = ' €';
+$general_modifier_0 = '-';
+$general_modifier_1 = '+';
$h2_brand_name_1 = 'MorvalWatches';
$h2_brand_name_2 = 'een merk met een verhaal';
$h2_brand_visit = 'Onze collectie';
diff --git a/settings/translations/translations_PT.php b/settings/translations/translations_PT.php
index a1b4025..5f945a7 100644
--- a/settings/translations/translations_PT.php
+++ b/settings/translations/translations_PT.php
@@ -162,8 +162,8 @@ $service_report_maintenance_test_status = 'Status';
$service_report_outcome_good = 'Bom';
$service_report_outcome_attention = 'Atenção';
$service_report_no_text = 'Não há relatórios de serviço';
-$service_maintenance_test_fail = 'falhou';
-$service_maintenance_test_pass = 'bom';
+$service_maintenance_test_fail = 'Não aprovado';
+$service_maintenance_test_pass = 'Aprovado';
$status0 = '0';
$status0_text = 'Novo';
$status1 = '1';
@@ -466,8 +466,8 @@ $contract_ignore_serial = 'Ignorar números de série';
$contract_assigned_users = 'Usuários atribuídos';
$contract_assigned_users_add = 'Adicionar usuário';
$group_header_1 = 'Geral';
-$group_header_2 = 'Cabeça - Tipo 1';
-$group_header_3 = 'Cabeça - Tipo 2';
+$group_header_2 = 'Type 1 connector';
+$group_header_3 = 'Type 2 connector';
$group_header_4 = 'Unidade de bateria';
$group_header_5 = 'Carcaça';
$group_header_6 = 'Ações';
@@ -500,7 +500,6 @@ $service_visual_12 = 'Estado da carcaça de plástico';
$service_visual_13 = 'Cobertura da bateria disponível?';
$service_visual_14 = 'Corrosão nos contatos da bateria?';
$service_visual_15 = 'Número de série legível?';
-$service_visual_15 = 'Número de série legível?';
$service_visual_16 = 'Conector USB limpo?';
$service_visual_17 = 'Movimento no conector USB?';
$service_visual_18 = 'Parafusos fixos (5x)?';
@@ -669,9 +668,86 @@ $buildreport_onstock_text = 'Número total Em estoque';
$data_build_sfg_view = 'semi-acabado produzido nos últimos 7 dias';
$data_build_fg_view = 'produto acabado produzido nos últimos 7 dias';
$menu_translations = 'Traduções';
+$button_create_rma = 'Criar RMA';
+$rmas_h2 = 'Material de devolução';
+$rmas_p = 'Visualizar, gerenciar e buscar detalhes do RMA';
+$rma_h2 = 'Solicitação de material de devolução';
+$message_rma_1 = 'RMA criada com sucesso!';
+$message_rma_2 = 'RMA atualizada com sucesso!';
+$message_rma_3 = 'RMA excluída com sucesso!';
+$message_no_rma = 'Não há RMA';
+$rma_search = 'Procurar RMA...';
+$rma_rowID = 'Número de solicitação';
+$rma_status = 'Status';
+$rma_status0_text = 'Novo';
+$rma_status1_text = 'Em progresso';
+$rma_status2_text = 'Aprovado';
+$rma_status3_text = 'Concluído';
+$rma_status4_text = 'Cancelado';
+$rma_sw_version_latest = 'Última versão do software';
+$rma_servicereport_latest = 'Relatório de serviço criado nos últimos 7 dias';
+$rma_information = 'Informações do RMA';
+$rma_return_reason = 'Motivo de devolução';
+$rma_return_reason0_text = '';
+$rma_return_reason1_text = '';
+$rma_return_reason2_text = '';
+$rma_return_reason3_text = '';
+$rma_return_reason4_text = '';
+$rma_return_reasons_notes = 'Notas sobre o motivo de devolução';
+$rma_return_tab1 = 'Motivo de devolução';
+$rma_return_tab2 = 'Perguntas';
+$rma_question_allowed_label1 = 'Sim';
+$rma_question_allowed_label2 = 'Não';
+$rma_question_header_1 = '';
+$rma_question_1 = 'As baterias estão funcionando?';
+$rma_question_2 = 'O botão está funcionando corretamente?';
+$rma_question_3 = '';
+$rma_question_4 = '';
+$rma_question_5 = '';
+$rma_question_6 = '';
+$rma_question_7 = '';
+$menu_rmas = 'Material de devolução';
+$button_create_text_variable = 'Criar variável';
+$message_no_text_variables = 'Não há variáveis';
+$text_variables_h2 = 'Traduções';
+$text_variable_name = 'Nome da variável';
+$text_variable_translation_languagekey = 'Idioma';
+$text_variable_translation_translation = 'Tradução';
+$menu_products_attributes = 'Atributos de produto';
+$message_patt_1 = 'Atributo de produto criado com sucesso!';
+$message_patt_2 = 'Atributo de produto atualizado com sucesso!';
+$message_patt_3 = 'Atributo de produto excluído com sucesso!';
+$products_attributes_h2 = 'Atributos de produto';
+$products_attributes_p = 'Visualizar, gerenciar e buscar atributos';
+$button_create_products_attribute = 'Criar atributo';
+$products_attribute_search = 'Procurar atributo';
+$products_attribute_rowID = 'ID do atributo';
+$products_attribute_group_name = 'Nome';
+$message_no_products_attributes = 'Não há atributos';
+$products_attribute_group_status = 'Status';
+$products_attribute_group_type = 'Tipo';
$general_status_0 = 'Inativo';
$general_status_1 = 'Ativo';
+$products_attributes_group_status = 'Status';
+$products_attributes_group_name = 'Nome do grupo';
+$general_form_0 = 'Botão de opção';
+$general_form_1 = 'Caixa de seleção';
+$general_form_2 = 'Lista suspensa';
+$products_attributes_group_mandatory = 'Obrigatório';
+$products_attributes_group_items = 'Itens no grupo';
+$products_attributes_item_rowID = 'ID do item';
+$products_attributes_item_status = 'Status';
+$products_attributes_item_name = 'Nome do item';
+$products_attributes_item_quantity = 'Quantidade do item';
+$products_attributes_item_position = 'Posição do item';
+$products_attributes_item_media = 'Mídia do item';
+$product_name_1 = 'Tradução do produto de teste';
+$menu_pricelists = 'Listas de preços';
$menu_media = 'Mídia';
+$general_currency_1 = ' $';
+$general_currency_0 = ' €';
+$general_modifier_0 = '-';
+$general_modifier_1 = '+';
$menu_catalog = 'Catálogo';
$menu_sales_orders = 'Pedidos';
$menu_identity = 'Identidade';
diff --git a/settings/translations/translations_US.php b/settings/translations/translations_US.php
index ebfe699..42c34cb 100644
--- a/settings/translations/translations_US.php
+++ b/settings/translations/translations_US.php
@@ -162,8 +162,8 @@ $service_report_maintenance_test_status = 'Status';
$service_report_outcome_good = 'Good';
$service_report_outcome_attention = 'Attention';
$service_report_no_text = 'There are no service reports ';
-$service_maintenance_test_fail = 'fail';
-$service_maintenance_test_pass = 'good';
+$service_maintenance_test_fail = 'Not approved';
+$service_maintenance_test_pass = 'Approved';
$status0 = '0';
$status0_text = 'New';
$status1 = '1';
@@ -466,8 +466,8 @@ $contract_ignore_serial = 'Ignore serialnumbers';
$contract_assigned_users = 'Assigned users';
$contract_assigned_users_add = 'Add user';
$group_header_1 = 'General';
-$group_header_2 = 'Head - Type 1';
-$group_header_3 = 'Head - Type 2';
+$group_header_2 = 'Type 1 connector';
+$group_header_3 = 'Type 2 connector';
$group_header_4 = 'Battery unit';
$group_header_5 = 'Casing';
$group_header_6 = 'Actions';
@@ -499,7 +499,6 @@ $service_visual_11 = 'Corrosion visible on pins?';
$service_visual_12 = 'State of plastic housing';
$service_visual_13 = 'Battery cover available?';
$service_visual_14 = 'Corrosion on battery contacts?';
-$service_visual_15 = 'Battery contacts available?';
$service_visual_15 = 'Serialnumber readable?';
$service_visual_16 = 'USB connector clean?';
$service_visual_17 = 'Movement on USB connector?';