diff --git a/application/Espo/Core/Htmlizer/Htmlizer.php b/application/Espo/Core/Htmlizer/Htmlizer.php index f5d8ef6699..055550cba2 100644 --- a/application/Espo/Core/Htmlizer/Htmlizer.php +++ b/application/Espo/Core/Htmlizer/Htmlizer.php @@ -123,14 +123,14 @@ class Htmlizer if ($item instanceof \StdClass) { $v = json_decode(json_encode($v), true); } - if (!is_array($v)) { - $v = []; - } - foreach ($v as $k => $w) { - $keyRaw = $k . '_RAW'; - $v[$keyRaw] = $v[$k]; - $v[$k] = $this->format($v[$k]); + if (is_array($v)) { + foreach ($v as $k => $w) { + $keyRaw = $k . '_RAW'; + $v[$keyRaw] = $v[$k]; + $v[$k] = $this->format($v[$k]); + } } + $newList[] = $v; } $data[$field] = $newList; diff --git a/application/Espo/Core/ORM/Entity.php b/application/Espo/Core/ORM/Entity.php index f9b289912f..14d74b9bae 100644 --- a/application/Espo/Core/ORM/Entity.php +++ b/application/Espo/Core/ORM/Entity.php @@ -52,7 +52,13 @@ class Entity extends \Espo\ORM\Entity if (!$this->entityManager->hasRepository($parentType)) return; $repository = $this->entityManager->getRepository($parentType); - $foreignEntity = $repository->select(['id', 'name'])->where(['id' => $parentId])->findOne(); + $select = ['id', 'name']; + if ($parentType === 'Lead') { + $select[] = 'accountName'; + $select[] = 'emailAddress'; + $select[] = 'phoneNumber'; + } + $foreignEntity = $repository->select($select)->where(['id' => $parentId])->findOne(); if ($foreignEntity) { $this->set($field . 'Name', $foreignEntity->get('name')); } @@ -88,6 +94,11 @@ class Entity extends \Espo\ORM\Entity } $defs['select'] = ['id', 'name']; + if ($foreignEntityType === 'Lead') { + $defs['select'][] = 'accountName'; + $defs['select'][] = 'emailAddress'; + $defs['select'][] = 'phoneNumber'; + } $hasType = false; if ($this->hasField($field . 'Types')) { diff --git a/application/Espo/Core/Repositories/CategoryTree.php b/application/Espo/Core/Repositories/CategoryTree.php index a2c577015e..f4f01dc7f4 100644 --- a/application/Espo/Core/Repositories/CategoryTree.php +++ b/application/Espo/Core/Repositories/CategoryTree.php @@ -41,7 +41,7 @@ class CategoryTree extends \Espo\Core\ORM\Repositories\RDB $query = $this->getEntityManager()->getQuery(); $parentId = $entity->get('parentId'); - $pathsTableName = $query->toDb($entity->getEntityType() . 'Path'); + $pathsTableName = $query->toDb($query->sanitize($entity->getEntityType()) . 'Path'); if ($entity->isNew()) { if ($parentId) { @@ -93,7 +93,7 @@ class CategoryTree extends \Espo\Core\ORM\Repositories\RDB $pdo = $this->getEntityManager()->getPDO(); $query = $this->getEntityManager()->getQuery(); - $pathsTableName = $query->toDb($entity->getEntityType() . 'Path'); + $pathsTableName = $query->toDb($query->sanitize($entity->getEntityType()) . 'Path'); $sql = "DELETE FROM `".$pathsTableName."` WHERE descendor_id = ".$pdo->quote($entity->id).""; $pdo->query($sql); diff --git a/application/Espo/Core/SelectManagers/Base.php b/application/Espo/Core/SelectManagers/Base.php index c235bb4127..3d1994b572 100644 --- a/application/Espo/Core/SelectManagers/Base.php +++ b/application/Espo/Core/SelectManagers/Base.php @@ -1351,7 +1351,7 @@ class Base $GLOBALS['log']->error("Could not create filter {$filterName} implementation."); return; } - $impl->applyFilter($filterName, $result); + $impl->applyFilter($this->entityType, $filterName, $result, $this); } } } diff --git a/application/Espo/Jobs/Cleanup.php b/application/Espo/Jobs/Cleanup.php index d8a21e2be9..47c5ab3e9e 100644 --- a/application/Espo/Jobs/Cleanup.php +++ b/application/Espo/Jobs/Cleanup.php @@ -62,13 +62,25 @@ class Cleanup extends \Espo\Core\Jobs\Base $this->cleanupActionHistory(); $this->cleanupAuthToken(); $this->cleanupUpgradeBackups(); + $this->cleanupUniqueIds(); } protected function cleanupJobs() { - $query = "DELETE FROM `job` WHERE DATE(modified_at) < '".$this->getCleanupJobFromDate()."' AND status <> 'Pending'"; - $pdo = $this->getEntityManager()->getPDO(); + + $query = "DELETE FROM `job` WHERE DATE(modified_at) < ".$pdo->quote($this->getCleanupJobFromDate())." AND status <> 'Pending'"; + + $sth = $pdo->prepare($query); + $sth->execute(); + } + + protected function cleanupUniqueIds() + { + $pdo = $this->getEntityManager()->getPDO(); + + $query = "DELETE FROM `unique_id` WHERE terminate_at IS NOT NULL AND terminate_at < ".$pdo->quote(date('Y-m-d H:i:s')).""; + $sth = $pdo->prepare($query); $sth->execute(); } @@ -83,29 +95,35 @@ class Cleanup extends \Espo\Core\Jobs\Base while ($row = $sth->fetch(\PDO::FETCH_ASSOC)) { $id = $row['id']; - $lastRowsSql = "SELECT id FROM scheduled_job_log_record WHERE scheduled_job_id = '".$id."' ORDER BY created_at DESC LIMIT 0,10"; + $lastRowsSql = "SELECT id FROM scheduled_job_log_record WHERE scheduled_job_id = ".$pdo->quote($id)." ORDER BY created_at DESC LIMIT 0,10"; $lastRowsSth = $pdo->prepare($lastRowsSql); $lastRowsSth->execute(); $lastRowIds = $lastRowsSth->fetchAll(\PDO::FETCH_COLUMN, 0); - $delSql = "DELETE FROM `scheduled_job_log_record` - WHERE scheduled_job_id = '".$id."' - AND DATE(created_at) < '".$this->getCleanupJobFromDate()."' - AND id NOT IN ('".implode("', '", $lastRowIds)."') - "; - $pdo->query($delSql); + if (count($lastRowIds)) { + foreach ($lastRowIds as $i => $v) { + $lastRowIds[$i] = $pdo->quote($v); + } + $delSql = "DELETE FROM `scheduled_job_log_record` + WHERE scheduled_job_id = ".$pdo->quote($id)." + AND DATE(created_at) < ".$pdo->quote($this->getCleanupJobFromDate())." + AND id NOT IN (".implode(',', $lastRowIds).") + "; + $pdo->query($delSql); + } } } protected function cleanupActionHistory() { + $pdo = $this->getEntityManager()->getPDO(); + $period = '-' . $this->getConfig()->get('cleanupActionHistoryPeriod', $this->cleanupActionHistoryPeriod); $datetime = new \DateTime(); $datetime->modify($period); - $query = "DELETE FROM `action_history_record` WHERE DATE(created_at) < '" . $datetime->format('Y-m-d') . "'"; + $query = "DELETE FROM `action_history_record` WHERE DATE(created_at) < " . $pdo->quote($datetime->format('Y-m-d')) . ""; - $pdo = $this->getEntityManager()->getPDO(); $sth = $pdo->prepare($query); $sth->execute(); } @@ -116,7 +134,7 @@ class Cleanup extends \Espo\Core\Jobs\Base $datetime = new \DateTime(); $datetime->modify($period); - $query = "DELETE FROM `reminder` WHERE DATE(remind_at) < '" . $datetime->format('Y-m-d') . "'"; + $query = "DELETE FROM `reminder` WHERE DATE(remind_at) < " . $pdo->quote($datetime->format('Y-m-d')) . ""; $pdo = $this->getEntityManager()->getPDO(); $sth = $pdo->prepare($query); @@ -125,13 +143,14 @@ class Cleanup extends \Espo\Core\Jobs\Base protected function cleanupAuthToken() { + $pdo = $this->getEntityManager()->getPDO(); + $period = '-' . $this->getConfig()->get('cleanupAuthTokenPeriod', $this->cleanupAuthTokenPeriod); $datetime = new \DateTime(); $datetime->modify($period); - $query = "DELETE FROM `auth_token` WHERE DATE(modified_at) < '" . $datetime->format('Y-m-d') . "' AND is_active = 0"; + $query = "DELETE FROM `auth_token` WHERE DATE(modified_at) < " . $pdo->quote($datetime->format('Y-m-d')) . " AND is_active = 0"; - $pdo = $this->getEntityManager()->getPDO(); $sth = $pdo->prepare($query); $sth->execute(); } @@ -334,4 +353,3 @@ class Cleanup extends \Espo\Core\Jobs\Base } } } - diff --git a/application/Espo/Modules/Crm/Business/Event/Invitations.php b/application/Espo/Modules/Crm/Business/Event/Invitations.php index f1419e88a0..0c483340fe 100644 --- a/application/Espo/Modules/Crm/Business/Event/Invitations.php +++ b/application/Espo/Modules/Crm/Business/Event/Invitations.php @@ -97,6 +97,21 @@ class Invitations 'inviteeType' => $invitee->getEntityType(), 'link' => $link )); + + if ($entity->get('dateEnd')) { + $terminateAt = $entity->get('dateEnd'); + } else { + $dt = new \DateTime(); + $dt->modify('+1 month'); + $terminateAt = $dt->format('Y-m-d H:i:s'); + } + + $uid->set([ + 'targetId' => $entity->id, + 'targetType' => $entity->getEntityType(), + 'terminateAt' => $terminateAt + ]); + $this->getEntityManager()->saveEntity($uid); $emailAddress = $invitee->get('emailAddress'); diff --git a/application/Espo/Modules/Crm/EntryPoints/EventConfirmation.php b/application/Espo/Modules/Crm/EntryPoints/EventConfirmation.php index 3f685e2d49..bb99bacc85 100644 --- a/application/Espo/Modules/Crm/EntryPoints/EventConfirmation.php +++ b/application/Espo/Modules/Crm/EntryPoints/EventConfirmation.php @@ -56,7 +56,6 @@ class EventConfirmation extends \Espo\Core\EntryPoints\Base if (!$uniqueId) { throw new NotFound(); - return; } $data = $uniqueId->get('data'); @@ -70,48 +69,53 @@ class EventConfirmation extends \Espo\Core\EntryPoints\Base if (!empty($eventType) && !empty($eventId) && !empty($inviteeType) && !empty($inviteeId) && !empty($link)) { $event = $this->getEntityManager()->getEntity($eventType, $eventId); $invitee = $this->getEntityManager()->getEntity($inviteeType, $inviteeId); - if ($event && $invitee) { - $status = 'None'; - $hookMethodName = 'afterConfirmation'; - if ($action == 'accept') { - $status = 'Accepted'; - } else if ($action == 'decline') { - $status = 'Declined'; - } else if ($action == 'tentative') { - $status = 'Tentative'; - } - $data = (object) [ - 'status' => $status - ]; - $this->getEntityManager()->getRepository($eventType)->updateRelation($event, $link, $invitee->id, $data); - - $actionData = [ - 'eventName' => $event->get('name'), - 'eventType' => $event->getEntityType(), - 'eventId' => $event->id, - 'dateStart' => $event->get('dateStart'), - 'action' => $action, - 'status' => $status, - 'link' => $link, - 'inviteeType' => $invitee->getEntityType(), - 'inviteeId' => $invitee->id - ]; - - $this->getEntityManager()->getHookManager()->process($event->getEntityType(), $hookMethodName, $event, [], $actionData); - - $this->getEntityManager()->getRepository('UniqueId')->remove($uniqueId); - - $runScript = " - Espo.require('crm:controllers/event-confirmation', function (Controller) { - var controller = new Controller(app.baseController.params, app.getControllerInjection()); - controller.masterView = app.masterView; - controller.doAction('confirmEvent', ".json_encode($actionData)."); - }); - "; - - $this->getClientManager()->display($runScript); + if (!$event || !$invitee) { + throw new NotFound(); } + + if ($event->get('status') === 'Held' || $event->get('status') === 'Not Held') { + throw new NotFound(); + } + + $status = 'None'; + $hookMethodName = 'afterConfirmation'; + if ($action == 'accept') { + $status = 'Accepted'; + } else if ($action == 'decline') { + $status = 'Declined'; + } else if ($action == 'tentative') { + $status = 'Tentative'; + } + + $data = (object) [ + 'status' => $status + ]; + $this->getEntityManager()->getRepository($eventType)->updateRelation($event, $link, $invitee->id, $data); + + $actionData = [ + 'eventName' => $event->get('name'), + 'eventType' => $event->getEntityType(), + 'eventId' => $event->id, + 'dateStart' => $event->get('dateStart'), + 'action' => $action, + 'status' => $status, + 'link' => $link, + 'inviteeType' => $invitee->getEntityType(), + 'inviteeId' => $invitee->id + ]; + + $this->getEntityManager()->getHookManager()->process($event->getEntityType(), $hookMethodName, $event, [], $actionData); + + $runScript = " + Espo.require('crm:controllers/event-confirmation', function (Controller) { + var controller = new Controller(app.baseController.params, app.getControllerInjection()); + controller.masterView = app.masterView; + controller.doAction('confirmEvent', ".json_encode($actionData)."); + }); + "; + + $this->getClientManager()->display($runScript); } throw new Error(); diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Account.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Account.json index ee9e1998a5..2de87faf9b 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Account.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Account.json @@ -26,10 +26,26 @@ "Education": "Educatie", "Electronics": "Electronice", "Finance": "Finante", - "Insurance": "Asigurari" + "Insurance": "Asigurari", + "Technology": "Tehnologie", + "Telecommunications": "Telecomunicații", + "Television": "Televiziune", + "Testing, Inspection & Certification": "Testare, Inspecție & Certificări", + "Transportation": "Transport", + "Travel": "Călătorit", + "Venture Capital": "Capital de risc", + "Wholesale": "Angro", + "Water": "Apă" } }, "labels": { - "Create Account": "Creare cont" + "Create Account": "Creare cont", + "Copy Billing": "Copiați facturarea", + "Set Primary": "Setați primar" + }, + "presetFilters": { + "customers": "Clienți", + "partners": "Parteneri", + "recentlyCreated": "Create recent" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Admin.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Admin.json index 9e26dfeeb6..46f9843c11 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Admin.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Admin.json @@ -1 +1,5 @@ -{} \ No newline at end of file +{ + "layouts": { + "listForAccount": "Listă (pentru Cont)" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Calendar.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Calendar.json index 8d2dafde66..ed82a5f06c 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Calendar.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Calendar.json @@ -1,13 +1,21 @@ { "modes": { - "month": "Luna", - "week": "Saptamana", - "agendaWeek": "Saptamana", + "month": "Lună", + "week": "Săptămână", + "agendaWeek": "Săptămână", "day": "Zi", - "agendaDay": "Zi" + "agendaDay": "Zi", + "timeline": "Cronologie" }, "labels": { - "Today": "Astazi", - "Create": "Creaza" + "Today": "Astăzi", + "Create": "Crează", + "Shared": "Partajat", + "Add User": "Adăugare utilizator", + "current": "actual", + "time": "timp", + "User List": "Listă Utiliziator", + "Manage Users": "Gestionare Utilizatori", + "View Calendar": "Vizualizare Calendar" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Call.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Call.json index 7002d8a6c7..50e43f8350 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Call.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Call.json @@ -1,35 +1,49 @@ { "fields": { "name": "Nume", - "parent": "Parinte", - "dateStart": "Data inceput", - "dateEnd": "Data terminare", - "direction": "Directie", - "duration": "Durata", + "parent": "Părinte", + "dateStart": "Dată început", + "dateEnd": "Dată terminare", + "direction": "Direcție", + "duration": "Durată", "description": "Descriere", "users": "Utilizatori", "contacts": "Contacte", - "leads": "Lead-uri" + "leads": "Lead-uri", + "reminders": "Mementouri", + "account": "Cont", + "acceptanceStatus": "Starea de acceptare" }, "options": { "status": { "Planned": "Planificat", - "Held": "Detinut", - "Not Held": "Nedetinut" + "Held": "Reținut", + "Not Held": "Nereșinut" }, "direction": { - "Outbound": "Iesire", + "Outbound": "Ieșire", "Inbound": "Intrare" + }, + "acceptanceStatus": { + "None": "Nici unul", + "Accepted": "Acceptat", + "Declined": "Respins", + "Tentative": "Tentativă" } }, + "massActions": { + "setHeld": "Setează ca reținut", + "setNotHeld": "Setează ca nereținut" + }, "labels": { "Create Call": "Creare Apelare", - "Set Held": "Setare detinere", - "Set Not Held": "Setare nedetinere", - "Send Invitations": "Trimite invitatii" + "Set Held": "Setează ca reținut", + "Set Not Held": "Setează ca nereținut", + "Send Invitations": "Trimite invitații" }, "presetFilters": { "planned": "Planificat", - "held": "Detinut" + "held": "Reținut", + "todays": "Azi" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Campaign.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Campaign.json index 9e26dfeeb6..2106761de3 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Campaign.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Campaign.json @@ -1 +1,65 @@ -{} \ No newline at end of file +{ + "fields": { + "name": "Nume", + "description": "Descriere", + "type": "Tip", + "startDate": "Dată începere", + "endDate": "Dată terminare", + "targetLists": "Liste țintă", + "excludingTargetLists": "Excluderea listelor țintă", + "sentCount": "Trimis", + "openedCount": "Deschis", + "clickedCount": "Apăsat", + "optedOutCount": "Ales să nu", + "revenue": "Venituri", + "revenueConverted": "Venituri (convertit)", + "budget": "Buget", + "budgetConverted": "Buget (convertit)" + }, + "links": { + "targetLists": "Liste Țintă", + "excludingTargetLists": "Excluderea listelor țintă", + "accounts": "Conturi", + "contacts": "Contacte", + "leads": "Lead-uri", + "opportunities": "Oportunități", + "campaignLogRecords": "Jurnal", + "massEmails": "Email-uri în Masă", + "trackingUrls": "Urmărire URL-uri" + }, + "options": { + "type": { + "Television": "Televiziune" + }, + "status": { + "Planning": "Planificare", + "Active": "Activ", + "Inactive": "Inactiv", + "Complete": "Complet" + } + }, + "labels": { + "Create Campaign": "Crează Campanie", + "Target Lists": "Liste Țintă", + "Statistics": "Statistici", + "hard": "tare", + "soft": "ușor", + "Unsubscribe": "Dezabonare", + "Mass Emails": "Email-uri în Masă", + "Email Templates": "Șabloane Email", + "Unsubscribe again": "Dezabonare încă o dată", + "Subscribe again": "Abonare încă o dată", + "Create Target List": "Creați Listă Țintă" + }, + "presetFilters": { + "active": "Activ" + }, + "messages": { + "unsubscribed": "V-ați dezabonat din lista noastră de mail-uri", + "subscribedAgain": "V-ați abonat încă o dată." + }, + "tooltips": { + "targetLists": "Țintele care ar trebui să primească mesaje.", + "excludingTargetLists": "Țintele care nu ar trebui să primească mesaje." + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignLogRecord.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignLogRecord.json index 9e26dfeeb6..198aede557 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignLogRecord.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignLogRecord.json @@ -1 +1,40 @@ -{} \ No newline at end of file +{ + "fields": { + "action": "Acțiune", + "actionDate": "Dată", + "data": "Date", + "campaign": "Campanie", + "parent": "Țintă", + "object": "Obiect", + "application": "Aplicație", + "queueItem": "Elementul de așteptare", + "stringData": "Șir Date", + "stringAdditionalData": "Șir de Date Adiționale", + "isTest": "Este Test" + }, + "links": { + "queueItem": "Elementul de așteptare", + "parent": "Părinte", + "object": "Obiect", + "campaign": "Campanie" + }, + "options": { + "action": { + "Sent": "Trimis", + "Opened": "Deschis", + "Opted Out": "Ales să nu", + "Clicked": "Apăsat", + "Lead Created": "Lead-ul a fost creat" + } + }, + "labels": { + "All": "Tot" + }, + "presetFilters": { + "sent": "Trimis", + "opened": "Deschis", + "optedOut": "Ales să nu", + "clicked": "Apăsat", + "leadCreated": "Lead-ul a fost creat" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignTrackingUrl.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignTrackingUrl.json index 9e26dfeeb6..ce8abeadb8 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignTrackingUrl.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/CampaignTrackingUrl.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "fields": { + "urlToUse": "Cod pentru inserare, în locul URL", + "campaign": "Campanie" + }, + "links": { + "campaign": "Campanie" + }, + "labels": { + "Create CampaignTrackingUrl": "Creați Urmărire URL" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Case.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Case.json index 36b59c22c3..5e491970fd 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Case.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Case.json @@ -1,35 +1,54 @@ { "fields": { "name": "Nume", - "number": "Numar", + "number": "Număr", "account": "Cont", + "contacts": "Contacte", "priority": "Prioritate", "type": "Tip", - "description": "Descriere" + "description": "Descriere", + "inboundEmail": "Grup Cont Email", + "attachments": "Atașamente" + }, + "links": { + "inboundEmail": "Grup Cont Email", + "account": "Cont", + "contact": "Contact (Principal)", + "Contacts": "Contacte", + "meetings": "Întâlniri", + "calls": "Apeluri", + "tasks": "Sarcini", + "emails": "Email-uri", + "articles": "Articole Bază de Cunoștință", + "attachments": "Atașamente" }, "options": { "status": { "New": "Nou", "Assigned": "Alocat", - "Pending": "In asteptare", - "Closed": "Inchis", + "Pending": "În așteptare", + "Closed": "Închis", "Rejected": "Respins", "Duplicate": "Duplicat" }, "priority": { - "Low": "Scazut", - "High": "Inalt" + "Low": "Scăzut", + "High": "Înalt" }, "type": { - "Question": "Intrebare", - "Problem": "Problema" + "Question": "Întrebare", + "Problem": "Problemă" } }, "labels": { - "Create Case": "Creare Caz" + "Create Case": "Creare Caz", + "Close": "Închis", + "Reject": "Respins", + "Closed": "Închis", + "Rejected": "Respins" }, "presetFilters": { - "open": "Deschide", - "closed": "Inchis" + "open": "Deschis", + "closed": "Închis" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Contact.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Contact.json index 0adcfa2cb0..a21a89ad6c 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Contact.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Contact.json @@ -7,15 +7,46 @@ "accounts": "Conturi", "phoneNumber": "Telefon", "accountType": "Tip cont", - "doNotCall": "Nu sunati", - "address": "Adresa", - "description": "Descriere" + "doNotCall": "Nu sunați", + "address": "Adresă", + "opportunityRole": "Rol Oportunitate", + "description": "Descriere", + "campaign": "Campanie", + "targetLists": "Liste Țintă", + "targetList": "Listă țintă", + "portalUser": "Utilizator Portal", + "originalLead": "Lead Original", + "acceptanceStatus": "Status Acceptare", + "accountIsInactive": "Cont Inactiv", + "acceptanceStatusMeetings": "Status Acceptare (Întâlniri)", + "acceptanceStatusCalls": "Status Acceptare (Apeluri)" }, "links": { - "opportunities": "Oportunitati", - "cases": "Cazuri" + "opportunities": "Oportunități", + "cases": "Cazuri", + "targetLists": "Liste Țintă", + "campaignLogRecords": "Jurnal Campanie", + "campaign": "Campanie", + "account": "Cont (Principal)", + "accounts": "Conturi", + "casesPrimary": "Cazuri (Principal)", + "tasksPrimary": "Sarcini (extins)", + "portalUser": "Utilizator Portal", + "originalLead": "Lead Original", + "documents": "Documente" }, "labels": { "Create Contact": "Creare Contact" + }, + "options": { + "opportunityRole": { + "": "--Nici unul--", + "Decision Maker": "Factor de decizie" + } + }, + "presetFilters": { + "portalUsers": "Utilizatori Portal", + "notPortalUsers": "Nu sunt Utilizatori ai Portalului", + "accountActive": "Activ" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Document.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Document.json index 9e26dfeeb6..7bcda930cb 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Document.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Document.json @@ -1 +1,39 @@ -{} \ No newline at end of file +{ + "labels": { + "Create Document": "Creați Document", + "Details": "Detalii" + }, + "fields": { + "name": "Nume", + "file": "Fișier", + "type": "Tip", + "publishDate": "Publică Dată", + "expirationDate": "Data expirării", + "description": "Descriere", + "accounts": "Conturi", + "folder": "Dosar" + }, + "links": { + "accounts": "Conturi", + "opportunities": "Oportunități", + "folder": "Dosar", + "leads": "Lead-uri", + "contacts": "Contacte" + }, + "options": { + "status": { + "Active": "Activ", + "Draft": "Schiță", + "Expired": "Expirat", + "Canceled": "Anulat" + }, + "type": { + "": "Nici unul", + "License Agreement": "Acord de licențiere" + } + }, + "presetFilters": { + "active": "Activ", + "draft": "Schiță" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/DocumentFolder.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/DocumentFolder.json index 9e26dfeeb6..0be96eb7d5 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/DocumentFolder.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/DocumentFolder.json @@ -1 +1,10 @@ -{} \ No newline at end of file +{ + "labels": { + "Create DocumentFolder": "Creați Dosarul Documentului", + "Manage Categories": "Gestionare Dosare", + "Documents": "Documente" + }, + "links": { + "documents": "Documente" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Email.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Email.json index 9e26dfeeb6..dfd8e654fd 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Email.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Email.json @@ -1 +1,10 @@ -{} \ No newline at end of file +{ + "labels": { + "Create Lead": "Creați Lead", + "Create Contact": "Creați Contact", + "Add to Contact": "Adăugați la Contacte", + "Add to Lead": "Adăugați la Lead", + "Create Task": "Creați Sarcină", + "Create Case": "Creați Caz" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/EmailQueueItem.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/EmailQueueItem.json index 9e26dfeeb6..cd11926b7b 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/EmailQueueItem.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/EmailQueueItem.json @@ -1 +1,28 @@ -{} \ No newline at end of file +{ + "fields": { + "name": "Nume", + "target": "Țintă", + "sentAt": "Dată Trimitere", + "attemptCount": "Încercări", + "emailAddress": "Adresă Email", + "massEmail": "Email în Masă", + "isTest": "Este test" + }, + "links": { + "target": "Țintă", + "massEmail": "Email în Masă" + }, + "options": { + "status": { + "Pending": "În așteptare", + "Sent": "Trimis", + "Failed": "Eșuat", + "Sending": "Se trimite" + } + }, + "presetFilters": { + "pending": "În așteptare", + "sent": "Trimis", + "failed": "Eșuat" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Global.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Global.json index aa45d509a5..47e502a5ba 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Global.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Global.json @@ -2,67 +2,104 @@ "links": { "parent": "Părinte", "contacts": "Contacte", - "opportunities": "Oportunitati", + "opportunities": "Oportunități", "leads": "Lead-uri", - "meetings": "Intalniri", + "meetings": "Întâlniri", "calls": "Apeluri", - "tasks": "Activitati", - "emails": "Email-uri" + "tasks": "Sarcini", + "emails": "Email-uri", + "accounts": "Conturi", + "cases": "Cazuri", + "documents": "Documente", + "account": "Cont", + "opportunity": "Oportunitate" }, "scopeNames": { "Account": "Cont", - "Target": "Tinta", + "Target": "Țintă", "Opportunity": "Oportunitate", - "Meeting": "Intalnire", + "Meeting": "Întâlnire", "Call": "Apel", - "Task": "Activitate", - "Case": "Caz" + "Task": "Sarcină", + "Case": "Caz", + "DocumentFolder": "Dosar Document", + "Campaign": "Campanie", + "TargetList": "Listă Țintă", + "MassEmail": "Email în Masă", + "EmailQueueItem": "Email Element de așteptare", + "CampaignTrackingUrl": "Urmărire URL", + "Activities": "Activități", + "KnowledgeBaseArticle": "Atricol Bază de Cunoștințe", + "KnowledgeBaseCategory": "Categorie Bază de Cunoștințe", + "CampaignLogRecord": "Înregistrare Jurnal Campanie" }, "scopeNamesPlural": { "Account": "Conturi", "Contact": "Contacte", "Lead": "Lead-uri", - "Target": "Tinte", - "Opportunity": "Oportunitati", - "Meeting": "Intalniri", + "Target": "Ținte", + "Opportunity": "Oportunități", + "Meeting": "Întâlniri", "Call": "Apeluri", - "Task": "Activitati", - "Case": "Cazuri" + "Task": "Sarcini", + "Case": "Cazuri", + "Document": "Documente", + "DocumentFolder": "Dosare Document", + "Campaign": "Campanii", + "TargetList": "Liste Țintă", + "MassEmail": "Email-uri în Masă", + "EmailQueueItem": "Email Element de Așteptare", + "CampaignTrackingUrl": "Urmărire URL-uri", + "Activities": "Activității", + "KnowledgeBaseArticle": "Bază de Cunoștințe", + "KnowledgeBaseCategory": "Categorii Bază de Cunoștințe", + "CampaignLogRecord": "Înregistrări Jurnal Campanie" }, "dashlets": { "Leads": "Lead-urile mele", - "Opportunities": "Oportunitatile mele", - "Tasks": "Activitatile mele", + "Opportunities": "Oportunitățile mele", + "Tasks": "Sarcinile mele", "Cases": "Cazurile mele", - "OpportunitiesByStage": "Oportunitati in functie de stadiu", - "OpportunitiesByLeadSource": "Oportunitati in functie de Sursal Lead-ului", - "SalesByMonth": "Vanzari pe luna", - "SalesPipeline": "Flux Vanzari" + "Calls": "Apelurile mele", + "Meetings": "Întâlnirile mele", + "OpportunitiesByStage": "Oportunități în funcție de stadiu", + "OpportunitiesByLeadSource": "Oportunități în funcție de Sursa Lead-ului", + "SalesByMonth": "Vânzări pe luna", + "SalesPipeline": "Linie de Vanzari", + "Activities": "Activitățiile mele" }, "labels": { - "Create InboundEmail": "Creare Email intrare", - "Activities": "Activitati", + "Create InboundEmail": "Creare Email Intrare", + "Activities": "Activități", "History": "Istoric", - "Attendees": "Participanti", - "Schedule Meeting": "Programeaza Intalnire", - "Schedule Call": "Programeaza Apel", + "Attendees": "Participanți", + "Schedule Meeting": "Planifică Întâlnire", + "Schedule Call": "Planifică Apel", "Compose Email": "Compune Email", - "Log Meeting": "Log Intalnire", - "Log Call": "Log Apel", - "Archive Email": "Arhiveaza Email", - "Create Task": "Creaza Activitate", - "Tasks": "Activitati" + "Log Meeting": "Jurnal Intalnire", + "Log Call": "Jurnal Apel", + "Archive Email": "Arhivează Email", + "Create Task": "Crează Sarcină", + "Tasks": "Activități" }, "fields": { - "billingAddressCity": "Oras", - "addressCity": "Oras", - "billingAddressCountry": "Tara", - "addressCountry": "Tara", - "billingAddressPostalCode": "Code Postal ", - "addressPostalCode": "Code Postal ", + "billingAddressCity": "Oraș", + "addressCity": "Oraș", + "billingAddressCountry": "Țara", + "addressCountry": "Țara", + "billingAddressPostalCode": "Cod Poștal", + "addressPostalCode": "Cod Poștal", "billingAddressState": "Stat", "addressState": "Stat", "billingAddressStreet": "Strada", - "addressStreet": "Strada" + "addressStreet": "Strada", + "billingAddressMap": "Hartă", + "addressMap": "Hartă", + "shippingAddressCity": "Oraș (Livrare)", + "shippingAddressStreet": "Stradă (Livrare)", + "shippingAddressCountry": "Țară (Livrare)", + "shippingAddressState": "Stat (Livrare)", + "shippingAddressPostalCode": "Cod Poștal (Livrare)", + "shippingAddressMap": "Hartă (Livrare)" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseArticle.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseArticle.json index 9e26dfeeb6..d712d40172 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseArticle.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseArticle.json @@ -1 +1,46 @@ -{} \ No newline at end of file +{ + "labels": { + "Create KnowledgeBaseArticle": "Creați Articol", + "Any": "Oricare", + "Send in Email": "Trimite în Email", + "Move Up": "Mută Sus", + "Move Down": "Mută Jos", + "Move to Top": "Mută la Început", + "Move to Bottom": "Mută la Sfârșit" + }, + "fields": { + "name": "Nume", + "type": "Tip", + "attachments": "Atașamente", + "publishDate": "Publică Dată", + "expirationDate": "Data Expirării", + "description": "Descriere", + "body": "Conținut", + "categories": "Categorii", + "language": "Limbă", + "portals": "Portaluri" + }, + "links": { + "cases": "Cazuri", + "opportunities": "Oportunități", + "categories": "Ctegorii", + "portals": "Portaluri" + }, + "options": { + "status": { + "In Review": "În revizuire", + "Draft": "Schiță", + "Archived": "Arhivat", + "Published": "Publicat" + }, + "type": { + "Article": "Articol" + } + }, + "tooltips": { + "portals": "Articolul o să fie disponibil doar în portalurile specificate." + }, + "presetFilters": { + "published": "Publicat" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseCategory.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseCategory.json index 9e26dfeeb6..1a0dc4a0f9 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseCategory.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/KnowledgeBaseCategory.json @@ -1 +1,10 @@ -{} \ No newline at end of file +{ + "labels": { + "Create KnowledgeBaseCategory": "Creați Categorie", + "Manage Categories": "Gestionare Categorii", + "Articles": "Articole" + }, + "links": { + "articles": "Articole" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Lead.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Lead.json index b223b494e4..1ea896c1a1 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Lead.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Lead.json @@ -2,8 +2,8 @@ "labels": { "Converted To": "Convertit la", "Create Lead": "Creare Lead", - "Convert": "Converteste", - "convert": "converteste" + "Convert": "Convertește", + "convert": "convertește" }, "fields": { "name": "Nume", @@ -11,34 +11,54 @@ "website": "Site Web", "phoneNumber": "Telefon", "accountName": "Nume Cont", - "doNotCall": "Nu sunati", + "doNotCall": "Nu sunați", "address": "Adresa", "source": "Sursa", - "opportunityAmount": "Suma Oportunitate", + "opportunityAmount": "Sumă Oportunitate", + "opportunityAmountConverted": "Sumă Oportunitate (convertită)", "description": "Descriere", "createdAccount": "Cont", - "createdOpportunity": "Oportunitate" + "createdOpportunity": "Oportunitate", + "campaign": "Campanie", + "targetLists": "Liste Țintă", + "targetList": "Listă Țintă", + "industry": "Industrie", + "acceptanceStatus": "Status Acceptare", + "opportunityAmountCurrency": "Valută Sumă Oportunitate", + "acceptanceStatusMeetings": "Status Acceptare (Întâlniri)", + "acceptanceStatusCalls": "Status Acceptare (Apeluri)" + }, + "links": { + "targetLists": "Liste Țintă", + "campaignLogRecords": "Jurnal Campanie", + "campaign": "Campanie", + "createdAccount": "Cont", + "createdOpportunity": "Oportunitate", + "cases": "Cazuri", + "documents": "Documente" }, "options": { "status": { "New": "Nou", - "Assigned": "Alocat", - "In Process": "In Proces", + "Assigned": "Atribuit", + "In Process": "În Proces", "Converted": "Convertit", "Recycled": "Reciclat", "Dead": "Inactiv" }, "source": { + "": "Nici unul", "Call": "Apel", "Existing Customer": "Client Existent", "Partner": "Partener", - "Public Relations": "Relatii Publice", + "Public Relations": "Relații Publice", "Web Site": "Site Web", "Campaign": "Campanie", "Other": "Altele" } }, "presetFilters": { - "active": "Activ" + "active": "Activ", + "converted": "Convertit" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/MassEmail.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/MassEmail.json index 9e26dfeeb6..800e588ea3 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/MassEmail.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/MassEmail.json @@ -1 +1,55 @@ -{} \ No newline at end of file +{ + "fields": { + "name": "Nume", + "storeSentEmails": "Stocați email-urile trimise", + "startAt": "Data Începerii", + "fromAddress": "Din Adresă", + "fromName": "Din Nume", + "replyToAddress": "Răspundeți la Adresă", + "replyToName": "Răspundeți la Nume", + "campaign": "Campanie", + "emailTemplate": "Șablon Email", + "inboundEmail": "Cont Email", + "targetLists": "Liste Țintă", + "excludingTargetLists": "Excluderea listelor țintă", + "smtpAccount": "Cont SMTP" + }, + "links": { + "targetLists": "Liste Țintă", + "excludingTargetLists": "Excluderea listelor țintă", + "queueItems": "Elemente de Așteptare", + "campaign": "Campanie", + "emailTemplate": "Șablon Email", + "inboundEmail": "Cont Email" + }, + "options": { + "status": { + "Draft": "Schiță", + "Pending": "În așteptare", + "In Process": "În proces", + "Complete": "Terminat", + "Canceled": "Anulat", + "Failed": "Eșuat" + } + }, + "labels": { + "Create MassEmail": "Creați Email în Masă", + "Send Test": "Trimite Test", + "System SMTP": "Sistem SMTP", + "system": "sistem", + "group": "grup" + }, + "messages": { + "selectAtLeastOneTarget": "Selectați cel puțin o țintă.", + "testSent": "Email(uri) test care ar trebui să fie trimise" + }, + "tooltips": { + "optOutEntirely": "Adresele de email ale destinatarilor care s-au dezabonat, vor fi marcate ca fiind oprite și nu vor mai primi email-uri în masă ", + "targetLists": "Țintele care ar trebui să primească mesaje.", + "excludingTargetLists": "Țintele care nu ar trebui să primească mesaje.", + "storeSentEmails": "Email-urile o să fie stocate în CRM." + }, + "presetFilters": { + "complete": "Terminat" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Meeting.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Meeting.json index 3a2ad332d5..8d7107c19d 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Meeting.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Meeting.json @@ -1,30 +1,49 @@ { "fields": { "name": "Nume", - "parent": "Parinte", - "dateStart": "Data inceput", - "dateEnd": "Data terminare", - "duration": "Durata", + "parent": "Părinte", + "dateStart": "Dată Început", + "dateEnd": "Dată Terminare", + "duration": "Durată", "description": "Descriere", "users": "Utilizatori", "contacts": "Contacte", - "leads": "Lead-uri" + "leads": "Lead-uri", + "reminders": "Mementouri", + "account": "Cont", + "acceptanceStatus": "Status Acceptare" }, "options": { "status": { "Planned": "Planificat", - "Held": "Detinut", - "Not Held": "Nedetinut" + "Held": "Reținut", + "Not Held": "Nereținut" + }, + "acceptanceStatus": { + "None": "Nici unul", + "Accepted": "Acceptat", + "Declined": "Respins", + "Tentative": "Tentativă" } }, + "massActions": { + "setHeld": "Setat ca reținut", + "setNotHeld": "Setat ca nereținut" + }, "labels": { - "Create Meeting": "Creare Intalnire", - "Set Held": "Setare detinere", - "Set Not Held": "Setare nedetinere", - "Send Invitations": "Trimite invitatii" + "Create Meeting": "Creare Întâlnire", + "Set Held": "Setat ca reținut", + "Set Not Held": "Setat ca nereținut", + "Send Invitations": "Trimite Invitații", + "on time": "la timp", + "before": "înainte" }, "presetFilters": { "planned": "Planificat", - "held": "Detinut" + "held": "Reținut", + "todays": "Astăzi" + }, + "messages": { + "nothingHasBeenSent": "Nu a fost trimis nimic" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Opportunity.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Opportunity.json index 58bd9d45ad..740f6ef8a6 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Opportunity.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Opportunity.json @@ -3,37 +3,48 @@ "name": "Nume", "account": "Cont", "stage": "Stadiu", - "amount": "Suma", + "amount": "Sumă", "probability": "Probabilitate, %", - "leadSource": "Sursa Lead", - "doNotCall": "Nu sunati", - "closeDate": "Data Inchiderii", + "leadSource": "Sursă Lead", + "doNotCall": "Nu sunați", + "closeDate": "Data Închiderii", "contacts": "Contacte", - "description": "Descriere" + "description": "Descriere", + "amountConverted": "Sumă (convertit)", + "amountWeightedConverted": "Suma ponderată", + "campaign": "Campanie", + "originalLead": "Lead Original", + "amountCurrency": "Sumă Valută", + "contactRole": "Rol Contact" }, "links": { - "contacts": "Contacte" + "contacts": "Contacte", + "documents": "Documente", + "campaign": "Campanie", + "originalLead": "Lead Original" }, "options": { "stage": { "Prospecting": "Prospectare", - "Qualification": "Calificari", + "Qualification": "Calificări", "Proposal": "Propunere", "Negotiation": "Negociere", - "Needs Analysis": "Necesita Analiza", - "Value Proposition": "Valoare Propunere", + "Needs Analysis": "Necesită Analiză", + "Value Proposition": "Propunere Valoare", "Id. Decision Makers": "Id. Factori de Decizie", - "Perception Analysis": "Analiza Perceptiei", - "Proposal/Price Quote": "Propunere/Oferta Pret", + "Perception Analysis": "Analiză Percepției", + "Proposal/Price Quote": "Propunere/Preț Ofertă", "Negotiation/Review": "Negociere/Revizuire", - "Closed Won": "Inchide ca Castigat", - "Closed Lost": "Inchide ca Pierdut" + "Closed Won": "Închide Câștigat", + "Closed Lost": "Închide Pierdut" } }, "labels": { "Create Opportunity": "Creare Oportunitate" }, "presetFilters": { - "open": "Deschide" + "open": "Deschide", + "won": "Câștigat", + "lost": "Pierdut" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Portal.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Portal.json index 9e26dfeeb6..a6f52a7bc2 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Portal.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Portal.json @@ -1 +1,5 @@ -{} \ No newline at end of file +{ + "links": { + "articles": "Articole Bază de Cunoștință" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/ScheduledJob.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/ScheduledJob.json index 9e26dfeeb6..9a82e4aaf4 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/ScheduledJob.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/ScheduledJob.json @@ -1 +1,8 @@ -{} \ No newline at end of file +{ + "options": { + "job": { + "ProcessMassEmail": "Trimite Email-uri în Masă", + "ControlKnowledgeBaseArticleStatus": "Controlează Statusul Articolelor Bază de Cunoștințe" + } + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/TargetList.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/TargetList.json index 9e26dfeeb6..1fb06df438 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/TargetList.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/TargetList.json @@ -1 +1,30 @@ -{} \ No newline at end of file +{ + "fields": { + "name": "Nume", + "description": "Descriere", + "entryCount": "Numără Intrări", + "campaigns": "Campanii", + "endDate": "Dată Terminare", + "targetLists": "Liste Țintă", + "includingActionList": "Include", + "excludingActionList": "Exclude" + }, + "links": { + "accounts": "Conturi", + "contacts": "Contacte", + "leads": "Lead-uri", + "campaigns": "Campanii", + "massEmails": "Email-uri în Masă" + }, + "options": { + "type": { + "Television": "Televiziune" + } + }, + "labels": { + "Create TargetList": "Creați Listă Țintă", + "Opted Out": "Ales să nu", + "Cancel Opt-Out": "Anulează alegerea de ieșire", + "Opt-Out": "Aleg să nu" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Task.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Task.json index 4fa1b3ed26..f9ccea2dd5 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Task.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/Task.json @@ -1,29 +1,44 @@ { "fields": { "name": "Nume", - "parent": "Parinte", - "dateStart": "Data inceput", - "dateEnd": "Data scadenta", + "parent": "Părinte", + "dateStart": "Dată Începere", + "dateEnd": "Dată Scadență", + "dateStartDate": "Dată Începere (toată ziua)", + "dateEndDate": "Dată Terminare (toată ziua)", "priority": "Prioritate", "description": "Descriere", - "isOverdue": "Este Restant" + "isOverdue": "Este Restant", + "account": "Cont", + "dateCompleted": "Dată Terminare", + "attachments": "Atașamente", + "reminders": "Mementouri" + }, + "links": { + "attachments": "Atașamente", + "account": "Cont" }, "options": { "status": { - "Not Started": "Ne inceput", - "Started": "Inceput", - "Completed": "Completat", - "Canceled": "Anulat" + "Not Started": "Nu a început", + "Started": "Început", + "Completed": "Terminat", + "Canceled": "Anulat", + "Deferred": "Amânat" }, "priority": { - "Low": "Scazut", - "High": "Inalt" + "Low": "Scăzut", + "High": "Înalt" } }, "labels": { - "Create Task": "Creaza Activitate" + "Create Task": "Crează Sarcine", + "Complete": "Terminat" }, "presetFilters": { - "completed": "Completat" + "completed": "Terminat", + "deferred": "Amânat", + "todays": "Astăzi", + "overdue": "Restant" } } \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/User.json b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/User.json index 9e26dfeeb6..2ae8483e8c 100644 --- a/application/Espo/Modules/Crm/Resources/i18n/ro_RO/User.json +++ b/application/Espo/Modules/Crm/Resources/i18n/ro_RO/User.json @@ -1 +1,10 @@ -{} \ No newline at end of file +{ + "fields": { + "acceptanceStatus": "Stare Acceptare", + "acceptanceStatusMeetings": "Stare Acceptare (Întâlniri)", + "acceptanceStatusCalls": "Stare Acceptare (Apeluri)" + }, + "links": { + "targetLists": "Liste Țintă" + } +} \ No newline at end of file diff --git a/application/Espo/Modules/Crm/Resources/layouts/TargetList/listForTarget.json b/application/Espo/Modules/Crm/Resources/layouts/TargetList/listForTarget.json new file mode 100644 index 0000000000..eae61f558b --- /dev/null +++ b/application/Espo/Modules/Crm/Resources/layouts/TargetList/listForTarget.json @@ -0,0 +1,4 @@ +[ + {"name":"name", "link":true}, + {"name":"entryCount", "width": 25, "notSortable": true} +] diff --git a/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Account.json b/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Account.json index a72b852b69..a812be0ba6 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Account.json +++ b/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Account.json @@ -58,6 +58,9 @@ "rowActionsView": "views/record/row-actions/empty", "select": false, "create": false + }, + "targetLists": { + "layout": "listForTarget" } }, "filterList": [ diff --git a/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Contact.json b/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Contact.json index 7e618fa392..1fea21dd71 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Contact.json +++ b/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Contact.json @@ -85,7 +85,8 @@ }, "targetLists": { "create": false, - "rowActionsView": "views/record/row-actions/relationship-unlink-only" + "rowActionsView": "views/record/row-actions/relationship-unlink-only", + "layout": "listForTarget" } }, "boolFilterList": [ diff --git a/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Lead.json b/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Lead.json index 62790305ee..6326b5fcef 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Lead.json +++ b/application/Espo/Modules/Crm/Resources/metadata/clientDefs/Lead.json @@ -118,7 +118,8 @@ }, "targetLists":{ "create":false, - "rowActionsView":"views/record/row-actions/relationship-unlink-only" + "rowActionsView":"views/record/row-actions/relationship-unlink-only", + "layout": "listForTarget" } }, "filterList":[ diff --git a/application/Espo/Repositories/Import.php b/application/Espo/Repositories/Import.php index 691b869bce..a150263313 100644 --- a/application/Espo/Repositories/Import.php +++ b/application/Espo/Repositories/Import.php @@ -49,7 +49,7 @@ class Import extends \Espo\Core\ORM\Repositories\RDB { $entityType = $entity->get('entityType'); $pdo = $this->getEntityManager()->getPDO(); - $table = $this->getEntityManager()->getQuery()->toDb($entityType); + $table = $this->getEntityManager()->getQuery()->toDb($this->getEntityManager()->getQuery()->sanitize($entityType)); $part = "0"; switch ($link) { diff --git a/application/Espo/Resources/i18n/ro_RO/Email.json b/application/Espo/Resources/i18n/ro_RO/Email.json index d72d30efc9..a000c45334 100644 --- a/application/Espo/Resources/i18n/ro_RO/Email.json +++ b/application/Espo/Resources/i18n/ro_RO/Email.json @@ -8,8 +8,8 @@ "replyTo": "Răspunde la", "replyToString": "Răspunde la (Șir)", "isHtml": "În format Html", - "body": "Corp", - "bodyPlain": "Corp (Simplu)", + "body": "Conținut", + "bodyPlain": "Conținut (Simplu)", "subject": "Subiect", "attachments": "Atașamente", "selectTemplate": "Selectează Șablon", diff --git a/application/Espo/Resources/i18n/ro_RO/EmailFilter.json b/application/Espo/Resources/i18n/ro_RO/EmailFilter.json index c2968f922c..353dd7e39e 100644 --- a/application/Espo/Resources/i18n/ro_RO/EmailFilter.json +++ b/application/Espo/Resources/i18n/ro_RO/EmailFilter.json @@ -3,7 +3,7 @@ "from": "De la", "to": "Către", "subject": "Subiect", - "bodyContains": "Corpul Conține", + "bodyContains": "Conținutul Conține", "action": "Acțiune", "isGlobal": "Este Global", "emailFolder": "Dosar" @@ -21,7 +21,7 @@ "tooltips": { "name": "Dă-i filtrului un nume descriptiv.", "subject": "Folosește un wildcard *:\n\ntext* - începe cu text,\n*text* - conține text,\n*text - se termină cu text. ", - "bodyContains": "Corpul email-ului conține unul dintre cuvintele sau frazele specificate.", + "bodyContains": "Conținutul email-ului conține unul dintre cuvintele sau frazele specificate.", "from": "Email-urile trimise de la adresa specificată. Dacă nu este necesar, lasă gol. Poți folosi un wildcard *.", "to": "Email-urile trimise de la adresa specificată. Dacă nu este necesar, lasă gol. Poți folosi un wildcard *.", "isGlobal": "Aplică acest filtru la toate email-urile primite în sistem." diff --git a/application/Espo/Resources/i18n/ro_RO/EmailTemplate.json b/application/Espo/Resources/i18n/ro_RO/EmailTemplate.json index a82fe483af..b05a71f3d4 100644 --- a/application/Espo/Resources/i18n/ro_RO/EmailTemplate.json +++ b/application/Espo/Resources/i18n/ro_RO/EmailTemplate.json @@ -2,7 +2,7 @@ "fields": { "name": "Nume", "isHtml": "În format Html", - "body": "Corp", + "body": "Conținutul", "subject": "Subiect", "attachments": "Atașamente", "insertField": "Inserează Câmp", diff --git a/application/Espo/Resources/i18n/ro_RO/Global.json b/application/Espo/Resources/i18n/ro_RO/Global.json index e026d24e17..053a760448 100644 --- a/application/Espo/Resources/i18n/ro_RO/Global.json +++ b/application/Espo/Resources/i18n/ro_RO/Global.json @@ -68,6 +68,7 @@ "LastViewed": "Ultima Vizualizare" }, "labels": { + "Misc": "Amestecat", "Merge": "Îmbina", "None": "Nici unul", "Home": "Acasă", @@ -476,24 +477,109 @@ "eu_ES": "Bască", "fa_IR": "Persană", "fi_FI": "Finlandeză", - "ro_RO": "Romana" + "fo_FO": "Feroeză", + "fr_CA": "Franceză (Canada)", + "fr_FR": "Franceză (Franța)", + "ga_IE": "Irlandeză", + "gl_ES": "Galiciană", + "he_IL": "Ebraică", + "hi_IN": "Hindusă", + "hr_HR": "Croată", + "hu_HU": "Maghiară", + "hy_AM": "Armeană", + "id_ID": "Indoneziană", + "is_IS": "Islandeză", + "it_IT": "Italiană", + "ja_JP": "Japoneză", + "ka_GE": "Georgiană", + "km_KH": "Khmeră", + "ko_KR": "Coreană", + "ku_TR": "Curdă", + "lt_LT": "Lituaniană", + "lv_LV": "Letonă", + "mk_MK": "Macedoneană", + "ms_MY": "Malai", + "nb_NO": "Norvegiană Bokmål", + "nn_NO": "Norvegiană Nynorsk", + "ne_NP": "Nepaleză", + "nl_NL": "Olandeză", + "pl_PL": "Poloneză", + "pt_BR": "Portugheză (Brazilia)", + "pt_PT": "Portugheză (Portugalia)", + "ro_RO": "Română", + "ru_RU": "Rusă", + "sk_SK": "Slovacă", + "sl_SI": "Slovenă", + "sq_AL": "Albaneză", + "sr_RS": "Sârbă", + "sv_SE": "Suedeză", + "ta_IN": "Tamilă", + "th_TH": "Tailandeză", + "tl_PH": "Tagalogă", + "tr_TR": "Turcă", + "uk_UA": "Ucraineană", + "vi_VN": "Vietnameză", + "zh_CN": "Chineză Simplificată (China)", + "zh_HK": "Chineză Tradițională (Honk Kong)", + "zh_TW": "Chineză Tradițională (Taiwan)" }, "dateSearchRanges": { "on": "Pornit", "notOn": "Oprit", - "after": "Dupa", - "before": "Inainte", - "between": "Intre", - "today": "Astazi" + "after": "După", + "before": "Înainte", + "between": "Între", + "today": "Astăzi", + "past": "În trecut", + "future": "În viitor", + "currentMonth": "Luna curentă", + "lastMonth": "Luna trecută", + "nextMonth": "Luna viitoare", + "currentQuarter": "Trimestru actual", + "lastQuarter": "Trimestrul trecut", + "currentYear": "Anul curent", + "lastYear": "Anul trecut", + "lastSevenDays": "În ultimele 7 zile", + "lastXDays": "Ultimele X zile", + "nextXDays": "Următoarele X zile", + "ever": "Vreodată", + "isEmpty": "Este gol", + "olderThanXDays": "Mai vechi decât X zile", + "afterXDays": "După X zile" + }, + "searchRanges": { + "is": "Este", + "isEmpty": "Este gol", + "isNotEmpty": "Nu este gol", + "isOneOf": "Oricare dintre", + "anyOf": "Oricare dintre", + "isFromTeams": "Face parte din echipa", + "isNot": "Nu este", + "isNotOneOf": "Nici unul dintre", + "noneOf": "Nici unul dintre" + }, + "varcharSearchRanges": { + "equals": "Egal", + "like": "Este ca (%)", + "notLike": "Nu este ca (%)", + "startsWith": "Începe cu", + "endsWith": "Se termină cu", + "contains": "Conține", + "notContains": "Nu Conține", + "isEmpty": "Este gol", + "isNotEmpty": "Nu este gol", + "notEquals": "Nu este egal" }, "intSearchRanges": { "equals": "Egal", - "notEquals": "Inegal", - "greaterThan": "Mai mare de", - "lessThan": "Mai mic de", + "notEquals": "Nu este egal", + "greaterThan": "Mai mare decât", + "lessThan": "Mai mic decât", "greaterThanOrEquals": "Mai mare sau egal", "lessThanOrEquals": "Mai mic sau egal", - "between": "Intre" + "between": "Între", + "isEmpty": "Este gol", + "isNotEmpty": "Nu este gol" }, "autorefreshInterval": { "0": "Nici unul", @@ -504,89 +590,105 @@ "0.5": "30 secunde" }, "phoneNumber": { + "Mobile": "Mobil", + "Office": "Birou", + "Home": "Acasă", "Other": "Altele" } }, "sets": { "summernote": { - "NOTICE": "Puteti gasi traducerea aici: https://github.com/HackerWins/summernote/tree/master/lang", + "NOTICE": "Puteți găsi traducerea aici: https://github.com/HackerWins/summernote/tree/master/lang", "font": { "underline": "Subliniat", - "clear": "Sterge stil font", - "height": "Inaltime linie", - "name": "Familie Font ", - "size": "Marime Font" + "strike": "Tăiat", + "clear": "Șterge stil font", + "height": "Înălțime linie", + "name": "Familie Font", + "size": "Mărime Font" }, "image": { "image": "Imagine", "insert": "Inserare Imagine", - "resizeFull": "Redimensionare completa", + "resizeFull": "Redimensionare completă", "resizeHalf": "Redimensionare la jumatate", "resizeQuarter": "Redimensionare la sfert", - "floatLeft": "Aliniere la stanga", - "floatRight": "Aliniere la dreapta", - "floatNone": "Fara aliniere", - "dragImageHere": "Trage imaginea aici", - "selectFromFiles": "Selecteaza din fisiere", + "floatLeft": "Plutire la stânga", + "floatRight": "Plutire la dreapta", + "floatNone": "Fără plutire", + "dragImageHere": "Trage o imaginea aici", + "selectFromFiles": "Selectează din fișiere", "url": "URL Imagine", - "remove": "Stergere imagine" + "remove": "Ștergere imagine" }, "link": { "insert": "Inserare Link", - "unlink": "Dezleaga", + "unlink": "Dezleagă", "edit": "Editare", - "textToDisplay": "Text de afisat", - "openInNewWindow": "Deschidere in fereastra noua" + "textToDisplay": "Text de afișat", + "url": "Către ce URL să ducă acest link?", + "openInNewWindow": "Deschidere în fereastră noua" }, "video": { - "videoLink": "Link Video ", - "insert": "Inserare Video" + "videoLink": "Link Video", + "insert": "Inserare Video", + "url": "URL Video?", + "providers": "(YouTube, Vimeo, Vine, Instagram, sau DailyMotion)" }, "table": { "table": "Tabel" }, "hr": { - "insert": "Inserare Linie Orizontala" + "insert": "Inserare Linie Orizontală" }, "style": { "style": "Stil", - "blockquote": "Citat", + "blockquote": "Ofertă", "pre": "Cod" }, "lists": { - "unordered": "Lista neordonata", - "ordered": "Lista ordonata" + "unordered": "Listă neordonată", + "ordered": "Listă ordonată" }, "options": { "help": "Ajutor", - "fullscreen": "Ecran complet", + "fullscreen": "Pe tot ecranul", "codeview": "Vizualizare cod" }, "paragraph": { "paragraph": "Paragraf", "outdent": "Neindentat", "indent": "Indentat", - "left": "Aliniere stanga", + "left": "Aliniere stânga", "center": "Aliniere centru", "right": "Aliniere dreapta", "justify": "Justify complet" }, "color": { - "recent": "Culoarea recenta", + "recent": "Culoarea recentă", "more": "Mai multe culori", "background": "Culoare fundal", "foreground": "Culoare font", - "setTransparent": "Setare transparenta", - "resetToDefault": "Reinitializare setari" + "setTransparent": "Setare transparență", + "reset": "Resetare", + "resetToDefault": "Resetare la implicit" }, "shortcut": { - "shortcuts": "Scurtaturi taste", - "close": "Inchide", + "shortcuts": "Scurtături tastatură", + "close": "Închide", "textFormatting": "Formatare Text", - "action": "Actiune", + "action": "Acțiune", "paragraphFormatting": "Formatare Paragraf", - "documentStyle": "Stil Document " + "documentStyle": "Stil Document" + }, + "history": { + "undo": "Anulează", + "redo": "Reface" } } + }, + "themes": { + "Hazyblue": "Azur", + "HazyblueVertical": "Azur w/ sidebar " } } \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Import.json b/application/Espo/Resources/i18n/ro_RO/Import.json index 9e26dfeeb6..3ff7870a29 100644 --- a/application/Espo/Resources/i18n/ro_RO/Import.json +++ b/application/Espo/Resources/i18n/ro_RO/Import.json @@ -1 +1,69 @@ -{} \ No newline at end of file +{ + "labels": { + "Return to Import": "Revenire la importare", + "Run Import": "Rulează Importarea", + "Back": "Înapoi", + "Field Mapping": "Câmp mapare", + "Default Values": "Valori implicite", + "Add Field": "Adăugare Câmp", + "Created": "Creat", + "Updated": "Actualizat", + "Result": "Rezultat", + "Show records": "Arată înregistrările", + "Remove Duplicates": "Elimină duplicatele", + "importedCount": "Importat (numără)", + "duplicateCount": "Duplicate (numără)", + "updatedCount": "Actualizat (numără)", + "Create Only": "Doar crearea", + "Create and Update": "Creare % Actualizare", + "Update Only": "Doar actualizare", + "Update by": "Actualizat de", + "Set as Not Duplicate": "Setat ca Nu Duplicat", + "File (CSV)": "Fișier (CSV)", + "First Row Value": "Prima Valoare Rând", + "Skip": "Sări", + "Header Row Value": "Valoarea Header Rând", + "Field": "Câmp", + "What to Import?": "Ce să se importe?", + "Entity Type": "Tip Entitate", + "What to do?": "Ce să se întâmple?", + "Properties": "Proprietăți", + "Header Row": "Rând Header", + "Person Name Format": "Format Nume Persoană", + "Field Delimiter": "Delimitator Câmp", + "Date Format": "Format Dată", + "Decimal Mark": "Marcaj zecimal", + "Text Qualifier": "Textul calificare", + "Time Format": "Format timp", + "Currency": "Valută", + "Preview": "Previzualizare", + "Next": "Următorul", + "Step 1": "Pasul 1", + "Step 2": "Pasul 2", + "Double Quote": "Ofertă dublă", + "Single Quote": "Ofertă unică", + "Imported": "Importat", + "Duplicates": "Duplicate", + "Skip searching for duplicates": "Sări peste căutarea duplicatelor", + "Timezone": "Fus orar" + }, + "messages": { + "utf8": "Ar trebui să fie codificat UTF-8", + "duplicatesRemoved": "Duplicatele au fost înlăturate", + "inIdle": "Executați în modul inactiv (pentru date mari; via crom)" + }, + "fields": { + "file": "Fișier", + "entityType": "Tip Entitate", + "imported": "Înregistrări Importate", + "duplicates": "Înregistrări duplicate", + "updated": "Înregistrări actualizate" + }, + "options": { + "status": { + "Failed": "Nu s-a reușit", + "In Process": "În Proces", + "Complete": "Terminat" + } + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/InboundEmail.json b/application/Espo/Resources/i18n/ro_RO/InboundEmail.json index 52456f995a..b6a1be1169 100644 --- a/application/Espo/Resources/i18n/ro_RO/InboundEmail.json +++ b/application/Espo/Resources/i18n/ro_RO/InboundEmail.json @@ -1,19 +1,58 @@ { "fields": { "name": "Nume", - "team": "Echipa", + "emailAddress": "Adresă Email", + "team": "Echipa Țintă", "assignToUser": "Atribuie utilizatorului", - "host": "Gazda", + "host": "Gazdă", "username": "Nume Utilizator", - "password": "Parola", + "password": "Parolă", "monitoredFolders": "Directoare Monitorizate", - "trashFolder": "Gunoi", + "trashFolder": "Coș de Gunoi", "createCase": "Creare Caz", - "reply": "Raspunde", + "reply": "Răspunde", "caseDistribution": "Distribuire Caz", - "replyEmailTemplate": "Template Raspuns Email ", - "replyFromAddress": "Raspunde cu Adresa", - "replyFromName": "Raspunde cu Numele" + "replyEmailTemplate": "Șablon Răspuns Email ", + "replyFromAddress": "Răspunde din Adresa", + "replyToAddress": "Răspunde la Adresa", + "replyFromName": "Răspunde din Nume", + "targetUserPosition": "Poziția Țintă a Utiliztorului", + "fetchSince": "Fetch începând cu", + "addAllTeamUsers": "Pentru toți utilizatorii echipei", + "teams": "Echipe", + "sentFolder": "Trimite dosar", + "storeSentEmails": "Stochează Email-uri trimisw", + "useImap": "Fetch email-uri", + "useSmtp": "Folosește SMTP", + "smtpHost": "Gazdă SMTP", + "smtpPort": "Port SMTP", + "smtpAuth": "Autentificare SMTP", + "smtpSecurity": "SEcuritate SMTP", + "smtpUsername": "Nume utilizator SMTP", + "smtpPassword": "Parolă SMTP", + "fromName": "De la Nume", + "smtpIsShared": "SMTP este partajat", + "smtpIsForMassEmail": "SMTP este din Email-uri în Masă" + }, + "tooltips": { + "reply": "Notificați expeditorii că email-urile lor au fost primite.\n\n Doar un email va fi trimis unui anumit destinatar într-o anumită perioadă de timp pentru a preveni looping.", + "createCase": "Creați cazul automat din email-urile primite", + "replyToAddress": "Specificați adresa de email a acestei căsuțe poștale pentru a redirecționa răspunsurile aici.", + "caseDistribution": "Cum o să fie atribuite cazurile. Atribuite direct utilizatorului sau în rândul echipei.", + "assignToUser": "Cazurile utilizatorului o să fie atribuite.", + "team": "Cazurile echipei o să fie atribuite.", + "teams": "Email-urile echipei o să fie atribuite.", + "targetUserPosition": "Utilizatoriilor cu poziția specificată o să le fie distribuite cazurile.", + "addAllTeamUsers": "Email-urile o să apară în căsuța poștală a tuturor utilizatorilor din echipele specificate.", + "monitoredFolders": "Dosarele multiple ar trebui separate prin virgulă", + "smtpIsShared": "Dacă este bifat, utiliatorii o să poată trimite email-uri folosind SMTP. Disponibilitatea este controlată de Roluri prin intermediul permisiunilor din Grupul Contului Email.", + "smtpIsForMassEmail": "Dacă este bifat, SMTP o să fie disponibil pentru Email în Masă.", + "storeSentEmails": "Email-urile trimise o să fie stocate pe server-ul IMAP" + }, + "links": { + "filters": "Filtre", + "emails": "Email-uri", + "assignToUser": "Atribuit Utilizatorului" }, "options": { "status": { @@ -21,16 +60,16 @@ "Inactive": "Inactiv" }, "caseDistribution": { - "Direct-Assignment": "Atribuire directa", - "Least-Busy": "Cel putin, Ocupat" + "": "Nici unul", + "Direct-Assignment": "Atribuire directă" } }, "labels": { - "Create InboundEmail": "Creare Email intrare", - "Actions": "Actiuni", + "Create InboundEmail": "Creare Cont Email", + "Actions": "Acțiuni", "Main": "Principal" }, "messages": { - "couldNotConnectToImap": "Could neconectat la server-ul IMAP" + "couldNotConnectToImap": "Nu s-a putut conecta la server-ul IMAP" } } \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Integration.json b/application/Espo/Resources/i18n/ro_RO/Integration.json index 9e26dfeeb6..c9006ceefb 100644 --- a/application/Espo/Resources/i18n/ro_RO/Integration.json +++ b/application/Espo/Resources/i18n/ro_RO/Integration.json @@ -1 +1,14 @@ -{} \ No newline at end of file +{ + "fields": { + "enabled": "Activat", + "redirectUri": "Redirecționare URI", + "apiKey": "Cheie API" + }, + "messages": { + "selectIntegration": "Selectați o integrare din meniu", + "noIntegrations": "Nu este disponibilă nici o integrare" + }, + "help": { + "GoogleMaps": "

Obține cheia API here.

" + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Job.json b/application/Espo/Resources/i18n/ro_RO/Job.json index 9e26dfeeb6..412a67cf09 100644 --- a/application/Espo/Resources/i18n/ro_RO/Job.json +++ b/application/Espo/Resources/i18n/ro_RO/Job.json @@ -1 +1,21 @@ -{} \ No newline at end of file +{ + "fields": { + "executeTime": "Execută la", + "attempts": "Încercări rămase", + "failedAttempts": "Încercări nereușite", + "serviceName": "Serviciu", + "method": "Metodă (depreciată)", + "methodName": "Metodă", + "scheduledJob": "Activitate Planificată", + "scheduledJobJob": "Nume Activitate Planificată", + "data": "Date" + }, + "options": { + "status": { + "Pending": "În așteptare", + "Success": "Succes", + "Running": "Rulează", + "Failed": "Eșuat" + } + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/LayoutManager.json b/application/Espo/Resources/i18n/ro_RO/LayoutManager.json index 9e26dfeeb6..cf7acd6652 100644 --- a/application/Espo/Resources/i18n/ro_RO/LayoutManager.json +++ b/application/Espo/Resources/i18n/ro_RO/LayoutManager.json @@ -1 +1,27 @@ -{} \ No newline at end of file +{ + "fields": { + "width": "Lăţime (%)", + "notSortable": "Nu se poate sorta", + "align": "Aliniere", + "panelName": "Nume Panou", + "style": "Stil", + "sticked": "Lipit" + }, + "options": { + "align": { + "left": "Stânga", + "right": "Dreapta" + }, + "style": { + "default": "Implicit", + "success": "Succes", + "danger": "Pericol", + "warning": "Avertisment", + "primary": "Primar" + } + }, + "labels": { + "New panel": "Panou nou", + "Layout": "Aspect" + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Note.json b/application/Espo/Resources/i18n/ro_RO/Note.json index 7417a865a5..2f879ed149 100644 --- a/application/Espo/Resources/i18n/ro_RO/Note.json +++ b/application/Espo/Resources/i18n/ro_RO/Note.json @@ -1,6 +1,41 @@ { "fields": { - "post": "Publica", - "attachments": "Atasamente" + "post": "Publică", + "attachments": "Atașamente", + "targetType": "Țintă", + "teams": "Echipe", + "users": "Utilizatori", + "portals": "Portale", + "type": "Tip", + "isGlobal": "Este Global", + "isInternal": "Este Intern (nu pentru utilizatori interni)", + "related": "Legat", + "createdByGender": "Creat de genul", + "data": "Date", + "number": "Număr" + }, + "filters": { + "all": "Tot", + "posts": "Postări", + "updates": "Actualizări" + }, + "options": { + "targetType": { + "self": "către mine", + "users": "către utilizatori anume", + "teams": "către echipe anume", + "all": "către toți utilizatorii interni", + "portals": "către utilizatorii portalului" + }, + "type": { + "Post": "Postare" + } + }, + "messages": { + "writeMessage": "Scrieți mesajul aici" + }, + "links": { + "superParent": "Super Părinte", + "related": "Legat" } } \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Portal.json b/application/Espo/Resources/i18n/ro_RO/Portal.json index 9e26dfeeb6..add76238c2 100644 --- a/application/Espo/Resources/i18n/ro_RO/Portal.json +++ b/application/Espo/Resources/i18n/ro_RO/Portal.json @@ -1 +1,33 @@ -{} \ No newline at end of file +{ + "fields": { + "name": "Nume", + "portalRoles": "Roluri", + "isActive": "Este Activ", + "isDefault": "Este Implicit", + "tabList": "Listă filă", + "quickCreateList": "Crează listă rapidă", + "theme": "Temă", + "language": "Limbă", + "dashboardLayout": "Aspect bord", + "dateFormat": "Format dată", + "timeFormat": "Format oră", + "timeZone": "Fus orar", + "weekStart": "Prima zi a săptămânii", + "defaultCurrency": "Valută implicită", + "customUrl": "URL particularizat", + "customId": "ID particularizat" + }, + "links": { + "users": "Utilizatori", + "portalRoles": "Roluri", + "notes": "Note" + }, + "tooltips": { + "portalRoles": "Rolurile specificate ale portalului o să fie aplicate la toți utilizatorii portalului." + }, + "labels": { + "Create Portal": "Crați portal", + "User Interface": "Interfață utilizator", + "Settings": "Setări" + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/PortalRole.json b/application/Espo/Resources/i18n/ro_RO/PortalRole.json index 9e26dfeeb6..40c44ed881 100644 --- a/application/Espo/Resources/i18n/ro_RO/PortalRole.json +++ b/application/Espo/Resources/i18n/ro_RO/PortalRole.json @@ -1 +1,17 @@ -{} \ No newline at end of file +{ + "fields": { + "exportPermission": "Permisiune de exportare" + }, + "links": { + "users": "Utilizatori" + }, + "tooltips": { + "exportPermission": "Definiți dacă utilizatorii portalului au abilitatea să exporte înregistrările." + }, + "labels": { + "Access": "Acces", + "Create PortalRole": "Creați Rolul Portalului", + "Scope Level": "Nivel Domeniu", + "Field Level": "Nivel câmp" + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/PortalUser.json b/application/Espo/Resources/i18n/ro_RO/PortalUser.json index 9e26dfeeb6..e588bb838f 100644 --- a/application/Espo/Resources/i18n/ro_RO/PortalUser.json +++ b/application/Espo/Resources/i18n/ro_RO/PortalUser.json @@ -1 +1,5 @@ -{} \ No newline at end of file +{ + "labels": { + "Create PortalUser": "Creați Utilizator Portal" + } +} \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Preferences.json b/application/Espo/Resources/i18n/ro_RO/Preferences.json index 1095d1481f..200a13b930 100644 --- a/application/Espo/Resources/i18n/ro_RO/Preferences.json +++ b/application/Espo/Resources/i18n/ro_RO/Preferences.json @@ -1,25 +1,46 @@ { "fields": { - "dateFormat": "Format Data ", - "timeFormat": "Format Timp", - "timeZone": "Zone Timp", - "weekStart": "Prima zi a saptamanii", + "dateFormat": "Format Dată", + "timeFormat": "Format oră", + "timeZone": "Fus orar", + "weekStart": "Prima zi a săptămânii", "thousandSeparator": "Separator mii", - "decimalMark": "Semn zecimal", - "defaultCurrency": "Valuta initiala", - "currencyList": "Lista valute", - "language": "Limba", + "decimalMark": "Marcaj zecimal", + "defaultCurrency": "Valută implicită", + "currencyList": "Listă valute", + "language": "Limbă", "smtpAuth": "Autorizare", "smtpSecurity": "Securitate", "smtpUsername": "Nume Utilizator", - "smtpPassword": "Parola", - "smtpEmailAddress": "Adresa Email", - "exportDelimiter": "Delimitator Export" + "smtpPassword": "Parolă", + "smtpEmailAddress": "Adresă Email", + "exportDelimiter": "Delimitator Exportare", + "receiveAssignmentEmailNotifications": "Notificări email pentru sarcină", + "receiveMentionEmailNotifications": "Notificări email despre mențiuni în postări", + "receiveStreamEmailNotifications": "Notificări email despre postări și actualizare statusului", + "autoFollowEntityTypeList": "Auto-urmărire globală", + "signature": "Semnătură Email", + "dashboardTabList": "Listă filă", + "tabList": "Listă filă", + "theme": "Temă", + "useCustomTabList": "Listă Personalizată Personalizată", + "emailReplyToAllByDefault": "Răspunde cu un email la tot, în mod implicit", + "dashboardLayout": "Aspect bord", + "emailReplyForceHtml": "Răspunde la email în HTML", + "followEntityOnStreamPost": "După publicare în Stream, auto-urmărește înregistrarea", + "followCreatedEntities": "Auto-urmărire înregistrări create", + "followCreatedEntityTypeList": "Auto-urmărire înregistrări create sau anumite tipuri de entitate" }, "options": { "weekStart": { - "0": "Duminica", + "0": "Duminică", "1": "Luni" } + }, + "labels": { + "Notifications": "Notificări", + "User Interface": "Interfață utilizator", + "Misc": "Amestecat", + "Locale": "Local" } } \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/Role.json b/application/Espo/Resources/i18n/ro_RO/Role.json index f8c5c232b6..3ce11e66a8 100644 --- a/application/Espo/Resources/i18n/ro_RO/Role.json +++ b/application/Espo/Resources/i18n/ro_RO/Role.json @@ -1,7 +1,10 @@ { "fields": { "name": "Nume", - "roles": "Roluri" + "roles": "Roluri", + "assignmentPermission": "Permisiuni Sarcină", + "userPermission": "Permisiuni Utilizator", + "portalPermission": "Permisiuni Portal" }, "links": { "users": "Utilizatori", @@ -9,24 +12,30 @@ }, "labels": { "Access": "Acces", - "Create Role": "Creare Rol" + "Create Role": "Creare Rol", + "Scope Level": "Nivel Domeniu", + "Field Level": "Nivel Câmp" }, "options": { "accessList": { - "not-set": "ne setat", + "not-set": "nu a fost setat", "enabled": "activat", "disabled": "dezactivat" }, "levelList": { "all": "toate", "team": "echipa", + "account": "cont", "own": "personal", - "no": "nu" + "no": "nu", + "yes": "da", + "not-set": "nu a fost setat" } }, "actions": { - "read": "Citeste", + "read": "Citește", "edit": "Editare", - "delete": "Sterge" + "delete": "Șterge", + "create": "Creați" } } \ No newline at end of file diff --git a/application/Espo/Resources/i18n/ro_RO/ScheduledJob.json b/application/Espo/Resources/i18n/ro_RO/ScheduledJob.json index e6f43bfcd8..ea309d8380 100644 --- a/application/Espo/Resources/i18n/ro_RO/ScheduledJob.json +++ b/application/Espo/Resources/i18n/ro_RO/ScheduledJob.json @@ -2,10 +2,13 @@ "fields": { "name": "Nume", "job": "Activitate", - "scheduling": "Scheduling (crontab notation)" + "scheduling": "Planificare" + }, + "links": { + "log": "Jurnal" }, "labels": { - "Create ScheduledJob": "Creare activiate programata" + "Create ScheduledJob": "Creați activiate planificată" }, "options": { "job": { diff --git a/application/Espo/Resources/i18n/ro_RO/Settings.json b/application/Espo/Resources/i18n/ro_RO/Settings.json index c958fb40ed..cfb6222d00 100644 --- a/application/Espo/Resources/i18n/ro_RO/Settings.json +++ b/application/Espo/Resources/i18n/ro_RO/Settings.json @@ -3,11 +3,12 @@ "useCache": "Foloseste Cache", "dateFormat": "Format Data ", "timeFormat": "Format Timp", - "timeZone": "Zone Timp", - "weekStart": "Prima zi a saptamanii", + "timeZone": "Fus orar", + "weekStart": "Prima zi a săptămânii", "thousandSeparator": "Separator mii", - "decimalMark": "Semn zecimal", - "defaultCurrency": "Valuta initiala", + "decimalMark": "Marcaj zecimal", + "defaultCurrency": "Valută implicită", + "baseCurrency": "Valută de Bază", "currencyList": "Lista valute", "language": "Limba", "companyLogo": "Logo Companie", diff --git a/application/Espo/Resources/i18n/ro_RO/User.json b/application/Espo/Resources/i18n/ro_RO/User.json index 0ead39ef34..97b27b622f 100644 --- a/application/Espo/Resources/i18n/ro_RO/User.json +++ b/application/Espo/Resources/i18n/ro_RO/User.json @@ -22,10 +22,27 @@ "Preferences": "Preferinte", "Change Password": "Schimbare Parola" }, + "tooltips": { + "portals": "Portalurile la care are acces acest utilizator." + }, "messages": { - "passwordWillBeSent": "Parola va fi trimisa in email-ul utilizatorului.", - "accountInfoEmailSubject": "Informatii cont", - "accountInfoEmailBody": "Your account information:\n\nUsername: {userName}\nPassword: {password}\n\n{siteUrl}", - "passwordChanged": "Parola a fost schimbata" + "passwordWillBeSent": "Parola va fi trimisă in email-ul utilizatorului.", + "accountInfoEmailSubject": "Informații Acces Utilizator EspoCRM", + "accountInfoEmailBody": "Informațiile tale de acces :\n\nUsername: {userName}\nPassword: {password}\n\n{siteUrl}", + "passwordChangeLinkEmailSubject": "Cerere Schimbare Parolă", + "passwordChanged": "Parola a fost schimbată", + "userCantBeEmpty": "Numele de utilizator nu poate fi necompletat", + "wrongUsernamePasword": "Nume utilizator/parolă greșit(e).", + "emailAddressCantBeEmpty": "Adresa de Email nu poate fi necompletată", + "userNameEmailAddressNotFound": "Nume utilizator/Adresă de email nu a(u) fost găsi(e)", + "forbidden": "Înterzis, încercați mai târziu", + "passwordChangedByRequest": "Parola a fost schimbată.", + "setupSmtpBefore": "Pentru a face sistemul să poată trimite parola în email , trebui să setați setările SMTP.", + "userNameExists": "Acest nume de utilizator există deja" + }, + "options": { + "gender": { + "": "Nu este setat" + } } } \ No newline at end of file diff --git a/application/Espo/Resources/metadata/entityDefs/UniqueId.json b/application/Espo/Resources/metadata/entityDefs/UniqueId.json index 731fcf7f06..633466a69b 100644 --- a/application/Espo/Resources/metadata/entityDefs/UniqueId.json +++ b/application/Espo/Resources/metadata/entityDefs/UniqueId.json @@ -15,12 +15,21 @@ "createdBy": { "type": "link", "readOnly": true + }, + "terminateAt": { + "type": "datetime" + }, + "target": { + "type": "linkParent" } }, "links": { "createdBy": { "type": "belongsTo", "entity": "User" + }, + "target": { + "type": "belongsToParent" } }, "collection": { diff --git a/application/Espo/Services/Notification.php b/application/Espo/Services/Notification.php index a695657c3b..4416cc003c 100644 --- a/application/Espo/Services/Notification.php +++ b/application/Espo/Services/Notification.php @@ -230,7 +230,12 @@ class Notification extends \Espo\Services\Record if (!empty($ids)) { $pdo = $this->getEntityManager()->getPDO(); - $sql = "UPDATE notification SET `read` = 1 WHERE id IN ('" . implode("', '", $ids) ."')"; + $idQuotedList = []; + foreach ($ids as $id) { + $idQuotedList[] = $pdo->quote($id); + } + + $sql = "UPDATE notification SET `read` = 1 WHERE id IN (" . implode(', ', $idQuotedList) .")"; $s = $pdo->prepare($sql); $s->execute(); diff --git a/application/Espo/Services/Stream.php b/application/Espo/Services/Stream.php index 718b3c40d9..967868ecbb 100644 --- a/application/Espo/Services/Stream.php +++ b/application/Espo/Services/Stream.php @@ -213,8 +213,13 @@ class Stream extends \Espo\Core\Services\Base $pdo = $this->getEntityManager()->getPDO(); + $userIdQuotedList = []; + foreach ($userIdList as $userId) { + $userIdQuotedList[] = $pdo->quote($userId); + } + $sql = " - DELETE FROM subscription WHERE user_id IN ('".implode("', '", $userIdList)."') AND entity_id = ".$pdo->quote($entity->id) . " + DELETE FROM subscription WHERE user_id IN (".implode(', ', $userIdQuotedList).") AND entity_id = ".$pdo->quote($entity->id) . " "; $pdo->query($sql); @@ -225,7 +230,7 @@ class Stream extends \Espo\Core\Services\Base "; foreach ($userIdList as $userId) { $arr[] = " - (".$pdo->quote($entity->id) . ", " . $pdo->quote($entity->getEntityName()) . ", " . $pdo->quote($userId).") + (".$pdo->quote($entity->id) . ", " . $pdo->quote($entity->getEntityType()) . ", " . $pdo->quote($userId).") "; } diff --git a/client/src/dynamic-handler.js b/client/src/dynamic-handler.js new file mode 100644 index 0000000000..1e7cc927a9 --- /dev/null +++ b/client/src/dynamic-handler.js @@ -0,0 +1,46 @@ +/************************************************************************ + * This file is part of EspoCRM. + * + * EspoCRM - Open Source CRM application. + * Copyright (C) 2014-2018 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko + * Website: http://www.espocrm.com + * + * EspoCRM is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * EspoCRM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EspoCRM. If not, see http://www.gnu.org/licenses/. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +define('dynamic-handler', [], function () { + + var DynamicHandler = function (recordView) { + this.recordView = recordView; + this.model = recordView.model; + } + + _.extend(DynamicHandler.prototype, { + + init: function () {}, + + onChange: function (model, o) {} + }); + + DynamicHandler.extend = Backbone.Router.extend; + + return DynamicHandler; +}); diff --git a/client/src/utils.js b/client/src/utils.js index d23565c282..5f764b6479 100644 --- a/client/src/utils.js +++ b/client/src/utils.js @@ -51,7 +51,7 @@ Espo.define('utils', [], function () { return hasAccess; }, - checkAccessDataList: function (dataList, acl, user, entity) { + checkAccessDataList: function (dataList, acl, user, entity, allowAllForAdmin) { if (!dataList || !dataList.length) { return true; } @@ -76,7 +76,7 @@ Espo.define('utils', [], function () { } } if (item.teamIdList) { - if (user) { + if (user && !(allowAllForAdmin && user.isAdmin())) { var inTeam = false; user.getLinkMultipleIdList('teams').forEach(function (teamId) { if (~item.teamIdList.indexOf(teamId)) { @@ -87,7 +87,7 @@ Espo.define('utils', [], function () { } } if (item.portalIdList) { - if (user) { + if (user && !(allowAllForAdmin && user.isAdmin())) { var inPortal = false; user.getLinkMultipleIdList('portals').forEach(function (portalId) { if (~item.portalIdList.indexOf(portalId)) { @@ -98,13 +98,13 @@ Espo.define('utils', [], function () { } } if (item.isPortalOnly) { - if (user) { + if (user && !(allowAllForAdmin && user.isAdmin())) { if (!user.isPortal()) { return false; } } } else if (item.inPortalDisabled) { - if (user) { + if (user && !(allowAllForAdmin && user.isAdmin())) { if (user.isPortal()) { return false; } @@ -119,7 +119,6 @@ Espo.define('utils', [], function () { } } } - return true; }, diff --git a/client/src/views/dashlets/fields/records/primary-filter.js b/client/src/views/dashlets/fields/records/primary-filter.js index 87a141caca..3104816bd5 100644 --- a/client/src/views/dashlets/fields/records/primary-filter.js +++ b/client/src/views/dashlets/fields/records/primary-filter.js @@ -48,7 +48,12 @@ Espo.define('views/dashlets/fields/records/primary-filter', 'views/fields/enum', this.params.options = []; filterList.forEach(function (item) { - if (typeof item === 'object' && item.name) { + if (typeof item === 'object' && item.name) { + if (item.accessDataList) { + if (!Espo.Utils.checkAccessDataList(item.accessDataList, this.getAcl(), this.getUser(), null, true)) { + return false; + } + } this.params.options.push(item.name); return; } diff --git a/client/src/views/fields/link-multiple-with-role.js b/client/src/views/fields/link-multiple-with-role.js index 56751f863a..294b5359cc 100644 --- a/client/src/views/fields/link-multiple-with-role.js +++ b/client/src/views/fields/link-multiple-with-role.js @@ -69,6 +69,9 @@ Espo.define('views/fields/link-multiple-with-role', 'views/fields/link-multiple' getDetailLinkHtml: function (id, name) { name = name || this.nameHash[id]; + if (!name && id) { + name = this.translate(this.foreignScope, 'scopeNames'); + } var role = (this.columns[id] || {})[this.columnName] || ''; var roleHtml = ''; diff --git a/client/src/views/fields/link-multiple.js b/client/src/views/fields/link-multiple.js index 58af3b3dfb..464b398967 100644 --- a/client/src/views/fields/link-multiple.js +++ b/client/src/views/fields/link-multiple.js @@ -298,6 +298,9 @@ Espo.define('views/fields/link-multiple', 'views/fields/base', function (Dep) { getDetailLinkHtml: function (id) { var name = this.nameHash[id] || id; + if (!name && id) { + name = this.translate(this.foreignScope, 'scopeNames'); + } return '' + this.getHelper().stripTags(name) + ''; }, diff --git a/client/src/views/fields/link-parent.js b/client/src/views/fields/link-parent.js index 3af7e5e6be..a49959afd8 100644 --- a/client/src/views/fields/link-parent.js +++ b/client/src/views/fields/link-parent.js @@ -59,12 +59,16 @@ Espo.define('views/fields/link-parent', 'views/fields/base', function (Dep) { searchTypeList: ['is', 'isEmpty', 'isNotEmpty'], data: function () { + var nameValue = this.model.has(this.nameName) ? this.model.get(this.nameName) : this.model.get(this.idName); + if (!nameValue && this.model.get(this.idName) && this.model.get(this.typeName)) { + nameValue = this.translate(this.model.get(this.typeName), 'scopeNames'); + } return _.extend({ idName: this.idName, nameName: this.nameName, typeName: this.typeName, idValue: this.model.get(this.idName), - nameValue: this.model.has(this.nameName) ? this.model.get(this.nameName) : this.model.get(this.idName), + nameValue: nameValue, typeValue: this.model.get(this.typeName), foreignScope: this.foreignScope, foreignScopeList: this.foreignScopeList, diff --git a/client/src/views/fields/link.js b/client/src/views/fields/link.js index fb722de766..d26b305f2d 100644 --- a/client/src/views/fields/link.js +++ b/client/src/views/fields/link.js @@ -61,6 +61,9 @@ Espo.define('views/fields/link', 'views/fields/base', function (Dep) { if (nameValue === null) { nameValue = this.model.get(this.idName); } + if (this.mode === 'detail' && !nameValue && this.model.get(this.idName)) { + nameValue = this.translate(this.foreignScope, 'scopeNames'); + } return _.extend({ idName: this.idName, nameName: this.nameName, diff --git a/client/src/views/record/detail.js b/client/src/views/record/detail.js index cc9a2249d8..ea11433b01 100644 --- a/client/src/views/record/detail.js +++ b/client/src/views/record/detail.js @@ -753,6 +753,41 @@ Espo.define('views/record/detail', ['views/record/base', 'view-record-helper'], this.initDynamicLogic(); this.setupFieldLevelSecurity(); + + this.initDynamicHandler(); + }, + + initDynamicHandler: function () { + var dynamicHandlerClassName = this.dynamicHandlerClassName || this.getMetadata().get(['clientDefs', this.model.name, 'dynamicHandler']); + if (dynamicHandlerClassName) { + this.addReadyCondition(function () { + return !!this.dynamicHandler; + }.bind(this)); + + require(dynamicHandlerClassName, function (DynamicHandler) { + this.dynamicHandler = new DynamicHandler(this); + + this.listenTo(this.model, 'change', function (model, o) { + if ('onChange' in this.dynamicHandler) { + this.dynamicHandler.onChange(model, o); + } + + var changedAttributes = model.changedAttributes(); + for (var attribute in changedAttributes) { + var methodName = 'onChange' + Espo.Utils.upperCaseFirst(attribute); + if (methodName in this.dynamicHandler) { + this.dynamicHandler[methodName](model, changedAttributes[attribute], o); + } + } + }, this); + + if ('init' in this.dynamicHandler) { + this.dynamicHandler.init(); + } + + this.tryReady(); + }.bind(this)); + } }, setupFinal: function () { diff --git a/frontend/test/spec/test.utils.js b/frontend/test/spec/test.utils.js index 788e872271..ba965104ff 100644 --- a/frontend/test/spec/test.utils.js +++ b/frontend/test/spec/test.utils.js @@ -179,4 +179,42 @@ describe('utils', function () { } ], acl, user)).toBe(true); }); + + + it('#checkAccessDataList should check access 3', function () { + var user = { + isPortal: function () {}, + getLinkMultipleIdList: function () {}, + isAdmin: function () {} + }; + var acl = { + check: function () {}, + checkScope: function () {} + }; + var entity = { + name: 'Account' + }; + spyOn(user, 'getLinkMultipleIdList').and.callFake(function (link) { + if (link === 'teams') { + return ['team1', 'team2']; + } + if (link === 'portals') { + return ['portal1', 'portal2']; + } + }); + spyOn(user, 'isPortal').and.returnValue(false); + spyOn(user, 'isAdmin').and.returnValue(true); + + expect(Utils.checkAccessDataList([ + { + portalIdList: ['portal3'] + } + ], acl, user, null, true)).toBe(true); + + expect(Utils.checkAccessDataList([ + { + teamIdList: ['team3'] + } + ], acl, user, null, true)).toBe(true); + }); }); diff --git a/install/core/i18n/ro_RO/install.json b/install/core/i18n/ro_RO/install.json index a72ef15722..080e3f4c38 100644 --- a/install/core/i18n/ro_RO/install.json +++ b/install/core/i18n/ro_RO/install.json @@ -12,6 +12,7 @@ "Errors page title": "Erori", "Finish page title": "Instalare finalizata", "Congratulation! Welcome to EspoCRM": "Felicitari! EspoCRM a fost instalat cu succes.", + "twitter": "twiter", "Installation Guide": "Instrucțiuni de instalare", "Locale": "Localizare", "Outbound Email Configuration": "Configurari trimitere email",